diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index 79eb1d9..5cb1e0e 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -57,3 +57,21 @@ jobs: - name: Run prettier run: pnpm format:check + + chromatic: + name: Chromatic + runs-on: ubuntu-latest + steps: + - name: Checkout branch + uses: actions/checkout@v3 + with: + fetch-depth: 0 # Required to retrieve git history + + - name: Install + uses: ./.github/composite-actions/install + + - name: Publish to Chromatic + uses: chromaui/action@v1 + with: + projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} + buildScriptName: 'storybook:build' diff --git a/.storybook/main.ts b/.storybook/main.ts index 58c166e..5fd1387 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -1,6 +1,10 @@ export default { stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], - addons: ['@storybook/addon-controls', '@storybook/preset-scss'], + addons: [ + '@storybook/addon-controls', + '@storybook/preset-scss', + '@storybook/addon-interactions', + ], refs: { '@chakra-ui/react': { disable: true }, '@mui/material': { disable: true }, diff --git a/package.json b/package.json index 02cfb68..8a39df7 100644 --- a/package.json +++ b/package.json @@ -41,9 +41,10 @@ "cm": "cz", "build": "tsup && tsc --emitDeclarationOnly", "test": "jest", + "test-storybook": "test-storybook", "test:coverage": "jest --coverage", - "storybook": "sb dev -p 6006", - "storybook:build": "sb build", + "storybook": "storybook dev -p 6006", + "storybook:build": "storybook build", "storybook:preview": "npx http-server ./storybook-static", "storybook-test:chrome": "npx playwright test ./.storybook/browser.test --headed --browser=chromium", "storybook-test:firefox": "npx playwright test ./.storybook/browser.test --headed --browser=firefox", @@ -81,10 +82,14 @@ "@semantic-release/github": "^8.0.6", "@semantic-release/npm": "^9.0.1", "@semantic-release/release-notes-generator": "^10.0.3", - "@storybook/addon-controls": "^7.3.0", + "@storybook/addon-controls": "^7.4.1", + "@storybook/addon-interactions": "^7.4.1", + "@storybook/jest": "^0.2.2", "@storybook/preset-scss": "^1.0.3", - "@storybook/react": "^7.3.0", - "@storybook/react-vite": "^7.3.0", + "@storybook/react": "^7.4.1", + "@storybook/react-vite": "^7.4.1", + "@storybook/test-runner": "^0.13.0", + "@storybook/testing-library": "^0.2.0", "@swc/core": "^1.3.76", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^12.1.5", @@ -123,7 +128,7 @@ "react-hook-form": "^7.41.1", "sass": "^1.55.0", "semantic-release": "^19.0.5", - "storybook": "^7.3.0", + "storybook": "^7.4.1", "stylelint": "^14.13.0", "stylelint-config-idiomatic-order": "^9.0.0", "stylelint-config-prettier": "^9.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f27930a..92d9494 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,17 +48,29 @@ importers: specifier: ^10.0.3 version: 10.0.3(semantic-release@19.0.5) '@storybook/addon-controls': - specifier: ^7.3.0 - version: 7.3.0(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) + specifier: ^7.4.1 + version: 7.4.1(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) + '@storybook/addon-interactions': + specifier: ^7.4.1 + version: 7.4.1(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) + '@storybook/jest': + specifier: ^0.2.2 + version: 0.2.2(jest@29.4.1) '@storybook/preset-scss': specifier: ^1.0.3 version: 1.0.3(css-loader@6.7.3)(sass-loader@13.2.0)(style-loader@3.3.1) '@storybook/react': - specifier: ^7.3.0 - version: 7.3.0(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + specifier: ^7.4.1 + version: 7.4.1(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) '@storybook/react-vite': - specifier: ^7.3.0 - version: 7.3.0(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4)(vite@4.4.9) + specifier: ^7.4.1 + version: 7.4.1(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4)(vite@4.4.9) + '@storybook/test-runner': + specifier: ^0.13.0 + version: 0.13.0(@types/node@18.11.18)(ts-node@10.9.1) + '@storybook/testing-library': + specifier: ^0.2.0 + version: 0.2.0 '@swc/core': specifier: ^1.3.76 version: 1.3.76 @@ -73,7 +85,7 @@ importers: version: 8.0.1(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) '@testing-library/user-event': specifier: ^14.4.3 - version: 14.4.3(@testing-library/dom@8.20.0) + version: 14.4.3(@testing-library/dom@9.3.1) '@types/google-libphonenumber': specifier: ^7.4.24 version: 7.4.24 @@ -174,8 +186,8 @@ importers: specifier: ^19.0.5 version: 19.0.5 storybook: - specifier: ^7.3.0 - version: 7.3.0 + specifier: ^7.4.1 + version: 7.4.1 stylelint: specifier: ^14.13.0 version: 14.16.1 @@ -277,6 +289,10 @@ packages: resolution: {integrity: sha512-mMVJ/j/GbZ/De4ZHWbQAQO1J6iVnjtZLc9WEdkUQb8S/Bu2cAF2bETXUgMAdvMG3/ngtKmcNBe+Zms9bg6jnQQ==} dev: true + /@adobe/css-tools@4.3.1: + resolution: {integrity: sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==} + dev: true + /@algolia/autocomplete-core@1.7.4: resolution: {integrity: sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==} dependencies: @@ -464,15 +480,8 @@ packages: /@babel/code-frame@7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} - dependencies: - '@babel/highlight': 7.18.6 - - /@babel/code-frame@7.18.6: - resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} - engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.22.10 - dev: true /@babel/code-frame@7.22.10: resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} @@ -625,16 +634,6 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 - /@babel/helper-create-regexp-features-plugin@7.20.5(@babel/core@7.22.10): - resolution: {integrity: sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.2.2 - /@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.20.12): resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} engines: {node: '>=6.9.0'} @@ -870,14 +869,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - /@babel/highlight@7.22.10: resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} engines: {node: '>=6.9.0'} @@ -948,6 +939,7 @@ packages: /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -958,6 +950,7 @@ packages: /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.10): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -1020,6 +1013,7 @@ packages: /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -1030,6 +1024,7 @@ packages: /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.10): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -1084,6 +1079,7 @@ packages: /@babel/plugin-proposal-optional-chaining@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -1095,6 +1091,7 @@ packages: /@babel/plugin-proposal-optional-chaining@7.20.7(@babel/core@7.22.10): resolution: {integrity: sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -1117,6 +1114,7 @@ packages: /@babel/plugin-proposal-private-property-in-object@7.20.5(@babel/core@7.20.12): resolution: {integrity: sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -1487,7 +1485,7 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.20.5(@babel/core@7.22.10) + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.20.12): @@ -5193,6 +5191,18 @@ packages: engines: {node: '>=8'} dev: true + /@jest/console@28.1.3: + resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/node': 18.11.18 + chalk: 4.1.2 + jest-message-util: 28.1.3 + jest-util: 28.1.3 + slash: 3.0.0 + dev: true + /@jest/console@29.4.1: resolution: {integrity: sha512-m+XpwKSi3PPM9znm5NGS8bBReeAJJpSkL1OuFCqaMaJL2YX9YXLkkI+MBchMPwu+ZuM2rynL51sgfkQteQ1CKQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5205,6 +5215,49 @@ packages: slash: 3.0.0 dev: true + /@jest/core@28.1.3(ts-node@10.9.1): + resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 28.1.3 + '@jest/reporters': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.11.18 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.7.1 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-changed-files: 28.1.3 + jest-config: 28.1.3(@types/node@18.11.18)(ts-node@10.9.1) + jest-haste-map: 28.1.3 + jest-message-util: 28.1.3 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-resolve-dependencies: 28.1.3 + jest-runner: 28.1.3 + jest-runtime: 28.1.3 + jest-snapshot: 28.1.3 + jest-util: 28.1.3 + jest-validate: 28.1.3 + jest-watcher: 28.1.3 + micromatch: 4.0.5 + pretty-format: 28.1.3 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + /@jest/core@29.4.1(ts-node@10.9.1): resolution: {integrity: sha512-RXFTohpBqpaTebNdg5l3I5yadnKo9zLBajMT0I38D0tDhreVBYv3fA8kywthI00sWxPztWLD3yjiUkewwu/wKA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5247,6 +5300,23 @@ packages: - ts-node dev: true + /@jest/create-cache-key-function@27.5.1: + resolution: {integrity: sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + dev: true + + /@jest/environment@28.1.3: + resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/fake-timers': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.11.18 + jest-mock: 28.1.3 + dev: true + /@jest/environment@29.4.1: resolution: {integrity: sha512-pJ14dHGSQke7Q3mkL/UZR9ZtTOxqskZaC91NzamEH4dlKRt42W+maRBXiw/LWkdJe+P0f/zDR37+SPMplMRlPg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5257,6 +5327,13 @@ packages: jest-mock: 29.4.1 dev: true + /@jest/expect-utils@28.1.3: + resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + jest-get-type: 28.0.2 + dev: true + /@jest/expect-utils@29.4.1: resolution: {integrity: sha512-w6YJMn5DlzmxjO00i9wu2YSozUYRBhIoJ6nQwpMYcBMtiqMGJm1QBzOf6DDgRao8dbtpDoaqLg6iiQTvv0UHhQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5264,6 +5341,16 @@ packages: jest-get-type: 29.2.0 dev: true + /@jest/expect@28.1.3: + resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + expect: 28.1.3 + jest-snapshot: 28.1.3 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/expect@29.4.1: resolution: {integrity: sha512-ZxKJP5DTUNF2XkpJeZIzvnzF1KkfrhEF6Rz0HGG69fHl6Bgx5/GoU3XyaeFYEjuuKSOOsbqD/k72wFvFxc3iTw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5274,6 +5361,18 @@ packages: - supports-color dev: true + /@jest/fake-timers@28.1.3: + resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@sinonjs/fake-timers': 9.1.2 + '@types/node': 18.11.18 + jest-message-util: 28.1.3 + jest-mock: 28.1.3 + jest-util: 28.1.3 + dev: true + /@jest/fake-timers@29.4.1: resolution: {integrity: sha512-/1joI6rfHFmmm39JxNfmNAO3Nwm6Y0VoL5fJDy7H1AtWrD1CgRtqJbN9Ld6rhAkGO76qqp4cwhhxJ9o9kYjQMw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5286,6 +5385,17 @@ packages: jest-util: 29.4.1 dev: true + /@jest/globals@28.1.3: + resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.3 + '@jest/expect': 28.1.3 + '@jest/types': 28.1.3 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/globals@29.4.1: resolution: {integrity: sha512-znoK2EuFytbHH0ZSf2mQK2K1xtIgmaw4Da21R2C/NE/+NnItm5mPEFQmn8gmF3f0rfOlmZ3Y3bIf7bFj7DHxAA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5298,6 +5408,44 @@ packages: - supports-color dev: true + /@jest/reporters@28.1.3: + resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + '@jridgewell/trace-mapping': 0.3.17 + '@types/node': 18.11.18 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + jest-message-util: 28.1.3 + jest-util: 28.1.3 + jest-worker: 28.1.3 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + terminal-link: 2.1.1 + v8-to-istanbul: 9.0.1 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/reporters@29.4.1: resolution: {integrity: sha512-AISY5xpt2Xpxj9R6y0RF1+O6GRy9JsGa8+vK23Lmzdy1AYcpQn5ItX79wJSsTmfzPKSAcsY1LNt/8Y5Xe5LOSg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5335,12 +5483,28 @@ packages: - supports-color dev: true + /@jest/schemas@28.1.3: + resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@sinclair/typebox': 0.24.51 + dev: true + /@jest/schemas@29.4.0: resolution: {integrity: sha512-0E01f/gOZeNTG76i5eWWSupvSHaIINrTie7vCyjiYFKgzNdyEGd12BUv4oNBFHOqlHDbtoJi3HrQ38KCC90NsQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.25.21 + /@jest/source-map@28.1.2: + resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + callsites: 3.1.0 + graceful-fs: 4.2.10 + dev: true + /@jest/source-map@29.2.0: resolution: {integrity: sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5350,6 +5514,16 @@ packages: graceful-fs: 4.2.10 dev: true + /@jest/test-result@28.1.3: + resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/console': 28.1.3 + '@jest/types': 28.1.3 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + dev: true + /@jest/test-result@29.4.1: resolution: {integrity: sha512-WRt29Lwt+hEgfN8QDrXqXGgCTidq1rLyFqmZ4lmJOpVArC8daXrZWkWjiaijQvgd3aOUj2fM8INclKHsQW9YyQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5360,6 +5534,16 @@ packages: collect-v8-coverage: 1.0.1 dev: true + /@jest/test-sequencer@28.1.3: + resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/test-result': 28.1.3 + graceful-fs: 4.2.10 + jest-haste-map: 28.1.3 + slash: 3.0.0 + dev: true + /@jest/test-sequencer@29.4.1: resolution: {integrity: sha512-v5qLBNSsM0eHzWLXsQ5fiB65xi49A3ILPSFQKPXzGL4Vyux0DPZAIN7NAFJa9b4BiTDP9MBF/Zqc/QA1vuiJ0w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5370,6 +5554,29 @@ packages: slash: 3.0.0 dev: true + /@jest/transform@28.1.3: + resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/core': 7.22.10 + '@jest/types': 28.1.3 + '@jridgewell/trace-mapping': 0.3.17 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.10 + jest-haste-map: 28.1.3 + jest-regex-util: 28.0.2 + jest-util: 28.1.3 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/transform@29.4.1: resolution: {integrity: sha512-5w6YJrVAtiAgr0phzKjYd83UPbCXsBRTeYI4BXokv9Er9CcrH9hfXL/crCvP2d2nGOcovPUnlYiLPFLZrkG5Hg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5393,6 +5600,29 @@ packages: - supports-color dev: true + /@jest/types@27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.11.18 + '@types/yargs': 16.0.5 + chalk: 4.1.2 + dev: true + + /@jest/types@28.1.3: + resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/schemas': 28.1.3 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.11.18 + '@types/yargs': 17.0.20 + chalk: 4.1.2 + dev: true + /@jest/types@29.4.1: resolution: {integrity: sha512-zbrAXDUOnpJ+FMST2rV7QZOgec8rskg2zv8g2ajeqitp4tvZiyqTCYXANrKsM+ryj5o+LI+ZN2EgU9drrkiwSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6696,6 +6926,10 @@ packages: /@sideway/pinpoint@2.0.0: resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + /@sinclair/typebox@0.24.51: + resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + dev: true + /@sinclair/typebox@0.25.21: resolution: {integrity: sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g==} @@ -6703,6 +6937,12 @@ packages: resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} engines: {node: '>=6'} + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + /@sinonjs/commons@2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} dependencies: @@ -6715,6 +6955,12 @@ packages: '@sinonjs/commons': 2.0.0 dev: true + /@sinonjs/fake-timers@9.1.2: + resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + /@slorber/static-site-generator-webpack-plugin@4.0.7: resolution: {integrity: sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==} engines: {node: '>=14'} @@ -6723,8 +6969,8 @@ packages: p-map: 4.0.0 webpack-sources: 3.2.3 - /@storybook/addon-controls@7.3.0(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-I8uC3KW2rVdT/7bvMzW48tJOJC6Vwg7zD4N6sQjcgo0uY39infvSWYzqeO2euHt5J1h3m538BacY/XShQhxvWQ==} + /@storybook/addon-controls@7.4.1(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-KlCYprhBerAKItVQKpexR1oParTbNDOZpJbonG+uldZ12FV7kkrTEGD1vwoLtYTLy+QXIGg4MI1cmUpd39LrLg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -6734,16 +6980,16 @@ packages: react-dom: optional: true dependencies: - '@storybook/blocks': 7.3.0(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) - '@storybook/client-logger': 7.3.0 - '@storybook/components': 7.3.0(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) - '@storybook/core-common': 7.3.0 - '@storybook/core-events': 7.3.0 - '@storybook/manager-api': 7.3.0(react-dom@17.0.2)(react@17.0.2) - '@storybook/node-logger': 7.3.0 - '@storybook/preview-api': 7.3.0 - '@storybook/theming': 7.3.0(react-dom@17.0.2)(react@17.0.2) - '@storybook/types': 7.3.0 + '@storybook/blocks': 7.4.1(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) + '@storybook/client-logger': 7.4.1 + '@storybook/components': 7.4.1(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) + '@storybook/core-common': 7.4.1 + '@storybook/core-events': 7.4.1 + '@storybook/manager-api': 7.4.1(react-dom@17.0.2)(react@17.0.2) + '@storybook/node-logger': 7.4.1 + '@storybook/preview-api': 7.4.1 + '@storybook/theming': 7.4.1(react-dom@17.0.2)(react@17.0.2) + '@storybook/types': 7.4.1 lodash: 4.17.21 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) @@ -6755,23 +7001,56 @@ packages: - supports-color dev: true - /@storybook/blocks@7.3.0(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-MUPK8aY2xyd9dHuKTBRZyDr3R0uj5BkOmbbIOUnub0brO8I8OfFi+lE1A+DdidZI/yBGvs05MJmNKHaSXpkPPA==} + /@storybook/addon-interactions@7.4.1(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-KHMVLI6PefdzOpPUEjiMhfi2XHhC1J+9iMgP/WfO2xaws2vXtEZA6HMM2lE2JkC8AN8nSiTWIHtSompEiPd7/Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/client-logger': 7.4.1 + '@storybook/components': 7.4.1(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) + '@storybook/core-common': 7.4.1 + '@storybook/core-events': 7.4.1 + '@storybook/global': 5.0.0 + '@storybook/instrumenter': 7.4.1 + '@storybook/manager-api': 7.4.1(react-dom@17.0.2)(react@17.0.2) + '@storybook/preview-api': 7.4.1 + '@storybook/theming': 7.4.1(react-dom@17.0.2)(react@17.0.2) + '@storybook/types': 7.4.1 + jest-mock: 27.5.1 + polished: 4.2.2 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - encoding + - supports-color + dev: true + + /@storybook/blocks@7.4.1(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-allNTTuFcFK/DzGGQqFGPu/bH53wjM7lO9m/yHBtJv8Mi1aP745JqW0ucJMVb/aO2Y8vjkTIVa+meVIl02bfrg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/channels': 7.3.0 - '@storybook/client-logger': 7.3.0 - '@storybook/components': 7.3.0(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) - '@storybook/core-events': 7.3.0 + '@storybook/channels': 7.4.1 + '@storybook/client-logger': 7.4.1 + '@storybook/components': 7.4.1(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) + '@storybook/core-events': 7.4.1 '@storybook/csf': 0.1.1 - '@storybook/docs-tools': 7.3.0 + '@storybook/docs-tools': 7.4.1 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.3.0(react-dom@17.0.2)(react@17.0.2) - '@storybook/preview-api': 7.3.0 - '@storybook/theming': 7.3.0(react-dom@17.0.2)(react@17.0.2) - '@storybook/types': 7.3.0 + '@storybook/manager-api': 7.4.1(react-dom@17.0.2)(react@17.0.2) + '@storybook/preview-api': 7.4.1 + '@storybook/theming': 7.4.1(react-dom@17.0.2)(react@17.0.2) + '@storybook/types': 7.4.1 '@types/lodash': 4.14.191 color-convert: 2.0.1 dequal: 2.0.3 @@ -6782,7 +7061,7 @@ packages: react: 17.0.2 react-colorful: 5.6.1(react-dom@17.0.2)(react@17.0.2) react-dom: 17.0.2(react@17.0.2) - telejson: 7.1.0 + telejson: 7.2.0 tocbot: 4.21.1 ts-dedent: 2.2.0 util-deprecate: 1.0.2 @@ -6793,13 +7072,13 @@ packages: - supports-color dev: true - /@storybook/builder-manager@7.3.0: - resolution: {integrity: sha512-sC5fRPnnbbYDAT4zYBtUJQ1Q/DixzI5ECZs21J+ndLyb96bZjU0uBue8dasI08zNE+hgMD8FpnAqQsCSwk5YeA==} + /@storybook/builder-manager@7.4.1: + resolution: {integrity: sha512-5zD10jO+vxpbkz9yPdPy0ysRRd+81GmZ1yf12xARREy2hp+KeIIC228QDVA1OAsYcfnqREgCAnQslzhR57739A==} dependencies: '@fal-works/esbuild-plugin-global-externals': 2.1.2 - '@storybook/core-common': 7.3.0 - '@storybook/manager': 7.3.0 - '@storybook/node-logger': 7.3.0 + '@storybook/core-common': 7.4.1 + '@storybook/manager': 7.4.1 + '@storybook/node-logger': 7.4.1 '@types/ejs': 3.1.2 '@types/find-cache-dir': 3.2.1 '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.18.20) @@ -6817,8 +7096,8 @@ packages: - supports-color dev: true - /@storybook/builder-vite@7.3.0(typescript@4.9.4)(vite@4.4.9): - resolution: {integrity: sha512-XVjzqJSvOV9fBG4GpYOGPZsMKgN9v6AQthpe9+bxtvY32tkP3CkKt3fuD1Qh48v7Q63lWdZX9qq3tQ76CvS9Cw==} + /@storybook/builder-vite@7.4.1(typescript@4.9.4)(vite@4.4.9): + resolution: {integrity: sha512-aB7bfirdRLozm4jpBIVhXkzN2sU0J9nF5WTkzT9R0ReRGsHm3+4CDFAPMnHBISgNXkXMLVC4VuQp4w/a4Avjmg==} peerDependencies: '@preact/preset-vite': '*' typescript: '>= 4.3.x' @@ -6832,15 +7111,15 @@ packages: vite-plugin-glimmerx: optional: true dependencies: - '@storybook/channels': 7.3.0 - '@storybook/client-logger': 7.3.0 - '@storybook/core-common': 7.3.0 - '@storybook/csf-plugin': 7.3.0 + '@storybook/channels': 7.4.1 + '@storybook/client-logger': 7.4.1 + '@storybook/core-common': 7.4.1 + '@storybook/csf-plugin': 7.4.1 '@storybook/mdx2-csf': 1.1.0 - '@storybook/node-logger': 7.3.0 - '@storybook/preview': 7.3.0 - '@storybook/preview-api': 7.3.0 - '@storybook/types': 7.3.0 + '@storybook/node-logger': 7.4.1 + '@storybook/preview': 7.4.1 + '@storybook/preview-api': 7.4.1 + '@storybook/types': 7.4.1 '@types/find-cache-dir': 3.2.1 browser-assert: 1.2.1 es-module-lexer: 0.9.3 @@ -6858,32 +7137,33 @@ packages: - supports-color dev: true - /@storybook/channels@7.3.0: - resolution: {integrity: sha512-j4b5u8VSt+3975zawh6FbPS+gjQfRkPCIGV+Cd6RUrwVZnwJfr+1FeTjweyMpQaQGChtiOqx/W91TH8q2yODog==} + /@storybook/channels@7.4.1: + resolution: {integrity: sha512-gnE1mNrRF+9oCVRMq6MS/tLXJbYmf9P02PCC3KpMLcSsABdH5jcrACejzJVo/kE223knFH7NJc4BBj7+5h0uXA==} dependencies: - '@storybook/client-logger': 7.3.0 - '@storybook/core-events': 7.3.0 + '@storybook/client-logger': 7.4.1 + '@storybook/core-events': 7.4.1 '@storybook/global': 5.0.0 qs: 6.11.0 - telejson: 7.1.0 + telejson: 7.2.0 tiny-invariant: 1.3.1 dev: true - /@storybook/cli@7.3.0: - resolution: {integrity: sha512-CeZfqNsjRnqiVrSeA/hnMylzpypVUkxHwmu0cbUbHhKjV2uEacF7i25bC9FhdcbZUp1geQMBsy4GleMovNTK/A==} + /@storybook/cli@7.4.1: + resolution: {integrity: sha512-G1oM1Egs5Z/5FOBcqfACJy2u5cDPl8FMFr3CETkn15a5MXzX3qxH8FD8GmZnXIsEDsGH5WvhnXYbCw+43R6GKg==} hasBin: true dependencies: '@babel/core': 7.22.10 '@babel/preset-env': 7.22.10(@babel/core@7.22.10) '@babel/types': 7.22.10 '@ndelangen/get-tarball': 3.0.9 - '@storybook/codemod': 7.3.0 - '@storybook/core-common': 7.3.0 - '@storybook/core-server': 7.3.0 - '@storybook/csf-tools': 7.3.0 - '@storybook/node-logger': 7.3.0 - '@storybook/telemetry': 7.3.0 - '@storybook/types': 7.3.0 + '@storybook/codemod': 7.4.1 + '@storybook/core-common': 7.4.1 + '@storybook/core-events': 7.4.1 + '@storybook/core-server': 7.4.1 + '@storybook/csf-tools': 7.4.1 + '@storybook/node-logger': 7.4.1 + '@storybook/telemetry': 7.4.1 + '@storybook/types': 7.4.1 '@types/semver': 7.3.13 '@yarnpkg/fslib': 2.10.3 '@yarnpkg/libzip': 2.3.0 @@ -6907,7 +7187,7 @@ packages: prompts: 2.4.2 puppeteer-core: 2.1.1 read-pkg-up: 7.0.1 - semver: 7.3.8 + semver: 7.5.4 simple-update-notifier: 2.0.0 strip-json-comments: 3.1.1 tempy: 1.0.1 @@ -6920,22 +7200,22 @@ packages: - utf-8-validate dev: true - /@storybook/client-logger@7.3.0: - resolution: {integrity: sha512-93Nf4DOgg8HwEX/n+JKB/el5MNl8v4vNfDO+5cqoKqS5b3yETDG6spKOA6GciNYBJWIKMkEg/WNPFG2N9cvhTA==} + /@storybook/client-logger@7.4.1: + resolution: {integrity: sha512-2j0DQlKlPNY8XAaEZv+mUYEUm4dOWg6/Q92UNbvYPRK5qbXUvbMiQco5nmvg4LvMT6y99LhRSW2xrwEx5xKAKw==} dependencies: '@storybook/global': 5.0.0 dev: true - /@storybook/codemod@7.3.0: - resolution: {integrity: sha512-gRBrXSoP79llNBEqdxH2O/M+ED5BSyMfGsqgmXsXPVfnzgoSRWVBCQOW9mw6a986efKPMjb532GK4nbmjk1mtw==} + /@storybook/codemod@7.4.1: + resolution: {integrity: sha512-KlN2oImqc45RLNRJDWJObvYcLzdtkk4fH40nBIP1/nem8AEbyjEbC5c1OtZilEV47Vn8IdAxqGRPQFXW8GVFEQ==} dependencies: '@babel/core': 7.22.10 '@babel/preset-env': 7.22.10(@babel/core@7.22.10) '@babel/types': 7.22.10 '@storybook/csf': 0.1.1 - '@storybook/csf-tools': 7.3.0 - '@storybook/node-logger': 7.3.0 - '@storybook/types': 7.3.0 + '@storybook/csf-tools': 7.4.1 + '@storybook/node-logger': 7.4.1 + '@storybook/types': 7.4.1 '@types/cross-spawn': 6.0.2 cross-spawn: 7.0.3 globby: 11.1.0 @@ -6947,20 +7227,19 @@ packages: - supports-color dev: true - /@storybook/components@7.3.0(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-YHcPsH0T//ZZ3HhZDmf+UKt2R0b+kNT42LizYs5R61d47oIvsHrqPqdN7p+OuTrBpaFdVNSzO7XjpeRodqGRLQ==} + /@storybook/components@7.4.1(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-hCuKmMB0+d3/apHjC8G0vMks1cE1aeoKu09gQ40YT+cBxKWj2+lNVKxDd6wJpaR6bU/wrAL1S6eaIQ/T9QpqRA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@radix-ui/react-select': 1.2.2(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) '@radix-ui/react-toolbar': 1.0.4(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) - '@storybook/client-logger': 7.3.0 + '@storybook/client-logger': 7.4.1 '@storybook/csf': 0.1.1 '@storybook/global': 5.0.0 - '@storybook/icons': 1.1.6(react-dom@17.0.2)(react@17.0.2) - '@storybook/theming': 7.3.0(react-dom@17.0.2)(react@17.0.2) - '@storybook/types': 7.3.0 + '@storybook/theming': 7.4.1(react-dom@17.0.2)(react@17.0.2) + '@storybook/types': 7.4.1 memoizerific: 1.11.3 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) @@ -6971,18 +7250,19 @@ packages: - '@types/react-dom' dev: true - /@storybook/core-client@7.3.0: - resolution: {integrity: sha512-G2WlYdmBy+5/vEVXkNEoX5D/fRP+L+5Tgq9P8gYjvC+Rw5lMDUrA1RIsPl5hPvlBbDsEIn9gfMRMfVuwyJ3ybw==} + /@storybook/core-client@7.4.1: + resolution: {integrity: sha512-0pWcw1XDjS0fuAnU8eDAcxR9B7GrjJFOWB5/4f1fsWmXm4FvH0iQxJtMGuvFBvaDUvRjky0+9BXGRhEzRpMhyg==} dependencies: - '@storybook/client-logger': 7.3.0 - '@storybook/preview-api': 7.3.0 + '@storybook/client-logger': 7.4.1 + '@storybook/preview-api': 7.4.1 dev: true - /@storybook/core-common@7.3.0: - resolution: {integrity: sha512-QCTuZXLq9z2AUEMmAAfSGHdXsAMWKnOou+d6adVknJINctW6T1B2L725SpRjYIXK1xpsQrSB+VT0wR4XCNRIMA==} + /@storybook/core-common@7.4.1: + resolution: {integrity: sha512-dvHY515l9yyH3Yki9CuGF/LG85yWDmhjtlbHJ7mrMSreaAgvDs7O5Q2iVh6DXg3oMspQvKlLii/ZLzu+3uxMbg==} dependencies: - '@storybook/node-logger': 7.3.0 - '@storybook/types': 7.3.0 + '@storybook/core-events': 7.4.1 + '@storybook/node-logger': 7.4.1 + '@storybook/types': 7.4.1 '@types/find-cache-dir': 3.2.1 '@types/node': 16.18.11 '@types/node-fetch': 2.6.4 @@ -7008,28 +7288,30 @@ packages: - supports-color dev: true - /@storybook/core-events@7.3.0: - resolution: {integrity: sha512-Ke3gjjJDMbihAVzgLUfXoZ3FHLLP22/TSBtytayztC0zAzEGeg6j4UUWzEKYggKIGJNIJ16GQfaGlcVLxHhSKw==} + /@storybook/core-events@7.4.1: + resolution: {integrity: sha512-F1tGb32XZ4FRfbtXdi4b+zdzWUjFz5rn3TF18mSuBGGXvxKU+4tywgjGQ3dKGdvuP754czn3poSdz2ZW08bLsQ==} + dependencies: + ts-dedent: 2.2.0 dev: true - /@storybook/core-server@7.3.0: - resolution: {integrity: sha512-TaysZpGXgdr58LkJkcXD2YyqbAxdn40X8S0HcBH241FKOGSC7GH7C5Wb1NkCuXrlek6K1h9KEfMSur7JUMn0Zw==} + /@storybook/core-server@7.4.1: + resolution: {integrity: sha512-8JJGci8eyNSfiHJ+Xr46Jv95fqQbjrd+ecQJvpyRqwN1LFdCM6QtHYmjt6LzuK16/by5jYXJ7+f8SA+gvW8SbQ==} dependencies: '@aw-web-design/x-default-browser': 1.4.126 '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-manager': 7.3.0 - '@storybook/channels': 7.3.0 - '@storybook/core-common': 7.3.0 - '@storybook/core-events': 7.3.0 + '@storybook/builder-manager': 7.4.1 + '@storybook/channels': 7.4.1 + '@storybook/core-common': 7.4.1 + '@storybook/core-events': 7.4.1 '@storybook/csf': 0.1.1 - '@storybook/csf-tools': 7.3.0 + '@storybook/csf-tools': 7.4.1 '@storybook/docs-mdx': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/manager': 7.3.0 - '@storybook/node-logger': 7.3.0 - '@storybook/preview-api': 7.3.0 - '@storybook/telemetry': 7.3.0 - '@storybook/types': 7.3.0 + '@storybook/manager': 7.4.1 + '@storybook/node-logger': 7.4.1 + '@storybook/preview-api': 7.4.1 + '@storybook/telemetry': 7.4.1 + '@storybook/types': 7.4.1 '@types/detect-port': 1.3.3 '@types/node': 16.18.11 '@types/pretty-hrtime': 1.0.1 @@ -7048,9 +7330,9 @@ packages: pretty-hrtime: 1.0.3 prompts: 2.4.2 read-pkg-up: 7.0.1 - semver: 7.3.8 + semver: 7.5.4 serve-favicon: 2.5.0 - telejson: 7.1.0 + telejson: 7.2.0 tiny-invariant: 1.3.1 ts-dedent: 2.2.0 util: 0.12.5 @@ -7064,24 +7346,24 @@ packages: - utf-8-validate dev: true - /@storybook/csf-plugin@7.3.0: - resolution: {integrity: sha512-zbFY40D47ElkhvRcR7TZBa8ZgtAd7bHOeXT9zxi9fU6dH+ucHoyCgudxe2Obr4bCZUu+NtqYzmjHNkPE+QrHtw==} + /@storybook/csf-plugin@7.4.1: + resolution: {integrity: sha512-TnvDS2szwwzoqn3WbnB57w1Q+rZ+EFFwpLdjvocsiosLQglMQdPNhDvl1U5uDgwTzVhs4MEiEHJ1LxTkeizxhA==} dependencies: - '@storybook/csf-tools': 7.3.0 + '@storybook/csf-tools': 7.4.1 unplugin: 1.4.0 transitivePeerDependencies: - supports-color dev: true - /@storybook/csf-tools@7.3.0: - resolution: {integrity: sha512-gAmKg3JYQx9pyDgUS/I4VyH039Mv/kIuP2nUcBeK2V6pW+3sf9jrTVi4DjSB7q1Izqhnsa25jVdPbgRuWk1RFA==} + /@storybook/csf-tools@7.4.1: + resolution: {integrity: sha512-mzzsAtB9CYSgxCvZJ4xQrC7QIhMR5MXGBohADiNhnuRXLdZ6wXBhWkRi/sY7Wh5Uh8DdgHkGPJHJxcyYG+FYQw==} dependencies: '@babel/generator': 7.22.10 '@babel/parser': 7.22.10 '@babel/traverse': 7.22.10 '@babel/types': 7.22.10 '@storybook/csf': 0.1.1 - '@storybook/types': 7.3.0 + '@storybook/types': 7.4.1 fs-extra: 11.1.1 recast: 0.23.4 ts-dedent: 2.2.0 @@ -7099,12 +7381,12 @@ packages: resolution: {integrity: sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==} dev: true - /@storybook/docs-tools@7.3.0: - resolution: {integrity: sha512-Do30kbYbiQ+TgNexlhwDfvEFfuBDHp/PNTKUaV7i2ZngBaEa+VQx3GvLLnXbBMncXavdiVj5+tX2haVqtKfcZg==} + /@storybook/docs-tools@7.4.1: + resolution: {integrity: sha512-4PRsib2hDQjGhT2CnnPgzNZ5pVrpQ6wtb5l0TG4lDDc0F9Tal0EbrooXWwMsc7SxYslHKIEgxd+Nll66FWILFw==} dependencies: - '@storybook/core-common': 7.3.0 - '@storybook/preview-api': 7.3.0 - '@storybook/types': 7.3.0 + '@storybook/core-common': 7.4.1 + '@storybook/preview-api': 7.4.1 + '@storybook/types': 7.4.1 '@types/doctrine': 0.0.3 doctrine: 3.0.0 lodash: 4.17.21 @@ -7113,56 +7395,74 @@ packages: - supports-color dev: true + /@storybook/expect@28.1.3-5: + resolution: {integrity: sha512-lS1oJnY1qTAxnH87C765NdfvGhksA6hBcbUVI5CHiSbNsEtr456wtg/z+dT9XlPriq1D5t2SgfNL9dBAoIGyIA==} + dependencies: + '@types/jest': 28.1.3 + dev: true + /@storybook/global@5.0.0: resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} dev: true - /@storybook/icons@1.1.6(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-co5gDCYPojRAc5lRMnWxbjrR1V37/rTmAo9Vok4a1hDpHZIwkGTWesdzvYivSQXYFxZTpxdM1b5K3W87brnahw==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + /@storybook/instrumenter@7.4.1: + resolution: {integrity: sha512-Nwu6MErUORKqQv/cYCZfWcvycuQQFOP5fEYAsbtgD2pRn+DXXOWeFyv6iHEbekqzfG2YTQ72koR0lZEFWnDl4w==} dependencies: - react: 17.0.2 - react-dom: 17.0.2(react@17.0.2) + '@storybook/channels': 7.4.1 + '@storybook/client-logger': 7.4.1 + '@storybook/core-events': 7.4.1 + '@storybook/global': 5.0.0 + '@storybook/preview-api': 7.4.1 + dev: true + + /@storybook/jest@0.2.2(jest@29.4.1): + resolution: {integrity: sha512-PUfp9WoqUA8NdAmiz3UahUsyAMr+g1Dv3BB0fqJZsE2IuE5o1Mgsv4iLGzFm+ohcQLIDQvwvvbQIpxe8eY7TNw==} + dependencies: + '@storybook/expect': 28.1.3-5 + '@testing-library/jest-dom': 6.1.3(@types/jest@28.1.3)(jest@29.4.1) + '@types/jest': 28.1.3 + jest-mock: 27.5.1 + transitivePeerDependencies: + - '@jest/globals' + - jest + - vitest dev: true - /@storybook/manager-api@7.3.0(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-eM2O8n1LQCYJ11MVDvFuwFZkL6ZlcWt4NHvfkF6hXUmVQhVz40g5Dr7tGuPX4pDccUvSciB69GhJGvtX8jt5DQ==} + /@storybook/manager-api@7.4.1(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-nzYasETW20uDWpfST6JFf6c/GSFB/dj7xVtg5EpvAYF8GkErCk9TvNKdLNroRrIYm5VJxHWC2V+CJ07RuX3Glw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/channels': 7.3.0 - '@storybook/client-logger': 7.3.0 - '@storybook/core-events': 7.3.0 + '@storybook/channels': 7.4.1 + '@storybook/client-logger': 7.4.1 + '@storybook/core-events': 7.4.1 '@storybook/csf': 0.1.1 '@storybook/global': 5.0.0 - '@storybook/router': 7.3.0(react-dom@17.0.2)(react@17.0.2) - '@storybook/theming': 7.3.0(react-dom@17.0.2)(react@17.0.2) - '@storybook/types': 7.3.0 + '@storybook/router': 7.4.1(react-dom@17.0.2)(react@17.0.2) + '@storybook/theming': 7.4.1(react-dom@17.0.2)(react@17.0.2) + '@storybook/types': 7.4.1 dequal: 2.0.3 lodash: 4.17.21 memoizerific: 1.11.3 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) - semver: 7.3.8 + semver: 7.5.4 store2: 2.14.2 - telejson: 7.1.0 + telejson: 7.2.0 ts-dedent: 2.2.0 dev: true - /@storybook/manager@7.3.0: - resolution: {integrity: sha512-99Rob6V2MpBkHiPER5d2ZsYO3wZusgKgq2qViTTn/F7ADpHmqYYgBpywCmSs9z5JqqutQgrDBDNMERcRrhUPSQ==} + /@storybook/manager@7.4.1: + resolution: {integrity: sha512-LaORUHqfinhKk6Ysz7LyBYqblr/Oj+H5jXeMidSWYor+cJ6AZp1BtCUwWAqtjBliZ8vfASxME1CCImENG11eSA==} dev: true /@storybook/mdx2-csf@1.1.0: resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} dev: true - /@storybook/node-logger@7.3.0: - resolution: {integrity: sha512-y6No2mYWn0uPFY5DuwVBpsrjc7Q16gMLZDYFo8YSG68lbydLevmj3/lv7xAvqh002e9stE02weYt94Vl/SLLsQ==} + /@storybook/node-logger@7.4.1: + resolution: {integrity: sha512-P7rR/WoHCR2zdDo8bDowIBlB3wRrVNHHIfyWxubbzj/AA2uPv7cpdjDA+NDHAIq8MkuxZqfqhatjrHLFwMHDBg==} dev: true /@storybook/preset-scss@1.0.3(css-loader@6.7.3)(sass-loader@13.2.0)(style-loader@3.3.1): @@ -7177,15 +7477,15 @@ packages: style-loader: 3.3.1(webpack@5.75.0) dev: true - /@storybook/preview-api@7.3.0: - resolution: {integrity: sha512-nGf7/Ra5HmecblohdQnwfVWP+Eb+g0hUldcPWkJOaC2jsCqUOagGG+zbdi7PtXHJOU0RZsuGphnwVMznPMqPcw==} + /@storybook/preview-api@7.4.1: + resolution: {integrity: sha512-swmosWK73lP0CXDKMOwYIaaId28+muPDYX2V/0JmIOA+45HFXimeXZs3XsgVgQMutVF51QqnDA0pfrNgRofHgQ==} dependencies: - '@storybook/channels': 7.3.0 - '@storybook/client-logger': 7.3.0 - '@storybook/core-events': 7.3.0 + '@storybook/channels': 7.4.1 + '@storybook/client-logger': 7.4.1 + '@storybook/core-events': 7.4.1 '@storybook/csf': 0.1.1 '@storybook/global': 5.0.0 - '@storybook/types': 7.3.0 + '@storybook/types': 7.4.1 '@types/qs': 6.9.7 dequal: 2.0.3 lodash: 4.17.21 @@ -7196,12 +7496,12 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/preview@7.3.0: - resolution: {integrity: sha512-mqEkPOXkhtNM9YrfwqgzI4kFOdghHAVui2HWRMziQhvH07EUs2H+Q67t4ElOlRCBe4ruqCGYn133T10H/4lF1g==} + /@storybook/preview@7.4.1: + resolution: {integrity: sha512-KqHbS5jVKSvFESrwU3iLJE5ciIJicdV3ZducL9t+hNJOdchzV3ezEwMn6gApEin3dm3Ts7InN+W7nBc+MzaXmA==} dev: true - /@storybook/react-dom-shim@7.3.0(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-Xr0u2qLLaVCG6h1gdfMe6mgmQMQMy40p9McSWE2jsYxTYNVXAXD1QekQyQiFXbueoj8d4bWwCaoBDJ1eENiIVw==} + /@storybook/react-dom-shim@7.4.1(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-LUxmXyAFZB61kFWtZZA5WCHgFfUI5Jtn0d2HVOfpIYK1OcGwW8K4ya0lbMVrYvMgL37e5ShPurjj32U2YBeiJA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -7210,8 +7510,8 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: true - /@storybook/react-vite@7.3.0(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4)(vite@4.4.9): - resolution: {integrity: sha512-cLiXEx+OGR/GZMu7mpWtG2xShIK/RWcggqZ8Gtct+3SqZOdTv9Cgx3TUxIfD27cblDeq70gTGzSicsGksK1g6Q==} + /@storybook/react-vite@7.4.1(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4)(vite@4.4.9): + resolution: {integrity: sha512-3Z/eg/BuRehSjlrrd55xxwdMrDArIrBVrtWePp/M+l5A8zKX7N29RLmM4OsrhxSbFH/xFZuGrGNKeLO6914aBA==} engines: {node: '>=16'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -7220,8 +7520,8 @@ packages: dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@4.9.4)(vite@4.4.9) '@rollup/pluginutils': 5.0.3 - '@storybook/builder-vite': 7.3.0(typescript@4.9.4)(vite@4.4.9) - '@storybook/react': 7.3.0(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@storybook/builder-vite': 7.4.1(typescript@4.9.4)(vite@4.4.9) + '@storybook/react': 7.4.1(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) '@vitejs/plugin-react': 3.1.0(vite@4.4.9) ast-types: 0.14.2 magic-string: 0.30.2 @@ -7238,8 +7538,8 @@ packages: - vite-plugin-glimmerx dev: true - /@storybook/react@7.3.0(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): - resolution: {integrity: sha512-h27P1pa60xlBMw4EQtW62gJfpct8mNnMzyVY3Ns3cE4jupv2ROoGUsZ33VJTk6n9++EULvWchzZ03r6kVwowJg==} + /@storybook/react@7.4.1(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): + resolution: {integrity: sha512-m5d/NAypnfgrzphOXEWnKryLKLFRRerlbAhFscauif8amyTcUCkR4xu4nf1b5o6LoIicUBg7mfczQvc5pEHDSQ==} engines: {node: '>=16.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -7249,20 +7549,20 @@ packages: typescript: optional: true dependencies: - '@storybook/client-logger': 7.3.0 - '@storybook/core-client': 7.3.0 - '@storybook/docs-tools': 7.3.0 + '@storybook/client-logger': 7.4.1 + '@storybook/core-client': 7.4.1 + '@storybook/docs-tools': 7.4.1 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.3.0 - '@storybook/react-dom-shim': 7.3.0(react-dom@17.0.2)(react@17.0.2) - '@storybook/types': 7.3.0 + '@storybook/preview-api': 7.4.1 + '@storybook/react-dom-shim': 7.4.1(react-dom@17.0.2)(react@17.0.2) + '@storybook/types': 7.4.1 '@types/escodegen': 0.0.6 '@types/estree': 0.0.51 '@types/node': 16.18.11 acorn: 7.4.1 acorn-jsx: 5.3.2(acorn@7.4.1) acorn-walk: 7.2.0 - escodegen: 2.0.0 + escodegen: 2.1.0 html-tags: 3.2.0 lodash: 4.17.21 prop-types: 15.8.1 @@ -7278,25 +7578,25 @@ packages: - supports-color dev: true - /@storybook/router@7.3.0(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-BLrVTXZzDLLMxpSVk/iR2IQwqwP8Oavc3usX9GojxagSPv1IS07jj52jA2BuXCqPK/5S0eE1pTgPYa42FHvy/w==} + /@storybook/router@7.4.1(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-7tE1B18jb+5+ujXd3BHcub85QnytIVBNA0iAo+o8MNwArISyodqp12y2D3w+QpXkg0GtPhAp/CMhzpyxotPhRQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/client-logger': 7.3.0 + '@storybook/client-logger': 7.4.1 memoizerific: 1.11.3 qs: 6.11.0 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) dev: true - /@storybook/telemetry@7.3.0: - resolution: {integrity: sha512-N6lNDSZ8ux5a1NLils93rGTYx4YKj+VOqu0I0um+/DB2ozPvf3nfzRxgkkmw18MtenfnwI9wnUltI8QaMnigUQ==} + /@storybook/telemetry@7.4.1: + resolution: {integrity: sha512-53eQPm22Fa7qzjXFSE++bJv5qNG/89rRLU5xywuSYmjQgtaS6HKLPjIRtNPPbU50gRvklVedDDxD8UqN73mD3w==} dependencies: - '@storybook/client-logger': 7.3.0 - '@storybook/core-common': 7.3.0 - '@storybook/csf-tools': 7.3.0 + '@storybook/client-logger': 7.4.1 + '@storybook/core-common': 7.4.1 + '@storybook/csf-tools': 7.4.1 chalk: 4.1.2 detect-package-manager: 2.0.1 fetch-retry: 5.0.3 @@ -7307,24 +7607,73 @@ packages: - supports-color dev: true - /@storybook/theming@7.3.0(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-/Jcd/duEW28lvjTbocKWiB8DT3wLZeJeBg3XtknZbZ0SlPf4JR5Y3Atl4fT1HEeV30Ks9ZlE5xipVY2Z+fjS7Q==} + /@storybook/test-runner@0.13.0(@types/node@18.11.18)(ts-node@10.9.1): + resolution: {integrity: sha512-QIbfgia/iBy7PeUIwCYtPcyeZCHd21ebaPoMNIsRfwUW+VC12J4iG8cGDfOE7MGbMVz1Uu0elAEBB8NGP/YBtQ==} + hasBin: true + dependencies: + '@babel/core': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/template': 7.22.5 + '@babel/types': 7.22.10 + '@storybook/core-common': 7.4.1 + '@storybook/csf': 0.1.1 + '@storybook/csf-tools': 7.4.1 + '@storybook/preview-api': 7.4.1 + '@swc/core': 1.3.76 + '@swc/jest': 0.2.29(@swc/core@1.3.76) + can-bind-to-host: 1.1.2 + commander: 9.5.0 + expect-playwright: 0.8.0 + glob: 10.3.3 + jest: 28.1.3(@types/node@18.11.18)(ts-node@10.9.1) + jest-circus: 28.1.3 + jest-environment-node: 28.1.3 + jest-junit: 14.0.1 + jest-playwright-preset: 2.0.0(jest-circus@28.1.3)(jest-environment-node@28.1.3)(jest-runner@28.1.3)(jest@28.1.3) + jest-runner: 28.1.3 + jest-serializer-html: 7.1.0 + jest-watch-typeahead: 2.2.2(jest@28.1.3) + node-fetch: 2.6.8 + playwright: 1.37.1 + read-pkg-up: 7.0.1 + tempy: 1.0.1 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@swc/helpers' + - '@types/node' + - debug + - encoding + - node-notifier + - supports-color + - ts-node + dev: true + + /@storybook/testing-library@0.2.0: + resolution: {integrity: sha512-Ff6jNnrsosmDshgCf0Eb5Cz7IA34p/1Ps5N3Kp3598kfXpBSccSkQQvVFUXC3kIHw/isIXWPqntZuKqnWUz7Gw==} + dependencies: + '@testing-library/dom': 9.3.1 + '@testing-library/user-event': 14.4.3(@testing-library/dom@9.3.1) + ts-dedent: 2.2.0 + dev: true + + /@storybook/theming@7.4.1(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-a4QajZbnYumq8ovtn7nW7BeNrk/TaWyKmUrIz4w08I6ghzESJA4aCWZ6394awbrruiIOzCCKOUq4mfWEsc8W6A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@17.0.2) - '@storybook/client-logger': 7.3.0 + '@storybook/client-logger': 7.4.1 '@storybook/global': 5.0.0 memoizerific: 1.11.3 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) dev: true - /@storybook/types@7.3.0: - resolution: {integrity: sha512-NpemDA3hwK+jVTfPc1u1wQwu7DXqpatEtmAQUzEerx5lwoMvj3lGSk30xrOCpNvvpZz2P97FDScVsmzGlXwncA==} + /@storybook/types@7.4.1: + resolution: {integrity: sha512-bjt1YDG9AocFBhIFRvGGbYZPlD223p+qAFcFgYdezU16fFE4ZGFUzUuq2ERkOofL7a2+OzLTCQ/SKe1jFkXCxQ==} dependencies: - '@storybook/channels': 7.3.0 + '@storybook/channels': 7.4.1 '@types/babel__core': 7.20.0 '@types/express': 4.17.16 file-system-cache: 2.3.0 @@ -7570,6 +7919,17 @@ packages: '@swc/core-win32-ia32-msvc': 1.3.76 '@swc/core-win32-x64-msvc': 1.3.76 + /@swc/jest@0.2.29(@swc/core@1.3.76): + resolution: {integrity: sha512-8reh5RvHBsSikDC3WGCd5ZTd2BXKkyOdK7QwynrCH58jk2cQFhhHhFBg/jvnWZehUQe/EoOImLENc9/DwbBFow==} + engines: {npm: '>= 7.0.0'} + peerDependencies: + '@swc/core': '*' + dependencies: + '@jest/create-cache-key-function': 27.5.1 + '@swc/core': 1.3.76 + jsonc-parser: 3.2.0 + dev: true + /@szmarczak/http-timer@1.1.2: resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} engines: {node: '>=6'} @@ -7580,13 +7940,27 @@ packages: resolution: {integrity: sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==} engines: {node: '>=12'} dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.22.10 + '@babel/runtime': 7.20.13 + '@types/aria-query': 5.0.1 + 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/dom@9.3.1: + resolution: {integrity: sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==} + engines: {node: '>=14'} + dependencies: + '@babel/code-frame': 7.22.10 '@babel/runtime': 7.20.13 '@types/aria-query': 5.0.1 aria-query: 5.1.3 chalk: 4.1.2 dom-accessibility-api: 0.5.16 - lz-string: 1.4.4 + lz-string: 1.5.0 pretty-format: 27.5.1 dev: true @@ -7605,18 +7979,48 @@ packages: redent: 3.0.0 dev: true - /@testing-library/react-hooks@8.0.1(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==} - engines: {node: '>=12'} + /@testing-library/jest-dom@6.1.3(@types/jest@28.1.3)(jest@29.4.1): + resolution: {integrity: sha512-YzpjRHoCBWPzpPNtg6gnhasqtE/5O4qz8WCwDEaxtfnPO6gkaLrnuXusrGSPyhIGPezr1HM7ZH0CFaUTY9PJEQ==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 - react: ^16.9.0 || ^17.0.0 - react-dom: ^16.9.0 || ^17.0.0 - react-test-renderer: ^16.9.0 || ^17.0.0 + '@jest/globals': '>= 28' + '@types/jest': '>= 28' + jest: '>= 28' + vitest: '>= 0.32' peerDependenciesMeta: - '@types/react': + '@jest/globals': optional: true - react-dom: + '@types/jest': + optional: true + jest: + optional: true + vitest: + optional: true + dependencies: + '@adobe/css-tools': 4.3.1 + '@babel/runtime': 7.20.13 + '@types/jest': 28.1.3 + aria-query: 5.1.3 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.5.16 + jest: 29.4.1(@types/node@18.11.18)(ts-node@10.9.1) + lodash: 4.17.21 + redent: 3.0.0 + dev: true + + /@testing-library/react-hooks@8.0.1(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==} + engines: {node: '>=12'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 + react: ^16.9.0 || ^17.0.0 + react-dom: ^16.9.0 || ^17.0.0 + react-test-renderer: ^16.9.0 || ^17.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + react-dom: optional: true react-test-renderer: optional: true @@ -7642,13 +8046,13 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: true - /@testing-library/user-event@14.4.3(@testing-library/dom@8.20.0): + /@testing-library/user-event@14.4.3(@testing-library/dom@9.3.1): resolution: {integrity: sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@testing-library/dom': 8.20.0 + '@testing-library/dom': 9.3.1 dev: true /@tootallnate/once@2.0.0: @@ -7844,6 +8248,13 @@ packages: dependencies: '@types/istanbul-lib-report': 3.0.0 + /@types/jest@28.1.3: + resolution: {integrity: sha512-Tsbjk8Y2hkBaY/gJsataeb4q9Mubw9EOz7+4RjPkzD5KjTvHHs7cpws22InaoXxAVAhF5HfFbzJjo6oKWqSZLw==} + dependencies: + jest-matcher-utils: 28.1.3 + pretty-format: 28.1.3 + dev: true + /@types/jest@29.4.0: resolution: {integrity: sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ==} dependencies: @@ -8048,6 +8459,12 @@ packages: /@types/unist@2.0.6: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + /@types/wait-on@5.3.1: + resolution: {integrity: sha512-2FFOKCF/YydrMUaqg+fkk49qf0e5rDgwt6aQsMzFQzbS419h2gNOXyiwp/o2yYy27bi/C1z+HgfncryjGzlvgQ==} + dependencies: + '@types/node': 18.11.18 + dev: true + /@types/warning@3.0.0: resolution: {integrity: sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==} dev: true @@ -8060,6 +8477,12 @@ packages: /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + /@types/yargs@16.0.5: + resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + /@types/yargs@17.0.20: resolution: {integrity: sha512-eknWrTHofQuPk2iuqDm1waA7V6xPlbgBoaaXEgYkClhLOnB0TtbW+srJaOToAgawPxPlHQzwypFA2bhZaUGP5A==} dependencies: @@ -8159,7 +8582,7 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.8 + semver: 7.5.4 tsutils: 3.21.0(typescript@4.9.4) typescript: 4.9.4 transitivePeerDependencies: @@ -8180,7 +8603,7 @@ packages: eslint: 7.32.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0(eslint@7.32.0) - semver: 7.3.8 + semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript @@ -8355,7 +8778,7 @@ packages: /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.8.2 + acorn: 8.10.0 acorn-walk: 8.2.0 dev: true @@ -8515,6 +8938,13 @@ packages: type-fest: 1.4.0 dev: true + /ansi-escapes@6.2.0: + resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + engines: {node: '>=14.16'} + dependencies: + type-fest: 3.13.1 + dev: true + /ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} @@ -8628,6 +9058,17 @@ packages: resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} dev: true + /append-transform@2.0.0: + resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} + engines: {node: '>=8'} + dependencies: + default-require-extensions: 3.0.1 + dev: true + + /archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + dev: true + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true @@ -8816,6 +9257,14 @@ packages: engines: {node: '>= 0.4'} dev: true + /axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.2 + transitivePeerDependencies: + - debug + dev: true + /axios@0.25.0: resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} dependencies: @@ -8831,6 +9280,24 @@ packages: '@babel/core': 7.22.10 dev: true + /babel-jest@28.1.3(@babel/core@7.22.10): + resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.22.10 + '@jest/transform': 28.1.3 + '@types/babel__core': 7.20.0 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 28.1.3(@babel/core@7.22.10) + chalk: 4.1.2 + graceful-fs: 4.2.10 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-jest@29.4.1(@babel/core@7.22.10): resolution: {integrity: sha512-xBZa/pLSsF/1sNpkgsiT3CmY7zV1kAsZ9OxxtrFqYucnOuRftXAfcJqcDVyOPeN4lttWTwhLdu0T9f8uvoPEUg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8895,6 +9362,16 @@ packages: - supports-color dev: true + /babel-plugin-jest-hoist@28.1.3: + resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.10 + '@types/babel__core': 7.20.0 + '@types/babel__traverse': 7.18.3 + dev: true + /babel-plugin-jest-hoist@29.4.0: resolution: {integrity: sha512-a/sZRLQJEmsmejQ2rPEUe35nO1+C9dc9O1gplH1SXmJxveQSRUYdBk8yGZG/VOUuZs1u2aHZJusEGoRMbhhwCg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9000,6 +9477,17 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.10) dev: true + /babel-preset-jest@28.1.3(@babel/core@7.22.10): + resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.10 + babel-plugin-jest-hoist: 28.1.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.10) + dev: true + /babel-preset-jest@29.4.0(@babel/core@7.22.10): resolution: {integrity: sha512-fUB9vZflUSM3dO/6M2TCAepTzvA4VkOvl67PjErcrQMGt9Eve7uazaeyCZ2th3UtI7ljpiBJES0F7A1vBRsLZA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9254,6 +9742,16 @@ packages: engines: {node: '>=6'} dev: true + /caching-transform@4.0.0: + resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} + engines: {node: '>=8'} + dependencies: + hasha: 5.2.2 + make-dir: 3.1.0 + package-hash: 4.0.0 + write-file-atomic: 3.0.3 + dev: true + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: @@ -9292,6 +9790,11 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + /can-bind-to-host@1.1.2: + resolution: {integrity: sha512-CqsgmaqiyFRNtP17Ihqa/uHbZxRirntNVNl/kJz31DLKuNRfzvzionkLoUSkElQ6Cz+cpXKA3mhHq4tjbieujA==} + hasBin: true + dev: true + /caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: @@ -9347,6 +9850,11 @@ packages: engines: {node: '>=10'} dev: true + /char-regex@2.0.1: + resolution: {integrity: sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==} + engines: {node: '>=12.20'} + dev: true + /character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} @@ -9485,6 +9993,14 @@ packages: engines: {node: '>= 10'} dev: true + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + /cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: @@ -9576,6 +10092,10 @@ packages: /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + /commander@3.0.2: + resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} + dev: true + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -9745,7 +10265,7 @@ packages: json-stringify-safe: 5.0.1 lodash: 4.17.21 meow: 8.1.2 - semver: 6.3.0 + semver: 6.3.1 split: 1.0.1 through2: 4.0.2 dev: true @@ -10176,6 +10696,14 @@ packages: /csstype@3.1.1: resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + /cwd@0.10.0: + resolution: {integrity: sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==} + engines: {node: '>=0.8'} + dependencies: + find-pkg: 0.1.2 + fs-exists-sync: 0.1.0 + dev: true + /cz-conventional-changelog@3.3.0(@swc/core@1.3.76): resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} @@ -10315,6 +10843,13 @@ packages: dependencies: execa: 5.1.1 + /default-require-extensions@3.0.1: + resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} + engines: {node: '>=8'} + dependencies: + strip-bom: 4.0.0 + dev: true + /defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: @@ -10431,6 +10966,11 @@ packages: transitivePeerDependencies: - supports-color + /diff-sequences@28.1.1: + resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dev: true + /diff-sequences@29.3.1: resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10441,6 +10981,12 @@ packages: engines: {node: '>=0.3.1'} dev: true + /diffable-html@4.1.0: + resolution: {integrity: sha512-++kyNek+YBLH8cLXS+iTj/Hiy2s5qkRJEJ8kgu/WHbFrVY2vz9xPFUT+fii2zGF0m1CaojDlQJjkfrCt7YWM1g==} + dependencies: + htmlparser2: 3.10.1 + dev: true + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -10504,6 +11050,13 @@ packages: csstype: 3.1.1 dev: true + /dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + dev: true + /dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} dependencies: @@ -10519,6 +11072,10 @@ packages: entities: 4.4.0 dev: false + /domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + dev: true + /domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} @@ -10529,6 +11086,12 @@ packages: webidl-conversions: 7.0.0 dev: true + /domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + dependencies: + domelementtype: 1.3.1 + dev: true + /domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} @@ -10542,6 +11105,13 @@ packages: domelementtype: 2.3.0 dev: false + /domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + dev: true + /domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: @@ -10617,6 +11187,11 @@ packages: /electron-to-chromium@1.4.492: resolution: {integrity: sha512-36K9b/6skMVwAIEsC7GiQ8I8N3soCALVSHqWHzNDtGemAcI9Xu8hP02cywWM0A794rTHm0b0zHPeLJHtgFVamQ==} + /emittery@0.10.2: + resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} + engines: {node: '>=12'} + dev: true + /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -10657,6 +11232,10 @@ packages: dependencies: ansi-colors: 4.1.3 + /entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + dev: true + /entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -10764,6 +11343,10 @@ packages: is-symbol: 1.0.4 dev: true + /es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + dev: true + /es6-object-assign@1.1.0: resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} dev: true @@ -10889,6 +11472,18 @@ packages: source-map: 0.6.1 dev: true + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + /eslint-config-prettier@8.6.0(eslint@7.32.0): resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} hasBin: true @@ -11148,6 +11743,13 @@ packages: engines: {node: '>= 0.8.0'} dev: true + /expand-tilde@1.2.2: + resolution: {integrity: sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==} + engines: {node: '>=0.10.0'} + dependencies: + os-homedir: 1.0.2 + dev: true + /expand-tilde@2.0.2: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} @@ -11155,6 +11757,21 @@ packages: homedir-polyfill: 1.0.3 dev: true + /expect-playwright@0.8.0: + resolution: {integrity: sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==} + dev: true + + /expect@28.1.3: + resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/expect-utils': 28.1.3 + jest-get-type: 28.0.2 + jest-matcher-utils: 28.1.3 + jest-message-util: 28.1.3 + jest-util: 28.1.3 + dev: true + /expect@29.4.1: resolution: {integrity: sha512-OKrGESHOaMxK3b6zxIq9SOW8kEXztKff/Dvg88j4xIJxur1hspEbedVkR3GpHe5LO+WB2Qw7OWN0RMTdp6as5A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11411,6 +12028,14 @@ packages: make-dir: 3.1.0 pkg-dir: 4.2.0 + /find-file-up@0.1.3: + resolution: {integrity: sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==} + engines: {node: '>=0.10.0'} + dependencies: + fs-exists-sync: 0.1.0 + resolve-dir: 0.1.1 + dev: true + /find-node-modules@2.1.3: resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} dependencies: @@ -11418,6 +12043,24 @@ packages: merge: 2.1.1 dev: true + /find-pkg@0.1.2: + resolution: {integrity: sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==} + engines: {node: '>=0.10.0'} + dependencies: + find-file-up: 0.1.3 + dev: true + + /find-process@1.4.7: + resolution: {integrity: sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==} + hasBin: true + dependencies: + chalk: 4.1.2 + commander: 5.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: true @@ -11651,6 +12294,11 @@ packages: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: true + /fs-exists-sync@0.1.0: + resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} + engines: {node: '>=0.10.0'} + dev: true + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -11901,6 +12549,14 @@ packages: dependencies: ini: 2.0.0 + /global-modules@0.2.3: + resolution: {integrity: sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 0.1.5 + is-windows: 0.2.0 + dev: true + /global-modules@1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} engines: {node: '>=0.10.0'} @@ -11916,6 +12572,16 @@ packages: dependencies: global-prefix: 3.0.0 + /global-prefix@0.1.5: + resolution: {integrity: sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 0.2.0 + which: 1.3.1 + dev: true + /global-prefix@1.0.2: resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} engines: {node: '>=0.10.0'} @@ -12104,6 +12770,14 @@ packages: dependencies: function-bind: 1.1.1 + /hasha@5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} + dependencies: + is-stream: 2.0.1 + type-fest: 0.8.1 + dev: true + /hast-to-hyperscript@9.0.1: resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} dependencies: @@ -12261,6 +12935,17 @@ packages: tapable: 2.2.1 webpack: 5.75.0(@swc/core@1.3.76)(esbuild@0.19.2) + /htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: true + /htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} dependencies: @@ -12880,6 +13565,11 @@ packages: /is-whitespace-character@1.0.4: resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==} + /is-windows@0.2.0: + resolution: {integrity: sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==} + engines: {node: '>=0.10.0'} + dev: true + /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -12930,6 +13620,25 @@ packages: engines: {node: '>=8'} dev: true + /istanbul-lib-hook@3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} + dependencies: + append-transform: 2.0.0 + dev: true + + /istanbul-lib-instrument@4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.22.10 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} @@ -12943,6 +13652,18 @@ packages: - supports-color dev: true + /istanbul-lib-processinfo@2.0.3: + resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} + engines: {node: '>=8'} + dependencies: + archy: 1.0.0 + cross-spawn: 7.0.3 + istanbul-lib-coverage: 3.2.0 + p-map: 3.0.0 + rimraf: 3.0.2 + uuid: 8.3.2 + dev: true + /istanbul-lib-report@3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} @@ -12996,6 +13717,14 @@ packages: engines: {node: '>= 0.6.0'} dev: true + /jest-changed-files@28.1.3: + resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + execa: 5.1.1 + p-limit: 3.1.0 + dev: true + /jest-changed-files@29.4.0: resolution: {integrity: sha512-rnI1oPxgFghoz32Y8eZsGJMjW54UlqT17ycQeCEktcxxwqqKdlj9afl8LNeO0Pbu+h2JQHThQP0BzS67eTRx4w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13004,6 +13733,33 @@ packages: p-limit: 3.1.0 dev: true + /jest-circus@28.1.3: + resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.3 + '@jest/expect': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.11.18 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 28.1.3 + jest-matcher-utils: 28.1.3 + jest-message-util: 28.1.3 + jest-runtime: 28.1.3 + jest-snapshot: 28.1.3 + jest-util: 28.1.3 + p-limit: 3.1.0 + pretty-format: 28.1.3 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - supports-color + dev: true + /jest-circus@29.4.1: resolution: {integrity: sha512-v02NuL5crMNY4CGPHBEflLzl4v91NFb85a+dH9a1pUNx6Xjggrd8l9pPy4LZ1VYNRXlb+f65+7O/MSIbLir6pA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13031,6 +13787,34 @@ packages: - supports-color dev: true + /jest-cli@28.1.3(@types/node@18.11.18)(ts-node@10.9.1): + resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 28.1.3(ts-node@10.9.1) + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + import-local: 3.1.0 + jest-config: 28.1.3(@types/node@18.11.18)(ts-node@10.9.1) + jest-util: 28.1.3 + jest-validate: 28.1.3 + prompts: 2.4.2 + yargs: 17.6.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /jest-cli@29.4.1(@types/node@18.11.18)(ts-node@10.9.1): resolution: {integrity: sha512-jz7GDIhtxQ37M+9dlbv5K+/FVcIo1O/b1sX3cJgzlQUf/3VG25nvuWzlDC4F1FLLzUThJeWLu8I7JF9eWpuURQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13059,6 +13843,46 @@ packages: - ts-node dev: true + /jest-config@28.1.3(@types/node@18.11.18)(ts-node@10.9.1): + resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.22.10 + '@jest/test-sequencer': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.11.18 + babel-jest: 28.1.3(@babel/core@7.22.10) + chalk: 4.1.2 + ci-info: 3.7.1 + deepmerge: 4.2.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-circus: 28.1.3 + jest-environment-node: 28.1.3 + jest-get-type: 28.0.2 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-runner: 28.1.3 + jest-util: 28.1.3 + jest-validate: 28.1.3 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 28.1.3 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1(@swc/core@1.3.76)(@types/node@18.11.18)(typescript@4.9.4) + transitivePeerDependencies: + - supports-color + dev: true + /jest-config@29.4.1(@types/node@18.11.18)(ts-node@10.9.1): resolution: {integrity: sha512-g7p3q4NuXiM4hrS4XFATTkd+2z0Ml2RhFmFPM8c3WyKwVDNszbl4E7cV7WIx1YZeqqCtqbtTtZhGZWJlJqngzg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13099,6 +13923,16 @@ packages: - supports-color dev: true + /jest-diff@28.1.3: + resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 28.1.1 + jest-get-type: 28.0.2 + pretty-format: 28.1.3 + dev: true + /jest-diff@29.4.1: resolution: {integrity: sha512-uazdl2g331iY56CEyfbNA0Ut7Mn2ulAG5vUaEHXycf1L6IPyuImIxSz4F0VYBKi7LYIuxOwTZzK3wh5jHzASMw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13109,6 +13943,13 @@ packages: pretty-format: 29.4.1 dev: true + /jest-docblock@28.1.1: + resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + /jest-docblock@29.2.0: resolution: {integrity: sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13116,6 +13957,17 @@ packages: detect-newline: 3.1.0 dev: true + /jest-each@28.1.3: + resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + chalk: 4.1.2 + jest-get-type: 28.0.2 + jest-util: 28.1.3 + pretty-format: 28.1.3 + dev: true + /jest-each@29.4.1: resolution: {integrity: sha512-QlYFiX3llJMWUV0BtWht/esGEz9w+0i7BHwODKCze7YzZzizgExB9MOfiivF/vVT0GSQ8wXLhvHXh3x2fVD4QQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13150,6 +14002,18 @@ packages: - utf-8-validate dev: true + /jest-environment-node@28.1.3: + resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.3 + '@jest/fake-timers': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.11.18 + jest-mock: 28.1.3 + jest-util: 28.1.3 + dev: true + /jest-environment-node@29.4.1: resolution: {integrity: sha512-x/H2kdVgxSkxWAIlIh9MfMuBa0hZySmfsC5lCsWmWr6tZySP44ediRKDUiNggX/eHLH7Cd5ZN10Rw+XF5tXsqg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13162,11 +14026,35 @@ packages: jest-util: 29.4.1 dev: true + /jest-get-type@28.0.2: + resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dev: true + /jest-get-type@29.2.0: resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true + /jest-haste-map@28.1.3: + resolution: {integrity: sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/graceful-fs': 4.1.6 + '@types/node': 18.11.18 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.10 + jest-regex-util: 28.0.2 + jest-util: 28.1.3 + jest-worker: 28.1.3 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /jest-haste-map@29.4.1: resolution: {integrity: sha512-imTjcgfVVTvg02khXL11NNLTx9ZaofbAWhilrMg/G8dIkp+HYCswhxf0xxJwBkfhWb3e8dwbjuWburvxmcr58w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13186,6 +14074,24 @@ packages: fsevents: 2.3.2 dev: true + /jest-junit@14.0.1: + resolution: {integrity: sha512-h7/wwzPbllgpQhhVcRzRC76/cc89GlazThoV1fDxcALkf26IIlRsu/AcTG64f4nR2WPE3Cbd+i/sVf+NCUHrWQ==} + engines: {node: '>=10.12.0'} + dependencies: + mkdirp: 1.0.4 + strip-ansi: 6.0.1 + uuid: 8.3.2 + xml: 1.0.1 + dev: true + + /jest-leak-detector@28.1.3: + resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + jest-get-type: 28.0.2 + pretty-format: 28.1.3 + dev: true + /jest-leak-detector@29.4.1: resolution: {integrity: sha512-akpZv7TPyGMnH2RimOCgy+hPmWZf55EyFUvymQ4LMsQP8xSPlZumCPtXGoDhFNhUE2039RApZkTQDKU79p/FiQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13194,6 +14100,16 @@ packages: pretty-format: 29.4.1 dev: true + /jest-matcher-utils@28.1.3: + resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 28.1.3 + jest-get-type: 28.0.2 + pretty-format: 28.1.3 + dev: true + /jest-matcher-utils@29.4.1: resolution: {integrity: sha512-k5h0u8V4nAEy6lSACepxL/rw78FLDkBnXhZVgFneVpnJONhb2DhZj/Gv4eNe+1XqQ5IhgUcqj745UwH0HJmMnA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13204,6 +14120,21 @@ packages: pretty-format: 29.4.1 dev: true + /jest-message-util@28.1.3: + resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/code-frame': 7.22.10 + '@jest/types': 28.1.3 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.10 + micromatch: 4.0.5 + pretty-format: 28.1.3 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + /jest-message-util@29.4.1: resolution: {integrity: sha512-H4/I0cXUaLeCw6FM+i4AwCnOwHRgitdaUFOdm49022YD5nfyr8C/DrbXOBEyJaj+w/y0gGJ57klssOaUiLLQGQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13219,6 +14150,22 @@ packages: stack-utils: 2.0.6 dev: true + /jest-mock@27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 18.11.18 + dev: true + + /jest-mock@28.1.3: + resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/node': 18.11.18 + dev: true + /jest-mock@29.4.1: resolution: {integrity: sha512-MwA4hQ7zBOcgVCVnsM8TzaFLVUD/pFWTfbkY953Y81L5ret3GFRZtmPmRFAjKQSdCKoJvvqOu6Bvfpqlwwb0dQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13228,6 +14175,41 @@ packages: jest-util: 29.4.1 dev: true + /jest-playwright-preset@2.0.0(jest-circus@28.1.3)(jest-environment-node@28.1.3)(jest-runner@28.1.3)(jest@28.1.3): + resolution: {integrity: sha512-pV5ruTJJMen3lwshUL4dlSqLlP8z4q9MXqWJkmy+sB6HYfzXoqBHzhl+5hslznhnSVTe4Dwu+reiiwcUJpYUbw==} + peerDependencies: + jest: ^28.0.0 + jest-circus: ^28.0.0 + jest-environment-node: ^28.0.0 + jest-runner: ^28.0.0 + dependencies: + expect-playwright: 0.8.0 + jest: 28.1.3(@types/node@18.11.18)(ts-node@10.9.1) + jest-circus: 28.1.3 + jest-environment-node: 28.1.3 + jest-process-manager: 0.3.1 + jest-runner: 28.1.3 + nyc: 15.1.0 + playwright-core: 1.37.1 + rimraf: 3.0.2 + uuid: 8.3.2 + transitivePeerDependencies: + - debug + - supports-color + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@28.1.3): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 28.1.3 + dev: true + /jest-pnp-resolver@1.2.3(jest-resolve@29.4.1): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -13240,11 +14222,44 @@ packages: jest-resolve: 29.4.1 dev: true + /jest-process-manager@0.3.1: + resolution: {integrity: sha512-x9W54UgZ7IkzUHgXtnI1x4GKOVjxtwW0CA/7yGbTHtT/YhENO0Lic2yfVyC/gekn7OIEMcQmy0L1r9WLQABfqw==} + dependencies: + '@types/wait-on': 5.3.1 + chalk: 4.1.2 + cwd: 0.10.0 + exit: 0.1.2 + find-process: 1.4.7 + prompts: 2.4.2 + signal-exit: 3.0.7 + spawnd: 5.0.0 + tree-kill: 1.2.2 + wait-on: 5.3.0 + transitivePeerDependencies: + - debug + - supports-color + dev: true + + /jest-regex-util@28.0.2: + resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dev: true + /jest-regex-util@29.2.0: resolution: {integrity: sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true + /jest-resolve-dependencies@28.1.3: + resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + jest-regex-util: 28.0.2 + jest-snapshot: 28.1.3 + transitivePeerDependencies: + - supports-color + dev: true + /jest-resolve-dependencies@29.4.1: resolution: {integrity: sha512-Y3QG3M1ncAMxfjbYgtqNXC5B595zmB6e//p/qpA/58JkQXu/IpLDoLeOa8YoYfsSglBKQQzNUqtfGJJT/qLmJg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13255,6 +14270,21 @@ packages: - supports-color dev: true + /jest-resolve@28.1.3: + resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.10 + jest-haste-map: 28.1.3 + jest-pnp-resolver: 1.2.3(jest-resolve@28.1.3) + jest-util: 28.1.3 + jest-validate: 28.1.3 + resolve: 1.22.4 + resolve.exports: 1.1.1 + slash: 3.0.0 + dev: true + /jest-resolve@29.4.1: resolution: {integrity: sha512-j/ZFNV2lm9IJ2wmlq1uYK0Y/1PiyDq9g4HEGsNTNr3viRbJdV+8Lf1SXIiLZXFvyiisu0qUyIXGBnw+OKWkJwQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13270,6 +14300,35 @@ packages: slash: 3.0.0 dev: true + /jest-runner@28.1.3: + resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/console': 28.1.3 + '@jest/environment': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.11.18 + chalk: 4.1.2 + emittery: 0.10.2 + graceful-fs: 4.2.10 + jest-docblock: 28.1.1 + jest-environment-node: 28.1.3 + jest-haste-map: 28.1.3 + jest-leak-detector: 28.1.3 + jest-message-util: 28.1.3 + jest-resolve: 28.1.3 + jest-runtime: 28.1.3 + jest-util: 28.1.3 + jest-watcher: 28.1.3 + jest-worker: 28.1.3 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + /jest-runner@29.4.1: resolution: {integrity: sha512-8d6XXXi7GtHmsHrnaqBKWxjKb166Eyj/ksSaUYdcBK09VbjPwIgWov1VwSmtupCIz8q1Xv4Qkzt/BTo3ZqiCeg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13299,6 +14358,36 @@ packages: - supports-color dev: true + /jest-runtime@28.1.3: + resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.3 + '@jest/fake-timers': 28.1.3 + '@jest/globals': 28.1.3 + '@jest/source-map': 28.1.2 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + execa: 5.1.1 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-haste-map: 28.1.3 + jest-message-util: 28.1.3 + jest-mock: 28.1.3 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-snapshot: 28.1.3 + jest-util: 28.1.3 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /jest-runtime@29.4.1: resolution: {integrity: sha512-UXTMU9uKu2GjYwTtoAw5rn4STxWw/nadOfW7v1sx6LaJYa3V/iymdCLQM6xy3+7C6mY8GfX22vKpgxY171UIoA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13330,6 +14419,43 @@ packages: - supports-color dev: true + /jest-serializer-html@7.1.0: + resolution: {integrity: sha512-xYL2qC7kmoYHJo8MYqJkzrl/Fdlx+fat4U1AqYg+kafqwcKPiMkOcjWHPKhueuNEgr+uemhGc+jqXYiwCyRyLA==} + dependencies: + diffable-html: 4.1.0 + dev: true + + /jest-snapshot@28.1.3: + resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/core': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.22.10) + '@babel/traverse': 7.22.10 + '@babel/types': 7.22.10 + '@jest/expect-utils': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + '@types/babel__traverse': 7.18.3 + '@types/prettier': 2.7.2 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.10) + chalk: 4.1.2 + expect: 28.1.3 + graceful-fs: 4.2.10 + jest-diff: 28.1.3 + jest-get-type: 28.0.2 + jest-haste-map: 28.1.3 + jest-matcher-utils: 28.1.3 + jest-message-util: 28.1.3 + jest-util: 28.1.3 + natural-compare: 1.4.0 + pretty-format: 28.1.3 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + /jest-snapshot@29.4.1: resolution: {integrity: sha512-l4iV8EjGgQWVz3ee/LR9sULDk2pCkqb71bjvlqn+qp90lFwpnulHj4ZBT8nm1hA1C5wowXLc7MGnw321u0tsYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13362,6 +14488,18 @@ packages: - supports-color dev: true + /jest-util@28.1.3: + resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/node': 18.11.18 + chalk: 4.1.2 + ci-info: 3.7.1 + graceful-fs: 4.2.10 + picomatch: 2.3.1 + dev: true + /jest-util@29.4.1: resolution: {integrity: sha512-bQy9FPGxVutgpN4VRc0hk6w7Hx/m6L53QxpDreTZgJd9gfx/AV2MjyPde9tGyZRINAUrSv57p2inGBu2dRLmkQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13373,6 +14511,18 @@ packages: graceful-fs: 4.2.10 picomatch: 2.3.1 + /jest-validate@28.1.3: + resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 28.0.2 + leven: 3.1.0 + pretty-format: 28.1.3 + dev: true + /jest-validate@29.4.1: resolution: {integrity: sha512-qNZXcZQdIQx4SfUB/atWnI4/I2HUvhz8ajOSYUu40CSmf9U5emil8EDHgE7M+3j9/pavtk3knlZBDsgFvv/SWw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13385,6 +14535,36 @@ packages: pretty-format: 29.4.1 dev: true + /jest-watch-typeahead@2.2.2(jest@28.1.3): + resolution: {integrity: sha512-+QgOFW4o5Xlgd6jGS5X37i08tuuXNW8X0CV9WNFi+3n8ExCIP+E1melYhvYLjv5fE6D0yyzk74vsSO8I6GqtvQ==} + engines: {node: ^14.17.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + jest: ^27.0.0 || ^28.0.0 || ^29.0.0 + dependencies: + ansi-escapes: 6.2.0 + chalk: 5.2.0 + jest: 28.1.3(@types/node@18.11.18)(ts-node@10.9.1) + jest-regex-util: 29.2.0 + jest-watcher: 29.4.1 + slash: 5.1.0 + string-length: 5.0.1 + strip-ansi: 7.0.1 + dev: true + + /jest-watcher@28.1.3: + resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.11.18 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.10.2 + jest-util: 28.1.3 + string-length: 4.0.2 + dev: true + /jest-watcher@29.4.1: resolution: {integrity: sha512-vFOzflGFs27nU6h8dpnVRER3O2rFtL+VMEwnG0H3KLHcllLsU8y9DchSh0AL/Rg5nN1/wSiQ+P4ByMGpuybaVw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13407,6 +14587,15 @@ packages: merge-stream: 2.0.0 supports-color: 8.1.1 + /jest-worker@28.1.3: + resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@types/node': 18.11.18 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + /jest-worker@29.4.1: resolution: {integrity: sha512-O9doU/S1EBe+yp/mstQ0VpPwpv0Clgn68TkNwGxL6/usX/KUW9Arnn4ag8C3jc6qHcXznhsT5Na1liYzAsuAbQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13416,6 +14605,26 @@ packages: merge-stream: 2.0.0 supports-color: 8.1.1 + /jest@28.1.3(@types/node@18.11.18)(ts-node@10.9.1): + resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 28.1.3(ts-node@10.9.1) + '@jest/types': 28.1.3 + import-local: 3.1.0 + jest-cli: 28.1.3(@types/node@18.11.18)(ts-node@10.9.1) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /jest@29.4.1(@types/node@18.11.18)(ts-node@10.9.1): resolution: {integrity: sha512-cknimw7gAXPDOmj0QqztlxVtBVCw2lYY9CeIE5N6kD+kET1H4H79HSNISJmijb1HF+qk+G+ploJgiDi5k/fRlg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13580,6 +14789,10 @@ packages: engines: {node: '>=6'} hasBin: true + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: @@ -13785,6 +14998,10 @@ packages: resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} dev: true + /lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + dev: true + /lodash.flow@3.5.0: resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} dev: false @@ -13910,8 +15127,8 @@ packages: dependencies: yallist: 4.0.0 - /lz-string@1.4.4: - resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==} + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true dev: true @@ -14384,6 +15601,13 @@ packages: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true + /node-preload@0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} + dependencies: + process-on-spawn: 1.0.0 + dev: true + /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} @@ -14528,6 +15752,42 @@ packages: resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} dev: true + /nyc@15.1.0: + resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} + engines: {node: '>=8.9'} + hasBin: true + dependencies: + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + caching-transform: 4.0.0 + convert-source-map: 1.9.0 + decamelize: 1.2.0 + find-cache-dir: 3.3.2 + find-up: 4.1.0 + foreground-child: 2.0.0 + get-package-type: 0.1.0 + glob: 7.2.3 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-hook: 3.0.0 + istanbul-lib-instrument: 4.0.3 + istanbul-lib-processinfo: 2.0.3 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + make-dir: 3.1.0 + node-preload: 0.2.1 + p-map: 3.0.0 + process-on-spawn: 1.0.0 + resolve-from: 5.0.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + spawn-wrap: 2.0.0 + test-exclude: 6.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - supports-color + dev: true + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -14671,6 +15931,11 @@ packages: wcwidth: 1.0.1 dev: true + /os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + dev: true + /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -14746,6 +16011,13 @@ packages: engines: {node: '>=6'} dev: true + /p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + dependencies: + aggregate-error: 3.1.0 + dev: true + /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -14773,6 +16045,16 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + /package-hash@4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} + dependencies: + graceful-fs: 4.2.10 + hasha: 5.2.2 + lodash.flattendeep: 4.4.0 + release-zalgo: 1.0.0 + dev: true + /package-json@6.5.0: resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} engines: {node: '>=8'} @@ -14993,6 +16275,21 @@ packages: hasBin: true dev: true + /playwright-core@1.37.1: + resolution: {integrity: sha512-17EuQxlSIYCmEMwzMqusJ2ztDgJePjrbttaefgdsiqeLWidjYz9BxXaTaZWxH1J95SHGk6tjE+dwgWILJoUZfA==} + engines: {node: '>=16'} + hasBin: true + dev: true + + /playwright@1.37.1: + resolution: {integrity: sha512-bgUXRrQKhT48zHdxDYQTpf//0xDfDd5hLeEhjuSw8rXEGoT9YeElpfvs/izonTNY21IQZ7d3s22jLxYaAnubbQ==} + engines: {node: '>=16'} + hasBin: true + requiresBuild: true + dependencies: + playwright-core: 1.37.1 + dev: true + /polished@4.2.2: resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} engines: {node: '>=10'} @@ -15733,6 +17030,16 @@ packages: react-is: 17.0.2 dev: true + /pretty-format@28.1.3: + resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/schemas': 28.1.3 + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + /pretty-format@29.4.1: resolution: {integrity: sha512-dt/Z761JUVsrIKaY215o1xQJBGlSmTx/h4cSqXqjHLnU1+Kt+mavVE7UgqJJO5ukx5HjSswHfmXz4LjS2oIJfg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -15767,6 +17074,13 @@ packages: /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + /process-on-spawn@1.0.0: + resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + engines: {node: '>=8'} + dependencies: + fromentries: 1.3.2 + dev: true + /process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -16990,17 +18304,6 @@ packages: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} - /regexpu-core@5.2.2: - resolution: {integrity: sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==} - engines: {node: '>=4'} - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.0 - regjsgen: 0.7.1 - regjsparser: 0.9.1 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 - /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} @@ -17031,9 +18334,6 @@ packages: dependencies: rc: 1.2.8 - /regjsgen@0.7.1: - resolution: {integrity: sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==} - /regjsparser@0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true @@ -17044,6 +18344,13 @@ packages: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} + /release-zalgo@1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} + dependencies: + es6-error: 4.1.1 + dev: true + /remark-emoji@2.2.0: resolution: {integrity: sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==} dependencies: @@ -17136,6 +18443,10 @@ packages: /require-like@0.1.2: resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: true + /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -17150,6 +18461,14 @@ packages: resolve-from: 5.0.0 dev: true + /resolve-dir@0.1.1: + resolution: {integrity: sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 1.2.2 + global-modules: 0.2.3 + dev: true + /resolve-dir@1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} engines: {node: '>=0.10.0'} @@ -17177,6 +18496,11 @@ packages: /resolve-pathname@3.0.0: resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} + /resolve.exports@1.1.1: + resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} + engines: {node: '>=10'} + dev: true + /resolve.exports@2.0.0: resolution: {integrity: sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==} engines: {node: '>=10'} @@ -17275,6 +18599,13 @@ packages: dependencies: queue-microtask: 1.2.3 + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: true + /rxjs@7.8.0: resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} dependencies: @@ -17322,7 +18653,7 @@ packages: neo-async: 2.6.2 sass: 1.57.1 schema-utils: 3.1.1 - semver: 7.3.8 + semver: 7.5.4 webpack: 5.75.0(@swc/core@1.3.76)(esbuild@0.19.2) dev: true @@ -17485,7 +18816,7 @@ packages: resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} engines: {node: '>=8'} dependencies: - semver: 6.3.0 + semver: 6.3.1 /semver-regex@3.1.4: resolution: {integrity: sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==} @@ -17499,6 +18830,7 @@ packages: /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true + dev: true /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -17591,6 +18923,10 @@ packages: transitivePeerDependencies: - supports-color + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} dev: false @@ -17693,6 +19029,11 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} + /slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + dev: true + /slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} @@ -17768,6 +19109,29 @@ packages: resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} dev: true + /spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + dependencies: + foreground-child: 2.0.0 + is-windows: 1.0.2 + make-dir: 3.1.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + which: 2.0.2 + dev: true + + /spawnd@5.0.0: + resolution: {integrity: sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==} + dependencies: + exit: 0.1.2 + signal-exit: 3.0.7 + tree-kill: 1.2.2 + wait-port: 0.2.14 + transitivePeerDependencies: + - supports-color + dev: true + /spdx-correct@3.1.1: resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} dependencies: @@ -17871,11 +19235,11 @@ packages: resolution: {integrity: sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==} dev: true - /storybook@7.3.0: - resolution: {integrity: sha512-v3kwokgNmEpmGFPsamE8vY3PYGkQ/fCbVmWeKmCam/GM0O05B3WOe5KamzopCCMnj62muqpb2OylD8TcIAWIsw==} + /storybook@7.4.1: + resolution: {integrity: sha512-b90jq0CYqBMl2JAbC1lInGAoadkPkeGg4Vh8C9Bv7dGhl6M9uei3yEMQTDrj3HvCsktdeZqztGfrkGs2scK+LA==} hasBin: true dependencies: - '@storybook/cli': 7.3.0 + '@storybook/cli': 7.4.1 transitivePeerDependencies: - bufferutil - encoding @@ -17911,6 +19275,14 @@ packages: strip-ansi: 6.0.1 dev: true + /string-length@5.0.1: + resolution: {integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==} + engines: {node: '>=12.20'} + dependencies: + char-regex: 2.0.1 + strip-ansi: 7.0.1 + dev: true + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -18345,8 +19717,8 @@ packages: yallist: 4.0.0 dev: true - /telejson@7.1.0: - resolution: {integrity: sha512-jFJO4P5gPebZAERPkJsqMAQ0IMA1Hi0AoSfxpnUaV6j6R2SZqlpkbS20U6dEUtA3RUYt2Ak/mTlkQzHH9Rv/hA==} + /telejson@7.2.0: + resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} dependencies: memoizerific: 1.11.3 dev: true @@ -18374,6 +19746,14 @@ packages: unique-string: 2.0.0 dev: true + /terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: true + /terser-webpack-plugin@5.3.6(@swc/core@1.3.76)(esbuild@0.19.2)(webpack@5.75.0): resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} engines: {node: '>= 10.13.0'} @@ -18766,6 +20146,11 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} + /type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + dev: true + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -19211,6 +20596,20 @@ packages: xml-name-validator: 4.0.0 dev: true + /wait-on@5.3.0: + resolution: {integrity: sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==} + engines: {node: '>=8.9.0'} + hasBin: true + dependencies: + axios: 0.21.4 + joi: 17.7.0 + lodash: 4.17.21 + minimist: 1.2.7 + rxjs: 6.6.7 + transitivePeerDependencies: + - debug + dev: true + /wait-on@6.0.1: resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==} engines: {node: '>=10.0.0'} @@ -19224,6 +20623,18 @@ packages: transitivePeerDependencies: - debug + /wait-port@0.2.14: + resolution: {integrity: sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==} + engines: {node: '>=8'} + hasBin: true + dependencies: + chalk: 2.4.2 + commander: 3.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: @@ -19478,6 +20889,10 @@ packages: is-weakset: 2.0.2 dev: true + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: true + /which-typed-array@1.1.9: resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'} @@ -19640,6 +21055,10 @@ packages: engines: {node: '>=12'} dev: true + /xml@1.0.1: + resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + dev: true + /xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true @@ -19648,6 +21067,10 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: true + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -19668,6 +21091,14 @@ packages: engines: {node: '>= 14'} dev: true + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: true + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -19678,6 +21109,23 @@ packages: engines: {node: '>=12'} dev: true + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: true + /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} diff --git a/src/components/CountrySelector/CountrySelectorDropdown.test.tsx b/src/components/CountrySelector/CountrySelectorDropdown.test.tsx index 2772aa4..8150d20 100644 --- a/src/components/CountrySelector/CountrySelectorDropdown.test.tsx +++ b/src/components/CountrySelector/CountrySelectorDropdown.test.tsx @@ -196,7 +196,7 @@ describe('CountrySelectorDropdown', () => { />, ); expect(scrollToChildSpy).toBeCalledTimes(1); - await user.keyboard('{arrowup>10}'); + await user.keyboard('{arrowup>11}'); expect(scrollToChildSpy).toBeCalledTimes(11); }); }); diff --git a/src/stories/PhoneInput.stories.tsx b/src/stories/PhoneInput.stories.tsx deleted file mode 100644 index 644b124..0000000 --- a/src/stories/PhoneInput.stories.tsx +++ /dev/null @@ -1,257 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import React, { useState } from 'react'; - -import { PhoneInput } from '../components/PhoneInput/PhoneInput'; -import { defaultCountries } from '../data/countryData'; -import { CountryIso2, CustomFlagImage } from '../types'; -import { buildCountryData, parseCountry } from '../utils'; - -export default { - title: 'PhoneInput', - component: PhoneInput, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -const defaultCountryArgType = { - options: defaultCountries.map((c) => parseCountry(c).iso2), - control: { - type: 'select', - labels: defaultCountries.reduce((acc: Record, c) => { - const { name, iso2 } = parseCountry(c); - acc[iso2] = `${name} (${iso2})`; - return acc; - }, {}), - }, -}; - -const argTypes = { - defaultCountry: defaultCountryArgType, -}; - -export const Default = Template.bind({}); -Default.argTypes = argTypes; - -Default.args = { - disabled: false, - hideDropdown: false, - defaultCountry: 'us', - placeholder: 'Phone number', - defaultMask: '............', - charAfterDialCode: ' ', - disableCountryGuess: false, - disableDialCodePrefill: false, - forceDialCode: false, - disableDialCodeAndPrefix: false, - showDisabledDialCodeAndPrefix: false, - style: {}, - inputStyle: {}, - countrySelectorStyleProps: {}, - dialCodePreviewStyleProps: {}, -}; - -export const WithInitialValue = Template.bind({}); -WithInitialValue.argTypes = argTypes; - -WithInitialValue.args = { - value: '+380999999999', - defaultCountry: 'ua', -}; - -export const ForcedDialCode = Template.bind({}); -ForcedDialCode.argTypes = argTypes; - -ForcedDialCode.args = { - defaultCountry: 'pl', - forceDialCode: true, -}; - -export const DisabledPrefill = Template.bind({}); -DisabledPrefill.argTypes = argTypes; - -DisabledPrefill.args = { - defaultCountry: 'cz', - disableDialCodePrefill: true, - placeholder: 'Phone number', -}; - -export const DisabledCountryGuess = Template.bind({}); -DisabledCountryGuess.argTypes = argTypes; - -DisabledCountryGuess.args = { - defaultCountry: 'gb', - disableCountryGuess: true, -}; - -export const WithoutDropdown = Template.bind({}); -WithoutDropdown.argTypes = argTypes; - -WithoutDropdown.args = { - defaultCountry: 'ee', - disableCountryGuess: true, - hideDropdown: true, - forceDialCode: true, -}; - -export const WithHiddenDialCode = Template.bind({}); -WithHiddenDialCode.argTypes = argTypes; - -WithHiddenDialCode.args = { - defaultCountry: 'se', - disableDialCodeAndPrefix: true, -}; - -export const WithCodePreview = Template.bind({}); -WithCodePreview.argTypes = argTypes; - -WithCodePreview.args = { - defaultCountry: 'lv', - disableDialCodeAndPrefix: true, - showDisabledDialCodeAndPrefix: true, -}; - -export const CustomStyles = Template.bind({}); -CustomStyles.argTypes = argTypes; - -CustomStyles.args = { - defaultCountry: 'ca', - style: { - '--react-international-phone-border-radius': 0, - '--react-international-phone-border-color': 'gray', - '--react-international-phone-background-color': '#282c34', - '--react-international-phone-text-color': 'white', - '--react-international-phone-selected-dropdown-item-background-color': - 'black', - '--react-international-phone-country-selector-background-color-hover': - 'black', - } as React.CSSProperties, -}; - -export const OnlyBalticCountries = Template.bind({}); -OnlyBalticCountries.argTypes = argTypes; - -const balticCountries: CountryIso2[] = ['lt', 'lv', 'ee']; - -OnlyBalticCountries.args = { - defaultCountry: 'lt', - countries: defaultCountries.filter((c) => { - return balticCountries.includes(parseCountry(c).iso2); - }), -}; - -export const WithAutofocus = Template.bind({}); -WithAutofocus.argTypes = argTypes; - -WithAutofocus.args = { - defaultCountry: 'es', - inputProps: { - autoFocus: true, - }, -}; - -export const E164Format = Template.bind({}); -E164Format.storyName = 'E164 Format'; -E164Format.argTypes = argTypes; - -const updateFormat = (format: string) => format?.replace(/[^\\.]*/g, ''); // remove all except dots - -const e164Countries = defaultCountries.map((c) => { - const country = parseCountry(c); - - // pass if format is undefined - if (!country.format) return buildCountryData(country); - - // handle string format - if (typeof country.format === 'string') { - return buildCountryData({ - ...country, - format: updateFormat(country.format), - }); - } - - // handle object format - const format = { ...country.format }; - for (const key in format) { - format[key] = updateFormat(format[key]); // update every key in object - } - - return buildCountryData({ - ...country, - format, - }); -}); - -E164Format.args = { - defaultCountry: 'pt', - charAfterDialCode: '', - countries: e164Countries, - placeholder: 'Phone number', -}; - -export const ControlledMode = () => { - const [phone, setPhone] = useState(''); - - const setRandomNumber = () => { - setPhone(`+${Math.floor(Math.random() * 1e15)}`); - }; - - return ( -
-

Phone: {phone}

- - -
- ); -}; - -const customFlags: CustomFlagImage[] = [ - { - iso2: 'ua', - src: '/flags/ua.svg', - }, - { - iso2: 'fr', - src: '/flags/fr.svg', - }, - { - iso2: 'jp', - src: '/flags/jp.svg', - }, - { - iso2: 'pl', - src: '/flags/pl.svg', - }, -]; - -export const CustomFlags = () => { - const [phone, setPhone] = useState(''); - - return ( - { - const country = parseCountry(c); - - return customFlags.map((f) => f.iso2).includes(country.iso2); - })} - flags={customFlags} - style={ - { - // style with css variables or with ".react-international-phone-flag-emoji" class - '--react-international-phone-flag-width': '24px', - '--react-international-phone-flag-height': '24px', - } as React.CSSProperties - } - value={phone} - onChange={setPhone} - defaultCountry="jp" - placeholder="Phone number" - /> - ); -}; diff --git a/src/stories/PhoneInput/PhoneInput.stories.tsx b/src/stories/PhoneInput/PhoneInput.stories.tsx new file mode 100644 index 0000000..cefef08 --- /dev/null +++ b/src/stories/PhoneInput/PhoneInput.stories.tsx @@ -0,0 +1,42 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { PhoneInput } from '../../index'; + +const meta: Meta = { + title: 'PhoneInput', + component: PhoneInput, +}; + +export default meta; +export type PhoneInputStory = StoryObj; + +/* eslint-disable simple-import-sort/imports */ +import { Default } from './stories/Default.story'; +import { WithInitialValue } from './stories/WithInitialValue.story'; +import { ForcedDialCode } from './stories/ForcedDialCode.story'; +import { DisabledPrefill } from './stories/DisabledPrefill.story'; +import { DisabledCountryGuess } from './stories/DisabledCountryGuess.story'; +import { WithoutDropdown } from './stories/WithoutDropdown.story'; +import { HiddenDialCode } from './stories/HiddenDialCode.story'; +import { WithCodePreview } from './stories/WithCodePreview.story'; +import { CustomStyles } from './stories/CustomStyles.story'; +import { OnlyBalticCountries } from './stories/OnlyBalticCountries.story'; +import { WithAutofocus } from './stories/WithAutofocus.story'; +import { E164Format } from './stories/E164Format.story'; +import { ControlledMode } from './stories/ControlledMode.story'; +import { CustomFlags } from './stories/CustomFlags.story'; + +export const _Default = Default; +export const _WithInitialValue = WithInitialValue; +export const _ForcedDialCode = ForcedDialCode; +export const _DisabledPrefill = DisabledPrefill; +export const _DisabledCountryGuess = DisabledCountryGuess; +export const _WithoutDropdown = WithoutDropdown; +export const _HiddenDialCode = HiddenDialCode; +export const _WithCodePreview = WithCodePreview; +export const _CustomStyles = CustomStyles; +export const _OnlyBalticCountries = OnlyBalticCountries; +export const _WithAutofocus = WithAutofocus; +export const _E164Format = E164Format; +export const _ControlledMode = ControlledMode; +export const _CustomFlags = CustomFlags; diff --git a/src/stories/PhoneInput/stories/ControlledMode.story.tsx b/src/stories/PhoneInput/stories/ControlledMode.story.tsx new file mode 100644 index 0000000..9f25f4b --- /dev/null +++ b/src/stories/PhoneInput/stories/ControlledMode.story.tsx @@ -0,0 +1,29 @@ +import React, { useState } from 'react'; + +import { PhoneInput, PhoneInputProps } from '../../../index'; +import { PhoneInputStory } from '../PhoneInput.stories'; + +const Story = (props: PhoneInputProps) => { + const [phone, setPhone] = useState(''); + + const setRandomNumber = () => { + setPhone(`+${Math.floor(Math.random() * 1e15)}`); + }; + + return ( +
+

Phone: {phone}

+ + +
+ ); +}; + +export const ControlledMode: PhoneInputStory = { + name: 'Controlled Mode', + render: (args) => , + args: { + defaultCountry: 'fr', + placeholder: 'Phone number', + }, +}; diff --git a/src/stories/PhoneInput/stories/CustomFlags.story.tsx b/src/stories/PhoneInput/stories/CustomFlags.story.tsx new file mode 100644 index 0000000..0b1f61e --- /dev/null +++ b/src/stories/PhoneInput/stories/CustomFlags.story.tsx @@ -0,0 +1,46 @@ +import React from 'react'; + +import { defaultCountries, parseCountry, PhoneInput } from '../../../index'; +import { CustomFlagImage } from '../../../types'; +import { PhoneInputStory } from '../PhoneInput.stories'; + +const flags: CustomFlagImage[] = [ + { + iso2: 'ua', + src: '/flags/ua.svg', + }, + { + iso2: 'fr', + src: '/flags/fr.svg', + }, + { + iso2: 'jp', + src: '/flags/jp.svg', + }, + { + iso2: 'pl', + src: '/flags/pl.svg', + }, +]; + +const countries = defaultCountries.filter((c) => { + const country = parseCountry(c); + + return flags.map((f) => f.iso2).includes(country.iso2); +}); + +export const CustomFlags: PhoneInputStory = { + name: 'Without Dropdown', + render: (args) => , + args: { + flags, + countries, + style: { + // style with css variables or with ".react-international-phone-flag-emoji" class + '--react-international-phone-flag-width': '24px', + '--react-international-phone-flag-height': '24px', + } as React.CSSProperties, + defaultCountry: 'jp', + placeholder: 'Phone number', + }, +}; diff --git a/src/stories/PhoneInput/stories/CustomStyles.story.tsx b/src/stories/PhoneInput/stories/CustomStyles.story.tsx new file mode 100644 index 0000000..16e30c8 --- /dev/null +++ b/src/stories/PhoneInput/stories/CustomStyles.story.tsx @@ -0,0 +1,22 @@ +import React from 'react'; + +import { PhoneInput } from '../../../index'; +import { PhoneInputStory } from '../PhoneInput.stories'; + +export const CustomStyles: PhoneInputStory = { + name: 'Custom Styles', + render: (args) => , + args: { + defaultCountry: 'ca', + style: { + '--react-international-phone-border-radius': 0, + '--react-international-phone-border-color': 'gray', + '--react-international-phone-background-color': '#282c34', + '--react-international-phone-text-color': 'white', + '--react-international-phone-selected-dropdown-item-background-color': + 'black', + '--react-international-phone-country-selector-background-color-hover': + 'black', + } as React.CSSProperties, + }, +}; diff --git a/src/stories/PhoneInput/stories/Default.story.tsx b/src/stories/PhoneInput/stories/Default.story.tsx new file mode 100644 index 0000000..7c0dd29 --- /dev/null +++ b/src/stories/PhoneInput/stories/Default.story.tsx @@ -0,0 +1,8 @@ +import React from 'react'; + +import { PhoneInput } from '../../../index'; +import { PhoneInputStory } from '../PhoneInput.stories'; + +export const Default: PhoneInputStory = { + render: (args) => , +}; diff --git a/src/stories/PhoneInput/stories/DisabledCountryGuess.story.tsx b/src/stories/PhoneInput/stories/DisabledCountryGuess.story.tsx new file mode 100644 index 0000000..bd12f69 --- /dev/null +++ b/src/stories/PhoneInput/stories/DisabledCountryGuess.story.tsx @@ -0,0 +1,13 @@ +import React from 'react'; + +import { PhoneInput } from '../../../index'; +import { PhoneInputStory } from '../PhoneInput.stories'; + +export const DisabledCountryGuess: PhoneInputStory = { + name: 'Disabled Country Guess', + render: (args) => , + args: { + defaultCountry: 'gb', + disableCountryGuess: true, + }, +}; diff --git a/src/stories/PhoneInput/stories/DisabledPrefill.story.tsx b/src/stories/PhoneInput/stories/DisabledPrefill.story.tsx new file mode 100644 index 0000000..ae0451c --- /dev/null +++ b/src/stories/PhoneInput/stories/DisabledPrefill.story.tsx @@ -0,0 +1,14 @@ +import React from 'react'; + +import { PhoneInput } from '../../../index'; +import { PhoneInputStory } from '../PhoneInput.stories'; + +export const DisabledPrefill: PhoneInputStory = { + name: 'Disabled Prefill', + render: (args) => , + args: { + defaultCountry: 'cz', + disableDialCodePrefill: true, + placeholder: 'Phone number', + }, +}; diff --git a/src/stories/PhoneInput/stories/E164Format.story.tsx b/src/stories/PhoneInput/stories/E164Format.story.tsx new file mode 100644 index 0000000..c850494 --- /dev/null +++ b/src/stories/PhoneInput/stories/E164Format.story.tsx @@ -0,0 +1,48 @@ +import React from 'react'; + +import { + buildCountryData, + defaultCountries, + parseCountry, + PhoneInput, +} from '../../../index'; +import { PhoneInputStory } from '../PhoneInput.stories'; + +const updateFormat = (format: string) => format?.replace(/[^\\.]*/g, ''); // remove all except dots + +const e164Countries = defaultCountries.map((c) => { + const country = parseCountry(c); + + // pass if format is undefined + if (!country.format) return buildCountryData(country); + + // handle string format + if (typeof country.format === 'string') { + return buildCountryData({ + ...country, + format: updateFormat(country.format), + }); + } + + // handle object format + const format = { ...country.format }; + for (const key in format) { + format[key] = updateFormat(format[key]); // update every key in object + } + + return buildCountryData({ + ...country, + format, + }); +}); + +export const E164Format: PhoneInputStory = { + name: 'E.164 Format', + render: (args) => , + args: { + defaultCountry: 'pt', + charAfterDialCode: '', + countries: e164Countries, + placeholder: 'Phone number', + }, +}; diff --git a/src/stories/PhoneInput/stories/ForcedDialCode.story.tsx b/src/stories/PhoneInput/stories/ForcedDialCode.story.tsx new file mode 100644 index 0000000..e6de198 --- /dev/null +++ b/src/stories/PhoneInput/stories/ForcedDialCode.story.tsx @@ -0,0 +1,13 @@ +import React from 'react'; + +import { PhoneInput } from '../../../index'; +import { PhoneInputStory } from '../PhoneInput.stories'; + +export const ForcedDialCode: PhoneInputStory = { + name: 'Forced Dial Code', + render: (args) => , + args: { + defaultCountry: 'pl', + forceDialCode: true, + }, +}; diff --git a/src/stories/PhoneInput/stories/HiddenDialCode.story.tsx b/src/stories/PhoneInput/stories/HiddenDialCode.story.tsx new file mode 100644 index 0000000..c0f7dcf --- /dev/null +++ b/src/stories/PhoneInput/stories/HiddenDialCode.story.tsx @@ -0,0 +1,13 @@ +import React from 'react'; + +import { PhoneInput } from '../../../index'; +import { PhoneInputStory } from '../PhoneInput.stories'; + +export const HiddenDialCode: PhoneInputStory = { + name: 'Hidden Dial Code', + render: (args) => , + args: { + defaultCountry: 'se', + disableDialCodeAndPrefix: true, + }, +}; diff --git a/src/stories/PhoneInput/stories/OnlyBalticCountries.story.tsx b/src/stories/PhoneInput/stories/OnlyBalticCountries.story.tsx new file mode 100644 index 0000000..98552f5 --- /dev/null +++ b/src/stories/PhoneInput/stories/OnlyBalticCountries.story.tsx @@ -0,0 +1,22 @@ +import React from 'react'; + +import { + CountryIso2, + defaultCountries, + parseCountry, + PhoneInput, +} from '../../../index'; +import { PhoneInputStory } from '../PhoneInput.stories'; + +const balticCountries: CountryIso2[] = ['lt', 'lv', 'ee']; + +export const OnlyBalticCountries: PhoneInputStory = { + name: 'Only Baltic Countries', + render: (args) => , + args: { + defaultCountry: 'lt', + countries: defaultCountries.filter((c) => { + return balticCountries.includes(parseCountry(c).iso2); + }), + }, +}; diff --git a/src/stories/PhoneInput/stories/WithAutofocus.story.tsx b/src/stories/PhoneInput/stories/WithAutofocus.story.tsx new file mode 100644 index 0000000..325d73f --- /dev/null +++ b/src/stories/PhoneInput/stories/WithAutofocus.story.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { PhoneInput } from '../../../index'; +import { PhoneInputStory } from '../PhoneInput.stories'; + +export const WithAutofocus: PhoneInputStory = { + name: 'With Autofocus', + render: (args) => , + args: { + defaultCountry: 'es', + inputProps: { + autoFocus: true, + }, + }, +}; diff --git a/src/stories/PhoneInput/stories/WithCodePreview.story.tsx b/src/stories/PhoneInput/stories/WithCodePreview.story.tsx new file mode 100644 index 0000000..ed3d481 --- /dev/null +++ b/src/stories/PhoneInput/stories/WithCodePreview.story.tsx @@ -0,0 +1,14 @@ +import React from 'react'; + +import { PhoneInput } from '../../../index'; +import { PhoneInputStory } from '../PhoneInput.stories'; + +export const WithCodePreview: PhoneInputStory = { + name: 'With Code Preview', + render: (args) => , + args: { + defaultCountry: 'lv', + disableDialCodeAndPrefix: true, + showDisabledDialCodeAndPrefix: true, + }, +}; diff --git a/src/stories/PhoneInput/stories/WithInitialValue.story.tsx b/src/stories/PhoneInput/stories/WithInitialValue.story.tsx new file mode 100644 index 0000000..1e6d563 --- /dev/null +++ b/src/stories/PhoneInput/stories/WithInitialValue.story.tsx @@ -0,0 +1,13 @@ +import React from 'react'; + +import { PhoneInput } from '../../../index'; +import { PhoneInputStory } from '../PhoneInput.stories'; + +export const WithInitialValue: PhoneInputStory = { + name: 'With Initial Value', + render: (args) => , + args: { + value: '+380999999999', + defaultCountry: 'ua', + }, +}; diff --git a/src/stories/PhoneInput/stories/WithoutDropdown.story.tsx b/src/stories/PhoneInput/stories/WithoutDropdown.story.tsx new file mode 100644 index 0000000..a6780a6 --- /dev/null +++ b/src/stories/PhoneInput/stories/WithoutDropdown.story.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { PhoneInput } from '../../../index'; +import { PhoneInputStory } from '../PhoneInput.stories'; + +export const WithoutDropdown: PhoneInputStory = { + name: 'Without Dropdown', + render: (args) => , + args: { + defaultCountry: 'ee', + disableCountryGuess: true, + hideDropdown: true, + forceDialCode: true, + }, +}; diff --git a/src/stories/Tests/Tests.stories.tsx b/src/stories/Tests/Tests.stories.tsx new file mode 100644 index 0000000..722ca2a --- /dev/null +++ b/src/stories/Tests/Tests.stories.tsx @@ -0,0 +1,22 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { PhoneInput } from '../../index'; + +const meta: Meta = { + title: 'Tests', + component: PhoneInput, +}; + +export default meta; +export type TestStory = StoryObj; + +/* eslint-disable simple-import-sort/imports */ +import { Default } from './stories/Default.story'; +import { ForceDialCode } from './stories/ForceDialCode.story'; +import { ForceDialCodeCursor } from './stories/ForceDialCodeCursor.story'; +import { DisableDialCodeAndPrefix } from './stories/DisableDialCodeAndPrefix.story'; + +export const _Default = Default; +export const _ForceDialCode = ForceDialCode; +export const _ForceDialCodeCursor = ForceDialCodeCursor; +export const _DisableDialCodeAndPrefix = DisableDialCodeAndPrefix; diff --git a/src/stories/Tests/stories/Default.story.tsx b/src/stories/Tests/stories/Default.story.tsx new file mode 100644 index 0000000..c2a1204 --- /dev/null +++ b/src/stories/Tests/stories/Default.story.tsx @@ -0,0 +1,34 @@ +import { expect } from '@storybook/jest'; +import { userEvent } from '@storybook/testing-library'; +import React from 'react'; + +import { PhoneInput } from '../../../index'; +import { StorybookTestUtils } from '../storybook-test-utils'; +import { TestStory } from '../Tests.stories'; + +export const Default: TestStory = { + render: (args) => , + play: async ({ canvasElement }) => { + const utils = new StorybookTestUtils(canvasElement); + + const phoneInput = utils.getPhoneInput(); + // should be prefilled by default + await expect(phoneInput.value).toBe('+1 '); + + await userEvent.type(phoneInput, '1234567890', { delay: 100 }); + await expect(phoneInput.value).toBe('+1 (123) 456-7890'); + + await userEvent.clear(phoneInput); + // should not prefill after clear + await expect(phoneInput.value).toBe(''); + // should render placeholder + await expect(utils.getByPlaceholder('Phone number')).toBe(phoneInput); + + // should change country + await userEvent.type(phoneInput, '38099', { delay: 100 }); + await expect(phoneInput.value).toBe('+380 (99) '); + + await utils.selectCountry('ca'); + await expect(phoneInput.value).toBe('+1 '); + }, +}; diff --git a/src/stories/Tests/stories/DisableDialCodeAndPrefix.story.tsx b/src/stories/Tests/stories/DisableDialCodeAndPrefix.story.tsx new file mode 100644 index 0000000..e986159 --- /dev/null +++ b/src/stories/Tests/stories/DisableDialCodeAndPrefix.story.tsx @@ -0,0 +1,47 @@ +import { expect } from '@storybook/jest'; +import { userEvent } from '@storybook/testing-library'; +import React from 'react'; + +import { PhoneInput } from '../../../index'; +import { StorybookTestUtils } from '../storybook-test-utils'; +import { TestStory } from '../Tests.stories'; + +export const DisableDialCodeAndPrefix: TestStory = { + render: (args) => ( + + ), + play: async ({ canvasElement }) => { + const utils = new StorybookTestUtils(canvasElement); + + const phoneInput = utils.getPhoneInput(); + await expect(phoneInput.value).toBe(''); + + await userEvent.type(phoneInput, '1234'); + await expect(phoneInput.value).toBe('(123) 4'); + + await userEvent.type(phoneInput, '567'); + await expect(phoneInput.value).toBe('(123) 456-7'); + + await userEvent.type(phoneInput, '890'); + await expect(phoneInput.value).toBe('(123) 456-7890'); + + await userEvent.type(phoneInput, '1'); // don't allow overflow + await expect(phoneInput.value).toBe('(123) 456-7890'); + + utils.selectAll(); + await userEvent.keyboard('2'); + await expect(phoneInput.value).toBe('(2'); + + // should change country on E.164 format paste + await expect(utils.getSelectedCountry()).toBe('us'); + utils.selectAll(); + await userEvent.paste('+38097'); + await expect(phoneInput.value).toBe('(97) '); + await expect(utils.getSelectedCountry()).toBe('ua'); + + utils.selectAll(); + await userEvent.paste('1 (234) 567-8900'); + await expect(phoneInput.value).toBe('(12) 345 67 89'); + await expect(utils.getSelectedCountry()).toBe('ua'); + }, +}; diff --git a/src/stories/Tests/stories/ForceDialCode.story.tsx b/src/stories/Tests/stories/ForceDialCode.story.tsx new file mode 100644 index 0000000..6f08155 --- /dev/null +++ b/src/stories/Tests/stories/ForceDialCode.story.tsx @@ -0,0 +1,36 @@ +import { expect } from '@storybook/jest'; +import { userEvent } from '@storybook/testing-library'; +import React from 'react'; + +import { PhoneInput } from '../../../index'; +import { StorybookTestUtils } from '../storybook-test-utils'; +import { TestStory } from '../Tests.stories'; + +export const ForceDialCode: TestStory = { + render: (args) => ( + + ), + play: async ({ canvasElement }) => { + const utils = new StorybookTestUtils(canvasElement); + + const phoneInput = utils.getPhoneInput(); + // should be prefilled by default + await expect(phoneInput.value).toBe('+1 '); + + await userEvent.type(phoneInput, '1234567890', { delay: 100 }); + await expect(phoneInput.value).toBe('+1 (123) 456-7890'); + + await userEvent.clear(phoneInput); + // should not allow to clear dial code + await expect(phoneInput.value).toBe('+1 '); + // should render placeholder + await expect(utils.getByPlaceholder('Phone number')).toBe(phoneInput); + + // should not change country + await userEvent.type(phoneInput, '+38099', { delay: 100 }); + await expect(phoneInput.value).toBe('+1 (380) 99'); + + await utils.selectCountry('ca'); + await expect(phoneInput.value).toBe('+1 '); + }, +}; diff --git a/src/stories/Tests/stories/ForceDialCodeCursor.story.tsx b/src/stories/Tests/stories/ForceDialCodeCursor.story.tsx new file mode 100644 index 0000000..ce59694 --- /dev/null +++ b/src/stories/Tests/stories/ForceDialCodeCursor.story.tsx @@ -0,0 +1,180 @@ +import { expect } from '@storybook/jest'; +import { userEvent } from '@storybook/testing-library'; +import React from 'react'; + +import { PhoneInput } from '../../../index'; +import { StorybookTestUtils } from '../storybook-test-utils'; +import { TestStory } from '../Tests.stories'; + +export const ForceDialCodeCursor: TestStory = { + render: (args) => ( + + ), + play: async ({ canvasElement }) => { + const utils = new StorybookTestUtils(canvasElement); + + const phoneInput = utils.getPhoneInput(); + // should be prefilled by default + await expect(phoneInput.value).toBe('+1 '); + + // should handle cursor if type in the end of input + await userEvent.type(phoneInput, '1'); + await expect(phoneInput.value).toBe('+1 (1'); + await expect(utils.getCursorPosition()).toBe('+1 (1'.length); + + await userEvent.type(phoneInput, '2'); + await expect(phoneInput.value).toBe('+1 (12'); + await expect(utils.getCursorPosition()).toBe('+1 (12'.length); + + await userEvent.type(phoneInput, '3'); + await expect(phoneInput.value).toBe('+1 (123) '); + await expect(utils.getCursorPosition()).toBe('+1 (123) '.length); + + await userEvent.type(phoneInput, '4'); + await expect(phoneInput.value).toBe('+1 (123) 4'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 4'.length); + + await userEvent.type(phoneInput, '5'); + await expect(phoneInput.value).toBe('+1 (123) 45'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 45'.length); + + await userEvent.type(phoneInput, '6'); + await expect(phoneInput.value).toBe('+1 (123) 456-'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 456-'.length); + + await userEvent.type(phoneInput, '7'); + await expect(phoneInput.value).toBe('+1 (123) 456-7'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 456-7'.length); + + await userEvent.type(phoneInput, '8'); + await expect(phoneInput.value).toBe('+1 (123) 456-78'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 456-78'.length); + + await userEvent.type(phoneInput, '9'); + await expect(phoneInput.value).toBe('+1 (123) 456-789'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 456-789'.length); + + await userEvent.type(phoneInput, '0'); + await expect(phoneInput.value).toBe('+1 (123) 456-7890'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 456-7890'.length); + + await userEvent.type(phoneInput, '4'); + await expect(phoneInput.value).toBe('+1 (123) 456-7890'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 456-7890'.length); // ignore overflow typing + + // should set cursor when press backspace in the end of input + utils.setCursorPosition('+1 (123) 456-7890'.length); + await utils.pressBackspace(3); + await expect(phoneInput.value).toBe('+1 (123) 456-7'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 456-7'.length); + await utils.pressBackspace(); + await expect(phoneInput.value).toBe('+1 (123) 456'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 456'.length); + + await userEvent.type(phoneInput, '7890'); + + // should set cursor when press backspace in the middle of input + utils.setCursorPosition('+1 (123) 45'.length); + await expect(phoneInput.value).toBe('+1 (123) 456-7890'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 45'.length); + + await utils.pressBackspace(); + await expect(phoneInput.value).toBe('+1 (123) 467-890'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 4'.length); + + await utils.pressBackspace(); + await expect(phoneInput.value).toBe('+1 (123) 678-90'); + await expect(utils.getCursorPosition()).toBe('+1 (123'.length); + + await utils.pressBackspace(); + await expect(phoneInput.value).toBe('+1 (126) 789-0'); + await expect(utils.getCursorPosition()).toBe('+1 (12'.length); + + await utils.pressBackspace(); + await expect(phoneInput.value).toBe('+1 (167) 890'); + await expect(utils.getCursorPosition()).toBe('+1 (1'.length); + + await utils.pressBackspace(); + await expect(phoneInput.value).toBe('+1 (678) 90'); + await expect(utils.getCursorPosition()).toBe('+1'.length); + + await utils.pressBackspace(); + await expect(phoneInput.value).toBe('+1 (678) 90'); + await expect(utils.getCursorPosition()).toBe('+1 '.length); + + utils.setCursorPosition('+'.length); + await utils.pressBackspace(); + await expect(phoneInput.value).toBe('+1 (678) 90'); + await expect(utils.getCursorPosition()).toBe('+1 '.length); + + utils.setCursorPosition(0); + await utils.pressBackspace(); + await expect(phoneInput.value).toBe('+1 (678) 90'); + await expect(utils.getCursorPosition()).toBe(0); + + utils.setCursorSelection(0, phoneInput.value.length); + await utils.pressBackspace(); + await expect(phoneInput.value).toBe('+1 '); + + // should set cursor when press delete in the middle of input + await userEvent.type(phoneInput, '(123) 456-7890'); + await expect(phoneInput.value).toBe('+1 (123) 456-7890'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 456-7890'.length); + + utils.setCursorPosition('+1 (123) 45'.length); + await utils.pressDelete(); + await expect(phoneInput.value).toBe('+1 (123) 457-890'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 45'.length); + + await utils.pressDelete(); + await expect(phoneInput.value).toBe('+1 (123) 458-90'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 45'.length); + + await utils.pressDelete(); + await expect(phoneInput.value).toBe('+1 (123) 459-0'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 45'.length); + + await utils.pressDelete(); + await expect(phoneInput.value).toBe('+1 (123) 450-'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 45'.length); + + await utils.pressDelete(); + await expect(phoneInput.value).toBe('+1 (123) 45'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 45'.length); + + await utils.pressDelete(); + await expect(phoneInput.value).toBe('+1 (123) 45'); + await expect(utils.getCursorPosition()).toBe('+1 (123) 45'.length); + + // should not change dial code if on delete press + utils.setCursorSelection(0, phoneInput.value.length); + await utils.pressDelete(); + await expect(phoneInput.value).toBe('+1 '); + await expect(utils.getCursorPosition()).toBe('+1 '.length); + + await userEvent.type(phoneInput, '(123) 456-7890'); + + utils.setCursorSelection(0, '+1 '.length); + await utils.pressDelete(); + await expect(phoneInput.value).toBe('+1 (123) 456-7890'); + await expect(utils.getCursorPosition()).toBe('+1 '.length); + + utils.setCursorPosition('+'.length); + await utils.pressDelete(); + await expect(phoneInput.value).toBe('+1 (123) 456-7890'); + await expect(utils.getCursorPosition()).toBe('+1 '.length); + + utils.setCursorPosition('+1'.length); + await utils.pressDelete(); + await expect(phoneInput.value).toBe('+1 (123) 456-7890'); + await expect(utils.getCursorPosition()).toBe('+1 '.length); + + await utils.pressDelete(); + await expect(phoneInput.value).toBe('+1 (123) 456-7890'); + await expect(utils.getCursorPosition()).toBe('+1 ('.length); + + // should set cursor after dropdown country change + await utils.selectCountry('cz'); + await expect(utils.getCursorPosition()).toBe('+420 '.length); + }, +}; diff --git a/src/stories/Tests/storybook-test-utils.ts b/src/stories/Tests/storybook-test-utils.ts new file mode 100644 index 0000000..108c4cb --- /dev/null +++ b/src/stories/Tests/storybook-test-utils.ts @@ -0,0 +1,89 @@ +import { queries, userEvent, within } from '@storybook/testing-library'; + +import { CountryIso2, getCountry } from '../../index'; + +export class StorybookTestUtils { + canvas: ReturnType>; + + constructor(canvasElement: HTMLElement) { + this.canvas = within(canvasElement); + } + + getPhoneInput = () => { + const phoneInput: HTMLInputElement = this.canvas.getByText('', { + selector: 'input', + }); + + return phoneInput; + }; + + getByPlaceholder = (placeholder: string) => { + return this.canvas.getByPlaceholderText(placeholder); + }; + + getCountrySelector = () => { + return this.canvas.getByRole('combobox'); + }; + + getCountryDropdownOption = (country: CountryIso2) => { + const fullCountry = getCountry({ field: 'iso2', value: country }); + return this.canvas.getByLabelText( + `${fullCountry?.name} +${fullCountry?.dialCode}`, + ); + }; + + getSelectedCountry = () => { + const countrySelector = this.getCountrySelector(); + return countrySelector.getAttribute('data-country'); + }; + + selectCountry = async (country: CountryIso2) => { + const countrySelector = this.getCountrySelector(); + await userEvent.click(countrySelector); + + const option = this.getCountryDropdownOption(country); + + await userEvent.click(option); + }; + + getCursorSelection = () => { + const phoneInput = this.getPhoneInput(); + const start = phoneInput.selectionStart; + const end = phoneInput.selectionEnd; + + return { + start, + end, + }; + }; + + getCursorPosition = () => { + const { start, end } = this.getCursorSelection(); + return start === end ? start : undefined; + }; + + setCursorSelection = (start: number, end: number) => { + const phoneInput = this.getPhoneInput(); + phoneInput.selectionStart = start; + phoneInput.selectionEnd = end; + }; + + setCursorPosition = (cursorPosition: number) => { + const phoneInput = this.getPhoneInput(); + phoneInput.selectionStart = cursorPosition; + phoneInput.selectionEnd = cursorPosition; + }; + + selectAll = () => { + const phoneInput = this.getPhoneInput(); + this.setCursorSelection(0, phoneInput.value.length); + }; + + pressBackspace = async (times = 1) => { + return userEvent.keyboard(`{Backspace>${times}/}`); + }; + + pressDelete = async (times = 1) => { + return userEvent.keyboard(`{Delete>${times}/}`); + }; +}