@tanstack/router-plugin 1.100.0 → 1.101.2

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 (42) hide show
  1. package/dist/cjs/core/code-splitter/compilers.cjs +187 -34
  2. package/dist/cjs/core/code-splitter/compilers.cjs.map +1 -1
  3. package/dist/cjs/core/code-splitter/compilers.d.cts +14 -2
  4. package/dist/cjs/core/code-splitter/path-ids.cjs +37 -0
  5. package/dist/cjs/core/code-splitter/path-ids.cjs.map +1 -0
  6. package/dist/cjs/core/code-splitter/path-ids.d.cts +2 -0
  7. package/dist/cjs/core/config.cjs +33 -1
  8. package/dist/cjs/core/config.cjs.map +1 -1
  9. package/dist/cjs/core/config.d.cts +24 -0
  10. package/dist/cjs/core/constants.cjs +17 -2
  11. package/dist/cjs/core/constants.cjs.map +1 -1
  12. package/dist/cjs/core/constants.d.cts +5 -1
  13. package/dist/cjs/core/router-code-splitter-plugin.cjs +69 -16
  14. package/dist/cjs/core/router-code-splitter-plugin.cjs.map +1 -1
  15. package/dist/cjs/esbuild.d.cts +3 -0
  16. package/dist/cjs/rspack.d.cts +3 -0
  17. package/dist/cjs/vite.d.cts +3 -0
  18. package/dist/cjs/webpack.d.cts +3 -0
  19. package/dist/esm/core/code-splitter/compilers.d.ts +14 -2
  20. package/dist/esm/core/code-splitter/compilers.js +189 -36
  21. package/dist/esm/core/code-splitter/compilers.js.map +1 -1
  22. package/dist/esm/core/code-splitter/path-ids.d.ts +2 -0
  23. package/dist/esm/core/code-splitter/path-ids.js +37 -0
  24. package/dist/esm/core/code-splitter/path-ids.js.map +1 -0
  25. package/dist/esm/core/config.d.ts +24 -0
  26. package/dist/esm/core/config.js +34 -2
  27. package/dist/esm/core/config.js.map +1 -1
  28. package/dist/esm/core/constants.d.ts +5 -1
  29. package/dist/esm/core/constants.js +17 -2
  30. package/dist/esm/core/constants.js.map +1 -1
  31. package/dist/esm/core/router-code-splitter-plugin.js +72 -19
  32. package/dist/esm/core/router-code-splitter-plugin.js.map +1 -1
  33. package/dist/esm/esbuild.d.ts +3 -0
  34. package/dist/esm/rspack.d.ts +3 -0
  35. package/dist/esm/vite.d.ts +3 -0
  36. package/dist/esm/webpack.d.ts +3 -0
  37. package/package.json +5 -5
  38. package/src/core/code-splitter/compilers.ts +230 -46
  39. package/src/core/code-splitter/path-ids.ts +39 -0
  40. package/src/core/config.ts +63 -0
  41. package/src/core/constants.ts +18 -1
  42. package/src/core/router-code-splitter-plugin.ts +104 -20
@@ -6,6 +6,7 @@ const template = require("@babel/template");
6
6
  const babelDeadCodeElimination = require("babel-dead-code-elimination");
7
7
  const routerUtils = require("@tanstack/router-utils");
8
8
  const constants = require("../constants.cjs");
