@tanstack/start-plugin-core 1.142.4 → 1.142.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -40,6 +40,7 @@ export declare class ServerFnCompiler {
40
40
  private moduleCache;
41
41
  private initialized;
42
42
  private validLookupKinds;
43
+ private knownRootImports;
43
44
  constructor(options: {
44
45
  env: 'client' | 'server';
45
46
  directive: string;
@@ -61,6 +62,11 @@ export declare class ServerFnCompiler {
61
62
  }): Promise<import('@tanstack/router-utils').GeneratorResult | null>;
62
63
  private collectCandidates;
63
64
  private resolveIdentifierKind;
65
+ /**
66
+ * Recursively find an export in a module, following `export * from` chains.
67
+ * Returns the module info and binding if found, or undefined if not found.
68
+ */
69
+ private findExportInModule;
64
70
  private resolveBindingKind;
65
71
  private resolveExprKind;
66
72
  private resolveCalleeKind;
@@ -10,6 +10,12 @@ const LookupSetup = {
10
10
  candidateCallIdentifier: /* @__PURE__ */ new Set(["server", "client", "createMiddlewares"])
11
11
  }
12
12
  };
13
+ const IdentifierToKind = /* @__PURE__ */ new Map();
14
+ for (const [kind, setup] of Object.entries(LookupSetup)) {
15
+ for (const id of setup.candidateCallIdentifier) {
16
+ IdentifierToKind.set(id, kind);
17
+ }
18
+ }
13
19
  class ServerFnCompiler {
14
20
  constructor(options) {
15
21
  this.options = options;
@@ -18,6 +24,10 @@ class ServerFnCompiler {
18
24
  moduleCache = /* @__PURE__ */ new Map();
19
25
  initialized = false;
20
26
  validLookupKinds;
27
+ // Fast lookup for direct imports from known libraries (e.g., '@tanstack/react-start')
28
+ // Maps: libName → (exportName → Kind)
29
+ // This allows O(1) resolution for the common case without async resolveId calls
30
+ knownRootImports = /* @__PURE__ */ new Map();
21
31
  async init(id) {
22
32
  await Promise.all(
23
33
  this.options.lookupConfigurations.map(async (config) => {
@@ -52,6 +62,12 @@ class ServerFnCompiler {
52
62
  resolvedKind: `Root`
53
63
  });
54
64
  this.moduleCache.set(libId, rootModule);
65
+ let libExports = this.knownRootImports.get(config.libName);
66
+ if (!libExports) {
67
+ libExports = /* @__PURE__ */ new Map();
68
+ this.knownRootImports.set(config.libName, libExports);
69
+ }
70
+ libExports.set(config.rootExport, "Root");
55
71
  })
56
72
  );
57
73
  this.initialized = true;
@@ -162,44 +178,86 @@ class ServerFnCompiler {
162
178
  if (candidates.length === 0) {
163
179
  return null;
164
180
  }
165
- const toRewrite = [];
166
- for (const handler of candidates) {
167
- const kind = await this.resolveExprKind(handler, id);
181
+ const resolvedCandidates = await Promise.all(
182
+ candidates.map(async (candidate) => ({
183
+ candidate,
184
+ kind: await this.resolveExprKind(candidate, id)
185
+ }))
186
+ );
187
+ const toRewriteMap = /* @__PURE__ */ new Map();
188
+ for (const { candidate, kind } of resolvedCandidates) {
168
189
  if (this.validLookupKinds.has(kind)) {
169
- toRewrite.push({ callExpression: handler, kind });
190
+ toRewriteMap.set(candidate, kind);
170
191
  }
171
192
  }
172
- if (toRewrite.length === 0) {
193
+ if (toRewriteMap.size === 0) {
173
194
  return null;
174
195
  }
175
196
  const pathsToRewrite = [];
197
+ const callExprPaths = /* @__PURE__ */ new Map();
176
198
  babel__default.traverse(ast, {
177
199
  CallExpression(path) {
178
- const found = toRewrite.findIndex((h) => path.node === h.callExpression);
179
- if (found !== -1) {
180
- pathsToRewrite.push({ nodePath: path, kind: toRewrite[found].kind });
181
- toRewrite.splice(found, 1);
182
- }
200
+ callExprPaths.set(path.node, path);
183
201
  }
184
202
  });
185
- if (toRewrite.length > 0) {
203
+ for (const [node, kind] of toRewriteMap) {
204
+ const path = callExprPaths.get(node);
205
+ if (!path) {
206
+ continue;
207
+ }
208
+ const methodChain = {
209
+ middleware: null,
210
+ inputValidator: null,
211
+ handler: null,
212
+ server: null,
213
+ client: null
214
+ };
215
+ let currentNode = node;
216
+ while (true) {
217
+ const callee = currentNode.callee;
218
+ if (!t.isMemberExpression(callee)) {
219
+ break;
220
+ }
221
+ if (t.isIdentifier(callee.property)) {
222
+ const name = callee.property.name;
223
+ if (name in methodChain) {
224
+ const currentPath = callExprPaths.get(currentNode);
225
+ const args = currentPath.get("arguments");
226
+ const firstArgPath = Array.isArray(args) && args.length > 0 ? args[0] ?? null : null;
227
+ methodChain[name] = {
228
+ callPath: currentPath,
229
+ firstArgPath
230
+ };
231
+ }
232
+ }
233
+ if (!t.isCallExpression(callee.object)) {
234
+ break;
235
+ }
236
+ currentNode = callee.object;
237
+ }
238
+ pathsToRewrite.push({ path, kind, methodChain });
239
+ }
240
+ if (pathsToRewrite.length !== toRewriteMap.size) {
186
241
  throw new Error(
187
242
  `Internal error: could not find all paths to rewrite. please file an issue`
188
243
  );
189
244
  }
190
245
  const refIdents = findReferencedIdentifiers(ast);
191
- pathsToRewrite.map((p) => {
192
- if (p.kind === "ServerFn") {
193
- handleCreateServerFn(p.nodePath, {
246
+ for (const { path, kind, methodChain } of pathsToRewrite) {
247
+ const candidate = { path, methodChain };
248
+ if (kind === "ServerFn") {
249
+ handleCreateServerFn(candidate, {
194
250
  env: this.options.env,
195
251
  code,
196
252
  directive: this.options.directive,
197
253
  isProviderFile
198
254
  });
199
255
  } else {
200
- handleCreateMiddleware(p.nodePath, { env: this.options.env });
256
+ handleCreateMiddleware(candidate, {
257
+ env: this.options.env
258
+ });
201
259
  }
202
- });
260
+ }
203
261
  deadCodeElimination(ast, refIdents);
204
262
  return generateFromAst(ast, {
205
263
  sourceMaps: true,
@@ -212,12 +270,12 @@ class ServerFnCompiler {
212
270
  const candidates = [];
213
271
  for (const binding of bindings.values()) {
214
272
  if (binding.type === "var") {
215
- const handler = isCandidateCallExpression(
273
+ const candidate = isCandidateCallExpression(
216
274
  binding.init,
217
275
  this.validLookupKinds
218
276
  );
219
- if (handler) {
220
- candidates.push(handler);
277
+ if (candidate) {
278
+ candidates.push(candidate);
221
279
  }
222
280
  }
223
281
  }
@@ -241,64 +299,83 @@ class ServerFnCompiler {
241
299
  binding.resolvedKind = resolvedKind;
242
300
  return resolvedKind;
243
301
  }
244
- async resolveBindingKind(binding, fileId, visited = /* @__PURE__ */ new Set()) {
245
- if (binding.resolvedKind) {
246
- return binding.resolvedKind;
302
+ /**
303
+ * Recursively find an export in a module, following `export * from` chains.
304
+ * Returns the module info and binding if found, or undefined if not found.
305
+ */
306
+ async findExportInModule(moduleInfo, exportName, visitedModules = /* @__PURE__ */ new Set()) {
307
+ if (visitedModules.has(moduleInfo.id)) {
308
+ return void 0;
247
309
  }
248
- if (binding.type === "import") {
249
- const target = await this.options.resolveId(binding.source, fileId);
250
- if (!target) {
251
- return "None";
310
+ visitedModules.add(moduleInfo.id);
311
+ const directExport = moduleInfo.exports.get(exportName);
312
+ if (directExport) {
313
+ const binding = moduleInfo.bindings.get(directExport.name);
314
+ if (binding) {
315
+ return { moduleInfo, binding };
252
316
  }
253
- const importedModule = await this.getModuleInfo(target);
254
- const moduleExport = importedModule.exports.get(binding.importedName);
255
- if (!moduleExport && importedModule.reExportAllSources.length > 0) {
256
- for (const reExportSource of importedModule.reExportAllSources) {
317
+ }
318
+ if (moduleInfo.reExportAllSources.length > 0) {
319
+ const results = await Promise.all(
320
+ moduleInfo.reExportAllSources.map(async (reExportSource) => {
257
321
  const reExportTarget = await this.options.resolveId(
258
322
  reExportSource,
259
- importedModule.id
323
+ moduleInfo.id
260
324
  );
261
325
  if (reExportTarget) {
262
326
  const reExportModule = await this.getModuleInfo(reExportTarget);
263
- const reExportEntry = reExportModule.exports.get(
264
- binding.importedName
327
+ return this.findExportInModule(
328
+ reExportModule,
329
+ exportName,
330
+ visitedModules
265
331
  );
266
- if (reExportEntry) {
267
- const reExportBinding = reExportModule.bindings.get(
268
- reExportEntry.name
269
- );
270
- if (reExportBinding) {
271
- if (reExportBinding.resolvedKind) {
272
- return reExportBinding.resolvedKind;
273
- }
274
- const resolvedKind3 = await this.resolveBindingKind(
275
- reExportBinding,
276
- reExportModule.id,
277
- visited
278
- );
279
- reExportBinding.resolvedKind = resolvedKind3;
280
- return resolvedKind3;
281
- }
282
- }
283
332
  }
333
+ return void 0;
334
+ })
335
+ );
336
+ for (const result of results) {
337
+ if (result) {
338
+ return result;
339
+ }
340
+ }
341
+ }
342
+ return void 0;
343
+ }
344
+ async resolveBindingKind(binding, fileId, visited = /* @__PURE__ */ new Set()) {
345
+ if (binding.resolvedKind) {
346
+ return binding.resolvedKind;
347
+ }
348
+ if (binding.type === "import") {
349
+ const knownExports = this.knownRootImports.get(binding.source);
350
+ if (knownExports) {
351
+ const kind = knownExports.get(binding.importedName);
352
+ if (kind) {
353
+ binding.resolvedKind = kind;
354
+ return kind;
284
355
  }
285
356
  }
286
- if (!moduleExport) {
357
+ const target = await this.options.resolveId(binding.source, fileId);
358
+ if (!target) {
287
359
  return "None";
288
360
  }
289
- const importedBinding = importedModule.bindings.get(moduleExport.name);
290
- if (!importedBinding) {
361
+ const importedModule = await this.getModuleInfo(target);
362
+ const found = await this.findExportInModule(
363
+ importedModule,
364
+ binding.importedName
365
+ );
366
+ if (!found) {
291
367
  return "None";
292
368
  }
293
- if (importedBinding.resolvedKind) {
294
- return importedBinding.resolvedKind;
369
+ const { moduleInfo: foundModule, binding: foundBinding } = found;
370
+ if (foundBinding.resolvedKind) {
371
+ return foundBinding.resolvedKind;
295
372
  }
296
373
  const resolvedKind2 = await this.resolveBindingKind(
297
- importedBinding,
298
- importedModule.id,
374
+ foundBinding,
375
+ foundModule.id,
299
376
  visited
300
377
  );
301
- importedBinding.resolvedKind = resolvedKind2;
378
+ foundBinding.resolvedKind = resolvedKind2;
302
379
  return resolvedKind2;
303
380
  }
304
381
  const resolvedKind = await this.resolveExprKind(
@@ -313,6 +390,9 @@ class ServerFnCompiler {
313
390
  if (!expr) {
314
391
  return "None";
315
392
  }
393
+ while (t.isTSAsExpression(expr) || t.isTSNonNullExpression(expr) || t.isParenthesizedExpression(expr)) {
394
+ expr = expr.expression;
395
+ }
316
396
  let result = "None";
317
397
  if (t.isCallExpression(expr)) {
318
398
  if (!t.isExpression(expr.callee)) {
@@ -323,15 +403,11 @@ class ServerFnCompiler {
323
403
  fileId,
324
404
  visited
325
405
  );
326
- if (calleeKind !== "None") {
327
- if (calleeKind === `Root` || calleeKind === `Builder`) {
328
- return `Builder`;
329
- }
330
- for (const kind of this.validLookupKinds) {
331
- if (calleeKind === kind) {
332
- return kind;
333
- }
334
- }
406
+ if (calleeKind === "Root" || calleeKind === "Builder") {
407
+ return "Builder";
408
+ }
409
+ if (this.validLookupKinds.has(calleeKind)) {
410
+ return calleeKind;
335
411
  }
336
412
  } else if (t.isMemberExpression(expr) && t.isIdentifier(expr.property)) {
337
413
  result = await this.resolveCalleeKind(expr.object, fileId, visited);
@@ -339,15 +415,6 @@ class ServerFnCompiler {
339
415
  if (result === "None" && t.isIdentifier(expr)) {
340
416
  result = await this.resolveIdentifierKind(expr.name, fileId, visited);
341
417
  }
342
- if (result === "None" && t.isTSAsExpression(expr)) {
343
- result = await this.resolveExprKind(expr.expression, fileId, visited);
344
- }
345
- if (result === "None" && t.isTSNonNullExpression(expr)) {
346
- result = await this.resolveExprKind(expr.expression, fileId, visited);
347
- }
348
- if (result === "None" && t.isParenthesizedExpression(expr)) {
349
- result = await this.resolveExprKind(expr.expression, fileId, visited);
350
- }
351
418
  return result;
352
419
  }
353
420
  async resolveCalleeKind(callee, fileId, visited = /* @__PURE__ */ new Set()) {
@@ -420,10 +487,9 @@ function isCandidateCallExpression(node, lookupKinds) {
420
487
  if (!t.isMemberExpression(callee) || !t.isIdentifier(callee.property)) {
421
488
  return void 0;
422
489
  }
423
- for (const kind of lookupKinds) {
424
- if (LookupSetup[kind].candidateCallIdentifier.has(callee.property.name)) {
425
- return node;
426
- }
490
+ const kind = IdentifierToKind.get(callee.property.name);
491
+ if (kind && lookupKinds.has(kind)) {
492
+ return node;
427
493
  }
428
494
  return void 0;
429
495
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compiler.js","sources":["../../../src/create-server-fn-plugin/compiler.ts"],"sourcesContent":["/* eslint-disable import/no-commonjs */\nimport * as t from '@babel/types'\nimport { generateFromAst, parseAst } from '@tanstack/router-utils'\nimport babel from '@babel/core'\nimport {\n deadCodeElimination,\n findReferencedIdentifiers,\n} from 'babel-dead-code-elimination'\nimport { handleCreateServerFn } from './handleCreateServerFn'\nimport { handleCreateMiddleware } from './handleCreateMiddleware'\n\ntype Binding =\n | {\n type: 'import'\n source: string\n importedName: string\n resolvedKind?: Kind\n }\n | {\n type: 'var'\n init: t.Expression | null\n resolvedKind?: Kind\n }\n\ntype ExportEntry =\n | { tag: 'Normal'; name: string }\n | { tag: 'Default'; name: string }\n | { tag: 'Namespace'; name: string; targetId: string } // for `export * as ns from './x'`\n\ntype Kind = 'None' | `Root` | `Builder` | LookupKind\n\nexport type LookupKind = 'ServerFn' | 'Middleware'\n\nconst LookupSetup: Record<\n LookupKind,\n { candidateCallIdentifier: Set<string> }\n> = {\n ServerFn: { candidateCallIdentifier: new Set(['handler']) },\n Middleware: {\n candidateCallIdentifier: new Set(['server', 'client', 'createMiddlewares']),\n },\n}\n\nexport type LookupConfig = {\n libName: string\n rootExport: string\n}\ninterface ModuleInfo {\n id: string\n code: string\n ast: ReturnType<typeof parseAst>\n bindings: Map<string, Binding>\n exports: Map<string, ExportEntry>\n // Track `export * from './module'` declarations for re-export resolution\n reExportAllSources: Array<string>\n}\n\nexport class ServerFnCompiler {\n private moduleCache = new Map<string, ModuleInfo>()\n private initialized = false\n private validLookupKinds: Set<LookupKind>\n constructor(\n private options: {\n env: 'client' | 'server'\n directive: string\n lookupConfigurations: Array<LookupConfig>\n lookupKinds: Set<LookupKind>\n loadModule: (id: string) => Promise<void>\n resolveId: (id: string, importer?: string) => Promise<string | null>\n },\n ) {\n this.validLookupKinds = options.lookupKinds\n }\n\n private async init(id: string) {\n await Promise.all(\n this.options.lookupConfigurations.map(async (config) => {\n const libId = await this.options.resolveId(config.libName, id)\n if (!libId) {\n throw new Error(`could not resolve \"${config.libName}\"`)\n }\n let rootModule = this.moduleCache.get(libId)\n if (!rootModule) {\n // insert root binding\n rootModule = {\n ast: null as any,\n bindings: new Map(),\n exports: new Map(),\n code: '',\n id: libId,\n reExportAllSources: [],\n }\n this.moduleCache.set(libId, rootModule)\n }\n\n rootModule.exports.set(config.rootExport, {\n tag: 'Normal',\n name: config.rootExport,\n })\n rootModule.exports.set('*', {\n tag: 'Namespace',\n name: config.rootExport,\n targetId: libId,\n })\n rootModule.bindings.set(config.rootExport, {\n type: 'var',\n init: t.identifier(config.rootExport),\n resolvedKind: `Root` satisfies Kind,\n })\n this.moduleCache.set(libId, rootModule)\n }),\n )\n\n this.initialized = true\n }\n\n public ingestModule({ code, id }: { code: string; id: string }) {\n const ast = parseAst({ code })\n\n const bindings = new Map<string, Binding>()\n const exports = new Map<string, ExportEntry>()\n const reExportAllSources: Array<string> = []\n\n // we are only interested in top-level bindings, hence we don't traverse the AST\n // instead we only iterate over the program body\n for (const node of ast.program.body) {\n if (t.isImportDeclaration(node)) {\n const source = node.source.value\n for (const s of node.specifiers) {\n if (t.isImportSpecifier(s)) {\n const importedName = t.isIdentifier(s.imported)\n ? s.imported.name\n : s.imported.value\n bindings.set(s.local.name, { type: 'import', source, importedName })\n } else if (t.isImportDefaultSpecifier(s)) {\n bindings.set(s.local.name, {\n type: 'import',\n source,\n importedName: 'default',\n })\n } else if (t.isImportNamespaceSpecifier(s)) {\n bindings.set(s.local.name, {\n type: 'import',\n source,\n importedName: '*',\n })\n }\n }\n } else if (t.isVariableDeclaration(node)) {\n for (const decl of node.declarations) {\n if (t.isIdentifier(decl.id)) {\n bindings.set(decl.id.name, {\n type: 'var',\n init: decl.init ?? null,\n })\n }\n }\n } else if (t.isExportNamedDeclaration(node)) {\n // export const foo = ...\n if (node.declaration) {\n if (t.isVariableDeclaration(node.declaration)) {\n for (const d of node.declaration.declarations) {\n if (t.isIdentifier(d.id)) {\n exports.set(d.id.name, { tag: 'Normal', name: d.id.name })\n bindings.set(d.id.name, { type: 'var', init: d.init ?? null })\n }\n }\n }\n }\n for (const sp of node.specifiers) {\n if (t.isExportNamespaceSpecifier(sp)) {\n exports.set(sp.exported.name, {\n tag: 'Namespace',\n name: sp.exported.name,\n targetId: node.source?.value || '',\n })\n }\n // export { local as exported }\n else if (t.isExportSpecifier(sp)) {\n const local = sp.local.name\n const exported = t.isIdentifier(sp.exported)\n ? sp.exported.name\n : sp.exported.value\n exports.set(exported, { tag: 'Normal', name: local })\n\n // When re-exporting from another module (export { foo } from './module'),\n // create an import binding so the server function can be resolved\n if (node.source) {\n bindings.set(local, {\n type: 'import',\n source: node.source.value,\n importedName: local,\n })\n }\n }\n }\n } else if (t.isExportDefaultDeclaration(node)) {\n const d = node.declaration\n if (t.isIdentifier(d)) {\n exports.set('default', { tag: 'Default', name: d.name })\n } else {\n const synth = '__default_export__'\n bindings.set(synth, { type: 'var', init: d as t.Expression })\n exports.set('default', { tag: 'Default', name: synth })\n }\n } else if (t.isExportAllDeclaration(node)) {\n // Handle `export * from './module'` syntax\n // Track the source so we can look up exports from it when needed\n reExportAllSources.push(node.source.value)\n }\n }\n\n const info: ModuleInfo = {\n code,\n id,\n ast,\n bindings,\n exports,\n reExportAllSources,\n }\n this.moduleCache.set(id, info)\n return info\n }\n\n public invalidateModule(id: string) {\n return this.moduleCache.delete(id)\n }\n\n public async compile({\n code,\n id,\n isProviderFile,\n }: {\n code: string\n id: string\n isProviderFile: boolean\n }) {\n if (!this.initialized) {\n await this.init(id)\n }\n const { bindings, ast } = this.ingestModule({ code, id })\n const candidates = this.collectCandidates(bindings)\n if (candidates.length === 0) {\n // this hook will only be invoked if there is `.handler(` | `.server(` | `.client(` in the code,\n // so not discovering a handler candidate is rather unlikely, but maybe possible?\n return null\n }\n\n // let's find out which of the candidates are actually server functions\n const toRewrite: Array<{\n callExpression: t.CallExpression\n kind: LookupKind\n }> = []\n for (const handler of candidates) {\n const kind = await this.resolveExprKind(handler, id)\n if (this.validLookupKinds.has(kind as LookupKind)) {\n toRewrite.push({ callExpression: handler, kind: kind as LookupKind })\n }\n }\n if (toRewrite.length === 0) {\n return null\n }\n\n const pathsToRewrite: Array<{\n nodePath: babel.NodePath<t.CallExpression>\n kind: LookupKind\n }> = []\n babel.traverse(ast, {\n CallExpression(path) {\n const found = toRewrite.findIndex((h) => path.node === h.callExpression)\n if (found !== -1) {\n pathsToRewrite.push({ nodePath: path, kind: toRewrite[found]!.kind })\n // delete from toRewrite\n toRewrite.splice(found, 1)\n }\n },\n })\n\n if (toRewrite.length > 0) {\n throw new Error(\n `Internal error: could not find all paths to rewrite. please file an issue`,\n )\n }\n\n const refIdents = findReferencedIdentifiers(ast)\n\n pathsToRewrite.map((p) => {\n if (p.kind === 'ServerFn') {\n handleCreateServerFn(p.nodePath, {\n env: this.options.env,\n code,\n directive: this.options.directive,\n isProviderFile,\n })\n } else {\n handleCreateMiddleware(p.nodePath, { env: this.options.env })\n }\n })\n\n deadCodeElimination(ast, refIdents)\n\n return generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: id,\n filename: id,\n })\n }\n\n // collects all candidate CallExpressions at top-level\n private collectCandidates(bindings: Map<string, Binding>) {\n const candidates: Array<t.CallExpression> = []\n\n for (const binding of bindings.values()) {\n if (binding.type === 'var') {\n const handler = isCandidateCallExpression(\n binding.init,\n this.validLookupKinds,\n )\n if (handler) {\n candidates.push(handler)\n }\n }\n }\n return candidates\n }\n\n private async resolveIdentifierKind(\n ident: string,\n id: string,\n visited = new Set<string>(),\n ): Promise<Kind> {\n const info = await this.getModuleInfo(id)\n\n const binding = info.bindings.get(ident)\n if (!binding) {\n return 'None'\n }\n if (binding.resolvedKind) {\n return binding.resolvedKind\n }\n\n // TODO improve cycle detection? should we throw here instead of returning 'None'?\n // prevent cycles\n const vKey = `${id}:${ident}`\n if (visited.has(vKey)) {\n return 'None'\n }\n visited.add(vKey)\n\n const resolvedKind = await this.resolveBindingKind(binding, id, visited)\n binding.resolvedKind = resolvedKind\n return resolvedKind\n }\n\n private async resolveBindingKind(\n binding: Binding,\n fileId: string,\n visited = new Set<string>(),\n ): Promise<Kind> {\n if (binding.resolvedKind) {\n return binding.resolvedKind\n }\n if (binding.type === 'import') {\n const target = await this.options.resolveId(binding.source, fileId)\n if (!target) {\n return 'None'\n }\n\n const importedModule = await this.getModuleInfo(target)\n\n // Try to find the export in the module's direct exports\n const moduleExport = importedModule.exports.get(binding.importedName)\n\n // If not found directly, check re-export-all sources (`export * from './module'`)\n if (!moduleExport && importedModule.reExportAllSources.length > 0) {\n for (const reExportSource of importedModule.reExportAllSources) {\n const reExportTarget = await this.options.resolveId(\n reExportSource,\n importedModule.id,\n )\n if (reExportTarget) {\n const reExportModule = await this.getModuleInfo(reExportTarget)\n const reExportEntry = reExportModule.exports.get(\n binding.importedName,\n )\n if (reExportEntry) {\n // Found the export in a re-exported module, resolve from there\n const reExportBinding = reExportModule.bindings.get(\n reExportEntry.name,\n )\n if (reExportBinding) {\n if (reExportBinding.resolvedKind) {\n return reExportBinding.resolvedKind\n }\n const resolvedKind = await this.resolveBindingKind(\n reExportBinding,\n reExportModule.id,\n visited,\n )\n reExportBinding.resolvedKind = resolvedKind\n return resolvedKind\n }\n }\n }\n }\n }\n\n if (!moduleExport) {\n return 'None'\n }\n const importedBinding = importedModule.bindings.get(moduleExport.name)\n if (!importedBinding) {\n return 'None'\n }\n if (importedBinding.resolvedKind) {\n return importedBinding.resolvedKind\n }\n\n const resolvedKind = await this.resolveBindingKind(\n importedBinding,\n importedModule.id,\n visited,\n )\n importedBinding.resolvedKind = resolvedKind\n return resolvedKind\n }\n\n const resolvedKind = await this.resolveExprKind(\n binding.init,\n fileId,\n visited,\n )\n binding.resolvedKind = resolvedKind\n return resolvedKind\n }\n\n private async resolveExprKind(\n expr: t.Expression | null,\n fileId: string,\n visited = new Set<string>(),\n ): Promise<Kind> {\n if (!expr) {\n return 'None'\n }\n\n let result: Kind = 'None'\n\n if (t.isCallExpression(expr)) {\n if (!t.isExpression(expr.callee)) {\n return 'None'\n }\n const calleeKind = await this.resolveCalleeKind(\n expr.callee,\n fileId,\n visited,\n )\n if (calleeKind !== 'None') {\n if (calleeKind === `Root` || calleeKind === `Builder`) {\n return `Builder`\n }\n for (const kind of this.validLookupKinds) {\n if (calleeKind === kind) {\n return kind\n }\n }\n }\n } else if (t.isMemberExpression(expr) && t.isIdentifier(expr.property)) {\n result = await this.resolveCalleeKind(expr.object, fileId, visited)\n }\n\n if (result === 'None' && t.isIdentifier(expr)) {\n result = await this.resolveIdentifierKind(expr.name, fileId, visited)\n }\n\n if (result === 'None' && t.isTSAsExpression(expr)) {\n result = await this.resolveExprKind(expr.expression, fileId, visited)\n }\n if (result === 'None' && t.isTSNonNullExpression(expr)) {\n result = await this.resolveExprKind(expr.expression, fileId, visited)\n }\n if (result === 'None' && t.isParenthesizedExpression(expr)) {\n result = await this.resolveExprKind(expr.expression, fileId, visited)\n }\n\n return result\n }\n\n private async resolveCalleeKind(\n callee: t.Expression,\n fileId: string,\n visited = new Set<string>(),\n ): Promise<Kind> {\n if (t.isIdentifier(callee)) {\n return this.resolveIdentifierKind(callee.name, fileId, visited)\n }\n\n if (t.isMemberExpression(callee) && t.isIdentifier(callee.property)) {\n const prop = callee.property.name\n\n if (\n this.validLookupKinds.has('ServerFn') &&\n LookupSetup['ServerFn'].candidateCallIdentifier.has(prop)\n ) {\n const base = await this.resolveExprKind(callee.object, fileId, visited)\n if (base === 'Root' || base === 'Builder') {\n return 'ServerFn'\n }\n return 'None'\n } else if (\n this.validLookupKinds.has('Middleware') &&\n LookupSetup['Middleware'].candidateCallIdentifier.has(prop)\n ) {\n const base = await this.resolveExprKind(callee.object, fileId, visited)\n if (base === 'Root' || base === 'Builder' || base === 'Middleware') {\n return 'Middleware'\n }\n return 'None'\n }\n // Check if the object is a namespace import\n if (t.isIdentifier(callee.object)) {\n const info = await this.getModuleInfo(fileId)\n const binding = info.bindings.get(callee.object.name)\n if (\n binding &&\n binding.type === 'import' &&\n binding.importedName === '*'\n ) {\n // resolve the property from the target module\n const targetModuleId = await this.options.resolveId(\n binding.source,\n fileId,\n )\n if (targetModuleId) {\n const targetModule = await this.getModuleInfo(targetModuleId)\n const exportEntry = targetModule.exports.get(callee.property.name)\n if (exportEntry) {\n const exportedBinding = targetModule.bindings.get(\n exportEntry.name,\n )\n if (exportedBinding) {\n return await this.resolveBindingKind(\n exportedBinding,\n targetModule.id,\n visited,\n )\n }\n }\n } else {\n return 'None'\n }\n }\n }\n return this.resolveExprKind(callee.object, fileId, visited)\n }\n\n // handle nested expressions\n return this.resolveExprKind(callee, fileId, visited)\n }\n\n private async getModuleInfo(id: string) {\n let cached = this.moduleCache.get(id)\n if (cached) {\n return cached\n }\n\n await this.options.loadModule(id)\n\n cached = this.moduleCache.get(id)\n if (!cached) {\n throw new Error(`could not load module info for ${id}`)\n }\n return cached\n }\n}\n\nfunction isCandidateCallExpression(\n node: t.Node | null | undefined,\n lookupKinds: Set<LookupKind>,\n): undefined | t.CallExpression {\n if (!t.isCallExpression(node)) return undefined\n\n const callee = node.callee\n if (!t.isMemberExpression(callee) || !t.isIdentifier(callee.property)) {\n return undefined\n }\n for (const kind of lookupKinds) {\n if (LookupSetup[kind].candidateCallIdentifier.has(callee.property.name)) {\n return node\n }\n }\n\n return undefined\n}\n"],"names":["babel","resolvedKind"],"mappings":"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"}
1
+ {"version":3,"file":"compiler.js","sources":["../../../src/create-server-fn-plugin/compiler.ts"],"sourcesContent":["/* eslint-disable import/no-commonjs */\nimport * as t from '@babel/types'\nimport { generateFromAst, parseAst } from '@tanstack/router-utils'\nimport babel from '@babel/core'\nimport {\n deadCodeElimination,\n findReferencedIdentifiers,\n} from 'babel-dead-code-elimination'\nimport { handleCreateServerFn } from './handleCreateServerFn'\nimport { handleCreateMiddleware } from './handleCreateMiddleware'\nimport type { MethodChainPaths, RewriteCandidate } from './types'\n\ntype Binding =\n | {\n type: 'import'\n source: string\n importedName: string\n resolvedKind?: Kind\n }\n | {\n type: 'var'\n init: t.Expression | null\n resolvedKind?: Kind\n }\n\ntype ExportEntry =\n | { tag: 'Normal'; name: string }\n | { tag: 'Default'; name: string }\n | { tag: 'Namespace'; name: string; targetId: string } // for `export * as ns from './x'`\n\ntype Kind = 'None' | `Root` | `Builder` | LookupKind\n\nexport type LookupKind = 'ServerFn' | 'Middleware'\n\nconst LookupSetup: Record<\n LookupKind,\n { candidateCallIdentifier: Set<string> }\n> = {\n ServerFn: { candidateCallIdentifier: new Set(['handler']) },\n Middleware: {\n candidateCallIdentifier: new Set(['server', 'client', 'createMiddlewares']),\n },\n}\n\n// Pre-computed map: identifier name -> LookupKind for fast candidate detection\nconst IdentifierToKind = new Map<string, LookupKind>()\nfor (const [kind, setup] of Object.entries(LookupSetup) as Array<\n [LookupKind, { candidateCallIdentifier: Set<string> }]\n>) {\n for (const id of setup.candidateCallIdentifier) {\n IdentifierToKind.set(id, kind)\n }\n}\n\nexport type LookupConfig = {\n libName: string\n rootExport: string\n}\ninterface ModuleInfo {\n id: string\n code: string\n ast: ReturnType<typeof parseAst>\n bindings: Map<string, Binding>\n exports: Map<string, ExportEntry>\n // Track `export * from './module'` declarations for re-export resolution\n reExportAllSources: Array<string>\n}\n\nexport class ServerFnCompiler {\n private moduleCache = new Map<string, ModuleInfo>()\n private initialized = false\n private validLookupKinds: Set<LookupKind>\n // Fast lookup for direct imports from known libraries (e.g., '@tanstack/react-start')\n // Maps: libName → (exportName → Kind)\n // This allows O(1) resolution for the common case without async resolveId calls\n private knownRootImports = new Map<string, Map<string, Kind>>()\n constructor(\n private options: {\n env: 'client' | 'server'\n directive: string\n lookupConfigurations: Array<LookupConfig>\n lookupKinds: Set<LookupKind>\n loadModule: (id: string) => Promise<void>\n resolveId: (id: string, importer?: string) => Promise<string | null>\n },\n ) {\n this.validLookupKinds = options.lookupKinds\n }\n\n private async init(id: string) {\n await Promise.all(\n this.options.lookupConfigurations.map(async (config) => {\n const libId = await this.options.resolveId(config.libName, id)\n if (!libId) {\n throw new Error(`could not resolve \"${config.libName}\"`)\n }\n let rootModule = this.moduleCache.get(libId)\n if (!rootModule) {\n // insert root binding\n rootModule = {\n ast: null as any,\n bindings: new Map(),\n exports: new Map(),\n code: '',\n id: libId,\n reExportAllSources: [],\n }\n this.moduleCache.set(libId, rootModule)\n }\n\n rootModule.exports.set(config.rootExport, {\n tag: 'Normal',\n name: config.rootExport,\n })\n rootModule.exports.set('*', {\n tag: 'Namespace',\n name: config.rootExport,\n targetId: libId,\n })\n rootModule.bindings.set(config.rootExport, {\n type: 'var',\n init: t.identifier(config.rootExport),\n resolvedKind: `Root` satisfies Kind,\n })\n this.moduleCache.set(libId, rootModule)\n\n // Also populate the fast lookup map for direct imports\n let libExports = this.knownRootImports.get(config.libName)\n if (!libExports) {\n libExports = new Map()\n this.knownRootImports.set(config.libName, libExports)\n }\n libExports.set(config.rootExport, 'Root')\n }),\n )\n\n this.initialized = true\n }\n\n public ingestModule({ code, id }: { code: string; id: string }) {\n const ast = parseAst({ code })\n\n const bindings = new Map<string, Binding>()\n const exports = new Map<string, ExportEntry>()\n const reExportAllSources: Array<string> = []\n\n // we are only interested in top-level bindings, hence we don't traverse the AST\n // instead we only iterate over the program body\n for (const node of ast.program.body) {\n if (t.isImportDeclaration(node)) {\n const source = node.source.value\n for (const s of node.specifiers) {\n if (t.isImportSpecifier(s)) {\n const importedName = t.isIdentifier(s.imported)\n ? s.imported.name\n : s.imported.value\n bindings.set(s.local.name, { type: 'import', source, importedName })\n } else if (t.isImportDefaultSpecifier(s)) {\n bindings.set(s.local.name, {\n type: 'import',\n source,\n importedName: 'default',\n })\n } else if (t.isImportNamespaceSpecifier(s)) {\n bindings.set(s.local.name, {\n type: 'import',\n source,\n importedName: '*',\n })\n }\n }\n } else if (t.isVariableDeclaration(node)) {\n for (const decl of node.declarations) {\n if (t.isIdentifier(decl.id)) {\n bindings.set(decl.id.name, {\n type: 'var',\n init: decl.init ?? null,\n })\n }\n }\n } else if (t.isExportNamedDeclaration(node)) {\n // export const foo = ...\n if (node.declaration) {\n if (t.isVariableDeclaration(node.declaration)) {\n for (const d of node.declaration.declarations) {\n if (t.isIdentifier(d.id)) {\n exports.set(d.id.name, { tag: 'Normal', name: d.id.name })\n bindings.set(d.id.name, { type: 'var', init: d.init ?? null })\n }\n }\n }\n }\n for (const sp of node.specifiers) {\n if (t.isExportNamespaceSpecifier(sp)) {\n exports.set(sp.exported.name, {\n tag: 'Namespace',\n name: sp.exported.name,\n targetId: node.source?.value || '',\n })\n }\n // export { local as exported }\n else if (t.isExportSpecifier(sp)) {\n const local = sp.local.name\n const exported = t.isIdentifier(sp.exported)\n ? sp.exported.name\n : sp.exported.value\n exports.set(exported, { tag: 'Normal', name: local })\n\n // When re-exporting from another module (export { foo } from './module'),\n // create an import binding so the server function can be resolved\n if (node.source) {\n bindings.set(local, {\n type: 'import',\n source: node.source.value,\n importedName: local,\n })\n }\n }\n }\n } else if (t.isExportDefaultDeclaration(node)) {\n const d = node.declaration\n if (t.isIdentifier(d)) {\n exports.set('default', { tag: 'Default', name: d.name })\n } else {\n const synth = '__default_export__'\n bindings.set(synth, { type: 'var', init: d as t.Expression })\n exports.set('default', { tag: 'Default', name: synth })\n }\n } else if (t.isExportAllDeclaration(node)) {\n // Handle `export * from './module'` syntax\n // Track the source so we can look up exports from it when needed\n reExportAllSources.push(node.source.value)\n }\n }\n\n const info: ModuleInfo = {\n code,\n id,\n ast,\n bindings,\n exports,\n reExportAllSources,\n }\n this.moduleCache.set(id, info)\n return info\n }\n\n public invalidateModule(id: string) {\n return this.moduleCache.delete(id)\n }\n\n public async compile({\n code,\n id,\n isProviderFile,\n }: {\n code: string\n id: string\n isProviderFile: boolean\n }) {\n if (!this.initialized) {\n await this.init(id)\n }\n const { bindings, ast } = this.ingestModule({ code, id })\n const candidates = this.collectCandidates(bindings)\n if (candidates.length === 0) {\n // this hook will only be invoked if there is `.handler(` | `.server(` | `.client(` in the code,\n // so not discovering a handler candidate is rather unlikely, but maybe possible?\n return null\n }\n\n // let's find out which of the candidates are actually server functions\n // Resolve all candidates in parallel for better performance\n const resolvedCandidates = await Promise.all(\n candidates.map(async (candidate) => ({\n candidate,\n kind: await this.resolveExprKind(candidate, id),\n })),\n )\n\n // Map from candidate/root node -> kind\n // Note: For top-level variable declarations, candidate === root (the outermost CallExpression)\n const toRewriteMap = new Map<t.CallExpression, LookupKind>()\n for (const { candidate, kind } of resolvedCandidates) {\n if (this.validLookupKinds.has(kind as LookupKind)) {\n toRewriteMap.set(candidate, kind as LookupKind)\n }\n }\n if (toRewriteMap.size === 0) {\n return null\n }\n\n // Single-pass traversal to find NodePaths and collect method chains\n const pathsToRewrite: Array<{\n path: babel.NodePath<t.CallExpression>\n kind: LookupKind\n methodChain: MethodChainPaths\n }> = []\n\n // First, collect all CallExpression paths in the AST for O(1) lookup\n const callExprPaths = new Map<\n t.CallExpression,\n babel.NodePath<t.CallExpression>\n >()\n\n babel.traverse(ast, {\n CallExpression(path) {\n callExprPaths.set(path.node, path)\n },\n })\n\n // Now process candidates - we can look up any CallExpression path in O(1)\n for (const [node, kind] of toRewriteMap) {\n const path = callExprPaths.get(node)\n if (!path) {\n continue\n }\n\n // Collect method chain paths by walking DOWN from root through the chain\n const methodChain: MethodChainPaths = {\n middleware: null,\n inputValidator: null,\n handler: null,\n server: null,\n client: null,\n }\n\n // Walk down the call chain using nodes, look up paths from map\n let currentNode: t.CallExpression = node\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n while (true) {\n const callee = currentNode.callee\n if (!t.isMemberExpression(callee)) {\n break\n }\n\n // Record method chain path if it's a known method\n if (t.isIdentifier(callee.property)) {\n const name = callee.property.name as keyof MethodChainPaths\n if (name in methodChain) {\n const currentPath = callExprPaths.get(currentNode)!\n // Get first argument path\n const args = currentPath.get('arguments')\n const firstArgPath =\n Array.isArray(args) && args.length > 0 ? (args[0] ?? null) : null\n methodChain[name] = {\n callPath: currentPath,\n firstArgPath,\n }\n }\n }\n\n // Move to the inner call (the object of the member expression)\n if (!t.isCallExpression(callee.object)) {\n break\n }\n currentNode = callee.object\n }\n\n pathsToRewrite.push({ path, kind, methodChain })\n }\n\n // Verify we found all candidates (pathsToRewrite should have same size as toRewriteMap had)\n if (pathsToRewrite.length !== toRewriteMap.size) {\n throw new Error(\n `Internal error: could not find all paths to rewrite. please file an issue`,\n )\n }\n\n const refIdents = findReferencedIdentifiers(ast)\n\n for (const { path, kind, methodChain } of pathsToRewrite) {\n const candidate: RewriteCandidate = { path, methodChain }\n if (kind === 'ServerFn') {\n handleCreateServerFn(candidate, {\n env: this.options.env,\n code,\n directive: this.options.directive,\n isProviderFile,\n })\n } else {\n handleCreateMiddleware(candidate, {\n env: this.options.env,\n })\n }\n }\n\n deadCodeElimination(ast, refIdents)\n\n return generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: id,\n filename: id,\n })\n }\n\n // collects all candidate CallExpressions at top-level\n private collectCandidates(bindings: Map<string, Binding>) {\n const candidates: Array<t.CallExpression> = []\n\n for (const binding of bindings.values()) {\n if (binding.type === 'var') {\n const candidate = isCandidateCallExpression(\n binding.init,\n this.validLookupKinds,\n )\n if (candidate) {\n candidates.push(candidate)\n }\n }\n }\n return candidates\n }\n\n private async resolveIdentifierKind(\n ident: string,\n id: string,\n visited = new Set<string>(),\n ): Promise<Kind> {\n const info = await this.getModuleInfo(id)\n\n const binding = info.bindings.get(ident)\n if (!binding) {\n return 'None'\n }\n if (binding.resolvedKind) {\n return binding.resolvedKind\n }\n\n // TODO improve cycle detection? should we throw here instead of returning 'None'?\n // prevent cycles\n const vKey = `${id}:${ident}`\n if (visited.has(vKey)) {\n return 'None'\n }\n visited.add(vKey)\n\n const resolvedKind = await this.resolveBindingKind(binding, id, visited)\n binding.resolvedKind = resolvedKind\n return resolvedKind\n }\n\n /**\n * Recursively find an export in a module, following `export * from` chains.\n * Returns the module info and binding if found, or undefined if not found.\n */\n private async findExportInModule(\n moduleInfo: ModuleInfo,\n exportName: string,\n visitedModules = new Set<string>(),\n ): Promise<{ moduleInfo: ModuleInfo; binding: Binding } | undefined> {\n // Prevent infinite loops in circular re-exports\n if (visitedModules.has(moduleInfo.id)) {\n return undefined\n }\n visitedModules.add(moduleInfo.id)\n\n // First check direct exports\n const directExport = moduleInfo.exports.get(exportName)\n if (directExport) {\n const binding = moduleInfo.bindings.get(directExport.name)\n if (binding) {\n return { moduleInfo, binding }\n }\n }\n\n // If not found, recursively check re-export-all sources in parallel\n // Valid code won't have duplicate exports across chains, so first match wins\n if (moduleInfo.reExportAllSources.length > 0) {\n const results = await Promise.all(\n moduleInfo.reExportAllSources.map(async (reExportSource) => {\n const reExportTarget = await this.options.resolveId(\n reExportSource,\n moduleInfo.id,\n )\n if (reExportTarget) {\n const reExportModule = await this.getModuleInfo(reExportTarget)\n return this.findExportInModule(\n reExportModule,\n exportName,\n visitedModules,\n )\n }\n return undefined\n }),\n )\n // Return the first valid result\n for (const result of results) {\n if (result) {\n return result\n }\n }\n }\n\n return undefined\n }\n\n private async resolveBindingKind(\n binding: Binding,\n fileId: string,\n visited = new Set<string>(),\n ): Promise<Kind> {\n if (binding.resolvedKind) {\n return binding.resolvedKind\n }\n if (binding.type === 'import') {\n // Fast path: check if this is a direct import from a known library\n // (e.g., import { createServerFn } from '@tanstack/react-start')\n // This avoids async resolveId calls for the common case\n const knownExports = this.knownRootImports.get(binding.source)\n if (knownExports) {\n const kind = knownExports.get(binding.importedName)\n if (kind) {\n binding.resolvedKind = kind\n return kind\n }\n }\n\n // Slow path: resolve through the module graph\n const target = await this.options.resolveId(binding.source, fileId)\n if (!target) {\n return 'None'\n }\n\n const importedModule = await this.getModuleInfo(target)\n\n // Find the export, recursively searching through export * from chains\n const found = await this.findExportInModule(\n importedModule,\n binding.importedName,\n )\n\n if (!found) {\n return 'None'\n }\n\n const { moduleInfo: foundModule, binding: foundBinding } = found\n\n if (foundBinding.resolvedKind) {\n return foundBinding.resolvedKind\n }\n\n const resolvedKind = await this.resolveBindingKind(\n foundBinding,\n foundModule.id,\n visited,\n )\n foundBinding.resolvedKind = resolvedKind\n return resolvedKind\n }\n\n const resolvedKind = await this.resolveExprKind(\n binding.init,\n fileId,\n visited,\n )\n binding.resolvedKind = resolvedKind\n return resolvedKind\n }\n\n private async resolveExprKind(\n expr: t.Expression | null,\n fileId: string,\n visited = new Set<string>(),\n ): Promise<Kind> {\n if (!expr) {\n return 'None'\n }\n\n // Unwrap common TypeScript/parenthesized wrappers first for efficiency\n while (\n t.isTSAsExpression(expr) ||\n t.isTSNonNullExpression(expr) ||\n t.isParenthesizedExpression(expr)\n ) {\n expr = expr.expression\n }\n\n let result: Kind = 'None'\n\n if (t.isCallExpression(expr)) {\n if (!t.isExpression(expr.callee)) {\n return 'None'\n }\n const calleeKind = await this.resolveCalleeKind(\n expr.callee,\n fileId,\n visited,\n )\n if (calleeKind === 'Root' || calleeKind === 'Builder') {\n return 'Builder'\n }\n // Use direct Set.has() instead of iterating\n if (this.validLookupKinds.has(calleeKind as LookupKind)) {\n return calleeKind\n }\n } else if (t.isMemberExpression(expr) && t.isIdentifier(expr.property)) {\n result = await this.resolveCalleeKind(expr.object, fileId, visited)\n }\n\n if (result === 'None' && t.isIdentifier(expr)) {\n result = await this.resolveIdentifierKind(expr.name, fileId, visited)\n }\n\n return result\n }\n\n private async resolveCalleeKind(\n callee: t.Expression,\n fileId: string,\n visited = new Set<string>(),\n ): Promise<Kind> {\n if (t.isIdentifier(callee)) {\n return this.resolveIdentifierKind(callee.name, fileId, visited)\n }\n\n if (t.isMemberExpression(callee) && t.isIdentifier(callee.property)) {\n const prop = callee.property.name\n\n if (\n this.validLookupKinds.has('ServerFn') &&\n LookupSetup['ServerFn'].candidateCallIdentifier.has(prop)\n ) {\n const base = await this.resolveExprKind(callee.object, fileId, visited)\n if (base === 'Root' || base === 'Builder') {\n return 'ServerFn'\n }\n return 'None'\n } else if (\n this.validLookupKinds.has('Middleware') &&\n LookupSetup['Middleware'].candidateCallIdentifier.has(prop)\n ) {\n const base = await this.resolveExprKind(callee.object, fileId, visited)\n if (base === 'Root' || base === 'Builder' || base === 'Middleware') {\n return 'Middleware'\n }\n return 'None'\n }\n // Check if the object is a namespace import\n if (t.isIdentifier(callee.object)) {\n const info = await this.getModuleInfo(fileId)\n const binding = info.bindings.get(callee.object.name)\n if (\n binding &&\n binding.type === 'import' &&\n binding.importedName === '*'\n ) {\n // resolve the property from the target module\n const targetModuleId = await this.options.resolveId(\n binding.source,\n fileId,\n )\n if (targetModuleId) {\n const targetModule = await this.getModuleInfo(targetModuleId)\n const exportEntry = targetModule.exports.get(callee.property.name)\n if (exportEntry) {\n const exportedBinding = targetModule.bindings.get(\n exportEntry.name,\n )\n if (exportedBinding) {\n return await this.resolveBindingKind(\n exportedBinding,\n targetModule.id,\n visited,\n )\n }\n }\n } else {\n return 'None'\n }\n }\n }\n return this.resolveExprKind(callee.object, fileId, visited)\n }\n\n // handle nested expressions\n return this.resolveExprKind(callee, fileId, visited)\n }\n\n private async getModuleInfo(id: string) {\n let cached = this.moduleCache.get(id)\n if (cached) {\n return cached\n }\n\n await this.options.loadModule(id)\n\n cached = this.moduleCache.get(id)\n if (!cached) {\n throw new Error(`could not load module info for ${id}`)\n }\n return cached\n }\n}\n\nfunction isCandidateCallExpression(\n node: t.Node | null | undefined,\n lookupKinds: Set<LookupKind>,\n): t.CallExpression | undefined {\n if (!t.isCallExpression(node)) return undefined\n\n const callee = node.callee\n if (!t.isMemberExpression(callee) || !t.isIdentifier(callee.property)) {\n return undefined\n }\n\n // Use pre-computed map for O(1) lookup instead of iterating over lookupKinds\n const kind = IdentifierToKind.get(callee.property.name)\n if (kind && lookupKinds.has(kind)) {\n return node\n }\n\n return undefined\n}\n"],"names":["babel","resolvedKind"],"mappings":"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"}
@@ -1,5 +1,10 @@
1
- import * as t from '@babel/types';
2
- import type * as babel from '@babel/core';
3
- export declare function handleCreateMiddleware(path: babel.NodePath<t.CallExpression>, opts: {
1
+ import { RewriteCandidate } from './types.js';
2
+ /**
3
+ * Handles createMiddleware transformations.
4
+ *
5
+ * @param candidate - The rewrite candidate containing path and method chain
6
+ * @param opts - Options including the environment
7
+ */
8
+ export declare function handleCreateMiddleware(candidate: RewriteCandidate, opts: {
4
9
  env: 'client' | 'server';
5
10
  }): void;
@@ -1,48 +1,25 @@
1
1
  import * as t from "@babel/types";
2
- import { getRootCallExpression } from "../start-compiler-plugin/utils.js";
3
- function handleCreateMiddleware(path, opts) {
2
+ function handleCreateMiddleware(candidate, opts) {
4
3
  if (opts.env === "server") {
5
4
  throw new Error("handleCreateMiddleware should not be called on the server");
6
5
  }
7
- const rootCallExpression = getRootCallExpression(path);
8
- const callExpressionPaths = {
9
- middleware: null,
10
- inputValidator: null,
11
- client: null,
12
- server: null
13
- };
14
- const validMethods = Object.keys(callExpressionPaths);
15
- rootCallExpression.traverse({
16
- MemberExpression(memberExpressionPath) {
17
- if (t.isIdentifier(memberExpressionPath.node.property)) {
18
- const name = memberExpressionPath.node.property.name;
19
- if (validMethods.includes(name) && memberExpressionPath.parentPath.isCallExpression()) {
20
- callExpressionPaths[name] = memberExpressionPath.parentPath;
21
- }
22
- }
23
- }
24
- });
25
- if (callExpressionPaths.inputValidator) {
26
- const innerInputExpression = callExpressionPaths.inputValidator.node.arguments[0];
6
+ const { inputValidator, server } = candidate.methodChain;
7
+ if (inputValidator) {
8
+ const innerInputExpression = inputValidator.callPath.node.arguments[0];
27
9
  if (!innerInputExpression) {
28
10
  throw new Error(
29
11
  "createMiddleware().inputValidator() must be called with a validator!"
30
12
  );
31
13
  }
32
- if (t.isMemberExpression(callExpressionPaths.inputValidator.node.callee)) {
33
- callExpressionPaths.inputValidator.replaceWith(
34
- callExpressionPaths.inputValidator.node.callee.object
14
+ if (t.isMemberExpression(inputValidator.callPath.node.callee)) {
15
+ inputValidator.callPath.replaceWith(
16
+ inputValidator.callPath.node.callee.object
35
17
  );
36
18
  }
37
19
  }
38
- const serverFnPath = callExpressionPaths.server?.get(
39
- "arguments.0"
40
- );
41
- if (callExpressionPaths.server && serverFnPath.node) {
42
- if (t.isMemberExpression(callExpressionPaths.server.node.callee)) {
43
- callExpressionPaths.server.replaceWith(
44
- callExpressionPaths.server.node.callee.object
45
- );
20
+ if (server) {
21
+ if (t.isMemberExpression(server.callPath.node.callee)) {
22
+ server.callPath.replaceWith(server.callPath.node.callee.object);
46
23
  }
47
24
  }
48
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"handleCreateMiddleware.js","sources":["../../../src/create-server-fn-plugin/handleCreateMiddleware.ts"],"sourcesContent":["import * as t from '@babel/types'\nimport { getRootCallExpression } from '../start-compiler-plugin/utils'\nimport type * as babel from '@babel/core'\n\nexport function handleCreateMiddleware(\n path: babel.NodePath<t.CallExpression>,\n opts: {\n env: 'client' | 'server'\n },\n) {\n if (opts.env === 'server') {\n throw new Error('handleCreateMiddleware should not be called on the server')\n }\n const rootCallExpression = getRootCallExpression(path)\n\n const callExpressionPaths = {\n middleware: null as babel.NodePath<t.CallExpression> | null,\n inputValidator: null as babel.NodePath<t.CallExpression> | null,\n client: null as babel.NodePath<t.CallExpression> | null,\n server: null as babel.NodePath<t.CallExpression> | null,\n }\n\n const validMethods = Object.keys(callExpressionPaths)\n\n rootCallExpression.traverse({\n MemberExpression(memberExpressionPath) {\n if (t.isIdentifier(memberExpressionPath.node.property)) {\n const name = memberExpressionPath.node.property\n .name as keyof typeof callExpressionPaths\n\n if (\n validMethods.includes(name) &&\n memberExpressionPath.parentPath.isCallExpression()\n ) {\n callExpressionPaths[name] = memberExpressionPath.parentPath\n }\n }\n },\n })\n\n if (callExpressionPaths.inputValidator) {\n const innerInputExpression =\n callExpressionPaths.inputValidator.node.arguments[0]\n\n if (!innerInputExpression) {\n throw new Error(\n 'createMiddleware().inputValidator() must be called with a validator!',\n )\n }\n\n // remove the validator call expression\n if (t.isMemberExpression(callExpressionPaths.inputValidator.node.callee)) {\n callExpressionPaths.inputValidator.replaceWith(\n callExpressionPaths.inputValidator.node.callee.object,\n )\n }\n }\n\n const serverFnPath = callExpressionPaths.server?.get(\n 'arguments.0',\n ) as babel.NodePath<any>\n\n if (callExpressionPaths.server && serverFnPath.node) {\n // remove the server call expression\n if (t.isMemberExpression(callExpressionPaths.server.node.callee)) {\n callExpressionPaths.server.replaceWith(\n callExpressionPaths.server.node.callee.object,\n )\n }\n }\n}\n"],"names":[],"mappings":";;AAIO,SAAS,uBACd,MACA,MAGA;AACA,MAAI,KAAK,QAAQ,UAAU;AACzB,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AACA,QAAM,qBAAqB,sBAAsB,IAAI;AAErD,QAAM,sBAAsB;AAAA,IAC1B,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA;AAGV,QAAM,eAAe,OAAO,KAAK,mBAAmB;AAEpD,qBAAmB,SAAS;AAAA,IAC1B,iBAAiB,sBAAsB;AACrC,UAAI,EAAE,aAAa,qBAAqB,KAAK,QAAQ,GAAG;AACtD,cAAM,OAAO,qBAAqB,KAAK,SACpC;AAEH,YACE,aAAa,SAAS,IAAI,KAC1B,qBAAqB,WAAW,oBAChC;AACA,8BAAoB,IAAI,IAAI,qBAAqB;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAAA,EAAA,CACD;AAED,MAAI,oBAAoB,gBAAgB;AACtC,UAAM,uBACJ,oBAAoB,eAAe,KAAK,UAAU,CAAC;AAErD,QAAI,CAAC,sBAAsB;AACzB,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AAGA,QAAI,EAAE,mBAAmB,oBAAoB,eAAe,KAAK,MAAM,GAAG;AACxE,0BAAoB,eAAe;AAAA,QACjC,oBAAoB,eAAe,KAAK,OAAO;AAAA,MAAA;AAAA,IAEnD;AAAA,EACF;AAEA,QAAM,eAAe,oBAAoB,QAAQ;AAAA,IAC/C;AAAA,EAAA;AAGF,MAAI,oBAAoB,UAAU,aAAa,MAAM;AAEnD,QAAI,EAAE,mBAAmB,oBAAoB,OAAO,KAAK,MAAM,GAAG;AAChE,0BAAoB,OAAO;AAAA,QACzB,oBAAoB,OAAO,KAAK,OAAO;AAAA,MAAA;AAAA,IAE3C;AAAA,EACF;AACF;"}
1
+ {"version":3,"file":"handleCreateMiddleware.js","sources":["../../../src/create-server-fn-plugin/handleCreateMiddleware.ts"],"sourcesContent":["import * as t from '@babel/types'\nimport type { RewriteCandidate } from './types'\n\n/**\n * Handles createMiddleware transformations.\n *\n * @param candidate - The rewrite candidate containing path and method chain\n * @param opts - Options including the environment\n */\nexport function handleCreateMiddleware(\n candidate: RewriteCandidate,\n opts: {\n env: 'client' | 'server'\n },\n) {\n if (opts.env === 'server') {\n throw new Error('handleCreateMiddleware should not be called on the server')\n }\n\n const { inputValidator, server } = candidate.methodChain\n\n if (inputValidator) {\n const innerInputExpression = inputValidator.callPath.node.arguments[0]\n\n if (!innerInputExpression) {\n throw new Error(\n 'createMiddleware().inputValidator() must be called with a validator!',\n )\n }\n\n // remove the validator call expression\n if (t.isMemberExpression(inputValidator.callPath.node.callee)) {\n inputValidator.callPath.replaceWith(\n inputValidator.callPath.node.callee.object,\n )\n }\n }\n\n if (server) {\n // remove the server call expression\n if (t.isMemberExpression(server.callPath.node.callee)) {\n server.callPath.replaceWith(server.callPath.node.callee.object)\n }\n }\n}\n"],"names":[],"mappings":";AASO,SAAS,uBACd,WACA,MAGA;AACA,MAAI,KAAK,QAAQ,UAAU;AACzB,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AAEA,QAAM,EAAE,gBAAgB,OAAA,IAAW,UAAU;AAE7C,MAAI,gBAAgB;AAClB,UAAM,uBAAuB,eAAe,SAAS,KAAK,UAAU,CAAC;AAErE,QAAI,CAAC,sBAAsB;AACzB,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AAGA,QAAI,EAAE,mBAAmB,eAAe,SAAS,KAAK,MAAM,GAAG;AAC7D,qBAAe,SAAS;AAAA,QACtB,eAAe,SAAS,KAAK,OAAO;AAAA,MAAA;AAAA,IAExC;AAAA,EACF;AAEA,MAAI,QAAQ;AAEV,QAAI,EAAE,mBAAmB,OAAO,SAAS,KAAK,MAAM,GAAG;AACrD,aAAO,SAAS,YAAY,OAAO,SAAS,KAAK,OAAO,MAAM;AAAA,IAChE;AAAA,EACF;AACF;"}
@@ -1,6 +1,11 @@
1
- import * as t from '@babel/types';
2
- import type * as babel from '@babel/core';
3
- export declare function handleCreateServerFn(path: babel.NodePath<t.CallExpression>, opts: {
1
+ import { RewriteCandidate } from './types.js';
2
+ /**
3
+ * Handles createServerFn transformations.
4
+ *
5
+ * @param candidate - The rewrite candidate containing path and method chain
6
+ * @param opts - Options including the environment, code, directive, and provider file flag
7
+ */
8
+ export declare function handleCreateServerFn(candidate: RewriteCandidate, opts: {
4
9
  env: 'client' | 'server';
5
10
  code: string;
6
11
  directive: string;