From f329a3d14c6bb2746455c12acbe4a9329fd9875a Mon Sep 17 00:00:00 2001 From: Sheraff Date: Wed, 13 May 2026 23:54:20 +0200 Subject: [PATCH 1/5] fix: revert plugin changes, allow createMiddleware self compilation, fix HMR tests --- .../src/createCsrfMiddleware.ts | 9 ++- .../start-fn-stubs/src/createMiddleware.ts | 13 +++++ packages/start-fn-stubs/src/index.ts | 1 + .../src/start-compiler/compiler.ts | 2 + .../src/vite/start-compiler-plugin/plugin.ts | 55 ++++--------------- 5 files changed, 31 insertions(+), 49 deletions(-) create mode 100644 packages/start-fn-stubs/src/createMiddleware.ts diff --git a/packages/start-client-core/src/createCsrfMiddleware.ts b/packages/start-client-core/src/createCsrfMiddleware.ts index b7152d44a9..8bc4c90a22 100644 --- a/packages/start-client-core/src/createCsrfMiddleware.ts +++ b/packages/start-client-core/src/createCsrfMiddleware.ts @@ -1,5 +1,4 @@ -import { createIsomorphicFn } from '@tanstack/start-fn-stubs' -import { createMiddleware } from './createMiddleware' +import { createIsomorphicFn, createMiddleware } from '@tanstack/start-fn-stubs' import type { RequestMiddlewareAfterServer, RequestServerOptions, @@ -77,8 +76,8 @@ type CreateCsrfMiddleware = ( opts?: CsrfMiddlewareOptions, ) => RequestMiddlewareAfterServer<{}, undefined, undefined> -const innerCreateCsrfMiddleware: CreateCsrfMiddleware = (opts = {}) => { - const middleware = createMiddleware().server(async (ctx) => { +const innerCreateCsrfMiddleware = ((opts: any = {}) => { + const middleware = createMiddleware().server(async (ctx: any) => { const csrfCtx = ctx as RequestServerOptions & typeof ctx if (opts.filter && !(await opts.filter(csrfCtx))) { @@ -97,7 +96,7 @@ const innerCreateCsrfMiddleware: CreateCsrfMiddleware = (opts = {}) => { } return middleware -} +}) as any as CreateCsrfMiddleware export const createCsrfMiddleware: CreateCsrfMiddleware = createIsomorphicFn().server(innerCreateCsrfMiddleware) as CreateCsrfMiddleware diff --git a/packages/start-fn-stubs/src/createMiddleware.ts b/packages/start-fn-stubs/src/createMiddleware.ts new file mode 100644 index 0000000000..f61012d726 --- /dev/null +++ b/packages/start-fn-stubs/src/createMiddleware.ts @@ -0,0 +1,13 @@ +export function createMiddleware(opts?: any, opts2?: any): any { + const options = { ...(opts2 || opts) } + const proxy = new Proxy({}, { + get(_, prop) { + if (prop === 'options') return options + return (value: any) => { + options[prop] = value + return proxy + } + } + }) + return proxy +} \ No newline at end of file diff --git a/packages/start-fn-stubs/src/index.ts b/packages/start-fn-stubs/src/index.ts index 5ca646d9d1..1cd9d1f96d 100644 --- a/packages/start-fn-stubs/src/index.ts +++ b/packages/start-fn-stubs/src/index.ts @@ -5,5 +5,6 @@ export { type ClientOnlyFn, type IsomorphicFnBase, } from './createIsomorphicFn' +export { createMiddleware } from './createMiddleware' export { createServerOnlyFn, createClientOnlyFn } from './envOnly' diff --git a/packages/start-plugin-core/src/start-compiler/compiler.ts b/packages/start-plugin-core/src/start-compiler/compiler.ts index 9a950c65e2..5b7459f86a 100644 --- a/packages/start-plugin-core/src/start-compiler/compiler.ts +++ b/packages/start-plugin-core/src/start-compiler/compiler.ts @@ -694,6 +694,7 @@ export class StartCompiler { ['createIsomorphicFn', 'IsomorphicFn'], ['createServerOnlyFn', 'ServerOnlyFn'], ['createClientOnlyFn', 'ClientOnlyFn'], + ['createMiddleware', 'Middleware'], ]), ) @@ -705,6 +706,7 @@ export class StartCompiler { ['createIsomorphicFn', 'IsomorphicFn'], ['createServerOnlyFn', 'ServerOnlyFn'], ['createClientOnlyFn', 'ClientOnlyFn'], + ['createMiddleware', 'Middleware'], ]), ) 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 d423798547..3130ca47c1 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 @@ -1,4 +1,3 @@ -import { AsyncLocalStorage } from 'node:async_hooks' import { VIRTUAL_MODULES } from '@tanstack/start-server-core' import { resolve as resolvePath } from 'pathe' import { @@ -47,20 +46,6 @@ type ModuleInvalidationEnvironment = { } } -type StartCompilerPluginContext = { - environment: { - name: string - mode: string - transformRequest: (url: string) => Promise - } - load: (options: { id: string }) => Promise<{ code?: string | null }> - resolve: ( - source: string, - importer?: string, - ) => Promise<{ id: string; external?: boolean | string } | null> - error: (message: string) => never -} - function invalidateMatchingFileModules( environment: ModuleInvalidationEnvironment, ids: Iterable, @@ -196,17 +181,6 @@ export function startCompilerPlugin( opts: StartCompilerPluginOptions, ): PluginOption { const compilers = new Map>() - const compilerContextStorage = - new AsyncLocalStorage() - - const getCompilerContext = () => { - const context = compilerContextStorage.getStore() - if (!context) { - throw new Error('Start compiler Vite context is unavailable.') - } - - return context - } // Shared registry of server functions across all environments const serverFnsById: Record = {} @@ -288,30 +262,27 @@ export function startCompilerPlugin( ? createViteDevServerFnModuleSpecifierEncoder(root) : undefined, loadModule: async (id: string) => { - const compilerContext = getCompilerContext() - if (mode === 'build') { - const loaded = await compilerContext.load({ id }) + const loaded = await this.load({ id }) const code = loaded.code ?? '' compiler!.ingestModule({ code, id }) return } - if (compilerContext.environment.mode !== 'dev') { - compilerContext.error( - `could not load module ${id}: unknown environment mode ${compilerContext.environment.mode}`, + if (this.environment.mode !== 'dev') { + this.error( + `could not load module ${id}: unknown environment mode ${this.environment.mode}`, ) } - await compilerContext.environment.transformRequest( + await this.environment.transformRequest( `${id}?${SERVER_FN_LOOKUP}`, ) }, resolveId: async (source: string, importer?: string) => { - const compilerContext = getCompilerContext() - const r = await compilerContext.resolve(source, importer) + const r = await this.resolve(source, importer) if (r) { if (!r.external) { @@ -331,15 +302,11 @@ export function startCompilerPlugin( compilerTransforms, }) - const result = await compilerContextStorage.run( - this as unknown as StartCompilerPluginContext, - () => - compiler.compile({ - id, - code, - detectedKinds, - }), - ) + const result = await compiler.compile({ + id, + code, + detectedKinds, + }) return result }, }, From 54bfae2af2290e7f8933b779173c394f8a3a735b Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Wed, 13 May 2026 21:56:02 +0000 Subject: [PATCH 2/5] ci: apply automated fixes --- .../start-fn-stubs/src/createMiddleware.ts | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/packages/start-fn-stubs/src/createMiddleware.ts b/packages/start-fn-stubs/src/createMiddleware.ts index f61012d726..6c21a57d93 100644 --- a/packages/start-fn-stubs/src/createMiddleware.ts +++ b/packages/start-fn-stubs/src/createMiddleware.ts @@ -1,13 +1,16 @@ export function createMiddleware(opts?: any, opts2?: any): any { - const options = { ...(opts2 || opts) } - const proxy = new Proxy({}, { - get(_, prop) { - if (prop === 'options') return options - return (value: any) => { - options[prop] = value - return proxy - } - } - }) - return proxy -} \ No newline at end of file + const options = { ...(opts2 || opts) } + const proxy = new Proxy( + {}, + { + get(_, prop) { + if (prop === 'options') return options + return (value: any) => { + options[prop] = value + return proxy + } + }, + }, + ) + return proxy +} From 2bd877c1e87795425d392b12274f2be2beca865b Mon Sep 17 00:00:00 2001 From: Sheraff Date: Thu, 14 May 2026 00:13:41 +0200 Subject: [PATCH 3/5] how about not using a stub? --- packages/start-client-core/src/createCsrfMiddleware.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/start-client-core/src/createCsrfMiddleware.ts b/packages/start-client-core/src/createCsrfMiddleware.ts index 8bc4c90a22..b7152d44a9 100644 --- a/packages/start-client-core/src/createCsrfMiddleware.ts +++ b/packages/start-client-core/src/createCsrfMiddleware.ts @@ -1,4 +1,5 @@ -import { createIsomorphicFn, createMiddleware } from '@tanstack/start-fn-stubs' +import { createIsomorphicFn } from '@tanstack/start-fn-stubs' +import { createMiddleware } from './createMiddleware' import type { RequestMiddlewareAfterServer, RequestServerOptions, @@ -76,8 +77,8 @@ type CreateCsrfMiddleware = ( opts?: CsrfMiddlewareOptions, ) => RequestMiddlewareAfterServer<{}, undefined, undefined> -const innerCreateCsrfMiddleware = ((opts: any = {}) => { - const middleware = createMiddleware().server(async (ctx: any) => { +const innerCreateCsrfMiddleware: CreateCsrfMiddleware = (opts = {}) => { + const middleware = createMiddleware().server(async (ctx) => { const csrfCtx = ctx as RequestServerOptions & typeof ctx if (opts.filter && !(await opts.filter(csrfCtx))) { @@ -96,7 +97,7 @@ const innerCreateCsrfMiddleware = ((opts: any = {}) => { } return middleware -}) as any as CreateCsrfMiddleware +} export const createCsrfMiddleware: CreateCsrfMiddleware = createIsomorphicFn().server(innerCreateCsrfMiddleware) as CreateCsrfMiddleware From 830eaa8777c3d3067ddca3c3f93d7a79a2c46075 Mon Sep 17 00:00:00 2001 From: Sheraff Date: Thu, 14 May 2026 18:00:14 +0200 Subject: [PATCH 4/5] Revert "how about not using a stub?" This reverts commit 2bd877c1e87795425d392b12274f2be2beca865b. --- packages/start-client-core/src/createCsrfMiddleware.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/start-client-core/src/createCsrfMiddleware.ts b/packages/start-client-core/src/createCsrfMiddleware.ts index b7152d44a9..8bc4c90a22 100644 --- a/packages/start-client-core/src/createCsrfMiddleware.ts +++ b/packages/start-client-core/src/createCsrfMiddleware.ts @@ -1,5 +1,4 @@ -import { createIsomorphicFn } from '@tanstack/start-fn-stubs' -import { createMiddleware } from './createMiddleware' +import { createIsomorphicFn, createMiddleware } from '@tanstack/start-fn-stubs' import type { RequestMiddlewareAfterServer, RequestServerOptions, @@ -77,8 +76,8 @@ type CreateCsrfMiddleware = ( opts?: CsrfMiddlewareOptions, ) => RequestMiddlewareAfterServer<{}, undefined, undefined> -const innerCreateCsrfMiddleware: CreateCsrfMiddleware = (opts = {}) => { - const middleware = createMiddleware().server(async (ctx) => { +const innerCreateCsrfMiddleware = ((opts: any = {}) => { + const middleware = createMiddleware().server(async (ctx: any) => { const csrfCtx = ctx as RequestServerOptions & typeof ctx if (opts.filter && !(await opts.filter(csrfCtx))) { @@ -97,7 +96,7 @@ const innerCreateCsrfMiddleware: CreateCsrfMiddleware = (opts = {}) => { } return middleware -} +}) as any as CreateCsrfMiddleware export const createCsrfMiddleware: CreateCsrfMiddleware = createIsomorphicFn().server(innerCreateCsrfMiddleware) as CreateCsrfMiddleware From 8ce33eee2e9292b3cdcf31e52da56030e27ddd48 Mon Sep 17 00:00:00 2001 From: Sheraff Date: Thu, 14 May 2026 18:23:50 +0200 Subject: [PATCH 5/5] minor type fix --- packages/start-client-core/src/createCsrfMiddleware.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/start-client-core/src/createCsrfMiddleware.ts b/packages/start-client-core/src/createCsrfMiddleware.ts index 8bc4c90a22..6cdd1c0d13 100644 --- a/packages/start-client-core/src/createCsrfMiddleware.ts +++ b/packages/start-client-core/src/createCsrfMiddleware.ts @@ -78,7 +78,7 @@ type CreateCsrfMiddleware = ( const innerCreateCsrfMiddleware = ((opts: any = {}) => { const middleware = createMiddleware().server(async (ctx: any) => { - const csrfCtx = ctx as RequestServerOptions & typeof ctx + const csrfCtx = ctx as RequestServerOptions if (opts.filter && !(await opts.filter(csrfCtx))) { return ctx.next()