@tanstack/router-cli 1.1.7 → 1.1.8
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 +30 -10
- package/build/cjs/generator.js.map +1 -1
- package/build/types/generator.d.ts +1 -0
- package/package.json +2 -2
- package/src/generator.ts +59 -23
package/build/cjs/generator.js
CHANGED
|
@@ -110,14 +110,18 @@ async function generator(config) {
|
|
|
110
110
|
};
|
|
111
111
|
const start = Date.now();
|
|
112
112
|
const routePathIdPrefix = config.routeFilePrefix ?? '';
|
|
113
|
-
let
|
|
114
|
-
|
|
113
|
+
let preRouteNodes = await getRouteNodes(config);
|
|
114
|
+
const sortRouteNodes = nodes => {
|
|
115
|
+
return multiSortBy(nodes, [d => d.routePath === '/' ? -1 : 1, d => d.routePath?.split('/').length, d => d.routePath?.endsWith('/') ? -1 : 1, d => d.routePath]).filter(d => d.routePath !== `/${routePathIdPrefix + rootPathId}`);
|
|
116
|
+
};
|
|
117
|
+
preRouteNodes = sortRouteNodes(preRouteNodes);
|
|
115
118
|
const routeTree = [];
|
|
116
119
|
const routePiecesByPath = {};
|
|
117
120
|
|
|
118
121
|
// Loop over the flat list of routeNodes and
|
|
119
122
|
// build up a tree based on the routeNodes' routePath
|
|
120
|
-
routeNodes =
|
|
123
|
+
let routeNodes = [];
|
|
124
|
+
const handleNode = node => {
|
|
121
125
|
if (config.future?.unstable_codeSplitting) {
|
|
122
126
|
node.isRoute = node.routePath?.endsWith('/route');
|
|
123
127
|
node.isComponent = node.routePath?.endsWith('/component');
|
|
@@ -139,7 +143,7 @@ async function generator(config) {
|
|
|
139
143
|
if (node.isLoader || node.isComponent) {
|
|
140
144
|
routePiecesByPath[node.routePath] = routePiecesByPath[node.routePath] || {};
|
|
141
145
|
routePiecesByPath[node.routePath][node.isLoader ? 'loader' : 'component'] = node;
|
|
142
|
-
return
|
|
146
|
+
return;
|
|
143
147
|
}
|
|
144
148
|
}
|
|
145
149
|
if (node.parent) {
|
|
@@ -148,8 +152,22 @@ async function generator(config) {
|
|
|
148
152
|
} else {
|
|
149
153
|
routeTree.push(node);
|
|
150
154
|
}
|
|
151
|
-
|
|
152
|
-
}
|
|
155
|
+
routeNodes.push(node);
|
|
156
|
+
};
|
|
157
|
+
preRouteNodes.forEach(node => handleNode(node));
|
|
158
|
+
if (config.future?.unstable_codeSplitting) {
|
|
159
|
+
Object.keys(routePiecesByPath).forEach(routePath => {
|
|
160
|
+
const found = routeNodes.find(d => d.routePath === routePath);
|
|
161
|
+
if (!found) {
|
|
162
|
+
const pieces = routePiecesByPath[routePath];
|
|
163
|
+
const componentOrLoader = pieces.component || pieces.loader;
|
|
164
|
+
if (componentOrLoader) {
|
|
165
|
+
componentOrLoader.isVirtual = true;
|
|
166
|
+
handleNode(componentOrLoader);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
153
171
|
async function buildRouteConfig(nodes, depth = 1) {
|
|
154
172
|
const children = nodes.map(async node => {
|
|
155
173
|
const routeCode = await fs.readFile(node.fullPath, 'utf-8');
|
|
@@ -181,9 +199,11 @@ async function generator(config) {
|
|
|
181
199
|
}
|
|
182
200
|
const routeConfigChildrenText = await buildRouteConfig(routeTree);
|
|
183
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]);
|
|
184
|
-
const routeImports = [`import { lazyFn, lazyRouteComponent } from '@tanstack/react-router'`, '\n', `import { Route as rootRoute } from './${sanitize(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, routePathIdPrefix + rootPathId)))}'`, ...sortedRouteNodes.map(node => {
|
|
202
|
+
const routeImports = [`import { FileRoute, lazyFn, lazyRouteComponent } 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 => {
|
|
185
203
|
return `import { Route as ${node.variableName}Import } from './${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, node.filePath))))}'`;
|
|
186
|
-
}), '\n', sortedRouteNodes.map(node => {
|
|
204
|
+
}), '\n', sortedRouteNodes.filter(d => d.isVirtual).map(node => {
|
|
205
|
+
return `const ${node.variableName}Import = new FileRoute('${node.routePath}').createRoute()`;
|
|
206
|
+
}).join('\n'), '\n', sortedRouteNodes.map(node => {
|
|
187
207
|
const loaderNode = routePiecesByPath[node.routePath]?.loader;
|
|
188
208
|
const componentNode = routePiecesByPath[node.routePath]?.component;
|
|
189
209
|
return [`const ${node.variableName}Route = ${node.variableName}Import.update({
|
|
@@ -275,8 +295,8 @@ function hasParentRoute(routes, routePathToCheck) {
|
|
|
275
295
|
}
|
|
276
296
|
const segments = routePathToCheck.split('/');
|
|
277
297
|
segments.pop(); // Remove the last segment
|
|
278
|
-
const
|
|
279
|
-
return hasParentRoute(routes,
|
|
298
|
+
const parentRoutePath = segments.join('/');
|
|
299
|
+
return hasParentRoute(routes, parentRoutePath);
|
|
280
300
|
}
|
|
281
301
|
|
|
282
302
|
exports.fileRouteRegex = fileRouteRegex;
|
|
@@ -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 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 routeNodes = await getRouteNodes(config)\n\n routeNodes = multiSortBy(routeNodes, [\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 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 routeNodes = routeNodes.filter((node) => {\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 return false\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 return true\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 { 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.map((node) => {\n return `import { Route as ${node.variableName}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 .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 parentRoute = segments.join('/')\n\n return hasParentRoute(routes, parentRoute)\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","multiSortBy","length","routeTree","routePiecesByPath","node","future","unstable_codeSplitting","isRoute","isComponent","isLoader","parentRoute","hasParentRoute","parent","trimmedPath","trimPathLeft","isNonPath","isNonLayout","cleanedPath","removeUnderscores","children","buildRouteConfig","nodes","depth","routeCode","readFile","isRoot","escapedRoutePath","replaceAll","quote","quoteStyle","replaced","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","sortedRouteNodes","includes","routeImports","sanitize","relative","dirname","generatedRouteTree","loaderNode","loader","componentNode","component","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"],"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 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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"}
|
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.8",
|
|
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.8"
|
|
63
63
|
},
|
|
64
64
|
"scripts": {
|
|
65
65
|
"build": "rollup --config rollup.config.js"
|
package/src/generator.ts
CHANGED
|
@@ -20,6 +20,7 @@ export type RouteNode = {
|
|
|
20
20
|
isRoute?: boolean
|
|
21
21
|
isLoader?: boolean
|
|
22
22
|
isComponent?: boolean
|
|
23
|
+
isVirtual?: boolean
|
|
23
24
|
isRoot?: boolean
|
|
24
25
|
children?: RouteNode[]
|
|
25
26
|
parent?: RouteNode
|
|
@@ -127,21 +128,27 @@ export async function generator(config: Config) {
|
|
|
127
128
|
const start = Date.now()
|
|
128
129
|
const routePathIdPrefix = config.routeFilePrefix ?? ''
|
|
129
130
|
|
|
130
|
-
let
|
|
131
|
+
let preRouteNodes = await getRouteNodes(config)
|
|
131
132
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
133
|
+
const sortRouteNodes = (nodes: RouteNode[]): RouteNode[] => {
|
|
134
|
+
return multiSortBy(nodes, [
|
|
135
|
+
(d) => (d.routePath === '/' ? -1 : 1),
|
|
136
|
+
(d) => d.routePath?.split('/').length,
|
|
137
|
+
(d) => (d.routePath?.endsWith('/') ? -1 : 1),
|
|
138
|
+
(d) => d.routePath,
|
|
139
|
+
]).filter((d) => d.routePath !== `/${routePathIdPrefix + rootPathId}`)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
preRouteNodes = sortRouteNodes(preRouteNodes)
|
|
138
143
|
|
|
139
144
|
const routeTree: RouteNode[] = []
|
|
140
145
|
const routePiecesByPath: Record<string, RouteSubNode> = {}
|
|
141
146
|
|
|
142
147
|
// Loop over the flat list of routeNodes and
|
|
143
148
|
// build up a tree based on the routeNodes' routePath
|
|
144
|
-
routeNodes =
|
|
149
|
+
let routeNodes: RouteNode[] = []
|
|
150
|
+
|
|
151
|
+
const handleNode = (node: RouteNode) => {
|
|
145
152
|
if (config.future?.unstable_codeSplitting) {
|
|
146
153
|
node.isRoute = node.routePath?.endsWith('/route')
|
|
147
154
|
node.isComponent = node.routePath?.endsWith('/component')
|
|
@@ -180,7 +187,8 @@ export async function generator(config: Config) {
|
|
|
180
187
|
routePiecesByPath[node.routePath!]![
|
|
181
188
|
node.isLoader ? 'loader' : 'component'
|
|
182
189
|
] = node
|
|
183
|
-
|
|
190
|
+
|
|
191
|
+
return
|
|
184
192
|
}
|
|
185
193
|
}
|
|
186
194
|
|
|
@@ -191,8 +199,25 @@ export async function generator(config: Config) {
|
|
|
191
199
|
routeTree.push(node)
|
|
192
200
|
}
|
|
193
201
|
|
|
194
|
-
|
|
195
|
-
}
|
|
202
|
+
routeNodes.push(node)
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
preRouteNodes.forEach((node) => handleNode(node))
|
|
206
|
+
|
|
207
|
+
if (config.future?.unstable_codeSplitting) {
|
|
208
|
+
Object.keys(routePiecesByPath).forEach((routePath) => {
|
|
209
|
+
const found = routeNodes.find((d) => d.routePath === routePath)
|
|
210
|
+
|
|
211
|
+
if (!found) {
|
|
212
|
+
const pieces = routePiecesByPath[routePath]!
|
|
213
|
+
const componentOrLoader = pieces.component || pieces.loader
|
|
214
|
+
if (componentOrLoader) {
|
|
215
|
+
componentOrLoader.isVirtual = true
|
|
216
|
+
handleNode(componentOrLoader)
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
})
|
|
220
|
+
}
|
|
196
221
|
|
|
197
222
|
async function buildRouteConfig(
|
|
198
223
|
nodes: RouteNode[],
|
|
@@ -246,7 +271,7 @@ export async function generator(config: Config) {
|
|
|
246
271
|
])
|
|
247
272
|
|
|
248
273
|
const routeImports = [
|
|
249
|
-
`import { lazyFn, lazyRouteComponent } from '@tanstack/react-router'`,
|
|
274
|
+
`import { FileRoute, lazyFn, lazyRouteComponent } from '@tanstack/react-router'`,
|
|
250
275
|
'\n',
|
|
251
276
|
`import { Route as rootRoute } from './${sanitize(
|
|
252
277
|
path.relative(
|
|
@@ -254,16 +279,27 @@ export async function generator(config: Config) {
|
|
|
254
279
|
path.resolve(config.routesDirectory, routePathIdPrefix + rootPathId),
|
|
255
280
|
),
|
|
256
281
|
)}'`,
|
|
257
|
-
...sortedRouteNodes
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
282
|
+
...sortedRouteNodes
|
|
283
|
+
.filter((d) => !d.isVirtual)
|
|
284
|
+
.map((node) => {
|
|
285
|
+
return `import { Route as ${
|
|
286
|
+
node.variableName
|
|
287
|
+
}Import } from './${sanitize(
|
|
288
|
+
removeExt(
|
|
289
|
+
path.relative(
|
|
290
|
+
path.dirname(config.generatedRouteTree),
|
|
291
|
+
path.resolve(config.routesDirectory, node.filePath),
|
|
292
|
+
),
|
|
263
293
|
),
|
|
264
|
-
)
|
|
265
|
-
)
|
|
266
|
-
|
|
294
|
+
)}'`
|
|
295
|
+
}),
|
|
296
|
+
'\n',
|
|
297
|
+
sortedRouteNodes
|
|
298
|
+
.filter((d) => d.isVirtual)
|
|
299
|
+
.map((node) => {
|
|
300
|
+
return `const ${node.variableName}Import = new FileRoute('${node.routePath}').createRoute()`
|
|
301
|
+
})
|
|
302
|
+
.join('\n'),
|
|
267
303
|
'\n',
|
|
268
304
|
sortedRouteNodes
|
|
269
305
|
.map((node) => {
|
|
@@ -450,7 +486,7 @@ export function hasParentRoute(
|
|
|
450
486
|
}
|
|
451
487
|
const segments = routePathToCheck.split('/')
|
|
452
488
|
segments.pop() // Remove the last segment
|
|
453
|
-
const
|
|
489
|
+
const parentRoutePath = segments.join('/')
|
|
454
490
|
|
|
455
|
-
return hasParentRoute(routes,
|
|
491
|
+
return hasParentRoute(routes, parentRoutePath)
|
|
456
492
|
}
|