@tanstack/router-plugin 1.121.0-alpha.26 → 1.121.0-alpha.28

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.
Files changed (77) hide show
  1. package/dist/cjs/core/code-splitter/compilers.cjs +66 -40
  2. package/dist/cjs/core/code-splitter/compilers.cjs.map +1 -1
  3. package/dist/cjs/core/code-splitter/compilers.d.cts +3 -3
  4. package/dist/cjs/core/code-splitter/framework-options.cjs.map +1 -1
  5. package/dist/cjs/core/code-splitter/path-ids.cjs.map +1 -1
  6. package/dist/cjs/core/config.cjs +11 -1
  7. package/dist/cjs/core/config.cjs.map +1 -1
  8. package/dist/cjs/core/config.d.cts +49 -4
  9. package/dist/cjs/core/route-autoimport-plugin.cjs +52 -45
  10. package/dist/cjs/core/route-autoimport-plugin.cjs.map +1 -1
  11. package/dist/cjs/core/route-hmr-statement.cjs.map +1 -1
  12. package/dist/cjs/core/router-code-splitter-plugin.cjs +84 -64
  13. package/dist/cjs/core/router-code-splitter-plugin.cjs.map +1 -1
  14. package/dist/cjs/core/router-composed-plugin.cjs +12 -3
  15. package/dist/cjs/core/router-composed-plugin.cjs.map +1 -1
  16. package/dist/cjs/core/router-generator-plugin.cjs +27 -25
  17. package/dist/cjs/core/router-generator-plugin.cjs.map +1 -1
  18. package/dist/cjs/core/router-hmr-plugin.cjs +38 -29
  19. package/dist/cjs/core/router-hmr-plugin.cjs.map +1 -1
  20. package/dist/cjs/core/router-hmr-plugin.d.cts +1 -6
  21. package/dist/cjs/core/utils.cjs +0 -7
  22. package/dist/cjs/core/utils.cjs.map +1 -1
  23. package/dist/cjs/core/utils.d.cts +0 -1
  24. package/dist/cjs/esbuild.cjs.map +1 -1
  25. package/dist/cjs/esbuild.d.cts +20 -0
  26. package/dist/cjs/index.cjs +4 -0
  27. package/dist/cjs/index.cjs.map +1 -1
  28. package/dist/cjs/index.d.cts +1 -0
  29. package/dist/cjs/rspack.cjs.map +1 -1
  30. package/dist/cjs/rspack.d.cts +20 -0
  31. package/dist/cjs/vite.cjs.map +1 -1
  32. package/dist/cjs/vite.d.cts +25 -0
  33. package/dist/cjs/webpack.cjs.map +1 -1
  34. package/dist/cjs/webpack.d.cts +20 -0
  35. package/dist/esm/core/code-splitter/compilers.d.ts +3 -3
  36. package/dist/esm/core/code-splitter/compilers.js +66 -40
  37. package/dist/esm/core/code-splitter/compilers.js.map +1 -1
  38. package/dist/esm/core/code-splitter/framework-options.js.map +1 -1
  39. package/dist/esm/core/code-splitter/path-ids.js.map +1 -1
  40. package/dist/esm/core/config.d.ts +49 -4
  41. package/dist/esm/core/config.js +11 -1
  42. package/dist/esm/core/config.js.map +1 -1
  43. package/dist/esm/core/route-autoimport-plugin.js +53 -46
  44. package/dist/esm/core/route-autoimport-plugin.js.map +1 -1
  45. package/dist/esm/core/route-hmr-statement.js.map +1 -1
  46. package/dist/esm/core/router-code-splitter-plugin.js +86 -66
  47. package/dist/esm/core/router-code-splitter-plugin.js.map +1 -1
  48. package/dist/esm/core/router-composed-plugin.js +11 -2
  49. package/dist/esm/core/router-composed-plugin.js.map +1 -1
  50. package/dist/esm/core/router-generator-plugin.js +28 -26
  51. package/dist/esm/core/router-generator-plugin.js.map +1 -1
  52. package/dist/esm/core/router-hmr-plugin.d.ts +1 -6
  53. package/dist/esm/core/router-hmr-plugin.js +39 -30
  54. package/dist/esm/core/router-hmr-plugin.js.map +1 -1
  55. package/dist/esm/core/utils.d.ts +0 -1
  56. package/dist/esm/core/utils.js +1 -8
  57. package/dist/esm/core/utils.js.map +1 -1
  58. package/dist/esm/esbuild.d.ts +20 -0
  59. package/dist/esm/esbuild.js.map +1 -1
  60. package/dist/esm/index.d.ts +1 -0
  61. package/dist/esm/index.js +4 -0
  62. package/dist/esm/index.js.map +1 -1
  63. package/dist/esm/rspack.d.ts +20 -0
  64. package/dist/esm/vite.d.ts +25 -0
  65. package/dist/esm/vite.js.map +1 -1
  66. package/dist/esm/webpack.d.ts +20 -0
  67. package/package.json +15 -15
  68. package/src/core/code-splitter/compilers.ts +95 -60
  69. package/src/core/config.ts +25 -0
  70. package/src/core/route-autoimport-plugin.ts +59 -53
  71. package/src/core/router-code-splitter-plugin.ts +95 -80
  72. package/src/core/router-composed-plugin.ts +12 -2
  73. package/src/core/router-generator-plugin.ts +32 -32
  74. package/src/core/router-hmr-plugin.ts +42 -37
  75. package/src/core/utils.ts +0 -15
  76. package/src/global.d.ts +7 -0
  77. package/src/index.ts +5 -0
@@ -105,6 +105,15 @@ function removeSplitSearchParamFromFilename(filename) {
105
105
  const [bareFilename] = filename.split("?");
106
106
  return bareFilename;
107
107
  }