9
+ const pathIds = require("./path-ids.cjs");
9
10
  function _interopNamespaceDefault(e) {
10
11
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
11
12
  if (e) {
@@ -25,15 +26,20 @@ function _interopNamespaceDefault(e) {
25
26
  const t__namespace = /* @__PURE__ */ _interopNamespaceDefault(t);
26
27
  const template__namespace = /* @__PURE__ */ _interopNamespaceDefault(template);
27
28
  process.env.TSR_VITE_DEBUG;
28
- function addSplitSearchParamToFilename(filename) {
29
- const [bareFilename] = filename.split("?");
30
- return `${bareFilename}?${constants.splitPrefix}`;
31
- }
32
- function removeSplitSearchParamFromFilename(filename) {
33
- const [bareFilename] = filename.split("?");
34
- return bareFilename;
35
- }
36
- const SPLIT_NOES_CONFIG = /* @__PURE__ */ new Map([
29
+ const SPLIT_NODES_CONFIG = /* @__PURE__ */ new Map([
30
+ [
31
+ "loader",
32
+ {
33
+ routeIdent: "loader",
34
+ localImporterIdent: "$$splitLoaderImporter",
35
+ // const $$splitLoaderImporter = () => import('...')
36
+ splitStrategy: "normal",
37
+ localExporterIdent: "SplitLoader",
38
+ // const SplitLoader = ...
39
+ exporterIdent: "loader"
40
+ // export { SplitLoader as loader }
41
+ }
42
+ ],
37
43
  [
38
44
  "component",
39
45
  {
@@ -48,29 +54,68 @@ const SPLIT_NOES_CONFIG = /* @__PURE__ */ new Map([
48
54
  }
49
55
  ],
50
56
  [
51
- "loader",
57
+ "pendingComponent",
52
58
  {
53
- routeIdent: "loader",
54
- localImporterIdent: "$$splitLoaderImporter",
55
- // const $$splitLoaderImporter = () => import('...')
56
- splitStrategy: "normal",
57
- localExporterIdent: "SplitLoader",
58
- // const SplitLoader = ...
59
- exporterIdent: "loader"
60
- // export { SplitLoader as loader }
59
+ routeIdent: "pendingComponent",
60
+ localImporterIdent: "$$splitPendingComponentImporter",
61
+ // const $$splitPendingComponentImporter = () => import('...')
62
+ splitStrategy: "react-component",
63
+ localExporterIdent: "SplitPendingComponent",
64
+ // const SplitPendingComponent = ...
65
+ exporterIdent: "pendingComponent"
66
+ // export { SplitPendingComponent as pendingComponent }
67
+ }
68
+ ],
69
+ [
70
+ "errorComponent",
71
+ {
72
+ routeIdent: "errorComponent",
73
+ localImporterIdent: "$$splitErrorComponentImporter",
74
+ // const $$splitErrorComponentImporter = () => import('...')
75
+ splitStrategy: "react-component",
76
+ localExporterIdent: "SplitErrorComponent",
77
+ // const SplitErrorComponent = ...
78
+ exporterIdent: "errorComponent"
79
+ // export { SplitErrorComponent as errorComponent }
80
+ }
81
+ ],
82
+ [
83
+ "notFoundComponent",
84
+ {
85
+ routeIdent: "notFoundComponent",
86
+ localImporterIdent: "$$splitNotFoundComponentImporter",
87
+ // const $$splitNotFoundComponentImporter = () => import('...')
88
+ splitStrategy: "react-component",
89
+ localExporterIdent: "SplitNotFoundComponent",
90
+ // const SplitNotFoundComponent = ...
91
+ exporterIdent: "notFoundComponent"
92
+ // export { SplitNotFoundComponent as notFoundComponent }
61
93
  }
62
94
  ]
63
95
  ]);
64
- const SPLIT_ROUTE_IDENT_NODES = [...SPLIT_NOES_CONFIG.keys()];
96
+ const KNOWN_SPLIT_ROUTE_IDENTS = [...SPLIT_NODES_CONFIG.keys()];
97
+ function addSplitSearchParamToFilename(filename, grouping) {
98
+ const [bareFilename] = filename.split("?");
99
+ const params = new URLSearchParams();
100
+ params.append(constants.tsrSplit, pathIds.createIdentifier(grouping));
101
+ return `${bareFilename}?${params.toString()}`;
102
+ }
103
+ function removeSplitSearchParamFromFilename(filename) {
104
+ const [bareFilename] = filename.split("?");
105
+ return bareFilename;
106
+ }
65
107
  function compileCodeSplitReferenceRoute(opts) {
66
108
  const ast = routerUtils.parseAst(opts);
109
+ function findIndexForSplitNode(str) {
110
+ return opts.codeSplitGroupings.findIndex(
111
+ (group) => group.includes(str)
112
+ );
113
+ }
67
114
  babel.traverse(ast, {
68
115
  Program: {
69
116
  enter(programPath, programState) {
70
117
  const state = programState;
71
- const splitUrl = addSplitSearchParamToFilename(opts.filename);
72
- let existingCompImportPath = null;
73
- let existingLoaderImportPath = null;
118
+ const removableImportPaths = /* @__PURE__ */ new Set([]);
74
119
  programPath.traverse(
75
120
  {
76
121
  CallExpression: (path) => {
@@ -92,22 +137,42 @@ function compileCodeSplitReferenceRoute(opts) {
92
137
  options.properties.forEach((prop) => {
93
138
  if (t__namespace.isObjectProperty(prop)) {
94
139
  if (t__namespace.isIdentifier(prop.key)) {
140
+ const codeSplitGroupingByKey = findIndexForSplitNode(
141
+ prop.key.name
142
+ );
143
+ if (codeSplitGroupingByKey === -1) {
144
+ return;
145
+ }
146
+ const codeSplitGroup = [
147
+ ...new Set(
148
+ opts.codeSplitGroupings[codeSplitGroupingByKey]
149
+ )
150
+ ];
95
151
  const key = prop.key.name;
96
- const isNodeConfigAvailable = SPLIT_NOES_CONFIG.has(
152
+ const isNodeConfigAvailable = SPLIT_NODES_CONFIG.has(
97
153
  key
98
154
  );
99
155
  if (!isNodeConfigAvailable) {
100
156
  return;
101
157
  }
102
- const splitNodeMeta = SPLIT_NOES_CONFIG.get(key);
158
+ const splitNodeMeta = SPLIT_NODES_CONFIG.get(
159
+ key
160
+ );
161
+ const splitUrl = addSplitSearchParamToFilename(
162
+ opts.filename,
163
+ codeSplitGroup
164
+ );
103
165
  if (splitNodeMeta.splitStrategy === "react-component") {
104
166
  const value = prop.value;
105
167
  let shouldSplit = true;
106
168
  if (t__namespace.isIdentifier(value)) {
107
- existingCompImportPath = getImportSpecifierAndPathFromLocalName(
169
+ const existingImportPath = getImportSpecifierAndPathFromLocalName(
108
170
  programPath,
109
171
  value.name
110
172
  ).path;
173
+ if (existingImportPath) {
174
+ removableImportPaths.add(existingImportPath);
175
+ }
111
176
  const isExported = hasExport(ast, value);
112
177
  shouldSplit = !isExported;
113
178
  if (shouldSplit) {
@@ -144,7 +209,7 @@ function compileCodeSplitReferenceRoute(opts) {
144
209
  `lazyRouteComponent(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`
145
210
  )();
146
211
  }
147
- if (!opts.isProduction && // only in development
212
+ if (opts.runtimeEnv !== "prod" && // only in development
148
213
  !hasImportedOrDefinedIdentifier("TSRDummyComponent")) {
149
214
  programPath.pushContainer("body", [
150
215
  template__namespace.statement(
@@ -157,10 +222,13 @@ function compileCodeSplitReferenceRoute(opts) {
157
222
  const value = prop.value;
158
223
  let shouldSplit = true;
159
224
  if (t__namespace.isIdentifier(value)) {
160
- existingLoaderImportPath = getImportSpecifierAndPathFromLocalName(
225
+ const existingImportPath = getImportSpecifierAndPathFromLocalName(
161
226
  programPath,
162
227
  value.name
163
228
  ).path;
229
+ if (existingImportPath) {
230
+ removableImportPaths.add(existingImportPath);
231
+ }
164
232
  const isExported = hasExport(ast, value);
165
233
  shouldSplit = !isExported;
166
234
  if (shouldSplit) {
@@ -201,11 +269,11 @@ function compileCodeSplitReferenceRoute(opts) {
201
269
  },
202
270
  state
203
271
  );
204
- if (existingCompImportPath || existingLoaderImportPath) {
272
+ if (removableImportPaths.size > 0) {
205
273
  programPath.traverse({
206
274
  ImportDeclaration(path) {
207
275
  if (path.node.specifiers.length > 0) return;
208
- if (path.node.source.value === existingCompImportPath || path.node.source.value === existingLoaderImportPath) {
276
+ if (removableImportPaths.has(path.node.source.value)) {
209
277
  path.remove();
210
278
  }
211
279
  }
@@ -223,6 +291,7 @@ function compileCodeSplitReferenceRoute(opts) {
223
291
  }
224
292
  function compileCodeSplitVirtualRoute(opts) {
225
293
  const ast = routerUtils.parseAst(opts);
294
+ const intendedSplitNodes = new Set(opts.splitTargets);
226
295
  const knownExportedIdents = /* @__PURE__ */ new Set();
227
296
  babel.traverse(ast, {
228
297
  Program: {
@@ -230,7 +299,10 @@ function compileCodeSplitVirtualRoute(opts) {
230
299
  const state = programState;
231
300
  const trackedNodesToSplitByType = {
232
301
  component: void 0,
233
- loader: void 0
302
+ loader: void 0,
303
+ pendingComponent: void 0,
304
+ errorComponent: void 0,
305
+ notFoundComponent: void 0
234
306
  };
235
307
  programPath.traverse(
236
308
  {
@@ -249,7 +321,7 @@ function compileCodeSplitVirtualRoute(opts) {
249
321
  if (t__namespace.isObjectExpression(options)) {
250
322
  options.properties.forEach((prop) => {
251
323
  if (t__namespace.isObjectProperty(prop)) {
252
- SPLIT_ROUTE_IDENT_NODES.forEach((splitType) => {
324
+ KNOWN_SPLIT_ROUTE_IDENTS.forEach((splitType) => {
253
325
  if (!t__namespace.isIdentifier(prop.key) || prop.key.name !== splitType) {
254
326
  return;
255
327
  }
@@ -264,7 +336,7 @@ function compileCodeSplitVirtualRoute(opts) {
264
336
  if (isExported && t__namespace.isIdentifier(value)) {
265
337
  removeExports(ast, value);
266
338
  } else {
267
- const meta = SPLIT_NOES_CONFIG.get(splitType);
339
+ const meta = SPLIT_NODES_CONFIG.get(splitType);
268
340
  trackedNodesToSplitByType[splitType] = {
269
341
  node: prop.value,
270
342
  meta
@@ -280,7 +352,7 @@ function compileCodeSplitVirtualRoute(opts) {
280
352
  },
281
353
  state
282
354
  );
283
- SPLIT_ROUTE_IDENT_NODES.forEach((SPLIT_TYPE) => {
355
+ intendedSplitNodes.forEach((SPLIT_TYPE) => {
284
356
  const splitKey = trackedNodesToSplitByType[SPLIT_TYPE];
285
357
  if (!splitKey) {
286
358
  return;
@@ -379,6 +451,17 @@ function compileCodeSplitVirtualRoute(opts) {
379
451
  )
380
452
  ])
381
453
  );
454
+ } else if (t__namespace.isTSAsExpression(splitNode)) {
455
+ splitNode = splitNode.expression;
456
+ programPath.pushContainer(
457
+ "body",
458
+ t__namespace.variableDeclaration("const", [
459
+ t__namespace.variableDeclarator(
460
+ t__namespace.identifier(splitMeta.localExporterIdent),
461
+ splitNode
462
+ )
463
+ ])
464
+ );
382
465
  } else {
383
466
  console.info("Unexpected splitNode type:", splitNode);
384
467
  throw new Error(`Unexpected splitNode type ☝️: ${splitNode.type}`);
@@ -429,7 +512,7 @@ function compileCodeSplitVirtualRoute(opts) {
429
512
  - ${ident}`;
430
513
  return str;
431
514
  }, "");
432
- const warningMessage = `These exports from "${opts.filename.replace("?" + constants.splitPrefix, "")}" are not being code-split and will increase your bundle size: ${list}
515
+ const warningMessage = `These exports from "${opts.filename}" are not being code-split and will increase your bundle size: ${list}
433
516
  These should either have their export statements removed or be imported from another file that is not a route.`;
434
517
  console.warn(warningMessage);
435
518
  if (process.env.NODE_ENV !== "production") {
@@ -445,6 +528,75 @@ These should either have their export statements removed or be imported from ano
445
528
  filename: opts.filename
446
529
  });
447
530
  }
531
+ function detectCodeSplitGroupingsFromRoute(opts) {
532
+ const ast = routerUtils.parseAst(opts);
533
+ let routeId = "";
534
+ let codeSplitGroupings = void 0;
535
+ babel.traverse(ast, {
536
+ Program: {
537
+ enter(programPath) {
538
+ programPath.traverse({
539
+ CallExpression(path) {
540
+ if (!t__namespace.isIdentifier(path.node.callee)) {
541
+ return;
542
+ }
543
+ if (!(path.node.callee.name === "createRoute" || path.node.callee.name === "createFileRoute")) {
544
+ return;
545
+ }
546
+ if (t__namespace.isCallExpression(path.parentPath.node)) {
547
+ if (t__namespace.isCallExpression(path.parentPath.node.callee)) {
548
+ const callee = path.parentPath.node.callee;
549
+ if (t__namespace.isIdentifier(callee.callee)) {
550
+ const firstArg = callee.arguments[0];
551
+ if (t__namespace.isStringLiteral(firstArg)) {
552
+ routeId = firstArg.value;
553
+ }
554
+ }
555
+ }
556
+ const options = resolveIdentifier(
557
+ path,
558
+ path.parentPath.node.arguments[0]
559
+ );
560
+ if (t__namespace.isObjectExpression(options)) {
561
+ options.properties.forEach((prop) => {
562
+ if (t__namespace.isObjectProperty(prop)) {
563
+ if (t__namespace.isIdentifier(prop.key)) {
564
+ if (prop.key.name === "codeSplitGroupings") {
565
+ const value = prop.value;
566
+ if (t__namespace.isArrayExpression(value)) {
567
+ codeSplitGroupings = value.elements.map((group) => {
568
+ if (t__namespace.isArrayExpression(group)) {
569
+ return group.elements.map((node) => {
570
+ if (!t__namespace.isStringLiteral(node)) {
571
+ throw new Error(
572
+ "You must provide a string literal for the codeSplitGroupings"
573
+ );
574
+ }
575
+ return node.value;
576
+ });
577
+ }
578
+ throw new Error(
579
+ "You must provide arrays with codeSplitGroupings options."
580
+ );
581
+ });
582
+ } else {
583
+ throw new Error(
584
+ "You must provide an array of arrays for the codeSplitGroupings."
585
+ );
586
+ }
587
+ }
588
+ }
589
+ }
590
+ });
591
+ }
592
+ }
593
+ }
594
+ });
595
+ }
596
+ }
597
+ });
598
+ return { groupings: codeSplitGroupings, routeId };
599
+ }
448
600
  function getImportSpecifierAndPathFromLocalName(programPath, name) {
449
601
  let specifier = null;
450
602
  let path = null;
@@ -558,4 +710,5 @@ function removeExports(ast, node) {
558
710
  }
559
711
  exports.compileCodeSplitReferenceRoute = compileCodeSplitReferenceRoute;
560
712
  exports.compileCodeSplitVirtualRoute = compileCodeSplitVirtualRoute;
713
+ exports.detectCodeSplitGroupingsFromRoute = detectCodeSplitGroupingsFromRoute;
561
714
  //# sourceMappingURL=compilers.cjs.map
@@ -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 { deadCodeElimination } from 'babel-dead-code-elimination'\nimport { generateFromAst, parseAst } from '@tanstack/router-utils'\nimport { splitPrefix } from '../constants'\nimport type { GeneratorResult, ParseAstOptions } from '@tanstack/router-utils'\n\nconst debug = process.env.TSR_VITE_DEBUG\n\ntype SplitModulesById = Record<\n string,\n { id: string; node: t.FunctionExpression }\n>\n\ninterface State {\n filename: string\n opts: {\n minify: boolean\n root: string\n }\n imported: Record<string, boolean>\n refs: Set<any>\n serverIndex: number\n splitIndex: number\n splitModulesById: SplitModulesById\n}\n\nfunction addSplitSearchParamToFilename(filename: string) {\n const [bareFilename] = filename.split('?')\n return `${bareFilename}?${splitPrefix}`\n}\n\nfunction removeSplitSearchParamFromFilename(filename: string) {\n const [bareFilename] = filename.split('?')\n return bareFilename!\n}\n\ntype SplitRouteIdentNodes = 'component' | 'loader'\ntype SplitNodeMeta = {\n routeIdent: SplitRouteIdentNodes\n splitStrategy: 'normal' | 'react-component'\n localImporterIdent: string\n exporterIdent: string\n localExporterIdent: string\n}\nconst SPLIT_NOES_CONFIG = new Map<SplitRouteIdentNodes, SplitNodeMeta>([\n [\n 'component',\n {\n routeIdent: 'component',\n localImporterIdent: '$$splitComponentImporter', // const $$splitComponentImporter = () => import('...')\n splitStrategy: 'react-component',\n localExporterIdent: 'SplitComponent', // const SplitComponent = ...\n exporterIdent: 'component', // export { SplitComponent as component }\n },\n ],\n [\n 'loader',\n {\n routeIdent: 'loader',\n localImporterIdent: '$$splitLoaderImporter', // const $$splitLoaderImporter = () => import('...')\n splitStrategy: 'normal',\n localExporterIdent: 'SplitLoader', // const SplitLoader = ...\n exporterIdent: 'loader', // export { SplitLoader as loader }\n },\n ],\n])\nconst SPLIT_ROUTE_IDENT_NODES = [...SPLIT_NOES_CONFIG.keys()] as const\n\nexport function compileCodeSplitReferenceRoute(\n opts: ParseAstOptions & { isProduction: boolean },\n): GeneratorResult {\n const ast = parseAst(opts)\n\n babel.traverse(ast, {\n Program: {\n enter(programPath, programState) {\n const state = programState as unknown as State\n\n // We need to extract the existing search params from the filename, if any\n // and add the splitPrefix to them, then write them back to the filename\n const splitUrl = addSplitSearchParamToFilename(opts.filename)\n\n /**\n * If the component for the route is being imported from\n * another file, this is to track the path to that file\n * the path itself doesn't matter, we just need to keep\n * track of it so that we can remove it from the imports\n * list if it's not being used like:\n *\n * `import '../shared/imported'`\n */\n let existingCompImportPath: string | null = null\n let existingLoaderImportPath: string | null = null\n\n programPath.traverse(\n {\n CallExpression: (path) => {\n if (!t.isIdentifier(path.node.callee)) {\n return\n }\n\n if (\n !(\n path.node.callee.name === 'createRoute' ||\n path.node.callee.name === 'createFileRoute'\n )\n ) {\n return\n }\n\n if (t.isCallExpression(path.parentPath.node)) {\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n const hasImportedOrDefinedIdentifier = (name: string) => {\n return programPath.scope.hasBinding(name)\n }\n\n if (t.isObjectExpression(options)) {\n options.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n if (t.isIdentifier(prop.key)) {\n const key = prop.key.name\n // find key in nodeSplitConfig\n const isNodeConfigAvailable = SPLIT_NOES_CONFIG.has(\n key as any,\n )\n\n if (!isNodeConfigAvailable) {\n return\n }\n\n const splitNodeMeta = SPLIT_NOES_CONFIG.get(key as any)!\n\n if (splitNodeMeta.splitStrategy === 'react-component') {\n const value = prop.value\n\n let shouldSplit = true\n\n if (t.isIdentifier(value)) {\n existingCompImportPath =\n getImportSpecifierAndPathFromLocalName(\n programPath,\n value.name,\n ).path\n\n // exported identifiers should not be split\n // since they are already being imported\n // and need to be retained in the compiled file\n const isExported = hasExport(ast, value)\n shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (!shouldSplit) {\n 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 'lazyRouteComponent',\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `import { lazyRouteComponent } from '@tanstack/react-router'`,\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 `lazyRouteComponent(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}', () => Route.ssr)`,\n )()\n } else {\n prop.value = template.expression(\n `lazyRouteComponent(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`,\n )()\n }\n\n // If the TSRDummyComponent is not defined, define it\n if (\n !opts.isProduction && // only in development\n !hasImportedOrDefinedIdentifier('TSRDummyComponent')\n ) {\n programPath.pushContainer('body', [\n template.statement(\n `export function TSRDummyComponent() { return null }`,\n )(),\n ])\n }\n }\n\n if (splitNodeMeta.splitStrategy === 'normal') {\n const value = prop.value\n\n let shouldSplit = true\n\n if (t.isIdentifier(value)) {\n existingLoaderImportPath =\n getImportSpecifierAndPathFromLocalName(\n programPath,\n value.name,\n ).path\n\n // exported identifiers should not be split\n // since they are already being imported\n // and need to be retained in the compiled file\n const isExported = hasExport(ast, value)\n shouldSplit = !isExported\n\n if (shouldSplit) {\n removeIdentifierLiteral(path, value)\n }\n }\n\n if (!shouldSplit) {\n return\n }\n\n // Prepend the import statement to the program along with the importer function\n if (!hasImportedOrDefinedIdentifier('lazyFn')) {\n programPath.unshiftContainer(\n 'body',\n template.smart(\n `import { lazyFn } from '@tanstack/react-router'`,\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 `lazyFn(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`,\n )()\n }\n }\n }\n\n programPath.scope.crawl()\n })\n }\n }\n },\n },\n state,\n )\n\n /**\n * If the component for the route is being imported,\n * and it's not being used, remove the import statement\n * from the program, by checking that the import has no\n * specifiers\n */\n if (\n (existingCompImportPath as string | null) ||\n (existingLoaderImportPath as string | null)\n ) {\n programPath.traverse({\n ImportDeclaration(path) {\n if (path.node.specifiers.length > 0) return\n if (\n path.node.source.value === existingCompImportPath ||\n path.node.source.value === existingLoaderImportPath\n ) {\n path.remove()\n }\n },\n })\n }\n },\n },\n })\n\n deadCodeElimination(ast)\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): GeneratorResult {\n const ast = parseAst(opts)\n\n const knownExportedIdents = new Set<string>()\n\n babel.traverse(ast, {\n Program: {\n enter(programPath, programState) {\n const state = programState as unknown as State\n\n const trackedNodesToSplitByType: Record<\n SplitRouteIdentNodes,\n { node: t.Node | undefined; meta: SplitNodeMeta } | undefined\n > = {\n component: undefined,\n loader: undefined,\n }\n\n // Find the node\n programPath.traverse(\n {\n CallExpression: (path) => {\n if (!t.isIdentifier(path.node.callee)) {\n return\n }\n\n if (\n !(\n path.node.callee.name === 'createRoute' ||\n path.node.callee.name === 'createFileRoute'\n )\n ) {\n return\n }\n\n if (t.isCallExpression(path.parentPath.node)) {\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n if (t.isObjectExpression(options)) {\n options.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n SPLIT_ROUTE_IDENT_NODES.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_NOES_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 },\n state,\n )\n\n SPLIT_ROUTE_IDENT_NODES.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 {\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)\n\n // if there are exported identifiers, then we need to add a warning\n // to the file to let the user know that the exported identifiers\n // will not in the split file but in the original file, therefore\n // increasing the bundle size\n if (knownExportedIdents.size > 0) {\n const list = Array.from(knownExportedIdents).reduce((str, ident) => {\n str += `\\n- ${ident}`\n return str\n }, '')\n\n const warningMessage = `These exports from \"${opts.filename.replace('?' + splitPrefix, '')}\" are not being code-split and will increase your bundle size: ${list}\\nThese should either have their export statements removed or be imported from another file that is not a route.`\n console.warn(warningMessage)\n\n // append this warning to the file using a template\n if (process.env.NODE_ENV !== 'production') {\n const warningTemplate = template.statement(\n `console.warn(${JSON.stringify(warningMessage)})`,\n )()\n ast.program.body.unshift(warningTemplate)\n }\n }\n\n return generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\n}\n\nfunction getImportSpecifierAndPathFromLocalName(\n programPath: babel.NodePath<t.Program>,\n name: string,\n): {\n specifier:\n | t.ImportSpecifier\n | t.ImportDefaultSpecifier\n | t.ImportNamespaceSpecifier\n | null\n path: string | null\n} {\n let specifier:\n | t.ImportSpecifier\n | t.ImportDefaultSpecifier\n | t.ImportNamespaceSpecifier\n | null = null\n let path: string | null = null\n\n programPath.traverse({\n ImportDeclaration(importPath) {\n const found = importPath.node.specifiers.find(\n (targetSpecifier) => targetSpecifier.local.name === name,\n )\n if (found) {\n specifier = found\n path = importPath.node.source.value\n }\n },\n })\n\n return { specifier, path }\n}\n\n// Reusable function to get literal value or resolve variable to literal\nfunction resolveIdentifier(path: any, node: any) {\n if (t.isIdentifier(node)) {\n const binding = path.scope.getBinding(node.name)\n if (\n binding\n // && binding.kind === 'const'\n ) {\n const declarator = binding.path.node\n if (t.isObjectExpression(declarator.init)) {\n return declarator.init\n } else if (t.isFunctionDeclaration(declarator.init)) {\n return declarator.init\n }\n }\n return undefined\n }\n\n return node\n}\n\nfunction removeIdentifierLiteral(path: any, node: any) {\n if (t.isIdentifier(node)) {\n const binding = path.scope.getBinding(node.name)\n if (binding) {\n binding.path.remove()\n }\n }\n}\n\nfunction hasExport(ast: t.File, node: t.Identifier): boolean {\n let found = false\n\n babel.traverse(ast, {\n ExportNamedDeclaration(path) {\n if (path.node.declaration) {\n // declared as `const loaderFn = () => {}`\n if (t.isVariableDeclaration(path.node.declaration)) {\n path.node.declaration.declarations.forEach((decl) => {\n if (t.isVariableDeclarator(decl)) {\n if (t.isIdentifier(decl.id)) {\n if (decl.id.name === node.name) {\n found = true\n }\n }\n }\n })\n }\n\n // declared as `function loaderFn() {}`\n if (t.isFunctionDeclaration(path.node.declaration)) {\n if (t.isIdentifier(path.node.declaration.id)) {\n if (path.node.declaration.id.name === node.name) {\n found = true\n }\n }\n }\n }\n },\n ExportDefaultDeclaration(path) {\n if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n found = true\n }\n }\n },\n })\n\n return found\n}\n\nfunction removeExports(ast: t.File, node: t.Identifier): boolean {\n let removed = false\n\n babel.traverse(ast, {\n ExportNamedDeclaration(path) {\n if (path.node.declaration) {\n // declared as `const loaderFn = () => {}`\n if (t.isVariableDeclaration(path.node.declaration)) {\n path.node.declaration.declarations.forEach((decl) => {\n if (t.isVariableDeclarator(decl)) {\n if (t.isIdentifier(decl.id)) {\n if (decl.id.name === node.name) {\n path.remove()\n removed = true\n }\n }\n }\n })\n } else if (t.isFunctionDeclaration(path.node.declaration)) {\n if (t.isIdentifier(path.node.declaration.id)) {\n if (path.node.declaration.id.name === node.name) {\n path.remove()\n removed = true\n }\n }\n }\n }\n },\n ExportDefaultDeclaration(path) {\n if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n path.remove()\n removed = true\n }\n }\n },\n })\n\n return removed\n}\n"],"names":["splitPrefix","parseAst","t","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 { deadCodeElimination } from 'babel-dead-code-elimination'\nimport { generateFromAst, parseAst } from '@tanstack/router-utils'\nimport { tsrSplit } from '../constants'\nimport { createIdentifier } from './path-ids'\nimport type { GeneratorResult, ParseAstOptions } from '@tanstack/router-utils'\nimport type { CodeSplitGroupings, SplitRouteIdentNodes } from '../constants'\n\n// eslint-disable-next-line unused-imports/no-unused-vars\nconst debug = process.env.TSR_VITE_DEBUG\n\ntype SplitModulesById = Record<\n string,\n { id: string; node: t.FunctionExpression }\n>\n\ninterface State {\n filename: string\n opts: {\n minify: boolean\n root: string\n }\n imported: Record<string, boolean>\n refs: Set<any>\n serverIndex: number\n splitIndex: number\n splitModulesById: SplitModulesById\n}\n\ntype SplitNodeMeta = {\n routeIdent: SplitRouteIdentNodes\n splitStrategy: 'normal' | 'react-component'\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: 'normal',\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: 'react-component',\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: 'react-component',\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: 'react-component',\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: 'react-component',\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 },\n): GeneratorResult {\n const ast = parseAst(opts)\n\n function findIndexForSplitNode(str: string) {\n return opts.codeSplitGroupings.findIndex((group) =>\n group.includes(str as any),\n )\n }\n\n babel.traverse(ast, {\n Program: {\n enter(programPath, programState) {\n const state = programState as unknown as State\n\n /**\n * If the component for the route is being imported from\n * another file, this is to track the path to that file\n * the path itself doesn't matter, we just need to keep\n * track of it so that we can remove it from the imports\n * list if it's not being used like:\n *\n * `import '../shared/imported'`\n */\n const removableImportPaths = new Set<string>([])\n\n programPath.traverse(\n {\n CallExpression: (path) => {\n if (!t.isIdentifier(path.node.callee)) {\n return\n }\n\n if (\n !(\n path.node.callee.name === 'createRoute' ||\n path.node.callee.name === 'createFileRoute'\n )\n ) {\n return\n }\n\n if (t.isCallExpression(path.parentPath.node)) {\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n const hasImportedOrDefinedIdentifier = (name: string) => {\n return programPath.scope.hasBinding(name)\n }\n\n if (t.isObjectExpression(options)) {\n options.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n if (t.isIdentifier(prop.key)) {\n // If 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(\n key as any,\n )!\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 (splitNodeMeta.splitStrategy === 'react-component') {\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 'lazyRouteComponent',\n )\n ) {\n programPath.unshiftContainer('body', [\n template.statement(\n `import { lazyRouteComponent } from '@tanstack/react-router'`,\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 `lazyRouteComponent(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}', () => Route.ssr)`,\n )()\n } else {\n prop.value = template.expression(\n `lazyRouteComponent(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`,\n )()\n }\n\n // If the TSRDummyComponent is not defined, define it\n if (\n opts.runtimeEnv !== 'prod' && // only in development\n !hasImportedOrDefinedIdentifier('TSRDummyComponent')\n ) {\n programPath.pushContainer('body', [\n template.statement(\n `export function TSRDummyComponent() { return null }`,\n )(),\n ])\n }\n }\n\n if (splitNodeMeta.splitStrategy === 'normal') {\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('lazyFn')) {\n programPath.unshiftContainer(\n 'body',\n template.smart(\n `import { lazyFn } from '@tanstack/react-router'`,\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 `lazyFn(${splitNodeMeta.localImporterIdent}, '${splitNodeMeta.exporterIdent}')`,\n )()\n }\n }\n }\n\n programPath.scope.crawl()\n })\n }\n }\n },\n },\n state,\n )\n\n /**\n * If the component for the route is being imported,\n * and it's not being used, remove the import statement\n * from the program, by checking that the import has no\n * specifiers\n */\n if (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)\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 },\n): GeneratorResult {\n const ast = parseAst(opts)\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, programState) {\n const state = programState as unknown as State\n\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 {\n CallExpression: (path) => {\n if (!t.isIdentifier(path.node.callee)) {\n return\n }\n\n if (\n !(\n path.node.callee.name === 'createRoute' ||\n path.node.callee.name === 'createFileRoute'\n )\n ) {\n return\n }\n\n if (t.isCallExpression(path.parentPath.node)) {\n const options = resolveIdentifier(\n path,\n path.parentPath.node.arguments[0],\n )\n\n if (t.isObjectExpression(options)) {\n options.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n // 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 },\n state,\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)\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) {\n if (t.isIdentifier(node)) {\n const binding = path.scope.getBinding(node.name)\n if (\n binding\n // && binding.kind === 'const'\n ) {\n const declarator = binding.path.node\n if (t.isObjectExpression(declarator.init)) {\n return declarator.init\n } else if (t.isFunctionDeclaration(declarator.init)) {\n return declarator.init\n }\n }\n return undefined\n }\n\n return node\n}\n\nfunction removeIdentifierLiteral(path: any, node: any) {\n if (t.isIdentifier(node)) {\n const binding = path.scope.getBinding(node.name)\n if (binding) {\n binding.path.remove()\n }\n }\n}\n\nfunction hasExport(ast: t.File, node: t.Identifier): boolean {\n let found = false\n\n babel.traverse(ast, {\n ExportNamedDeclaration(path) {\n if (path.node.declaration) {\n // declared as `const loaderFn = () => {}`\n if (t.isVariableDeclaration(path.node.declaration)) {\n path.node.declaration.declarations.forEach((decl) => {\n if (t.isVariableDeclarator(decl)) {\n if (t.isIdentifier(decl.id)) {\n if (decl.id.name === node.name) {\n found = true\n }\n }\n }\n })\n }\n\n // declared as `function loaderFn() {}`\n if (t.isFunctionDeclaration(path.node.declaration)) {\n if (t.isIdentifier(path.node.declaration.id)) {\n if (path.node.declaration.id.name === node.name) {\n found = true\n }\n }\n }\n }\n },\n ExportDefaultDeclaration(path) {\n if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n found = true\n }\n }\n },\n })\n\n return found\n}\n\nfunction removeExports(ast: t.File, node: t.Identifier): boolean {\n let removed = false\n\n babel.traverse(ast, {\n ExportNamedDeclaration(path) {\n if (path.node.declaration) {\n // declared as `const loaderFn = () => {}`\n if (t.isVariableDeclaration(path.node.declaration)) {\n path.node.declaration.declarations.forEach((decl) => {\n if (t.isVariableDeclarator(decl)) {\n if (t.isIdentifier(decl.id)) {\n if (decl.id.name === node.name) {\n path.remove()\n removed = true\n }\n }\n }\n })\n } else if (t.isFunctionDeclaration(path.node.declaration)) {\n if (t.isIdentifier(path.node.declaration.id)) {\n if (path.node.declaration.id.name === node.name) {\n path.remove()\n removed = true\n }\n }\n }\n }\n },\n ExportDefaultDeclaration(path) {\n if (t.isIdentifier(path.node.declaration)) {\n if (path.node.declaration.name === node.name) {\n path.remove()\n removed = true\n }\n }\n },\n })\n\n return removed\n}\n"],"names":["tsrSplit","createIdentifier","parseAst","t","template","deadCodeElimination","generateFromAst"],"mappings":"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"}
@@ -1,5 +1,17 @@
1
1
  import { GeneratorResult, ParseAstOptions } from '@tanstack/router-utils';
2
+ import { CodeSplitGroupings, SplitRouteIdentNodes } from '../constants.cjs';
2
3
  export declare function compileCodeSplitReferenceRoute(opts: ParseAstOptions & {
3
- isProduction: boolean;
4
+ runtimeEnv: 'dev' | 'prod';
5
+ codeSplitGroupings: CodeSplitGroupings;
4
6
  }): GeneratorResult;
5
- export declare function compileCodeSplitVirtualRoute(opts: ParseAstOptions): GeneratorResult;
7
+ export declare function compileCodeSplitVirtualRoute(opts: ParseAstOptions & {
8
+ splitTargets: Array<SplitRouteIdentNodes>;
9
+ }): GeneratorResult;
10
+ /**
11
+ * This function should read get the options from by searching for the key `codeSplitGroupings`
12
+ * on createFileRoute and return it's values if it exists, else return undefined
13
+ */
14
+ export declare function detectCodeSplitGroupingsFromRoute(opts: ParseAstOptions): {
15
+ groupings: CodeSplitGroupings | undefined;
16
+ routeId: string;
17
+ };
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ function createIdentifier(strings) {
4
+ if (strings.length === 0) {
5
+ throw new Error("Cannot create an identifier from an empty array");
6
+ }
7
+ const sortedStrings = [...strings].sort();
8
+ const combinedString = sortedStrings.join("---");
9
+ let safeString = combinedString.replace(/\//g, "--slash--");
10
+ safeString = safeString.replace(/\\/g, "--backslash--");
11
+ safeString = safeString.replace(/\?/g, "--question--");
12
+ safeString = safeString.replace(/%/g, "--percent--");
13
+ safeString = safeString.replace(/#/g, "--hash--");
14
+ safeString = safeString.replace(/\+/g, "--plus--");
15
+ safeString = safeString.replace(/=/g, "--equals--");
16
+ safeString = safeString.replace(/&/g, "--ampersand--");
17
+ safeString = safeString.replace(/\s/g, "_");
18
+ return safeString;
19
+ }
20
+ function decodeIdentifier(identifier) {
21
+ if (!identifier) {
22
+ return [];
23
+ }
24
+ let combinedString = identifier.replace(/--slash--/g, "/");
25
+ combinedString = combinedString.replace(/--backslash--/g, "\\");
26
+ combinedString = combinedString.replace(/--question--/g, "?");
27
+ combinedString = combinedString.replace(/--percent--/g, "%");
28
+ combinedString = combinedString.replace(/--hash--/g, "#");
29
+ combinedString = combinedString.replace(/--plus--/g, "+");
30
+ combinedString = combinedString.replace(/--equals--/g, "=");
31
+ combinedString = combinedString.replace(/--ampersand--/g, "&");
32
+ combinedString = combinedString.replace(/_/g, " ");
33
+ return combinedString.split("---");
34
+ }
35
+ exports.createIdentifier = createIdentifier;
36
+ exports.decodeIdentifier = decodeIdentifier;
37
+ //# sourceMappingURL=path-ids.cjs.map
@@ -0,0 +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;;;"}
@@ -0,0 +1,2 @@
1
+ export declare function createIdentifier(strings: Array<string>): string;
2
+ export declare function decodeIdentifier(identifier: string): Array<string>;