From 9d143c977a3ad20a78200645edaeb812ce8db5f2 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 20 Jan 2026 20:48:00 +0000 Subject: [PATCH 01/11] Remove manual vitest matcher types Co-authored-by: me --- .../01.problem.installation-and-setup/README.mdx | 10 +++------- .../tsconfig.test.json | 2 +- .../02.problem.migrate-the-test/tsconfig.test.json | 2 +- .../02.solution.migrate-the-test/tsconfig.test.json | 2 +- .../03.problem.playwright/README.mdx | 2 +- .../03.problem.playwright/tsconfig.test.json | 6 ++---- .../03.solution.playwright/README.mdx | 3 +-- 7 files changed, 10 insertions(+), 17 deletions(-) diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx index 4a8f855..1928a33 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx @@ -76,7 +76,7 @@ export default defineConfig({ ## Configure TypeScript -The last thing that remains is to extend the TypeScript configuration to recognize DOM-specific matches, like `expect().toBeVisible()` as they come built-in in Vitest. +The last thing that remains is to make sure TypeScript sees the Vitest globals. Browser matcher types are included by default in Vitest 4, so there is nothing extra to add. First, I will remove the `import '@testing-library/jest-dom/vitest'` import we previously had in the test: @@ -84,7 +84,7 @@ First, I will remove the `import '@testing-library/jest-dom/vitest'` import we p import '@testing-library/jest-dom/vitest' ``` -And replace it with a type reference to Vitest's browser matchers in `tsconfig.test.json`: +Finally, confirm that `tsconfig.test.json` only includes `vitest/globals` in `compilerOptions.types`: ```json filename=tsconfig.test.json add=9 { @@ -92,11 +92,7 @@ And replace it with a type reference to Vitest's browser matchers in `tsconfig.t "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": [ - "vitest/globals", - // 👇 - "@vitest/browser/matchers" - ] + "types": ["vitest/globals"] } } ``` diff --git a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json index bfa76d1..3b4ebef 100644 --- a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/matchers"] + "types": ["vitest/globals"] } } diff --git a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json index bfa76d1..3b4ebef 100644 --- a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/matchers"] + "types": ["vitest/globals"] } } diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json index bfa76d1..3b4ebef 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/matchers"] + "types": ["vitest/globals"] } } diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx b/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx index 23f0ca1..d106385 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx @@ -23,6 +23,6 @@ In this workshop, we will be using Playwright as the browser provider for Vitest 1. Install `playwright` as a dependency in the project; 1. In `vite.config.ts`, update `test.browser.provider` to use `'playwright'` as the browser provider; -1. In `tsconfig.test.json`, update the `compilerOptions.types` to include the Playwright type definitions for `expect()` matchers. +1. In `tsconfig.test.json`, update the `compilerOptions.types` to include the Playwright browser provider types (these also provide the matcher typings). Once you are done with it, make sure that the tests are still passing by running `npm test`. Good luck! diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json b/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json index 4ee7dd6..cdd4ee0 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json @@ -4,11 +4,9 @@ "exclude": [], "compilerOptions": { "types": [ - "vitest/globals", - // 💣 Remove the default browser matcher types. - "@vitest/browser/matchers" + "vitest/globals" - // 🐨 Instead, include the matcher types from Playwright. + // 🐨 Add the Playwright browser provider types. // 💰 "@vitest/browser/providers/playwright" ] } diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx b/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx index d219c35..d937b2e 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx @@ -41,7 +41,7 @@ export default defineConfig({ }) ``` -And, finally, let's update the type definitions for the assertion matchers to be those from Playwright in `tsconfig.test.json`: +And, finally, let's add the Playwright browser provider types in `tsconfig.test.json`: ```json filename=tsconfig.test.json remove=9 add=10 { @@ -52,7 +52,6 @@ And, finally, let's update the type definitions for the assertion matchers to be "module": "preserve", "types": [ "vitest/globals", - "@vitest/browser/matchers", "@vitest/browser/providers/playwright" ] } From bb703695601150e1dca6b2b0ff164ae674bc7d49 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 20 Jan 2026 20:52:19 +0000 Subject: [PATCH 02/11] Update vitest dependencies to v4 Co-authored-by: me --- .../01.problem.break-jsdom/package.json | 3 +- .../01.solution.break-jsdom/package.json | 3 +- .../package.json | 4 +- .../package.json | 4 +- .../02.problem.migrate-the-test/package.json | 4 +- .../02.solution.migrate-the-test/package.json | 4 +- .../03.problem.playwright/package.json | 4 +- .../03.solution.playwright/package.json | 4 +- .../04.problem.shared-assets/package.json | 4 +- .../04.solution.shared-assets/package.json | 4 +- .../package.json | 4 +- .../package.json | 4 +- .../01.problem.queries/package.json | 4 +- .../01.solution.queries/package.json | 4 +- .../02.problem.user-events/package.json | 4 +- .../02.solution.user-events/package.json | 4 +- .../03.problem.network-mocking/package.json | 4 +- .../03.solution.network-mocking/package.json | 4 +- .../04.problem.element-presence/package.json | 4 +- .../04.solution.element-presence/package.json | 4 +- .../05.problem.page-navigation/package.json | 4 +- .../05.solution.page-navigation/package.json | 4 +- .../01.problem.dom-snapshots/package.json | 4 +- .../01.solution.dom-snapshots/package.json | 4 +- .../02.problem.debugger/package.json | 4 +- .../02.solution.debugger/package.json | 4 +- .../03.problem.breakpoints/package.json | 4 +- .../03.solution.breakpoints/package.json | 4 +- package-lock.json | 8597 +++++++++++++++-- 29 files changed, 7751 insertions(+), 956 deletions(-) diff --git a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/package.json b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/package.json index 3305645..dfcf42f 100644 --- a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/package.json +++ b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/package.json @@ -7,6 +7,7 @@ "build": "vite build" }, "dependencies": { + "@vitest/browser": "^4.0.17", "react": "^19.0.0", "react-dom": "^19.0.0" }, @@ -22,6 +23,6 @@ "jsdom": "^26.0.0", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/package.json b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/package.json index d961e7d..cf51644 100644 --- a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/package.json +++ b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/package.json @@ -7,6 +7,7 @@ "build": "vite build" }, "dependencies": { + "@vitest/browser": "^4.0.17", "react": "^19.0.0", "react-dom": "^19.0.0" }, @@ -21,6 +22,6 @@ "jsdom": "^26.0.0", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/package.json b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/package.json index eb169bc..9fec4f5 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/package.json +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/package.json @@ -17,10 +17,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.0.5", + "@vitest/browser": "^4.0.17", "jsdom": "^26.0.0", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.0.7" + "vitest": "^4.0.17" } } diff --git a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/package.json b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/package.json index ef37c3e..b28c9e9 100644 --- a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/package.json +++ b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0", + "vitest": "^4.0.17", "vitest-browser-react": "^0.2.0" } } diff --git a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/package.json b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/package.json index 6db3deb..a2c0ea3 100644 --- a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/package.json +++ b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0", + "vitest": "^4.0.17", "vitest-browser-react": "^0.2.0" } } diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/package.json b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/package.json index a2b24b4..1a84b43 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/package.json +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/package.json @@ -15,9 +15,9 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/package.json b/exercises/02.vitest-browser-mode/03.problem.playwright/package.json index 6264b83..e69844a 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/package.json +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/package.json @@ -15,9 +15,9 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/package.json b/exercises/02.vitest-browser-mode/03.solution.playwright/package.json index 7a0447a..e6b297c 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/package.json +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/02.vitest-browser-mode/04.problem.shared-assets/package.json b/exercises/02.vitest-browser-mode/04.problem.shared-assets/package.json index 6ecb443..db44386 100644 --- a/exercises/02.vitest-browser-mode/04.problem.shared-assets/package.json +++ b/exercises/02.vitest-browser-mode/04.problem.shared-assets/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/package.json b/exercises/02.vitest-browser-mode/04.solution.shared-assets/package.json index 419412e..04a345a 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/package.json +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/package.json b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/package.json index 25c4532..9a4dfb5 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/package.json +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/package.json b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/package.json index d029c25..a39186a 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/package.json +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/package.json @@ -18,10 +18,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/03.best-practices/01.problem.queries/package.json b/exercises/03.best-practices/01.problem.queries/package.json index 729f665..364c6ef 100644 --- a/exercises/03.best-practices/01.problem.queries/package.json +++ b/exercises/03.best-practices/01.problem.queries/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/03.best-practices/01.solution.queries/package.json b/exercises/03.best-practices/01.solution.queries/package.json index 59df7ba..dff6ecf 100644 --- a/exercises/03.best-practices/01.solution.queries/package.json +++ b/exercises/03.best-practices/01.solution.queries/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/03.best-practices/02.problem.user-events/package.json b/exercises/03.best-practices/02.problem.user-events/package.json index f315432..70c7e79 100644 --- a/exercises/03.best-practices/02.problem.user-events/package.json +++ b/exercises/03.best-practices/02.problem.user-events/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/03.best-practices/02.solution.user-events/package.json b/exercises/03.best-practices/02.solution.user-events/package.json index d0c19c6..d13b4e0 100644 --- a/exercises/03.best-practices/02.solution.user-events/package.json +++ b/exercises/03.best-practices/02.solution.user-events/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/03.best-practices/03.problem.network-mocking/package.json b/exercises/03.best-practices/03.problem.network-mocking/package.json index f1851db..e91b5a1 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/package.json +++ b/exercises/03.best-practices/03.problem.network-mocking/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/03.best-practices/03.solution.network-mocking/package.json b/exercises/03.best-practices/03.solution.network-mocking/package.json index dd9d29c..46ae404 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/package.json +++ b/exercises/03.best-practices/03.solution.network-mocking/package.json @@ -15,12 +15,12 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" }, "msw": { "workerDirectory": [ diff --git a/exercises/03.best-practices/04.problem.element-presence/package.json b/exercises/03.best-practices/04.problem.element-presence/package.json index 4f89df4..dbe6640 100644 --- a/exercises/03.best-practices/04.problem.element-presence/package.json +++ b/exercises/03.best-practices/04.problem.element-presence/package.json @@ -15,12 +15,12 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" }, "msw": { "workerDirectory": [ diff --git a/exercises/03.best-practices/04.solution.element-presence/package.json b/exercises/03.best-practices/04.solution.element-presence/package.json index 1bccd9d..878d236 100644 --- a/exercises/03.best-practices/04.solution.element-presence/package.json +++ b/exercises/03.best-practices/04.solution.element-presence/package.json @@ -15,12 +15,12 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" }, "msw": { "workerDirectory": [ diff --git a/exercises/03.best-practices/05.problem.page-navigation/package.json b/exercises/03.best-practices/05.problem.page-navigation/package.json index 2565511..2eede1a 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/package.json +++ b/exercises/03.best-practices/05.problem.page-navigation/package.json @@ -16,12 +16,12 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" }, "msw": { "workerDirectory": [ diff --git a/exercises/03.best-practices/05.solution.page-navigation/package.json b/exercises/03.best-practices/05.solution.page-navigation/package.json index b2e3e0a..c0529b9 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/package.json +++ b/exercises/03.best-practices/05.solution.page-navigation/package.json @@ -16,12 +16,12 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" }, "msw": { "workerDirectory": [ diff --git a/exercises/04.debugging/01.problem.dom-snapshots/package.json b/exercises/04.debugging/01.problem.dom-snapshots/package.json index 6dbd007..72212f6 100644 --- a/exercises/04.debugging/01.problem.dom-snapshots/package.json +++ b/exercises/04.debugging/01.problem.dom-snapshots/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/04.debugging/01.solution.dom-snapshots/package.json b/exercises/04.debugging/01.solution.dom-snapshots/package.json index 4cecb69..164487c 100644 --- a/exercises/04.debugging/01.solution.dom-snapshots/package.json +++ b/exercises/04.debugging/01.solution.dom-snapshots/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/04.debugging/02.problem.debugger/package.json b/exercises/04.debugging/02.problem.debugger/package.json index b80ffdc..960f2c0 100644 --- a/exercises/04.debugging/02.problem.debugger/package.json +++ b/exercises/04.debugging/02.problem.debugger/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/04.debugging/02.solution.debugger/package.json b/exercises/04.debugging/02.solution.debugger/package.json index a7bfa96..0d7bc60 100644 --- a/exercises/04.debugging/02.solution.debugger/package.json +++ b/exercises/04.debugging/02.solution.debugger/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/04.debugging/03.problem.breakpoints/package.json b/exercises/04.debugging/03.problem.breakpoints/package.json index 739f2e7..8c9bf7b 100644 --- a/exercises/04.debugging/03.problem.breakpoints/package.json +++ b/exercises/04.debugging/03.problem.breakpoints/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/exercises/04.debugging/03.solution.breakpoints/package.json b/exercises/04.debugging/03.solution.breakpoints/package.json index caba5c1..116d9c1 100644 --- a/exercises/04.debugging/03.solution.breakpoints/package.json +++ b/exercises/04.debugging/03.solution.breakpoints/package.json @@ -15,10 +15,10 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } } diff --git a/package-lock.json b/package-lock.json index 3ebab6a..9aa8bb5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "exercises/01.sunsetting-jsdom/01.problem.break-jsdom": { "name": "exercises_01.sunsetting-jsdom_01.problem.break-jsdom", "dependencies": { + "@vitest/browser": "^4.0.17", "react": "^19.0.0", "react-dom": "^19.0.0" }, @@ -41,12 +42,262 @@ "jsdom": "^26.0.0", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" + } + }, + "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } } }, "exercises/01.sunsetting-jsdom/01.solution.break-jsdom": { "name": "exercises_01.sunsetting-jsdom_01.solution.break-jsdom", "dependencies": { + "@vitest/browser": "^4.0.17", "react": "^19.0.0", "react-dom": "^19.0.0" }, @@ -61,284 +312,7152 @@ "jsdom": "^26.0.0", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" + } + }, + "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/01.problem.installation-and-setup": { + "name": "exercises_02.vitest-browser-mode_01.problem.installation-and-setup", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.1.0", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "jsdom": "^26.0.0", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/01.solution.installation-and-setup": { + "name": "exercises_02.vitest-browser-mode_01.solution.installation-and-setup", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17", + "vitest-browser-react": "^0.2.0" + } + }, + "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test": { + "name": "exercises_02.vitest-browser-mode_02.problem.migrate-the-test", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17", + "vitest-browser-react": "^0.2.0" + } + }, + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/02.solution.migrate-the-test": { + "name": "exercises_02.vitest-browser-mode_02.solution.migrate-the-test", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/03.problem.playwright": { + "name": "exercises_02.vitest-browser-mode_03.problem.playwright", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/03.solution.playwright": { + "name": "exercises_02.vitest-browser-mode_03.solution.playwright", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/04.problem.shared-assets": { + "name": "exercises_02.vitest-browser-mode_04.problem.shared-assets", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/04.solution.shared-assets": { + "name": "exercises_02.vitest-browser-mode_04.solution.shared-assets", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces": { + "name": "exercises_02.vitest-browser-mode_05.problem.multiple-workspaces", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces": { + "name": "exercises_02.vitest-browser-mode_05.solution.multiple-workspaces", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/node": "^22.10.6", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/03.best-practices/01.problem.accessibility-selectors": { + "name": "exercises_03.best-practices_01.problem.accessibility-selectors", + "extraneous": true, + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^3.0.7", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^3.0.7" + } + }, + "exercises/03.best-practices/01.problem.queries": { + "name": "exercises_03.best-practices_01.problem.queries", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/01.problem.queries/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/01.problem.queries/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/03.best-practices/01.problem.queries/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/01.problem.queries/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/03.best-practices/01.problem.queries/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/03.best-practices/01.solution.accessibility-selectors": { + "name": "exercises_03.best-practices_01.solution.accessibility-selectors", + "extraneous": true, + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^3.0.7", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^3.0.7" + } + }, + "exercises/03.best-practices/01.solution.queries": { + "name": "exercises_03.best-practices_01.solution.queries", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/01.solution.queries/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/01.solution.queries/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/03.best-practices/01.solution.queries/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/01.solution.queries/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/03.best-practices/01.solution.queries/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/03.best-practices/02.problem.user-events": { + "name": "exercises_03.best-practices_02.problem.user-events", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/02.problem.user-events/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/02.problem.user-events/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/03.best-practices/02.problem.user-events/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/02.problem.user-events/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/03.best-practices/02.problem.user-events/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/03.best-practices/02.solution.user-events": { + "name": "exercises_03.best-practices_02.solution.user-events", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/02.solution.user-events/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/02.solution.user-events/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/03.best-practices/02.solution.user-events/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/02.solution.user-events/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/03.best-practices/02.solution.user-events/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/03.best-practices/03.problem.network-mocking": { + "name": "exercises_03.best-practices_03.problem.network-mocking", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/03.problem.network-mocking/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/03.problem.network-mocking/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/03.best-practices/03.problem.network-mocking/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/03.problem.network-mocking/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/03.best-practices/03.problem.network-mocking/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/03.best-practices/03.solution.network-mocking": { + "name": "exercises_03.best-practices_03.solution.network-mocking", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "msw": "^2.7.3", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/03.solution.network-mocking/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/03.solution.network-mocking/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/03.best-practices/03.solution.network-mocking/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/03.solution.network-mocking/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/03.best-practices/03.solution.network-mocking/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/03.best-practices/04.problem.element-presence": { + "name": "exercises_03.best-practices_04.problem.element-presence", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "msw": "^2.7.3", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/04.problem.element-presence/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/04.problem.element-presence/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/03.best-practices/04.problem.element-presence/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/04.problem.element-presence/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/03.best-practices/04.problem.element-presence/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/03.best-practices/04.solution.element-presence": { + "name": "exercises_03.best-practices_04.solution.element-presence", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "msw": "^2.7.3", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/04.solution.element-presence/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/04.solution.element-presence/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/03.best-practices/04.solution.element-presence/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/04.solution.element-presence/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/03.best-practices/04.solution.element-presence/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/03.best-practices/05.problem.page-navigation": { + "name": "exercises_03.best-practices_05.problem.page-navigation", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router": "^7.2.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "msw": "^2.7.3", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/05.problem.page-navigation/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/05.problem.page-navigation/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/03.best-practices/05.problem.page-navigation/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/05.problem.page-navigation/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/03.best-practices/05.problem.page-navigation/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/03.best-practices/05.solution.page-navigation": { + "name": "exercises_03.best-practices_05.solution.page-navigation", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router": "^7.2.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "msw": "^2.7.3", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/03.best-practices/05.solution.page-navigation/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/05.solution.page-navigation/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/03.best-practices/05.solution.page-navigation/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/03.best-practices/05.solution.page-navigation/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/03.best-practices/05.solution.page-navigation/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/03.best-practices/06.solution.react-hooks": { + "name": "exercises_03.best-practices_06.solution.react-hooks", + "extraneous": true, + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.7", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^3.0.5", + "msw": "^2.7.0", + "playwright": "^1.49.1", + "react-router": "^7.1.3", + "tailwindcss": "^4.0.7", + "vite": "^6.0.7", + "vitest": "^3.0.5" + } + }, + "exercises/04.debugging/01.problem.dom-snapshots": { + "name": "exercises_04.debugging_01.problem.dom-snapshots", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/01.problem.dom-snapshots/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/04.debugging/01.problem.dom-snapshots/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/04.debugging/01.problem.dom-snapshots/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/04.debugging/01.problem.dom-snapshots/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/04.debugging/01.problem.dom-snapshots/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/04.debugging/01.solution.dom-snapshots": { + "name": "exercises_04.debugging_01.solution.dom-snapshots", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/01.solution.dom-snapshots/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/04.debugging/01.solution.dom-snapshots/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/04.debugging/01.solution.dom-snapshots/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/04.debugging/01.solution.dom-snapshots/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/04.debugging/01.solution.dom-snapshots/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/04.debugging/02.problem.debugger": { + "name": "exercises_04.debugging_02.problem.debugger", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/02.problem.debugger/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/04.debugging/02.problem.debugger/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/04.debugging/02.problem.debugger/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/04.debugging/02.problem.debugger/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/04.debugging/02.problem.debugger/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "exercises/04.debugging/02.solution.debugger": { + "name": "exercises_04.debugging_02.solution.debugger", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "exercises/04.debugging/02.solution.debugger/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/04.debugging/02.solution.debugger/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "exercises/04.debugging/02.solution.debugger/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "exercises/04.debugging/02.solution.debugger/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "exercises/04.debugging/02.solution.debugger/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } } }, - "exercises/02.vitest-browser-mode/01.problem.installation-and-setup": { - "name": "exercises_02.vitest-browser-mode_01.problem.installation-and-setup", + "exercises/04.debugging/03.problem.breakpoints": { + "name": "exercises_04.debugging_03.problem.breakpoints", "dependencies": { "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { "@tailwindcss/vite": "^4.0.11", - "@testing-library/dom": "^10.4.0", - "@testing-library/react": "^16.1.0", "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.0.5", - "jsdom": "^26.0.0", + "@vitest/browser": "^4.0.17", + "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.0.7" + "vitest": "^4.0.17" } }, - "exercises/02.vitest-browser-mode/01.solution.installation-and-setup": { - "name": "exercises_02.vitest-browser-mode_01.solution.installation-and-setup", + "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0", - "vitest-browser-react": "^0.2.0" - } - }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test": { - "name": "exercises_02.vitest-browser-mode_02.problem.migrate-the-test", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "funding": { + "url": "https://opencollective.com/vitest" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0", - "vitest-browser-react": "^0.2.0" + "peerDependencies": { + "vitest": "4.0.17" } }, - "exercises/02.vitest-browser-mode/02.solution.migrate-the-test": { - "name": "exercises_02.vitest-browser-mode_02.solution.migrate-the-test", + "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "exercises/02.vitest-browser-mode/03.problem.playwright": { - "name": "exercises_02.vitest-browser-mode_03.problem.playwright", + "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "exercises/02.vitest-browser-mode/03.solution.playwright": { - "name": "exercises_02.vitest-browser-mode_03.solution.playwright", + "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "tinyrainbow": "^3.0.3" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "exercises/02.vitest-browser-mode/04.problem.shared-assets": { - "name": "exercises_02.vitest-browser-mode_04.problem.shared-assets", + "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "exercises/02.vitest-browser-mode/04.solution.shared-assets": { - "name": "exercises_02.vitest-browser-mode_04.solution.shared-assets", + "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces": { - "name": "exercises_02.vitest-browser-mode_05.problem.multiple-workspaces", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" } }, - "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces": { - "name": "exercises_02.vitest-browser-mode_05.solution.multiple-workspaces", + "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/node": "^22.10.6", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "exercises/03.best-practices/01.problem.accessibility-selectors": { - "name": "exercises_03.best-practices_01.problem.accessibility-selectors", - "extraneous": true, - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.0.7", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.0.7" + "exercises/04.debugging/03.problem.breakpoints/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" } }, - "exercises/03.best-practices/01.problem.queries": { - "name": "exercises_03.best-practices_01.problem.queries", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "exercises/04.debugging/03.problem.breakpoints/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "exercises/03.best-practices/01.solution.accessibility-selectors": { - "name": "exercises_03.best-practices_01.solution.accessibility-selectors", - "extraneous": true, - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.0.7", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.0.7" + "exercises/04.debugging/03.problem.breakpoints/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" } }, - "exercises/03.best-practices/01.solution.queries": { - "name": "exercises_03.best-practices_01.solution.queries", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "exercises/04.debugging/03.problem.breakpoints/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" } }, - "exercises/03.best-practices/02.problem.user-events": { - "name": "exercises_03.best-practices_02.problem.user-events", + "exercises/04.debugging/03.problem.breakpoints/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } } }, - "exercises/03.best-practices/02.solution.user-events": { - "name": "exercises_03.best-practices_02.solution.user-events", + "exercises/04.debugging/03.solution.breakpoints": { + "name": "exercises_04.debugging_03.solution.breakpoints", "dependencies": { "react": "^19.0.0", "react-dom": "^19.0.0" @@ -348,255 +7467,266 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", + "@vitest/browser": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^3.2.0" + "vitest": "^4.0.17" } }, - "exercises/03.best-practices/03.problem.network-mocking": { - "name": "exercises_03.best-practices_03.problem.network-mocking", + "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" } }, - "exercises/03.best-practices/03.solution.network-mocking": { - "name": "exercises_03.best-practices_03.solution.network-mocking", + "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "msw": "^2.7.3", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "exercises/03.best-practices/04.problem.element-presence": { - "name": "exercises_03.best-practices_04.problem.element-presence", + "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "msw": "^2.7.3", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "exercises/03.best-practices/04.solution.element-presence": { - "name": "exercises_03.best-practices_04.solution.element-presence", + "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "tinyrainbow": "^3.0.3" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "msw": "^2.7.3", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "exercises/03.best-practices/05.problem.page-navigation": { - "name": "exercises_03.best-practices_05.problem.page-navigation", + "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-router": "^7.2.0" + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "msw": "^2.7.3", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "exercises/03.best-practices/05.solution.page-navigation": { - "name": "exercises_03.best-practices_05.solution.page-navigation", + "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-router": "^7.2.0" + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "msw": "^2.7.3", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "exercises/03.best-practices/06.solution.react-hooks": { - "name": "exercises_03.best-practices_06.solution.react-hooks", - "extraneous": true, - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.7", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.0.5", - "msw": "^2.7.0", - "playwright": "^1.49.1", - "react-router": "^7.1.3", - "tailwindcss": "^4.0.7", - "vite": "^6.0.7", - "vitest": "^3.0.5" + "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" } }, - "exercises/04.debugging/01.problem.dom-snapshots": { - "name": "exercises_04.debugging_01.problem.dom-snapshots", + "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "exercises/04.debugging/01.solution.dom-snapshots": { - "name": "exercises_04.debugging_01.solution.dom-snapshots", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "exercises/04.debugging/03.solution.breakpoints/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" } }, - "exercises/04.debugging/02.problem.debugger": { - "name": "exercises_04.debugging_02.problem.debugger", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "exercises/04.debugging/03.solution.breakpoints/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "exercises/04.debugging/02.solution.debugger": { - "name": "exercises_04.debugging_02.solution.debugger", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "exercises/04.debugging/03.solution.breakpoints/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" } }, - "exercises/04.debugging/03.problem.breakpoints": { - "name": "exercises_04.debugging_03.problem.breakpoints", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "exercises/04.debugging/03.solution.breakpoints/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" } }, - "exercises/04.debugging/03.solution.breakpoints": { - "name": "exercises_04.debugging_03.solution.breakpoints", + "exercises/04.debugging/03.solution.breakpoints/node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.2.0", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.2.0" + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } } }, "exercises/04.debugging/04.problem.debug-console": { @@ -1937,10 +9067,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -2039,7 +9168,6 @@ "version": "1.0.0-next.28", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", - "dev": true, "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { @@ -2308,6 +9436,13 @@ "win32" ] }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, "node_modules/@tailwindcss/node": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.11.tgz", @@ -2743,7 +9878,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, "license": "MIT" }, "node_modules/@types/gensync": { @@ -2949,256 +10083,106 @@ "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.0.tgz", - "integrity": "sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.24.0", - "@typescript-eslint/types": "8.24.0", - "@typescript-eslint/typescript-estree": "8.24.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.0.tgz", - "integrity": "sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.24.0", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", - "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.26.0", - "@babel/plugin-transform-react-jsx-self": "^7.25.9", - "@babel/plugin-transform-react-jsx-source": "^7.25.9", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" - } - }, - "node_modules/@vitest/browser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-3.2.0.tgz", - "integrity": "sha512-sVpX5m53lX9/0ehAqkcTSQeJK1SVlTlvBrwE8rPQ2KJQgb/Iiorx+3y+VQdzIJ+CDqfG89bQEA5l1Z02VogDsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@testing-library/dom": "^10.4.0", - "@testing-library/user-event": "^14.6.1", - "@vitest/mocker": "3.2.0", - "@vitest/utils": "3.2.0", - "magic-string": "^0.30.17", - "sirv": "^3.0.1", - "tinyrainbow": "^2.0.0", - "ws": "^8.18.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "playwright": "*", - "vitest": "3.2.0", - "webdriverio": "^7.0.0 || ^8.0.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } - } - }, - "node_modules/@vitest/eslint-plugin": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.31.tgz", - "integrity": "sha512-xlsLr+e+AXZ/00eVZCtNmMeCJoJaRCoLDiAgLcxgQjSS1EertieB2MUHf8xIqPKs9lECc/UpL+y1xDcpvi02hw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@typescript-eslint/utils": ">= 8.0", - "eslint": ">= 8.57.0", - "typescript": ">= 5.0.0", - "vitest": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@vitest/expect": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.0.tgz", - "integrity": "sha512-0v4YVbhDKX3SKoy0PHWXpKhj44w+3zZkIoVES9Ex2pq+u6+Bijijbi2ua5kE+h3qT6LBWFTNZSCOEU37H8Y5sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.0", - "@vitest/utils": "3.2.0", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.0.tgz", - "integrity": "sha512-HFcW0lAMx3eN9vQqis63H0Pscv0QcVMo1Kv8BNysZbxcmHu3ZUYv59DS6BGYiGQ8F5lUkmsfMMlPm4DJFJdf/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.2.0", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } + "balanced-match": "^1.0.0" } }, - "node_modules/@vitest/pretty-format": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.0.tgz", - "integrity": "sha512-gUUhaUmPBHFkrqnOokmfMGRBMHhgpICud9nrz/xpNV3/4OXCn35oG+Pl8rYYsKaTNd/FAIrqRHnwpDpmYxCYZw==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "tinyrainbow": "^2.0.0" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@vitest/runner": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.0.tgz", - "integrity": "sha512-bXdmnHxuB7fXJdh+8vvnlwi/m1zvu+I06i1dICVcDQFhyV4iKw2RExC/acavtDn93m/dRuawUObKsrNE1gJacA==", + "node_modules/@typescript-eslint/utils": { + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.0.tgz", + "integrity": "sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.0", - "pathe": "^2.0.3" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.24.0", + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/typescript-estree": "8.24.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@vitest/snapshot": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.0.tgz", - "integrity": "sha512-z7P/EneBRMe7hdvWhcHoXjhA6at0Q4ipcoZo6SqgxLyQQ8KSMMCmvw1cSt7FHib3ozt0wnRHc37ivuUMbxzG/A==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.0.tgz", + "integrity": "sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.0", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" + "@typescript-eslint/types": "8.24.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@vitest/spy": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.0.tgz", - "integrity": "sha512-s3+TkCNUIEOX99S0JwNDfsHRaZDDZZR/n8F0mop0PmsEbQGKZikCGpTGZ6JRiHuONKew3Fb5//EPwCP+pUX9cw==", + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^4.0.3" + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, - "node_modules/@vitest/utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.0.tgz", - "integrity": "sha512-gXXOe7Fj6toCsZKVQouTRLJftJwmvbhH5lKOBR6rlP950zUq9AitTUjnFoXS/CqjBC2aoejAztLPzzuva++XBw==", + "node_modules/@vitest/eslint-plugin": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.31.tgz", + "integrity": "sha512-xlsLr+e+AXZ/00eVZCtNmMeCJoJaRCoLDiAgLcxgQjSS1EertieB2MUHf8xIqPKs9lECc/UpL+y1xDcpvi02hw==", "dev": true, "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.0", - "loupe": "^3.1.3", - "tinyrainbow": "^2.0.0" + "peerDependencies": { + "@typescript-eslint/utils": ">= 8.0", + "eslint": ">= 8.57.0", + "typescript": ">= 5.0.0", + "vitest": "*" }, - "funding": { - "url": "https://opencollective.com/vitest" + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vitest": { + "optional": true + } } }, "node_modules/acorn": { @@ -3459,16 +10443,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", @@ -3566,16 +10540,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -3657,23 +10621,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/chai": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", - "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3691,16 +10638,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -3972,16 +10909,6 @@ "dev": true, "license": "MIT" }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -4774,7 +11701,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -4903,9 +11829,9 @@ "link": true }, "node_modules/expect-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", - "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4974,11 +11900,14 @@ } }, "node_modules/fdir": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", - "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -6400,13 +13329,6 @@ "loose-envify": "cli.js" } }, - "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", - "dev": true, - "license": "MIT" - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -6428,13 +13350,12 @@ } }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/math-intrinsics": { @@ -6521,7 +13442,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -6736,6 +13656,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -6878,16 +13809,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -6908,6 +13829,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pixelmatch": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-7.1.0.tgz", + "integrity": "sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==", + "license": "ISC", + "dependencies": { + "pngjs": "^7.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, "node_modules/pkgmgr": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pkgmgr/-/pkgmgr-1.1.1.tgz", @@ -6960,6 +13893,15 @@ "node": ">=18" } }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -7756,10 +14698,9 @@ } }, "node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dev": true, + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", @@ -7805,9 +14746,9 @@ } }, "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, "license": "MIT" }, @@ -7999,22 +14940,15 @@ "dev": true, "license": "MIT" }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -8024,9 +14958,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -8036,36 +14970,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/tinypool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.0.tgz", - "integrity": "sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/tldts": { "version": "6.1.77", "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.77.tgz", @@ -8103,7 +15007,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -8462,29 +15365,6 @@ } } }, - "node_modules/vite-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.0.tgz", - "integrity": "sha512-8Fc5Ko5Y4URIJkmMF/iFP1C0/OJyY+VGVe9Nw6WAdZyw4bTO+eVg9mwxWkQp/y8NnAoQY3o9KAvE1ZdA2v+Vmg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/vite/node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -8500,79 +15380,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/vitest": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.0.tgz", - "integrity": "sha512-P7Nvwuli8WBNmeMHHek7PnGW4oAZl9za1fddfRVidZar8wDZRi7hpznLKQePQ8JPLwSBEYDK11g+++j7uFJV8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.0", - "@vitest/mocker": "3.2.0", - "@vitest/pretty-format": "^3.2.0", - "@vitest/runner": "3.2.0", - "@vitest/snapshot": "3.2.0", - "@vitest/spy": "3.2.0", - "@vitest/utils": "3.2.0", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.0", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.0", - "@vitest/ui": "3.2.0", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, "node_modules/vitest-browser-react": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/vitest-browser-react/-/vitest-browser-react-0.2.0.tgz", @@ -8602,19 +15409,6 @@ } } }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -8857,10 +15651,9 @@ } }, "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", - "dev": true, + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", "engines": { "node": ">=10.0.0" From 6a20392a812d090b47cd0146da04e8b91ae806f3 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 20 Jan 2026 21:11:45 +0000 Subject: [PATCH 03/11] Update vitest 4 config types Co-authored-by: me --- .../01.problem.break-jsdom/tsconfig.test.json | 2 +- .../01.problem.break-jsdom/vite.config.ts | 2 +- .../tsconfig.test.json | 2 +- .../01.solution.break-jsdom/vite.config.ts | 2 +- .../README.mdx | 10 +++--- .../tsconfig.test.json | 2 +- .../vite.config.ts | 2 +- .../tsconfig.test.json | 2 +- .../vite.config.ts | 2 +- .../tsconfig.test.json | 2 +- .../vite.config.ts | 2 +- .../tsconfig.test.json | 2 +- .../vite.config.ts | 2 +- .../03.problem.playwright/README.mdx | 2 +- .../03.problem.playwright/tsconfig.test.json | 4 +-- .../03.problem.playwright/vite.config.ts | 2 +- .../03.solution.playwright/README.mdx | 6 ++-- .../03.solution.playwright/tsconfig.test.json | 2 +- .../03.solution.playwright/vite.config.ts | 2 +- .../tsconfig.test.json | 2 +- .../04.problem.shared-assets/vite.config.ts | 2 +- .../04.solution.shared-assets/README.mdx | 4 +-- .../tsconfig.test.json | 2 +- .../04.solution.shared-assets/vite.config.ts | 2 +- .../05.problem.multiple-workspaces/README.mdx | 8 ++--- .../tsconfig.test.json | 2 +- .../vite.config.ts | 18 +++++------ .../README.mdx | 32 +++++++++---------- .../tsconfig.test.browser.json | 2 +- .../vite.config.ts | 4 +-- exercises/02.vitest-browser-mode/README.mdx | 2 +- .../tsconfig.test.browser.json | 2 +- .../01.problem.queries/vite.config.ts | 2 +- .../tsconfig.test.browser.json | 2 +- .../01.solution.queries/vite.config.ts | 2 +- .../tsconfig.test.browser.json | 2 +- .../02.problem.user-events/vite.config.ts | 2 +- .../tsconfig.test.browser.json | 2 +- .../02.solution.user-events/vite.config.ts | 2 +- .../03.problem.network-mocking/README.mdx | 2 +- .../tsconfig.test.browser.json | 2 +- .../03.problem.network-mocking/vite.config.ts | 2 +- .../tsconfig.test.browser.json | 2 +- .../vite.config.ts | 2 +- .../tsconfig.test.browser.json | 2 +- .../vite.config.ts | 2 +- .../tsconfig.test.browser.json | 2 +- .../vite.config.ts | 2 +- .../tsconfig.test.browser.json | 2 +- .../05.problem.page-navigation/vite.config.ts | 2 +- .../tsconfig.test.browser.json | 2 +- .../vite.config.ts | 2 +- .../tsconfig.test.browser.json | 2 +- .../01.problem.dom-snapshots/vite.config.ts | 2 +- .../tsconfig.test.browser.json | 2 +- .../01.solution.dom-snapshots/vite.config.ts | 2 +- .../02.problem.debugger/README.mdx | 2 +- .../tsconfig.test.browser.json | 2 +- .../02.problem.debugger/vite.config.ts | 2 +- .../tsconfig.test.browser.json | 2 +- .../02.solution.debugger/vite.config.ts | 2 +- .../tsconfig.test.browser.json | 2 +- .../03.problem.breakpoints/vite.config.ts | 2 +- .../tsconfig.test.browser.json | 2 +- .../03.solution.breakpoints/vite.config.ts | 2 +- 65 files changed, 100 insertions(+), 100 deletions(-) diff --git a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json index 3b4ebef..2c91d02 100644 --- a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json +++ b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/vite.config.ts b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/vite.config.ts index fcac120..5733e8d 100644 --- a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/vite.config.ts +++ b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json index 3b4ebef..2c91d02 100644 --- a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json +++ b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/vite.config.ts b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/vite.config.ts index fcac120..5733e8d 100644 --- a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/vite.config.ts +++ b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx index 1928a33..a07fb9a 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx @@ -32,7 +32,7 @@ The installation step is done, and now it's time to configure Vitest is it can r To enable the Browser Mode in Vitest, I need to set `test.browser.enabled` to `true` in my `vite.config.ts`/`vitest.config.ts`: ```ts filename=vite.config.ts remove=10 add=11-13 -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -52,7 +52,7 @@ export default defineConfig({ As the next step, I need to tell Vitest what browsers I want for testing my components. Let's use Chromium by setting the `test.browser.instances` correctly: ```ts filename=vite.config.ts add=11-15 -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -76,7 +76,7 @@ export default defineConfig({ ## Configure TypeScript -The last thing that remains is to make sure TypeScript sees the Vitest globals. Browser matcher types are included by default in Vitest 4, so there is nothing extra to add. +The last thing that remains is to make sure TypeScript sees the Vitest globals and the browser context types (these include the browser matchers). First, I will remove the `import '@testing-library/jest-dom/vitest'` import we previously had in the test: @@ -84,7 +84,7 @@ First, I will remove the `import '@testing-library/jest-dom/vitest'` import we p import '@testing-library/jest-dom/vitest' ``` -Finally, confirm that `tsconfig.test.json` only includes `vitest/globals` in `compilerOptions.types`: +Finally, confirm that `tsconfig.test.json` includes `vitest/globals` and `@vitest/browser/context` in `compilerOptions.types`: ```json filename=tsconfig.test.json add=9 { @@ -92,7 +92,7 @@ Finally, confirm that `tsconfig.test.json` only includes `vitest/globals` in `co "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals"] + "types": ["vitest/globals", "@vitest/browser/context"] } } ``` diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json index 3b4ebef..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/vite.config.ts b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/vite.config.ts index fcac120..5733e8d 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/vite.config.ts +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json index 3b4ebef..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/vite.config.ts b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/vite.config.ts index ab21f6e..5ac85bc 100644 --- a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/vite.config.ts +++ b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json index 3b4ebef..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/vite.config.ts b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/vite.config.ts index ab21f6e..5ac85bc 100644 --- a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/vite.config.ts +++ b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json index 3b4ebef..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/vite.config.ts b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/vite.config.ts index ab21f6e..5ac85bc 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/vite.config.ts +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx b/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx index d106385..a3d6ad5 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx @@ -23,6 +23,6 @@ In this workshop, we will be using Playwright as the browser provider for Vitest 1. Install `playwright` as a dependency in the project; 1. In `vite.config.ts`, update `test.browser.provider` to use `'playwright'` as the browser provider; -1. In `tsconfig.test.json`, update the `compilerOptions.types` to include the Playwright browser provider types (these also provide the matcher typings). +1. In `tsconfig.test.json`, update the `compilerOptions.types` to include the Vitest browser context types (these also provide the matcher typings). Once you are done with it, make sure that the tests are still passing by running `npm test`. Good luck! diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json b/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json index cdd4ee0..84d6302 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json @@ -6,8 +6,8 @@ "types": [ "vitest/globals" - // 🐨 Add the Playwright browser provider types. - // 💰 "@vitest/browser/providers/playwright" + // 🐨 Add the Vitest browser context types. + // 💰 "@vitest/browser/context" ] } } diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/vite.config.ts b/exercises/02.vitest-browser-mode/03.problem.playwright/vite.config.ts index 6bec327..8c2cfd9 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/vite.config.ts +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx b/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx index d937b2e..3cf11c0 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx @@ -19,7 +19,7 @@ npx playwright install --with-deps chromium The next step is to tell Vitest to use Playwright as the browser provider for component tests. In `vite.config.ts`, set the `test.browser.provider` option to `'playwright'`: ```ts filename=vite.config.ts add=12 -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -41,7 +41,7 @@ export default defineConfig({ }) ``` -And, finally, let's add the Playwright browser provider types in `tsconfig.test.json`: +And, finally, let's add the Vitest browser context types in `tsconfig.test.json`: ```json filename=tsconfig.test.json remove=9 add=10 { @@ -52,7 +52,7 @@ And, finally, let's add the Playwright browser provider types in `tsconfig.test. "module": "preserve", "types": [ "vitest/globals", - "@vitest/browser/providers/playwright" + "@vitest/browser/context" ] } } diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json b/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json index 873b5aa..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/vite.config.ts b/exercises/02.vitest-browser-mode/03.solution.playwright/vite.config.ts index 3f7f954..1ac3ded 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/vite.config.ts +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json b/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json index 873b5aa..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/04.problem.shared-assets/vite.config.ts b/exercises/02.vitest-browser-mode/04.problem.shared-assets/vite.config.ts index 352b47e..13248b5 100644 --- a/exercises/02.vitest-browser-mode/04.problem.shared-assets/vite.config.ts +++ b/exercises/02.vitest-browser-mode/04.problem.shared-assets/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx b/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx index 55fd842..4605c04 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx @@ -32,7 +32,7 @@ Since we added this new file, we have to tell TypeScript how it should be handle ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } ``` @@ -42,7 +42,7 @@ Now all that remains is to tell Vitest to use this file as the global setup for In `vite.config.ts`, I will provide the path to this setup file as the value for the `setupFiles` property on the current browser instance: ```ts filename=vite.config.ts add=16 -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json b/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json index fd369e8..768bacb 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["vitest.browser.setup.ts", "src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/vite.config.ts b/exercises/02.vitest-browser-mode/04.solution.shared-assets/vite.config.ts index fb9a9bd..56f993b 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/vite.config.ts +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/README.mdx b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/README.mdx index e0f107e..c6a1155 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/README.mdx +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/README.mdx @@ -1,14 +1,14 @@ -# Multiple workspaces +# Multiple projects Our current Vitest configuration runs _all tests_ in Browser Mode. This isn't ideal when you need to run different types of tests in the same project - like unit and integration tests running in a Node.js environment alongside browser-based component tests. -You can fix this by introducing _different workspaces_ for different types of tests. In fact, I think this is just the right task for you... +You can fix this by introducing _different projects_ for different types of tests. In fact, I think this is just the right task for you... 👨‍💼 In this one, you will expand the Vitest configuration to support running multiple types of tests in the same project. This will be a multi-step process to make sure you have Vitest and TypeScript configured correctly for your tests. -🐨 First, update `vite.config.ts` to list multiple [workspaces](https://main.vitest.dev/guide/workspace.html#configuration). Define one for unit tests and another for component tests. +🐨 First, update `vite.config.ts` to list multiple [projects](https://vitest.dev/guide/projects.html). Define one for unit tests and another for component tests. 🐨 Next, rename `tsconfig.test.json` to `tsconfig.test.browser.json`. This TypeScript configuration will only apply to the component tests now. Update its `include` setting to target `**/*.browser.test.ts*` files: @@ -49,6 +49,6 @@ You can fix this by introducing _different workspaces_ for different types of te } ``` -🐨 Finally, rename the existing `file-preview.test.tsx` component test to `file-preview.browser.test.tsx` to be included in the correct Vitest workspace. +🐨 Finally, rename the existing `file-preview.test.tsx` component test to `file-preview.browser.test.tsx` to be included in the correct Vitest project. See you on the other side once you're done to go through each step in more detail. diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json index fd369e8..768bacb 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["vitest.browser.setup.ts", "src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/vite.config.ts b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/vite.config.ts index 0562619..5b45bb0 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/vite.config.ts +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' // 🐨 Import `configDefaults` from `vitest/config` // 💰 import { foo } from 'bar' @@ -10,15 +10,15 @@ export default defineConfig({ server: { port: process.env.PORT ? Number(process.env.PORT) : undefined, }, - // 🐨 Add a new property called `workspace`. + // 🐨 Add a new property called `projects`. // As the value, provide an array with two entries. - // 💰 test: { workspace: [{}, {}] } + // 💰 test: { projects: [{}, {}] } // - // 🐨 In the first entry of the `workspace` array, + // 🐨 In the first entry of the `projects` array, // define a `test` property and give it a `test.name` equal to "unit". // 💰 { test: { name: 'unit' } } // - // 🐨 In the unit test workspace, set `globals` to true + // 🐨 In the unit test project, set `globals` to true // and `environment` to "node". // 💰 globals: true // 💰 environment: 'node' @@ -29,17 +29,17 @@ export default defineConfig({ // 🐨 Since "**/*.test.ts" will match ALL tests, exclude // the browser tests by providing the `exclude` property // and including the browser test pattern there. - // 🦉 Vitest workspaces override the default configuration, + // 🦉 Vitest projects override the default configuration, // which means that the `exclude` array must include the // default values to ignore tests from `node_modules`, for example. // 💰 exclude: [...defaultConfig.exclude, '**/*.browser.test.ts(x)?'] // - // Now, switch to the second entry in the `workspace` array. + // Now, switch to the second entry in the `projects` array. // 🐨 First, set the `extends` property to `true`. Let's extend the // root-level options, like `plugins` to have consistent behavior in prod and tests. // 💰 { extends: true, test: {} } // - // 🐨 Next, add these properties to the `test` in this workspace: + // 🐨 Next, add these properties to the `test` in this project: // { // name: "browser", // globals: true, @@ -47,7 +47,7 @@ export default defineConfig({ // } // // 🐨 Finally, copy the existing `browser` configuration - // under the `test` property of the second workspace. + // under the `test` property of the second project. // 💰 { test: { name: 'browser', browser: {...} }} // // 💣 Delete this root-level `test` property altogether. diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx index d206ca7..99773cb 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx @@ -1,21 +1,21 @@ -# Multiple workspaces +# Multiple projects Real-world projects often combine multiple types of tests at the same time. Vitest is a great choice for both unit and integration tests, but those two have quite different requirements and, as a result, may need different setups. -Vitest solves this by using _workspaces_. +Vitest solves this by using _projects_. -## Vitest Workspaces +## Vitest Projects -A [workspace](https://main.vitest.dev/guide/workspace.html) allows you to describe multiple configurations independently. Think of it as a package workspace, where a single repo can host multiple different packages. In the same way, a single Vitest process can run multiple different test projects. +A [project](https://vitest.dev/guide/projects.html) allows you to describe multiple configurations independently. Think of it as a package workspace, where a single repo can host multiple different packages. In the same way, a single Vitest process can run multiple different test projects. -Workspaces are listed in the `test.workspace` property in your Vitest config, and can include paths to nested packages or Vitest config files or inline configuration. +Projects are listed in the `test.projects` property in your Vitest config, and can include paths to nested packages or Vitest config files or inline configuration. -I will define two workspaces: +I will define two projects: ```ts filename=vite.config.ts add=12-18,21-36 -/// +/// import { defineConfig } from 'vite' import { configDefaults } from 'vitest/config' import react from '@vitejs/plugin-react' @@ -24,7 +24,7 @@ import tailwindcss from '@tailwindcss/vite' export default defineConfig({ plugins: [react(), tailwindcss()], test: { - workspace: [ + projects: [ { test: { name: 'unit', @@ -59,7 +59,7 @@ export default defineConfig({ Let's go over them in more detail. -The first workspace include the configuration for running unit tests: +The first project includes the configuration for running unit tests: ```ts filename=vite.config.ts nonumber { @@ -73,14 +73,14 @@ The first workspace include the configuration for running unit tests: }, ``` -- `name` gives this workspace a name and allows me to run it in isolation anytime I want by providing the `--project=unit` option to the Vitest CLI; +- `name` gives this project a name and allows me to run it in isolation anytime I want by providing the `--project=unit` option to the Vitest CLI; - `include` lists the test file patterns to include in this run. In this case, I want for the unit tests to cover test files ending with `*.test.ts`; - `exclude` does the opposite of `include`, listing the file patterns to _ignore_. Since my browser tests also end with `*.test.ts`, I need to exclude them not to be confused with unit tests; -- `environment` controls the test environment used for this workspace. I want my unit tests to run in Node.js, so I provide `'node'` as the enivornment here. +- `environment` controls the test environment used for this project. I want my unit tests to run in Node.js, so I provide `'node'` as the enivornment here. -> :owl: Notice that each workspace lists Vitest configuration starting from the root by including the `test` key again. This is handy because each workspace can have a different set of Vite options and `plugins` for different test files. +> :owl: Notice that each project lists Vitest configuration starting from the root by including the `test` key again. This is handy because each project can have a different set of Vite options and `plugins` for different test files. -Similarly, here's the workspace for the browser (component) tests: +Similarly, here's the project for the browser (component) tests: ```ts filename=vite.config.ts nonumber { @@ -103,7 +103,7 @@ Similarly, here's the workspace for the browser (component) tests: }, ``` -Here, I'm naming this workspace `'browser'` and configuring it to include only `*.browser.test.ts(x)` test files. These will be my component tests. For the rest of the configuration, I simply moved the existing `test.browser` configuration under this workspace and left it as-is. +Here, I'm naming this project `'browser'` and configuring it to include only `*.browser.test.ts(x)` test files. These will be my component tests. For the rest of the configuration, I simply moved the existing `test.browser` configuration under this project and left it as-is. ## TypeScript @@ -126,7 +126,7 @@ Let's start with the unit tests: } ``` -Similar to how I've configured Vitest workspaces to apply only to specific file patterns, I tell TypeScript to apply this configuration only to the `*.test.ts` files, excluding the browser tests at `*.browser.test.ts*`. The most important bit here is the `compilerOptions.types` property: +Similar to how I've configured Vitest projects to apply only to specific file patterns, I tell TypeScript to apply this configuration only to the `*.test.ts` files, excluding the browser tests at `*.browser.test.ts*`. The most important bit here is the `compilerOptions.types` property: ```json filename=tsconfig.test.unit.json nonumber "types": ["node", "vitest/globals"] @@ -150,7 +150,7 @@ Next, I rename the existing `tsconfig.test.json` to `tsconfig.test.browser.json` ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } ``` diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json index b8dbf34..326e69f 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/vite.config.ts b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/vite.config.ts index e3035c8..17c7c8c 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/vite.config.ts +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import { configDefaults } from 'vitest/config' import react from '@vitejs/plugin-react' @@ -10,7 +10,7 @@ export default defineConfig({ port: process.env.PORT ? Number(process.env.PORT) : undefined, }, test: { - workspace: [ + projects: [ { test: { name: 'unit', diff --git a/exercises/02.vitest-browser-mode/README.mdx b/exercises/02.vitest-browser-mode/README.mdx index 0971471..64d10e9 100644 --- a/exercises/02.vitest-browser-mode/README.mdx +++ b/exercises/02.vitest-browser-mode/README.mdx @@ -36,6 +36,6 @@ There are also a few advantages I find in Vitest Browser Mode when compared to o - **Consistency**. Vitest can use your existing Vite configuration both for your app and for your tests. This means a smaller difference between your production and tested code, which is always a win. - **Component rendering model**. Running in the browser, your components can render similarly to how they are rendered in production. Vitest has a more [straightforward rendering flow](https://github.com/vitest-dev/vitest-browser-react/blob/1d6be8ca8d94bb2289b6260886f76a6e527c45f7/src/pure.tsx#L50) compared to [Playwright Component Testing](https://github.com/microsoft/playwright/blob/91f46bb5d057a284ff33def5802aba496033c030/packages/playwright-ct-core/src/mount.ts#L61), where Playwright has to channel the rendering from the test (Node.js) to the browser. -- **Flexibility**. You can use Vitest for both unit tests, Node.js integration tests, and in-browser integration tests. In fact, Vitest makes that easy to do with the concept of workspaces, which you will get your hands on later in this workshop. +- **Flexibility**. You can use Vitest for both unit tests, Node.js integration tests, and in-browser integration tests. In fact, Vitest makes that easy to do with the concept of projects, which you will get your hands on later in this workshop. Alright, we've set the scene well. Now it's time you put Vitest Browser Mode to work in your tests. Let's go! diff --git a/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json b/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json index b8dbf34..326e69f 100644 --- a/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json +++ b/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/01.problem.queries/vite.config.ts b/exercises/03.best-practices/01.problem.queries/vite.config.ts index b7554c7..318d2cc 100644 --- a/exercises/03.best-practices/01.problem.queries/vite.config.ts +++ b/exercises/03.best-practices/01.problem.queries/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json b/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json index b8dbf34..326e69f 100644 --- a/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json +++ b/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/01.solution.queries/vite.config.ts b/exercises/03.best-practices/01.solution.queries/vite.config.ts index b7554c7..318d2cc 100644 --- a/exercises/03.best-practices/01.solution.queries/vite.config.ts +++ b/exercises/03.best-practices/01.solution.queries/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json b/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json index b8dbf34..326e69f 100644 --- a/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json +++ b/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/02.problem.user-events/vite.config.ts b/exercises/03.best-practices/02.problem.user-events/vite.config.ts index b7554c7..318d2cc 100644 --- a/exercises/03.best-practices/02.problem.user-events/vite.config.ts +++ b/exercises/03.best-practices/02.problem.user-events/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json b/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json index b8dbf34..326e69f 100644 --- a/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json +++ b/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/02.solution.user-events/vite.config.ts b/exercises/03.best-practices/02.solution.user-events/vite.config.ts index b7554c7..318d2cc 100644 --- a/exercises/03.best-practices/02.solution.user-events/vite.config.ts +++ b/exercises/03.best-practices/02.solution.user-events/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/03.best-practices/03.problem.network-mocking/README.mdx b/exercises/03.best-practices/03.problem.network-mocking/README.mdx index 5f30b3b..f64144c 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/README.mdx +++ b/exercises/03.best-practices/03.problem.network-mocking/README.mdx @@ -80,7 +80,7 @@ Since it's a new TypeScript module, you need to tell TypeScript how to handle it ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } ``` diff --git a/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json b/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json index b8dbf34..326e69f 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json +++ b/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/03.problem.network-mocking/vite.config.ts b/exercises/03.best-practices/03.problem.network-mocking/vite.config.ts index b7554c7..318d2cc 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/vite.config.ts +++ b/exercises/03.best-practices/03.problem.network-mocking/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json b/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json index c59f172..74c3de8 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json +++ b/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/03.solution.network-mocking/vite.config.ts b/exercises/03.best-practices/03.solution.network-mocking/vite.config.ts index b7554c7..318d2cc 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/vite.config.ts +++ b/exercises/03.best-practices/03.solution.network-mocking/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json b/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json index c59f172..74c3de8 100644 --- a/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json +++ b/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/04.problem.element-presence/vite.config.ts b/exercises/03.best-practices/04.problem.element-presence/vite.config.ts index b7554c7..318d2cc 100644 --- a/exercises/03.best-practices/04.problem.element-presence/vite.config.ts +++ b/exercises/03.best-practices/04.problem.element-presence/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json b/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json index c59f172..74c3de8 100644 --- a/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json +++ b/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/04.solution.element-presence/vite.config.ts b/exercises/03.best-practices/04.solution.element-presence/vite.config.ts index b7554c7..318d2cc 100644 --- a/exercises/03.best-practices/04.solution.element-presence/vite.config.ts +++ b/exercises/03.best-practices/04.solution.element-presence/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json b/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json index c59f172..74c3de8 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json +++ b/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/05.problem.page-navigation/vite.config.ts b/exercises/03.best-practices/05.problem.page-navigation/vite.config.ts index b7554c7..318d2cc 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/vite.config.ts +++ b/exercises/03.best-practices/05.problem.page-navigation/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json b/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json index ace611a..7043593 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json +++ b/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json @@ -8,6 +8,6 @@ "compilerOptions": { "target": "esnext", "module": "preserve", - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/05.solution.page-navigation/vite.config.ts b/exercises/03.best-practices/05.solution.page-navigation/vite.config.ts index b7554c7..318d2cc 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/vite.config.ts +++ b/exercises/03.best-practices/05.solution.page-navigation/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json b/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json index c59f172..74c3de8 100644 --- a/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json +++ b/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/01.problem.dom-snapshots/vite.config.ts b/exercises/04.debugging/01.problem.dom-snapshots/vite.config.ts index b7554c7..318d2cc 100644 --- a/exercises/04.debugging/01.problem.dom-snapshots/vite.config.ts +++ b/exercises/04.debugging/01.problem.dom-snapshots/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json b/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json index c59f172..74c3de8 100644 --- a/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json +++ b/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/01.solution.dom-snapshots/vite.config.ts b/exercises/04.debugging/01.solution.dom-snapshots/vite.config.ts index b7554c7..318d2cc 100644 --- a/exercises/04.debugging/01.solution.dom-snapshots/vite.config.ts +++ b/exercises/04.debugging/01.solution.dom-snapshots/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/04.debugging/02.problem.debugger/README.mdx b/exercises/04.debugging/02.problem.debugger/README.mdx index 68a7538..3d7baf1 100644 --- a/exercises/04.debugging/02.problem.debugger/README.mdx +++ b/exercises/04.debugging/02.problem.debugger/README.mdx @@ -65,7 +65,7 @@ This configuration tells Visual Studio Code how to launch your application (in o - `Run Vitest Browser`, which will run our tests with a few special arguments: - `--inspect-brk`, which tells Node.js to spawn a debugger process. If provided, Vitest will arrange appropriate debugging mode in your browser provider automatically; - - `--browser`, which tells Vitest to run only the browser tests/workspaces; + - `--browser`, which tells Vitest to run only the browser tests/projects; - `--no-file-parallelism`, which forces Vitest to run our test cases in sequence (required for the debugger to work properly). - `Attach to Vitest Browser`, which will attach a Chome DevTools instance exposed by the browser tests to the built-in debugger in Visual Studio Code. This will allow you to control the debugging experience directly from your IDE. diff --git a/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json b/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json index c59f172..74c3de8 100644 --- a/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json +++ b/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/02.problem.debugger/vite.config.ts b/exercises/04.debugging/02.problem.debugger/vite.config.ts index 85e9082..a622cef 100644 --- a/exercises/04.debugging/02.problem.debugger/vite.config.ts +++ b/exercises/04.debugging/02.problem.debugger/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json b/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json index c59f172..74c3de8 100644 --- a/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json +++ b/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/02.solution.debugger/vite.config.ts b/exercises/04.debugging/02.solution.debugger/vite.config.ts index 85e9082..a622cef 100644 --- a/exercises/04.debugging/02.solution.debugger/vite.config.ts +++ b/exercises/04.debugging/02.solution.debugger/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json b/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json index c59f172..74c3de8 100644 --- a/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json +++ b/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/03.problem.breakpoints/vite.config.ts b/exercises/04.debugging/03.problem.breakpoints/vite.config.ts index 85e9082..a622cef 100644 --- a/exercises/04.debugging/03.problem.breakpoints/vite.config.ts +++ b/exercises/04.debugging/03.problem.breakpoints/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' diff --git a/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json b/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json index c59f172..74c3de8 100644 --- a/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json +++ b/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/providers/playwright"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/03.solution.breakpoints/vite.config.ts b/exercises/04.debugging/03.solution.breakpoints/vite.config.ts index 85e9082..a622cef 100644 --- a/exercises/04.debugging/03.solution.breakpoints/vite.config.ts +++ b/exercises/04.debugging/03.solution.breakpoints/vite.config.ts @@ -1,4 +1,4 @@ -/// +/// import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' From 4e2d9749e314e2515b5b756178697de71e15b661 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 20 Jan 2026 21:20:05 +0000 Subject: [PATCH 04/11] Use vitest playwright provider Co-authored-by: me --- .../01.problem.break-jsdom/package.json | 1 + .../01.solution.break-jsdom/package.json | 1 + .../package.json | 1 + .../package.json | 1 + .../02.problem.migrate-the-test/package.json | 1 + .../02.solution.migrate-the-test/package.json | 1 + .../03.problem.playwright/README.mdx | 4 +- .../03.problem.playwright/package.json | 1 + .../03.problem.playwright/vite.config.ts | 3 +- .../03.solution.playwright/README.mdx | 9 +- .../03.solution.playwright/package.json | 1 + .../03.solution.playwright/vite.config.ts | 3 +- .../04.problem.shared-assets/package.json | 1 + .../04.problem.shared-assets/vite.config.ts | 3 +- .../04.solution.shared-assets/README.mdx | 3 +- .../04.solution.shared-assets/package.json | 1 + .../04.solution.shared-assets/vite.config.ts | 3 +- .../package.json | 1 + .../vite.config.ts | 3 +- .../README.mdx | 5 +- .../package.json | 1 + .../vite.config.ts | 3 +- .../01.problem.queries/package.json | 1 + .../01.problem.queries/vite.config.ts | 3 +- .../01.solution.queries/package.json | 1 + .../01.solution.queries/vite.config.ts | 3 +- .../02.problem.user-events/package.json | 1 + .../02.problem.user-events/vite.config.ts | 3 +- .../02.solution.user-events/package.json | 1 + .../02.solution.user-events/vite.config.ts | 3 +- .../03.problem.network-mocking/package.json | 1 + .../03.problem.network-mocking/vite.config.ts | 3 +- .../03.solution.network-mocking/package.json | 1 + .../03.solution.network-mocking/src/main.tsx | 2 +- .../vite.config.ts | 3 +- .../04.problem.element-presence/package.json | 1 + .../04.problem.element-presence/src/main.tsx | 2 +- .../vite.config.ts | 3 +- .../04.solution.element-presence/package.json | 1 + .../04.solution.element-presence/src/main.tsx | 2 +- .../vite.config.ts | 3 +- .../05.problem.page-navigation/package.json | 1 + .../05.problem.page-navigation/src/main.tsx | 2 +- .../05.problem.page-navigation/vite.config.ts | 3 +- .../05.solution.page-navigation/package.json | 1 + .../05.solution.page-navigation/src/main.tsx | 2 +- .../vite.config.ts | 3 +- .../01.problem.dom-snapshots/package.json | 1 + .../01.problem.dom-snapshots/vite.config.ts | 3 +- .../01.solution.dom-snapshots/package.json | 1 + .../01.solution.dom-snapshots/vite.config.ts | 3 +- .../02.problem.debugger/package.json | 1 + .../02.problem.debugger/vite.config.ts | 3 +- .../02.solution.debugger/package.json | 1 + .../02.solution.debugger/vite.config.ts | 3 +- .../03.problem.breakpoints/package.json | 1 + .../03.problem.breakpoints/vite.config.ts | 3 +- .../03.solution.breakpoints/package.json | 1 + .../03.solution.breakpoints/vite.config.ts | 3 +- package-lock.json | 1869 ++--------------- 60 files changed, 261 insertions(+), 1733 deletions(-) diff --git a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/package.json b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/package.json index dfcf42f..7970af0 100644 --- a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/package.json +++ b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/package.json @@ -20,6 +20,7 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser-playwright": "^4.0.17", "jsdom": "^26.0.0", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/package.json b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/package.json index cf51644..13ba30d 100644 --- a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/package.json +++ b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/package.json @@ -19,6 +19,7 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser-playwright": "^4.0.17", "jsdom": "^26.0.0", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/package.json b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/package.json index 9fec4f5..306a112 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/package.json +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/package.json @@ -18,6 +18,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "jsdom": "^26.0.0", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/package.json b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/package.json index b28c9e9..373a2b6 100644 --- a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/package.json +++ b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17", diff --git a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/package.json b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/package.json index a2c0ea3..7cee9d7 100644 --- a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/package.json +++ b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17", diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/package.json b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/package.json index 1a84b43..a2683bb 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/package.json +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx b/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx index a3d6ad5..84af258 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx @@ -21,8 +21,8 @@ In this workshop, we will be using Playwright as the browser provider for Vitest 👨‍💼 Your task is to introduce Playwright to the existing Vitest setup. It will consist of multiple steps: -1. Install `playwright` as a dependency in the project; -1. In `vite.config.ts`, update `test.browser.provider` to use `'playwright'` as the browser provider; +1. Install `playwright` and `@vitest/browser-playwright` as dependencies in the project; +1. In `vite.config.ts`, import `playwright` from `@vitest/browser-playwright` and set `test.browser.provider` to `playwright()`; 1. In `tsconfig.test.json`, update the `compilerOptions.types` to include the Vitest browser context types (these also provide the matcher typings). Once you are done with it, make sure that the tests are still passing by running `npm test`. Good luck! diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/package.json b/exercises/02.vitest-browser-mode/03.problem.playwright/package.json index e69844a..9e1eb2b 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/package.json +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/vite.config.ts b/exercises/02.vitest-browser-mode/03.problem.playwright/vite.config.ts index 8c2cfd9..48c341e 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/vite.config.ts +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -13,7 +14,7 @@ export default defineConfig({ browser: { enabled: true, // 🐨 Set a custom browser provider via the `provider` option. - // 💰 provider: 'playwright', + // 💰 provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx b/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx index 3cf11c0..191e1bd 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx @@ -2,10 +2,10 @@ -Let's start by installing `playwright`: +Let's start by installing `playwright` and the Vitest Playwright provider: ```sh nonumber -npm i -D playwright +npm i -D playwright @vitest/browser-playwright ``` Playwright needs browser executables to be present on your machine to run. In this workshop, I am using Chromium as my browser of choice, so I can install just that particular browser by running the following command: @@ -16,11 +16,12 @@ npx playwright install --with-deps chromium > 🦉 You can provide the Playwright CLI with a specific browser you want to be installed. This reduces its footprint in the system by fetching only the browsers you need. -The next step is to tell Vitest to use Playwright as the browser provider for component tests. In `vite.config.ts`, set the `test.browser.provider` option to `'playwright'`: +The next step is to tell Vitest to use Playwright as the browser provider for component tests. In `vite.config.ts`, import `playwright` from `@vitest/browser-playwright` and set `test.browser.provider` to `playwright()`: ```ts filename=vite.config.ts add=12 /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -30,7 +31,7 @@ export default defineConfig({ globals: true, browser: { enabled: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/package.json b/exercises/02.vitest-browser-mode/03.solution.playwright/package.json index e6b297c..62fc577 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/package.json +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/vite.config.ts b/exercises/02.vitest-browser-mode/03.solution.playwright/vite.config.ts index 1ac3ded..0710082 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/vite.config.ts +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -12,7 +13,7 @@ export default defineConfig({ globals: true, browser: { enabled: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/02.vitest-browser-mode/04.problem.shared-assets/package.json b/exercises/02.vitest-browser-mode/04.problem.shared-assets/package.json index db44386..6d05e8d 100644 --- a/exercises/02.vitest-browser-mode/04.problem.shared-assets/package.json +++ b/exercises/02.vitest-browser-mode/04.problem.shared-assets/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/02.vitest-browser-mode/04.problem.shared-assets/vite.config.ts b/exercises/02.vitest-browser-mode/04.problem.shared-assets/vite.config.ts index 13248b5..bcc06d4 100644 --- a/exercises/02.vitest-browser-mode/04.problem.shared-assets/vite.config.ts +++ b/exercises/02.vitest-browser-mode/04.problem.shared-assets/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -12,7 +13,7 @@ export default defineConfig({ globals: true, browser: { enabled: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx b/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx index 4605c04..96f85b2 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx @@ -44,6 +44,7 @@ In `vite.config.ts`, I will provide the path to this setup file as the value for ```ts filename=vite.config.ts add=16 /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -53,7 +54,7 @@ export default defineConfig({ globals: true, browser: { enabled: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/package.json b/exercises/02.vitest-browser-mode/04.solution.shared-assets/package.json index 04a345a..84b4e2d 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/package.json +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/vite.config.ts b/exercises/02.vitest-browser-mode/04.solution.shared-assets/vite.config.ts index 56f993b..98e5675 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/vite.config.ts +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -12,7 +13,7 @@ export default defineConfig({ globals: true, browser: { enabled: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/package.json b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/package.json index 9a4dfb5..da2ae4e 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/package.json +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/vite.config.ts b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/vite.config.ts index 5b45bb0..1e05368 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/vite.config.ts +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' // 🐨 Import `configDefaults` from `vitest/config` // 💰 import { foo } from 'bar' import react from '@vitejs/plugin-react' @@ -55,7 +56,7 @@ export default defineConfig({ globals: true, browser: { enabled: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx index 99773cb..06b7b83 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx @@ -17,6 +17,7 @@ I will define two projects: ```ts filename=vite.config.ts add=12-18,21-36 /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import { configDefaults } from 'vitest/config' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -42,7 +43,7 @@ export default defineConfig({ include: ['**/*.browser.test.ts(x)?'], browser: { enabled: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', @@ -91,7 +92,7 @@ Similarly, here's the project for the browser (component) tests: include: ['**/*.browser.test.ts(x)?'], browser: { enabled: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/package.json b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/package.json index a39186a..7c434e8 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/package.json +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/package.json @@ -19,6 +19,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/vite.config.ts b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/vite.config.ts index 17c7c8c..2f2bf03 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/vite.config.ts +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import { configDefaults } from 'vitest/config' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -28,7 +29,7 @@ export default defineConfig({ include: ['./src/**/*.browser.test.ts(x)?'], browser: { enabled: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/03.best-practices/01.problem.queries/package.json b/exercises/03.best-practices/01.problem.queries/package.json index 364c6ef..9e30c71 100644 --- a/exercises/03.best-practices/01.problem.queries/package.json +++ b/exercises/03.best-practices/01.problem.queries/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/03.best-practices/01.problem.queries/vite.config.ts b/exercises/03.best-practices/01.problem.queries/vite.config.ts index 318d2cc..a7cdbc4 100644 --- a/exercises/03.best-practices/01.problem.queries/vite.config.ts +++ b/exercises/03.best-practices/01.problem.queries/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/03.best-practices/01.solution.queries/package.json b/exercises/03.best-practices/01.solution.queries/package.json index dff6ecf..d4fa1ff 100644 --- a/exercises/03.best-practices/01.solution.queries/package.json +++ b/exercises/03.best-practices/01.solution.queries/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/03.best-practices/01.solution.queries/vite.config.ts b/exercises/03.best-practices/01.solution.queries/vite.config.ts index 318d2cc..a7cdbc4 100644 --- a/exercises/03.best-practices/01.solution.queries/vite.config.ts +++ b/exercises/03.best-practices/01.solution.queries/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/03.best-practices/02.problem.user-events/package.json b/exercises/03.best-practices/02.problem.user-events/package.json index 70c7e79..3c1314f 100644 --- a/exercises/03.best-practices/02.problem.user-events/package.json +++ b/exercises/03.best-practices/02.problem.user-events/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/03.best-practices/02.problem.user-events/vite.config.ts b/exercises/03.best-practices/02.problem.user-events/vite.config.ts index 318d2cc..a7cdbc4 100644 --- a/exercises/03.best-practices/02.problem.user-events/vite.config.ts +++ b/exercises/03.best-practices/02.problem.user-events/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/03.best-practices/02.solution.user-events/package.json b/exercises/03.best-practices/02.solution.user-events/package.json index d13b4e0..b08c094 100644 --- a/exercises/03.best-practices/02.solution.user-events/package.json +++ b/exercises/03.best-practices/02.solution.user-events/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/03.best-practices/02.solution.user-events/vite.config.ts b/exercises/03.best-practices/02.solution.user-events/vite.config.ts index 318d2cc..a7cdbc4 100644 --- a/exercises/03.best-practices/02.solution.user-events/vite.config.ts +++ b/exercises/03.best-practices/02.solution.user-events/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/03.best-practices/03.problem.network-mocking/package.json b/exercises/03.best-practices/03.problem.network-mocking/package.json index e91b5a1..a0ac6aa 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/package.json +++ b/exercises/03.best-practices/03.problem.network-mocking/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/03.best-practices/03.problem.network-mocking/vite.config.ts b/exercises/03.best-practices/03.problem.network-mocking/vite.config.ts index 318d2cc..a7cdbc4 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/vite.config.ts +++ b/exercises/03.best-practices/03.problem.network-mocking/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/03.best-practices/03.solution.network-mocking/package.json b/exercises/03.best-practices/03.solution.network-mocking/package.json index 46ae404..2aca2ac 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/package.json +++ b/exercises/03.best-practices/03.solution.network-mocking/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", diff --git a/exercises/03.best-practices/03.solution.network-mocking/src/main.tsx b/exercises/03.best-practices/03.solution.network-mocking/src/main.tsx index b5273ba..1653870 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/src/main.tsx +++ b/exercises/03.best-practices/03.solution.network-mocking/src/main.tsx @@ -4,7 +4,7 @@ import './index.css' import { App } from './app.jsx' async function enableMocking() { - if (process.env.NODE_ENV === 'development') { + if (import.meta.env.DEV) { const { worker } = await import('./mocks/browser.js') await worker.start({ diff --git a/exercises/03.best-practices/03.solution.network-mocking/vite.config.ts b/exercises/03.best-practices/03.solution.network-mocking/vite.config.ts index 318d2cc..a7cdbc4 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/vite.config.ts +++ b/exercises/03.best-practices/03.solution.network-mocking/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/03.best-practices/04.problem.element-presence/package.json b/exercises/03.best-practices/04.problem.element-presence/package.json index dbe6640..60f4c69 100644 --- a/exercises/03.best-practices/04.problem.element-presence/package.json +++ b/exercises/03.best-practices/04.problem.element-presence/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", diff --git a/exercises/03.best-practices/04.problem.element-presence/src/main.tsx b/exercises/03.best-practices/04.problem.element-presence/src/main.tsx index 7876383..7b5466c 100644 --- a/exercises/03.best-practices/04.problem.element-presence/src/main.tsx +++ b/exercises/03.best-practices/04.problem.element-presence/src/main.tsx @@ -4,7 +4,7 @@ import './index.css' import { App } from './app.jsx' async function enableMocking() { - if (process.env.NODE_ENV === 'development') { + if (import.meta.env.DEV) { const { worker } = await import('./mocks/browser.js') await worker.start() } diff --git a/exercises/03.best-practices/04.problem.element-presence/vite.config.ts b/exercises/03.best-practices/04.problem.element-presence/vite.config.ts index 318d2cc..a7cdbc4 100644 --- a/exercises/03.best-practices/04.problem.element-presence/vite.config.ts +++ b/exercises/03.best-practices/04.problem.element-presence/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/03.best-practices/04.solution.element-presence/package.json b/exercises/03.best-practices/04.solution.element-presence/package.json index 878d236..889b182 100644 --- a/exercises/03.best-practices/04.solution.element-presence/package.json +++ b/exercises/03.best-practices/04.solution.element-presence/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", diff --git a/exercises/03.best-practices/04.solution.element-presence/src/main.tsx b/exercises/03.best-practices/04.solution.element-presence/src/main.tsx index 7876383..7b5466c 100644 --- a/exercises/03.best-practices/04.solution.element-presence/src/main.tsx +++ b/exercises/03.best-practices/04.solution.element-presence/src/main.tsx @@ -4,7 +4,7 @@ import './index.css' import { App } from './app.jsx' async function enableMocking() { - if (process.env.NODE_ENV === 'development') { + if (import.meta.env.DEV) { const { worker } = await import('./mocks/browser.js') await worker.start() } diff --git a/exercises/03.best-practices/04.solution.element-presence/vite.config.ts b/exercises/03.best-practices/04.solution.element-presence/vite.config.ts index 318d2cc..a7cdbc4 100644 --- a/exercises/03.best-practices/04.solution.element-presence/vite.config.ts +++ b/exercises/03.best-practices/04.solution.element-presence/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/03.best-practices/05.problem.page-navigation/package.json b/exercises/03.best-practices/05.problem.page-navigation/package.json index 2eede1a..29e533b 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/package.json +++ b/exercises/03.best-practices/05.problem.page-navigation/package.json @@ -17,6 +17,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", diff --git a/exercises/03.best-practices/05.problem.page-navigation/src/main.tsx b/exercises/03.best-practices/05.problem.page-navigation/src/main.tsx index 7876383..7b5466c 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/src/main.tsx +++ b/exercises/03.best-practices/05.problem.page-navigation/src/main.tsx @@ -4,7 +4,7 @@ import './index.css' import { App } from './app.jsx' async function enableMocking() { - if (process.env.NODE_ENV === 'development') { + if (import.meta.env.DEV) { const { worker } = await import('./mocks/browser.js') await worker.start() } diff --git a/exercises/03.best-practices/05.problem.page-navigation/vite.config.ts b/exercises/03.best-practices/05.problem.page-navigation/vite.config.ts index 318d2cc..a7cdbc4 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/vite.config.ts +++ b/exercises/03.best-practices/05.problem.page-navigation/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/03.best-practices/05.solution.page-navigation/package.json b/exercises/03.best-practices/05.solution.page-navigation/package.json index c0529b9..ca3b214 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/package.json +++ b/exercises/03.best-practices/05.solution.page-navigation/package.json @@ -17,6 +17,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", diff --git a/exercises/03.best-practices/05.solution.page-navigation/src/main.tsx b/exercises/03.best-practices/05.solution.page-navigation/src/main.tsx index 7876383..7b5466c 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/src/main.tsx +++ b/exercises/03.best-practices/05.solution.page-navigation/src/main.tsx @@ -4,7 +4,7 @@ import './index.css' import { App } from './app.jsx' async function enableMocking() { - if (process.env.NODE_ENV === 'development') { + if (import.meta.env.DEV) { const { worker } = await import('./mocks/browser.js') await worker.start() } diff --git a/exercises/03.best-practices/05.solution.page-navigation/vite.config.ts b/exercises/03.best-practices/05.solution.page-navigation/vite.config.ts index 318d2cc..a7cdbc4 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/vite.config.ts +++ b/exercises/03.best-practices/05.solution.page-navigation/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/04.debugging/01.problem.dom-snapshots/package.json b/exercises/04.debugging/01.problem.dom-snapshots/package.json index 72212f6..03b082f 100644 --- a/exercises/04.debugging/01.problem.dom-snapshots/package.json +++ b/exercises/04.debugging/01.problem.dom-snapshots/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/04.debugging/01.problem.dom-snapshots/vite.config.ts b/exercises/04.debugging/01.problem.dom-snapshots/vite.config.ts index 318d2cc..a7cdbc4 100644 --- a/exercises/04.debugging/01.problem.dom-snapshots/vite.config.ts +++ b/exercises/04.debugging/01.problem.dom-snapshots/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/04.debugging/01.solution.dom-snapshots/package.json b/exercises/04.debugging/01.solution.dom-snapshots/package.json index 164487c..1ac3d9e 100644 --- a/exercises/04.debugging/01.solution.dom-snapshots/package.json +++ b/exercises/04.debugging/01.solution.dom-snapshots/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/04.debugging/01.solution.dom-snapshots/vite.config.ts b/exercises/04.debugging/01.solution.dom-snapshots/vite.config.ts index 318d2cc..a7cdbc4 100644 --- a/exercises/04.debugging/01.solution.dom-snapshots/vite.config.ts +++ b/exercises/04.debugging/01.solution.dom-snapshots/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/04.debugging/02.problem.debugger/package.json b/exercises/04.debugging/02.problem.debugger/package.json index 960f2c0..5eb2ae0 100644 --- a/exercises/04.debugging/02.problem.debugger/package.json +++ b/exercises/04.debugging/02.problem.debugger/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/04.debugging/02.problem.debugger/vite.config.ts b/exercises/04.debugging/02.problem.debugger/vite.config.ts index a622cef..ca010f2 100644 --- a/exercises/04.debugging/02.problem.debugger/vite.config.ts +++ b/exercises/04.debugging/02.problem.debugger/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: !process.env.DEBUG, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/04.debugging/02.solution.debugger/package.json b/exercises/04.debugging/02.solution.debugger/package.json index 0d7bc60..3eb9034 100644 --- a/exercises/04.debugging/02.solution.debugger/package.json +++ b/exercises/04.debugging/02.solution.debugger/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/04.debugging/02.solution.debugger/vite.config.ts b/exercises/04.debugging/02.solution.debugger/vite.config.ts index a622cef..ca010f2 100644 --- a/exercises/04.debugging/02.solution.debugger/vite.config.ts +++ b/exercises/04.debugging/02.solution.debugger/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: !process.env.DEBUG, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/04.debugging/03.problem.breakpoints/package.json b/exercises/04.debugging/03.problem.breakpoints/package.json index 8c9bf7b..d48dec0 100644 --- a/exercises/04.debugging/03.problem.breakpoints/package.json +++ b/exercises/04.debugging/03.problem.breakpoints/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/04.debugging/03.problem.breakpoints/vite.config.ts b/exercises/04.debugging/03.problem.breakpoints/vite.config.ts index a622cef..ca010f2 100644 --- a/exercises/04.debugging/03.problem.breakpoints/vite.config.ts +++ b/exercises/04.debugging/03.problem.breakpoints/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: !process.env.DEBUG, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/exercises/04.debugging/03.solution.breakpoints/package.json b/exercises/04.debugging/03.solution.breakpoints/package.json index 116d9c1..4833297 100644 --- a/exercises/04.debugging/03.solution.breakpoints/package.json +++ b/exercises/04.debugging/03.solution.breakpoints/package.json @@ -16,6 +16,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", diff --git a/exercises/04.debugging/03.solution.breakpoints/vite.config.ts b/exercises/04.debugging/03.solution.breakpoints/vite.config.ts index a622cef..ca010f2 100644 --- a/exercises/04.debugging/03.solution.breakpoints/vite.config.ts +++ b/exercises/04.debugging/03.solution.breakpoints/vite.config.ts @@ -1,5 +1,6 @@ /// import { defineConfig } from 'vite' +import { playwright } from '@vitest/browser-playwright' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' @@ -14,7 +15,7 @@ export default defineConfig({ browser: { enabled: true, headless: !process.env.DEBUG, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', diff --git a/package-lock.json b/package-lock.json index 9aa8bb5..009fc78 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,34 +39,13 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser-playwright": "^4.0.17", "jsdom": "^26.0.0", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -85,36 +64,11 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, "license": "MIT", "dependencies": { "tinyrainbow": "^3.0.3" @@ -156,6 +110,7 @@ "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, "license": "MIT", "funding": { "url": "https://opencollective.com/vitest" @@ -165,6 +120,7 @@ "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, "license": "MIT", "dependencies": { "@vitest/pretty-format": "4.0.17", @@ -207,15 +163,6 @@ "node": ">=18" } }, - "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -309,34 +256,13 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser-playwright": "^4.0.17", "jsdom": "^26.0.0", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -355,36 +281,11 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, "license": "MIT", "dependencies": { "tinyrainbow": "^3.0.3" @@ -426,6 +327,7 @@ "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, "license": "MIT", "funding": { "url": "https://opencollective.com/vitest" @@ -435,6 +337,7 @@ "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, "license": "MIT", "dependencies": { "@vitest/pretty-format": "4.0.17", @@ -477,15 +380,6 @@ "node": ">=18" } }, - "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -578,35 +472,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "jsdom": "^26.0.0", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -625,33 +497,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -751,16 +596,6 @@ "node": ">=18" } }, - "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -851,35 +686,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17", "vitest-browser-react": "^0.2.0" } }, - "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -898,33 +711,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -1024,16 +810,6 @@ "node": ">=18" } }, - "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -1124,35 +900,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17", "vitest-browser-react": "^0.2.0" } }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -1171,37 +925,10 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/mocker": { + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/pretty-format": { "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", "dev": true, "license": "MIT", "dependencies": { @@ -1297,16 +1024,6 @@ "node": ">=18" } }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -1397,34 +1114,12 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -1443,33 +1138,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -1569,16 +1237,6 @@ "node": ">=18" } }, - "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -1669,34 +1327,12 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -1715,33 +1351,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -1841,16 +1450,6 @@ "node": ">=18" } }, - "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -1941,35 +1540,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -1988,33 +1565,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -2114,16 +1664,6 @@ "node": ">=18" } }, - "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -2214,35 +1754,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -2261,33 +1779,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -2387,16 +1878,6 @@ "node": ">=18" } }, - "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -2487,35 +1968,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -2534,33 +1993,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -2660,16 +2092,6 @@ "node": ">=18" } }, - "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -2760,35 +2182,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -2807,33 +2207,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -2933,16 +2306,6 @@ "node": ">=18" } }, - "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -3034,35 +2397,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -3081,33 +2422,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -3207,16 +2521,6 @@ "node": ">=18" } }, - "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -3320,39 +2624,17 @@ "react": "^19.0.0", "react-dom": "^19.0.0" }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/expect": { @@ -3373,33 +2655,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -3499,16 +2754,6 @@ "node": ">=18" } }, - "exercises/03.best-practices/01.problem.queries/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/03.best-practices/01.problem.queries/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -3618,35 +2863,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -3665,33 +2888,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -3791,16 +2987,6 @@ "node": ">=18" } }, - "exercises/03.best-practices/01.solution.queries/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/03.best-practices/01.solution.queries/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -3891,35 +3077,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -3938,33 +3102,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -4064,16 +3201,6 @@ "node": ">=18" } }, - "exercises/03.best-practices/02.problem.user-events/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/03.best-practices/02.problem.user-events/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -4164,35 +3291,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -4211,33 +3316,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -4337,16 +3415,6 @@ "node": ">=18" } }, - "exercises/03.best-practices/02.solution.user-events/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/03.best-practices/02.solution.user-events/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -4437,35 +3505,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -4474,41 +3520,14 @@ "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { + "@types/chai": "^5.2.2", "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } } }, "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/pretty-format": { @@ -4610,16 +3629,6 @@ "node": ">=18" } }, - "exercises/03.best-practices/03.problem.network-mocking/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/03.best-practices/03.problem.network-mocking/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -4710,6 +3719,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", @@ -4717,29 +3727,6 @@ "vitest": "^4.0.17" } }, - "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -4758,33 +3745,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -4884,16 +3844,6 @@ "node": ">=18" } }, - "exercises/03.best-practices/03.solution.network-mocking/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/03.best-practices/03.solution.network-mocking/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -4984,6 +3934,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", @@ -4991,29 +3942,6 @@ "vitest": "^4.0.17" } }, - "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -5032,33 +3960,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -5158,16 +4059,6 @@ "node": ">=18" } }, - "exercises/03.best-practices/04.problem.element-presence/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/03.best-practices/04.problem.element-presence/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -5258,6 +4149,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", @@ -5265,29 +4157,6 @@ "vitest": "^4.0.17" } }, - "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -5306,33 +4175,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -5432,16 +4274,6 @@ "node": ">=18" } }, - "exercises/03.best-practices/04.solution.element-presence/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/03.best-practices/04.solution.element-presence/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -5533,6 +4365,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", @@ -5540,29 +4373,6 @@ "vitest": "^4.0.17" } }, - "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -5581,33 +4391,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -5704,17 +4487,7 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/05.problem.page-navigation/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, "exercises/03.best-practices/05.problem.page-navigation/node_modules/vitest": { @@ -5808,6 +4581,7 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", @@ -5815,29 +4589,6 @@ "vitest": "^4.0.17" } }, - "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -5856,33 +4607,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -5982,16 +4706,6 @@ "node": ">=18" } }, - "exercises/03.best-practices/05.solution.page-navigation/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/03.best-practices/05.solution.page-navigation/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -6103,35 +4817,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -6150,33 +4842,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -6276,16 +4941,6 @@ "node": ">=18" } }, - "exercises/04.debugging/01.problem.dom-snapshots/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/04.debugging/01.problem.dom-snapshots/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -6376,35 +5031,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -6423,33 +5056,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -6549,16 +5155,6 @@ "node": ">=18" } }, - "exercises/04.debugging/01.solution.dom-snapshots/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/04.debugging/01.solution.dom-snapshots/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -6649,35 +5245,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -6696,33 +5270,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -6822,16 +5369,6 @@ "node": ">=18" } }, - "exercises/04.debugging/02.problem.debugger/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/04.debugging/02.problem.debugger/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -6921,34 +5458,12 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/expect": { @@ -6969,33 +5484,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -7095,16 +5583,6 @@ "node": ">=18" } }, - "exercises/04.debugging/02.solution.debugger/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/04.debugging/02.solution.debugger/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -7195,35 +5673,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -7242,33 +5698,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -7368,16 +5797,6 @@ "node": ">=18" } }, - "exercises/04.debugging/03.problem.breakpoints/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/04.debugging/03.problem.breakpoints/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -7468,35 +5887,13 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/browser": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", - "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/mocker": "4.0.17", - "@vitest/utils": "4.0.17", - "magic-string": "^0.30.21", - "pixelmatch": "7.1.0", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.0.3", - "ws": "^8.18.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.0.17" - } - }, "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", @@ -7515,33 +5912,6 @@ "url": "https://opencollective.com/vitest" } }, - "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", @@ -7641,16 +6011,6 @@ "node": ">=18" } }, - "exercises/04.debugging/03.solution.breakpoints/node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "exercises/04.debugging/03.solution.breakpoints/node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", @@ -10164,6 +8524,77 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, + "node_modules/@vitest/browser": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.17.tgz", + "integrity": "sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==", + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.17", + "@vitest/utils": "4.0.17", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.17" + } + }, + "node_modules/@vitest/browser-playwright": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.17.tgz", + "integrity": "sha512-CE9nlzslHX6Qz//MVrjpulTC9IgtXTbJ+q7Rx1HD+IeSOWv4NHIRNHPA6dB4x01d9paEqt+TvoqZfmgq40DxEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/browser": "4.0.17", + "@vitest/mocker": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "4.0.17" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": false + } + } + }, + "node_modules/@vitest/browser/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/browser/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@vitest/eslint-plugin": { "version": "1.1.31", "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.31.tgz", @@ -10185,6 +8616,41 @@ } } }, + "node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", @@ -14970,6 +13436,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/tldts": { "version": "6.1.77", "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.77.tgz", From d0eb97299edf233594a2ad886b5b80ecf5d4ae53 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 20 Jan 2026 21:30:22 +0000 Subject: [PATCH 05/11] Use vitest browser imports Co-authored-by: me --- .../01.problem.break-jsdom/tsconfig.test.json | 2 +- .../01.solution.break-jsdom/tsconfig.test.json | 2 +- .../01.problem.installation-and-setup/README.mdx | 4 ++-- .../01.problem.installation-and-setup/tsconfig.test.json | 2 +- .../01.solution.installation-and-setup/tsconfig.test.json | 2 +- .../02.problem.migrate-the-test/src/file-preview.test.tsx | 2 +- .../02.problem.migrate-the-test/tsconfig.test.json | 2 +- .../02.solution.migrate-the-test/README.mdx | 4 ++-- .../02.solution.migrate-the-test/src/file-preview.test.tsx | 2 +- .../02.solution.migrate-the-test/tsconfig.test.json | 2 +- .../02.vitest-browser-mode/03.problem.playwright/README.mdx | 2 +- .../03.problem.playwright/src/file-preview.test.tsx | 2 +- .../03.problem.playwright/tsconfig.test.json | 2 +- .../02.vitest-browser-mode/03.solution.playwright/README.mdx | 2 +- .../03.solution.playwright/src/file-preview.test.tsx | 2 +- .../03.solution.playwright/tsconfig.test.json | 2 +- .../04.problem.shared-assets/src/file-preview.test.tsx | 2 +- .../04.problem.shared-assets/tsconfig.test.json | 2 +- .../04.solution.shared-assets/README.mdx | 2 +- .../04.solution.shared-assets/src/file-preview.test.tsx | 2 +- .../04.solution.shared-assets/tsconfig.test.json | 2 +- .../05.problem.multiple-workspaces/src/file-preview.test.tsx | 2 +- .../05.problem.multiple-workspaces/tsconfig.test.json | 2 +- .../05.solution.multiple-workspaces/README.mdx | 2 +- .../src/file-preview.browser.test.tsx | 2 +- .../tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../01.problem.queries/tsconfig.test.browser.json | 2 +- exercises/03.best-practices/01.solution.queries/README.mdx | 4 ++-- .../src/discount-code-form.browser.test.tsx | 2 +- .../01.solution.queries/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../02.problem.user-events/tsconfig.test.browser.json | 2 +- .../03.best-practices/02.solution.user-events/README.mdx | 4 ++-- .../src/discount-code-form.browser.test.tsx | 2 +- .../02.solution.user-events/tsconfig.test.browser.json | 2 +- .../03.best-practices/03.problem.network-mocking/README.mdx | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../03.problem.network-mocking/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../03.solution.network-mocking/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../04.problem.element-presence/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../04.solution.element-presence/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../05.problem.page-navigation/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../05.solution.page-navigation/tsconfig.test.browser.json | 2 +- .../01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx | 2 +- .../01.problem.dom-snapshots/tsconfig.test.browser.json | 2 +- .../src/tic-tac-toe.browser.test.tsx | 2 +- .../01.solution.dom-snapshots/tsconfig.test.browser.json | 2 +- .../02.problem.debugger/src/tic-tac-toe.browser.test.tsx | 2 +- .../02.problem.debugger/tsconfig.test.browser.json | 2 +- .../02.solution.debugger/src/tic-tac-toe.browser.test.tsx | 2 +- .../02.solution.debugger/tsconfig.test.browser.json | 2 +- .../03.problem.breakpoints/src/main-menu.browser.test.tsx | 2 +- .../03.problem.breakpoints/tsconfig.test.browser.json | 2 +- exercises/04.debugging/03.solution.breakpoints/README.mdx | 2 +- .../03.solution.breakpoints/src/main-menu.browser.test.tsx | 2 +- .../03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx | 2 +- .../03.solution.breakpoints/tsconfig.test.browser.json | 2 +- 63 files changed, 67 insertions(+), 67 deletions(-) diff --git a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json index 2c91d02..b761f60 100644 --- a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json +++ b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json index 2c91d02..b761f60 100644 --- a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json +++ b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx index a07fb9a..2b52d25 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx @@ -84,7 +84,7 @@ First, I will remove the `import '@testing-library/jest-dom/vitest'` import we p import '@testing-library/jest-dom/vitest' ``` -Finally, confirm that `tsconfig.test.json` includes `vitest/globals` and `@vitest/browser/context` in `compilerOptions.types`: +Finally, confirm that `tsconfig.test.json` includes `vitest/globals` and `vitest/browser` in `compilerOptions.types`: ```json filename=tsconfig.test.json add=9 { @@ -92,7 +92,7 @@ Finally, confirm that `tsconfig.test.json` includes `vitest/globals` and `@vites "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } ``` diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json index 2c91d02..b761f60 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json index 2c91d02..b761f60 100644 --- a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx index 895e574..3349f8f 100644 --- a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx @@ -1,6 +1,6 @@ // 💣 Remove the import from `@testing-library/react`. You won't need it anymore. import { render, screen } from '@testing-library/react' -// 🐨 Import `page` from '@vitest/browser/context' +// 🐨 Import `page` from 'vitest/browser' // 💰 import { foo } from 'bar' // // 🐨 Import `render` from 'vitest-browser-react'. diff --git a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json index 2c91d02..b761f60 100644 --- a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/README.mdx b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/README.mdx index e9496bc..d0ef20e 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/README.mdx +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/README.mdx @@ -30,10 +30,10 @@ test('displays the preview card', () => { ## Element locators -Previously, I used the `screen` object from RTL to find elements in the virtual DOM. When using Vitest Browser Mode, I can now locate elements (and interact with them) using the `page` object from `@vitest/browser/context` instead: +Previously, I used the `screen` object from RTL to find elements in the virtual DOM. When using Vitest Browser Mode, I can now locate elements (and interact with them) using the `page` object from `vitest/browser` instead: ```tsx filename=file-preview.test.tsx add=1 highlight=8-9 -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview.tsx' diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx index f61837f..0803ecb 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json index 2c91d02..b761f60 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx b/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx index 84af258..057125f 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx @@ -15,7 +15,7 @@ Currently, Vitest supports two browser providers: [`playwright`](https://npmjs.c - The actual browser(s) used to run your tests; - Options available in `test.browser` in `vite.config.ts`; -- The underlying API used by the `page` object in `@vitest/browser/context`. +- The underlying API used by the `page` object in `vitest/browser`. In this workshop, we will be using Playwright as the browser provider for Vitest, but the steps involved are much the same if you choose to use WebdriverIO instead. diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx index f61837f..0803ecb 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json b/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json index 84d6302..e6fd452 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json @@ -7,7 +7,7 @@ "vitest/globals" // 🐨 Add the Vitest browser context types. - // 💰 "@vitest/browser/context" + // 💰 "vitest/browser" ] } } diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx b/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx index 191e1bd..4b210d2 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx @@ -53,7 +53,7 @@ And, finally, let's add the Vitest browser context types in `tsconfig.test.json` "module": "preserve", "types": [ "vitest/globals", - "@vitest/browser/context" + "vitest/browser" ] } } diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx index f61837f..0803ecb 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json b/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json index 2c91d02..b761f60 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx index f61837f..0803ecb 100644 --- a/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json b/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json index 2c91d02..b761f60 100644 --- a/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx b/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx index 96f85b2..9ffc1b8 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx @@ -32,7 +32,7 @@ Since we added this new file, we have to tell TypeScript how it should be handle ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } ``` diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx index f61837f..0803ecb 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json b/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json index 768bacb..c0efc2a 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["vitest.browser.setup.ts", "src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx index f61837f..0803ecb 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json index 768bacb..c0efc2a 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["vitest.browser.setup.ts", "src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx index 06b7b83..454a8e0 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx @@ -151,7 +151,7 @@ Next, I rename the existing `tsconfig.test.json` to `tsconfig.test.browser.json` ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } ``` diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx index f61837f..0803ecb 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json index 326e69f..bfe2af7 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx index 89d1a81..b9e8787 100644 --- a/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json b/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json index 326e69f..bfe2af7 100644 --- a/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json +++ b/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/03.best-practices/01.solution.queries/README.mdx b/exercises/03.best-practices/01.solution.queries/README.mdx index 9cb5f9d..a0660d8 100644 --- a/exercises/03.best-practices/01.solution.queries/README.mdx +++ b/exercises/03.best-practices/01.solution.queries/README.mdx @@ -39,10 +39,10 @@ A user would find this input by its _label text_ because they would see that it /> ``` -I can then select this input by using the `.getByLabelText()` method on the `page` object from `@vitest/browser/context`: +I can then select this input by using the `.getByLabelText()` method on the `page` object from `vitest/browser`: ```ts filename=discount-code-form.browser.test.tsx highlight=3 nonumber -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' const discountInput = page.getByLabelText('Discount code') ``` diff --git a/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx index e90f75e..b95f1d6 100644 --- a/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json b/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json index 326e69f..bfe2af7 100644 --- a/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json +++ b/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx index 82dc4c5..873f61c 100644 --- a/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json b/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json index 326e69f..bfe2af7 100644 --- a/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json +++ b/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/03.best-practices/02.solution.user-events/README.mdx b/exercises/03.best-practices/02.solution.user-events/README.mdx index 796b86b..bff33fc 100644 --- a/exercises/03.best-practices/02.solution.user-events/README.mdx +++ b/exercises/03.best-practices/02.solution.user-events/README.mdx @@ -106,10 +106,10 @@ This completes the test! 🎉 ## Locator methods vs `userEvent` -If you used React Testing Library in the past, you've likely been interacting with your components via the `userEvent` object from `@testing-library/user-event`. Vitest provides you a similar object from the `@vitest/browser/context` package: +If you used React Testing Library in the past, you've likely been interacting with your components via the `userEvent` object from `@testing-library/user-event`. Vitest provides you a similar object from the `vitest/browser` package: ```tsx nonumber highlight=1,7 -import { userEvent } from '@vitest/browser/context', +import { userEvent } from 'vitest/browser', test('applies a discount code', async () => { const applyDiscountButton = page.getByRole('button', { diff --git a/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx index 9003721..ba0762c 100644 --- a/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json b/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json index 326e69f..bfe2af7 100644 --- a/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json +++ b/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/03.best-practices/03.problem.network-mocking/README.mdx b/exercises/03.best-practices/03.problem.network-mocking/README.mdx index f64144c..4a6178a 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/README.mdx +++ b/exercises/03.best-practices/03.problem.network-mocking/README.mdx @@ -80,7 +80,7 @@ Since it's a new TypeScript module, you need to tell TypeScript how to handle it ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } ``` diff --git a/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx index cd54a64..089d530 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' // 🐨 Import the `test` function from `test-extend`. diff --git a/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json b/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json index 326e69f..bfe2af7 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json +++ b/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx index 298285a..7b85179 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' import { test } from '../test-extend' diff --git a/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json b/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json index 74c3de8..c44f930 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json +++ b/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx index e452464..2c3bf75 100644 --- a/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' import { test } from '../test-extend' diff --git a/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json b/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json index 74c3de8..c44f930 100644 --- a/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json +++ b/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx index f147803..89913a8 100644 --- a/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' import { test } from '../test-extend' diff --git a/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json b/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json index 74c3de8..c44f930 100644 --- a/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json +++ b/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx index dcc9cb3..5cf5ea9 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' import { test } from '../test-extend' diff --git a/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json b/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json index 74c3de8..c44f930 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json +++ b/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx index 0fcf285..31592dd 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' import { MemoryRouter } from 'react-router' diff --git a/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json b/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json index 7043593..f141f57 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json +++ b/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json @@ -8,6 +8,6 @@ "compilerOptions": { "target": "esnext", "module": "preserve", - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx index 358f39a..c456b85 100644 --- a/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json b/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json index 74c3de8..c44f930 100644 --- a/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json +++ b/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx index 987937b..11d6239 100644 --- a/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json b/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json index 74c3de8..c44f930 100644 --- a/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json +++ b/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx index e18d51c..cce3ee1 100644 --- a/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json b/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json index 74c3de8..c44f930 100644 --- a/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json +++ b/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx index 6d5a69f..046facd 100644 --- a/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json b/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json index 74c3de8..c44f930 100644 --- a/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json +++ b/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx b/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx index 953c9ed..ebfa339 100644 --- a/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx +++ b/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { MemoryRouter } from 'react-router' import { MainMenu } from './main-menu' diff --git a/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json b/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json index 74c3de8..c44f930 100644 --- a/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json +++ b/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } diff --git a/exercises/04.debugging/03.solution.breakpoints/README.mdx b/exercises/04.debugging/03.solution.breakpoints/README.mdx index 89f973d..ac43560 100644 --- a/exercises/04.debugging/03.solution.breakpoints/README.mdx +++ b/exercises/04.debugging/03.solution.breakpoints/README.mdx @@ -7,7 +7,7 @@ I will start the first task by removing all of the `debugger` statements from `tic-tac-toe.browser.test.tsx`: ```tsx filename=tic-tac-toe.browser.test.tsx remove=9,12,15 -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe.js' diff --git a/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx b/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx index 953c9ed..ebfa339 100644 --- a/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx +++ b/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { MemoryRouter } from 'react-router' import { MainMenu } from './main-menu' diff --git a/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx index 6d5a69f..046facd 100644 --- a/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,4 @@ -import { page } from '@vitest/browser/context' +import { page } from 'vitest/browser' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json b/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json index 74c3de8..c44f930 100644 --- a/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json +++ b/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "vitest/browser"] } } From 8b425610e51df8518d416dd7133db7bb6e0cc1ab Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 20 Jan 2026 21:41:37 +0000 Subject: [PATCH 06/11] Import vitest browser matchers Co-authored-by: me --- .../01.problem.break-jsdom/src/file-preview.test.tsx | 1 + .../01.problem.break-jsdom/tsconfig.test.json | 2 +- .../01.solution.break-jsdom/src/file-preview.test.tsx | 1 + .../01.solution.break-jsdom/tsconfig.test.json | 2 +- .../01.problem.installation-and-setup/README.mdx | 4 ++-- .../src/file-preview.test.tsx | 1 + .../01.problem.installation-and-setup/tsconfig.test.json | 2 +- .../src/file-preview.test.tsx | 1 + .../01.solution.installation-and-setup/tsconfig.test.json | 2 +- .../02.problem.migrate-the-test/src/file-preview.test.tsx | 3 ++- .../02.problem.migrate-the-test/tsconfig.test.json | 2 +- .../02.solution.migrate-the-test/README.mdx | 4 ++-- .../02.solution.migrate-the-test/src/file-preview.test.tsx | 3 ++- .../02.solution.migrate-the-test/tsconfig.test.json | 2 +- .../02.vitest-browser-mode/03.problem.playwright/README.mdx | 2 +- .../03.problem.playwright/src/file-preview.test.tsx | 3 ++- .../03.problem.playwright/tsconfig.test.json | 2 +- .../02.vitest-browser-mode/03.solution.playwright/README.mdx | 2 +- .../03.solution.playwright/src/file-preview.test.tsx | 3 ++- .../03.solution.playwright/tsconfig.test.json | 2 +- .../04.problem.shared-assets/src/file-preview.test.tsx | 3 ++- .../04.problem.shared-assets/tsconfig.test.json | 2 +- .../04.solution.shared-assets/README.mdx | 2 +- .../04.solution.shared-assets/src/file-preview.test.tsx | 3 ++- .../04.solution.shared-assets/tsconfig.test.json | 2 +- .../05.problem.multiple-workspaces/src/file-preview.test.tsx | 3 ++- .../05.problem.multiple-workspaces/tsconfig.test.json | 2 +- .../05.solution.multiple-workspaces/README.mdx | 2 +- .../src/file-preview.browser.test.tsx | 3 ++- .../tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 3 ++- .../01.problem.queries/tsconfig.test.browser.json | 2 +- exercises/03.best-practices/01.solution.queries/README.mdx | 4 ++-- .../src/discount-code-form.browser.test.tsx | 3 ++- .../01.solution.queries/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 3 ++- .../02.problem.user-events/tsconfig.test.browser.json | 2 +- .../03.best-practices/02.solution.user-events/README.mdx | 4 ++-- .../src/discount-code-form.browser.test.tsx | 3 ++- .../02.solution.user-events/tsconfig.test.browser.json | 2 +- .../03.best-practices/03.problem.network-mocking/README.mdx | 2 +- .../src/discount-code-form.browser.test.tsx | 3 ++- .../03.problem.network-mocking/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 3 ++- .../03.solution.network-mocking/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 3 ++- .../04.problem.element-presence/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 3 ++- .../04.solution.element-presence/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 3 ++- .../05.problem.page-navigation/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 3 ++- .../05.solution.page-navigation/tsconfig.test.browser.json | 2 +- .../01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx | 3 ++- .../01.problem.dom-snapshots/tsconfig.test.browser.json | 2 +- .../src/tic-tac-toe.browser.test.tsx | 3 ++- .../01.solution.dom-snapshots/tsconfig.test.browser.json | 2 +- .../02.problem.debugger/src/tic-tac-toe.browser.test.tsx | 3 ++- .../02.problem.debugger/tsconfig.test.browser.json | 2 +- .../02.solution.debugger/src/tic-tac-toe.browser.test.tsx | 3 ++- .../02.solution.debugger/tsconfig.test.browser.json | 2 +- .../03.problem.breakpoints/src/main-menu.browser.test.tsx | 3 ++- .../03.problem.breakpoints/tsconfig.test.browser.json | 2 +- exercises/04.debugging/03.solution.breakpoints/README.mdx | 2 +- .../03.solution.breakpoints/src/main-menu.browser.test.tsx | 3 ++- .../03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx | 3 ++- .../03.solution.breakpoints/tsconfig.test.browser.json | 2 +- 67 files changed, 96 insertions(+), 67 deletions(-) diff --git a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/file-preview.test.tsx b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/file-preview.test.tsx index 1939dba..8a63b2a 100644 --- a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/file-preview.test.tsx +++ b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/file-preview.test.tsx @@ -1,3 +1,4 @@ +import '@vitest/browser/matchers' import '@testing-library/jest-dom/vitest' import { render, screen } from '@testing-library/react' diff --git a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json index b761f60..2c91d02 100644 --- a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json +++ b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/file-preview.test.tsx b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/file-preview.test.tsx index 304e805..3270445 100644 --- a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/file-preview.test.tsx +++ b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/file-preview.test.tsx @@ -1,3 +1,4 @@ +import '@vitest/browser/matchers' import '@testing-library/jest-dom/vitest' import { render, screen } from '@testing-library/react' import { FilePreview } from './file-preview.tsx' diff --git a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json index b761f60..2c91d02 100644 --- a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json +++ b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx index 2b52d25..a07fb9a 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx @@ -84,7 +84,7 @@ First, I will remove the `import '@testing-library/jest-dom/vitest'` import we p import '@testing-library/jest-dom/vitest' ``` -Finally, confirm that `tsconfig.test.json` includes `vitest/globals` and `vitest/browser` in `compilerOptions.types`: +Finally, confirm that `tsconfig.test.json` includes `vitest/globals` and `@vitest/browser/context` in `compilerOptions.types`: ```json filename=tsconfig.test.json add=9 { @@ -92,7 +92,7 @@ Finally, confirm that `tsconfig.test.json` includes `vitest/globals` and `vitest "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } ``` diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/file-preview.test.tsx index ee3d680..432698c 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/file-preview.test.tsx @@ -1,3 +1,4 @@ +import '@vitest/browser/matchers' import '@testing-library/jest-dom/vitest' import { render, screen } from '@testing-library/react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json index b761f60..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/file-preview.test.tsx index b69e164..5a50fe3 100644 --- a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/file-preview.test.tsx @@ -1,3 +1,4 @@ +import '@vitest/browser/matchers' import { render, screen } from '@testing-library/react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json index b761f60..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx index 3349f8f..37686c8 100644 --- a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx @@ -1,6 +1,7 @@ +import '@vitest/browser/matchers' // 💣 Remove the import from `@testing-library/react`. You won't need it anymore. import { render, screen } from '@testing-library/react' -// 🐨 Import `page` from 'vitest/browser' +// 🐨 Import `page` from '@vitest/browser/context' // 💰 import { foo } from 'bar' // // 🐨 Import `render` from 'vitest-browser-react'. diff --git a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json index b761f60..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/README.mdx b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/README.mdx index d0ef20e..e9496bc 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/README.mdx +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/README.mdx @@ -30,10 +30,10 @@ test('displays the preview card', () => { ## Element locators -Previously, I used the `screen` object from RTL to find elements in the virtual DOM. When using Vitest Browser Mode, I can now locate elements (and interact with them) using the `page` object from `vitest/browser` instead: +Previously, I used the `screen` object from RTL to find elements in the virtual DOM. When using Vitest Browser Mode, I can now locate elements (and interact with them) using the `page` object from `@vitest/browser/context` instead: ```tsx filename=file-preview.test.tsx add=1 highlight=8-9 -import { page } from 'vitest/browser' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview.tsx' diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx index 0803ecb..04d4405 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json index b761f60..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx b/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx index 057125f..84af258 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx @@ -15,7 +15,7 @@ Currently, Vitest supports two browser providers: [`playwright`](https://npmjs.c - The actual browser(s) used to run your tests; - Options available in `test.browser` in `vite.config.ts`; -- The underlying API used by the `page` object in `vitest/browser`. +- The underlying API used by the `page` object in `@vitest/browser/context`. In this workshop, we will be using Playwright as the browser provider for Vitest, but the steps involved are much the same if you choose to use WebdriverIO instead. diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx index 0803ecb..04d4405 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json b/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json index e6fd452..84d6302 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json @@ -7,7 +7,7 @@ "vitest/globals" // 🐨 Add the Vitest browser context types. - // 💰 "vitest/browser" + // 💰 "@vitest/browser/context" ] } } diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx b/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx index 4b210d2..191e1bd 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx @@ -53,7 +53,7 @@ And, finally, let's add the Vitest browser context types in `tsconfig.test.json` "module": "preserve", "types": [ "vitest/globals", - "vitest/browser" + "@vitest/browser/context" ] } } diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx index 0803ecb..04d4405 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json b/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json index b761f60..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx index 0803ecb..04d4405 100644 --- a/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json b/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json index b761f60..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx b/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx index 9ffc1b8..96f85b2 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx @@ -32,7 +32,7 @@ Since we added this new file, we have to tell TypeScript how it should be handle ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } ``` diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx index 0803ecb..04d4405 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json b/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json index c0efc2a..768bacb 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["vitest.browser.setup.ts", "src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx index 0803ecb..04d4405 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json index c0efc2a..768bacb 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["vitest.browser.setup.ts", "src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx index 454a8e0..06b7b83 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx @@ -151,7 +151,7 @@ Next, I rename the existing `tsconfig.test.json` to `tsconfig.test.browser.json` ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } ``` diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx index 0803ecb..04d4405 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json index bfe2af7..326e69f 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx index b9e8787..86717fc 100644 --- a/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json b/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json index bfe2af7..326e69f 100644 --- a/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json +++ b/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/01.solution.queries/README.mdx b/exercises/03.best-practices/01.solution.queries/README.mdx index a0660d8..9cb5f9d 100644 --- a/exercises/03.best-practices/01.solution.queries/README.mdx +++ b/exercises/03.best-practices/01.solution.queries/README.mdx @@ -39,10 +39,10 @@ A user would find this input by its _label text_ because they would see that it /> ``` -I can then select this input by using the `.getByLabelText()` method on the `page` object from `vitest/browser`: +I can then select this input by using the `.getByLabelText()` method on the `page` object from `@vitest/browser/context`: ```ts filename=discount-code-form.browser.test.tsx highlight=3 nonumber -import { page } from 'vitest/browser' +import { page } from '@vitest/browser/context' const discountInput = page.getByLabelText('Discount code') ``` diff --git a/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx index b95f1d6..760a8a0 100644 --- a/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json b/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json index bfe2af7..326e69f 100644 --- a/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json +++ b/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx index 873f61c..2544bbc 100644 --- a/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json b/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json index bfe2af7..326e69f 100644 --- a/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json +++ b/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/02.solution.user-events/README.mdx b/exercises/03.best-practices/02.solution.user-events/README.mdx index bff33fc..796b86b 100644 --- a/exercises/03.best-practices/02.solution.user-events/README.mdx +++ b/exercises/03.best-practices/02.solution.user-events/README.mdx @@ -106,10 +106,10 @@ This completes the test! 🎉 ## Locator methods vs `userEvent` -If you used React Testing Library in the past, you've likely been interacting with your components via the `userEvent` object from `@testing-library/user-event`. Vitest provides you a similar object from the `vitest/browser` package: +If you used React Testing Library in the past, you've likely been interacting with your components via the `userEvent` object from `@testing-library/user-event`. Vitest provides you a similar object from the `@vitest/browser/context` package: ```tsx nonumber highlight=1,7 -import { userEvent } from 'vitest/browser', +import { userEvent } from '@vitest/browser/context', test('applies a discount code', async () => { const applyDiscountButton = page.getByRole('button', { diff --git a/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx index ba0762c..7ab66b0 100644 --- a/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json b/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json index bfe2af7..326e69f 100644 --- a/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json +++ b/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/03.problem.network-mocking/README.mdx b/exercises/03.best-practices/03.problem.network-mocking/README.mdx index 4a6178a..f64144c 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/README.mdx +++ b/exercises/03.best-practices/03.problem.network-mocking/README.mdx @@ -80,7 +80,7 @@ Since it's a new TypeScript module, you need to tell TypeScript how to handle it ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } ``` diff --git a/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx index 089d530..7d62005 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' // 🐨 Import the `test` function from `test-extend`. diff --git a/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json b/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json index bfe2af7..326e69f 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json +++ b/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx index 7b85179..fe875df 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' import { test } from '../test-extend' diff --git a/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json b/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json index c44f930..74c3de8 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json +++ b/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx index 2c3bf75..f73761f 100644 --- a/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' import { test } from '../test-extend' diff --git a/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json b/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json index c44f930..74c3de8 100644 --- a/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json +++ b/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx index 89913a8..e208ba7 100644 --- a/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' import { test } from '../test-extend' diff --git a/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json b/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json index c44f930..74c3de8 100644 --- a/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json +++ b/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx index 5cf5ea9..7c1b78e 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' import { test } from '../test-extend' diff --git a/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json b/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json index c44f930..74c3de8 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json +++ b/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx index 31592dd..faf58cc 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' import { MemoryRouter } from 'react-router' diff --git a/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json b/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json index f141f57..7043593 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json +++ b/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json @@ -8,6 +8,6 @@ "compilerOptions": { "target": "esnext", "module": "preserve", - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx index c456b85..80c6105 100644 --- a/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json b/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json index c44f930..74c3de8 100644 --- a/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json +++ b/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx index 11d6239..a9f17f6 100644 --- a/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json b/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json index c44f930..74c3de8 100644 --- a/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json +++ b/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx index cce3ee1..7003c6d 100644 --- a/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json b/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json index c44f930..74c3de8 100644 --- a/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json +++ b/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx index 046facd..a5f13e1 100644 --- a/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json b/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json index c44f930..74c3de8 100644 --- a/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json +++ b/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx b/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx index ebfa339..6b715a0 100644 --- a/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx +++ b/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { MemoryRouter } from 'react-router' import { MainMenu } from './main-menu' diff --git a/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json b/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json index c44f930..74c3de8 100644 --- a/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json +++ b/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/03.solution.breakpoints/README.mdx b/exercises/04.debugging/03.solution.breakpoints/README.mdx index ac43560..89f973d 100644 --- a/exercises/04.debugging/03.solution.breakpoints/README.mdx +++ b/exercises/04.debugging/03.solution.breakpoints/README.mdx @@ -7,7 +7,7 @@ I will start the first task by removing all of the `debugger` statements from `tic-tac-toe.browser.test.tsx`: ```tsx filename=tic-tac-toe.browser.test.tsx remove=9,12,15 -import { page } from 'vitest/browser' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe.js' diff --git a/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx b/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx index ebfa339..6b715a0 100644 --- a/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx +++ b/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { MemoryRouter } from 'react-router' import { MainMenu } from './main-menu' diff --git a/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx index 046facd..a5f13e1 100644 --- a/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,5 @@ -import { page } from 'vitest/browser' +import '@vitest/browser/matchers' +import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json b/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json index c44f930..74c3de8 100644 --- a/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json +++ b/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "vitest/browser"] + "types": ["vitest/globals", "@vitest/browser/context"] } } From 78cfe59f32a9eb2a1002ebbf5c86728b6240bdc6 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 20 Jan 2026 21:44:41 +0000 Subject: [PATCH 07/11] Use type-only matcher imports Co-authored-by: me --- .../01.problem.break-jsdom/src/file-preview.test.tsx | 2 +- .../01.solution.break-jsdom/src/file-preview.test.tsx | 2 +- .../01.problem.installation-and-setup/src/file-preview.test.tsx | 2 +- .../src/file-preview.test.tsx | 2 +- .../02.problem.migrate-the-test/src/file-preview.test.tsx | 2 +- .../02.solution.migrate-the-test/src/file-preview.test.tsx | 2 +- .../03.problem.playwright/src/file-preview.test.tsx | 2 +- .../03.solution.playwright/src/file-preview.test.tsx | 2 +- .../04.problem.shared-assets/src/file-preview.test.tsx | 2 +- .../04.solution.shared-assets/src/file-preview.test.tsx | 2 +- .../05.problem.multiple-workspaces/src/file-preview.test.tsx | 2 +- .../src/file-preview.browser.test.tsx | 2 +- .../01.problem.queries/src/discount-code-form.browser.test.tsx | 2 +- .../01.solution.queries/src/discount-code-form.browser.test.tsx | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../src/discount-code-form.browser.test.tsx | 2 +- .../01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx | 2 +- .../01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx | 2 +- .../02.problem.debugger/src/tic-tac-toe.browser.test.tsx | 2 +- .../02.solution.debugger/src/tic-tac-toe.browser.test.tsx | 2 +- .../03.problem.breakpoints/src/main-menu.browser.test.tsx | 2 +- .../03.solution.breakpoints/src/main-menu.browser.test.tsx | 2 +- .../03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx | 2 +- 29 files changed, 29 insertions(+), 29 deletions(-) diff --git a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/file-preview.test.tsx b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/file-preview.test.tsx index 8a63b2a..239dd51 100644 --- a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/file-preview.test.tsx +++ b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import '@testing-library/jest-dom/vitest' import { render, screen } from '@testing-library/react' diff --git a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/file-preview.test.tsx b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/file-preview.test.tsx index 3270445..5d36f9e 100644 --- a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/file-preview.test.tsx +++ b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import '@testing-library/jest-dom/vitest' import { render, screen } from '@testing-library/react' import { FilePreview } from './file-preview.tsx' diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/file-preview.test.tsx index 432698c..e52d613 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import '@testing-library/jest-dom/vitest' import { render, screen } from '@testing-library/react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/file-preview.test.tsx index 5a50fe3..9e9e26b 100644 --- a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { render, screen } from '@testing-library/react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx index 37686c8..71240ff 100644 --- a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' // 💣 Remove the import from `@testing-library/react`. You won't need it anymore. import { render, screen } from '@testing-library/react' // 🐨 Import `page` from '@vitest/browser/context' diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx index 04d4405..5fa124f 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx index 04d4405..5fa124f 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx index 04d4405..5fa124f 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx index 04d4405..5fa124f 100644 --- a/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx index 04d4405..5fa124f 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx index 04d4405..5fa124f 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx index 04d4405..5fa124f 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx index 86717fc..92e1158 100644 --- a/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx index 760a8a0..9f53a3c 100644 --- a/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx index 2544bbc..17e6ce6 100644 --- a/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx index 7ab66b0..4692916 100644 --- a/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx index 7d62005..b5b6e1e 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' diff --git a/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx index fe875df..c81703c 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' diff --git a/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx index f73761f..31421b3 100644 --- a/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' diff --git a/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx index e208ba7..c9e7957 100644 --- a/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' diff --git a/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx index 7c1b78e..5b16bd8 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' diff --git a/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx index faf58cc..009dc48 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' diff --git a/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx index 80c6105..fc7735a 100644 --- a/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx index a9f17f6..6577bf0 100644 --- a/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx index 7003c6d..3784708 100644 --- a/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx index a5f13e1..3ff65ab 100644 --- a/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx b/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx index 6b715a0..d13311f 100644 --- a/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx +++ b/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { MemoryRouter } from 'react-router' diff --git a/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx b/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx index 6b715a0..d13311f 100644 --- a/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx +++ b/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { MemoryRouter } from 'react-router' diff --git a/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx index a5f13e1..3ff65ab 100644 --- a/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,4 @@ -import '@vitest/browser/matchers' +import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' From 173c8109f3db609cf70142c1fc2d87b6d1e1d871 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 20 Jan 2026 21:48:25 +0000 Subject: [PATCH 08/11] Restore vitest browser matcher types Co-authored-by: me --- .../01.problem.break-jsdom/src/file-preview.test.tsx | 1 - .../01.problem.break-jsdom/tsconfig.test.json | 2 +- .../01.solution.break-jsdom/src/file-preview.test.tsx | 1 - .../01.solution.break-jsdom/tsconfig.test.json | 2 +- .../01.problem.installation-and-setup/README.mdx | 6 +++--- .../src/file-preview.test.tsx | 1 - .../01.problem.installation-and-setup/tsconfig.test.json | 2 +- .../src/file-preview.test.tsx | 1 - .../01.solution.installation-and-setup/tsconfig.test.json | 2 +- .../02.problem.migrate-the-test/src/file-preview.test.tsx | 1 - .../02.problem.migrate-the-test/tsconfig.test.json | 2 +- .../02.solution.migrate-the-test/src/file-preview.test.tsx | 1 - .../02.solution.migrate-the-test/tsconfig.test.json | 2 +- .../03.problem.playwright/README.mdx | 2 +- .../03.problem.playwright/src/file-preview.test.tsx | 1 - .../03.problem.playwright/tsconfig.test.json | 7 +++---- .../03.solution.playwright/README.mdx | 5 +++-- .../03.solution.playwright/src/file-preview.test.tsx | 1 - .../03.solution.playwright/tsconfig.test.json | 2 +- .../04.problem.shared-assets/src/file-preview.test.tsx | 1 - .../04.problem.shared-assets/tsconfig.test.json | 2 +- .../04.solution.shared-assets/README.mdx | 2 +- .../04.solution.shared-assets/src/file-preview.test.tsx | 1 - .../04.solution.shared-assets/tsconfig.test.json | 2 +- .../src/file-preview.test.tsx | 1 - .../05.problem.multiple-workspaces/tsconfig.test.json | 2 +- .../05.solution.multiple-workspaces/README.mdx | 2 +- .../src/file-preview.browser.test.tsx | 1 - .../tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 1 - .../01.problem.queries/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 1 - .../01.solution.queries/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 1 - .../02.problem.user-events/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 1 - .../02.solution.user-events/tsconfig.test.browser.json | 2 +- .../03.problem.network-mocking/README.mdx | 2 +- .../src/discount-code-form.browser.test.tsx | 1 - .../03.problem.network-mocking/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 1 - .../03.solution.network-mocking/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 1 - .../04.problem.element-presence/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 1 - .../tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 1 - .../05.problem.page-navigation/tsconfig.test.browser.json | 2 +- .../src/discount-code-form.browser.test.tsx | 1 - .../05.solution.page-navigation/tsconfig.test.browser.json | 2 +- .../src/tic-tac-toe.browser.test.tsx | 1 - .../01.problem.dom-snapshots/tsconfig.test.browser.json | 2 +- .../src/tic-tac-toe.browser.test.tsx | 1 - .../01.solution.dom-snapshots/tsconfig.test.browser.json | 2 +- .../02.problem.debugger/src/tic-tac-toe.browser.test.tsx | 1 - .../02.problem.debugger/tsconfig.test.browser.json | 2 +- .../02.solution.debugger/src/tic-tac-toe.browser.test.tsx | 1 - .../02.solution.debugger/tsconfig.test.browser.json | 2 +- .../03.problem.breakpoints/src/main-menu.browser.test.tsx | 1 - .../03.problem.breakpoints/tsconfig.test.browser.json | 2 +- .../03.solution.breakpoints/src/main-menu.browser.test.tsx | 1 - .../src/tic-tac-toe.browser.test.tsx | 1 - .../03.solution.breakpoints/tsconfig.test.browser.json | 2 +- 63 files changed, 40 insertions(+), 69 deletions(-) diff --git a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/file-preview.test.tsx b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/file-preview.test.tsx index 239dd51..1939dba 100644 --- a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/file-preview.test.tsx +++ b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/file-preview.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import '@testing-library/jest-dom/vitest' import { render, screen } from '@testing-library/react' diff --git a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json index 2c91d02..68b35f0 100644 --- a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json +++ b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/file-preview.test.tsx b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/file-preview.test.tsx index 5d36f9e..304e805 100644 --- a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/file-preview.test.tsx +++ b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/file-preview.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import '@testing-library/jest-dom/vitest' import { render, screen } from '@testing-library/react' import { FilePreview } from './file-preview.tsx' diff --git a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json index 2c91d02..68b35f0 100644 --- a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json +++ b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx index a07fb9a..0727b48 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx @@ -76,7 +76,7 @@ export default defineConfig({ ## Configure TypeScript -The last thing that remains is to make sure TypeScript sees the Vitest globals and the browser context types (these include the browser matchers). +The last thing that remains is to make sure TypeScript sees the Vitest globals, browser context types, and matcher types. First, I will remove the `import '@testing-library/jest-dom/vitest'` import we previously had in the test: @@ -84,7 +84,7 @@ First, I will remove the `import '@testing-library/jest-dom/vitest'` import we p import '@testing-library/jest-dom/vitest' ``` -Finally, confirm that `tsconfig.test.json` includes `vitest/globals` and `@vitest/browser/context` in `compilerOptions.types`: +Finally, confirm that `tsconfig.test.json` includes `vitest/globals`, `@vitest/browser/context`, and `@vitest/browser/matchers` in `compilerOptions.types`: ```json filename=tsconfig.test.json add=9 { @@ -92,7 +92,7 @@ Finally, confirm that `tsconfig.test.json` includes `vitest/globals` and `@vites "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } ``` diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/file-preview.test.tsx index e52d613..ee3d680 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/file-preview.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import '@testing-library/jest-dom/vitest' import { render, screen } from '@testing-library/react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json index 2c91d02..68b35f0 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/file-preview.test.tsx index 9e9e26b..b69e164 100644 --- a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/file-preview.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { render, screen } from '@testing-library/react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json index 2c91d02..68b35f0 100644 --- a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx index 71240ff..895e574 100644 --- a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/file-preview.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' // 💣 Remove the import from `@testing-library/react`. You won't need it anymore. import { render, screen } from '@testing-library/react' // 🐨 Import `page` from '@vitest/browser/context' diff --git a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json index 2c91d02..68b35f0 100644 --- a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx index 5fa124f..f61837f 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/file-preview.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json index 2c91d02..68b35f0 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx b/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx index 84af258..e0ef6a8 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx @@ -23,6 +23,6 @@ In this workshop, we will be using Playwright as the browser provider for Vitest 1. Install `playwright` and `@vitest/browser-playwright` as dependencies in the project; 1. In `vite.config.ts`, import `playwright` from `@vitest/browser-playwright` and set `test.browser.provider` to `playwright()`; -1. In `tsconfig.test.json`, update the `compilerOptions.types` to include the Vitest browser context types (these also provide the matcher typings). +1. In `tsconfig.test.json`, update the `compilerOptions.types` to include the Vitest browser context and matcher types. Once you are done with it, make sure that the tests are still passing by running `npm test`. Good luck! diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx index 5fa124f..f61837f 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/src/file-preview.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json b/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json index 84d6302..42f5e13 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json @@ -4,10 +4,9 @@ "exclude": [], "compilerOptions": { "types": [ - "vitest/globals" - - // 🐨 Add the Vitest browser context types. - // 💰 "@vitest/browser/context" + "vitest/globals", + "@vitest/browser/context", + "@vitest/browser/matchers" ] } } diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx b/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx index 191e1bd..81f34c6 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx @@ -42,7 +42,7 @@ export default defineConfig({ }) ``` -And, finally, let's add the Vitest browser context types in `tsconfig.test.json`: +And, finally, let's add the Vitest browser context and matcher types in `tsconfig.test.json`: ```json filename=tsconfig.test.json remove=9 add=10 { @@ -53,7 +53,8 @@ And, finally, let's add the Vitest browser context types in `tsconfig.test.json` "module": "preserve", "types": [ "vitest/globals", - "@vitest/browser/context" + "@vitest/browser/context", + "@vitest/browser/matchers" ] } } diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx index 5fa124f..f61837f 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/src/file-preview.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json b/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json index 2c91d02..68b35f0 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx index 5fa124f..f61837f 100644 --- a/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/file-preview.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json b/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json index 2c91d02..68b35f0 100644 --- a/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx b/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx index 96f85b2..4a282d6 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx @@ -32,7 +32,7 @@ Since we added this new file, we have to tell TypeScript how it should be handle ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } ``` diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx index 5fa124f..f61837f 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/file-preview.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json b/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json index 768bacb..00a1396 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["vitest.browser.setup.ts", "src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx index 5fa124f..f61837f 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/file-preview.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json index 768bacb..00a1396 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["vitest.browser.setup.ts", "src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx index 06b7b83..65a9d15 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx @@ -151,7 +151,7 @@ Next, I rename the existing `tsconfig.test.json` to `tsconfig.test.browser.json` ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } ``` diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx index 5fa124f..f61837f 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/file-preview.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { FilePreview } from './file-preview' diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json index 326e69f..67e3862 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx index 92e1158..89d1a81 100644 --- a/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/01.problem.queries/src/discount-code-form.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json b/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json index 326e69f..67e3862 100644 --- a/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json +++ b/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx index 9f53a3c..e90f75e 100644 --- a/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/01.solution.queries/src/discount-code-form.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json b/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json index 326e69f..67e3862 100644 --- a/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json +++ b/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx index 17e6ce6..82dc4c5 100644 --- a/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/02.problem.user-events/src/discount-code-form.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json b/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json index 326e69f..67e3862 100644 --- a/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json +++ b/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx index 4692916..9003721 100644 --- a/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/02.solution.user-events/src/discount-code-form.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { DiscountCodeForm } from './discount-code-form' diff --git a/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json b/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json index 326e69f..67e3862 100644 --- a/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json +++ b/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/03.best-practices/03.problem.network-mocking/README.mdx b/exercises/03.best-practices/03.problem.network-mocking/README.mdx index f64144c..85fcaad 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/README.mdx +++ b/exercises/03.best-practices/03.problem.network-mocking/README.mdx @@ -80,7 +80,7 @@ Since it's a new TypeScript module, you need to tell TypeScript how to handle it ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } ``` diff --git a/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx index b5b6e1e..cd54a64 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/03.problem.network-mocking/src/discount-code-form.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' diff --git a/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json b/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json index 326e69f..67e3862 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json +++ b/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx index c81703c..298285a 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/03.solution.network-mocking/src/discount-code-form.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' diff --git a/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json b/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json index 74c3de8..5640acb 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json +++ b/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx index 31421b3..e452464 100644 --- a/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/04.problem.element-presence/src/discount-code-form.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' diff --git a/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json b/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json index 74c3de8..5640acb 100644 --- a/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json +++ b/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx index c9e7957..f147803 100644 --- a/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/04.solution.element-presence/src/discount-code-form.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' diff --git a/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json b/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json index 74c3de8..5640acb 100644 --- a/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json +++ b/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx index 5b16bd8..dcc9cb3 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/05.problem.page-navigation/src/discount-code-form.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' diff --git a/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json b/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json index 74c3de8..5640acb 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json +++ b/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx b/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx index 009dc48..0fcf285 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx +++ b/exercises/03.best-practices/05.solution.page-navigation/src/discount-code-form.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { http, HttpResponse } from 'msw' diff --git a/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json b/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json index 7043593..191a9ef 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json +++ b/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json @@ -8,6 +8,6 @@ "compilerOptions": { "target": "esnext", "module": "preserve", - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx index fc7735a..358f39a 100644 --- a/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/01.problem.dom-snapshots/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json b/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json index 74c3de8..5640acb 100644 --- a/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json +++ b/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx index 6577bf0..987937b 100644 --- a/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/01.solution.dom-snapshots/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json b/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json index 74c3de8..5640acb 100644 --- a/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json +++ b/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx index 3784708..e18d51c 100644 --- a/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/02.problem.debugger/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json b/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json index 74c3de8..5640acb 100644 --- a/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json +++ b/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx index 3ff65ab..6d5a69f 100644 --- a/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/02.solution.debugger/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json b/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json index 74c3de8..5640acb 100644 --- a/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json +++ b/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx b/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx index d13311f..953c9ed 100644 --- a/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx +++ b/exercises/04.debugging/03.problem.breakpoints/src/main-menu.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { MemoryRouter } from 'react-router' diff --git a/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json b/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json index 74c3de8..5640acb 100644 --- a/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json +++ b/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } diff --git a/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx b/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx index d13311f..953c9ed 100644 --- a/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx +++ b/exercises/04.debugging/03.solution.breakpoints/src/main-menu.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { MemoryRouter } from 'react-router' diff --git a/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx b/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx index 3ff65ab..6d5a69f 100644 --- a/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx +++ b/exercises/04.debugging/03.solution.breakpoints/src/tic-tac-toe.browser.test.tsx @@ -1,4 +1,3 @@ -import type '@vitest/browser/matchers' import { page } from '@vitest/browser/context' import { render } from 'vitest-browser-react' import { TicTacToe } from './tic-tac-toe' diff --git a/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json b/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json index 74c3de8..5640acb 100644 --- a/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json +++ b/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context"] + "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] } } From 71ed6ca09dfda28ecab89051a8e21661f471d038 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 20 Jan 2026 21:54:48 +0000 Subject: [PATCH 09/11] Reference browser matchers in vite-env Co-authored-by: me --- .../01.problem.break-jsdom/src/vite-env.d.ts | 1 + .../01.problem.break-jsdom/tsconfig.test.json | 2 +- .../01.solution.break-jsdom/src/vite-env.d.ts | 1 + .../01.solution.break-jsdom/tsconfig.test.json | 2 +- .../01.problem.installation-and-setup/README.mdx | 6 +++--- .../01.problem.installation-and-setup/src/vite-env.d.ts | 1 + .../01.problem.installation-and-setup/tsconfig.test.json | 2 +- .../01.solution.installation-and-setup/src/vite-env.d.ts | 1 + .../01.solution.installation-and-setup/tsconfig.test.json | 2 +- .../02.problem.migrate-the-test/src/vite-env.d.ts | 1 + .../02.problem.migrate-the-test/tsconfig.test.json | 2 +- .../02.solution.migrate-the-test/src/vite-env.d.ts | 1 + .../02.solution.migrate-the-test/tsconfig.test.json | 2 +- .../02.vitest-browser-mode/03.problem.playwright/README.mdx | 2 +- .../03.problem.playwright/src/vite-env.d.ts | 1 + .../03.problem.playwright/tsconfig.test.json | 3 +-- .../03.solution.playwright/README.mdx | 5 ++--- .../03.solution.playwright/src/vite-env.d.ts | 1 + .../03.solution.playwright/tsconfig.test.json | 2 +- .../04.problem.shared-assets/src/vite-env.d.ts | 1 + .../04.problem.shared-assets/tsconfig.test.json | 2 +- .../04.solution.shared-assets/README.mdx | 2 +- .../04.solution.shared-assets/src/vite-env.d.ts | 1 + .../04.solution.shared-assets/tsconfig.test.json | 2 +- .../05.problem.multiple-workspaces/src/vite-env.d.ts | 1 + .../05.problem.multiple-workspaces/tsconfig.test.json | 2 +- .../05.solution.multiple-workspaces/README.mdx | 2 +- .../05.solution.multiple-workspaces/src/vite-env.d.ts | 1 + .../tsconfig.test.browser.json | 2 +- .../03.best-practices/01.problem.queries/src/vite-env.d.ts | 1 + .../01.problem.queries/tsconfig.test.browser.json | 2 +- .../03.best-practices/01.solution.queries/src/vite-env.d.ts | 1 + .../01.solution.queries/tsconfig.test.browser.json | 2 +- .../02.problem.user-events/src/vite-env.d.ts | 1 + .../02.problem.user-events/tsconfig.test.browser.json | 2 +- .../02.solution.user-events/src/vite-env.d.ts | 1 + .../02.solution.user-events/tsconfig.test.browser.json | 2 +- .../03.best-practices/03.problem.network-mocking/README.mdx | 2 +- .../03.problem.network-mocking/src/vite-env.d.ts | 1 + .../03.problem.network-mocking/tsconfig.test.browser.json | 2 +- .../03.solution.network-mocking/src/vite-env.d.ts | 1 + .../03.solution.network-mocking/tsconfig.test.browser.json | 2 +- .../04.problem.element-presence/src/vite-env.d.ts | 1 + .../04.problem.element-presence/tsconfig.test.browser.json | 2 +- .../04.solution.element-presence/src/vite-env.d.ts | 1 + .../04.solution.element-presence/tsconfig.test.browser.json | 2 +- .../05.problem.page-navigation/src/vite-env.d.ts | 1 + .../05.problem.page-navigation/tsconfig.test.browser.json | 2 +- .../05.solution.page-navigation/src/vite-env.d.ts | 1 + .../05.solution.page-navigation/tsconfig.test.browser.json | 2 +- .../04.debugging/01.problem.dom-snapshots/src/vite-env.d.ts | 1 + .../01.problem.dom-snapshots/tsconfig.test.browser.json | 2 +- .../01.solution.dom-snapshots/src/vite-env.d.ts | 1 + .../01.solution.dom-snapshots/tsconfig.test.browser.json | 2 +- .../04.debugging/02.problem.debugger/src/vite-env.d.ts | 1 + .../02.problem.debugger/tsconfig.test.browser.json | 2 +- .../04.debugging/02.solution.debugger/src/vite-env.d.ts | 1 + .../02.solution.debugger/tsconfig.test.browser.json | 2 +- .../04.debugging/03.problem.breakpoints/src/vite-env.d.ts | 1 + .../03.problem.breakpoints/tsconfig.test.browser.json | 2 +- .../04.debugging/03.solution.breakpoints/src/vite-env.d.ts | 1 + .../03.solution.breakpoints/tsconfig.test.browser.json | 2 +- 62 files changed, 65 insertions(+), 39 deletions(-) diff --git a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/vite-env.d.ts b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/vite-env.d.ts +++ b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json index 68b35f0..2c91d02 100644 --- a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json +++ b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/vite-env.d.ts b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/vite-env.d.ts +++ b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json index 68b35f0..2c91d02 100644 --- a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json +++ b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx index 0727b48..8e7bf50 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx @@ -76,7 +76,7 @@ export default defineConfig({ ## Configure TypeScript -The last thing that remains is to make sure TypeScript sees the Vitest globals, browser context types, and matcher types. +The last thing that remains is to make sure TypeScript sees the Vitest globals and browser context types. The matcher types are referenced from `vite-env.d.ts`. First, I will remove the `import '@testing-library/jest-dom/vitest'` import we previously had in the test: @@ -84,7 +84,7 @@ First, I will remove the `import '@testing-library/jest-dom/vitest'` import we p import '@testing-library/jest-dom/vitest' ``` -Finally, confirm that `tsconfig.test.json` includes `vitest/globals`, `@vitest/browser/context`, and `@vitest/browser/matchers` in `compilerOptions.types`: +Finally, confirm that `tsconfig.test.json` includes `vitest/globals` and `@vitest/browser/context` in `compilerOptions.types`: ```json filename=tsconfig.test.json add=9 { @@ -92,7 +92,7 @@ Finally, confirm that `tsconfig.test.json` includes `vitest/globals`, `@vitest/b "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } ``` diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json index 68b35f0..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json index 68b35f0..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json index 68b35f0..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json index 68b35f0..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx b/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx index e0ef6a8..c1680ad 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/README.mdx @@ -23,6 +23,6 @@ In this workshop, we will be using Playwright as the browser provider for Vitest 1. Install `playwright` and `@vitest/browser-playwright` as dependencies in the project; 1. In `vite.config.ts`, import `playwright` from `@vitest/browser-playwright` and set `test.browser.provider` to `playwright()`; -1. In `tsconfig.test.json`, update the `compilerOptions.types` to include the Vitest browser context and matcher types. +1. In `tsconfig.test.json`, update the `compilerOptions.types` to include the Vitest browser context types. Once you are done with it, make sure that the tests are still passing by running `npm test`. Good luck! diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/03.problem.playwright/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json b/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json index 42f5e13..2302389 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/tsconfig.test.json @@ -5,8 +5,7 @@ "compilerOptions": { "types": [ "vitest/globals", - "@vitest/browser/context", - "@vitest/browser/matchers" + "@vitest/browser/context" ] } } diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx b/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx index 81f34c6..191e1bd 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/README.mdx @@ -42,7 +42,7 @@ export default defineConfig({ }) ``` -And, finally, let's add the Vitest browser context and matcher types in `tsconfig.test.json`: +And, finally, let's add the Vitest browser context types in `tsconfig.test.json`: ```json filename=tsconfig.test.json remove=9 add=10 { @@ -53,8 +53,7 @@ And, finally, let's add the Vitest browser context and matcher types in `tsconfi "module": "preserve", "types": [ "vitest/globals", - "@vitest/browser/context", - "@vitest/browser/matchers" + "@vitest/browser/context" ] } } diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/03.solution.playwright/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json b/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json index 68b35f0..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json b/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json index 68b35f0..2c91d02 100644 --- a/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/04.problem.shared-assets/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx b/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx index 4a282d6..96f85b2 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/README.mdx @@ -32,7 +32,7 @@ Since we added this new file, we have to tell TypeScript how it should be handle ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } ``` diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json b/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json index 00a1396..768bacb 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["vitest.browser.setup.ts", "src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json index 00a1396..768bacb 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/tsconfig.test.json @@ -3,6 +3,6 @@ "include": ["vitest.browser.setup.ts", "src/**/*", "src/**/*.test.ts*"], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx index 65a9d15..06b7b83 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/README.mdx @@ -151,7 +151,7 @@ Next, I rename the existing `tsconfig.test.json` to `tsconfig.test.browser.json` ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } ``` diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json index 67e3862..326e69f 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/01.problem.queries/src/vite-env.d.ts b/exercises/03.best-practices/01.problem.queries/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/03.best-practices/01.problem.queries/src/vite-env.d.ts +++ b/exercises/03.best-practices/01.problem.queries/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json b/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json index 67e3862..326e69f 100644 --- a/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json +++ b/exercises/03.best-practices/01.problem.queries/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/01.solution.queries/src/vite-env.d.ts b/exercises/03.best-practices/01.solution.queries/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/03.best-practices/01.solution.queries/src/vite-env.d.ts +++ b/exercises/03.best-practices/01.solution.queries/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json b/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json index 67e3862..326e69f 100644 --- a/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json +++ b/exercises/03.best-practices/01.solution.queries/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/02.problem.user-events/src/vite-env.d.ts b/exercises/03.best-practices/02.problem.user-events/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/03.best-practices/02.problem.user-events/src/vite-env.d.ts +++ b/exercises/03.best-practices/02.problem.user-events/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json b/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json index 67e3862..326e69f 100644 --- a/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json +++ b/exercises/03.best-practices/02.problem.user-events/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/02.solution.user-events/src/vite-env.d.ts b/exercises/03.best-practices/02.solution.user-events/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/03.best-practices/02.solution.user-events/src/vite-env.d.ts +++ b/exercises/03.best-practices/02.solution.user-events/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json b/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json index 67e3862..326e69f 100644 --- a/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json +++ b/exercises/03.best-practices/02.solution.user-events/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/03.problem.network-mocking/README.mdx b/exercises/03.best-practices/03.problem.network-mocking/README.mdx index 85fcaad..f64144c 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/README.mdx +++ b/exercises/03.best-practices/03.problem.network-mocking/README.mdx @@ -80,7 +80,7 @@ Since it's a new TypeScript module, you need to tell TypeScript how to handle it ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } ``` diff --git a/exercises/03.best-practices/03.problem.network-mocking/src/vite-env.d.ts b/exercises/03.best-practices/03.problem.network-mocking/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/src/vite-env.d.ts +++ b/exercises/03.best-practices/03.problem.network-mocking/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json b/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json index 67e3862..326e69f 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json +++ b/exercises/03.best-practices/03.problem.network-mocking/tsconfig.test.browser.json @@ -7,6 +7,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/03.solution.network-mocking/src/vite-env.d.ts b/exercises/03.best-practices/03.solution.network-mocking/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/src/vite-env.d.ts +++ b/exercises/03.best-practices/03.solution.network-mocking/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json b/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json index 5640acb..74c3de8 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json +++ b/exercises/03.best-practices/03.solution.network-mocking/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/04.problem.element-presence/src/vite-env.d.ts b/exercises/03.best-practices/04.problem.element-presence/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/03.best-practices/04.problem.element-presence/src/vite-env.d.ts +++ b/exercises/03.best-practices/04.problem.element-presence/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json b/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json index 5640acb..74c3de8 100644 --- a/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json +++ b/exercises/03.best-practices/04.problem.element-presence/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/04.solution.element-presence/src/vite-env.d.ts b/exercises/03.best-practices/04.solution.element-presence/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/03.best-practices/04.solution.element-presence/src/vite-env.d.ts +++ b/exercises/03.best-practices/04.solution.element-presence/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json b/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json index 5640acb..74c3de8 100644 --- a/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json +++ b/exercises/03.best-practices/04.solution.element-presence/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/05.problem.page-navigation/src/vite-env.d.ts b/exercises/03.best-practices/05.problem.page-navigation/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/src/vite-env.d.ts +++ b/exercises/03.best-practices/05.problem.page-navigation/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json b/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json index 5640acb..74c3de8 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json +++ b/exercises/03.best-practices/05.problem.page-navigation/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/03.best-practices/05.solution.page-navigation/src/vite-env.d.ts b/exercises/03.best-practices/05.solution.page-navigation/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/src/vite-env.d.ts +++ b/exercises/03.best-practices/05.solution.page-navigation/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json b/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json index 191a9ef..7043593 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json +++ b/exercises/03.best-practices/05.solution.page-navigation/tsconfig.test.browser.json @@ -8,6 +8,6 @@ "compilerOptions": { "target": "esnext", "module": "preserve", - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/01.problem.dom-snapshots/src/vite-env.d.ts b/exercises/04.debugging/01.problem.dom-snapshots/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/04.debugging/01.problem.dom-snapshots/src/vite-env.d.ts +++ b/exercises/04.debugging/01.problem.dom-snapshots/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json b/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json index 5640acb..74c3de8 100644 --- a/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json +++ b/exercises/04.debugging/01.problem.dom-snapshots/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/01.solution.dom-snapshots/src/vite-env.d.ts b/exercises/04.debugging/01.solution.dom-snapshots/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/04.debugging/01.solution.dom-snapshots/src/vite-env.d.ts +++ b/exercises/04.debugging/01.solution.dom-snapshots/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json b/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json index 5640acb..74c3de8 100644 --- a/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json +++ b/exercises/04.debugging/01.solution.dom-snapshots/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/02.problem.debugger/src/vite-env.d.ts b/exercises/04.debugging/02.problem.debugger/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/04.debugging/02.problem.debugger/src/vite-env.d.ts +++ b/exercises/04.debugging/02.problem.debugger/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json b/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json index 5640acb..74c3de8 100644 --- a/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json +++ b/exercises/04.debugging/02.problem.debugger/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/02.solution.debugger/src/vite-env.d.ts b/exercises/04.debugging/02.solution.debugger/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/04.debugging/02.solution.debugger/src/vite-env.d.ts +++ b/exercises/04.debugging/02.solution.debugger/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json b/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json index 5640acb..74c3de8 100644 --- a/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json +++ b/exercises/04.debugging/02.solution.debugger/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/03.problem.breakpoints/src/vite-env.d.ts b/exercises/04.debugging/03.problem.breakpoints/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/04.debugging/03.problem.breakpoints/src/vite-env.d.ts +++ b/exercises/04.debugging/03.problem.breakpoints/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json b/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json index 5640acb..74c3de8 100644 --- a/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json +++ b/exercises/04.debugging/03.problem.breakpoints/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } diff --git a/exercises/04.debugging/03.solution.breakpoints/src/vite-env.d.ts b/exercises/04.debugging/03.solution.breakpoints/src/vite-env.d.ts index 11f02fe..35ed48d 100644 --- a/exercises/04.debugging/03.solution.breakpoints/src/vite-env.d.ts +++ b/exercises/04.debugging/03.solution.breakpoints/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json b/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json index 5640acb..74c3de8 100644 --- a/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json +++ b/exercises/04.debugging/03.solution.breakpoints/tsconfig.test.browser.json @@ -8,6 +8,6 @@ ], "exclude": [], "compilerOptions": { - "types": ["vitest/globals", "@vitest/browser/context", "@vitest/browser/matchers"] + "types": ["vitest/globals", "@vitest/browser/context"] } } From 0c72ce69d1580df3fc412d41d5c65a6e86822a92 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 20 Jan 2026 22:10:29 +0000 Subject: [PATCH 10/11] Add root vitest and drop matcher refs Co-authored-by: me --- .../01.problem.break-jsdom/src/vite-env.d.ts | 1 - .../01.solution.break-jsdom/src/vite-env.d.ts | 1 - .../README.mdx | 2 +- .../src/vite-env.d.ts | 1 - .../src/vite-env.d.ts | 1 - .../src/vite-env.d.ts | 1 - .../src/vite-env.d.ts | 1 - .../03.problem.playwright/src/vite-env.d.ts | 1 - .../03.solution.playwright/src/vite-env.d.ts | 1 - .../src/vite-env.d.ts | 1 - .../src/vite-env.d.ts | 1 - .../src/vite-env.d.ts | 1 - .../src/vite-env.d.ts | 1 - .../01.problem.queries/src/vite-env.d.ts | 1 - .../01.solution.queries/src/vite-env.d.ts | 1 - .../02.problem.user-events/src/vite-env.d.ts | 1 - .../02.solution.user-events/src/vite-env.d.ts | 1 - .../src/vite-env.d.ts | 1 - .../src/vite-env.d.ts | 1 - .../src/vite-env.d.ts | 1 - .../src/vite-env.d.ts | 1 - .../src/vite-env.d.ts | 1 - .../src/vite-env.d.ts | 1 - .../src/vite-env.d.ts | 1 - .../src/vite-env.d.ts | 1 - .../02.problem.debugger/src/vite-env.d.ts | 1 - .../02.solution.debugger/src/vite-env.d.ts | 1 - .../03.problem.breakpoints/src/vite-env.d.ts | 1 - .../03.solution.breakpoints/src/vite-env.d.ts | 1 - package-lock.json | 6525 ++--------------- package.json | 3 +- 31 files changed, 639 insertions(+), 5919 deletions(-) diff --git a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/vite-env.d.ts b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/vite-env.d.ts +++ b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/vite-env.d.ts b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/vite-env.d.ts +++ b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx index 8e7bf50..0e5acdd 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/README.mdx @@ -76,7 +76,7 @@ export default defineConfig({ ## Configure TypeScript -The last thing that remains is to make sure TypeScript sees the Vitest globals and browser context types. The matcher types are referenced from `vite-env.d.ts`. +The last thing that remains is to make sure TypeScript sees the Vitest globals and browser context types. First, I will remove the `import '@testing-library/jest-dom/vitest'` import we previously had in the test: diff --git a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/01.problem.installation-and-setup/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/01.solution.installation-and-setup/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/02.problem.migrate-the-test/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/02.solution.migrate-the-test/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/02.vitest-browser-mode/03.problem.playwright/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/03.problem.playwright/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/02.vitest-browser-mode/03.problem.playwright/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/03.problem.playwright/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/02.vitest-browser-mode/03.solution.playwright/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/03.solution.playwright/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/02.vitest-browser-mode/03.solution.playwright/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/03.solution.playwright/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/04.problem.shared-assets/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/04.solution.shared-assets/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/vite-env.d.ts b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/vite-env.d.ts +++ b/exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/03.best-practices/01.problem.queries/src/vite-env.d.ts b/exercises/03.best-practices/01.problem.queries/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/03.best-practices/01.problem.queries/src/vite-env.d.ts +++ b/exercises/03.best-practices/01.problem.queries/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/03.best-practices/01.solution.queries/src/vite-env.d.ts b/exercises/03.best-practices/01.solution.queries/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/03.best-practices/01.solution.queries/src/vite-env.d.ts +++ b/exercises/03.best-practices/01.solution.queries/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/03.best-practices/02.problem.user-events/src/vite-env.d.ts b/exercises/03.best-practices/02.problem.user-events/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/03.best-practices/02.problem.user-events/src/vite-env.d.ts +++ b/exercises/03.best-practices/02.problem.user-events/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/03.best-practices/02.solution.user-events/src/vite-env.d.ts b/exercises/03.best-practices/02.solution.user-events/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/03.best-practices/02.solution.user-events/src/vite-env.d.ts +++ b/exercises/03.best-practices/02.solution.user-events/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/03.best-practices/03.problem.network-mocking/src/vite-env.d.ts b/exercises/03.best-practices/03.problem.network-mocking/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/03.best-practices/03.problem.network-mocking/src/vite-env.d.ts +++ b/exercises/03.best-practices/03.problem.network-mocking/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/03.best-practices/03.solution.network-mocking/src/vite-env.d.ts b/exercises/03.best-practices/03.solution.network-mocking/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/03.best-practices/03.solution.network-mocking/src/vite-env.d.ts +++ b/exercises/03.best-practices/03.solution.network-mocking/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/03.best-practices/04.problem.element-presence/src/vite-env.d.ts b/exercises/03.best-practices/04.problem.element-presence/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/03.best-practices/04.problem.element-presence/src/vite-env.d.ts +++ b/exercises/03.best-practices/04.problem.element-presence/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/03.best-practices/04.solution.element-presence/src/vite-env.d.ts b/exercises/03.best-practices/04.solution.element-presence/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/03.best-practices/04.solution.element-presence/src/vite-env.d.ts +++ b/exercises/03.best-practices/04.solution.element-presence/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/03.best-practices/05.problem.page-navigation/src/vite-env.d.ts b/exercises/03.best-practices/05.problem.page-navigation/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/03.best-practices/05.problem.page-navigation/src/vite-env.d.ts +++ b/exercises/03.best-practices/05.problem.page-navigation/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/03.best-practices/05.solution.page-navigation/src/vite-env.d.ts b/exercises/03.best-practices/05.solution.page-navigation/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/03.best-practices/05.solution.page-navigation/src/vite-env.d.ts +++ b/exercises/03.best-practices/05.solution.page-navigation/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/04.debugging/01.problem.dom-snapshots/src/vite-env.d.ts b/exercises/04.debugging/01.problem.dom-snapshots/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/04.debugging/01.problem.dom-snapshots/src/vite-env.d.ts +++ b/exercises/04.debugging/01.problem.dom-snapshots/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/04.debugging/01.solution.dom-snapshots/src/vite-env.d.ts b/exercises/04.debugging/01.solution.dom-snapshots/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/04.debugging/01.solution.dom-snapshots/src/vite-env.d.ts +++ b/exercises/04.debugging/01.solution.dom-snapshots/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/04.debugging/02.problem.debugger/src/vite-env.d.ts b/exercises/04.debugging/02.problem.debugger/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/04.debugging/02.problem.debugger/src/vite-env.d.ts +++ b/exercises/04.debugging/02.problem.debugger/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/04.debugging/02.solution.debugger/src/vite-env.d.ts b/exercises/04.debugging/02.solution.debugger/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/04.debugging/02.solution.debugger/src/vite-env.d.ts +++ b/exercises/04.debugging/02.solution.debugger/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/04.debugging/03.problem.breakpoints/src/vite-env.d.ts b/exercises/04.debugging/03.problem.breakpoints/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/04.debugging/03.problem.breakpoints/src/vite-env.d.ts +++ b/exercises/04.debugging/03.problem.breakpoints/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/exercises/04.debugging/03.solution.breakpoints/src/vite-env.d.ts b/exercises/04.debugging/03.solution.breakpoints/src/vite-env.d.ts index 35ed48d..11f02fe 100644 --- a/exercises/04.debugging/03.solution.breakpoints/src/vite-env.d.ts +++ b/exercises/04.debugging/03.solution.breakpoints/src/vite-env.d.ts @@ -1,2 +1 @@ /// -/// diff --git a/package-lock.json b/package-lock.json index 009fc78..2965c96 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,8 @@ "eslint": "^9.9.0", "pkgmgr": "^1.1.1", "prettier": "^3.3.3", - "typescript": "^5.7.3" + "typescript": "^5.7.3", + "vitest": "^4.0.17" }, "engines": { "git": ">=2.18.0", @@ -46,5409 +47,125 @@ "vitest": "^4.0.17" } }, - "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", + "exercises/01.sunsetting-jsdom/01.solution.break-jsdom": { + "name": "exercises_01.sunsetting-jsdom_01.solution.break-jsdom", "dependencies": { - "tinyrainbow": "^3.0.3" + "@vitest/browser": "^4.0.17", + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.1.0", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser-playwright": "^4.0.17", + "jsdom": "^26.0.0", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", + "exercises/02.vitest-browser-mode/01.problem.installation-and-setup": { + "name": "exercises_02.vitest-browser-mode_01.problem.installation-and-setup", "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.1.0", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "jsdom": "^26.0.0", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", + "exercises/02.vitest-browser-mode/01.solution.installation-and-setup": { + "name": "exercises_02.vitest-browser-mode_01.solution.installation-and-setup", "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17", + "vitest-browser-react": "^0.2.0" } }, - "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", + "exercises/02.vitest-browser-mode/02.problem.migrate-the-test": { + "name": "exercises_02.vitest-browser-mode_02.problem.migrate-the-test", "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17", + "vitest-browser-react": "^0.2.0" } }, - "exercises/01.sunsetting-jsdom/01.problem.break-jsdom/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", + "exercises/02.vitest-browser-mode/02.solution.migrate-the-test": { + "name": "exercises_02.vitest-browser-mode_02.solution.migrate-the-test", "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/01.sunsetting-jsdom/01.solution.break-jsdom": { - "name": "exercises_01.sunsetting-jsdom_01.solution.break-jsdom", + "exercises/02.vitest-browser-mode/03.problem.playwright": { + "name": "exercises_02.vitest-browser-mode_03.problem.playwright", "dependencies": { - "@vitest/browser": "^4.0.17", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { "@tailwindcss/vite": "^4.0.11", - "@testing-library/dom": "^10.4.0", - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.1.0", "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", "@vitest/browser-playwright": "^4.0.17", - "jsdom": "^26.0.0", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/01.sunsetting-jsdom/01.solution.break-jsdom/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/02.vitest-browser-mode/01.problem.installation-and-setup": { - "name": "exercises_02.vitest-browser-mode_01.problem.installation-and-setup", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@testing-library/dom": "^10.4.0", - "@testing-library/react": "^16.1.0", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "jsdom": "^26.0.0", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/01.problem.installation-and-setup/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/02.vitest-browser-mode/01.solution.installation-and-setup": { - "name": "exercises_02.vitest-browser-mode_01.solution.installation-and-setup", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17", - "vitest-browser-react": "^0.2.0" - } - }, - "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/01.solution.installation-and-setup/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test": { - "name": "exercises_02.vitest-browser-mode_02.problem.migrate-the-test", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17", - "vitest-browser-react": "^0.2.0" - } - }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/02.problem.migrate-the-test/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/02.vitest-browser-mode/02.solution.migrate-the-test": { - "name": "exercises_02.vitest-browser-mode_02.solution.migrate-the-test", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/02.solution.migrate-the-test/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/02.vitest-browser-mode/03.problem.playwright": { - "name": "exercises_02.vitest-browser-mode_03.problem.playwright", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/03.problem.playwright/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/02.vitest-browser-mode/03.solution.playwright": { - "name": "exercises_02.vitest-browser-mode_03.solution.playwright", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/03.solution.playwright/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/02.vitest-browser-mode/04.problem.shared-assets": { - "name": "exercises_02.vitest-browser-mode_04.problem.shared-assets", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/04.problem.shared-assets/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/02.vitest-browser-mode/04.solution.shared-assets": { - "name": "exercises_02.vitest-browser-mode_04.solution.shared-assets", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/04.solution.shared-assets/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces": { - "name": "exercises_02.vitest-browser-mode_05.problem.multiple-workspaces", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces": { - "name": "exercises_02.vitest-browser-mode_05.solution.multiple-workspaces", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/node": "^22.10.6", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/03.best-practices/01.problem.accessibility-selectors": { - "name": "exercises_03.best-practices_01.problem.accessibility-selectors", - "extraneous": true, - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.0.7", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.0.7" - } - }, - "exercises/03.best-practices/01.problem.queries": { - "name": "exercises_03.best-practices_01.problem.queries", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/01.problem.queries/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/01.problem.queries/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/01.problem.queries/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/03.best-practices/01.problem.queries/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/01.problem.queries/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/03.best-practices/01.solution.accessibility-selectors": { - "name": "exercises_03.best-practices_01.solution.accessibility-selectors", - "extraneous": true, - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.0.7", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^3.0.7" - } - }, - "exercises/03.best-practices/01.solution.queries": { - "name": "exercises_03.best-practices_01.solution.queries", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/01.solution.queries/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/01.solution.queries/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/01.solution.queries/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/03.best-practices/01.solution.queries/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/01.solution.queries/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/03.best-practices/02.problem.user-events": { - "name": "exercises_03.best-practices_02.problem.user-events", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/02.problem.user-events/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/02.problem.user-events/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/02.problem.user-events/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/03.best-practices/02.problem.user-events/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/02.problem.user-events/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/03.best-practices/02.solution.user-events": { - "name": "exercises_03.best-practices_02.solution.user-events", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/02.solution.user-events/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/02.solution.user-events/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/02.solution.user-events/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/03.best-practices/02.solution.user-events/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/02.solution.user-events/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/03.best-practices/03.problem.network-mocking": { - "name": "exercises_03.best-practices_03.problem.network-mocking", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/03.problem.network-mocking/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/03.problem.network-mocking/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/03.problem.network-mocking/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/03.best-practices/03.problem.network-mocking/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/03.problem.network-mocking/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/03.best-practices/03.solution.network-mocking": { - "name": "exercises_03.best-practices_03.solution.network-mocking", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "msw": "^2.7.3", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/03.solution.network-mocking/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/03.solution.network-mocking/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/03.solution.network-mocking/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/03.best-practices/03.solution.network-mocking/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/03.solution.network-mocking/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/03.best-practices/04.problem.element-presence": { - "name": "exercises_03.best-practices_04.problem.element-presence", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "msw": "^2.7.3", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/04.problem.element-presence/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/04.problem.element-presence/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/04.problem.element-presence/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/03.best-practices/04.problem.element-presence/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/04.problem.element-presence/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/03.best-practices/04.solution.element-presence": { - "name": "exercises_03.best-practices_04.solution.element-presence", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "msw": "^2.7.3", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/04.solution.element-presence/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/04.solution.element-presence/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/04.solution.element-presence/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/03.best-practices/04.solution.element-presence/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/04.solution.element-presence/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/03.best-practices/05.problem.page-navigation": { - "name": "exercises_03.best-practices_05.problem.page-navigation", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-router": "^7.2.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "msw": "^2.7.3", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/05.problem.page-navigation/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/05.problem.page-navigation/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/05.problem.page-navigation/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/03.best-practices/05.problem.page-navigation/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/05.problem.page-navigation/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/03.best-practices/05.solution.page-navigation": { - "name": "exercises_03.best-practices_05.solution.page-navigation", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-router": "^7.2.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "msw": "^2.7.3", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/05.solution.page-navigation/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/03.best-practices/05.solution.page-navigation/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/05.solution.page-navigation/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/03.best-practices/05.solution.page-navigation/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/03.best-practices/05.solution.page-navigation/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/03.best-practices/06.solution.react-hooks": { - "name": "exercises_03.best-practices_06.solution.react-hooks", - "extraneous": true, - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.7", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^3.0.5", - "msw": "^2.7.0", - "playwright": "^1.49.1", - "react-router": "^7.1.3", - "tailwindcss": "^4.0.7", - "vite": "^6.0.7", - "vitest": "^3.0.5" - } - }, - "exercises/04.debugging/01.problem.dom-snapshots": { - "name": "exercises_04.debugging_01.problem.dom-snapshots", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/01.problem.dom-snapshots/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/01.problem.dom-snapshots/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/04.debugging/01.problem.dom-snapshots/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/04.debugging/01.problem.dom-snapshots/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/04.debugging/01.problem.dom-snapshots/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/04.debugging/01.solution.dom-snapshots": { - "name": "exercises_04.debugging_01.solution.dom-snapshots", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/01.solution.dom-snapshots/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/01.solution.dom-snapshots/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/04.debugging/01.solution.dom-snapshots/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/04.debugging/01.solution.dom-snapshots/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/04.debugging/01.solution.dom-snapshots/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/04.debugging/02.problem.debugger": { - "name": "exercises_04.debugging_02.problem.debugger", - "dependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.11", - "@types/react": "^19.0.6", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", - "playwright": "^1.49.1", - "tailwindcss": "^4.0.11", - "vite": "^6.2.0", - "vitest": "^4.0.17" - } - }, - "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/02.problem.debugger/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/02.problem.debugger/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/04.debugging/02.problem.debugger/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/04.debugging/02.problem.debugger/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/04.debugging/02.problem.debugger/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "exercises/04.debugging/02.solution.debugger": { - "name": "exercises_04.debugging_02.solution.debugger", + "exercises/02.vitest-browser-mode/03.solution.playwright": { + "name": "exercises_02.vitest-browser-mode_03.solution.playwright", "dependencies": { "react": "^19.0.0", "react-dom": "^19.0.0" @@ -5466,203 +183,124 @@ "vitest": "^4.0.17" } }, - "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", + "exercises/02.vitest-browser-mode/04.problem.shared-assets": { + "name": "exercises_02.vitest-browser-mode_04.problem.shared-assets", "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", + "exercises/02.vitest-browser-mode/04.solution.shared-assets": { + "name": "exercises_02.vitest-browser-mode_04.solution.shared-assets", "dependencies": { - "tinyrainbow": "^3.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", + "exercises/02.vitest-browser-mode/05.problem.multiple-workspaces": { + "name": "exercises_02.vitest-browser-mode_05.problem.multiple-workspaces", "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", + "exercises/02.vitest-browser-mode/05.solution.multiple-workspaces": { + "name": "exercises_02.vitest-browser-mode_05.solution.multiple-workspaces", "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/node": "^22.10.6", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/02.solution.debugger/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", + "exercises/03.best-practices/01.problem.accessibility-selectors": { + "name": "exercises_03.best-practices_01.problem.accessibility-selectors", + "extraneous": true, "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/02.solution.debugger/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/04.debugging/02.solution.debugger/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/04.debugging/02.solution.debugger/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^3.0.7", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^3.0.7" } }, - "exercises/04.debugging/02.solution.debugger/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", + "exercises/03.best-practices/01.problem.queries": { + "name": "exercises_03.best-practices_01.problem.queries", "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/03.problem.breakpoints": { - "name": "exercises_04.debugging_03.problem.breakpoints", + "exercises/03.best-practices/01.solution.accessibility-selectors": { + "name": "exercises_03.best-practices_01.solution.accessibility-selectors", + "extraneous": true, "dependencies": { "react": "^19.0.0", "react-dom": "^19.0.0" @@ -5672,211 +310,131 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "@vitest/browser": "^4.0.17", - "@vitest/browser-playwright": "^4.0.17", + "@vitest/browser": "^3.0.7", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", - "vitest": "^4.0.17" + "vitest": "^3.0.7" } }, - "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", + "exercises/03.best-practices/01.solution.queries": { + "name": "exercises_03.best-practices_01.solution.queries", "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", + "exercises/03.best-practices/02.problem.user-events": { + "name": "exercises_03.best-practices_02.problem.user-events", "dependencies": { - "tinyrainbow": "^3.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", + "exercises/03.best-practices/02.solution.user-events": { + "name": "exercises_03.best-practices_02.solution.user-events", "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", + "exercises/03.best-practices/03.problem.network-mocking": { + "name": "exercises_03.best-practices_03.problem.network-mocking", "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/03.problem.breakpoints/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", + "exercises/03.best-practices/03.solution.network-mocking": { + "name": "exercises_03.best-practices_03.solution.network-mocking", "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/03.problem.breakpoints/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "exercises/04.debugging/03.problem.breakpoints/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/04.debugging/03.problem.breakpoints/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "msw": "^2.7.3", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/03.problem.breakpoints/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", + "exercises/03.best-practices/04.problem.element-presence": { + "name": "exercises_03.best-practices_04.problem.element-presence", "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "msw": "^2.7.3", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/03.solution.breakpoints": { - "name": "exercises_04.debugging_03.solution.breakpoints", + "exercises/03.best-practices/04.solution.element-presence": { + "name": "exercises_03.best-practices_04.solution.element-presence", "dependencies": { "react": "^19.0.0", "react-dom": "^19.0.0" @@ -5888,205 +446,188 @@ "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^4.0.17", "@vitest/browser-playwright": "^4.0.17", + "msw": "^2.7.3", "playwright": "^1.49.1", "tailwindcss": "^4.0.11", "vite": "^6.2.0", "vitest": "^4.0.17" } }, - "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, - "license": "MIT", + "exercises/03.best-practices/05.problem.page-navigation": { + "name": "exercises_03.best-practices_05.problem.page-navigation", "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router": "^7.2.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "msw": "^2.7.3", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, - "license": "MIT", + "exercises/03.best-practices/05.solution.page-navigation": { + "name": "exercises_03.best-practices_05.solution.page-navigation", "dependencies": { - "tinyrainbow": "^3.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router": "^7.2.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "msw": "^2.7.3", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, - "license": "MIT", + "exercises/03.best-practices/06.solution.react-hooks": { + "name": "exercises_03.best-practices_06.solution.react-hooks", + "extraneous": true, "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "devDependencies": { + "@tailwindcss/vite": "^4.0.7", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^3.0.5", + "msw": "^2.7.0", + "playwright": "^1.49.1", + "react-router": "^7.1.3", + "tailwindcss": "^4.0.7", + "vite": "^6.0.7", + "vitest": "^3.0.5" } }, - "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, - "license": "MIT", + "exercises/04.debugging/01.problem.dom-snapshots": { + "name": "exercises_04.debugging_01.problem.dom-snapshots", "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/03.solution.breakpoints/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, - "license": "MIT", + "exercises/04.debugging/01.solution.dom-snapshots": { + "name": "exercises_04.debugging_01.solution.dom-snapshots", "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "exercises/04.debugging/03.solution.breakpoints/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/03.solution.breakpoints/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "exercises/04.debugging/02.problem.debugger": { + "name": "exercises_04.debugging_02.problem.debugger", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "exercises/04.debugging/03.solution.breakpoints/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, - "exercises/04.debugging/03.solution.breakpoints/node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, - "license": "MIT", + "exercises/04.debugging/02.solution.debugger": { + "name": "exercises_04.debugging_02.solution.debugger", "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", - "happy-dom": "*", - "jsdom": "*" + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/04.debugging/03.problem.breakpoints": { + "name": "exercises_04.debugging_03.problem.breakpoints", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" + } + }, + "exercises/04.debugging/03.solution.breakpoints": { + "name": "exercises_04.debugging_03.solution.breakpoints", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.11", + "@types/react": "^19.0.6", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", + "@vitest/browser-playwright": "^4.0.17", + "playwright": "^1.49.1", + "tailwindcss": "^4.0.11", + "vite": "^6.2.0", + "vitest": "^4.0.17" } }, "exercises/04.debugging/04.problem.debug-console": { @@ -8205,13 +2746,14 @@ } }, "node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { - "@types/deep-eql": "*" + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, "node_modules/@types/cookie": { @@ -8909,6 +3451,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", @@ -13855,6 +8407,84 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, "node_modules/vitest-browser-react": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/vitest-browser-react/-/vitest-browser-react-0.2.0.tgz", @@ -13884,6 +8514,123 @@ } } }, + "node_modules/vitest/node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", diff --git a/package.json b/package.json index b8bef32..2d86e4b 100644 --- a/package.json +++ b/package.json @@ -42,9 +42,10 @@ "devDependencies": { "@epic-web/config": "^1.18.3", "eslint": "^9.9.0", + "pkgmgr": "^1.1.1", "prettier": "^3.3.3", "typescript": "^5.7.3", - "pkgmgr": "^1.1.1" + "vitest": "^4.0.17" }, "prettier": "@epic-web/config/prettier" } From ea9e83669d0b3d48bb72f07c1dfc5367f3467db5 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 20 Jan 2026 23:18:19 +0000 Subject: [PATCH 11/11] fix: move @vitest/browser to devDependencies in exercise 01 --- .../01.sunsetting-jsdom/01.problem.break-jsdom/package.json | 2 +- .../01.sunsetting-jsdom/01.solution.break-jsdom/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/package.json b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/package.json index 7970af0..afded6c 100644 --- a/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/package.json +++ b/exercises/01.sunsetting-jsdom/01.problem.break-jsdom/package.json @@ -7,7 +7,6 @@ "build": "vite build" }, "dependencies": { - "@vitest/browser": "^4.0.17", "react": "^19.0.0", "react-dom": "^19.0.0" }, @@ -20,6 +19,7 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", "@vitest/browser-playwright": "^4.0.17", "jsdom": "^26.0.0", "tailwindcss": "^4.0.11", diff --git a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/package.json b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/package.json index 13ba30d..9089d4e 100644 --- a/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/package.json +++ b/exercises/01.sunsetting-jsdom/01.solution.break-jsdom/package.json @@ -7,7 +7,6 @@ "build": "vite build" }, "dependencies": { - "@vitest/browser": "^4.0.17", "react": "^19.0.0", "react-dom": "^19.0.0" }, @@ -19,6 +18,7 @@ "@types/react": "^19.0.6", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^4.0.17", "@vitest/browser-playwright": "^4.0.17", "jsdom": "^26.0.0", "tailwindcss": "^4.0.11",