@tanstack/router-vite-plugin 1.3.3 → 1.3.5

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.
@@ -62,10 +62,10 @@ async function getRouteNodes(config) {
62
62
  if (stat.isDirectory()) {
63
63
  await recurse(relativePath);
64
64
  } else {
65
- const filePath = path.join(dir, fileName);
65
+ const filePath = replaceBackslash(path.join(dir, fileName));
66
66
  const filePathNoExt = removeExt(filePath);
67
- let routePath = replaceBackslash(reactRouter.cleanPath(`/${filePathNoExt.split('.').join('/')}`)) ?? '';
68
- const variableName = fileToVariable(routePath);
67
+ let routePath = reactRouter.cleanPath(`/${filePathNoExt.split('.').join('/')}`) || '';
68
+ const variableName = routePathToVariable(routePath);
69
69
 
70
70
  // Remove the index from the route path and
71
71
  // if the route path is empty, use `/'
@@ -121,11 +121,7 @@ async function generator(config) {
121
121
  };
122
122
  const start = Date.now();
123
123
  const routePathIdPrefix = config.routeFilePrefix ?? '';
124
- let preRouteNodes = await getRouteNodes(config);
125
- const sortRouteNodes = nodes => {
126
- return multiSortBy(nodes, [d => d.routePath === '/' ? -1 : 1, d => d.routePath?.split('/').length, d => d.filePath?.match(/[./]index[.]/) ? 1 : -1, d => d.filePath?.match(/[./](component|errorComponent|pendingComponent|loader)[.]/) ? 1 : -1, d => d.filePath?.match(/[./]route[.]/) ? -1 : 1, d => d.routePath?.endsWith('/') ? -1 : 1, d => d.routePath]).filter(d => d.routePath !== `/${routePathIdPrefix + rootPathId}`);
127
- };
128
- preRouteNodes = sortRouteNodes(preRouteNodes);
124
+ const preRouteNodes = multiSortBy(await getRouteNodes(config), [d => d.routePath === '/' ? -1 : 1, d => d.routePath?.split('/').length, d => d.filePath?.match(/[./]index[.]/) ? 1 : -1, d => d.filePath?.match(/[./](component|errorComponent|pendingComponent|loader)[.]/) ? 1 : -1, d => d.filePath?.match(/[./]route[.]/) ? -1 : 1, d => d.routePath?.endsWith('/') ? -1 : 1, d => d.routePath]).filter(d => d.routePath !== `/${routePathIdPrefix + rootPathId}`);
129
125
  const routeTree = [];
130
126
  const routePiecesByPath = {};
131
127
 
@@ -252,8 +248,8 @@ async function generator(config) {
252
248
  }
253
249
  console.log(`🌲 Processed ${routeNodes.length} routes in ${Date.now() - start}ms`);
254
250
  }
255
- function fileToVariable(d) {
256
- return removeUnderscores(d)?.replace(/\$/g, '')?.split(/[/-]/g).map((d, i) => i > 0 ? capitalize(d) : d).join('').replace(/([^a-zA-Z0-9]|[\.])/gm, '') ?? '';
251
+ function routePathToVariable(d) {
252
+ return removeUnderscores(d)?.replace(/\/\$\//g, '/splat/')?.replace(/\$$/g, 'splat')?.replace(/\$/g, '')?.split(/[/-]/g).map((d, i) => i > 0 ? capitalize(d) : d).join('').replace(/([^a-zA-Z0-9]|[\.])/gm, '') ?? '';
257
253
  }
258
254
  function removeExt(d) {
259
255
  return d.substring(0, d.lastIndexOf('.')) || d;
@@ -287,7 +283,7 @@ function capitalize(s) {
287
283
  return s.charAt(0).toUpperCase() + s.slice(1);
288
284
  }
289
285
  function sanitize(s) {
290
- return replaceBackslash(s?.replace(/\\index/gi, ''));
286
+ return replaceBackslash(s.replace(/\\index/gi, ''));
291
287
  }
292
288
  function removeUnderscores(s) {
293
289
  return s?.replace(/(^_|_$)/, '').replace(/(\/_|_\/)/, '/');
@@ -296,7 +292,7 @@ function removeTrailingUnderscores(s) {
296
292
  return s?.replace(/(_$)/, '').replace(/(_\/)/, '/');
297
293
  }
298
294
  function replaceBackslash(s) {
299
- return s?.replace(/\\/gi, '/');
295
+ return s.replace(/\\/gi, '/');
300
296
  }
301
297
  function hasParentRoute(routes, routePathToCheck) {
302
298
  if (!routePathToCheck || routePathToCheck === '/') {
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sources":["../../../../../../router-cli/src/generator.ts"],"sourcesContent":["import path from 'path'\nimport * as fs from 'fs/promises'\nimport * as prettier from 'prettier'\nimport { Config } from './config'\nimport { cleanPath, trimPathLeft } from '@tanstack/react-router'\n\nlet latestTask = 0\nexport const rootPathId = '__root'\nexport const fileRouteRegex = /new\\s+FileRoute\\(([^)]*)\\)/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 isRoot?: boolean\n children?: RouteNode[]\n parent?: RouteNode\n}\n\nasync function getRouteNodes(config: Config) {\n const { routeFilePrefix, routeFileIgnorePrefix } = config\n\n let routeNodes: RouteNode[] = []\n\n async function recurse(dir: string) {\n const fullDir = path.resolve(config.routesDirectory, dir)\n let dirList = await fs.readdir(fullDir)\n\n dirList = dirList.filter((d) => {\n if (\n d.startsWith('.') ||\n (routeFileIgnorePrefix && d.startsWith(routeFileIgnorePrefix))\n ) {\n return false\n }\n\n if (routeFilePrefix) {\n return d.startsWith(routeFilePrefix)\n }\n\n return true\n })\n\n await Promise.all(\n dirList.map(async (fileName) => {\n const fullPath = path.join(fullDir, fileName)\n const relativePath = path.join(dir, fileName)\n const stat = await fs.stat(fullPath)\n\n if (stat.isDirectory()) {\n await recurse(relativePath)\n } else {\n const filePath = path.join(dir, fileName)\n const filePathNoExt = removeExt(filePath)\n let routePath =\n replaceBackslash(\n cleanPath(`/${filePathNoExt.split('.').join('/')}`),\n ) ?? ''\n const variableName = fileToVariable(routePath)\n\n // Remove the index from the route path and\n // if the route path is empty, use `/'\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 routePath = routePath?.replace(\n /\\/(component|errorComponent|pendingComponent|loader|route)$/,\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 })\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}\n\nexport async function generator(config: Config) {\n console.log()\n\n if (!first) {\n console.log('🔄 Generating routes...')\n first = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n console.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\n let preRouteNodes = await getRouteNodes(config)\n\n const sortRouteNodes = (nodes: RouteNode[]): RouteNode[] => {\n return multiSortBy(nodes, [\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)[.]/,\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) => d.routePath !== `/${routePathIdPrefix + rootPathId}`)\n }\n\n preRouteNodes = sortRouteNodes(preRouteNodes)\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 = (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\n node.cleanedPath = removeUnderscores(node.path) ?? ''\n\n if (config.future?.unstable_codeSplitting) {\n if (\n !node.isVirtual &&\n (node.isLoader ||\n node.isComponent ||\n node.isErrorComponent ||\n node.isPendingComponent)\n ) {\n routePiecesByPath[node.routePath!] =\n routePiecesByPath[node.routePath!] || {}\n\n routePiecesByPath[node.routePath!]![\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(\n (d) => d.routePath === node.routePath,\n )\n\n if (!anchorRoute) {\n handleNode({\n ...node,\n isVirtual: true,\n isLoader: false,\n isComponent: false,\n isErrorComponent: false,\n isPendingComponent: false,\n })\n }\n return\n }\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 preRouteNodes.forEach((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 const routeCode = await fs.readFile(node.fullPath, 'utf-8')\n\n // Ensure the boilerplate for the route exists\n if (node.isRoot) {\n return\n }\n\n // Ensure that new FileRoute(anything?) is replaced with FileRoute(${node.routePath})\n // routePath can contain $ characters, which have special meaning when used in replace\n // so we have to escape it by turning all $ into $$. But since we do it through a replace call\n // we have to double escape it into $$$$. For more information, see\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement\n const escapedRoutePath = removeTrailingUnderscores(\n node.routePath?.replaceAll('$', '$$$$') ?? '',\n )\n const quote = config.quoteStyle === 'single' ? `'` : `\"`\n const replaced = routeCode.replace(\n fileRouteRegex,\n `new FileRoute(${quote}${escapedRoutePath}${quote})`,\n )\n\n if (replaced !== routeCode) {\n await fs.writeFile(node.fullPath, replaced)\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) =>\n d.routePath?.includes(`/${routePathIdPrefix + 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 FileRoute: 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 routeImports = [\n imports.length\n ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\\n`\n : '',\n `import { Route as rootRoute } from './${sanitize(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, routePathIdPrefix + rootPathId),\n ),\n )}'`,\n ...sortedRouteNodes\n .filter((d) => !d.isVirtual)\n .map((node) => {\n return `import { Route as ${\n node.variableName\n }Import } from './${sanitize(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n ),\n )}'`\n }),\n '\\n',\n sortedRouteNodes\n .filter((d) => d.isVirtual)\n .map((node) => {\n return `const ${\n node.variableName\n }Import = new FileRoute('${removeTrailingUnderscores(\n node.routePath,\n )}').createRoute()`\n })\n .join('\\n'),\n '\\n',\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\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 } as any)`,\n loaderNode\n ? `.updateLoader({ loader: lazyFn(() => import('./${sanitize(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, loaderNode.filePath),\n ),\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('./${sanitize(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, d[1]!.filePath),\n ),\n ),\n )}'), '${d[0]}')`\n })\n .join('\\n,')}\n })`\n : '',\n ].join('')\n })\n .join('\\n\\n'),\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 `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`,\n ].join('\\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 fs\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 fs.mkdir(path.dirname(path.resolve(config.generatedRouteTree)), {\n recursive: true,\n })\n if (!checkLatest()) return\n await fs.writeFile(\n path.resolve(config.generatedRouteTree),\n routeConfigFileContent,\n )\n }\n\n console.log(\n `🌲 Processed ${routeNodes.length} routes in ${Date.now() - start}ms`,\n )\n}\n\nfunction fileToVariable(d: string): string {\n return (\n removeUnderscores(d)\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 )\n}\n\nexport function removeExt(d: string) {\n return 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 sanitize(s?: string) {\n return replaceBackslash(s?.replace(/\\\\index/gi, ''))\n}\n\nfunction removeUnderscores(s?: string) {\n return s?.replace(/(^_|_$)/, '').replace(/(\\/_|_\\/)/, '/')\n}\n\nfunction removeTrailingUnderscores(s?: string) {\n return s?.replace(/(_$)/, '').replace(/(_\\/)/, '/')\n}\n\nfunction replaceBackslash(s?: string) {\n return s?.replace(/\\\\/gi, '/')\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":["latestTask","rootPathId","fileRouteRegex","getRouteNodes","config","routeFilePrefix","routeFileIgnorePrefix","routeNodes","recurse","dir","fullDir","path","resolve","routesDirectory","dirList","fs","readdir","filter","d","startsWith","Promise","all","map","fileName","fullPath","join","relativePath","stat","isDirectory","filePath","filePathNoExt","removeExt","routePath","replaceBackslash","cleanPath","split","variableName","fileToVariable","isRoute","endsWith","isComponent","isErrorComponent","isPendingComponent","isLoader","replace","push","first","skipMessage","generator","console","log","taskId","checkLatest","start","Date","now","routePathIdPrefix","preRouteNodes","sortRouteNodes","nodes","multiSortBy","length","match","routeTree","routePiecesByPath","handleNode","node","parentRoute","hasParentRoute","parent","trimmedPath","trimPathLeft","isNonPath","isNonLayout","cleanedPath","removeUnderscores","future","unstable_codeSplitting","isVirtual","anchorRoute","find","children","forEach","buildRouteConfig","depth","routeCode","readFile","isRoot","escapedRoutePath","removeTrailingUnderscores","replaceAll","quote","quoteStyle","replaced","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","sortedRouteNodes","includes","imports","Object","entries","FileRoute","some","lazyFn","loader","lazyRouteComponent","component","errorComponent","pendingComponent","routeImports","sanitize","relative","dirname","generatedRouteTree","loaderNode","componentNode","errorComponentNode","pendingComponentNode","routeNode","routeConfigFileContent","prettier","semi","singleQuote","parser","routeTreeContent","catch","err","code","undefined","mkdir","recursive","i","capitalize","substring","lastIndexOf","Array","from","arr","accessors","sort","a","ai","b","bi","accessor","ao","bo","s","charAt","toUpperCase","slice","routes","routePathToCheck","sortedNodes","segments","pop","parentRoutePath"],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sources":["../../../../../../router-cli/src/generator.ts"],"sourcesContent":["import path from 'path'\nimport * as fs from 'fs/promises'\nimport * as prettier from 'prettier'\nimport { Config } from './config'\nimport { cleanPath, trimPathLeft } from '@tanstack/react-router'\n\nlet latestTask = 0\nexport const rootPathId = '__root'\nexport const fileRouteRegex = /new\\s+FileRoute\\(([^)]*)\\)/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 isRoot?: boolean\n children?: RouteNode[]\n parent?: RouteNode\n}\n\nasync function getRouteNodes(config: Config) {\n const { routeFilePrefix, routeFileIgnorePrefix } = config\n\n let routeNodes: RouteNode[] = []\n\n async function recurse(dir: string) {\n const fullDir = path.resolve(config.routesDirectory, dir)\n let dirList = await fs.readdir(fullDir)\n\n dirList = dirList.filter((d) => {\n if (\n d.startsWith('.') ||\n (routeFileIgnorePrefix && d.startsWith(routeFileIgnorePrefix))\n ) {\n return false\n }\n\n if (routeFilePrefix) {\n return d.startsWith(routeFilePrefix)\n }\n\n return true\n })\n\n await Promise.all(\n dirList.map(async (fileName) => {\n const fullPath = path.join(fullDir, fileName)\n const relativePath = path.join(dir, fileName)\n const stat = await fs.stat(fullPath)\n\n if (stat.isDirectory()) {\n await recurse(relativePath)\n } else {\n const filePath = replaceBackslash(path.join(dir, fileName))\n const filePathNoExt = removeExt(filePath)\n let routePath =\n cleanPath(`/${filePathNoExt.split('.').join('/')}`) || ''\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 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 routePath = routePath?.replace(\n /\\/(component|errorComponent|pendingComponent|loader|route)$/,\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 })\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}\n\nexport async function generator(config: Config) {\n console.log()\n\n if (!first) {\n console.log('🔄 Generating routes...')\n first = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n console.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\n const preRouteNodes = multiSortBy(await getRouteNodes(config), [\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)[.]/,\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) => d.routePath !== `/${routePathIdPrefix + rootPathId}`)\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 = (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\n node.cleanedPath = removeUnderscores(node.path) ?? ''\n\n if (config.future?.unstable_codeSplitting) {\n if (\n !node.isVirtual &&\n (node.isLoader ||\n node.isComponent ||\n node.isErrorComponent ||\n node.isPendingComponent)\n ) {\n routePiecesByPath[node.routePath!] =\n routePiecesByPath[node.routePath!] || {}\n\n routePiecesByPath[node.routePath!]![\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(\n (d) => d.routePath === node.routePath,\n )\n\n if (!anchorRoute) {\n handleNode({\n ...node,\n isVirtual: true,\n isLoader: false,\n isComponent: false,\n isErrorComponent: false,\n isPendingComponent: false,\n })\n }\n return\n }\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 preRouteNodes.forEach((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 const routeCode = await fs.readFile(node.fullPath, 'utf-8')\n\n // Ensure the boilerplate for the route exists\n if (node.isRoot) {\n return\n }\n\n // Ensure that new FileRoute(anything?) is replaced with FileRoute(${node.routePath})\n // routePath can contain $ characters, which have special meaning when used in replace\n // so we have to escape it by turning all $ into $$. But since we do it through a replace call\n // we have to double escape it into $$$$. For more information, see\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement\n const escapedRoutePath = removeTrailingUnderscores(\n node.routePath?.replaceAll('$', '$$$$') ?? '',\n )\n const quote = config.quoteStyle === 'single' ? `'` : `\"`\n const replaced = routeCode.replace(\n fileRouteRegex,\n `new FileRoute(${quote}${escapedRoutePath}${quote})`,\n )\n\n if (replaced !== routeCode) {\n await fs.writeFile(node.fullPath, replaced)\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) =>\n d.routePath?.includes(`/${routePathIdPrefix + 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 FileRoute: 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 routeImports = [\n imports.length\n ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\\n`\n : '',\n `import { Route as rootRoute } from './${sanitize(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, routePathIdPrefix + rootPathId),\n ),\n )}'`,\n ...sortedRouteNodes\n .filter((d) => !d.isVirtual)\n .map((node) => {\n return `import { Route as ${\n node.variableName\n }Import } from './${sanitize(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n ),\n )}'`\n }),\n '\\n',\n sortedRouteNodes\n .filter((d) => d.isVirtual)\n .map((node) => {\n return `const ${\n node.variableName\n }Import = new FileRoute('${removeTrailingUnderscores(\n node.routePath,\n )}').createRoute()`\n })\n .join('\\n'),\n '\\n',\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\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 } as any)`,\n loaderNode\n ? `.updateLoader({ loader: lazyFn(() => import('./${sanitize(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, loaderNode.filePath),\n ),\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('./${sanitize(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, d[1]!.filePath),\n ),\n ),\n )}'), '${d[0]}')`\n })\n .join('\\n,')}\n })`\n : '',\n ].join('')\n })\n .join('\\n\\n'),\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 `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`,\n ].join('\\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 fs\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 fs.mkdir(path.dirname(path.resolve(config.generatedRouteTree)), {\n recursive: true,\n })\n if (!checkLatest()) return\n await fs.writeFile(\n path.resolve(config.generatedRouteTree),\n routeConfigFileContent,\n )\n }\n\n console.log(\n `🌲 Processed ${routeNodes.length} routes in ${Date.now() - start}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 )\n}\n\nexport function removeExt(d: string) {\n return 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 sanitize(s: string) {\n return replaceBackslash(s.replace(/\\\\index/gi, ''))\n}\n\nfunction removeUnderscores(s?: string) {\n return s?.replace(/(^_|_$)/, '').replace(/(\\/_|_\\/)/, '/')\n}\n\nfunction removeTrailingUnderscores(s?: string) {\n return s?.replace(/(_$)/, '').replace(/(_\\/)/, '/')\n}\n\nfunction replaceBackslash(s: string) {\n return s.replace(/\\\\/gi, '/')\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":["latestTask","rootPathId","fileRouteRegex","getRouteNodes","config","routeFilePrefix","routeFileIgnorePrefix","routeNodes","recurse","dir","fullDir","path","resolve","routesDirectory","dirList","fs","readdir","filter","d","startsWith","Promise","all","map","fileName","fullPath","join","relativePath","stat","isDirectory","filePath","replaceBackslash","filePathNoExt","removeExt","routePath","cleanPath","split","variableName","routePathToVariable","isRoute","endsWith","isComponent","isErrorComponent","isPendingComponent","isLoader","replace","push","first","skipMessage","generator","console","log","taskId","checkLatest","start","Date","now","routePathIdPrefix","preRouteNodes","multiSortBy","length","match","routeTree","routePiecesByPath","handleNode","node","parentRoute","hasParentRoute","parent","trimmedPath","trimPathLeft","isNonPath","isNonLayout","cleanedPath","removeUnderscores","future","unstable_codeSplitting","isVirtual","anchorRoute","find","children","forEach","buildRouteConfig","nodes","depth","routeCode","readFile","isRoot","escapedRoutePath","removeTrailingUnderscores","replaceAll","quote","quoteStyle","replaced","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","sortedRouteNodes","includes","imports","Object","entries","FileRoute","some","lazyFn","loader","lazyRouteComponent","component","errorComponent","pendingComponent","routeImports","sanitize","relative","dirname","generatedRouteTree","loaderNode","componentNode","errorComponentNode","pendingComponentNode","routeNode","routeConfigFileContent","prettier","semi","singleQuote","parser","routeTreeContent","catch","err","code","undefined","mkdir","recursive","i","capitalize","substring","lastIndexOf","Array","from","arr","accessors","sort","a","ai","b","bi","accessor","ao","bo","s","charAt","toUpperCase","slice","routes","routePathToCheck","sortedNodes","segments","pop","parentRoutePath"],"mappings":"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"}
@@ -33031,10 +33031,10 @@ async function getRouteNodes(config) {
33031
33031
  if (stat.isDirectory()) {
33032
33032
  await recurse(relativePath);
33033
33033
  } else {
33034
- const filePath = path.join(dir, fileName);
33034
+ const filePath = replaceBackslash(path.join(dir, fileName));
33035
33035
  const filePathNoExt = removeExt(filePath);
33036
- let routePath = replaceBackslash(cleanPath(`/${filePathNoExt.split('.').join('/')}`)) ?? '';
33037
- const variableName = fileToVariable(routePath);
33036
+ let routePath = cleanPath(`/${filePathNoExt.split('.').join('/')}`) || '';
33037
+ const variableName = routePathToVariable(routePath);
33038
33038
 
33039
33039
  // Remove the index from the route path and
33040
33040
  // if the route path is empty, use `/'
@@ -33090,11 +33090,7 @@ async function generator(config) {
33090
33090
  };
33091
33091
  const start = Date.now();
33092
33092
  const routePathIdPrefix = config.routeFilePrefix ?? '';
33093
- let preRouteNodes = await getRouteNodes(config);
33094
- const sortRouteNodes = nodes => {
33095
- return multiSortBy(nodes, [d => d.routePath === '/' ? -1 : 1, d => d.routePath?.split('/').length, d => d.filePath?.match(/[./]index[.]/) ? 1 : -1, d => d.filePath?.match(/[./](component|errorComponent|pendingComponent|loader)[.]/) ? 1 : -1, d => d.filePath?.match(/[./]route[.]/) ? -1 : 1, d => d.routePath?.endsWith('/') ? -1 : 1, d => d.routePath]).filter(d => d.routePath !== `/${routePathIdPrefix + rootPathId}`);
33096
- };
33097
- preRouteNodes = sortRouteNodes(preRouteNodes);
33093
+ const preRouteNodes = multiSortBy(await getRouteNodes(config), [d => d.routePath === '/' ? -1 : 1, d => d.routePath?.split('/').length, d => d.filePath?.match(/[./]index[.]/) ? 1 : -1, d => d.filePath?.match(/[./](component|errorComponent|pendingComponent|loader)[.]/) ? 1 : -1, d => d.filePath?.match(/[./]route[.]/) ? -1 : 1, d => d.routePath?.endsWith('/') ? -1 : 1, d => d.routePath]).filter(d => d.routePath !== `/${routePathIdPrefix + rootPathId}`);
33098
33094
  const routeTree = [];
33099
33095
  const routePiecesByPath = {};
33100
33096
 
@@ -33221,8 +33217,8 @@ async function generator(config) {
33221
33217
  }
33222
33218
  console.log(`🌲 Processed ${routeNodes.length} routes in ${Date.now() - start}ms`);
33223
33219
  }
33224
- function fileToVariable(d) {
33225
- return removeUnderscores(d)?.replace(/\$/g, '')?.split(/[/-]/g).map((d, i) => i > 0 ? capitalize(d) : d).join('').replace(/([^a-zA-Z0-9]|[\.])/gm, '') ?? '';
33220
+ function routePathToVariable(d) {
33221
+ return removeUnderscores(d)?.replace(/\/\$\//g, '/splat/')?.replace(/\$$/g, 'splat')?.replace(/\$/g, '')?.split(/[/-]/g).map((d, i) => i > 0 ? capitalize(d) : d).join('').replace(/([^a-zA-Z0-9]|[\.])/gm, '') ?? '';
33226
33222
  }
33227
33223
  function removeExt(d) {
33228
33224
  return d.substring(0, d.lastIndexOf('.')) || d;
@@ -33256,7 +33252,7 @@ function capitalize(s) {
33256
33252
  return s.charAt(0).toUpperCase() + s.slice(1);
33257
33253
  }
33258
33254
  function sanitize(s) {
33259
- return replaceBackslash(s?.replace(/\\index/gi, ''));
33255
+ return replaceBackslash(s.replace(/\\index/gi, ''));
33260
33256
  }
33261
33257
  function removeUnderscores(s) {
33262
33258
  return s?.replace(/(^_|_$)/, '').replace(/(\/_|_\/)/, '/');
@@ -33265,7 +33261,7 @@ function removeTrailingUnderscores(s) {
33265
33261
  return s?.replace(/(_$)/, '').replace(/(_\/)/, '/');
33266
33262
  }
33267
33263
  function replaceBackslash(s) {
33268
- return s?.replace(/\\/gi, '/');
33264
+ return s.replace(/\\/gi, '/');
33269
33265
  }
33270
33266
  function hasParentRoute(routes, routePathToCheck) {
33271
33267
  if (!routePathToCheck || routePathToCheck === '/') {