From ce618ae41922712b02112a0ebe0ab27a291a3352 Mon Sep 17 00:00:00 2001 From: Brenley Dueck Date: Wed, 15 Jan 2025 21:07:40 -0600 Subject: [PATCH 1/7] Adopt tanstack server fn plugin --- packages/start/config/index.js | 50 ++-- packages/start/package.json | 2 +- packages/start/src/runtime/server-handler.ts | 84 ++++-- pnpm-lock.yaml | 296 ++++++++++++++++--- 4 files changed, 344 insertions(+), 88 deletions(-) diff --git a/packages/start/config/index.js b/packages/start/config/index.js index 0b53874cc..8d5ec9870 100644 --- a/packages/start/config/index.js +++ b/packages/start/config/index.js @@ -1,5 +1,4 @@ -import { serverFunctions } from "@vinxi/server-functions/plugin"; -import { server as serverFunctionServer, serverTransform } from "@vinxi/server-functions/server"; +import { createTanStackServerFnPlugin } from "@tanstack/server-functions-plugin"; import defu from "defu"; import { existsSync } from "node:fs"; import { join } from "node:path"; @@ -37,6 +36,35 @@ function solidStartServerFsRouter(config) { app ); } +const SolidStartServerFnsPlugin = createTanStackServerFnPlugin({ + // This is the ID that will be available to look up and import + // our server function manifest and resolve its module + manifestVirtualImportId: "solidstart:server-fn-manifest", + client: { + getRuntimeCode: () => + `import { createServerReference } from "${normalize( + fileURLToPath(new URL("../dist/runtime/server-runtime.js", import.meta.url)) + )}"`, + replacer: opts => + `createServerReference($$fn$$, '${opts.functionId}', '${opts.extractedFilename}')` + }, + ssr: { + getRuntimeCode: () => + `import { createServerReference } from '${normalize( + fileURLToPath(new URL("../dist/runtime/server-fns-runtime.js", import.meta.url)) + )}'`, + replacer: opts => + `createServerReference($$fn$$, '${opts.functionId}', '${opts.extractedFilename}')` + }, + server: { + getRuntimeCode: () => + `import { createServerReference } from '${normalize( + fileURLToPath(new URL("../dist/runtime/server-fns-runtime.js", import.meta.url)) + )}'`, + replacer: opts => + `createServerReference($$fn$$, '${opts.functionId}', '${opts.extractedFilename}')` + } +}); export function defineConfig(baseConfig = {}) { let { vite = {}, ...start } = baseConfig; @@ -112,11 +140,7 @@ export function defineConfig(baseConfig = {}) { } }), ...plugins, - serverTransform({ - runtime: normalize( - fileURLToPath(new URL("../dist/runtime/server-fns-runtime.js", import.meta.url)) - ) - }), + SolidStartServerFnsPlugin.ssr, start.experimental.islands ? serverComponents.server() : null, solid({ ...start.solid, ssr: true, extensions: extensions.map(ext => `.${ext}`) }), config("app-server", { @@ -177,11 +201,7 @@ export function defineConfig(baseConfig = {}) { } }), ...plugins, - serverFunctions.client({ - runtime: normalize( - fileURLToPath(new URL("../dist/runtime/server-runtime.js", import.meta.url)) - ) - }), + SolidStartServerFnsPlugin.client, start.experimental.islands ? serverComponents.client() : null, solid({ ...start.solid, ssr: start.ssr, extensions: extensions.map(ext => `.${ext}`) }), config("app-client", { @@ -247,11 +267,7 @@ export function defineConfig(baseConfig = {}) { cacheDir: "node_modules/.vinxi/server-fns" }), ...plugins, - serverFunctionServer({ - runtime: normalize( - fileURLToPath(new URL("../dist/runtime/server-fns-runtime.js", import.meta.url)) - ) - }), + SolidStartServerFnsPlugin.server, start.experimental.islands ? serverComponents.server() : null, solid({ ...start.solid, ssr: true, extensions: extensions.map(ext => `.${ext}`) }), config("app-server", { diff --git a/packages/start/package.json b/packages/start/package.json index 62d9a0e77..b7ec93274 100644 --- a/packages/start/package.json +++ b/packages/start/package.json @@ -66,7 +66,7 @@ "dependencies": { "@vinxi/plugin-directives": "^0.4.3", "@vinxi/server-components": "^0.4.3", - "@vinxi/server-functions": "^0.4.3", + "@tanstack/server-functions-plugin": "^1.97.2", "defu": "^6.1.2", "error-stack-parser": "^2.1.4", "html-to-image": "^1.11.11", diff --git a/packages/start/src/runtime/server-handler.ts b/packages/start/src/runtime/server-handler.ts index 560d7be9e..4caf6ce90 100644 --- a/packages/start/src/runtime/server-handler.ts +++ b/packages/start/src/runtime/server-handler.ts @@ -16,13 +16,21 @@ import { import { sharedConfig } from "solid-js"; import { renderToString } from "solid-js/web"; import { provideRequestEvent } from "solid-js/web/storage"; -import { eventHandler, parseCookies, setHeader, setResponseStatus, type HTTPEvent } from "vinxi/http"; +import { + eventHandler, + parseCookies, + setHeader, + setResponseStatus, + type HTTPEvent +} from "vinxi/http"; import invariant from "vinxi/lib/invariant"; import { cloneEvent, getFetchEvent, mergeResponseHeaders } from "../server/fetchEvent"; import { getExpectedRedirectStatus } from "../server/handler"; import { createPageEvent } from "../server/pageEvent"; // @ts-ignore import { FetchEvent, PageEvent } from "../server"; +// @ts-ignore +import serverFnManifest from "solidstart:server-fn-manifest"; function createChunk(data: string) { const encodeData = new TextEncoder().encode(data); @@ -78,19 +86,28 @@ async function handleServerFunction(h3Event: HTTPEvent) { const instance = request.headers.get("X-Server-Instance"); const singleFlight = request.headers.has("X-Single-Flight"); const url = new URL(request.url); - let filepath: string | undefined | null, name: string | undefined | null; + let functionId: string | undefined | null, name: string | undefined | null; if (serverReference) { invariant(typeof serverReference === "string", "Invalid server function"); - [filepath, name] = serverReference.split("#"); + [functionId, name] = serverReference.split("#"); } else { - filepath = url.searchParams.get("id"); + functionId = url.searchParams.get("id"); name = url.searchParams.get("name"); - if (!filepath || !name) throw new Error("Invalid request"); + if (!functionId || !name) throw new Error("Invalid request"); } + const serverFnInfo = serverFnManifest[functionId]; - const serverFunction = ( - await import.meta.env.MANIFEST[import.meta.env.ROUTER_NAME]!.chunks[filepath!]!.import() - )[name!]; + let fnModule: undefined | { [key: string]: any }; + + if (process.env.NODE_ENV === "development") { + fnModule = await (globalThis as any).app + .getRouter("server-fns") + .internals.devServer.ssrLoadModule(serverFnInfo.extractedFilename); + } else { + fnModule = await serverFnInfo.importer(); + } + + const serverFunction = fnModule![serverFnInfo.functionName]; let parsed: any[] = []; // grab bound arguments from url when no JS @@ -100,19 +117,19 @@ async function handleServerFunction(h3Event: HTTPEvent) { const json = JSON.parse(args); (json.t ? (fromJSON(json, { - plugins: [ - CustomEventPlugin, - DOMExceptionPlugin, - EventPlugin, - FormDataPlugin, - HeadersPlugin, - ReadableStreamPlugin, - RequestPlugin, - ResponsePlugin, - URLSearchParamsPlugin, - URLPlugin - ] - }) as any) + plugins: [ + CustomEventPlugin, + DOMExceptionPlugin, + EventPlugin, + FormDataPlugin, + HeadersPlugin, + ReadableStreamPlugin, + RequestPlugin, + ResponsePlugin, + URLSearchParamsPlugin, + URLPlugin + ] + }) as any) : json ).forEach((arg: any) => parsed.push(arg)); } @@ -130,7 +147,8 @@ async function handleServerFunction(h3Event: HTTPEvent) { const isReadableStream = h3Request instanceof ReadableStream; const hasReadableStream = (h3Request as EdgeIncomingMessage).body instanceof ReadableStream; const isH3EventBodyStreamLocked = - (isReadableStream && h3Request.locked) || (hasReadableStream && ((h3Request as EdgeIncomingMessage).body as ReadableStream).locked); + (isReadableStream && h3Request.locked) || + (hasReadableStream && ((h3Request as EdgeIncomingMessage).body as ReadableStream).locked); const requestBody = isReadableStream ? h3Request : h3Request.body; if ( @@ -176,7 +194,7 @@ async function handleServerFunction(h3Event: HTTPEvent) { /* @ts-ignore */ sharedConfig.context = { event }; event.locals.serverFunctionMeta = { - id: filepath + "#" + name + id: functionId + "#" + name }; return serverFunction(...parsed); }); @@ -254,13 +272,15 @@ function handleNoJS(result: any, request: Request, parsed: any[], thrown?: boole if (result) { headers.append( "Set-Cookie", - `flash=${encodeURIComponent(JSON.stringify({ - url: url.pathname + url.search, - result: isError ? result.message : result, - thrown: thrown, - error: isError, - input: [...parsed.slice(0, -1), [...parsed[parsed.length - 1].entries()]] - }))}; Secure; HttpOnly;` + `flash=${encodeURIComponent( + JSON.stringify({ + url: url.pathname + url.search, + result: isError ? result.message : result, + thrown: thrown, + error: isError, + input: [...parsed.slice(0, -1), [...parsed[parsed.length - 1].entries()]] + }) + )}; Secure; HttpOnly;` ); } return new Response(null, { @@ -284,7 +304,7 @@ function createSingleFlightHeaders(sourceEvent: FetchEvent) { useH3Internals = true; sourceEvent.nativeEvent.node.req.headers.cookie = ""; } - SetCookies.forEach((cookie) => { + SetCookies.forEach(cookie => { if (!cookie) return; const keyValue = cookie.split(";")[0]!; const [key, value] = keyValue.split("="); @@ -293,7 +313,7 @@ function createSingleFlightHeaders(sourceEvent: FetchEvent) { Object.entries(cookies).forEach(([key, value]) => { headers.append("cookie", `${key}=${value}`); useH3Internals && (sourceEvent.nativeEvent.node.req.headers.cookie += `${key}=${value};`); - }) + }); return headers; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7055bac77..ec75e07ca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -554,15 +554,15 @@ importers: packages/start: dependencies: + '@tanstack/server-functions-plugin': + specifier: ^1.97.2 + version: 1.97.2 '@vinxi/plugin-directives': specifier: ^0.4.3 version: 0.4.3(vinxi@0.4.3(@opentelemetry/api@1.9.0)(@types/node@22.8.1)(debug@4.3.7)(ioredis@5.4.1)(lightningcss@1.27.0)(terser@5.36.0)) '@vinxi/server-components': specifier: ^0.4.3 version: 0.4.3(vinxi@0.4.3(@opentelemetry/api@1.9.0)(@types/node@22.8.1)(debug@4.3.7)(ioredis@5.4.1)(lightningcss@1.27.0)(terser@5.36.0)) - '@vinxi/server-functions': - specifier: ^0.4.3 - version: 0.4.3(vinxi@0.4.3(@opentelemetry/api@1.9.0)(@types/node@22.8.1)(debug@4.3.7)(ioredis@5.4.1)(lightningcss@1.27.0)(terser@5.36.0)) defu: specifier: ^6.1.2 version: 6.1.4 @@ -652,6 +652,10 @@ packages: resolution: {integrity: sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.24.4': resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} engines: {node: '>=6.9.0'} @@ -672,6 +676,10 @@ packages: resolution: {integrity: sha512-WYvQviPw+Qyib0v92AwNIrdLISTp7RfDkM7bPqBvpbnhY4wq8HvHBZREVdYDXk98C8BkOIVnHAY3yvj7AVISxQ==} engines: {node: '>=6.9.0'} + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.24.5': resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} engines: {node: '>=6.9.0'} @@ -680,6 +688,10 @@ packages: resolution: {integrity: sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA==} engines: {node: '>=6.9.0'} + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.25.9': resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} @@ -738,6 +750,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.25.9': resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} @@ -804,6 +822,10 @@ packages: resolution: {integrity: sha512-oKWp3+usOJSzDZOucZUAMayhPz/xVjzymyDzUN8dk0Wd3RWMlGLXi07UCQ/CgQVb8LvXx3XBajJH4XGgkt7H7g==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.5': resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} engines: {node: '>=6.9.0'} @@ -822,6 +844,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-syntax-jsx@7.24.1': resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} engines: {node: '>=6.9.0'} @@ -888,6 +915,10 @@ packages: resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.26.5': + resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.24.5': resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} engines: {node: '>=6.9.0'} @@ -896,6 +927,10 @@ packages: resolution: {integrity: sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} + engines: {node: '>=6.9.0'} + '@changesets/apply-release-plan@7.0.5': resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} @@ -2723,6 +2758,14 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20' + '@tanstack/directive-functions-plugin@1.97.2': + resolution: {integrity: sha512-xuLMveOQqt0LCe1j1jzhSMeStFjC7bJ3nbiHtLVk1n2e84TbOLqd3Qwf6UECphO+ScENe02gt9ETQohaDcXyVA==} + engines: {node: '>=12'} + + '@tanstack/server-functions-plugin@1.97.2': + resolution: {integrity: sha512-8TZFE4iIezcAnIMmOigDNxFiNczDmNqYGO/sRljLImRlDmP+aQh2ohcSF4eU5PHZ1lBt/NdmpffMTcAG38HoAQ==} + engines: {node: '>=12'} + '@testing-library/dom@10.4.0': resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} @@ -2751,6 +2794,9 @@ packages: '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/babel__code-frame@7.0.6': + resolution: {integrity: sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -2763,6 +2809,9 @@ packages: '@types/babel__traverse@7.20.5': resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/better-sqlite3@7.6.11': resolution: {integrity: sha512-i8KcD3PgGtGBLl3+mMYA8PdKkButvPyARxA7IQAd6qeslht13qxb1zzO8dRCtE7U3IoJS782zDBAeoKiM695kg==} @@ -2778,6 +2827,9 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/diff@6.0.0': + resolution: {integrity: sha512-dhVCYGv3ZSbzmQaBSagrv1WJ6rXCdkyTcDyoNu1MD8JohI7pR7k8wdZEm+mvdxRKXyHVwckFzWU1vJc+Z29MlA==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -3288,6 +3340,9 @@ packages: b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + babel-dead-code-elimination@1.0.8: + resolution: {integrity: sha512-og6HQERk0Cmm+nTT4Od2wbPtgABXFMPaHACjbKLulZIFMkYyXZLkUGuAxdgpMJBrxyt/XFpSz++lNzjbcMnPkQ==} + babel-plugin-jsx-dom-expressions@0.37.20: resolution: {integrity: sha512-0L3aC5EFyvCgIlEYIqJb4Ym29s1IDI/U5SntZ1ZK054xe0MqBmBi2GLK3f9AOklhdY7kCC3GsHD0bILh6u0Qsg==} peerDependencies: @@ -3704,6 +3759,14 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -3775,6 +3838,10 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -6902,6 +6969,12 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.24.4': {} '@babel/compat-data@7.25.9': {} @@ -6966,9 +7039,29 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.5 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/generator@7.24.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.9 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 @@ -6980,6 +7073,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 + '@babel/generator@7.26.5': + dependencies: + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + '@babel/helper-annotate-as-pure@7.25.9': dependencies: '@babel/types': 7.25.9 @@ -7017,12 +7118,12 @@ snapshots: '@babel/helper-function-name@7.23.0': dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/template': 7.25.9 + '@babel/types': 7.25.9 '@babel/helper-hoist-variables@7.22.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.9 '@babel/helper-member-expression-to-functions@7.25.9': dependencies: @@ -7033,11 +7134,11 @@ snapshots: '@babel/helper-module-imports@7.18.6': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.9 '@babel/helper-module-imports@7.24.3': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.9 '@babel/helper-module-imports@7.25.9': dependencies: @@ -7075,6 +7176,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.5 + transitivePeerDependencies: + - supports-color + '@babel/helper-optimise-call-expression@7.25.9': dependencies: '@babel/types': 7.25.9 @@ -7094,7 +7204,7 @@ snapshots: '@babel/helper-simple-access@7.24.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.9 '@babel/helper-simple-access@7.25.9': dependencies: @@ -7112,7 +7222,7 @@ snapshots: '@babel/helper-split-export-declaration@7.24.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.9 '@babel/helper-string-parser@7.24.1': {} @@ -7128,9 +7238,9 @@ snapshots: '@babel/helpers@7.24.5': dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.25.9 transitivePeerDependencies: - supports-color @@ -7139,6 +7249,11 @@ snapshots: '@babel/template': 7.25.9 '@babel/types': 7.25.9 + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.5 + '@babel/highlight@7.24.5': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -7161,21 +7276,30 @@ snapshots: dependencies: '@babel/types': 7.25.9 + '@babel/parser@7.26.5': + dependencies: + '@babel/types': 7.26.5 + '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4)': dependencies: '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.25.9)': + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.24.4)': dependencies: - '@babel/core': 7.25.9 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4)': dependencies: '@babel/core': 7.24.4 @@ -7186,6 +7310,11 @@ snapshots: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -7227,26 +7356,26 @@ snapshots: '@babel/template@7.24.0': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/code-frame': 7.26.0 + '@babel/parser': 7.25.9 + '@babel/types': 7.25.9 '@babel/template@7.25.9': dependencies: - '@babel/code-frame': 7.25.9 - '@babel/parser': 7.25.9 - '@babel/types': 7.25.9 + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 '@babel/traverse@7.24.5': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 + '@babel/code-frame': 7.26.0 + '@babel/generator': 7.25.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.25.9 + '@babel/types': 7.25.9 debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: @@ -7254,7 +7383,7 @@ snapshots: '@babel/traverse@7.25.9': dependencies: - '@babel/code-frame': 7.25.9 + '@babel/code-frame': 7.26.0 '@babel/generator': 7.25.9 '@babel/parser': 7.25.9 '@babel/template': 7.25.9 @@ -7264,6 +7393,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.26.5': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.5 + '@babel/template': 7.25.9 + '@babel/types': 7.26.5 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.24.5': dependencies: '@babel/helper-string-parser': 7.24.1 @@ -7275,6 +7416,11 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@babel/types@7.26.5': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@changesets/apply-release-plan@7.0.5': dependencies: '@changesets/config': 3.0.3 @@ -8783,6 +8929,59 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.14 + '@tanstack/directive-functions-plugin@1.97.2': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.26.0 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.5 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 + '@types/babel__code-frame': 7.0.6 + '@types/babel__core': 7.20.5 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + '@types/diff': 6.0.0 + babel-dead-code-elimination: 1.0.8 + chalk: 5.3.0 + dedent: 1.5.3 + diff: 7.0.0 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + '@tanstack/server-functions-plugin@1.97.2': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.26.0 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.5 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 + '@tanstack/directive-functions-plugin': 1.97.2 + '@types/babel__code-frame': 7.0.6 + '@types/babel__core': 7.20.5 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + '@types/diff': 6.0.0 + babel-dead-code-elimination: 1.0.8 + chalk: 5.3.0 + dedent: 1.5.3 + diff: 7.0.0 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.26.0 @@ -8820,6 +9019,8 @@ snapshots: '@types/aria-query@5.0.4': {} + '@types/babel__code-frame@7.0.6': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.24.5 @@ -8830,16 +9031,20 @@ snapshots: '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.26.5 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 '@types/babel__traverse@7.20.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.9 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.5 '@types/better-sqlite3@7.6.11': dependencies: @@ -8855,6 +9060,8 @@ snapshots: dependencies: '@types/ms': 0.7.34 + '@types/diff@6.0.0': {} + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.6 @@ -9408,7 +9615,7 @@ snapshots: '@vue/compiler-core@3.5.13': dependencies: - '@babel/parser': 7.25.9 + '@babel/parser': 7.26.5 '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 @@ -9421,7 +9628,7 @@ snapshots: '@vue/compiler-sfc@3.5.13': dependencies: - '@babel/parser': 7.25.9 + '@babel/parser': 7.26.5 '@vue/compiler-core': 3.5.13 '@vue/compiler-dom': 3.5.13 '@vue/compiler-ssr': 3.5.13 @@ -9621,12 +9828,21 @@ snapshots: b4a@1.6.6: {} + babel-dead-code-elimination@1.0.8: + dependencies: + '@babel/core': 7.26.0 + '@babel/parser': 7.26.5 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 + transitivePeerDependencies: + - supports-color + babel-plugin-jsx-dom-expressions@0.37.20(@babel/core@7.24.4): dependencies: '@babel/core': 7.24.4 '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) - '@babel/types': 7.24.5 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.24.4) + '@babel/types': 7.25.9 html-entities: 2.3.3 validate-html-nesting: 1.2.2 @@ -9634,8 +9850,8 @@ snapshots: dependencies: '@babel/core': 7.25.9 '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.25.9) - '@babel/types': 7.24.5 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.25.9) + '@babel/types': 7.25.9 html-entities: 2.3.3 validate-html-nesting: 1.2.2 @@ -10030,6 +10246,8 @@ snapshots: dependencies: mimic-response: 3.1.0 + dedent@1.5.3: {} + deep-eql@5.0.2: {} deep-extend@0.6.0: {} @@ -10070,6 +10288,8 @@ snapshots: diff@5.2.0: {} + diff@7.0.0: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 From e7e40af91ef996fac6e1c1145c976e91fa20fe08 Mon Sep 17 00:00:00 2001 From: Brenley Dueck Date: Thu, 16 Jan 2025 12:17:29 -0600 Subject: [PATCH 2/7] Undo some formatting --- packages/start/src/runtime/server-handler.ts | 63 +++++++++----------- 1 file changed, 27 insertions(+), 36 deletions(-) diff --git a/packages/start/src/runtime/server-handler.ts b/packages/start/src/runtime/server-handler.ts index 4caf6ce90..a7d0794d5 100644 --- a/packages/start/src/runtime/server-handler.ts +++ b/packages/start/src/runtime/server-handler.ts @@ -16,13 +16,7 @@ import { import { sharedConfig } from "solid-js"; import { renderToString } from "solid-js/web"; import { provideRequestEvent } from "solid-js/web/storage"; -import { - eventHandler, - parseCookies, - setHeader, - setResponseStatus, - type HTTPEvent -} from "vinxi/http"; +import { eventHandler, parseCookies, setHeader, setResponseStatus, type HTTPEvent } from "vinxi/http"; import invariant from "vinxi/lib/invariant"; import { cloneEvent, getFetchEvent, mergeResponseHeaders } from "../server/fetchEvent"; import { getExpectedRedirectStatus } from "../server/handler"; @@ -95,8 +89,8 @@ async function handleServerFunction(h3Event: HTTPEvent) { name = url.searchParams.get("name"); if (!functionId || !name) throw new Error("Invalid request"); } - const serverFnInfo = serverFnManifest[functionId]; + const serverFnInfo = serverFnManifest[functionId]; let fnModule: undefined | { [key: string]: any }; if (process.env.NODE_ENV === "development") { @@ -106,8 +100,8 @@ async function handleServerFunction(h3Event: HTTPEvent) { } else { fnModule = await serverFnInfo.importer(); } - const serverFunction = fnModule![serverFnInfo.functionName]; + let parsed: any[] = []; // grab bound arguments from url when no JS @@ -117,19 +111,19 @@ async function handleServerFunction(h3Event: HTTPEvent) { const json = JSON.parse(args); (json.t ? (fromJSON(json, { - plugins: [ - CustomEventPlugin, - DOMExceptionPlugin, - EventPlugin, - FormDataPlugin, - HeadersPlugin, - ReadableStreamPlugin, - RequestPlugin, - ResponsePlugin, - URLSearchParamsPlugin, - URLPlugin - ] - }) as any) + plugins: [ + CustomEventPlugin, + DOMExceptionPlugin, + EventPlugin, + FormDataPlugin, + HeadersPlugin, + ReadableStreamPlugin, + RequestPlugin, + ResponsePlugin, + URLSearchParamsPlugin, + URLPlugin + ] + }) as any) : json ).forEach((arg: any) => parsed.push(arg)); } @@ -147,8 +141,7 @@ async function handleServerFunction(h3Event: HTTPEvent) { const isReadableStream = h3Request instanceof ReadableStream; const hasReadableStream = (h3Request as EdgeIncomingMessage).body instanceof ReadableStream; const isH3EventBodyStreamLocked = - (isReadableStream && h3Request.locked) || - (hasReadableStream && ((h3Request as EdgeIncomingMessage).body as ReadableStream).locked); + (isReadableStream && h3Request.locked) || (hasReadableStream && ((h3Request as EdgeIncomingMessage).body as ReadableStream).locked); const requestBody = isReadableStream ? h3Request : h3Request.body; if ( @@ -272,15 +265,13 @@ function handleNoJS(result: any, request: Request, parsed: any[], thrown?: boole if (result) { headers.append( "Set-Cookie", - `flash=${encodeURIComponent( - JSON.stringify({ - url: url.pathname + url.search, - result: isError ? result.message : result, - thrown: thrown, - error: isError, - input: [...parsed.slice(0, -1), [...parsed[parsed.length - 1].entries()]] - }) - )}; Secure; HttpOnly;` + `flash=${encodeURIComponent(JSON.stringify({ + url: url.pathname + url.search, + result: isError ? result.message : result, + thrown: thrown, + error: isError, + input: [...parsed.slice(0, -1), [...parsed[parsed.length - 1].entries()]] + }))}; Secure; HttpOnly;` ); } return new Response(null, { @@ -304,7 +295,7 @@ function createSingleFlightHeaders(sourceEvent: FetchEvent) { useH3Internals = true; sourceEvent.nativeEvent.node.req.headers.cookie = ""; } - SetCookies.forEach(cookie => { + SetCookies.forEach((cookie) => { if (!cookie) return; const keyValue = cookie.split(";")[0]!; const [key, value] = keyValue.split("="); @@ -313,7 +304,7 @@ function createSingleFlightHeaders(sourceEvent: FetchEvent) { Object.entries(cookies).forEach(([key, value]) => { headers.append("cookie", `${key}=${value}`); useH3Internals && (sourceEvent.nativeEvent.node.req.headers.cookie += `${key}=${value};`); - }); + }) return headers; } @@ -370,4 +361,4 @@ async function handleSingleFlight(sourceEvent: FetchEvent, result: any): Promise }); } -export default eventHandler(handleServerFunction); +export default eventHandler(handleServerFunction); \ No newline at end of file From 458931d5717c8ec017eae969eb150bd2957f65e8 Mon Sep 17 00:00:00 2001 From: Brenley Dueck Date: Thu, 16 Jan 2025 12:21:40 -0600 Subject: [PATCH 3/7] Fix CI --- docs/app.config.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/app.config.ts b/docs/app.config.ts index 27ce1e749..dd3a2d981 100644 --- a/docs/app.config.ts +++ b/docs/app.config.ts @@ -9,11 +9,13 @@ export default defineConfig({ alias: { "_mime": "mime/index.js" }, - rollupConfig: { - external: ["__STATIC_CONTENT_MANIFEST", "node:async_hooks"] - } }, vite: { + build: { + rollupOptions: { + external: ["__STATIC_CONTENT_MANIFEST", "node:async_hooks"] + }, + }, plugins: [ config("tailwind", { css: { From 83b29cdb3b71ab6ebf89bd5ac6622e46517bb174 Mon Sep 17 00:00:00 2001 From: Brenley Dueck Date: Thu, 23 Jan 2025 18:40:31 -0600 Subject: [PATCH 4/7] add changeset --- .changeset/violet-steaks-mate.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/violet-steaks-mate.md diff --git a/.changeset/violet-steaks-mate.md b/.changeset/violet-steaks-mate.md new file mode 100644 index 000000000..859adccfd --- /dev/null +++ b/.changeset/violet-steaks-mate.md @@ -0,0 +1,5 @@ +--- +"@solidjs/start": minor +--- + +Adopt tanstack server functions plugin From 45f0b7b2a75ebde6ca8067eff20283c2d1cf7c05 Mon Sep 17 00:00:00 2001 From: Brenley Dueck Date: Fri, 24 Jan 2025 21:46:40 -0600 Subject: [PATCH 5/7] fix function being included in client bundle --- packages/start/config/index.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/start/config/index.js b/packages/start/config/index.js index 8d5ec9870..64f5497ee 100644 --- a/packages/start/config/index.js +++ b/packages/start/config/index.js @@ -36,6 +36,7 @@ function solidStartServerFsRouter(config) { app ); } + const SolidStartServerFnsPlugin = createTanStackServerFnPlugin({ // This is the ID that will be available to look up and import // our server function manifest and resolve its module @@ -46,7 +47,7 @@ const SolidStartServerFnsPlugin = createTanStackServerFnPlugin({ fileURLToPath(new URL("../dist/runtime/server-runtime.js", import.meta.url)) )}"`, replacer: opts => - `createServerReference($$fn$$, '${opts.functionId}', '${opts.extractedFilename}')` + `createServerReference(${() => {}}, '${opts.functionId}', '${opts.extractedFilename}')` }, ssr: { getRuntimeCode: () => @@ -54,7 +55,7 @@ const SolidStartServerFnsPlugin = createTanStackServerFnPlugin({ fileURLToPath(new URL("../dist/runtime/server-fns-runtime.js", import.meta.url)) )}'`, replacer: opts => - `createServerReference($$fn$$, '${opts.functionId}', '${opts.extractedFilename}')` + `createServerReference(${opts.fn}, '${opts.functionId}', '${opts.extractedFilename}')` }, server: { getRuntimeCode: () => @@ -62,7 +63,7 @@ const SolidStartServerFnsPlugin = createTanStackServerFnPlugin({ fileURLToPath(new URL("../dist/runtime/server-fns-runtime.js", import.meta.url)) )}'`, replacer: opts => - `createServerReference($$fn$$, '${opts.functionId}', '${opts.extractedFilename}')` + `createServerReference(${opts.fn}, '${opts.functionId}', '${opts.extractedFilename}')` } }); From 8bedde146055bef231305cdd891fdf77ff4b6930 Mon Sep 17 00:00:00 2001 From: Birk Skyum <74932975+birkskyum@users.noreply.github.com> Date: Sun, 26 Jan 2025 21:09:52 +0100 Subject: [PATCH 6/7] Update violet-steaks-mate.md --- .changeset/violet-steaks-mate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/violet-steaks-mate.md b/.changeset/violet-steaks-mate.md index 859adccfd..a99ae1037 100644 --- a/.changeset/violet-steaks-mate.md +++ b/.changeset/violet-steaks-mate.md @@ -1,5 +1,5 @@ --- -"@solidjs/start": minor +"@solidjs/start": patch --- Adopt tanstack server functions plugin From 32bb7d82ef3904fc350c5e93775a2822f7ad0e24 Mon Sep 17 00:00:00 2001 From: Birk Skyum <74932975+birkskyum@users.noreply.github.com> Date: Mon, 27 Jan 2025 18:44:34 +0100 Subject: [PATCH 7/7] Link to tanstack --- packages/start/src/runtime/server-handler.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/start/src/runtime/server-handler.ts b/packages/start/src/runtime/server-handler.ts index a7d0794d5..97b9d72df 100644 --- a/packages/start/src/runtime/server-handler.ts +++ b/packages/start/src/runtime/server-handler.ts @@ -93,7 +93,13 @@ async function handleServerFunction(h3Event: HTTPEvent) { const serverFnInfo = serverFnManifest[functionId]; let fnModule: undefined | { [key: string]: any }; + if (process.env.NODE_ENV === "development") { + // In dev, we use Vinxi to get the "server" server-side router + // Then we use that router's devServer.ssrLoadModule to get the serverFn + + // This code comes from: + // https://github.com/TanStack/router/blob/266f5cc863cd1a99809d1af2669e58b6b6db9a67/packages/start-server-functions-handler/src/index.tsx#L83-L87 fnModule = await (globalThis as any).app .getRouter("server-fns") .internals.devServer.ssrLoadModule(serverFnInfo.extractedFilename); @@ -361,4 +367,4 @@ async function handleSingleFlight(sourceEvent: FetchEvent, result: any): Promise }); } -export default eventHandler(handleServerFunction); \ No newline at end of file +export default eventHandler(handleServerFunction);