This is an automated email from the ASF dual-hosted git repository.

ivandika pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 70fcbc6d87 HDDS-9790. Add tests for Overview page (#6983)
70fcbc6d87 is described below

commit 70fcbc6d879a6b34e6db90ae4e8d5aa3be377c2e
Author: Abhishek Pal <[email protected]>
AuthorDate: Wed Aug 21 11:51:31 2024 +0530

    HDDS-9790. Add tests for Overview page (#6983)
---
 .../webapps/recon/ozone-recon-web/package.json     |   4 +
 .../webapps/recon/ozone-recon-web/pnpm-lock.yaml   | 981 ++++++++++++++++++++-
 .../src/__tests__/Overview.test.tsx                | 214 +++++
 .../src/__tests__/locators/locators.ts             |  48 +
 .../mocks/overviewMocks/overviewResponseMocks.ts}  |  39 +-
 .../mocks/overviewMocks/overviewServer.ts          |  79 ++
 .../ozone-recon-web/src/__tests__/vitest.setup.ts  |  61 ++
 .../components/autoReloadPanel/autoReloadPanel.tsx |  19 +-
 .../src/components/overviewCard/overviewCard.tsx   |   4 +-
 .../components/overviewCard/overviewSimpleCard.tsx |   3 +-
 .../overviewCard/overviewStorageCard.tsx           |   7 +-
 .../overviewCard/overviewSummaryCard.tsx           |   7 +-
 .../src/v2/pages/overview/overview.tsx             |   2 +-
 .../src/views/datanodes/datanodes.tsx              |   3 +-
 .../webapps/recon/ozone-recon-web/tsconfig.json    |   9 +-
 .../webapps/recon/ozone-recon-web/vite-env.d.ts    |  18 -
 .../webapps/recon/ozone-recon-web/vite.config.ts   |  51 +-
 17 files changed, 1473 insertions(+), 76 deletions(-)

diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/package.json
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/package.json
index 71bdf85ad1..d931a0ed79 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/package.json
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/package.json
@@ -56,6 +56,8 @@
     ]
   },
   "devDependencies": {
+    "@testing-library/jest-dom": "^6.4.8",
+    "@testing-library/react": "^12.1.5",
     "@types/react": "16.8.15",
     "@types/react-dom": "16.8.4",
     "@types/react-router-dom": "^4.3.5",
@@ -66,7 +68,9 @@
     "eslint": "^7.28.0",
     "eslint-config-prettier": "^8.10.0",
     "eslint-plugin-prettier": "^3.4.1",
+    "jsdom": "^24.1.1",
     "json-server": "^0.15.1",
+    "msw": "1.3.3",
     "npm-run-all": "^4.1.5",
     "prettier": "^2.8.4",
     "vite": "4.5.3",
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/pnpm-lock.yaml
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/pnpm-lock.yaml
index ccfdcc0186..d1b8844ac6 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/pnpm-lock.yaml
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/pnpm-lock.yaml
@@ -61,6 +61,12 @@ dependencies:
     version: 4.9.5
 
 devDependencies:
+  '@testing-library/jest-dom':
+    specifier: ^6.4.8
+    version: 6.4.8
+  '@testing-library/react':
+    specifier: ^12.1.5
+    version: 12.1.5([email protected])([email protected])
   '@types/react':
     specifier: 16.8.15
     version: 16.8.15
@@ -91,9 +97,15 @@ devDependencies:
   eslint-plugin-prettier:
     specifier: ^3.4.1
     version: 
3.4.1([email protected])([email protected])([email protected])
+  jsdom:
+    specifier: ^24.1.1
+    version: 24.1.1
   json-server:
     specifier: ^0.15.1
     version: 0.15.1
+  msw:
+    specifier: 1.3.3
+    version: 1.3.3([email protected])
   npm-run-all:
     specifier: ^4.1.5
     version: 4.1.5
@@ -111,10 +123,14 @@ devDependencies:
     version: 3.6.0([email protected])
   vitest:
     specifier: ^1.6.0
-    version: 1.6.0([email protected])
+    version: 1.6.0([email protected])([email protected])
 
 packages:
 
+  /@adobe/[email protected]:
+    resolution: {integrity: 
sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==}
+    dev: true
+
   /@ampproject/[email protected]:
     resolution: {integrity: 
sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
     engines: {node: '>=6.0.0'}
@@ -975,6 +991,30 @@ packages:
       '@jridgewell/resolve-uri': 3.1.2
       '@jridgewell/sourcemap-codec': 1.4.15
 
+  /@mswjs/[email protected]:
+    resolution: {integrity: 
sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g==}
+    engines: {node: '>=14'}
+    dependencies:
+      '@types/set-cookie-parser': 2.4.10
+      set-cookie-parser: 2.6.0
+    dev: true
+
+  /@mswjs/[email protected]:
+    resolution: {integrity: 
sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw==}
+    engines: {node: '>=14'}
+    dependencies:
+      '@open-draft/until': 1.0.3
+      '@types/debug': 4.1.12
+      '@xmldom/xmldom': 0.8.10
+      debug: 4.3.5
+      headers-polyfill: 3.2.5
+      outvariant: 1.4.3
+      strict-event-emitter: 0.2.8
+      web-encoding: 1.1.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /@nodelib/[email protected]:
     resolution: {integrity: 
sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
     engines: {node: '>= 8'}
@@ -996,6 +1036,10 @@ packages:
       fastq: 1.17.1
     dev: true
 
+  /@open-draft/[email protected]:
+    resolution: {integrity: 
sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==}
+    dev: true
+
   /@pkgjs/[email protected]:
     resolution: {integrity: 
sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
     engines: {node: '>=14'}
@@ -1287,6 +1331,52 @@ packages:
       defer-to-connect: 1.1.3
     dev: true
 
+  /@testing-library/[email protected]:
+    resolution: {integrity: 
sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==}
+    engines: {node: '>=12'}
+    dependencies:
+      '@babel/code-frame': 7.24.7
+      '@babel/runtime': 7.24.7
+      '@types/aria-query': 5.0.4
+      aria-query: 5.1.3
+      chalk: 4.1.2
+      dom-accessibility-api: 0.5.16
+      lz-string: 1.5.0
+      pretty-format: 27.5.1
+    dev: true
+
+  /@testing-library/[email protected]:
+    resolution: {integrity: 
sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw==}
+    engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
+    dependencies:
+      '@adobe/css-tools': 4.4.0
+      '@babel/runtime': 7.24.7
+      aria-query: 5.3.0
+      chalk: 3.0.0
+      css.escape: 1.5.1
+      dom-accessibility-api: 0.6.3
+      lodash: 4.17.21
+      redent: 3.0.0
+    dev: true
+
+  /@testing-library/[email protected]([email protected])([email protected]):
+    resolution: {integrity: 
sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      react: <18.0.0
+      react-dom: <18.0.0
+    dependencies:
+      '@babel/runtime': 7.24.7
+      '@testing-library/dom': 8.20.1
+      '@types/react-dom': 16.8.4
+      react: 16.14.0
+      react-dom: 16.14.0([email protected])
+    dev: true
+
+  /@types/[email protected]:
+    resolution: {integrity: 
sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
+    dev: true
+
   /@types/[email protected]:
     resolution: {integrity: 
sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
     dependencies:
@@ -1316,6 +1406,16 @@ packages:
       '@babel/types': 7.24.7
     dev: true
 
+  /@types/[email protected]:
+    resolution: {integrity: 
sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==}
+    dev: true
+
+  /@types/[email protected]:
+    resolution: {integrity: 
sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+    dependencies:
+      '@types/ms': 0.7.34
+    dev: true
+
   /@types/[email protected]:
     resolution: {integrity: 
sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
     dev: true
@@ -1331,6 +1431,10 @@ packages:
       history: 5.3.0
     dev: true
 
+  /@types/[email protected]:
+    resolution: {integrity: 
sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ==}
+    dev: true
+
   /@types/[email protected]:
     resolution: {integrity: 
sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
     dev: true
@@ -1341,6 +1445,10 @@ packages:
       '@types/node': 20.14.8
     dev: true
 
+  /@types/[email protected]:
+    resolution: {integrity: 
sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+    dev: true
+
   /@types/[email protected]:
     resolution: {integrity: 
sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==}
     dependencies:
@@ -1407,6 +1515,12 @@ packages:
     resolution: {integrity: 
sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
     dev: true
 
+  /@types/[email protected]:
+    resolution: {integrity: 
sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==}
+    dependencies:
+      '@types/node': 20.14.8
+    dev: true
+
   
/@typescript-eslint/[email protected](@typescript-eslint/[email protected])([email protected])([email protected]):
     resolution: {integrity: 
sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -1592,6 +1706,17 @@ packages:
       pretty-format: 29.7.0
     dev: true
 
+  /@xmldom/[email protected]:
+    resolution: {integrity: 
sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==}
+    engines: {node: '>=10.0.0'}
+    dev: true
+
+  /@zxing/[email protected]:
+    resolution: {integrity: 
sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==}
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
     engines: {node: '>= 0.6'}
@@ -1644,6 +1769,15 @@ packages:
       react-dom: 16.14.0([email protected])
     dev: false
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
+    engines: {node: '>= 14'}
+    dependencies:
+      debug: 4.3.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
     dependencies:
@@ -1673,6 +1807,13 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+    engines: {node: '>=8'}
+    dependencies:
+      type-fest: 0.21.3
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==}
     engines: {node: '>=4'}
@@ -1771,6 +1912,14 @@ packages:
     resolution: {integrity: 
sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
+    dependencies:
+      normalize-path: 3.0.0
+      picomatch: 2.3.1
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
     dependencies:
@@ -1781,6 +1930,18 @@ packages:
     resolution: {integrity: 
sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==}
+    dependencies:
+      deep-equal: 2.2.3
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
+    dependencies:
+      dequal: 2.0.3
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
     engines: {node: '>= 0.4'}
@@ -1901,6 +2062,10 @@ packages:
     resolution: {integrity: 
sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==}
     engines: {node: '>= 0.8'}
@@ -1914,6 +2079,19 @@ packages:
       tweetnacl: 0.14.5
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+    dependencies:
+      buffer: 5.7.1
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
     engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
@@ -1979,6 +2157,13 @@ packages:
       update-browserslist-db: 1.0.16([email protected])
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+    dependencies:
+      base64-js: 1.5.1
+      ieee754: 1.2.1
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
     engines: {node: '>= 0.8'}
@@ -2061,6 +2246,14 @@ packages:
       escape-string-regexp: 1.0.5
       supports-color: 5.5.0
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
+    engines: {node: '>=8'}
+    dependencies:
+      ansi-styles: 4.3.0
+      supports-color: 7.2.0
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
     engines: {node: '>=10'}
@@ -2069,12 +2262,31 @@ packages:
       supports-color: 7.2.0
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
     dependencies:
       get-func-name: 2.0.2
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+    engines: {node: '>= 8.10.0'}
+    dependencies:
+      anymatch: 3.1.3
+      braces: 3.0.3
+      glob-parent: 5.1.2
+      is-binary-path: 2.1.0
+      is-glob: 4.0.3
+      normalize-path: 3.0.0
+      readdirp: 3.6.0
+    optionalDependencies:
+      fsevents: 2.3.3
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==}
     dev: true
@@ -2088,6 +2300,23 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+    engines: {node: '>=8'}
+    dependencies:
+      restore-cursor: 3.1.0
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
+    engines: {node: '>= 10'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==}
     dependencies:
@@ -2096,12 +2325,26 @@ packages:
       wrap-ansi: 5.1.0
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+    engines: {node: '>=12'}
+    dependencies:
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      wrap-ansi: 7.0.0
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
     dependencies:
       mimic-response: 1.0.1
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+    engines: {node: '>=0.8'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
     dependencies:
@@ -2206,6 +2449,11 @@ packages:
     resolution: {integrity: 
sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==}
+    engines: {node: '>= 0.6'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
     engines: {node: '>= 0.6'}
@@ -2294,6 +2542,17 @@ packages:
     engines: {node: '>=4'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==}
+    engines: {node: '>=18'}
+    dependencies:
+      rrweb-cssom: 0.6.0
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==}
 
@@ -2308,6 +2567,14 @@ packages:
       assert-plus: 1.0.0
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
+    engines: {node: '>=18'}
+    dependencies:
+      whatwg-mimetype: 4.0.0
+      whatwg-url: 14.0.0
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
     engines: {node: '>= 0.4'}
@@ -2384,6 +2651,10 @@ packages:
     engines: {node: '>=0.10.0'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==}
     engines: {node: '>=4'}
@@ -2398,6 +2669,30 @@ packages:
       type-detect: 4.0.8
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      array-buffer-byte-length: 1.0.1
+      call-bind: 1.0.7
+      es-get-iterator: 1.1.3
+      get-intrinsic: 1.2.4
+      is-arguments: 1.1.1
+      is-array-buffer: 3.0.4
+      is-date-object: 1.0.5
+      is-regex: 1.1.4
+      is-shared-array-buffer: 1.0.3
+      isarray: 2.0.5
+      object-is: 1.1.6
+      object-keys: 1.1.1
+      object.assign: 4.1.5
+      regexp.prototype.flags: 1.5.2
+      side-channel: 1.0.6
+      which-boxed-primitive: 1.0.2
+      which-collection: 1.0.2
+      which-typed-array: 1.1.15
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
     engines: {node: '>=4.0.0'}
@@ -2407,6 +2702,12 @@ packages:
     resolution: {integrity: 
sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+    dependencies:
+      clone: 1.0.4
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==}
     dev: true
@@ -2438,6 +2739,11 @@ packages:
     engines: {node: '>= 0.8'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+    engines: {node: '>=6'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
     engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
@@ -2462,6 +2768,14 @@ packages:
       esutils: 2.0.3
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==}
     dev: false
@@ -2638,6 +2952,20 @@ packages:
     engines: {node: '>= 0.4'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==}
+    dependencies:
+      call-bind: 1.0.7
+      get-intrinsic: 1.2.4
+      has-symbols: 1.0.3
+      is-arguments: 1.1.1
+      is-map: 2.0.3
+      is-set: 2.0.3
+      is-string: 1.0.7
+      isarray: 2.0.5
+      stop-iteration-iterator: 1.0.0
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
     engines: {node: '>= 0.4'}
@@ -2906,6 +3234,11 @@ packages:
     engines: {node: '>= 0.6'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+    engines: {node: '>=0.8.x'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==}
     engines: {node: '>=4'}
@@ -2986,6 +3319,15 @@ packages:
     resolution: {integrity: 
sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+    engines: {node: '>=4'}
+    dependencies:
+      chardet: 0.7.0
+      iconv-lite: 0.4.24
+      tmp: 0.0.33
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==}
     engines: {'0': node >=0.6.0}
@@ -3024,6 +3366,13 @@ packages:
       reusify: 1.0.4
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
+    engines: {node: '>=8'}
+    dependencies:
+      escape-string-regexp: 1.0.5
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
     engines: {node: ^10.12.0 || >=12.0.0}
@@ -3126,7 +3475,6 @@ packages:
       asynckit: 0.4.0
       combined-stream: 1.0.8
       mime-types: 2.1.35
-    dev: false
 
   /[email protected]:
     resolution: {integrity: 
sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
@@ -3345,6 +3693,11 @@ packages:
     resolution: {integrity: 
sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==}
+    engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==}
     engines: {node: '>=4'}
@@ -3406,6 +3759,10 @@ packages:
     dependencies:
       function-bind: 1.1.2
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==}
     dependencies:
@@ -3433,6 +3790,13 @@ packages:
     resolution: {integrity: 
sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
+    engines: {node: '>=18'}
+    dependencies:
+      whatwg-encoding: 3.1.1
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
     dev: true
@@ -3448,6 +3812,16 @@ packages:
       toidentifier: 1.0.1
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
+    engines: {node: '>= 14'}
+    dependencies:
+      agent-base: 7.1.1
+      debug: 4.3.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==}
     engines: {node: '>=0.8', npm: '>=1.3.7'}
@@ -3457,6 +3831,16 @@ packages:
       sshpk: 1.18.0
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
+    engines: {node: '>= 14'}
+    dependencies:
+      agent-base: 7.1.1
+      debug: 4.3.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
     engines: {node: '>=16.17.0'}
@@ -3469,6 +3853,17 @@ packages:
       safer-buffer: 2.1.2
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      safer-buffer: 2.1.2
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==}
     engines: {node: '>= 4'}
@@ -3503,6 +3898,11 @@ packages:
     engines: {node: '>=0.8.19'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+    engines: {node: '>=8'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
     deprecated: This module is not supported, and leaks memory. Do not use it. 
Check out lru-cache if you want a good and tested way to coalesce async 
requests by a key value, which is much more comprehensive and powerful.
@@ -3519,6 +3919,27 @@ packages:
     resolution: {integrity: 
sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==}
+    engines: {node: '>=12.0.0'}
+    dependencies:
+      ansi-escapes: 4.3.2
+      chalk: 4.1.2
+      cli-cursor: 3.1.0
+      cli-width: 3.0.0
+      external-editor: 3.1.0
+      figures: 3.2.0
+      lodash: 4.17.21
+      mute-stream: 0.0.8
+      ora: 5.4.1
+      run-async: 2.4.1
+      rxjs: 7.8.1
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      through: 2.3.8
+      wrap-ansi: 6.2.0
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
     engines: {node: '>= 0.4'}
@@ -3533,6 +3954,14 @@ packages:
     engines: {node: '>= 0.10'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.7
+      has-tostringtag: 1.0.2
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
     engines: {node: '>= 0.4'}
@@ -3550,6 +3979,13 @@ packages:
       has-bigints: 1.0.2
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
+    dependencies:
+      binary-extensions: 2.3.0
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
     engines: {node: '>= 0.4'}
@@ -3605,6 +4041,13 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      has-tostringtag: 1.0.2
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
     engines: {node: '>=0.10.0'}
@@ -3620,11 +4063,25 @@ packages:
       is-path-inside: 1.0.1
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+    engines: {node: '>= 0.4'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
     engines: {node: '>= 0.4'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==}
     engines: {node: '>=8'}
@@ -3654,6 +4111,10 @@ packages:
       path-is-inside: 1.0.2
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==}
     dev: true
@@ -3666,6 +4127,11 @@ packages:
       has-tostringtag: 1.0.2
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+    engines: {node: '>= 0.4'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
     engines: {node: '>= 0.4'}
@@ -3708,12 +4174,30 @@ packages:
     resolution: {integrity: 
sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
     dev: true
 
-  /[email protected]:
-    resolution: {integrity: 
sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+  /[email protected]:
+    resolution: {integrity: 
sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+    engines: {node: '>= 0.4'}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
     dependencies:
       call-bind: 1.0.7
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.7
+      get-intrinsic: 1.2.4
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==}
 
@@ -3749,6 +4233,11 @@ packages:
     resolution: {integrity: 
sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
 
@@ -3775,6 +4264,42 @@ packages:
     resolution: {integrity: 
sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      canvas: ^2.11.2
+    peerDependenciesMeta:
+      canvas:
+        optional: true
+    dependencies:
+      cssstyle: 4.0.1
+      data-urls: 5.0.0
+      decimal.js: 10.4.3
+      form-data: 4.0.0
+      html-encoding-sniffer: 4.0.0
+      http-proxy-agent: 7.0.2
+      https-proxy-agent: 7.0.5
+      is-potential-custom-element-name: 1.0.1
+      nwsapi: 2.2.12
+      parse5: 7.1.2
+      rrweb-cssom: 0.7.1
+      saxes: 6.0.0
+      symbol-tree: 3.2.4
+      tough-cookie: 4.1.4
+      w3c-xmlserializer: 5.0.0
+      webidl-conversions: 7.0.0
+      whatwg-encoding: 3.1.1
+      whatwg-mimetype: 4.0.0
+      whatwg-url: 14.0.0
+      ws: 8.18.0
+      xml-name-validator: 5.0.0
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
     engines: {node: '>=4'}
@@ -3962,12 +4487,19 @@ packages:
   /[email protected]:
     resolution: {integrity: 
sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+    engines: {node: '>=10'}
+    dependencies:
+      chalk: 4.1.2
+      is-unicode-supported: 0.1.0
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
     hasBin: true
     dependencies:
       js-tokens: 4.0.0
-    dev: false
 
   /[email protected]:
     resolution: {integrity: 
sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
@@ -4020,6 +4552,11 @@ packages:
       yallist: 3.1.1
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
+    hasBin: true
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==}
     dependencies:
@@ -4109,6 +4646,11 @@ packages:
     engines: {node: '>=4'}
     hasBin: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+    engines: {node: '>=6'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
     engines: {node: '>=12'}
@@ -4119,6 +4661,11 @@ packages:
     engines: {node: '>=4'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+    engines: {node: '>=4'}
+    dev: true
+
   /[email protected]([email protected])([email protected]):
     resolution: {integrity: 
sha512-YzffKHbYsMQGUWQRKdsearR79QsMzzJcDDmZKlJBqt5JNkqpyJHYlK6gP61O36X+sLf76sO9G6mhKBe83gIZIQ==}
     peerDependencies:
@@ -4190,6 +4737,46 @@ packages:
     resolution: {integrity: 
sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
     dev: true
 
+  /[email protected]([email protected]):
+    resolution: {integrity: 
sha512-CiPyRFiYJCXYyH/vwxT7m+sa4VZHuUH6cGwRBj0kaTjBGpsk4EnL47YzhoA859htVCF2vzqZuOsomIUlFqg9GQ==}
+    engines: {node: '>=14'}
+    hasBin: true
+    requiresBuild: true
+    peerDependencies:
+      typescript: '>= 4.4.x'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@mswjs/cookies': 0.2.2
+      '@mswjs/interceptors': 0.17.10
+      '@open-draft/until': 1.0.3
+      '@types/cookie': 0.4.1
+      '@types/js-levenshtein': 1.1.3
+      chalk: 4.1.2
+      chokidar: 3.6.0
+      cookie: 0.4.2
+      graphql: 16.9.0
+      headers-polyfill: 3.2.5
+      inquirer: 8.2.6
+      is-node-process: 1.2.0
+      js-levenshtein: 1.1.6
+      node-fetch: 2.7.0
+      outvariant: 1.4.3
+      path-to-regexp: 6.2.2
+      strict-event-emitter: 0.4.6
+      type-fest: 2.19.0
+      typescript: 4.9.5
+      yargs: 17.7.2
+    transitivePeerDependencies:
+      - encoding
+      - supports-color
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
     dependencies:
@@ -4237,6 +4824,18 @@ packages:
       tslib: 2.6.3
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+    engines: {node: 4.x || >=6.0.0}
+    peerDependencies:
+      encoding: ^0.1.0
+    peerDependenciesMeta:
+      encoding:
+        optional: true
+    dependencies:
+      whatwg-url: 5.0.0
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
     dev: true
@@ -4250,6 +4849,11 @@ packages:
       validate-npm-package-license: 3.0.4
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==}
     engines: {node: '>=8'}
@@ -4285,6 +4889,10 @@ packages:
       path-key: 4.0.0
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
     dev: true
@@ -4298,6 +4906,14 @@ packages:
     engines: {node: '>= 0.4'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.7
+      define-properties: 1.2.1
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
     engines: {node: '>= 0.4'}
@@ -4338,6 +4954,13 @@ packages:
       wrappy: 1.0.2
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+    engines: {node: '>=6'}
+    dependencies:
+      mimic-fn: 2.1.0
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
     engines: {node: '>=12'}
@@ -4357,6 +4980,30 @@ packages:
       word-wrap: 1.2.5
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      bl: 4.1.0
+      chalk: 4.1.2
+      cli-cursor: 3.1.0
+      cli-spinners: 2.9.2
+      is-interactive: 1.0.0
+      is-unicode-supported: 0.1.0
+      log-symbols: 4.1.0
+      strip-ansi: 6.0.1
+      wcwidth: 1.0.1
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==}
     engines: {node: '>=6'}
@@ -4435,6 +5082,12 @@ packages:
     engines: {node: '>=6'}
     dev: false
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
+    dependencies:
+      entities: 4.5.0
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
     engines: {node: '>= 0.8'}
@@ -4489,6 +5142,10 @@ packages:
     dependencies:
       isarray: 0.0.1
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==}
     engines: {node: '>=4'}
@@ -4598,6 +5255,15 @@ packages:
     hasBin: true
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    dependencies:
+      ansi-regex: 5.0.1
+      ansi-styles: 5.2.0
+      react-is: 17.0.2
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -4625,7 +5291,6 @@ packages:
       loose-envify: 1.4.0
       object-assign: 4.1.1
       react-is: 16.13.1
-    dev: false
 
   /[email protected]:
     resolution: {integrity: 
sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
@@ -4676,6 +5341,10 @@ packages:
     engines: {node: '>=0.6'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
     dev: true
@@ -5208,7 +5877,6 @@ packages:
       prop-types: 15.8.1
       react: 16.14.0
       scheduler: 0.19.1
-    dev: false
 
   /[email protected]([email protected]):
     resolution: {integrity: 
sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg==}
@@ -5221,7 +5889,10 @@ packages:
 
   /[email protected]:
     resolution: {integrity: 
sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
-    dev: false
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
+    dev: true
 
   /[email protected]:
     resolution: {integrity: 
sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
@@ -5304,7 +5975,6 @@ packages:
       loose-envify: 1.4.0
       object-assign: 4.1.1
       prop-types: 15.8.1
-    dev: false
 
   /[email protected]:
     resolution: {integrity: 
sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==}
@@ -5315,6 +5985,22 @@ packages:
       path-type: 3.0.0
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+    engines: {node: '>= 6'}
+    dependencies:
+      inherits: 2.0.4
+      string_decoder: 1.3.0
+      util-deprecate: 1.0.2
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
+    dependencies:
+      picomatch: 2.3.1
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-vSaTR9t+cpxlskkdUFrsEpnf67kSmPk66yAGT1fZPrDudxQjoMzPgQhSMImQ0pAw5k0NPirefQfhopSjhdUtpQ==}
     dependencies:
@@ -5325,6 +6011,14 @@ packages:
       tslib: 1.14.1
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
+    engines: {node: '>=8'}
+    dependencies:
+      indent-string: 4.0.0
+      strip-indent: 3.0.0
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
 
@@ -5398,6 +6092,10 @@ packages:
     resolution: {integrity: 
sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
     dev: false
@@ -5424,6 +6122,14 @@ packages:
       lowercase-keys: 1.0.1
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+    engines: {node: '>=8'}
+    dependencies:
+      onetime: 5.1.2
+      signal-exit: 3.0.7
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
     engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
@@ -5471,12 +6177,31 @@ packages:
       fsevents: 2.3.3
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
+    engines: {node: '>=0.12.0'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
     dependencies:
       queue-microtask: 1.2.3
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+    dependencies:
+      tslib: 2.6.3
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
     engines: {node: '>=0.4'}
@@ -5508,12 +6233,18 @@ packages:
     resolution: {integrity: 
sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
+    engines: {node: '>=v12.22.7'}
+    dependencies:
+      xmlchars: 2.2.0
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==}
     dependencies:
       loose-envify: 1.4.0
       object-assign: 4.1.1
-    dev: false
 
   /[email protected]:
     resolution: {integrity: 
sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==}
@@ -5588,6 +6319,10 @@ packages:
     resolution: {integrity: 
sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
     engines: {node: '>= 0.4'}
@@ -5767,6 +6502,23 @@ packages:
       graceful-fs: 4.2.11
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      internal-slot: 1.0.7
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A==}
+    dependencies:
+      events: 3.3.0
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==}
     dev: false
@@ -5843,6 +6595,12 @@ packages:
       es-object-atoms: 1.0.0
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+    dependencies:
+      safe-buffer: 5.2.1
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==}
     engines: {node: '>=4'}
@@ -5886,6 +6644,13 @@ packages:
     engines: {node: '>=12'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+    engines: {node: '>=8'}
+    dependencies:
+      min-indent: 1.0.1
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
     engines: {node: '>=0.10.0'}
@@ -5937,6 +6702,10 @@ packages:
     resolution: {integrity: 
sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==}
     engines: {node: '>=10.0.0'}
@@ -5972,6 +6741,10 @@ packages:
       any-promise: 1.3.0
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
     dev: false
@@ -5994,6 +6767,13 @@ packages:
     engines: {node: '>=14.0.0'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+    engines: {node: '>=0.6.0'}
+    dependencies:
+      os-tmpdir: 1.0.2
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
     engines: {node: '>=4'}
@@ -6027,6 +6807,27 @@ packages:
       punycode: 2.3.1
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
+    engines: {node: '>=6'}
+    dependencies:
+      psl: 1.9.0
+      punycode: 2.3.1
+      universalify: 0.2.0
+      url-parse: 1.5.10
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==}
+    engines: {node: '>=18'}
+    dependencies:
+      punycode: 2.3.1
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
     dev: true
@@ -6088,11 +6889,21 @@ packages:
     engines: {node: '>=10'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+    engines: {node: '>=10'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==}
     engines: {node: '>=6'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+    engines: {node: '>=12.20'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
     engines: {node: '>= 0.6'}
@@ -6174,6 +6985,11 @@ packages:
       crypto-random-string: 1.0.0
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
+    engines: {node: '>= 4.0.0'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
     engines: {node: '>= 0.8'}
@@ -6221,6 +7037,27 @@ packages:
       prepend-http: 2.0.0
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+    dependencies:
+      querystringify: 2.2.0
+      requires-port: 1.0.0
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
+    dependencies:
+      inherits: 2.0.4
+      is-arguments: 1.1.1
+      is-generator-function: 1.0.10
+      is-typed-array: 1.1.13
+      which-typed-array: 1.1.15
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
     engines: {node: '>= 0.4.0'}
@@ -6383,7 +7220,7 @@ packages:
       fsevents: 2.3.3
     dev: true
 
-  /[email protected]([email protected]):
+  /[email protected]([email protected])([email protected]):
     resolution: {integrity: 
sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==}
     engines: {node: ^18.0.0 || >=20.0.0}
     hasBin: true
@@ -6417,6 +7254,7 @@ packages:
       chai: 4.4.1
       debug: 4.3.5
       execa: 8.0.1
+      jsdom: 24.1.1
       local-pkg: 0.5.0
       magic-string: 0.30.10
       pathe: 1.1.2
@@ -6438,12 +7276,69 @@ packages:
       - terser
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
+    engines: {node: '>=18'}
+    dependencies:
+      xml-name-validator: 5.0.0
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==}
     dependencies:
       loose-envify: 1.4.0
     dev: false
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+    dependencies:
+      defaults: 1.0.4
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==}
+    dependencies:
+      util: 0.12.5
+    optionalDependencies:
+      '@zxing/text-encoding': 0.9.0
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
+    engines: {node: '>=18'}
+    dependencies:
+      iconv-lite: 0.6.3
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
+    engines: {node: '>=18'}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==}
+    engines: {node: '>=18'}
+    dependencies:
+      tr46: 5.0.0
+      webidl-conversions: 7.0.0
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+    dependencies:
+      tr46: 0.0.3
+      webidl-conversions: 3.0.1
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
     dependencies:
@@ -6454,6 +7349,16 @@ packages:
       is-symbol: 1.0.4
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      is-map: 2.0.3
+      is-set: 2.0.3
+      is-weakmap: 2.0.2
+      is-weakset: 2.0.3
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
     dev: true
@@ -6514,6 +7419,15 @@ packages:
       strip-ansi: 5.2.0
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+    engines: {node: '>=8'}
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
     engines: {node: '>=10'}
@@ -6544,15 +7458,42 @@ packages:
       signal-exit: 3.0.7
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
+    engines: {node: '>=10.0.0'}
+    peerDependencies:
+      bufferutil: ^4.0.1
+      utf-8-validate: '>=5.0.2'
+    peerDependenciesMeta:
+      bufferutil:
+        optional: true
+      utf-8-validate:
+        optional: true
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==}
     engines: {node: '>=4'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
+    engines: {node: '>=18'}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: 
sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+    engines: {node: '>=10'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==}
     dev: true
@@ -6573,6 +7514,11 @@ packages:
       decamelize: 1.2.0
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+    engines: {node: '>=12'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==}
     dependencies:
@@ -6589,6 +7535,19 @@ packages:
       yargs-parser: 15.0.3
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: 
sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+    engines: {node: '>=12'}
+    dependencies:
+      cliui: 8.0.1
+      escalade: 3.1.2
+      get-caller-file: 2.0.5
+      require-directory: 2.1.1
+      string-width: 4.2.3
+      y18n: 5.0.8
+      yargs-parser: 21.1.1
+    dev: true
+
   /[email protected]:
     resolution: {integrity: 
sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
     engines: {node: '>=12.20'}
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/Overview.test.tsx
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/Overview.test.tsx
new file mode 100644
index 0000000000..8af860e324
--- /dev/null
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/Overview.test.tsx
@@ -0,0 +1,214 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react';
+import { BrowserRouter } from 'react-router-dom';
+
+/**
+ * The dont-cleanup-after-each is imported to prevent autoCleanup of rendered
+ * component after each test.
+ * Since we are needing to set a timeout everytime the component is rendered
+ * and we would be verifying whether the UI is correct, we can skip the cleanup
+ * and leave it for after all the tests run - saving test time
+ */
+import '@testing-library/react/dont-cleanup-after-each';
+import { cleanup, render, screen } from '@testing-library/react';
+
+import { overviewLocators } from '@tests/locators/locators';
+import { faultyOverviewServer, overviewServer } from 
'@tests/mocks/overviewMocks/overviewServer';
+import Overview from '@/v2/pages/overview/overview';
+
+const WrappedOverviewComponent = () => {
+  return (
+    <BrowserRouter>
+      <Overview />
+    </BrowserRouter>
+  )
+}
+
+/**
+ * We need to mock the EChart component as in the virtual DOM
+ * it cannot access the DOM height and width and will throw errors
+ * Hence we intercept and mock the import to return an empty
+ * React fragment
+ */
+vi.mock('@/v2/components/eChart/eChart', () => ({
+  default: () => (<></>)
+}))
+
+describe.each([
+  true,
+  false
+])('Overview Tests - Data is present = %s', (scenario) => {
+  beforeAll(async () => {
+    (scenario) ? overviewServer.listen() : faultyOverviewServer.listen();
+    render(
+      <WrappedOverviewComponent />
+    );
+    //Setting a timeout of 100ms to allow requests to be resolved and states 
to be set
+    await new Promise((r) => { setTimeout(r, 100) })
+  });
+
+  afterAll(() => {
+    (scenario) ? overviewServer.close() : faultyOverviewServer.close();
+    vi.clearAllMocks();
+    /**
+     * Need to cleanup the DOM after one suite has completely run
+     * Otherwise we will get duplicate elements
+     */
+    cleanup();
+  })
+
+  // Tests begin here
+  // All the data is being mocked by MSW, so we have a fixed data that we can 
verify
+  // the content against
+  it('Datanode row has the correct count of Datanodes', () => {
+    const datanodeRow = screen.getByTestId(overviewLocators.datanodeRow);
+    expect(datanodeRow).toBeVisible();
+    expect(datanodeRow).toHaveTextContent((scenario) ? '3/5' : 'N/A');
+  });
+
+  it('Containers row has the correct count of containers', () => {
+    const containerRow = screen.getByTestId(overviewLocators.containersRow);
+    expect(containerRow).toBeVisible();
+    expect(containerRow).toHaveTextContent((scenario) ? '20' : 'N/A');
+  });
+
+  it('Capacity card has the correct capacity data', () => {
+    const capacityOzoneUsed = 
screen.getByTestId(overviewLocators.capacityOzoneUsed);
+    const capacityNonOzoneUsed = 
screen.getByTestId(overviewLocators.capacityNonOzoneUsed);
+    const capacityRemaining = 
screen.getByTestId(overviewLocators.capacityRemaining);
+    const capacityPreAllocated = 
screen.getByTestId(overviewLocators.capacityPreAllocated);
+
+    expect(capacityOzoneUsed).toBeVisible();
+    expect(capacityNonOzoneUsed).toBeVisible();
+    expect(capacityRemaining).toBeVisible();
+    expect(capacityPreAllocated).toBeVisible();
+
+    expect(capacityOzoneUsed).toHaveTextContent(
+      (scenario)
+        ? /Ozone Used\s*784.7 MB/
+        : /Ozone Used\s*0 B/
+    );
+    expect(capacityNonOzoneUsed).toHaveTextContent(
+      (scenario)
+        ? /Non Ozone Used\s*263.1 GB/
+        : /Non Ozone Used\s*0 B/
+    );
+    expect(capacityRemaining).toHaveTextContent(
+      (scenario)
+        ? /Remaining\s*995.4 GB/
+        : /Remaining\s*0 B/
+    );
+    expect(capacityPreAllocated).toHaveTextContent(
+      (scenario)
+        ? /Container Pre-allocated\s*11.2 GB/
+        : /Container Pre-allocated\s*0 B/
+    );
+  });
+
+  it('Volumes card has the correct number of volumes', () => {
+    const volumeCard = screen.getByTestId(overviewLocators.volumesCard);
+    expect(volumeCard).toBeVisible();
+    expect(volumeCard).toHaveTextContent((scenario) ? '2' : 'N/A');
+  });
+
+  it('Buckets card has the correct number of buckets', () => {
+    const bucketsCard = screen.getByTestId(overviewLocators.bucketsCard);
+    expect(bucketsCard).toBeVisible();
+    expect(bucketsCard).toHaveTextContent((scenario) ? '24' : 'N/A');
+  });
+
+  it('Keys card has the correct number of keys', () => {
+    const keysCard = screen.getByTestId(overviewLocators.keysCard);
+    expect(keysCard).toBeVisible();
+    expect(keysCard).toHaveTextContent((scenario) ? '1424' : 'N/A');
+  });
+
+  it('Pipelines card has the correct count of Pipelines', () => {
+    const pipelinesCard = screen.getByTestId(overviewLocators.pipelinesCard);
+    expect(pipelinesCard).toBeVisible();
+    expect(pipelinesCard).toHaveTextContent((scenario) ? '7' : 'N/A');
+  });
+
+  it('Deleted Containers card has the correct count of deleted containers', () 
=> {
+    const deletedContainersCard = 
screen.getByTestId(overviewLocators.deletedContainersCard);
+    expect(deletedContainersCard).toBeVisible();
+    expect(deletedContainersCard).toHaveTextContent((scenario) ? '10' : 'N/A')
+  })
+
+  it('Delete Pending Summary has the correct data', () => {
+    const deletePendingReplicatedData = screen.getByTestId(
+      overviewLocators.deletePendingTotalReplicatedData
+    );
+    const deletePendingUnreplicatedData = screen.getByTestId(
+      overviewLocators.deletePendingTotalUnreplicatedData
+    );
+    const deletePendingKeys = 
screen.getByTestId(overviewLocators.deletePendingKeys);
+
+    expect(deletePendingReplicatedData).toBeVisible();
+    expect(deletePendingUnreplicatedData).toBeVisible();
+    expect(deletePendingKeys).toBeVisible();
+
+    expect(deletePendingReplicatedData).toHaveTextContent(
+      (scenario)
+        ? /Total Replicated Data\s*1 KB/
+        : /Total Replicated Data\s*N\/A/
+    );
+    expect(deletePendingUnreplicatedData).toHaveTextContent(
+      (scenario)
+        ? /Total Unreplicated Data\s*4 KB/
+        : /Total Unreplicated Data\s*N\/A/
+    );
+    expect(deletePendingKeys).toHaveTextContent(
+      (scenario)
+        ? /Delete Pending Keys\s*3/
+        : /Delete Pending Keys\s*N\/A/
+    );
+  });
+
+  it('Open Keys summary has the correct data', () => {
+    const openKeysReplicatedData = screen.getByTestId(
+      overviewLocators.openTotalReplicatedData
+    );
+    const openKeysUnreplicatedData = screen.getByTestId(
+      overviewLocators.openTotalUnreplicatedData
+    );
+    const openKeys = screen.getByTestId(overviewLocators.openKeys);
+
+    expect(openKeysReplicatedData).toBeVisible();
+    expect(openKeysUnreplicatedData).toBeVisible();
+    expect(openKeys).toBeVisible();
+
+    expect(openKeysReplicatedData).toHaveTextContent(
+      (scenario)
+        ? /Total Replicated Data\s*1 KB/
+        : /Total Replicated Data\s*N\/A/
+    );
+    expect(openKeysUnreplicatedData).toHaveTextContent(
+      (scenario)
+        ? /Total Unreplicated Data\s*4 KB/
+        : /Total Unreplicated Data\s*N\/A/
+    );
+    expect(openKeys).toHaveTextContent(
+      (scenario)
+        ? /Open Keys\s*10/
+        : /Open Keys\s*N\/A/
+    );
+  });
+})
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/locators/locators.ts
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/locators/locators.ts
new file mode 100644
index 0000000000..23fbc76870
--- /dev/null
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/locators/locators.ts
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export const overviewLocators = {
+  'datanodeRow': 'overview-Health-Datanodes',
+  'containersRow': 'overview-Health-Containers',
+  'capacityOzoneUsed': 'capacity-ozone-used',
+  'capacityNonOzoneUsed': 'capacity-non-ozone-used',
+  'capacityRemaining': 'capacity-remaining',
+  'capacityPreAllocated': 'capacity-pre-allocated',
+  'volumesCard': 'overview-Volumes',
+  'bucketsCard': 'overview-Buckets',
+  'keysCard': 'overview-Keys',
+  'pipelinesCard': 'overview-Pipelines',
+  'deletedContainersCard': 'overview-Deleted Containers',
+  'openTotalReplicatedData': 'overview-Open Keys Summary-Total Replicated 
Data',
+  'openTotalUnreplicatedData': 'overview-Open Keys Summary-Total Unreplicated 
Data',
+  'openKeys': 'overview-Open Keys Summary-Open Keys',
+  'deletePendingTotalReplicatedData': 'overview-Delete Pending Keys 
Summary-Total Replicated Data',
+  'deletePendingTotalUnreplicatedData': 'overview-Delete Pending Keys 
Summary-Total Unreplicated Data',
+  'deletePendingKeys': 'overview-Delete Pending Keys Summary-Delete Pending 
Keys'
+}
+
+export const datanodeLocators = {
+  'datanodeContainer': 'datanodes-container',
+  'datanodeMultiSelect': 'datanodes-multiselect'
+}
+
+export const autoReloadPanelLocators = {
+  'autoreloadPanel': 'autoreload-panel',
+  'refreshButton': 'autoreload-panel-refresh',
+  'toggleSwitch': 'autoreload-panel-switch'
+}
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/app.test.tsx
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/mocks/overviewMocks/overviewResponseMocks.ts
similarity index 53%
rename from 
hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/app.test.tsx
rename to 
hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/mocks/overviewMocks/overviewResponseMocks.ts
index ad78746210..2a0bbb687f 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/app.test.tsx
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/mocks/overviewMocks/overviewResponseMocks.ts
@@ -16,12 +16,35 @@
  * limitations under the License.
  */
 
-import React from 'react';
-import ReactDOM from 'react-dom';
-import App from './app';
+export const ClusterState = {
+  "deletedDirs": 0,
+  "pipelines": 7,
+  "totalDatanodes": 5,
+  "healthyDatanodes": 3,
+  "storageReport": {
+    "capacity": 1352149585920,
+    "used": 822805801,
+    "remaining": 1068824879104,
+    "committed": 12000222315
+  },
+  "containers": 20,
+  "missingContainers": 2,
+  "openContainers": 8,
+  "deletedContainers": 10,
+  "volumes": 2,
+  "buckets": 24,
+  "keys": 1424,
+  "keysPendingDeletion": 2
+}
 
-it('renders without crashing', () => {
-  const div = document.createElement('div');
-  ReactDOM.render(<App/>, div);
-  ReactDOM.unmountComponentAtNode(div);
-});
+export const OpenKeys = {
+  "totalUnreplicatedDataSize": 4096,
+  "totalReplicatedDataSize": 1024,
+  "totalOpenKeys": 10
+}
+
+export const DeletePendingSummary = {
+  "totalUnreplicatedDataSize": 4096,
+  "totalReplicatedDataSize": 1024,
+  "totalDeletedKeys": 3
+}
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/mocks/overviewMocks/overviewServer.ts
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/mocks/overviewMocks/overviewServer.ts
new file mode 100644
index 0000000000..748f8e4ed5
--- /dev/null
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/mocks/overviewMocks/overviewServer.ts
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { setupServer } from "msw/node";
+import { rest } from "msw";
+
+import * as mockResponses from "./overviewResponseMocks";
+
+const handlers = [
+  rest.get("api/v1/clusterState", (req, res, ctx) => {
+    return res(
+      ctx.status(200),
+      ctx.json(mockResponses.ClusterState)
+    );
+  }),
+  rest.get("api/v1/task/status", (req, res, ctx) => {
+    return res(
+      ctx.status(200),
+      ctx.json(mockResponses.TaskStatus)
+    );
+  }),
+  rest.get("api/v1/keys/open/summary", (req, res, ctx) => {
+    return res(
+      ctx.status(200),
+      ctx.json(mockResponses.OpenKeys)
+    );
+  }),
+  rest.get("api/v1/keys/deletePending/summary", (req, res, ctx) => {
+    return res(
+      ctx.status(200),
+      ctx.json(mockResponses.DeletePendingSummary)
+    );
+  })
+]
+
+const faultyHandlers = [
+  rest.get("api/v1/clusterState", (req, res, ctx) => {
+    return res(
+      ctx.status(200),
+      ctx.json(null)
+    );
+  }),
+  rest.get("api/v1/task/status", (req, res, ctx) => {
+    return res(
+      ctx.status(200),
+      ctx.json(null)
+    );
+  }),
+  rest.get("api/v1/keys/open/summary", (req, res, ctx) => {
+    return res(
+      ctx.status(200),
+      ctx.json(null)
+    );
+  }),
+  rest.get("api/v1/keys/deletePending/summary", (req, res, ctx) => {
+    return res(
+      ctx.status(200),
+      ctx.json(null)
+    );
+  })
+]
+//This will configure a request mocking server using MSW
+export const overviewServer = setupServer(...handlers);
+export const faultyOverviewServer = setupServer(...faultyHandlers);
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/vitest.setup.ts
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/vitest.setup.ts
new file mode 100644
index 0000000000..54dc2d5e52
--- /dev/null
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/vitest.setup.ts
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import '@testing-library/jest-dom/vitest';
+
+
+/** jsdom currently doesn't implement a local storage
+ * Hence we need to implement a minimal storage functionality
+ * for the virtualDOM, to be able to use localstorage in virtual components
+*/
+const localStorageMock = (function () {
+  let store: { [key: string]: any } = {}
+
+  return {
+      getItem: function (key: string): any | null {
+          return store[key] || null;
+      },
+      setItem: function (key: string, value: any): void {
+          store[key] = value.toString();
+      },
+      removeItem: function (key: string): void {
+          delete store[key]
+      },
+      clear: function (): void {
+          store = {}
+      }
+  }
+});
+
+Object.defineProperty(window, 'localStorage', {
+  value: localStorageMock
+});
+
+Object.defineProperty(window, 'matchMedia', {
+  writable: true,
+  value: vi.fn().mockImplementation(query => ({
+    matches: false,
+    media: query,
+    onchange: null,
+    addListener: vi.fn(), // deprecated
+    removeListener: vi.fn(), // deprecated
+    addEventListener: vi.fn(),
+    removeEventListener: vi.fn(),
+    dispatchEvent: vi.fn(),
+  })),
+})
\ No newline at end of file
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/components/autoReloadPanel/autoReloadPanel.tsx
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/components/autoReloadPanel/autoReloadPanel.tsx
index 6510b3b3b6..0230d4dd61 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/components/autoReloadPanel/autoReloadPanel.tsx
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/components/autoReloadPanel/autoReloadPanel.tsx
@@ -84,11 +84,24 @@ class AutoReloadPanel extends 
React.Component<IAutoReloadPanelProps> {
       );
 
     return (
-      <div className='auto-reload-panel'>
+      <div className='auto-reload-panel' data-testid='autoreload-panel'>
         Auto Refresh
-        &nbsp;<Switch defaultChecked={autoReloadEnabled} size='small' 
className='toggle-switch' onChange={this.autoReloadToggleHandler} />
+        &nbsp;
+        <Switch
+          defaultChecked={autoReloadEnabled}
+          size='small'
+          className='toggle-switch'
+          onChange={this.autoReloadToggleHandler}
+          data-testid='autoreload-panel-switch' />
         &nbsp; | Refreshed at {lastRefreshedText}
-        &nbsp;<Button shape='circle' icon={<ReloadOutlined />} size='small' 
loading={isLoading} onClick={onReload} />
+        &nbsp;
+        <Button
+          shape='circle'
+          icon={<ReloadOutlined />}
+          size='small'
+          loading={isLoading}
+          onClick={onReload}
+          data-testid='autoreload-panel-refresh' />
         {lastUpdatedDeltaFullText}
       </div>
     );
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/components/overviewCard/overviewCard.tsx
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/components/overviewCard/overviewCard.tsx
index c8e19db14c..977eddb981 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/components/overviewCard/overviewCard.tsx
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/components/overviewCard/overviewCard.tsx
@@ -142,10 +142,10 @@ class OverviewCard extends 
React.Component<IOverviewCardProps> {
   render() {
     let { icon, data, title, loading, hoverable, storageReport, linkToUrl, 
error } = this.props;
 
-    let meta = <Meta title={data} description={title} />;
+    let meta = <Meta title={data} description={title} 
data-testid={`overview-${title}`} />;
     let errorClass = error ? 'card-error' : '';
 
-    if (typeof data === 'string' && data === 'N/A'){
+    if (typeof data === 'string' && data === 'N/A') {
       errorClass = 'card-error';
     }
 
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/overviewCard/overviewSimpleCard.tsx
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/overviewCard/overviewSimpleCard.tsx
index 183ae73bc4..a685e3a2bc 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/overviewCard/overviewSimpleCard.tsx
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/overviewCard/overviewSimpleCard.tsx
@@ -130,7 +130,8 @@ const OverviewSimpleCard: React.FC<OverviewCardProps> = ({
       hoverable={hoverable}
       title={(linkToUrl) ? titleElement : title}
       headStyle={cardHeadStyle}
-      bodyStyle={cardBodyStyle}>
+      bodyStyle={cardBodyStyle}
+      data-testid={`overview-${title}`}>
       <Row
         align='middle'>
         <Col>
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/overviewCard/overviewStorageCard.tsx
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/overviewCard/overviewStorageCard.tsx
index d41f5dbcfb..d6e29a2f96 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/overviewCard/overviewStorageCard.tsx
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/overviewCard/overviewStorageCard.tsx
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-import React, { useMemo } from 'react';
+import React, { HTMLAttributes, useMemo } from 'react';
 import filesize from 'filesize';
 import { Card, Row, Col, Table, Tag } from 'antd';
 
@@ -224,7 +224,10 @@ const OverviewStorageCard: 
React.FC<OverviewStorageCardProps> = ({
                 usage: <Tag key='pre-allocated' color='red'>Container 
Pre-allocated</Tag>,
                 size: size(storageReport.committed)
               }
-            ]} />
+            ]}
+            onRow={(record) => ({
+              'data-testid': `capacity-${record.key}`
+            }) as HTMLAttributes<HTMLElement>} />
         </Col>
       </Row>
     </Card>
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/overviewCard/overviewSummaryCard.tsx
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/overviewCard/overviewSummaryCard.tsx
index 42c28676dd..e383512f20 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/overviewCard/overviewSummaryCard.tsx
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/overviewCard/overviewSummaryCard.tsx
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-import React from 'react';
+import React, { HTMLAttributes } from 'react';
 import { Card, Row, Table } from 'antd';
 
 import { ColumnType } from 'antd/es/table';
@@ -100,7 +100,10 @@ const OverviewSummaryCard: 
React.FC<OverviewTableCardProps> = ({
         size="small"
         pagination={false}
         dataSource={tableData}
-        columns={columns} />
+        columns={columns}
+        onRow={(record: TableData) => ({
+          'data-testid': `overview-${title}-${record.name}`
+        } as HTMLAttributes<HTMLElement>)}/>
     </Card>
   )
 }
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/overview/overview.tsx
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/overview/overview.tsx
index f511cb3a16..dc511b62ca 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/overview/overview.tsx
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/overview/overview.tsx
@@ -99,7 +99,7 @@ const getSummaryTableValue = (
   colType: 'value' | undefined = undefined
 ): string => {
   if (!value) return 'N/A';
-  if (colType === 'value') String(value as string)
+  if (colType === 'value') return String(value as string)
   return size(value as number)
 }
 
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/views/datanodes/datanodes.tsx
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/views/datanodes/datanodes.tsx
index 47fe41dd7b..d7fdf2b9eb 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/views/datanodes/datanodes.tsx
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/views/datanodes/datanodes.tsx
@@ -560,7 +560,7 @@ export class Datanodes extends 
React.Component<Record<string, object>, IDatanode
       onShowSizeChange: this.onShowSizeChange
     };
     return (
-      <div className='datanodes-container'>
+      <div className='datanodes-container' data-testid='datanodes-container'>
         <div className='page-header'>
           Datanodes ({totalCount})
           <div className='filter-block'>
@@ -575,6 +575,7 @@ export class Datanodes extends 
React.Component<Record<string, object>, IDatanode
               value={selectedColumns}
               allOption={allColumnsOption}
               onChange={this._handleColumnChange}
+              data-testid='datanodes-multiselect'
             /> Columns
           </div>
           <AutoReloadPanel
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/tsconfig.json
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/tsconfig.json
index 1d94b955da..610a55148a 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/tsconfig.json
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/tsconfig.json
@@ -21,9 +21,14 @@
     "rootDir": "src",
     "baseUrl": "src",
     "paths": {
-      "@/*": ["*"]
+      "@/*": ["*"],
+      "@tests/*": ["__tests__/*"]
     },
-    "types": ["vite/client", "vite-plugin-svgr/client"]
+    "types": [
+      "vite/client",
+      "vite-plugin-svgr/client",
+      "vitest/globals"
+    ]
   },
   "include": [
     "src"
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/vite-env.d.ts
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/vite-env.d.ts
deleted file mode 100644
index 46167caa7e..0000000000
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/vite-env.d.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
-* contributor license agreements.  See the NOTICE file distributed with
-* this work for additional information regarding copyright ownership.
-* The ASF licenses this file to You under the Apache License, Version 2.0
-* (the "License"); you may not use this file except in compliance with
-* the License.  You may obtain a copy of the License at
-
-* http://www.apache.org/licenses/LICENSE-2.0
-
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-/// <reference types="vite/client" />
\ No newline at end of file
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/vite.config.ts
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/vite.config.ts
index 068f27bb2d..ddb2832f39 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/vite.config.ts
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/vite.config.ts
@@ -1,19 +1,23 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
-* contributor license agreements.  See the NOTICE file distributed with
-* this work for additional information regarding copyright ownership.
-* The ASF licenses this file to You under the Apache License, Version 2.0
-* (the "License"); you may not use this file except in compliance with
-* the License.  You may obtain a copy of the License at
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
-* http://www.apache.org/licenses/LICENSE-2.0
-
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
+/// <reference types="vitest" />
+/// <reference types="vite/client" />
 
 import { defineConfig, splitVendorChunkPlugin } from 'vite';
 import { resolve } from 'path';
@@ -54,7 +58,8 @@ export default defineConfig({
   },
   resolve: {
     alias: {
-      "@": pathResolve('src')
+      "@": pathResolve('src'),
+      "@tests": pathResolve('src/__tests__')
     }
   },
   css: {
@@ -71,13 +76,9 @@ export default defineConfig({
   },
   test: {
     globals: true,
-    setupFiles: './src/setupTests.ts',
-    css: true,
-    reporters: ['verbose'],
-    coverage: {
-      reporter: ['text', 'json', 'html'],
-      include: ['src/**/*'],
-      exclude: []
-    }
+    environment: 'jsdom',
+    setupFiles: 'src/__tests__/vitest.setup.ts',
+    include: ["src/__tests__/**/*.test.tsx"],
+    reporters: ['verbose']
   }
-})
\ No newline at end of file
+});


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to