@tanstack/router-generator 1.19.0 → 1.19.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -45,6 +45,7 @@ async function getRouteNodes(config) {
45
45
  });
46
46
  await Promise.all(
47
47
  dirList.map(async (dirent) => {
48
+ var _a;
48
49
  const fullPath = path.join(fullDir, dirent.name);
49
50
  const relativePath = path.join(dir, dirent.name);
50
51
  if (dirent.isDirectory()) {
@@ -66,6 +67,8 @@ async function getRouteNodes(config) {
66
67
  let isErrorComponent = routePath == null ? void 0 : routePath.endsWith("/errorComponent");
67
68
  let isPendingComponent = routePath == null ? void 0 : routePath.endsWith("/pendingComponent");
68
69
  let isLoader = routePath == null ? void 0 : routePath.endsWith("/loader");
70
+ const segments = (routePath ?? "").split("/");
71
+ let isLayout = ((_a = segments[segments.length - 1]) == null ? void 0 : _a.startsWith("_")) || false;
69
72
  [
70
73
  [isComponent, "component"],
71
74
  [isErrorComponent, "errorComponent"],
@@ -96,7 +99,8 @@ async function getRouteNodes(config) {
96
99
  isErrorComponent,
97
100
  isPendingComponent,
98
101
  isLoader,
99
- isLazy
102
+ isLazy,
103
+ isLayout
100
104
  });
101
105
  }
102
106
  })
@@ -165,52 +169,67 @@ async function generator(config) {
165
169
  let routeNodes = [];
166
170
  const handleNode = async (node) => {
167
171
  var _a, _b;
168
- const parentRoute = hasParentRoute(routeNodes, node.routePath);
172
+ let parentRoute = hasParentRoute(routeNodes, node, node.routePath);
173
+ if ((parentRoute == null ? void 0 : parentRoute.isVirtualParentRoute) && ((_a = parentRoute.children) == null ? void 0 : _a.length)) {
174
+ const possibleParentRoute = hasParentRoute(
175
+ parentRoute.children,
176
+ node,
177
+ node.routePath
178
+ );
179
+ if (possibleParentRoute) {
180
+ parentRoute = possibleParentRoute;
181
+ }
182
+ }
169
183
  if (parentRoute)
170
184
  node.parent = parentRoute;
171
- node.path = node.parent ? ((_a = node.routePath) == null ? void 0 : _a.replace(node.parent.routePath, "")) || "/" : node.routePath;
185
+ node.path = determineNodePath(node);
172
186
  const trimmedPath = utils.trimPathLeft(node.path ?? "");
173
187
  const split = (trimmedPath == null ? void 0 : trimmedPath.split("/")) ?? [];
174
188
  let first2 = split[0] ?? trimmedPath ?? "";
175
- node.isNonPath = first2.startsWith("_");
189
+ const lastRouteSegment = split[split.length - 1] ?? trimmedPath ?? "";
190
+ node.isNonPath = lastRouteSegment.startsWith("_");
176
191
  node.isNonLayout = first2.endsWith("_");
177
- node.cleanedPath = removeGroups(removeUnderscores(node.path) ?? "");
178
- const routeCode = fs__namespace.readFileSync(node.fullPath, "utf-8");
179
- const escapedRoutePath = removeTrailingUnderscores(
180
- ((_b = node.routePath) == null ? void 0 : _b.replaceAll("$", "$$")) ?? ""
192
+ node.cleanedPath = removeGroups(
193
+ removeUnderscores(removeLayoutSegments(node.path)) ?? ""
181
194
  );
182
- let replaced = routeCode;
183
- if (!routeCode) {
184
- if (node.isLazy) {
185
- replaced = [
186
- `import { createLazyFileRoute } from '@tanstack/react-router'`,
187
- `export const Route = createLazyFileRoute('${escapedRoutePath}')({
195
+ if (!node.isVirtualParentRoute) {
196
+ const routeCode = fs__namespace.readFileSync(node.fullPath, "utf-8");
197
+ const escapedRoutePath = removeTrailingUnderscores(
198
+ ((_b = node.routePath) == null ? void 0 : _b.replaceAll("$", "$$")) ?? ""
199
+ );
200
+ let replaced = routeCode;
201
+ if (!routeCode) {
202
+ if (node.isLazy) {
203
+ replaced = [
204
+ `import { createLazyFileRoute } from '@tanstack/react-router'`,
205
+ `export const Route = createLazyFileRoute('${escapedRoutePath}')({
188
206
  component: () => <div>Hello ${escapedRoutePath}!</div>
189
207
  })`
190
- ].join("\n\n");
191
- } else if (node.isRoute || !node.isComponent && !node.isErrorComponent && !node.isPendingComponent && !node.isLoader) {
192
- replaced = [
193
- `import { createFileRoute } from '@tanstack/react-router'`,
194
- `export const Route = createFileRoute('${escapedRoutePath}')({
208
+ ].join("\n\n");
209
+ } else if (node.isRoute || !node.isComponent && !node.isErrorComponent && !node.isPendingComponent && !node.isLoader) {
210
+ replaced = [
211
+ `import { createFileRoute } from '@tanstack/react-router'`,
212
+ `export const Route = createFileRoute('${escapedRoutePath}')({
195
213
  component: () => <div>Hello ${escapedRoutePath}!</div>
196
214
  })`
197
- ].join("\n\n");
215
+ ].join("\n\n");
216
+ }
217
+ } else {
218
+ replaced = routeCode.replace(
219
+ /(FileRoute\(\s*['"])([^\s]*)(['"],?\s*\))/g,
220
+ (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`
221
+ ).replace(
222
+ /(createFileRoute\(\s*['"])([^\s]*)(['"],?\s*\))/g,
223
+ (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`
224
+ ).replace(
225
+ /(createLazyFileRoute\(\s*['"])([^\s]*)(['"],?\s*\))/g,
226
+ (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`
227
+ );
228
+ }
229
+ if (replaced !== routeCode) {
230
+ logger.log(`🟡 Updating ${node.fullPath}`);
231
+ await fsp__namespace.writeFile(node.fullPath, replaced);
198
232
  }
199
- } else {
200
- replaced = routeCode.replace(
201
- /(FileRoute\(\s*['"])([^\s]*)(['"],?\s*\))/g,
202
- (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`
203
- ).replace(
204
- /(createFileRoute\(\s*['"])([^\s]*)(['"],?\s*\))/g,
205
- (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`
206
- ).replace(
207
- /(createLazyFileRoute\(\s*['"])([^\s]*)(['"],?\s*\))/g,
208
- (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`
209
- );
210
- }
211
- if (replaced !== routeCode) {
212
- logger.log(`🟡 Updating ${node.fullPath}`);
213
- await fsp__namespace.writeFile(node.fullPath, replaced);
214
233
  }
215
234
  if (!node.isVirtual && (node.isLoader || node.isComponent || node.isErrorComponent || node.isPendingComponent || node.isLazy)) {
216
235
  routePiecesByPath[node.routePath] = routePiecesByPath[node.routePath] || {};
@@ -229,9 +248,45 @@ async function generator(config) {
229
248
  }
230
249
  return;
231
250
  }
251
+ const cleanedPathIsEmpty = (node.cleanedPath || "").length === 0;
252
+ node.isVirtualParentRequired = node.isLayout ? !cleanedPathIsEmpty && !node.parent : false;
253
+ if (!node.isVirtual && node.isVirtualParentRequired) {
254
+ const parentRoutePath = removeLastSegmentFromPath(node.routePath) || "/";
255
+ const parentVariableName = routePathToVariable(parentRoutePath);
256
+ const anchorRoute = routeNodes.find(
257
+ (d) => d.routePath === parentRoutePath
258
+ );
259
+ if (!anchorRoute) {
260
+ const parentNode = {
261
+ ...node,
262
+ path: removeLastSegmentFromPath(node.path) || "/",
263
+ filePath: removeLastSegmentFromPath(node.filePath) || "/",
264
+ fullPath: removeLastSegmentFromPath(node.fullPath) || "/",
265
+ routePath: parentRoutePath,
266
+ variableName: parentVariableName,
267
+ isVirtual: true,
268
+ isLayout: false,
269
+ isVirtualParentRoute: true,
270
+ isVirtualParentRequired: false
271
+ };
272
+ parentNode.children = parentNode.children ?? [];
273
+ parentNode.children.push(node);
274
+ node.parent = parentNode;
275
+ if (node.isLayout) {
276
+ node.path = determineNodePath(node);
277
+ }
278
+ await handleNode(parentNode);
279
+ } else {
280
+ anchorRoute.children = anchorRoute.children ?? [];
281
+ anchorRoute.children.push(node);
282
+ node.parent = anchorRoute;
283
+ }
284
+ }
232
285
  if (node.parent) {
233
- node.parent.children = node.parent.children ?? [];
234
- node.parent.children.push(node);
286
+ if (!node.isVirtualParentRequired) {
287
+ node.parent.children = node.parent.children ?? [];
288
+ node.parent.children.push(node);
289
+ }
235
290
  } else {
236
291
  routeTree.push(node);
237
292
  }
@@ -240,12 +295,15 @@ async function generator(config) {
240
295
  await Promise.all(preRouteNodes.map((node) => handleNode(node)));
241
296
  async function buildRouteConfig(nodes, depth = 1) {
242
297
  const children = nodes.map(async (node) => {
243
- var _a;
298
+ var _a, _b;
244
299
  if (node.isRoot) {
245
300
  return;
246
301
  }
302
+ if (node.isLayout && !((_a = node.children) == null ? void 0 : _a.length)) {
303
+ return;
304
+ }
247
305
  const route = `${node.variableName}Route`;
248
- if ((_a = node.children) == null ? void 0 : _a.length) {
306
+ if ((_b = node.children) == null ? void 0 : _b.length) {
249
307
  const childConfigs = await buildRouteConfig(node.children, depth + 1);
250
308
  return `${route}.addChildren([${spaces(depth * 4)}${childConfigs}])`;
251
309
  }
@@ -284,7 +342,15 @@ async function generator(config) {
284
342
  }
285
343
  )
286
344
  }).filter((d) => d[1]).map((d) => d[0]);
287
- const virtualRouteNodes = sortedRouteNodes.filter((d) => d.isVirtual);
345
+ const virtualRouteNodes = sortedRouteNodes.filter((d) => d.isVirtual).reduce((acc, route) => {
346
+ const existingPreNode = preRouteNodes.filter(
347
+ (d) => d.routePath === route.routePath
348
+ );
349
+ if (existingPreNode.length === 0) {
350
+ acc.push(route);
351
+ }
352
+ return acc;
353
+ }, []);
288
354
  const rootPathIdExtension = config.addExtensions && rootRouteNode ? path.extname(rootRouteNode.filePath) : "";
289
355
  const routeImports = [
290
356
  "/* prettier-ignore-start */",
@@ -324,7 +390,13 @@ async function generator(config) {
324
390
  )}')()`;
325
391
  }).join("\n"),
326
392
  "// Create/Update Routes",
327
- sortedRouteNodes.map((node) => {
393
+ sortedRouteNodes.reduce((acc, node) => {
394
+ if (acc.find((d) => d.routePath === node.routePath)) {
395
+ return acc;
396
+ }
397
+ acc.push(node);
398
+ return acc;
399
+ }, []).map((node) => {
328
400
  var _a, _b, _c, _d, _e, _f;
329
401
  const loaderNode = (_a = routePiecesByPath[node.routePath]) == null ? void 0 : _a.loader;
330
402
  const componentNode = (_b = routePiecesByPath[node.routePath]) == null ? void 0 : _b.component;
@@ -383,10 +455,10 @@ async function generator(config) {
383
455
  `declare module '@tanstack/react-router' {
384
456
  interface FileRoutesByPath {
385
457
  ${routeNodes.map((routeNode) => {
386
- var _a, _b;
458
+ var _a, _b, _c;
387
459
  return `'${removeTrailingUnderscores(routeNode.routePath)}': {
388
460
  preLoaderRoute: typeof ${routeNode.variableName}Import
389
- parentRoute: typeof ${((_a = routeNode.parent) == null ? void 0 : _a.variableName) ? `${(_b = routeNode.parent) == null ? void 0 : _b.variableName}Import` : "rootRoute"}
461
+ parentRoute: typeof ${routeNode.isVirtualParentRequired ? `${(_a = routeNode.parent) == null ? void 0 : _a.variableName}Route` : ((_b = routeNode.parent) == null ? void 0 : _b.variableName) ? `${(_c = routeNode.parent) == null ? void 0 : _c.variableName}Import` : "rootRoute"}
390
462
  }`;
391
463
  }).join("\n")}
392
464
  }
@@ -470,7 +542,21 @@ function replaceBackslash(s) {
470
542
  function removeGroups(s) {
471
543
  return s.replaceAll(routeGroupPatternRegex, "").replaceAll("//", "/");
472
544
  }
473
- function hasParentRoute(routes, routePathToCheck) {
545
+ function determineNodePath(node) {
546
+ var _a;
547
+ return node.path = node.parent ? ((_a = node.routePath) == null ? void 0 : _a.replace(node.parent.routePath, "")) || "/" : node.routePath;
548
+ }
549
+ function removeLastSegmentFromPath(path2 = "/") {
550
+ const segments = path2.split("/");
551
+ segments.pop();
552
+ return segments.join("/");
553
+ }
554
+ function removeLayoutSegments(path2 = "/") {
555
+ const segments = path2.split("/");
556
+ const newSegments = segments.filter((segment) => !segment.startsWith("_"));
557
+ return newSegments.join("/");
558
+ }
559
+ function hasParentRoute(routes, node, routePathToCheck) {
474
560
  if (!routePathToCheck || routePathToCheck === "/") {
475
561
  return null;
476
562
  }
@@ -478,21 +564,33 @@ function hasParentRoute(routes, routePathToCheck) {
478
564
  (d) => d.routePath.length * -1,
479
565
  (d) => d.variableName
480
566
  ]).filter((d) => d.routePath !== `/${rootPathId}`);
481
- for (const route of sortedNodes) {
482
- if (route.routePath === "/")
483
- continue;
484
- if (routePathToCheck.startsWith(`${route.routePath}/`) && route.routePath !== routePathToCheck) {
485
- return route;
567
+ if (node.isLayout) {
568
+ for (const route of sortedNodes) {
569
+ if (route.routePath === "/")
570
+ continue;
571
+ const exactParentRoutePath = removeLastSegmentFromPath(node.routePath);
572
+ if (route.routePath === exactParentRoutePath) {
573
+ return route;
574
+ }
575
+ }
576
+ } else {
577
+ for (const route of sortedNodes) {
578
+ if (route.routePath === "/")
579
+ continue;
580
+ if (routePathToCheck.startsWith(`${route.routePath}/`) && route.routePath !== routePathToCheck) {
581
+ return route;
582
+ }
486
583
  }
487
584
  }
488
585
  const segments = routePathToCheck.split("/");
489
586
  segments.pop();
490
587
  const parentRoutePath = segments.join("/");
491
- return hasParentRoute(routes, parentRoutePath);
588
+ return hasParentRoute(routes, node, parentRoutePath);
492
589
  }
493
590
  exports.generator = generator;
494
591
  exports.hasParentRoute = hasParentRoute;
495
592
  exports.multiSortBy = multiSortBy;
496
593
  exports.removeExt = removeExt;
594
+ exports.removeLastSegmentFromPath = removeLastSegmentFromPath;
497
595
  exports.rootPathId = rootPathId;
498
596
  //# sourceMappingURL=generator.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"generator.cjs","sources":["../../src/generator.ts"],"sourcesContent":["import path from 'path'\nimport * as fs from 'fs'\nimport * as fsp from 'fs/promises'\nimport * as prettier from 'prettier'\nimport { Config } from './config'\nimport { cleanPath, logging, trimPathLeft } from './utils'\n\nlet latestTask = 0\nexport const rootPathId = '__root'\nconst routeGroupPatternRegex = /\\(.+\\)/g\n\nexport type RouteNode = {\n filePath: string\n fullPath: string\n variableName: string\n routePath?: string\n cleanedPath?: string\n path?: string\n isNonPath?: boolean\n isNonLayout?: boolean\n isRoute?: boolean\n isLoader?: boolean\n isComponent?: boolean\n isErrorComponent?: boolean\n isPendingComponent?: boolean\n isVirtual?: boolean\n isLazy?: boolean\n isRoot?: boolean\n children?: RouteNode[]\n parent?: RouteNode\n}\n\nasync function getRouteNodes(config: Config) {\n const { routeFilePrefix, routeFileIgnorePrefix } = config\n const logger = logging({ disabled: config.disableLogging })\n\n let routeNodes: RouteNode[] = []\n\n async function recurse(dir: string) {\n const fullDir = path.resolve(config.routesDirectory, dir)\n let dirList = await fsp.readdir(fullDir, { withFileTypes: true })\n\n dirList = dirList.filter((d) => {\n if (\n d.name.startsWith('.') ||\n (routeFileIgnorePrefix && d.name.startsWith(routeFileIgnorePrefix))\n ) {\n return false\n }\n\n if (routeFilePrefix) {\n return d.name.startsWith(routeFilePrefix)\n }\n\n return true\n })\n\n await Promise.all(\n dirList.map(async (dirent) => {\n const fullPath = path.join(fullDir, dirent.name)\n const relativePath = path.join(dir, dirent.name)\n\n if (dirent.isDirectory()) {\n await recurse(relativePath)\n } else if (fullPath.match(/\\.(tsx|ts|jsx|js)$/)) {\n const filePath = replaceBackslash(path.join(dir, dirent.name))\n const filePathNoExt = removeExt(filePath)\n let routePath =\n cleanPath(`/${filePathNoExt.split('.').join('/')}`) || ''\n\n if (routeFilePrefix) {\n routePath = routePath.replaceAll(routeFilePrefix, '')\n }\n\n const variableName = routePathToVariable(routePath)\n\n // Remove the index from the route path and\n // if the route path is empty, use `/'\n\n let isLazy = routePath?.endsWith('/lazy')\n\n if (isLazy) {\n routePath = routePath?.replace(/\\/lazy$/, '')\n }\n\n let isRoute = routePath?.endsWith('/route')\n let isComponent = routePath?.endsWith('/component')\n let isErrorComponent = routePath?.endsWith('/errorComponent')\n let isPendingComponent = routePath?.endsWith('/pendingComponent')\n let isLoader = routePath?.endsWith('/loader')\n\n ;(\n [\n [isComponent, 'component'],\n [isErrorComponent, 'errorComponent'],\n [isPendingComponent, 'pendingComponent'],\n [isLoader, 'loader'],\n ] as const\n ).forEach(([isType, type]) => {\n if (isType) {\n logger.warn(\n `WARNING: The \\`.${type}.tsx\\` suffix used for the ${filePath} file is deprecated. Use the new \\`.lazy.tsx\\` suffix instead.`,\n )\n }\n })\n\n routePath = routePath?.replace(\n /\\/(component|errorComponent|pendingComponent|loader|route|lazy)$/,\n '',\n )\n\n if (routePath === 'index') {\n routePath = '/'\n }\n\n routePath = routePath.replace(/\\/index$/, '/') || '/'\n\n routeNodes.push({\n filePath,\n fullPath,\n routePath,\n variableName,\n isRoute,\n isComponent,\n isErrorComponent,\n isPendingComponent,\n isLoader,\n isLazy,\n })\n }\n }),\n )\n\n return routeNodes\n }\n\n await recurse('./')\n\n return routeNodes\n}\n\nlet first = false\nlet skipMessage = false\n\ntype RouteSubNode = {\n component?: RouteNode\n errorComponent?: RouteNode\n pendingComponent?: RouteNode\n loader?: RouteNode\n lazy?: RouteNode\n}\n\nexport async function generator(config: Config) {\n const logger = logging({ disabled: config.disableLogging })\n logger.log('')\n\n if (!first) {\n logger.log('♻️ Generating routes...')\n first = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n logger.log('♻️ Regenerating routes...')\n }\n\n const taskId = latestTask + 1\n latestTask = taskId\n\n const checkLatest = () => {\n if (latestTask !== taskId) {\n skipMessage = true\n return false\n }\n\n return true\n }\n\n const start = Date.now()\n const routePathIdPrefix = config.routeFilePrefix ?? ''\n const beforeRouteNodes = await getRouteNodes(config)\n const rootRouteNode = beforeRouteNodes.find(\n (d) => d.routePath === `/${rootPathId}`,\n )\n\n const preRouteNodes = multiSortBy(beforeRouteNodes, [\n (d) => (d.routePath === '/' ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.filePath?.match(/[./]index[.]/) ? 1 : -1),\n (d) =>\n d.filePath?.match(\n /[./](component|errorComponent|pendingComponent|loader|lazy)[.]/,\n )\n ? 1\n : -1,\n (d) => (d.filePath?.match(/[./]route[.]/) ? -1 : 1),\n (d) => (d.routePath?.endsWith('/') ? -1 : 1),\n (d) => d.routePath,\n ]).filter((d) => ![`/${rootPathId}`].includes(d.routePath || ''))\n\n const routeTree: RouteNode[] = []\n const routePiecesByPath: Record<string, RouteSubNode> = {}\n\n // Loop over the flat list of routeNodes and\n // build up a tree based on the routeNodes' routePath\n let routeNodes: RouteNode[] = []\n\n const handleNode = async (node: RouteNode) => {\n const parentRoute = hasParentRoute(routeNodes, node.routePath)\n if (parentRoute) node.parent = parentRoute\n\n node.path = node.parent\n ? node.routePath?.replace(node.parent.routePath!, '') || '/'\n : node.routePath\n\n const trimmedPath = trimPathLeft(node.path ?? '')\n\n const split = trimmedPath?.split('/') ?? []\n let first = split[0] ?? trimmedPath ?? ''\n\n node.isNonPath = first.startsWith('_')\n node.isNonLayout = first.endsWith('_')\n node.cleanedPath = removeGroups(removeUnderscores(node.path) ?? '')\n\n // Ensure the boilerplate for the route exists\n const routeCode = fs.readFileSync(node.fullPath, 'utf-8')\n\n const escapedRoutePath = removeTrailingUnderscores(\n node.routePath?.replaceAll('$', '$$') ?? '',\n )\n\n let replaced = routeCode\n\n if (!routeCode) {\n if (node.isLazy) {\n replaced = [\n `import { createLazyFileRoute } from '@tanstack/react-router'`,\n `export const Route = createLazyFileRoute('${escapedRoutePath}')({\n component: () => <div>Hello ${escapedRoutePath}!</div>\n})`,\n ].join('\\n\\n')\n } else if (\n node.isRoute ||\n (!node.isComponent &&\n !node.isErrorComponent &&\n !node.isPendingComponent &&\n !node.isLoader)\n ) {\n replaced = [\n `import { createFileRoute } from '@tanstack/react-router'`,\n `export const Route = createFileRoute('${escapedRoutePath}')({\n component: () => <div>Hello ${escapedRoutePath}!</div>\n})`,\n ].join('\\n\\n')\n }\n } else {\n replaced = routeCode\n .replace(\n /(FileRoute\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`,\n )\n .replace(\n /(createFileRoute\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`,\n )\n .replace(\n /(createLazyFileRoute\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`,\n )\n }\n\n if (replaced !== routeCode) {\n logger.log(`🟡 Updating ${node.fullPath}`)\n await fsp.writeFile(node.fullPath, replaced)\n }\n\n if (\n !node.isVirtual &&\n (node.isLoader ||\n node.isComponent ||\n node.isErrorComponent ||\n node.isPendingComponent ||\n node.isLazy)\n ) {\n routePiecesByPath[node.routePath!] =\n routePiecesByPath[node.routePath!] || {}\n\n routePiecesByPath[node.routePath!]![\n node.isLazy\n ? 'lazy'\n : node.isLoader\n ? 'loader'\n : node.isErrorComponent\n ? 'errorComponent'\n : node.isPendingComponent\n ? 'pendingComponent'\n : 'component'\n ] = node\n\n const anchorRoute = routeNodes.find((d) => d.routePath === node.routePath)\n\n if (!anchorRoute) {\n await handleNode({\n ...node,\n isVirtual: true,\n isLazy: false,\n isLoader: false,\n isComponent: false,\n isErrorComponent: false,\n isPendingComponent: false,\n })\n }\n return\n }\n\n if (node.parent) {\n node.parent.children = node.parent.children ?? []\n node.parent.children.push(node)\n } else {\n routeTree.push(node)\n }\n\n routeNodes.push(node)\n }\n\n await Promise.all(preRouteNodes.map((node) => handleNode(node)))\n\n async function buildRouteConfig(\n nodes: RouteNode[],\n depth = 1,\n ): Promise<string> {\n const children = nodes.map(async (node) => {\n if (node.isRoot) {\n return\n }\n\n const route = `${node.variableName}Route`\n\n if (node.children?.length) {\n const childConfigs = await buildRouteConfig(node.children, depth + 1)\n return `${route}.addChildren([${spaces(depth * 4)}${childConfigs}])`\n }\n\n return route\n })\n\n return (await Promise.all(children)).filter(Boolean).join(`,`)\n }\n\n const routeConfigChildrenText = await buildRouteConfig(routeTree)\n\n const sortedRouteNodes = multiSortBy(routeNodes, [\n (d) => (d.routePath?.includes(`/${rootPathId}`) ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.routePath?.endsWith(\"index'\") ? -1 : 1),\n (d) => d,\n ])\n\n const imports = Object.entries({\n createFileRoute: sortedRouteNodes.some((d) => d.isVirtual),\n lazyFn: sortedRouteNodes.some(\n (node) => routePiecesByPath[node.routePath!]?.loader,\n ),\n lazyRouteComponent: sortedRouteNodes.some(\n (node) =>\n routePiecesByPath[node.routePath!]?.component ||\n routePiecesByPath[node.routePath!]?.errorComponent ||\n routePiecesByPath[node.routePath!]?.pendingComponent,\n ),\n })\n .filter((d) => d[1])\n .map((d) => d[0])\n\n const virtualRouteNodes = sortedRouteNodes.filter((d) => d.isVirtual)\n\n const rootPathIdExtension =\n config.addExtensions && rootRouteNode\n ? path.extname(rootRouteNode.filePath)\n : ''\n\n const routeImports = [\n '/* prettier-ignore-start */',\n '/* eslint-disable */',\n '// @ts-nocheck',\n '// noinspection JSUnusedGlobalSymbols',\n '// This file is auto-generated by TanStack Router',\n imports.length\n ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\\n`\n : '',\n '// Import Routes',\n [\n `import { Route as rootRoute } from './${replaceBackslash(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(\n config.routesDirectory,\n `${routePathIdPrefix}${rootPathId}${rootPathIdExtension}`,\n ),\n ),\n )}'`,\n ...sortedRouteNodes\n .filter((d) => !d.isVirtual)\n .map((node) => {\n return `import { Route as ${\n node.variableName\n }Import } from './${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n config.addExtensions,\n ),\n )}'`\n }),\n ].join('\\n'),\n virtualRouteNodes.length ? '// Create Virtual Routes' : '',\n virtualRouteNodes\n .map((node) => {\n return `const ${\n node.variableName\n }Import = createFileRoute('${removeTrailingUnderscores(\n node.routePath,\n )}')()`\n })\n .join('\\n'),\n '// Create/Update Routes',\n sortedRouteNodes\n .map((node) => {\n const loaderNode = routePiecesByPath[node.routePath!]?.loader\n const componentNode = routePiecesByPath[node.routePath!]?.component\n const errorComponentNode =\n routePiecesByPath[node.routePath!]?.errorComponent\n const pendingComponentNode =\n routePiecesByPath[node.routePath!]?.pendingComponent\n const lazyComponentNode = routePiecesByPath[node.routePath!]?.lazy\n\n return [\n `const ${node.variableName}Route = ${node.variableName}Import.update({\n ${[\n node.isNonPath\n ? `id: '${node.path}'`\n : `path: '${node.cleanedPath}'`,\n `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`,\n ]\n .filter(Boolean)\n .join(',')}\n }${config.disableTypes ? '' : 'as any'})`,\n loaderNode\n ? `.updateLoader({ loader: lazyFn(() => import('./${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, loaderNode.filePath),\n ),\n config.addExtensions,\n ),\n )}'), 'loader') })`\n : '',\n componentNode || errorComponentNode || pendingComponentNode\n ? `.update({\n ${(\n [\n ['component', componentNode],\n ['errorComponent', errorComponentNode],\n ['pendingComponent', pendingComponentNode],\n ] as const\n )\n .filter((d) => d[1])\n .map((d) => {\n return `${\n d[0]\n }: lazyRouteComponent(() => import('./${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, d[1]!.filePath),\n ),\n config.addExtensions,\n ),\n )}'), '${d[0]}')`\n })\n .join('\\n,')}\n })`\n : '',\n lazyComponentNode\n ? `.lazy(() => import('./${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(\n config.routesDirectory,\n lazyComponentNode!.filePath,\n ),\n ),\n config.addExtensions,\n ),\n )}').then((d) => d.Route))`\n : '',\n ].join('')\n })\n .join('\\n\\n'),\n ...(config.disableTypes\n ? []\n : [\n '// Populate the FileRoutesByPath interface',\n `declare module '@tanstack/react-router' {\n interface FileRoutesByPath {\n ${routeNodes\n .map((routeNode) => {\n return `'${removeTrailingUnderscores(routeNode.routePath)}': {\n preLoaderRoute: typeof ${routeNode.variableName}Import\n parentRoute: typeof ${\n routeNode.parent?.variableName\n ? `${routeNode.parent?.variableName}Import`\n : 'rootRoute'\n }\n }`\n })\n .join('\\n')}\n }\n}`,\n ]),\n '// Create and export the route tree',\n `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`,\n '/* prettier-ignore-end */',\n ]\n .filter(Boolean)\n .join('\\n\\n')\n\n const routeConfigFileContent = await prettier.format(routeImports, {\n semi: false,\n singleQuote: config.quoteStyle === 'single',\n parser: 'typescript',\n })\n\n const routeTreeContent = await fsp\n .readFile(path.resolve(config.generatedRouteTree), 'utf-8')\n .catch((err: any) => {\n if (err.code === 'ENOENT') {\n return undefined\n }\n throw err\n })\n\n if (!checkLatest()) return\n\n if (routeTreeContent !== routeConfigFileContent) {\n await fsp.mkdir(path.dirname(path.resolve(config.generatedRouteTree)), {\n recursive: true,\n })\n if (!checkLatest()) return\n await fsp.writeFile(\n path.resolve(config.generatedRouteTree),\n routeConfigFileContent,\n )\n }\n\n logger.log(\n `✅ Processed ${routeNodes.length === 1 ? 'route' : 'routes'} in ${\n Date.now() - start\n }ms`,\n )\n}\n\nfunction routePathToVariable(d: string): string {\n return (\n removeUnderscores(d)\n ?.replace(/\\/\\$\\//g, '/splat/')\n ?.replace(/\\$$/g, 'splat')\n ?.replace(/\\$/g, '')\n ?.split(/[/-]/g)\n .map((d, i) => (i > 0 ? capitalize(d) : d))\n .join('')\n .replace(/([^a-zA-Z0-9]|[\\.])/gm, '')\n .replace(/^(\\d)/g, 'R$1') ?? ''\n )\n}\n\nexport function removeExt(d: string, keepExtension: boolean = false) {\n return keepExtension ? d : d.substring(0, d.lastIndexOf('.')) || d\n}\n\nfunction spaces(d: number): string {\n return Array.from({ length: d })\n .map(() => ' ')\n .join('')\n}\n\nexport function multiSortBy<T>(\n arr: T[],\n accessors: ((item: T) => any)[] = [(d) => d],\n): T[] {\n return arr\n .map((d, i) => [d, i] as const)\n .sort(([a, ai], [b, bi]) => {\n for (const accessor of accessors) {\n const ao = accessor(a)\n const bo = accessor(b)\n\n if (typeof ao === 'undefined') {\n if (typeof bo === 'undefined') {\n continue\n }\n return 1\n }\n\n if (ao === bo) {\n continue\n }\n\n return ao > bo ? 1 : -1\n }\n\n return ai - bi\n })\n .map(([d]) => d)\n}\n\nfunction capitalize(s: string) {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nfunction removeUnderscores(s?: string) {\n return s?.replaceAll(/(^_|_$)/gi, '').replaceAll(/(\\/_|_\\/)/gi, '/')\n}\n\nfunction removeTrailingUnderscores(s?: string) {\n return s?.replaceAll(/(_$)/gi, '').replaceAll(/(_\\/)/gi, '/')\n}\n\nfunction replaceBackslash(s: string) {\n return s.replaceAll(/\\\\/gi, '/')\n}\n\nfunction removeGroups(s: string) {\n return s.replaceAll(routeGroupPatternRegex, '').replaceAll('//', '/')\n}\n\nexport function hasParentRoute(\n routes: RouteNode[],\n routePathToCheck: string | undefined,\n): RouteNode | null {\n if (!routePathToCheck || routePathToCheck === '/') {\n return null\n }\n\n const sortedNodes = multiSortBy(routes, [\n (d) => d.routePath!.length * -1,\n (d) => d.variableName,\n ]).filter((d) => d.routePath !== `/${rootPathId}`)\n\n for (const route of sortedNodes) {\n if (route.routePath === '/') continue\n\n if (\n routePathToCheck.startsWith(`${route.routePath}/`) &&\n route.routePath !== routePathToCheck\n ) {\n return route\n }\n }\n const segments = routePathToCheck.split('/')\n segments.pop() // Remove the last segment\n const parentRoutePath = segments.join('/')\n\n return hasParentRoute(routes, parentRoutePath)\n}\n"],"names":["logging","fsp","cleanPath","trimPathLeft","first","fs","prettier","d"],"mappings":"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"}
1
+ {"version":3,"file":"generator.cjs","sources":["../../src/generator.ts"],"sourcesContent":["import path from 'path'\nimport * as fs from 'fs'\nimport * as fsp from 'fs/promises'\nimport * as prettier from 'prettier'\nimport { Config } from './config'\nimport { cleanPath, logging, trimPathLeft } from './utils'\n\nlet latestTask = 0\nexport const rootPathId = '__root'\nconst routeGroupPatternRegex = /\\(.+\\)/g\n\nexport type RouteNode = {\n filePath: string\n fullPath: string\n variableName: string\n routePath?: string\n cleanedPath?: string\n path?: string\n isNonPath?: boolean\n isNonLayout?: boolean\n isLayout?: boolean\n isVirtualParentRequired?: boolean\n isVirtualParentRoute?: boolean\n isRoute?: boolean\n isLoader?: boolean\n isComponent?: boolean\n isErrorComponent?: boolean\n isPendingComponent?: boolean\n isVirtual?: boolean\n isLazy?: boolean\n isRoot?: boolean\n children?: RouteNode[]\n parent?: RouteNode\n}\n\nasync function getRouteNodes(config: Config) {\n const { routeFilePrefix, routeFileIgnorePrefix } = config\n const logger = logging({ disabled: config.disableLogging })\n\n let routeNodes: RouteNode[] = []\n\n async function recurse(dir: string) {\n const fullDir = path.resolve(config.routesDirectory, dir)\n let dirList = await fsp.readdir(fullDir, { withFileTypes: true })\n\n dirList = dirList.filter((d) => {\n if (\n d.name.startsWith('.') ||\n (routeFileIgnorePrefix && d.name.startsWith(routeFileIgnorePrefix))\n ) {\n return false\n }\n\n if (routeFilePrefix) {\n return d.name.startsWith(routeFilePrefix)\n }\n\n return true\n })\n\n await Promise.all(\n dirList.map(async (dirent) => {\n const fullPath = path.join(fullDir, dirent.name)\n const relativePath = path.join(dir, dirent.name)\n\n if (dirent.isDirectory()) {\n await recurse(relativePath)\n } else if (fullPath.match(/\\.(tsx|ts|jsx|js)$/)) {\n const filePath = replaceBackslash(path.join(dir, dirent.name))\n const filePathNoExt = removeExt(filePath)\n let routePath =\n cleanPath(`/${filePathNoExt.split('.').join('/')}`) || ''\n\n if (routeFilePrefix) {\n routePath = routePath.replaceAll(routeFilePrefix, '')\n }\n\n const variableName = routePathToVariable(routePath)\n\n // Remove the index from the route path and\n // if the route path is empty, use `/'\n\n let isLazy = routePath?.endsWith('/lazy')\n\n if (isLazy) {\n routePath = routePath?.replace(/\\/lazy$/, '')\n }\n\n let isRoute = routePath?.endsWith('/route')\n let isComponent = routePath?.endsWith('/component')\n let isErrorComponent = routePath?.endsWith('/errorComponent')\n let isPendingComponent = routePath?.endsWith('/pendingComponent')\n let isLoader = routePath?.endsWith('/loader')\n\n const segments = (routePath ?? '').split('/')\n let isLayout = segments[segments.length - 1]?.startsWith('_') || false\n\n ;(\n [\n [isComponent, 'component'],\n [isErrorComponent, 'errorComponent'],\n [isPendingComponent, 'pendingComponent'],\n [isLoader, 'loader'],\n ] as const\n ).forEach(([isType, type]) => {\n if (isType) {\n logger.warn(\n `WARNING: The \\`.${type}.tsx\\` suffix used for the ${filePath} file is deprecated. Use the new \\`.lazy.tsx\\` suffix instead.`,\n )\n }\n })\n\n routePath = routePath?.replace(\n /\\/(component|errorComponent|pendingComponent|loader|route|lazy)$/,\n '',\n )\n\n if (routePath === 'index') {\n routePath = '/'\n }\n\n routePath = routePath.replace(/\\/index$/, '/') || '/'\n\n routeNodes.push({\n filePath,\n fullPath,\n routePath,\n variableName,\n isRoute,\n isComponent,\n isErrorComponent,\n isPendingComponent,\n isLoader,\n isLazy,\n isLayout,\n })\n }\n }),\n )\n\n return routeNodes\n }\n\n await recurse('./')\n\n return routeNodes\n}\n\nlet first = false\nlet skipMessage = false\n\ntype RouteSubNode = {\n component?: RouteNode\n errorComponent?: RouteNode\n pendingComponent?: RouteNode\n loader?: RouteNode\n lazy?: RouteNode\n}\n\nexport async function generator(config: Config) {\n const logger = logging({ disabled: config.disableLogging })\n logger.log('')\n\n if (!first) {\n logger.log('♻️ Generating routes...')\n first = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n logger.log('♻️ Regenerating routes...')\n }\n\n const taskId = latestTask + 1\n latestTask = taskId\n\n const checkLatest = () => {\n if (latestTask !== taskId) {\n skipMessage = true\n return false\n }\n\n return true\n }\n\n const start = Date.now()\n const routePathIdPrefix = config.routeFilePrefix ?? ''\n const beforeRouteNodes = await getRouteNodes(config)\n const rootRouteNode = beforeRouteNodes.find(\n (d) => d.routePath === `/${rootPathId}`,\n )\n\n const preRouteNodes = multiSortBy(beforeRouteNodes, [\n (d) => (d.routePath === '/' ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.filePath?.match(/[./]index[.]/) ? 1 : -1),\n (d) =>\n d.filePath?.match(\n /[./](component|errorComponent|pendingComponent|loader|lazy)[.]/,\n )\n ? 1\n : -1,\n (d) => (d.filePath?.match(/[./]route[.]/) ? -1 : 1),\n (d) => (d.routePath?.endsWith('/') ? -1 : 1),\n (d) => d.routePath,\n ]).filter((d) => ![`/${rootPathId}`].includes(d.routePath || ''))\n\n const routeTree: RouteNode[] = []\n const routePiecesByPath: Record<string, RouteSubNode> = {}\n\n // Loop over the flat list of routeNodes and\n // build up a tree based on the routeNodes' routePath\n let routeNodes: RouteNode[] = []\n\n const handleNode = async (node: RouteNode) => {\n let parentRoute = hasParentRoute(routeNodes, node, node.routePath)\n\n // if the parent route is a virtual parent route, we need to find the real parent route\n if (parentRoute?.isVirtualParentRoute && parentRoute.children?.length) {\n // only if this sub-parent route returns a valid parent route, we use it, if not leave it as it\n const possibleParentRoute = hasParentRoute(\n parentRoute.children,\n node,\n node.routePath,\n )\n if (possibleParentRoute) {\n parentRoute = possibleParentRoute\n }\n }\n\n if (parentRoute) node.parent = parentRoute\n\n node.path = determineNodePath(node)\n\n const trimmedPath = trimPathLeft(node.path ?? '')\n\n const split = trimmedPath?.split('/') ?? []\n let first = split[0] ?? trimmedPath ?? ''\n const lastRouteSegment = split[split.length - 1] ?? trimmedPath ?? ''\n\n node.isNonPath = lastRouteSegment.startsWith('_')\n node.isNonLayout = first.endsWith('_')\n\n node.cleanedPath = removeGroups(\n removeUnderscores(removeLayoutSegments(node.path)) ?? '',\n )\n\n // Ensure the boilerplate for the route exists, which can be skipped for virtual parent routes\n if (!node.isVirtualParentRoute) {\n const routeCode = fs.readFileSync(node.fullPath, 'utf-8')\n\n const escapedRoutePath = removeTrailingUnderscores(\n node.routePath?.replaceAll('$', '$$') ?? '',\n )\n\n let replaced = routeCode\n\n if (!routeCode) {\n if (node.isLazy) {\n replaced = [\n `import { createLazyFileRoute } from '@tanstack/react-router'`,\n `export const Route = createLazyFileRoute('${escapedRoutePath}')({\n component: () => <div>Hello ${escapedRoutePath}!</div>\n})`,\n ].join('\\n\\n')\n } else if (\n node.isRoute ||\n (!node.isComponent &&\n !node.isErrorComponent &&\n !node.isPendingComponent &&\n !node.isLoader)\n ) {\n replaced = [\n `import { createFileRoute } from '@tanstack/react-router'`,\n `export const Route = createFileRoute('${escapedRoutePath}')({\n component: () => <div>Hello ${escapedRoutePath}!</div>\n})`,\n ].join('\\n\\n')\n }\n } else {\n replaced = routeCode\n .replace(\n /(FileRoute\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`,\n )\n .replace(\n /(createFileRoute\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`,\n )\n .replace(\n /(createLazyFileRoute\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`,\n )\n }\n\n if (replaced !== routeCode) {\n logger.log(`🟡 Updating ${node.fullPath}`)\n await fsp.writeFile(node.fullPath, replaced)\n }\n }\n\n if (\n !node.isVirtual &&\n (node.isLoader ||\n node.isComponent ||\n node.isErrorComponent ||\n node.isPendingComponent ||\n node.isLazy)\n ) {\n routePiecesByPath[node.routePath!] =\n routePiecesByPath[node.routePath!] || {}\n\n routePiecesByPath[node.routePath!]![\n node.isLazy\n ? 'lazy'\n : node.isLoader\n ? 'loader'\n : node.isErrorComponent\n ? 'errorComponent'\n : node.isPendingComponent\n ? 'pendingComponent'\n : 'component'\n ] = node\n\n const anchorRoute = routeNodes.find((d) => d.routePath === node.routePath)\n\n if (!anchorRoute) {\n await handleNode({\n ...node,\n isVirtual: true,\n isLazy: false,\n isLoader: false,\n isComponent: false,\n isErrorComponent: false,\n isPendingComponent: false,\n })\n }\n return\n }\n\n const cleanedPathIsEmpty = (node.cleanedPath || '').length === 0\n\n node.isVirtualParentRequired = node.isLayout\n ? !cleanedPathIsEmpty && !node.parent\n : false\n\n if (!node.isVirtual && node.isVirtualParentRequired) {\n const parentRoutePath = removeLastSegmentFromPath(node.routePath) || '/'\n const parentVariableName = routePathToVariable(parentRoutePath)\n\n const anchorRoute = routeNodes.find(\n (d) => d.routePath === parentRoutePath,\n )\n\n if (!anchorRoute) {\n const parentNode = {\n ...node,\n path: removeLastSegmentFromPath(node.path) || '/',\n filePath: removeLastSegmentFromPath(node.filePath) || '/',\n fullPath: removeLastSegmentFromPath(node.fullPath) || '/',\n routePath: parentRoutePath,\n variableName: parentVariableName,\n isVirtual: true,\n isLayout: false,\n isVirtualParentRoute: true,\n isVirtualParentRequired: false,\n }\n\n parentNode.children = parentNode.children ?? []\n parentNode.children.push(node)\n\n node.parent = parentNode\n\n if (node.isLayout) {\n // since `node.path` is used as the `id` on the route definition, we need to update it\n node.path = determineNodePath(node)\n }\n\n await handleNode(parentNode)\n } else {\n anchorRoute.children = anchorRoute.children ?? []\n anchorRoute.children.push(node)\n\n node.parent = anchorRoute\n }\n }\n\n if (node.parent) {\n if (!node.isVirtualParentRequired) {\n node.parent.children = node.parent.children ?? []\n node.parent.children.push(node)\n }\n } else {\n routeTree.push(node)\n }\n\n routeNodes.push(node)\n }\n\n await Promise.all(preRouteNodes.map((node) => handleNode(node)))\n\n async function buildRouteConfig(\n nodes: RouteNode[],\n depth = 1,\n ): Promise<string> {\n const children = nodes.map(async (node) => {\n if (node.isRoot) {\n return\n }\n\n if (node.isLayout && !node.children?.length) {\n return\n }\n\n const route = `${node.variableName}Route`\n\n if (node.children?.length) {\n const childConfigs = await buildRouteConfig(node.children, depth + 1)\n return `${route}.addChildren([${spaces(depth * 4)}${childConfigs}])`\n }\n\n return route\n })\n\n return (await Promise.all(children)).filter(Boolean).join(`,`)\n }\n\n const routeConfigChildrenText = await buildRouteConfig(routeTree)\n\n const sortedRouteNodes = multiSortBy(routeNodes, [\n (d) => (d.routePath?.includes(`/${rootPathId}`) ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.routePath?.endsWith(\"index'\") ? -1 : 1),\n (d) => d,\n ])\n\n const imports = Object.entries({\n createFileRoute: sortedRouteNodes.some((d) => d.isVirtual),\n lazyFn: sortedRouteNodes.some(\n (node) => routePiecesByPath[node.routePath!]?.loader,\n ),\n lazyRouteComponent: sortedRouteNodes.some(\n (node) =>\n routePiecesByPath[node.routePath!]?.component ||\n routePiecesByPath[node.routePath!]?.errorComponent ||\n routePiecesByPath[node.routePath!]?.pendingComponent,\n ),\n })\n .filter((d) => d[1])\n .map((d) => d[0])\n\n const virtualRouteNodes = sortedRouteNodes\n .filter((d) => d.isVirtual)\n .reduce((acc, route) => {\n // ensuring we don't have any duplicated virtual routes or clashes with pre-existing routes\n const existingPreNode = preRouteNodes.filter(\n (d) => d.routePath === route.routePath,\n )\n\n if (existingPreNode.length === 0) {\n acc.push(route)\n }\n\n return acc\n }, [] as RouteNode[])\n\n const rootPathIdExtension =\n config.addExtensions && rootRouteNode\n ? path.extname(rootRouteNode.filePath)\n : ''\n\n const routeImports = [\n '/* prettier-ignore-start */',\n '/* eslint-disable */',\n '// @ts-nocheck',\n '// noinspection JSUnusedGlobalSymbols',\n '// This file is auto-generated by TanStack Router',\n imports.length\n ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\\n`\n : '',\n '// Import Routes',\n [\n `import { Route as rootRoute } from './${replaceBackslash(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(\n config.routesDirectory,\n `${routePathIdPrefix}${rootPathId}${rootPathIdExtension}`,\n ),\n ),\n )}'`,\n ...sortedRouteNodes\n .filter((d) => !d.isVirtual)\n .map((node) => {\n return `import { Route as ${\n node.variableName\n }Import } from './${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n config.addExtensions,\n ),\n )}'`\n }),\n ].join('\\n'),\n virtualRouteNodes.length ? '// Create Virtual Routes' : '',\n virtualRouteNodes\n .map((node) => {\n return `const ${\n node.variableName\n }Import = createFileRoute('${removeTrailingUnderscores(\n node.routePath,\n )}')()`\n })\n .join('\\n'),\n '// Create/Update Routes',\n sortedRouteNodes\n .reduce((acc, node) => {\n // ensuring we update a unique route only once\n if (acc.find((d) => d.routePath === node.routePath)) {\n return acc\n }\n acc.push(node)\n return acc\n }, [] as RouteNode[])\n .map((node) => {\n const loaderNode = routePiecesByPath[node.routePath!]?.loader\n const componentNode = routePiecesByPath[node.routePath!]?.component\n const errorComponentNode =\n routePiecesByPath[node.routePath!]?.errorComponent\n const pendingComponentNode =\n routePiecesByPath[node.routePath!]?.pendingComponent\n const lazyComponentNode = routePiecesByPath[node.routePath!]?.lazy\n\n return [\n `const ${node.variableName}Route = ${node.variableName}Import.update({\n ${[\n node.isNonPath\n ? `id: '${node.path}'`\n : `path: '${node.cleanedPath}'`,\n `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`,\n ]\n .filter(Boolean)\n .join(',')}\n }${config.disableTypes ? '' : 'as any'})`,\n loaderNode\n ? `.updateLoader({ loader: lazyFn(() => import('./${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, loaderNode.filePath),\n ),\n config.addExtensions,\n ),\n )}'), 'loader') })`\n : '',\n componentNode || errorComponentNode || pendingComponentNode\n ? `.update({\n ${(\n [\n ['component', componentNode],\n ['errorComponent', errorComponentNode],\n ['pendingComponent', pendingComponentNode],\n ] as const\n )\n .filter((d) => d[1])\n .map((d) => {\n return `${\n d[0]\n }: lazyRouteComponent(() => import('./${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, d[1]!.filePath),\n ),\n config.addExtensions,\n ),\n )}'), '${d[0]}')`\n })\n .join('\\n,')}\n })`\n : '',\n lazyComponentNode\n ? `.lazy(() => import('./${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(\n config.routesDirectory,\n lazyComponentNode!.filePath,\n ),\n ),\n config.addExtensions,\n ),\n )}').then((d) => d.Route))`\n : '',\n ].join('')\n })\n .join('\\n\\n'),\n ...(config.disableTypes\n ? []\n : [\n '// Populate the FileRoutesByPath interface',\n `declare module '@tanstack/react-router' {\n interface FileRoutesByPath {\n ${routeNodes\n .map((routeNode) => {\n return `'${removeTrailingUnderscores(routeNode.routePath)}': {\n preLoaderRoute: typeof ${routeNode.variableName}Import\n parentRoute: typeof ${\n routeNode.isVirtualParentRequired\n ? `${routeNode.parent?.variableName}Route`\n : routeNode.parent?.variableName\n ? `${routeNode.parent?.variableName}Import`\n : 'rootRoute'\n }\n }`\n })\n .join('\\n')}\n }\n}`,\n ]),\n '// Create and export the route tree',\n `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`,\n '/* prettier-ignore-end */',\n ]\n .filter(Boolean)\n .join('\\n\\n')\n\n const routeConfigFileContent = await prettier.format(routeImports, {\n semi: false,\n singleQuote: config.quoteStyle === 'single',\n parser: 'typescript',\n })\n\n const routeTreeContent = await fsp\n .readFile(path.resolve(config.generatedRouteTree), 'utf-8')\n .catch((err: any) => {\n if (err.code === 'ENOENT') {\n return undefined\n }\n throw err\n })\n\n if (!checkLatest()) return\n\n if (routeTreeContent !== routeConfigFileContent) {\n await fsp.mkdir(path.dirname(path.resolve(config.generatedRouteTree)), {\n recursive: true,\n })\n if (!checkLatest()) return\n await fsp.writeFile(\n path.resolve(config.generatedRouteTree),\n routeConfigFileContent,\n )\n }\n\n logger.log(\n `✅ Processed ${routeNodes.length === 1 ? 'route' : 'routes'} in ${\n Date.now() - start\n }ms`,\n )\n}\n\nfunction routePathToVariable(d: string): string {\n return (\n removeUnderscores(d)\n ?.replace(/\\/\\$\\//g, '/splat/')\n ?.replace(/\\$$/g, 'splat')\n ?.replace(/\\$/g, '')\n ?.split(/[/-]/g)\n .map((d, i) => (i > 0 ? capitalize(d) : d))\n .join('')\n .replace(/([^a-zA-Z0-9]|[\\.])/gm, '')\n .replace(/^(\\d)/g, 'R$1') ?? ''\n )\n}\n\nexport function removeExt(d: string, keepExtension: boolean = false) {\n return keepExtension ? d : d.substring(0, d.lastIndexOf('.')) || d\n}\n\nfunction spaces(d: number): string {\n return Array.from({ length: d })\n .map(() => ' ')\n .join('')\n}\n\nexport function multiSortBy<T>(\n arr: T[],\n accessors: ((item: T) => any)[] = [(d) => d],\n): T[] {\n return arr\n .map((d, i) => [d, i] as const)\n .sort(([a, ai], [b, bi]) => {\n for (const accessor of accessors) {\n const ao = accessor(a)\n const bo = accessor(b)\n\n if (typeof ao === 'undefined') {\n if (typeof bo === 'undefined') {\n continue\n }\n return 1\n }\n\n if (ao === bo) {\n continue\n }\n\n return ao > bo ? 1 : -1\n }\n\n return ai - bi\n })\n .map(([d]) => d)\n}\n\nfunction capitalize(s: string) {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nfunction removeUnderscores(s?: string) {\n return s?.replaceAll(/(^_|_$)/gi, '').replaceAll(/(\\/_|_\\/)/gi, '/')\n}\n\nfunction removeTrailingUnderscores(s?: string) {\n return s?.replaceAll(/(_$)/gi, '').replaceAll(/(_\\/)/gi, '/')\n}\n\nfunction replaceBackslash(s: string) {\n return s.replaceAll(/\\\\/gi, '/')\n}\n\nfunction removeGroups(s: string) {\n return s.replaceAll(routeGroupPatternRegex, '').replaceAll('//', '/')\n}\n\n/**\n * The `node.path` is used as the `id` in the route definition.\n * This function checks if the given node has a parent and if so, it determines the correct path for the given node.\n * @param node - The node to determine the path for.\n * @returns The correct path for the given node.\n */\nfunction determineNodePath(node: RouteNode) {\n return (node.path = node.parent\n ? node.routePath?.replace(node.parent.routePath!, '') || '/'\n : node.routePath)\n}\n\n/**\n * Removes the last segment from a given path. Segments are considered to be separated by a '/'.\n *\n * @param {string} path - The path from which to remove the last segment. Defaults to '/'.\n * @returns {string} The path with the last segment removed.\n * @example\n * removeLastSegmentFromPath('/workspace/_auth/foo') // '/workspace/_auth'\n */\nexport function removeLastSegmentFromPath(path: string = '/'): string {\n const segments = path.split('/')\n segments.pop() // Remove the last segment\n return segments.join('/')\n}\n\n/**\n * Removes all segments from a given path that start with an underscore ('_').\n *\n * @param {string} path - The path from which to remove segments. Defaults to '/'.\n * @returns {string} The path with all underscore-prefixed segments removed.\n * @example\n * removeLayoutSegments('/workspace/_auth/foo') // '/workspace/foo'\n */\nfunction removeLayoutSegments(path: string = '/'): string {\n const segments = path.split('/')\n const newSegments = segments.filter((segment) => !segment.startsWith('_'))\n return newSegments.join('/')\n}\n\nexport function hasParentRoute(\n routes: RouteNode[],\n node: RouteNode,\n routePathToCheck: string | undefined,\n): RouteNode | null {\n if (!routePathToCheck || routePathToCheck === '/') {\n return null\n }\n\n const sortedNodes = multiSortBy(routes, [\n (d) => d.routePath!.length * -1,\n (d) => d.variableName,\n ]).filter((d) => d.routePath !== `/${rootPathId}`)\n\n if (node.isLayout) {\n for (const route of sortedNodes) {\n if (route.routePath === '/') continue\n\n // a layout route's parent has to exactly match the layout route minus, the layout segment\n const exactParentRoutePath = removeLastSegmentFromPath(node.routePath)\n if (route.routePath === exactParentRoutePath) {\n return route\n }\n }\n } else {\n for (const route of sortedNodes) {\n if (route.routePath === '/') continue\n\n if (\n routePathToCheck.startsWith(`${route.routePath}/`) &&\n route.routePath !== routePathToCheck\n ) {\n return route\n }\n }\n }\n\n const segments = routePathToCheck.split('/')\n segments.pop() // Remove the last segment\n const parentRoutePath = segments.join('/')\n\n return hasParentRoute(routes, node, parentRoutePath)\n}\n"],"names":["logging","fsp","cleanPath","trimPathLeft","first","fs","prettier","d","path"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,IAAI,aAAa;AACV,MAAM,aAAa;AAC1B,MAAM,yBAAyB;AA0B/B,eAAe,cAAc,QAAgB;AACrC,QAAA,EAAE,iBAAiB,sBAA0B,IAAA;AACnD,QAAM,SAASA,MAAAA,QAAQ,EAAE,UAAU,OAAO,gBAAgB;AAE1D,MAAI,aAA0B,CAAA;AAE9B,iBAAe,QAAQ,KAAa;AAClC,UAAM,UAAU,KAAK,QAAQ,OAAO,iBAAiB,GAAG;AACpD,QAAA,UAAU,MAAMC,eAAI,QAAQ,SAAS,EAAE,eAAe,MAAM;AAEtD,cAAA,QAAQ,OAAO,CAAC,MAAM;AAE5B,UAAA,EAAE,KAAK,WAAW,GAAG,KACpB,yBAAyB,EAAE,KAAK,WAAW,qBAAqB,GACjE;AACO,eAAA;AAAA,MACT;AAEA,UAAI,iBAAiB;AACZ,eAAA,EAAE,KAAK,WAAW,eAAe;AAAA,MAC1C;AAEO,aAAA;AAAA,IAAA,CACR;AAED,UAAM,QAAQ;AAAA,MACZ,QAAQ,IAAI,OAAO,WAAW;;AAC5B,cAAM,WAAW,KAAK,KAAK,SAAS,OAAO,IAAI;AAC/C,cAAM,eAAe,KAAK,KAAK,KAAK,OAAO,IAAI;AAE3C,YAAA,OAAO,eAAe;AACxB,gBAAM,QAAQ,YAAY;AAAA,QACjB,WAAA,SAAS,MAAM,oBAAoB,GAAG;AAC/C,gBAAM,WAAW,iBAAiB,KAAK,KAAK,KAAK,OAAO,IAAI,CAAC;AACvD,gBAAA,gBAAgB,UAAU,QAAQ;AACpC,cAAA,YACFC,MAAU,UAAA,IAAI,cAAc,MAAM,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK;AAEzD,cAAI,iBAAiB;AACP,wBAAA,UAAU,WAAW,iBAAiB,EAAE;AAAA,UACtD;AAEM,gBAAA,eAAe,oBAAoB,SAAS;AAK9C,cAAA,SAAS,uCAAW,SAAS;AAEjC,cAAI,QAAQ;AACE,wBAAA,uCAAW,QAAQ,WAAW;AAAA,UAC5C;AAEI,cAAA,UAAU,uCAAW,SAAS;AAC9B,cAAA,cAAc,uCAAW,SAAS;AAClC,cAAA,mBAAmB,uCAAW,SAAS;AACvC,cAAA,qBAAqB,uCAAW,SAAS;AACzC,cAAA,WAAW,uCAAW,SAAS;AAEnC,gBAAM,YAAY,aAAa,IAAI,MAAM,GAAG;AACxC,cAAA,aAAW,cAAS,SAAS,SAAS,CAAC,MAA5B,mBAA+B,WAAW,SAAQ;AAG/D;AAAA,YACE,CAAC,aAAa,WAAW;AAAA,YACzB,CAAC,kBAAkB,gBAAgB;AAAA,YACnC,CAAC,oBAAoB,kBAAkB;AAAA,YACvC,CAAC,UAAU,QAAQ;AAAA,YAErB,QAAQ,CAAC,CAAC,QAAQ,IAAI,MAAM;AAC5B,gBAAI,QAAQ;AACH,qBAAA;AAAA,gBACL,mBAAmB,IAAI,8BAA8B,QAAQ;AAAA,cAAA;AAAA,YAEjE;AAAA,UAAA,CACD;AAED,sBAAY,uCAAW;AAAA,YACrB;AAAA,YACA;AAAA;AAGF,cAAI,cAAc,SAAS;AACb,wBAAA;AAAA,UACd;AAEA,sBAAY,UAAU,QAAQ,YAAY,GAAG,KAAK;AAElD,qBAAW,KAAK;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,CACD;AAAA,QACH;AAAA,MAAA,CACD;AAAA,IAAA;AAGI,WAAA;AAAA,EACT;AAEA,QAAM,QAAQ,IAAI;AAEX,SAAA;AACT;AAEA,IAAI,QAAQ;AACZ,IAAI,cAAc;AAUlB,eAAsB,UAAU,QAAgB;AAC9C,QAAM,SAASF,MAAAA,QAAQ,EAAE,UAAU,OAAO,gBAAgB;AAC1D,SAAO,IAAI,EAAE;AAEb,MAAI,CAAC,OAAO;AACV,WAAO,IAAI,0BAA0B;AAC7B,YAAA;AAAA,aACC,aAAa;AACR,kBAAA;AAAA,EAAA,OACT;AACL,WAAO,IAAI,4BAA4B;AAAA,EACzC;AAEA,QAAM,SAAS,aAAa;AACf,eAAA;AAEb,QAAM,cAAc,MAAM;AACxB,QAAI,eAAe,QAAQ;AACX,oBAAA;AACP,aAAA;AAAA,IACT;AAEO,WAAA;AAAA,EAAA;AAGH,QAAA,QAAQ,KAAK;AACb,QAAA,oBAAoB,OAAO,mBAAmB;AAC9C,QAAA,mBAAmB,MAAM,cAAc,MAAM;AACnD,QAAM,gBAAgB,iBAAiB;AAAA,IACrC,CAAC,MAAM,EAAE,cAAc,IAAI,UAAU;AAAA,EAAA;AAGjC,QAAA,gBAAgB,YAAY,kBAAkB;AAAA,IAClD,CAAC,MAAO,EAAE,cAAc,MAAM,KAAK;AAAA,IACnC,CAAC,MAAM;;AAAA,qBAAE,cAAF,mBAAa,MAAM,KAAK;AAAA;AAAA,IAC/B,CAAC,MAAO;;AAAA,sBAAE,aAAF,mBAAY,MAAM,mBAAkB,IAAI;AAAA;AAAA,IAChD,CAAC,MACC;;AAAA,sBAAE,aAAF,mBAAY;AAAA,QACV;AAAA,WAEE,IACA;AAAA;AAAA,IACN,CAAC,MAAO;;AAAA,sBAAE,aAAF,mBAAY,MAAM,mBAAkB,KAAK;AAAA;AAAA,IACjD,CAAC,MAAO;;AAAA,sBAAE,cAAF,mBAAa,SAAS,QAAO,KAAK;AAAA;AAAA,IAC1C,CAAC,MAAM,EAAE;AAAA,EACV,CAAA,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,UAAU,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAEhE,QAAM,YAAyB,CAAA;AAC/B,QAAM,oBAAkD,CAAA;AAIxD,MAAI,aAA0B,CAAA;AAExB,QAAA,aAAa,OAAO,SAAoB;;AAC5C,QAAI,cAAc,eAAe,YAAY,MAAM,KAAK,SAAS;AAGjE,SAAI,2CAAa,2BAAwB,iBAAY,aAAZ,mBAAsB,SAAQ;AAErE,YAAM,sBAAsB;AAAA,QAC1B,YAAY;AAAA,QACZ;AAAA,QACA,KAAK;AAAA,MAAA;AAEP,UAAI,qBAAqB;AACT,sBAAA;AAAA,MAChB;AAAA,IACF;AAEI,QAAA;AAAa,WAAK,SAAS;AAE1B,SAAA,OAAO,kBAAkB,IAAI;AAElC,UAAM,cAAcG,MAAA,aAAa,KAAK,QAAQ,EAAE;AAEhD,UAAM,SAAQ,2CAAa,MAAM,SAAQ,CAAA;AACzC,QAAIC,SAAQ,MAAM,CAAC,KAAK,eAAe;AACvC,UAAM,mBAAmB,MAAM,MAAM,SAAS,CAAC,KAAK,eAAe;AAE9D,SAAA,YAAY,iBAAiB,WAAW,GAAG;AAC3C,SAAA,cAAcA,OAAM,SAAS,GAAG;AAErC,SAAK,cAAc;AAAA,MACjB,kBAAkB,qBAAqB,KAAK,IAAI,CAAC,KAAK;AAAA,IAAA;AAIpD,QAAA,CAAC,KAAK,sBAAsB;AAC9B,YAAM,YAAYC,cAAG,aAAa,KAAK,UAAU,OAAO;AAExD,YAAM,mBAAmB;AAAA,UACvB,UAAK,cAAL,mBAAgB,WAAW,KAAK,UAAS;AAAA,MAAA;AAG3C,UAAI,WAAW;AAEf,UAAI,CAAC,WAAW;AACd,YAAI,KAAK,QAAQ;AACJ,qBAAA;AAAA,YACT;AAAA,YACA,6CAA6C,gBAAgB;AAAA,gCACzC,gBAAgB;AAAA;AAAA,UAAA,EAEpC,KAAK,MAAM;AAAA,QAEb,WAAA,KAAK,WACJ,CAAC,KAAK,eACL,CAAC,KAAK,oBACN,CAAC,KAAK,sBACN,CAAC,KAAK,UACR;AACW,qBAAA;AAAA,YACT;AAAA,YACA,yCAAyC,gBAAgB;AAAA,gCACrC,gBAAgB;AAAA;AAAA,UAAA,EAEpC,KAAK,MAAM;AAAA,QACf;AAAA,MAAA,OACK;AACL,mBAAW,UACR;AAAA,UACC;AAAA,UACA,CAAC,OAAO,IAAI,IAAI,OAAO,GAAG,EAAE,GAAG,gBAAgB,GAAG,EAAE;AAAA,QAAA,EAErD;AAAA,UACC;AAAA,UACA,CAAC,OAAO,IAAI,IAAI,OAAO,GAAG,EAAE,GAAG,gBAAgB,GAAG,EAAE;AAAA,QAAA,EAErD;AAAA,UACC;AAAA,UACA,CAAC,OAAO,IAAI,IAAI,OAAO,GAAG,EAAE,GAAG,gBAAgB,GAAG,EAAE;AAAA,QAAA;AAAA,MAE1D;AAEA,UAAI,aAAa,WAAW;AAC1B,eAAO,IAAI,eAAe,KAAK,QAAQ,EAAE;AACzC,cAAMJ,eAAI,UAAU,KAAK,UAAU,QAAQ;AAAA,MAC7C;AAAA,IACF;AAEA,QACE,CAAC,KAAK,cACL,KAAK,YACJ,KAAK,eACL,KAAK,oBACL,KAAK,sBACL,KAAK,SACP;AACA,wBAAkB,KAAK,SAAU,IAC/B,kBAAkB,KAAK,SAAU,KAAK;AAExC,wBAAkB,KAAK,SAAU,EAC/B,KAAK,SACD,SACA,KAAK,WACH,WACA,KAAK,mBACH,mBACA,KAAK,qBACH,qBACA,WACZ,IAAI;AAEE,YAAA,cAAc,WAAW,KAAK,CAAC,MAAM,EAAE,cAAc,KAAK,SAAS;AAEzE,UAAI,CAAC,aAAa;AAChB,cAAM,WAAW;AAAA,UACf,GAAG;AAAA,UACH,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,aAAa;AAAA,UACb,kBAAkB;AAAA,UAClB,oBAAoB;AAAA,QAAA,CACrB;AAAA,MACH;AACA;AAAA,IACF;AAEA,UAAM,sBAAsB,KAAK,eAAe,IAAI,WAAW;AAE/D,SAAK,0BAA0B,KAAK,WAChC,CAAC,sBAAsB,CAAC,KAAK,SAC7B;AAEJ,QAAI,CAAC,KAAK,aAAa,KAAK,yBAAyB;AACnD,YAAM,kBAAkB,0BAA0B,KAAK,SAAS,KAAK;AAC/D,YAAA,qBAAqB,oBAAoB,eAAe;AAE9D,YAAM,cAAc,WAAW;AAAA,QAC7B,CAAC,MAAM,EAAE,cAAc;AAAA,MAAA;AAGzB,UAAI,CAAC,aAAa;AAChB,cAAM,aAAa;AAAA,UACjB,GAAG;AAAA,UACH,MAAM,0BAA0B,KAAK,IAAI,KAAK;AAAA,UAC9C,UAAU,0BAA0B,KAAK,QAAQ,KAAK;AAAA,UACtD,UAAU,0BAA0B,KAAK,QAAQ,KAAK;AAAA,UACtD,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW;AAAA,UACX,UAAU;AAAA,UACV,sBAAsB;AAAA,UACtB,yBAAyB;AAAA,QAAA;AAGhB,mBAAA,WAAW,WAAW,YAAY,CAAA;AAClC,mBAAA,SAAS,KAAK,IAAI;AAE7B,aAAK,SAAS;AAEd,YAAI,KAAK,UAAU;AAEZ,eAAA,OAAO,kBAAkB,IAAI;AAAA,QACpC;AAEA,cAAM,WAAW,UAAU;AAAA,MAAA,OACtB;AACO,oBAAA,WAAW,YAAY,YAAY,CAAA;AACnC,oBAAA,SAAS,KAAK,IAAI;AAE9B,aAAK,SAAS;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ;AACX,UAAA,CAAC,KAAK,yBAAyB;AACjC,aAAK,OAAO,WAAW,KAAK,OAAO,YAAY;AAC1C,aAAA,OAAO,SAAS,KAAK,IAAI;AAAA,MAChC;AAAA,IAAA,OACK;AACL,gBAAU,KAAK,IAAI;AAAA,IACrB;AAEA,eAAW,KAAK,IAAI;AAAA,EAAA;AAGhB,QAAA,QAAQ,IAAI,cAAc,IAAI,CAAC,SAAS,WAAW,IAAI,CAAC,CAAC;AAEhD,iBAAA,iBACb,OACA,QAAQ,GACS;AACjB,UAAM,WAAW,MAAM,IAAI,OAAO,SAAS;;AACzC,UAAI,KAAK,QAAQ;AACf;AAAA,MACF;AAEA,UAAI,KAAK,YAAY,GAAC,UAAK,aAAL,mBAAe,SAAQ;AAC3C;AAAA,MACF;AAEM,YAAA,QAAQ,GAAG,KAAK,YAAY;AAE9B,WAAA,UAAK,aAAL,mBAAe,QAAQ;AACzB,cAAM,eAAe,MAAM,iBAAiB,KAAK,UAAU,QAAQ,CAAC;AAC7D,eAAA,GAAG,KAAK,iBAAiB,OAAO,QAAQ,CAAC,CAAC,GAAG,YAAY;AAAA,MAClE;AAEO,aAAA;AAAA,IAAA,CACR;AAEO,YAAA,MAAM,QAAQ,IAAI,QAAQ,GAAG,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,EAC/D;AAEM,QAAA,0BAA0B,MAAM,iBAAiB,SAAS;AAE1D,QAAA,mBAAmB,YAAY,YAAY;AAAA,IAC/C,CAAC,MAAO;;AAAA,sBAAE,cAAF,mBAAa,SAAS,IAAI,UAAU,OAAM,KAAK;AAAA;AAAA,IACvD,CAAC,MAAM;;AAAA,qBAAE,cAAF,mBAAa,MAAM,KAAK;AAAA;AAAA,IAC/B,CAAC,MAAO;;AAAA,sBAAE,cAAF,mBAAa,SAAS,aAAY,KAAK;AAAA;AAAA,IAC/C,CAAC,MAAM;AAAA,EAAA,CACR;AAEK,QAAA,UAAU,OAAO,QAAQ;AAAA,IAC7B,iBAAiB,iBAAiB,KAAK,CAAC,MAAM,EAAE,SAAS;AAAA,IACzD,QAAQ,iBAAiB;AAAA,MACvB,CAAC,SAAA;;AAAS,uCAAkB,KAAK,SAAU,MAAjC,mBAAoC;AAAA;AAAA,IAChD;AAAA,IACA,oBAAoB,iBAAiB;AAAA,MACnC,CAAC,SACC;;AAAA,wCAAkB,KAAK,SAAU,MAAjC,mBAAoC,gBACpC,uBAAkB,KAAK,SAAU,MAAjC,mBAAoC,qBACpC,uBAAkB,KAAK,SAAU,MAAjC,mBAAoC;AAAA;AAAA,IACxC;AAAA,EACD,CAAA,EACE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAClB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAEZ,QAAA,oBAAoB,iBACvB,OAAO,CAAC,MAAM,EAAE,SAAS,EACzB,OAAO,CAAC,KAAK,UAAU;AAEtB,UAAM,kBAAkB,cAAc;AAAA,MACpC,CAAC,MAAM,EAAE,cAAc,MAAM;AAAA,IAAA;AAG3B,QAAA,gBAAgB,WAAW,GAAG;AAChC,UAAI,KAAK,KAAK;AAAA,IAChB;AAEO,WAAA;AAAA,EACT,GAAG,CAAiB,CAAA;AAEhB,QAAA,sBACJ,OAAO,iBAAiB,gBACpB,KAAK,QAAQ,cAAc,QAAQ,IACnC;AAEN,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,SACJ,YAAY,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC9B;AAAA,IACJ;AAAA,IACA;AAAA,MACE,yCAAyC;AAAA,QACvC,KAAK;AAAA,UACH,KAAK,QAAQ,OAAO,kBAAkB;AAAA,UACtC,KAAK;AAAA,YACH,OAAO;AAAA,YACP,GAAG,iBAAiB,GAAG,UAAU,GAAG,mBAAmB;AAAA,UACzD;AAAA,QACF;AAAA,MACD,CAAA;AAAA,MACD,GAAG,iBACA,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAC1B,IAAI,CAAC,SAAS;AACN,eAAA,qBACL,KAAK,YACP,oBAAoB;AAAA,UAClB;AAAA,YACE,KAAK;AAAA,cACH,KAAK,QAAQ,OAAO,kBAAkB;AAAA,cACtC,KAAK,QAAQ,OAAO,iBAAiB,KAAK,QAAQ;AAAA,YACpD;AAAA,YACA,OAAO;AAAA,UACT;AAAA,QACD,CAAA;AAAA,MAAA,CACF;AAAA,IAAA,EACH,KAAK,IAAI;AAAA,IACX,kBAAkB,SAAS,6BAA6B;AAAA,IACxD,kBACG,IAAI,CAAC,SAAS;AACN,aAAA,SACL,KAAK,YACP,6BAA6B;AAAA,QAC3B,KAAK;AAAA,MACN,CAAA;AAAA,IAAA,CACF,EACA,KAAK,IAAI;AAAA,IACZ;AAAA,IACA,iBACG,OAAO,CAAC,KAAK,SAAS;AAEjB,UAAA,IAAI,KAAK,CAAC,MAAM,EAAE,cAAc,KAAK,SAAS,GAAG;AAC5C,eAAA;AAAA,MACT;AACA,UAAI,KAAK,IAAI;AACN,aAAA;AAAA,OACN,EAAiB,EACnB,IAAI,CAAC,SAAS;;AACb,YAAM,cAAa,uBAAkB,KAAK,SAAU,MAAjC,mBAAoC;AACvD,YAAM,iBAAgB,uBAAkB,KAAK,SAAU,MAAjC,mBAAoC;AAC1D,YAAM,sBACJ,uBAAkB,KAAK,SAAU,MAAjC,mBAAoC;AACtC,YAAM,wBACJ,uBAAkB,KAAK,SAAU,MAAjC,mBAAoC;AACtC,YAAM,qBAAoB,uBAAkB,KAAK,SAAU,MAAjC,mBAAoC;AAEvD,aAAA;AAAA,QACL,SAAS,KAAK,YAAY,WAAW,KAAK,YAAY;AAAA,YACpD;AAAA,UACA,KAAK,YACD,QAAQ,KAAK,IAAI,MACjB,UAAU,KAAK,WAAW;AAAA,UAC9B,2BAAyB,UAAK,WAAL,mBAAa,iBAAgB,MAAM;AAAA,UAE3D,OAAO,OAAO,EACd,KAAK,GAAG,CAAC;AAAA,WACX,OAAO,eAAe,KAAK,QAAQ;AAAA,QACpC,aACI,kDAAkD;AAAA,UAChD;AAAA,YACE,KAAK;AAAA,cACH,KAAK,QAAQ,OAAO,kBAAkB;AAAA,cACtC,KAAK,QAAQ,OAAO,iBAAiB,WAAW,QAAQ;AAAA,YAC1D;AAAA,YACA,OAAO;AAAA,UACT;AAAA,QAAA,CACD,qBACD;AAAA,QACJ,iBAAiB,sBAAsB,uBACnC;AAAA,gBAEE;AAAA,UACE,CAAC,aAAa,aAAa;AAAA,UAC3B,CAAC,kBAAkB,kBAAkB;AAAA,UACrC,CAAC,oBAAoB,oBAAoB;AAAA,QAAA,EAG1C,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAClB,IAAI,CAAC,MAAM;AACV,iBAAO,GACL,EAAE,CAAC,CACL,wCAAwC;AAAA,YACtC;AAAA,cACE,KAAK;AAAA,gBACH,KAAK,QAAQ,OAAO,kBAAkB;AAAA,gBACtC,KAAK,QAAQ,OAAO,iBAAiB,EAAE,CAAC,EAAG,QAAQ;AAAA,cACrD;AAAA,cACA,OAAO;AAAA,YACT;AAAA,UACD,CAAA,QAAQ,EAAE,CAAC,CAAC;AAAA,QAAA,CACd,EACA,KAAK,KAAK,CAAC;AAAA,kBAEd;AAAA,QACJ,oBACI,yBAAyB;AAAA,UACvB;AAAA,YACE,KAAK;AAAA,cACH,KAAK,QAAQ,OAAO,kBAAkB;AAAA,cACtC,KAAK;AAAA,gBACH,OAAO;AAAA,gBACP,kBAAmB;AAAA,cACrB;AAAA,YACF;AAAA,YACA,OAAO;AAAA,UACT;AAAA,QAAA,CACD,6BACD;AAAA,MAAA,EACJ,KAAK,EAAE;AAAA,IAAA,CACV,EACA,KAAK,MAAM;AAAA,IACd,GAAI,OAAO,eACP,KACA;AAAA,MACE;AAAA,MACA;AAAA;AAAA,MAEJ,WACC,IAAI,CAAC,cAAc;;AAClB,eAAO,IAAI,0BAA0B,UAAU,SAAS,CAAC;AAAA,mCAC9B,UAAU,YAAY;AAAA,gCAE7C,UAAU,0BACN,IAAG,eAAU,WAAV,mBAAkB,YAAY,YACjC,eAAU,WAAV,mBAAkB,gBAChB,IAAG,eAAU,WAAV,mBAAkB,YAAY,WACjC,WACR;AAAA;AAAA,MAAA,CAEH,EACA,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,IAGT;AAAA,IACJ;AAAA,IACA,mDAAmD,uBAAuB;AAAA,IAC1E;AAAA,EAEC,EAAA,OAAO,OAAO,EACd,KAAK,MAAM;AAEd,QAAM,yBAAyB,MAAMK,oBAAS,OAAO,cAAc;AAAA,IACjE,MAAM;AAAA,IACN,aAAa,OAAO,eAAe;AAAA,IACnC,QAAQ;AAAA,EAAA,CACT;AAED,QAAM,mBAAmB,MAAML,eAC5B,SAAS,KAAK,QAAQ,OAAO,kBAAkB,GAAG,OAAO,EACzD,MAAM,CAAC,QAAa;AACf,QAAA,IAAI,SAAS,UAAU;AAClB,aAAA;AAAA,IACT;AACM,UAAA;AAAA,EAAA,CACP;AAEH,MAAI,CAAC,YAAY;AAAG;AAEpB,MAAI,qBAAqB,wBAAwB;AACzC,UAAAA,eAAI,MAAM,KAAK,QAAQ,KAAK,QAAQ,OAAO,kBAAkB,CAAC,GAAG;AAAA,MACrE,WAAW;AAAA,IAAA,CACZ;AACD,QAAI,CAAC,YAAY;AAAG;AACpB,UAAMA,eAAI;AAAA,MACR,KAAK,QAAQ,OAAO,kBAAkB;AAAA,MACtC;AAAA,IAAA;AAAA,EAEJ;AAEO,SAAA;AAAA,IACL,eAAe,WAAW,WAAW,IAAI,UAAU,QAAQ,OACzD,KAAK,QAAQ,KACf;AAAA,EAAA;AAEJ;AAEA,SAAS,oBAAoB,GAAmB;;AAC9C,WACE,yCAAkB,CAAC,MAAnB,mBACI,QAAQ,WAAW,eADvB,mBAEI,QAAQ,QAAQ,aAFpB,mBAGI,QAAQ,OAAO,QAHnB,mBAII,MAAM,SACP,IAAI,CAACM,IAAG,MAAO,IAAI,IAAI,WAAWA,EAAC,IAAIA,IACvC,KAAK,IACL,QAAQ,yBAAyB,IACjC,QAAQ,UAAU,WAAU;AAEnC;AAEgB,SAAA,UAAU,GAAW,gBAAyB,OAAO;AAC5D,SAAA,gBAAgB,IAAI,EAAE,UAAU,GAAG,EAAE,YAAY,GAAG,CAAC,KAAK;AACnE;AAEA,SAAS,OAAO,GAAmB;AACjC,SAAO,MAAM,KAAK,EAAE,QAAQ,EAAG,CAAA,EAC5B,IAAI,MAAM,GAAG,EACb,KAAK,EAAE;AACZ;AAEO,SAAS,YACd,KACA,YAAkC,CAAC,CAAC,MAAM,CAAC,GACtC;AACL,SAAO,IACJ,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAU,EAC7B,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM;AAC1B,eAAW,YAAY,WAAW;AAC1B,YAAA,KAAK,SAAS,CAAC;AACf,YAAA,KAAK,SAAS,CAAC;AAEjB,UAAA,OAAO,OAAO,aAAa;AACzB,YAAA,OAAO,OAAO,aAAa;AAC7B;AAAA,QACF;AACO,eAAA;AAAA,MACT;AAEA,UAAI,OAAO,IAAI;AACb;AAAA,MACF;AAEO,aAAA,KAAK,KAAK,IAAI;AAAA,IACvB;AAEA,WAAO,KAAK;AAAA,EACb,CAAA,EACA,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AACnB;AAEA,SAAS,WAAW,GAAW;AAC7B,MAAI,OAAO,MAAM;AAAiB,WAAA;AAC3B,SAAA,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC;AAC9C;AAEA,SAAS,kBAAkB,GAAY;AACrC,SAAO,uBAAG,WAAW,aAAa,IAAI,WAAW,eAAe;AAClE;AAEA,SAAS,0BAA0B,GAAY;AAC7C,SAAO,uBAAG,WAAW,UAAU,IAAI,WAAW,WAAW;AAC3D;AAEA,SAAS,iBAAiB,GAAW;AAC5B,SAAA,EAAE,WAAW,QAAQ,GAAG;AACjC;AAEA,SAAS,aAAa,GAAW;AAC/B,SAAO,EAAE,WAAW,wBAAwB,EAAE,EAAE,WAAW,MAAM,GAAG;AACtE;AAQA,SAAS,kBAAkB,MAAiB;;AAC1C,SAAQ,KAAK,OAAO,KAAK,WACrB,UAAK,cAAL,mBAAgB,QAAQ,KAAK,OAAO,WAAY,QAAO,MACvD,KAAK;AACX;AAUgB,SAAA,0BAA0BC,QAAe,KAAa;AAC9D,QAAA,WAAWA,MAAK,MAAM,GAAG;AAC/B,WAAS,IAAI;AACN,SAAA,SAAS,KAAK,GAAG;AAC1B;AAUA,SAAS,qBAAqBA,QAAe,KAAa;AAClD,QAAA,WAAWA,MAAK,MAAM,GAAG;AACzB,QAAA,cAAc,SAAS,OAAO,CAAC,YAAY,CAAC,QAAQ,WAAW,GAAG,CAAC;AAClE,SAAA,YAAY,KAAK,GAAG;AAC7B;AAEgB,SAAA,eACd,QACA,MACA,kBACkB;AACd,MAAA,CAAC,oBAAoB,qBAAqB,KAAK;AAC1C,WAAA;AAAA,EACT;AAEM,QAAA,cAAc,YAAY,QAAQ;AAAA,IACtC,CAAC,MAAM,EAAE,UAAW,SAAS;AAAA,IAC7B,CAAC,MAAM,EAAE;AAAA,EAAA,CACV,EAAE,OAAO,CAAC,MAAM,EAAE,cAAc,IAAI,UAAU,EAAE;AAEjD,MAAI,KAAK,UAAU;AACjB,eAAW,SAAS,aAAa;AAC/B,UAAI,MAAM,cAAc;AAAK;AAGvB,YAAA,uBAAuB,0BAA0B,KAAK,SAAS;AACjE,UAAA,MAAM,cAAc,sBAAsB;AACrC,eAAA;AAAA,MACT;AAAA,IACF;AAAA,EAAA,OACK;AACL,eAAW,SAAS,aAAa;AAC/B,UAAI,MAAM,cAAc;AAAK;AAG3B,UAAA,iBAAiB,WAAW,GAAG,MAAM,SAAS,GAAG,KACjD,MAAM,cAAc,kBACpB;AACO,eAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEM,QAAA,WAAW,iBAAiB,MAAM,GAAG;AAC3C,WAAS,IAAI;AACP,QAAA,kBAAkB,SAAS,KAAK,GAAG;AAElC,SAAA,eAAe,QAAQ,MAAM,eAAe;AACrD;;;;;;;"}
@@ -9,6 +9,9 @@ export type RouteNode = {
9
9
  path?: string;
10
10
  isNonPath?: boolean;
11
11
  isNonLayout?: boolean;
12
+ isLayout?: boolean;
13
+ isVirtualParentRequired?: boolean;
14
+ isVirtualParentRoute?: boolean;
12
15
  isRoute?: boolean;
13
16
  isLoader?: boolean;
14
17
  isComponent?: boolean;
@@ -23,4 +26,13 @@ export type RouteNode = {
23
26
  export declare function generator(config: Config): Promise<void>;
24
27
  export declare function removeExt(d: string, keepExtension?: boolean): string;
25
28
  export declare function multiSortBy<T>(arr: T[], accessors?: ((item: T) => any)[]): T[];
26
- export declare function hasParentRoute(routes: RouteNode[], routePathToCheck: string | undefined): RouteNode | null;
29
+ /**
30
+ * Removes the last segment from a given path. Segments are considered to be separated by a '/'.
31
+ *
32
+ * @param {string} path - The path from which to remove the last segment. Defaults to '/'.
33
+ * @returns {string} The path with the last segment removed.
34
+ * @example
35
+ * removeLastSegmentFromPath('/workspace/_auth/foo') // '/workspace/_auth'
36
+ */
37
+ export declare function removeLastSegmentFromPath(path?: string): string;
38
+ export declare function hasParentRoute(routes: RouteNode[], node: RouteNode, routePathToCheck: string | undefined): RouteNode | null;
@@ -9,6 +9,9 @@ export type RouteNode = {
9
9
  path?: string;
10
10
  isNonPath?: boolean;
11
11
  isNonLayout?: boolean;
12
+ isLayout?: boolean;
13
+ isVirtualParentRequired?: boolean;
14
+ isVirtualParentRoute?: boolean;
12
15
  isRoute?: boolean;
13
16
  isLoader?: boolean;
14
17
  isComponent?: boolean;
@@ -23,4 +26,13 @@ export type RouteNode = {
23
26
  export declare function generator(config: Config): Promise<void>;
24
27
  export declare function removeExt(d: string, keepExtension?: boolean): string;
25
28
  export declare function multiSortBy<T>(arr: T[], accessors?: ((item: T) => any)[]): T[];
26
- export declare function hasParentRoute(routes: RouteNode[], routePathToCheck: string | undefined): RouteNode | null;
29
+ /**
30
+ * Removes the last segment from a given path. Segments are considered to be separated by a '/'.
31
+ *
32
+ * @param {string} path - The path from which to remove the last segment. Defaults to '/'.
33
+ * @returns {string} The path with the last segment removed.
34
+ * @example
35
+ * removeLastSegmentFromPath('/workspace/_auth/foo') // '/workspace/_auth'
36
+ */
37
+ export declare function removeLastSegmentFromPath(path?: string): string;
38
+ export declare function hasParentRoute(routes: RouteNode[], node: RouteNode, routePathToCheck: string | undefined): RouteNode | null;