@tanstack/router-cli 1.2.6 → 1.3.0
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 +20 -14
- package/build/cjs/generator.js.map +1 -1
- package/build/types/generator.d.ts +2 -0
- package/package.json +2 -2
- package/src/generator.ts +71 -24
package/build/cjs/generator.js
CHANGED
|
@@ -126,9 +126,11 @@ async function generator(config) {
|
|
|
126
126
|
if (config.future?.unstable_codeSplitting) {
|
|
127
127
|
node.isRoute = node.routePath?.endsWith('/route');
|
|
128
128
|
node.isComponent = node.routePath?.endsWith('/component');
|
|
129
|
+
node.isErrorComponent = node.routePath?.endsWith('/errorComponent');
|
|
130
|
+
node.isPendingComponent = node.routePath?.endsWith('/pendingComponent');
|
|
129
131
|
node.isLoader = node.routePath?.endsWith('/loader');
|
|
130
|
-
if (node.isComponent || node.isLoader || node.isRoute) {
|
|
131
|
-
node.routePath = node.routePath?.replace(/\/(component|loader|route)$/, '');
|
|
132
|
+
if (node.isComponent || node.isErrorComponent || node.isPendingComponent || node.isLoader || node.isRoute) {
|
|
133
|
+
node.routePath = node.routePath?.replace(/\/(component|errorComponent|pendingComponent|loader|route)$/, '');
|
|
132
134
|
}
|
|
133
135
|
}
|
|
134
136
|
const parentRoute = hasParentRoute(routeNodes, node.routePath);
|
|
@@ -141,9 +143,9 @@ async function generator(config) {
|
|
|
141
143
|
node.isNonLayout = first.endsWith('_');
|
|
142
144
|
node.cleanedPath = removeUnderscores(node.path) ?? '';
|
|
143
145
|
if (config.future?.unstable_codeSplitting) {
|
|
144
|
-
if (node.isLoader || node.isComponent) {
|
|
146
|
+
if (node.isLoader || node.isComponent || node.isErrorComponent || node.isPendingComponent) {
|
|
145
147
|
routePiecesByPath[node.routePath] = routePiecesByPath[node.routePath] || {};
|
|
146
|
-
routePiecesByPath[node.routePath][node.isLoader ? 'loader' : 'component'] = node;
|
|
148
|
+
routePiecesByPath[node.routePath][node.isLoader ? 'loader' : node.isErrorComponent ? 'errorComponent' : node.isPendingComponent ? 'pendingComponent' : 'component'] = node;
|
|
147
149
|
const anchorRoute = routeNodes.find(d => d.routePath === node.routePath);
|
|
148
150
|
if (!anchorRoute) {
|
|
149
151
|
handleNode({
|
|
@@ -151,11 +153,6 @@ async function generator(config) {
|
|
|
151
153
|
isVirtual: true
|
|
152
154
|
});
|
|
153
155
|
}
|
|
154
|
-
// if (!node.parent) {
|
|
155
|
-
// }
|
|
156
|
-
|
|
157
|
-
// componentOrLoader.isVirtual = true
|
|
158
|
-
// handleNode(componentOrLoader)
|
|
159
156
|
return;
|
|
160
157
|
}
|
|
161
158
|
}
|
|
@@ -182,7 +179,7 @@ async function generator(config) {
|
|
|
182
179
|
// so we have to escape it by turning all $ into $$. But since we do it through a replace call
|
|
183
180
|
// we have to double escape it into $$$$. For more information, see
|
|
184
181
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement
|
|
185
|
-
const escapedRoutePath = node.routePath?.replaceAll('$', '$$$$') ?? '';
|
|
182
|
+
const escapedRoutePath = removeTrailingUnderscores(node.routePath?.replaceAll('$', '$$$$') ?? '');
|
|
186
183
|
const quote = config.quoteStyle === 'single' ? `'` : `"`;
|
|
187
184
|
const replaced = routeCode.replace(fileRouteRegex, `new FileRoute(${quote}${escapedRoutePath}${quote})`);
|
|
188
185
|
if (replaced !== routeCode) {
|
|
@@ -202,22 +199,28 @@ async function generator(config) {
|
|
|
202
199
|
const imports = Object.entries({
|
|
203
200
|
FileRoute: sortedRouteNodes.some(d => d.isVirtual),
|
|
204
201
|
lazyFn: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.loader),
|
|
205
|
-
lazyRouteComponent: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.component)
|
|
202
|
+
lazyRouteComponent: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.component || routePiecesByPath[node.routePath]?.errorComponent || routePiecesByPath[node.routePath]?.pendingComponent)
|
|
206
203
|
}).filter(d => d[1]).map(d => d[0]);
|
|
207
204
|
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 => {
|
|
208
205
|
return `import { Route as ${node.variableName}Import } from './${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, node.filePath))))}'`;
|
|
209
206
|
}), '\n', sortedRouteNodes.filter(d => d.isVirtual).map(node => {
|
|
210
|
-
return `const ${node.variableName}Import = new FileRoute('${node.routePath}').createRoute()`;
|
|
207
|
+
return `const ${node.variableName}Import = new FileRoute('${removeTrailingUnderscores(node.routePath)}').createRoute()`;
|
|
211
208
|
}).join('\n'), '\n', sortedRouteNodes.map(node => {
|
|
212
209
|
const loaderNode = routePiecesByPath[node.routePath]?.loader;
|
|
213
210
|
const componentNode = routePiecesByPath[node.routePath]?.component;
|
|
211
|
+
const errorComponentNode = routePiecesByPath[node.routePath]?.errorComponent;
|
|
212
|
+
const pendingComponentNode = routePiecesByPath[node.routePath]?.pendingComponent;
|
|
214
213
|
return [`const ${node.variableName}Route = ${node.variableName}Import.update({
|
|
215
214
|
${[node.isNonPath ? `id: '${node.path}'` : `path: '${node.cleanedPath}'`, `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`].filter(Boolean).join(',')}
|
|
216
|
-
} as any)`, loaderNode ? `.updateLoader({ loader: lazyFn(() => import('./${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, loaderNode.filePath))))}'), 'loader') })` : '', componentNode
|
|
215
|
+
} as any)`, loaderNode ? `.updateLoader({ loader: lazyFn(() => import('./${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, loaderNode.filePath))))}'), 'loader') })` : '', componentNode || errorComponentNode || pendingComponentNode ? `.update({
|
|
216
|
+
${[['component', componentNode], ['errorComponent', errorComponentNode], ['pendingComponent', pendingComponentNode]].filter(d => d[1]).map(d => {
|
|
217
|
+
return `${d[0]}: lazyRouteComponent(() => import('./${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, d[1].filePath))))}'), '${d[0]}')`;
|
|
218
|
+
}).join('\n,')}
|
|
219
|
+
})` : ''].join('');
|
|
217
220
|
}).join('\n\n'), `declare module '@tanstack/react-router' {
|
|
218
221
|
interface FileRoutesByPath {
|
|
219
222
|
${routeNodes.map(routeNode => {
|
|
220
|
-
return `'${routeNode.routePath}': {
|
|
223
|
+
return `'${removeTrailingUnderscores(routeNode.routePath)}': {
|
|
221
224
|
preLoaderRoute: typeof ${routeNode.variableName}Import
|
|
222
225
|
parentRoute: typeof ${routeNode.parent?.variableName ? `${routeNode.parent?.variableName}Import` : 'rootRoute'}
|
|
223
226
|
}`;
|
|
@@ -285,6 +288,9 @@ function sanitize(s) {
|
|
|
285
288
|
function removeUnderscores(s) {
|
|
286
289
|
return s?.replace(/(^_|_$)/, '').replace(/(\/_|_\/)/, '/');
|
|
287
290
|
}
|
|
291
|
+
function removeTrailingUnderscores(s) {
|
|
292
|
+
return s?.replace(/(_$)/, '').replace(/(_\/)/, '/');
|
|
293
|
+
}
|
|
288
294
|
function replaceBackslash(s) {
|
|
289
295
|
return s?.replace(/\\/gi, '/');
|
|
290
296
|
}
|
|
@@ -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 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.filePath?.match(/[./]index[.]/) ? 1 : -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 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 const anchorRoute = routeNodes.find(\n (d) => d.routePath === node.routePath,\n )\n if (!anchorRoute) {\n handleNode({\n ...node,\n isVirtual: true,\n })\n }\n // if (!node.parent) {\n // }\n\n // componentOrLoader.isVirtual = true\n // handleNode(componentOrLoader)\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 = 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 `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 ${\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 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","match","routeTree","routePiecesByPath","handleNode","node","future","unstable_codeSplitting","isRoute","isComponent","isLoader","parentRoute","hasParentRoute","parent","trimmedPath","trimPathLeft","isNonPath","isNonLayout","cleanedPath","removeUnderscores","anchorRoute","find","isVirtual","children","forEach","buildRouteConfig","depth","routeCode","readFile","isRoot","escapedRoutePath","replaceAll","quote","quoteStyle","replaced","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","sortedRouteNodes","includes","imports","Object","entries","FileRoute","some","lazyFn","loader","lazyRouteComponent","component","routeImports","sanitize","relative","dirname","generatedRouteTree","loaderNode","componentNode","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 = 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 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) => (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 if (config.future?.unstable_codeSplitting) {\n node.isRoute = node.routePath?.endsWith('/route')\n node.isComponent = node.routePath?.endsWith('/component')\n node.isErrorComponent = node.routePath?.endsWith('/errorComponent')\n node.isPendingComponent = node.routePath?.endsWith('/pendingComponent')\n node.isLoader = node.routePath?.endsWith('/loader')\n\n if (\n node.isComponent ||\n node.isErrorComponent ||\n node.isPendingComponent ||\n node.isLoader ||\n node.isRoute\n ) {\n node.routePath = node.routePath?.replace(\n /\\/(component|errorComponent|pendingComponent|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 (\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 if (!anchorRoute) {\n handleNode({\n ...node,\n isVirtual: true,\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","endsWith","replace","push","first","skipMessage","generator","console","log","taskId","checkLatest","start","Date","now","routePathIdPrefix","preRouteNodes","sortRouteNodes","nodes","multiSortBy","length","match","routeTree","routePiecesByPath","handleNode","node","future","unstable_codeSplitting","isRoute","isComponent","isErrorComponent","isPendingComponent","isLoader","parentRoute","hasParentRoute","parent","trimmedPath","trimPathLeft","isNonPath","isNonLayout","cleanedPath","removeUnderscores","anchorRoute","find","isVirtual","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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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/router-cli",
|
|
3
3
|
"author": "Tanner Linsley",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.3.0",
|
|
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.
|
|
61
|
+
"@tanstack/react-router": "1.3.0"
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|
|
64
64
|
"build": "rollup --config rollup.config.js"
|
package/src/generator.ts
CHANGED
|
@@ -20,6 +20,8 @@ export type RouteNode = {
|
|
|
20
20
|
isRoute?: boolean
|
|
21
21
|
isLoader?: boolean
|
|
22
22
|
isComponent?: boolean
|
|
23
|
+
isErrorComponent?: boolean
|
|
24
|
+
isPendingComponent?: boolean
|
|
23
25
|
isVirtual?: boolean
|
|
24
26
|
isRoot?: boolean
|
|
25
27
|
children?: RouteNode[]
|
|
@@ -98,6 +100,8 @@ let skipMessage = false
|
|
|
98
100
|
|
|
99
101
|
type RouteSubNode = {
|
|
100
102
|
component?: RouteNode
|
|
103
|
+
errorComponent?: RouteNode
|
|
104
|
+
pendingComponent?: RouteNode
|
|
101
105
|
loader?: RouteNode
|
|
102
106
|
}
|
|
103
107
|
|
|
@@ -154,11 +158,19 @@ export async function generator(config: Config) {
|
|
|
154
158
|
if (config.future?.unstable_codeSplitting) {
|
|
155
159
|
node.isRoute = node.routePath?.endsWith('/route')
|
|
156
160
|
node.isComponent = node.routePath?.endsWith('/component')
|
|
161
|
+
node.isErrorComponent = node.routePath?.endsWith('/errorComponent')
|
|
162
|
+
node.isPendingComponent = node.routePath?.endsWith('/pendingComponent')
|
|
157
163
|
node.isLoader = node.routePath?.endsWith('/loader')
|
|
158
164
|
|
|
159
|
-
if (
|
|
165
|
+
if (
|
|
166
|
+
node.isComponent ||
|
|
167
|
+
node.isErrorComponent ||
|
|
168
|
+
node.isPendingComponent ||
|
|
169
|
+
node.isLoader ||
|
|
170
|
+
node.isRoute
|
|
171
|
+
) {
|
|
160
172
|
node.routePath = node.routePath?.replace(
|
|
161
|
-
/\/(component|loader|route)$/,
|
|
173
|
+
/\/(component|errorComponent|pendingComponent|loader|route)$/,
|
|
162
174
|
'',
|
|
163
175
|
)
|
|
164
176
|
}
|
|
@@ -182,12 +194,23 @@ export async function generator(config: Config) {
|
|
|
182
194
|
node.cleanedPath = removeUnderscores(node.path) ?? ''
|
|
183
195
|
|
|
184
196
|
if (config.future?.unstable_codeSplitting) {
|
|
185
|
-
if (
|
|
197
|
+
if (
|
|
198
|
+
node.isLoader ||
|
|
199
|
+
node.isComponent ||
|
|
200
|
+
node.isErrorComponent ||
|
|
201
|
+
node.isPendingComponent
|
|
202
|
+
) {
|
|
186
203
|
routePiecesByPath[node.routePath!] =
|
|
187
204
|
routePiecesByPath[node.routePath!] || {}
|
|
188
205
|
|
|
189
206
|
routePiecesByPath[node.routePath!]![
|
|
190
|
-
node.isLoader
|
|
207
|
+
node.isLoader
|
|
208
|
+
? 'loader'
|
|
209
|
+
: node.isErrorComponent
|
|
210
|
+
? 'errorComponent'
|
|
211
|
+
: node.isPendingComponent
|
|
212
|
+
? 'pendingComponent'
|
|
213
|
+
: 'component'
|
|
191
214
|
] = node
|
|
192
215
|
|
|
193
216
|
const anchorRoute = routeNodes.find(
|
|
@@ -199,11 +222,6 @@ export async function generator(config: Config) {
|
|
|
199
222
|
isVirtual: true,
|
|
200
223
|
})
|
|
201
224
|
}
|
|
202
|
-
// if (!node.parent) {
|
|
203
|
-
// }
|
|
204
|
-
|
|
205
|
-
// componentOrLoader.isVirtual = true
|
|
206
|
-
// handleNode(componentOrLoader)
|
|
207
225
|
return
|
|
208
226
|
}
|
|
209
227
|
}
|
|
@@ -237,7 +255,9 @@ export async function generator(config: Config) {
|
|
|
237
255
|
// so we have to escape it by turning all $ into $$. But since we do it through a replace call
|
|
238
256
|
// we have to double escape it into $$$$. For more information, see
|
|
239
257
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement
|
|
240
|
-
const escapedRoutePath =
|
|
258
|
+
const escapedRoutePath = removeTrailingUnderscores(
|
|
259
|
+
node.routePath?.replaceAll('$', '$$$$') ?? '',
|
|
260
|
+
)
|
|
241
261
|
const quote = config.quoteStyle === 'single' ? `'` : `"`
|
|
242
262
|
const replaced = routeCode.replace(
|
|
243
263
|
fileRouteRegex,
|
|
@@ -277,7 +297,10 @@ export async function generator(config: Config) {
|
|
|
277
297
|
(node) => routePiecesByPath[node.routePath!]?.loader,
|
|
278
298
|
),
|
|
279
299
|
lazyRouteComponent: sortedRouteNodes.some(
|
|
280
|
-
(node) =>
|
|
300
|
+
(node) =>
|
|
301
|
+
routePiecesByPath[node.routePath!]?.component ||
|
|
302
|
+
routePiecesByPath[node.routePath!]?.errorComponent ||
|
|
303
|
+
routePiecesByPath[node.routePath!]?.pendingComponent,
|
|
281
304
|
),
|
|
282
305
|
})
|
|
283
306
|
.filter((d) => d[1])
|
|
@@ -311,7 +334,11 @@ export async function generator(config: Config) {
|
|
|
311
334
|
sortedRouteNodes
|
|
312
335
|
.filter((d) => d.isVirtual)
|
|
313
336
|
.map((node) => {
|
|
314
|
-
return `const ${
|
|
337
|
+
return `const ${
|
|
338
|
+
node.variableName
|
|
339
|
+
}Import = new FileRoute('${removeTrailingUnderscores(
|
|
340
|
+
node.routePath,
|
|
341
|
+
)}').createRoute()`
|
|
315
342
|
})
|
|
316
343
|
.join('\n'),
|
|
317
344
|
'\n',
|
|
@@ -319,6 +346,10 @@ export async function generator(config: Config) {
|
|
|
319
346
|
.map((node) => {
|
|
320
347
|
const loaderNode = routePiecesByPath[node.routePath!]?.loader
|
|
321
348
|
const componentNode = routePiecesByPath[node.routePath!]?.component
|
|
349
|
+
const errorComponentNode =
|
|
350
|
+
routePiecesByPath[node.routePath!]?.errorComponent
|
|
351
|
+
const pendingComponentNode =
|
|
352
|
+
routePiecesByPath[node.routePath!]?.pendingComponent
|
|
322
353
|
|
|
323
354
|
return [
|
|
324
355
|
`const ${node.variableName}Route = ${node.variableName}Import.update({
|
|
@@ -341,18 +372,30 @@ export async function generator(config: Config) {
|
|
|
341
372
|
),
|
|
342
373
|
)}'), 'loader') })`
|
|
343
374
|
: '',
|
|
344
|
-
componentNode
|
|
345
|
-
? `.update({
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
375
|
+
componentNode || errorComponentNode || pendingComponentNode
|
|
376
|
+
? `.update({
|
|
377
|
+
${(
|
|
378
|
+
[
|
|
379
|
+
['component', componentNode],
|
|
380
|
+
['errorComponent', errorComponentNode],
|
|
381
|
+
['pendingComponent', pendingComponentNode],
|
|
382
|
+
] as const
|
|
383
|
+
)
|
|
384
|
+
.filter((d) => d[1])
|
|
385
|
+
.map((d) => {
|
|
386
|
+
return `${
|
|
387
|
+
d[0]
|
|
388
|
+
}: lazyRouteComponent(() => import('./${sanitize(
|
|
389
|
+
removeExt(
|
|
390
|
+
path.relative(
|
|
391
|
+
path.dirname(config.generatedRouteTree),
|
|
392
|
+
path.resolve(config.routesDirectory, d[1]!.filePath),
|
|
393
|
+
),
|
|
352
394
|
),
|
|
353
|
-
),
|
|
354
|
-
)
|
|
355
|
-
|
|
395
|
+
)}'), '${d[0]}')`
|
|
396
|
+
})
|
|
397
|
+
.join('\n,')}
|
|
398
|
+
})`
|
|
356
399
|
: '',
|
|
357
400
|
].join('')
|
|
358
401
|
})
|
|
@@ -361,7 +404,7 @@ export async function generator(config: Config) {
|
|
|
361
404
|
interface FileRoutesByPath {
|
|
362
405
|
${routeNodes
|
|
363
406
|
.map((routeNode) => {
|
|
364
|
-
return `'${routeNode.routePath}': {
|
|
407
|
+
return `'${removeTrailingUnderscores(routeNode.routePath)}': {
|
|
365
408
|
preLoaderRoute: typeof ${routeNode.variableName}Import
|
|
366
409
|
parentRoute: typeof ${
|
|
367
410
|
routeNode.parent?.variableName
|
|
@@ -473,6 +516,10 @@ function removeUnderscores(s?: string) {
|
|
|
473
516
|
return s?.replace(/(^_|_$)/, '').replace(/(\/_|_\/)/, '/')
|
|
474
517
|
}
|
|
475
518
|
|
|
519
|
+
function removeTrailingUnderscores(s?: string) {
|
|
520
|
+
return s?.replace(/(_$)/, '').replace(/(_\/)/, '/')
|
|
521
|
+
}
|
|
522
|
+
|
|
476
523
|
function replaceBackslash(s?: string) {
|
|
477
524
|
return s?.replace(/\\/gi, '/')
|
|
478
525
|
}
|