108
+ const splittableCreateRouteFns = ["createFileRoute"];
109
+ const unsplittableCreateRouteFns = [
110
+ "createRootRoute",
111
+ "createRootRouteWithContext"
112
+ ];
113
+ const allCreateRouteFns = [
114
+ ...splittableCreateRouteFns,
115
+ ...unsplittableCreateRouteFns
116
+ ];
108
117
  function compileCodeSplitReferenceRoute(opts) {
109
118
  const ast = routerUtils.parseAst(opts);
110
119
  const refIdents = babelDeadCodeElimination.findReferencedIdentifiers(ast);
@@ -117,6 +126,7 @@ function compileCodeSplitReferenceRoute(opts) {
117
126
  const PACKAGE = frameworkOptions$1.package;
118
127
  const LAZY_ROUTE_COMPONENT_IDENT = frameworkOptions$1.idents.lazyRouteComponent;
119
128
  const LAZY_FN_IDENT = frameworkOptions$1.idents.lazyFn;
129
+ let createRouteFn;
120
130
  babel.traverse(ast, {
121
131
  Program: {
122
132
  enter(programPath) {
@@ -126,20 +136,40 @@ function compileCodeSplitReferenceRoute(opts) {
126
136
  if (!t__namespace.isIdentifier(path.node.callee)) {
127
137
  return;
128
138
  }
129
- if (!(path.node.callee.name === "createRoute" || path.node.callee.name === "createFileRoute")) {
139
+ if (!allCreateRouteFns.includes(path.node.callee.name)) {
130
140
  return;
131
141
  }
142
+ createRouteFn = path.node.callee.name;
132
143
  function babelHandleReference(routeOptions) {
133
144
  const hasImportedOrDefinedIdentifier = (name) => {
134
145
  return programPath.scope.hasBinding(name);
135
146
  };
136
147
  if (t__namespace.isObjectExpression(routeOptions)) {
148
+ if (opts.deleteNodes && opts.deleteNodes.size > 0) {
149
+ routeOptions.properties = routeOptions.properties.filter(
150
+ (prop) => {
151
+ if (t__namespace.isObjectProperty(prop)) {
152
+ if (t__namespace.isIdentifier(prop.key)) {
153
+ if (opts.deleteNodes?.has(prop.key.name)) {
154
+ return false;
155
+ }
156
+ }
157
+ }
158
+ return true;
159
+ }
160
+ );
161
+ }
162
+ if (!splittableCreateRouteFns.includes(createRouteFn)) {
163
+ if (opts.addHmr) {
164
+ programPath.pushContainer("body", routeHmrStatement.routeHmrStatement);
165
+ }
166
+ return programPath.stop();
167
+ }
137
168
  routeOptions.properties.forEach((prop) => {
138
169
  if (t__namespace.isObjectProperty(prop)) {
139
170
  if (t__namespace.isIdentifier(prop.key)) {
140
- const codeSplitGroupingByKey = findIndexForSplitNode(
141
- prop.key.name
142
- );
171
+ const key = prop.key.name;
172
+ const codeSplitGroupingByKey = findIndexForSplitNode(key);
143
173
  if (codeSplitGroupingByKey === -1) {
144
174
  return;
145
175
  }
@@ -148,13 +178,15 @@ function compileCodeSplitReferenceRoute(opts) {
148
178
  opts.codeSplitGroupings[codeSplitGroupingByKey]
149
179
  )
150
180
  ];
151
- const key = prop.key.name;
152
181
  const isNodeConfigAvailable = SPLIT_NODES_CONFIG.has(
153
182
  key
154
183
  );
155
184
  if (!isNodeConfigAvailable) {
156
185
  return;
157
186
  }
187
+ if (t__namespace.isIdentifier(prop.value) && prop.value.name === "undefined") {
188
+ return;
189
+ }
158
190
  const splitNodeMeta = SPLIT_NODES_CONFIG.get(key);
159
191
  const splitUrl = addSplitSearchParamToFilename(
160
192
  opts.filename,
@@ -198,16 +230,10 @@ function compileCodeSplitReferenceRoute(opts) {
198
230
  )()
199
231
  ]);
200
232
  }
201
- if (key === "component") {
202
- prop.value = template__namespace.expression(
203
- `${LAZY_ROUTE_COMPONENT_IDENT}(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}', () => Route.ssr)`
204
- )();
205
- } else {
206
- prop.value = template__namespace.expression(
207
- `${LAZY_ROUTE_COMPONENT_IDENT}(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`
208
- )();
209
- }
210
- if (opts.runtimeEnv !== "prod") {
233
+ prop.value = template__namespace.expression(
234
+ `${LAZY_ROUTE_COMPONENT_IDENT}(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`
235
+ )();
236
+ if (opts.addHmr) {
211
237
  programPath.pushContainer("body", routeHmrStatement.routeHmrStatement);
212
238
  }
213
239
  }
@@ -313,7 +339,7 @@ function compileCodeSplitVirtualRoute(opts) {
313
339
  if (!t__namespace.isIdentifier(path.node.callee)) {
314
340
  return;
315
341
  }
316
- if (!(path.node.callee.name === "createRoute" || path.node.callee.name === "createFileRoute")) {
342
+ if (!splittableCreateRouteFns.includes(path.node.callee.name)) {
317
343
  return;
318
344
  }
319
345
  function babelHandleVirtual(options) {
@@ -325,6 +351,9 @@ function compileCodeSplitVirtualRoute(opts) {
325
351
  return;
326
352
  }
327
353
  const value = prop.value;
354
+ if (t__namespace.isIdentifier(value) && value.name === "undefined") {
355
+ return;
356
+ }
328
357
  let isExported = false;
329
358
  if (t__namespace.isIdentifier(value)) {
330
359
  isExported = hasExport(ast, value);
@@ -371,7 +400,7 @@ function compileCodeSplitVirtualRoute(opts) {
371
400
  const splitMeta = splitKey.meta;
372
401
  while (t__namespace.isIdentifier(splitNode)) {
373
402
  const binding = programPath.scope.getBinding(splitNode.name);
374
- splitNode = binding == null ? void 0 : binding.path.node;
403
+ splitNode = binding?.path.node;
375
404
  }
376
405
  if (splitNode) {
377
406
  if (t__namespace.isFunctionDeclaration(splitNode)) {
@@ -540,7 +569,6 @@ These should either have their export statements removed or be imported from ano
540
569
  }
541
570
  function detectCodeSplitGroupingsFromRoute(opts) {
542
571
  const ast = routerUtils.parseAst(opts);
543
- let routeId = "";
544
572
  let codeSplitGroupings = void 0;
545
573
  babel.traverse(ast, {
546
574
  Program: {
@@ -553,22 +581,9 @@ function detectCodeSplitGroupingsFromRoute(opts) {
553
581
  if (!(path.node.callee.name === "createRoute" || path.node.callee.name === "createFileRoute")) {
554
582
  return;
555
583
  }
556
- if (t__namespace.isCallExpression(path.parentPath.node)) {
557
- if (t__namespace.isCallExpression(path.parentPath.node.callee)) {
558
- const callee = path.parentPath.node.callee;
559
- if (t__namespace.isIdentifier(callee.callee)) {
560
- const firstArg = callee.arguments[0];
561
- if (t__namespace.isStringLiteral(firstArg)) {
562
- routeId = firstArg.value;
563
- }
564
- }
565
- }
566
- const options = resolveIdentifier(
567
- path,
568
- path.parentPath.node.arguments[0]
569
- );
570
- if (t__namespace.isObjectExpression(options)) {
571
- options.properties.forEach((prop) => {
584
+ function babelHandleSplittingGroups(routeOptions) {
585
+ if (t__namespace.isObjectExpression(routeOptions)) {
586
+ routeOptions.properties.forEach((prop) => {
572
587
  if (t__namespace.isObjectProperty(prop)) {
573
588
  if (t__namespace.isIdentifier(prop.key)) {
574
589
  if (prop.key.name === "codeSplitGroupings") {
@@ -600,12 +615,25 @@ function detectCodeSplitGroupingsFromRoute(opts) {
600
615
  });
601
616
  }
602
617
  }
618
+ if (t__namespace.isCallExpression(path.parentPath.node)) {
619
+ const options = resolveIdentifier(
620
+ path,
621
+ path.parentPath.node.arguments[0]
622
+ );
623
+ babelHandleSplittingGroups(options);
624
+ } else if (t__namespace.isVariableDeclarator(path.parentPath.node)) {
625
+ const caller = resolveIdentifier(path, path.parentPath.node.init);
626
+ if (t__namespace.isCallExpression(caller)) {
627
+ const options = resolveIdentifier(path, caller.arguments[0]);
628
+ babelHandleSplittingGroups(options);
629
+ }
630
+ }
603
631
  }
604
632
  });
605
633
  }
606
634
  }
607
635
  });
608
- return { groupings: codeSplitGroupings, routeId };
636
+ return { groupings: codeSplitGroupings };
609
637
  }
610
638
  function getImportSpecifierAndPathFromLocalName(programPath, name) {
611
639
  let specifier = null;
@@ -639,11 +667,9 @@ function resolveIdentifier(path, node) {
639
667
  return node;
640
668
  }
641
669
  function removeIdentifierLiteral(path, node) {
642
- if (t__namespace.isIdentifier(node)) {
643
- const binding = path.scope.getBinding(node.name);
644
- if (binding) {
645
- binding.path.remove();
646
- }
670
+ const binding = path.scope.getBinding(node.name);
671
+ if (binding) {
672
+ binding.path.remove();
647
673
  }
648
674
  }
649
675
  function hasExport(ast, node) {
@@ -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} from 'babel-dead-code-elimination'\nimport { generateFromAst, parseAst } 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 } 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 return `${bareFilename}?${params.toString()}`\n}\n\nfunction removeSplitSearchParamFromFilename(filename: string) {\n const [bareFilename] = filename.split('?')\n return bareFilename!\n}\n\nexport function compileCodeSplitReferenceRoute(\n opts: ParseAstOptions & {\n runtimeEnv: 'dev' | 'prod'\n codeSplitGroupings: CodeSplitGroupings\n targetFramework: Config['target']\n filename: string\n id: string\n },\n): GeneratorResult {\n const ast = parseAst(opts)\n\n const refIdents = findReferencedIdentifiers(ast)\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 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 (\n !(\n path.node.callee.name === 'createRoute' ||\n path.node.callee.name === 'createFileRoute'\n )\n ) {\n return\n }\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 routeOptions.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n if (t.isIdentifier(prop.key)) {\n // If the user has not specified a split grouping for this key\n // then we should not split it\n const codeSplitGroupingByKey = findIndexForSplitNode(\n prop.key.name,\n )\n if (codeSplitGroupingByKey === -1) {\n return\n }\n const codeSplitGroup = [\n ...new Set(\n opts.codeSplitGroupings[codeSplitGroupingByKey],\n ),\n ]\n\n const key = prop.key.name\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 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 shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (!shouldSplit) {\n return\n }\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\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 // If it's a component, we need to pass the function to check the Route.ssr value\n if (key === 'component') {\n prop.value = template.expression(\n `${LAZY_ROUTE_COMPONENT_IDENT}(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}', () => Route.ssr)`,\n )()\n } else {\n prop.value = template.expression(\n `${LAZY_ROUTE_COMPONENT_IDENT}(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`,\n )()\n }\n\n // add HMR handling\n if (opts.runtimeEnv !== 'prod') {\n programPath.pushContainer('body', routeHmrStatement)\n }\n }\n\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 shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (!shouldSplit) {\n return\n }\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 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 deadCodeElimination(ast, refIdents)\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 (\n !(\n path.node.callee.name === 'createRoute' ||\n path.node.callee.name === 'createFileRoute'\n )\n ) {\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 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\n\n while (t.isIdentifier(splitNode)) {\n const binding = programPath.scope.getBinding(splitNode.name)\n splitNode = binding?.path.node\n }\n\n // Add the node to the program\n if (splitNode) {\n if (t.isFunctionDeclaration(splitNode)) {\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitMeta.localExporterIdent),\n t.functionExpression(\n splitNode.id || null, // Anonymize the function expression\n splitNode.params,\n splitNode.body,\n splitNode.generator,\n splitNode.async,\n ),\n ),\n ]),\n )\n } else if (\n t.isFunctionExpression(splitNode) ||\n t.isArrowFunctionExpression(splitNode)\n ) {\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(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 programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitMeta.localExporterIdent),\n splitNode.init,\n ),\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 {\n console.info('Unexpected splitNode type:', splitNode)\n throw new Error(`Unexpected splitNode type ☝️: ${splitNode.type}`)\n }\n }\n\n // If the splitNode exists at the top of the program\n // then we need to remove that copy\n programPath.node.body = programPath.node.body.filter((node) => {\n return node !== splitNode\n })\n\n // Export the node\n programPath.pushContainer('body', [\n t.exportNamedDeclaration(null, [\n t.exportSpecifier(\n t.identifier(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 path.replaceWith(\n t.importDeclaration(\n path.node.declaration.declarations.map((decl) =>\n t.importSpecifier(\n t.identifier((decl.id as any).name),\n t.identifier((decl.id as any).name),\n ),\n ),\n t.stringLiteral(\n removeSplitSearchParamFromFilename(opts.filename),\n ),\n ),\n )\n }\n }\n },\n })\n },\n },\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 list = Array.from(knownExportedIdents).reduce((str, ident) => {\n str += `\\n- ${ident}`\n return str\n }, '')\n\n const warningMessage = `These exports from \"${opts.filename}\" are not being code-split and will increase your bundle size: ${list}\\nThese should either have their export statements removed or be imported from another file that is not a route.`\n console.warn(warningMessage)\n\n // append this warning to the file using a template\n if (process.env.NODE_ENV !== 'production') {\n const warningTemplate = template.statement(\n `console.warn(${JSON.stringify(warningMessage)})`,\n )()\n ast.program.body.unshift(warningTemplate)\n }\n }\n\n return 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 routeId: string\n} {\n const ast = parseAst(opts)\n\n let routeId = ''\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 if (t.isCallExpression(path.parentPath.node)) {\n // Extract out the routeId\n if (t.isCallExpression(path.parentPath.node.callee)) {\n const callee = path.parentPath.node.callee\n\n if (t.isIdentifier(callee.callee)) {\n const firstArg = callee.arguments[0]\n if (t.isStringLiteral(firstArg)) {\n routeId = firstArg.value\n }\n }\n }\n\n // Extracting the codeSplitGroupings\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n if (t.isObjectExpression(options)) {\n options.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n if (t.isIdentifier(prop.key)) {\n if (prop.key.name === '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 })\n },\n },\n })\n\n return { groupings: codeSplitGroupings, routeId }\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: any, node: any) {\n if (t.isIdentifier(node)) {\n const binding = path.scope.getBinding(node.name)\n if (binding) {\n binding.path.remove()\n }\n }\n}\n\nfunction hasExport(ast: t.File, node: t.Identifier): boolean {\n let found = false\n\n babel.traverse(ast, {\n ExportNamedDeclaration(path) {\n if (path.node.declaration) {\n // declared as `const loaderFn = () => {}`\n if (t.isVariableDeclaration(path.node.declaration)) {\n path.node.declaration.declarations.forEach((decl) => {\n if (t.isVariableDeclarator(decl)) {\n if (t.isIdentifier(decl.id)) {\n if (decl.id.name === node.name) {\n found = true\n }\n }\n }\n })\n }\n\n // declared as `function loaderFn() {}`\n if (t.isFunctionDeclaration(path.node.declaration)) {\n if (t.isIdentifier(path.node.declaration.id)) {\n if (path.node.declaration.id.name === node.name) {\n found = true\n }\n }\n }\n }\n },\n ExportDefaultDeclaration(path) {\n // 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","template","routeHmrStatement","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} from 'babel-dead-code-elimination'\nimport { generateFromAst, parseAst } 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 return `${bareFilename}?${params.toString()}`\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 {\n const ast = parseAst(opts)\n\n const refIdents = findReferencedIdentifiers(ast)\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 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 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) {\n programPath.pushContainer('body', routeHmrStatement)\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 undefined\n // Since we don't need to run an import just to get the value of `undefined`\n // This is useful for cases like: `createFileRoute('/')({ component: undefined })`\n if (\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 shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (!shouldSplit) {\n return\n }\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) {\n programPath.pushContainer('body', routeHmrStatement)\n }\n }\n\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 shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (!shouldSplit) {\n return\n }\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 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 deadCodeElimination(ast, refIdents)\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\n\n while (t.isIdentifier(splitNode)) {\n const binding = programPath.scope.getBinding(splitNode.name)\n splitNode = binding?.path.node\n }\n\n // Add the node to the program\n if (splitNode) {\n if (t.isFunctionDeclaration(splitNode)) {\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitMeta.localExporterIdent),\n t.functionExpression(\n splitNode.id || null, // Anonymize the function expression\n splitNode.params,\n splitNode.body,\n splitNode.generator,\n splitNode.async,\n ),\n ),\n ]),\n )\n } else if (\n t.isFunctionExpression(splitNode) ||\n t.isArrowFunctionExpression(splitNode)\n ) {\n programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(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 programPath.pushContainer(\n 'body',\n t.variableDeclaration('const', [\n t.variableDeclarator(\n t.identifier(splitMeta.localExporterIdent),\n splitNode.init,\n ),\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 {\n console.info('Unexpected splitNode type:', splitNode)\n throw new Error(`Unexpected splitNode type ☝️: ${splitNode.type}`)\n }\n }\n\n // If the splitNode exists at the top of the program\n // then we need to remove that copy\n programPath.node.body = programPath.node.body.filter((node) => {\n return node !== splitNode\n })\n\n // Export the node\n programPath.pushContainer('body', [\n t.exportNamedDeclaration(null, [\n t.exportSpecifier(\n t.identifier(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 path.replaceWith(\n t.importDeclaration(\n path.node.declaration.declarations.map((decl) =>\n t.importSpecifier(\n t.identifier((decl.id as any).name),\n t.identifier((decl.id as any).name),\n ),\n ),\n t.stringLiteral(\n removeSplitSearchParamFromFilename(opts.filename),\n ),\n ),\n )\n }\n }\n },\n })\n },\n },\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 list = Array.from(knownExportedIdents).reduce((str, ident) => {\n str += `\\n- ${ident}`\n return str\n }, '')\n\n const warningMessage = `These exports from \"${opts.filename}\" are not being code-split and will increase your bundle size: ${list}\\nThese should either have their export statements removed or be imported from another file that is not a route.`\n console.warn(warningMessage)\n\n // append this warning to the file using a template\n if (process.env.NODE_ENV !== 'production') {\n const warningTemplate = template.statement(\n `console.warn(${JSON.stringify(warningMessage)})`,\n )()\n ast.program.body.unshift(warningTemplate)\n }\n }\n\n return 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 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,12 +1,13 @@
1
1
  import { GeneratorResult, ParseAstOptions } from '@tanstack/router-utils';
2
2
  import { CodeSplitGroupings, SplitRouteIdentNodes } from '../constants.cjs';
3
- import { Config } from '../config.cjs';
3
+ import { Config, DeletableNodes } from '../config.cjs';
4
4
  export declare function compileCodeSplitReferenceRoute(opts: ParseAstOptions & {
5
- runtimeEnv: 'dev' | 'prod';
6
5
  codeSplitGroupings: CodeSplitGroupings;
6
+ deleteNodes?: Set<DeletableNodes>;
7
7
  targetFramework: Config['target'];
8
8
  filename: string;
9
9
  id: string;
10
+ addHmr?: boolean;
10
11
  }): GeneratorResult;
11
12
  export declare function compileCodeSplitVirtualRoute(opts: ParseAstOptions & {
12
13
  splitTargets: Array<SplitRouteIdentNodes>;
@@ -18,5 +19,4 @@ export declare function compileCodeSplitVirtualRoute(opts: ParseAstOptions & {
18
19
  */
19
20
  export declare function detectCodeSplitGroupingsFromRoute(opts: ParseAstOptions): {
20
21
  groupings: CodeSplitGroupings | undefined;
21
- routeId: string;
22
22
  };
@@ -1 +1 @@
1
- {"version":3,"file":"framework-options.cjs","sources":["../../../../src/core/code-splitter/framework-options.ts"],"sourcesContent":["type FrameworkOptions = {\n package: string\n idents: {\n createFileRoute: string\n lazyFn: string\n lazyRouteComponent: string\n }\n}\n\nexport function getFrameworkOptions(framework: string): FrameworkOptions {\n let frameworkOptions: FrameworkOptions\n\n switch (framework) {\n case 'react':\n frameworkOptions = {\n package: '@tanstack/react-router',\n idents: {\n createFileRoute: 'createFileRoute',\n lazyFn: 'lazyFn',\n lazyRouteComponent: 'lazyRouteComponent',\n },\n }\n break\n case 'solid':\n frameworkOptions = {\n package: '@tanstack/solid-router',\n idents: {\n createFileRoute: 'createFileRoute',\n lazyFn: 'lazyFn',\n lazyRouteComponent: 'lazyRouteComponent',\n },\n }\n break\n default:\n throw new Error(\n `[getFrameworkOptions] - Unsupported framework: ${framework}`,\n )\n }\n\n return frameworkOptions\n}\n"],"names":[],"mappings":";;AASO,SAAS,oBAAoB,WAAqC;AACnE,MAAA;AAEJ,UAAQ,WAAW;AAAA,IACjB,KAAK;AACgB,yBAAA;AAAA,QACjB,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,oBAAoB;AAAA,QAAA;AAAA,MAExB;AACA;AAAA,IACF,KAAK;AACgB,yBAAA;AAAA,QACjB,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,oBAAoB;AAAA,QAAA;AAAA,MAExB;AACA;AAAA,IACF;AACE,YAAM,IAAI;AAAA,QACR,kDAAkD,SAAS;AAAA,MAC7D;AAAA,EAAA;AAGG,SAAA;AACT;;"}
1
+ {"version":3,"file":"framework-options.cjs","sources":["../../../../src/core/code-splitter/framework-options.ts"],"sourcesContent":["type FrameworkOptions = {\n package: string\n idents: {\n createFileRoute: string\n lazyFn: string\n lazyRouteComponent: string\n }\n}\n\nexport function getFrameworkOptions(framework: string): FrameworkOptions {\n let frameworkOptions: FrameworkOptions\n\n switch (framework) {\n case 'react':\n frameworkOptions = {\n package: '@tanstack/react-router',\n idents: {\n createFileRoute: 'createFileRoute',\n lazyFn: 'lazyFn',\n lazyRouteComponent: 'lazyRouteComponent',\n },\n }\n break\n case 'solid':\n frameworkOptions = {\n package: '@tanstack/solid-router',\n idents: {\n createFileRoute: 'createFileRoute',\n lazyFn: 'lazyFn',\n lazyRouteComponent: 'lazyRouteComponent',\n },\n }\n break\n default:\n throw new Error(\n `[getFrameworkOptions] - Unsupported framework: ${framework}`,\n )\n }\n\n return frameworkOptions\n}\n"],"names":[],"mappings":";;AASO,SAAS,oBAAoB,WAAqC;AACvE,MAAI;AAEJ,UAAQ,WAAA;AAAA,IACN,KAAK;AACH,yBAAmB;AAAA,QACjB,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,oBAAoB;AAAA,QAAA;AAAA,MACtB;AAEF;AAAA,IACF,KAAK;AACH,yBAAmB;AAAA,QACjB,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,oBAAoB;AAAA,QAAA;AAAA,MACtB;AAEF;AAAA,IACF;AACE,YAAM,IAAI;AAAA,QACR,kDAAkD,SAAS;AAAA,MAAA;AAAA,EAC7D;AAGJ,SAAO;AACT;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"path-ids.cjs","sources":["../../../../src/core/code-splitter/path-ids.ts"],"sourcesContent":["export function createIdentifier(strings: Array<string>): string {\n if (strings.length === 0) {\n throw new Error('Cannot create an identifier from an empty array')\n }\n\n const sortedStrings = [...strings].sort()\n const combinedString = sortedStrings.join('---') // Delimiter\n\n // Replace unsafe characters\n let safeString = combinedString.replace(/\\//g, '--slash--')\n safeString = safeString.replace(/\\\\/g, '--backslash--')\n safeString = safeString.replace(/\\?/g, '--question--')\n safeString = safeString.replace(/%/g, '--percent--')\n safeString = safeString.replace(/#/g, '--hash--')\n safeString = safeString.replace(/\\+/g, '--plus--')\n safeString = safeString.replace(/=/g, '--equals--')\n safeString = safeString.replace(/&/g, '--ampersand--')\n safeString = safeString.replace(/\\s/g, '_') // Replace spaces with underscores\n\n return safeString\n}\n\nexport function decodeIdentifier(identifier: string): Array<string> {\n if (!identifier) {\n return []\n }\n\n let combinedString = identifier.replace(/--slash--/g, '/')\n combinedString = combinedString.replace(/--backslash--/g, '\\\\')\n combinedString = combinedString.replace(/--question--/g, '?')\n combinedString = combinedString.replace(/--percent--/g, '%')\n combinedString = combinedString.replace(/--hash--/g, '#')\n combinedString = combinedString.replace(/--plus--/g, '+')\n combinedString = combinedString.replace(/--equals--/g, '=')\n combinedString = combinedString.replace(/--ampersand--/g, '&')\n combinedString = combinedString.replace(/_/g, ' ') // Restore spaces\n\n return combinedString.split('---')\n}\n"],"names":[],"mappings":";;AAAO,SAAS,iBAAiB,SAAgC;AAC3D,MAAA,QAAQ,WAAW,GAAG;AAClB,UAAA,IAAI,MAAM,iDAAiD;AAAA,EAAA;AAGnE,QAAM,gBAAgB,CAAC,GAAG,OAAO,EAAE,KAAK;AAClC,QAAA,iBAAiB,cAAc,KAAK,KAAK;AAG/C,MAAI,aAAa,eAAe,QAAQ,OAAO,WAAW;AAC7C,eAAA,WAAW,QAAQ,OAAO,eAAe;AACzC,eAAA,WAAW,QAAQ,OAAO,cAAc;AACxC,eAAA,WAAW,QAAQ,MAAM,aAAa;AACtC,eAAA,WAAW,QAAQ,MAAM,UAAU;AACnC,eAAA,WAAW,QAAQ,OAAO,UAAU;AACpC,eAAA,WAAW,QAAQ,MAAM,YAAY;AACrC,eAAA,WAAW,QAAQ,MAAM,eAAe;AACxC,eAAA,WAAW,QAAQ,OAAO,GAAG;AAEnC,SAAA;AACT;AAEO,SAAS,iBAAiB,YAAmC;AAClE,MAAI,CAAC,YAAY;AACf,WAAO,CAAC;AAAA,EAAA;AAGV,MAAI,iBAAiB,WAAW,QAAQ,cAAc,GAAG;AACxC,mBAAA,eAAe,QAAQ,kBAAkB,IAAI;AAC7C,mBAAA,eAAe,QAAQ,iBAAiB,GAAG;AAC3C,mBAAA,eAAe,QAAQ,gBAAgB,GAAG;AAC1C,mBAAA,eAAe,QAAQ,aAAa,GAAG;AACvC,mBAAA,eAAe,QAAQ,aAAa,GAAG;AACvC,mBAAA,eAAe,QAAQ,eAAe,GAAG;AACzC,mBAAA,eAAe,QAAQ,kBAAkB,GAAG;AAC5C,mBAAA,eAAe,QAAQ,MAAM,GAAG;AAE1C,SAAA,eAAe,MAAM,KAAK;AACnC;;;"}
1
+ {"version":3,"file":"path-ids.cjs","sources":["../../../../src/core/code-splitter/path-ids.ts"],"sourcesContent":["export function createIdentifier(strings: Array<string>): string {\n if (strings.length === 0) {\n throw new Error('Cannot create an identifier from an empty array')\n }\n\n const sortedStrings = [...strings].sort()\n const combinedString = sortedStrings.join('---') // Delimiter\n\n // Replace unsafe characters\n let safeString = combinedString.replace(/\\//g, '--slash--')\n safeString = safeString.replace(/\\\\/g, '--backslash--')\n safeString = safeString.replace(/\\?/g, '--question--')\n safeString = safeString.replace(/%/g, '--percent--')\n safeString = safeString.replace(/#/g, '--hash--')\n safeString = safeString.replace(/\\+/g, '--plus--')\n safeString = safeString.replace(/=/g, '--equals--')\n safeString = safeString.replace(/&/g, '--ampersand--')\n safeString = safeString.replace(/\\s/g, '_') // Replace spaces with underscores\n\n return safeString\n}\n\nexport function decodeIdentifier(identifier: string): Array<string> {\n if (!identifier) {\n return []\n }\n\n let combinedString = identifier.replace(/--slash--/g, '/')\n combinedString = combinedString.replace(/--backslash--/g, '\\\\')\n combinedString = combinedString.replace(/--question--/g, '?')\n combinedString = combinedString.replace(/--percent--/g, '%')\n combinedString = combinedString.replace(/--hash--/g, '#')\n combinedString = combinedString.replace(/--plus--/g, '+')\n combinedString = combinedString.replace(/--equals--/g, '=')\n combinedString = combinedString.replace(/--ampersand--/g, '&')\n combinedString = combinedString.replace(/_/g, ' ') // Restore spaces\n\n return combinedString.split('---')\n}\n"],"names":[],"mappings":";;AAAO,SAAS,iBAAiB,SAAgC;AAC/D,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AAEA,QAAM,gBAAgB,CAAC,GAAG,OAAO,EAAE,KAAA;AACnC,QAAM,iBAAiB,cAAc,KAAK,KAAK;AAG/C,MAAI,aAAa,eAAe,QAAQ,OAAO,WAAW;AAC1D,eAAa,WAAW,QAAQ,OAAO,eAAe;AACtD,eAAa,WAAW,QAAQ,OAAO,cAAc;AACrD,eAAa,WAAW,QAAQ,MAAM,aAAa;AACnD,eAAa,WAAW,QAAQ,MAAM,UAAU;AAChD,eAAa,WAAW,QAAQ,OAAO,UAAU;AACjD,eAAa,WAAW,QAAQ,MAAM,YAAY;AAClD,eAAa,WAAW,QAAQ,MAAM,eAAe;AACrD,eAAa,WAAW,QAAQ,OAAO,GAAG;AAE1C,SAAO;AACT;AAEO,SAAS,iBAAiB,YAAmC;AAClE,MAAI,CAAC,YAAY;AACf,WAAO,CAAA;AAAA,EACT;AAEA,MAAI,iBAAiB,WAAW,QAAQ,cAAc,GAAG;AACzD,mBAAiB,eAAe,QAAQ,kBAAkB,IAAI;AAC9D,mBAAiB,eAAe,QAAQ,iBAAiB,GAAG;AAC5D,mBAAiB,eAAe,QAAQ,gBAAgB,GAAG;AAC3D,mBAAiB,eAAe,QAAQ,aAAa,GAAG;AACxD,mBAAiB,eAAe,QAAQ,aAAa,GAAG;AACxD,mBAAiB,eAAe,QAAQ,eAAe,GAAG;AAC1D,mBAAiB,eAAe,QAAQ,kBAAkB,GAAG;AAC7D,mBAAiB,eAAe,QAAQ,MAAM,GAAG;AAEjD,SAAO,eAAe,MAAM,KAAK;AACnC;;;"}
@@ -26,14 +26,23 @@ const splitGroupingsSchema = zod.z.array(
26
26
  });
27
27
  }
28
28
  });
29
+ const DELETABLE_NODES = ["ssr"];
30
+ const deletableNodesSchema = zod.z.enum(DELETABLE_NODES);
29
31
  const codeSplittingOptionsSchema = zod.z.object({
30
32
  splitBehavior: zod.z.function().optional(),
31
- defaultBehavior: splitGroupingsSchema.optional()
33
+ defaultBehavior: splitGroupingsSchema.optional(),
34
+ deleteNodes: zod.z.array(deletableNodesSchema).optional(),
35
+ addHmr: zod.z.boolean().optional().default(true)
32
36
  });
33
37
  const configSchema = routerGenerator.configSchema.extend({
34
38
  enableRouteGeneration: zod.z.boolean().optional(),
35
39
  codeSplittingOptions: zod.z.custom((v) => {
36
40
  return codeSplittingOptionsSchema.parse(v);
41
+ }).optional(),
42
+ plugin: zod.z.object({
43
+ vite: zod.z.object({
44
+ environmentName: zod.z.string().optional()
45
+ }).optional()
37
46
  }).optional()
38
47
  });
39
48
  const getConfig = (inlineConfig, root) => {
@@ -41,6 +50,7 @@ const getConfig = (inlineConfig, root) => {
41
50
  return configSchema.parse({ ...config, ...inlineConfig });
42
51
  };
43
52
  exports.configSchema = configSchema;
53
+ exports.deletableNodesSchema = deletableNodesSchema;
44
54
  exports.getConfig = getConfig;
45
55
  exports.splitGroupingsSchema = splitGroupingsSchema;
46
56
  //# sourceMappingURL=config.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.cjs","sources":["../../../src/core/config.ts"],"sourcesContent":["import { z } from 'zod'\nimport {\n configSchema as generatorConfigSchema,\n getConfig as getGeneratorConfig,\n} from '@tanstack/router-generator'\nimport type { RegisteredRouter, RouteIds } from '@tanstack/router-core'\nimport type { CodeSplitGroupings } from './constants'\n\nexport const splitGroupingsSchema = z\n .array(\n z.array(\n z.union([\n z.literal('loader'),\n z.literal('component'),\n z.literal('pendingComponent'),\n z.literal('errorComponent'),\n z.literal('notFoundComponent'),\n ]),\n ),\n {\n message:\n \" Must be an Array of Arrays containing the split groupings. i.e. [['component'], ['pendingComponent'], ['errorComponent', 'notFoundComponent']]\",\n },\n )\n .superRefine((val, ctx) => {\n const flattened = val.flat()\n const unique = [...new Set(flattened)]\n\n // Elements must be unique,\n // ie. this shouldn't be allows [['component'], ['component', 'loader']]\n if (unique.length !== flattened.length) {\n ctx.addIssue({\n code: 'custom',\n message:\n \" Split groupings must be unique and not repeated. i.e. i.e. [['component'], ['pendingComponent'], ['errorComponent', 'notFoundComponent']].\" +\n `\\n You input was: ${JSON.stringify(val)}.`,\n })\n }\n })\n\nexport type CodeSplittingOptions = {\n /**\n * Use this function to programmatically control the code splitting behavior\n * based on the `routeId` for each route.\n *\n * If you just need to change the default behavior, you can use the `defaultBehavior` option.\n * @param params\n */\n splitBehavior?: (params: {\n routeId: RouteIds<RegisteredRouter['routeTree']>\n }) => CodeSplitGroupings | undefined | void\n\n /**\n * The default/global configuration to control your code splitting behavior per route.\n * @default [['component'],['pendingComponent'],['errorComponent'],['notFoundComponent']]\n */\n defaultBehavior?: CodeSplitGroupings\n}\n\nconst codeSplittingOptionsSchema = z.object({\n splitBehavior: z.function().optional(),\n defaultBehavior: splitGroupingsSchema.optional(),\n})\n\nexport const configSchema = generatorConfigSchema.extend({\n enableRouteGeneration: z.boolean().optional(),\n codeSplittingOptions: z\n .custom<CodeSplittingOptions>((v) => {\n return codeSplittingOptionsSchema.parse(v)\n })\n .optional(),\n})\n\nexport const getConfig = (inlineConfig: Partial<Config>, root: string) => {\n const config = getGeneratorConfig(inlineConfig, root)\n\n return configSchema.parse({ ...config, ...inlineConfig })\n}\n\nexport type Config = z.infer<typeof configSchema>\nexport type ConfigInput = z.input<typeof configSchema>\nexport type ConfigOutput = z.output<typeof configSchema>\n"],"names":["z","generatorConfigSchema","getGeneratorConfig"],"mappings":";;;;AAQO,MAAM,uBAAuBA,IACjC,EAAA;AAAA,EACCA,IAAAA,EAAE;AAAA,IACAA,IAAAA,EAAE,MAAM;AAAA,MACNA,IAAA,EAAE,QAAQ,QAAQ;AAAA,MAClBA,IAAA,EAAE,QAAQ,WAAW;AAAA,MACrBA,IAAA,EAAE,QAAQ,kBAAkB;AAAA,MAC5BA,IAAA,EAAE,QAAQ,gBAAgB;AAAA,MAC1BA,IAAA,EAAE,QAAQ,mBAAmB;AAAA,IAC9B,CAAA;AAAA,EACH;AAAA,EACA;AAAA,IACE,SACE;AAAA,EAAA;AAEN,EACC,YAAY,CAAC,KAAK,QAAQ;AACnB,QAAA,YAAY,IAAI,KAAK;AAC3B,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;AAIjC,MAAA,OAAO,WAAW,UAAU,QAAQ;AACtC,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,SACE;AAAA,mBACsB,KAAK,UAAU,GAAG,CAAC;AAAA,IAAA,CAC5C;AAAA,EAAA;AAEL,CAAC;AAqBH,MAAM,6BAA6BA,MAAE,OAAO;AAAA,EAC1C,eAAeA,IAAA,EAAE,SAAS,EAAE,SAAS;AAAA,EACrC,iBAAiB,qBAAqB,SAAS;AACjD,CAAC;AAEY,MAAA,eAAeC,6BAAsB,OAAO;AAAA,EACvD,uBAAuBD,IAAA,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC5C,sBAAsBA,IAAA,EACnB,OAA6B,CAAC,MAAM;AAC5B,WAAA,2BAA2B,MAAM,CAAC;AAAA,EAC1C,CAAA,EACA,SAAS;AACd,CAAC;AAEY,MAAA,YAAY,CAAC,cAA+B,SAAiB;AAClE,QAAA,SAASE,gBAAAA,UAAmB,cAAc,IAAI;AAEpD,SAAO,aAAa,MAAM,EAAE,GAAG,QAAQ,GAAG,cAAc;AAC1D;;;;"}
1
+ {"version":3,"file":"config.cjs","sources":["../../../src/core/config.ts"],"sourcesContent":["import { z } from 'zod'\nimport {\n configSchema as generatorConfigSchema,\n getConfig as getGeneratorConfig,\n} from '@tanstack/router-generator'\nimport type { RegisteredRouter, RouteIds } from '@tanstack/router-core'\nimport type { CodeSplitGroupings } from './constants'\n\nexport const splitGroupingsSchema = z\n .array(\n z.array(\n z.union([\n z.literal('loader'),\n z.literal('component'),\n z.literal('pendingComponent'),\n z.literal('errorComponent'),\n z.literal('notFoundComponent'),\n ]),\n ),\n {\n message:\n \" Must be an Array of Arrays containing the split groupings. i.e. [['component'], ['pendingComponent'], ['errorComponent', 'notFoundComponent']]\",\n },\n )\n .superRefine((val, ctx) => {\n const flattened = val.flat()\n const unique = [...new Set(flattened)]\n\n // Elements must be unique,\n // ie. this shouldn't be allows [['component'], ['component', 'loader']]\n if (unique.length !== flattened.length) {\n ctx.addIssue({\n code: 'custom',\n message:\n \" Split groupings must be unique and not repeated. i.e. i.e. [['component'], ['pendingComponent'], ['errorComponent', 'notFoundComponent']].\" +\n `\\n You input was: ${JSON.stringify(val)}.`,\n })\n }\n })\n\nexport type CodeSplittingOptions = {\n /**\n * Use this function to programmatically control the code splitting behavior\n * based on the `routeId` for each route.\n *\n * If you just need to change the default behavior, you can use the `defaultBehavior` option.\n * @param params\n */\n splitBehavior?: (params: {\n routeId: RouteIds<RegisteredRouter['routeTree']>\n }) => CodeSplitGroupings | undefined | void\n\n /**\n * The default/global configuration to control your code splitting behavior per route.\n * @default [['component'],['pendingComponent'],['errorComponent'],['notFoundComponent']]\n */\n defaultBehavior?: CodeSplitGroupings\n\n /**\n * The nodes that shall be deleted from the route.\n * @default undefined\n */\n deleteNodes?: Array<DeletableNodes>\n\n /**\n * @default true\n */\n addHmr?: boolean\n}\n\nconst DELETABLE_NODES = ['ssr'] as const\nexport const deletableNodesSchema = z.enum(DELETABLE_NODES)\nconst codeSplittingOptionsSchema = z.object({\n splitBehavior: z.function().optional(),\n defaultBehavior: splitGroupingsSchema.optional(),\n deleteNodes: z.array(deletableNodesSchema).optional(),\n addHmr: z.boolean().optional().default(true),\n})\nexport type DeletableNodes = (typeof DELETABLE_NODES)[number]\n\nexport const configSchema = generatorConfigSchema.extend({\n enableRouteGeneration: z.boolean().optional(),\n codeSplittingOptions: z\n .custom<CodeSplittingOptions>((v) => {\n return codeSplittingOptionsSchema.parse(v)\n })\n .optional(),\n plugin: z\n .object({\n vite: z\n .object({\n environmentName: z.string().optional(),\n })\n .optional(),\n })\n .optional(),\n})\n\nexport const getConfig = (inlineConfig: Partial<Config>, root: string) => {\n const config = getGeneratorConfig(inlineConfig, root)\n\n return configSchema.parse({ ...config, ...inlineConfig })\n}\n\nexport type Config = z.infer<typeof configSchema>\nexport type ConfigInput = z.input<typeof configSchema>\nexport type ConfigOutput = z.output<typeof configSchema>\n"],"names":["z","generatorConfigSchema","getGeneratorConfig"],"mappings":";;;;AAQO,MAAM,uBAAuBA,IAAAA,EACjC;AAAA,EACCA,IAAAA,EAAE;AAAA,IACAA,IAAAA,EAAE,MAAM;AAAA,MACNA,IAAAA,EAAE,QAAQ,QAAQ;AAAA,MAClBA,IAAAA,EAAE,QAAQ,WAAW;AAAA,MACrBA,IAAAA,EAAE,QAAQ,kBAAkB;AAAA,MAC5BA,IAAAA,EAAE,QAAQ,gBAAgB;AAAA,MAC1BA,IAAAA,EAAE,QAAQ,mBAAmB;AAAA,IAAA,CAC9B;AAAA,EAAA;AAAA,EAEH;AAAA,IACE,SACE;AAAA,EAAA;AAEN,EACC,YAAY,CAAC,KAAK,QAAQ;AACzB,QAAM,YAAY,IAAI,KAAA;AACtB,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;AAIrC,MAAI,OAAO,WAAW,UAAU,QAAQ;AACtC,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,SACE;AAAA,mBACsB,KAAK,UAAU,GAAG,CAAC;AAAA,IAAA,CAC5C;AAAA,EACH;AACF,CAAC;AAgCH,MAAM,kBAAkB,CAAC,KAAK;AACvB,MAAM,uBAAuBA,IAAAA,EAAE,KAAK,eAAe;AAC1D,MAAM,6BAA6BA,IAAAA,EAAE,OAAO;AAAA,EAC1C,eAAeA,IAAAA,EAAE,SAAA,EAAW,SAAA;AAAA,EAC5B,iBAAiB,qBAAqB,SAAA;AAAA,EACtC,aAAaA,IAAAA,EAAE,MAAM,oBAAoB,EAAE,SAAA;AAAA,EAC3C,QAAQA,IAAAA,EAAE,QAAA,EAAU,SAAA,EAAW,QAAQ,IAAI;AAC7C,CAAC;AAGM,MAAM,eAAeC,gBAAAA,aAAsB,OAAO;AAAA,EACvD,uBAAuBD,IAAAA,EAAE,QAAA,EAAU,SAAA;AAAA,EACnC,sBAAsBA,IAAAA,EACnB,OAA6B,CAAC,MAAM;AACnC,WAAO,2BAA2B,MAAM,CAAC;AAAA,EAC3C,CAAC,EACA,SAAA;AAAA,EACH,QAAQA,IAAAA,EACL,OAAO;AAAA,IACN,MAAMA,IAAAA,EACH,OAAO;AAAA,MACN,iBAAiBA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,IAAS,CACtC,EACA,SAAA;AAAA,EAAS,CACb,EACA,SAAA;AACL,CAAC;AAEM,MAAM,YAAY,CAAC,cAA+B,SAAiB;AACxE,QAAM,SAASE,gBAAAA,UAAmB,cAAc,IAAI;AAEpD,SAAO,aAAa,MAAM,EAAE,GAAG,QAAQ,GAAG,cAAc;AAC1D;;;;;"}