@tanstack/router-plugin 1.167.2 → 1.167.3
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.
- package/dist/cjs/core/code-splitter/compilers.cjs +28 -21
- package/dist/cjs/core/code-splitter/compilers.cjs.map +1 -1
- package/dist/cjs/core/code-splitter/plugins/framework-plugins.cjs +6 -1
- package/dist/cjs/core/code-splitter/plugins/framework-plugins.cjs.map +1 -1
- package/dist/cjs/core/code-splitter/plugins/react-refresh-ignored-route-exports.cjs +49 -0
- package/dist/cjs/core/code-splitter/plugins/react-refresh-ignored-route-exports.cjs.map +1 -0
- package/dist/cjs/core/code-splitter/plugins/react-refresh-ignored-route-exports.d.cts +2 -0
- package/dist/cjs/core/code-splitter/plugins/react-refresh-route-components.cjs +24 -12
- package/dist/cjs/core/code-splitter/plugins/react-refresh-route-components.cjs.map +1 -1
- package/dist/cjs/core/code-splitter/plugins.d.cts +2 -0
- package/dist/cjs/core/route-hmr-statement.cjs +58 -15
- package/dist/cjs/core/route-hmr-statement.cjs.map +1 -1
- package/dist/cjs/core/route-hmr-statement.d.cts +1 -1
- package/dist/cjs/core/router-code-splitter-plugin.cjs +3 -3
- package/dist/cjs/core/router-code-splitter-plugin.cjs.map +1 -1
- package/dist/cjs/core/router-hmr-plugin.cjs +2 -2
- package/dist/cjs/core/router-hmr-plugin.cjs.map +1 -1
- package/dist/cjs/core/utils.cjs +6 -0
- package/dist/cjs/core/utils.cjs.map +1 -1
- package/dist/cjs/core/utils.d.cts +1 -0
- package/dist/esm/core/code-splitter/compilers.js +23 -16
- package/dist/esm/core/code-splitter/compilers.js.map +1 -1
- package/dist/esm/core/code-splitter/plugins/framework-plugins.js +6 -1
- package/dist/esm/core/code-splitter/plugins/framework-plugins.js.map +1 -1
- package/dist/esm/core/code-splitter/plugins/react-refresh-ignored-route-exports.d.ts +2 -0
- package/dist/esm/core/code-splitter/plugins/react-refresh-ignored-route-exports.js +46 -0
- package/dist/esm/core/code-splitter/plugins/react-refresh-ignored-route-exports.js.map +1 -0
- package/dist/esm/core/code-splitter/plugins/react-refresh-route-components.js +25 -13
- package/dist/esm/core/code-splitter/plugins/react-refresh-route-components.js.map +1 -1
- package/dist/esm/core/code-splitter/plugins.d.ts +2 -0
- package/dist/esm/core/route-hmr-statement.d.ts +1 -1
- package/dist/esm/core/route-hmr-statement.js +58 -15
- package/dist/esm/core/route-hmr-statement.js.map +1 -1
- package/dist/esm/core/router-code-splitter-plugin.js +3 -3
- package/dist/esm/core/router-code-splitter-plugin.js.map +1 -1
- package/dist/esm/core/router-hmr-plugin.js +3 -3
- package/dist/esm/core/router-hmr-plugin.js.map +1 -1
- package/dist/esm/core/utils.d.ts +1 -0
- package/dist/esm/core/utils.js +6 -1
- package/dist/esm/core/utils.js.map +1 -1
- package/package.json +4 -4
- package/src/core/code-splitter/compilers.ts +47 -25
- package/src/core/code-splitter/plugins/framework-plugins.ts +2 -0
- package/src/core/code-splitter/plugins/react-refresh-ignored-route-exports.ts +65 -0
- package/src/core/code-splitter/plugins/react-refresh-route-components.ts +68 -39
- package/src/core/code-splitter/plugins.ts +4 -0
- package/src/core/route-hmr-statement.ts +141 -25
- package/src/core/router-code-splitter-plugin.ts +2 -2
- package/src/core/router-hmr-plugin.ts +7 -6
- package/src/core/utils.ts +18 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
|
|
2
2
|
const require_constants = require("../constants.cjs");
|
|
3
3
|
const require_route_hmr_statement = require("../route-hmr-statement.cjs");
|
|
4
|
+
const require_utils = require("../utils.cjs");
|
|
4
5
|
const require_path_ids = require("./path-ids.cjs");
|
|
5
6
|
const require_framework_options = require("./framework-options.cjs");
|
|
6
7
|
let _tanstack_router_utils = require("@tanstack/router-utils");
|
|
@@ -100,10 +101,6 @@ function collectIdentifiersFromNode(node) {
|
|
|
100
101
|
})(node);
|
|
101
102
|
return ids;
|
|
102
103
|
}
|
|
103
|
-
function getObjectPropertyKeyName(prop) {
|
|
104
|
-
if (_babel_types.isIdentifier(prop.key)) return prop.key.name;
|
|
105
|
-
if (_babel_types.isStringLiteral(prop.key)) return prop.key.value;
|
|
106
|
-
}
|
|
107
104
|
/**
|
|
108
105
|
* Build a map from binding name → declaration AST node for all
|
|
109
106
|
* locally-declared module-level bindings. Built once, O(1) lookup.
|
|
@@ -171,7 +168,7 @@ function computeSharedBindings(opts) {
|
|
|
171
168
|
let hasNonSplit = false;
|
|
172
169
|
for (const prop of routeOptions.properties) {
|
|
173
170
|
if (!_babel_types.isObjectProperty(prop)) continue;
|
|
174
|
-
const key = getObjectPropertyKeyName(prop);
|
|
171
|
+
const key = require_utils.getObjectPropertyKeyName(prop);
|
|
175
172
|
if (!key) continue;
|
|
176
173
|
if (key === "codeSplitGroupings") continue;
|
|
177
174
|
if (_babel_types.isIdentifier(prop.value) && prop.value.name === "undefined") continue;
|
|
@@ -188,7 +185,7 @@ function computeSharedBindings(opts) {
|
|
|
188
185
|
const refsByGroup = /* @__PURE__ */ new Map();
|
|
189
186
|
for (const prop of routeOptions.properties) {
|
|
190
187
|
if (!_babel_types.isObjectProperty(prop)) continue;
|
|
191
|
-
const key = getObjectPropertyKeyName(prop);
|
|
188
|
+
const key = require_utils.getObjectPropertyKeyName(prop);
|
|
192
189
|
if (!key) continue;
|
|
193
190
|
if (key === "codeSplitGroupings") continue;
|
|
194
191
|
const groupIndex = findIndexForSplitNode(key);
|
|
@@ -369,6 +366,7 @@ function compileCodeSplitReferenceRoute(opts) {
|
|
|
369
366
|
const PACKAGE = frameworkOptions.package;
|
|
370
367
|
const LAZY_ROUTE_COMPONENT_IDENT = frameworkOptions.idents.lazyRouteComponent;
|
|
371
368
|
const LAZY_FN_IDENT = frameworkOptions.idents.lazyFn;
|
|
369
|
+
const stableRouteOptionKeys = [...new Set((opts.compilerPlugins ?? []).flatMap((plugin) => plugin.getStableRouteOptionKeys?.() ?? []))];
|
|
372
370
|
let createRouteFn;
|
|
373
371
|
let modified = false;
|
|
374
372
|
let hmrAdded = false;
|
|
@@ -392,10 +390,27 @@ function compileCodeSplitReferenceRoute(opts) {
|
|
|
392
390
|
const hasImportedOrDefinedIdentifier = (name) => {
|
|
393
391
|
return programPath.scope.hasBinding(name);
|
|
394
392
|
};
|
|
393
|
+
const addRouteHmr = (insertionPath, routeOptions) => {
|
|
394
|
+
if (!opts.addHmr || hmrAdded) return;
|
|
395
|
+
opts.compilerPlugins?.forEach((plugin) => {
|
|
396
|
+
if ((plugin.onAddHmr?.({
|
|
397
|
+
programPath,
|
|
398
|
+
callExpressionPath: path,
|
|
399
|
+
insertionPath,
|
|
400
|
+
routeOptions,
|
|
401
|
+
createRouteFn,
|
|
402
|
+
opts
|
|
403
|
+
}))?.modified) modified = true;
|
|
404
|
+
});
|
|
405
|
+
programPath.pushContainer("body", require_route_hmr_statement.createRouteHmrStatement(stableRouteOptionKeys));
|
|
406
|
+
modified = true;
|
|
407
|
+
hmrAdded = true;
|
|
408
|
+
};
|
|
395
409
|
if (_babel_types.isObjectExpression(routeOptions)) {
|
|
410
|
+
const insertionPath = path.getStatementParent() ?? path;
|
|
396
411
|
if (opts.deleteNodes && opts.deleteNodes.size > 0) routeOptions.properties = routeOptions.properties.filter((prop) => {
|
|
397
412
|
if (_babel_types.isObjectProperty(prop)) {
|
|
398
|
-
const key = getObjectPropertyKeyName(prop);
|
|
413
|
+
const key = require_utils.getObjectPropertyKeyName(prop);
|
|
399
414
|
if (key && opts.deleteNodes.has(key)) {
|
|
400
415
|
modified = true;
|
|
401
416
|
return false;
|
|
@@ -404,7 +419,6 @@ function compileCodeSplitReferenceRoute(opts) {
|
|
|
404
419
|
return true;
|
|
405
420
|
});
|
|
406
421
|
if (!splittableCreateRouteFns.includes(createRouteFn)) {
|
|
407
|
-
const insertionPath = path.getStatementParent() ?? path;
|
|
408
422
|
opts.compilerPlugins?.forEach((plugin) => {
|
|
409
423
|
if ((plugin.onUnsplittableRoute?.({
|
|
410
424
|
programPath,
|
|
@@ -415,16 +429,12 @@ function compileCodeSplitReferenceRoute(opts) {
|
|
|
415
429
|
opts
|
|
416
430
|
}))?.modified) modified = true;
|
|
417
431
|
});
|
|
418
|
-
|
|
419
|
-
programPath.pushContainer("body", require_route_hmr_statement.routeHmrStatement);
|
|
420
|
-
modified = true;
|
|
421
|
-
hmrAdded = true;
|
|
422
|
-
}
|
|
432
|
+
addRouteHmr(insertionPath, routeOptions);
|
|
423
433
|
return programPath.stop();
|
|
424
434
|
}
|
|
425
435
|
routeOptions.properties.forEach((prop) => {
|
|
426
436
|
if (_babel_types.isObjectProperty(prop)) {
|
|
427
|
-
const key = getObjectPropertyKeyName(prop);
|
|
437
|
+
const key = require_utils.getObjectPropertyKeyName(prop);
|
|
428
438
|
if (key) {
|
|
429
439
|
const codeSplitGroupingByKey = findIndexForSplitNode(key);
|
|
430
440
|
if (codeSplitGroupingByKey === -1) return;
|
|
@@ -467,11 +477,7 @@ function compileCodeSplitReferenceRoute(opts) {
|
|
|
467
477
|
}
|
|
468
478
|
if (splitPropValue) prop.value = splitPropValue;
|
|
469
479
|
else prop.value = _babel_template.expression(`${LAZY_ROUTE_COMPONENT_IDENT}(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`)();
|
|
470
|
-
|
|
471
|
-
programPath.pushContainer("body", require_route_hmr_statement.routeHmrStatement);
|
|
472
|
-
modified = true;
|
|
473
|
-
hmrAdded = true;
|
|
474
|
-
}
|
|
480
|
+
addRouteHmr(insertionPath, routeOptions);
|
|
475
481
|
} else {
|
|
476
482
|
const value = prop.value;
|
|
477
483
|
let shouldSplit = true;
|
|
@@ -493,6 +499,7 @@ function compileCodeSplitReferenceRoute(opts) {
|
|
|
493
499
|
}
|
|
494
500
|
programPath.scope.crawl();
|
|
495
501
|
});
|
|
502
|
+
addRouteHmr(insertionPath, routeOptions);
|
|
496
503
|
}
|
|
497
504
|
}
|
|
498
505
|
if (_babel_types.isCallExpression(path.parentPath.node)) babelHandleReference(resolveIdentifier(path, path.parentPath.node.arguments[0]));
|
|
@@ -568,7 +575,7 @@ function compileCodeSplitVirtualRoute(opts) {
|
|
|
568
575
|
if (_babel_types.isObjectExpression(options)) {
|
|
569
576
|
options.properties.forEach((prop) => {
|
|
570
577
|
if (_babel_types.isObjectProperty(prop)) KNOWN_SPLIT_ROUTE_IDENTS.forEach((splitType) => {
|
|
571
|
-
if (getObjectPropertyKeyName(prop) !== splitType) return;
|
|
578
|
+
if (require_utils.getObjectPropertyKeyName(prop) !== splitType) return;
|
|
572
579
|
const value = prop.value;
|
|
573
580
|
if (_babel_types.isIdentifier(value) && value.name === "undefined") return;
|
|
574
581
|
let isExported = false;
|
|
@@ -762,7 +769,7 @@ function detectCodeSplitGroupingsFromRoute(opts) {
|
|
|
762
769
|
function babelHandleSplittingGroups(routeOptions) {
|
|
763
770
|
if (_babel_types.isObjectExpression(routeOptions)) routeOptions.properties.forEach((prop) => {
|
|
764
771
|
if (_babel_types.isObjectProperty(prop)) {
|
|
765
|
-
if (getObjectPropertyKeyName(prop) === "codeSplitGroupings") {
|
|
772
|
+
if (require_utils.getObjectPropertyKeyName(prop) === "codeSplitGroupings") {
|
|
766
773
|
const value = prop.value;
|
|
767
774
|
if (_babel_types.isArrayExpression(value)) codeSplitGroupings = value.elements.map((group) => {
|
|
768
775
|
if (_babel_types.isArrayExpression(group)) return group.elements.map((node) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compilers.cjs","names":[],"sources":["../../../../src/core/code-splitter/compilers.ts"],"sourcesContent":["import * as t from '@babel/types'\nimport * as babel from '@babel/core'\nimport * as template from '@babel/template'\nimport {\n deadCodeElimination,\n findReferencedIdentifiers,\n generateFromAst,\n parseAst,\n} from '@tanstack/router-utils'\nimport { tsrShared, tsrSplit } from '../constants'\nimport { routeHmrStatement } from '../route-hmr-statement'\nimport { createIdentifier } from './path-ids'\nimport { getFrameworkOptions } from './framework-options'\nimport type {\n CompileCodeSplitReferenceRouteOptions,\n ReferenceRouteCompilerPlugin,\n} from './plugins'\nimport type { GeneratorResult, ParseAstOptions } from '@tanstack/router-utils'\nimport type { CodeSplitGroupings, SplitRouteIdentNodes } from '../constants'\nimport type { Config, DeletableNodes } from '../config'\nimport type { SplitNodeMeta } from './types'\n\nconst SPLIT_NODES_CONFIG = new Map<SplitRouteIdentNodes, SplitNodeMeta>([\n [\n 'loader',\n {\n routeIdent: 'loader',\n localImporterIdent: '$$splitLoaderImporter', // const $$splitLoaderImporter = () => import('...')\n splitStrategy: 'lazyFn',\n localExporterIdent: 'SplitLoader', // const SplitLoader = ...\n exporterIdent: 'loader', // export { SplitLoader as loader }\n },\n ],\n [\n 'component',\n {\n routeIdent: 'component',\n localImporterIdent: '$$splitComponentImporter', // const $$splitComponentImporter = () => import('...')\n splitStrategy: 'lazyRouteComponent',\n localExporterIdent: 'SplitComponent', // const SplitComponent = ...\n exporterIdent: 'component', // export { SplitComponent as component }\n },\n ],\n [\n 'pendingComponent',\n {\n routeIdent: 'pendingComponent',\n localImporterIdent: '$$splitPendingComponentImporter', // const $$splitPendingComponentImporter = () => import('...')\n splitStrategy: 'lazyRouteComponent',\n localExporterIdent: 'SplitPendingComponent', // const SplitPendingComponent = ...\n exporterIdent: 'pendingComponent', // export { SplitPendingComponent as pendingComponent }\n },\n ],\n [\n 'errorComponent',\n {\n routeIdent: 'errorComponent',\n localImporterIdent: '$$splitErrorComponentImporter', // const $$splitErrorComponentImporter = () => import('...')\n splitStrategy: 'lazyRouteComponent',\n localExporterIdent: 'SplitErrorComponent', // const SplitErrorComponent = ...\n exporterIdent: 'errorComponent', // export { SplitErrorComponent as errorComponent }\n },\n ],\n [\n 'notFoundComponent',\n {\n routeIdent: 'notFoundComponent',\n localImporterIdent: '$$splitNotFoundComponentImporter', // const $$splitNotFoundComponentImporter = () => import('...')\n splitStrategy: 'lazyRouteComponent',\n localExporterIdent: 'SplitNotFoundComponent', // const SplitNotFoundComponent = ...\n exporterIdent: 'notFoundComponent', // export { SplitNotFoundComponent as notFoundComponent }\n },\n ],\n])\nconst KNOWN_SPLIT_ROUTE_IDENTS = [...SPLIT_NODES_CONFIG.keys()] as const\n\nfunction addSplitSearchParamToFilename(\n filename: string,\n grouping: Array<string>,\n) {\n const [bareFilename] = filename.split('?')\n\n const params = new URLSearchParams()\n params.append(tsrSplit, createIdentifier(grouping))\n\n const result = `${bareFilename}?${params.toString()}`\n return result\n}\n\nfunction removeSplitSearchParamFromFilename(filename: string) {\n const [bareFilename] = filename.split('?')\n return bareFilename!\n}\n\nexport function addSharedSearchParamToFilename(filename: string) {\n const [bareFilename] = filename.split('?')\n return `${bareFilename}?${tsrShared}=1`\n}\n\nconst splittableCreateRouteFns = ['createFileRoute']\nconst unsplittableCreateRouteFns = [\n 'createRootRoute',\n 'createRootRouteWithContext',\n]\nconst allCreateRouteFns = [\n ...splittableCreateRouteFns,\n ...unsplittableCreateRouteFns,\n]\n\n/**\n * Recursively walk an AST node and collect referenced identifier-like names.\n * Much cheaper than babel.traverse — no path/scope overhead.\n *\n * Notes:\n * - Uses @babel/types `isReferenced` to avoid collecting non-references like\n * object keys, member expression properties, or binding identifiers.\n * - Also handles JSX identifiers for component references.\n */\nexport function collectIdentifiersFromNode(node: t.Node): Set<string> {\n const ids = new Set<string>()\n\n ;(function walk(\n n: t.Node | null | undefined,\n parent?: t.Node,\n grandparent?: t.Node,\n parentKey?: string,\n ) {\n if (!n) return\n\n if (t.isIdentifier(n)) {\n // When we don't have parent info (node passed in isolation), treat as referenced.\n if (!parent || t.isReferenced(n, parent, grandparent)) {\n ids.add(n.name)\n }\n return\n }\n\n if (t.isJSXIdentifier(n)) {\n // Skip attribute names: <div data-testid=\"x\" />\n if (parent && t.isJSXAttribute(parent) && parentKey === 'name') {\n return\n }\n\n // Skip member properties: <Foo.Bar /> should count Foo, not Bar\n if (\n parent &&\n t.isJSXMemberExpression(parent) &&\n parentKey === 'property'\n ) {\n return\n }\n\n // Intrinsic elements (lowercase) are not identifiers\n const first = n.name[0]\n if (first && first === first.toLowerCase()) {\n return\n }\n\n ids.add(n.name)\n return\n }\n\n for (const key of t.VISITOR_KEYS[n.type] || []) {\n const child = (n as any)[key]\n if (Array.isArray(child)) {\n for (const c of child) {\n if (c && typeof c.type === 'string') {\n walk(c, n, parent, key)\n }\n }\n } else if (child && typeof child.type === 'string') {\n walk(child, n, parent, key)\n }\n }\n })(node)\n\n return ids\n}\n\nfunction getObjectPropertyKeyName(prop: t.ObjectProperty): string | undefined {\n if (t.isIdentifier(prop.key)) {\n return prop.key.name\n }\n\n if (t.isStringLiteral(prop.key)) {\n return prop.key.value\n }\n\n return undefined\n}\n\n/**\n * Build a map from binding name → declaration AST node for all\n * locally-declared module-level bindings. Built once, O(1) lookup.\n */\nexport function buildDeclarationMap(ast: t.File): Map<string, t.Node> {\n const map = new Map<string, t.Node>()\n for (const stmt of ast.program.body) {\n const decl =\n t.isExportNamedDeclaration(stmt) && stmt.declaration\n ? stmt.declaration\n : stmt\n\n if (t.isVariableDeclaration(decl)) {\n for (const declarator of decl.declarations) {\n for (const name of collectIdentifiersFromPattern(declarator.id)) {\n map.set(name, declarator)\n }\n }\n } else if (t.isFunctionDeclaration(decl) && decl.id) {\n map.set(decl.id.name, decl)\n } else if (t.isClassDeclaration(decl) && decl.id) {\n map.set(decl.id.name, decl)\n }\n }\n return map\n}\n\n/**\n * Build a dependency graph: for each local binding, the set of other local\n * bindings its declaration references. Built once via simple node walking.\n */\nexport function buildDependencyGraph(\n declMap: Map<string, t.Node>,\n localBindings: Set<string>,\n): Map<string, Set<string>> {\n const graph = new Map<string, Set<string>>()\n for (const [name, declNode] of declMap) {\n if (!localBindings.has(name)) continue\n const allIds = collectIdentifiersFromNode(declNode)\n const deps = new Set<string>()\n for (const id of allIds) {\n if (id !== name && localBindings.has(id)) deps.add(id)\n }\n graph.set(name, deps)\n }\n return graph\n}\n\n/**\n * Computes module-level bindings that are shared between split and non-split\n * route properties. These bindings need to be extracted into a shared virtual\n * module to avoid double-initialization.\n *\n * A binding is \"shared\" if it is referenced by at least one split property\n * AND at least one non-split property. Only locally-declared module-level\n * bindings are candidates (not imports — bundlers dedupe those).\n */\nexport function computeSharedBindings(opts: {\n code: string\n codeSplitGroupings: CodeSplitGroupings\n}): Set<string> {\n const ast = parseAst(opts)\n\n // Early bailout: collect all module-level locally-declared binding names.\n // This is a cheap loop over program.body (no traversal). If the file has\n // no local bindings (aside from `Route`), nothing can be shared — skip\n // the expensive babel.traverse entirely.\n const localModuleLevelBindings = new Set<string>()\n for (const node of ast.program.body) {\n collectLocalBindingsFromStatement(node, localModuleLevelBindings)\n }\n\n // File-based routes always export a route config binding (usually `Route`).\n // This must never be extracted into the shared module.\n localModuleLevelBindings.delete('Route')\n\n if (localModuleLevelBindings.size === 0) {\n return new Set()\n }\n\n function findIndexForSplitNode(str: string) {\n return opts.codeSplitGroupings.findIndex((group) =>\n group.includes(str as any),\n )\n }\n\n // Find the route options object — needs babel.traverse for scope resolution\n let routeOptions: t.ObjectExpression | undefined\n\n babel.traverse(ast, {\n CallExpression(path) {\n if (!t.isIdentifier(path.node.callee)) return\n if (!splittableCreateRouteFns.includes(path.node.callee.name)) return\n\n if (t.isCallExpression(path.parentPath.node)) {\n const opts = resolveIdentifier(path, path.parentPath.node.arguments[0])\n if (t.isObjectExpression(opts)) routeOptions = opts\n } else if (t.isVariableDeclarator(path.parentPath.node)) {\n const caller = resolveIdentifier(path, path.parentPath.node.init)\n if (t.isCallExpression(caller)) {\n const opts = resolveIdentifier(path, caller.arguments[0])\n if (t.isObjectExpression(opts)) routeOptions = opts\n }\n }\n },\n })\n\n if (!routeOptions) return new Set()\n\n // Fast path: if fewer than 2 distinct groups are referenced by route options,\n // nothing can be shared and we can skip the rest of the work.\n const splitGroupsPresent = new Set<number>()\n let hasNonSplit = false\n for (const prop of routeOptions.properties) {\n if (!t.isObjectProperty(prop)) continue\n const key = getObjectPropertyKeyName(prop)\n if (!key) continue\n if (key === 'codeSplitGroupings') continue\n if (t.isIdentifier(prop.value) && prop.value.name === 'undefined') continue\n const groupIndex = findIndexForSplitNode(key) // -1 if non-split\n if (groupIndex === -1) {\n hasNonSplit = true\n } else {\n splitGroupsPresent.add(groupIndex)\n }\n }\n\n if (!hasNonSplit && splitGroupsPresent.size < 2) return new Set()\n\n // Build dependency graph up front — needed for transitive expansion per-property.\n // This graph excludes `Route` (deleted above) so group attribution works correctly.\n const declMap = buildDeclarationMap(ast)\n const depGraph = buildDependencyGraph(declMap, localModuleLevelBindings)\n\n // Build a second dependency graph that includes `Route` so we can detect\n // bindings that transitively depend on it. Such bindings must NOT be\n // extracted into the shared module because they would drag the Route\n // singleton with them, duplicating it across modules.\n const allLocalBindings = new Set(localModuleLevelBindings)\n allLocalBindings.add('Route')\n const fullDepGraph = buildDependencyGraph(declMap, allLocalBindings)\n\n // For each route property, track which \"group\" it belongs to.\n // Non-split properties get group index -1.\n // Split properties get their codeSplitGroupings index (0, 1, ...).\n // A binding is \"shared\" if it appears in 2+ distinct groups.\n // We expand each property's refs transitively BEFORE comparing groups,\n // so indirect refs (e.g., component: MyComp where MyComp uses `shared`)\n // are correctly attributed.\n const refsByGroup = new Map<string, Set<number>>()\n\n for (const prop of routeOptions.properties) {\n if (!t.isObjectProperty(prop)) continue\n const key = getObjectPropertyKeyName(prop)\n if (!key) continue\n\n if (key === 'codeSplitGroupings') continue\n\n const groupIndex = findIndexForSplitNode(key) // -1 if non-split\n\n const directRefs = collectModuleLevelRefsFromNode(\n prop.value,\n localModuleLevelBindings,\n )\n\n // Expand transitively: if component references SharedComp which references\n // `shared`, then `shared` is also attributed to component's group.\n const allRefs = new Set(directRefs)\n expandTransitively(allRefs, depGraph)\n\n for (const ref of allRefs) {\n let groups = refsByGroup.get(ref)\n if (!groups) {\n groups = new Set()\n refsByGroup.set(ref, groups)\n }\n groups.add(groupIndex)\n }\n }\n\n // Shared = bindings appearing in 2+ distinct groups\n const shared = new Set<string>()\n for (const [name, groups] of refsByGroup) {\n if (groups.size >= 2) shared.add(name)\n }\n\n // Destructured declarators (e.g. `const { a, b } = fn()`) must be treated\n // as a single initialization unit. Even if each binding is referenced by\n // only one group, if *different* bindings from the same declarator are\n // referenced by different groups, the declarator must be extracted to the\n // shared module to avoid double initialization.\n expandSharedDestructuredDeclarators(ast, refsByGroup, shared)\n\n if (shared.size === 0) return shared\n\n // If any binding from a destructured declaration is shared,\n // all bindings from that declaration must be shared\n expandDestructuredDeclarations(ast, shared)\n\n // Remove shared bindings that transitively depend on `Route`.\n // The Route singleton must stay in the reference file; extracting a\n // binding that references it would duplicate Route in the shared module.\n removeBindingsDependingOnRoute(shared, fullDepGraph)\n\n return shared\n}\n\n/**\n * If bindings from the same destructured declarator are referenced by\n * different groups, mark all bindings from that declarator as shared.\n */\nexport function expandSharedDestructuredDeclarators(\n ast: t.File,\n refsByGroup: Map<string, Set<number>>,\n shared: Set<string>,\n) {\n for (const stmt of ast.program.body) {\n const decl =\n t.isExportNamedDeclaration(stmt) && stmt.declaration\n ? stmt.declaration\n : stmt\n\n if (!t.isVariableDeclaration(decl)) continue\n\n for (const declarator of decl.declarations) {\n if (!t.isObjectPattern(declarator.id) && !t.isArrayPattern(declarator.id))\n continue\n\n const names = collectIdentifiersFromPattern(declarator.id)\n\n const usedGroups = new Set<number>()\n for (const name of names) {\n const groups = refsByGroup.get(name)\n if (!groups) continue\n for (const g of groups) usedGroups.add(g)\n }\n\n if (usedGroups.size >= 2) {\n for (const name of names) {\n shared.add(name)\n }\n }\n }\n }\n}\n\n/**\n * Collect locally-declared module-level binding names from a statement.\n * Pure node inspection, no traversal.\n */\nexport function collectLocalBindingsFromStatement(\n node: t.Statement | t.ModuleDeclaration,\n bindings: Set<string>,\n) {\n const decl =\n t.isExportNamedDeclaration(node) && node.declaration\n ? node.declaration\n : node\n\n if (t.isVariableDeclaration(decl)) {\n for (const declarator of decl.declarations) {\n for (const name of collectIdentifiersFromPattern(declarator.id)) {\n bindings.add(name)\n }\n }\n } else if (t.isFunctionDeclaration(decl) && decl.id) {\n bindings.add(decl.id.name)\n } else if (t.isClassDeclaration(decl) && decl.id) {\n bindings.add(decl.id.name)\n }\n}\n\n/**\n * Collect direct module-level binding names referenced from a given AST node.\n * Uses a simple recursive walk instead of babel.traverse.\n */\nexport function collectModuleLevelRefsFromNode(\n node: t.Node,\n localModuleLevelBindings: Set<string>,\n): Set<string> {\n const allIds = collectIdentifiersFromNode(node)\n const refs = new Set<string>()\n for (const name of allIds) {\n if (localModuleLevelBindings.has(name)) refs.add(name)\n }\n return refs\n}\n\n/**\n * Expand the shared set transitively using a prebuilt dependency graph.\n * No AST traversals — pure graph BFS.\n */\nexport function expandTransitively(\n shared: Set<string>,\n depGraph: Map<string, Set<string>>,\n) {\n const queue = [...shared]\n const visited = new Set<string>()\n\n while (queue.length > 0) {\n const name = queue.pop()!\n if (visited.has(name)) continue\n visited.add(name)\n\n const deps = depGraph.get(name)\n if (!deps) continue\n\n for (const dep of deps) {\n if (!shared.has(dep)) {\n shared.add(dep)\n queue.push(dep)\n }\n }\n }\n}\n\n/**\n * Remove any bindings from `shared` that transitively depend on `Route`.\n * The Route singleton must remain in the reference file; if a shared binding\n * references it (directly or transitively), extracting that binding would\n * duplicate Route in the shared module.\n *\n * Uses `depGraph` which must include `Route` as a node so the dependency\n * chain is visible.\n */\nexport function removeBindingsDependingOnRoute(\n shared: Set<string>,\n depGraph: Map<string, Set<string>>,\n) {\n const reverseGraph = new Map<string, Set<string>>()\n for (const [name, deps] of depGraph) {\n for (const dep of deps) {\n let parents = reverseGraph.get(dep)\n if (!parents) {\n parents = new Set<string>()\n reverseGraph.set(dep, parents)\n }\n parents.add(name)\n }\n }\n\n // Walk backwards from Route to find all bindings that can reach it.\n const visited = new Set<string>()\n const queue = ['Route']\n while (queue.length > 0) {\n const cur = queue.pop()!\n if (visited.has(cur)) continue\n visited.add(cur)\n\n const parents = reverseGraph.get(cur)\n if (!parents) continue\n for (const parent of parents) {\n if (!visited.has(parent)) queue.push(parent)\n }\n }\n\n for (const name of [...shared]) {\n if (visited.has(name)) {\n shared.delete(name)\n }\n }\n}\n\n/**\n * If any binding from a destructured declaration is shared,\n * ensure all bindings from that same declaration are also shared.\n * Pure node inspection of program.body, no traversal.\n */\nexport function expandDestructuredDeclarations(\n ast: t.File,\n shared: Set<string>,\n) {\n for (const stmt of ast.program.body) {\n const decl =\n t.isExportNamedDeclaration(stmt) && stmt.declaration\n ? stmt.declaration\n : stmt\n\n if (!t.isVariableDeclaration(decl)) continue\n\n for (const declarator of decl.declarations) {\n if (!t.isObjectPattern(declarator.id) && !t.isArrayPattern(declarator.id))\n continue\n\n const names = collectIdentifiersFromPattern(declarator.id)\n const hasShared = names.some((n) => shared.has(n))\n if (hasShared) {\n for (const n of names) {\n shared.add(n)\n }\n }\n }\n }\n}\n\n/**\n * Find which shared bindings are user-exported in the original source.\n * These need to be re-exported from the shared module.\n */\nfunction findExportedSharedBindings(\n ast: t.File,\n sharedBindings: Set<string>,\n): Set<string> {\n const exported = new Set<string>()\n for (const stmt of ast.program.body) {\n if (!t.isExportNamedDeclaration(stmt) || !stmt.declaration) continue\n\n if (t.isVariableDeclaration(stmt.declaration)) {\n for (const decl of stmt.declaration.declarations) {\n for (const name of collectIdentifiersFromPattern(decl.id)) {\n if (sharedBindings.has(name)) exported.add(name)\n }\n }\n } else if (\n t.isFunctionDeclaration(stmt.declaration) &&\n stmt.declaration.id\n ) {\n if (sharedBindings.has(stmt.declaration.id.name))\n exported.add(stmt.declaration.id.name)\n } else if (t.isClassDeclaration(stmt.declaration) && stmt.declaration.id) {\n if (sharedBindings.has(stmt.declaration.id.name))\n exported.add(stmt.declaration.id.name)\n }\n }\n return exported\n}\n\n/**\n * Remove declarations of shared bindings from the AST.\n * Handles both plain and exported declarations, including destructured patterns.\n * Removes the entire statement if all bindings in it are shared.\n */\nfunction removeSharedDeclarations(ast: t.File, sharedBindings: Set<string>) {\n ast.program.body = ast.program.body.filter((stmt) => {\n const decl =\n t.isExportNamedDeclaration(stmt) && stmt.declaration\n ? stmt.declaration\n : stmt\n\n if (t.isVariableDeclaration(decl)) {\n // Filter out declarators where all bound names are shared\n decl.declarations = decl.declarations.filter((declarator) => {\n const names = collectIdentifiersFromPattern(declarator.id)\n return !names.every((n) => sharedBindings.has(n))\n })\n // If no declarators remain, remove the entire statement\n if (decl.declarations.length === 0) return false\n } else if (t.isFunctionDeclaration(decl) && decl.id) {\n if (sharedBindings.has(decl.id.name)) return false\n } else if (t.isClassDeclaration(decl) && decl.id) {\n if (sharedBindings.has(decl.id.name)) return false\n }\n\n return true\n })\n}\n\nexport function compileCodeSplitReferenceRoute(\n opts: ParseAstOptions & {\n codeSplitGroupings: CodeSplitGroupings\n deleteNodes?: Set<DeletableNodes>\n targetFramework: Config['target']\n filename: string\n id: string\n addHmr?: boolean\n sharedBindings?: Set<string>\n compilerPlugins?: Array<ReferenceRouteCompilerPlugin>\n },\n): GeneratorResult | null {\n const ast = parseAst(opts)\n\n const refIdents = findReferencedIdentifiers(ast)\n\n const knownExportedIdents = new Set<string>()\n\n function findIndexForSplitNode(str: string) {\n return opts.codeSplitGroupings.findIndex((group) =>\n group.includes(str as any),\n )\n }\n\n const frameworkOptions = getFrameworkOptions(opts.targetFramework)\n const PACKAGE = frameworkOptions.package\n const LAZY_ROUTE_COMPONENT_IDENT = frameworkOptions.idents.lazyRouteComponent\n const LAZY_FN_IDENT = frameworkOptions.idents.lazyFn\n\n let createRouteFn: string\n\n let modified = false as boolean\n let hmrAdded = false as boolean\n let sharedExportedNames: Set<string> | undefined\n babel.traverse(ast, {\n Program: {\n enter(programPath) {\n /**\n * If the component for the route is being imported from\n * another file, this is to track the path to that file\n * the path itself doesn't matter, we just need to keep\n * track of it so that we can remove it from the imports\n * list if it's not being used like:\n *\n * `import '../shared/imported'`\n */\n const removableImportPaths = new Set<string>([])\n\n programPath.traverse({\n CallExpression: (path) => {\n if (!t.isIdentifier(path.node.callee)) {\n return\n }\n\n if (!allCreateRouteFns.includes(path.node.callee.name)) {\n return\n }\n\n createRouteFn = path.node.callee.name\n\n function babelHandleReference(routeOptions: t.Node | undefined) {\n const hasImportedOrDefinedIdentifier = (name: string) => {\n return programPath.scope.hasBinding(name)\n }\n\n if (t.isObjectExpression(routeOptions)) {\n if (opts.deleteNodes && opts.deleteNodes.size > 0) {\n routeOptions.properties = routeOptions.properties.filter(\n (prop) => {\n if (t.isObjectProperty(prop)) {\n const key = getObjectPropertyKeyName(prop)\n if (key && opts.deleteNodes!.has(key as any)) {\n modified = true\n return false\n }\n }\n return true\n },\n )\n }\n if (!splittableCreateRouteFns.includes(createRouteFn)) {\n const insertionPath = path.getStatementParent() ?? path\n\n opts.compilerPlugins?.forEach((plugin) => {\n const pluginResult = plugin.onUnsplittableRoute?.({\n programPath,\n callExpressionPath: path,\n insertionPath,\n routeOptions,\n createRouteFn,\n opts: opts as CompileCodeSplitReferenceRouteOptions,\n })\n\n if (pluginResult?.modified) {\n modified = true\n }\n })\n\n // we can't split this route but we still add HMR handling if enabled\n if (opts.addHmr && !hmrAdded) {\n programPath.pushContainer('body', routeHmrStatement)\n modified = true\n hmrAdded = true\n }\n // exit traversal so this route is not split\n return programPath.stop()\n }\n routeOptions.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n const key = getObjectPropertyKeyName(prop)\n\n if (key) {\n // If the user has not specified a split grouping for this key\n // then we should not split it\n const codeSplitGroupingByKey = findIndexForSplitNode(key)\n if (codeSplitGroupingByKey === -1) {\n return\n }\n const codeSplitGroup = [\n ...new Set(\n opts.codeSplitGroupings[codeSplitGroupingByKey],\n ),\n ]\n\n // find key in nodeSplitConfig\n const isNodeConfigAvailable = SPLIT_NODES_CONFIG.has(\n key as any,\n )\n\n if (!isNodeConfigAvailable) {\n return\n }\n\n // Exit early if the value is a boolean, null, or undefined.\n // These values mean \"don't use this component, fallback to parent\"\n // No code splitting needed to preserve fallback behavior\n if (\n t.isBooleanLiteral(prop.value) ||\n t.isNullLiteral(prop.value) ||\n (t.isIdentifier(prop.value) &&\n prop.value.name === 'undefined')\n ) {\n return\n }\n\n const splitNodeMeta = SPLIT_NODES_CONFIG.get(key as any)!\n\n // We need to extract the existing search params from the filename, if any\n // and add the relevant codesplitPrefix to them, then write them back to the filename\n const splitUrl = addSplitSearchParamToFilename(\n opts.filename,\n codeSplitGroup,\n )\n\n if (\n splitNodeMeta.splitStrategy === 'lazyRouteComponent'\n ) {\n const value = prop.value\n\n let shouldSplit = true\n\n if (t.isIdentifier(value)) {\n const existingImportPath =\n getImportSpecifierAndPathFromLocalName(\n programPath,\n value.name,\n ).path\n if (existingImportPath) {\n removableImportPaths.add(existingImportPath)\n }\n\n // exported identifiers should not be split\n // since they are already being imported\n // and need to be retained in the compiled file\n const isExported = hasExport(ast, value)\n if (isExported) {\n knownExportedIdents.add(value.name)\n }\n shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (!shouldSplit) {\n return\n }\n\n modified = true\n\n // Prepend the import statement to the program along with the importer function\n // Check to see if lazyRouteComponent is already imported before attempting\n // to import it again\n if (\n !hasImportedOrDefinedIdentifier(\n LAZY_ROUTE_COMPONENT_IDENT,\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `import { ${LAZY_ROUTE_COMPONENT_IDENT} } from '${PACKAGE}'`,\n )(),\n ])\n }\n\n // Check to see if the importer function is already defined\n // If not, define it with the dynamic import statement\n if (\n !hasImportedOrDefinedIdentifier(\n splitNodeMeta.localImporterIdent,\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `const ${splitNodeMeta.localImporterIdent} = () => import('${splitUrl}')`,\n )(),\n ])\n }\n\n const insertionPath = path.getStatementParent() ?? path\n let splitPropValue: t.Expression | undefined\n\n for (const plugin of opts.compilerPlugins ?? []) {\n const pluginPropValue = plugin.onSplitRouteProperty?.(\n {\n programPath,\n callExpressionPath: path,\n insertionPath,\n routeOptions,\n prop,\n splitNodeMeta,\n lazyRouteComponentIdent:\n LAZY_ROUTE_COMPONENT_IDENT,\n },\n )\n\n if (!pluginPropValue) {\n continue\n }\n\n modified = true\n splitPropValue = pluginPropValue\n break\n }\n\n if (splitPropValue) {\n prop.value = splitPropValue\n } else {\n prop.value = template.expression(\n `${LAZY_ROUTE_COMPONENT_IDENT}(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`,\n )()\n }\n\n // add HMR handling\n if (opts.addHmr && !hmrAdded) {\n programPath.pushContainer('body', routeHmrStatement)\n modified = true\n hmrAdded = true\n }\n } else {\n // if (splitNodeMeta.splitStrategy === 'lazyFn') {\n const value = prop.value\n\n let shouldSplit = true\n\n if (t.isIdentifier(value)) {\n const existingImportPath =\n getImportSpecifierAndPathFromLocalName(\n programPath,\n value.name,\n ).path\n if (existingImportPath) {\n removableImportPaths.add(existingImportPath)\n }\n\n // exported identifiers should not be split\n // since they are already being imported\n // and need to be retained in the compiled file\n const isExported = hasExport(ast, value)\n if (isExported) {\n knownExportedIdents.add(value.name)\n }\n shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (!shouldSplit) {\n return\n }\n modified = true\n\n // Prepend the import statement to the program along with the importer function\n if (!hasImportedOrDefinedIdentifier(LAZY_FN_IDENT)) {\n programPath.unshiftContainer(\n 'body',\n template.smart(\n `import { ${LAZY_FN_IDENT} } from '${PACKAGE}'`,\n )(),\n )\n }\n\n // Check to see if the importer function is already defined\n // If not, define it with the dynamic import statement\n if (\n !hasImportedOrDefinedIdentifier(\n splitNodeMeta.localImporterIdent,\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `const ${splitNodeMeta.localImporterIdent} = () => import('${splitUrl}')`,\n )(),\n ])\n }\n\n // Add the lazyFn call with the dynamic import to the prop value\n prop.value = template.expression(\n `${LAZY_FN_IDENT}(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`,\n )()\n }\n }\n }\n\n programPath.scope.crawl()\n })\n }\n }\n\n if (t.isCallExpression(path.parentPath.node)) {\n // createFileRoute('/')({ ... })\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n babelHandleReference(options)\n } else if (t.isVariableDeclarator(path.parentPath.node)) {\n // createFileRoute({ ... })\n const caller = resolveIdentifier(path, path.parentPath.node.init)\n\n if (t.isCallExpression(caller)) {\n const options = resolveIdentifier(path, caller.arguments[0])\n babelHandleReference(options)\n }\n }\n },\n })\n\n /**\n * If the component for the route is being imported,\n * and it's not being used, remove the import statement\n * from the program, by checking that the import has no\n * specifiers\n */\n if (removableImportPaths.size > 0) {\n modified = true\n programPath.traverse({\n ImportDeclaration(path) {\n if (path.node.specifiers.length > 0) return\n if (removableImportPaths.has(path.node.source.value)) {\n path.remove()\n }\n },\n })\n }\n\n // Handle shared bindings inside the Program visitor so we have\n // access to programPath for cheap refIdents registration.\n if (opts.sharedBindings && opts.sharedBindings.size > 0) {\n sharedExportedNames = findExportedSharedBindings(\n ast,\n opts.sharedBindings,\n )\n removeSharedDeclarations(ast, opts.sharedBindings)\n\n const sharedModuleUrl = addSharedSearchParamToFilename(opts.filename)\n\n const sharedImportSpecifiers = [...opts.sharedBindings].map((name) =>\n t.importSpecifier(t.identifier(name), t.identifier(name)),\n )\n const [sharedImportPath] = programPath.unshiftContainer(\n 'body',\n t.importDeclaration(\n sharedImportSpecifiers,\n t.stringLiteral(sharedModuleUrl),\n ),\n )\n\n // Register import specifier locals in refIdents so DCE can remove unused ones\n sharedImportPath.traverse({\n Identifier(identPath) {\n if (\n identPath.parentPath.isImportSpecifier() &&\n identPath.key === 'local'\n ) {\n refIdents.add(identPath)\n }\n },\n })\n\n // Re-export user-exported shared bindings from the shared module\n if (sharedExportedNames.size > 0) {\n const reExportSpecifiers = [...sharedExportedNames].map((name) =>\n t.exportSpecifier(t.identifier(name), t.identifier(name)),\n )\n programPath.pushContainer(\n 'body',\n t.exportNamedDeclaration(\n null,\n reExportSpecifiers,\n t.stringLiteral(sharedModuleUrl),\n ),\n )\n }\n }\n },\n },\n })\n\n if (!modified) {\n return null\n }\n\n deadCodeElimination(ast, refIdents)\n\n // if there are exported identifiers, then we need to add a warning\n // to the file to let the user know that the exported identifiers\n // will not in the split file but in the original file, therefore\n // increasing the bundle size\n if (knownExportedIdents.size > 0) {\n const warningMessage = createNotExportableMessage(\n opts.filename,\n knownExportedIdents,\n )\n console.warn(warningMessage)\n\n // append this warning to the file using a template\n if (process.env.NODE_ENV !== 'production') {\n const warningTemplate = template.statement(\n `console.warn(${JSON.stringify(warningMessage)})`,\n )()\n ast.program.body.unshift(warningTemplate)\n }\n }\n\n const result = generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\n\n // @babel/generator does not populate sourcesContent because it only has\n // the AST, not the original text. Without this, Vite's composed\n // sourcemap omits the original source, causing downstream consumers\n // (e.g. import-protection snippet display) to fall back to the shorter\n // compiled output and fail to resolve original line numbers.\n if (result.map) {\n result.map.sourcesContent = [opts.code]\n }\n\n return result\n}\n\nexport function compileCodeSplitVirtualRoute(\n opts: ParseAstOptions & {\n splitTargets: Array<SplitRouteIdentNodes>\n filename: string\n sharedBindings?: Set<string>\n },\n): GeneratorResult {\n const ast = parseAst(opts)\n const refIdents = findReferencedIdentifiers(ast)\n\n // Remove shared declarations BEFORE babel.traverse so the scope never sees\n // conflicting bindings (avoids checkBlockScopedCollisions crash in DCE)\n if (opts.sharedBindings && opts.sharedBindings.size > 0) {\n removeSharedDeclarations(ast, opts.sharedBindings)\n }\n\n const intendedSplitNodes = new Set(opts.splitTargets)\n\n const knownExportedIdents = new Set<string>()\n\n babel.traverse(ast, {\n Program: {\n enter(programPath) {\n const trackedNodesToSplitByType: Record<\n SplitRouteIdentNodes,\n { node: t.Node | undefined; meta: SplitNodeMeta } | undefined\n > = {\n component: undefined,\n loader: undefined,\n pendingComponent: undefined,\n errorComponent: undefined,\n notFoundComponent: undefined,\n }\n\n // Find and track all the known split-able nodes\n programPath.traverse({\n CallExpression: (path) => {\n if (!t.isIdentifier(path.node.callee)) {\n return\n }\n\n if (!splittableCreateRouteFns.includes(path.node.callee.name)) {\n return\n }\n\n function babelHandleVirtual(options: t.Node | undefined) {\n if (t.isObjectExpression(options)) {\n options.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n // do not use `intendedSplitNodes` here\n // since we have special considerations that need\n // to be accounted for like (not splitting exported identifiers)\n KNOWN_SPLIT_ROUTE_IDENTS.forEach((splitType) => {\n if (getObjectPropertyKeyName(prop) !== splitType) {\n return\n }\n\n const value = prop.value\n\n // If the value for the `key` is `undefined`, then we don't need to include it\n // in the split file, so we can just return, since it will kept in-place in the\n // reference file\n // This is useful for cases like: `createFileRoute('/')({ component: undefined })`\n if (t.isIdentifier(value) && value.name === 'undefined') {\n return\n }\n\n let isExported = false\n if (t.isIdentifier(value)) {\n isExported = hasExport(ast, value)\n if (isExported) {\n knownExportedIdents.add(value.name)\n }\n }\n\n // If the node is exported, we need to remove\n // the export from the split file\n if (isExported && t.isIdentifier(value)) {\n removeExports(ast, value)\n } else {\n const meta = SPLIT_NODES_CONFIG.get(splitType)!\n trackedNodesToSplitByType[splitType] = {\n node: prop.value,\n meta,\n }\n }\n })\n }\n })\n\n // Remove all of the options\n options.properties = []\n }\n }\n\n if (t.isCallExpression(path.parentPath.node)) {\n // createFileRoute('/')({ ... })\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n babelHandleVirtual(options)\n } else if (t.isVariableDeclarator(path.parentPath.node)) {\n // createFileRoute({ ... })\n const caller = resolveIdentifier(path, path.parentPath.node.init)\n\n if (t.isCallExpression(caller)) {\n const options = resolveIdentifier(path, caller.arguments[0])\n babelHandleVirtual(options)\n }\n }\n },\n })\n\n // Start the transformation to only exported the intended split nodes\n intendedSplitNodes.forEach((SPLIT_TYPE) => {\n const splitKey = trackedNodesToSplitByType[SPLIT_TYPE]\n\n if (!splitKey) {\n return\n }\n\n let splitNode = splitKey.node\n const splitMeta = { ...splitKey.meta, shouldRemoveNode: true }\n\n // Track the original identifier name before resolving through bindings,\n // needed for destructured patterns where the binding resolves to the\n // entire VariableDeclarator (ObjectPattern) rather than the specific binding\n let originalIdentName: string | undefined\n if (t.isIdentifier(splitNode)) {\n originalIdentName = splitNode.name\n }\n\n while (t.isIdentifier(splitNode)) {\n const binding = programPath.scope.getBinding(splitNode.name)\n splitNode = binding?.path.node\n }\n\n // Add the node to the program\n if (splitNode) {\n if (t.isFunctionDeclaration(splitNode)) {\n // an anonymous function declaration should only happen for `export default function() {...}`\n // so we should never get here\n if (!splitNode.id) {\n throw new Error(\n `Function declaration for \"${SPLIT_TYPE}\" must have an identifier.`,\n )\n }\n splitMeta.shouldRemoveNode = false\n splitMeta.localExporterIdent = splitNode.id.name\n } else if (\n t.isFunctionExpression(splitNode) ||\n t.isArrowFunctionExpression(splitNode)\n ) {\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitMeta.localExporterIdent),\n splitNode as any,\n ),\n ]),\n )\n } else if (\n t.isImportSpecifier(splitNode) ||\n t.isImportDefaultSpecifier(splitNode)\n ) {\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitMeta.localExporterIdent),\n splitNode.local,\n ),\n ]),\n )\n } else if (t.isVariableDeclarator(splitNode)) {\n if (t.isIdentifier(splitNode.id)) {\n splitMeta.localExporterIdent = splitNode.id.name\n splitMeta.shouldRemoveNode = false\n } else if (t.isObjectPattern(splitNode.id)) {\n // Destructured binding like `const { component: MyComp } = createBits()`\n // Use the original identifier name that was tracked before resolving\n if (originalIdentName) {\n splitMeta.localExporterIdent = originalIdentName\n }\n splitMeta.shouldRemoveNode = false\n } else {\n throw new Error(\n `Unexpected splitNode type ☝️: ${splitNode.type}`,\n )\n }\n } else if (t.isCallExpression(splitNode)) {\n const outputSplitNodeCode = generateFromAst(splitNode).code\n const splitNodeAst = babel.parse(outputSplitNodeCode)\n\n if (!splitNodeAst) {\n throw new Error(\n `Failed to parse the generated code for \"${SPLIT_TYPE}\" in the node type \"${splitNode.type}\"`,\n )\n }\n\n const statement = splitNodeAst.program.body[0]\n\n if (!statement) {\n throw new Error(\n `Failed to parse the generated code for \"${SPLIT_TYPE}\" in the node type \"${splitNode.type}\" as no statement was found in the program body`,\n )\n }\n\n if (t.isExpressionStatement(statement)) {\n const expression = statement.expression\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitMeta.localExporterIdent),\n expression,\n ),\n ]),\n )\n } else {\n throw new Error(\n `Unexpected expression type encounter for \"${SPLIT_TYPE}\" in the node type \"${splitNode.type}\"`,\n )\n }\n } else if (t.isConditionalExpression(splitNode)) {\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitMeta.localExporterIdent),\n splitNode,\n ),\n ]),\n )\n } else if (t.isTSAsExpression(splitNode)) {\n // remove the type assertion\n splitNode = splitNode.expression\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitMeta.localExporterIdent),\n splitNode,\n ),\n ]),\n )\n } else if (t.isBooleanLiteral(splitNode)) {\n // Handle boolean literals\n // This exits early here, since this value will be kept in the reference file\n return\n } else if (t.isNullLiteral(splitNode)) {\n // Handle null literals\n // This exits early here, since this value will be kept in the reference file\n return\n } else {\n console.info('Unexpected splitNode type:', splitNode)\n throw new Error(`Unexpected splitNode type ☝️: ${splitNode.type}`)\n }\n }\n\n if (splitMeta.shouldRemoveNode) {\n // If the splitNode exists at the top of the program\n // then we need to remove that copy\n programPath.node.body = programPath.node.body.filter((node) => {\n return node !== splitNode\n })\n }\n\n // Export the node\n programPath.pushContainer('body', [\n t.exportNamedDeclaration(null, [\n t.exportSpecifier(\n t.identifier(splitMeta.localExporterIdent), // local variable name\n t.identifier(splitMeta.exporterIdent), // as what name it should be exported as\n ),\n ]),\n ])\n })\n\n // convert exports to imports from the original file\n programPath.traverse({\n ExportNamedDeclaration(path) {\n // e.g. export const x = 1 or export { x }\n // becomes\n // import { x } from '${opts.id}'\n\n if (path.node.declaration) {\n if (t.isVariableDeclaration(path.node.declaration)) {\n const specifiers = path.node.declaration.declarations.flatMap(\n (decl) => {\n if (t.isIdentifier(decl.id)) {\n return [\n t.importSpecifier(\n t.identifier(decl.id.name),\n t.identifier(decl.id.name),\n ),\n ]\n }\n\n if (t.isObjectPattern(decl.id)) {\n return collectIdentifiersFromPattern(decl.id).map(\n (name) =>\n t.importSpecifier(\n t.identifier(name),\n t.identifier(name),\n ),\n )\n }\n\n if (t.isArrayPattern(decl.id)) {\n return collectIdentifiersFromPattern(decl.id).map(\n (name) =>\n t.importSpecifier(\n t.identifier(name),\n t.identifier(name),\n ),\n )\n }\n\n return []\n },\n )\n\n if (specifiers.length === 0) {\n path.remove()\n return\n }\n\n const importDecl = t.importDeclaration(\n specifiers,\n t.stringLiteral(\n removeSplitSearchParamFromFilename(opts.filename),\n ),\n )\n\n path.replaceWith(importDecl)\n\n // Track the imported identifier paths so deadCodeElimination can remove them if unused\n // We need to traverse the newly created import to get the identifier paths\n path.traverse({\n Identifier(identPath) {\n // Only track the local binding identifiers (the imported names)\n if (\n identPath.parentPath.isImportSpecifier() &&\n identPath.key === 'local'\n ) {\n refIdents.add(identPath)\n }\n },\n })\n }\n }\n },\n })\n\n // Add shared bindings import, registering specifiers in refIdents\n // so DCE can remove unused ones (same pattern as import replacements above).\n if (opts.sharedBindings && opts.sharedBindings.size > 0) {\n const sharedImportSpecifiers = [...opts.sharedBindings].map((name) =>\n t.importSpecifier(t.identifier(name), t.identifier(name)),\n )\n const sharedModuleUrl = addSharedSearchParamToFilename(\n removeSplitSearchParamFromFilename(opts.filename),\n )\n const [sharedImportPath] = programPath.unshiftContainer(\n 'body',\n t.importDeclaration(\n sharedImportSpecifiers,\n t.stringLiteral(sharedModuleUrl),\n ),\n )\n\n sharedImportPath.traverse({\n Identifier(identPath) {\n if (\n identPath.parentPath.isImportSpecifier() &&\n identPath.key === 'local'\n ) {\n refIdents.add(identPath)\n }\n },\n })\n }\n },\n },\n })\n\n deadCodeElimination(ast, refIdents)\n\n // Strip top-level expression statements that reference no locally-bound names.\n // DCE only removes unused declarations; bare side-effect statements like\n // `console.log(...)` survive even when the virtual file has no exports.\n {\n const locallyBound = new Set<string>()\n for (const stmt of ast.program.body) {\n collectLocalBindingsFromStatement(stmt, locallyBound)\n }\n ast.program.body = ast.program.body.filter((stmt) => {\n if (!t.isExpressionStatement(stmt)) return true\n const refs = collectIdentifiersFromNode(stmt)\n // Keep if it references at least one locally-bound identifier\n return [...refs].some((name) => locallyBound.has(name))\n })\n }\n\n // If the body is empty after DCE, strip directive prologues too.\n // A file containing only `'use client'` with no real code is useless.\n if (ast.program.body.length === 0) {\n ast.program.directives = []\n }\n\n const result = generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\n\n // @babel/generator does not populate sourcesContent — see compileCodeSplitReferenceRoute.\n if (result.map) {\n result.map.sourcesContent = [opts.code]\n }\n\n return result\n}\n\n/**\n * Compile the shared virtual module (`?tsr-shared=1`).\n * Keeps only shared binding declarations, their transitive dependencies,\n * and imports they need. Exports all shared bindings.\n */\nexport function compileCodeSplitSharedRoute(\n opts: ParseAstOptions & {\n sharedBindings: Set<string>\n filename: string\n },\n): GeneratorResult {\n const ast = parseAst(opts)\n const refIdents = findReferencedIdentifiers(ast)\n\n // Collect all names that need to stay: shared bindings + their transitive deps\n const localBindings = new Set<string>()\n for (const node of ast.program.body) {\n collectLocalBindingsFromStatement(node, localBindings)\n }\n\n // Route must never be extracted into the shared module.\n // Excluding it from the dep graph prevents expandTransitively from\n // pulling it in as a transitive dependency of a shared binding.\n localBindings.delete('Route')\n\n const declMap = buildDeclarationMap(ast)\n const depGraph = buildDependencyGraph(declMap, localBindings)\n\n // Start with shared bindings and expand transitively\n const keepBindings = new Set(opts.sharedBindings)\n keepBindings.delete('Route')\n expandTransitively(keepBindings, depGraph)\n\n // Remove all statements except:\n // - Import declarations (needed for deps; DCE will clean unused ones)\n // - Declarations of bindings in keepBindings\n ast.program.body = ast.program.body.filter((stmt) => {\n // Always keep imports — DCE will remove unused ones\n if (t.isImportDeclaration(stmt)) return true\n\n const decl =\n t.isExportNamedDeclaration(stmt) && stmt.declaration\n ? stmt.declaration\n : stmt\n\n if (t.isVariableDeclaration(decl)) {\n // Keep declarators where at least one binding is in keepBindings\n decl.declarations = decl.declarations.filter((declarator) => {\n const names = collectIdentifiersFromPattern(declarator.id)\n return names.some((n) => keepBindings.has(n))\n })\n if (decl.declarations.length === 0) return false\n\n // Strip the `export` wrapper — shared module controls its own exports\n if (t.isExportNamedDeclaration(stmt) && stmt.declaration) {\n return true // keep for now, we'll convert below\n }\n return true\n } else if (t.isFunctionDeclaration(decl) && decl.id) {\n return keepBindings.has(decl.id.name)\n } else if (t.isClassDeclaration(decl) && decl.id) {\n return keepBindings.has(decl.id.name)\n }\n\n // Remove everything else (expression statements, other exports, etc.)\n return false\n })\n\n // Convert `export const/function/class` to plain declarations\n // (we'll add our own export statement at the end)\n ast.program.body = ast.program.body.map((stmt) => {\n if (t.isExportNamedDeclaration(stmt) && stmt.declaration) {\n return stmt.declaration\n }\n return stmt\n })\n\n // Export all shared bindings (sorted for deterministic output)\n const exportNames = [...opts.sharedBindings].sort((a, b) =>\n a.localeCompare(b),\n )\n const exportSpecifiers = exportNames.map((name) =>\n t.exportSpecifier(t.identifier(name), t.identifier(name)),\n )\n if (exportSpecifiers.length > 0) {\n const exportDecl = t.exportNamedDeclaration(null, exportSpecifiers)\n ast.program.body.push(exportDecl)\n\n // Register export specifier locals in refIdents so DCE doesn't treat\n // the exported bindings as unreferenced.\n babel.traverse(ast, {\n Program(programPath) {\n const bodyPaths = programPath.get('body')\n const last = bodyPaths[bodyPaths.length - 1]\n if (last && last.isExportNamedDeclaration()) {\n last.traverse({\n Identifier(identPath) {\n if (\n identPath.parentPath.isExportSpecifier() &&\n identPath.key === 'local'\n ) {\n refIdents.add(identPath)\n }\n },\n })\n }\n programPath.stop()\n },\n })\n }\n\n deadCodeElimination(ast, refIdents)\n\n // If the body is empty after DCE, strip directive prologues too.\n if (ast.program.body.length === 0) {\n ast.program.directives = []\n }\n\n const result = generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\n\n // @babel/generator does not populate sourcesContent — see compileCodeSplitReferenceRoute.\n if (result.map) {\n result.map.sourcesContent = [opts.code]\n }\n\n return result\n}\n\n/**\n * This function should read get the options from by searching for the key `codeSplitGroupings`\n * on createFileRoute and return it's values if it exists, else return undefined\n */\nexport function detectCodeSplitGroupingsFromRoute(opts: ParseAstOptions): {\n groupings: CodeSplitGroupings | undefined\n} {\n const ast = parseAst(opts)\n\n let codeSplitGroupings: CodeSplitGroupings | undefined = undefined\n\n babel.traverse(ast, {\n Program: {\n enter(programPath) {\n programPath.traverse({\n CallExpression(path) {\n if (!t.isIdentifier(path.node.callee)) {\n return\n }\n\n if (\n !(\n path.node.callee.name === 'createRoute' ||\n path.node.callee.name === 'createFileRoute'\n )\n ) {\n return\n }\n\n function babelHandleSplittingGroups(\n routeOptions: t.Node | undefined,\n ) {\n if (t.isObjectExpression(routeOptions)) {\n routeOptions.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n const key = getObjectPropertyKeyName(prop)\n if (key === 'codeSplitGroupings') {\n const value = prop.value\n\n if (t.isArrayExpression(value)) {\n codeSplitGroupings = value.elements.map((group) => {\n if (t.isArrayExpression(group)) {\n return group.elements.map((node) => {\n if (!t.isStringLiteral(node)) {\n throw new Error(\n 'You must provide a string literal for the codeSplitGroupings',\n )\n }\n\n return node.value\n }) as Array<SplitRouteIdentNodes>\n }\n\n throw new Error(\n 'You must provide arrays with codeSplitGroupings options.',\n )\n })\n } else {\n throw new Error(\n 'You must provide an array of arrays for the codeSplitGroupings.',\n )\n }\n }\n }\n })\n }\n }\n\n // Extracting the codeSplitGroupings\n if (t.isCallExpression(path.parentPath.node)) {\n // createFileRoute('/')({ ... })\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n babelHandleSplittingGroups(options)\n } else if (t.isVariableDeclarator(path.parentPath.node)) {\n // createFileRoute({ ... })\n const caller = resolveIdentifier(path, path.parentPath.node.init)\n\n if (t.isCallExpression(caller)) {\n const options = resolveIdentifier(path, caller.arguments[0])\n babelHandleSplittingGroups(options)\n }\n }\n },\n })\n },\n },\n })\n\n return { groupings: codeSplitGroupings }\n}\n\nfunction createNotExportableMessage(\n filename: string,\n idents: Set<string>,\n): string {\n const list = Array.from(idents).map((d) => `- ${d}`)\n\n const message = [\n `[tanstack-router] These exports from \"${filename}\" will not be code-split and will increase your bundle size:`,\n ...list,\n 'For the best optimization, these items should either have their export statements removed, or be imported from another location that is not a route file.',\n ].join('\\n')\n\n return message\n}\n\nfunction getImportSpecifierAndPathFromLocalName(\n programPath: babel.NodePath<t.Program>,\n name: string,\n): {\n specifier:\n | t.ImportSpecifier\n | t.ImportDefaultSpecifier\n | t.ImportNamespaceSpecifier\n | null\n path: string | null\n} {\n let specifier:\n | t.ImportSpecifier\n | t.ImportDefaultSpecifier\n | t.ImportNamespaceSpecifier\n | null = null\n let path: string | null = null\n\n programPath.traverse({\n ImportDeclaration(importPath) {\n const found = importPath.node.specifiers.find(\n (targetSpecifier) => targetSpecifier.local.name === name,\n )\n if (found) {\n specifier = found\n path = importPath.node.source.value\n }\n },\n })\n\n return { specifier, path }\n}\n\n/**\n * Recursively collects all identifier names from a destructuring pattern\n * (ObjectPattern, ArrayPattern, AssignmentPattern, RestElement).\n */\nfunction collectIdentifiersFromPattern(\n node: t.LVal | t.Node | null | undefined,\n): Array<string> {\n if (!node) {\n return []\n }\n\n if (t.isIdentifier(node)) {\n return [node.name]\n }\n\n if (t.isAssignmentPattern(node)) {\n return collectIdentifiersFromPattern(node.left)\n }\n\n if (t.isRestElement(node)) {\n return collectIdentifiersFromPattern(node.argument)\n }\n\n if (t.isObjectPattern(node)) {\n return node.properties.flatMap((prop) => {\n if (t.isObjectProperty(prop)) {\n return collectIdentifiersFromPattern(prop.value as t.LVal)\n }\n if (t.isRestElement(prop)) {\n return collectIdentifiersFromPattern(prop.argument)\n }\n return []\n })\n }\n\n if (t.isArrayPattern(node)) {\n return node.elements.flatMap((element) =>\n collectIdentifiersFromPattern(element),\n )\n }\n\n return []\n}\n\n// Reusable function to get literal value or resolve variable to literal\nfunction resolveIdentifier(path: any, node: any): t.Node | undefined {\n if (t.isIdentifier(node)) {\n const binding = path.scope.getBinding(node.name)\n if (\n binding\n // && binding.kind === 'const'\n ) {\n const declarator = binding.path.node\n if (t.isObjectExpression(declarator.init)) {\n return declarator.init\n } else if (t.isFunctionDeclaration(declarator.init)) {\n return declarator.init\n }\n }\n return undefined\n }\n\n return node\n}\n\nfunction removeIdentifierLiteral(path: babel.NodePath, node: t.Identifier) {\n const binding = path.scope.getBinding(node.name)\n if (binding) {\n // If the binding is a destructured property from an ObjectPattern,\n // only remove that property instead of the entire declaration\n if (\n t.isVariableDeclarator(binding.path.node) &&\n t.isObjectPattern(binding.path.node.id)\n ) {\n const objectPattern = binding.path.node.id\n objectPattern.properties = objectPattern.properties.filter((prop) => {\n if (!t.isObjectProperty(prop)) {\n return true\n }\n\n if (t.isIdentifier(prop.value) && prop.value.name === node.name) {\n return false\n }\n\n if (\n t.isAssignmentPattern(prop.value) &&\n t.isIdentifier(prop.value.left) &&\n prop.value.left.name === node.name\n ) {\n return false\n }\n\n return true\n })\n\n // If no properties remain, remove the entire declaration\n if (objectPattern.properties.length === 0) {\n binding.path.remove()\n }\n\n return\n }\n\n binding.path.remove()\n }\n}\n\nfunction hasExport(ast: t.File, node: t.Identifier): boolean {\n let found = false\n\n babel.traverse(ast, {\n ExportNamedDeclaration(path) {\n if (path.node.declaration) {\n // declared as `const loaderFn = () => {}`\n if (t.isVariableDeclaration(path.node.declaration)) {\n path.node.declaration.declarations.forEach((decl) => {\n if (t.isVariableDeclarator(decl)) {\n if (t.isIdentifier(decl.id)) {\n if (decl.id.name === node.name) {\n found = true\n }\n } else if (\n t.isObjectPattern(decl.id) ||\n t.isArrayPattern(decl.id)\n ) {\n // Handle destructured exports like `export const { a, b } = fn()`\n const names = collectIdentifiersFromPattern(decl.id)\n if (names.includes(node.name)) {\n found = true\n }\n }\n }\n })\n }\n\n // declared as `function loaderFn() {}`\n if (t.isFunctionDeclaration(path.node.declaration)) {\n if (t.isIdentifier(path.node.declaration.id)) {\n if (path.node.declaration.id.name === node.name) {\n found = true\n }\n }\n }\n }\n },\n ExportDefaultDeclaration(path) {\n // declared as `export default loaderFn`\n if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n found = true\n }\n }\n\n // declared as `export default function loaderFn() {}`\n if (t.isFunctionDeclaration(path.node.declaration)) {\n if (t.isIdentifier(path.node.declaration.id)) {\n if (path.node.declaration.id.name === node.name) {\n found = true\n }\n }\n }\n },\n })\n\n return found\n}\n\nfunction removeExports(ast: t.File, node: t.Identifier): boolean {\n let removed = false\n\n // The checks use sequential if/else if statements since it\n // directly mutates the AST and as such doing normal checks\n // (using only if statements) could lead to a situation where\n // `path.node` is null since it has been already removed from\n // the program tree but typescript doesn't know that.\n babel.traverse(ast, {\n ExportNamedDeclaration(path) {\n if (path.node.declaration) {\n if (t.isVariableDeclaration(path.node.declaration)) {\n // declared as `const loaderFn = () => {}`\n path.node.declaration.declarations.forEach((decl) => {\n if (t.isVariableDeclarator(decl)) {\n if (t.isIdentifier(decl.id)) {\n if (decl.id.name === node.name) {\n path.remove()\n removed = true\n }\n } else if (\n t.isObjectPattern(decl.id) ||\n t.isArrayPattern(decl.id)\n ) {\n // Handle destructured exports like `export const { a, b } = fn()`\n const names = collectIdentifiersFromPattern(decl.id)\n if (names.includes(node.name)) {\n path.remove()\n removed = true\n }\n }\n }\n })\n } else if (t.isFunctionDeclaration(path.node.declaration)) {\n // declared as `export const loaderFn = () => {}`\n if (t.isIdentifier(path.node.declaration.id)) {\n if (path.node.declaration.id.name === node.name) {\n path.remove()\n removed = true\n }\n }\n }\n }\n },\n ExportDefaultDeclaration(path) {\n // declared as `export default loaderFn`\n if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n path.remove()\n removed = true\n }\n } else if (t.isFunctionDeclaration(path.node.declaration)) {\n // declared as `export default function loaderFn() {}`\n if (t.isIdentifier(path.node.declaration.id)) {\n if (path.node.declaration.id.name === node.name) {\n path.remove()\n removed = true\n }\n }\n }\n },\n })\n\n return removed\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compilers.cjs","names":[],"sources":["../../../../src/core/code-splitter/compilers.ts"],"sourcesContent":["import * as t from '@babel/types'\nimport * as babel from '@babel/core'\nimport * as template from '@babel/template'\nimport {\n deadCodeElimination,\n findReferencedIdentifiers,\n generateFromAst,\n parseAst,\n} from '@tanstack/router-utils'\nimport { tsrShared, tsrSplit } from '../constants'\nimport { createRouteHmrStatement } from '../route-hmr-statement'\nimport { getObjectPropertyKeyName } from '../utils'\nimport { createIdentifier } from './path-ids'\nimport { getFrameworkOptions } from './framework-options'\nimport type {\n CompileCodeSplitReferenceRouteOptions,\n ReferenceRouteCompilerPlugin,\n} from './plugins'\nimport type { GeneratorResult, ParseAstOptions } from '@tanstack/router-utils'\nimport type { CodeSplitGroupings, SplitRouteIdentNodes } from '../constants'\nimport type { Config, DeletableNodes } from '../config'\nimport type { SplitNodeMeta } from './types'\n\nconst SPLIT_NODES_CONFIG = new Map<SplitRouteIdentNodes, SplitNodeMeta>([\n [\n 'loader',\n {\n routeIdent: 'loader',\n localImporterIdent: '$$splitLoaderImporter', // const $$splitLoaderImporter = () => import('...')\n splitStrategy: 'lazyFn',\n localExporterIdent: 'SplitLoader', // const SplitLoader = ...\n exporterIdent: 'loader', // export { SplitLoader as loader }\n },\n ],\n [\n 'component',\n {\n routeIdent: 'component',\n localImporterIdent: '$$splitComponentImporter', // const $$splitComponentImporter = () => import('...')\n splitStrategy: 'lazyRouteComponent',\n localExporterIdent: 'SplitComponent', // const SplitComponent = ...\n exporterIdent: 'component', // export { SplitComponent as component }\n },\n ],\n [\n 'pendingComponent',\n {\n routeIdent: 'pendingComponent',\n localImporterIdent: '$$splitPendingComponentImporter', // const $$splitPendingComponentImporter = () => import('...')\n splitStrategy: 'lazyRouteComponent',\n localExporterIdent: 'SplitPendingComponent', // const SplitPendingComponent = ...\n exporterIdent: 'pendingComponent', // export { SplitPendingComponent as pendingComponent }\n },\n ],\n [\n 'errorComponent',\n {\n routeIdent: 'errorComponent',\n localImporterIdent: '$$splitErrorComponentImporter', // const $$splitErrorComponentImporter = () => import('...')\n splitStrategy: 'lazyRouteComponent',\n localExporterIdent: 'SplitErrorComponent', // const SplitErrorComponent = ...\n exporterIdent: 'errorComponent', // export { SplitErrorComponent as errorComponent }\n },\n ],\n [\n 'notFoundComponent',\n {\n routeIdent: 'notFoundComponent',\n localImporterIdent: '$$splitNotFoundComponentImporter', // const $$splitNotFoundComponentImporter = () => import('...')\n splitStrategy: 'lazyRouteComponent',\n localExporterIdent: 'SplitNotFoundComponent', // const SplitNotFoundComponent = ...\n exporterIdent: 'notFoundComponent', // export { SplitNotFoundComponent as notFoundComponent }\n },\n ],\n])\n\nconst KNOWN_SPLIT_ROUTE_IDENTS = [...SPLIT_NODES_CONFIG.keys()] as const\n\nfunction addSplitSearchParamToFilename(\n filename: string,\n grouping: Array<string>,\n) {\n const [bareFilename] = filename.split('?')\n\n const params = new URLSearchParams()\n params.append(tsrSplit, createIdentifier(grouping))\n\n const result = `${bareFilename}?${params.toString()}`\n return result\n}\n\nfunction removeSplitSearchParamFromFilename(filename: string) {\n const [bareFilename] = filename.split('?')\n return bareFilename!\n}\n\nexport function addSharedSearchParamToFilename(filename: string) {\n const [bareFilename] = filename.split('?')\n return `${bareFilename}?${tsrShared}=1`\n}\n\nconst splittableCreateRouteFns = ['createFileRoute']\nconst unsplittableCreateRouteFns = [\n 'createRootRoute',\n 'createRootRouteWithContext',\n]\nconst allCreateRouteFns = [\n ...splittableCreateRouteFns,\n ...unsplittableCreateRouteFns,\n]\n\n/**\n * Recursively walk an AST node and collect referenced identifier-like names.\n * Much cheaper than babel.traverse — no path/scope overhead.\n *\n * Notes:\n * - Uses @babel/types `isReferenced` to avoid collecting non-references like\n * object keys, member expression properties, or binding identifiers.\n * - Also handles JSX identifiers for component references.\n */\nexport function collectIdentifiersFromNode(node: t.Node): Set<string> {\n const ids = new Set<string>()\n\n ;(function walk(\n n: t.Node | null | undefined,\n parent?: t.Node,\n grandparent?: t.Node,\n parentKey?: string,\n ) {\n if (!n) return\n\n if (t.isIdentifier(n)) {\n // When we don't have parent info (node passed in isolation), treat as referenced.\n if (!parent || t.isReferenced(n, parent, grandparent)) {\n ids.add(n.name)\n }\n return\n }\n\n if (t.isJSXIdentifier(n)) {\n // Skip attribute names: <div data-testid=\"x\" />\n if (parent && t.isJSXAttribute(parent) && parentKey === 'name') {\n return\n }\n\n // Skip member properties: <Foo.Bar /> should count Foo, not Bar\n if (\n parent &&\n t.isJSXMemberExpression(parent) &&\n parentKey === 'property'\n ) {\n return\n }\n\n // Intrinsic elements (lowercase) are not identifiers\n const first = n.name[0]\n if (first && first === first.toLowerCase()) {\n return\n }\n\n ids.add(n.name)\n return\n }\n\n for (const key of t.VISITOR_KEYS[n.type] || []) {\n const child = (n as any)[key]\n if (Array.isArray(child)) {\n for (const c of child) {\n if (c && typeof c.type === 'string') {\n walk(c, n, parent, key)\n }\n }\n } else if (child && typeof child.type === 'string') {\n walk(child, n, parent, key)\n }\n }\n })(node)\n\n return ids\n}\n\n/**\n * Build a map from binding name → declaration AST node for all\n * locally-declared module-level bindings. Built once, O(1) lookup.\n */\nexport function buildDeclarationMap(ast: t.File): Map<string, t.Node> {\n const map = new Map<string, t.Node>()\n for (const stmt of ast.program.body) {\n const decl =\n t.isExportNamedDeclaration(stmt) && stmt.declaration\n ? stmt.declaration\n : stmt\n\n if (t.isVariableDeclaration(decl)) {\n for (const declarator of decl.declarations) {\n for (const name of collectIdentifiersFromPattern(declarator.id)) {\n map.set(name, declarator)\n }\n }\n } else if (t.isFunctionDeclaration(decl) && decl.id) {\n map.set(decl.id.name, decl)\n } else if (t.isClassDeclaration(decl) && decl.id) {\n map.set(decl.id.name, decl)\n }\n }\n return map\n}\n\n/**\n * Build a dependency graph: for each local binding, the set of other local\n * bindings its declaration references. Built once via simple node walking.\n */\nexport function buildDependencyGraph(\n declMap: Map<string, t.Node>,\n localBindings: Set<string>,\n): Map<string, Set<string>> {\n const graph = new Map<string, Set<string>>()\n for (const [name, declNode] of declMap) {\n if (!localBindings.has(name)) continue\n const allIds = collectIdentifiersFromNode(declNode)\n const deps = new Set<string>()\n for (const id of allIds) {\n if (id !== name && localBindings.has(id)) deps.add(id)\n }\n graph.set(name, deps)\n }\n return graph\n}\n\n/**\n * Computes module-level bindings that are shared between split and non-split\n * route properties. These bindings need to be extracted into a shared virtual\n * module to avoid double-initialization.\n *\n * A binding is \"shared\" if it is referenced by at least one split property\n * AND at least one non-split property. Only locally-declared module-level\n * bindings are candidates (not imports — bundlers dedupe those).\n */\nexport function computeSharedBindings(opts: {\n code: string\n codeSplitGroupings: CodeSplitGroupings\n}): Set<string> {\n const ast = parseAst(opts)\n\n // Early bailout: collect all module-level locally-declared binding names.\n // This is a cheap loop over program.body (no traversal). If the file has\n // no local bindings (aside from `Route`), nothing can be shared — skip\n // the expensive babel.traverse entirely.\n const localModuleLevelBindings = new Set<string>()\n for (const node of ast.program.body) {\n collectLocalBindingsFromStatement(node, localModuleLevelBindings)\n }\n\n // File-based routes always export a route config binding (usually `Route`).\n // This must never be extracted into the shared module.\n localModuleLevelBindings.delete('Route')\n\n if (localModuleLevelBindings.size === 0) {\n return new Set()\n }\n\n function findIndexForSplitNode(str: string) {\n return opts.codeSplitGroupings.findIndex((group) =>\n group.includes(str as any),\n )\n }\n\n // Find the route options object — needs babel.traverse for scope resolution\n let routeOptions: t.ObjectExpression | undefined\n\n babel.traverse(ast, {\n CallExpression(path) {\n if (!t.isIdentifier(path.node.callee)) return\n if (!splittableCreateRouteFns.includes(path.node.callee.name)) return\n\n if (t.isCallExpression(path.parentPath.node)) {\n const opts = resolveIdentifier(path, path.parentPath.node.arguments[0])\n if (t.isObjectExpression(opts)) routeOptions = opts\n } else if (t.isVariableDeclarator(path.parentPath.node)) {\n const caller = resolveIdentifier(path, path.parentPath.node.init)\n if (t.isCallExpression(caller)) {\n const opts = resolveIdentifier(path, caller.arguments[0])\n if (t.isObjectExpression(opts)) routeOptions = opts\n }\n }\n },\n })\n\n if (!routeOptions) return new Set()\n\n // Fast path: if fewer than 2 distinct groups are referenced by route options,\n // nothing can be shared and we can skip the rest of the work.\n const splitGroupsPresent = new Set<number>()\n let hasNonSplit = false\n for (const prop of routeOptions.properties) {\n if (!t.isObjectProperty(prop)) continue\n const key = getObjectPropertyKeyName(prop)\n if (!key) continue\n if (key === 'codeSplitGroupings') continue\n if (t.isIdentifier(prop.value) && prop.value.name === 'undefined') continue\n const groupIndex = findIndexForSplitNode(key) // -1 if non-split\n if (groupIndex === -1) {\n hasNonSplit = true\n } else {\n splitGroupsPresent.add(groupIndex)\n }\n }\n\n if (!hasNonSplit && splitGroupsPresent.size < 2) return new Set()\n\n // Build dependency graph up front — needed for transitive expansion per-property.\n // This graph excludes `Route` (deleted above) so group attribution works correctly.\n const declMap = buildDeclarationMap(ast)\n const depGraph = buildDependencyGraph(declMap, localModuleLevelBindings)\n\n // Build a second dependency graph that includes `Route` so we can detect\n // bindings that transitively depend on it. Such bindings must NOT be\n // extracted into the shared module because they would drag the Route\n // singleton with them, duplicating it across modules.\n const allLocalBindings = new Set(localModuleLevelBindings)\n allLocalBindings.add('Route')\n const fullDepGraph = buildDependencyGraph(declMap, allLocalBindings)\n\n // For each route property, track which \"group\" it belongs to.\n // Non-split properties get group index -1.\n // Split properties get their codeSplitGroupings index (0, 1, ...).\n // A binding is \"shared\" if it appears in 2+ distinct groups.\n // We expand each property's refs transitively BEFORE comparing groups,\n // so indirect refs (e.g., component: MyComp where MyComp uses `shared`)\n // are correctly attributed.\n const refsByGroup = new Map<string, Set<number>>()\n\n for (const prop of routeOptions.properties) {\n if (!t.isObjectProperty(prop)) continue\n const key = getObjectPropertyKeyName(prop)\n if (!key) continue\n\n if (key === 'codeSplitGroupings') continue\n\n const groupIndex = findIndexForSplitNode(key) // -1 if non-split\n\n const directRefs = collectModuleLevelRefsFromNode(\n prop.value,\n localModuleLevelBindings,\n )\n\n // Expand transitively: if component references SharedComp which references\n // `shared`, then `shared` is also attributed to component's group.\n const allRefs = new Set(directRefs)\n expandTransitively(allRefs, depGraph)\n\n for (const ref of allRefs) {\n let groups = refsByGroup.get(ref)\n if (!groups) {\n groups = new Set()\n refsByGroup.set(ref, groups)\n }\n groups.add(groupIndex)\n }\n }\n\n // Shared = bindings appearing in 2+ distinct groups\n const shared = new Set<string>()\n for (const [name, groups] of refsByGroup) {\n if (groups.size >= 2) shared.add(name)\n }\n\n // Destructured declarators (e.g. `const { a, b } = fn()`) must be treated\n // as a single initialization unit. Even if each binding is referenced by\n // only one group, if *different* bindings from the same declarator are\n // referenced by different groups, the declarator must be extracted to the\n // shared module to avoid double initialization.\n expandSharedDestructuredDeclarators(ast, refsByGroup, shared)\n\n if (shared.size === 0) return shared\n\n // If any binding from a destructured declaration is shared,\n // all bindings from that declaration must be shared\n expandDestructuredDeclarations(ast, shared)\n\n // Remove shared bindings that transitively depend on `Route`.\n // The Route singleton must stay in the reference file; extracting a\n // binding that references it would duplicate Route in the shared module.\n removeBindingsDependingOnRoute(shared, fullDepGraph)\n\n return shared\n}\n\n/**\n * If bindings from the same destructured declarator are referenced by\n * different groups, mark all bindings from that declarator as shared.\n */\nexport function expandSharedDestructuredDeclarators(\n ast: t.File,\n refsByGroup: Map<string, Set<number>>,\n shared: Set<string>,\n) {\n for (const stmt of ast.program.body) {\n const decl =\n t.isExportNamedDeclaration(stmt) && stmt.declaration\n ? stmt.declaration\n : stmt\n\n if (!t.isVariableDeclaration(decl)) continue\n\n for (const declarator of decl.declarations) {\n if (!t.isObjectPattern(declarator.id) && !t.isArrayPattern(declarator.id))\n continue\n\n const names = collectIdentifiersFromPattern(declarator.id)\n\n const usedGroups = new Set<number>()\n for (const name of names) {\n const groups = refsByGroup.get(name)\n if (!groups) continue\n for (const g of groups) usedGroups.add(g)\n }\n\n if (usedGroups.size >= 2) {\n for (const name of names) {\n shared.add(name)\n }\n }\n }\n }\n}\n\n/**\n * Collect locally-declared module-level binding names from a statement.\n * Pure node inspection, no traversal.\n */\nexport function collectLocalBindingsFromStatement(\n node: t.Statement | t.ModuleDeclaration,\n bindings: Set<string>,\n) {\n const decl =\n t.isExportNamedDeclaration(node) && node.declaration\n ? node.declaration\n : node\n\n if (t.isVariableDeclaration(decl)) {\n for (const declarator of decl.declarations) {\n for (const name of collectIdentifiersFromPattern(declarator.id)) {\n bindings.add(name)\n }\n }\n } else if (t.isFunctionDeclaration(decl) && decl.id) {\n bindings.add(decl.id.name)\n } else if (t.isClassDeclaration(decl) && decl.id) {\n bindings.add(decl.id.name)\n }\n}\n\n/**\n * Collect direct module-level binding names referenced from a given AST node.\n * Uses a simple recursive walk instead of babel.traverse.\n */\nexport function collectModuleLevelRefsFromNode(\n node: t.Node,\n localModuleLevelBindings: Set<string>,\n): Set<string> {\n const allIds = collectIdentifiersFromNode(node)\n const refs = new Set<string>()\n for (const name of allIds) {\n if (localModuleLevelBindings.has(name)) refs.add(name)\n }\n return refs\n}\n\n/**\n * Expand the shared set transitively using a prebuilt dependency graph.\n * No AST traversals — pure graph BFS.\n */\nexport function expandTransitively(\n shared: Set<string>,\n depGraph: Map<string, Set<string>>,\n) {\n const queue = [...shared]\n const visited = new Set<string>()\n\n while (queue.length > 0) {\n const name = queue.pop()!\n if (visited.has(name)) continue\n visited.add(name)\n\n const deps = depGraph.get(name)\n if (!deps) continue\n\n for (const dep of deps) {\n if (!shared.has(dep)) {\n shared.add(dep)\n queue.push(dep)\n }\n }\n }\n}\n\n/**\n * Remove any bindings from `shared` that transitively depend on `Route`.\n * The Route singleton must remain in the reference file; if a shared binding\n * references it (directly or transitively), extracting that binding would\n * duplicate Route in the shared module.\n *\n * Uses `depGraph` which must include `Route` as a node so the dependency\n * chain is visible.\n */\nexport function removeBindingsDependingOnRoute(\n shared: Set<string>,\n depGraph: Map<string, Set<string>>,\n) {\n const reverseGraph = new Map<string, Set<string>>()\n for (const [name, deps] of depGraph) {\n for (const dep of deps) {\n let parents = reverseGraph.get(dep)\n if (!parents) {\n parents = new Set<string>()\n reverseGraph.set(dep, parents)\n }\n parents.add(name)\n }\n }\n\n // Walk backwards from Route to find all bindings that can reach it.\n const visited = new Set<string>()\n const queue = ['Route']\n while (queue.length > 0) {\n const cur = queue.pop()!\n if (visited.has(cur)) continue\n visited.add(cur)\n\n const parents = reverseGraph.get(cur)\n if (!parents) continue\n for (const parent of parents) {\n if (!visited.has(parent)) queue.push(parent)\n }\n }\n\n for (const name of [...shared]) {\n if (visited.has(name)) {\n shared.delete(name)\n }\n }\n}\n\n/**\n * If any binding from a destructured declaration is shared,\n * ensure all bindings from that same declaration are also shared.\n * Pure node inspection of program.body, no traversal.\n */\nexport function expandDestructuredDeclarations(\n ast: t.File,\n shared: Set<string>,\n) {\n for (const stmt of ast.program.body) {\n const decl =\n t.isExportNamedDeclaration(stmt) && stmt.declaration\n ? stmt.declaration\n : stmt\n\n if (!t.isVariableDeclaration(decl)) continue\n\n for (const declarator of decl.declarations) {\n if (!t.isObjectPattern(declarator.id) && !t.isArrayPattern(declarator.id))\n continue\n\n const names = collectIdentifiersFromPattern(declarator.id)\n const hasShared = names.some((n) => shared.has(n))\n if (hasShared) {\n for (const n of names) {\n shared.add(n)\n }\n }\n }\n }\n}\n\n/**\n * Find which shared bindings are user-exported in the original source.\n * These need to be re-exported from the shared module.\n */\nfunction findExportedSharedBindings(\n ast: t.File,\n sharedBindings: Set<string>,\n): Set<string> {\n const exported = new Set<string>()\n for (const stmt of ast.program.body) {\n if (!t.isExportNamedDeclaration(stmt) || !stmt.declaration) continue\n\n if (t.isVariableDeclaration(stmt.declaration)) {\n for (const decl of stmt.declaration.declarations) {\n for (const name of collectIdentifiersFromPattern(decl.id)) {\n if (sharedBindings.has(name)) exported.add(name)\n }\n }\n } else if (\n t.isFunctionDeclaration(stmt.declaration) &&\n stmt.declaration.id\n ) {\n if (sharedBindings.has(stmt.declaration.id.name))\n exported.add(stmt.declaration.id.name)\n } else if (t.isClassDeclaration(stmt.declaration) && stmt.declaration.id) {\n if (sharedBindings.has(stmt.declaration.id.name))\n exported.add(stmt.declaration.id.name)\n }\n }\n return exported\n}\n\n/**\n * Remove declarations of shared bindings from the AST.\n * Handles both plain and exported declarations, including destructured patterns.\n * Removes the entire statement if all bindings in it are shared.\n */\nfunction removeSharedDeclarations(ast: t.File, sharedBindings: Set<string>) {\n ast.program.body = ast.program.body.filter((stmt) => {\n const decl =\n t.isExportNamedDeclaration(stmt) && stmt.declaration\n ? stmt.declaration\n : stmt\n\n if (t.isVariableDeclaration(decl)) {\n // Filter out declarators where all bound names are shared\n decl.declarations = decl.declarations.filter((declarator) => {\n const names = collectIdentifiersFromPattern(declarator.id)\n return !names.every((n) => sharedBindings.has(n))\n })\n // If no declarators remain, remove the entire statement\n if (decl.declarations.length === 0) return false\n } else if (t.isFunctionDeclaration(decl) && decl.id) {\n if (sharedBindings.has(decl.id.name)) return false\n } else if (t.isClassDeclaration(decl) && decl.id) {\n if (sharedBindings.has(decl.id.name)) return false\n }\n\n return true\n })\n}\n\nexport function compileCodeSplitReferenceRoute(\n opts: ParseAstOptions & {\n codeSplitGroupings: CodeSplitGroupings\n deleteNodes?: Set<DeletableNodes>\n targetFramework: Config['target']\n filename: string\n id: string\n addHmr?: boolean\n sharedBindings?: Set<string>\n compilerPlugins?: Array<ReferenceRouteCompilerPlugin>\n },\n): GeneratorResult | null {\n const ast = parseAst(opts)\n\n const refIdents = findReferencedIdentifiers(ast)\n\n const knownExportedIdents = new Set<string>()\n\n function findIndexForSplitNode(str: string) {\n return opts.codeSplitGroupings.findIndex((group) =>\n group.includes(str as any),\n )\n }\n\n const frameworkOptions = getFrameworkOptions(opts.targetFramework)\n const PACKAGE = frameworkOptions.package\n const LAZY_ROUTE_COMPONENT_IDENT = frameworkOptions.idents.lazyRouteComponent\n const LAZY_FN_IDENT = frameworkOptions.idents.lazyFn\n const stableRouteOptionKeys = [\n ...new Set(\n (opts.compilerPlugins ?? []).flatMap(\n (plugin) => plugin.getStableRouteOptionKeys?.() ?? [],\n ),\n ),\n ]\n\n let createRouteFn: string\n\n let modified = false as boolean\n let hmrAdded = false as boolean\n let sharedExportedNames: Set<string> | undefined\n babel.traverse(ast, {\n Program: {\n enter(programPath) {\n /**\n * If the component for the route is being imported from\n * another file, this is to track the path to that file\n * the path itself doesn't matter, we just need to keep\n * track of it so that we can remove it from the imports\n * list if it's not being used like:\n *\n * `import '../shared/imported'`\n */\n const removableImportPaths = new Set<string>([])\n\n programPath.traverse({\n CallExpression: (path) => {\n if (!t.isIdentifier(path.node.callee)) {\n return\n }\n\n if (!allCreateRouteFns.includes(path.node.callee.name)) {\n return\n }\n\n createRouteFn = path.node.callee.name\n\n function babelHandleReference(routeOptions: t.Node | undefined) {\n const hasImportedOrDefinedIdentifier = (name: string) => {\n return programPath.scope.hasBinding(name)\n }\n\n const addRouteHmr = (\n insertionPath: babel.NodePath,\n routeOptions: t.ObjectExpression,\n ) => {\n if (!opts.addHmr || hmrAdded) {\n return\n }\n\n opts.compilerPlugins?.forEach((plugin) => {\n const pluginResult = plugin.onAddHmr?.({\n programPath,\n callExpressionPath: path,\n insertionPath,\n routeOptions,\n createRouteFn,\n opts: opts as CompileCodeSplitReferenceRouteOptions,\n })\n\n if (pluginResult?.modified) {\n modified = true\n }\n })\n\n programPath.pushContainer(\n 'body',\n createRouteHmrStatement(stableRouteOptionKeys),\n )\n modified = true\n hmrAdded = true\n }\n\n if (t.isObjectExpression(routeOptions)) {\n const insertionPath = path.getStatementParent() ?? path\n\n if (opts.deleteNodes && opts.deleteNodes.size > 0) {\n routeOptions.properties = routeOptions.properties.filter(\n (prop) => {\n if (t.isObjectProperty(prop)) {\n const key = getObjectPropertyKeyName(prop)\n if (key && opts.deleteNodes!.has(key as any)) {\n modified = true\n return false\n }\n }\n return true\n },\n )\n }\n if (!splittableCreateRouteFns.includes(createRouteFn)) {\n opts.compilerPlugins?.forEach((plugin) => {\n const pluginResult = plugin.onUnsplittableRoute?.({\n programPath,\n callExpressionPath: path,\n insertionPath,\n routeOptions,\n createRouteFn,\n opts: opts as CompileCodeSplitReferenceRouteOptions,\n })\n\n if (pluginResult?.modified) {\n modified = true\n }\n })\n\n // we can't split this route but we still add HMR handling if enabled\n addRouteHmr(insertionPath, routeOptions)\n // exit traversal so this route is not split\n return programPath.stop()\n }\n routeOptions.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n const key = getObjectPropertyKeyName(prop)\n\n if (key) {\n // If the user has not specified a split grouping for this key\n // then we should not split it\n const codeSplitGroupingByKey = findIndexForSplitNode(key)\n if (codeSplitGroupingByKey === -1) {\n return\n }\n const codeSplitGroup = [\n ...new Set(\n opts.codeSplitGroupings[codeSplitGroupingByKey],\n ),\n ]\n\n // find key in nodeSplitConfig\n const isNodeConfigAvailable = SPLIT_NODES_CONFIG.has(\n key as any,\n )\n\n if (!isNodeConfigAvailable) {\n return\n }\n\n // Exit early if the value is a boolean, null, or undefined.\n // These values mean \"don't use this component, fallback to parent\"\n // No code splitting needed to preserve fallback behavior\n if (\n t.isBooleanLiteral(prop.value) ||\n t.isNullLiteral(prop.value) ||\n (t.isIdentifier(prop.value) &&\n prop.value.name === 'undefined')\n ) {\n return\n }\n\n const splitNodeMeta = SPLIT_NODES_CONFIG.get(key as any)!\n\n // We need to extract the existing search params from the filename, if any\n // and add the relevant codesplitPrefix to them, then write them back to the filename\n const splitUrl = addSplitSearchParamToFilename(\n opts.filename,\n codeSplitGroup,\n )\n\n if (\n splitNodeMeta.splitStrategy === 'lazyRouteComponent'\n ) {\n const value = prop.value\n\n let shouldSplit = true\n\n if (t.isIdentifier(value)) {\n const existingImportPath =\n getImportSpecifierAndPathFromLocalName(\n programPath,\n value.name,\n ).path\n if (existingImportPath) {\n removableImportPaths.add(existingImportPath)\n }\n\n // exported identifiers should not be split\n // since they are already being imported\n // and need to be retained in the compiled file\n const isExported = hasExport(ast, value)\n if (isExported) {\n knownExportedIdents.add(value.name)\n }\n shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (!shouldSplit) {\n return\n }\n\n modified = true\n\n // Prepend the import statement to the program along with the importer function\n // Check to see if lazyRouteComponent is already imported before attempting\n // to import it again\n if (\n !hasImportedOrDefinedIdentifier(\n LAZY_ROUTE_COMPONENT_IDENT,\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `import { ${LAZY_ROUTE_COMPONENT_IDENT} } from '${PACKAGE}'`,\n )(),\n ])\n }\n\n // Check to see if the importer function is already defined\n // If not, define it with the dynamic import statement\n if (\n !hasImportedOrDefinedIdentifier(\n splitNodeMeta.localImporterIdent,\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `const ${splitNodeMeta.localImporterIdent} = () => import('${splitUrl}')`,\n )(),\n ])\n }\n\n const insertionPath = path.getStatementParent() ?? path\n let splitPropValue: t.Expression | undefined\n\n for (const plugin of opts.compilerPlugins ?? []) {\n const pluginPropValue = plugin.onSplitRouteProperty?.(\n {\n programPath,\n callExpressionPath: path,\n insertionPath,\n routeOptions,\n prop,\n splitNodeMeta,\n lazyRouteComponentIdent:\n LAZY_ROUTE_COMPONENT_IDENT,\n },\n )\n\n if (!pluginPropValue) {\n continue\n }\n\n modified = true\n splitPropValue = pluginPropValue\n break\n }\n\n if (splitPropValue) {\n prop.value = splitPropValue\n } else {\n prop.value = template.expression(\n `${LAZY_ROUTE_COMPONENT_IDENT}(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`,\n )()\n }\n\n // add HMR handling\n addRouteHmr(insertionPath, routeOptions)\n } else {\n // if (splitNodeMeta.splitStrategy === 'lazyFn') {\n const value = prop.value\n\n let shouldSplit = true\n\n if (t.isIdentifier(value)) {\n const existingImportPath =\n getImportSpecifierAndPathFromLocalName(\n programPath,\n value.name,\n ).path\n if (existingImportPath) {\n removableImportPaths.add(existingImportPath)\n }\n\n // exported identifiers should not be split\n // since they are already being imported\n // and need to be retained in the compiled file\n const isExported = hasExport(ast, value)\n if (isExported) {\n knownExportedIdents.add(value.name)\n }\n shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (!shouldSplit) {\n return\n }\n modified = true\n\n // Prepend the import statement to the program along with the importer function\n if (!hasImportedOrDefinedIdentifier(LAZY_FN_IDENT)) {\n programPath.unshiftContainer(\n 'body',\n template.smart(\n `import { ${LAZY_FN_IDENT} } from '${PACKAGE}'`,\n )(),\n )\n }\n\n // Check to see if the importer function is already defined\n // If not, define it with the dynamic import statement\n if (\n !hasImportedOrDefinedIdentifier(\n splitNodeMeta.localImporterIdent,\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `const ${splitNodeMeta.localImporterIdent} = () => import('${splitUrl}')`,\n )(),\n ])\n }\n\n // Add the lazyFn call with the dynamic import to the prop value\n prop.value = template.expression(\n `${LAZY_FN_IDENT}(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`,\n )()\n }\n }\n }\n\n programPath.scope.crawl()\n })\n\n addRouteHmr(insertionPath, routeOptions)\n }\n }\n\n if (t.isCallExpression(path.parentPath.node)) {\n // createFileRoute('/')({ ... })\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n babelHandleReference(options)\n } else if (t.isVariableDeclarator(path.parentPath.node)) {\n // createFileRoute({ ... })\n const caller = resolveIdentifier(path, path.parentPath.node.init)\n\n if (t.isCallExpression(caller)) {\n const options = resolveIdentifier(path, caller.arguments[0])\n babelHandleReference(options)\n }\n }\n },\n })\n\n /**\n * If the component for the route is being imported,\n * and it's not being used, remove the import statement\n * from the program, by checking that the import has no\n * specifiers\n */\n if (removableImportPaths.size > 0) {\n modified = true\n programPath.traverse({\n ImportDeclaration(path) {\n if (path.node.specifiers.length > 0) return\n if (removableImportPaths.has(path.node.source.value)) {\n path.remove()\n }\n },\n })\n }\n\n // Handle shared bindings inside the Program visitor so we have\n // access to programPath for cheap refIdents registration.\n if (opts.sharedBindings && opts.sharedBindings.size > 0) {\n sharedExportedNames = findExportedSharedBindings(\n ast,\n opts.sharedBindings,\n )\n removeSharedDeclarations(ast, opts.sharedBindings)\n\n const sharedModuleUrl = addSharedSearchParamToFilename(opts.filename)\n\n const sharedImportSpecifiers = [...opts.sharedBindings].map((name) =>\n t.importSpecifier(t.identifier(name), t.identifier(name)),\n )\n const [sharedImportPath] = programPath.unshiftContainer(\n 'body',\n t.importDeclaration(\n sharedImportSpecifiers,\n t.stringLiteral(sharedModuleUrl),\n ),\n )\n\n // Register import specifier locals in refIdents so DCE can remove unused ones\n sharedImportPath.traverse({\n Identifier(identPath) {\n if (\n identPath.parentPath.isImportSpecifier() &&\n identPath.key === 'local'\n ) {\n refIdents.add(identPath)\n }\n },\n })\n\n // Re-export user-exported shared bindings from the shared module\n if (sharedExportedNames.size > 0) {\n const reExportSpecifiers = [...sharedExportedNames].map((name) =>\n t.exportSpecifier(t.identifier(name), t.identifier(name)),\n )\n programPath.pushContainer(\n 'body',\n t.exportNamedDeclaration(\n null,\n reExportSpecifiers,\n t.stringLiteral(sharedModuleUrl),\n ),\n )\n }\n }\n },\n },\n })\n\n if (!modified) {\n return null\n }\n\n deadCodeElimination(ast, refIdents)\n\n // if there are exported identifiers, then we need to add a warning\n // to the file to let the user know that the exported identifiers\n // will not in the split file but in the original file, therefore\n // increasing the bundle size\n if (knownExportedIdents.size > 0) {\n const warningMessage = createNotExportableMessage(\n opts.filename,\n knownExportedIdents,\n )\n console.warn(warningMessage)\n\n // append this warning to the file using a template\n if (process.env.NODE_ENV !== 'production') {\n const warningTemplate = template.statement(\n `console.warn(${JSON.stringify(warningMessage)})`,\n )()\n ast.program.body.unshift(warningTemplate)\n }\n }\n\n const result = generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\n\n // @babel/generator does not populate sourcesContent because it only has\n // the AST, not the original text. Without this, Vite's composed\n // sourcemap omits the original source, causing downstream consumers\n // (e.g. import-protection snippet display) to fall back to the shorter\n // compiled output and fail to resolve original line numbers.\n if (result.map) {\n result.map.sourcesContent = [opts.code]\n }\n\n return result\n}\n\nexport function compileCodeSplitVirtualRoute(\n opts: ParseAstOptions & {\n splitTargets: Array<SplitRouteIdentNodes>\n filename: string\n sharedBindings?: Set<string>\n },\n): GeneratorResult {\n const ast = parseAst(opts)\n const refIdents = findReferencedIdentifiers(ast)\n\n // Remove shared declarations BEFORE babel.traverse so the scope never sees\n // conflicting bindings (avoids checkBlockScopedCollisions crash in DCE)\n if (opts.sharedBindings && opts.sharedBindings.size > 0) {\n removeSharedDeclarations(ast, opts.sharedBindings)\n }\n\n const intendedSplitNodes = new Set(opts.splitTargets)\n\n const knownExportedIdents = new Set<string>()\n\n babel.traverse(ast, {\n Program: {\n enter(programPath) {\n const trackedNodesToSplitByType: Record<\n SplitRouteIdentNodes,\n { node: t.Node | undefined; meta: SplitNodeMeta } | undefined\n > = {\n component: undefined,\n loader: undefined,\n pendingComponent: undefined,\n errorComponent: undefined,\n notFoundComponent: undefined,\n }\n\n // Find and track all the known split-able nodes\n programPath.traverse({\n CallExpression: (path) => {\n if (!t.isIdentifier(path.node.callee)) {\n return\n }\n\n if (!splittableCreateRouteFns.includes(path.node.callee.name)) {\n return\n }\n\n function babelHandleVirtual(options: t.Node | undefined) {\n if (t.isObjectExpression(options)) {\n options.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n // do not use `intendedSplitNodes` here\n // since we have special considerations that need\n // to be accounted for like (not splitting exported identifiers)\n KNOWN_SPLIT_ROUTE_IDENTS.forEach((splitType) => {\n if (getObjectPropertyKeyName(prop) !== splitType) {\n return\n }\n\n const value = prop.value\n\n // If the value for the `key` is `undefined`, then we don't need to include it\n // in the split file, so we can just return, since it will kept in-place in the\n // reference file\n // This is useful for cases like: `createFileRoute('/')({ component: undefined })`\n if (t.isIdentifier(value) && value.name === 'undefined') {\n return\n }\n\n let isExported = false\n if (t.isIdentifier(value)) {\n isExported = hasExport(ast, value)\n if (isExported) {\n knownExportedIdents.add(value.name)\n }\n }\n\n // If the node is exported, we need to remove\n // the export from the split file\n if (isExported && t.isIdentifier(value)) {\n removeExports(ast, value)\n } else {\n const meta = SPLIT_NODES_CONFIG.get(splitType)!\n trackedNodesToSplitByType[splitType] = {\n node: prop.value,\n meta,\n }\n }\n })\n }\n })\n\n // Remove all of the options\n options.properties = []\n }\n }\n\n if (t.isCallExpression(path.parentPath.node)) {\n // createFileRoute('/')({ ... })\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n babelHandleVirtual(options)\n } else if (t.isVariableDeclarator(path.parentPath.node)) {\n // createFileRoute({ ... })\n const caller = resolveIdentifier(path, path.parentPath.node.init)\n\n if (t.isCallExpression(caller)) {\n const options = resolveIdentifier(path, caller.arguments[0])\n babelHandleVirtual(options)\n }\n }\n },\n })\n\n // Start the transformation to only exported the intended split nodes\n intendedSplitNodes.forEach((SPLIT_TYPE) => {\n const splitKey = trackedNodesToSplitByType[SPLIT_TYPE]\n\n if (!splitKey) {\n return\n }\n\n let splitNode = splitKey.node\n const splitMeta = { ...splitKey.meta, shouldRemoveNode: true }\n\n // Track the original identifier name before resolving through bindings,\n // needed for destructured patterns where the binding resolves to the\n // entire VariableDeclarator (ObjectPattern) rather than the specific binding\n let originalIdentName: string | undefined\n if (t.isIdentifier(splitNode)) {\n originalIdentName = splitNode.name\n }\n\n while (t.isIdentifier(splitNode)) {\n const binding = programPath.scope.getBinding(splitNode.name)\n splitNode = binding?.path.node\n }\n\n // Add the node to the program\n if (splitNode) {\n if (t.isFunctionDeclaration(splitNode)) {\n // an anonymous function declaration should only happen for `export default function() {...}`\n // so we should never get here\n if (!splitNode.id) {\n throw new Error(\n `Function declaration for \"${SPLIT_TYPE}\" must have an identifier.`,\n )\n }\n splitMeta.shouldRemoveNode = false\n splitMeta.localExporterIdent = splitNode.id.name\n } else if (\n t.isFunctionExpression(splitNode) ||\n t.isArrowFunctionExpression(splitNode)\n ) {\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitMeta.localExporterIdent),\n splitNode as any,\n ),\n ]),\n )\n } else if (\n t.isImportSpecifier(splitNode) ||\n t.isImportDefaultSpecifier(splitNode)\n ) {\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitMeta.localExporterIdent),\n splitNode.local,\n ),\n ]),\n )\n } else if (t.isVariableDeclarator(splitNode)) {\n if (t.isIdentifier(splitNode.id)) {\n splitMeta.localExporterIdent = splitNode.id.name\n splitMeta.shouldRemoveNode = false\n } else if (t.isObjectPattern(splitNode.id)) {\n // Destructured binding like `const { component: MyComp } = createBits()`\n // Use the original identifier name that was tracked before resolving\n if (originalIdentName) {\n splitMeta.localExporterIdent = originalIdentName\n }\n splitMeta.shouldRemoveNode = false\n } else {\n throw new Error(\n `Unexpected splitNode type ☝️: ${splitNode.type}`,\n )\n }\n } else if (t.isCallExpression(splitNode)) {\n const outputSplitNodeCode = generateFromAst(splitNode).code\n const splitNodeAst = babel.parse(outputSplitNodeCode)\n\n if (!splitNodeAst) {\n throw new Error(\n `Failed to parse the generated code for \"${SPLIT_TYPE}\" in the node type \"${splitNode.type}\"`,\n )\n }\n\n const statement = splitNodeAst.program.body[0]\n\n if (!statement) {\n throw new Error(\n `Failed to parse the generated code for \"${SPLIT_TYPE}\" in the node type \"${splitNode.type}\" as no statement was found in the program body`,\n )\n }\n\n if (t.isExpressionStatement(statement)) {\n const expression = statement.expression\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitMeta.localExporterIdent),\n expression,\n ),\n ]),\n )\n } else {\n throw new Error(\n `Unexpected expression type encounter for \"${SPLIT_TYPE}\" in the node type \"${splitNode.type}\"`,\n )\n }\n } else if (t.isConditionalExpression(splitNode)) {\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitMeta.localExporterIdent),\n splitNode,\n ),\n ]),\n )\n } else if (t.isTSAsExpression(splitNode)) {\n // remove the type assertion\n splitNode = splitNode.expression\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitMeta.localExporterIdent),\n splitNode,\n ),\n ]),\n )\n } else if (t.isBooleanLiteral(splitNode)) {\n // Handle boolean literals\n // This exits early here, since this value will be kept in the reference file\n return\n } else if (t.isNullLiteral(splitNode)) {\n // Handle null literals\n // This exits early here, since this value will be kept in the reference file\n return\n } else {\n console.info('Unexpected splitNode type:', splitNode)\n throw new Error(`Unexpected splitNode type ☝️: ${splitNode.type}`)\n }\n }\n\n if (splitMeta.shouldRemoveNode) {\n // If the splitNode exists at the top of the program\n // then we need to remove that copy\n programPath.node.body = programPath.node.body.filter((node) => {\n return node !== splitNode\n })\n }\n\n // Export the node\n programPath.pushContainer('body', [\n t.exportNamedDeclaration(null, [\n t.exportSpecifier(\n t.identifier(splitMeta.localExporterIdent), // local variable name\n t.identifier(splitMeta.exporterIdent), // as what name it should be exported as\n ),\n ]),\n ])\n })\n\n // convert exports to imports from the original file\n programPath.traverse({\n ExportNamedDeclaration(path) {\n // e.g. export const x = 1 or export { x }\n // becomes\n // import { x } from '${opts.id}'\n\n if (path.node.declaration) {\n if (t.isVariableDeclaration(path.node.declaration)) {\n const specifiers = path.node.declaration.declarations.flatMap(\n (decl) => {\n if (t.isIdentifier(decl.id)) {\n return [\n t.importSpecifier(\n t.identifier(decl.id.name),\n t.identifier(decl.id.name),\n ),\n ]\n }\n\n if (t.isObjectPattern(decl.id)) {\n return collectIdentifiersFromPattern(decl.id).map(\n (name) =>\n t.importSpecifier(\n t.identifier(name),\n t.identifier(name),\n ),\n )\n }\n\n if (t.isArrayPattern(decl.id)) {\n return collectIdentifiersFromPattern(decl.id).map(\n (name) =>\n t.importSpecifier(\n t.identifier(name),\n t.identifier(name),\n ),\n )\n }\n\n return []\n },\n )\n\n if (specifiers.length === 0) {\n path.remove()\n return\n }\n\n const importDecl = t.importDeclaration(\n specifiers,\n t.stringLiteral(\n removeSplitSearchParamFromFilename(opts.filename),\n ),\n )\n\n path.replaceWith(importDecl)\n\n // Track the imported identifier paths so deadCodeElimination can remove them if unused\n // We need to traverse the newly created import to get the identifier paths\n path.traverse({\n Identifier(identPath) {\n // Only track the local binding identifiers (the imported names)\n if (\n identPath.parentPath.isImportSpecifier() &&\n identPath.key === 'local'\n ) {\n refIdents.add(identPath)\n }\n },\n })\n }\n }\n },\n })\n\n // Add shared bindings import, registering specifiers in refIdents\n // so DCE can remove unused ones (same pattern as import replacements above).\n if (opts.sharedBindings && opts.sharedBindings.size > 0) {\n const sharedImportSpecifiers = [...opts.sharedBindings].map((name) =>\n t.importSpecifier(t.identifier(name), t.identifier(name)),\n )\n const sharedModuleUrl = addSharedSearchParamToFilename(\n removeSplitSearchParamFromFilename(opts.filename),\n )\n const [sharedImportPath] = programPath.unshiftContainer(\n 'body',\n t.importDeclaration(\n sharedImportSpecifiers,\n t.stringLiteral(sharedModuleUrl),\n ),\n )\n\n sharedImportPath.traverse({\n Identifier(identPath) {\n if (\n identPath.parentPath.isImportSpecifier() &&\n identPath.key === 'local'\n ) {\n refIdents.add(identPath)\n }\n },\n })\n }\n },\n },\n })\n\n deadCodeElimination(ast, refIdents)\n\n // Strip top-level expression statements that reference no locally-bound names.\n // DCE only removes unused declarations; bare side-effect statements like\n // `console.log(...)` survive even when the virtual file has no exports.\n {\n const locallyBound = new Set<string>()\n for (const stmt of ast.program.body) {\n collectLocalBindingsFromStatement(stmt, locallyBound)\n }\n ast.program.body = ast.program.body.filter((stmt) => {\n if (!t.isExpressionStatement(stmt)) return true\n const refs = collectIdentifiersFromNode(stmt)\n // Keep if it references at least one locally-bound identifier\n return [...refs].some((name) => locallyBound.has(name))\n })\n }\n\n // If the body is empty after DCE, strip directive prologues too.\n // A file containing only `'use client'` with no real code is useless.\n if (ast.program.body.length === 0) {\n ast.program.directives = []\n }\n\n const result = generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\n\n // @babel/generator does not populate sourcesContent — see compileCodeSplitReferenceRoute.\n if (result.map) {\n result.map.sourcesContent = [opts.code]\n }\n\n return result\n}\n\n/**\n * Compile the shared virtual module (`?tsr-shared=1`).\n * Keeps only shared binding declarations, their transitive dependencies,\n * and imports they need. Exports all shared bindings.\n */\nexport function compileCodeSplitSharedRoute(\n opts: ParseAstOptions & {\n sharedBindings: Set<string>\n filename: string\n },\n): GeneratorResult {\n const ast = parseAst(opts)\n const refIdents = findReferencedIdentifiers(ast)\n\n // Collect all names that need to stay: shared bindings + their transitive deps\n const localBindings = new Set<string>()\n for (const node of ast.program.body) {\n collectLocalBindingsFromStatement(node, localBindings)\n }\n\n // Route must never be extracted into the shared module.\n // Excluding it from the dep graph prevents expandTransitively from\n // pulling it in as a transitive dependency of a shared binding.\n localBindings.delete('Route')\n\n const declMap = buildDeclarationMap(ast)\n const depGraph = buildDependencyGraph(declMap, localBindings)\n\n // Start with shared bindings and expand transitively\n const keepBindings = new Set(opts.sharedBindings)\n keepBindings.delete('Route')\n expandTransitively(keepBindings, depGraph)\n\n // Remove all statements except:\n // - Import declarations (needed for deps; DCE will clean unused ones)\n // - Declarations of bindings in keepBindings\n ast.program.body = ast.program.body.filter((stmt) => {\n // Always keep imports — DCE will remove unused ones\n if (t.isImportDeclaration(stmt)) return true\n\n const decl =\n t.isExportNamedDeclaration(stmt) && stmt.declaration\n ? stmt.declaration\n : stmt\n\n if (t.isVariableDeclaration(decl)) {\n // Keep declarators where at least one binding is in keepBindings\n decl.declarations = decl.declarations.filter((declarator) => {\n const names = collectIdentifiersFromPattern(declarator.id)\n return names.some((n) => keepBindings.has(n))\n })\n if (decl.declarations.length === 0) return false\n\n // Strip the `export` wrapper — shared module controls its own exports\n if (t.isExportNamedDeclaration(stmt) && stmt.declaration) {\n return true // keep for now, we'll convert below\n }\n return true\n } else if (t.isFunctionDeclaration(decl) && decl.id) {\n return keepBindings.has(decl.id.name)\n } else if (t.isClassDeclaration(decl) && decl.id) {\n return keepBindings.has(decl.id.name)\n }\n\n // Remove everything else (expression statements, other exports, etc.)\n return false\n })\n\n // Convert `export const/function/class` to plain declarations\n // (we'll add our own export statement at the end)\n ast.program.body = ast.program.body.map((stmt) => {\n if (t.isExportNamedDeclaration(stmt) && stmt.declaration) {\n return stmt.declaration\n }\n return stmt\n })\n\n // Export all shared bindings (sorted for deterministic output)\n const exportNames = [...opts.sharedBindings].sort((a, b) =>\n a.localeCompare(b),\n )\n const exportSpecifiers = exportNames.map((name) =>\n t.exportSpecifier(t.identifier(name), t.identifier(name)),\n )\n if (exportSpecifiers.length > 0) {\n const exportDecl = t.exportNamedDeclaration(null, exportSpecifiers)\n ast.program.body.push(exportDecl)\n\n // Register export specifier locals in refIdents so DCE doesn't treat\n // the exported bindings as unreferenced.\n babel.traverse(ast, {\n Program(programPath) {\n const bodyPaths = programPath.get('body')\n const last = bodyPaths[bodyPaths.length - 1]\n if (last && last.isExportNamedDeclaration()) {\n last.traverse({\n Identifier(identPath) {\n if (\n identPath.parentPath.isExportSpecifier() &&\n identPath.key === 'local'\n ) {\n refIdents.add(identPath)\n }\n },\n })\n }\n programPath.stop()\n },\n })\n }\n\n deadCodeElimination(ast, refIdents)\n\n // If the body is empty after DCE, strip directive prologues too.\n if (ast.program.body.length === 0) {\n ast.program.directives = []\n }\n\n const result = generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\n\n // @babel/generator does not populate sourcesContent — see compileCodeSplitReferenceRoute.\n if (result.map) {\n result.map.sourcesContent = [opts.code]\n }\n\n return result\n}\n\n/**\n * This function should read get the options from by searching for the key `codeSplitGroupings`\n * on createFileRoute and return it's values if it exists, else return undefined\n */\nexport function detectCodeSplitGroupingsFromRoute(opts: ParseAstOptions): {\n groupings: CodeSplitGroupings | undefined\n} {\n const ast = parseAst(opts)\n\n let codeSplitGroupings: CodeSplitGroupings | undefined = undefined\n\n babel.traverse(ast, {\n Program: {\n enter(programPath) {\n programPath.traverse({\n CallExpression(path) {\n if (!t.isIdentifier(path.node.callee)) {\n return\n }\n\n if (\n !(\n path.node.callee.name === 'createRoute' ||\n path.node.callee.name === 'createFileRoute'\n )\n ) {\n return\n }\n\n function babelHandleSplittingGroups(\n routeOptions: t.Node | undefined,\n ) {\n if (t.isObjectExpression(routeOptions)) {\n routeOptions.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n const key = getObjectPropertyKeyName(prop)\n if (key === 'codeSplitGroupings') {\n const value = prop.value\n\n if (t.isArrayExpression(value)) {\n codeSplitGroupings = value.elements.map((group) => {\n if (t.isArrayExpression(group)) {\n return group.elements.map((node) => {\n if (!t.isStringLiteral(node)) {\n throw new Error(\n 'You must provide a string literal for the codeSplitGroupings',\n )\n }\n\n return node.value\n }) as Array<SplitRouteIdentNodes>\n }\n\n throw new Error(\n 'You must provide arrays with codeSplitGroupings options.',\n )\n })\n } else {\n throw new Error(\n 'You must provide an array of arrays for the codeSplitGroupings.',\n )\n }\n }\n }\n })\n }\n }\n\n // Extracting the codeSplitGroupings\n if (t.isCallExpression(path.parentPath.node)) {\n // createFileRoute('/')({ ... })\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n babelHandleSplittingGroups(options)\n } else if (t.isVariableDeclarator(path.parentPath.node)) {\n // createFileRoute({ ... })\n const caller = resolveIdentifier(path, path.parentPath.node.init)\n\n if (t.isCallExpression(caller)) {\n const options = resolveIdentifier(path, caller.arguments[0])\n babelHandleSplittingGroups(options)\n }\n }\n },\n })\n },\n },\n })\n\n return { groupings: codeSplitGroupings }\n}\n\nfunction createNotExportableMessage(\n filename: string,\n idents: Set<string>,\n): string {\n const list = Array.from(idents).map((d) => `- ${d}`)\n\n const message = [\n `[tanstack-router] These exports from \"${filename}\" will not be code-split and will increase your bundle size:`,\n ...list,\n 'For the best optimization, these items should either have their export statements removed, or be imported from another location that is not a route file.',\n ].join('\\n')\n\n return message\n}\n\nfunction getImportSpecifierAndPathFromLocalName(\n programPath: babel.NodePath<t.Program>,\n name: string,\n): {\n specifier:\n | t.ImportSpecifier\n | t.ImportDefaultSpecifier\n | t.ImportNamespaceSpecifier\n | null\n path: string | null\n} {\n let specifier:\n | t.ImportSpecifier\n | t.ImportDefaultSpecifier\n | t.ImportNamespaceSpecifier\n | null = null\n let path: string | null = null\n\n programPath.traverse({\n ImportDeclaration(importPath) {\n const found = importPath.node.specifiers.find(\n (targetSpecifier) => targetSpecifier.local.name === name,\n )\n if (found) {\n specifier = found\n path = importPath.node.source.value\n }\n },\n })\n\n return { specifier, path }\n}\n\n/**\n * Recursively collects all identifier names from a destructuring pattern\n * (ObjectPattern, ArrayPattern, AssignmentPattern, RestElement).\n */\nfunction collectIdentifiersFromPattern(\n node: t.LVal | t.Node | null | undefined,\n): Array<string> {\n if (!node) {\n return []\n }\n\n if (t.isIdentifier(node)) {\n return [node.name]\n }\n\n if (t.isAssignmentPattern(node)) {\n return collectIdentifiersFromPattern(node.left)\n }\n\n if (t.isRestElement(node)) {\n return collectIdentifiersFromPattern(node.argument)\n }\n\n if (t.isObjectPattern(node)) {\n return node.properties.flatMap((prop) => {\n if (t.isObjectProperty(prop)) {\n return collectIdentifiersFromPattern(prop.value as t.LVal)\n }\n if (t.isRestElement(prop)) {\n return collectIdentifiersFromPattern(prop.argument)\n }\n return []\n })\n }\n\n if (t.isArrayPattern(node)) {\n return node.elements.flatMap((element) =>\n collectIdentifiersFromPattern(element),\n )\n }\n\n return []\n}\n\n// Reusable function to get literal value or resolve variable to literal\nfunction resolveIdentifier(path: any, node: any): t.Node | undefined {\n if (t.isIdentifier(node)) {\n const binding = path.scope.getBinding(node.name)\n if (\n binding\n // && binding.kind === 'const'\n ) {\n const declarator = binding.path.node\n if (t.isObjectExpression(declarator.init)) {\n return declarator.init\n } else if (t.isFunctionDeclaration(declarator.init)) {\n return declarator.init\n }\n }\n return undefined\n }\n\n return node\n}\n\nfunction removeIdentifierLiteral(path: babel.NodePath, node: t.Identifier) {\n const binding = path.scope.getBinding(node.name)\n if (binding) {\n // If the binding is a destructured property from an ObjectPattern,\n // only remove that property instead of the entire declaration\n if (\n t.isVariableDeclarator(binding.path.node) &&\n t.isObjectPattern(binding.path.node.id)\n ) {\n const objectPattern = binding.path.node.id\n objectPattern.properties = objectPattern.properties.filter((prop) => {\n if (!t.isObjectProperty(prop)) {\n return true\n }\n\n if (t.isIdentifier(prop.value) && prop.value.name === node.name) {\n return false\n }\n\n if (\n t.isAssignmentPattern(prop.value) &&\n t.isIdentifier(prop.value.left) &&\n prop.value.left.name === node.name\n ) {\n return false\n }\n\n return true\n })\n\n // If no properties remain, remove the entire declaration\n if (objectPattern.properties.length === 0) {\n binding.path.remove()\n }\n\n return\n }\n\n binding.path.remove()\n }\n}\n\nfunction hasExport(ast: t.File, node: t.Identifier): boolean {\n let found = false\n\n babel.traverse(ast, {\n ExportNamedDeclaration(path) {\n if (path.node.declaration) {\n // declared as `const loaderFn = () => {}`\n if (t.isVariableDeclaration(path.node.declaration)) {\n path.node.declaration.declarations.forEach((decl) => {\n if (t.isVariableDeclarator(decl)) {\n if (t.isIdentifier(decl.id)) {\n if (decl.id.name === node.name) {\n found = true\n }\n } else if (\n t.isObjectPattern(decl.id) ||\n t.isArrayPattern(decl.id)\n ) {\n // Handle destructured exports like `export const { a, b } = fn()`\n const names = collectIdentifiersFromPattern(decl.id)\n if (names.includes(node.name)) {\n found = true\n }\n }\n }\n })\n }\n\n // declared as `function loaderFn() {}`\n if (t.isFunctionDeclaration(path.node.declaration)) {\n if (t.isIdentifier(path.node.declaration.id)) {\n if (path.node.declaration.id.name === node.name) {\n found = true\n }\n }\n }\n }\n },\n ExportDefaultDeclaration(path) {\n // declared as `export default loaderFn`\n if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n found = true\n }\n }\n\n // declared as `export default function loaderFn() {}`\n if (t.isFunctionDeclaration(path.node.declaration)) {\n if (t.isIdentifier(path.node.declaration.id)) {\n if (path.node.declaration.id.name === node.name) {\n found = true\n }\n }\n }\n },\n })\n\n return found\n}\n\nfunction removeExports(ast: t.File, node: t.Identifier): boolean {\n let removed = false\n\n // The checks use sequential if/else if statements since it\n // directly mutates the AST and as such doing normal checks\n // (using only if statements) could lead to a situation where\n // `path.node` is null since it has been already removed from\n // the program tree but typescript doesn't know that.\n babel.traverse(ast, {\n ExportNamedDeclaration(path) {\n if (path.node.declaration) {\n if (t.isVariableDeclaration(path.node.declaration)) {\n // declared as `const loaderFn = () => {}`\n path.node.declaration.declarations.forEach((decl) => {\n if (t.isVariableDeclarator(decl)) {\n if (t.isIdentifier(decl.id)) {\n if (decl.id.name === node.name) {\n path.remove()\n removed = true\n }\n } else if (\n t.isObjectPattern(decl.id) ||\n t.isArrayPattern(decl.id)\n ) {\n // Handle destructured exports like `export const { a, b } = fn()`\n const names = collectIdentifiersFromPattern(decl.id)\n if (names.includes(node.name)) {\n path.remove()\n removed = true\n }\n }\n }\n })\n } else if (t.isFunctionDeclaration(path.node.declaration)) {\n // declared as `export const loaderFn = () => {}`\n if (t.isIdentifier(path.node.declaration.id)) {\n if (path.node.declaration.id.name === node.name) {\n path.remove()\n removed = true\n }\n }\n }\n }\n },\n ExportDefaultDeclaration(path) {\n // declared as `export default loaderFn`\n if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n path.remove()\n removed = true\n }\n } else if (t.isFunctionDeclaration(path.node.declaration)) {\n // declared as `export default function loaderFn() {}`\n if (t.isIdentifier(path.node.declaration.id)) {\n if (path.node.declaration.id.name === node.name) {\n path.remove()\n removed = true\n }\n }\n }\n },\n })\n\n return removed\n}\n"],"mappings":"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"}
|