diff --git a/integration-test/experimental-react/package.json b/integration-test/experimental-react/package.json index fdaa3247..5c88a032 100644 --- a/integration-test/experimental-react/package.json +++ b/integration-test/experimental-react/package.json @@ -4,9 +4,8 @@ "version": "0.0.0", "type": "module", "scripts": { - "prepare": "rm -rf node_modules/@apollo/client-react-streaming; mkdir node_modules/@apollo/client-react-streaming && cp -r ../../packages/client-react-streaming/{package.json,dist} node_modules/@apollo/client-react-streaming", - "dev": "yarn prepare; node server", - "build": "yarn prepare; npm run build:client && npm run build:server", + "dev": "node server", + "build": "npm run build:client && npm run build:server", "build:client": "vite build --ssrManifest --outDir dist/client", "build:server": "vite build --ssr src/entry-server.jsx --outDir dist/server", "preview": "cross-env NODE_ENV=production node server", @@ -15,7 +14,7 @@ }, "dependencies": { "@apollo/client": "^3.9.1", - "@apollo/client-react-streaming": "workspace:*", + "@apollo/client-react-streaming": "*", "compression": "^1.7.4", "express": "^4.18.2", "graphql": "^16.8.1", diff --git a/integration-test/jest/package.json b/integration-test/jest/package.json index c390a0cc..8462a01e 100644 --- a/integration-test/jest/package.json +++ b/integration-test/jest/package.json @@ -1,15 +1,16 @@ { "name": "@integration-test/jest", "scripts": { - "prepare": "rm -rf node_modules/@apollo/client-react-streaming node_modules/@apollo/experimental-nextjs-app-support; mkdir -p node_modules/@apollo/client-react-streaming node_modules/@apollo/experimental-nextjs-app-support && cp -r ../../packages/client-react-streaming/{package.json,dist} node_modules/@apollo/client-react-streaming && cp -r ../../packages/experimental-nextjs-app-support/{package.json,dist} node_modules/@apollo/experimental-nextjs-app-support", - "test": "yarn prepare; jest" + "test": "jest" }, "dependencies": { "@apollo/client": "^3.9.5", "@apollo/client-react-streaming": "workspace:*", "@apollo/experimental-nextjs-app-support": "workspace:*", "@graphql-tools/schema": "^10.0.3", - "graphql-tag": "^2.12.6" + "graphql-tag": "^2.12.6", + "react": "18.2.0", + "react-dom": "18.2.0" }, "devDependencies": { "@babel/core": "^7.24.0", diff --git a/integration-test/vite-streaming/package.json b/integration-test/vite-streaming/package.json index a9cd8bd1..fd55cc5d 100644 --- a/integration-test/vite-streaming/package.json +++ b/integration-test/vite-streaming/package.json @@ -4,9 +4,8 @@ "version": "0.0.0", "type": "module", "scripts": { - "prepare": "rm -rf node_modules/@apollo/client-react-streaming; mkdir node_modules/@apollo/client-react-streaming && cp -r ../../packages/client-react-streaming/{package.json,dist} node_modules/@apollo/client-react-streaming", - "dev": "yarn prepare; node server", - "build": "yarn prepare; npm run build:client && npm run build:server", + "dev": "node server", + "build": "npm run build:client && npm run build:server", "build:client": "vite build --ssrManifest --outDir dist/client", "build:server": "vite build --ssr src/entry-server.jsx --outDir dist/server", "preview": "cross-env NODE_ENV=production node server", @@ -15,7 +14,7 @@ }, "dependencies": { "@apollo/client": "^3.9.1", - "@apollo/client-react-streaming": "workspace:*", + "@apollo/client-react-streaming": "*", "compression": "^1.7.4", "express": "^4.18.2", "graphql": "^16.8.1", diff --git a/integration-test/vitest/package.json b/integration-test/vitest/package.json new file mode 100644 index 00000000..d647e3de --- /dev/null +++ b/integration-test/vitest/package.json @@ -0,0 +1,20 @@ +{ + "name": "@integration-test/vitest", + "scripts": { + "test": "vitest" + }, + "dependencies": { + "@apollo/client": "^3.9.1", + "@apollo/experimental-nextjs-app-support": "*", + "@graphql-tools/schema": "^10.0.3", + "graphql-tag": "^2.12.6", + "react": "18.2.0", + "react-dom": "18.2.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^6.4.2", + "@testing-library/react": "^14.2.1", + "@vitejs/plugin-react": "^4.2.1", + "vitest": "^1.3.1" + } +} diff --git a/integration-test/vitest/setup.js b/integration-test/vitest/setup.js new file mode 100644 index 00000000..971941d9 --- /dev/null +++ b/integration-test/vitest/setup.js @@ -0,0 +1,9 @@ +import { expect, afterEach } from "vitest"; +import { cleanup } from "@testing-library/react"; +import * as matchers from "@testing-library/jest-dom/matchers"; + +expect.extend(matchers); + +afterEach(() => { + cleanup(); +}); diff --git a/integration-test/vitest/src/App.jsx b/integration-test/vitest/src/App.jsx new file mode 100644 index 00000000..12ccf395 --- /dev/null +++ b/integration-test/vitest/src/App.jsx @@ -0,0 +1,81 @@ +import { Suspense, useState } from "react"; +import { + ApolloNextAppProvider, + NextSSRApolloClient, + NextSSRInMemoryCache, + useSuspenseQuery, +} from "@apollo/experimental-nextjs-app-support/ssr"; +import { SchemaLink } from "@apollo/client/link/schema/index.js"; +import { gql, ApolloLink, Observable } from "@apollo/client/index.js"; +import { schema } from "./schema"; + +const delayLink = new ApolloLink((operation, forward) => { + return new Observable((observer) => { + const handle = setTimeout(() => { + forward(operation).subscribe(observer); + }, 20); + + return () => { + clearTimeout(handle); + }; + }); +}); + +export const makeClient = () => { + return new NextSSRApolloClient({ + cache: new NextSSRInMemoryCache(), + link: delayLink.concat(new SchemaLink({ schema })), + }); +}; + +function App() { + return ( + <> +

Vite + React (patched) Streaming SSR + Apollo Client + Suspense

+
+ + Loading...
}> + + + + + + + ); +} + +export const QUERY = gql` + query { + products { + id + title + } + } +`; + +function Countries() { + const { data } = useSuspenseQuery(QUERY); + + return ( + + ); +} + +/** + * Counter components to test that the client has hydrated and is interactive. + */ +function Counter() { + const [counter, setCounter] = useState(0); + return ( + <> +
{counter}
+ + + ); +} + +export default App; diff --git a/integration-test/vitest/src/App.test.jsx b/integration-test/vitest/src/App.test.jsx new file mode 100644 index 00000000..68142a18 --- /dev/null +++ b/integration-test/vitest/src/App.test.jsx @@ -0,0 +1,28 @@ +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; + +import App from "./App"; +import { resetNextSSRApolloSingletons } from "@apollo/experimental-nextjs-app-support/ssr"; + +afterEach(resetNextSSRApolloSingletons); + +test("loads data", async () => { + render(); + + expect(screen.getByText("Loading...")).toBeInTheDocument(); + expect( + await screen.findByText("Soft Warm Apollo Beanie") + ).toBeInTheDocument(); + expect(screen.queryByText("Loading...")).not.toBeInTheDocument(); +}); + +test("is interactive", async () => { + render(); + + const counter = await screen.findByTestId("counter"); + expect(counter.textContent).toBe("0"); + + await userEvent.click(screen.getByText("increment")); + + expect(counter.textContent).toBe("1"); +}); diff --git a/integration-test/vitest/src/hooks.test.jsx b/integration-test/vitest/src/hooks.test.jsx new file mode 100644 index 00000000..d6753a3b --- /dev/null +++ b/integration-test/vitest/src/hooks.test.jsx @@ -0,0 +1,66 @@ +import { render, screen } from "@testing-library/react"; +import "@testing-library/jest-dom"; + +import { makeClient, QUERY } from "./App"; +import { + ApolloNextAppProvider, + NextSSRApolloClient, + useQuery, + resetNextSSRApolloSingletons, +} from "@apollo/experimental-nextjs-app-support/ssr"; +import { Suspense } from "react"; + +const wrapper = ({ children }) => ( + + Loading...}>{children} + +); + +afterEach(resetNextSSRApolloSingletons); + +/** + * We test that jest is using the "browser" build. + * This is important because the "browser" build will not try to transport + * data from the server to the browser. + */ +test("uses the browser build", () => { + expect(NextSSRApolloClient.name).toBe("ApolloClientBrowserImpl"); +}); + +/** + * The SSR build would just skip all `useQuery` calls because their result + * would never be able to be transported to the browser anyways. + * In a SSR build, it would always render loading. + */ +test("`useQuery` renders", async () => { + const Component = () => { + const { data, loading } = useQuery(QUERY); + return loading ? ( +
Loading...
+ ) : ( +
{data.products[0].title}
+ ); + }; + render(, { wrapper }); + + expect(screen.getByText("Loading...")).toBeInTheDocument(); + expect( + await screen.findByText("Soft Warm Apollo Beanie") + ).toBeInTheDocument(); + expect(screen.queryByText("Loading...")).not.toBeInTheDocument(); +}); + +test("will set up the data transport", () => { + render(<>, { wrapper }); + expect(globalThis[Symbol.for("ApolloSSRDataTransport")]).toBeDefined(); + expect(globalThis[Symbol.for("ApolloClientSingleton")]).toBeDefined(); +}); + +test("resetNextSSRApolloSingletons tears down global singletons", () => { + render(<>, { wrapper }); + // wrappers are now set up, see last test + // usually, we do this in `afterEach` + resetNextSSRApolloSingletons(); + expect(globalThis[Symbol.for("ApolloSSRDataTransport")]).not.toBeDefined(); + expect(globalThis[Symbol.for("ApolloClientSingleton")]).not.toBeDefined(); +}); diff --git a/integration-test/vitest/src/schema.js b/integration-test/vitest/src/schema.js new file mode 100644 index 00000000..aef2ed67 --- /dev/null +++ b/integration-test/vitest/src/schema.js @@ -0,0 +1,48 @@ +import { makeExecutableSchema } from "@graphql-tools/schema"; +import gql from "graphql-tag"; + +const typeDefs = gql` + type Product { + id: String! + title: String! + } + type Query { + products: [Product!]! + } +`; + +const resolvers = { + Query: { + products: async () => [ + { + id: "product:5", + title: "Soft Warm Apollo Beanie", + }, + { + id: "product:2", + title: "Stainless Steel Water Bottle", + }, + { + id: "product:3", + title: "Athletic Baseball Cap", + }, + { + id: "product:4", + title: "Baby Onesies", + }, + { + id: "product:1", + title: "The Apollo T-Shirt", + }, + { + id: "product:6", + title: "The Apollo Socks", + }, + ], + }, +}; + +export const schema = makeExecutableSchema({ + typeDefs, + resolvers, +}); diff --git a/integration-test/vitest/vite.config.js b/integration-test/vitest/vite.config.js new file mode 100644 index 00000000..7c98066c --- /dev/null +++ b/integration-test/vitest/vite.config.js @@ -0,0 +1,25 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +export default defineConfig({ + plugins: [react()], + resolve: { + // this line is important so the "browser build" of dependencies is used + // and not the "SSR build", which would contain "streaming-to-the-browser" + // specific code + conditions: ["browser"], + }, + test: { + globals: true, + environment: "jsdom", + setupFiles: "./setup.js", + server: { + // this is important so that the `graphql` dependency is inlined by vitest, + // which seems to get around the "dual package hazard" with ESM/CJS + // at least in this specific setup + deps: { + inline: true, + }, + }, + }, +}); diff --git a/integration-test/yarn.lock b/integration-test/yarn.lock index 08a9bb5d..9e9e41a2 100644 --- a/integration-test/yarn.lock +++ b/integration-test/yarn.lock @@ -1980,7 +1980,7 @@ __metadata: resolution: "@integration-test/experimental-react@workspace:experimental-react" dependencies: "@apollo/client": "npm:^3.9.1" - "@apollo/client-react-streaming": "workspace:*" + "@apollo/client-react-streaming": "npm:*" "@playwright/test": "npm:^1.39.0" "@tsconfig/vite-react": "npm:^3.0.0" "@types/react": "npm:^18.2.55" @@ -2017,6 +2017,8 @@ __metadata: graphql-tag: "npm:^2.12.6" jest: "npm:^29.7.0" jest-environment-jsdom: "npm:^29.7.0" + react: "npm:18.2.0" + react-dom: "npm:18.2.0" languageName: unknown linkType: soft @@ -2060,7 +2062,7 @@ __metadata: resolution: "@integration-test/vite-streaming@workspace:vite-streaming" dependencies: "@apollo/client": "npm:^3.9.1" - "@apollo/client-react-streaming": "workspace:*" + "@apollo/client-react-streaming": "npm:*" "@playwright/test": "npm:^1.39.0" "@tsconfig/vite-react": "npm:^3.0.0" "@types/react": "npm:^18.2.55" @@ -2079,6 +2081,23 @@ __metadata: languageName: unknown linkType: soft +"@integration-test/vitest@workspace:vitest": + version: 0.0.0-use.local + resolution: "@integration-test/vitest@workspace:vitest" + dependencies: + "@apollo/client": "npm:^3.9.1" + "@apollo/experimental-nextjs-app-support": "npm:*" + "@graphql-tools/schema": "npm:^10.0.3" + "@testing-library/jest-dom": "npm:^6.4.2" + "@testing-library/react": "npm:^14.2.1" + "@vitejs/plugin-react": "npm:^4.2.1" + graphql-tag: "npm:^2.12.6" + react: "npm:18.2.0" + react-dom: "npm:18.2.0" + vitest: "npm:^1.3.1" + languageName: unknown + linkType: soft + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -2375,7 +2394,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": version: 1.4.15 resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" checksum: 10/89960ac087781b961ad918978975bcdf2051cd1741880469783c42de64239703eab9db5230d776d8e6a09d73bb5e4cb964e07d93ee6e2e7aea5a7d726e865c09 @@ -2860,7 +2879,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.5": +"@types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" checksum: 10/7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 @@ -3113,6 +3132,60 @@ __metadata: languageName: node linkType: hard +"@vitest/expect@npm:1.3.1": + version: 1.3.1 + resolution: "@vitest/expect@npm:1.3.1" + dependencies: + "@vitest/spy": "npm:1.3.1" + "@vitest/utils": "npm:1.3.1" + chai: "npm:^4.3.10" + checksum: 10/7c2818b2080ec107cffcc1566195132695c8e87cba883e878c2f36ac4d8107bb0a1f8d3823ccc0da5989e245ea114b8afffe790512aebcde8537ac8c1bcf3454 + languageName: node + linkType: hard + +"@vitest/runner@npm:1.3.1": + version: 1.3.1 + resolution: "@vitest/runner@npm:1.3.1" + dependencies: + "@vitest/utils": "npm:1.3.1" + p-limit: "npm:^5.0.0" + pathe: "npm:^1.1.1" + checksum: 10/dcd452216b83406df49e298da5e49dbc45c542f755a726a132461b94a84c386b6cabcdfce17fc2d31fa66fd5ea4e57be3618c7dc627b17791e2a1a065d919616 + languageName: node + linkType: hard + +"@vitest/snapshot@npm:1.3.1": + version: 1.3.1 + resolution: "@vitest/snapshot@npm:1.3.1" + dependencies: + magic-string: "npm:^0.30.5" + pathe: "npm:^1.1.1" + pretty-format: "npm:^29.7.0" + checksum: 10/2212ae82eb8d458ddaa6c28c7e33b6a8c8897e298b88e458bf83e7f9bf767fd716ed507f3cd41ebbe145d59baa72220e9f494552f92cc22b39241dc32b8ad8e1 + languageName: node + linkType: hard + +"@vitest/spy@npm:1.3.1": + version: 1.3.1 + resolution: "@vitest/spy@npm:1.3.1" + dependencies: + tinyspy: "npm:^2.2.0" + checksum: 10/544c8a30fdeb32fb7bf2c2b5816519be943f5ef90668c306b14efdde7676771d0e83cf0e0a5c79fad722be3839432226bcf74173110a032299821e00b67f47e6 + languageName: node + linkType: hard + +"@vitest/utils@npm:1.3.1": + version: 1.3.1 + resolution: "@vitest/utils@npm:1.3.1" + dependencies: + diff-sequences: "npm:^29.6.3" + estree-walker: "npm:^3.0.3" + loupe: "npm:^2.3.7" + pretty-format: "npm:^29.7.0" + checksum: 10/170c62e6c348562f611d8caddc893e8cba75ed89986e09aa2f0fe6812c96664e8d0f6e329f7a96a4c9cdecf147f4853e4054c3db597b111ec993d3cdd546eddc + languageName: node + linkType: hard + "@wry/caches@npm:^1.0.0": version: 1.0.1 resolution: "@wry/caches@npm:1.0.1" @@ -3192,14 +3265,14 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.0.2": +"acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.3.2": version: 8.3.2 resolution: "acorn-walk@npm:8.3.2" checksum: 10/57dbe2fd8cf744f562431775741c5c087196cd7a65ce4ccb3f3981cdfad25cd24ad2bad404997b88464ac01e789a0a61e5e355b2a84876f13deef39fb39686ca languageName: node linkType: hard -"acorn@npm:^8.1.0, acorn@npm:^8.8.1": +"acorn@npm:^8.1.0, acorn@npm:^8.11.3, acorn@npm:^8.8.1": version: 8.11.3 resolution: "acorn@npm:8.11.3" bin: @@ -3345,6 +3418,13 @@ __metadata: languageName: node linkType: hard +"assertion-error@npm:^1.1.0": + version: 1.1.0 + resolution: "assertion-error@npm:1.1.0" + checksum: 10/fd9429d3a3d4fd61782eb3962ae76b6d08aa7383123fca0596020013b3ebd6647891a85b05ce821c47d1471ed1271f00b0545cf6a4326cf2fc91efcc3b0fbecf + languageName: node + linkType: hard + "async-retry@npm:^1.2.1": version: 1.3.3 resolution: "async-retry@npm:1.3.3" @@ -3590,6 +3670,13 @@ __metadata: languageName: node linkType: hard +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 10/002769a0fbfc51c062acd2a59df465a2a947916b02ac50b56c69ec6c018ee99ac3e7f4dd7366334ea847f1ecacf4defaa61bcd2ac283db50156ce1f1d8c8ad42 + languageName: node + linkType: hard + "cacache@npm:^18.0.0": version: 18.0.2 resolution: "cacache@npm:18.0.2" @@ -3651,6 +3738,21 @@ __metadata: languageName: node linkType: hard +"chai@npm:^4.3.10": + version: 4.4.1 + resolution: "chai@npm:4.4.1" + dependencies: + assertion-error: "npm:^1.1.0" + check-error: "npm:^1.0.3" + deep-eql: "npm:^4.1.3" + get-func-name: "npm:^2.0.2" + loupe: "npm:^2.3.6" + pathval: "npm:^1.1.1" + type-detect: "npm:^4.0.8" + checksum: 10/c6d7aba913a67529c68dbec3673f94eb9c586c5474cc5142bd0b587c9c9ec9e5fbaa937e038ecaa6475aea31433752d5fabdd033b9248bde6ae53befcde774ae + languageName: node + linkType: hard + "chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -3689,6 +3791,15 @@ __metadata: languageName: node linkType: hard +"check-error@npm:^1.0.3": + version: 1.0.3 + resolution: "check-error@npm:1.0.3" + dependencies: + get-func-name: "npm:^2.0.2" + checksum: 10/e2131025cf059b21080f4813e55b3c480419256914601750b0fee3bd9b2b8315b531e551ef12560419b8b6d92a3636511322752b1ce905703239e7cc451b6399 + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -4023,6 +4134,15 @@ __metadata: languageName: node linkType: hard +"deep-eql@npm:^4.1.3": + version: 4.1.3 + resolution: "deep-eql@npm:4.1.3" + dependencies: + type-detect: "npm:^4.0.0" + checksum: 10/12ce93ae63de187e77b076d3d51bfc28b11f98910a22c18714cce112791195e86a94f97788180994614b14562a86c9763f67c69f785e4586f806b5df39bf9301 + languageName: node + linkType: hard + "deep-equal@npm:^2.0.5": version: 2.2.3 resolution: "deep-equal@npm:2.2.3" @@ -4414,6 +4534,15 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10/a65728d5727b71de172c5df323385755a16c0fdab8234dc756c3854cfee343261ddfbb72a809a5660fac8c75d960bb3e21aa898c2d7e9b19bb298482ca58a3af + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -4445,6 +4574,23 @@ __metadata: languageName: node linkType: hard +"execa@npm:^8.0.1": + version: 8.0.1 + resolution: "execa@npm:8.0.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^8.0.1" + human-signals: "npm:^5.0.0" + is-stream: "npm:^3.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^5.1.0" + onetime: "npm:^6.0.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^3.0.0" + checksum: 10/d2ab5fe1e2bb92b9788864d0713f1fce9a07c4594e272c0c97bc18c90569897ab262e4ea58d27a694d288227a2e24f16f5e2575b44224ad9983b799dc7f1098d + languageName: node + linkType: hard + "exit@npm:^0.1.2": version: 0.1.2 resolution: "exit@npm:0.1.2" @@ -4696,6 +4842,13 @@ __metadata: languageName: node linkType: hard +"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": + version: 2.0.2 + resolution: "get-func-name@npm:2.0.2" + checksum: 10/3f62f4c23647de9d46e6f76d2b3eafe58933a9b3830c60669e4180d6c601ce1b4aa310ba8366143f55e52b139f992087a9f0647274e8745621fa2af7e0acf13b + languageName: node + linkType: hard + "get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": version: 1.2.4 resolution: "get-intrinsic@npm:1.2.4" @@ -4723,6 +4876,13 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^8.0.1": + version: 8.0.1 + resolution: "get-stream@npm:8.0.1" + checksum: 10/dde5511e2e65a48e9af80fea64aff11b4921b14b6e874c6f8294c50975095af08f41bfb0b680c887f28b566dd6ec2cb2f960f9d36a323359be324ce98b766e9e + languageName: node + linkType: hard + "glob@npm:^10.2.2, glob@npm:^10.3.10": version: 10.3.10 resolution: "glob@npm:10.3.10" @@ -4948,6 +5108,13 @@ __metadata: languageName: node linkType: hard +"human-signals@npm:^5.0.0": + version: 5.0.0 + resolution: "human-signals@npm:5.0.0" + checksum: 10/30f8870d831cdcd2d6ec0486a7d35d49384996742052cee792854273fa9dd9e7d5db06bb7985d4953e337e10714e994e0302e90dc6848069171b05ec836d65b0 + languageName: node + linkType: hard + "iconv-lite@npm:0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" @@ -5192,6 +5359,13 @@ __metadata: languageName: node linkType: hard +"is-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "is-stream@npm:3.0.0" + checksum: 10/172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 + languageName: node + linkType: hard + "is-string@npm:^1.0.5, is-string@npm:^1.0.7": version: 1.0.7 resolution: "is-string@npm:1.0.7" @@ -5800,6 +5974,13 @@ __metadata: languageName: node linkType: hard +"js-tokens@npm:^8.0.2": + version: 8.0.3 + resolution: "js-tokens@npm:8.0.3" + checksum: 10/af5ed8ddbc446a868c026599214f4a482ab52461edb82e547949255f98910a14bd81ddab88a8d570d74bd7dc96c6d4df7f963794ec5aaf13c53918cc46b9caa6 + languageName: node + linkType: hard + "js-yaml@npm:^3.13.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" @@ -5892,6 +6073,13 @@ __metadata: languageName: node linkType: hard +"jsonc-parser@npm:^3.2.0": + version: 3.2.1 + resolution: "jsonc-parser@npm:3.2.1" + checksum: 10/fe2df6f39e21653781d52cae20c5b9e0ab62461918d97f9430b216cea9b6500efc1d8b42c6584cc0a7548b4c996055e9cdc39f09b9782fa6957af2f45306c530 + languageName: node + linkType: hard + "kleur@npm:^3.0.3": version: 3.0.3 resolution: "kleur@npm:3.0.3" @@ -5913,6 +6101,16 @@ __metadata: languageName: node linkType: hard +"local-pkg@npm:^0.5.0": + version: 0.5.0 + resolution: "local-pkg@npm:0.5.0" + dependencies: + mlly: "npm:^1.4.2" + pkg-types: "npm:^1.0.3" + checksum: 10/20f4caba50dc6fb00ffcc1a78bc94b5acb33995e0aadf4d4edcdeab257e891aa08f50afddf02f3240b2c3d02432bc2078f2a916a280ed716b64753a3d250db70 + languageName: node + linkType: hard + "locate-path@npm:^5.0.0": version: 5.0.0 resolution: "locate-path@npm:5.0.0" @@ -5968,6 +6166,15 @@ __metadata: languageName: node linkType: hard +"loupe@npm:^2.3.6, loupe@npm:^2.3.7": + version: 2.3.7 + resolution: "loupe@npm:2.3.7" + dependencies: + get-func-name: "npm:^2.0.1" + checksum: 10/635c8f0914c2ce7ecfe4e239fbaf0ce1d2c00e4246fafcc4ed000bfdb1b8f89d05db1a220054175cca631ebf3894872a26fffba0124477fcb562f78762848fb1 + languageName: node + linkType: hard + "lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": version: 10.2.0 resolution: "lru-cache@npm:10.2.0" @@ -6009,6 +6216,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.5": + version: 0.30.8 + resolution: "magic-string@npm:0.30.8" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.4.15" + checksum: 10/72ab63817af600e92c19dc8489c1aa4a9599da00cfd59b2319709bd48fb0cf533fdf354bf140ac86e598dbd63e6b2cc83647fe8448f864a3eb6061c62c94e784 + languageName: node + linkType: hard + "make-dir@npm:^4.0.0": version: 4.0.0 resolution: "make-dir@npm:4.0.0" @@ -6116,6 +6332,13 @@ __metadata: languageName: node linkType: hard +"mimic-fn@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-fn@npm:4.0.0" + checksum: 10/995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 + languageName: node + linkType: hard + "min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" @@ -6234,6 +6457,18 @@ __metadata: languageName: node linkType: hard +"mlly@npm:^1.2.0, mlly@npm:^1.4.2": + version: 1.6.1 + resolution: "mlly@npm:1.6.1" + dependencies: + acorn: "npm:^8.11.3" + pathe: "npm:^1.1.2" + pkg-types: "npm:^1.0.3" + ufo: "npm:^1.3.2" + checksum: 10/00b4c355236eb3d0294106f208718db486f6e34e28bbb7f6965bd9d6237db338e566f2e13489fbf8bfa9b1337c0f2568d4aeac1840f9963054c91881acc974a9 + languageName: node + linkType: hard + "mrmime@npm:^2.0.0": version: 2.0.0 resolution: "mrmime@npm:2.0.0" @@ -6422,6 +6657,15 @@ __metadata: languageName: node linkType: hard +"npm-run-path@npm:^5.1.0": + version: 5.3.0 + resolution: "npm-run-path@npm:5.3.0" + dependencies: + path-key: "npm:^4.0.0" + checksum: 10/ae8e7a89da9594fb9c308f6555c73f618152340dcaae423e5fb3620026fefbec463618a8b761920382d666fa7a2d8d240b6fe320e8a6cdd54dc3687e2b659d25 + languageName: node + linkType: hard + "nwsapi@npm:^2.2.2": version: 2.2.7 resolution: "nwsapi@npm:2.2.7" @@ -6506,6 +6750,15 @@ __metadata: languageName: node linkType: hard +"onetime@npm:^6.0.0": + version: 6.0.0 + resolution: "onetime@npm:6.0.0" + dependencies: + mimic-fn: "npm:^4.0.0" + checksum: 10/0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 + languageName: node + linkType: hard + "optimism@npm:^0.17.5": version: 0.17.5 resolution: "optimism@npm:0.17.5" @@ -6547,6 +6800,15 @@ __metadata: languageName: node linkType: hard +"p-limit@npm:^5.0.0": + version: 5.0.0 + resolution: "p-limit@npm:5.0.0" + dependencies: + yocto-queue: "npm:^1.0.0" + checksum: 10/87bf5837dee6942f0dbeff318436179931d9a97848d1b07dbd86140a477a5d2e6b90d9701b210b4e21fe7beaea2979dfde366e4f576fa644a59bd4d6a6371da7 + languageName: node + linkType: hard + "p-locate@npm:^4.1.0": version: 4.1.0 resolution: "p-locate@npm:4.1.0" @@ -6621,6 +6883,13 @@ __metadata: languageName: node linkType: hard +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 10/8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 + languageName: node + linkType: hard + "path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" @@ -6645,6 +6914,20 @@ __metadata: languageName: node linkType: hard +"pathe@npm:^1.1.0, pathe@npm:^1.1.1, pathe@npm:^1.1.2": + version: 1.1.2 + resolution: "pathe@npm:1.1.2" + checksum: 10/f201d796351bf7433d147b92c20eb154a4e0ea83512017bf4ec4e492a5d6e738fb45798be4259a61aa81270179fce11026f6ff0d3fa04173041de044defe9d80 + languageName: node + linkType: hard + +"pathval@npm:^1.1.1": + version: 1.1.1 + resolution: "pathval@npm:1.1.1" + checksum: 10/b50a4751068aa3a5428f5a0b480deecedc6f537666a3630a0c2ae2d5e7c0f4bf0ee77b48404441ec1220bef0c91625e6030b3d3cf5a32ab0d9764018d1d9dbb6 + languageName: node + linkType: hard + "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -6675,6 +6958,17 @@ __metadata: languageName: node linkType: hard +"pkg-types@npm:^1.0.3": + version: 1.0.3 + resolution: "pkg-types@npm:1.0.3" + dependencies: + jsonc-parser: "npm:^3.2.0" + mlly: "npm:^1.2.0" + pathe: "npm:^1.1.0" + checksum: 10/e17e1819ce579c9ea390e4c41a9ed9701d8cff14b463f9577cc4f94688da8917c66dabc40feacd47a21eb3de9b532756a78becd882b76add97053af307c1240a + languageName: node + linkType: hard + "playwright-core@npm:1.42.0": version: 1.42.0 resolution: "playwright-core@npm:1.42.0" @@ -7360,6 +7654,13 @@ __metadata: languageName: node linkType: hard +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 10/e93ff66c6531a079af8fb217240df01f980155b5dc408d2d7bebc398dd284e383eb318153bf8acd4db3c4fe799aa5b9a641e38b0ba3b1975700b1c89547ea4e7 + languageName: node + linkType: hard + "signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" @@ -7367,7 +7668,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^4.0.1": +"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": version: 4.1.0 resolution: "signal-exit@npm:4.1.0" checksum: 10/c9fa63bbbd7431066174a48ba2dd9986dfd930c3a8b59de9c29d7b6854ec1c12a80d15310869ea5166d413b99f041bfa3dd80a7947bcd44ea8e6eb3ffeabfa1f @@ -7494,6 +7795,13 @@ __metadata: languageName: node linkType: hard +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 10/2d4dc4e64e2db796de4a3c856d5943daccdfa3dd092e452a1ce059c81e9a9c29e0b9badba91b43ef0d5ff5c04ee62feb3bcc559a804e16faf447bac2d883aa99 + languageName: node + linkType: hard + "statuses@npm:2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" @@ -7501,6 +7809,13 @@ __metadata: languageName: node linkType: hard +"std-env@npm:^3.5.0": + version: 3.7.0 + resolution: "std-env@npm:3.7.0" + checksum: 10/6ee0cca1add3fd84656b0002cfbc5bfa20340389d9ba4720569840f1caa34bce74322aef4c93f046391583e50649d0cf81a5f8fe1d411e50b659571690a45f12 + languageName: node + linkType: hard + "stop-iteration-iterator@npm:^1.0.0": version: 1.0.0 resolution: "stop-iteration-iterator@npm:1.0.0" @@ -7581,6 +7896,13 @@ __metadata: languageName: node linkType: hard +"strip-final-newline@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-final-newline@npm:3.0.0" + checksum: 10/23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 + languageName: node + linkType: hard + "strip-indent@npm:^3.0.0": version: 3.0.0 resolution: "strip-indent@npm:3.0.0" @@ -7597,6 +7919,15 @@ __metadata: languageName: node linkType: hard +"strip-literal@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-literal@npm:2.0.0" + dependencies: + js-tokens: "npm:^8.0.2" + checksum: 10/efb3197175a7e403d0eaaaf5382b9574be77f8fa006b57b669856a38b58ca9caf76cbc75d9f69d56324dad0b8babe1d4ea7ad1eb12106228830bcdd5d4bf12b5 + languageName: node + linkType: hard + "styled-jsx@npm:5.1.1": version: 5.1.1 resolution: "styled-jsx@npm:5.1.1" @@ -7695,6 +8026,27 @@ __metadata: languageName: node linkType: hard +"tinybench@npm:^2.5.1": + version: 2.6.0 + resolution: "tinybench@npm:2.6.0" + checksum: 10/6d35f0540bbf6208e8f47fa88cad733bc4b35b3bea75ec995004a9a44f70b8947eff3d271a3b4a4f7e787a82211df0dec9370fa566ccf50441067c559382b3ed + languageName: node + linkType: hard + +"tinypool@npm:^0.8.2": + version: 0.8.2 + resolution: "tinypool@npm:0.8.2" + checksum: 10/5e2cdddc1caf437e3b8d8c56c1c66dffcb46008be4b2e37d457b0921699c6b79930dd8d652e4890c5e1e24688489259da83fd853bc0ce348d8a0375dedefc2ba + languageName: node + linkType: hard + +"tinyspy@npm:^2.2.0": + version: 2.2.1 + resolution: "tinyspy@npm:2.2.1" + checksum: 10/170d6232e87f9044f537b50b406a38fbfd6f79a261cd12b92879947bd340939a833a678632ce4f5c4a6feab4477e9c21cd43faac3b90b68b77dd0536c4149736 + languageName: node + linkType: hard + "tmpl@npm:1.0.5": version: 1.0.5 resolution: "tmpl@npm:1.0.5" @@ -7776,7 +8128,7 @@ __metadata: languageName: node linkType: hard -"type-detect@npm:4.0.8": +"type-detect@npm:4.0.8, type-detect@npm:^4.0.0, type-detect@npm:^4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" checksum: 10/5179e3b8ebc51fce1b13efb75fdea4595484433f9683bbc2dca6d99789dba4e602ab7922d2656f2ce8383987467f7770131d4a7f06a26287db0615d2f4c4ce7d @@ -7820,6 +8172,13 @@ __metadata: languageName: node linkType: hard +"ufo@npm:^1.3.2": + version: 1.4.0 + resolution: "ufo@npm:1.4.0" + checksum: 10/b7aea8503878dc5ad797d8fc6fe39fec64d9cc7e89fb147ef86ec676e37bb462d99d67c6aad20b15f7d3e6d275d66666b29214422e268f1d98f6eaf707a207a6 + languageName: node + linkType: hard + "undici-types@npm:~5.26.4": version: 5.26.5 resolution: "undici-types@npm:5.26.5" @@ -7955,6 +8314,61 @@ __metadata: languageName: node linkType: hard +"vite-node@npm:1.3.1": + version: 1.3.1 + resolution: "vite-node@npm:1.3.1" + dependencies: + cac: "npm:^6.7.14" + debug: "npm:^4.3.4" + pathe: "npm:^1.1.1" + picocolors: "npm:^1.0.0" + vite: "npm:^5.0.0" + bin: + vite-node: vite-node.mjs + checksum: 10/d6ca8cd5b84768f9a0f12d4327a6aca5200001bd9111991df89ad742e059566a95f8298047af7144ca128120fc67cbd7d37b3fda9700ab07f8fc130d2ad58665 + languageName: node + linkType: hard + +"vite@npm:^5.0.0": + version: 5.1.5 + resolution: "vite@npm:5.1.5" + dependencies: + esbuild: "npm:^0.19.3" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.4.35" + rollup: "npm:^4.2.0" + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 10/ada0a9138ca541723008ee261d80a97f6b70173508ded0f87834e2142660f45dff9801d143551aa3a8979ed446f0aec71ae114ab3ae978b3fbd5cf1f8c4bc331 + languageName: node + linkType: hard + "vite@npm:^5.0.10": version: 5.1.4 resolution: "vite@npm:5.1.4" @@ -7995,6 +8409,56 @@ __metadata: languageName: node linkType: hard +"vitest@npm:^1.3.1": + version: 1.3.1 + resolution: "vitest@npm:1.3.1" + dependencies: + "@vitest/expect": "npm:1.3.1" + "@vitest/runner": "npm:1.3.1" + "@vitest/snapshot": "npm:1.3.1" + "@vitest/spy": "npm:1.3.1" + "@vitest/utils": "npm:1.3.1" + acorn-walk: "npm:^8.3.2" + chai: "npm:^4.3.10" + debug: "npm:^4.3.4" + execa: "npm:^8.0.1" + local-pkg: "npm:^0.5.0" + magic-string: "npm:^0.30.5" + pathe: "npm:^1.1.1" + picocolors: "npm:^1.0.0" + std-env: "npm:^3.5.0" + strip-literal: "npm:^2.0.0" + tinybench: "npm:^2.5.1" + tinypool: "npm:^0.8.2" + vite: "npm:^5.0.0" + vite-node: "npm:1.3.1" + why-is-node-running: "npm:^2.2.2" + peerDependencies: + "@edge-runtime/vm": "*" + "@types/node": ^18.0.0 || >=20.0.0 + "@vitest/browser": 1.3.1 + "@vitest/ui": 1.3.1 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: 10/41a8405d65b3b3a48b97b020fae50bdc928a8ebb55b4d24e8867e1ba23d298ea810b37ca6530ab87f6b51d3dc1ada1e067e7bc252a99d8f5439ca4ce6831d1f6 + languageName: node + linkType: hard + "w3c-xmlserializer@npm:^4.0.0": version: 4.0.0 resolution: "w3c-xmlserializer@npm:4.0.0" @@ -8123,6 +8587,18 @@ __metadata: languageName: node linkType: hard +"why-is-node-running@npm:^2.2.2": + version: 2.2.2 + resolution: "why-is-node-running@npm:2.2.2" + dependencies: + siginfo: "npm:^2.0.0" + stackback: "npm:0.0.2" + bin: + why-is-node-running: cli.js + checksum: 10/f3582e0337f4b25537d492b1d40f00b978ce04b1d1eeea8f310bfa8aae8a7d11d118d672e2f0760c164ce3753a620a70aa29ff3620e340197624940cf9c08615 + languageName: node + linkType: hard + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" @@ -8241,6 +8717,13 @@ __metadata: languageName: node linkType: hard +"yocto-queue@npm:^1.0.0": + version: 1.0.0 + resolution: "yocto-queue@npm:1.0.0" + checksum: 10/2cac84540f65c64ccc1683c267edce396b26b1e931aa429660aefac8fbe0188167b7aee815a3c22fa59a28a58d898d1a2b1825048f834d8d629f4c2a5d443801 + languageName: node + linkType: hard + "zen-observable-ts@npm:^1.2.5": version: 1.2.5 resolution: "zen-observable-ts@npm:1.2.5" diff --git a/yarn.lock b/yarn.lock index de6582d5..922791eb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11263,7 +11263,7 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.0.0, prettier@npm:^3.2.5": +"prettier@npm:^3.0.0": version: 3.2.5 resolution: "prettier@npm:3.2.5" bin: