@tanstack/router-cli 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.
- package/build/cjs/generator.js +8 -12
- package/build/cjs/generator.js.map +1 -1
- package/package.json +2 -2
- package/src/generator.ts +24 -30
package/build/cjs/generator.js
CHANGED
|
@@ -63,10 +63,10 @@ async function getRouteNodes(config) {
|
|
|
63
63
|
if (stat.isDirectory()) {
|
|
64
64
|
await recurse(relativePath);
|
|
65
65
|
} else {
|
|
66
|
-
const filePath = path.join(dir, fileName);
|
|
66
|
+
const filePath = replaceBackslash(path.join(dir, fileName));
|
|
67
67
|
const filePathNoExt = removeExt(filePath);
|
|
68
|
-
let routePath =
|
|
69
|
-
const variableName =
|
|
68
|
+
let routePath = reactRouter.cleanPath(`/${filePathNoExt.split('.').join('/')}`) || '';
|
|
69
|
+
const variableName = routePathToVariable(routePath);
|
|
70
70
|
|
|
71
71
|
// Remove the index from the route path and
|
|
72
72
|
// if the route path is empty, use `/'
|
|
@@ -122,11 +122,7 @@ async function generator(config) {
|
|
|
122
122
|
};
|
|
123
123
|
const start = Date.now();
|
|
124
124
|
const routePathIdPrefix = config.routeFilePrefix ?? '';
|
|
125
|
-
|
|
126
|
-
const sortRouteNodes = nodes => {
|
|
127
|
-
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}`);
|
|
128
|
-
};
|
|
129
|
-
preRouteNodes = sortRouteNodes(preRouteNodes);
|
|
125
|
+
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}`);
|
|
130
126
|
const routeTree = [];
|
|
131
127
|
const routePiecesByPath = {};
|
|
132
128
|
|
|
@@ -253,8 +249,8 @@ async function generator(config) {
|
|
|
253
249
|
}
|
|
254
250
|
console.log(`🌲 Processed ${routeNodes.length} routes in ${Date.now() - start}ms`);
|
|
255
251
|
}
|
|
256
|
-
function
|
|
257
|
-
return removeUnderscores(d)?.replace(/\$/g, '')?.split(/[/-]/g).map((d, i) => i > 0 ? capitalize(d) : d).join('').replace(/([^a-zA-Z0-9]|[\.])/gm, '') ?? '';
|
|
252
|
+
function routePathToVariable(d) {
|
|
253
|
+
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, '') ?? '';
|
|
258
254
|
}
|
|
259
255
|
function removeExt(d) {
|
|
260
256
|
return d.substring(0, d.lastIndexOf('.')) || d;
|
|
@@ -288,7 +284,7 @@ function capitalize(s) {
|
|
|
288
284
|
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
289
285
|
}
|
|
290
286
|
function sanitize(s) {
|
|
291
|
-
return replaceBackslash(s
|
|
287
|
+
return replaceBackslash(s.replace(/\\index/gi, ''));
|
|
292
288
|
}
|
|
293
289
|
function removeUnderscores(s) {
|
|
294
290
|
return s?.replace(/(^_|_$)/, '').replace(/(\/_|_\/)/, '/');
|
|
@@ -297,7 +293,7 @@ function removeTrailingUnderscores(s) {
|
|
|
297
293
|
return s?.replace(/(_$)/, '').replace(/(_\/)/, '/');
|
|
298
294
|
}
|
|
299
295
|
function replaceBackslash(s) {
|
|
300
|
-
return s
|
|
296
|
+
return s.replace(/\\/gi, '/');
|
|
301
297
|
}
|
|
302
298
|
function hasParentRoute(routes, routePathToCheck) {
|
|
303
299
|
if (!routePathToCheck || routePathToCheck === '/') {
|
|
@@ -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'\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","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'\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","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.3.
|
|
4
|
+
"version": "1.3.5",
|
|
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.3.
|
|
61
|
+
"@tanstack/react-router": "1.3.5"
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|
|
64
64
|
"build": "rollup --config rollup.config.js"
|
package/src/generator.ts
CHANGED
|
@@ -61,13 +61,11 @@ async function getRouteNodes(config: Config) {
|
|
|
61
61
|
if (stat.isDirectory()) {
|
|
62
62
|
await recurse(relativePath)
|
|
63
63
|
} else {
|
|
64
|
-
const filePath = path.join(dir, fileName)
|
|
64
|
+
const filePath = replaceBackslash(path.join(dir, fileName))
|
|
65
65
|
const filePathNoExt = removeExt(filePath)
|
|
66
66
|
let routePath =
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
) ?? ''
|
|
70
|
-
const variableName = fileToVariable(routePath)
|
|
67
|
+
cleanPath(`/${filePathNoExt.split('.').join('/')}`) || ''
|
|
68
|
+
const variableName = routePathToVariable(routePath)
|
|
71
69
|
|
|
72
70
|
// Remove the index from the route path and
|
|
73
71
|
// if the route path is empty, use `/'
|
|
@@ -149,26 +147,20 @@ export async function generator(config: Config) {
|
|
|
149
147
|
const start = Date.now()
|
|
150
148
|
const routePathIdPrefix = config.routeFilePrefix ?? ''
|
|
151
149
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
(d) => (d.routePath?.endsWith('/') ? -1 : 1),
|
|
167
|
-
(d) => d.routePath,
|
|
168
|
-
]).filter((d) => d.routePath !== `/${routePathIdPrefix + rootPathId}`)
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
preRouteNodes = sortRouteNodes(preRouteNodes)
|
|
150
|
+
const preRouteNodes = multiSortBy(await getRouteNodes(config), [
|
|
151
|
+
(d) => (d.routePath === '/' ? -1 : 1),
|
|
152
|
+
(d) => d.routePath?.split('/').length,
|
|
153
|
+
(d) => (d.filePath?.match(/[./]index[.]/) ? 1 : -1),
|
|
154
|
+
(d) =>
|
|
155
|
+
d.filePath?.match(
|
|
156
|
+
/[./](component|errorComponent|pendingComponent|loader)[.]/,
|
|
157
|
+
)
|
|
158
|
+
? 1
|
|
159
|
+
: -1,
|
|
160
|
+
(d) => (d.filePath?.match(/[./]route[.]/) ? -1 : 1),
|
|
161
|
+
(d) => (d.routePath?.endsWith('/') ? -1 : 1),
|
|
162
|
+
(d) => d.routePath,
|
|
163
|
+
]).filter((d) => d.routePath !== `/${routePathIdPrefix + rootPathId}`)
|
|
172
164
|
|
|
173
165
|
const routeTree: RouteNode[] = []
|
|
174
166
|
const routePiecesByPath: Record<string, RouteSubNode> = {}
|
|
@@ -460,9 +452,11 @@ export async function generator(config: Config) {
|
|
|
460
452
|
)
|
|
461
453
|
}
|
|
462
454
|
|
|
463
|
-
function
|
|
455
|
+
function routePathToVariable(d: string): string {
|
|
464
456
|
return (
|
|
465
457
|
removeUnderscores(d)
|
|
458
|
+
?.replace(/\/\$\//g, '/splat/')
|
|
459
|
+
?.replace(/\$$/g, 'splat')
|
|
466
460
|
?.replace(/\$/g, '')
|
|
467
461
|
?.split(/[/-]/g)
|
|
468
462
|
.map((d, i) => (i > 0 ? capitalize(d) : d))
|
|
@@ -516,8 +510,8 @@ function capitalize(s: string) {
|
|
|
516
510
|
return s.charAt(0).toUpperCase() + s.slice(1)
|
|
517
511
|
}
|
|
518
512
|
|
|
519
|
-
function sanitize(s
|
|
520
|
-
return replaceBackslash(s
|
|
513
|
+
function sanitize(s: string) {
|
|
514
|
+
return replaceBackslash(s.replace(/\\index/gi, ''))
|
|
521
515
|
}
|
|
522
516
|
|
|
523
517
|
function removeUnderscores(s?: string) {
|
|
@@ -528,8 +522,8 @@ function removeTrailingUnderscores(s?: string) {
|
|
|
528
522
|
return s?.replace(/(_$)/, '').replace(/(_\/)/, '/')
|
|
529
523
|
}
|
|
530
524
|
|
|
531
|
-
function replaceBackslash(s
|
|
532
|
-
return s
|
|
525
|
+
function replaceBackslash(s: string) {
|
|
526
|
+
return s.replace(/\\/gi, '/')
|
|
533
527
|
}
|
|
534
528
|
|
|
535
529
|
export function hasParentRoute(
|