@tanstack/router-cli 1.5.1 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -201,11 +201,12 @@ async function generator(config) {
201
201
  lazyFn: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.loader),
202
202
  lazyRouteComponent: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.component || routePiecesByPath[node.routePath]?.errorComponent || routePiecesByPath[node.routePath]?.pendingComponent)
203
203
  }).filter(d => d[1]).map(d => d[0]);
204
- const routeImports = [imports.length ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\n` : '', `import { Route as rootRoute } from './${replaceBackslash(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, routePathIdPrefix + rootPathId)))}'`, ...sortedRouteNodes.filter(d => !d.isVirtual).map(node => {
204
+ const virtualRouteNodes = sortedRouteNodes.filter(d => d.isVirtual);
205
+ const routeImports = ['// This file is auto-generated by TanStack Router', imports.length ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\n` : '', '// Import Routes', [`import { Route as rootRoute } from './${replaceBackslash(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, routePathIdPrefix + rootPathId)))}'`, ...sortedRouteNodes.filter(d => !d.isVirtual).map(node => {
205
206
  return `import { Route as ${node.variableName}Import } from './${replaceBackslash(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, node.filePath))))}'`;
206
- }), '\n', sortedRouteNodes.filter(d => d.isVirtual).map(node => {
207
+ })].join('\n'), virtualRouteNodes.length ? '// Create Virtual Routes' : '', virtualRouteNodes.map(node => {
207
208
  return `const ${node.variableName}Import = new FileRoute('${removeTrailingUnderscores(node.routePath)}').createRoute()`;
208
- }).join('\n'), '\n', sortedRouteNodes.map(node => {
209
+ }).join('\n'), '// Create/Update Routes', sortedRouteNodes.map(node => {
209
210
  const loaderNode = routePiecesByPath[node.routePath]?.loader;
210
211
  const componentNode = routePiecesByPath[node.routePath]?.component;
211
212
  const errorComponentNode = routePiecesByPath[node.routePath]?.errorComponent;
@@ -217,7 +218,7 @@ async function generator(config) {
217
218
  return `${d[0]}: lazyRouteComponent(() => import('./${replaceBackslash(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, d[1].filePath))))}'), '${d[0]}')`;
218
219
  }).join('\n,')}
219
220
  })` : ''].join('');
220
- }).join('\n\n'), `declare module '@tanstack/react-router' {
221
+ }).join('\n\n'), '// Populate the FileRoutesByPath interface', `declare module '@tanstack/react-router' {
221
222
  interface FileRoutesByPath {
222
223
  ${routeNodes.map(routeNode => {
223
224
  return `'${removeTrailingUnderscores(routeNode.routePath)}': {
@@ -226,7 +227,7 @@ async function generator(config) {
226
227
  }`;
227
228
  }).join('\n')}
228
229
  }
229
- }`, `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`].filter(Boolean).join('\n');
230
+ }`, '// Create and export the route tree', `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`].filter(Boolean).join('\n\n');
230
231
  const routeConfigFileContent = await prettier__namespace.format(routeImports, {
231
232
  semi: false,
232
233
  singleQuote: config.quoteStyle === 'single',
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sources":["../../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'\nimport { existsSync } from 'fs'\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, {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 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(\n (d) => ![`/${routePathIdPrefix + rootPathId}`].includes(d.routePath || ''),\n )\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 (\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((d) => d.routePath === node.routePath)\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 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 './${replaceBackslash(\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 './${replaceBackslash(\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('./${replaceBackslash(\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('./${replaceBackslash(\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 ]\n .filter(Boolean)\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 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","withFileTypes","filter","d","name","startsWith","Promise","all","map","dirent","fullPath","join","relativePath","isDirectory","match","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","includes","routeTree","routePiecesByPath","handleNode","node","parentRoute","hasParentRoute","parent","trimmedPath","trimPathLeft","isNonPath","isNonLayout","cleanedPath","removeUnderscores","isVirtual","anchorRoute","find","children","forEach","buildRouteConfig","nodes","depth","routeCode","readFile","isRoot","escapedRoutePath","removeTrailingUnderscores","replaceAll","quote","quoteStyle","replaced","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","sortedRouteNodes","imports","Object","entries","FileRoute","some","lazyFn","loader","lazyRouteComponent","component","errorComponent","pendingComponent","routeImports","relative","dirname","generatedRouteTree","loaderNode","componentNode","errorComponentNode","pendingComponentNode","routeNode","routeConfigFileContent","prettier","format","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":["../../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'\nimport { existsSync } from 'fs'\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, { 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 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(\n (d) => ![`/${routePathIdPrefix + rootPathId}`].includes(d.routePath || ''),\n )\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 (\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((d) => d.routePath === node.routePath)\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 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 virtualRouteNodes = sortedRouteNodes.filter((d) => d.isVirtual)\n\n const routeImports = [\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(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 './${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\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 = new FileRoute('${removeTrailingUnderscores(\n node.routePath,\n )}').createRoute()`\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\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('./${replaceBackslash(\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('./${replaceBackslash(\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 '// 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 '// Create and export the route tree',\n `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`,\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 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 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","withFileTypes","filter","d","name","startsWith","Promise","all","map","dirent","fullPath","join","relativePath","isDirectory","match","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","includes","routeTree","routePiecesByPath","handleNode","node","parentRoute","hasParentRoute","parent","trimmedPath","trimPathLeft","isNonPath","isNonLayout","cleanedPath","removeUnderscores","isVirtual","anchorRoute","find","children","forEach","buildRouteConfig","nodes","depth","routeCode","readFile","isRoot","escapedRoutePath","removeTrailingUnderscores","replaceAll","quote","quoteStyle","replaced","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","sortedRouteNodes","imports","Object","entries","FileRoute","some","lazyFn","loader","lazyRouteComponent","component","errorComponent","pendingComponent","virtualRouteNodes","routeImports","relative","dirname","generatedRouteTree","loaderNode","componentNode","errorComponentNode","pendingComponentNode","routeNode","routeConfigFileContent","prettier","format","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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tanstack/router-cli",
3
3
  "author": "Tanner Linsley",
4
- "version": "1.5.1",
4
+ "version": "1.5.2",
5
5
  "license": "MIT",
6
6
  "repository": "tanstack/router",
7
7
  "homepage": "https://tanstack.com/router",
@@ -58,7 +58,7 @@
58
58
  "through2": "^4.0.2",
59
59
  "yargs": "^17.6.2",
60
60
  "zod": "^3.19.1",
61
- "@tanstack/react-router": "1.5.1"
61
+ "@tanstack/react-router": "1.5.2"
62
62
  },
63
63
  "scripts": {
64
64
  "build": "rollup --config rollup.config.js"
package/src/generator.ts CHANGED
@@ -36,7 +36,7 @@ async function getRouteNodes(config: Config) {
36
36
 
37
37
  async function recurse(dir: string) {
38
38
  const fullDir = path.resolve(config.routesDirectory, dir)
39
- let dirList = await fs.readdir(fullDir, {withFileTypes: true})
39
+ let dirList = await fs.readdir(fullDir, { withFileTypes: true })
40
40
 
41
41
  dirList = dirList.filter((d) => {
42
42
  if (
@@ -304,33 +304,38 @@ export async function generator(config: Config) {
304
304
  .filter((d) => d[1])
305
305
  .map((d) => d[0])
306
306
 
307
+ const virtualRouteNodes = sortedRouteNodes.filter((d) => d.isVirtual)
308
+
307
309
  const routeImports = [
310
+ '// This file is auto-generated by TanStack Router',
308
311
  imports.length
309
312
  ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\n`
310
313
  : '',
311
- `import { Route as rootRoute } from './${replaceBackslash(
312
- path.relative(
313
- path.dirname(config.generatedRouteTree),
314
- path.resolve(config.routesDirectory, routePathIdPrefix + rootPathId),
315
- ),
316
- )}'`,
317
- ...sortedRouteNodes
318
- .filter((d) => !d.isVirtual)
319
- .map((node) => {
320
- return `import { Route as ${
321
- node.variableName
322
- }Import } from './${replaceBackslash(
323
- removeExt(
324
- path.relative(
325
- path.dirname(config.generatedRouteTree),
326
- path.resolve(config.routesDirectory, node.filePath),
314
+ '// Import Routes',
315
+ [
316
+ `import { Route as rootRoute } from './${replaceBackslash(
317
+ path.relative(
318
+ path.dirname(config.generatedRouteTree),
319
+ path.resolve(config.routesDirectory, routePathIdPrefix + rootPathId),
320
+ ),
321
+ )}'`,
322
+ ...sortedRouteNodes
323
+ .filter((d) => !d.isVirtual)
324
+ .map((node) => {
325
+ return `import { Route as ${
326
+ node.variableName
327
+ }Import } from './${replaceBackslash(
328
+ removeExt(
329
+ path.relative(
330
+ path.dirname(config.generatedRouteTree),
331
+ path.resolve(config.routesDirectory, node.filePath),
332
+ ),
327
333
  ),
328
- ),
329
- )}'`
330
- }),
331
- '\n',
332
- sortedRouteNodes
333
- .filter((d) => d.isVirtual)
334
+ )}'`
335
+ }),
336
+ ].join('\n'),
337
+ virtualRouteNodes.length ? '// Create Virtual Routes' : '',
338
+ virtualRouteNodes
334
339
  .map((node) => {
335
340
  return `const ${
336
341
  node.variableName
@@ -339,7 +344,7 @@ export async function generator(config: Config) {
339
344
  )}').createRoute()`
340
345
  })
341
346
  .join('\n'),
342
- '\n',
347
+ '// Create/Update Routes',
343
348
  sortedRouteNodes
344
349
  .map((node) => {
345
350
  const loaderNode = routePiecesByPath[node.routePath!]?.loader
@@ -398,6 +403,7 @@ export async function generator(config: Config) {
398
403
  ].join('')
399
404
  })
400
405
  .join('\n\n'),
406
+ '// Populate the FileRoutesByPath interface',
401
407
  `declare module '@tanstack/react-router' {
402
408
  interface FileRoutesByPath {
403
409
  ${routeNodes
@@ -414,10 +420,11 @@ export async function generator(config: Config) {
414
420
  .join('\n')}
415
421
  }
416
422
  }`,
423
+ '// Create and export the route tree',
417
424
  `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`,
418
425
  ]
419
426
  .filter(Boolean)
420
- .join('\n')
427
+ .join('\n\n')
421
428
 
422
429
  const routeConfigFileContent = await prettier.format(routeImports, {
423
430
  semi: false,