From ed6fea02b3af5c11fe368389bcf60f42bd3019ed Mon Sep 17 00:00:00 2001 From: K-shir0 Date: Sun, 2 Jul 2023 11:34:41 +0900 Subject: [PATCH 1/2] =?UTF-8?q?add:=20playwright=20=E3=82=92=E5=B0=8E?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.json | 3 +- package.json | 3 + playwright.config.ts | 44 ++++++++ vitest.config.ts | 6 +- yarn.lock | 259 +++++++++++++++++++++++-------------------- 5 files changed, 190 insertions(+), 125 deletions(-) create mode 100644 playwright.config.ts diff --git a/.eslintrc.json b/.eslintrc.json index 9ae6ea2..4a38d5d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -62,7 +62,8 @@ // devDependenciesのimportを禁止 "optionalDependencies": false } - ] + ], + "no-unused-vars": "off" }, "env": { "jest": true diff --git a/package.json b/package.json index 0c908ae..a85a31c 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,8 @@ "build": "next build", "start": "next start", "test": "vitest --coverage", + "test:e2e": "playwright test", + "test:e2e-ui": "playwright test --ui", "lint": "next lint", "format": "prettier --check --ignore-path .gitignore .", "format:fix": "prettier --write --ignore-path .gitignore .", @@ -39,6 +41,7 @@ "zenn-markdown-html": "^0.1.81" }, "devDependencies": { + "@playwright/test": "^1.35.1", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^14.0.0", "@types/luxon": "^3.2.0", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..e7763f6 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,44 @@ +import { defineConfig, devices } from "@playwright/test"; + +export default defineConfig({ + // Look for test files in the "tests" directory, relative to this configuration file. + testDir: "__e2e__", + + // Run all tests 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 + reporter: "html", + + use: { + // Base URL to use in actions like `await page.goto('/')`. + baseURL: "http://localhost:3000", + + // Collect trace when retrying the failed test. + trace: "on-first-retry", + + ignoreHTTPSErrors: true, + }, + // Configure projects for major browsers. + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + ], + // Run your local dev server before starting the tests. + webServer: { + command: "yarn build && yarn start", + url: "http://localhost:3000", + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/vitest.config.ts b/vitest.config.ts index 69b52cd..cf17f4e 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,13 +1,15 @@ -import { defineConfig } from "vitest/config"; -import react from "@vitejs/plugin-react"; import * as path from "path"; +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vitest/config"; + // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], test: { globals: true, environment: "jsdom", + exclude: ["**/node_modules/**", "**/__e2e__/**"], }, resolve: { alias: { diff --git a/yarn.lock b/yarn.lock index 3ff8264..58bdc79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@adobe/css-tools@^4.0.1": version "4.2.0" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.2.0.tgz#e1a84fca468f4b337816fcb7f0964beb620ba855" + resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz" integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== "@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.2.1": @@ -169,14 +169,14 @@ "@babel/plugin-transform-react-jsx-self@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz#ca2fdc11bc20d4d46de01137318b13d04e481d8e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz" integrity sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-jsx-source@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz#49af1615bfdf6ed9d3e9e43e425e0b2b65d15b6c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz" integrity sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -239,7 +239,7 @@ "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@esbuild/android-arm64@0.17.19": @@ -264,7 +264,7 @@ "@esbuild/darwin-x64@0.17.19": version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz" integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== "@esbuild/freebsd-arm64@0.17.19": @@ -393,7 +393,7 @@ "@jest/environment@^29.5.0": version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz" integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== dependencies: "@jest/fake-timers" "^29.5.0" @@ -403,14 +403,14 @@ "@jest/expect-utils@^29.5.0": version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz" integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== dependencies: jest-get-type "^29.4.3" "@jest/fake-timers@^29.5.0": version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz" integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== dependencies: "@jest/types" "^29.5.0" @@ -591,6 +591,16 @@ tiny-glob "^0.2.9" tslib "^2.4.0" +"@playwright/test@^1.35.1": + version "1.35.1" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.35.1.tgz#a596b61e15b980716696f149cc7a2002f003580c" + integrity sha512-b5YoFe6J9exsMYg0pQAobNDR85T1nLumUYgUTtKm4d21iX2L7WqKq9dW8NGJ+2vX0etZd+Y7UeuqsxDXm9+5ZA== + dependencies: + "@types/node" "*" + playwright-core "1.35.1" + optionalDependencies: + fsevents "2.3.2" + "@rushstack/eslint-patch@^1.1.3": version "1.2.0" resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz" @@ -603,14 +613,14 @@ "@sinonjs/commons@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz" integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^10.0.2": version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: "@sinonjs/commons" "^3.0.0" @@ -629,7 +639,7 @@ "@testing-library/dom@^9.0.0": version "9.3.1" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.1.tgz#8094f560e9389fb973fe957af41bf766937a9ee9" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz" integrity sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w== dependencies: "@babel/code-frame" "^7.10.4" @@ -643,7 +653,7 @@ "@testing-library/jest-dom@^5.16.5": version "5.16.5" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz#3912846af19a29b2dbf32a6ae9c31ef52580074e" + resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz" integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== dependencies: "@adobe/css-tools" "^4.0.1" @@ -658,7 +668,7 @@ "@testing-library/react@^14.0.0": version "14.0.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.0.0.tgz#59030392a6792450b9ab8e67aea5f3cc18d6347c" + resolved "https://registry.npmjs.org/@testing-library/react/-/react-14.0.0.tgz" integrity sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg== dependencies: "@babel/runtime" "^7.12.5" @@ -672,19 +682,19 @@ "@types/aria-query@^5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz" integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== "@types/chai-subset@^1.3.3": version "1.3.3" - resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.3.tgz#97893814e92abd2c534de422cb377e0e0bdaac94" + resolved "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz" integrity sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw== dependencies: "@types/chai" "*" "@types/chai@*", "@types/chai@^4.3.5": version "4.3.5" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" + resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz" integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": @@ -708,7 +718,7 @@ "@types/jest@*": version "29.5.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.2.tgz#86b4afc86e3a8f3005b297ed8a72494f89e6395b" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz" integrity sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg== dependencies: expect "^29.0.0" @@ -716,7 +726,7 @@ "@types/jsdom@^20.0.0": version "20.0.1" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + resolved "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz" integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== dependencies: "@types/node" "*" @@ -757,7 +767,7 @@ "@types/react-dom@^18.0.0": version "18.2.6" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.6.tgz#ad621fa71a8db29af7c31b41b2ea3d8a6f4144d1" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.6.tgz" integrity sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A== dependencies: "@types/react" "*" @@ -783,14 +793,14 @@ "@types/testing-library__jest-dom@^5.9.1": version "5.14.6" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.6.tgz#4887f6e1af11215428ab02777873bcede98a53b0" + resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.6.tgz" integrity sha512-FkHXCb+ikSoUP4Y4rOslzTdX5sqYwMxfefKh1GmZ8ce1GOkEHntSp6b5cGadmNfp5e4BMEWOMx+WSKd5/MqlDA== dependencies: "@types/jest" "*" "@types/tough-cookie@*": version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" + resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz" integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== "@types/yargs-parser@*": @@ -851,7 +861,7 @@ "@vitejs/plugin-react@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.0.1.tgz#793aa790633433558da7ac0a38c58ddf47dff518" + resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.1.tgz" integrity sha512-g25lL98essfeSj43HJ0o4DMp0325XK0ITkxpgChzJU/CyemgyChtlxfnRbjfwxDGCTRxTiXtQAsdebQXKMRSOA== dependencies: "@babel/core" "^7.22.5" @@ -861,7 +871,7 @@ "@vitest/coverage-v8@^0.32.2": version "0.32.2" - resolved "https://registry.yarnpkg.com/@vitest/coverage-v8/-/coverage-v8-0.32.2.tgz#efb74efd47ccdea59874c700f93f8c30b5766ab9" + resolved "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-0.32.2.tgz" integrity sha512-/+V3nB3fyeuuSeKxCfi6XmWjDIxpky7AWSkGVfaMjAk7di8igBwRsThLjultwIZdTDH1RAxpjmCXEfSqsMFZOA== dependencies: "@ampproject/remapping" "^2.2.1" @@ -878,7 +888,7 @@ "@vitest/expect@0.32.2": version "0.32.2" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-0.32.2.tgz#8111f6ab1ff3b203efbe3a25e8bb2d160ce4b720" + resolved "https://registry.npmjs.org/@vitest/expect/-/expect-0.32.2.tgz" integrity sha512-6q5yzweLnyEv5Zz1fqK5u5E83LU+gOMVBDuxBl2d2Jfx1BAp5M+rZgc5mlyqdnxquyoiOXpXmFNkcGcfFnFH3Q== dependencies: "@vitest/spy" "0.32.2" @@ -887,7 +897,7 @@ "@vitest/runner@0.32.2": version "0.32.2" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-0.32.2.tgz#18dd979ce4e8766bcc90948d11b4c8ae6ed90b89" + resolved "https://registry.npmjs.org/@vitest/runner/-/runner-0.32.2.tgz" integrity sha512-06vEL0C1pomOEktGoLjzZw+1Fb+7RBRhmw/06WkDrd1akkT9i12su0ku+R/0QM69dfkIL/rAIDTG+CSuQVDcKw== dependencies: "@vitest/utils" "0.32.2" @@ -897,7 +907,7 @@ "@vitest/snapshot@0.32.2": version "0.32.2" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-0.32.2.tgz#500b6453e88e4c50a0aded39839352c16b519b9e" + resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.32.2.tgz" integrity sha512-JwhpeH/PPc7GJX38vEfCy9LtRzf9F4er7i4OsAJyV7sjPwjj+AIR8cUgpMTWK4S3TiamzopcTyLsZDMuldoi5A== dependencies: magic-string "^0.30.0" @@ -906,14 +916,14 @@ "@vitest/spy@0.32.2": version "0.32.2" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-0.32.2.tgz#f3ef7afe0d34e863b90df7c959fa5af540a6aaf9" + resolved "https://registry.npmjs.org/@vitest/spy/-/spy-0.32.2.tgz" integrity sha512-Q/ZNILJ4ca/VzQbRM8ur3Si5Sardsh1HofatG9wsJY1RfEaw0XKP8IVax2lI1qnrk9YPuG9LA2LkZ0EI/3d4ug== dependencies: tinyspy "^2.1.0" "@vitest/utils@0.32.2": version "0.32.2" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-0.32.2.tgz#809c720cafbf4b35ce651deb8570d57785e77819" + resolved "https://registry.npmjs.org/@vitest/utils/-/utils-0.32.2.tgz" integrity sha512-lnJ0T5i03j0IJaeW73hxe2AuVnZ/y1BhhCOuIcl9LIzXnbpXJT9Lrt6brwKHXLOiA7MZ6N5hSJjt0xE1dGNCzQ== dependencies: diff-sequences "^29.4.3" @@ -927,7 +937,7 @@ abab@^2.0.6: acorn-globals@^7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz" integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== dependencies: acorn "^8.1.0" @@ -1040,7 +1050,7 @@ argparse@^2.0.1: aria-query@5.1.3: version "5.1.3" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: deep-equal "^2.0.5" @@ -1055,14 +1065,14 @@ aria-query@^4.2.2: aria-query@^5.0.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: dequal "^2.0.3" array-buffer-byte-length@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== dependencies: call-bind "^1.0.2" @@ -1117,7 +1127,7 @@ array.prototype.tosorted@^1.1.1: assertion-error@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== ast-types-flow@^0.0.7: @@ -1178,7 +1188,7 @@ binary-extensions@^2.0.0: blueimp-md5@^2.10.0: version "2.19.0" - resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" + resolved "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz" integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== boolbase@^1.0.0: @@ -1223,7 +1233,7 @@ browserslist@^4.21.4: cac@^6.7.14: version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== call-bind@^1.0.0, call-bind@^1.0.2: @@ -1256,7 +1266,7 @@ caniuse-lite@^1.0.30001503: chai@^4.3.7: version "4.3.7" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + resolved "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz" integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== dependencies: assertion-error "^1.1.0" @@ -1278,7 +1288,7 @@ chalk@^2.0.0: chalk@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" @@ -1294,7 +1304,7 @@ chalk@^4.0.0, chalk@^4.1.0: check-error@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== cheerio-select@^2.1.0: @@ -1401,7 +1411,7 @@ concat-map@0.0.1: concordance@^5.0.4: version "5.0.4" - resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.4.tgz#9896073261adced72f88d60e4d56f8efc4bbbbd2" + resolved "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz" integrity sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw== dependencies: date-time "^3.1.0" @@ -1468,7 +1478,7 @@ css-what@^6.1.0: css.escape@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz" integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== cssesc@^3.0.0: @@ -1478,17 +1488,17 @@ cssesc@^3.0.0: cssom@^0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz" integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== cssom@~0.3.6: version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssstyle@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" @@ -1515,7 +1525,7 @@ damerau-levenshtein@^1.0.8: data-urls@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz" integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== dependencies: abab "^2.0.6" @@ -1524,7 +1534,7 @@ data-urls@^3.0.2: date-time@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz#0d1e934d170579f481ed8df1e2b8ff70ee845e1e" + resolved "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz" integrity sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg== dependencies: time-zone "^1.0.0" @@ -1550,14 +1560,14 @@ decimal.js@^10.4.2: deep-eql@^4.1.2: version "4.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: type-detect "^4.0.0" deep-equal@^2.0.5: version "2.2.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.1.tgz#c72ab22f3a7d3503a4ca87dde976fe9978816739" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz" integrity sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ== dependencies: array-buffer-byte-length "^1.0.0" @@ -1604,7 +1614,7 @@ define-properties@^1.1.3, define-properties@^1.1.4: define-properties@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" @@ -1622,7 +1632,7 @@ delayed-stream@~1.0.0: dequal@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== detective@^5.2.1: @@ -1777,7 +1787,7 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: es-get-iterator@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== dependencies: call-bind "^1.0.2" @@ -1808,7 +1818,7 @@ es-to-primitive@^1.2.1: esbuild@^0.17.5: version "0.17.19" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz" integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== optionalDependencies: "@esbuild/android-arm" "0.17.19" @@ -1856,7 +1866,7 @@ escape-string-regexp@^4.0.0: escodegen@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" @@ -2109,7 +2119,7 @@ esutils@^2.0.2, esutils@^2.0.3: expect@^29.0.0: version "29.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + resolved "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz" integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== dependencies: "@jest/expect-utils" "^29.5.0" @@ -2132,7 +2142,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: fast-diff@^1.2.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: @@ -2234,7 +2244,7 @@ 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: +fsevents@2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -2266,7 +2276,7 @@ gensync@^1.0.0-beta.2: get-func-name@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: @@ -2280,7 +2290,7 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@ get-intrinsic@^1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" @@ -2450,7 +2460,7 @@ has-property-descriptors@^1.0.0: has-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== has-symbols@^1.0.2, has-symbols@^1.0.3: @@ -2481,7 +2491,7 @@ html-encoding-sniffer@^3.0.0: html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== htmlparser2@^8.0.0, htmlparser2@^8.0.1: @@ -2545,7 +2555,7 @@ imurmurhash@^0.1.4: indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: @@ -2572,7 +2582,7 @@ internal-slot@^1.0.3: internal-slot@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: get-intrinsic "^1.2.0" @@ -2589,7 +2599,7 @@ is-arguments@^1.1.1: is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== dependencies: call-bind "^1.0.2" @@ -2666,7 +2676,7 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== is-negative-zero@^2.0.2: @@ -2711,7 +2721,7 @@ is-regex@^1.1.4: is-set@^2.0.1, is-set@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== is-shared-array-buffer@^1.0.2: @@ -2748,7 +2758,7 @@ is-typed-array@^1.1.10: is-weakmap@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== is-weakref@^1.0.2: @@ -2760,7 +2770,7 @@ is-weakref@^1.0.2: is-weakset@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz" integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== dependencies: call-bind "^1.0.2" @@ -2775,7 +2785,7 @@ is-wsl@^2.2.0: isarray@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isexe@^2.0.0: @@ -2790,7 +2800,7 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: istanbul-lib-report@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -2799,7 +2809,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + 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" @@ -2808,7 +2818,7 @@ istanbul-lib-source-maps@^4.0.1: istanbul-reports@^3.1.5: version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" @@ -2816,7 +2826,7 @@ istanbul-reports@^3.1.5: jest-diff@^29.5.0: version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz" integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== dependencies: chalk "^4.0.0" @@ -2826,7 +2836,7 @@ jest-diff@^29.5.0: jest-environment-jsdom@^29.5.0: version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz#cfe86ebaf1453f3297b5ff3470fbe94739c960cb" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz" integrity sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw== dependencies: "@jest/environment" "^29.5.0" @@ -2840,12 +2850,12 @@ jest-environment-jsdom@^29.5.0: jest-get-type@^29.4.3: version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz" integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== jest-matcher-utils@^29.5.0: version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz" integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== dependencies: chalk "^4.0.0" @@ -2870,7 +2880,7 @@ jest-message-util@^29.5.0: jest-mock@^29.5.0: version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz" integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== dependencies: "@jest/types" "^29.5.0" @@ -2896,7 +2906,7 @@ js-sdsl@^4.1.4: js-string-escape@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" + resolved "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz" integrity sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: @@ -2921,7 +2931,7 @@ js-yaml@^4.1.0: jsdom@^20.0.0: version "20.0.3" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz" integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== dependencies: abab "^2.0.6" @@ -2980,7 +2990,7 @@ json5@^2.2.2: jsonc-parser@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: @@ -3030,7 +3040,7 @@ linkify-it@^3.0.1: local-pkg@^0.4.3: version "0.4.3" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" + resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz" integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== locate-path@^6.0.0: @@ -3059,7 +3069,7 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: loupe@^2.3.1, loupe@^2.3.6: version "2.3.6" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz" integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== dependencies: get-func-name "^2.0.0" @@ -3085,19 +3095,19 @@ luxon@^3.2.1: lz-string@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== magic-string@^0.30.0: version "0.30.0" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.0.tgz#fd58a4748c5c4547338a424e90fa5dd17f4de529" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz" integrity sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ== dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" make-dir@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" @@ -3145,7 +3155,7 @@ markdown-it@^12.3.2: md5-hex@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.1.tgz#be3741b510591434b2784d79e556eefc2c9a8e5c" + resolved "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz" integrity sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw== dependencies: blueimp-md5 "^2.10.0" @@ -3182,7 +3192,7 @@ mime-types@^2.1.12: min-indent@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: @@ -3199,7 +3209,7 @@ minimist@^1.2.0, minimist@^1.2.6: mlly@^1.2.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.4.0.tgz#830c10d63f1f97bd8785377b24dc2a15d972832b" + resolved "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz" integrity sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg== dependencies: acorn "^8.9.0" @@ -3219,7 +3229,7 @@ nanoid@^3.3.4: nanoid@^3.3.6: version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== natural-compare@^1.4.0: @@ -3229,7 +3239,7 @@ natural-compare@^1.4.0: next-router-mock@^0.9.7: version "0.9.7" - resolved "https://registry.yarnpkg.com/next-router-mock/-/next-router-mock-0.9.7.tgz#828e699fba6862e3a3defdb67803c3200a5ab699" + resolved "https://registry.npmjs.org/next-router-mock/-/next-router-mock-0.9.7.tgz" integrity sha512-y5ioLCIsdkJKwcoPnrUyocNEJT22RK4wKSg6LO0Q2XkBBvkYprEWy5FiCZt+CA8+qpfxpBlNca76F+glEohbRA== next@^13.1.1: @@ -3314,7 +3324,7 @@ object-inspect@^1.12.2, object-inspect@^1.9.0: object-is@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== dependencies: call-bind "^1.0.2" @@ -3407,7 +3417,7 @@ p-limit@^3.0.2: p-limit@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz" integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== dependencies: yocto-queue "^1.0.0" @@ -3473,12 +3483,12 @@ path-type@^4.0.0: pathe@^1.1.0, pathe@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" + resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz" integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== pathval@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== picocolors@^1.0.0: @@ -3498,13 +3508,18 @@ pify@^2.3.0: pkg-types@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz" integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== dependencies: jsonc-parser "^3.2.0" mlly "^1.2.0" pathe "^1.1.0" +playwright-core@1.35.1: + version "1.35.1" + resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.35.1.tgz" + integrity sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg== + postcss-import@^14.1.0: version "14.1.0" resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" @@ -3569,7 +3584,7 @@ postcss@^8.3.11, postcss@^8.4.18, postcss@^8.4.19: postcss@^8.4.23: version "8.4.24" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz" integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== dependencies: nanoid "^3.3.6" @@ -3588,7 +3603,7 @@ prettier@^2.8.4: pretty-format@^27.0.2, pretty-format@^27.5.1: version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: ansi-regex "^5.0.1" @@ -3690,7 +3705,7 @@ react-is@^18.0.0: react-refresh@^0.14.0: version "0.14.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz" integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== react@^18.2.0: @@ -3728,7 +3743,7 @@ recoil@^0.7.7: redent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: indent-string "^4.0.0" @@ -3750,7 +3765,7 @@ regexp.prototype.flags@^1.4.3: regexp.prototype.flags@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz" integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" @@ -3804,7 +3819,7 @@ rimraf@^3.0.2: rollup@^3.21.0: version "3.26.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.26.0.tgz#9f2e0316a4ca641911cefd8515c562a9124e6130" + resolved "https://registry.npmjs.org/rollup/-/rollup-3.26.0.tgz" integrity sha512-YzJH0eunH2hr3knvF3i6IkLO/jTjAEwU4HoMUbQl4//Tnl3ou0e7P5SjxdDr8HQJdeUJShlbEHXrrnEHy1l7Yg== optionalDependencies: fsevents "~2.3.2" @@ -3871,7 +3886,7 @@ semver@^6.0.0, semver@^6.3.0: semver@^7.3.2: version "7.5.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz" integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== dependencies: lru-cache "^6.0.0" @@ -3911,7 +3926,7 @@ side-channel@^1.0.4: siginfo@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== simple-swizzle@^0.2.2: @@ -3938,7 +3953,7 @@ source-map-js@^1.0.2: source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== sprintf-js@~1.0.2: @@ -3955,17 +3970,17 @@ stack-utils@^2.0.3: stackback@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz" integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== std-env@^3.3.2: version "3.3.3" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.3.3.tgz#a54f06eb245fdcfef53d56f3c0251f1d5c3d01fe" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz" integrity sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg== stop-iteration-iterator@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== dependencies: internal-slot "^1.0.4" @@ -4021,7 +4036,7 @@ strip-bom@^3.0.0: strip-indent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" @@ -4033,7 +4048,7 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: strip-literal@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.0.1.tgz#0115a332710c849b4e46497891fb8d585e404bd2" + resolved "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz" integrity sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q== dependencies: acorn "^8.8.2" @@ -4134,7 +4149,7 @@ text-table@^0.2.0: time-zone@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" + resolved "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz" integrity sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA== tiny-glob@^0.2.9: @@ -4147,17 +4162,17 @@ tiny-glob@^0.2.9: tinybench@^2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.5.0.tgz#4711c99bbf6f3e986f67eb722fed9cddb3a68ba5" + resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz" integrity sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA== tinypool@^0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.5.0.tgz#3861c3069bf71e4f1f5aa2d2e6b3aaacc278961e" + resolved "https://registry.npmjs.org/tinypool/-/tinypool-0.5.0.tgz" integrity sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ== tinyspy@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.1.1.tgz#9e6371b00c259e5c5b301917ca18c01d40ae558c" + resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz" integrity sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w== to-fast-properties@^2.0.0: @@ -4184,7 +4199,7 @@ tough-cookie@^4.1.2: tr46@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + resolved "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz" integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== dependencies: punycode "^2.1.1" @@ -4245,7 +4260,7 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: ufo@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.1.2.tgz#d0d9e0fa09dece0c31ffd57bd363f030a35cfe76" + resolved "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz" integrity sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ== unbox-primitive@^1.0.2: @@ -4306,7 +4321,7 @@ util-deprecate@^1.0.2: v8-to-istanbul@^9.1.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz" integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" @@ -4315,7 +4330,7 @@ v8-to-istanbul@^9.1.0: vite-node@0.32.2: version "0.32.2" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.32.2.tgz#bfccdfeb708b2309ea9e5fe424951c75bb9c0096" + resolved "https://registry.npmjs.org/vite-node/-/vite-node-0.32.2.tgz" integrity sha512-dTQ1DCLwl2aEseov7cfQ+kDMNJpM1ebpyMMMwWzBvLbis8Nla/6c9WQcqpPssTwS6Rp/+U6KwlIj8Eapw4bLdA== dependencies: cac "^6.7.14" @@ -4327,7 +4342,7 @@ vite-node@0.32.2: "vite@^3.0.0 || ^4.0.0": version "4.3.9" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.9.tgz#db896200c0b1aa13b37cdc35c9e99ee2fdd5f96d" + resolved "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz" integrity sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg== dependencies: esbuild "^0.17.5" @@ -4338,7 +4353,7 @@ vite-node@0.32.2: vitest@^0.32.2: version "0.32.2" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.32.2.tgz#758ce2220f609e240ac054eca7ad11a5140679ab" + resolved "https://registry.npmjs.org/vitest/-/vitest-0.32.2.tgz" integrity sha512-hU8GNNuQfwuQmqTLfiKcqEhZY72Zxb7nnN07koCUNmntNxbKQnVbeIS6sqUgR3eXSlbOpit8+/gr1KpqoMgWCQ== dependencies: "@types/chai" "^4.3.5" @@ -4381,7 +4396,7 @@ webidl-conversions@^7.0.0: well-known-symbols@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5" + resolved "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz" integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== whatwg-encoding@^2.0.0: @@ -4398,7 +4413,7 @@ whatwg-mimetype@^3.0.0: whatwg-url@^11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz" integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== dependencies: tr46 "^3.0.0" @@ -4417,7 +4432,7 @@ which-boxed-primitive@^1.0.2: which-collection@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== dependencies: is-map "^2.0.1" @@ -4446,7 +4461,7 @@ which@^2.0.1: why-is-node-running@^2.2.2: version "2.2.2" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e" + resolved "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz" integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA== dependencies: siginfo "^2.0.0" @@ -4504,7 +4519,7 @@ yocto-queue@^0.1.0: yocto-queue@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== zenn-content-css@^0.1.81: From 9156efd3f7afb38cc9458bc265a0ec830215240a Mon Sep 17 00:00:00 2001 From: K-shir0 Date: Sun, 2 Jul 2023 11:39:08 +0900 Subject: [PATCH 2/2] =?UTF-8?q?add:=20index=20=E3=81=A8=20navbar=20?= =?UTF-8?q?=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __e2e__/index.test.ts | 8 ++ __e2e__/navbar.test.ts | 156 ++++++++++++++++++++++++++++ __e2e__/pages/Index.ts | 17 +++ __e2e__/pages/login.ts | 17 +++ __e2e__/pages/navbar.ts | 16 +++ __e2e__/pages/page.ts | 11 ++ __e2e__/pages/problems.ts | 17 +++ __e2e__/pages/profile.ts | 17 +++ __e2e__/pages/ranking.ts | 17 +++ __e2e__/pages/scoring.ts | 17 +++ __e2e__/pages/teamInfo.ts | 17 +++ __e2e__/pages/users.ts | 17 +++ __test__/components/Navbar.test.tsx | 2 +- components/Navbar.tsx | 8 +- hooks/api.ts | 6 +- hooks/auth.ts | 2 +- layouts/CommonLayout.tsx | 8 +- pages/login.tsx | 7 +- pages/problems/[problemId].tsx | 4 +- pages/profile.tsx | 4 +- pages/signup.tsx | 8 +- 21 files changed, 355 insertions(+), 21 deletions(-) create mode 100644 __e2e__/index.test.ts create mode 100644 __e2e__/navbar.test.ts create mode 100644 __e2e__/pages/Index.ts create mode 100644 __e2e__/pages/login.ts create mode 100644 __e2e__/pages/navbar.ts create mode 100644 __e2e__/pages/page.ts create mode 100644 __e2e__/pages/problems.ts create mode 100644 __e2e__/pages/profile.ts create mode 100644 __e2e__/pages/ranking.ts create mode 100644 __e2e__/pages/scoring.ts create mode 100644 __e2e__/pages/teamInfo.ts create mode 100644 __e2e__/pages/users.ts diff --git a/__e2e__/index.test.ts b/__e2e__/index.test.ts new file mode 100644 index 0000000..43503a1 --- /dev/null +++ b/__e2e__/index.test.ts @@ -0,0 +1,8 @@ +import { test } from "@playwright/test"; + +import IndexPage from "./pages/Index"; + +test("画面項目が表示されること", async ({ page }) => { + await IndexPage.goto(page); + await IndexPage.validate(page); +}); diff --git a/__e2e__/navbar.test.ts b/__e2e__/navbar.test.ts new file mode 100644 index 0000000..b34fbbc --- /dev/null +++ b/__e2e__/navbar.test.ts @@ -0,0 +1,156 @@ +import { expect, test } from "@playwright/test"; + +import IndexPage from "./pages/Index"; +import LoginPage from "./pages/login"; +import ICTSCNavbar from "./pages/navbar"; +import ProblemsPage from "./pages/problems"; +import ProfilePage from "./pages/profile"; +import RankingPage from "./pages/ranking"; +import ScoringPage from "./pages/scoring"; +import TeamInfoPage from "./pages/teamInfo"; +import UsersPage from "./pages/users"; + +test.describe("未ログイン状態", () => { + test("ログインページに遷移できる", async ({ page }) => { + // setup + await IndexPage.goto(page); + await IndexPage.validate(page); + + // when + await ICTSCNavbar.LoginLink(page).click(); + + // then + await LoginPage.waitFormSelector(page); + expect(page.url().split("/").pop()).toBe("login"); + await LoginPage.validate(page); + }); +}); + +test.describe("ログイン状態", () => { + test.beforeEach(async ({ page }) => { + await page.goto("/login"); + + await page.fill("#username", "admin"); + await page.fill("#password", "password"); + await page.click("#loginBtn"); + + // ログインに成功しましたというアラートが出るまで待つ + await page.waitForURL("/"); + // await page.waitForSelector(".alert-success"); + }); + + test("ルールページに遷移できる", async ({ page }) => { + // setup + await IndexPage.goto(page); + await IndexPage.validate(page); + + // when + await ICTSCNavbar.RuleLink(page).click(); + + // then + await IndexPage.waitFormSelector(page); + expect(page.url().split("/").pop()).toBe(""); + await IndexPage.validate(page); + }); + + test("チーム情報ページに遷移できる", async ({ page }) => { + // setup + await IndexPage.goto(page); + await IndexPage.validate(page); + + // when + await ICTSCNavbar.TeamInfoLink(page).click(); + + // then + await TeamInfoPage.waitFormSelector(page); + expect(page.url().split("/").pop()).toBe("team_info"); + await TeamInfoPage.validate(page); + }); + + test("問題ページに遷移できる", async ({ page }) => { + // setup + await IndexPage.goto(page); + await IndexPage.validate(page); + + // when + await ICTSCNavbar.ProblemsLink(page).click(); + + // then + await ProblemsPage.waitFormSelector(page); + expect(page.url().split("/").pop()).toBe("problems"); + await ProblemsPage.validate(page); + }); + + test("順位ページに遷移できる", async ({ page }) => { + // setup + await IndexPage.goto(page); + await IndexPage.validate(page); + + // when + await ICTSCNavbar.RankingLink(page).click(); + + // then + await RankingPage.waitFormSelector(page); + expect(page.url().split("/").pop()).toBe("ranking"); + await RankingPage.validate(page); + }); + + test("参加者ページに遷移できる", async ({ page }) => { + // setup + await IndexPage.goto(page); + await IndexPage.validate(page); + + // when + await ICTSCNavbar.UsersLink(page).click(); + + // then + await UsersPage.waitFormSelector(page); + expect(page.url().split("/").pop()).toBe("users"); + await UsersPage.validate(page); + }); + + test("採点ページに遷移できる", async ({ page }) => { + // setup + await IndexPage.goto(page); + await IndexPage.validate(page); + + // when + await ICTSCNavbar.ScoringLink(page).click(); + + // then + await ScoringPage.waitFormSelector(page); + expect(page.url().split("/").pop()).toBe("scoring"); + await ScoringPage.validate(page); + }); + + test("プロフィールページに遷移できる", async ({ page }) => { + // setup + await IndexPage.goto(page); + await IndexPage.validate(page); + await ICTSCNavbar.DropdownMenu(page).click(); + + // when + await ICTSCNavbar.ProfileLink(page).click(); + + // then + await ProfilePage.waitFormSelector(page); + expect(page.url().split("/").pop()).toBe("profile"); + await ProfilePage.validate(page); + }); + + test("ログアウトできる", async ({ page }) => { + // setup + // 初期は problems ページに遷移しておく indexページに設定してしまうと、同じページに遷移するためテストがうまくできない + await ProblemsPage.goto(page); + await ProblemsPage.validate(page); + await ICTSCNavbar.DropdownMenu(page).click(); + + // when + await ICTSCNavbar.LogoutButton(page).click(); + + // then + await IndexPage.waitFormSelector(page); + expect(page.url().split("/").pop()).toBe(""); + await expect(ICTSCNavbar.LoginLink(page)).toBeVisible(); + }); +}); diff --git a/__e2e__/pages/Index.ts b/__e2e__/pages/Index.ts new file mode 100644 index 0000000..8bb59ee --- /dev/null +++ b/__e2e__/pages/Index.ts @@ -0,0 +1,17 @@ +import { expect, Page } from "@playwright/test"; + +import BasePage from "./page"; + +const IndexPage: BasePage = { + goto: async (page: Page) => { + await page.goto("/"); + }, + validate: async (page: Page) => { + await expect(page.locator(".title-ictsc")).toHaveText("ルール"); + }, + waitFormSelector: async (page: Page) => { + await page.waitForSelector(".title-ictsc >> text=ルール"); + }, +}; + +export default IndexPage; diff --git a/__e2e__/pages/login.ts b/__e2e__/pages/login.ts new file mode 100644 index 0000000..5ab795c --- /dev/null +++ b/__e2e__/pages/login.ts @@ -0,0 +1,17 @@ +import { expect } from "@playwright/test"; + +import BasePage from "./page"; + +const LoginPage: BasePage = { + goto: async (page) => { + await page.goto("/login"); + }, + validate: async (page) => { + await expect(page.locator(".title-ictsc")).toHaveText("ログイン"); + }, + waitFormSelector: async (page) => { + await page.waitForSelector(".title-ictsc >> text=ログイン"); + }, +}; + +export default LoginPage; diff --git a/__e2e__/pages/navbar.ts b/__e2e__/pages/navbar.ts new file mode 100644 index 0000000..2c17663 --- /dev/null +++ b/__e2e__/pages/navbar.ts @@ -0,0 +1,16 @@ +import { Page } from "@playwright/test"; + +const ICTSCNavbar = { + RuleLink: (page: Page) => page.locator("a >> text=ルール"), + TeamInfoLink: (page: Page) => page.locator("a >> text=チーム情報"), + ProblemsLink: (page: Page) => page.locator("a >> text=問題"), + RankingLink: (page: Page) => page.locator("a >> text=順位"), + UsersLink: (page: Page) => page.locator("a >> text=参加者"), + ScoringLink: (page: Page) => page.locator("a >> text=採点"), + LoginLink: (page: Page) => page.locator("a >> text=ログイン"), + DropdownMenu: (page: Page) => page.getByText("admin", { exact: true }), + ProfileLink: (page: Page) => page.locator("a >> text=プロフィール"), + LogoutButton: (page: Page) => page.locator("button >> text=ログアウト"), +}; + +export default ICTSCNavbar; diff --git a/__e2e__/pages/page.ts b/__e2e__/pages/page.ts new file mode 100644 index 0000000..b310fad --- /dev/null +++ b/__e2e__/pages/page.ts @@ -0,0 +1,11 @@ +import { Page } from "@playwright/test"; + +type BasePage = { + goto(page: Page): Promise; + + validate(page: Page): Promise; + + waitFormSelector(page: Page): Promise; +}; + +export default BasePage; diff --git a/__e2e__/pages/problems.ts b/__e2e__/pages/problems.ts new file mode 100644 index 0000000..cf75358 --- /dev/null +++ b/__e2e__/pages/problems.ts @@ -0,0 +1,17 @@ +import { expect } from "@playwright/test"; + +import BasePage from "./page"; + +const ProblemsPage: BasePage = { + goto: async (page) => { + await page.goto("/problems"); + }, + validate: async (page) => { + await expect(page.locator(".title-ictsc")).toHaveText("問題一覧"); + }, + waitFormSelector: async (page) => { + await page.waitForSelector(".title-ictsc >> text=問題"); + }, +}; + +export default ProblemsPage; diff --git a/__e2e__/pages/profile.ts b/__e2e__/pages/profile.ts new file mode 100644 index 0000000..d5805da --- /dev/null +++ b/__e2e__/pages/profile.ts @@ -0,0 +1,17 @@ +import { expect } from "@playwright/test"; + +import BasePage from "./page"; + +const ProfilePage: BasePage = { + goto: async (page) => { + await page.goto("/profile"); + }, + validate: async (page) => { + await expect(page.locator(".title-ictsc")).toHaveText("プロフィール"); + }, + waitFormSelector: async (page) => { + await page.waitForSelector(".title-ictsc >> text=プロフィール"); + }, +}; + +export default ProfilePage; diff --git a/__e2e__/pages/ranking.ts b/__e2e__/pages/ranking.ts new file mode 100644 index 0000000..d8b4012 --- /dev/null +++ b/__e2e__/pages/ranking.ts @@ -0,0 +1,17 @@ +import { expect } from "@playwright/test"; + +import BasePage from "./page"; + +const RankingPage: BasePage = { + goto: async (page) => { + await page.goto("/ranking"); + }, + validate: async (page) => { + await expect(page.locator(".title-ictsc")).toHaveText("ランキング"); + }, + waitFormSelector: async (page) => { + await page.waitForSelector(".title-ictsc >> text=ランキング"); + }, +}; + +export default RankingPage; diff --git a/__e2e__/pages/scoring.ts b/__e2e__/pages/scoring.ts new file mode 100644 index 0000000..047285f --- /dev/null +++ b/__e2e__/pages/scoring.ts @@ -0,0 +1,17 @@ +import { expect } from "@playwright/test"; + +import BasePage from "./page"; + +const ScoringPage: BasePage = { + goto: async (page) => { + await page.goto("/scoring"); + }, + validate: async (page) => { + await expect(page.locator("th:nth-child(1)")).toHaveText("採点"); + }, + waitFormSelector: async (page) => { + await page.waitForSelector("th >> text=採点"); + }, +}; + +export default ScoringPage; diff --git a/__e2e__/pages/teamInfo.ts b/__e2e__/pages/teamInfo.ts new file mode 100644 index 0000000..7ce9c40 --- /dev/null +++ b/__e2e__/pages/teamInfo.ts @@ -0,0 +1,17 @@ +import { expect } from "@playwright/test"; + +import BasePage from "./page"; + +const TeamInfoPage: BasePage = { + goto: async (page) => { + await page.goto("/team_info"); + }, + validate: async (page) => { + await expect(page.locator(".title-ictsc")).toHaveText("チーム情報"); + }, + waitFormSelector: async (page) => { + await page.waitForSelector(".title-ictsc >> text=チーム情報"); + }, +}; + +export default TeamInfoPage; diff --git a/__e2e__/pages/users.ts b/__e2e__/pages/users.ts new file mode 100644 index 0000000..b67801a --- /dev/null +++ b/__e2e__/pages/users.ts @@ -0,0 +1,17 @@ +import { expect } from "@playwright/test"; + +import BasePage from "./page"; + +const UsersPage: BasePage = { + goto: async (page) => { + await page.goto("/users"); + }, + validate: async (page) => { + await expect(page.locator(".title-ictsc")).toHaveText("参加者一覧"); + }, + waitFormSelector: async (page) => { + await page.waitForSelector(".title-ictsc >> text=参加者"); + }, +}; + +export default UsersPage; diff --git a/__test__/components/Navbar.test.tsx b/__test__/components/Navbar.test.tsx index b6cf144..e9a3a28 100644 --- a/__test__/components/Navbar.test.tsx +++ b/__test__/components/Navbar.test.tsx @@ -106,7 +106,7 @@ describe("参加者ログイン状態 ICTSCNavBar", () => { }); // verify - expect(useAuth).toHaveBeenCalledTimes(2); + expect(useAuth).toHaveBeenCalledTimes(1); expect(logout).toHaveBeenCalledTimes(1); }); }); diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 7256cf9..edabf3f 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -1,18 +1,20 @@ import Link from "next/link"; import { useRouter } from "next/router"; +import { mutate } from "swr"; + import useAuth from "@/hooks/auth"; function ICTSCNavBar() { const router = useRouter(); - const { user, logout, mutate } = useAuth(); + const { user, logout } = useAuth(); const handleLogout = async () => { const response = await logout(); - if (response.status === 200) { - await mutate(); + if (response.code === 200) { + await mutate(() => true, undefined, { revalidate: true }); await router.push("/"); } }; diff --git a/hooks/api.ts b/hooks/api.ts index fd99174..56f50e2 100644 --- a/hooks/api.ts +++ b/hooks/api.ts @@ -18,13 +18,13 @@ const useApi = () => { get: (url: string) => apiClient.get>(url).then((response) => response.data), post: (url: string, data?: any) => - apiClient.post(url, data).then((response) => response.data), + apiClient.post>(url, data).then((response) => response.data), put: (url: string, data?: any) => - apiClient.put(url, data).then((response) => response.data), + apiClient.put>(url, data).then((response) => response.data), patch: (url: string, data?: any) => apiClient.patch>(url, data).then((response) => response.data), delete: (url: string) => - apiClient.delete(url).then((response) => response.data), + apiClient.delete>(url).then((response) => response.data), }; return { client }; diff --git a/hooks/auth.ts b/hooks/auth.ts index ce2aea3..9a1c6de 100644 --- a/hooks/auth.ts +++ b/hooks/auth.ts @@ -9,7 +9,7 @@ const useAuth = () => { const fetcher = (url: string) => client.get(url); const { data, mutate, isLoading } = useSWR("auth/self", fetcher); - const logout = () => client.delete("auth/logout"); + const logout = async () => client.delete("auth/signout"); return { user: data?.data?.user ?? null, diff --git a/layouts/CommonLayout.tsx b/layouts/CommonLayout.tsx index da99fed..c071afd 100644 --- a/layouts/CommonLayout.tsx +++ b/layouts/CommonLayout.tsx @@ -7,13 +7,15 @@ interface Props { children: React.ReactNode; } -const CommonLayout = ({ title, children }: Props) => { +function CommonLayout({ title, children }: Props) { return ( -

{title}

+

+ {title} +

{children}
); -}; +} export default CommonLayout; diff --git a/pages/login.tsx b/pages/login.tsx index 88db8b1..f484e69 100644 --- a/pages/login.tsx +++ b/pages/login.tsx @@ -36,9 +36,9 @@ function Login() { const response = await client.post("auth/signin", data); setSubmitting(false); - setStatus(response.status); + setStatus(response.code); - if (response.status === 200) { + if (response.code === 200) { await mutate(); await router.push("/"); } @@ -63,6 +63,7 @@ function Login() { {...register("name", { required: true })} type="text" placeholder="ユーザー名" + id="username" className="input input-bordered max-w-xs min-w-[312px]" />
@@ -76,6 +77,7 @@ function Login() { {...register("password", { required: true })} type="password" placeholder="パスワード" + id="password" className="input input-bordered max-w-xs min-w-[312px] mt-4" />
@@ -87,6 +89,7 @@ function Login() {