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
+ }>
+
+
+
+
+
+ >
+ );
+}
+
+export const QUERY = gql`
+ query {
+ products {
+ id
+ title
+ }
+ }
+`;
+
+function Countries() {
+ const { data } = useSuspenseQuery(QUERY);
+
+ return (
+
+ {data.products.map((product) => (
+ {product.title}
+ ))}
+
+ );
+}
+
+/**
+ * Counter components to test that the client has hydrated and is interactive.
+ */
+function Counter() {
+ const [counter, setCounter] = useState(0);
+ return (
+ <>
+ {counter}
+ setCounter((x) => x + 1)}>increment
+ >
+ );
+}
+
+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: