From d86dd043869f8d8ca49677a1102f5445135e480e Mon Sep 17 00:00:00 2001 From: Kyle Holmberg Date: Sun, 26 Oct 2025 03:47:27 +0700 Subject: [PATCH 1/9] fix lint message --- .eslintrc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index f66f76726..eeb237953 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -247,7 +247,7 @@ module.exports = { { name: 'formik', importNames: ['Form'], - message: `Please use our Form component to have good defaults defined.\n "import Form from 'components/Form/Form';"`, + message: `Please use our Form component to have good defaults defined.\n "import { Form } from 'components/Form/Form';"`, }, { name: 'react', From b311e5580dcf24d169ded138578ef71b102df1df Mon Sep 17 00:00:00 2001 From: Kyle Holmberg Date: Sun, 26 Oct 2025 21:19:03 +0700 Subject: [PATCH 2/9] remove airbnb eslint preset, add react eslint plugin, add playwright eslint plugin, and remove cypress eslint plugin --- .eslintrc.js | 36 +-- .gitignore | 7 + package.json | 20 +- yarn.lock | 853 +++++++++------------------------------------------ 4 files changed, 177 insertions(+), 739 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index eeb237953..91ed10719 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -4,9 +4,8 @@ module.exports = { extends: [ 'plugin:@typescript-eslint/eslint-recommended', - 'airbnb', + 'plugin:react/recommended', 'plugin:jsx-a11y/recommended', - 'plugin:cypress/recommended', 'plugin:storybook/recommended', 'plugin:prettier/recommended', 'prettier', @@ -15,22 +14,10 @@ module.exports = { browser: true, commonjs: true, es6: true, - 'cypress/globals': true, node: true, }, parser: '@babel/eslint-parser', - plugins: [ - 'unicorn', - 'cypress', - '@operation_code/custom-rules', - 'import', - 'lodash', - '@typescript-eslint', - ], - globals: { - cy: true, - Cypress: true, - }, + plugins: ['unicorn', '@operation_code/custom-rules', 'import', 'lodash', '@typescript-eslint'], rules: { // Import Rules 'import/extensions': [ @@ -274,24 +261,25 @@ module.exports = { }, }, { - files: ['./**/*.test.ts', './**/*.test.tsx'], + files: ['./e2e/**/*.spec.ts'], + extends: 'plugin:playwright/recommended', rules: { - '@typescript-eslint/no-non-null-assertion': 'off', + 'func-names': 'off', + 'vitest/expect-expect': 'off', + 'vitest/valid-expect': 'off', + 'no-unused-expressions': ['off'], }, }, { - files: ['./pages/api/**/*.ts'], + files: ['./**/*.test.ts', './**/*.test.tsx'], rules: { - 'no-console': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', }, }, { - files: ['cypress/**/*.js'], + files: ['./pages/api/**/*.ts'], rules: { - 'func-names': 'off', - 'vitest/expect-expect': 'off', - 'vitest/valid-expect': 'off', - 'no-unused-expressions': ['off'], + 'no-console': 'off', }, }, { diff --git a/.gitignore b/.gitignore index cabcf4ad8..5930422e6 100644 --- a/.gitignore +++ b/.gitignore @@ -86,3 +86,10 @@ out # Autogenerated static files public/sitemap.xml + +# Playwright +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ +/playwright/.auth/ diff --git a/package.json b/package.json index e85d6a89f..b5e10c296 100644 --- a/package.json +++ b/package.json @@ -19,10 +19,10 @@ "start": "next start -p 3000", "storybook": "storybook dev -p 9001 -c .storybook", "storybook:build": "storybook build -c .storybook -o .storybook-dist", - "test:e2e": "cypress open", - "test:e2e:headless": "cypress run --browser chrome", - "test:e2e:update-snaps": "cypress run --browser chrome --env updateSnapshots=true", - "test:e2e:ci": "cypress run --browser chrome --record", + "test:e2e": "playwright test", + "test:e2e:headless": "playwright test --headed", + "test:e2e:update-snaps": "playwright test --update-snapshots", + "test:e2e:ci": "playwright test --ci", "test": "vitest --run", "test:ci": "yarn test --coverage --silent", "test:changes": "yarn test --changed main", @@ -93,6 +93,7 @@ "@cypress/code-coverage": "^3.13.10", "@cypress/webpack-preprocessor": "^6.0.2", "@operation_code/eslint-plugin-custom-rules": "^1.0.1", + "@playwright/test": "^1.56.1", "@storybook/addon-actions": "^7.4.1", "@storybook/addon-essentials": "^7.4.1", "@storybook/addon-links": "^7.4.1", @@ -111,6 +112,7 @@ "@types/jest": "^29.5.14", "@types/lodash": "^4.17.20", "@types/logrocket-react": "^3.0.3", + "@types/node": "^24.9.1", "@types/object-hash": "^3.0.0", "@types/prop-types": "^15.7.15", "@types/react": "^18.2.55", @@ -132,15 +134,12 @@ "chromatic": "^6.8.0", "cross-env": "^7.0.3", "css-loader": "^6.7.1", - "cypress": "^10.3.1", - "cypress-image-snapshot": "^4.0.1", "eslint": "^8.56.0", - "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-cypress": "^2.12.1", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-lodash": "^7.4.0", + "eslint-plugin-playwright": "^2.2.2", "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-react": "^7.37.5", "eslint-plugin-storybook": "^0.6.13", @@ -180,10 +179,5 @@ "vitest": "^3.1.2", "webpack": "^5.102.1" }, - "resolutions": { - "istanbul-lib-coverage": "3.2.0", - "jackspeak": "2.1.1", - "webpack": "^5.102.1" - }, "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/yarn.lock b/yarn.lock index 36d0fb915..dfe9409a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1440,30 +1440,6 @@ js-yaml "4.1.0" nyc "15.1.0" -"@cypress/request@^2.88.10": - version "2.88.11" - resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz" - integrity sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - http-signature "~1.3.6" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - performance-now "^2.1.0" - qs "~6.10.3" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^8.3.2" - "@cypress/webpack-preprocessor@^6.0.0", "@cypress/webpack-preprocessor@^6.0.2": version "6.0.2" resolved "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-6.0.2.tgz" @@ -1473,14 +1449,6 @@ debug "^4.3.4" lodash "^4.17.20" -"@cypress/xvfb@^1.2.4": - version "1.2.4" - resolved "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz" - integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== - dependencies: - debug "^3.1.0" - lodash.once "^4.1.1" - "@discoveryjs/json-ext@^0.5.3": version "0.5.7" resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" @@ -1921,6 +1889,18 @@ resolved "https://registry.npmjs.org/@innocuous/hooks/-/hooks-2.1.1.tgz" integrity sha512-aEmassaakqeAsI0FXeScMNexZTppDRxIMSOxD12aVFLBxCIdXjSMwBd1tQZJpFYTtUbTjh6x76GPUTfyI8WsqQ== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" @@ -2215,6 +2195,13 @@ resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.9.tgz#d229a7b7f9dac167a156992ef23c7f023653f53b" integrity sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA== +"@playwright/test@^1.56.1": + version "1.56.1" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.56.1.tgz#6e3bf3d0c90c5cf94bf64bdb56fd15a805c8bd3f" + integrity sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg== + dependencies: + playwright "1.56.1" + "@pmmmwh/react-refresh-webpack-plugin@^0.5.5": version "0.5.10" resolved "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz" @@ -4404,10 +4391,12 @@ resolved "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz" integrity sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ== -"@types/node@^14.14.31": - version "14.18.51" - resolved "https://registry.npmjs.org/@types/node/-/node-14.18.51.tgz" - integrity sha512-P9bsdGFPpVtofEKlhWMVS2qqx1A/rt9QBfihWlklfHHpUpjtYse5AzFz6j4DWrARLYh6gRnw9+5+DJcrq3KvBA== +"@types/node@^24.9.1": + version "24.9.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.9.1.tgz#b7360b3c789089e57e192695a855aa4f6981a53c" + integrity sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg== + dependencies: + undici-types "~7.16.0" "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -4529,16 +4518,6 @@ "@types/mime" "*" "@types/node" "*" -"@types/sinonjs__fake-timers@8.1.1": - version "8.1.1" - resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz" - integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== - -"@types/sizzle@^2.3.2": - version "2.3.3" - resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz" - integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== - "@types/stack-utils@^2.0.0": version "2.0.3" resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz" @@ -4566,13 +4545,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/yauzl@^2.9.1": - version "2.10.0" - resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz" - integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== - dependencies: - "@types/node" "*" - "@typescript-eslint/eslint-plugin@^6.21.0": version "6.21.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz" @@ -5117,12 +5089,7 @@ ajv@^8.0.0, ajv@^8.0.1, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.1.0, ansi-escapes@^4.3.0: +ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -5178,6 +5145,11 @@ ansi-styles@^6.0.0: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== +ansi-styles@^6.1.0: + version "6.2.3" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== + any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -5191,13 +5163,6 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -app-path@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/app-path/-/app-path-3.3.0.tgz" - integrity sha512-EAgEXkdcxH1cgEePOSsmUtw9ItPl0KTxnh/pj9ZbhvbKbij9x0oX6PWpGnorDr0DS5AosLgoa5n3T/hZmKQpYA== - dependencies: - execa "^1.0.0" - app-root-dir@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz" @@ -5215,11 +5180,6 @@ append-transform@^2.0.0: resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== -arch@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - archy@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" @@ -5402,18 +5362,6 @@ asn1.js@^5.2.0: minimalistic-assert "^1.0.0" safer-buffer "^2.1.0" -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - assert@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz" @@ -5470,7 +5418,7 @@ async-limiter@~1.0.0: resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^3.2.0, async@^3.2.3: +async@^3.2.3: version "3.2.4" resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== @@ -5480,11 +5428,6 @@ asynckit@^0.4.0: resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - autoprefixer@^10.4.21: version "10.4.21" resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz" @@ -5504,16 +5447,6 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.12.0" - resolved "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" - integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== - axe-core@^4.10.0: version "4.10.2" resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz" @@ -5669,7 +5602,7 @@ balanced-match@^2.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz" integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== -base64-js@^1.3.1, base64-js@^1.5.1: +base64-js@^1.3.1: version "1.5.1" resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -5679,13 +5612,6 @@ baseline-browser-mapping@^2.8.19: resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.20.tgz#6766cf270f3668d20b6712b9c54cc911b87da714" integrity sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ== -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - better-opn@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz" @@ -5717,17 +5643,12 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -blob-util@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz" - integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== - bluebird@3.7.1: version "3.7.1" resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz" integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== -bluebird@3.7.2, bluebird@^3.7.2: +bluebird@3.7.2: version "3.7.2" resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -5915,7 +5836,7 @@ buffer-xor@^1.0.3: resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== -buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.5.0: version "5.7.1" resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -5986,11 +5907,6 @@ cacheable@^2.1.0: keyv "^5.5.3" qified "^0.5.0" -cachedir@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" - integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== - caching-transform@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz" @@ -6070,11 +5986,6 @@ case-sensitive-paths-webpack-plugin@^2.4.0: resolved "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz" integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== - chai@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz" @@ -6127,7 +6038,7 @@ check-error@^2.1.1: resolved "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz" integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== -check-more-types@2.24.0, check-more-types@^2.24.0: +check-more-types@2.24.0: version "2.24.0" resolved "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz" integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== @@ -6231,7 +6142,7 @@ cli-spinners@^2.5.0: resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz" integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== -cli-table3@^0.6.1, cli-table3@~0.6.1: +cli-table3@^0.6.1: version "0.6.3" resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz" integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== @@ -6346,7 +6257,7 @@ colorette@^2.0.10, colorette@^2.0.16, colorette@^2.0.17, colorette@^2.0.19: resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -6368,11 +6279,6 @@ commander@^4.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - commander@^6.2.0, commander@^6.2.1: version "6.2.1" resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" @@ -6398,11 +6304,6 @@ common-path-prefix@^3.0.0: resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz" integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== -common-tags@^1.8.0: - version "1.8.2" - resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" - integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== - commondir@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" @@ -6448,11 +6349,6 @@ concat-stream@^1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" -confusing-browser-globals@^1.0.10: - version "1.0.11" - resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz" - integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== - console-browserify@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz" @@ -6522,7 +6418,7 @@ core-js@^3.8.2: resolved "https://registry.npmjs.org/core-js/-/core-js-3.31.0.tgz" integrity sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ== -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== @@ -6596,17 +6492,6 @@ cross-env@^7.0.3: dependencies: cross-spawn "^7.0.1" -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" @@ -6771,78 +6656,11 @@ cva@^1.0.0-beta.4: dependencies: clsx "^2.1.1" -cypress-image-snapshot@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/cypress-image-snapshot/-/cypress-image-snapshot-4.0.1.tgz" - integrity sha512-PBpnhX/XItlx3/DAk5ozsXQHUi72exybBNH5Mpqj1DVmjq+S5Jd9WE5CRa4q5q0zuMZb2V2VpXHth6MjFpgj9Q== - dependencies: - chalk "^2.4.1" - fs-extra "^7.0.1" - glob "^7.1.3" - jest-image-snapshot "4.2.0" - pkg-dir "^3.0.0" - term-img "^4.0.0" - -cypress@^10.3.1: - version "10.11.0" - resolved "https://registry.npmjs.org/cypress/-/cypress-10.11.0.tgz" - integrity sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA== - dependencies: - "@cypress/request" "^2.88.10" - "@cypress/xvfb" "^1.2.4" - "@types/node" "^14.14.31" - "@types/sinonjs__fake-timers" "8.1.1" - "@types/sizzle" "^2.3.2" - arch "^2.2.0" - blob-util "^2.0.2" - bluebird "^3.7.2" - buffer "^5.6.0" - cachedir "^2.3.0" - chalk "^4.1.0" - check-more-types "^2.24.0" - cli-cursor "^3.1.0" - cli-table3 "~0.6.1" - commander "^5.1.0" - common-tags "^1.8.0" - dayjs "^1.10.4" - debug "^4.3.2" - enquirer "^2.3.6" - eventemitter2 "6.4.7" - execa "4.1.0" - executable "^4.1.1" - extract-zip "2.0.1" - figures "^3.2.0" - fs-extra "^9.1.0" - getos "^3.2.1" - is-ci "^3.0.0" - is-installed-globally "~0.4.0" - lazy-ass "^1.6.0" - listr2 "^3.8.3" - lodash "^4.17.21" - log-symbols "^4.0.0" - minimist "^1.2.6" - ospath "^1.2.2" - pretty-bytes "^5.6.0" - proxy-from-env "1.0.0" - request-progress "^3.0.0" - semver "^7.3.2" - supports-color "^8.1.1" - tmp "~0.2.1" - untildify "^4.0.0" - yauzl "^2.10.0" - damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - data-urls@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz" @@ -6885,7 +6703,7 @@ date-fns@^2.29.3: dependencies: "@babel/runtime" "^7.21.0" -dayjs@1.11.13, dayjs@^1.10.4: +dayjs@1.11.13: version "1.11.13" resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== @@ -6911,7 +6729,7 @@ debug@4.3.7: dependencies: ms "^2.1.3" -debug@^3.1.0, debug@^3.2.7: +debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -7295,14 +7113,6 @@ eastasianwidth@^0.2.0: resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - ee-first@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" @@ -7390,13 +7200,6 @@ enhanced-resolve@^5.7.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.6: - version "2.3.6" - resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - entities@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" @@ -7757,25 +7560,6 @@ escodegen@^2.1.0: optionalDependencies: source-map "~0.6.1" -eslint-config-airbnb-base@^15.0.0: - version "15.0.0" - resolved "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz" - integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== - dependencies: - confusing-browser-globals "^1.0.10" - object.assign "^4.1.2" - object.entries "^1.1.5" - semver "^6.3.0" - -eslint-config-airbnb@^19.0.4: - version "19.0.4" - resolved "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz" - integrity sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew== - dependencies: - eslint-config-airbnb-base "^15.0.0" - object.assign "^4.1.2" - object.entries "^1.1.5" - eslint-config-prettier@^9.1.0: version "9.1.0" resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz" @@ -7797,13 +7581,6 @@ eslint-module-utils@^2.12.1: dependencies: debug "^3.2.7" -eslint-plugin-cypress@^2.12.1: - version "2.13.3" - resolved "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.13.3.tgz" - integrity sha512-nAPjZE5WopCsgJwl3vHm5iafpV+ZRO76Z9hMyRygWhmg5ODXDPd+9MaPl7kdJ2azj+sO87H3P1PRnggIrz848g== - dependencies: - globals "^11.12.0" - eslint-plugin-import@^2.32.0: version "2.32.0" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" @@ -7857,6 +7634,13 @@ eslint-plugin-lodash@^7.4.0: dependencies: lodash "^4.17.21" +eslint-plugin-playwright@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-playwright/-/eslint-plugin-playwright-2.2.2.tgz#f722649b0bf04acd8fef39184249710335b10a6f" + integrity sha512-j0jKpndIPOXRRP9uMkwb9l/nSmModOU3452nrFdgFJoEv/435J1onk8+aITzjDW8DfypxgmVaDMdmVIa6F7I0w== + dependencies: + globals "^13.23.0" + eslint-plugin-prettier@^5.5.4: version "5.5.4" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz#9d61c4ea11de5af704d4edf108c82ccfa7f2e61c" @@ -7867,7 +7651,7 @@ eslint-plugin-prettier@^5.5.4: eslint-plugin-react@^7.37.5: version "7.37.5" - resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz#2975511472bdda1b272b34d779335c9b0e877065" integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== dependencies: array-includes "^3.1.8" @@ -8100,11 +7884,6 @@ event-target-shim@^5.0.0: resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -eventemitter2@6.4.7: - version "6.4.7" - resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz" - integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== - events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" @@ -8148,19 +7927,6 @@ execa@5.1.1, execa@^5.0.0, execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz" @@ -8176,13 +7942,6 @@ execa@^6.1.0: signal-exit "^3.0.7" strip-final-newline "^3.0.0" -executable@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz" - integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== - dependencies: - pify "^2.2.0" - expect-type@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz" @@ -8236,22 +7995,11 @@ express@^4.17.3, express@^4.18.1: utils-merge "1.0.1" vary "~1.1.2" -extend@^3.0.0, extend@~3.0.2: +extend@^3.0.0: version "3.0.2" resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -extract-zip@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - extract-zip@^1.6.6: version "1.7.0" resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz" @@ -8262,11 +8010,6 @@ extract-zip@^1.6.6: mkdirp "^0.5.4" yauzl "^2.10.0" -extsprintf@1.3.0, extsprintf@^1.2.0: - version "1.3.0" - resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - faker@^5.5.3: version "5.5.3" resolved "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz" @@ -8356,13 +8099,6 @@ fflate@^0.8.2: resolved "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz" integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== -figures@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^10.1.4: version "10.1.4" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-10.1.4.tgz#1e81441517dc33ba5fe14421d96dc5fe7e37e820" @@ -8557,11 +8293,6 @@ foreground-child@^3.1.0: cross-spawn "^7.0.0" signal-exit "^4.0.1" -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - fork-ts-checker-webpack-plugin@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz" @@ -8600,15 +8331,6 @@ form-data@^4.0.0, form-data@^4.0.4: hasown "^2.0.2" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - formik@^2.4.6: version "2.4.6" resolved "https://registry.npmjs.org/formik/-/formik-2.4.6.tgz" @@ -8671,25 +8393,6 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" @@ -8707,6 +8410,11 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" @@ -8803,19 +8511,7 @@ get-proto@^1.0.0, get-proto@^1.0.1: dunder-proto "^1.0.1" es-object-atoms "^1.0.0" -get-stdin@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz" - integrity sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0, get-stream@^5.1.0: +get-stream@^5.0.0: version "5.2.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -8836,20 +8532,6 @@ get-symbol-description@^1.1.0: es-errors "^1.3.0" get-intrinsic "^1.2.6" -getos@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz" - integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== - dependencies: - async "^3.2.0" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - giget@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/giget/-/giget-1.1.2.tgz" @@ -8943,13 +8625,6 @@ glob@^9.3.3: minipass "^4.2.4" path-scurry "^1.6.1" -global-dirs@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz" - integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== - dependencies: - ini "2.0.0" - global-modules@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" @@ -8966,7 +8641,7 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -globals@^11.1.0, globals@^11.12.0: +globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== @@ -8978,6 +8653,13 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" +globals@^13.23.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + globalthis@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" @@ -9008,11 +8690,6 @@ globrex@^0.1.2: resolved "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== -glur@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/glur/-/glur-1.1.2.tgz" - integrity sha512-l+8esYHTKOx2G/Aao4lEQ0bnHWg4fWtJbVoZZT9Knxi01pB8C80BR85nONLFwkkQoFRCmXY+BUcGZN3yZ2QsRA== - gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" @@ -9267,15 +8944,6 @@ http-proxy-agent@^7.0.2: agent-base "^7.1.0" debug "^4.3.4" -http-signature@~1.3.6: - version "1.3.6" - resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz" - integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== - dependencies: - assert-plus "^1.0.0" - jsprim "^2.0.2" - sshpk "^1.14.1" - https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" @@ -9432,11 +9100,6 @@ inherits@2.0.3: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - ini@^1.3.5: version "1.3.8" resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" @@ -9543,13 +9206,6 @@ is-callable@^1.1.3, is-callable@^1.2.7: resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-ci@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz" - integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== - dependencies: - ci-info "^3.2.0" - is-core-module@^2.13.0, is-core-module@^2.16.1: version "2.16.1" resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" @@ -9625,14 +9281,6 @@ is-gzip@^1.0.0: resolved "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz" integrity sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ== -is-installed-globally@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" @@ -9725,11 +9373,6 @@ is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.4: dependencies: call-bound "^1.0.3" -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - is-stream@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" @@ -9764,7 +9407,7 @@ is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15, is-typed dependencies: which-typed-array "^1.1.16" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== @@ -9833,16 +9476,16 @@ isobject@^3.0.1: resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - -istanbul-lib-coverage@3.2.0, istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0, istanbul-lib-coverage@^3.2.2: +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== +istanbul-lib-coverage@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + istanbul-lib-hook@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz" @@ -9941,15 +9584,7 @@ iterator.prototype@^1.1.4: has-symbols "^1.1.0" set-function-name "^2.0.2" -iterm2-version@^4.1.0: - version "4.2.0" - resolved "https://registry.npmjs.org/iterm2-version/-/iterm2-version-4.2.0.tgz" - integrity sha512-IoiNVk4SMPu6uTcK+1nA5QaHNok2BMDLjSl5UomrOixe5g4GkylhPwuiGdw00ysSCrXAKNMfFTu+u/Lk5f6OLQ== - dependencies: - app-path "^3.2.0" - plist "^3.0.1" - -jackspeak@2.1.1, jackspeak@^2.0.3, jackspeak@^3.1.2: +jackspeak@^2.0.3: version "2.1.1" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.1.1.tgz#2a42db4cfbb7e55433c28b6f75d8b796af9669cd" integrity sha512-juf9stUEwUaILepraGOWIJTLwg48bUnBmRqd2ln2Os1sW987zeoj/hzhbvRB95oMuS2ZTpjULmdwHNX4rzZIZw== @@ -9958,6 +9593,15 @@ jackspeak@2.1.1, jackspeak@^2.0.3, jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jake@^10.8.5: version "10.8.7" resolved "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz" @@ -10002,21 +9646,6 @@ jest-haste-map@^29.5.0: optionalDependencies: fsevents "^2.3.2" -jest-image-snapshot@4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/jest-image-snapshot/-/jest-image-snapshot-4.2.0.tgz" - integrity sha512-6aAqv2wtfOgxiJeBayBCqHo1zX+A12SUNNzo7rIxiXh6W6xYVu8QyHWkada8HeRi+QUTHddp0O0Xa6kmQr+xbQ== - dependencies: - chalk "^1.1.3" - get-stdin "^5.0.1" - glur "^1.1.2" - lodash "^4.17.4" - mkdirp "^0.5.1" - pixelmatch "^5.1.0" - pngjs "^3.4.0" - rimraf "^2.6.2" - ssim.js "^3.1.1" - jest-matcher-utils@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz" @@ -10129,11 +9758,6 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - jscodeshift@^0.14.0: version "0.14.0" resolved "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz" @@ -10210,21 +9834,11 @@ json-schema-traverse@^1.0.0: resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - json5@^1.0.1, json5@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" @@ -10237,13 +9851,6 @@ json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" @@ -10253,16 +9860,6 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsprim@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz" - integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: version "3.3.5" resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" @@ -10317,7 +9914,7 @@ language-tags@^1.0.9: dependencies: language-subtag-registry "^0.3.20" -lazy-ass@1.6.0, lazy-ass@^1.6.0: +lazy-ass@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz" integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== @@ -10390,20 +9987,6 @@ lint-staged@13.0.3: string-argv "^0.3.1" yaml "^2.1.1" -listr2@^3.8.3: - version "3.14.0" - resolved "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz" - integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.16" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.5.1" - through "^2.3.8" - wrap-ansi "^7.0.0" - listr2@^4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz" @@ -10500,11 +10083,6 @@ lodash.merge@^4.6.2: resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.once@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" - integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== - lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz" @@ -10515,12 +10093,12 @@ lodash.truncate@^4.4.2: resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.0.0, log-symbols@^4.1.0: +log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -10779,7 +10357,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.25, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.25, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -10896,7 +10474,7 @@ mkdirp-classic@^0.5.2: resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@^0.5.5: +mkdirp@^0.5.4, mkdirp@^0.5.5: version "0.5.6" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -11025,11 +10603,6 @@ next@^12.3.1: "@next/swc-win32-ia32-msvc" "12.3.4" "@next/swc-win32-x64-msvc" "12.3.4" -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - no-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" @@ -11135,13 +10708,6 @@ normalize-range@^0.1.2: resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" @@ -11249,7 +10815,7 @@ object-keys@^1.1.1: resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.7: +object.assign@^4.1.4, object.assign@^4.1.7: version "4.1.7" resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== @@ -11261,7 +10827,7 @@ object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.7: has-symbols "^1.1.0" object-keys "^1.1.1" -object.entries@^1.1.5, object.entries@^1.1.9: +object.entries@^1.1.9: version "1.1.9" resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz" integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== @@ -11389,11 +10955,6 @@ os-browserify@^0.3.0: resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== -ospath@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz" - integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== - own-keys@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz" @@ -11403,11 +10964,6 @@ own-keys@^1.0.1: object-keys "^1.1.1" safe-push-apply "^1.0.0" -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" @@ -11563,11 +11119,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" @@ -11656,11 +11207,6 @@ pend@~1.2.0: resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - picocolors@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz" @@ -11686,7 +11232,7 @@ pidtree@^0.6.0: resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== -pify@^2.2.0, pify@^2.3.0: +pify@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== @@ -11706,13 +11252,6 @@ pirates@^4.0.4, pirates@^4.0.5: resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== -pixelmatch@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.3.0.tgz" - integrity sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q== - dependencies: - pngjs "^6.0.0" - pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz" @@ -11741,6 +11280,20 @@ pkg-up@^3.1.0: dependencies: find-up "^3.0.0" +playwright-core@1.56.1: + version "1.56.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.56.1.tgz#24a66481e5cd33a045632230aa2c4f0cb6b1db3d" + integrity sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ== + +playwright@1.56.1: + version "1.56.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.56.1.tgz#62e3b99ddebed0d475e5936a152c88e68be55fbf" + integrity sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw== + dependencies: + playwright-core "1.56.1" + optionalDependencies: + fsevents "2.3.2" + please-upgrade-node@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz" @@ -11748,29 +11301,11 @@ please-upgrade-node@^3.2.0: dependencies: semver-compare "^1.0.0" -plist@^3.0.1: - version "3.0.6" - resolved "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz" - integrity sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA== - dependencies: - base64-js "^1.5.1" - xmlbuilder "^15.1.1" - pluralize@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -pngjs@^3.4.0: - version "3.4.0" - resolved "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz" - integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== - -pngjs@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz" - integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg== - pnp-webpack-plugin@^1.7.0: version "1.7.0" resolved "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz" @@ -12054,11 +11589,6 @@ prettier@^3.6.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393" integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== -pretty-bytes@^5.6.0: - version "5.6.0" - resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" - integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== - pretty-error@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" @@ -12142,11 +11672,6 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz" - integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== - proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" @@ -12159,11 +11684,6 @@ ps-tree@1.2.0: dependencies: event-stream "=3.3.4" -psl@^1.1.28: - version "1.9.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" @@ -12248,13 +11768,6 @@ qs@^6.10.0, qs@^6.11.0, qs@^6.14.0: dependencies: side-channel "^1.1.0" -qs@~6.10.3: - version "6.10.5" - resolved "https://registry.npmjs.org/qs/-/qs-6.10.5.tgz" - integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== - dependencies: - side-channel "^1.0.4" - querystring-es3@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" @@ -12762,13 +12275,6 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" -request-progress@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz" - integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== - dependencies: - throttleit "^1.0.0" - require-context.macro@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/require-context.macro/-/require-context.macro-1.2.2.tgz" @@ -12858,7 +12364,7 @@ rfdc@^1.3.0: resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: +rimraf@^2.6.1, rimraf@~2.6.2: version "2.6.3" resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -12928,7 +12434,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.5.1, rxjs@^7.5.5, rxjs@^7.8.0: +rxjs@^7.5.5, rxjs@^7.8.0: version "7.8.1" resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== @@ -12985,7 +12491,7 @@ safe-regex@^2.1.1: dependencies: regexp-tree "~0.1.1" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -13087,7 +12593,7 @@ semver-regex@^3.1.2: resolved "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz" integrity sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA== -"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -13097,7 +12603,7 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: +semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: version "7.5.4" resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -13224,13 +12730,6 @@ shallowequal@^1.0.2: resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" @@ -13238,11 +12737,6 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" @@ -13452,26 +12946,6 @@ sprintf-js@~1.0.2: resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sshpk@^1.14.1: - version "1.17.0" - resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssim.js@^3.1.1: - version "3.5.0" - resolved "https://registry.npmjs.org/ssim.js/-/ssim.js-3.5.0.tgz" - integrity sha512-Aj6Jl2z6oDmgYFFbQqK7fght19bXdOxY7Tj03nF+03M9gCBAjeIiO8/PlEGMfKDwYpw4q6iBqVq2YuREorGg/g== - stable@^0.1.8: version "0.1.8" resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" @@ -13587,6 +13061,15 @@ string-argv@^0.3.1: resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -13596,9 +13079,9 @@ string-argv@^0.3.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.0: +string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -13687,6 +13170,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" @@ -13718,11 +13208,6 @@ strip-bom@^4.0.0: resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" @@ -13887,7 +13372,7 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0, supports-color@^8.1.1: +supports-color@^8.0.0: version "8.1.1" resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -14082,14 +13567,6 @@ tempy@^1.0.1: type-fest "^0.16.0" unique-string "^2.0.0" -term-img@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/term-img/-/term-img-4.1.0.tgz" - integrity sha512-DFpBhaF5j+2f7kheKFc1ajsAUUDGOaNPpKPtiIMxlbfud6mvfFZuWGnTRpaujUa5J7yl6cIw/h6nyr4mSsENPg== - dependencies: - ansi-escapes "^4.1.0" - iterm2-version "^4.1.0" - terser-webpack-plugin@^5.3.1, terser-webpack-plugin@^5.3.11: version "5.3.14" resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz" @@ -14148,11 +13625,6 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -throttleit@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz" - integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== - through2@^2.0.3: version "2.0.5" resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" @@ -14233,13 +13705,6 @@ tldts@^6.1.32: dependencies: tldts-core "^6.1.75" -tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - tmpl@1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" @@ -14284,14 +13749,6 @@ tough-cookie@^5.1.1: dependencies: tldts "^6.1.32" -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tr46@^5.1.0: version "5.1.1" resolved "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz" @@ -14379,23 +13836,11 @@ tty-browserify@^0.0.1: resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz" integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - tween-functions@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz" integrity sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA== -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" @@ -14523,6 +13968,11 @@ unbox-primitive@^1.1.0: has-symbols "^1.1.0" which-boxed-primitive "^1.1.1" +undici-types@~7.16.0: + version "7.16.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" + integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" @@ -14583,11 +14033,6 @@ universal-cookie@^4.0.2: "@types/cookie" "^0.3.3" cookie "^0.4.0" -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" @@ -14745,15 +14190,6 @@ vary@~1.1.2: resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - vite-node@3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/vite-node/-/vite-node-3.1.2.tgz" @@ -15071,7 +14507,7 @@ which-typed-array@^1.1.19: gopd "^1.2.0" has-tostringtag "^1.0.2" -which@^1.2.9, which@^1.3.1: +which@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -15105,6 +14541,15 @@ wordwrap@^1.0.0: resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" @@ -15123,6 +14568,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" @@ -15193,11 +14647,6 @@ xml2js@^0.6.2: sax ">=0.6.0" xmlbuilder "~11.0.0" -xmlbuilder@^15.1.1: - version "15.1.1" - resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz" - integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== - xmlbuilder@~11.0.0: version "11.0.1" resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz" From 7e42a5221b223e81592ba53ff449137bc29e1c16 Mon Sep 17 00:00:00 2001 From: Kyle Holmberg Date: Mon, 27 Oct 2025 12:30:19 +0700 Subject: [PATCH 3/9] add playwright and port one test --- .github/workflows/playwright.yml | 28 ++++++++++++ components/Heading/Heading.tsx | 7 ++- cypress/e2e/hashlink.spec.js | 73 -------------------------------- e2e/hashlink.spec.ts | 67 +++++++++++++++++++++++++++++ package.json | 5 ++- pages/index.tsx | 2 +- playwright.config.ts | 56 ++++++++++++++++++++++++ yarn.lock | 5 +++ 8 files changed, 163 insertions(+), 80 deletions(-) create mode 100644 .github/workflows/playwright.yml delete mode 100644 cypress/e2e/hashlink.spec.js create mode 100644 e2e/hashlink.spec.ts create mode 100644 playwright.config.ts diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml new file mode 100644 index 000000000..ed3ccb2be --- /dev/null +++ b/.github/workflows/playwright.yml @@ -0,0 +1,28 @@ +name: Playwright Tests +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] +jobs: + test: + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-node@v6 + with: + node-version-file: ".nvmrc" + cache: "yarn" + - name: Install dependencies + run: yarn install --frozen-lockfile + - name: Install Playwright Browsers + run: yarn playwright install --with-deps + - name: Run Playwright tests + run: yarn playwright test + - uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 diff --git a/components/Heading/Heading.tsx b/components/Heading/Heading.tsx index f31bfbe33..d622db608 100644 --- a/components/Heading/Heading.tsx +++ b/components/Heading/Heading.tsx @@ -51,17 +51,16 @@ function Heading({ }, className, )} + id={anchorId} > {hasHashLink ? (
Scroll Link for {text} diff --git a/cypress/e2e/hashlink.spec.js b/cypress/e2e/hashlink.spec.js deleted file mode 100644 index 764b1e64e..000000000 --- a/cypress/e2e/hashlink.spec.js +++ /dev/null @@ -1,73 +0,0 @@ -import { HERO_BANNER_H1 } from 'common/constants/testIDs'; - -describe('Hash Links', () => { - const verifyHashLink = (title, path) => { - cy.visitAndWaitFor(path); - - cy.findAllByTestId(HERO_BANNER_H1).should('be.visible'); - - cy.findAllByTestId('Hash Link').each(link => { - const { hash } = link[0]; - - cy.get(hash).scrollIntoView(); - - // The literal scrolling sometimes prevents the hash link from being visible in the viewport - // eslint-disable-next-line cypress/no-unnecessary-waiting - cy.wait(200); - - cy.get(hash).click({ force: true }); - - // once encountered a failure because the hash link was not yet in the URL - // eslint-disable-next-line cypress/no-unnecessary-waiting - cy.wait(100); - - cy.get(hash).url().should('include', hash); - }); - }; - - const someRandomPagesWithHashLinks = [ - { title: 'Home', path: '/' }, - { title: 'About', path: '/about' }, - { title: 'Corporate Sponsorship', path: '/sponsorship' }, - ]; - - someRandomPagesWithHashLinks.forEach(({ title, path }) => { - describe(`on ${title} page`, () => { - it(`will change route when clicked`, () => { - verifyHashLink(title, path); - }); - }); - - describe('on small viewports', () => { - it('is always invisible', () => { - cy.visitAndWaitFor(path); - cy.viewport('iphone-6'); - - cy.findAllByTestId('Hash Link').each(link => { - const { hash } = link[0]; - - cy.get(hash).should('not.be.visible'); - }); - }); - }); - - // TODO: Uncomment when https://github.com/cypress-io/cypress/issues/10 is resolved - // describe('on large viewports', () => { - // it('is invisible until hovered', () => { - // cy.visitAndWaitFor(path); - - // cy.findAllByTestId('Hash Link').each(link => { - // const { hash, id } = link[0]; - - // cy.get(hash) - // .scrollIntoView() - // .should('not.be.visible'); - - // cy.findByTestId(`Heading Content ${id}`).hover() - - // cy.get(hash).should('be.visible'); - // }); - // }); - // }); - }); -}); diff --git a/e2e/hashlink.spec.ts b/e2e/hashlink.spec.ts new file mode 100644 index 000000000..f1842f255 --- /dev/null +++ b/e2e/hashlink.spec.ts @@ -0,0 +1,67 @@ +import type { Page } from '@playwright/test'; +import { test, expect } from '@playwright/test'; + +const HERO_BANNER_H1 = 'HERO_BANNER_H1'; + +const someRandomPagesWithHashLinks = [ + { title: 'Home', path: '/' }, + { title: 'About', path: '/about' }, + { title: 'Corporate Sponsorship', path: '/sponsorship' }, +]; + +const makeHashLinkVisible = async ({ page, hashId }: { page: Page; hashId: string }) => { + // Locate the heading element relevant to the hashlink + const heading = page.locator(`#${hashId}`); + + // Scroll heading into view + await heading.scrollIntoViewIfNeeded(); + + // Hover over the heading to make the hash link visible + await heading.hover(); +}; + +test.describe('Hash Links', () => { + for (const { title, path } of someRandomPagesWithHashLinks) { + test(`on ${title} page, will be invisible until hovered and change route when clicked`, async ({ + page, + browserName, + }) => { + await page.goto(path); + + // Wait for navigation to complete + await expect( + page.getByTestId(browserName === 'chromium' ? 'Desktop Nav' : 'Mobile Nav Container'), + ).toBeVisible(); + await expect(page).toHaveURL(new RegExp(path)); + + // Verify hero banner is visible + await expect(page.getByTestId(HERO_BANNER_H1).first()).toBeVisible(); + + // Get all hash links on the page + const hashLinks = await page.getByTestId('Hash Link').all(); + + for (const link of hashLinks) { + const hash = await link.getAttribute('href'); + + // This is to satiate TS + // eslint-disable-next-line playwright/no-conditional-in-test + if (!hash) continue; + + const hashId = hash.replace(/^.*#/, ''); + + await expect(link).toBeHidden(); + + await makeHashLinkVisible({ page, hashId }); + + await expect(link).toBeVisible(); + + // On mobile safari, clicking elements positioned outside viewport can fail + // Use evaluate to navigate directly by clicking via JavaScript + await link.evaluate((el: HTMLAnchorElement) => el.click()); + + // Verify URL includes the hash + await expect(page).toHaveURL(new RegExp(`${path}#${hashId}`)); + } + }); + } +}); diff --git a/package.json b/package.json index b5e10c296..6738fdc4d 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "start": "next start -p 3000", "storybook": "storybook dev -p 9001 -c .storybook", "storybook:build": "storybook build -c .storybook -o .storybook-dist", - "test:e2e": "playwright test", - "test:e2e:headless": "playwright test --headed", + "test:e2e": "playwright test --headed", + "test:e2e:headless": "playwright test", "test:e2e:update-snaps": "playwright test --update-snapshots", "test:e2e:ci": "playwright test --ci", "test": "vitest --run", @@ -134,6 +134,7 @@ "chromatic": "^6.8.0", "cross-env": "^7.0.3", "css-loader": "^6.7.1", + "dotenv": "^17.2.3", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.32.0", diff --git a/pages/index.tsx b/pages/index.tsx index bd24f5cc8..0614b5360 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -41,7 +41,7 @@ function Home() { +

We serve our veterans, service members, and their families, work alongside their diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 000000000..a9cd97995 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,56 @@ +import path from 'path'; +import { defineConfig, devices } from '@playwright/test'; +import dotenv from 'dotenv'; + +dotenv.config({ path: path.resolve(__dirname, '.env') }); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './e2e', + + /* Run tests in files in parallel */ + fullyParallel: true, + + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + + /* Opt out of parallel tests on CI. */ + // workers: process.env.CI ? 1 : undefined, + + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: process.env.CI ? 'github' : 'html', + + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('')`. */ + baseURL: 'http://localhost:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + { + name: 'Mobile Safari', + use: { ...devices['iPhone 14 Pro'] }, + }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'yarn dev', + url: 'http://localhost:3000', + reuseExistingServer: !process.env.CI, + timeout: 60_000, + }, +}); diff --git a/yarn.lock b/yarn.lock index dfe9409a2..271c39a85 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7084,6 +7084,11 @@ dotenv@^16.0.0: resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.3.0.tgz" integrity sha512-tHB+hmf8MRCkT3VVivGiG8kq9HiGTmQ3FzOKgztfpJQH1IWuZTOvKSJmHNnQPowecAmkCJhLrxdPhOr06LLqIQ== +dotenv@^17.2.3: + version "17.2.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.2.3.tgz#ad995d6997f639b11065f419a22fabf567cdb9a2" + integrity sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w== + dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" From ef038b61c34ace047e02ffa51cb5464a9e558a60 Mon Sep 17 00:00:00 2001 From: Kyle Holmberg Date: Mon, 27 Oct 2025 16:09:29 +0700 Subject: [PATCH 4/9] Cypress -> Playwright and no more babel! --- .babelrc.js | 37 -- .circleci/config.yml | 39 -- .eslintignore | 2 - .eslintrc.js | 8 +- .gitignore | 3 - components/Form/MultiStepForm.tsx | 1 + cypress.config.js | 28 -- cypress/README.md | 13 - cypress/e2e/faq.spec.js | 31 -- cypress/e2e/join.spec.ts | 362 -------------- cypress/e2e/podcast.spec.js | 11 - cypress/e2e/team.spec.js | 12 - cypress/fixtures/example.json | 5 - cypress/plugins/index.js | 69 --- cypress/support/commands.js | 81 --- cypress/support/e2e.js | 24 - cypress/tsconfig.json | 15 - e2e/faq.spec.ts | 15 + e2e/hashlink.spec.ts | 34 +- e2e/join.spec.ts | 400 +++++++++++++++ e2e/podcast.spec.ts | 15 + e2e/team.spec.ts | 13 + nyc.config.js | 9 - package.json | 26 +- pages/api/__coverage__.js | 1 - pages/podcast.tsx | 5 +- playwright.config.ts | 5 + test-utils/mockGenerators/mockUser.ts | 14 +- vitest.config.mts | 2 +- yarn.lock | 692 ++------------------------ 30 files changed, 516 insertions(+), 1456 deletions(-) delete mode 100644 .babelrc.js delete mode 100644 cypress.config.js delete mode 100644 cypress/README.md delete mode 100644 cypress/e2e/faq.spec.js delete mode 100644 cypress/e2e/join.spec.ts delete mode 100644 cypress/e2e/podcast.spec.js delete mode 100644 cypress/e2e/team.spec.js delete mode 100644 cypress/fixtures/example.json delete mode 100644 cypress/plugins/index.js delete mode 100644 cypress/support/commands.js delete mode 100644 cypress/support/e2e.js delete mode 100644 cypress/tsconfig.json create mode 100644 e2e/faq.spec.ts create mode 100644 e2e/join.spec.ts create mode 100644 e2e/podcast.spec.ts create mode 100644 e2e/team.spec.ts delete mode 100644 nyc.config.js delete mode 100644 pages/api/__coverage__.js diff --git a/.babelrc.js b/.babelrc.js deleted file mode 100644 index 4e9ca959f..000000000 --- a/.babelrc.js +++ /dev/null @@ -1,37 +0,0 @@ -const pathAliases = require('./pathAliases'); - -module.exports = { - env: { - production: { - presets: ['next/babel'], - plugins: ['add-react-displayname'], - }, - development: { - presets: ['next/babel'], - plugins: ['istanbul'], - }, - test: { - presets: [ - [ - 'next/babel', - { - 'preset-env': { - modules: 'commonjs', - }, - }, - ], - '@babel/preset-typescript', - ], - }, - }, - plugins: [ - [ - 'module-resolver', - { - root: ['./'], - alias: pathAliases, - }, - ], - 'macros', - ], -}; diff --git a/.circleci/config.yml b/.circleci/config.yml index ab479dd86..92ef311a3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -65,10 +65,6 @@ jobs: - run: name: Run tests command: yarn test:ci - - persist_to_workspace: - root: << pipeline.parameters.workspace_root >> - paths: - - project/vitest-coverage lint: executor: default @@ -82,28 +78,6 @@ jobs: command: | yarn lint:ci - report_coverage: - executor: default - steps: - - checkout - - *attach_workspace - - *restore_cache - - *yarn_install - - run: - name: Merge reports into one file - command: | - mkdir reports - mkdir .nyc_output - ls -al cypress-coverage - cp cypress-coverage/coverage.node-*.json reports - cp vitest-coverage/coverage-final.json reports/from-vitest.json - yarn nyc merge reports - mv coverage.json .nyc_output/out.json - - run: - name: Convert finalized report from JSON to lcov - command: | - yarn nyc report --reporter lcov --report-dir coverage - workflows: default: jobs: @@ -136,16 +110,3 @@ workflows: group: 'all tests' # name this group "all tests" on the dashboard start: 'yarn dev' # start server before running tests wait-on: http://localhost:3000 # wait until server is ready - post-steps: - - run: - name: Get each parallelized node's coverage report - command: cp cypress-coverage/coverage-final.json "cypress-coverage/coverage.node-$CIRCLE_NODE_INDEX.json" - - persist_to_workspace: - root: << pipeline.parameters.workspace_root >> - paths: - - project/cypress-coverage - - - report_coverage: - requires: - - unit_tests - - integration_tests diff --git a/.eslintignore b/.eslintignore index fe1dc2fb0..754e83b29 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,8 +1,6 @@ node_modules package.json yarn.lock -.babelrc -**/.babelrc .next .github bin diff --git a/.eslintrc.js b/.eslintrc.js index 91ed10719..6fe8c0731 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -16,7 +16,7 @@ module.exports = { es6: true, node: true, }, - parser: '@babel/eslint-parser', + parser: '@typescript-eslint/parser', plugins: ['unicorn', '@operation_code/custom-rules', 'import', 'lodash', '@typescript-eslint'], rules: { // Import Rules @@ -268,6 +268,12 @@ module.exports = { 'vitest/expect-expect': 'off', 'vitest/valid-expect': 'off', 'no-unused-expressions': ['off'], + 'playwright/expect-expect': [ + 'warn', + { + assertFunctionNames: ['expect', 'assertError', 'assertFailedLogin'], + }, + ], }, }, { diff --git a/.gitignore b/.gitignore index 5930422e6..054e0fead 100644 --- a/.gitignore +++ b/.gitignore @@ -28,9 +28,6 @@ cypress-coverage vitest-coverage reports -# nyc test coverage -.nyc_output - # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt diff --git a/components/Form/MultiStepForm.tsx b/components/Form/MultiStepForm.tsx index 913cf2d41..d4c6dc692 100644 --- a/components/Form/MultiStepForm.tsx +++ b/components/Form/MultiStepForm.tsx @@ -154,6 +154,7 @@ export function MultiStepForm< type="submit" theme="secondary" disabled={formikBag.isSubmitting} + data-loading={formikBag.isSubmitting} data-testid={MULTI_STEP_STEP_BUTTON} className={cx('group', isFirstStep && 'w-full')} > diff --git a/cypress.config.js b/cypress.config.js deleted file mode 100644 index a6d8b8cf4..000000000 --- a/cypress.config.js +++ /dev/null @@ -1,28 +0,0 @@ -/* eslint-disable global-require */ -const { defineConfig } = require('cypress'); - -module.exports = defineConfig({ - projectId: 'dbquo6', - viewportWidth: 1600, - viewportHeight: 1200, - requestTimeout: 10000, - env: { - RETRIES: 2, - codeCoverage: { - url: '/api/__coverage__', - }, - }, - retries: { - runMode: 2, - openMode: 2, - }, - e2e: { - // We've imported your old cypress plugins here. - // You may want to clean this up later by importing these. - setupNodeEvents(on, config) { - return require('./cypress/plugins/index')(on, config); - }, - baseUrl: 'http://localhost:3000', - specPattern: 'cypress/e2e/**/*.{js,jsx,ts,tsx}', - }, -}); diff --git a/cypress/README.md b/cypress/README.md deleted file mode 100644 index 9ff6be463..000000000 --- a/cypress/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Cypress - -We use Cypress for end-to-end (e2e) and integration testing. - -It's awesome. - -We don't want to spend time re-listing documentation, but if you'd like to learn how to write solid e2e tests with Cypress, we recommend using the following resources: - -1. [Brian Mann speaks about Cypress at Assert.js Conference](https://www.youtube.com/watch?v=5XQOK0v_YRE). See a demo of Cypress, plus watch the creator of the library walk through implementing sturdy e2e testing of a complex web application. - -2. [Best Practices with Cypress](https://docs.cypress.io/guides/references/best-practices.html). The entire Cypress documentation is well-written and thorough, but this particular section is very important. - -3. [Cypress Example Recipes](https://github.com/cypress-io/cypress-example-recipes). Learn from a bunch of examples! diff --git a/cypress/e2e/faq.spec.js b/cypress/e2e/faq.spec.js deleted file mode 100644 index 2ab934ddc..000000000 --- a/cypress/e2e/faq.spec.js +++ /dev/null @@ -1,31 +0,0 @@ -import { ACCORDION_CONTENT, ACCORDION_TOGGLE_BUTTON } from 'common/constants/testIDs'; - -describe('faq', () => { - beforeEach(() => { - cy.visitAndWaitFor('/faq'); - cy.get('h1').should('have.text', 'Frequently Asked Questions'); - }); - - it('reveals text after clicking "SHOW"', () => { - cy.findByTestId(ACCORDION_CONTENT).should('not.exist'); - cy.findAllByTestId(ACCORDION_TOGGLE_BUTTON).then(([firstButton]) => firstButton.click()); - cy.findAllByTestId(ACCORDION_CONTENT).should('be.visible'); - }); - - // TODO: Enable when native keyboard events are supported by Cypress - // it('should be keyboard navigable', () => { - // cy.get('article') - // .first() - // .find('[data-testid="Accordion Content"]') - // .should('not.be.visible'); - - // cy.get('article') - // .first() - // .click('{tab}{enter}'); // tab isnt supported yet 😭 - - // cy.get('article') - // .first() - // .find('[data-testid="Accordion Content"]') - // .should('be.visible'); - // }); -}); diff --git a/cypress/e2e/join.spec.ts b/cypress/e2e/join.spec.ts deleted file mode 100644 index 851e68ea5..000000000 --- a/cypress/e2e/join.spec.ts +++ /dev/null @@ -1,362 +0,0 @@ -import existingUser from 'test-utils/mocks/existingUser'; -import { mockUser } from 'test-utils/mockGenerators/mockUser'; -import { validationErrorMessages } from 'common/constants/messages'; -import { - SUCCESS_PAGE_MESSAGE, - REGISTRATION_FORM_INITIAL_SUBMIT_BUTTON, -} from 'common/constants/testIDs'; - -const getValidUser = () => mockUser(); -const inputFields = { - email: 'Email*', - confirmEmail: 'Confirm Email*', - firstName: 'First Name*', - lastName: 'Last Name*', - zipcode: 'Zipcode*', - codeOfConduct: /Code of Conduct/, - slackGuidelines: /Slack Community Guidelines/, -}; - -const assertError = ({ - numberOfErrors = 1, - errorMessage = validationErrorMessages.required, -} = {}) => { - cy.get('#__next') // // avoid rest of UI because next announcer exists - .findAllByRole('alert') - .should('have.length', numberOfErrors) - .should('contain', errorMessage); -}; - -const assertFailedLogin = ({ - numberOfErrors = 1, - errorMessage = validationErrorMessages.required, -} = {}) => { - cy.findByTestId(REGISTRATION_FORM_INITIAL_SUBMIT_BUTTON).click(); - cy.url().should('contain', '/join'); - assertError({ numberOfErrors, errorMessage }); - cy.getCookies().should('have.length', 0); -}; - -describe('join', () => { - beforeEach(() => { - cy.server(); - cy.visitAndWaitFor('/join'); - cy.getCookies().should('have.length', 0); - cy.get('h1').should('have.text', 'Join'); - }); - - /** - * Test Invalid Entries - */ - - /** - * E-mail & ConfrimEmail fields - */ - it('should NOT be able to register when blurring past email', () => { - const validUser = getValidUser(); - cy.findByLabelText(inputFields.email).focus(); - cy.findByLabelText(inputFields.email).blur(); - assertError(); - - cy.findByLabelText(inputFields.confirmEmail).type(validUser.email); - cy.findByLabelText(inputFields.firstName).type(validUser.firstName); - cy.findByLabelText(inputFields.lastName).type(validUser.lastName); - cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); - cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); - cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); - - assertFailedLogin({ numberOfErrors: 2 }); - }); - - it('should NOT be able to register when email contains only spaces', () => { - const validUser = getValidUser(); - cy.findByLabelText(inputFields.email).type(' '); - cy.findByLabelText(inputFields.email).blur(); - assertError(); - - cy.findByLabelText(inputFields.confirmEmail).type(validUser.email); - cy.findByLabelText(inputFields.firstName).type(validUser.firstName); - cy.findByLabelText(inputFields.lastName).type(validUser.lastName); - cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); - cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); - cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); - - assertFailedLogin({ numberOfErrors: 2 }); - }); - - it('should NOT be able to register with an invalid email', () => { - const validUser = getValidUser(); - const invalidUser = mockUser('invalidemail@.com'); - - cy.findByLabelText(inputFields.email).type(invalidUser.email); - cy.findByLabelText(inputFields.email).blur(); - assertError({ errorMessage: validationErrorMessages.email }); - - cy.findByLabelText(inputFields.confirmEmail).type(invalidUser.email); - cy.findByLabelText(inputFields.firstName).type(invalidUser.firstName); - cy.findByLabelText(inputFields.lastName).type(invalidUser.lastName); - cy.findByLabelText(inputFields.zipcode).type(invalidUser.zipcode); - cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); - cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); - - assertFailedLogin({ errorMessage: validationErrorMessages.email }); - }); - - it('should NOT be able to register when blurring past confirmEmail', () => { - const validUser = getValidUser(); - cy.findByLabelText(inputFields.email).type(validUser.email); - - cy.findByLabelText(inputFields.confirmEmail).focus(); - cy.findByLabelText(inputFields.confirmEmail).blur(); - assertError(); - - cy.findByLabelText(inputFields.firstName).type(validUser.firstName); - cy.findByLabelText(inputFields.lastName).type(validUser.lastName); - cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); - cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); - cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); - - assertFailedLogin(); - }); - - it('should NOT be able to register when emails do not match', () => { - const validUser = getValidUser(); - cy.findByLabelText(inputFields.email).type(validUser.email); - cy.findByLabelText(inputFields.confirmEmail).type(existingUser.email); - - // Need to do next input too so we blur off the email fields allowing errors to render - cy.findByLabelText(inputFields.firstName).type(validUser.firstName); - - assertError({ errorMessage: validationErrorMessages.emailsMatch }); - - cy.findByLabelText(inputFields.lastName).type(validUser.lastName); - cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); - cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); - cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); - - assertFailedLogin({ errorMessage: validationErrorMessages.emailsMatch }); - }); - - it('should NOT be able to register with an existing email', () => { - const validUser = getValidUser(); - cy.findByLabelText(inputFields.email).type(existingUser.email); - cy.findByLabelText(inputFields.confirmEmail).type(existingUser.email); - cy.findByLabelText(inputFields.firstName).type(existingUser.firstName); - cy.findByLabelText(inputFields.lastName).type(existingUser.lastName); - cy.findByLabelText(inputFields.zipcode).type(existingUser.zipcode); - cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); - cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); - - assertFailedLogin({ errorMessage: validationErrorMessages.emailExists }); - }); - - /** - * FirstName & LastName Fields - */ - it('should NOT be able to register when blurring past firstName', () => { - const validUser = getValidUser(); - cy.findByLabelText(inputFields.email).type(validUser.email); - cy.findByLabelText(inputFields.confirmEmail).type(validUser.email); - - cy.findByLabelText(inputFields.firstName).focus(); - cy.findByLabelText(inputFields.firstName).blur(); - assertError(); - - cy.findByLabelText(inputFields.lastName).type(validUser.lastName); - cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); - cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); - cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); - - assertFailedLogin(); - }); - - it('should NOT be able to register when firstName contains only spaces', () => { - const validUser = getValidUser(); - cy.findByLabelText(inputFields.email).type(validUser.email); - cy.findByLabelText(inputFields.confirmEmail).type(validUser.email); - - cy.findByLabelText(inputFields.firstName).type(' '); - cy.findByLabelText(inputFields.firstName).blur(); - assertError(); - - cy.findByLabelText(inputFields.lastName).type(validUser.lastName); - cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); - cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); - cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); - - assertFailedLogin(); - }); - - it('should NOT be able to register when blurring past lastName', () => { - const validUser = getValidUser(); - cy.findByLabelText(inputFields.email).type(validUser.email); - cy.findByLabelText(inputFields.confirmEmail).type(validUser.email); - cy.findByLabelText(inputFields.firstName).type(validUser.firstName); - - cy.findByLabelText(inputFields.lastName).focus(); - cy.findByLabelText(inputFields.lastName).blur(); - assertError(); - - cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); - cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); - cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); - - assertFailedLogin(); - }); - - it('should NOT be able to register when lastName contains only spaces', () => { - const validUser = getValidUser(); - cy.findByLabelText(inputFields.email).type(validUser.email); - cy.findByLabelText(inputFields.confirmEmail).type(validUser.email); - cy.findByLabelText(inputFields.firstName).type(validUser.firstName); - - cy.findByLabelText(inputFields.lastName).type(' '); - cy.findByLabelText(inputFields.lastName).blur(); - assertError(); - - cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); - cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); - cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); - - assertFailedLogin(); - }); - - /** - * Zipcode field - */ - it('should NOT be able to register when blurring past zipcode', () => { - const validUser = getValidUser(); - cy.findByLabelText(inputFields.email).type(validUser.email); - cy.findByLabelText(inputFields.confirmEmail).type(validUser.email); - cy.findByLabelText(inputFields.firstName).type(validUser.firstName); - cy.findByLabelText(inputFields.lastName).type(validUser.lastName); - - cy.findByLabelText(inputFields.zipcode).focus(); - cy.findByLabelText(inputFields.zipcode).blur(); - assertError(); - - cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); - cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); - - assertFailedLogin(); - }); - - it('should NOT be able to register when zipcode contains only spaces', () => { - const validUser = getValidUser(); - cy.findByLabelText(inputFields.email).type(validUser.email); - cy.findByLabelText(inputFields.confirmEmail).type(validUser.email); - cy.findByLabelText(inputFields.firstName).type(validUser.firstName); - cy.findByLabelText(inputFields.lastName).type(validUser.lastName); - - cy.findByLabelText(inputFields.zipcode).type(' '); - cy.findByLabelText(inputFields.zipcode).blur(); - assertError(); - - cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); - cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); - - assertFailedLogin(); - }); - - it('should NOT be able to register when Code of Conduct is not agreed to', () => { - const validUser = getValidUser(); - cy.findByLabelText(inputFields.email).type(validUser.email); - cy.findByLabelText(inputFields.confirmEmail).type(validUser.email); - cy.findByLabelText(inputFields.firstName).type(validUser.firstName); - cy.findByLabelText(inputFields.lastName).type(validUser.lastName); - cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); - - cy.findByLabelText(inputFields.codeOfConduct).focus(); - cy.findByLabelText(inputFields.codeOfConduct).blur(); - cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); - - assertError({ numberOfErrors: 1, errorMessage: validationErrorMessages.codeOfConduct }); - assertFailedLogin({ numberOfErrors: 1, errorMessage: validationErrorMessages.codeOfConduct }); - }); - - it('should NOT be able to register when Slack Community Guidelines is not agreed to', () => { - const validUser = getValidUser(); - cy.findByLabelText(inputFields.email).type(validUser.email); - cy.findByLabelText(inputFields.confirmEmail).type(validUser.email); - cy.findByLabelText(inputFields.firstName).type(validUser.firstName); - cy.findByLabelText(inputFields.lastName).type(validUser.lastName); - cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); - cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); - - cy.findByLabelText(inputFields.slackGuidelines).focus(); - cy.findByLabelText(inputFields.slackGuidelines).blur(); - - assertError({ numberOfErrors: 1, errorMessage: validationErrorMessages.slackGuidelines }); - assertFailedLogin({ numberOfErrors: 1, errorMessage: validationErrorMessages.slackGuidelines }); - }); - - /** - * Registration without all fields - */ - it('should NOT be able to register without filling all required fields', () => { - assertFailedLogin({ numberOfErrors: 7 }); - }); - - /** - * Test Valid User - */ - it('should be able to register with valid data', () => { - const validUser = getValidUser(); - cy.findByLabelText(inputFields.email).type(validUser.email); - cy.findByLabelText(inputFields.confirmEmail).type(validUser.email); - cy.findByLabelText(inputFields.firstName).type(validUser.firstName); - cy.findByLabelText(inputFields.lastName).type(validUser.lastName); - cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); - cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); - cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); - cy.findByTestId(REGISTRATION_FORM_INITIAL_SUBMIT_BUTTON).click(); - - cy.url({ timeout: 20000 }).should('contain', '/join/form'); - cy.get('h1').should('have.text', 'Update Profile'); - - // Professional Details - cy.findByLabelText('Employment Status*') - .should('exist') - .type('Full-Time{enter}', { force: true }); - cy.findByLabelText('Company Name').should('exist').type('Test Company'); - cy.findByLabelText('Company Role').should('exist').type('Test Title'); - cy.get('form').submit(); - - // Military Status - cy.findByLabelText('Military Affiliation*').should('exist').type('Non{enter}', { force: true }); - cy.get('form').submit(); - - // Assert that we see Personal Details (not Military Details) - cy.get('form').findByText('Personal Details').should('exist'); - - // Go back - cy.get('form').findAllByRole('button').filter('[type="button"]').click(); - - // Military Status - cy.findByLabelText('Military Affiliation*') - .should('exist') - .type('Active{enter}', { force: true }); - cy.get('form').submit(); - - // Military Details - cy.findByLabelText('Branch Of Service*').should('exist').type('Army{enter}', { force: true }); - cy.findByLabelText('Pay Grade*').should('exist').type('E1-E5{enter}', { force: true }); - cy.get('form').submit(); - - // Personal Details - cy.findByLabelText('Join Reason*') - .should('exist') - .type('I’d like access to jobs{enter}', { force: true }); - cy.findByLabelText('Join Reason*').type('I’d like access to re{enter}', { force: true }); - cy.findByLabelText('Gender*').should('exist').type('Male{enter}', { force: true }); - cy.findByLabelText('Ethnicity*').should('exist').type('Caucasian{enter}', { force: true }); - cy.findByLabelText('Ethnicity*').type('Hispanic{enter}', { force: true }); - cy.findByLabelText('Education Level*') - .should('exist') - .type('High school{enter}', { force: true }); - cy.get('form').submit(); - - // Success UI - cy.findByTestId(SUCCESS_PAGE_MESSAGE).should('exist'); - }); -}); diff --git a/cypress/e2e/podcast.spec.js b/cypress/e2e/podcast.spec.js deleted file mode 100644 index 547c31144..000000000 --- a/cypress/e2e/podcast.spec.js +++ /dev/null @@ -1,11 +0,0 @@ -describe('podcast', () => { - beforeEach(() => { - cy.server(); - cy.visitAndWaitFor('/podcast'); - cy.get('h1').should('have.text', 'Podcast'); - }); - - it('renders many podcast cards', () => { - cy.findAllByTestId('Podcast Card').should('have.length.greaterThan', 0); - }); -}); diff --git a/cypress/e2e/team.spec.js b/cypress/e2e/team.spec.js deleted file mode 100644 index c1bc3ae45..000000000 --- a/cypress/e2e/team.spec.js +++ /dev/null @@ -1,12 +0,0 @@ -describe('team', () => { - beforeEach(() => { - cy.server(); - cy.visitAndWaitFor('/team'); - cy.get('h1').should('have.text', 'The Team'); - }); - - it('renders many board members', () => { - // 3 is arbitrary, but it confirms that the API is working - cy.get('article').should('have.length.greaterThan', 3); - }); -}); diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json deleted file mode 100644 index 02e425437..000000000 --- a/cypress/fixtures/example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" -} diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js deleted file mode 100644 index 283e21a6f..000000000 --- a/cypress/plugins/index.js +++ /dev/null @@ -1,69 +0,0 @@ -// *********************************************************** -// This example plugins/index.js can be used to load plugins -// -// You can change the location of this file or turn off loading -// the plugins file with the 'pluginsFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/plugins-guide -// *********************************************************** -const { addMatchImageSnapshotPlugin } = require('cypress-image-snapshot/plugin'); -const webpack = require('@cypress/webpack-preprocessor'); -const { DefinePlugin } = require('webpack'); -// This function is called when a project is opened or re-opened (e.g. due to -// the project's config changing) -// eslint-disable-next-line no-unused-vars -/* eslint-disable global-require */ -module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config - - if (!!process.env.CI) { - addMatchImageSnapshotPlugin(on, config); - require('@cypress/code-coverage/task')(on, config); - on('file:preprocessor', require('@cypress/code-coverage/use-babelrc')); - } - - // this fixes aliasing in cypres e2e tests - // https://github.com/cypress-io/cypress/issues/3262#issuecomment-462646891 - on( - 'file:preprocessor', - webpack({ - webpackOptions: { - resolve: { - alias: require('../../pathAliases'), - extensions: ['.js', '.ts', '.tsx'], - }, - plugins: [ - new DefinePlugin({ - 'process.env': { - NODE_ENV: JSON.stringify(process.env.NODE_ENV), - PRODUCTION_DEPLOYMENT: JSON.stringify(false), - }, - }), - ], - module: { - rules: [ - { - test: /\.(js|ts|tsx)$/, - exclude: [/node_modules/], - use: [ - { - loader: 'babel-loader', - options: { - presets: ['@babel/preset-typescript'], - }, - }, - ], - }, - ], - }, - }, - watchOptions: {}, - }), - ); - - console.log(process.env); - - return config; -}; diff --git a/cypress/support/commands.js b/cypress/support/commands.js deleted file mode 100644 index 7b142ff72..000000000 --- a/cypress/support/commands.js +++ /dev/null @@ -1,81 +0,0 @@ -// *********************************************** -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add("login", (email, password) => { ... }) -import '@testing-library/cypress/add-commands'; -import { addMatchImageSnapshotCommand } from 'cypress-image-snapshot/command'; -import existingUser from '../../test-utils/mocks/existingUser'; -import { apiUrl } from '../../common/config/environment'; - -Cypress.Commands.add('visitAndWaitFor', path => { - cy.visit(path); - cy.findByTestId('Desktop Nav').should('exist').and('be.visible'); - cy.url().should('contain', path); -}); - -// Use `cy.login()` to quickly login for testing authenticated routes -Cypress.Commands.add('login', () => { - cy.request({ - method: 'POST', - url: `${apiUrl}/auth/login/`, - body: { - ...existingUser, - }, - }).then(({ body: { token } }) => { - cy.setCookie('token', token); - }); -}); - -addMatchImageSnapshotCommand({ - failureThreshold: 0.03, - failureThresholdType: 'percent', - customDiffConfig: { threshold: 0.1 }, - capture: 'viewport', -}); - -Cypress.Commands.add('setResolution', size => { - if (Cypress._.isArray(size)) { - cy.viewport(size[0], size[1]); - } else { - cy.viewport(size); - } -}); - -Cypress.Commands.add('checkCustomDataAttribute', (attribute, value) => { - const attributeWithoutBrackets = attribute.replace(/[[\]]/g, ''); - - cy.get(attribute).invoke('attr', attributeWithoutBrackets).should('contain', value); -}); - -Cypress.Commands.add('findSelectByLabelText', (label, options = {}) => { - cy.findByText(label) - .invoke('attr', 'for') - .then(name => { - if (options.edit) { - cy.get(`input#react-select-${name}-input`); - } else { - cy.get(`input[name="${name}"]`); - } - }); -}); - -// -// -- This is a child command -- -// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This is will overwrite an existing command -- -// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) diff --git a/cypress/support/e2e.js b/cypress/support/e2e.js deleted file mode 100644 index 0bc46910f..000000000 --- a/cypress/support/e2e.js +++ /dev/null @@ -1,24 +0,0 @@ -// *********************************************************** -// This example support/index.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import './commands'; -import '@cypress/code-coverage/support'; - -// Alternatively you can use CommonJS syntax: -// require('./commands') - -// beforeEach(() => { -// }); diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json deleted file mode 100644 index 752ed4712..000000000 --- a/cypress/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "paths": { - "common/*": ["../common/*"], - "components/*": ["../components/*"], - "pages/*": ["../pages/*"], - "public/*": ["../public/*"], - "scripts/*": ["../scripts/*"], - "static/*": ["../public/static/*"], - "styles/*": ["../styles/*"], - "test-utils/*": ["../test-utils/*"] - }, - "types": ["cypress", "@testing-library/cypress"] - } -} diff --git a/e2e/faq.spec.ts b/e2e/faq.spec.ts new file mode 100644 index 000000000..2d7fee576 --- /dev/null +++ b/e2e/faq.spec.ts @@ -0,0 +1,15 @@ +import { test, expect } from '@playwright/test'; +import { ACCORDION_CONTENT, ACCORDION_TOGGLE_BUTTON } from '../common/constants/testIDs'; + +test.describe('faq', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/faq'); + await expect(page.locator('h1')).toHaveText('Frequently Asked Questions'); + }); + + test('reveals text after clicking "SHOW"', async ({ page }) => { + await expect(page.getByTestId(ACCORDION_CONTENT).first()).toBeHidden(); + await page.getByTestId(ACCORDION_TOGGLE_BUTTON).first().click(); + await expect(page.getByTestId(ACCORDION_CONTENT).first()).toBeVisible(); + }); +}); diff --git a/e2e/hashlink.spec.ts b/e2e/hashlink.spec.ts index f1842f255..e24d7a968 100644 --- a/e2e/hashlink.spec.ts +++ b/e2e/hashlink.spec.ts @@ -1,4 +1,3 @@ -import type { Page } from '@playwright/test'; import { test, expect } from '@playwright/test'; const HERO_BANNER_H1 = 'HERO_BANNER_H1'; @@ -9,30 +8,19 @@ const someRandomPagesWithHashLinks = [ { title: 'Corporate Sponsorship', path: '/sponsorship' }, ]; -const makeHashLinkVisible = async ({ page, hashId }: { page: Page; hashId: string }) => { - // Locate the heading element relevant to the hashlink - const heading = page.locator(`#${hashId}`); - - // Scroll heading into view - await heading.scrollIntoViewIfNeeded(); - - // Hover over the heading to make the hash link visible - await heading.hover(); -}; - test.describe('Hash Links', () => { for (const { title, path } of someRandomPagesWithHashLinks) { test(`on ${title} page, will be invisible until hovered and change route when clicked`, async ({ page, browserName, + hasTouch, }) => { await page.goto(path); - // Wait for navigation to complete + // Wait for navigation to complete, allowing us to know the page is interactive await expect( page.getByTestId(browserName === 'chromium' ? 'Desktop Nav' : 'Mobile Nav Container'), ).toBeVisible(); - await expect(page).toHaveURL(new RegExp(path)); // Verify hero banner is visible await expect(page.getByTestId(HERO_BANNER_H1).first()).toBeVisible(); @@ -47,11 +35,25 @@ test.describe('Hash Links', () => { // eslint-disable-next-line playwright/no-conditional-in-test if (!hash) continue; + // Verify the hash link is not visible initially + await expect(link).toBeHidden(); + const hashId = hash.replace(/^.*#/, ''); - await expect(link).toBeHidden(); + // Locate the heading element relevant to the hashlink + const heading = page.locator(`#${hashId}`); - await makeHashLinkVisible({ page, hashId }); + // Scroll heading into view + await heading.scrollIntoViewIfNeeded(); + + // Hover over the heading to make the hash link visible + // eslint-disable-next-line playwright/no-conditional-in-test + if (hasTouch) { + await heading.hover(); + await heading.tap(); + } else { + await heading.hover(); + } await expect(link).toBeVisible(); diff --git a/e2e/join.spec.ts b/e2e/join.spec.ts new file mode 100644 index 000000000..1f3affc2b --- /dev/null +++ b/e2e/join.spec.ts @@ -0,0 +1,400 @@ +import { test, expect, type Page } from '@playwright/test'; +import existingUser from '../test-utils/mocks/existingUser'; +import { mockUser } from '../test-utils/mockGenerators/mockUser'; +import { validationErrorMessages } from '../common/constants/messages'; +import { + SUCCESS_PAGE_MESSAGE, + REGISTRATION_FORM_INITIAL_SUBMIT_BUTTON, + MULTI_STEP_STEP_BUTTON, + MULTI_STEP_SUBMIT_BUTTON, +} from '../common/constants/testIDs'; + +const getValidUser = () => mockUser(); + +const getInput = (page: Page, fieldName: string) => page.locator(`input[name="${fieldName}"]`); +const getCheckbox = (page: Page, regex: RegExp) => page.getByLabel(regex); + +const assertError = async ( + page: Page, + { + numberOfErrors = 1, + errorMessage = validationErrorMessages.required, + }: { numberOfErrors?: number; errorMessage?: string } = {}, +) => { + const alerts = page.locator('#__next').getByRole('alert'); + await expect(alerts).toHaveCount(numberOfErrors); + await expect(alerts.first()).toContainText(errorMessage); +}; + +const assertFailedLogin = async ( + page: Page, + { + numberOfErrors = 1, + errorMessage = validationErrorMessages.required, + }: { numberOfErrors?: number; errorMessage?: string } = {}, +) => { + await page.getByTestId(REGISTRATION_FORM_INITIAL_SUBMIT_BUTTON).click(); + await expect(page).toHaveURL(/\/join/); + await assertError(page, { numberOfErrors, errorMessage }); + const cookies = await page.context().cookies(); + expect(cookies).toHaveLength(0); +}; + +test.describe('join', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/join'); + const cookies = await page.context().cookies(); + expect(cookies).toHaveLength(0); + await expect(page.locator('h1')).toHaveText('Join'); + }); + + /** + * Test Invalid Entries + */ + + /** + * E-mail & ConfrimEmail fields + */ + test('should NOT be able to register when blurring past email', async ({ page }) => { + const validUser = getValidUser(); + await getInput(page, 'email').focus(); + await getInput(page, 'email').blur(); + await assertError(page); + + await getInput(page, 'confirm-email').fill(validUser.email); + await getInput(page, 'firstName').fill(validUser.firstName); + await getInput(page, 'lastName').fill(validUser.lastName); + await getInput(page, 'zipcode').fill(String(validUser.zipcode)); + await getCheckbox(page, /Code of Conduct/).check(); + await getCheckbox(page, /Slack Community Guidelines/).check(); + + await assertFailedLogin(page, { numberOfErrors: 2 }); + }); + + test('should NOT be able to register when email contains only spaces', async ({ page }) => { + const validUser = getValidUser(); + await getInput(page, 'email').fill(' '); + await getInput(page, 'email').blur(); + await assertError(page); + + await getInput(page, 'confirm-email').fill(validUser.email); + await getInput(page, 'firstName').fill(validUser.firstName); + await getInput(page, 'lastName').fill(validUser.lastName); + await getInput(page, 'zipcode').fill(String(validUser.zipcode)); + await getCheckbox(page, /Code of Conduct/).check(); + await getCheckbox(page, /Slack Community Guidelines/).check(); + + await assertFailedLogin(page, { numberOfErrors: 2 }); + }); + + test('should NOT be able to register with an invalid email', async ({ page }) => { + const invalidUser = mockUser('invalidemail@.com'); + + await getInput(page, 'email').fill(invalidUser.email); + await getInput(page, 'email').blur(); + await assertError(page, { errorMessage: validationErrorMessages.email }); + + await getInput(page, 'confirm-email').fill(invalidUser.email); + await getInput(page, 'firstName').fill(invalidUser.firstName); + await getInput(page, 'lastName').fill(invalidUser.lastName); + await getInput(page, 'zipcode').fill(String(invalidUser.zipcode)); + await getCheckbox(page, /Code of Conduct/).check(); + await getCheckbox(page, /Slack Community Guidelines/).check(); + + await assertFailedLogin(page, { errorMessage: validationErrorMessages.email }); + }); + + test('should NOT be able to register when blurring past confirmEmail', async ({ page }) => { + const validUser = getValidUser(); + await getInput(page, 'email').fill(validUser.email); + + await getInput(page, 'confirm-email').focus(); + await getInput(page, 'confirm-email').blur(); + await assertError(page); + + await getInput(page, 'firstName').fill(validUser.firstName); + await getInput(page, 'lastName').fill(validUser.lastName); + await getInput(page, 'zipcode').fill(String(validUser.zipcode)); + await getCheckbox(page, /Code of Conduct/).check(); + await getCheckbox(page, /Slack Community Guidelines/).check(); + + await assertFailedLogin(page); + }); + + test('should NOT be able to register when emails do not match', async ({ page }) => { + const validUser = getValidUser(); + await getInput(page, 'email').fill(validUser.email); + await getInput(page, 'confirm-email').fill(existingUser.email); + + await getInput(page, 'firstName').fill(validUser.firstName); + + await assertError(page, { errorMessage: validationErrorMessages.emailsMatch }); + + await getInput(page, 'lastName').fill(validUser.lastName); + await getInput(page, 'zipcode').fill(String(validUser.zipcode)); + await getCheckbox(page, /Code of Conduct/).check(); + await getCheckbox(page, /Slack Community Guidelines/).check(); + + await assertFailedLogin(page, { errorMessage: validationErrorMessages.emailsMatch }); + }); + + test('should NOT be able to register with an existing email', async ({ page }) => { + await getInput(page, 'email').fill(existingUser.email); + await getInput(page, 'confirm-email').fill(existingUser.email); + await getInput(page, 'firstName').fill(existingUser.firstName); + await getInput(page, 'lastName').fill(existingUser.lastName); + await getInput(page, 'zipcode').fill(String(existingUser.zipcode)); + await getCheckbox(page, /Code of Conduct/).check(); + await getCheckbox(page, /Slack Community Guidelines/).check(); + + await assertFailedLogin(page, { errorMessage: validationErrorMessages.emailExists }); + }); + + /** + * FirstName & LastName Fields + */ + test('should NOT be able to register when blurring past firstName', async ({ page }) => { + const validUser = getValidUser(); + await getInput(page, 'email').fill(validUser.email); + await getInput(page, 'confirm-email').fill(validUser.email); + + await getInput(page, 'firstName').focus(); + await getInput(page, 'firstName').blur(); + await assertError(page); + + await getInput(page, 'lastName').fill(validUser.lastName); + await getInput(page, 'zipcode').fill(String(validUser.zipcode)); + await getCheckbox(page, /Code of Conduct/).check(); + await getCheckbox(page, /Slack Community Guidelines/).check(); + + await assertFailedLogin(page); + }); + + test('should NOT be able to register when firstName contains only spaces', async ({ page }) => { + const validUser = getValidUser(); + await getInput(page, 'email').fill(validUser.email); + await getInput(page, 'confirm-email').fill(validUser.email); + + await getInput(page, 'firstName').fill(' '); + await getInput(page, 'firstName').blur(); + await assertError(page); + + await getInput(page, 'lastName').fill(validUser.lastName); + await getInput(page, 'zipcode').fill(String(validUser.zipcode)); + await getCheckbox(page, /Code of Conduct/).check(); + await getCheckbox(page, /Slack Community Guidelines/).check(); + + await assertFailedLogin(page); + }); + + test('should NOT be able to register when blurring past lastName', async ({ page }) => { + const validUser = getValidUser(); + await getInput(page, 'email').fill(validUser.email); + await getInput(page, 'confirm-email').fill(validUser.email); + await getInput(page, 'firstName').fill(validUser.firstName); + + await getInput(page, 'lastName').focus(); + await getInput(page, 'lastName').blur(); + await assertError(page); + + await getInput(page, 'zipcode').fill(String(validUser.zipcode)); + await getCheckbox(page, /Code of Conduct/).check(); + await getCheckbox(page, /Slack Community Guidelines/).check(); + + await assertFailedLogin(page); + }); + + test('should NOT be able to register when lastName contains only spaces', async ({ page }) => { + const validUser = getValidUser(); + await getInput(page, 'email').fill(validUser.email); + await getInput(page, 'confirm-email').fill(validUser.email); + await getInput(page, 'firstName').fill(validUser.firstName); + + await getInput(page, 'lastName').fill(' '); + await getInput(page, 'lastName').blur(); + await assertError(page); + + await getInput(page, 'zipcode').fill(String(validUser.zipcode)); + await getCheckbox(page, /Code of Conduct/).check(); + await getCheckbox(page, /Slack Community Guidelines/).check(); + + await assertFailedLogin(page); + }); + + /** + * Zipcode field + */ + test('should NOT be able to register when blurring past zipcode', async ({ page }) => { + const validUser = getValidUser(); + await getInput(page, 'email').fill(validUser.email); + await getInput(page, 'confirm-email').fill(validUser.email); + await getInput(page, 'firstName').fill(validUser.firstName); + await getInput(page, 'lastName').fill(validUser.lastName); + + await getInput(page, 'zipcode').focus(); + await getInput(page, 'zipcode').blur(); + await assertError(page); + + await getCheckbox(page, /Code of Conduct/).check(); + await getCheckbox(page, /Slack Community Guidelines/).check(); + + await assertFailedLogin(page); + }); + + test('should NOT be able to register when zipcode contains only spaces', async ({ page }) => { + const validUser = getValidUser(); + await getInput(page, 'email').fill(validUser.email); + await getInput(page, 'confirm-email').fill(validUser.email); + await getInput(page, 'firstName').fill(validUser.firstName); + await getInput(page, 'lastName').fill(validUser.lastName); + + await getInput(page, 'zipcode').fill(' '); + await getInput(page, 'zipcode').blur(); + await assertError(page); + + await getCheckbox(page, /Code of Conduct/).check(); + await getCheckbox(page, /Slack Community Guidelines/).check(); + + await assertFailedLogin(page); + }); + + test('should NOT be able to register when Code of Conduct is not agreed to', async ({ page }) => { + const validUser = getValidUser(); + await getInput(page, 'email').fill(validUser.email); + await getInput(page, 'confirm-email').fill(validUser.email); + await getInput(page, 'firstName').fill(validUser.firstName); + await getInput(page, 'lastName').fill(validUser.lastName); + await getInput(page, 'zipcode').fill(String(validUser.zipcode)); + + await getCheckbox(page, /Code of Conduct/).focus(); + await getCheckbox(page, /Code of Conduct/).blur(); + await getCheckbox(page, /Slack Community Guidelines/).check(); + + await assertError(page, { + numberOfErrors: 1, + errorMessage: validationErrorMessages.codeOfConduct, + }); + await assertFailedLogin(page, { + numberOfErrors: 1, + errorMessage: validationErrorMessages.codeOfConduct, + }); + }); + + test('should NOT be able to register when Slack Community Guidelines is not agreed to', async ({ + page, + }) => { + const validUser = getValidUser(); + await getInput(page, 'email').fill(validUser.email); + await getInput(page, 'confirm-email').fill(validUser.email); + await getInput(page, 'firstName').fill(validUser.firstName); + await getInput(page, 'lastName').fill(validUser.lastName); + await getInput(page, 'zipcode').fill(String(validUser.zipcode)); + await getCheckbox(page, /Code of Conduct/).check(); + + await getCheckbox(page, /Slack Community Guidelines/).focus(); + await getCheckbox(page, /Slack Community Guidelines/).blur(); + + await assertError(page, { + numberOfErrors: 1, + errorMessage: validationErrorMessages.slackGuidelines, + }); + await assertFailedLogin(page, { + numberOfErrors: 1, + errorMessage: validationErrorMessages.slackGuidelines, + }); + }); + + /** + * Registration without all fields + */ + test('should NOT be able to register without filling all required fields', async ({ page }) => { + await assertFailedLogin(page, { numberOfErrors: 7 }); + }); + + /** + * Test Valid User + */ + test('should be able to register with valid data', async ({ page }) => { + test.slow(); // this test takes a long time + const validUser = getValidUser(); + await getInput(page, 'email').fill(validUser.email); + await getInput(page, 'confirm-email').fill(validUser.email); + await getInput(page, 'firstName').fill(validUser.firstName); + await getInput(page, 'lastName').fill(validUser.lastName); + await getInput(page, 'zipcode').fill(String(validUser.zipcode)); + await getCheckbox(page, /Code of Conduct/).check(); + await getCheckbox(page, /Slack Community Guidelines/).check(); + await page.getByTestId(REGISTRATION_FORM_INITIAL_SUBMIT_BUTTON).click(); + + await expect(page).toHaveURL(/\/join\/form/, { timeout: 20000 }); + await expect(page.locator('h1')).toHaveText('Update Profile'); + + // Professional Details + await page.getByLabel('Employment Status*').fill('Full-Time'); + await page.keyboard.press('Enter'); + await page.getByLabel('Company Name').fill('Test Company'); + await page.getByLabel('Company Role').fill('Test Title'); + await page.getByTestId(MULTI_STEP_STEP_BUTTON).click(); + + // Military Status + await page.getByLabel('Military Affiliation*').fill('Non'); + await page.keyboard.press('Enter'); + await page.getByTestId(MULTI_STEP_STEP_BUTTON).click(); + + // Assert that we see Personal Details (not Military Details) + await expect(page.getByText('Personal Details')).toBeVisible({ + // sometimes long API response time + timeout: 15000, + }); + + // Go back + await page + .locator('form') + .getByRole('button', { name: /back|previous/i }) + .click(); + + // Military Status + await expect(page.getByText('Military Status')).toBeVisible(); + await page.getByLabel('Military Affiliation*').fill('Active'); + await page.keyboard.press('Enter'); + await page.getByTestId(MULTI_STEP_STEP_BUTTON).click(); + + // Assert that we see Military Details (not Personal Details) + await expect(page.getByText('Military Details')).toBeVisible({ + // sometimes long API response time + timeout: 15000, + }); + + // Military Details + await page.getByLabel('Branch Of Service*').fill('Army'); + await page.keyboard.press('Enter'); + await page.getByLabel('Pay Grade*').fill('E1-E5'); + await page.keyboard.press('Enter'); + await page.getByTestId(MULTI_STEP_STEP_BUTTON).click(); + + // Assert that we see Personal Details again + await expect(page.getByText('Personal Details')).toBeVisible({ + // sometimes long API response time + timeout: 15000, + }); + + // Personal Details + await page.getByLabel('Join Reason*').fill('None'); + await page.keyboard.press('Enter'); + await page.getByLabel('Gender*').fill('Male'); + await page.keyboard.press('Enter'); + await page.getByLabel('Ethnicity*').fill('Caucasian'); + await page.keyboard.press('Enter'); + await page.getByLabel('Ethnicity*').fill('Hispanic'); + await page.keyboard.press('Enter'); + await page.getByLabel('Education Level*').fill('High school'); + await page.keyboard.press('Enter'); + await page.getByTestId(MULTI_STEP_SUBMIT_BUTTON).click(); + + // Success UI + await expect(page.getByTestId(SUCCESS_PAGE_MESSAGE)).toBeVisible({ + // sometimes long API response time + timeout: 15000, + }); + }); +}); diff --git a/e2e/podcast.spec.ts b/e2e/podcast.spec.ts new file mode 100644 index 000000000..f8b4324e2 --- /dev/null +++ b/e2e/podcast.spec.ts @@ -0,0 +1,15 @@ +import { test, expect } from '@playwright/test'; + +test.describe('podcast', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/podcast'); + await expect(page.locator('h1')).toHaveText('Podcast'); + }); + + test('renders many podcast cards', async ({ page }) => { + await expect(page.getByTestId('Podcast Card')).toHaveCount( + await page.getByTestId('Podcast Card').count(), + ); + expect(await page.getByTestId('Podcast Card').count()).toBeGreaterThan(0); + }); +}); diff --git a/e2e/team.spec.ts b/e2e/team.spec.ts new file mode 100644 index 000000000..1838f543b --- /dev/null +++ b/e2e/team.spec.ts @@ -0,0 +1,13 @@ +import { test, expect } from '@playwright/test'; + +test.describe('team', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/team'); + await expect(page.locator('h1')).toHaveText('The Team'); + }); + + test('renders many board members', async ({ page }) => { + const articleCount = await page.locator('article').count(); + expect(articleCount).toBeGreaterThan(3); + }); +}); diff --git a/nyc.config.js b/nyc.config.js deleted file mode 100644 index 80974cb91..000000000 --- a/nyc.config.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - include: [ - 'pages/**/*.{js,ts,tsx}', - 'common/**/*.{js,ts,tsx}', - 'components/**/*.{js,ts,tsx}', - 'decorators/**/*.{js,ts,tsx}', - ], - exclude: ['pages/api/__coverage__.{js,ts}'], -}; diff --git a/package.json b/package.json index 6738fdc4d..6c8d99ec8 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,9 @@ "start": "next start -p 3000", "storybook": "storybook dev -p 9001 -c .storybook", "storybook:build": "storybook build -c .storybook -o .storybook-dist", - "test:e2e": "playwright test --headed", + "test:e2e": "export LOCAL_PLAYWRIGHT=true && playwright test --headed", + "test:e2e:debug": "yarn test:e2e --debug", + "test:e2e:dev": "export LOCAL_PLAYWRIGHT=true && playwright test --ui", "test:e2e:headless": "playwright test", "test:e2e:update-snaps": "playwright test --update-snapshots", "test:e2e:ci": "playwright test --ci", @@ -32,14 +34,6 @@ "test:watch": "vitest", "vitest": "cross-env vitest --config ./vitest.config.mts" }, - "nyc": { - "extends": "./nyc.config.js", - "report-dir": "cypress-coverage", - "reporter": [ - "json", - "lcov" - ] - }, "dependencies": { "@innocuous/components": "^2.1.1", "@next/bundle-analyzer": "^12.3.1", @@ -53,7 +47,6 @@ "axios": "^1.12.2", "cva": "^1.0.0-beta.4", "date-fns": "^2.29.3", - "eslint-plugin-vitest": "^0.3.22", "fast-xml-parser": "^3.21.1", "fingerprintjs2": "^2.1.4", "fontfaceobserver": "^2.3.0", @@ -87,11 +80,6 @@ "yup": "^1.7.1" }, "devDependencies": { - "@babel/core": "^7.28.5", - "@babel/eslint-parser": "^7.28.5", - "@babel/preset-typescript": "^7.28.5", - "@cypress/code-coverage": "^3.13.10", - "@cypress/webpack-preprocessor": "^6.0.2", "@operation_code/eslint-plugin-custom-rules": "^1.0.1", "@playwright/test": "^1.56.1", "@storybook/addon-actions": "^7.4.1", @@ -104,7 +92,6 @@ "@storybook/react": "^7.4.1", "@storybook/theming": "^7.4.1", "@svgr/webpack": "^6.3.1", - "@testing-library/cypress": "^8.0.3", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^12.1.5", "@types/fingerprintjs2": "2", @@ -125,12 +112,6 @@ "@vitest/ui": "^3.1.2", "autoprefixer": "^10.4.21", "axios-mock-adapter": "^2.1.0", - "babel-loader": "^10.0.0", - "babel-plugin-add-react-displayname": "^0.0.5", - "babel-plugin-istanbul": "^7.0.1", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-module-resolver": "^5.0.2", - "babel-plugin-react-remove-properties": "^0.3.1", "chromatic": "^6.8.0", "cross-env": "^7.0.3", "css-loader": "^6.7.1", @@ -145,6 +126,7 @@ "eslint-plugin-react": "^7.37.5", "eslint-plugin-storybook": "^0.6.13", "eslint-plugin-unicorn": "^43.0.2", + "eslint-plugin-vitest": "^0.3.22", "eslint-plugin-vitest-globals": "^1.5.0", "express": "^4.18.1", "faker": "^5.5.3", diff --git a/pages/api/__coverage__.js b/pages/api/__coverage__.js deleted file mode 100644 index 0b11fc9bc..000000000 --- a/pages/api/__coverage__.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@cypress/code-coverage/middleware/nextjs'); diff --git a/pages/podcast.tsx b/pages/podcast.tsx index 703d25d37..08dfac00a 100644 --- a/pages/podcast.tsx +++ b/pages/podcast.tsx @@ -70,8 +70,8 @@ function Podcast({ episodes }: { episodes: Episode[] }) { - {episodes.map(({ name, image, source, story }) => { +

+ {episodes.map(({ name, image, source, story }, index) => { /* * Some episodes have multiple parts and are named like "${Name}, part 1". * Some episodes are named "${Name} Interview" @@ -89,6 +89,7 @@ function Podcast({ episodes }: { episodes: Episode[] }) { src={image} alt={interviewee} className={styles.img} + priority={index === 0 || index === 1} width={200} height={200} /> diff --git a/playwright.config.ts b/playwright.config.ts index a9cd97995..a5eb19e4f 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -32,6 +32,11 @@ export default defineConfig({ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: 'on-first-retry', + + /* Slow down actions for debugging when not in CI */ + launchOptions: { + slowMo: process.env.LOCAL_PLAYWRIGHT ? 250 : 0, + }, }, /* Configure projects for major browsers */ diff --git a/test-utils/mockGenerators/mockUser.ts b/test-utils/mockGenerators/mockUser.ts index 630a55571..090175d14 100644 --- a/test-utils/mockGenerators/mockUser.ts +++ b/test-utils/mockGenerators/mockUser.ts @@ -8,24 +8,14 @@ export function mockUser(desiredEmail?: string): RegistrationFormValues { desiredEmail || (faker.internet.email(firstName, lastName, 'operationcode.org') as string); const zipcode = `${faker.address.zipCode()}`; // force to be string - /** - * In Cypress, ✅ ing the checkbox requires hitting the space bar, which is done by LITERALLY - * typing a string with an space character. Cute. - * - * This causes issues with Jest, so I found an environment variable used in Jest, but not Cypress - * so that the mocked value is correct in all contexts. - */ - const codeOfConduct = typeof Cypress === 'object' ? ' ' : true; - const slackGuidelines = typeof Cypress === 'object' ? ' ' : true; - const user = { email, 'confirm-email': email, firstName, lastName, zipcode, - codeOfConduct, - slackGuidelines, + codeOfConduct: true, + slackGuidelines: true, }; return user as RegistrationFormValues; diff --git a/vitest.config.mts b/vitest.config.mts index 771a2df19..3a7714a1a 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -44,7 +44,7 @@ export default defineConfig({ '.storybook-dist/**', '.next/**', '**/*.d.ts', - '{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress,tsup,build}.config.*', + '{karma,rollup,webpack,vite,vitest,jest,ava,playwright,build}.config.*', 'vitest.{workspace,projects}.[jt]s?(on)', '.{eslint,mocha,prettier}rc.{?(c|m)js,yml}', 'scripts/**', diff --git a/yarn.lock b/yarn.lock index 271c39a85..f60e22065 100644 --- a/yarn.lock +++ b/yarn.lock @@ -57,12 +57,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz" integrity sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A== -"@babel/compat-data@^7.27.2": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.5.tgz#a8a4962e1567121ac0b3b487f52107443b455c7f" - integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.19.6", "@babel/core@^7.22.9", "@babel/core@^7.23.9", "@babel/core@^7.26.10", "@babel/core@^7.7.5": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.19.6", "@babel/core@^7.22.9", "@babel/core@^7.26.10", "@babel/core@^7.7.5": version "7.27.1" resolved "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz" integrity sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ== @@ -83,36 +78,6 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.5.tgz#4c81b35e51e1b734f510c99b07dfbc7bbbb48f7e" - integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.5" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-module-transforms" "^7.28.3" - "@babel/helpers" "^7.28.4" - "@babel/parser" "^7.28.5" - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.5" - "@babel/types" "^7.28.5" - "@jridgewell/remapping" "^2.3.5" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/eslint-parser@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.28.5.tgz#0b8883a4a1c2cbed7b3cd9d7765d80e8f480b9ae" - integrity sha512-fcdRcWahONYo+JRnJg1/AekOacGvKx12Gu0qXJXFi2WBqQA1i7+O5PaxRB7kxE/Op94dExnCiiar6T09pvdHpA== - dependencies: - "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" - eslint-visitor-keys "^2.1.0" - semver "^6.3.1" - "@babel/generator@^7.12.11", "@babel/generator@^7.22.9", "@babel/generator@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz" @@ -124,17 +89,6 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" -"@babel/generator@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.5.tgz#712722d5e50f44d07bc7ac9fe84438742dd61298" - integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ== - dependencies: - "@babel/parser" "^7.28.5" - "@babel/types" "^7.28.5" - "@jridgewell/gen-mapping" "^0.3.12" - "@jridgewell/trace-mapping" "^0.3.28" - jsesc "^3.0.2" - "@babel/helper-annotate-as-pure@^7.22.5", "@babel/helper-annotate-as-pure@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz" @@ -142,13 +96,6 @@ dependencies: "@babel/types" "^7.27.1" -"@babel/helper-annotate-as-pure@^7.27.3": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" - integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== - dependencies: - "@babel/types" "^7.27.3" - "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz" @@ -167,17 +114,6 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-compilation-targets@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" - integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== - dependencies: - "@babel/compat-data" "^7.27.2" - "@babel/helper-validator-option" "^7.27.1" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5", "@babel/helper-create-class-features-plugin@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz" @@ -191,19 +127,6 @@ "@babel/traverse" "^7.27.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz#472d0c28028850968979ad89f173594a6995da46" - integrity sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-member-expression-to-functions" "^7.28.5" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/traverse" "^7.28.5" - semver "^6.3.1" - "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz" @@ -237,11 +160,6 @@ "@babel/template" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/helper-globals@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" - integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== - "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" @@ -257,14 +175,6 @@ "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" -"@babel/helper-member-expression-to-functions@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz#f3e07a10be37ed7a63461c63e6929575945a6150" - integrity sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg== - dependencies: - "@babel/traverse" "^7.28.5" - "@babel/types" "^7.28.5" - "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5", "@babel/helper-module-imports@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" @@ -282,15 +192,6 @@ "@babel/helper-validator-identifier" "^7.27.1" "@babel/traverse" "^7.27.1" -"@babel/helper-module-transforms@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" - integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== - dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.28.3" - "@babel/helper-optimise-call-expression@^7.22.5", "@babel/helper-optimise-call-expression@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz" @@ -346,11 +247,6 @@ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== -"@babel/helper-validator-identifier@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" - integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== - "@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" @@ -373,28 +269,13 @@ "@babel/template" "^7.27.1" "@babel/types" "^7.27.1" -"@babel/helpers@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" - integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== - dependencies: - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.4" - -"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.4", "@babel/parser@^7.27.1": +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.7", "@babel/parser@^7.25.4", "@babel/parser@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz" integrity sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ== dependencies: "@babel/types" "^7.27.1" -"@babel/parser@^7.27.2", "@babel/parser@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.5.tgz#0b0225ee90362f030efd644e8034c99468893b08" - integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== - dependencies: - "@babel/types" "^7.28.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": version "7.22.15" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz" @@ -1064,17 +945,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" "@babel/plugin-syntax-typescript" "^7.27.1" -"@babel/plugin-transform-typescript@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz#441c5f9a4a1315039516c6c612fc66d5f4594e72" - integrity sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-create-class-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/plugin-syntax-typescript" "^7.27.1" - "@babel/plugin-transform-unicode-escapes@^7.22.10": version "7.22.10" resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz" @@ -1233,17 +1103,6 @@ "@babel/plugin-transform-modules-commonjs" "^7.27.1" "@babel/plugin-transform-typescript" "^7.27.1" -"@babel/preset-typescript@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz#540359efa3028236958466342967522fd8f2a60c" - integrity sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-syntax-jsx" "^7.27.1" - "@babel/plugin-transform-modules-commonjs" "^7.27.1" - "@babel/plugin-transform-typescript" "^7.28.5" - "@babel/register@^7.13.16": version "7.22.5" resolved "https://registry.npmjs.org/@babel/register/-/register-7.22.5.tgz" @@ -1260,7 +1119,7 @@ resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.6", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": version "7.22.15" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz" integrity sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA== @@ -1276,15 +1135,6 @@ "@babel/parser" "^7.27.1" "@babel/types" "^7.27.1" -"@babel/template@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" - integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/parser" "^7.27.2" - "@babel/types" "^7.27.1" - "@babel/traverse@^7.1.6", "@babel/traverse@^7.22.8", "@babel/traverse@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz" @@ -1298,19 +1148,6 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/traverse@^7.28.3", "@babel/traverse@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.5.tgz#450cab9135d21a7a2ca9d2d35aa05c20e68c360b" - integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.5" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.5" - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.5" - debug "^4.3.1" - "@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.21.5", "@babel/types@^7.22.15", "@babel/types@^7.22.17", "@babel/types@^7.22.5", "@babel/types@^7.25.4", "@babel/types@^7.27.1", "@babel/types@^7.4.4": version "7.27.1" resolved "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz" @@ -1319,14 +1156,6 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" -"@babel/types@^7.27.3", "@babel/types@^7.28.4", "@babel/types@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.5.tgz#10fc405f60897c35f07e85493c932c7b5ca0592b" - integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.28.5" - "@base2/pretty-print-object@1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz" @@ -1425,30 +1254,6 @@ resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz" integrity sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw== -"@cypress/code-coverage@^3.13.10": - version "3.13.10" - resolved "https://registry.npmjs.org/@cypress/code-coverage/-/code-coverage-3.13.10.tgz" - integrity sha512-Bcj24zr82HNd6XGLvt9i00YYPscZwKiXBoyNM5iloJeo1cOqJRN7qkS/SIfX9Ab6lTvuNBDdZat48vyuZAuJBA== - dependencies: - "@cypress/webpack-preprocessor" "^6.0.0" - chalk "4.1.2" - dayjs "1.11.13" - debug "4.3.7" - execa "4.1.0" - globby "11.1.0" - istanbul-lib-coverage "^3.0.0" - js-yaml "4.1.0" - nyc "15.1.0" - -"@cypress/webpack-preprocessor@^6.0.0", "@cypress/webpack-preprocessor@^6.0.2": - version "6.0.2" - resolved "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-6.0.2.tgz" - integrity sha512-0+1+4iy4W9PE6R5ywBNKAZoFp8Sf//w3UJ+CKTqkcAjA29b+dtsD0iFT70DsYE0BMqUM1PO7HXFGbXllQ+bRAA== - dependencies: - bluebird "3.7.1" - debug "^4.3.4" - lodash "^4.17.20" - "@discoveryjs/json-ext@^0.5.3": version "0.5.7" resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" @@ -1973,14 +1778,6 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/gen-mapping@^0.3.12": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" - integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - "@jridgewell/trace-mapping" "^0.3.24" - "@jridgewell/gen-mapping@^0.3.2": version "0.3.12" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz#2234ce26c62889f03db3d7fea43c1932ab3e927b" @@ -1989,14 +1786,6 @@ "@jridgewell/sourcemap-codec" "^1.5.0" "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/remapping@^2.3.5": - version "2.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" - integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" @@ -2028,14 +1817,6 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@jridgewell/trace-mapping@^0.3.28": - version "0.3.31" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" - integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - "@juggle/resize-observer@^3.3.1": version "3.4.0" resolved "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz" @@ -2152,13 +1933,6 @@ resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.3.4.tgz" integrity sha512-DQ20JEfTBZAgF8QCjYfJhv2/279M6onxFjdG/+5B0Cyj00/EdBxiWb2eGGFgQhrBbNv/lsvzFbbi0Ptf8Vw/bg== -"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": - version "5.1.1-v1" - resolved "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz" - integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== - dependencies: - eslint-scope "5.1.1" - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -4068,15 +3842,7 @@ resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.4.tgz" integrity sha512-z/G02d+59gyyUb7KYhKi9jOhicek6QD2oMaotUyG+lUkybpXoV49dY9bj7Ah5Q+y7knK2jU67UTX9FyfGzaxQg== -"@testing-library/cypress@^8.0.3": - version "8.0.7" - resolved "https://registry.npmjs.org/@testing-library/cypress/-/cypress-8.0.7.tgz" - integrity sha512-3HTV725rOS+YHve/gD9coZp/UcPK5xhr4H0GMnq/ni6USdtzVtSOG9WBFtd8rYnrXk8rrGD+0toRFYouJNIG0Q== - dependencies: - "@babel/runtime" "^7.14.6" - "@testing-library/dom" "^8.1.0" - -"@testing-library/dom@^8.0.0", "@testing-library/dom@^8.1.0": +"@testing-library/dom@^8.0.0": version "8.20.1" resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz" integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== @@ -5168,23 +4934,11 @@ app-root-dir@^1.0.2: resolved "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz" integrity sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g== -append-transform@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz" - integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== - dependencies: - default-require-extensions "^3.0.0" - "aproba@^1.0.3 || ^2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" - integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== - are-we-there-yet@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz" @@ -5487,13 +5241,6 @@ babel-core@^7.0.0-bridge.0: resolved "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz" integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== -babel-loader@^10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz" - integrity sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA== - dependencies: - find-up "^5.0.0" - babel-loader@^9.0.0: version "9.1.2" resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz" @@ -5518,17 +5265,6 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-istanbul@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz#d8b518c8ea199364cf84ccc82de89740236daf92" - integrity sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.3" - istanbul-lib-instrument "^6.0.2" - test-exclude "^6.0.0" - babel-plugin-macros@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" @@ -5538,17 +5274,6 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" -babel-plugin-module-resolver@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.2.tgz" - integrity sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg== - dependencies: - find-babel-config "^2.1.1" - glob "^9.3.3" - pkg-up "^3.1.0" - reselect "^4.1.7" - resolve "^1.22.8" - babel-plugin-named-exports-order@^0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/babel-plugin-named-exports-order/-/babel-plugin-named-exports-order-0.0.2.tgz" @@ -5587,11 +5312,6 @@ babel-plugin-react-docgen@^4.2.1: lodash "^4.17.15" react-docgen "^5.0.0" -babel-plugin-react-remove-properties@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-react-remove-properties/-/babel-plugin-react-remove-properties-0.3.1.tgz#1fc9081b61a39d8af5b7a65fc4839d6976dc416e" - integrity sha512-JQ0oEgC4P6TZxSqEaoPZdbgE2L38Kz7RgTgGcOUUR24Z19OiGhnhdXkXkwwsYyx6LOr/bMY5ljDADhxDr/JQug== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -5643,11 +5363,6 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -bluebird@3.7.1: - version "3.7.1" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz" - integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== - bluebird@3.7.2: version "3.7.2" resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" @@ -5907,16 +5622,6 @@ cacheable@^2.1.0: keyv "^5.5.3" qified "^0.5.0" -caching-transform@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz" - integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== - dependencies: - hasha "^5.0.0" - make-dir "^3.0.0" - package-hash "^4.0.0" - write-file-atomic "^3.0.0" - call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" @@ -5961,7 +5666,7 @@ camelcase-css@^2.0.1: resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.3.1: version "5.3.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -6005,14 +5710,6 @@ chalk@3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" @@ -6033,6 +5730,14 @@ chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + check-error@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz" @@ -6172,15 +5877,6 @@ client-only@0.0.1: resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - cliui@^7.0.2: version "7.0.4" resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" @@ -6703,11 +6399,6 @@ date-fns@^2.29.3: dependencies: "@babel/runtime" "^7.21.0" -dayjs@1.11.13: - version "1.11.13" - resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz" - integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== - debug@2.6.9, debug@^2.6.6, debug@^2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" @@ -6722,13 +6413,6 @@ debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, de dependencies: ms "2.1.2" -debug@4.3.7: - version "4.3.7" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -6750,11 +6434,6 @@ debug@^4.4.3: dependencies: ms "^2.1.3" -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - decimal.js@^10.5.0: version "10.5.0" resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz" @@ -6817,13 +6496,6 @@ default-browser-id@3.0.0: bplist-parser "^0.2.0" untildify "^4.0.0" -default-require-extensions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz" - integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== - dependencies: - strip-bom "^4.0.0" - defaults@^1.0.3: version "1.0.4" resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" @@ -7448,11 +7120,6 @@ es-to-primitive@^1.3.0: is-date-object "^1.0.5" is-symbol "^1.0.4" -es6-error@^4.0.1: - version "4.1.1" - resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - es6-object-assign@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz" @@ -7743,7 +7410,7 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: +eslint-visitor-keys@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== @@ -7902,21 +7569,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - execa@5.1.1, execa@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" @@ -8166,13 +7818,6 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" -find-babel-config@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.1.2.tgz" - integrity sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg== - dependencies: - json5 "^2.2.3" - find-cache-dir@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz" @@ -8182,7 +7827,7 @@ find-cache-dir@^2.0.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-cache-dir@^3.0.0, find-cache-dir@^3.2.0, find-cache-dir@^3.3.1, find-cache-dir@^3.3.2: +find-cache-dir@^3.0.0, find-cache-dir@^3.3.1, find-cache-dir@^3.3.2: version "3.3.2" resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== @@ -8370,11 +8015,6 @@ from@~0: resolved "https://registry.npmjs.org/from/-/from-0.1.7.tgz" integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== -fromentries@^1.2.0: - version "1.3.2" - resolved "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz" - integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== - fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" @@ -8467,7 +8107,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1, get-caller-file@^2.0.5: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -8516,13 +8156,6 @@ get-proto@^1.0.0, get-proto@^1.0.1: dunder-proto "^1.0.1" es-object-atoms "^1.0.0" -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" @@ -8597,7 +8230,7 @@ glob@^10.3.10, glob@^10.4.1: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -8620,16 +8253,6 @@ glob@^8.0.3: minimatch "^5.0.1" once "^1.3.0" -glob@^9.3.3: - version "9.3.5" - resolved "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz" - integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== - dependencies: - fs.realpath "^1.0.0" - minimatch "^8.0.2" - minipass "^4.2.4" - path-scurry "^1.6.1" - global-modules@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" @@ -8673,7 +8296,7 @@ globalthis@^1.0.4: define-properties "^1.2.1" gopd "^1.0.1" -globby@11.1.0, globby@^11.0.1, globby@^11.0.2, globby@^11.1.0: +globby@^11.0.1, globby@^11.0.2, globby@^11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -8700,7 +8323,7 @@ gopd@^1.0.1, gopd@^1.2.0: resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -8821,14 +8444,6 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasha@^5.0.0: - version "5.2.2" - resolved "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz" - integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== - dependencies: - is-stream "^2.0.0" - type-fest "^0.8.0" - hasown@^2.0.0, hasown@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" @@ -8978,11 +8593,6 @@ https-proxy-agent@^7.0.6: agent-base "^7.1.2" debug "4" -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - human-signals@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" @@ -9412,11 +9022,6 @@ is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15, is-typed dependencies: which-typed-array "^1.1.16" -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" @@ -9449,11 +9054,6 @@ is-weakset@^2.0.3: call-bound "^1.0.3" get-intrinsic "^1.2.6" -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" @@ -9491,23 +9091,6 @@ istanbul-lib-coverage@^3.2.2: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== -istanbul-lib-hook@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz" - integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== - dependencies: - append-transform "^2.0.0" - -istanbul-lib-instrument@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - istanbul-lib-instrument@^5.0.4: version "5.2.1" resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" @@ -9519,29 +9102,6 @@ istanbul-lib-instrument@^5.0.4: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" -istanbul-lib-instrument@^6.0.2: - version "6.0.3" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz" - integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== - dependencies: - "@babel/core" "^7.23.9" - "@babel/parser" "^7.23.9" - "@istanbuljs/schema" "^0.1.3" - istanbul-lib-coverage "^3.2.0" - semver "^7.5.4" - -istanbul-lib-processinfo@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz" - integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== - dependencies: - archy "^1.0.0" - cross-spawn "^7.0.3" - istanbul-lib-coverage "^3.2.0" - p-map "^3.0.0" - rimraf "^3.0.0" - uuid "^8.3.2" - istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" @@ -9551,15 +9111,6 @@ istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: make-dir "^4.0.0" supports-color "^7.1.0" -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - istanbul-lib-source-maps@^5.0.6: version "5.0.6" resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz" @@ -9569,7 +9120,7 @@ istanbul-lib-source-maps@^5.0.6: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" -istanbul-reports@^3.0.2, istanbul-reports@^3.1.4, istanbul-reports@^3.1.7: +istanbul-reports@^3.1.4, istanbul-reports@^3.1.7: version "3.1.7" resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz" integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== @@ -9748,13 +9299,6 @@ js-cookie@^3.0.1: resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@4.1.0, js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" @@ -9763,6 +9307,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jscodeshift@^0.14.0: version "0.14.0" resolved "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz" @@ -10078,11 +9629,6 @@ lodash.debounce@^4.0.8: resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz" - integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" @@ -10210,7 +9756,7 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2: +make-dir@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -10425,13 +9971,6 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^8.0.2: - version "8.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz" - integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== - dependencies: - brace-expansion "^2.0.1" - minimatch@^9.0.4: version "9.0.5" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" @@ -10451,11 +9990,6 @@ minipass@^3.0.0: dependencies: yallist "^4.0.0" -minipass@^4.2.4: - version "4.2.8" - resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz" - integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== - minipass@^5.0.0, "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": version "5.0.0" resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" @@ -10676,13 +10210,6 @@ node-polyfill-webpack-plugin@^2.0.1: util "^0.12.4" vm-browserify "^1.1.2" -node-preload@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz" - integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== - dependencies: - process-on-spawn "^1.0.0" - node-releases@^2.0.19: version "2.0.19" resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" @@ -10713,7 +10240,7 @@ normalize-range@^0.1.2: resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== -npm-run-path@^4.0.0, npm-run-path@^4.0.1: +npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -10754,39 +10281,6 @@ nwsapi@^2.2.16: resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz" integrity sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ== -nyc@15.1.0: - version "15.1.0" - resolved "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz" - integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== - dependencies: - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - caching-transform "^4.0.0" - convert-source-map "^1.7.0" - decamelize "^1.2.0" - find-cache-dir "^3.2.0" - find-up "^4.1.0" - foreground-child "^2.0.0" - get-package-type "^0.1.0" - glob "^7.1.6" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-hook "^3.0.0" - istanbul-lib-instrument "^4.0.0" - istanbul-lib-processinfo "^2.0.2" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - make-dir "^3.0.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.0" - signal-exit "^3.0.2" - spawn-wrap "^2.0.0" - test-exclude "^6.0.0" - yargs "^15.0.2" - object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" @@ -11004,13 +10498,6 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - p-map@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" @@ -11023,16 +10510,6 @@ p-try@^2.0.0: resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -package-hash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz" - integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== - dependencies: - graceful-fs "^4.1.15" - hasha "^5.0.0" - lodash.flattendeep "^4.4.0" - release-zalgo "^1.0.0" - package-json-from-dist@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" @@ -11139,7 +10616,7 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.1, path-scurry@^1.11.1, path-scurry@^1.6.1: +path-scurry@^1.10.1, path-scurry@^1.11.1: version "1.11.1" resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== @@ -11278,13 +10755,6 @@ pkg-dir@^5.0.0: dependencies: find-up "^5.0.0" -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - playwright-core@1.56.1: version "1.56.1" resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.56.1.tgz#24a66481e5cd33a045632230aa2c4f0cb6b1db3d" @@ -11630,13 +11100,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process-on-spawn@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz" - integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== - dependencies: - fromentries "^1.2.0" - process@0.11.10, process@^0.11.1, process@^0.11.10: version "0.11.10" resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" @@ -12242,13 +11705,6 @@ relateurl@^0.2.7: resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== -release-zalgo@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz" - integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== - dependencies: - es6-error "^4.0.1" - remark-external-links@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz" @@ -12297,21 +11753,11 @@ require-from-string@^2.0.2: resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - requireindex@^1.1.0: version "1.2.0" resolved "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz" integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== -reselect@^4.1.7: - version "4.1.8" - resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz" - integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" @@ -12376,7 +11822,7 @@ rimraf@^2.6.1, rimraf@~2.6.2: dependencies: glob "^7.1.3" -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -12901,18 +12347,6 @@ space-separated-tokens@^1.0.0: resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz" integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== -spawn-wrap@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz" - integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== - dependencies: - foreground-child "^2.0.0" - is-windows "^1.0.2" - make-dir "^3.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - which "^2.0.1" - spdx-correct@^3.0.0: version "3.2.0" resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" @@ -13208,11 +12642,6 @@ strip-bom@^3.0.0: resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" @@ -13878,7 +13307,7 @@ type-fest@^0.7.1: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -type-fest@^0.8.0, type-fest@^0.8.1: +type-fest@^0.8.1: version "0.8.1" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== @@ -13941,13 +13370,6 @@ typed-array-length@^1.0.7: possible-typed-array-names "^1.0.0" reflect.getprototypeof "^1.0.6" -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" @@ -14163,11 +13585,6 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - uuid@^9.0.0: version "9.0.0" resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz" @@ -14477,11 +13894,6 @@ which-collection@^1.0.1, which-collection@^1.0.2: is-weakmap "^2.0.2" is-weakset "^2.0.3" -which-module@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== - which-pm-runs@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz" @@ -14596,16 +14008,6 @@ write-file-atomic@^2.3.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" @@ -14667,11 +14069,6 @@ xtend@^4.0.2, xtend@~4.0.1: resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" @@ -14702,36 +14099,11 @@ yaml@^2.3.4: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.1.tgz#1870aa02b631f7e8328b93f8bc574fac5d6c4d79" integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw== -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^20.2.2, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs@^15.0.2: - version "15.4.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - yargs@^16.2.0: version "16.2.0" resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" From 62f4e57ea17fd44d0316e58af350d01f4771f17f Mon Sep 17 00:00:00 2001 From: Kyle Holmberg Date: Mon, 27 Oct 2025 16:13:29 +0700 Subject: [PATCH 5/9] update snapshots --- .../__tests__/__snapshots__/Content.test.tsx.snap | 4 ++-- .../__snapshots__/UpdateProfileForm.test.tsx.snap | 1 + .../__tests__/__snapshots__/Heading.test.tsx.snap | 5 +++-- .../__snapshots__/JoinSection.test.tsx.snap | 4 ++-- .../__snapshots__/SponsorsSection.test.tsx.snap | 12 ++++++------ 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/components/Content/__tests__/__snapshots__/Content.test.tsx.snap b/components/Content/__tests__/__snapshots__/Content.test.tsx.snap index 0b1de2c42..506a71287 100644 --- a/components/Content/__tests__/__snapshots__/Content.test.tsx.snap +++ b/components/Content/__tests__/__snapshots__/Content.test.tsx.snap @@ -13,16 +13,16 @@ exports[`Content > should render with many props assigned 1`] = ` >