@tanstack/router-vite-plugin 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.
|
@@ -125,9 +125,11 @@ async function generator(config) {
|
|
|
125
125
|
if (config.future?.unstable_codeSplitting) {
|
|
126
126
|
node.isRoute = node.routePath?.endsWith('/route');
|
|
127
127
|
node.isComponent = node.routePath?.endsWith('/component');
|
|
128
|
+
node.isErrorComponent = node.routePath?.endsWith('/errorComponent');
|
|
129
|
+
node.isPendingComponent = node.routePath?.endsWith('/pendingComponent');
|
|
128
130
|
node.isLoader = node.routePath?.endsWith('/loader');
|
|
129
|
-
if (node.isComponent || node.isLoader || node.isRoute) {
|
|
130
|
-
node.routePath = node.routePath?.replace(/\/(component|loader|route)$/, '');
|
|
131
|
+
if (node.isComponent || node.isErrorComponent || node.isPendingComponent || node.isLoader || node.isRoute) {
|
|
132
|
+
node.routePath = node.routePath?.replace(/\/(component|errorComponent|pendingComponent|loader|route)$/, '');
|
|
131
133
|
}
|
|
132
134
|
}
|
|
133
135
|
const parentRoute = hasParentRoute(routeNodes, node.routePath);
|
|
@@ -140,9 +142,9 @@ async function generator(config) {
|
|
|
140
142
|
node.isNonLayout = first.endsWith('_');
|
|
141
143
|
node.cleanedPath = removeUnderscores(node.path) ?? '';
|
|
142
144
|
if (config.future?.unstable_codeSplitting) {
|
|
143
|
-
if (node.isLoader || node.isComponent) {
|
|
145
|
+
if (node.isLoader || node.isComponent || node.isErrorComponent || node.isPendingComponent) {
|
|
144
146
|
routePiecesByPath[node.routePath] = routePiecesByPath[node.routePath] || {};
|
|
145
|
-
routePiecesByPath[node.routePath][node.isLoader ? 'loader' : 'component'] = node;
|
|
147
|
+
routePiecesByPath[node.routePath][node.isLoader ? 'loader' : node.isErrorComponent ? 'errorComponent' : node.isPendingComponent ? 'pendingComponent' : 'component'] = node;
|
|
146
148
|
const anchorRoute = routeNodes.find(d => d.routePath === node.routePath);
|
|
147
149
|
if (!anchorRoute) {
|
|
148
150
|
handleNode({
|
|
@@ -150,11 +152,6 @@ async function generator(config) {
|
|
|
150
152
|
isVirtual: true
|
|
151
153
|
});
|
|
152
154
|
}
|
|
153
|
-
// if (!node.parent) {
|
|
154
|
-
// }
|
|
155
|
-
|
|
156
|
-
// componentOrLoader.isVirtual = true
|
|
157
|
-
// handleNode(componentOrLoader)
|
|
158
155
|
return;
|
|
159
156
|
}
|
|
160
157
|
}
|
|
@@ -181,7 +178,7 @@ async function generator(config) {
|
|
|
181
178
|
// so we have to escape it by turning all $ into $$. But since we do it through a replace call
|
|
182
179
|
// we have to double escape it into $$$$. For more information, see
|
|
183
180
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement
|
|
184
|
-
const escapedRoutePath = node.routePath?.replaceAll('$', '$$$$') ?? '';
|
|
181
|
+
const escapedRoutePath = removeTrailingUnderscores(node.routePath?.replaceAll('$', '$$$$') ?? '');
|
|
185
182
|
const quote = config.quoteStyle === 'single' ? `'` : `"`;
|
|
186
183
|
const replaced = routeCode.replace(fileRouteRegex, `new FileRoute(${quote}${escapedRoutePath}${quote})`);
|
|
187
184
|
if (replaced !== routeCode) {
|
|
@@ -201,22 +198,28 @@ async function generator(config) {
|
|
|
201
198
|
const imports = Object.entries({
|
|
202
199
|
FileRoute: sortedRouteNodes.some(d => d.isVirtual),
|
|
203
200
|
lazyFn: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.loader),
|
|
204
|
-
lazyRouteComponent: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.component)
|
|
201
|
+
lazyRouteComponent: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.component || routePiecesByPath[node.routePath]?.errorComponent || routePiecesByPath[node.routePath]?.pendingComponent)
|
|
205
202
|
}).filter(d => d[1]).map(d => d[0]);
|
|
206
203
|
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 => {
|
|
207
204
|
return `import { Route as ${node.variableName}Import } from './${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, node.filePath))))}'`;
|
|
208
205
|
}), '\n', sortedRouteNodes.filter(d => d.isVirtual).map(node => {
|
|
209
|
-
return `const ${node.variableName}Import = new FileRoute('${node.routePath}').createRoute()`;
|
|
206
|
+
return `const ${node.variableName}Import = new FileRoute('${removeTrailingUnderscores(node.routePath)}').createRoute()`;
|
|
210
207
|
}).join('\n'), '\n', sortedRouteNodes.map(node => {
|
|
211
208
|
const loaderNode = routePiecesByPath[node.routePath]?.loader;
|
|
212
209
|
const componentNode = routePiecesByPath[node.routePath]?.component;
|
|
210
|
+
const errorComponentNode = routePiecesByPath[node.routePath]?.errorComponent;
|
|
211
|
+
const pendingComponentNode = routePiecesByPath[node.routePath]?.pendingComponent;
|
|
213
212
|
return [`const ${node.variableName}Route = ${node.variableName}Import.update({
|
|
214
213
|
${[node.isNonPath ? `id: '${node.path}'` : `path: '${node.cleanedPath}'`, `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`].filter(Boolean).join(',')}
|
|
215
|
-
} as any)`, loaderNode ? `.updateLoader({ loader: lazyFn(() => import('./${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, loaderNode.filePath))))}'), 'loader') })` : '', componentNode
|
|
214
|
+
} 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({
|
|
215
|
+
${[['component', componentNode], ['errorComponent', errorComponentNode], ['pendingComponent', pendingComponentNode]].filter(d => d[1]).map(d => {
|
|
216
|
+
return `${d[0]}: lazyRouteComponent(() => import('./${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, d[1].filePath))))}'), '${d[0]}')`;
|
|
217
|
+
}).join('\n,')}
|
|
218
|
+
})` : ''].join('');
|
|
216
219
|
}).join('\n\n'), `declare module '@tanstack/react-router' {
|
|
217
220
|
interface FileRoutesByPath {
|
|
218
221
|
${routeNodes.map(routeNode => {
|
|
219
|
-
return `'${routeNode.routePath}': {
|
|
222
|
+
return `'${removeTrailingUnderscores(routeNode.routePath)}': {
|
|
220
223
|
preLoaderRoute: typeof ${routeNode.variableName}Import
|
|
221
224
|
parentRoute: typeof ${routeNode.parent?.variableName ? `${routeNode.parent?.variableName}Import` : 'rootRoute'}
|
|
222
225
|
}`;
|
|
@@ -284,6 +287,9 @@ function sanitize(s) {
|
|
|
284
287
|
function removeUnderscores(s) {
|
|
285
288
|
return s?.replace(/(^_|_$)/, '').replace(/(\/_|_\/)/, '/');
|
|
286
289
|
}
|
|
290
|
+
function removeTrailingUnderscores(s) {
|
|
291
|
+
return s?.replace(/(_$)/, '').replace(/(_\/)/, '/');
|
|
292
|
+
}
|
|
287
293
|
function replaceBackslash(s) {
|
|
288
294
|
return s?.replace(/\\/gi, '/');
|
|
289
295
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sources":["../../../../../../router-cli/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","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":["../../../../../../router-cli/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","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/build/esm/index.js
CHANGED
|
@@ -33094,9 +33094,11 @@ async function generator(config) {
|
|
|
33094
33094
|
if (config.future?.unstable_codeSplitting) {
|
|
33095
33095
|
node.isRoute = node.routePath?.endsWith('/route');
|
|
33096
33096
|
node.isComponent = node.routePath?.endsWith('/component');
|
|
33097
|
+
node.isErrorComponent = node.routePath?.endsWith('/errorComponent');
|
|
33098
|
+
node.isPendingComponent = node.routePath?.endsWith('/pendingComponent');
|
|
33097
33099
|
node.isLoader = node.routePath?.endsWith('/loader');
|
|
33098
|
-
if (node.isComponent || node.isLoader || node.isRoute) {
|
|
33099
|
-
node.routePath = node.routePath?.replace(/\/(component|loader|route)$/, '');
|
|
33100
|
+
if (node.isComponent || node.isErrorComponent || node.isPendingComponent || node.isLoader || node.isRoute) {
|
|
33101
|
+
node.routePath = node.routePath?.replace(/\/(component|errorComponent|pendingComponent|loader|route)$/, '');
|
|
33100
33102
|
}
|
|
33101
33103
|
}
|
|
33102
33104
|
const parentRoute = hasParentRoute(routeNodes, node.routePath);
|
|
@@ -33109,9 +33111,9 @@ async function generator(config) {
|
|
|
33109
33111
|
node.isNonLayout = first.endsWith('_');
|
|
33110
33112
|
node.cleanedPath = removeUnderscores(node.path) ?? '';
|
|
33111
33113
|
if (config.future?.unstable_codeSplitting) {
|
|
33112
|
-
if (node.isLoader || node.isComponent) {
|
|
33114
|
+
if (node.isLoader || node.isComponent || node.isErrorComponent || node.isPendingComponent) {
|
|
33113
33115
|
routePiecesByPath[node.routePath] = routePiecesByPath[node.routePath] || {};
|
|
33114
|
-
routePiecesByPath[node.routePath][node.isLoader ? 'loader' : 'component'] = node;
|
|
33116
|
+
routePiecesByPath[node.routePath][node.isLoader ? 'loader' : node.isErrorComponent ? 'errorComponent' : node.isPendingComponent ? 'pendingComponent' : 'component'] = node;
|
|
33115
33117
|
const anchorRoute = routeNodes.find(d => d.routePath === node.routePath);
|
|
33116
33118
|
if (!anchorRoute) {
|
|
33117
33119
|
handleNode({
|
|
@@ -33119,11 +33121,6 @@ async function generator(config) {
|
|
|
33119
33121
|
isVirtual: true
|
|
33120
33122
|
});
|
|
33121
33123
|
}
|
|
33122
|
-
// if (!node.parent) {
|
|
33123
|
-
// }
|
|
33124
|
-
|
|
33125
|
-
// componentOrLoader.isVirtual = true
|
|
33126
|
-
// handleNode(componentOrLoader)
|
|
33127
33124
|
return;
|
|
33128
33125
|
}
|
|
33129
33126
|
}
|
|
@@ -33150,7 +33147,7 @@ async function generator(config) {
|
|
|
33150
33147
|
// so we have to escape it by turning all $ into $$. But since we do it through a replace call
|
|
33151
33148
|
// we have to double escape it into $$$$. For more information, see
|
|
33152
33149
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement
|
|
33153
|
-
const escapedRoutePath = node.routePath?.replaceAll('$', '$$$$') ?? '';
|
|
33150
|
+
const escapedRoutePath = removeTrailingUnderscores(node.routePath?.replaceAll('$', '$$$$') ?? '');
|
|
33154
33151
|
const quote = config.quoteStyle === 'single' ? `'` : `"`;
|
|
33155
33152
|
const replaced = routeCode.replace(fileRouteRegex, `new FileRoute(${quote}${escapedRoutePath}${quote})`);
|
|
33156
33153
|
if (replaced !== routeCode) {
|
|
@@ -33170,22 +33167,28 @@ async function generator(config) {
|
|
|
33170
33167
|
const imports = Object.entries({
|
|
33171
33168
|
FileRoute: sortedRouteNodes.some(d => d.isVirtual),
|
|
33172
33169
|
lazyFn: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.loader),
|
|
33173
|
-
lazyRouteComponent: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.component)
|
|
33170
|
+
lazyRouteComponent: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.component || routePiecesByPath[node.routePath]?.errorComponent || routePiecesByPath[node.routePath]?.pendingComponent)
|
|
33174
33171
|
}).filter(d => d[1]).map(d => d[0]);
|
|
33175
33172
|
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 => {
|
|
33176
33173
|
return `import { Route as ${node.variableName}Import } from './${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, node.filePath))))}'`;
|
|
33177
33174
|
}), '\n', sortedRouteNodes.filter(d => d.isVirtual).map(node => {
|
|
33178
|
-
return `const ${node.variableName}Import = new FileRoute('${node.routePath}').createRoute()`;
|
|
33175
|
+
return `const ${node.variableName}Import = new FileRoute('${removeTrailingUnderscores(node.routePath)}').createRoute()`;
|
|
33179
33176
|
}).join('\n'), '\n', sortedRouteNodes.map(node => {
|
|
33180
33177
|
const loaderNode = routePiecesByPath[node.routePath]?.loader;
|
|
33181
33178
|
const componentNode = routePiecesByPath[node.routePath]?.component;
|
|
33179
|
+
const errorComponentNode = routePiecesByPath[node.routePath]?.errorComponent;
|
|
33180
|
+
const pendingComponentNode = routePiecesByPath[node.routePath]?.pendingComponent;
|
|
33182
33181
|
return [`const ${node.variableName}Route = ${node.variableName}Import.update({
|
|
33183
33182
|
${[node.isNonPath ? `id: '${node.path}'` : `path: '${node.cleanedPath}'`, `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`].filter(Boolean).join(',')}
|
|
33184
|
-
} as any)`, loaderNode ? `.updateLoader({ loader: lazyFn(() => import('./${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, loaderNode.filePath))))}'), 'loader') })` : '', componentNode
|
|
33183
|
+
} 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({
|
|
33184
|
+
${[['component', componentNode], ['errorComponent', errorComponentNode], ['pendingComponent', pendingComponentNode]].filter(d => d[1]).map(d => {
|
|
33185
|
+
return `${d[0]}: lazyRouteComponent(() => import('./${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, d[1].filePath))))}'), '${d[0]}')`;
|
|
33186
|
+
}).join('\n,')}
|
|
33187
|
+
})` : ''].join('');
|
|
33185
33188
|
}).join('\n\n'), `declare module '@tanstack/react-router' {
|
|
33186
33189
|
interface FileRoutesByPath {
|
|
33187
33190
|
${routeNodes.map(routeNode => {
|
|
33188
|
-
return `'${routeNode.routePath}': {
|
|
33191
|
+
return `'${removeTrailingUnderscores(routeNode.routePath)}': {
|
|
33189
33192
|
preLoaderRoute: typeof ${routeNode.variableName}Import
|
|
33190
33193
|
parentRoute: typeof ${routeNode.parent?.variableName ? `${routeNode.parent?.variableName}Import` : 'rootRoute'}
|
|
33191
33194
|
}`;
|
|
@@ -33253,6 +33256,9 @@ function sanitize(s) {
|
|
|
33253
33256
|
function removeUnderscores(s) {
|
|
33254
33257
|
return s?.replace(/(^_|_$)/, '').replace(/(\/_|_\/)/, '/');
|
|
33255
33258
|
}
|
|
33259
|
+
function removeTrailingUnderscores(s) {
|
|
33260
|
+
return s?.replace(/(_$)/, '').replace(/(_\/)/, '/');
|
|
33261
|
+
}
|
|
33256
33262
|
function replaceBackslash(s) {
|
|
33257
33263
|
return s?.replace(/\\/gi, '/');
|
|
33258
33264
|
}
|