@tanstack/router-cli 1.1.10 → 1.1.12
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/config.js +3 -5
- package/build/cjs/config.js.map +1 -1
- package/build/cjs/generator.js +6 -1
- package/build/cjs/generator.js.map +1 -1
- package/build/types/config.d.ts +3 -4
- package/package.json +2 -2
- package/src/config.ts +3 -3
- package/src/generator.ts +15 -2
package/build/cjs/config.js
CHANGED
|
@@ -16,7 +16,7 @@ var zod = require('zod');
|
|
|
16
16
|
|
|
17
17
|
const configSchema = zod.z.object({
|
|
18
18
|
routeFilePrefix: zod.z.string().optional(),
|
|
19
|
-
routeFileIgnorePrefix: zod.z.string().optional(),
|
|
19
|
+
routeFileIgnorePrefix: zod.z.string().optional().default('-'),
|
|
20
20
|
routesDirectory: zod.z.string(),
|
|
21
21
|
generatedRouteTree: zod.z.string(),
|
|
22
22
|
quoteStyle: zod.z.enum(['single', 'double']).optional().default('single'),
|
|
@@ -27,11 +27,9 @@ const configSchema = zod.z.object({
|
|
|
27
27
|
const configFilePathJson = path.resolve(process.cwd(), 'tsr.config.json');
|
|
28
28
|
async function getConfig() {
|
|
29
29
|
const config = await fs.readJson(configFilePathJson);
|
|
30
|
-
return
|
|
31
|
-
routeFileIgnorePrefix: '-',
|
|
32
|
-
...configSchema.parse(config)
|
|
33
|
-
};
|
|
30
|
+
return configSchema.parse(config);
|
|
34
31
|
}
|
|
35
32
|
|
|
33
|
+
exports.configSchema = configSchema;
|
|
36
34
|
exports.getConfig = getConfig;
|
|
37
35
|
//# sourceMappingURL=config.js.map
|
package/build/cjs/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sources":["../../src/config.ts"],"sourcesContent":["import path from 'path'\nimport fs from 'fs-extra'\nimport { z } from 'zod'\n\
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../src/config.ts"],"sourcesContent":["import path from 'path'\nimport fs from 'fs-extra'\nimport { z } from 'zod'\n\nexport const configSchema = z.object({\n routeFilePrefix: z.string().optional(),\n routeFileIgnorePrefix: z.string().optional().default('-'),\n routesDirectory: z.string(),\n generatedRouteTree: z.string(),\n quoteStyle: z.enum(['single', 'double']).optional().default('single'),\n future: z\n .object({\n unstable_codeSplitting: z.boolean().optional(),\n })\n .optional(),\n})\n\nexport type Config = z.infer<typeof configSchema>\n\nconst configFilePathJson = path.resolve(process.cwd(), 'tsr.config.json')\n\nexport async function getConfig(): Promise<Config> {\n const config = (await fs.readJson(configFilePathJson)) as unknown as Config\n\n return configSchema.parse(config)\n}\n"],"names":["configSchema","z","object","routeFilePrefix","string","optional","routeFileIgnorePrefix","default","routesDirectory","generatedRouteTree","quoteStyle","enum","future","unstable_codeSplitting","boolean","configFilePathJson","path","resolve","process","cwd","getConfig","config","fs","readJson","parse"],"mappings":";;;;;;;;;;;;;;;;MAIaA,YAAY,GAAGC,KAAC,CAACC,MAAM,CAAC;EACnCC,eAAe,EAAEF,KAAC,CAACG,MAAM,EAAE,CAACC,QAAQ,EAAE;AACtCC,EAAAA,qBAAqB,EAAEL,KAAC,CAACG,MAAM,EAAE,CAACC,QAAQ,EAAE,CAACE,OAAO,CAAC,GAAG,CAAC;AACzDC,EAAAA,eAAe,EAAEP,KAAC,CAACG,MAAM,EAAE;AAC3BK,EAAAA,kBAAkB,EAAER,KAAC,CAACG,MAAM,EAAE;AAC9BM,EAAAA,UAAU,EAAET,KAAC,CAACU,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAACN,QAAQ,EAAE,CAACE,OAAO,CAAC,QAAQ,CAAC;AACrEK,EAAAA,MAAM,EAAEX,KAAC,CACNC,MAAM,CAAC;IACNW,sBAAsB,EAAEZ,KAAC,CAACa,OAAO,EAAE,CAACT,QAAQ,EAAC;GAC9C,CAAC,CACDA,QAAQ,EAAC;AACd,CAAC,EAAC;AAIF,MAAMU,kBAAkB,GAAGC,IAAI,CAACC,OAAO,CAACC,OAAO,CAACC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAA;AAElE,eAAeC,SAASA,GAAoB;EACjD,MAAMC,MAAM,GAAI,MAAMC,EAAE,CAACC,QAAQ,CAACR,kBAAkB,CAAuB,CAAA;AAE3E,EAAA,OAAOf,YAAY,CAACwB,KAAK,CAACH,MAAM,CAAC,CAAA;AACnC;;;;;"}
|
package/build/cjs/generator.js
CHANGED
|
@@ -199,7 +199,12 @@ async function generator(config) {
|
|
|
199
199
|
}
|
|
200
200
|
const routeConfigChildrenText = await buildRouteConfig(routeTree);
|
|
201
201
|
const sortedRouteNodes = multiSortBy(routeNodes, [d => d.routePath?.includes(`/${routePathIdPrefix + rootPathId}`) ? -1 : 1, d => d.routePath?.split('/').length, d => d.routePath?.endsWith("index'") ? -1 : 1, d => d]);
|
|
202
|
-
const
|
|
202
|
+
const imports = Object.entries({
|
|
203
|
+
FileRoute: sortedRouteNodes.some(d => d.isVirtual),
|
|
204
|
+
lazyFn: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.loader),
|
|
205
|
+
lazyRouteComponent: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.component)
|
|
206
|
+
}).filter(d => d[1]).map(d => d[0]);
|
|
207
|
+
const routeImports = [imports.length ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\n` : '', `import { Route as rootRoute } from './${sanitize(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, routePathIdPrefix + rootPathId)))}'`, ...sortedRouteNodes.filter(d => !d.isVirtual).map(node => {
|
|
203
208
|
return `import { Route as ${node.variableName}Import } from './${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, node.filePath))))}'`;
|
|
204
209
|
}), '\n', sortedRouteNodes.filter(d => d.isVirtual).map(node => {
|
|
205
210
|
return `const ${node.variableName}Import = new FileRoute('${node.routePath}').createRoute()`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sources":["../../src/generator.ts"],"sourcesContent":["import path from 'path'\nimport fs from 'fs-extra'\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 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 if (routePath === 'index') {\n routePath = '/'\n } else if (routePath.endsWith('/index')) {\n routePath = routePath.replace(/\\/index$/, '/')\n }\n\n routeNodes.push({\n filePath,\n fullPath,\n routePath,\n variableName,\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 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.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 if (config.future?.unstable_codeSplitting) {\n node.isRoute = node.routePath?.endsWith('/route')\n node.isComponent = node.routePath?.endsWith('/component')\n node.isLoader = node.routePath?.endsWith('/loader')\n\n if (node.isComponent || node.isLoader || node.isRoute) {\n node.routePath = node.routePath?.replace(\n /\\/(component|loader|route)$/,\n '',\n )\n }\n }\n\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 (node.isLoader || node.isComponent) {\n routePiecesByPath[node.routePath!] =\n routePiecesByPath[node.routePath!] || {}\n\n routePiecesByPath[node.routePath!]![\n node.isLoader ? 'loader' : 'component'\n ] = node\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 if (config.future?.unstable_codeSplitting) {\n Object.keys(routePiecesByPath).forEach((routePath) => {\n const found = routeNodes.find((d) => d.routePath === routePath)\n\n if (!found) {\n const pieces = routePiecesByPath[routePath]!\n const componentOrLoader = pieces.component || pieces.loader\n if (componentOrLoader) {\n componentOrLoader.isVirtual = true\n handleNode(componentOrLoader)\n }\n }\n })\n }\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 = node.routePath?.replaceAll('$', '$$$$') ?? ''\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 routeImports = [\n `import { FileRoute, lazyFn, lazyRouteComponent } 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 ${node.variableName}Import = new FileRoute('${node.routePath}').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\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\n ? `.update({ component: lazyRouteComponent(() => import('./${sanitize(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(\n config.routesDirectory,\n componentNode.filePath,\n ),\n ),\n ),\n )}'), 'component') })`\n : '',\n ].join('')\n })\n .join('\\n\\n'),\n ].join('\\n')\n\n const routeTypes = `declare module '@tanstack/react-router' {\n interface FileRoutesByPath {\n ${routeNodes\n .map((routeNode) => {\n return `'${routeNode.routePath}': {\n preLoaderRoute: typeof ${routeNode.variableName}Import\n parentRoute: typeof ${routeNode.parent?.variableName ?? 'root'}Route\n }`\n })\n .join('\\n')}\n }\n}`\n\n const routeConfig = `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`\n\n const routeConfigFileContent = await prettier.format(\n [routeImports, routeTypes, routeConfig].join('\\n\\n'),\n {\n semi: false,\n parser: 'typescript',\n },\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.ensureDir(path.dirname(path.resolve(config.generatedRouteTree)))\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 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","endsWith","replace","push","first","skipMessage","generator","console","log","taskId","checkLatest","start","Date","now","routePathIdPrefix","preRouteNodes","sortRouteNodes","nodes","multiSortBy","length","routeTree","routePiecesByPath","handleNode","node","future","unstable_codeSplitting","isRoute","isComponent","isLoader","parentRoute","hasParentRoute","parent","trimmedPath","trimPathLeft","isNonPath","isNonLayout","cleanedPath","removeUnderscores","children","forEach","Object","keys","found","find","pieces","componentOrLoader","component","loader","isVirtual","buildRouteConfig","depth","routeCode","readFile","isRoot","escapedRoutePath","replaceAll","quote","quoteStyle","replaced","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","sortedRouteNodes","includes","routeImports","sanitize","relative","dirname","generatedRouteTree","loaderNode","componentNode","routeTypes","routeNode","routeConfig","routeConfigFileContent","prettier","format","semi","parser","routeTreeContent","catch","err","code","undefined","ensureDir","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 fs from 'fs-extra'\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 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 if (routePath === 'index') {\n routePath = '/'\n } else if (routePath.endsWith('/index')) {\n routePath = routePath.replace(/\\/index$/, '/')\n }\n\n routeNodes.push({\n filePath,\n fullPath,\n routePath,\n variableName,\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 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.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 if (config.future?.unstable_codeSplitting) {\n node.isRoute = node.routePath?.endsWith('/route')\n node.isComponent = node.routePath?.endsWith('/component')\n node.isLoader = node.routePath?.endsWith('/loader')\n\n if (node.isComponent || node.isLoader || node.isRoute) {\n node.routePath = node.routePath?.replace(\n /\\/(component|loader|route)$/,\n '',\n )\n }\n }\n\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 (node.isLoader || node.isComponent) {\n routePiecesByPath[node.routePath!] =\n routePiecesByPath[node.routePath!] || {}\n\n routePiecesByPath[node.routePath!]![\n node.isLoader ? 'loader' : 'component'\n ] = node\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 if (config.future?.unstable_codeSplitting) {\n Object.keys(routePiecesByPath).forEach((routePath) => {\n const found = routeNodes.find((d) => d.routePath === routePath)\n\n if (!found) {\n const pieces = routePiecesByPath[routePath]!\n const componentOrLoader = pieces.component || pieces.loader\n if (componentOrLoader) {\n componentOrLoader.isVirtual = true\n handleNode(componentOrLoader)\n }\n }\n })\n }\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 = node.routePath?.replaceAll('$', '$$$$') ?? ''\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) => routePiecesByPath[node.routePath!]?.component,\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 ${node.variableName}Import = new FileRoute('${node.routePath}').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\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\n ? `.update({ component: lazyRouteComponent(() => import('./${sanitize(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(\n config.routesDirectory,\n componentNode.filePath,\n ),\n ),\n ),\n )}'), 'component') })`\n : '',\n ].join('')\n })\n .join('\\n\\n'),\n ].join('\\n')\n\n const routeTypes = `declare module '@tanstack/react-router' {\n interface FileRoutesByPath {\n ${routeNodes\n .map((routeNode) => {\n return `'${routeNode.routePath}': {\n preLoaderRoute: typeof ${routeNode.variableName}Import\n parentRoute: typeof ${routeNode.parent?.variableName ?? 'root'}Route\n }`\n })\n .join('\\n')}\n }\n}`\n\n const routeConfig = `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`\n\n const routeConfigFileContent = await prettier.format(\n [routeImports, routeTypes, routeConfig].join('\\n\\n'),\n {\n semi: false,\n parser: 'typescript',\n },\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.ensureDir(path.dirname(path.resolve(config.generatedRouteTree)))\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 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","endsWith","replace","push","first","skipMessage","generator","console","log","taskId","checkLatest","start","Date","now","routePathIdPrefix","preRouteNodes","sortRouteNodes","nodes","multiSortBy","length","routeTree","routePiecesByPath","handleNode","node","future","unstable_codeSplitting","isRoute","isComponent","isLoader","parentRoute","hasParentRoute","parent","trimmedPath","trimPathLeft","isNonPath","isNonLayout","cleanedPath","removeUnderscores","children","forEach","Object","keys","found","find","pieces","componentOrLoader","component","loader","isVirtual","buildRouteConfig","depth","routeCode","readFile","isRoot","escapedRoutePath","replaceAll","quote","quoteStyle","replaced","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","sortedRouteNodes","includes","imports","entries","FileRoute","some","lazyFn","lazyRouteComponent","routeImports","sanitize","relative","dirname","generatedRouteTree","loaderNode","componentNode","routeTypes","routeNode","routeConfig","routeConfigFileContent","prettier","format","semi","parser","routeTreeContent","catch","err","code","undefined","ensureDir","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/build/types/config.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
declare const configSchema: z.ZodObject<{
|
|
2
|
+
export declare const configSchema: z.ZodObject<{
|
|
3
3
|
routeFilePrefix: z.ZodOptional<z.ZodString>;
|
|
4
|
-
routeFileIgnorePrefix: z.ZodOptional<z.ZodString
|
|
4
|
+
routeFileIgnorePrefix: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
5
5
|
routesDirectory: z.ZodString;
|
|
6
6
|
generatedRouteTree: z.ZodString;
|
|
7
7
|
quoteStyle: z.ZodDefault<z.ZodOptional<z.ZodEnum<["single", "double"]>>>;
|
|
@@ -13,11 +13,11 @@ declare const configSchema: z.ZodObject<{
|
|
|
13
13
|
unstable_codeSplitting?: boolean | undefined;
|
|
14
14
|
}>>;
|
|
15
15
|
}, "strip", z.ZodTypeAny, {
|
|
16
|
+
routeFileIgnorePrefix: string;
|
|
16
17
|
routesDirectory: string;
|
|
17
18
|
generatedRouteTree: string;
|
|
18
19
|
quoteStyle: "single" | "double";
|
|
19
20
|
routeFilePrefix?: string | undefined;
|
|
20
|
-
routeFileIgnorePrefix?: string | undefined;
|
|
21
21
|
future?: {
|
|
22
22
|
unstable_codeSplitting?: boolean | undefined;
|
|
23
23
|
} | undefined;
|
|
@@ -33,4 +33,3 @@ declare const configSchema: z.ZodObject<{
|
|
|
33
33
|
}>;
|
|
34
34
|
export type Config = z.infer<typeof configSchema>;
|
|
35
35
|
export declare function getConfig(): Promise<Config>;
|
|
36
|
-
export {};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/router-cli",
|
|
3
3
|
"author": "Tanner Linsley",
|
|
4
|
-
"version": "1.1.
|
|
4
|
+
"version": "1.1.12",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": "tanstack/router",
|
|
7
7
|
"homepage": "https://tanstack.com/router",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"through2": "^4.0.2",
|
|
60
60
|
"yargs": "^17.6.2",
|
|
61
61
|
"zod": "^3.19.1",
|
|
62
|
-
"@tanstack/react-router": "1.1.
|
|
62
|
+
"@tanstack/react-router": "1.1.12"
|
|
63
63
|
},
|
|
64
64
|
"scripts": {
|
|
65
65
|
"build": "rollup --config rollup.config.js"
|
package/src/config.ts
CHANGED
|
@@ -2,9 +2,9 @@ import path from 'path'
|
|
|
2
2
|
import fs from 'fs-extra'
|
|
3
3
|
import { z } from 'zod'
|
|
4
4
|
|
|
5
|
-
const configSchema = z.object({
|
|
5
|
+
export const configSchema = z.object({
|
|
6
6
|
routeFilePrefix: z.string().optional(),
|
|
7
|
-
routeFileIgnorePrefix: z.string().optional(),
|
|
7
|
+
routeFileIgnorePrefix: z.string().optional().default('-'),
|
|
8
8
|
routesDirectory: z.string(),
|
|
9
9
|
generatedRouteTree: z.string(),
|
|
10
10
|
quoteStyle: z.enum(['single', 'double']).optional().default('single'),
|
|
@@ -22,5 +22,5 @@ const configFilePathJson = path.resolve(process.cwd(), 'tsr.config.json')
|
|
|
22
22
|
export async function getConfig(): Promise<Config> {
|
|
23
23
|
const config = (await fs.readJson(configFilePathJson)) as unknown as Config
|
|
24
24
|
|
|
25
|
-
return
|
|
25
|
+
return configSchema.parse(config)
|
|
26
26
|
}
|
package/src/generator.ts
CHANGED
|
@@ -270,9 +270,22 @@ export async function generator(config: Config) {
|
|
|
270
270
|
(d) => d,
|
|
271
271
|
])
|
|
272
272
|
|
|
273
|
+
const imports = Object.entries({
|
|
274
|
+
FileRoute: sortedRouteNodes.some((d) => d.isVirtual),
|
|
275
|
+
lazyFn: sortedRouteNodes.some(
|
|
276
|
+
(node) => routePiecesByPath[node.routePath!]?.loader,
|
|
277
|
+
),
|
|
278
|
+
lazyRouteComponent: sortedRouteNodes.some(
|
|
279
|
+
(node) => routePiecesByPath[node.routePath!]?.component,
|
|
280
|
+
),
|
|
281
|
+
})
|
|
282
|
+
.filter((d) => d[1])
|
|
283
|
+
.map((d) => d[0])
|
|
284
|
+
|
|
273
285
|
const routeImports = [
|
|
274
|
-
|
|
275
|
-
|
|
286
|
+
imports.length
|
|
287
|
+
? `import { ${imports.join(', ')} } from '@tanstack/react-router'\n`
|
|
288
|
+
: '',
|
|
276
289
|
`import { Route as rootRoute } from './${sanitize(
|
|
277
290
|
path.relative(
|
|
278
291
|
path.dirname(config.generatedRouteTree),
|