diff --git a/.changeset/fix-server-fn-manifest-cross-file.md b/.changeset/fix-server-fn-manifest-cross-file.md new file mode 100644 index 0000000000..51a19cb14f --- /dev/null +++ b/.changeset/fix-server-fn-manifest-cross-file.md @@ -0,0 +1,19 @@ +--- +"@tanstack/start-plugin-core": patch +--- + +fix(start-plugin-core): register server functions reachable only from server-only code in the production manifest + +When SSR is the server-function provider (the Vite default), a server function +reachable only from server-only code — e.g. a middleware `.server()` body or +another server function's handler — could be omitted from the generated server +function manifest. Calls then failed at runtime in production with +`Server function info not found for `, while dev builds worked. This happened +because the resolver module is generated once and could be produced before those +functions had been discovered. + +The server-function resolver now completes discovery of the reachable server +module graph (including provider modules, so handler-nested and external-package +server functions are covered) before generating the manifest. + +Fixes #7213. diff --git a/e2e/react-router/basepath-file-based/package.json b/e2e/react-router/basepath-file-based/package.json index dd0956e96f..a155cc2173 100644 --- a/e2e/react-router/basepath-file-based/package.json +++ b/e2e/react-router/basepath-file-based/package.json @@ -18,7 +18,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-router/basic-esbuild-file-based/package.json b/e2e/react-router/basic-esbuild-file-based/package.json index 93e1263d11..2ff977a4f4 100644 --- a/e2e/react-router/basic-esbuild-file-based/package.json +++ b/e2e/react-router/basic-esbuild-file-based/package.json @@ -19,7 +19,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-router/basic-file-based-code-splitting/package.json b/e2e/react-router/basic-file-based-code-splitting/package.json index 14a8f0373f..f3654137be 100644 --- a/e2e/react-router/basic-file-based-code-splitting/package.json +++ b/e2e/react-router/basic-file-based-code-splitting/package.json @@ -21,7 +21,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-router/basic-file-based/package.json b/e2e/react-router/basic-file-based/package.json index da2df215af..be3d8add30 100644 --- a/e2e/react-router/basic-file-based/package.json +++ b/e2e/react-router/basic-file-based/package.json @@ -23,7 +23,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-router/basic-react-query-file-based/package.json b/e2e/react-router/basic-react-query-file-based/package.json index dd6c71afdd..6548381772 100644 --- a/e2e/react-router/basic-react-query-file-based/package.json +++ b/e2e/react-router/basic-react-query-file-based/package.json @@ -24,7 +24,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-router/basic-react-query/package.json b/e2e/react-router/basic-react-query/package.json index b66abda5fb..81eb9eb67b 100644 --- a/e2e/react-router/basic-react-query/package.json +++ b/e2e/react-router/basic-react-query/package.json @@ -22,7 +22,7 @@ "tailwindcss": "^4.2.2" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-router/basic-scroll-restoration/package.json b/e2e/react-router/basic-scroll-restoration/package.json index ab00360d48..d8ebcb414b 100644 --- a/e2e/react-router/basic-scroll-restoration/package.json +++ b/e2e/react-router/basic-scroll-restoration/package.json @@ -21,7 +21,7 @@ "tailwindcss": "^4.2.2" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-router/basic-virtual-file-based/package.json b/e2e/react-router/basic-virtual-file-based/package.json index 7b9c5945ee..891f1d6328 100644 --- a/e2e/react-router/basic-virtual-file-based/package.json +++ b/e2e/react-router/basic-virtual-file-based/package.json @@ -23,7 +23,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-router/basic-virtual-named-export-config-file-based/package.json b/e2e/react-router/basic-virtual-named-export-config-file-based/package.json index f3dbf81ce0..d3872b01e6 100644 --- a/e2e/react-router/basic-virtual-named-export-config-file-based/package.json +++ b/e2e/react-router/basic-virtual-named-export-config-file-based/package.json @@ -23,7 +23,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-router/basic/package.json b/e2e/react-router/basic/package.json index c7c1661933..a8de9acc3f 100644 --- a/e2e/react-router/basic/package.json +++ b/e2e/react-router/basic/package.json @@ -20,7 +20,7 @@ "tailwindcss": "^4.2.2" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-router/escaped-special-strings/package.json b/e2e/react-router/escaped-special-strings/package.json index 961d2423cd..71a3cb08ca 100644 --- a/e2e/react-router/escaped-special-strings/package.json +++ b/e2e/react-router/escaped-special-strings/package.json @@ -18,7 +18,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-router/generator-cli-only/package.json b/e2e/react-router/generator-cli-only/package.json index 9fbe253126..6bbcccf4bd 100644 --- a/e2e/react-router/generator-cli-only/package.json +++ b/e2e/react-router/generator-cli-only/package.json @@ -21,7 +21,7 @@ "tailwindcss": "^4.2.2" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-router/i18n-paraglide/package.json b/e2e/react-router/i18n-paraglide/package.json index 94a36498ed..31a22eb66b 100644 --- a/e2e/react-router/i18n-paraglide/package.json +++ b/e2e/react-router/i18n-paraglide/package.json @@ -19,7 +19,7 @@ }, "devDependencies": { "@inlang/paraglide-js": "^2.4.0", - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@tanstack/router-plugin": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/react-router/js-only-file-based/package.json b/e2e/react-router/js-only-file-based/package.json index 6505c4a1e4..d18d4da143 100644 --- a/e2e/react-router/js-only-file-based/package.json +++ b/e2e/react-router/js-only-file-based/package.json @@ -20,7 +20,7 @@ "tailwindcss": "^4.2.2" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@tanstack/router-plugin": "workspace:^", "@types/react": "^19.0.8", diff --git a/e2e/react-router/match-params/package.json b/e2e/react-router/match-params/package.json index 033a1bb5fe..3282e5e5c2 100644 --- a/e2e/react-router/match-params/package.json +++ b/e2e/react-router/match-params/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-router/rspack-basic-file-based/package.json b/e2e/react-router/rspack-basic-file-based/package.json index 74659b51e1..f54f8f83ca 100644 --- a/e2e/react-router/rspack-basic-file-based/package.json +++ b/e2e/react-router/rspack-basic-file-based/package.json @@ -17,7 +17,7 @@ "redaxios": "^0.5.1" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.11", "@rsbuild/plugin-react": "^2.0.0", "@tailwindcss/postcss": "^4.2.2", diff --git a/e2e/react-router/rspack-basic-virtual-named-export-config-file-based/package.json b/e2e/react-router/rspack-basic-virtual-named-export-config-file-based/package.json index a7b9eb58d4..18e7851ac9 100644 --- a/e2e/react-router/rspack-basic-virtual-named-export-config-file-based/package.json +++ b/e2e/react-router/rspack-basic-virtual-named-export-config-file-based/package.json @@ -17,7 +17,7 @@ "redaxios": "^0.5.1" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.11", "@rsbuild/plugin-react": "^2.0.0", "@tailwindcss/postcss": "^4.2.2", diff --git a/e2e/react-router/scroll-restoration-sandbox-vite/package.json b/e2e/react-router/scroll-restoration-sandbox-vite/package.json index 215de36a70..a7fc908019 100644 --- a/e2e/react-router/scroll-restoration-sandbox-vite/package.json +++ b/e2e/react-router/scroll-restoration-sandbox-vite/package.json @@ -25,7 +25,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-router/sentry-integration/package.json b/e2e/react-router/sentry-integration/package.json index d97446da9f..e275758b83 100644 --- a/e2e/react-router/sentry-integration/package.json +++ b/e2e/react-router/sentry-integration/package.json @@ -23,7 +23,7 @@ "tailwindcss": "^4.2.2" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-router/view-transitions/package.json b/e2e/react-router/view-transitions/package.json index 1c675b7258..1f068d690a 100644 --- a/e2e/react-router/view-transitions/package.json +++ b/e2e/react-router/view-transitions/package.json @@ -22,7 +22,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", diff --git a/e2e/react-start/basic-auth/package.json b/e2e/react-start/basic-auth/package.json index 4475cf5adf..5976695006 100644 --- a/e2e/react-start/basic-auth/package.json +++ b/e2e/react-start/basic-auth/package.json @@ -25,7 +25,7 @@ "tailwind-merge": "^3.6.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/react-start/basic-cloudflare/package.json b/e2e/react-start/basic-cloudflare/package.json index 4d90b4124e..45ea13f9da 100644 --- a/e2e/react-start/basic-cloudflare/package.json +++ b/e2e/react-start/basic-cloudflare/package.json @@ -21,7 +21,7 @@ }, "devDependencies": { "@cloudflare/vite-plugin": "^1.29.0", - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/react-start/basic-react-query/package.json b/e2e/react-start/basic-react-query/package.json index 242636c63f..c804a89eb3 100644 --- a/e2e/react-start/basic-react-query/package.json +++ b/e2e/react-start/basic-react-query/package.json @@ -25,7 +25,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/react-start/basic/package.json b/e2e/react-start/basic/package.json index 37a3f4a0e2..f11df33f3f 100644 --- a/e2e/react-start/basic/package.json +++ b/e2e/react-start/basic/package.json @@ -31,7 +31,7 @@ "tailwind-merge": "^3.6.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.11", "@rsbuild/plugin-react": "^2.0.0", "@tailwindcss/postcss": "^4.2.2", diff --git a/e2e/react-start/clerk-basic/package.json b/e2e/react-start/clerk-basic/package.json index 2ff6a85a3a..137a0e7fda 100644 --- a/e2e/react-start/clerk-basic/package.json +++ b/e2e/react-start/clerk-basic/package.json @@ -21,7 +21,7 @@ "tailwind-merge": "^3.6.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/react-start/csp/package.json b/e2e/react-start/csp/package.json index 4d3c4fd264..22ffb81237 100644 --- a/e2e/react-start/csp/package.json +++ b/e2e/react-start/csp/package.json @@ -17,7 +17,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "@types/react": "^19.0.8", diff --git a/e2e/react-start/css-inline/package.json b/e2e/react-start/css-inline/package.json index a7bc5d023f..5e0b6d104d 100644 --- a/e2e/react-start/css-inline/package.json +++ b/e2e/react-start/css-inline/package.json @@ -23,7 +23,7 @@ "srvx": "^0.11.9" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.11", "@rsbuild/plugin-react": "^2.0.0", "@tanstack/router-e2e-utils": "workspace:^", diff --git a/e2e/react-start/css-modules/package.json b/e2e/react-start/css-modules/package.json index 1610f62a61..381fa13b3a 100644 --- a/e2e/react-start/css-modules/package.json +++ b/e2e/react-start/css-modules/package.json @@ -35,7 +35,7 @@ }, "devDependencies": { "@cloudflare/vite-plugin": "^1.29.0", - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:*", "@types/node": "^22.10.2", "@types/react": "^19.0.8", diff --git a/e2e/react-start/custom-basepath/package.json b/e2e/react-start/custom-basepath/package.json index f32c9772b9..4bf492acca 100644 --- a/e2e/react-start/custom-basepath/package.json +++ b/e2e/react-start/custom-basepath/package.json @@ -20,7 +20,7 @@ "redaxios": "^0.5.1" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/express": "^5.0.6", diff --git a/e2e/react-start/custom-server-rsbuild/package.json b/e2e/react-start/custom-server-rsbuild/package.json index 75634f79f5..87acfacd05 100644 --- a/e2e/react-start/custom-server-rsbuild/package.json +++ b/e2e/react-start/custom-server-rsbuild/package.json @@ -20,7 +20,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.11", "@rsbuild/plugin-react": "^2.0.0", "@tailwindcss/postcss": "^4.2.2", diff --git a/e2e/react-start/dev-ssr-styles/package.json b/e2e/react-start/dev-ssr-styles/package.json index 91c5cc1281..829eddedd3 100644 --- a/e2e/react-start/dev-ssr-styles/package.json +++ b/e2e/react-start/dev-ssr-styles/package.json @@ -37,7 +37,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-core": "workspace:*", "@tanstack/router-e2e-utils": "workspace:*", "@types/node": "^22.10.2", diff --git a/e2e/react-start/early-hints/package.json b/e2e/react-start/early-hints/package.json index 932ab20cdc..a1a0efbd37 100644 --- a/e2e/react-start/early-hints/package.json +++ b/e2e/react-start/early-hints/package.json @@ -19,7 +19,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "@types/node-forge": "^1.3.14", diff --git a/e2e/react-start/hmr/package.json b/e2e/react-start/hmr/package.json index b3a58125b9..7c5b6133c1 100644 --- a/e2e/react-start/hmr/package.json +++ b/e2e/react-start/hmr/package.json @@ -20,7 +20,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.11", "@rsbuild/plugin-react": "^2.0.0", "@tailwindcss/postcss": "^4.2.2", diff --git a/e2e/react-start/i18n-paraglide/package.json b/e2e/react-start/i18n-paraglide/package.json index bfb7b5eb26..39e5d3e137 100644 --- a/e2e/react-start/i18n-paraglide/package.json +++ b/e2e/react-start/i18n-paraglide/package.json @@ -19,7 +19,7 @@ }, "devDependencies": { "@inlang/paraglide-js": "^2.4.0", - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/react-start/import-protection-custom-config/package.json b/e2e/react-start/import-protection-custom-config/package.json index 1175bd4ac0..ff0e9e7bdf 100644 --- a/e2e/react-start/import-protection-custom-config/package.json +++ b/e2e/react-start/import-protection-custom-config/package.json @@ -19,7 +19,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "@types/react": "^19.0.8", diff --git a/e2e/react-start/import-protection/package.json b/e2e/react-start/import-protection/package.json index 65ad70126b..0efd1c2048 100644 --- a/e2e/react-start/import-protection/package.json +++ b/e2e/react-start/import-protection/package.json @@ -24,7 +24,7 @@ "react-tweet": "^3.3.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.11", "@rsbuild/plugin-react": "^2.0.0", "@tanstack/router-e2e-utils": "workspace:^", diff --git a/e2e/react-start/query-integration/package.json b/e2e/react-start/query-integration/package.json index 6a22be7871..a2a325f9c8 100644 --- a/e2e/react-start/query-integration/package.json +++ b/e2e/react-start/query-integration/package.json @@ -24,7 +24,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/react-start/rsc-deferred-hydration/package.json b/e2e/react-start/rsc-deferred-hydration/package.json index e14d919490..e1cc5f28e4 100644 --- a/e2e/react-start/rsc-deferred-hydration/package.json +++ b/e2e/react-start/rsc-deferred-hydration/package.json @@ -31,7 +31,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "@types/react": "^19.0.8", diff --git a/e2e/react-start/rsc-query/package.json b/e2e/react-start/rsc-query/package.json index 6049fa77a9..c909b53edf 100644 --- a/e2e/react-start/rsc-query/package.json +++ b/e2e/react-start/rsc-query/package.json @@ -22,7 +22,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "@types/react": "^19.0.8", diff --git a/e2e/react-start/rsc-rsbuild/package.json b/e2e/react-start/rsc-rsbuild/package.json index 6dc5f5f5a1..992ae65684 100644 --- a/e2e/react-start/rsc-rsbuild/package.json +++ b/e2e/react-start/rsc-rsbuild/package.json @@ -27,7 +27,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.8", "@rsbuild/plugin-react": "^2.0.0", "@tanstack/router-e2e-utils": "workspace:^", diff --git a/e2e/react-start/rsc/package.json b/e2e/react-start/rsc/package.json index 36f822e660..805286a18e 100644 --- a/e2e/react-start/rsc/package.json +++ b/e2e/react-start/rsc/package.json @@ -39,7 +39,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.11", "@rsbuild/plugin-react": "^2.0.0", "@tanstack/eslint-plugin-start": "workspace:^", diff --git a/e2e/react-start/scroll-restoration/package.json b/e2e/react-start/scroll-restoration/package.json index 3dff10b56e..caf6ccbef4 100644 --- a/e2e/react-start/scroll-restoration/package.json +++ b/e2e/react-start/scroll-restoration/package.json @@ -22,7 +22,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/react-start/server-functions-global-middleware/package.json b/e2e/react-start/server-functions-global-middleware/package.json index 9af23a0df5..fbbe413417 100644 --- a/e2e/react-start/server-functions-global-middleware/package.json +++ b/e2e/react-start/server-functions-global-middleware/package.json @@ -18,7 +18,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/react-start/server-functions-shared-lib/package.json b/e2e/react-start/server-functions-shared-lib/package.json new file mode 100644 index 0000000000..ce0b9aa816 --- /dev/null +++ b/e2e/react-start/server-functions-shared-lib/package.json @@ -0,0 +1,14 @@ +{ + "name": "@tanstack/react-start-e2e-shared-server-fns", + "private": true, + "type": "module", + "exports": { + ".": "./src/index.ts" + }, + "peerDependencies": { + "@tanstack/react-start": "*" + }, + "devDependencies": { + "@tanstack/react-start": "workspace:*" + } +} diff --git a/e2e/react-start/server-functions-shared-lib/src/index.ts b/e2e/react-start/server-functions-shared-lib/src/index.ts new file mode 100644 index 0000000000..8855629fcd --- /dev/null +++ b/e2e/react-start/server-functions-shared-lib/src/index.ts @@ -0,0 +1,10 @@ +import { createServerFn } from '@tanstack/react-start' +import { sharedInnerServerFn } from './internal' + +// Exported by a separate package and called from the consuming app. Its handler +// calls `sharedInnerServerFn`, which is only reachable through this handler and +// lives in the same (external) package. +export const sharedServerFn = createServerFn().handler(async () => { + const inner = await sharedInnerServerFn() + return { outer: 'from-shared-package-outer', inner } +}) diff --git a/e2e/react-start/server-functions-shared-lib/src/internal.ts b/e2e/react-start/server-functions-shared-lib/src/internal.ts new file mode 100644 index 0000000000..e440f27d0c --- /dev/null +++ b/e2e/react-start/server-functions-shared-lib/src/internal.ts @@ -0,0 +1,9 @@ +import { createServerFn } from '@tanstack/react-start' + +// A server-only function defined inside a shared package. It is reached only +// through the handler of the package's exported `sharedServerFn` (below), so it +// lives outside the consuming app's root AND behind a handler boundary — the +// case that the location-agnostic provider-module discovery exists to cover. +export const sharedInnerServerFn = createServerFn().handler(() => { + return { secret: 'from-shared-package-inner' } +}) diff --git a/e2e/react-start/server-functions/package.json b/e2e/react-start/server-functions/package.json index 5efdf6c42a..5899f415b2 100644 --- a/e2e/react-start/server-functions/package.json +++ b/e2e/react-start/server-functions/package.json @@ -22,6 +22,7 @@ "@tanstack/react-router-devtools": "workspace:^", "@tanstack/react-router-ssr-query": "workspace:^", "@tanstack/react-start": "workspace:^", + "@tanstack/react-start-e2e-shared-server-fns": "workspace:*", "js-cookie": "^3.0.5", "react": "^19.0.0", "react-dom": "^19.0.0", @@ -30,7 +31,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.11", "@rsbuild/plugin-react": "^2.0.0", "@tailwindcss/postcss": "^4.2.2", diff --git a/e2e/react-start/server-functions/src/functions/chainLevelB.ts b/e2e/react-start/server-functions/src/functions/chainLevelB.ts new file mode 100644 index 0000000000..575e1fecc3 --- /dev/null +++ b/e2e/react-start/server-functions/src/functions/chainLevelB.ts @@ -0,0 +1,9 @@ +import { createServerFn } from '@tanstack/react-start' +import { chainLevelC } from './chainLevelC' + +// Middle link of the chain. Reached only through `chainLevelA`'s handler, and +// calls `chainLevelC` from its own handler. +export const chainLevelB = createServerFn().handler(async () => { + const c = await chainLevelC() + return { level: 'B', c } +}) diff --git a/e2e/react-start/server-functions/src/functions/chainLevelC.ts b/e2e/react-start/server-functions/src/functions/chainLevelC.ts new file mode 100644 index 0000000000..303d55dd54 --- /dev/null +++ b/e2e/react-start/server-functions/src/functions/chainLevelC.ts @@ -0,0 +1,8 @@ +import { createServerFn } from '@tanstack/react-start' + +// Deepest link of a cross-file, server-only chain. Only reachable through +// `chainLevelB`'s handler, so it is discovered only on the second pass of the +// provider-module fixpoint (after chainLevelB itself is registered). +export const chainLevelC = createServerFn().handler(() => { + return { level: 'C', value: 'deepest-chain-value' } +}) diff --git a/e2e/react-start/server-functions/src/functions/serverFnCalledByMiddleware.ts b/e2e/react-start/server-functions/src/functions/serverFnCalledByMiddleware.ts new file mode 100644 index 0000000000..b7569473ec --- /dev/null +++ b/e2e/react-start/server-functions/src/functions/serverFnCalledByMiddleware.ts @@ -0,0 +1,9 @@ +import { createServerFn } from '@tanstack/react-start' + +// This server function lives in its own file and is only ever called from +// within a middleware that lives in yet another file (see +// `src/middleware/serverFnCallingMiddleware.ts`). It is never referenced +// directly from client code or from the route file. +export const serverFnCalledByMiddleware = createServerFn().handler(() => { + return { message: 'hello from server fn called by middleware', secret: 1234 } +}) diff --git a/e2e/react-start/server-functions/src/middleware/serverFnCallingMiddleware.ts b/e2e/react-start/server-functions/src/middleware/serverFnCallingMiddleware.ts new file mode 100644 index 0000000000..fec02bd227 --- /dev/null +++ b/e2e/react-start/server-functions/src/middleware/serverFnCallingMiddleware.ts @@ -0,0 +1,22 @@ +import { createMiddleware } from '@tanstack/react-start' +import { serverFnCalledByMiddleware } from '~/functions/serverFnCalledByMiddleware' + +// This middleware lives in its own file and, from its `.server()` handler, +// calls a server function that is defined in a *separate* file. +// +// Regression test for https://github.com/TanStack/router/issues/7213: +// when this middleware is applied to a server function, production builds +// used to fail at runtime with "Server function info not found for [ID]" +// because the server function reached only through the middleware was not +// registered in the server function manifest. Dev builds worked fine. +export const serverFnCallingMiddleware = createMiddleware({ + type: 'function', +}).server(async ({ next }) => { + const result = await serverFnCalledByMiddleware() + + return next({ + context: { + fromMiddleware: result, + }, + }) +}) diff --git a/e2e/react-start/server-functions/src/routeTree.gen.ts b/e2e/react-start/server-functions/src/routeTree.gen.ts index 249a9c42ce..bf50f45732 100644 --- a/e2e/react-start/server-functions/src/routeTree.gen.ts +++ b/e2e/react-start/server-functions/src/routeTree.gen.ts @@ -11,11 +11,13 @@ import { Route as rootRouteImport } from './routes/__root' import { Route as SubmitPostFormdataRouteImport } from './routes/submit-post-formdata' import { Route as StatusRouteImport } from './routes/status' +import { Route as SharedPackageServerFnRouteImport } from './routes/shared-package-server-fn' import { Route as ServerOnlyFnRouteImport } from './routes/server-only-fn' import { Route as ServerFnInClientOnlyFnRouteImport } from './routes/server-fn-in-client-only-fn' import { Route as SerializeFormDataRouteImport } from './routes/serialize-form-data' import { Route as ReturnNullRouteImport } from './routes/return-null' import { Route as RawResponseRouteImport } from './routes/raw-response' +import { Route as NestedServerFnsRouteImport } from './routes/nested-server-fns' import { Route as MultipartRouteImport } from './routes/multipart' import { Route as IsomorphicFnsRouteImport } from './routes/isomorphic-fns' import { Route as HeadersRouteImport } from './routes/headers' @@ -40,6 +42,7 @@ import { Route as AbortSignalIndexRouteImport } from './routes/abort-signal/inde import { Route as RedirectTestTargetRouteImport } from './routes/redirect-test/target' import { Route as RedirectTestSsrTargetRouteImport } from './routes/redirect-test-ssr/target' import { Route as MiddlewareUnhandledExceptionRouteImport } from './routes/middleware/unhandled-exception' +import { Route as MiddlewareServerfnInMiddlewareRouteImport } from './routes/middleware/serverfn-in-middleware' import { Route as MiddlewareServerImportMiddlewareRouteImport } from './routes/middleware/server-import-middleware' import { Route as MiddlewareSendServerFnRouteImport } from './routes/middleware/send-serverFn' import { Route as MiddlewareRequestMiddlewareRouteImport } from './routes/middleware/request-middleware' @@ -64,6 +67,11 @@ const StatusRoute = StatusRouteImport.update({ path: '/status', getParentRoute: () => rootRouteImport, } as any) +const SharedPackageServerFnRoute = SharedPackageServerFnRouteImport.update({ + id: '/shared-package-server-fn', + path: '/shared-package-server-fn', + getParentRoute: () => rootRouteImport, +} as any) const ServerOnlyFnRoute = ServerOnlyFnRouteImport.update({ id: '/server-only-fn', path: '/server-only-fn', @@ -89,6 +97,11 @@ const RawResponseRoute = RawResponseRouteImport.update({ path: '/raw-response', getParentRoute: () => rootRouteImport, } as any) +const NestedServerFnsRoute = NestedServerFnsRouteImport.update({ + id: '/nested-server-fns', + path: '/nested-server-fns', + getParentRoute: () => rootRouteImport, +} as any) const MultipartRoute = MultipartRouteImport.update({ id: '/multipart', path: '/multipart', @@ -210,6 +223,12 @@ const MiddlewareUnhandledExceptionRoute = path: '/middleware/unhandled-exception', getParentRoute: () => rootRouteImport, } as any) +const MiddlewareServerfnInMiddlewareRoute = + MiddlewareServerfnInMiddlewareRouteImport.update({ + id: '/middleware/serverfn-in-middleware', + path: '/middleware/serverfn-in-middleware', + getParentRoute: () => rootRouteImport, + } as any) const MiddlewareServerImportMiddlewareRoute = MiddlewareServerImportMiddlewareRouteImport.update({ id: '/middleware/server-import-middleware', @@ -296,11 +315,13 @@ export interface FileRoutesByFullPath { '/headers': typeof HeadersRoute '/isomorphic-fns': typeof IsomorphicFnsRoute '/multipart': typeof MultipartRoute + '/nested-server-fns': typeof NestedServerFnsRoute '/raw-response': typeof RawResponseRoute '/return-null': typeof ReturnNullRoute '/serialize-form-data': typeof SerializeFormDataRoute '/server-fn-in-client-only-fn': typeof ServerFnInClientOnlyFnRoute '/server-only-fn': typeof ServerOnlyFnRoute + '/shared-package-server-fn': typeof SharedPackageServerFnRoute '/status': typeof StatusRoute '/submit-post-formdata': typeof SubmitPostFormdataRoute '/abort-signal/$method': typeof AbortSignalMethodRoute @@ -313,6 +334,7 @@ export interface FileRoutesByFullPath { '/middleware/request-middleware': typeof MiddlewareRequestMiddlewareRoute '/middleware/send-serverFn': typeof MiddlewareSendServerFnRoute '/middleware/server-import-middleware': typeof MiddlewareServerImportMiddlewareRoute + '/middleware/serverfn-in-middleware': typeof MiddlewareServerfnInMiddlewareRoute '/middleware/unhandled-exception': typeof MiddlewareUnhandledExceptionRoute '/redirect-test-ssr/target': typeof RedirectTestSsrTargetRoute '/redirect-test/target': typeof RedirectTestTargetRoute @@ -342,11 +364,13 @@ export interface FileRoutesByTo { '/headers': typeof HeadersRoute '/isomorphic-fns': typeof IsomorphicFnsRoute '/multipart': typeof MultipartRoute + '/nested-server-fns': typeof NestedServerFnsRoute '/raw-response': typeof RawResponseRoute '/return-null': typeof ReturnNullRoute '/serialize-form-data': typeof SerializeFormDataRoute '/server-fn-in-client-only-fn': typeof ServerFnInClientOnlyFnRoute '/server-only-fn': typeof ServerOnlyFnRoute + '/shared-package-server-fn': typeof SharedPackageServerFnRoute '/status': typeof StatusRoute '/submit-post-formdata': typeof SubmitPostFormdataRoute '/abort-signal/$method': typeof AbortSignalMethodRoute @@ -359,6 +383,7 @@ export interface FileRoutesByTo { '/middleware/request-middleware': typeof MiddlewareRequestMiddlewareRoute '/middleware/send-serverFn': typeof MiddlewareSendServerFnRoute '/middleware/server-import-middleware': typeof MiddlewareServerImportMiddlewareRoute + '/middleware/serverfn-in-middleware': typeof MiddlewareServerfnInMiddlewareRoute '/middleware/unhandled-exception': typeof MiddlewareUnhandledExceptionRoute '/redirect-test-ssr/target': typeof RedirectTestSsrTargetRoute '/redirect-test/target': typeof RedirectTestTargetRoute @@ -389,11 +414,13 @@ export interface FileRoutesById { '/headers': typeof HeadersRoute '/isomorphic-fns': typeof IsomorphicFnsRoute '/multipart': typeof MultipartRoute + '/nested-server-fns': typeof NestedServerFnsRoute '/raw-response': typeof RawResponseRoute '/return-null': typeof ReturnNullRoute '/serialize-form-data': typeof SerializeFormDataRoute '/server-fn-in-client-only-fn': typeof ServerFnInClientOnlyFnRoute '/server-only-fn': typeof ServerOnlyFnRoute + '/shared-package-server-fn': typeof SharedPackageServerFnRoute '/status': typeof StatusRoute '/submit-post-formdata': typeof SubmitPostFormdataRoute '/abort-signal/$method': typeof AbortSignalMethodRoute @@ -406,6 +433,7 @@ export interface FileRoutesById { '/middleware/request-middleware': typeof MiddlewareRequestMiddlewareRoute '/middleware/send-serverFn': typeof MiddlewareSendServerFnRoute '/middleware/server-import-middleware': typeof MiddlewareServerImportMiddlewareRoute + '/middleware/serverfn-in-middleware': typeof MiddlewareServerfnInMiddlewareRoute '/middleware/unhandled-exception': typeof MiddlewareUnhandledExceptionRoute '/redirect-test-ssr/target': typeof RedirectTestSsrTargetRoute '/redirect-test/target': typeof RedirectTestTargetRoute @@ -437,11 +465,13 @@ export interface FileRouteTypes { | '/headers' | '/isomorphic-fns' | '/multipart' + | '/nested-server-fns' | '/raw-response' | '/return-null' | '/serialize-form-data' | '/server-fn-in-client-only-fn' | '/server-only-fn' + | '/shared-package-server-fn' | '/status' | '/submit-post-formdata' | '/abort-signal/$method' @@ -454,6 +484,7 @@ export interface FileRouteTypes { | '/middleware/request-middleware' | '/middleware/send-serverFn' | '/middleware/server-import-middleware' + | '/middleware/serverfn-in-middleware' | '/middleware/unhandled-exception' | '/redirect-test-ssr/target' | '/redirect-test/target' @@ -483,11 +514,13 @@ export interface FileRouteTypes { | '/headers' | '/isomorphic-fns' | '/multipart' + | '/nested-server-fns' | '/raw-response' | '/return-null' | '/serialize-form-data' | '/server-fn-in-client-only-fn' | '/server-only-fn' + | '/shared-package-server-fn' | '/status' | '/submit-post-formdata' | '/abort-signal/$method' @@ -500,6 +533,7 @@ export interface FileRouteTypes { | '/middleware/request-middleware' | '/middleware/send-serverFn' | '/middleware/server-import-middleware' + | '/middleware/serverfn-in-middleware' | '/middleware/unhandled-exception' | '/redirect-test-ssr/target' | '/redirect-test/target' @@ -529,11 +563,13 @@ export interface FileRouteTypes { | '/headers' | '/isomorphic-fns' | '/multipart' + | '/nested-server-fns' | '/raw-response' | '/return-null' | '/serialize-form-data' | '/server-fn-in-client-only-fn' | '/server-only-fn' + | '/shared-package-server-fn' | '/status' | '/submit-post-formdata' | '/abort-signal/$method' @@ -546,6 +582,7 @@ export interface FileRouteTypes { | '/middleware/request-middleware' | '/middleware/send-serverFn' | '/middleware/server-import-middleware' + | '/middleware/serverfn-in-middleware' | '/middleware/unhandled-exception' | '/redirect-test-ssr/target' | '/redirect-test/target' @@ -576,11 +613,13 @@ export interface RootRouteChildren { HeadersRoute: typeof HeadersRoute IsomorphicFnsRoute: typeof IsomorphicFnsRoute MultipartRoute: typeof MultipartRoute + NestedServerFnsRoute: typeof NestedServerFnsRoute RawResponseRoute: typeof RawResponseRoute ReturnNullRoute: typeof ReturnNullRoute SerializeFormDataRoute: typeof SerializeFormDataRoute ServerFnInClientOnlyFnRoute: typeof ServerFnInClientOnlyFnRoute ServerOnlyFnRoute: typeof ServerOnlyFnRoute + SharedPackageServerFnRoute: typeof SharedPackageServerFnRoute StatusRoute: typeof StatusRoute SubmitPostFormdataRoute: typeof SubmitPostFormdataRoute AbortSignalMethodRoute: typeof AbortSignalMethodRoute @@ -593,6 +632,7 @@ export interface RootRouteChildren { MiddlewareRequestMiddlewareRoute: typeof MiddlewareRequestMiddlewareRoute MiddlewareSendServerFnRoute: typeof MiddlewareSendServerFnRoute MiddlewareServerImportMiddlewareRoute: typeof MiddlewareServerImportMiddlewareRoute + MiddlewareServerfnInMiddlewareRoute: typeof MiddlewareServerfnInMiddlewareRoute MiddlewareUnhandledExceptionRoute: typeof MiddlewareUnhandledExceptionRoute RedirectTestSsrTargetRoute: typeof RedirectTestSsrTargetRoute RedirectTestTargetRoute: typeof RedirectTestTargetRoute @@ -628,6 +668,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof StatusRouteImport parentRoute: typeof rootRouteImport } + '/shared-package-server-fn': { + id: '/shared-package-server-fn' + path: '/shared-package-server-fn' + fullPath: '/shared-package-server-fn' + preLoaderRoute: typeof SharedPackageServerFnRouteImport + parentRoute: typeof rootRouteImport + } '/server-only-fn': { id: '/server-only-fn' path: '/server-only-fn' @@ -663,6 +710,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof RawResponseRouteImport parentRoute: typeof rootRouteImport } + '/nested-server-fns': { + id: '/nested-server-fns' + path: '/nested-server-fns' + fullPath: '/nested-server-fns' + preLoaderRoute: typeof NestedServerFnsRouteImport + parentRoute: typeof rootRouteImport + } '/multipart': { id: '/multipart' path: '/multipart' @@ -831,6 +885,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof MiddlewareUnhandledExceptionRouteImport parentRoute: typeof rootRouteImport } + '/middleware/serverfn-in-middleware': { + id: '/middleware/serverfn-in-middleware' + path: '/middleware/serverfn-in-middleware' + fullPath: '/middleware/serverfn-in-middleware' + preLoaderRoute: typeof MiddlewareServerfnInMiddlewareRouteImport + parentRoute: typeof rootRouteImport + } '/middleware/server-import-middleware': { id: '/middleware/server-import-middleware' path: '/middleware/server-import-middleware' @@ -936,11 +997,13 @@ const rootRouteChildren: RootRouteChildren = { HeadersRoute: HeadersRoute, IsomorphicFnsRoute: IsomorphicFnsRoute, MultipartRoute: MultipartRoute, + NestedServerFnsRoute: NestedServerFnsRoute, RawResponseRoute: RawResponseRoute, ReturnNullRoute: ReturnNullRoute, SerializeFormDataRoute: SerializeFormDataRoute, ServerFnInClientOnlyFnRoute: ServerFnInClientOnlyFnRoute, ServerOnlyFnRoute: ServerOnlyFnRoute, + SharedPackageServerFnRoute: SharedPackageServerFnRoute, StatusRoute: StatusRoute, SubmitPostFormdataRoute: SubmitPostFormdataRoute, AbortSignalMethodRoute: AbortSignalMethodRoute, @@ -953,6 +1016,7 @@ const rootRouteChildren: RootRouteChildren = { MiddlewareRequestMiddlewareRoute: MiddlewareRequestMiddlewareRoute, MiddlewareSendServerFnRoute: MiddlewareSendServerFnRoute, MiddlewareServerImportMiddlewareRoute: MiddlewareServerImportMiddlewareRoute, + MiddlewareServerfnInMiddlewareRoute: MiddlewareServerfnInMiddlewareRoute, MiddlewareUnhandledExceptionRoute: MiddlewareUnhandledExceptionRoute, RedirectTestSsrTargetRoute: RedirectTestSsrTargetRoute, RedirectTestTargetRoute: RedirectTestTargetRoute, diff --git a/e2e/react-start/server-functions/src/routes/middleware/index.tsx b/e2e/react-start/server-functions/src/routes/middleware/index.tsx index 0d4e313912..2e1efb262f 100644 --- a/e2e/react-start/server-functions/src/routes/middleware/index.tsx +++ b/e2e/react-start/server-functions/src/routes/middleware/index.tsx @@ -66,6 +66,14 @@ function RouteComponent() { Function middleware receives functionId and filename +
  • + + Server function called from a middleware in a separate file + +
  • ) diff --git a/e2e/react-start/server-functions/src/routes/middleware/serverfn-in-middleware.tsx b/e2e/react-start/server-functions/src/routes/middleware/serverfn-in-middleware.tsx new file mode 100644 index 0000000000..fe81615eaa --- /dev/null +++ b/e2e/react-start/server-functions/src/routes/middleware/serverfn-in-middleware.tsx @@ -0,0 +1,70 @@ +import { createFileRoute } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/react-start' +import * as React from 'react' +import { serverFnCallingMiddleware } from '~/middleware/serverFnCallingMiddleware' + +/** + * Regression test for https://github.com/TanStack/router/issues/7213. + * + * A middleware defined in a separate file (`serverFnCallingMiddleware`) calls a + * server function defined in yet another separate file + * (`serverFnCalledByMiddleware`). That middleware is then applied to the server + * function below. + * + * In production builds this used to fail at runtime with + * "Server function info not found for [ID]" because the server function that is + * only reachable through the middleware was never registered in the server + * function manifest. It worked in development and when everything lived in a + * single file. + */ +const serverFnWithMiddleware = createServerFn() + .middleware([serverFnCallingMiddleware]) + .handler(async ({ context }) => { + return { fromMiddleware: context.fromMiddleware } + }) + +export const Route = createFileRoute('/middleware/serverfn-in-middleware')({ + component: RouteComponent, +}) + +function RouteComponent() { + const [result, setResult] = React.useState<{ + fromMiddleware: { message: string; secret: number } + } | null>(null) + const [error, setError] = React.useState(null) + + async function handleClick() { + try { + const data = await serverFnWithMiddleware() + setResult(data) + setError(null) + } catch (e) { + setResult(null) + setError(e instanceof Error ? e.message : String(e)) + } + } + + return ( +
    +

    Server Function Called From Middleware (issue #7213)

    +

    + A middleware in a separate file calls a server function in another + separate file, and that middleware is applied to this server function. +

    + + {result && ( +
    +          {JSON.stringify(result)}
    +        
    + )} + {error && ( +
    Error: {error}
    + )} +
    + ) +} diff --git a/e2e/react-start/server-functions/src/routes/nested-server-fns.tsx b/e2e/react-start/server-functions/src/routes/nested-server-fns.tsx new file mode 100644 index 0000000000..2f622b9dee --- /dev/null +++ b/e2e/react-start/server-functions/src/routes/nested-server-fns.tsx @@ -0,0 +1,49 @@ +import { createFileRoute } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/react-start' +import * as React from 'react' +import { chainLevelB } from '~/functions/chainLevelB' + +/** + * Regression test for https://github.com/TanStack/router/issues/7213 exercising + * a multi-level cross-file chain: + * + * chainLevelA (client-called) -> chainLevelB (handler) -> chainLevelC (handler) + * + * Each function lives in its own file; levelB and levelC are server-only. levelC + * is only reachable through levelB's handler, so it is discovered only after + * levelB is registered and its provider module is crawled — i.e. the discovery + * fixpoint must iterate more than once for this to end up in the manifest. + */ +const chainLevelA = createServerFn().handler(async () => { + return chainLevelB() +}) + +export const Route = createFileRoute('/nested-server-fns')({ + component: RouteComponent, +}) + +function RouteComponent() { + const [result, setResult] = React.useState(null) + const [error, setError] = React.useState(null) + + async function handleClick() { + try { + setResult(JSON.stringify(await chainLevelA())) + setError(null) + } catch (e) { + setError(e instanceof Error ? e.message : String(e)) + setResult(null) + } + } + + return ( +
    +

    Nested Cross-File Server Functions (issue #7213)

    + + {result &&
    {result}
    } + {error &&
    Error: {error}
    } +
    + ) +} diff --git a/e2e/react-start/server-functions/src/routes/shared-package-server-fn.tsx b/e2e/react-start/server-functions/src/routes/shared-package-server-fn.tsx new file mode 100644 index 0000000000..816089e9af --- /dev/null +++ b/e2e/react-start/server-functions/src/routes/shared-package-server-fn.tsx @@ -0,0 +1,44 @@ +import { createFileRoute } from '@tanstack/react-router' +import * as React from 'react' +import { sharedServerFn } from '@tanstack/react-start-e2e-shared-server-fns' + +/** + * Regression test for https://github.com/TanStack/router/issues/7213 covering + * server functions defined in a SEPARATE package. + * + * `sharedServerFn` is exported by a workspace package and called from the client + * here. Its handler calls `sharedInnerServerFn`, which lives in that same package + * and is only reachable through the handler — i.e. a server-only function defined + * outside the app root, behind a handler boundary. In production this used to + * fail at runtime with "Server function info not found" because the inner + * function was never registered in the manifest. + */ +export const Route = createFileRoute('/shared-package-server-fn')({ + component: RouteComponent, +}) + +function RouteComponent() { + const [result, setResult] = React.useState(null) + const [error, setError] = React.useState(null) + + async function handleClick() { + try { + setResult(JSON.stringify(await sharedServerFn())) + setError(null) + } catch (e) { + setError(e instanceof Error ? e.message : String(e)) + setResult(null) + } + } + + return ( +
    +

    Server Function From a Separate Package (issue #7213)

    + + {result &&
    {result}
    } + {error &&
    Error: {error}
    } +
    + ) +} diff --git a/e2e/react-start/server-functions/tests/server-functions.spec.ts b/e2e/react-start/server-functions/tests/server-functions.spec.ts index 5bb458d61c..b68e9197f3 100644 --- a/e2e/react-start/server-functions/tests/server-functions.spec.ts +++ b/e2e/react-start/server-functions/tests/server-functions.spec.ts @@ -718,6 +718,102 @@ test('server-only imports in middleware.server() are stripped from client build' ).toContainText('test-header-value') }) +test('server function reached only through a cross-file middleware is registered in the manifest (issue #7213)', async ({ + page, +}) => { + // Regression test for https://github.com/TanStack/router/issues/7213. + // A middleware defined in a separate file calls a server function defined in + // yet another separate file, and that middleware is applied to a server + // function. In production builds this used to fail at runtime with + // "Server function info not found for [ID]" because the server function that + // is only reachable through the middleware was never registered in the + // server function manifest. It worked in dev and when everything lived in a + // single file. + await page.goto('/middleware/serverfn-in-middleware') + + await page.waitForLoadState('networkidle') + + // Invoke the server function whose middleware calls a cross-file server fn. + await page.getByTestId('test-serverfn-in-middleware-btn').click() + + // The middleware's server-fn call must resolve without a manifest lookup error. + await expect( + page.getByTestId('serverfn-in-middleware-result'), + ).toContainText('hello from server fn called by middleware') + + // No "Server function info not found" (or any other) error should surface. + await expect( + page.getByTestId('serverfn-in-middleware-error'), + ).toHaveCount(0) +}) + +test('server function called only from another server function is registered in the manifest (issue #7213)', async ({ + page, +}) => { + // Sibling of the issue #7213 case: `fnOnlyCalledByServer` lives in its own + // file and is only ever invoked from inside `proxyFnThatCallsServerOnlyFn`'s + // handler (never from client code). Its handler-body reference is stripped + // from the caller module during the server transform, so — like the + // middleware case — it used to be absent from the production manifest and + // failed at runtime with "Server function info not found for [ID]". + await page.goto('/server-only-fn') + + await page.waitForLoadState('networkidle') + + await page.getByTestId('test-server-only-fn-btn').click() + + // The nested server-only function must resolve and return its real result. + const expected = await page + .getByTestId('expected-server-only-fn-result') + .textContent() + await expect(page.getByTestId('server-only-fn-result')).toHaveText( + expected ?? '', + ) + await expect(page.getByTestId('server-only-fn-result')).toContainText( + 'hello from server-only function', + ) +}) + +test('server functions discovered across a multi-level cross-file chain (issue #7213)', async ({ + page, +}) => { + // chainLevelA (client-called) -> chainLevelB (handler) -> chainLevelC (handler), + // each in its own file. levelC is only reachable through levelB's handler, so + // it is discovered only once the provider-module discovery fixpoint iterates a + // second time. If that didn't happen, the nested call would fail at runtime + // with "Server function info not found". + await page.goto('/nested-server-fns') + + await page.waitForLoadState('networkidle') + + await page.getByTestId('test-nested-server-fns-btn').click() + + await expect(page.getByTestId('nested-server-fns-result')).toContainText( + 'deepest-chain-value', + ) + await expect(page.getByTestId('nested-server-fns-error')).toHaveCount(0) +}) + +test('server function in a separate package resolves its nested server-only fn (issue #7213)', async ({ + page, +}) => { + // `sharedServerFn` is exported by a separate workspace package and called from + // the client. Its handler calls `sharedInnerServerFn`, a server-only function + // in that same package — i.e. defined OUTSIDE the app root and reachable only + // through a handler. This used to fail in production with "Server function info + // not found" because functions outside the app root were not discovered. + await page.goto('/shared-package-server-fn') + + await page.waitForLoadState('networkidle') + + await page.getByTestId('test-shared-package-btn').click() + + await expect(page.getByTestId('shared-package-result')).toContainText( + 'from-shared-package-inner', + ) + await expect(page.getByTestId('shared-package-error')).toHaveCount(0) +}) + test('middleware factories with server-only imports are stripped from client build', async ({ page, }) => { diff --git a/e2e/react-start/server-routes-global-middleware/package.json b/e2e/react-start/server-routes-global-middleware/package.json index 0757885b5c..f5c37a00e0 100644 --- a/e2e/react-start/server-routes-global-middleware/package.json +++ b/e2e/react-start/server-routes-global-middleware/package.json @@ -18,7 +18,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/react-start/server-routes/package.json b/e2e/react-start/server-routes/package.json index 41d6c6743b..201ece3dda 100644 --- a/e2e/react-start/server-routes/package.json +++ b/e2e/react-start/server-routes/package.json @@ -25,7 +25,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/js-cookie": "^3.0.6", diff --git a/e2e/react-start/split-base-and-basepath/package.json b/e2e/react-start/split-base-and-basepath/package.json index 5f4e7a14c1..751e75586b 100644 --- a/e2e/react-start/split-base-and-basepath/package.json +++ b/e2e/react-start/split-base-and-basepath/package.json @@ -20,7 +20,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "@types/react": "^19.0.8", diff --git a/e2e/react-start/start-manifest/package.json b/e2e/react-start/start-manifest/package.json index 7c932cb5d5..ebda3b2160 100644 --- a/e2e/react-start/start-manifest/package.json +++ b/e2e/react-start/start-manifest/package.json @@ -15,7 +15,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "@types/react": "^19.0.8", diff --git a/e2e/react-start/static-server-functions/package.json b/e2e/react-start/static-server-functions/package.json index 47d8a73156..84d72fee03 100644 --- a/e2e/react-start/static-server-functions/package.json +++ b/e2e/react-start/static-server-functions/package.json @@ -20,7 +20,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:*", "@types/node": "^22.10.2", "@types/react": "^19.0.8", diff --git a/e2e/react-start/streaming-ssr/package.json b/e2e/react-start/streaming-ssr/package.json index 0cbadeae74..d1e585ade8 100644 --- a/e2e/react-start/streaming-ssr/package.json +++ b/e2e/react-start/streaming-ssr/package.json @@ -21,7 +21,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "@types/react": "^19.0.8", diff --git a/e2e/react-start/transform-asset-urls/package.json b/e2e/react-start/transform-asset-urls/package.json index 40ffdd2569..979f7c4f76 100644 --- a/e2e/react-start/transform-asset-urls/package.json +++ b/e2e/react-start/transform-asset-urls/package.json @@ -40,7 +40,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "@types/react": "^19.0.8", diff --git a/e2e/react-start/virtual-routes/package.json b/e2e/react-start/virtual-routes/package.json index 0ba0855037..938f770947 100644 --- a/e2e/react-start/virtual-routes/package.json +++ b/e2e/react-start/virtual-routes/package.json @@ -23,7 +23,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/react-start/website/package.json b/e2e/react-start/website/package.json index ad1ab75d5b..2e7c1363bb 100644 --- a/e2e/react-start/website/package.json +++ b/e2e/react-start/website/package.json @@ -22,7 +22,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/solid-router/basepath-file-based/package.json b/e2e/solid-router/basepath-file-based/package.json index a026e7da87..4b27235857 100644 --- a/e2e/solid-router/basepath-file-based/package.json +++ b/e2e/solid-router/basepath-file-based/package.json @@ -17,7 +17,7 @@ "solid-js": "^1.9.10" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "vite-plugin-solid": "^2.11.11", "vite": "^8.0.14" diff --git a/e2e/solid-router/basic-esbuild-file-based/package.json b/e2e/solid-router/basic-esbuild-file-based/package.json index ff950365a5..5fd22b3474 100644 --- a/e2e/solid-router/basic-esbuild-file-based/package.json +++ b/e2e/solid-router/basic-esbuild-file-based/package.json @@ -18,7 +18,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "esbuild": "^0.27.4", "esbuild-plugin-solid": "^0.6.0" diff --git a/e2e/solid-router/basic-file-based-code-splitting/package.json b/e2e/solid-router/basic-file-based-code-splitting/package.json index d18f13a208..a970ce9e5a 100644 --- a/e2e/solid-router/basic-file-based-code-splitting/package.json +++ b/e2e/solid-router/basic-file-based-code-splitting/package.json @@ -20,7 +20,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "vite": "^8.0.14", "vite-plugin-solid": "^2.11.11" diff --git a/e2e/solid-router/basic-file-based/package.json b/e2e/solid-router/basic-file-based/package.json index 3d4b26633a..53dfa340ee 100644 --- a/e2e/solid-router/basic-file-based/package.json +++ b/e2e/solid-router/basic-file-based/package.json @@ -22,7 +22,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "combinate": "^1.1.11", "vite": "^8.0.14", diff --git a/e2e/solid-router/basic-scroll-restoration/package.json b/e2e/solid-router/basic-scroll-restoration/package.json index 94c64398cf..88a97d8c60 100644 --- a/e2e/solid-router/basic-scroll-restoration/package.json +++ b/e2e/solid-router/basic-scroll-restoration/package.json @@ -20,7 +20,7 @@ "tailwindcss": "^4.2.2" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "vite": "^8.0.14", "vite-plugin-solid": "^2.11.11", diff --git a/e2e/solid-router/basic-solid-query-file-based/package.json b/e2e/solid-router/basic-solid-query-file-based/package.json index 77d3df28d8..fbd773493c 100644 --- a/e2e/solid-router/basic-solid-query-file-based/package.json +++ b/e2e/solid-router/basic-solid-query-file-based/package.json @@ -23,7 +23,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "vite": "^8.0.14", "vite-plugin-solid": "^2.11.11" diff --git a/e2e/solid-router/basic-solid-query/package.json b/e2e/solid-router/basic-solid-query/package.json index aad0845b10..b0cb6d4712 100644 --- a/e2e/solid-router/basic-solid-query/package.json +++ b/e2e/solid-router/basic-solid-query/package.json @@ -21,7 +21,7 @@ "tailwindcss": "^4.2.2" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "vite": "^8.0.14", "vite-plugin-solid": "^2.11.11" diff --git a/e2e/solid-router/basic-virtual-file-based/package.json b/e2e/solid-router/basic-virtual-file-based/package.json index ee1565fd7d..0a0a8eb849 100644 --- a/e2e/solid-router/basic-virtual-file-based/package.json +++ b/e2e/solid-router/basic-virtual-file-based/package.json @@ -22,7 +22,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "vite": "^8.0.14", "vite-plugin-solid": "^2.11.11" diff --git a/e2e/solid-router/basic-virtual-named-export-config-file-based/package.json b/e2e/solid-router/basic-virtual-named-export-config-file-based/package.json index bc222e7d25..803d6a139e 100644 --- a/e2e/solid-router/basic-virtual-named-export-config-file-based/package.json +++ b/e2e/solid-router/basic-virtual-named-export-config-file-based/package.json @@ -22,7 +22,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "vite": "^8.0.14", "vite-plugin-solid": "^2.11.11" diff --git a/e2e/solid-router/basic/package.json b/e2e/solid-router/basic/package.json index 0ccbef8581..0c89f513e7 100644 --- a/e2e/solid-router/basic/package.json +++ b/e2e/solid-router/basic/package.json @@ -19,7 +19,7 @@ "tailwindcss": "^4.2.2" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "vite": "^8.0.14", "vite-plugin-solid": "^2.11.11" diff --git a/e2e/solid-router/generator-cli-only/package.json b/e2e/solid-router/generator-cli-only/package.json index 1d6718af6b..81678d6a70 100644 --- a/e2e/solid-router/generator-cli-only/package.json +++ b/e2e/solid-router/generator-cli-only/package.json @@ -20,7 +20,7 @@ "tailwindcss": "^4.2.2" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "vite-plugin-solid": "^2.11.11", "vite": "^8.0.14" diff --git a/e2e/solid-router/js-only-file-based/package.json b/e2e/solid-router/js-only-file-based/package.json index 755415c99e..fa288bcf4d 100644 --- a/e2e/solid-router/js-only-file-based/package.json +++ b/e2e/solid-router/js-only-file-based/package.json @@ -19,7 +19,7 @@ "tailwindcss": "^4.2.2" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@tanstack/router-plugin": "workspace:^", "vite-plugin-solid": "^2.11.11", diff --git a/e2e/solid-router/rspack-basic-file-based/package.json b/e2e/solid-router/rspack-basic-file-based/package.json index 5641433737..a7f558f57c 100644 --- a/e2e/solid-router/rspack-basic-file-based/package.json +++ b/e2e/solid-router/rspack-basic-file-based/package.json @@ -16,7 +16,7 @@ "solid-js": "^1.9.10" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.11", "@rsbuild/plugin-babel": "^1.1.2", "@rsbuild/plugin-solid": "^1.1.1", diff --git a/e2e/solid-router/rspack-basic-virtual-named-export-config-file-based/package.json b/e2e/solid-router/rspack-basic-virtual-named-export-config-file-based/package.json index f298b42ca6..a6ca91d17f 100644 --- a/e2e/solid-router/rspack-basic-virtual-named-export-config-file-based/package.json +++ b/e2e/solid-router/rspack-basic-virtual-named-export-config-file-based/package.json @@ -16,7 +16,7 @@ "solid-js": "^1.9.10" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.11", "@rsbuild/plugin-babel": "^1.1.2", "@rsbuild/plugin-solid": "^1.1.1", diff --git a/e2e/solid-router/scroll-restoration-sandbox-vite/package.json b/e2e/solid-router/scroll-restoration-sandbox-vite/package.json index 7b0c690a68..06bc438114 100644 --- a/e2e/solid-router/scroll-restoration-sandbox-vite/package.json +++ b/e2e/solid-router/scroll-restoration-sandbox-vite/package.json @@ -24,7 +24,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "vite": "^8.0.14", "vite-plugin-solid": "^2.11.11" diff --git a/e2e/solid-router/sentry-integration/package.json b/e2e/solid-router/sentry-integration/package.json index b3c8a52b88..84ea4bb90e 100644 --- a/e2e/solid-router/sentry-integration/package.json +++ b/e2e/solid-router/sentry-integration/package.json @@ -22,7 +22,7 @@ "tailwindcss": "^4.2.2" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "vite-plugin-solid": "^2.11.11", "vite": "^8.0.14" diff --git a/e2e/solid-router/view-transitions/package.json b/e2e/solid-router/view-transitions/package.json index 67a28f584c..f047fcec11 100644 --- a/e2e/solid-router/view-transitions/package.json +++ b/e2e/solid-router/view-transitions/package.json @@ -21,7 +21,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "typescript": "^6.0.2", "vite": "^8.0.14", diff --git a/e2e/solid-start/basic-auth/package.json b/e2e/solid-start/basic-auth/package.json index dc99d114fe..2e32dd3cba 100644 --- a/e2e/solid-start/basic-auth/package.json +++ b/e2e/solid-start/basic-auth/package.json @@ -24,7 +24,7 @@ "tailwind-merge": "^3.6.0" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/solid-start/basic-cloudflare/package.json b/e2e/solid-start/basic-cloudflare/package.json index 9026db1619..0433f7e35b 100644 --- a/e2e/solid-start/basic-cloudflare/package.json +++ b/e2e/solid-start/basic-cloudflare/package.json @@ -20,7 +20,7 @@ }, "devDependencies": { "@cloudflare/vite-plugin": "^1.29.0", - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/solid-start/basic-solid-query/package.json b/e2e/solid-start/basic-solid-query/package.json index 210f02afcc..4af9bdad34 100644 --- a/e2e/solid-start/basic-solid-query/package.json +++ b/e2e/solid-start/basic-solid-query/package.json @@ -24,7 +24,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/solid-start/basic/package.json b/e2e/solid-start/basic/package.json index 1993225f61..2092b8b301 100644 --- a/e2e/solid-start/basic/package.json +++ b/e2e/solid-start/basic/package.json @@ -26,7 +26,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.11", "@rsbuild/plugin-babel": "^1.1.2", "@rsbuild/plugin-solid": "^1.1.1", diff --git a/e2e/solid-start/csp/package.json b/e2e/solid-start/csp/package.json index 0457f7a908..4124d87aee 100644 --- a/e2e/solid-start/csp/package.json +++ b/e2e/solid-start/csp/package.json @@ -16,7 +16,7 @@ "solid-js": "^1.9.10" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "srvx": "^0.11.9", diff --git a/e2e/solid-start/css-modules/package.json b/e2e/solid-start/css-modules/package.json index e6d052ba65..9939806556 100644 --- a/e2e/solid-start/css-modules/package.json +++ b/e2e/solid-start/css-modules/package.json @@ -19,7 +19,7 @@ "solid-js": "^1.9.10" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:*", "@types/node": "^22.10.2", "sass": "^1.97.2", diff --git a/e2e/solid-start/custom-basepath/package.json b/e2e/solid-start/custom-basepath/package.json index 363a2e0453..219c87c883 100644 --- a/e2e/solid-start/custom-basepath/package.json +++ b/e2e/solid-start/custom-basepath/package.json @@ -19,7 +19,7 @@ "solid-js": "^1.9.10" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/express": "^5.0.6", diff --git a/e2e/solid-start/query-integration/package.json b/e2e/solid-start/query-integration/package.json index e7c9604edb..df10d5fe32 100644 --- a/e2e/solid-start/query-integration/package.json +++ b/e2e/solid-start/query-integration/package.json @@ -23,7 +23,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/solid-start/scroll-restoration/package.json b/e2e/solid-start/scroll-restoration/package.json index 87951c16ea..d4177790fd 100644 --- a/e2e/solid-start/scroll-restoration/package.json +++ b/e2e/solid-start/scroll-restoration/package.json @@ -21,7 +21,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/solid-start/server-functions/package.json b/e2e/solid-start/server-functions/package.json index ab4a3335b4..978e43f6cd 100644 --- a/e2e/solid-start/server-functions/package.json +++ b/e2e/solid-start/server-functions/package.json @@ -24,7 +24,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/js-cookie": "^3.0.6", diff --git a/e2e/solid-start/server-routes/package.json b/e2e/solid-start/server-routes/package.json index 2a8de94070..5f59515d8e 100644 --- a/e2e/solid-start/server-routes/package.json +++ b/e2e/solid-start/server-routes/package.json @@ -24,7 +24,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/js-cookie": "^3.0.6", diff --git a/e2e/solid-start/solid-query-layout-suspense/package.json b/e2e/solid-start/solid-query-layout-suspense/package.json index 512e6ea7b7..9e97c1a7c0 100644 --- a/e2e/solid-start/solid-query-layout-suspense/package.json +++ b/e2e/solid-start/solid-query-layout-suspense/package.json @@ -16,7 +16,7 @@ "solid-js": "^1.9.10" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "typescript": "^6.0.2", diff --git a/e2e/solid-start/start-manifest/package.json b/e2e/solid-start/start-manifest/package.json index 262dd23d9a..1cec90d994 100644 --- a/e2e/solid-start/start-manifest/package.json +++ b/e2e/solid-start/start-manifest/package.json @@ -15,7 +15,7 @@ "solid-js": "^1.9.10" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "srvx": "^0.11.9", diff --git a/e2e/solid-start/virtual-routes/package.json b/e2e/solid-start/virtual-routes/package.json index 93b73fa52f..5f61a98b82 100644 --- a/e2e/solid-start/virtual-routes/package.json +++ b/e2e/solid-start/virtual-routes/package.json @@ -22,7 +22,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/solid-start/website/package.json b/e2e/solid-start/website/package.json index 7379e5ca5f..d8c93ba240 100644 --- a/e2e/solid-start/website/package.json +++ b/e2e/solid-start/website/package.json @@ -21,7 +21,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/vue-router/basepath-file-based/package.json b/e2e/vue-router/basepath-file-based/package.json index 4e3deac1c7..0ed990a8ff 100644 --- a/e2e/vue-router/basepath-file-based/package.json +++ b/e2e/vue-router/basepath-file-based/package.json @@ -22,7 +22,7 @@ "vue": "^3.5.16" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", diff --git a/e2e/vue-router/basic-esbuild-file-based/package.json b/e2e/vue-router/basic-esbuild-file-based/package.json index e5422cd436..e27d749899 100644 --- a/e2e/vue-router/basic-esbuild-file-based/package.json +++ b/e2e/vue-router/basic-esbuild-file-based/package.json @@ -20,7 +20,7 @@ }, "devDependencies": { "@eslint/js": "^9.36.0", - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@typescript-eslint/eslint-plugin": "^8.44.1", "@typescript-eslint/parser": "^8.44.1", diff --git a/e2e/vue-router/basic-file-based-jsx/package.json b/e2e/vue-router/basic-file-based-jsx/package.json index b029b1ab4f..e4d20d72e9 100644 --- a/e2e/vue-router/basic-file-based-jsx/package.json +++ b/e2e/vue-router/basic-file-based-jsx/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@eslint/js": "^9.36.0", - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@typescript-eslint/eslint-plugin": "^8.44.1", "@typescript-eslint/parser": "^8.44.1", diff --git a/e2e/vue-router/basic-file-based-sfc/package.json b/e2e/vue-router/basic-file-based-sfc/package.json index 369a0b1fdc..0f1934b9a9 100644 --- a/e2e/vue-router/basic-file-based-sfc/package.json +++ b/e2e/vue-router/basic-file-based-sfc/package.json @@ -21,7 +21,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", diff --git a/e2e/vue-router/basic-scroll-restoration/package.json b/e2e/vue-router/basic-scroll-restoration/package.json index daa2519eed..86c91c62ca 100644 --- a/e2e/vue-router/basic-scroll-restoration/package.json +++ b/e2e/vue-router/basic-scroll-restoration/package.json @@ -20,7 +20,7 @@ "tailwindcss": "^4.2.2" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", diff --git a/e2e/vue-router/basic-virtual-file-based/package.json b/e2e/vue-router/basic-virtual-file-based/package.json index 946addb3bf..3a341e0e7d 100644 --- a/e2e/vue-router/basic-virtual-file-based/package.json +++ b/e2e/vue-router/basic-virtual-file-based/package.json @@ -23,7 +23,7 @@ "vue": "^3.5.16" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", diff --git a/e2e/vue-router/basic-virtual-named-export-config-file-based/package.json b/e2e/vue-router/basic-virtual-named-export-config-file-based/package.json index f73d3ad8b2..08815d8265 100644 --- a/e2e/vue-router/basic-virtual-named-export-config-file-based/package.json +++ b/e2e/vue-router/basic-virtual-named-export-config-file-based/package.json @@ -23,7 +23,7 @@ "vue": "^3.5.16" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", diff --git a/e2e/vue-router/basic-vue-query-file-based/package.json b/e2e/vue-router/basic-vue-query-file-based/package.json index 75395b20f8..2cd6d23ba0 100644 --- a/e2e/vue-router/basic-vue-query-file-based/package.json +++ b/e2e/vue-router/basic-vue-query-file-based/package.json @@ -23,7 +23,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", diff --git a/e2e/vue-router/basic-vue-query/package.json b/e2e/vue-router/basic-vue-query/package.json index be46a064c6..288d96018d 100644 --- a/e2e/vue-router/basic-vue-query/package.json +++ b/e2e/vue-router/basic-vue-query/package.json @@ -21,7 +21,7 @@ "vue": "^3.5.16" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", diff --git a/e2e/vue-router/basic/package.json b/e2e/vue-router/basic/package.json index c779a572e9..ce95750e12 100644 --- a/e2e/vue-router/basic/package.json +++ b/e2e/vue-router/basic/package.json @@ -19,7 +19,7 @@ "vue": "^3.5.16" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@vitejs/plugin-vue-jsx": "^5.1.5", "typescript": "~5.8.3", diff --git a/e2e/vue-router/generator-cli-only/package.json b/e2e/vue-router/generator-cli-only/package.json index 14cdafcd48..410a14b742 100644 --- a/e2e/vue-router/generator-cli-only/package.json +++ b/e2e/vue-router/generator-cli-only/package.json @@ -20,7 +20,7 @@ "tailwindcss": "^4.2.2" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", diff --git a/e2e/vue-router/js-only-file-based/package.json b/e2e/vue-router/js-only-file-based/package.json index 05a86b7cf1..d7f062038e 100644 --- a/e2e/vue-router/js-only-file-based/package.json +++ b/e2e/vue-router/js-only-file-based/package.json @@ -22,7 +22,7 @@ "vue": "^3.5.16" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", diff --git a/e2e/vue-router/rspack-basic-file-based/package.json b/e2e/vue-router/rspack-basic-file-based/package.json index 5d8a072d87..ba0ae7efde 100644 --- a/e2e/vue-router/rspack-basic-file-based/package.json +++ b/e2e/vue-router/rspack-basic-file-based/package.json @@ -16,7 +16,7 @@ "vue": "^3.5.16" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.11", "@rsbuild/plugin-babel": "^1.1.2", "@rsbuild/plugin-vue": "^1.2.7", diff --git a/e2e/vue-router/rspack-basic-virtual-named-export-config-file-based/package.json b/e2e/vue-router/rspack-basic-virtual-named-export-config-file-based/package.json index 11f61237d3..9b55dcc6f9 100644 --- a/e2e/vue-router/rspack-basic-virtual-named-export-config-file-based/package.json +++ b/e2e/vue-router/rspack-basic-virtual-named-export-config-file-based/package.json @@ -16,7 +16,7 @@ "vue": "^3.5.16" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.11", "@rsbuild/plugin-babel": "^1.1.2", "@rsbuild/plugin-vue": "^1.2.7", diff --git a/e2e/vue-router/scroll-restoration-sandbox-vite/package.json b/e2e/vue-router/scroll-restoration-sandbox-vite/package.json index a7dc67fd6b..ebcea6fb39 100644 --- a/e2e/vue-router/scroll-restoration-sandbox-vite/package.json +++ b/e2e/vue-router/scroll-restoration-sandbox-vite/package.json @@ -24,7 +24,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", diff --git a/e2e/vue-router/sentry-integration/package.json b/e2e/vue-router/sentry-integration/package.json index cbf6bf8499..897331f1b8 100644 --- a/e2e/vue-router/sentry-integration/package.json +++ b/e2e/vue-router/sentry-integration/package.json @@ -22,7 +22,7 @@ "vue": "^3.5.16" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@vitejs/plugin-vue-jsx": "^5.1.5", "typescript": "~5.8.3", diff --git a/e2e/vue-router/view-transitions/package.json b/e2e/vue-router/view-transitions/package.json index 493b3e45ce..82f88dbe64 100644 --- a/e2e/vue-router/view-transitions/package.json +++ b/e2e/vue-router/view-transitions/package.json @@ -22,7 +22,7 @@ "vue": "^3.5.16" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@vitejs/plugin-vue": "^6.0.5", "@vitejs/plugin-vue-jsx": "^5.1.5", diff --git a/e2e/vue-start/basic-auth/package.json b/e2e/vue-start/basic-auth/package.json index 3a572536e9..25de0c6b80 100644 --- a/e2e/vue-start/basic-auth/package.json +++ b/e2e/vue-start/basic-auth/package.json @@ -24,7 +24,7 @@ "vue": "^3.5.25" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/vue-start/basic-cloudflare/package.json b/e2e/vue-start/basic-cloudflare/package.json index c7e55f7937..05b2158c0e 100644 --- a/e2e/vue-start/basic-cloudflare/package.json +++ b/e2e/vue-start/basic-cloudflare/package.json @@ -20,7 +20,7 @@ }, "devDependencies": { "@cloudflare/vite-plugin": "^1.29.0", - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/vue-start/basic-vue-query/package.json b/e2e/vue-start/basic-vue-query/package.json index 3189e8e867..6b1335d8bd 100644 --- a/e2e/vue-start/basic-vue-query/package.json +++ b/e2e/vue-start/basic-vue-query/package.json @@ -24,7 +24,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/vue-start/basic/package.json b/e2e/vue-start/basic/package.json index 073627701a..dacbcc2154 100644 --- a/e2e/vue-start/basic/package.json +++ b/e2e/vue-start/basic/package.json @@ -26,7 +26,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@rsbuild/core": "^2.0.11", "@rsbuild/plugin-babel": "^1.0.5", "@rsbuild/plugin-vue": "^1.2.2", diff --git a/e2e/vue-start/css-modules/package.json b/e2e/vue-start/css-modules/package.json index 9b7d36333d..7e28e9d5a8 100644 --- a/e2e/vue-start/css-modules/package.json +++ b/e2e/vue-start/css-modules/package.json @@ -19,7 +19,7 @@ "vue": "^3.5.16" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:*", "@types/node": "^22.10.2", "@vitejs/plugin-vue-jsx": "^5.1.5", diff --git a/e2e/vue-start/custom-basepath/package.json b/e2e/vue-start/custom-basepath/package.json index 759e13b48e..3d0208de01 100644 --- a/e2e/vue-start/custom-basepath/package.json +++ b/e2e/vue-start/custom-basepath/package.json @@ -19,7 +19,7 @@ "vue": "^3.5.25" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/express": "^5.0.6", diff --git a/e2e/vue-start/query-integration/package.json b/e2e/vue-start/query-integration/package.json index d44bd58376..4cb22b48be 100644 --- a/e2e/vue-start/query-integration/package.json +++ b/e2e/vue-start/query-integration/package.json @@ -23,7 +23,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/vue-start/scroll-restoration/package.json b/e2e/vue-start/scroll-restoration/package.json index 871200e852..cbc04f23ec 100644 --- a/e2e/vue-start/scroll-restoration/package.json +++ b/e2e/vue-start/scroll-restoration/package.json @@ -21,7 +21,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/vue-start/server-functions/package.json b/e2e/vue-start/server-functions/package.json index 2e84c6238e..5752c48b73 100644 --- a/e2e/vue-start/server-functions/package.json +++ b/e2e/vue-start/server-functions/package.json @@ -24,7 +24,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/js-cookie": "^3.0.6", diff --git a/e2e/vue-start/server-routes/package.json b/e2e/vue-start/server-routes/package.json index 6e5c7cdced..4f9db26152 100644 --- a/e2e/vue-start/server-routes/package.json +++ b/e2e/vue-start/server-routes/package.json @@ -24,7 +24,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/js-cookie": "^3.0.6", diff --git a/e2e/vue-start/start-manifest/package.json b/e2e/vue-start/start-manifest/package.json index 841aa5da85..358e8e0c04 100644 --- a/e2e/vue-start/start-manifest/package.json +++ b/e2e/vue-start/start-manifest/package.json @@ -15,7 +15,7 @@ "vue": "^3.5.16" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", "@vitejs/plugin-vue-jsx": "^5.1.5", diff --git a/e2e/vue-start/virtual-routes/package.json b/e2e/vue-start/virtual-routes/package.json index 41b1355414..6c2011e1ea 100644 --- a/e2e/vue-start/virtual-routes/package.json +++ b/e2e/vue-start/virtual-routes/package.json @@ -22,7 +22,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/e2e/vue-start/website/package.json b/e2e/vue-start/website/package.json index 8ec13f6dbc..bfbb042de5 100644 --- a/e2e/vue-start/website/package.json +++ b/e2e/vue-start/website/package.json @@ -21,7 +21,7 @@ "zod": "^4.4.3" }, "devDependencies": { - "@playwright/test": "^1.50.1", + "@playwright/test": "^1.61.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-e2e-utils": "workspace:^", "@types/node": "^22.10.2", diff --git a/packages/start-plugin-core/src/vite/start-compiler-plugin/plugin.ts b/packages/start-plugin-core/src/vite/start-compiler-plugin/plugin.ts index 6309b76eb2..be6771c8ea 100644 --- a/packages/start-plugin-core/src/vite/start-compiler-plugin/plugin.ts +++ b/packages/start-plugin-core/src/vite/start-compiler-plugin/plugin.ts @@ -26,6 +26,7 @@ import { decodeViteDevServerModuleSpecifier, } from './module-specifier' import { mergeHotUpdateModules } from './hot-update' +import { ensureServerModuleGraphTransformed } from './server-fn-graph-crawl' import type { CompileStartFrameworkOptions, StartCompilerImportTransform, @@ -613,7 +614,7 @@ export function startCompilerPlugin( applyToEnvironment: (env) => { return appliedResolverEnvironments.has(env.name) }, - load() { + async load(id) { if (this.environment.name !== opts.providerEnvName) { const mod = opts.environments.find( (e) => e.name === this.environment.name, @@ -631,11 +632,30 @@ export function startCompilerPlugin( return getDevServerFnValidatorModule() } - // When SSR is the provider, server-only-referenced functions aren't in the manifest, - // so no isClientReferenced check is needed. - // When SSR is NOT the provider (custom provider env), server-only-referenced - // functions ARE in the manifest and need the isClientReferenced check to - // block direct client HTTP requests to server-only-referenced functions. + // When SSR is the provider, this resolver is generated inside the same + // server build that discovers server functions, and its one-shot `load` + // can run before the graph is fully transformed. Server functions only + // reachable from server-only code (a middleware `.server()` body, or + // another server function's handler) are registered into `serverFnsById` + // as a side effect of being transformed, so snapshotting now would leave + // them out of the manifest and calls would fail at runtime with + // "Server function info not found". Force the reachable server graph to be + // transformed first so discovery is complete before we snapshot. + // + // When SSR is NOT the provider, the provider environment builds after the + // client and SSR environments, so `serverFnsById` is already complete by + // the time this runs and no crawl is needed. + if (ssrIsProvider) { + await ensureServerModuleGraphTransformed(this, id, root, serverFnsById) + } + + // When SSR is the provider, server functions are callable both in-process + // on the server (createSsrRpc, origin 'server') and directly from the + // client over HTTP, so no isClientReferenced gate is applied — matching + // the RSC/rsbuild behavior for this configuration. + // When SSR is NOT the provider (custom provider env), the isClientReferenced + // check is applied so direct client HTTP requests to server-only-referenced + // functions can be blocked at the provider layer. return generateServerFnResolverModule({ serverFnsById, includeClientReferencedCheck: !ssrIsProvider, diff --git a/packages/start-plugin-core/src/vite/start-compiler-plugin/server-fn-graph-crawl.ts b/packages/start-plugin-core/src/vite/start-compiler-plugin/server-fn-graph-crawl.ts new file mode 100644 index 0000000000..c28aaa77cc --- /dev/null +++ b/packages/start-plugin-core/src/vite/start-compiler-plugin/server-fn-graph-crawl.ts @@ -0,0 +1,147 @@ +import { TRANSFORM_ID_REGEX } from '../../constants' +import { cleanId } from '../../start-compiler/utils' +import type { ServerFn } from '../../start-compiler/types' + +/** + * The subset of the Rollup/Vite plugin context that the discovery crawl needs. + */ +export type ServerFnGraphCrawlContext = { + getModuleIds: () => IterableIterator + load: (options: { + id: string + resolveDependencies?: boolean + }) => Promise<{ + importedIds: ReadonlyArray + dynamicallyImportedIds: ReadonlyArray + } | null> +} + +/** + * Should this module be *walked* (loaded, then its imports followed) when + * discovering server functions? + * + * The graph BFS is bounded to the application's own source. The framework + * runtime — which is what imports the resolver virtual module and pulls in a + * large dependency graph — lives in `node_modules` / outside the project root, + * so this bound both keeps the walk cheap and, crucially, prevents it from + * wandering into the framework and re-entering the resolver module that is + * currently being generated. + * + * Note this only gates which modules' *imports we follow*. Server functions + * defined outside the root (e.g. in a shared package) are still discovered — + * see the provider-module phase in `ensureServerModuleGraphTransformed`. + */ +export function shouldWalkForServerFns(id: string, root: string): boolean { + // Virtual modules (Vite/Rollup prefix their ids with a NUL byte) never + // contain user server functions and can pull in the resolver itself. Check + // the raw id, since `cleanId` strips the leading NUL byte. + if (id.startsWith('\0')) { + return false + } + const cleaned = cleanId(id) + if (cleaned.includes('/node_modules/')) { + return false + } + // Require a path boundary (`root/…`) so a sibling directory that merely shares + // a name prefix (e.g. `-other`) is not treated as being under the root. + if (!cleaned.startsWith(`${root}/`)) { + return false + } + return TRANSFORM_ID_REGEX.some((pattern) => { + pattern.lastIndex = 0 + return pattern.test(cleaned) + }) +} + +/** + * Eagerly transform the modules that can contribute server functions before the + * caller snapshots `serverFnsById`. + * + * This does not change what ends up in the bundle (these modules are part of the + * server build regardless) — it only forces the transform side effect, and thus + * server-function discovery, to run before the one-shot resolver module is + * generated. Without it, server functions reachable only from server-only code + * (a middleware `.server()` body or another server function's handler) can be + * discovered after the resolver has already been generated, leaving them out of + * the manifest. + */ +export async function ensureServerModuleGraphTransformed( + ctx: ServerFnGraphCrawlContext, + selfId: string, + root: string, + serverFnsById: Record, +): Promise { + const visited = new Set([selfId]) + + // Phase 1 — walk the application's own source graph (bounded to avoid the + // framework runtime). `resolveDependencies` loads each module's direct imports, + // registering server functions referenced from bodies that survive the + // server-side transform (most notably middleware `.server()` handlers, which + // are not stripped on the server), and following imports reaches app modules + // not yet in the graph. + const queue = [...ctx.getModuleIds()].filter((id) => + shouldWalkForServerFns(id, root), + ) + while (queue.length > 0) { + const moduleId = queue.pop()! + if (visited.has(moduleId)) { + continue + } + visited.add(moduleId) + + if (!shouldWalkForServerFns(moduleId, root)) { + continue + } + + let info + try { + info = await ctx.load({ id: moduleId, resolveDependencies: true }) + } catch { + // Unloadable ids are not part of server-fn discovery. + continue + } + if (!info) { + continue + } + + for (const dep of info.importedIds) { + if (!visited.has(dep)) { + queue.push(dep) + } + } + for (const dep of info.dynamicallyImportedIds) { + if (!visited.has(dep)) { + queue.push(dep) + } + } + } + + // Phase 2 — a server function invoked from a *handler* body is dropped from the + // caller module (the handler becomes an RPC stub), so Phase 1's imports miss + // it. Its `?tss-serverfn-split` provider module keeps the handler body intact, + // so loading that provider module (with its direct dependencies) registers the + // server functions it calls. + // + // Unlike Phase 1 this is NOT bounded by the project root: a provider id always + // refers to a user/shared server-function implementation (never the framework + // runtime), so it is safe and bounded to load regardless of where the function + // is defined — this is what lets server functions defined in external packages + // be discovered. We only load these modules (we do not follow their imports) + // to stay bounded, and iterate until no new server functions appear. + let previousCount = -1 + while (Object.keys(serverFnsById).length !== previousCount) { + previousCount = Object.keys(serverFnsById).length + for (const fn of Object.values(serverFnsById)) { + const providerId = fn.extractedFilename + if (visited.has(providerId)) { + continue + } + visited.add(providerId) + try { + await ctx.load({ id: providerId, resolveDependencies: true }) + } catch { + // Provider module not loadable in isolation — skip. + } + } + } +} diff --git a/packages/start-plugin-core/tests/should-walk-for-server-fns.test.ts b/packages/start-plugin-core/tests/should-walk-for-server-fns.test.ts new file mode 100644 index 0000000000..b19b68ed4b --- /dev/null +++ b/packages/start-plugin-core/tests/should-walk-for-server-fns.test.ts @@ -0,0 +1,57 @@ +import { describe, expect, test } from 'vitest' +import { shouldWalkForServerFns } from '../src/vite/start-compiler-plugin/server-fn-graph-crawl' + +// `shouldWalkForServerFns` bounds the server-function discovery walk to the +// application's own source. These cases pin the boundary behavior that the e2e +// tests cannot observe (they pass regardless of which discovery phase resolves +// a function). +describe('shouldWalkForServerFns', () => { + const root = '/repo/e2e/react-start/server-functions' + + test('walks transformable files beneath the root', () => { + expect(shouldWalkForServerFns(`${root}/src/routes/index.tsx`, root)).toBe( + true, + ) + expect(shouldWalkForServerFns(`${root}/src/functions/fn.ts`, root)).toBe( + true, + ) + }) + + test('does not walk a sibling directory that shares a name prefix', () => { + // Without a path boundary, `startsWith(root)` would wrongly match this + // sibling — which is exactly the layout of the e2e fixture package + // (`server-functions` vs `server-functions-shared-lib`). + expect( + shouldWalkForServerFns(`${root}-shared-lib/src/index.ts`, root), + ).toBe(false) + }) + + test('ignores query strings when checking the path', () => { + expect( + shouldWalkForServerFns(`${root}/src/fn.ts?tss-serverfn-split`, root), + ).toBe(true) + }) + + test('does not walk node_modules, virtual modules, or non-transformable files', () => { + expect( + shouldWalkForServerFns(`${root}/node_modules/pkg/index.js`, root), + ).toBe(false) + expect( + shouldWalkForServerFns( + '\0virtual:tanstack-start-server-fn-resolver', + root, + ), + ).toBe(false) + // A NUL-prefixed virtual id that mirrors a real path under the root would + // pass the root + extension checks once cleaned, so the guard must inspect + // the raw id. + expect(shouldWalkForServerFns(`\0${root}/src/virtual.ts`, root)).toBe(false) + expect(shouldWalkForServerFns(`${root}/src/app.css`, root)).toBe(false) + }) + + test('does not walk files outside the root', () => { + expect(shouldWalkForServerFns('/repo/some/other/place/fn.ts', root)).toBe( + false, + ) + }) +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 96847b4044..5ba309f9d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,7 +15,7 @@ overrides: eslint: ^9.22.0 vite: ^8.0.14 '@types/node': 25.0.9 - '@playwright/test': ^1.57.0 + '@playwright/test': ^1.61.0 '@tanstack/query-core': ^5.99.0 '@tanstack/react-query': ^5.99.0 '@tanstack/solid-query': ^5.99.0 @@ -80,8 +80,8 @@ importers: specifier: 22.7.5 version: 22.7.5(nx@22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(typescript@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3)) '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@swc-node/core': specifier: ^1.14.1 version: 1.14.1(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26) @@ -566,8 +566,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -609,8 +609,8 @@ importers: version: 4.2.2 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -652,8 +652,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -698,8 +698,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -747,8 +747,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -796,8 +796,8 @@ importers: version: 4.2.2 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -851,8 +851,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -897,8 +897,8 @@ importers: version: 4.2.2 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -952,8 +952,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1004,8 +1004,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1038,8 +1038,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1084,8 +1084,8 @@ importers: version: 4.2.2 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1124,8 +1124,8 @@ importers: specifier: ^2.4.0 version: 2.4.0(babel-plugin-macros@3.1.0) '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1176,8 +1176,8 @@ importers: version: 4.2.2 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1210,8 +1210,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1244,8 +1244,8 @@ importers: version: 0.5.1 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.11 version: 2.0.14 @@ -1296,8 +1296,8 @@ importers: version: 0.5.1 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.11 version: 2.0.14 @@ -1363,8 +1363,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1415,8 +1415,8 @@ importers: version: 4.2.2 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1464,8 +1464,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1519,8 +1519,8 @@ importers: version: 3.6.0 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.11 version: 2.0.14 @@ -1604,8 +1604,8 @@ importers: version: 3.6.0 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -1662,8 +1662,8 @@ importers: specifier: ^1.29.0 version: 1.29.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(workerd@1.20260317.1)(wrangler@4.75.0) '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -1732,8 +1732,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -1830,8 +1830,8 @@ importers: version: 3.6.0 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -1876,8 +1876,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1922,8 +1922,8 @@ importers: version: 0.11.15 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.11 version: 2.0.14 @@ -1971,8 +1971,8 @@ importers: specifier: ^1.29.0 version: 1.29.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(workerd@1.20260317.1)(wrangler@4.75.0) '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:* version: link:../../e2e-utils @@ -2032,8 +2032,8 @@ importers: version: 0.5.1 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -2093,8 +2093,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.11 version: 2.0.14 @@ -2197,8 +2197,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-core': specifier: workspace:* version: link:../../../packages/router-core @@ -2249,8 +2249,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -2341,8 +2341,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.11 version: 2.0.14 @@ -2402,8 +2402,8 @@ importers: specifier: ^2.4.0 version: 2.4.0(babel-plugin-macros@3.1.0) '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -2451,8 +2451,8 @@ importers: version: 3.3.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.11 version: 2.0.14 @@ -2500,8 +2500,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -2561,8 +2561,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -2610,8 +2610,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.11 version: 2.0.14 @@ -2671,8 +2671,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -2729,8 +2729,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -2775,8 +2775,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.8 version: 2.0.8 @@ -2830,8 +2830,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -2987,6 +2987,9 @@ importers: '@tanstack/react-start': specifier: workspace:* version: link:../../../packages/react-start + '@tanstack/react-start-e2e-shared-server-fns': + specifier: workspace:* + version: link:../server-functions-shared-lib js-cookie: specifier: ^3.0.5 version: 3.0.5 @@ -3007,8 +3010,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.11 version: 2.0.14 @@ -3071,8 +3074,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -3104,6 +3107,12 @@ importers: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) + e2e/react-start/server-functions-shared-lib: + devDependencies: + '@tanstack/react-start': + specifier: workspace:* + version: link:../../../packages/react-start + e2e/react-start/server-routes: dependencies: '@tanstack/react-query': @@ -3141,8 +3150,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -3196,8 +3205,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -3291,8 +3300,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3334,8 +3343,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3383,8 +3392,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:* version: link:../../e2e-utils @@ -3429,8 +3438,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3472,8 +3481,8 @@ importers: version: 19.2.3(react@19.2.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3530,8 +3539,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -3594,8 +3603,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -3643,8 +3652,8 @@ importers: version: 1.9.12 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3677,8 +3686,8 @@ importers: version: 4.2.2 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3711,8 +3720,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3751,8 +3760,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3791,8 +3800,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3828,8 +3837,8 @@ importers: version: 4.2.2 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3871,8 +3880,8 @@ importers: version: 4.2.2 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3917,8 +3926,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3960,8 +3969,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4003,8 +4012,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4040,8 +4049,8 @@ importers: version: 4.2.2 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4074,8 +4083,8 @@ importers: version: 4.2.2 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4105,8 +4114,8 @@ importers: version: 1.9.12 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.11 version: 2.0.14 @@ -4151,8 +4160,8 @@ importers: version: 1.9.12 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.11 version: 2.0.14 @@ -4212,8 +4221,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4255,8 +4264,8 @@ importers: version: 4.2.2 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4295,8 +4304,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4344,8 +4353,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.11 version: 2.0.14 @@ -4420,8 +4429,8 @@ importers: version: 3.6.0 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4472,8 +4481,8 @@ importers: specifier: ^1.29.0 version: 1.29.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(workerd@1.20260317.1)(wrangler@4.75.0) '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4533,8 +4542,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4607,8 +4616,8 @@ importers: version: 1.9.12 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4641,8 +4650,8 @@ importers: version: 1.9.12 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:* version: link:../../e2e-utils @@ -4687,8 +4696,8 @@ importers: version: 1.9.12 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4794,8 +4803,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4843,8 +4852,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -4987,8 +4996,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5054,8 +5063,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5103,8 +5112,8 @@ importers: version: 1.9.12 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5171,8 +5180,8 @@ importers: version: 1.9.12 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5220,8 +5229,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5275,8 +5284,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -5333,8 +5342,8 @@ importers: version: 3.5.25(typescript@5.8.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5376,8 +5385,8 @@ importers: version: 3.5.25(typescript@5.8.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5422,8 +5431,8 @@ importers: specifier: ^9.36.0 version: 9.36.0 '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5483,8 +5492,8 @@ importers: specifier: ^9.36.0 version: 9.36.0 '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5544,8 +5553,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5590,8 +5599,8 @@ importers: version: 3.5.25(typescript@5.9.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5645,8 +5654,8 @@ importers: version: 3.5.25(typescript@5.8.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5700,8 +5709,8 @@ importers: version: 3.5.25(typescript@5.8.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5749,8 +5758,8 @@ importers: version: 3.5.25(typescript@5.8.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5804,8 +5813,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5850,8 +5859,8 @@ importers: version: 3.5.25(typescript@5.8.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5902,8 +5911,8 @@ importers: version: 3.5.25(typescript@6.0.2) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5933,8 +5942,8 @@ importers: version: 3.5.25(typescript@6.0.2) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.11 version: 2.0.14 @@ -5988,8 +5997,8 @@ importers: version: 3.5.25(typescript@6.0.2) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.11 version: 2.0.14 @@ -6055,8 +6064,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -6107,8 +6116,8 @@ importers: version: 3.5.25(typescript@5.8.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -6156,8 +6165,8 @@ importers: version: 3.5.25(typescript@5.8.3) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -6211,8 +6220,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@rsbuild/core': specifier: ^2.0.11 version: 2.0.14 @@ -6293,8 +6302,8 @@ importers: version: 3.5.25(typescript@6.0.2) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -6348,8 +6357,8 @@ importers: specifier: ^1.29.0 version: 1.29.1(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(workerd@1.20260317.1)(wrangler@4.75.0) '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -6449,8 +6458,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -6492,8 +6501,8 @@ importers: version: 3.5.25(typescript@6.0.2) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:* version: link:../../e2e-utils @@ -6538,8 +6547,8 @@ importers: version: 3.5.25(typescript@6.0.2) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -6608,8 +6617,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -6660,8 +6669,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -6816,8 +6825,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -6886,8 +6895,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -6975,8 +6984,8 @@ importers: version: 3.5.25(typescript@6.0.2) devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -7024,8 +7033,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -7082,8 +7091,8 @@ importers: version: 4.4.3 devDependencies: '@playwright/test': - specifier: ^1.57.0 - version: 1.58.0 + specifier: ^1.61.0 + version: 1.61.1 '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -17180,8 +17189,8 @@ packages: engines: {node: '>=22.6.0'} hasBin: true - '@playwright/test@1.58.0': - resolution: {integrity: sha512-fWza+Lpbj6SkQKCrU6si4iu+fD2dD3gxNHFhUPxsfXBPhnv3rRSQVd0NtBUT9Z/RhF/boCBcuUaMUSTRTopjZg==} + '@playwright/test@1.61.1': + resolution: {integrity: sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==} engines: {node: '>=18'} hasBin: true @@ -24396,13 +24405,13 @@ packages: resolution: {integrity: sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==} engines: {node: '>=16.0.0'} - playwright-core@1.58.0: - resolution: {integrity: sha512-aaoB1RWrdNi3//rOeKuMiS65UCcgOVljU46At6eFcOFPFHWtd2weHRRow6z/n+Lec0Lvu0k9ZPKJSjPugikirw==} + playwright-core@1.61.1: + resolution: {integrity: sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==} engines: {node: '>=18'} hasBin: true - playwright@1.58.0: - resolution: {integrity: sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ==} + playwright@1.61.1: + resolution: {integrity: sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==} engines: {node: '>=18'} hasBin: true @@ -30656,9 +30665,9 @@ snapshots: pprof-to-md: 0.1.0 react-pprof: 1.4.0 - '@playwright/test@1.58.0': + '@playwright/test@1.61.1': dependencies: - playwright: 1.58.0 + playwright: 1.61.1 '@polka/url@1.0.0-next.28': {} @@ -39105,11 +39114,11 @@ snapshots: pvutils: 1.1.3 tslib: 2.8.1 - playwright-core@1.58.0: {} + playwright-core@1.61.1: {} - playwright@1.58.0: + playwright@1.61.1: dependencies: - playwright-core: 1.58.0 + playwright-core: 1.61.1 optionalDependencies: fsevents: 2.3.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index de56e54dd7..3e8713ab2f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -40,7 +40,7 @@ catalog: eslint: ^9.22.0 vite: ^8.0.14 '@types/node': 25.0.9 - '@playwright/test': ^1.57.0 + '@playwright/test': ^1.61.0 '@tanstack/query-core': ^5.99.0 '@tanstack/react-query': ^5.99.0 '@tanstack/solid-query': ^5.99.0