@tanstack/router-plugin 1.159.9 → 1.159.11

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.
@@ -430,6 +430,10 @@ function compileCodeSplitVirtualRoute(opts) {
430
430
  }
431
431
  let splitNode = splitKey.node;
432
432
  const splitMeta = { ...splitKey.meta, shouldRemoveNode: true };
433
+ let originalIdentName;
434
+ if (t__namespace.isIdentifier(splitNode)) {
435
+ originalIdentName = splitNode.name;
436
+ }
433
437
  while (t__namespace.isIdentifier(splitNode)) {
434
438
  const binding = programPath.scope.getBinding(splitNode.name);
435
439
  splitNode = binding?.path.node;
@@ -467,6 +471,11 @@ function compileCodeSplitVirtualRoute(opts) {
467
471
  if (t__namespace.isIdentifier(splitNode.id)) {
468
472
  splitMeta.localExporterIdent = splitNode.id.name;
469
473
  splitMeta.shouldRemoveNode = false;
474
+ } else if (t__namespace.isObjectPattern(splitNode.id)) {
475
+ if (originalIdentName) {
476
+ splitMeta.localExporterIdent = originalIdentName;
477
+ }
478
+ splitMeta.shouldRemoveNode = false;
470
479
  } else {
471
480
  throw new Error(
472
481
  `Unexpected splitNode type ☝️: ${splitNode.type}`
@@ -552,13 +561,41 @@ function compileCodeSplitVirtualRoute(opts) {
552
561
  ExportNamedDeclaration(path) {
553
562
  if (path.node.declaration) {
554
563
  if (t__namespace.isVariableDeclaration(path.node.declaration)) {
564
+ const specifiers = path.node.declaration.declarations.flatMap(
565
+ (decl) => {
566
+ if (t__namespace.isIdentifier(decl.id)) {
567
+ return [
568
+ t__namespace.importSpecifier(
569
+ t__namespace.identifier(decl.id.name),
570
+ t__namespace.identifier(decl.id.name)
571
+ )
572
+ ];
573
+ }
574
+ if (t__namespace.isObjectPattern(decl.id)) {
575
+ return collectIdentifiersFromPattern(decl.id).map(
576
+ (name) => t__namespace.importSpecifier(
577
+ t__namespace.identifier(name),
578
+ t__namespace.identifier(name)
579
+ )
580
+ );
581
+ }
582
+ if (t__namespace.isArrayPattern(decl.id)) {
583
+ return collectIdentifiersFromPattern(decl.id).map(
584
+ (name) => t__namespace.importSpecifier(
585
+ t__namespace.identifier(name),
586
+ t__namespace.identifier(name)
587
+ )
588
+ );
589
+ }
590
+ return [];
591
+ }
592
+ );
593
+ if (specifiers.length === 0) {
594
+ path.remove();
595
+ return;
596
+ }
555
597
  const importDecl = t__namespace.importDeclaration(
556
- path.node.declaration.declarations.map(
557
- (decl) => t__namespace.importSpecifier(
558
- t__namespace.identifier(decl.id.name),
559
- t__namespace.identifier(decl.id.name)
560
- )
561
- ),
598
+ specifiers,
562
599
  t__namespace.stringLiteral(
563
600
  removeSplitSearchParamFromFilename(opts.filename)
564
601
  )
@@ -678,6 +715,37 @@ function getImportSpecifierAndPathFromLocalName(programPath, name) {
678
715
  });
679
716
  return { specifier, path };
680
717
  }
718
+ function collectIdentifiersFromPattern(node) {
719
+ if (!node) {
720
+ return [];
721
+ }
722
+ if (t__namespace.isIdentifier(node)) {
723
+ return [node.name];
724
+ }
725
+ if (t__namespace.isAssignmentPattern(node)) {
726
+ return collectIdentifiersFromPattern(node.left);
727
+ }
728
+ if (t__namespace.isRestElement(node)) {
729
+ return collectIdentifiersFromPattern(node.argument);
730
+ }
731
+ if (t__namespace.isObjectPattern(node)) {
732
+ return node.properties.flatMap((prop) => {
733
+ if (t__namespace.isObjectProperty(prop)) {
734
+ return collectIdentifiersFromPattern(prop.value);
735
+ }
736
+ if (t__namespace.isRestElement(prop)) {
737
+ return collectIdentifiersFromPattern(prop.argument);
738
+ }
739
+ return [];
740
+ });
741
+ }
742
+ if (t__namespace.isArrayPattern(node)) {
743
+ return node.elements.flatMap(
744
+ (element) => collectIdentifiersFromPattern(element)
745
+ );
746
+ }
747
+ return [];
748
+ }
681
749
  function resolveIdentifier(path, node) {
682
750
  if (t__namespace.isIdentifier(node)) {
683
751
  const binding = path.scope.getBinding(node.name);
@@ -696,6 +764,25 @@ function resolveIdentifier(path, node) {
696
764
  function removeIdentifierLiteral(path, node) {
697
765
  const binding = path.scope.getBinding(node.name);
698
766
  if (binding) {
767
+ if (t__namespace.isVariableDeclarator(binding.path.node) && t__namespace.isObjectPattern(binding.path.node.id)) {
768
+ const objectPattern = binding.path.node.id;
769
+ objectPattern.properties = objectPattern.properties.filter((prop) => {
770
+ if (!t__namespace.isObjectProperty(prop)) {
771
+ return true;
772
+ }
773
+ if (t__namespace.isIdentifier(prop.value) && prop.value.name === node.name) {
774
+ return false;
775
+ }
776
+ if (t__namespace.isAssignmentPattern(prop.value) && t__namespace.isIdentifier(prop.value.left) && prop.value.left.name === node.name) {
777
+ return false;
778
+ }
779
+ return true;
780
+ });
781
+ if (objectPattern.properties.length === 0) {
782
+ binding.path.remove();
783
+ }
784
+ return;
785
+ }
699
786
  binding.path.remove();
700
787
  }
701
788
  }
@@ -711,6 +798,11 @@ function hasExport(ast, node) {
711
798
  if (decl.id.name === node.name) {
712
799
  found = true;
713
800
  }
801
+ } else if (t__namespace.isObjectPattern(decl.id) || t__namespace.isArrayPattern(decl.id)) {
802
+ const names = collectIdentifiersFromPattern(decl.id);
803
+ if (names.includes(node.name)) {
804
+ found = true;
805
+ }
714
806
  }
715
807
  }
716
808
  });
@@ -754,6 +846,12 @@ function removeExports(ast, node) {
754
846
  path.remove();
755
847
  removed = true;
756
848
  }
849
+ } else if (t__namespace.isObjectPattern(decl.id) || t__namespace.isArrayPattern(decl.id)) {
850
+ const names = collectIdentifiersFromPattern(decl.id);
851
+ if (names.includes(node.name)) {
852
+ path.remove();
853
+ removed = true;
854
+ }
757
855
  }
758
856
  }
759
857
  });
@@ -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 * as template from '@babel/template'\nimport {\n deadCodeElimination,\n findReferencedIdentifiers,\n generateFromAst,\n parseAst,\n} from '@tanstack/router-utils'\nimport { tsrSplit } from '../constants'\nimport { routeHmrStatement } from '../route-hmr-statement'\nimport { createIdentifier } from './path-ids'\nimport { getFrameworkOptions } from './framework-options'\nimport type { GeneratorResult, ParseAstOptions } from '@tanstack/router-utils'\nimport type { CodeSplitGroupings, SplitRouteIdentNodes } from '../constants'\nimport type { Config, DeletableNodes } from '../config'\n\ntype SplitNodeMeta = {\n routeIdent: SplitRouteIdentNodes\n splitStrategy: 'lazyFn' | 'lazyRouteComponent'\n localImporterIdent: string\n exporterIdent: string\n localExporterIdent: string\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\nconst splittableCreateRouteFns = ['createFileRoute']\nconst unsplittableCreateRouteFns = [\n 'createRootRoute',\n 'createRootRouteWithContext',\n]\nconst allCreateRouteFns = [\n ...splittableCreateRouteFns,\n ...unsplittableCreateRouteFns,\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 },\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 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 if (t.isIdentifier(prop.key)) {\n if (opts.deleteNodes!.has(prop.key.name as any)) {\n modified = true\n return false\n }\n }\n }\n return true\n },\n )\n }\n if (!splittableCreateRouteFns.includes(createRouteFn)) {\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 if (t.isIdentifier(prop.key)) {\n const key = prop.key.name\n\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 prop.value = template.expression(\n `${LAZY_ROUTE_COMPONENT_IDENT}(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`,\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 },\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 return generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\n}\n\nexport function compileCodeSplitVirtualRoute(\n opts: ParseAstOptions & {\n splitTargets: Array<SplitRouteIdentNodes>\n filename: string\n },\n): GeneratorResult {\n const ast = parseAst(opts)\n const refIdents = findReferencedIdentifiers(ast)\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 (\n !t.isIdentifier(prop.key) ||\n prop.key.name !== splitType\n ) {\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 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 {\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 importDecl = 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 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 },\n })\n\n deadCodeElimination(ast, refIdents)\n\n return generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\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 if (t.isIdentifier(prop.key)) {\n if (prop.key.name === '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\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// 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 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 }\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 }\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"],"names":["tsrSplit","createIdentifier","parseAst","findReferencedIdentifiers","frameworkOptions","getFrameworkOptions","t","routeHmrStatement","template","deadCodeElimination","generateFromAst"],"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 * as template from '@babel/template'\nimport {\n deadCodeElimination,\n findReferencedIdentifiers,\n generateFromAst,\n parseAst,\n} from '@tanstack/router-utils'\nimport { tsrSplit } from '../constants'\nimport { routeHmrStatement } from '../route-hmr-statement'\nimport { createIdentifier } from './path-ids'\nimport { getFrameworkOptions } from './framework-options'\nimport type { GeneratorResult, ParseAstOptions } from '@tanstack/router-utils'\nimport type { CodeSplitGroupings, SplitRouteIdentNodes } from '../constants'\nimport type { Config, DeletableNodes } from '../config'\n\ntype SplitNodeMeta = {\n routeIdent: SplitRouteIdentNodes\n splitStrategy: 'lazyFn' | 'lazyRouteComponent'\n localImporterIdent: string\n exporterIdent: string\n localExporterIdent: string\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\nconst splittableCreateRouteFns = ['createFileRoute']\nconst unsplittableCreateRouteFns = [\n 'createRootRoute',\n 'createRootRouteWithContext',\n]\nconst allCreateRouteFns = [\n ...splittableCreateRouteFns,\n ...unsplittableCreateRouteFns,\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 },\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 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 if (t.isIdentifier(prop.key)) {\n if (opts.deleteNodes!.has(prop.key.name as any)) {\n modified = true\n return false\n }\n }\n }\n return true\n },\n )\n }\n if (!splittableCreateRouteFns.includes(createRouteFn)) {\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 if (t.isIdentifier(prop.key)) {\n const key = prop.key.name\n\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 prop.value = template.expression(\n `${LAZY_ROUTE_COMPONENT_IDENT}(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`,\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 },\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 return generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\n}\n\nexport function compileCodeSplitVirtualRoute(\n opts: ParseAstOptions & {\n splitTargets: Array<SplitRouteIdentNodes>\n filename: string\n },\n): GeneratorResult {\n const ast = parseAst(opts)\n const refIdents = findReferencedIdentifiers(ast)\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 (\n !t.isIdentifier(prop.key) ||\n prop.key.name !== splitType\n ) {\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 },\n })\n\n deadCodeElimination(ast, refIdents)\n\n return generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\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 if (t.isIdentifier(prop.key)) {\n if (prop.key.name === '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\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"],"names":["tsrSplit","createIdentifier","parseAst","findReferencedIdentifiers","frameworkOptions","getFrameworkOptions","t","routeHmrStatement","template","deadCodeElimination","generateFromAst"],"mappings":"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"}
@@ -410,6 +410,10 @@ function compileCodeSplitVirtualRoute(opts) {
410
410
  }
411
411
  let splitNode = splitKey.node;
412
412
  const splitMeta = { ...splitKey.meta, shouldRemoveNode: true };
413
+ let originalIdentName;
414
+ if (t.isIdentifier(splitNode)) {
415
+ originalIdentName = splitNode.name;
416
+ }
413
417
  while (t.isIdentifier(splitNode)) {
414
418
  const binding = programPath.scope.getBinding(splitNode.name);
415
419
  splitNode = binding?.path.node;
@@ -447,6 +451,11 @@ function compileCodeSplitVirtualRoute(opts) {
447
451
  if (t.isIdentifier(splitNode.id)) {
448
452
  splitMeta.localExporterIdent = splitNode.id.name;
449
453
  splitMeta.shouldRemoveNode = false;
454
+ } else if (t.isObjectPattern(splitNode.id)) {
455
+ if (originalIdentName) {
456
+ splitMeta.localExporterIdent = originalIdentName;
457
+ }
458
+ splitMeta.shouldRemoveNode = false;
450
459
  } else {
451
460
  throw new Error(
452
461
  `Unexpected splitNode type ☝️: ${splitNode.type}`
@@ -532,13 +541,41 @@ function compileCodeSplitVirtualRoute(opts) {
532
541
  ExportNamedDeclaration(path) {
533
542
  if (path.node.declaration) {
534
543
  if (t.isVariableDeclaration(path.node.declaration)) {
544
+ const specifiers = path.node.declaration.declarations.flatMap(
545
+ (decl) => {
546
+ if (t.isIdentifier(decl.id)) {
547
+ return [
548
+ t.importSpecifier(
549
+ t.identifier(decl.id.name),
550
+ t.identifier(decl.id.name)
551
+ )
552
+ ];
553
+ }
554
+ if (t.isObjectPattern(decl.id)) {
555
+ return collectIdentifiersFromPattern(decl.id).map(
556
+ (name) => t.importSpecifier(
557
+ t.identifier(name),
558
+ t.identifier(name)
559
+ )
560
+ );
561
+ }
562
+ if (t.isArrayPattern(decl.id)) {
563
+ return collectIdentifiersFromPattern(decl.id).map(
564
+ (name) => t.importSpecifier(
565
+ t.identifier(name),
566
+ t.identifier(name)
567
+ )
568
+ );
569
+ }
570
+ return [];
571
+ }
572
+ );
573
+ if (specifiers.length === 0) {
574
+ path.remove();
575
+ return;
576
+ }
535
577
  const importDecl = t.importDeclaration(
536
- path.node.declaration.declarations.map(
537
- (decl) => t.importSpecifier(
538
- t.identifier(decl.id.name),
539
- t.identifier(decl.id.name)
540
- )
541
- ),
578
+ specifiers,
542
579
  t.stringLiteral(
543
580
  removeSplitSearchParamFromFilename(opts.filename)
544
581
  )
@@ -658,6 +695,37 @@ function getImportSpecifierAndPathFromLocalName(programPath, name) {
658
695
  });
659
696
  return { specifier, path };
660
697
  }
698
+ function collectIdentifiersFromPattern(node) {
699
+ if (!node) {
700
+ return [];
701
+ }
702
+ if (t.isIdentifier(node)) {
703
+ return [node.name];
704
+ }
705
+ if (t.isAssignmentPattern(node)) {
706
+ return collectIdentifiersFromPattern(node.left);
707
+ }
708
+ if (t.isRestElement(node)) {
709
+ return collectIdentifiersFromPattern(node.argument);
710
+ }
711
+ if (t.isObjectPattern(node)) {
712
+ return node.properties.flatMap((prop) => {
713
+ if (t.isObjectProperty(prop)) {
714
+ return collectIdentifiersFromPattern(prop.value);
715
+ }
716
+ if (t.isRestElement(prop)) {
717
+ return collectIdentifiersFromPattern(prop.argument);
718
+ }
719
+ return [];
720
+ });
721
+ }
722
+ if (t.isArrayPattern(node)) {
723
+ return node.elements.flatMap(
724
+ (element) => collectIdentifiersFromPattern(element)
725
+ );
726
+ }
727
+ return [];
728
+ }
661
729
  function resolveIdentifier(path, node) {
662
730
  if (t.isIdentifier(node)) {
663
731
  const binding = path.scope.getBinding(node.name);
@@ -676,6 +744,25 @@ function resolveIdentifier(path, node) {
676
744
  function removeIdentifierLiteral(path, node) {
677
745
  const binding = path.scope.getBinding(node.name);
678
746
  if (binding) {
747
+ if (t.isVariableDeclarator(binding.path.node) && t.isObjectPattern(binding.path.node.id)) {
748
+ const objectPattern = binding.path.node.id;
749
+ objectPattern.properties = objectPattern.properties.filter((prop) => {
750
+ if (!t.isObjectProperty(prop)) {
751
+ return true;
752
+ }
753
+ if (t.isIdentifier(prop.value) && prop.value.name === node.name) {
754
+ return false;
755
+ }
756
+ if (t.isAssignmentPattern(prop.value) && t.isIdentifier(prop.value.left) && prop.value.left.name === node.name) {
757
+ return false;
758
+ }
759
+ return true;
760
+ });
761
+ if (objectPattern.properties.length === 0) {
762
+ binding.path.remove();
763
+ }
764
+ return;
765
+ }
679
766
  binding.path.remove();
680
767
  }
681
768
  }
@@ -691,6 +778,11 @@ function hasExport(ast, node) {
691
778
  if (decl.id.name === node.name) {
692
779
  found = true;
693
780
  }
781
+ } else if (t.isObjectPattern(decl.id) || t.isArrayPattern(decl.id)) {
782
+ const names = collectIdentifiersFromPattern(decl.id);
783
+ if (names.includes(node.name)) {
784
+ found = true;
785
+ }
694
786
  }
695
787
  }
696
788
  });
@@ -734,6 +826,12 @@ function removeExports(ast, node) {
734
826
  path.remove();
735
827
  removed = true;
736
828
  }
829
+ } else if (t.isObjectPattern(decl.id) || t.isArrayPattern(decl.id)) {
830
+ const names = collectIdentifiersFromPattern(decl.id);
831
+ if (names.includes(node.name)) {
832
+ path.remove();
833
+ removed = true;
834
+ }
737
835
  }
738
836
  }
739
837
  });
@@ -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 * as template from '@babel/template'\nimport {\n deadCodeElimination,\n findReferencedIdentifiers,\n generateFromAst,\n parseAst,\n} from '@tanstack/router-utils'\nimport { tsrSplit } from '../constants'\nimport { routeHmrStatement } from '../route-hmr-statement'\nimport { createIdentifier } from './path-ids'\nimport { getFrameworkOptions } from './framework-options'\nimport type { GeneratorResult, ParseAstOptions } from '@tanstack/router-utils'\nimport type { CodeSplitGroupings, SplitRouteIdentNodes } from '../constants'\nimport type { Config, DeletableNodes } from '../config'\n\ntype SplitNodeMeta = {\n routeIdent: SplitRouteIdentNodes\n splitStrategy: 'lazyFn' | 'lazyRouteComponent'\n localImporterIdent: string\n exporterIdent: string\n localExporterIdent: string\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\nconst splittableCreateRouteFns = ['createFileRoute']\nconst unsplittableCreateRouteFns = [\n 'createRootRoute',\n 'createRootRouteWithContext',\n]\nconst allCreateRouteFns = [\n ...splittableCreateRouteFns,\n ...unsplittableCreateRouteFns,\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 },\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 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 if (t.isIdentifier(prop.key)) {\n if (opts.deleteNodes!.has(prop.key.name as any)) {\n modified = true\n return false\n }\n }\n }\n return true\n },\n )\n }\n if (!splittableCreateRouteFns.includes(createRouteFn)) {\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 if (t.isIdentifier(prop.key)) {\n const key = prop.key.name\n\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 prop.value = template.expression(\n `${LAZY_ROUTE_COMPONENT_IDENT}(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`,\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 },\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 return generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\n}\n\nexport function compileCodeSplitVirtualRoute(\n opts: ParseAstOptions & {\n splitTargets: Array<SplitRouteIdentNodes>\n filename: string\n },\n): GeneratorResult {\n const ast = parseAst(opts)\n const refIdents = findReferencedIdentifiers(ast)\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 (\n !t.isIdentifier(prop.key) ||\n prop.key.name !== splitType\n ) {\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 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 {\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 importDecl = 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 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 },\n })\n\n deadCodeElimination(ast, refIdents)\n\n return generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\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 if (t.isIdentifier(prop.key)) {\n if (prop.key.name === '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\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// 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 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 }\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 }\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"],"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 * as template from '@babel/template'\nimport {\n deadCodeElimination,\n findReferencedIdentifiers,\n generateFromAst,\n parseAst,\n} from '@tanstack/router-utils'\nimport { tsrSplit } from '../constants'\nimport { routeHmrStatement } from '../route-hmr-statement'\nimport { createIdentifier } from './path-ids'\nimport { getFrameworkOptions } from './framework-options'\nimport type { GeneratorResult, ParseAstOptions } from '@tanstack/router-utils'\nimport type { CodeSplitGroupings, SplitRouteIdentNodes } from '../constants'\nimport type { Config, DeletableNodes } from '../config'\n\ntype SplitNodeMeta = {\n routeIdent: SplitRouteIdentNodes\n splitStrategy: 'lazyFn' | 'lazyRouteComponent'\n localImporterIdent: string\n exporterIdent: string\n localExporterIdent: string\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\nconst splittableCreateRouteFns = ['createFileRoute']\nconst unsplittableCreateRouteFns = [\n 'createRootRoute',\n 'createRootRouteWithContext',\n]\nconst allCreateRouteFns = [\n ...splittableCreateRouteFns,\n ...unsplittableCreateRouteFns,\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 },\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 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 if (t.isIdentifier(prop.key)) {\n if (opts.deleteNodes!.has(prop.key.name as any)) {\n modified = true\n return false\n }\n }\n }\n return true\n },\n )\n }\n if (!splittableCreateRouteFns.includes(createRouteFn)) {\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 if (t.isIdentifier(prop.key)) {\n const key = prop.key.name\n\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 prop.value = template.expression(\n `${LAZY_ROUTE_COMPONENT_IDENT}(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`,\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 },\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 return generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\n}\n\nexport function compileCodeSplitVirtualRoute(\n opts: ParseAstOptions & {\n splitTargets: Array<SplitRouteIdentNodes>\n filename: string\n },\n): GeneratorResult {\n const ast = parseAst(opts)\n const refIdents = findReferencedIdentifiers(ast)\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 (\n !t.isIdentifier(prop.key) ||\n prop.key.name !== splitType\n ) {\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 },\n })\n\n deadCodeElimination(ast, refIdents)\n\n return generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\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 if (t.isIdentifier(prop.key)) {\n if (prop.key.name === '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\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"],"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.159.9",
3
+ "version": "1.159.11",
4
4
  "description": "Modern and scalable routing for React applications",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -96,9 +96,9 @@
96
96
  "chokidar": "^3.6.0",
97
97
  "unplugin": "^2.1.2",
98
98
  "zod": "^3.24.2",
99
- "@tanstack/router-utils": "1.158.0",
100
99
  "@tanstack/router-core": "1.159.9",
101
100
  "@tanstack/virtual-file-routes": "1.154.7",
101
+ "@tanstack/router-utils": "1.158.0",
102
102
  "@tanstack/router-generator": "1.159.9"
103
103
  },
104
104
  "devDependencies": {
@@ -111,7 +111,7 @@
111
111
  "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0",
112
112
  "vite-plugin-solid": "^2.11.10",
113
113
  "webpack": ">=5.92.0",
114
- "@tanstack/react-router": "^1.159.9"
114
+ "@tanstack/react-router": "^1.159.10"
115
115
  },
116
116
  "peerDependenciesMeta": {
117
117
  "@rsbuild/core": {
@@ -583,6 +583,14 @@ export function compileCodeSplitVirtualRoute(
583
583
  let splitNode = splitKey.node
584
584
  const splitMeta = { ...splitKey.meta, shouldRemoveNode: true }
585
585
 
586
+ // Track the original identifier name before resolving through bindings,
587
+ // needed for destructured patterns where the binding resolves to the
588
+ // entire VariableDeclarator (ObjectPattern) rather than the specific binding
589
+ let originalIdentName: string | undefined
590
+ if (t.isIdentifier(splitNode)) {
591
+ originalIdentName = splitNode.name
592
+ }
593
+
586
594
  while (t.isIdentifier(splitNode)) {
587
595
  const binding = programPath.scope.getBinding(splitNode.name)
588
596
  splitNode = binding?.path.node
@@ -630,6 +638,13 @@ export function compileCodeSplitVirtualRoute(
630
638
  if (t.isIdentifier(splitNode.id)) {
631
639
  splitMeta.localExporterIdent = splitNode.id.name
632
640
  splitMeta.shouldRemoveNode = false
641
+ } else if (t.isObjectPattern(splitNode.id)) {
642
+ // Destructured binding like `const { component: MyComp } = createBits()`
643
+ // Use the original identifier name that was tracked before resolving
644
+ if (originalIdentName) {
645
+ splitMeta.localExporterIdent = originalIdentName
646
+ }
647
+ splitMeta.shouldRemoveNode = false
633
648
  } else {
634
649
  throw new Error(
635
650
  `Unexpected splitNode type ☝️: ${splitNode.type}`,
@@ -733,13 +748,48 @@ export function compileCodeSplitVirtualRoute(
733
748
 
734
749
  if (path.node.declaration) {
735
750
  if (t.isVariableDeclaration(path.node.declaration)) {
751
+ const specifiers = path.node.declaration.declarations.flatMap(
752
+ (decl) => {
753
+ if (t.isIdentifier(decl.id)) {
754
+ return [
755
+ t.importSpecifier(
756
+ t.identifier(decl.id.name),
757
+ t.identifier(decl.id.name),
758
+ ),
759
+ ]
760
+ }
761
+
762
+ if (t.isObjectPattern(decl.id)) {
763
+ return collectIdentifiersFromPattern(decl.id).map(
764
+ (name) =>
765
+ t.importSpecifier(
766
+ t.identifier(name),
767
+ t.identifier(name),
768
+ ),
769
+ )
770
+ }
771
+
772
+ if (t.isArrayPattern(decl.id)) {
773
+ return collectIdentifiersFromPattern(decl.id).map(
774
+ (name) =>
775
+ t.importSpecifier(
776
+ t.identifier(name),
777
+ t.identifier(name),
778
+ ),
779
+ )
780
+ }
781
+
782
+ return []
783
+ },
784
+ )
785
+
786
+ if (specifiers.length === 0) {
787
+ path.remove()
788
+ return
789
+ }
790
+
736
791
  const importDecl = t.importDeclaration(
737
- path.node.declaration.declarations.map((decl) =>
738
- t.importSpecifier(
739
- t.identifier((decl.id as any).name),
740
- t.identifier((decl.id as any).name),
741
- ),
742
- ),
792
+ specifiers,
743
793
  t.stringLiteral(
744
794
  removeSplitSearchParamFromFilename(opts.filename),
745
795
  ),
@@ -921,6 +971,50 @@ function getImportSpecifierAndPathFromLocalName(
921
971
  return { specifier, path }
922
972
  }
923
973
 
974
+ /**
975
+ * Recursively collects all identifier names from a destructuring pattern
976
+ * (ObjectPattern, ArrayPattern, AssignmentPattern, RestElement).
977
+ */
978
+ function collectIdentifiersFromPattern(
979
+ node: t.LVal | t.Node | null | undefined,
980
+ ): Array<string> {
981
+ if (!node) {
982
+ return []
983
+ }
984
+
985
+ if (t.isIdentifier(node)) {
986
+ return [node.name]
987
+ }
988
+
989
+ if (t.isAssignmentPattern(node)) {
990
+ return collectIdentifiersFromPattern(node.left)
991
+ }
992
+
993
+ if (t.isRestElement(node)) {
994
+ return collectIdentifiersFromPattern(node.argument)
995
+ }
996
+
997
+ if (t.isObjectPattern(node)) {
998
+ return node.properties.flatMap((prop) => {
999
+ if (t.isObjectProperty(prop)) {
1000
+ return collectIdentifiersFromPattern(prop.value as t.LVal)
1001
+ }
1002
+ if (t.isRestElement(prop)) {
1003
+ return collectIdentifiersFromPattern(prop.argument)
1004
+ }
1005
+ return []
1006
+ })
1007
+ }
1008
+
1009
+ if (t.isArrayPattern(node)) {
1010
+ return node.elements.flatMap((element) =>
1011
+ collectIdentifiersFromPattern(element),
1012
+ )
1013
+ }
1014
+
1015
+ return []
1016
+ }
1017
+
924
1018
  // Reusable function to get literal value or resolve variable to literal
925
1019
  function resolveIdentifier(path: any, node: any): t.Node | undefined {
926
1020
  if (t.isIdentifier(node)) {
@@ -945,6 +1039,41 @@ function resolveIdentifier(path: any, node: any): t.Node | undefined {
945
1039
  function removeIdentifierLiteral(path: babel.NodePath, node: t.Identifier) {
946
1040
  const binding = path.scope.getBinding(node.name)
947
1041
  if (binding) {
1042
+ // If the binding is a destructured property from an ObjectPattern,
1043
+ // only remove that property instead of the entire declaration
1044
+ if (
1045
+ t.isVariableDeclarator(binding.path.node) &&
1046
+ t.isObjectPattern(binding.path.node.id)
1047
+ ) {
1048
+ const objectPattern = binding.path.node.id
1049
+ objectPattern.properties = objectPattern.properties.filter((prop) => {
1050
+ if (!t.isObjectProperty(prop)) {
1051
+ return true
1052
+ }
1053
+
1054
+ if (t.isIdentifier(prop.value) && prop.value.name === node.name) {
1055
+ return false
1056
+ }
1057
+
1058
+ if (
1059
+ t.isAssignmentPattern(prop.value) &&
1060
+ t.isIdentifier(prop.value.left) &&
1061
+ prop.value.left.name === node.name
1062
+ ) {
1063
+ return false
1064
+ }
1065
+
1066
+ return true
1067
+ })
1068
+
1069
+ // If no properties remain, remove the entire declaration
1070
+ if (objectPattern.properties.length === 0) {
1071
+ binding.path.remove()
1072
+ }
1073
+
1074
+ return
1075
+ }
1076
+
948
1077
  binding.path.remove()
949
1078
  }
950
1079
  }
@@ -963,6 +1092,15 @@ function hasExport(ast: t.File, node: t.Identifier): boolean {
963
1092
  if (decl.id.name === node.name) {
964
1093
  found = true
965
1094
  }
1095
+ } else if (
1096
+ t.isObjectPattern(decl.id) ||
1097
+ t.isArrayPattern(decl.id)
1098
+ ) {
1099
+ // Handle destructured exports like `export const { a, b } = fn()`
1100
+ const names = collectIdentifiersFromPattern(decl.id)
1101
+ if (names.includes(node.name)) {
1102
+ found = true
1103
+ }
966
1104
  }
967
1105
  }
968
1106
  })
@@ -1020,6 +1158,16 @@ function removeExports(ast: t.File, node: t.Identifier): boolean {
1020
1158
  path.remove()
1021
1159
  removed = true
1022
1160
  }
1161
+ } else if (
1162
+ t.isObjectPattern(decl.id) ||
1163
+ t.isArrayPattern(decl.id)
1164
+ ) {
1165
+ // Handle destructured exports like `export const { a, b } = fn()`
1166
+ const names = collectIdentifiersFromPattern(decl.id)
1167
+ if (names.includes(node.name)) {
1168
+ path.remove()
1169
+ removed = true
1170
+ }
1023
1171
  }
1024
1172
  }
1025
1173
  })