@tanstack/router-plugin 1.87.10 → 1.87.13

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.
@@ -183,7 +183,8 @@ function compileCodeSplitReferenceRoute(opts) {
183
183
  if (debug) console.info("");
184
184
  if (debug) console.info("");
185
185
  return generate(ast$1, {
186
- sourceMaps: true
186
+ sourceMaps: true,
187
+ sourceFileName: opts.filename
187
188
  });
188
189
  }
189
190
  const splitNodeTypes = ["component", "loader"];
@@ -366,7 +367,6 @@ function compileCodeSplitVirtualRoute(opts) {
366
367
  });
367
368
  if (debug) console.info("");
368
369
  if (debug) console.info("Dead Code Elimination Input 2:");
369
- console.log(JSON.stringify(ast$1, null, 2));
370
370
  if (debug) console.info(generate(ast$1, { sourceMaps: true }).code);
371
371
  if (debug) console.info("");
372
372
  if (debug) console.info("");
@@ -395,7 +395,8 @@ These should either have their export statements removed or be imported from ano
395
395
  }
396
396
  }
397
397
  return generate(ast$1, {
398
- sourceMaps: true
398
+ sourceMaps: true,
399
+ sourceFileName: opts.filename
399
400
  });
400
401
  }
401
402
  function getImportSpecifierAndPathFromLocalName(programPath, name) {
@@ -1 +1 @@
1
- {"version":3,"file":"compilers.cjs","sources":["../../../../src/core/code-splitter/compilers.ts"],"sourcesContent":["import * as t from '@babel/types'\nimport babel from '@babel/core'\nimport _generate from '@babel/generator'\nimport * as template from '@babel/template'\nimport { deadCodeElimination } from 'babel-dead-code-elimination'\n\nimport { splitPrefix } from '../constants'\nimport { parseAst } from './ast'\nimport type { ParseAstOptions } from './ast'\n\nconst debug = process.env.TSR_VITE_DEBUG\n\n// Babel is a CJS package and uses `default` as named binding (`exports.default =`).\n// https://github.com/babel/babel/issues/15269.\nlet generate = (_generate as any)['default'] as typeof _generate\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nif (!generate) {\n generate = _generate\n}\n\ntype SplitModulesById = Record<\n string,\n { id: string; node: t.FunctionExpression }\n>\n\ninterface State {\n filename: string\n opts: {\n minify: boolean\n root: string\n }\n imported: Record<string, boolean>\n refs: Set<any>\n serverIndex: number\n splitIndex: number\n splitModulesById: SplitModulesById\n}\n\nexport function compileCodeSplitReferenceRoute(opts: ParseAstOptions) {\n const ast = parseAst(opts)\n\n babel.traverse(ast, {\n Program: {\n enter(programPath, programState) {\n const state = programState as unknown as State\n\n const splitUrl = `${splitPrefix}:${opts.filename}?${splitPrefix}`\n\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 let existingCompImportPath: string | null = null\n let existingLoaderImportPath: string | null = null\n\n programPath.traverse(\n {\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 if (t.isCallExpression(path.parentPath.node)) {\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n let found = false\n\n const hasImportedOrDefinedIdentifier = (name: string) => {\n return programPath.scope.hasBinding(name)\n }\n\n if (t.isObjectExpression(options)) {\n options.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n if (t.isIdentifier(prop.key)) {\n if (prop.key.name === 'component') {\n const value = prop.value\n\n let shouldSplit = true\n\n if (t.isIdentifier(value)) {\n existingCompImportPath =\n getImportSpecifierAndPathFromLocalName(\n programPath,\n value.name,\n ).path\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 shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (shouldSplit) {\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\n if (\n !hasImportedOrDefinedIdentifier(\n 'lazyRouteComponent',\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `import { lazyRouteComponent } from '@tanstack/react-router'`,\n )(),\n ])\n }\n\n if (\n !hasImportedOrDefinedIdentifier(\n '$$splitComponentImporter',\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `const $$splitComponentImporter = () => import('${splitUrl}')`,\n )(),\n ])\n }\n\n prop.value = template.expression(\n `lazyRouteComponent($$splitComponentImporter, 'component', () => Route.ssr)`,\n )()\n\n programPath.pushContainer('body', [\n template.statement(\n `function DummyComponent() { return null }`,\n )(),\n ])\n\n found = true\n }\n } else if (prop.key.name === 'loader') {\n const value = prop.value\n\n let shouldSplit = true\n\n if (t.isIdentifier(value)) {\n existingLoaderImportPath =\n getImportSpecifierAndPathFromLocalName(\n programPath,\n value.name,\n ).path\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 shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (shouldSplit) {\n // Prepend the import statement to the program along with the importer function\n if (!hasImportedOrDefinedIdentifier('lazyFn')) {\n programPath.unshiftContainer('body', [\n template.smart(\n `import { lazyFn } from '@tanstack/react-router'`,\n )() as t.Statement,\n ])\n }\n\n if (\n !hasImportedOrDefinedIdentifier(\n '$$splitLoaderImporter',\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `const $$splitLoaderImporter = () => import('${splitUrl}')`,\n )(),\n ])\n }\n\n prop.value = template.expression(\n `lazyFn($$splitLoaderImporter, 'loader')`,\n )()\n\n found = true\n }\n }\n }\n }\n\n programPath.scope.crawl()\n })\n }\n\n if (found as boolean) {\n programPath.pushContainer('body', [\n template.statement(`function TSR_Dummy_Component() {}`)(),\n ])\n }\n }\n },\n },\n state,\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 (\n (existingCompImportPath as string | null) ||\n (existingLoaderImportPath as string | null)\n ) {\n programPath.traverse({\n ImportDeclaration(path) {\n if (path.node.specifiers.length > 0) return\n if (\n path.node.source.value === existingCompImportPath ||\n path.node.source.value === existingLoaderImportPath\n ) {\n path.remove()\n }\n },\n })\n }\n },\n },\n })\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Input 1:')\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\n\n deadCodeElimination(ast)\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Output 1:')\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\n\n return generate(ast, {\n sourceMaps: true,\n })\n}\n\nconst splitNodeTypes = ['component', 'loader'] as const\ntype SplitNodeType = (typeof splitNodeTypes)[number]\n\nexport function compileCodeSplitVirtualRoute(opts: ParseAstOptions) {\n const ast = parseAst(opts)\n\n const knownExportedIdents = new Set<string>()\n\n babel.traverse(ast, {\n Program: {\n enter(programPath, programState) {\n const state = programState as unknown as State\n\n const splitNodesByType: Record<SplitNodeType, t.Node | undefined> = {\n component: undefined,\n loader: undefined,\n }\n\n // Find the node\n programPath.traverse(\n {\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 if (t.isCallExpression(path.parentPath.node)) {\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n if (t.isObjectExpression(options)) {\n options.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n splitNodeTypes.forEach((splitType) => {\n if (\n !t.isIdentifier(prop.key) ||\n prop.key.name !== splitType\n ) {\n return\n }\n\n const value = prop.value\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 splitNodesByType[splitType] = prop.value\n }\n })\n }\n })\n\n // Remove all of the options\n options.properties = []\n }\n }\n },\n },\n state,\n )\n\n splitNodeTypes.forEach((splitType) => {\n let splitNode = splitNodesByType[splitType]\n\n if (!splitNode) {\n return\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 programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitType),\n t.functionExpression(\n splitNode.id || null, // Anonymize the function expression\n splitNode.params,\n splitNode.body,\n splitNode.generator,\n splitNode.async,\n ),\n ),\n ]),\n )\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(splitType),\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(splitType),\n splitNode.local,\n ),\n ]),\n )\n } else if (t.isVariableDeclarator(splitNode)) {\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(t.identifier(splitType), splitNode.init),\n ]),\n )\n } else if (t.isCallExpression(splitNode)) {\n const outputSplitNodeCode = generate(splitNode).code\n const splitNodeAst = babel.parse(outputSplitNodeCode)\n\n if (!splitNodeAst) {\n throw new Error(\n `Failed to parse the generated code for \"${splitType}\" 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 \"${splitType}\" 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(t.identifier(splitType), expression),\n ]),\n )\n } else {\n throw new Error(\n `Unexpected expression type encounter for \"${splitType}\" in the node type \"${splitNode.type}\"`,\n )\n }\n } else {\n console.info('Unexpected splitNode type:', splitNode)\n throw new Error(`Unexpected splitNode type ☝️: ${splitNode.type}`)\n }\n }\n\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 // Export the node\n programPath.pushContainer('body', [\n t.exportNamedDeclaration(null, [\n t.exportSpecifier(\n t.identifier(splitType),\n t.identifier(splitType),\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 path.replaceWith(\n t.importDeclaration(\n path.node.declaration.declarations.map((decl) =>\n t.importSpecifier(\n t.identifier((decl.id as any).name),\n t.identifier((decl.id as any).name),\n ),\n ),\n t.stringLiteral(\n opts.filename.split(`?${splitPrefix}`)[0] as string,\n ),\n ),\n )\n }\n }\n },\n })\n },\n },\n })\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Input 2:')\n console.log(JSON.stringify(ast, null, 2))\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\n\n deadCodeElimination(ast)\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Output 2:')\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\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 list = Array.from(knownExportedIdents).reduce((str, ident) => {\n str += `\\n- ${ident}`\n return str\n }, '')\n\n const warningMessage = `These exports from \"${opts.filename.replace('?' + splitPrefix, '')}\" are not being code-split and will increase your bundle size: ${list}\\nThese should either have their export statements removed or be imported from another file that is not a route.`\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 return generate(ast, {\n sourceMaps: true,\n })\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// Reusable function to get literal value or resolve variable to literal\nfunction resolveIdentifier(path: any, node: any) {\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: any, node: any) {\n if (t.isIdentifier(node)) {\n const binding = path.scope.getBinding(node.name)\n if (binding) {\n binding.path.remove()\n }\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 }\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 if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n found = true\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 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 path.remove()\n removed = true\n }\n }\n }\n })\n } else if (t.isFunctionDeclaration(path.node.declaration)) {\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 if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n path.remove()\n removed = true\n }\n }\n },\n })\n\n return removed\n}\n"],"names":["ast","parseAst","splitPrefix","t","template","deadCodeElimination"],"mappings":"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"}
1
+ {"version":3,"file":"compilers.cjs","sources":["../../../../src/core/code-splitter/compilers.ts"],"sourcesContent":["import * as t from '@babel/types'\nimport babel from '@babel/core'\nimport _generate from '@babel/generator'\nimport * as template from '@babel/template'\nimport { deadCodeElimination } from 'babel-dead-code-elimination'\n\nimport { splitPrefix } from '../constants'\nimport { parseAst } from './ast'\nimport type { ParseAstOptions } from './ast'\n\nconst debug = process.env.TSR_VITE_DEBUG\n\n// Babel is a CJS package and uses `default` as named binding (`exports.default =`).\n// https://github.com/babel/babel/issues/15269.\nlet generate = (_generate as any)['default'] as typeof _generate\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nif (!generate) {\n generate = _generate\n}\n\ntype SplitModulesById = Record<\n string,\n { id: string; node: t.FunctionExpression }\n>\n\ninterface State {\n filename: string\n opts: {\n minify: boolean\n root: string\n }\n imported: Record<string, boolean>\n refs: Set<any>\n serverIndex: number\n splitIndex: number\n splitModulesById: SplitModulesById\n}\n\nexport function compileCodeSplitReferenceRoute(opts: ParseAstOptions) {\n const ast = parseAst(opts)\n\n babel.traverse(ast, {\n Program: {\n enter(programPath, programState) {\n const state = programState as unknown as State\n\n const splitUrl = `${splitPrefix}:${opts.filename}?${splitPrefix}`\n\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 let existingCompImportPath: string | null = null\n let existingLoaderImportPath: string | null = null\n\n programPath.traverse(\n {\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 if (t.isCallExpression(path.parentPath.node)) {\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n let found = false\n\n const hasImportedOrDefinedIdentifier = (name: string) => {\n return programPath.scope.hasBinding(name)\n }\n\n if (t.isObjectExpression(options)) {\n options.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n if (t.isIdentifier(prop.key)) {\n if (prop.key.name === 'component') {\n const value = prop.value\n\n let shouldSplit = true\n\n if (t.isIdentifier(value)) {\n existingCompImportPath =\n getImportSpecifierAndPathFromLocalName(\n programPath,\n value.name,\n ).path\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 shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (shouldSplit) {\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\n if (\n !hasImportedOrDefinedIdentifier(\n 'lazyRouteComponent',\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `import { lazyRouteComponent } from '@tanstack/react-router'`,\n )(),\n ])\n }\n\n if (\n !hasImportedOrDefinedIdentifier(\n '$$splitComponentImporter',\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `const $$splitComponentImporter = () => import('${splitUrl}')`,\n )(),\n ])\n }\n\n prop.value = template.expression(\n `lazyRouteComponent($$splitComponentImporter, 'component', () => Route.ssr)`,\n )()\n\n programPath.pushContainer('body', [\n template.statement(\n `function DummyComponent() { return null }`,\n )(),\n ])\n\n found = true\n }\n } else if (prop.key.name === 'loader') {\n const value = prop.value\n\n let shouldSplit = true\n\n if (t.isIdentifier(value)) {\n existingLoaderImportPath =\n getImportSpecifierAndPathFromLocalName(\n programPath,\n value.name,\n ).path\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 shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (shouldSplit) {\n // Prepend the import statement to the program along with the importer function\n if (!hasImportedOrDefinedIdentifier('lazyFn')) {\n programPath.unshiftContainer('body', [\n template.smart(\n `import { lazyFn } from '@tanstack/react-router'`,\n )() as t.Statement,\n ])\n }\n\n if (\n !hasImportedOrDefinedIdentifier(\n '$$splitLoaderImporter',\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `const $$splitLoaderImporter = () => import('${splitUrl}')`,\n )(),\n ])\n }\n\n prop.value = template.expression(\n `lazyFn($$splitLoaderImporter, 'loader')`,\n )()\n\n found = true\n }\n }\n }\n }\n\n programPath.scope.crawl()\n })\n }\n\n if (found as boolean) {\n programPath.pushContainer('body', [\n template.statement(`function TSR_Dummy_Component() {}`)(),\n ])\n }\n }\n },\n },\n state,\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 (\n (existingCompImportPath as string | null) ||\n (existingLoaderImportPath as string | null)\n ) {\n programPath.traverse({\n ImportDeclaration(path) {\n if (path.node.specifiers.length > 0) return\n if (\n path.node.source.value === existingCompImportPath ||\n path.node.source.value === existingLoaderImportPath\n ) {\n path.remove()\n }\n },\n })\n }\n },\n },\n })\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Input 1:')\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\n\n deadCodeElimination(ast)\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Output 1:')\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\n\n return generate(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n })\n}\n\nconst splitNodeTypes = ['component', 'loader'] as const\ntype SplitNodeType = (typeof splitNodeTypes)[number]\n\nexport function compileCodeSplitVirtualRoute(opts: ParseAstOptions) {\n const ast = parseAst(opts)\n\n const knownExportedIdents = new Set<string>()\n\n babel.traverse(ast, {\n Program: {\n enter(programPath, programState) {\n const state = programState as unknown as State\n\n const splitNodesByType: Record<SplitNodeType, t.Node | undefined> = {\n component: undefined,\n loader: undefined,\n }\n\n // Find the node\n programPath.traverse(\n {\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 if (t.isCallExpression(path.parentPath.node)) {\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n if (t.isObjectExpression(options)) {\n options.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n splitNodeTypes.forEach((splitType) => {\n if (\n !t.isIdentifier(prop.key) ||\n prop.key.name !== splitType\n ) {\n return\n }\n\n const value = prop.value\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 splitNodesByType[splitType] = prop.value\n }\n })\n }\n })\n\n // Remove all of the options\n options.properties = []\n }\n }\n },\n },\n state,\n )\n\n splitNodeTypes.forEach((splitType) => {\n let splitNode = splitNodesByType[splitType]\n\n if (!splitNode) {\n return\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 programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitType),\n t.functionExpression(\n splitNode.id || null, // Anonymize the function expression\n splitNode.params,\n splitNode.body,\n splitNode.generator,\n splitNode.async,\n ),\n ),\n ]),\n )\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(splitType),\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(splitType),\n splitNode.local,\n ),\n ]),\n )\n } else if (t.isVariableDeclarator(splitNode)) {\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(t.identifier(splitType), splitNode.init),\n ]),\n )\n } else if (t.isCallExpression(splitNode)) {\n const outputSplitNodeCode = generate(splitNode).code\n const splitNodeAst = babel.parse(outputSplitNodeCode)\n\n if (!splitNodeAst) {\n throw new Error(\n `Failed to parse the generated code for \"${splitType}\" 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 \"${splitType}\" 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(t.identifier(splitType), expression),\n ]),\n )\n } else {\n throw new Error(\n `Unexpected expression type encounter for \"${splitType}\" in the node type \"${splitNode.type}\"`,\n )\n }\n } else {\n console.info('Unexpected splitNode type:', splitNode)\n throw new Error(`Unexpected splitNode type ☝️: ${splitNode.type}`)\n }\n }\n\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 // Export the node\n programPath.pushContainer('body', [\n t.exportNamedDeclaration(null, [\n t.exportSpecifier(\n t.identifier(splitType),\n t.identifier(splitType),\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 path.replaceWith(\n t.importDeclaration(\n path.node.declaration.declarations.map((decl) =>\n t.importSpecifier(\n t.identifier((decl.id as any).name),\n t.identifier((decl.id as any).name),\n ),\n ),\n t.stringLiteral(\n opts.filename.split(`?${splitPrefix}`)[0] as string,\n ),\n ),\n )\n }\n }\n },\n })\n },\n },\n })\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Input 2:')\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\n\n deadCodeElimination(ast)\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Output 2:')\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\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 list = Array.from(knownExportedIdents).reduce((str, ident) => {\n str += `\\n- ${ident}`\n return str\n }, '')\n\n const warningMessage = `These exports from \"${opts.filename.replace('?' + splitPrefix, '')}\" are not being code-split and will increase your bundle size: ${list}\\nThese should either have their export statements removed or be imported from another file that is not a route.`\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 return generate(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n })\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// Reusable function to get literal value or resolve variable to literal\nfunction resolveIdentifier(path: any, node: any) {\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: any, node: any) {\n if (t.isIdentifier(node)) {\n const binding = path.scope.getBinding(node.name)\n if (binding) {\n binding.path.remove()\n }\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 }\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 if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n found = true\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 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 path.remove()\n removed = true\n }\n }\n }\n })\n } else if (t.isFunctionDeclaration(path.node.declaration)) {\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 if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n path.remove()\n removed = true\n }\n }\n },\n })\n\n return removed\n}\n"],"names":["ast","parseAst","splitPrefix","t","template","deadCodeElimination"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,MAAM,QAAQ,QAAQ,IAAI;AAI1B,IAAI,WAAY,UAAkB,SAAS;AAG3C,IAAI,CAAC,UAAU;AACF,aAAA;AACb;AAoBO,SAAS,+BAA+B,MAAuB;AAC9D,QAAAA,QAAMC,aAAS,IAAI;AAEzB,QAAM,SAASD,OAAK;AAAA,IAClB,SAAS;AAAA,MACP,MAAM,aAAa,cAAc;AAC/B,cAAM,QAAQ;AAEd,cAAM,WAAW,GAAGE,qBAAW,IAAI,KAAK,QAAQ,IAAIA,UAAAA,WAAW;AAW/D,YAAI,yBAAwC;AAC5C,YAAI,2BAA0C;AAElC,oBAAA;AAAA,UACV;AAAA,YACE,gBAAgB,CAAC,SAAS;AACxB,kBAAI,CAACC,aAAE,aAAa,KAAK,KAAK,MAAM,GAAG;AACrC;AAAA,cAAA;AAIA,kBAAA,EACE,KAAK,KAAK,OAAO,SAAS,iBAC1B,KAAK,KAAK,OAAO,SAAS,oBAE5B;AACA;AAAA,cAAA;AAGF,kBAAIA,aAAE,iBAAiB,KAAK,WAAW,IAAI,GAAG;AAC5C,sBAAM,UAAU;AAAA,kBACd;AAAA,kBACA,KAAK,WAAW,KAAK,UAAU,CAAC;AAAA,gBAClC;AAEA,oBAAI,QAAQ;AAEN,sBAAA,iCAAiC,CAAC,SAAiB;AAChD,yBAAA,YAAY,MAAM,WAAW,IAAI;AAAA,gBAC1C;AAEI,oBAAAA,aAAE,mBAAmB,OAAO,GAAG;AACzB,0BAAA,WAAW,QAAQ,CAAC,SAAS;AAC/B,wBAAAA,aAAE,iBAAiB,IAAI,GAAG;AAC5B,0BAAIA,aAAE,aAAa,KAAK,GAAG,GAAG;AACxB,4BAAA,KAAK,IAAI,SAAS,aAAa;AACjC,gCAAM,QAAQ,KAAK;AAEnB,8BAAI,cAAc;AAEd,8BAAAA,aAAE,aAAa,KAAK,GAAG;AAEvB,qDAAA;AAAA,8BACE;AAAA,8BACA,MAAM;AAAA,4BAAA,EACN;AAKE,kCAAA,aAAa,UAAUH,OAAK,KAAK;AACvC,0CAAc,CAAC;AAEf,gCAAI,aAAa;AACf,sDAAwB,MAAM,KAAK;AAAA,4BAAA;AAAA,0BACrC;AAGF,8BAAI,aAAa;AAKf,gCACE,CAAC;AAAA,8BACC;AAAA,4BAAA,GAEF;AACA,0CAAY,iBAAiB,QAAQ;AAAA,gCACnCI,oBAAS;AAAA,kCACP;AAAA,gCACA,EAAA;AAAA,8BAAA,CACH;AAAA,4BAAA;AAGH,gCACE,CAAC;AAAA,8BACC;AAAA,4BAAA,GAEF;AACA,0CAAY,iBAAiB,QAAQ;AAAA,gCACnCA,oBAAS;AAAA,kCACP,kDAAkD,QAAQ;AAAA,gCAC1D,EAAA;AAAA,8BAAA,CACH;AAAA,4BAAA;AAGH,iCAAK,QAAQA,oBAAS;AAAA,8BACpB;AAAA,4BAAA,EACA;AAEF,wCAAY,cAAc,QAAQ;AAAA,8BAChCA,oBAAS;AAAA,gCACP;AAAA,8BACA,EAAA;AAAA,4BAAA,CACH;AAEO,oCAAA;AAAA,0BAAA;AAAA,wBAED,WAAA,KAAK,IAAI,SAAS,UAAU;AACrC,gCAAM,QAAQ,KAAK;AAEnB,8BAAI,cAAc;AAEd,8BAAAD,aAAE,aAAa,KAAK,GAAG;AAEvB,uDAAA;AAAA,8BACE;AAAA,8BACA,MAAM;AAAA,4BAAA,EACN;AAKE,kCAAA,aAAa,UAAUH,OAAK,KAAK;AACvC,0CAAc,CAAC;AAEf,gCAAI,aAAa;AACf,sDAAwB,MAAM,KAAK;AAAA,4BAAA;AAAA,0BACrC;AAGF,8BAAI,aAAa;AAEX,gCAAA,CAAC,+BAA+B,QAAQ,GAAG;AAC7C,0CAAY,iBAAiB,QAAQ;AAAA,gCACnCI,oBAAS;AAAA,kCACP;AAAA,gCACA,EAAA;AAAA,8BAAA,CACH;AAAA,4BAAA;AAGH,gCACE,CAAC;AAAA,8BACC;AAAA,4BAAA,GAEF;AACA,0CAAY,iBAAiB,QAAQ;AAAA,gCACnCA,oBAAS;AAAA,kCACP,+CAA+C,QAAQ;AAAA,gCACvD,EAAA;AAAA,8BAAA,CACH;AAAA,4BAAA;AAGH,iCAAK,QAAQA,oBAAS;AAAA,8BACpB;AAAA,4BAAA,EACA;AAEM,oCAAA;AAAA,0BAAA;AAAA,wBACV;AAAA,sBACF;AAAA,oBACF;AAGF,gCAAY,MAAM,MAAM;AAAA,kBAAA,CACzB;AAAA,gBAAA;AAGH,oBAAI,OAAkB;AACpB,8BAAY,cAAc,QAAQ;AAAA,oBAChCA,oBAAS,UAAU,mCAAmC,EAAE;AAAA,kBAAA,CACzD;AAAA,gBAAA;AAAA,cACH;AAAA,YACF;AAAA,UAEJ;AAAA,UACA;AAAA,QACF;AAQA,YACG,0BACA,0BACD;AACA,sBAAY,SAAS;AAAA,YACnB,kBAAkB,MAAM;AACtB,kBAAI,KAAK,KAAK,WAAW,SAAS,EAAG;AAEnC,kBAAA,KAAK,KAAK,OAAO,UAAU,0BAC3B,KAAK,KAAK,OAAO,UAAU,0BAC3B;AACA,qBAAK,OAAO;AAAA,cAAA;AAAA,YACd;AAAA,UACF,CACD;AAAA,QAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,CACD;AAEG,MAAA,MAAe,SAAA,KAAK,EAAE;AACtB,MAAA,MAAe,SAAA,KAAK,gCAAgC;AACpD,MAAA,MAAe,SAAA,KAAK,SAASJ,OAAK,EAAE,YAAY,MAAM,EAAE,IAAI;AAC5D,MAAA,MAAe,SAAA,KAAK,EAAE;AACtB,MAAA,MAAe,SAAA,KAAK,EAAE;AACtB,MAAA,MAAe,SAAA,KAAK,EAAE;AAE1BK,2BAAAA,oBAAoBL,KAAG;AAEnB,MAAA,MAAe,SAAA,KAAK,EAAE;AACtB,MAAA,MAAe,SAAA,KAAK,iCAAiC;AACrD,MAAA,MAAe,SAAA,KAAK,SAASA,OAAK,EAAE,YAAY,MAAM,EAAE,IAAI;AAC5D,MAAA,MAAe,SAAA,KAAK,EAAE;AACtB,MAAA,MAAe,SAAA,KAAK,EAAE;AACtB,MAAA,MAAe,SAAA,KAAK,EAAE;AAE1B,SAAO,SAASA,OAAK;AAAA,IACnB,YAAY;AAAA,IACZ,gBAAgB,KAAK;AAAA,EAAA,CACtB;AACH;AAEA,MAAM,iBAAiB,CAAC,aAAa,QAAQ;AAGtC,SAAS,6BAA6B,MAAuB;AAC5D,QAAAA,QAAMC,aAAS,IAAI;AAEnB,QAAA,0CAA0B,IAAY;AAE5C,QAAM,SAASD,OAAK;AAAA,IAClB,SAAS;AAAA,MACP,MAAM,aAAa,cAAc;AAC/B,cAAM,QAAQ;AAEd,cAAM,mBAA8D;AAAA,UAClE,WAAW;AAAA,UACX,QAAQ;AAAA,QACV;AAGY,oBAAA;AAAA,UACV;AAAA,YACE,gBAAgB,CAAC,SAAS;AACxB,kBAAI,CAACG,aAAE,aAAa,KAAK,KAAK,MAAM,GAAG;AACrC;AAAA,cAAA;AAIA,kBAAA,EACE,KAAK,KAAK,OAAO,SAAS,iBAC1B,KAAK,KAAK,OAAO,SAAS,oBAE5B;AACA;AAAA,cAAA;AAGF,kBAAIA,aAAE,iBAAiB,KAAK,WAAW,IAAI,GAAG;AAC5C,sBAAM,UAAU;AAAA,kBACd;AAAA,kBACA,KAAK,WAAW,KAAK,UAAU,CAAC;AAAA,gBAClC;AAEI,oBAAAA,aAAE,mBAAmB,OAAO,GAAG;AACzB,0BAAA,WAAW,QAAQ,CAAC,SAAS;AAC/B,wBAAAA,aAAE,iBAAiB,IAAI,GAAG;AACb,qCAAA,QAAQ,CAAC,cAAc;AAElC,4BAAA,CAACA,aAAE,aAAa,KAAK,GAAG,KACxB,KAAK,IAAI,SAAS,WAClB;AACA;AAAA,wBAAA;AAGF,8BAAM,QAAQ,KAAK;AAEnB,4BAAI,aAAa;AACb,4BAAAA,aAAE,aAAa,KAAK,GAAG;AACZ,uCAAA,UAAUH,OAAK,KAAK;AACjC,8BAAI,YAAY;AACM,gDAAA,IAAI,MAAM,IAAI;AAAA,0BAAA;AAAA,wBACpC;AAKF,4BAAI,cAAcG,aAAE,aAAa,KAAK,GAAG;AACvC,wCAAcH,OAAK,KAAK;AAAA,wBAAA,OACnB;AACY,2CAAA,SAAS,IAAI,KAAK;AAAA,wBAAA;AAAA,sBACrC,CACD;AAAA,oBAAA;AAAA,kBACH,CACD;AAGD,0BAAQ,aAAa,CAAC;AAAA,gBAAA;AAAA,cACxB;AAAA,YACF;AAAA,UAEJ;AAAA,UACA;AAAA,QACF;AAEe,uBAAA,QAAQ,CAAC,cAAc;AAChC,cAAA,YAAY,iBAAiB,SAAS;AAE1C,cAAI,CAAC,WAAW;AACd;AAAA,UAAA;AAGK,iBAAAG,aAAE,aAAa,SAAS,GAAG;AAChC,kBAAM,UAAU,YAAY,MAAM,WAAW,UAAU,IAAI;AAC3D,wBAAY,mCAAS,KAAK;AAAA,UAAA;AAI5B,cAAI,WAAW;AACT,gBAAAA,aAAE,sBAAsB,SAAS,GAAG;AAC1B,0BAAA;AAAA,gBACV;AAAA,gBACAA,aAAE,oBAAoB,SAAS;AAAA,kBAC7BA,aAAE;AAAA,oBACAA,aAAE,WAAW,SAAS;AAAA,oBACtBA,aAAE;AAAA,sBACA,UAAU,MAAM;AAAA;AAAA,sBAChB,UAAU;AAAA,sBACV,UAAU;AAAA,sBACV,UAAU;AAAA,sBACV,UAAU;AAAA,oBAAA;AAAA,kBACZ;AAAA,gBAEH,CAAA;AAAA,cACH;AAAA,YAAA,WAEAA,aAAE,qBAAqB,SAAS,KAChCA,aAAE,0BAA0B,SAAS,GACrC;AACY,0BAAA;AAAA,gBACV;AAAA,gBACAA,aAAE,oBAAoB,SAAS;AAAA,kBAC7BA,aAAE;AAAA,oBACAA,aAAE,WAAW,SAAS;AAAA,oBACtB;AAAA,kBAAA;AAAA,gBAEH,CAAA;AAAA,cACH;AAAA,YAAA,WAEAA,aAAE,kBAAkB,SAAS,KAC7BA,aAAE,yBAAyB,SAAS,GACpC;AACY,0BAAA;AAAA,gBACV;AAAA,gBACAA,aAAE,oBAAoB,SAAS;AAAA,kBAC7BA,aAAE;AAAA,oBACAA,aAAE,WAAW,SAAS;AAAA,oBACtB,UAAU;AAAA,kBAAA;AAAA,gBAEb,CAAA;AAAA,cACH;AAAA,YACS,WAAAA,aAAE,qBAAqB,SAAS,GAAG;AAChC,0BAAA;AAAA,gBACV;AAAA,gBACAA,aAAE,oBAAoB,SAAS;AAAA,kBAC7BA,aAAE,mBAAmBA,aAAE,WAAW,SAAS,GAAG,UAAU,IAAI;AAAA,gBAC7D,CAAA;AAAA,cACH;AAAA,YACS,WAAAA,aAAE,iBAAiB,SAAS,GAAG;AAClC,oBAAA,sBAAsB,SAAS,SAAS,EAAE;AAC1C,oBAAA,eAAe,MAAM,MAAM,mBAAmB;AAEpD,kBAAI,CAAC,cAAc;AACjB,sBAAM,IAAI;AAAA,kBACR,2CAA2C,SAAS,uBAAuB,UAAU,IAAI;AAAA,gBAC3F;AAAA,cAAA;AAGF,oBAAM,YAAY,aAAa,QAAQ,KAAK,CAAC;AAE7C,kBAAI,CAAC,WAAW;AACd,sBAAM,IAAI;AAAA,kBACR,2CAA2C,SAAS,uBAAuB,UAAU,IAAI;AAAA,gBAC3F;AAAA,cAAA;AAGE,kBAAAA,aAAE,sBAAsB,SAAS,GAAG;AACtC,sBAAM,aAAa,UAAU;AACjB,4BAAA;AAAA,kBACV;AAAA,kBACAA,aAAE,oBAAoB,SAAS;AAAA,oBAC7BA,aAAE,mBAAmBA,aAAE,WAAW,SAAS,GAAG,UAAU;AAAA,kBACzD,CAAA;AAAA,gBACH;AAAA,cAAA,OACK;AACL,sBAAM,IAAI;AAAA,kBACR,6CAA6C,SAAS,uBAAuB,UAAU,IAAI;AAAA,gBAC7F;AAAA,cAAA;AAAA,YACF,OACK;AACG,sBAAA,KAAK,8BAA8B,SAAS;AACpD,oBAAM,IAAI,MAAM,iCAAiC,UAAU,IAAI,EAAE;AAAA,YAAA;AAAA,UACnE;AAKF,sBAAY,KAAK,OAAO,YAAY,KAAK,KAAK,OAAO,CAAC,SAAS;AAC7D,mBAAO,SAAS;AAAA,UAAA,CACjB;AAGD,sBAAY,cAAc,QAAQ;AAAA,YAChCA,aAAE,uBAAuB,MAAM;AAAA,cAC7BA,aAAE;AAAA,gBACAA,aAAE,WAAW,SAAS;AAAA,gBACtBA,aAAE,WAAW,SAAS;AAAA,cAAA;AAAA,YAEzB,CAAA;AAAA,UAAA,CACF;AAAA,QAAA,CACF;AAGD,oBAAY,SAAS;AAAA,UACnB,uBAAuB,MAAM;AAKvB,gBAAA,KAAK,KAAK,aAAa;AACzB,kBAAIA,aAAE,sBAAsB,KAAK,KAAK,WAAW,GAAG;AAC7C,qBAAA;AAAA,kBACHA,aAAE;AAAA,oBACA,KAAK,KAAK,YAAY,aAAa;AAAA,sBAAI,CAAC,SACtCA,aAAE;AAAA,wBACAA,aAAE,WAAY,KAAK,GAAW,IAAI;AAAA,wBAClCA,aAAE,WAAY,KAAK,GAAW,IAAI;AAAA,sBAAA;AAAA,oBAEtC;AAAA,oBACAA,aAAE;AAAA,sBACA,KAAK,SAAS,MAAM,IAAID,UAAW,WAAA,EAAE,EAAE,CAAC;AAAA,oBAAA;AAAA,kBAC1C;AAAA,gBAEJ;AAAA,cAAA;AAAA,YACF;AAAA,UACF;AAAA,QACF,CACD;AAAA,MAAA;AAAA,IACH;AAAA,EACF,CACD;AAEG,MAAA,MAAe,SAAA,KAAK,EAAE;AACtB,MAAA,MAAe,SAAA,KAAK,gCAAgC;AACpD,MAAA,MAAe,SAAA,KAAK,SAASF,OAAK,EAAE,YAAY,MAAM,EAAE,IAAI;AAC5D,MAAA,MAAe,SAAA,KAAK,EAAE;AACtB,MAAA,MAAe,SAAA,KAAK,EAAE;AACtB,MAAA,MAAe,SAAA,KAAK,EAAE;AAE1BK,2BAAAA,oBAAoBL,KAAG;AAEnB,MAAA,MAAe,SAAA,KAAK,EAAE;AACtB,MAAA,MAAe,SAAA,KAAK,iCAAiC;AACrD,MAAA,MAAe,SAAA,KAAK,SAASA,OAAK,EAAE,YAAY,MAAM,EAAE,IAAI;AAC5D,MAAA,MAAe,SAAA,KAAK,EAAE;AACtB,MAAA,MAAe,SAAA,KAAK,EAAE;AACtB,MAAA,MAAe,SAAA,KAAK,EAAE;AAMtB,MAAA,oBAAoB,OAAO,GAAG;AAC1B,UAAA,OAAO,MAAM,KAAK,mBAAmB,EAAE,OAAO,CAAC,KAAK,UAAU;AAC3D,aAAA;AAAA,IAAO,KAAK;AACZ,aAAA;AAAA,OACN,EAAE;AAEC,UAAA,iBAAiB,uBAAuB,KAAK,SAAS,QAAQ,MAAME,UAAa,aAAA,EAAE,CAAC,kEAAkE,IAAI;AAAA;AAChK,YAAQ,KAAK,cAAc;AAGvB,QAAA,QAAQ,IAAI,aAAa,cAAc;AACzC,YAAM,kBAAkBE,oBAAS;AAAA,QAC/B,gBAAgB,KAAK,UAAU,cAAc,CAAC;AAAA,MAAA,EAC9C;AACEJ,YAAA,QAAQ,KAAK,QAAQ,eAAe;AAAA,IAAA;AAAA,EAC1C;AAGF,SAAO,SAASA,OAAK;AAAA,IACnB,YAAY;AAAA,IACZ,gBAAgB,KAAK;AAAA,EAAA,CACtB;AACH;AAEA,SAAS,uCACP,aACA,MAQA;AACA,MAAI,YAIO;AACX,MAAI,OAAsB;AAE1B,cAAY,SAAS;AAAA,IACnB,kBAAkB,YAAY;AACtB,YAAA,QAAQ,WAAW,KAAK,WAAW;AAAA,QACvC,CAAC,oBAAoB,gBAAgB,MAAM,SAAS;AAAA,MACtD;AACA,UAAI,OAAO;AACG,oBAAA;AACL,eAAA,WAAW,KAAK,OAAO;AAAA,MAAA;AAAA,IAChC;AAAA,EACF,CACD;AAEM,SAAA,EAAE,WAAW,KAAK;AAC3B;AAGA,SAAS,kBAAkB,MAAW,MAAW;AAC3C,MAAAG,aAAE,aAAa,IAAI,GAAG;AACxB,UAAM,UAAU,KAAK,MAAM,WAAW,KAAK,IAAI;AAC/C,QACE,SAEA;AACM,YAAA,aAAa,QAAQ,KAAK;AAChC,UAAIA,aAAE,mBAAmB,WAAW,IAAI,GAAG;AACzC,eAAO,WAAW;AAAA,MACT,WAAAA,aAAE,sBAAsB,WAAW,IAAI,GAAG;AACnD,eAAO,WAAW;AAAA,MAAA;AAAA,IACpB;AAEK,WAAA;AAAA,EAAA;AAGF,SAAA;AACT;AAEA,SAAS,wBAAwB,MAAW,MAAW;AACjD,MAAAA,aAAE,aAAa,IAAI,GAAG;AACxB,UAAM,UAAU,KAAK,MAAM,WAAW,KAAK,IAAI;AAC/C,QAAI,SAAS;AACX,cAAQ,KAAK,OAAO;AAAA,IAAA;AAAA,EACtB;AAEJ;AAEA,SAAS,UAAUH,MAAa,MAA6B;AAC3D,MAAI,QAAQ;AAEZ,QAAM,SAASA,MAAK;AAAA,IAClB,uBAAuB,MAAM;AACvB,UAAA,KAAK,KAAK,aAAa;AAEzB,YAAIG,aAAE,sBAAsB,KAAK,KAAK,WAAW,GAAG;AAClD,eAAK,KAAK,YAAY,aAAa,QAAQ,CAAC,SAAS;AAC/C,gBAAAA,aAAE,qBAAqB,IAAI,GAAG;AAChC,kBAAIA,aAAE,aAAa,KAAK,EAAE,GAAG;AAC3B,oBAAI,KAAK,GAAG,SAAS,KAAK,MAAM;AACtB,0BAAA;AAAA,gBAAA;AAAA,cACV;AAAA,YACF;AAAA,UACF,CACD;AAAA,QAAA;AAIH,YAAIA,aAAE,sBAAsB,KAAK,KAAK,WAAW,GAAG;AAClD,cAAIA,aAAE,aAAa,KAAK,KAAK,YAAY,EAAE,GAAG;AAC5C,gBAAI,KAAK,KAAK,YAAY,GAAG,SAAS,KAAK,MAAM;AACvC,sBAAA;AAAA,YAAA;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IAEJ;AAAA,IACA,yBAAyB,MAAM;AAC7B,UAAIA,aAAE,aAAa,KAAK,KAAK,WAAW,GAAG;AACzC,YAAI,KAAK,KAAK,YAAY,SAAS,KAAK,MAAM;AACpC,kBAAA;AAAA,QAAA;AAAA,MACV;AAAA,IACF;AAAA,EACF,CACD;AAEM,SAAA;AACT;AAEA,SAAS,cAAcH,MAAa,MAA6B;AAC/D,MAAI,UAAU;AAEd,QAAM,SAASA,MAAK;AAAA,IAClB,uBAAuB,MAAM;AACvB,UAAA,KAAK,KAAK,aAAa;AAEzB,YAAIG,aAAE,sBAAsB,KAAK,KAAK,WAAW,GAAG;AAClD,eAAK,KAAK,YAAY,aAAa,QAAQ,CAAC,SAAS;AAC/C,gBAAAA,aAAE,qBAAqB,IAAI,GAAG;AAChC,kBAAIA,aAAE,aAAa,KAAK,EAAE,GAAG;AAC3B,oBAAI,KAAK,GAAG,SAAS,KAAK,MAAM;AAC9B,uBAAK,OAAO;AACF,4BAAA;AAAA,gBAAA;AAAA,cACZ;AAAA,YACF;AAAA,UACF,CACD;AAAA,QAAA,WACQA,aAAE,sBAAsB,KAAK,KAAK,WAAW,GAAG;AACzD,cAAIA,aAAE,aAAa,KAAK,KAAK,YAAY,EAAE,GAAG;AAC5C,gBAAI,KAAK,KAAK,YAAY,GAAG,SAAS,KAAK,MAAM;AAC/C,mBAAK,OAAO;AACF,wBAAA;AAAA,YAAA;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IAEJ;AAAA,IACA,yBAAyB,MAAM;AAC7B,UAAIA,aAAE,aAAa,KAAK,KAAK,WAAW,GAAG;AACzC,YAAI,KAAK,KAAK,YAAY,SAAS,KAAK,MAAM;AAC5C,eAAK,OAAO;AACF,oBAAA;AAAA,QAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF,CACD;AAEM,SAAA;AACT;;;"}
@@ -163,7 +163,8 @@ function compileCodeSplitReferenceRoute(opts) {
163
163
  if (debug) console.info("");
164
164
  if (debug) console.info("");
165
165
  return generate(ast, {
166
- sourceMaps: true
166
+ sourceMaps: true,
167
+ sourceFileName: opts.filename
167
168
  });
168
169
  }
169
170
  const splitNodeTypes = ["component", "loader"];
@@ -346,7 +347,6 @@ function compileCodeSplitVirtualRoute(opts) {
346
347
  });
347
348
  if (debug) console.info("");
348
349
  if (debug) console.info("Dead Code Elimination Input 2:");
349
- console.log(JSON.stringify(ast, null, 2));
350
350
  if (debug) console.info(generate(ast, { sourceMaps: true }).code);
351
351
  if (debug) console.info("");
352
352
  if (debug) console.info("");
@@ -375,7 +375,8 @@ These should either have their export statements removed or be imported from ano
375
375
  }
376
376
  }
377
377
  return generate(ast, {
378
- sourceMaps: true
378
+ sourceMaps: true,
379
+ sourceFileName: opts.filename
379
380
  });
380
381
  }
381
382
  function getImportSpecifierAndPathFromLocalName(programPath, name) {
@@ -1 +1 @@
1
- {"version":3,"file":"compilers.js","sources":["../../../../src/core/code-splitter/compilers.ts"],"sourcesContent":["import * as t from '@babel/types'\nimport babel from '@babel/core'\nimport _generate from '@babel/generator'\nimport * as template from '@babel/template'\nimport { deadCodeElimination } from 'babel-dead-code-elimination'\n\nimport { splitPrefix } from '../constants'\nimport { parseAst } from './ast'\nimport type { ParseAstOptions } from './ast'\n\nconst debug = process.env.TSR_VITE_DEBUG\n\n// Babel is a CJS package and uses `default` as named binding (`exports.default =`).\n// https://github.com/babel/babel/issues/15269.\nlet generate = (_generate as any)['default'] as typeof _generate\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nif (!generate) {\n generate = _generate\n}\n\ntype SplitModulesById = Record<\n string,\n { id: string; node: t.FunctionExpression }\n>\n\ninterface State {\n filename: string\n opts: {\n minify: boolean\n root: string\n }\n imported: Record<string, boolean>\n refs: Set<any>\n serverIndex: number\n splitIndex: number\n splitModulesById: SplitModulesById\n}\n\nexport function compileCodeSplitReferenceRoute(opts: ParseAstOptions) {\n const ast = parseAst(opts)\n\n babel.traverse(ast, {\n Program: {\n enter(programPath, programState) {\n const state = programState as unknown as State\n\n const splitUrl = `${splitPrefix}:${opts.filename}?${splitPrefix}`\n\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 let existingCompImportPath: string | null = null\n let existingLoaderImportPath: string | null = null\n\n programPath.traverse(\n {\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 if (t.isCallExpression(path.parentPath.node)) {\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n let found = false\n\n const hasImportedOrDefinedIdentifier = (name: string) => {\n return programPath.scope.hasBinding(name)\n }\n\n if (t.isObjectExpression(options)) {\n options.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n if (t.isIdentifier(prop.key)) {\n if (prop.key.name === 'component') {\n const value = prop.value\n\n let shouldSplit = true\n\n if (t.isIdentifier(value)) {\n existingCompImportPath =\n getImportSpecifierAndPathFromLocalName(\n programPath,\n value.name,\n ).path\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 shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (shouldSplit) {\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\n if (\n !hasImportedOrDefinedIdentifier(\n 'lazyRouteComponent',\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `import { lazyRouteComponent } from '@tanstack/react-router'`,\n )(),\n ])\n }\n\n if (\n !hasImportedOrDefinedIdentifier(\n '$$splitComponentImporter',\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `const $$splitComponentImporter = () => import('${splitUrl}')`,\n )(),\n ])\n }\n\n prop.value = template.expression(\n `lazyRouteComponent($$splitComponentImporter, 'component', () => Route.ssr)`,\n )()\n\n programPath.pushContainer('body', [\n template.statement(\n `function DummyComponent() { return null }`,\n )(),\n ])\n\n found = true\n }\n } else if (prop.key.name === 'loader') {\n const value = prop.value\n\n let shouldSplit = true\n\n if (t.isIdentifier(value)) {\n existingLoaderImportPath =\n getImportSpecifierAndPathFromLocalName(\n programPath,\n value.name,\n ).path\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 shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (shouldSplit) {\n // Prepend the import statement to the program along with the importer function\n if (!hasImportedOrDefinedIdentifier('lazyFn')) {\n programPath.unshiftContainer('body', [\n template.smart(\n `import { lazyFn } from '@tanstack/react-router'`,\n )() as t.Statement,\n ])\n }\n\n if (\n !hasImportedOrDefinedIdentifier(\n '$$splitLoaderImporter',\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `const $$splitLoaderImporter = () => import('${splitUrl}')`,\n )(),\n ])\n }\n\n prop.value = template.expression(\n `lazyFn($$splitLoaderImporter, 'loader')`,\n )()\n\n found = true\n }\n }\n }\n }\n\n programPath.scope.crawl()\n })\n }\n\n if (found as boolean) {\n programPath.pushContainer('body', [\n template.statement(`function TSR_Dummy_Component() {}`)(),\n ])\n }\n }\n },\n },\n state,\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 (\n (existingCompImportPath as string | null) ||\n (existingLoaderImportPath as string | null)\n ) {\n programPath.traverse({\n ImportDeclaration(path) {\n if (path.node.specifiers.length > 0) return\n if (\n path.node.source.value === existingCompImportPath ||\n path.node.source.value === existingLoaderImportPath\n ) {\n path.remove()\n }\n },\n })\n }\n },\n },\n })\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Input 1:')\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\n\n deadCodeElimination(ast)\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Output 1:')\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\n\n return generate(ast, {\n sourceMaps: true,\n })\n}\n\nconst splitNodeTypes = ['component', 'loader'] as const\ntype SplitNodeType = (typeof splitNodeTypes)[number]\n\nexport function compileCodeSplitVirtualRoute(opts: ParseAstOptions) {\n const ast = parseAst(opts)\n\n const knownExportedIdents = new Set<string>()\n\n babel.traverse(ast, {\n Program: {\n enter(programPath, programState) {\n const state = programState as unknown as State\n\n const splitNodesByType: Record<SplitNodeType, t.Node | undefined> = {\n component: undefined,\n loader: undefined,\n }\n\n // Find the node\n programPath.traverse(\n {\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 if (t.isCallExpression(path.parentPath.node)) {\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n if (t.isObjectExpression(options)) {\n options.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n splitNodeTypes.forEach((splitType) => {\n if (\n !t.isIdentifier(prop.key) ||\n prop.key.name !== splitType\n ) {\n return\n }\n\n const value = prop.value\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 splitNodesByType[splitType] = prop.value\n }\n })\n }\n })\n\n // Remove all of the options\n options.properties = []\n }\n }\n },\n },\n state,\n )\n\n splitNodeTypes.forEach((splitType) => {\n let splitNode = splitNodesByType[splitType]\n\n if (!splitNode) {\n return\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 programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitType),\n t.functionExpression(\n splitNode.id || null, // Anonymize the function expression\n splitNode.params,\n splitNode.body,\n splitNode.generator,\n splitNode.async,\n ),\n ),\n ]),\n )\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(splitType),\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(splitType),\n splitNode.local,\n ),\n ]),\n )\n } else if (t.isVariableDeclarator(splitNode)) {\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(t.identifier(splitType), splitNode.init),\n ]),\n )\n } else if (t.isCallExpression(splitNode)) {\n const outputSplitNodeCode = generate(splitNode).code\n const splitNodeAst = babel.parse(outputSplitNodeCode)\n\n if (!splitNodeAst) {\n throw new Error(\n `Failed to parse the generated code for \"${splitType}\" 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 \"${splitType}\" 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(t.identifier(splitType), expression),\n ]),\n )\n } else {\n throw new Error(\n `Unexpected expression type encounter for \"${splitType}\" in the node type \"${splitNode.type}\"`,\n )\n }\n } else {\n console.info('Unexpected splitNode type:', splitNode)\n throw new Error(`Unexpected splitNode type ☝️: ${splitNode.type}`)\n }\n }\n\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 // Export the node\n programPath.pushContainer('body', [\n t.exportNamedDeclaration(null, [\n t.exportSpecifier(\n t.identifier(splitType),\n t.identifier(splitType),\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 path.replaceWith(\n t.importDeclaration(\n path.node.declaration.declarations.map((decl) =>\n t.importSpecifier(\n t.identifier((decl.id as any).name),\n t.identifier((decl.id as any).name),\n ),\n ),\n t.stringLiteral(\n opts.filename.split(`?${splitPrefix}`)[0] as string,\n ),\n ),\n )\n }\n }\n },\n })\n },\n },\n })\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Input 2:')\n console.log(JSON.stringify(ast, null, 2))\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\n\n deadCodeElimination(ast)\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Output 2:')\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\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 list = Array.from(knownExportedIdents).reduce((str, ident) => {\n str += `\\n- ${ident}`\n return str\n }, '')\n\n const warningMessage = `These exports from \"${opts.filename.replace('?' + splitPrefix, '')}\" are not being code-split and will increase your bundle size: ${list}\\nThese should either have their export statements removed or be imported from another file that is not a route.`\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 return generate(ast, {\n sourceMaps: true,\n })\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// Reusable function to get literal value or resolve variable to literal\nfunction resolveIdentifier(path: any, node: any) {\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: any, node: any) {\n if (t.isIdentifier(node)) {\n const binding = path.scope.getBinding(node.name)\n if (binding) {\n binding.path.remove()\n }\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 }\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 if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n found = true\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 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 path.remove()\n removed = true\n }\n }\n }\n })\n } else if (t.isFunctionDeclaration(path.node.declaration)) {\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 if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n path.remove()\n removed = true\n }\n }\n },\n })\n\n return removed\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compilers.js","sources":["../../../../src/core/code-splitter/compilers.ts"],"sourcesContent":["import * as t from '@babel/types'\nimport babel from '@babel/core'\nimport _generate from '@babel/generator'\nimport * as template from '@babel/template'\nimport { deadCodeElimination } from 'babel-dead-code-elimination'\n\nimport { splitPrefix } from '../constants'\nimport { parseAst } from './ast'\nimport type { ParseAstOptions } from './ast'\n\nconst debug = process.env.TSR_VITE_DEBUG\n\n// Babel is a CJS package and uses `default` as named binding (`exports.default =`).\n// https://github.com/babel/babel/issues/15269.\nlet generate = (_generate as any)['default'] as typeof _generate\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nif (!generate) {\n generate = _generate\n}\n\ntype SplitModulesById = Record<\n string,\n { id: string; node: t.FunctionExpression }\n>\n\ninterface State {\n filename: string\n opts: {\n minify: boolean\n root: string\n }\n imported: Record<string, boolean>\n refs: Set<any>\n serverIndex: number\n splitIndex: number\n splitModulesById: SplitModulesById\n}\n\nexport function compileCodeSplitReferenceRoute(opts: ParseAstOptions) {\n const ast = parseAst(opts)\n\n babel.traverse(ast, {\n Program: {\n enter(programPath, programState) {\n const state = programState as unknown as State\n\n const splitUrl = `${splitPrefix}:${opts.filename}?${splitPrefix}`\n\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 let existingCompImportPath: string | null = null\n let existingLoaderImportPath: string | null = null\n\n programPath.traverse(\n {\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 if (t.isCallExpression(path.parentPath.node)) {\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n let found = false\n\n const hasImportedOrDefinedIdentifier = (name: string) => {\n return programPath.scope.hasBinding(name)\n }\n\n if (t.isObjectExpression(options)) {\n options.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n if (t.isIdentifier(prop.key)) {\n if (prop.key.name === 'component') {\n const value = prop.value\n\n let shouldSplit = true\n\n if (t.isIdentifier(value)) {\n existingCompImportPath =\n getImportSpecifierAndPathFromLocalName(\n programPath,\n value.name,\n ).path\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 shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (shouldSplit) {\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\n if (\n !hasImportedOrDefinedIdentifier(\n 'lazyRouteComponent',\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `import { lazyRouteComponent } from '@tanstack/react-router'`,\n )(),\n ])\n }\n\n if (\n !hasImportedOrDefinedIdentifier(\n '$$splitComponentImporter',\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `const $$splitComponentImporter = () => import('${splitUrl}')`,\n )(),\n ])\n }\n\n prop.value = template.expression(\n `lazyRouteComponent($$splitComponentImporter, 'component', () => Route.ssr)`,\n )()\n\n programPath.pushContainer('body', [\n template.statement(\n `function DummyComponent() { return null }`,\n )(),\n ])\n\n found = true\n }\n } else if (prop.key.name === 'loader') {\n const value = prop.value\n\n let shouldSplit = true\n\n if (t.isIdentifier(value)) {\n existingLoaderImportPath =\n getImportSpecifierAndPathFromLocalName(\n programPath,\n value.name,\n ).path\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 shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (shouldSplit) {\n // Prepend the import statement to the program along with the importer function\n if (!hasImportedOrDefinedIdentifier('lazyFn')) {\n programPath.unshiftContainer('body', [\n template.smart(\n `import { lazyFn } from '@tanstack/react-router'`,\n )() as t.Statement,\n ])\n }\n\n if (\n !hasImportedOrDefinedIdentifier(\n '$$splitLoaderImporter',\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `const $$splitLoaderImporter = () => import('${splitUrl}')`,\n )(),\n ])\n }\n\n prop.value = template.expression(\n `lazyFn($$splitLoaderImporter, 'loader')`,\n )()\n\n found = true\n }\n }\n }\n }\n\n programPath.scope.crawl()\n })\n }\n\n if (found as boolean) {\n programPath.pushContainer('body', [\n template.statement(`function TSR_Dummy_Component() {}`)(),\n ])\n }\n }\n },\n },\n state,\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 (\n (existingCompImportPath as string | null) ||\n (existingLoaderImportPath as string | null)\n ) {\n programPath.traverse({\n ImportDeclaration(path) {\n if (path.node.specifiers.length > 0) return\n if (\n path.node.source.value === existingCompImportPath ||\n path.node.source.value === existingLoaderImportPath\n ) {\n path.remove()\n }\n },\n })\n }\n },\n },\n })\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Input 1:')\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\n\n deadCodeElimination(ast)\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Output 1:')\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\n\n return generate(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n })\n}\n\nconst splitNodeTypes = ['component', 'loader'] as const\ntype SplitNodeType = (typeof splitNodeTypes)[number]\n\nexport function compileCodeSplitVirtualRoute(opts: ParseAstOptions) {\n const ast = parseAst(opts)\n\n const knownExportedIdents = new Set<string>()\n\n babel.traverse(ast, {\n Program: {\n enter(programPath, programState) {\n const state = programState as unknown as State\n\n const splitNodesByType: Record<SplitNodeType, t.Node | undefined> = {\n component: undefined,\n loader: undefined,\n }\n\n // Find the node\n programPath.traverse(\n {\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 if (t.isCallExpression(path.parentPath.node)) {\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n if (t.isObjectExpression(options)) {\n options.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n splitNodeTypes.forEach((splitType) => {\n if (\n !t.isIdentifier(prop.key) ||\n prop.key.name !== splitType\n ) {\n return\n }\n\n const value = prop.value\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 splitNodesByType[splitType] = prop.value\n }\n })\n }\n })\n\n // Remove all of the options\n options.properties = []\n }\n }\n },\n },\n state,\n )\n\n splitNodeTypes.forEach((splitType) => {\n let splitNode = splitNodesByType[splitType]\n\n if (!splitNode) {\n return\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 programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitType),\n t.functionExpression(\n splitNode.id || null, // Anonymize the function expression\n splitNode.params,\n splitNode.body,\n splitNode.generator,\n splitNode.async,\n ),\n ),\n ]),\n )\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(splitType),\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(splitType),\n splitNode.local,\n ),\n ]),\n )\n } else if (t.isVariableDeclarator(splitNode)) {\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(t.identifier(splitType), splitNode.init),\n ]),\n )\n } else if (t.isCallExpression(splitNode)) {\n const outputSplitNodeCode = generate(splitNode).code\n const splitNodeAst = babel.parse(outputSplitNodeCode)\n\n if (!splitNodeAst) {\n throw new Error(\n `Failed to parse the generated code for \"${splitType}\" 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 \"${splitType}\" 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(t.identifier(splitType), expression),\n ]),\n )\n } else {\n throw new Error(\n `Unexpected expression type encounter for \"${splitType}\" in the node type \"${splitNode.type}\"`,\n )\n }\n } else {\n console.info('Unexpected splitNode type:', splitNode)\n throw new Error(`Unexpected splitNode type ☝️: ${splitNode.type}`)\n }\n }\n\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 // Export the node\n programPath.pushContainer('body', [\n t.exportNamedDeclaration(null, [\n t.exportSpecifier(\n t.identifier(splitType),\n t.identifier(splitType),\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 path.replaceWith(\n t.importDeclaration(\n path.node.declaration.declarations.map((decl) =>\n t.importSpecifier(\n t.identifier((decl.id as any).name),\n t.identifier((decl.id as any).name),\n ),\n ),\n t.stringLiteral(\n opts.filename.split(`?${splitPrefix}`)[0] as string,\n ),\n ),\n )\n }\n }\n },\n })\n },\n },\n })\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Input 2:')\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\n\n deadCodeElimination(ast)\n\n if (debug) console.info('')\n if (debug) console.info('Dead Code Elimination Output 2:')\n if (debug) console.info(generate(ast, { sourceMaps: true }).code)\n if (debug) console.info('')\n if (debug) console.info('')\n if (debug) console.info('')\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 list = Array.from(knownExportedIdents).reduce((str, ident) => {\n str += `\\n- ${ident}`\n return str\n }, '')\n\n const warningMessage = `These exports from \"${opts.filename.replace('?' + splitPrefix, '')}\" are not being code-split and will increase your bundle size: ${list}\\nThese should either have their export statements removed or be imported from another file that is not a route.`\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 return generate(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n })\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// Reusable function to get literal value or resolve variable to literal\nfunction resolveIdentifier(path: any, node: any) {\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: any, node: any) {\n if (t.isIdentifier(node)) {\n const binding = path.scope.getBinding(node.name)\n if (binding) {\n binding.path.remove()\n }\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 }\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 if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n found = true\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 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 path.remove()\n removed = true\n }\n }\n }\n })\n } else if (t.isFunctionDeclaration(path.node.declaration)) {\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 if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n path.remove()\n removed = true\n }\n }\n },\n })\n\n return removed\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/router-plugin",
3
- "version": "1.87.10",
3
+ "version": "1.87.13",
4
4
  "description": "Modern and scalable routing for React applications",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -269,6 +269,7 @@ export function compileCodeSplitReferenceRoute(opts: ParseAstOptions) {
269
269
 
270
270
  return generate(ast, {
271
271
  sourceMaps: true,
272
+ sourceFileName: opts.filename,
272
273
  })
273
274
  }
274
275
 
@@ -503,7 +504,6 @@ export function compileCodeSplitVirtualRoute(opts: ParseAstOptions) {
503
504
 
504
505
  if (debug) console.info('')
505
506
  if (debug) console.info('Dead Code Elimination Input 2:')
506
- console.log(JSON.stringify(ast, null, 2))
507
507
  if (debug) console.info(generate(ast, { sourceMaps: true }).code)
508
508
  if (debug) console.info('')
509
509
  if (debug) console.info('')
@@ -542,6 +542,7 @@ export function compileCodeSplitVirtualRoute(opts: ParseAstOptions) {
542
542
 
543
543
  return generate(ast, {
544
544
  sourceMaps: true,
545
+ sourceFileName: opts.filename,
545
546
  })
546
547
  }
547
548