@tanstack/router-generator 1.5.10 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/config.js +12 -3
- package/build/cjs/config.js.map +1 -1
- package/build/cjs/generator.js +6 -8
- package/build/cjs/generator.js.map +1 -1
- package/build/esm/index.js +18 -10
- package/build/esm/index.js.map +1 -1
- package/build/types/index.d.ts +3 -0
- package/package.json +1 -1
- package/src/config.ts +15 -2
- package/src/generator.ts +14 -11
package/build/cjs/config.js
CHANGED
|
@@ -19,15 +19,24 @@ const configSchema = zod.z.object({
|
|
|
19
19
|
routeFileIgnorePrefix: zod.z.string().optional().default('-'),
|
|
20
20
|
routesDirectory: zod.z.string().optional().default('./src/routes'),
|
|
21
21
|
generatedRouteTree: zod.z.string().optional().default('./src/routeTree.gen.ts'),
|
|
22
|
-
quoteStyle: zod.z.enum(['single', 'double']).optional().default('single')
|
|
22
|
+
quoteStyle: zod.z.enum(['single', 'double']).optional().default('single'),
|
|
23
|
+
disableTypes: zod.z.boolean().optional().default(false)
|
|
23
24
|
});
|
|
24
25
|
const configFilePathJson = path.resolve(process.cwd(), 'tsr.config.json');
|
|
25
26
|
async function getConfig() {
|
|
26
27
|
const exists = fs.existsSync(configFilePathJson);
|
|
28
|
+
let config;
|
|
27
29
|
if (exists) {
|
|
28
|
-
|
|
30
|
+
config = configSchema.parse(JSON.parse(fs.readFileSync(configFilePathJson, 'utf-8')));
|
|
31
|
+
} else {
|
|
32
|
+
config = configSchema.parse({});
|
|
29
33
|
}
|
|
30
|
-
|
|
34
|
+
|
|
35
|
+
// If typescript is disabled, make sure the generated route tree is a .js file
|
|
36
|
+
if (config.disableTypes) {
|
|
37
|
+
config.generatedRouteTree = config.generatedRouteTree.replace(/\.(ts|tsx)$/, '.js');
|
|
38
|
+
}
|
|
39
|
+
return config;
|
|
31
40
|
}
|
|
32
41
|
|
|
33
42
|
exports.configSchema = configSchema;
|
package/build/cjs/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sources":["../../src/config.ts"],"sourcesContent":["import path from 'path'\nimport { readFileSync, existsSync } from 'fs'\nimport { z } from 'zod'\n\nexport const configSchema = z.object({\n routeFilePrefix: z.string().optional(),\n routeFileIgnorePrefix: z.string().optional().default('-'),\n routesDirectory: z.string().optional().default('./src/routes'),\n generatedRouteTree: z.string().optional().default('./src/routeTree.gen.ts'),\n quoteStyle: z.enum(['single', 'double']).optional().default('single'),\n})\n\nexport type Config = z.infer<typeof configSchema>\n\nconst configFilePathJson = path.resolve(process.cwd(), 'tsr.config.json')\n\nexport async function getConfig(): Promise<Config> {\n const exists = existsSync(configFilePathJson)\n\n if (exists) {\n
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../src/config.ts"],"sourcesContent":["import path from 'path'\nimport { readFileSync, existsSync } from 'fs'\nimport { z } from 'zod'\n\nexport const configSchema = z.object({\n routeFilePrefix: z.string().optional(),\n routeFileIgnorePrefix: z.string().optional().default('-'),\n routesDirectory: z.string().optional().default('./src/routes'),\n generatedRouteTree: z.string().optional().default('./src/routeTree.gen.ts'),\n quoteStyle: z.enum(['single', 'double']).optional().default('single'),\n disableTypes: z.boolean().optional().default(false),\n})\n\nexport type Config = z.infer<typeof configSchema>\n\nconst configFilePathJson = path.resolve(process.cwd(), 'tsr.config.json')\n\nexport async function getConfig(): Promise<Config> {\n const exists = existsSync(configFilePathJson)\n\n let config: Config\n\n if (exists) {\n config = configSchema.parse(\n JSON.parse(readFileSync(configFilePathJson, 'utf-8')),\n )\n } else {\n config = configSchema.parse({})\n }\n\n // If typescript is disabled, make sure the generated route tree is a .js file\n if (config.disableTypes) {\n config.generatedRouteTree = config.generatedRouteTree.replace(\n /\\.(ts|tsx)$/,\n '.js',\n )\n }\n\n return config\n}\n"],"names":["configSchema","z","object","routeFilePrefix","string","optional","routeFileIgnorePrefix","default","routesDirectory","generatedRouteTree","quoteStyle","enum","disableTypes","boolean","configFilePathJson","path","resolve","process","cwd","getConfig","exists","existsSync","config","parse","JSON","readFileSync","replace"],"mappings":";;;;;;;;;;;;;;;;MAIaA,YAAY,GAAGC,KAAC,CAACC,MAAM,CAAC;EACnCC,eAAe,EAAEF,KAAC,CAACG,MAAM,EAAE,CAACC,QAAQ,EAAE;AACtCC,EAAAA,qBAAqB,EAAEL,KAAC,CAACG,MAAM,EAAE,CAACC,QAAQ,EAAE,CAACE,OAAO,CAAC,GAAG,CAAC;AACzDC,EAAAA,eAAe,EAAEP,KAAC,CAACG,MAAM,EAAE,CAACC,QAAQ,EAAE,CAACE,OAAO,CAAC,cAAc,CAAC;AAC9DE,EAAAA,kBAAkB,EAAER,KAAC,CAACG,MAAM,EAAE,CAACC,QAAQ,EAAE,CAACE,OAAO,CAAC,wBAAwB,CAAC;AAC3EG,EAAAA,UAAU,EAAET,KAAC,CAACU,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAACN,QAAQ,EAAE,CAACE,OAAO,CAAC,QAAQ,CAAC;AACrEK,EAAAA,YAAY,EAAEX,KAAC,CAACY,OAAO,EAAE,CAACR,QAAQ,EAAE,CAACE,OAAO,CAAC,KAAK,CAAA;AACpD,CAAC,EAAC;AAIF,MAAMO,kBAAkB,GAAGC,IAAI,CAACC,OAAO,CAACC,OAAO,CAACC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAA;AAElE,eAAeC,SAASA,GAAoB;AACjD,EAAA,MAAMC,MAAM,GAAGC,aAAU,CAACP,kBAAkB,CAAC,CAAA;AAE7C,EAAA,IAAIQ,MAAc,CAAA;AAElB,EAAA,IAAIF,MAAM,EAAE;AACVE,IAAAA,MAAM,GAAGtB,YAAY,CAACuB,KAAK,CACzBC,IAAI,CAACD,KAAK,CAACE,eAAY,CAACX,kBAAkB,EAAE,OAAO,CAAC,CACtD,CAAC,CAAA;AACH,GAAC,MAAM;AACLQ,IAAAA,MAAM,GAAGtB,YAAY,CAACuB,KAAK,CAAC,EAAE,CAAC,CAAA;AACjC,GAAA;;AAEA;EACA,IAAID,MAAM,CAACV,YAAY,EAAE;AACvBU,IAAAA,MAAM,CAACb,kBAAkB,GAAGa,MAAM,CAACb,kBAAkB,CAACiB,OAAO,CAC3D,aAAa,EACb,KACF,CAAC,CAAA;AACH,GAAA;AAEA,EAAA,OAAOJ,MAAM,CAAA;AACf;;;;;"}
|
package/build/cjs/generator.js
CHANGED
|
@@ -37,7 +37,6 @@ var prettier__namespace = /*#__PURE__*/_interopNamespaceDefault(prettier);
|
|
|
37
37
|
|
|
38
38
|
let latestTask = 0;
|
|
39
39
|
const rootPathId = '__root';
|
|
40
|
-
const fileRouteRegex = /new\s+FileRoute\(([^)]*)\)/g;
|
|
41
40
|
async function getRouteNodes(config) {
|
|
42
41
|
const {
|
|
43
42
|
routeFilePrefix,
|
|
@@ -179,9 +178,9 @@ async function generator(config) {
|
|
|
179
178
|
// so we have to escape it by turning all $ into $$. But since we do it through a replace call
|
|
180
179
|
// we have to double escape it into $$$$. For more information, see
|
|
181
180
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement
|
|
182
|
-
const escapedRoutePath = removeTrailingUnderscores(node.routePath?.replaceAll('$', '
|
|
183
|
-
|
|
184
|
-
const replaced = routeCode.replace(
|
|
181
|
+
const escapedRoutePath = removeTrailingUnderscores(node.routePath?.replaceAll('$', '$$') ?? '');
|
|
182
|
+
config.quoteStyle === 'single' ? `'` : `"`;
|
|
183
|
+
const replaced = routeCode.replace(/(FileRoute\(\s*['"])([^\s]+)(['"](?:,?)\s*\))/g, (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`);
|
|
185
184
|
if (replaced !== routeCode) {
|
|
186
185
|
await fs__namespace.writeFile(node.fullPath, replaced);
|
|
187
186
|
}
|
|
@@ -213,12 +212,12 @@ async function generator(config) {
|
|
|
213
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('./${replaceBackslash(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, loaderNode.filePath))))}'), 'loader') })` : '', componentNode || errorComponentNode || pendingComponentNode ? `.update({
|
|
215
|
+
}${config.disableTypes ? '' : 'as any'})`, loaderNode ? `.updateLoader({ loader: lazyFn(() => import('./${replaceBackslash(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, loaderNode.filePath))))}'), 'loader') })` : '', componentNode || errorComponentNode || pendingComponentNode ? `.update({
|
|
217
216
|
${[['component', componentNode], ['errorComponent', errorComponentNode], ['pendingComponent', pendingComponentNode]].filter(d => d[1]).map(d => {
|
|
218
217
|
return `${d[0]}: lazyRouteComponent(() => import('./${replaceBackslash(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, d[1].filePath))))}'), '${d[0]}')`;
|
|
219
218
|
}).join('\n,')}
|
|
220
219
|
})` : ''].join('');
|
|
221
|
-
}).join('\n\n'), '// Populate the FileRoutesByPath interface', `declare module '@tanstack/react-router' {
|
|
220
|
+
}).join('\n\n'), ...(config.disableTypes ? [] : ['// Populate the FileRoutesByPath interface', `declare module '@tanstack/react-router' {
|
|
222
221
|
interface FileRoutesByPath {
|
|
223
222
|
${routeNodes.map(routeNode => {
|
|
224
223
|
return `'${removeTrailingUnderscores(routeNode.routePath)}': {
|
|
@@ -227,7 +226,7 @@ async function generator(config) {
|
|
|
227
226
|
}`;
|
|
228
227
|
}).join('\n')}
|
|
229
228
|
}
|
|
230
|
-
}
|
|
229
|
+
}`]), '// Create and export the route tree', `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`].filter(Boolean).join('\n\n');
|
|
231
230
|
const routeConfigFileContent = await prettier__namespace.format(routeImports, {
|
|
232
231
|
semi: false,
|
|
233
232
|
singleQuote: config.quoteStyle === 'single',
|
|
@@ -309,7 +308,6 @@ function hasParentRoute(routes, routePathToCheck) {
|
|
|
309
308
|
return hasParentRoute(routes, parentRoutePath);
|
|
310
309
|
}
|
|
311
310
|
|
|
312
|
-
exports.fileRouteRegex = fileRouteRegex;
|
|
313
311
|
exports.generator = generator;
|
|
314
312
|
exports.hasParentRoute = hasParentRoute;
|
|
315
313
|
exports.multiSortBy = multiSortBy;
|
|
@@ -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 './utils'\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, { withFileTypes: true })\n\n dirList = dirList.filter((d) => {\n if (\n d.name.startsWith('.') ||\n (routeFileIgnorePrefix && d.name.startsWith(routeFileIgnorePrefix))\n ) {\n return false\n }\n\n if (routeFilePrefix) {\n return d.name.startsWith(routeFilePrefix)\n }\n\n return true\n })\n\n await Promise.all(\n dirList.map(async (dirent) => {\n const fullPath = path.join(fullDir, dirent.name)\n const relativePath = path.join(dir, dirent.name)\n\n if (dirent.isDirectory()) {\n await recurse(relativePath)\n } else if (fullPath.match(/\\.(tsx|ts|jsx|js)$/)) {\n const filePath = replaceBackslash(path.join(dir, dirent.name))\n const filePathNoExt = removeExt(filePath)\n let routePath =\n cleanPath(`/${filePathNoExt.split('.').join('/')}`) || ''\n const variableName = routePathToVariable(routePath)\n\n // Remove the index from the route path and\n // if the route path is empty, use `/'\n\n let isRoute = routePath?.endsWith('/route')\n let isComponent = routePath?.endsWith('/component')\n let isErrorComponent = routePath?.endsWith('/errorComponent')\n let isPendingComponent = routePath?.endsWith('/pendingComponent')\n let isLoader = routePath?.endsWith('/loader')\n\n routePath = routePath?.replace(\n /\\/(component|errorComponent|pendingComponent|loader|route)$/,\n '',\n )\n\n if (routePath === 'index') {\n routePath = '/'\n }\n\n routePath = routePath.replace(/\\/index$/, '/') || '/'\n\n routeNodes.push({\n filePath,\n fullPath,\n routePath,\n variableName,\n isRoute,\n isComponent,\n isErrorComponent,\n isPendingComponent,\n isLoader,\n })\n }\n }),\n )\n\n return routeNodes\n }\n\n await recurse('./')\n\n return routeNodes\n}\n\nlet first = false\nlet skipMessage = false\n\ntype RouteSubNode = {\n component?: RouteNode\n errorComponent?: RouteNode\n pendingComponent?: RouteNode\n loader?: RouteNode\n}\n\nexport async function generator(config: Config) {\n console.log()\n\n if (!first) {\n console.log('🔄 Generating routes...')\n first = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n console.log('♻️ Regenerating routes...')\n }\n\n const taskId = latestTask + 1\n latestTask = taskId\n\n const checkLatest = () => {\n if (latestTask !== taskId) {\n skipMessage = true\n return false\n }\n\n return true\n }\n\n const start = Date.now()\n const routePathIdPrefix = config.routeFilePrefix ?? ''\n\n const preRouteNodes = multiSortBy(await getRouteNodes(config), [\n (d) => (d.routePath === '/' ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.filePath?.match(/[./]index[.]/) ? 1 : -1),\n (d) =>\n d.filePath?.match(\n /[./](component|errorComponent|pendingComponent|loader)[.]/,\n )\n ? 1\n : -1,\n (d) => (d.filePath?.match(/[./]route[.]/) ? -1 : 1),\n (d) => (d.routePath?.endsWith('/') ? -1 : 1),\n (d) => d.routePath,\n ]).filter(\n (d) => ![`/${routePathIdPrefix + rootPathId}`].includes(d.routePath || ''),\n )\n\n const routeTree: RouteNode[] = []\n const routePiecesByPath: Record<string, RouteSubNode> = {}\n\n // Loop over the flat list of routeNodes and\n // build up a tree based on the routeNodes' routePath\n let routeNodes: RouteNode[] = []\n\n const handleNode = (node: RouteNode) => {\n const parentRoute = hasParentRoute(routeNodes, node.routePath)\n if (parentRoute) node.parent = parentRoute\n\n node.path = node.parent\n ? node.routePath?.replace(node.parent.routePath!, '') || '/'\n : node.routePath\n\n const trimmedPath = trimPathLeft(node.path ?? '')\n\n const split = trimmedPath?.split('/') ?? []\n let first = split[0] ?? trimmedPath ?? ''\n\n node.isNonPath = first.startsWith('_')\n node.isNonLayout = first.endsWith('_')\n\n node.cleanedPath = removeUnderscores(node.path) ?? ''\n\n if (\n !node.isVirtual &&\n (node.isLoader ||\n node.isComponent ||\n node.isErrorComponent ||\n node.isPendingComponent)\n ) {\n routePiecesByPath[node.routePath!] =\n routePiecesByPath[node.routePath!] || {}\n\n routePiecesByPath[node.routePath!]![\n node.isLoader\n ? 'loader'\n : node.isErrorComponent\n ? 'errorComponent'\n : node.isPendingComponent\n ? 'pendingComponent'\n : 'component'\n ] = node\n\n const anchorRoute = routeNodes.find((d) => d.routePath === node.routePath)\n\n if (!anchorRoute) {\n handleNode({\n ...node,\n isVirtual: true,\n isLoader: false,\n isComponent: false,\n isErrorComponent: false,\n isPendingComponent: false,\n })\n }\n return\n }\n\n 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 virtualRouteNodes = sortedRouteNodes.filter((d) => d.isVirtual)\n\n const routeImports = [\n '// This file is auto-generated by TanStack Router',\n imports.length\n ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\\n`\n : '',\n '// Import Routes',\n [\n `import { Route as rootRoute } from './${replaceBackslash(\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 './${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n ),\n )}'`\n }),\n ].join('\\n'),\n virtualRouteNodes.length ? '// Create Virtual Routes' : '',\n virtualRouteNodes\n .map((node) => {\n return `const ${\n node.variableName\n }Import = new FileRoute('${removeTrailingUnderscores(\n node.routePath,\n )}').createRoute()`\n })\n .join('\\n'),\n '// Create/Update Routes',\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('./${replaceBackslash(\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('./${replaceBackslash(\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 '// Populate the FileRoutesByPath interface',\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 '// Create and export the route tree',\n `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`,\n ]\n .filter(Boolean)\n .join('\\n\\n')\n\n const routeConfigFileContent = await prettier.format(routeImports, {\n semi: false,\n singleQuote: config.quoteStyle === 'single',\n parser: 'typescript',\n })\n\n const routeTreeContent = await fs\n .readFile(path.resolve(config.generatedRouteTree), 'utf-8')\n .catch((err: any) => {\n if (err.code === 'ENOENT') {\n return undefined\n }\n throw err\n })\n\n if (!checkLatest()) return\n\n if (routeTreeContent !== routeConfigFileContent) {\n await fs.mkdir(path.dirname(path.resolve(config.generatedRouteTree)), {\n recursive: true,\n })\n if (!checkLatest()) return\n await fs.writeFile(\n path.resolve(config.generatedRouteTree),\n routeConfigFileContent,\n )\n }\n\n console.log(\n `🌲 Processed ${routeNodes.length} routes in ${Date.now() - start}ms`,\n )\n}\n\nfunction routePathToVariable(d: string): string {\n return (\n removeUnderscores(d)\n ?.replace(/\\/\\$\\//g, '/splat/')\n ?.replace(/\\$$/g, 'splat')\n ?.replace(/\\$/g, '')\n ?.split(/[/-]/g)\n .map((d, i) => (i > 0 ? capitalize(d) : d))\n .join('')\n .replace(/([^a-zA-Z0-9]|[\\.])/gm, '') ?? ''\n )\n}\n\nexport function removeExt(d: string) {\n return d.substring(0, d.lastIndexOf('.')) || d\n}\n\nfunction spaces(d: number): string {\n return Array.from({ length: d })\n .map(() => ' ')\n .join('')\n}\n\nexport function multiSortBy<T>(\n arr: T[],\n accessors: ((item: T) => any)[] = [(d) => d],\n): T[] {\n return arr\n .map((d, i) => [d, i] as const)\n .sort(([a, ai], [b, bi]) => {\n for (const accessor of accessors) {\n const ao = accessor(a)\n const bo = accessor(b)\n\n if (typeof ao === 'undefined') {\n if (typeof bo === 'undefined') {\n continue\n }\n return 1\n }\n\n if (ao === bo) {\n continue\n }\n\n return ao > bo ? 1 : -1\n }\n\n return ai - bi\n })\n .map(([d]) => d)\n}\n\nfunction capitalize(s: string) {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nfunction 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","withFileTypes","filter","d","name","startsWith","Promise","all","map","dirent","fullPath","join","relativePath","isDirectory","match","filePath","replaceBackslash","filePathNoExt","removeExt","routePath","cleanPath","split","variableName","routePathToVariable","isRoute","endsWith","isComponent","isErrorComponent","isPendingComponent","isLoader","replace","push","first","skipMessage","generator","console","log","taskId","checkLatest","start","Date","now","routePathIdPrefix","preRouteNodes","multiSortBy","length","includes","routeTree","routePiecesByPath","handleNode","node","parentRoute","hasParentRoute","parent","trimmedPath","trimPathLeft","isNonPath","isNonLayout","cleanedPath","removeUnderscores","isVirtual","anchorRoute","find","children","forEach","buildRouteConfig","nodes","depth","routeCode","readFile","isRoot","escapedRoutePath","removeTrailingUnderscores","replaceAll","quote","quoteStyle","replaced","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","sortedRouteNodes","imports","Object","entries","FileRoute","some","lazyFn","loader","lazyRouteComponent","component","errorComponent","pendingComponent","virtualRouteNodes","routeImports","relative","dirname","generatedRouteTree","loaderNode","componentNode","errorComponentNode","pendingComponentNode","routeNode","routeConfigFileContent","prettier","format","semi","singleQuote","parser","routeTreeContent","catch","err","code","undefined","mkdir","recursive","i","capitalize","substring","lastIndexOf","Array","from","arr","accessors","sort","a","ai","b","bi","accessor","ao","bo","s","charAt","toUpperCase","slice","routes","routePathToCheck","sortedNodes","segments","pop","parentRoutePath"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generator.js","sources":["../../src/generator.ts"],"sourcesContent":["import path from 'path'\nimport * as fs from 'fs/promises'\nimport * as prettier from 'prettier'\nimport { Config } from './config'\nimport { cleanPath, trimPathLeft } from './utils'\n\nlet latestTask = 0\nexport const rootPathId = '__root'\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, { withFileTypes: true })\n\n dirList = dirList.filter((d) => {\n if (\n d.name.startsWith('.') ||\n (routeFileIgnorePrefix && d.name.startsWith(routeFileIgnorePrefix))\n ) {\n return false\n }\n\n if (routeFilePrefix) {\n return d.name.startsWith(routeFilePrefix)\n }\n\n return true\n })\n\n await Promise.all(\n dirList.map(async (dirent) => {\n const fullPath = path.join(fullDir, dirent.name)\n const relativePath = path.join(dir, dirent.name)\n\n if (dirent.isDirectory()) {\n await recurse(relativePath)\n } else if (fullPath.match(/\\.(tsx|ts|jsx|js)$/)) {\n const filePath = replaceBackslash(path.join(dir, dirent.name))\n const filePathNoExt = removeExt(filePath)\n let routePath =\n cleanPath(`/${filePathNoExt.split('.').join('/')}`) || ''\n const variableName = routePathToVariable(routePath)\n\n // Remove the index from the route path and\n // if the route path is empty, use `/'\n\n let isRoute = routePath?.endsWith('/route')\n let isComponent = routePath?.endsWith('/component')\n let isErrorComponent = routePath?.endsWith('/errorComponent')\n let isPendingComponent = routePath?.endsWith('/pendingComponent')\n let isLoader = routePath?.endsWith('/loader')\n\n routePath = routePath?.replace(\n /\\/(component|errorComponent|pendingComponent|loader|route)$/,\n '',\n )\n\n if (routePath === 'index') {\n routePath = '/'\n }\n\n routePath = routePath.replace(/\\/index$/, '/') || '/'\n\n routeNodes.push({\n filePath,\n fullPath,\n routePath,\n variableName,\n isRoute,\n isComponent,\n isErrorComponent,\n isPendingComponent,\n isLoader,\n })\n }\n }),\n )\n\n return routeNodes\n }\n\n await recurse('./')\n\n return routeNodes\n}\n\nlet first = false\nlet skipMessage = false\n\ntype RouteSubNode = {\n component?: RouteNode\n errorComponent?: RouteNode\n pendingComponent?: RouteNode\n loader?: RouteNode\n}\n\nexport async function generator(config: Config) {\n console.log()\n\n if (!first) {\n console.log('🔄 Generating routes...')\n first = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n console.log('♻️ Regenerating routes...')\n }\n\n const taskId = latestTask + 1\n latestTask = taskId\n\n const checkLatest = () => {\n if (latestTask !== taskId) {\n skipMessage = true\n return false\n }\n\n return true\n }\n\n const start = Date.now()\n const routePathIdPrefix = config.routeFilePrefix ?? ''\n\n const preRouteNodes = multiSortBy(await getRouteNodes(config), [\n (d) => (d.routePath === '/' ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.filePath?.match(/[./]index[.]/) ? 1 : -1),\n (d) =>\n d.filePath?.match(\n /[./](component|errorComponent|pendingComponent|loader)[.]/,\n )\n ? 1\n : -1,\n (d) => (d.filePath?.match(/[./]route[.]/) ? -1 : 1),\n (d) => (d.routePath?.endsWith('/') ? -1 : 1),\n (d) => d.routePath,\n ]).filter(\n (d) => ![`/${routePathIdPrefix + rootPathId}`].includes(d.routePath || ''),\n )\n\n const routeTree: RouteNode[] = []\n const routePiecesByPath: Record<string, RouteSubNode> = {}\n\n // Loop over the flat list of routeNodes and\n // build up a tree based on the routeNodes' routePath\n let routeNodes: RouteNode[] = []\n\n const handleNode = (node: RouteNode) => {\n const parentRoute = hasParentRoute(routeNodes, node.routePath)\n if (parentRoute) node.parent = parentRoute\n\n node.path = node.parent\n ? node.routePath?.replace(node.parent.routePath!, '') || '/'\n : node.routePath\n\n const trimmedPath = trimPathLeft(node.path ?? '')\n\n const split = trimmedPath?.split('/') ?? []\n let first = split[0] ?? trimmedPath ?? ''\n\n node.isNonPath = first.startsWith('_')\n node.isNonLayout = first.endsWith('_')\n\n node.cleanedPath = removeUnderscores(node.path) ?? ''\n\n if (\n !node.isVirtual &&\n (node.isLoader ||\n node.isComponent ||\n node.isErrorComponent ||\n node.isPendingComponent)\n ) {\n routePiecesByPath[node.routePath!] =\n routePiecesByPath[node.routePath!] || {}\n\n routePiecesByPath[node.routePath!]![\n node.isLoader\n ? 'loader'\n : node.isErrorComponent\n ? 'errorComponent'\n : node.isPendingComponent\n ? 'pendingComponent'\n : 'component'\n ] = node\n\n const anchorRoute = routeNodes.find((d) => d.routePath === node.routePath)\n\n if (!anchorRoute) {\n handleNode({\n ...node,\n isVirtual: true,\n isLoader: false,\n isComponent: false,\n isErrorComponent: false,\n isPendingComponent: false,\n })\n }\n return\n }\n\n 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 /(FileRoute\\(\\s*['\"])([^\\s]+)(['\"](?:,?)\\s*\\))/g,\n (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`,\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 virtualRouteNodes = sortedRouteNodes.filter((d) => d.isVirtual)\n\n const routeImports = [\n '// This file is auto-generated by TanStack Router',\n imports.length\n ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\\n`\n : '',\n '// Import Routes',\n [\n `import { Route as rootRoute } from './${replaceBackslash(\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 './${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n ),\n )}'`\n }),\n ].join('\\n'),\n virtualRouteNodes.length ? '// Create Virtual Routes' : '',\n virtualRouteNodes\n .map((node) => {\n return `const ${\n node.variableName\n }Import = new FileRoute('${removeTrailingUnderscores(\n node.routePath,\n )}').createRoute()`\n })\n .join('\\n'),\n '// Create/Update Routes',\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 }${config.disableTypes ? '' : 'as any'})`,\n loaderNode\n ? `.updateLoader({ loader: lazyFn(() => import('./${replaceBackslash(\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('./${replaceBackslash(\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 ...(config.disableTypes\n ? []\n : [\n '// Populate the FileRoutesByPath interface',\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 ]),\n '// Create and export the route tree',\n `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`,\n ]\n .filter(Boolean)\n .join('\\n\\n')\n\n const routeConfigFileContent = await prettier.format(routeImports, {\n semi: false,\n singleQuote: config.quoteStyle === 'single',\n parser: 'typescript',\n })\n\n const routeTreeContent = await fs\n .readFile(path.resolve(config.generatedRouteTree), 'utf-8')\n .catch((err: any) => {\n if (err.code === 'ENOENT') {\n return undefined\n }\n throw err\n })\n\n if (!checkLatest()) return\n\n if (routeTreeContent !== routeConfigFileContent) {\n await fs.mkdir(path.dirname(path.resolve(config.generatedRouteTree)), {\n recursive: true,\n })\n if (!checkLatest()) return\n await fs.writeFile(\n path.resolve(config.generatedRouteTree),\n routeConfigFileContent,\n )\n }\n\n console.log(\n `🌲 Processed ${routeNodes.length} routes in ${Date.now() - start}ms`,\n )\n}\n\nfunction routePathToVariable(d: string): string {\n return (\n removeUnderscores(d)\n ?.replace(/\\/\\$\\//g, '/splat/')\n ?.replace(/\\$$/g, 'splat')\n ?.replace(/\\$/g, '')\n ?.split(/[/-]/g)\n .map((d, i) => (i > 0 ? capitalize(d) : d))\n .join('')\n .replace(/([^a-zA-Z0-9]|[\\.])/gm, '') ?? ''\n )\n}\n\nexport function removeExt(d: string) {\n return d.substring(0, d.lastIndexOf('.')) || d\n}\n\nfunction spaces(d: number): string {\n return Array.from({ length: d })\n .map(() => ' ')\n .join('')\n}\n\nexport function multiSortBy<T>(\n arr: T[],\n accessors: ((item: T) => any)[] = [(d) => d],\n): T[] {\n return arr\n .map((d, i) => [d, i] as const)\n .sort(([a, ai], [b, bi]) => {\n for (const accessor of accessors) {\n const ao = accessor(a)\n const bo = accessor(b)\n\n if (typeof ao === 'undefined') {\n if (typeof bo === 'undefined') {\n continue\n }\n return 1\n }\n\n if (ao === bo) {\n continue\n }\n\n return ao > bo ? 1 : -1\n }\n\n return ai - bi\n })\n .map(([d]) => d)\n}\n\nfunction capitalize(s: string) {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nfunction 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","getRouteNodes","config","routeFilePrefix","routeFileIgnorePrefix","routeNodes","recurse","dir","fullDir","path","resolve","routesDirectory","dirList","fs","readdir","withFileTypes","filter","d","name","startsWith","Promise","all","map","dirent","fullPath","join","relativePath","isDirectory","match","filePath","replaceBackslash","filePathNoExt","removeExt","routePath","cleanPath","split","variableName","routePathToVariable","isRoute","endsWith","isComponent","isErrorComponent","isPendingComponent","isLoader","replace","push","first","skipMessage","generator","console","log","taskId","checkLatest","start","Date","now","routePathIdPrefix","preRouteNodes","multiSortBy","length","includes","routeTree","routePiecesByPath","handleNode","node","parentRoute","hasParentRoute","parent","trimmedPath","trimPathLeft","isNonPath","isNonLayout","cleanedPath","removeUnderscores","isVirtual","anchorRoute","find","children","forEach","buildRouteConfig","nodes","depth","routeCode","readFile","isRoot","escapedRoutePath","removeTrailingUnderscores","replaceAll","quoteStyle","replaced","p1","p2","p3","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","sortedRouteNodes","imports","Object","entries","FileRoute","some","lazyFn","loader","lazyRouteComponent","component","errorComponent","pendingComponent","virtualRouteNodes","routeImports","relative","dirname","generatedRouteTree","loaderNode","componentNode","errorComponentNode","pendingComponentNode","disableTypes","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/build/esm/index.js
CHANGED
|
@@ -19,15 +19,24 @@ const configSchema = z.object({
|
|
|
19
19
|
routeFileIgnorePrefix: z.string().optional().default('-'),
|
|
20
20
|
routesDirectory: z.string().optional().default('./src/routes'),
|
|
21
21
|
generatedRouteTree: z.string().optional().default('./src/routeTree.gen.ts'),
|
|
22
|
-
quoteStyle: z.enum(['single', 'double']).optional().default('single')
|
|
22
|
+
quoteStyle: z.enum(['single', 'double']).optional().default('single'),
|
|
23
|
+
disableTypes: z.boolean().optional().default(false)
|
|
23
24
|
});
|
|
24
25
|
const configFilePathJson = path.resolve(process.cwd(), 'tsr.config.json');
|
|
25
26
|
async function getConfig() {
|
|
26
27
|
const exists = existsSync(configFilePathJson);
|
|
28
|
+
let config;
|
|
27
29
|
if (exists) {
|
|
28
|
-
|
|
30
|
+
config = configSchema.parse(JSON.parse(readFileSync(configFilePathJson, 'utf-8')));
|
|
31
|
+
} else {
|
|
32
|
+
config = configSchema.parse({});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// If typescript is disabled, make sure the generated route tree is a .js file
|
|
36
|
+
if (config.disableTypes) {
|
|
37
|
+
config.generatedRouteTree = config.generatedRouteTree.replace(/\.(ts|tsx)$/, '.js');
|
|
29
38
|
}
|
|
30
|
-
return
|
|
39
|
+
return config;
|
|
31
40
|
}
|
|
32
41
|
|
|
33
42
|
function cleanPath(path) {
|
|
@@ -40,7 +49,6 @@ function trimPathLeft(path) {
|
|
|
40
49
|
|
|
41
50
|
let latestTask = 0;
|
|
42
51
|
const rootPathId = '__root';
|
|
43
|
-
const fileRouteRegex = /new\s+FileRoute\(([^)]*)\)/g;
|
|
44
52
|
async function getRouteNodes(config) {
|
|
45
53
|
const {
|
|
46
54
|
routeFilePrefix,
|
|
@@ -182,9 +190,9 @@ async function generator(config) {
|
|
|
182
190
|
// so we have to escape it by turning all $ into $$. But since we do it through a replace call
|
|
183
191
|
// we have to double escape it into $$$$. For more information, see
|
|
184
192
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement
|
|
185
|
-
const escapedRoutePath = removeTrailingUnderscores(node.routePath?.replaceAll('$', '
|
|
186
|
-
|
|
187
|
-
const replaced = routeCode.replace(
|
|
193
|
+
const escapedRoutePath = removeTrailingUnderscores(node.routePath?.replaceAll('$', '$$') ?? '');
|
|
194
|
+
config.quoteStyle === 'single' ? `'` : `"`;
|
|
195
|
+
const replaced = routeCode.replace(/(FileRoute\(\s*['"])([^\s]+)(['"](?:,?)\s*\))/g, (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`);
|
|
188
196
|
if (replaced !== routeCode) {
|
|
189
197
|
await fs.writeFile(node.fullPath, replaced);
|
|
190
198
|
}
|
|
@@ -216,12 +224,12 @@ async function generator(config) {
|
|
|
216
224
|
const pendingComponentNode = routePiecesByPath[node.routePath]?.pendingComponent;
|
|
217
225
|
return [`const ${node.variableName}Route = ${node.variableName}Import.update({
|
|
218
226
|
${[node.isNonPath ? `id: '${node.path}'` : `path: '${node.cleanedPath}'`, `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`].filter(Boolean).join(',')}
|
|
219
|
-
} as any)`, loaderNode ? `.updateLoader({ loader: lazyFn(() => import('./${replaceBackslash(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, loaderNode.filePath))))}'), 'loader') })` : '', componentNode || errorComponentNode || pendingComponentNode ? `.update({
|
|
227
|
+
}${config.disableTypes ? '' : 'as any'})`, loaderNode ? `.updateLoader({ loader: lazyFn(() => import('./${replaceBackslash(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, loaderNode.filePath))))}'), 'loader') })` : '', componentNode || errorComponentNode || pendingComponentNode ? `.update({
|
|
220
228
|
${[['component', componentNode], ['errorComponent', errorComponentNode], ['pendingComponent', pendingComponentNode]].filter(d => d[1]).map(d => {
|
|
221
229
|
return `${d[0]}: lazyRouteComponent(() => import('./${replaceBackslash(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, d[1].filePath))))}'), '${d[0]}')`;
|
|
222
230
|
}).join('\n,')}
|
|
223
231
|
})` : ''].join('');
|
|
224
|
-
}).join('\n\n'), '// Populate the FileRoutesByPath interface', `declare module '@tanstack/react-router' {
|
|
232
|
+
}).join('\n\n'), ...(config.disableTypes ? [] : ['// Populate the FileRoutesByPath interface', `declare module '@tanstack/react-router' {
|
|
225
233
|
interface FileRoutesByPath {
|
|
226
234
|
${routeNodes.map(routeNode => {
|
|
227
235
|
return `'${removeTrailingUnderscores(routeNode.routePath)}': {
|
|
@@ -230,7 +238,7 @@ async function generator(config) {
|
|
|
230
238
|
}`;
|
|
231
239
|
}).join('\n')}
|
|
232
240
|
}
|
|
233
|
-
}
|
|
241
|
+
}`]), '// Create and export the route tree', `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`].filter(Boolean).join('\n\n');
|
|
234
242
|
const routeConfigFileContent = await prettier.format(routeImports, {
|
|
235
243
|
semi: false,
|
|
236
244
|
singleQuote: config.quoteStyle === 'single',
|
package/build/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/config.ts","../../src/utils.ts","../../src/generator.ts"],"sourcesContent":["import path from 'path'\nimport { readFileSync, existsSync } from 'fs'\nimport { z } from 'zod'\n\nexport const configSchema = z.object({\n routeFilePrefix: z.string().optional(),\n routeFileIgnorePrefix: z.string().optional().default('-'),\n routesDirectory: z.string().optional().default('./src/routes'),\n generatedRouteTree: z.string().optional().default('./src/routeTree.gen.ts'),\n quoteStyle: z.enum(['single', 'double']).optional().default('single'),\n})\n\nexport type Config = z.infer<typeof configSchema>\n\nconst configFilePathJson = path.resolve(process.cwd(), 'tsr.config.json')\n\nexport async function getConfig(): Promise<Config> {\n const exists = existsSync(configFilePathJson)\n\n if (exists) {\n return configSchema.parse(\n JSON.parse(readFileSync(configFilePathJson, 'utf-8')),\n )\n }\n\n return configSchema.parse({})\n}\n","export function cleanPath(path: string) {\n // remove double slashes\n return path.replace(/\\/{2,}/g, '/')\n}\n\nexport function trimPathLeft(path: string) {\n return path === '/' ? path : path.replace(/^\\/{1,}/, '')\n}\n","import path from 'path'\nimport * as fs from 'fs/promises'\nimport * as prettier from 'prettier'\nimport { Config } from './config'\nimport { cleanPath, trimPathLeft } from './utils'\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, { withFileTypes: true })\n\n dirList = dirList.filter((d) => {\n if (\n d.name.startsWith('.') ||\n (routeFileIgnorePrefix && d.name.startsWith(routeFileIgnorePrefix))\n ) {\n return false\n }\n\n if (routeFilePrefix) {\n return d.name.startsWith(routeFilePrefix)\n }\n\n return true\n })\n\n await Promise.all(\n dirList.map(async (dirent) => {\n const fullPath = path.join(fullDir, dirent.name)\n const relativePath = path.join(dir, dirent.name)\n\n if (dirent.isDirectory()) {\n await recurse(relativePath)\n } else if (fullPath.match(/\\.(tsx|ts|jsx|js)$/)) {\n const filePath = replaceBackslash(path.join(dir, dirent.name))\n const filePathNoExt = removeExt(filePath)\n let routePath =\n cleanPath(`/${filePathNoExt.split('.').join('/')}`) || ''\n const variableName = routePathToVariable(routePath)\n\n // Remove the index from the route path and\n // if the route path is empty, use `/'\n\n let isRoute = routePath?.endsWith('/route')\n let isComponent = routePath?.endsWith('/component')\n let isErrorComponent = routePath?.endsWith('/errorComponent')\n let isPendingComponent = routePath?.endsWith('/pendingComponent')\n let isLoader = routePath?.endsWith('/loader')\n\n routePath = routePath?.replace(\n /\\/(component|errorComponent|pendingComponent|loader|route)$/,\n '',\n )\n\n if (routePath === 'index') {\n routePath = '/'\n }\n\n routePath = routePath.replace(/\\/index$/, '/') || '/'\n\n routeNodes.push({\n filePath,\n fullPath,\n routePath,\n variableName,\n isRoute,\n isComponent,\n isErrorComponent,\n isPendingComponent,\n isLoader,\n })\n }\n }),\n )\n\n return routeNodes\n }\n\n await recurse('./')\n\n return routeNodes\n}\n\nlet first = false\nlet skipMessage = false\n\ntype RouteSubNode = {\n component?: RouteNode\n errorComponent?: RouteNode\n pendingComponent?: RouteNode\n loader?: RouteNode\n}\n\nexport async function generator(config: Config) {\n console.log()\n\n if (!first) {\n console.log('🔄 Generating routes...')\n first = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n console.log('♻️ Regenerating routes...')\n }\n\n const taskId = latestTask + 1\n latestTask = taskId\n\n const checkLatest = () => {\n if (latestTask !== taskId) {\n skipMessage = true\n return false\n }\n\n return true\n }\n\n const start = Date.now()\n const routePathIdPrefix = config.routeFilePrefix ?? ''\n\n const preRouteNodes = multiSortBy(await getRouteNodes(config), [\n (d) => (d.routePath === '/' ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.filePath?.match(/[./]index[.]/) ? 1 : -1),\n (d) =>\n d.filePath?.match(\n /[./](component|errorComponent|pendingComponent|loader)[.]/,\n )\n ? 1\n : -1,\n (d) => (d.filePath?.match(/[./]route[.]/) ? -1 : 1),\n (d) => (d.routePath?.endsWith('/') ? -1 : 1),\n (d) => d.routePath,\n ]).filter(\n (d) => ![`/${routePathIdPrefix + rootPathId}`].includes(d.routePath || ''),\n )\n\n const routeTree: RouteNode[] = []\n const routePiecesByPath: Record<string, RouteSubNode> = {}\n\n // Loop over the flat list of routeNodes and\n // build up a tree based on the routeNodes' routePath\n let routeNodes: RouteNode[] = []\n\n const handleNode = (node: RouteNode) => {\n const parentRoute = hasParentRoute(routeNodes, node.routePath)\n if (parentRoute) node.parent = parentRoute\n\n node.path = node.parent\n ? node.routePath?.replace(node.parent.routePath!, '') || '/'\n : node.routePath\n\n const trimmedPath = trimPathLeft(node.path ?? '')\n\n const split = trimmedPath?.split('/') ?? []\n let first = split[0] ?? trimmedPath ?? ''\n\n node.isNonPath = first.startsWith('_')\n node.isNonLayout = first.endsWith('_')\n\n node.cleanedPath = removeUnderscores(node.path) ?? ''\n\n if (\n !node.isVirtual &&\n (node.isLoader ||\n node.isComponent ||\n node.isErrorComponent ||\n node.isPendingComponent)\n ) {\n routePiecesByPath[node.routePath!] =\n routePiecesByPath[node.routePath!] || {}\n\n routePiecesByPath[node.routePath!]![\n node.isLoader\n ? 'loader'\n : node.isErrorComponent\n ? 'errorComponent'\n : node.isPendingComponent\n ? 'pendingComponent'\n : 'component'\n ] = node\n\n const anchorRoute = routeNodes.find((d) => d.routePath === node.routePath)\n\n if (!anchorRoute) {\n handleNode({\n ...node,\n isVirtual: true,\n isLoader: false,\n isComponent: false,\n isErrorComponent: false,\n isPendingComponent: false,\n })\n }\n return\n }\n\n 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 virtualRouteNodes = sortedRouteNodes.filter((d) => d.isVirtual)\n\n const routeImports = [\n '// This file is auto-generated by TanStack Router',\n imports.length\n ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\\n`\n : '',\n '// Import Routes',\n [\n `import { Route as rootRoute } from './${replaceBackslash(\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 './${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n ),\n )}'`\n }),\n ].join('\\n'),\n virtualRouteNodes.length ? '// Create Virtual Routes' : '',\n virtualRouteNodes\n .map((node) => {\n return `const ${\n node.variableName\n }Import = new FileRoute('${removeTrailingUnderscores(\n node.routePath,\n )}').createRoute()`\n })\n .join('\\n'),\n '// Create/Update Routes',\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('./${replaceBackslash(\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('./${replaceBackslash(\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 '// Populate the FileRoutesByPath interface',\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 '// Create and export the route tree',\n `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`,\n ]\n .filter(Boolean)\n .join('\\n\\n')\n\n const routeConfigFileContent = await prettier.format(routeImports, {\n semi: false,\n singleQuote: config.quoteStyle === 'single',\n parser: 'typescript',\n })\n\n const routeTreeContent = await fs\n .readFile(path.resolve(config.generatedRouteTree), 'utf-8')\n .catch((err: any) => {\n if (err.code === 'ENOENT') {\n return undefined\n }\n throw err\n })\n\n if (!checkLatest()) return\n\n if (routeTreeContent !== routeConfigFileContent) {\n await fs.mkdir(path.dirname(path.resolve(config.generatedRouteTree)), {\n recursive: true,\n })\n if (!checkLatest()) return\n await fs.writeFile(\n path.resolve(config.generatedRouteTree),\n routeConfigFileContent,\n )\n }\n\n console.log(\n `🌲 Processed ${routeNodes.length} routes in ${Date.now() - start}ms`,\n )\n}\n\nfunction routePathToVariable(d: string): string {\n return (\n removeUnderscores(d)\n ?.replace(/\\/\\$\\//g, '/splat/')\n ?.replace(/\\$$/g, 'splat')\n ?.replace(/\\$/g, '')\n ?.split(/[/-]/g)\n .map((d, i) => (i > 0 ? capitalize(d) : d))\n .join('')\n .replace(/([^a-zA-Z0-9]|[\\.])/gm, '') ?? ''\n )\n}\n\nexport function removeExt(d: string) {\n return d.substring(0, d.lastIndexOf('.')) || d\n}\n\nfunction spaces(d: number): string {\n return Array.from({ length: d })\n .map(() => ' ')\n .join('')\n}\n\nexport function multiSortBy<T>(\n arr: T[],\n accessors: ((item: T) => any)[] = [(d) => d],\n): T[] {\n return arr\n .map((d, i) => [d, i] as const)\n .sort(([a, ai], [b, bi]) => {\n for (const accessor of accessors) {\n const ao = accessor(a)\n const bo = accessor(b)\n\n if (typeof ao === 'undefined') {\n if (typeof bo === 'undefined') {\n continue\n }\n return 1\n }\n\n if (ao === bo) {\n continue\n }\n\n return ao > bo ? 1 : -1\n }\n\n return ai - bi\n })\n .map(([d]) => d)\n}\n\nfunction capitalize(s: string) {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nfunction 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":["configSchema","z","object","routeFilePrefix","string","optional","routeFileIgnorePrefix","default","routesDirectory","generatedRouteTree","quoteStyle","enum","configFilePathJson","path","resolve","process","cwd","getConfig","exists","existsSync","parse","JSON","readFileSync","cleanPath","replace","trimPathLeft","latestTask","rootPathId","fileRouteRegex","getRouteNodes","config","routeNodes","recurse","dir","fullDir","dirList","fs","readdir","withFileTypes","filter","d","name","startsWith","Promise","all","map","dirent","fullPath","join","relativePath","isDirectory","match","filePath","replaceBackslash","filePathNoExt","removeExt","routePath","split","variableName","routePathToVariable","isRoute","endsWith","isComponent","isErrorComponent","isPendingComponent","isLoader","push","first","skipMessage","generator","console","log","taskId","checkLatest","start","Date","now","routePathIdPrefix","preRouteNodes","multiSortBy","length","includes","routeTree","routePiecesByPath","handleNode","node","parentRoute","hasParentRoute","parent","trimmedPath","isNonPath","isNonLayout","cleanedPath","removeUnderscores","isVirtual","anchorRoute","find","children","forEach","buildRouteConfig","nodes","depth","routeCode","readFile","isRoot","escapedRoutePath","removeTrailingUnderscores","replaceAll","quote","replaced","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","sortedRouteNodes","imports","Object","entries","FileRoute","some","lazyFn","loader","lazyRouteComponent","component","errorComponent","pendingComponent","virtualRouteNodes","routeImports","relative","dirname","loaderNode","componentNode","errorComponentNode","pendingComponentNode","routeNode","routeConfigFileContent","prettier","format","semi","singleQuote","parser","routeTreeContent","catch","err","code","undefined","mkdir","recursive","i","capitalize","substring","lastIndexOf","Array","from","arr","accessors","sort","a","ai","b","bi","accessor","ao","bo","s","charAt","toUpperCase","slice","routes","routePathToCheck","sortedNodes","segments","pop","parentRoutePath"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/config.ts","../../src/utils.ts","../../src/generator.ts"],"sourcesContent":["import path from 'path'\nimport { readFileSync, existsSync } from 'fs'\nimport { z } from 'zod'\n\nexport const configSchema = z.object({\n routeFilePrefix: z.string().optional(),\n routeFileIgnorePrefix: z.string().optional().default('-'),\n routesDirectory: z.string().optional().default('./src/routes'),\n generatedRouteTree: z.string().optional().default('./src/routeTree.gen.ts'),\n quoteStyle: z.enum(['single', 'double']).optional().default('single'),\n disableTypes: z.boolean().optional().default(false),\n})\n\nexport type Config = z.infer<typeof configSchema>\n\nconst configFilePathJson = path.resolve(process.cwd(), 'tsr.config.json')\n\nexport async function getConfig(): Promise<Config> {\n const exists = existsSync(configFilePathJson)\n\n let config: Config\n\n if (exists) {\n config = configSchema.parse(\n JSON.parse(readFileSync(configFilePathJson, 'utf-8')),\n )\n } else {\n config = configSchema.parse({})\n }\n\n // If typescript is disabled, make sure the generated route tree is a .js file\n if (config.disableTypes) {\n config.generatedRouteTree = config.generatedRouteTree.replace(\n /\\.(ts|tsx)$/,\n '.js',\n )\n }\n\n return config\n}\n","export function cleanPath(path: string) {\n // remove double slashes\n return path.replace(/\\/{2,}/g, '/')\n}\n\nexport function trimPathLeft(path: string) {\n return path === '/' ? path : path.replace(/^\\/{1,}/, '')\n}\n","import path from 'path'\nimport * as fs from 'fs/promises'\nimport * as prettier from 'prettier'\nimport { Config } from './config'\nimport { cleanPath, trimPathLeft } from './utils'\n\nlet latestTask = 0\nexport const rootPathId = '__root'\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, { withFileTypes: true })\n\n dirList = dirList.filter((d) => {\n if (\n d.name.startsWith('.') ||\n (routeFileIgnorePrefix && d.name.startsWith(routeFileIgnorePrefix))\n ) {\n return false\n }\n\n if (routeFilePrefix) {\n return d.name.startsWith(routeFilePrefix)\n }\n\n return true\n })\n\n await Promise.all(\n dirList.map(async (dirent) => {\n const fullPath = path.join(fullDir, dirent.name)\n const relativePath = path.join(dir, dirent.name)\n\n if (dirent.isDirectory()) {\n await recurse(relativePath)\n } else if (fullPath.match(/\\.(tsx|ts|jsx|js)$/)) {\n const filePath = replaceBackslash(path.join(dir, dirent.name))\n const filePathNoExt = removeExt(filePath)\n let routePath =\n cleanPath(`/${filePathNoExt.split('.').join('/')}`) || ''\n const variableName = routePathToVariable(routePath)\n\n // Remove the index from the route path and\n // if the route path is empty, use `/'\n\n let isRoute = routePath?.endsWith('/route')\n let isComponent = routePath?.endsWith('/component')\n let isErrorComponent = routePath?.endsWith('/errorComponent')\n let isPendingComponent = routePath?.endsWith('/pendingComponent')\n let isLoader = routePath?.endsWith('/loader')\n\n routePath = routePath?.replace(\n /\\/(component|errorComponent|pendingComponent|loader|route)$/,\n '',\n )\n\n if (routePath === 'index') {\n routePath = '/'\n }\n\n routePath = routePath.replace(/\\/index$/, '/') || '/'\n\n routeNodes.push({\n filePath,\n fullPath,\n routePath,\n variableName,\n isRoute,\n isComponent,\n isErrorComponent,\n isPendingComponent,\n isLoader,\n })\n }\n }),\n )\n\n return routeNodes\n }\n\n await recurse('./')\n\n return routeNodes\n}\n\nlet first = false\nlet skipMessage = false\n\ntype RouteSubNode = {\n component?: RouteNode\n errorComponent?: RouteNode\n pendingComponent?: RouteNode\n loader?: RouteNode\n}\n\nexport async function generator(config: Config) {\n console.log()\n\n if (!first) {\n console.log('🔄 Generating routes...')\n first = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n console.log('♻️ Regenerating routes...')\n }\n\n const taskId = latestTask + 1\n latestTask = taskId\n\n const checkLatest = () => {\n if (latestTask !== taskId) {\n skipMessage = true\n return false\n }\n\n return true\n }\n\n const start = Date.now()\n const routePathIdPrefix = config.routeFilePrefix ?? ''\n\n const preRouteNodes = multiSortBy(await getRouteNodes(config), [\n (d) => (d.routePath === '/' ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.filePath?.match(/[./]index[.]/) ? 1 : -1),\n (d) =>\n d.filePath?.match(\n /[./](component|errorComponent|pendingComponent|loader)[.]/,\n )\n ? 1\n : -1,\n (d) => (d.filePath?.match(/[./]route[.]/) ? -1 : 1),\n (d) => (d.routePath?.endsWith('/') ? -1 : 1),\n (d) => d.routePath,\n ]).filter(\n (d) => ![`/${routePathIdPrefix + rootPathId}`].includes(d.routePath || ''),\n )\n\n const routeTree: RouteNode[] = []\n const routePiecesByPath: Record<string, RouteSubNode> = {}\n\n // Loop over the flat list of routeNodes and\n // build up a tree based on the routeNodes' routePath\n let routeNodes: RouteNode[] = []\n\n const handleNode = (node: RouteNode) => {\n const parentRoute = hasParentRoute(routeNodes, node.routePath)\n if (parentRoute) node.parent = parentRoute\n\n node.path = node.parent\n ? node.routePath?.replace(node.parent.routePath!, '') || '/'\n : node.routePath\n\n const trimmedPath = trimPathLeft(node.path ?? '')\n\n const split = trimmedPath?.split('/') ?? []\n let first = split[0] ?? trimmedPath ?? ''\n\n node.isNonPath = first.startsWith('_')\n node.isNonLayout = first.endsWith('_')\n\n node.cleanedPath = removeUnderscores(node.path) ?? ''\n\n if (\n !node.isVirtual &&\n (node.isLoader ||\n node.isComponent ||\n node.isErrorComponent ||\n node.isPendingComponent)\n ) {\n routePiecesByPath[node.routePath!] =\n routePiecesByPath[node.routePath!] || {}\n\n routePiecesByPath[node.routePath!]![\n node.isLoader\n ? 'loader'\n : node.isErrorComponent\n ? 'errorComponent'\n : node.isPendingComponent\n ? 'pendingComponent'\n : 'component'\n ] = node\n\n const anchorRoute = routeNodes.find((d) => d.routePath === node.routePath)\n\n if (!anchorRoute) {\n handleNode({\n ...node,\n isVirtual: true,\n isLoader: false,\n isComponent: false,\n isErrorComponent: false,\n isPendingComponent: false,\n })\n }\n return\n }\n\n 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 /(FileRoute\\(\\s*['\"])([^\\s]+)(['\"](?:,?)\\s*\\))/g,\n (match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`,\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 virtualRouteNodes = sortedRouteNodes.filter((d) => d.isVirtual)\n\n const routeImports = [\n '// This file is auto-generated by TanStack Router',\n imports.length\n ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\\n`\n : '',\n '// Import Routes',\n [\n `import { Route as rootRoute } from './${replaceBackslash(\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 './${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n ),\n )}'`\n }),\n ].join('\\n'),\n virtualRouteNodes.length ? '// Create Virtual Routes' : '',\n virtualRouteNodes\n .map((node) => {\n return `const ${\n node.variableName\n }Import = new FileRoute('${removeTrailingUnderscores(\n node.routePath,\n )}').createRoute()`\n })\n .join('\\n'),\n '// Create/Update Routes',\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 }${config.disableTypes ? '' : 'as any'})`,\n loaderNode\n ? `.updateLoader({ loader: lazyFn(() => import('./${replaceBackslash(\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('./${replaceBackslash(\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 ...(config.disableTypes\n ? []\n : [\n '// Populate the FileRoutesByPath interface',\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 ]),\n '// Create and export the route tree',\n `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`,\n ]\n .filter(Boolean)\n .join('\\n\\n')\n\n const routeConfigFileContent = await prettier.format(routeImports, {\n semi: false,\n singleQuote: config.quoteStyle === 'single',\n parser: 'typescript',\n })\n\n const routeTreeContent = await fs\n .readFile(path.resolve(config.generatedRouteTree), 'utf-8')\n .catch((err: any) => {\n if (err.code === 'ENOENT') {\n return undefined\n }\n throw err\n })\n\n if (!checkLatest()) return\n\n if (routeTreeContent !== routeConfigFileContent) {\n await fs.mkdir(path.dirname(path.resolve(config.generatedRouteTree)), {\n recursive: true,\n })\n if (!checkLatest()) return\n await fs.writeFile(\n path.resolve(config.generatedRouteTree),\n routeConfigFileContent,\n )\n }\n\n console.log(\n `🌲 Processed ${routeNodes.length} routes in ${Date.now() - start}ms`,\n )\n}\n\nfunction routePathToVariable(d: string): string {\n return (\n removeUnderscores(d)\n ?.replace(/\\/\\$\\//g, '/splat/')\n ?.replace(/\\$$/g, 'splat')\n ?.replace(/\\$/g, '')\n ?.split(/[/-]/g)\n .map((d, i) => (i > 0 ? capitalize(d) : d))\n .join('')\n .replace(/([^a-zA-Z0-9]|[\\.])/gm, '') ?? ''\n )\n}\n\nexport function removeExt(d: string) {\n return d.substring(0, d.lastIndexOf('.')) || d\n}\n\nfunction spaces(d: number): string {\n return Array.from({ length: d })\n .map(() => ' ')\n .join('')\n}\n\nexport function multiSortBy<T>(\n arr: T[],\n accessors: ((item: T) => any)[] = [(d) => d],\n): T[] {\n return arr\n .map((d, i) => [d, i] as const)\n .sort(([a, ai], [b, bi]) => {\n for (const accessor of accessors) {\n const ao = accessor(a)\n const bo = accessor(b)\n\n if (typeof ao === 'undefined') {\n if (typeof bo === 'undefined') {\n continue\n }\n return 1\n }\n\n if (ao === bo) {\n continue\n }\n\n return ao > bo ? 1 : -1\n }\n\n return ai - bi\n })\n .map(([d]) => d)\n}\n\nfunction capitalize(s: string) {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nfunction 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":["configSchema","z","object","routeFilePrefix","string","optional","routeFileIgnorePrefix","default","routesDirectory","generatedRouteTree","quoteStyle","enum","disableTypes","boolean","configFilePathJson","path","resolve","process","cwd","getConfig","exists","existsSync","config","parse","JSON","readFileSync","replace","cleanPath","trimPathLeft","latestTask","rootPathId","getRouteNodes","routeNodes","recurse","dir","fullDir","dirList","fs","readdir","withFileTypes","filter","d","name","startsWith","Promise","all","map","dirent","fullPath","join","relativePath","isDirectory","match","filePath","replaceBackslash","filePathNoExt","removeExt","routePath","split","variableName","routePathToVariable","isRoute","endsWith","isComponent","isErrorComponent","isPendingComponent","isLoader","push","first","skipMessage","generator","console","log","taskId","checkLatest","start","Date","now","routePathIdPrefix","preRouteNodes","multiSortBy","length","includes","routeTree","routePiecesByPath","handleNode","node","parentRoute","hasParentRoute","parent","trimmedPath","isNonPath","isNonLayout","cleanedPath","removeUnderscores","isVirtual","anchorRoute","find","children","forEach","buildRouteConfig","nodes","depth","routeCode","readFile","isRoot","escapedRoutePath","removeTrailingUnderscores","replaceAll","replaced","p1","p2","p3","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","sortedRouteNodes","imports","Object","entries","FileRoute","some","lazyFn","loader","lazyRouteComponent","component","errorComponent","pendingComponent","virtualRouteNodes","routeImports","relative","dirname","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/build/types/index.d.ts
CHANGED
|
@@ -16,11 +16,13 @@ declare const configSchema: z.ZodObject<{
|
|
|
16
16
|
routesDirectory: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
17
17
|
generatedRouteTree: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
18
18
|
quoteStyle: z.ZodDefault<z.ZodOptional<z.ZodEnum<["single", "double"]>>>;
|
|
19
|
+
disableTypes: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
19
20
|
}, "strip", z.ZodTypeAny, {
|
|
20
21
|
routeFileIgnorePrefix: string;
|
|
21
22
|
routesDirectory: string;
|
|
22
23
|
generatedRouteTree: string;
|
|
23
24
|
quoteStyle: "single" | "double";
|
|
25
|
+
disableTypes: boolean;
|
|
24
26
|
routeFilePrefix?: string | undefined;
|
|
25
27
|
}, {
|
|
26
28
|
routeFilePrefix?: string | undefined;
|
|
@@ -28,6 +30,7 @@ declare const configSchema: z.ZodObject<{
|
|
|
28
30
|
routesDirectory?: string | undefined;
|
|
29
31
|
generatedRouteTree?: string | undefined;
|
|
30
32
|
quoteStyle?: "single" | "double" | undefined;
|
|
33
|
+
disableTypes?: boolean | undefined;
|
|
31
34
|
}>;
|
|
32
35
|
type Config = z.infer<typeof configSchema>;
|
|
33
36
|
declare function getConfig(): Promise<Config>;
|
package/package.json
CHANGED
package/src/config.ts
CHANGED
|
@@ -8,6 +8,7 @@ export const configSchema = z.object({
|
|
|
8
8
|
routesDirectory: z.string().optional().default('./src/routes'),
|
|
9
9
|
generatedRouteTree: z.string().optional().default('./src/routeTree.gen.ts'),
|
|
10
10
|
quoteStyle: z.enum(['single', 'double']).optional().default('single'),
|
|
11
|
+
disableTypes: z.boolean().optional().default(false),
|
|
11
12
|
})
|
|
12
13
|
|
|
13
14
|
export type Config = z.infer<typeof configSchema>
|
|
@@ -17,11 +18,23 @@ const configFilePathJson = path.resolve(process.cwd(), 'tsr.config.json')
|
|
|
17
18
|
export async function getConfig(): Promise<Config> {
|
|
18
19
|
const exists = existsSync(configFilePathJson)
|
|
19
20
|
|
|
21
|
+
let config: Config
|
|
22
|
+
|
|
20
23
|
if (exists) {
|
|
21
|
-
|
|
24
|
+
config = configSchema.parse(
|
|
22
25
|
JSON.parse(readFileSync(configFilePathJson, 'utf-8')),
|
|
23
26
|
)
|
|
27
|
+
} else {
|
|
28
|
+
config = configSchema.parse({})
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// If typescript is disabled, make sure the generated route tree is a .js file
|
|
32
|
+
if (config.disableTypes) {
|
|
33
|
+
config.generatedRouteTree = config.generatedRouteTree.replace(
|
|
34
|
+
/\.(ts|tsx)$/,
|
|
35
|
+
'.js',
|
|
36
|
+
)
|
|
24
37
|
}
|
|
25
38
|
|
|
26
|
-
return
|
|
39
|
+
return config
|
|
27
40
|
}
|
package/src/generator.ts
CHANGED
|
@@ -6,7 +6,6 @@ import { cleanPath, trimPathLeft } from './utils'
|
|
|
6
6
|
|
|
7
7
|
let latestTask = 0
|
|
8
8
|
export const rootPathId = '__root'
|
|
9
|
-
export const fileRouteRegex = /new\s+FileRoute\(([^)]*)\)/g
|
|
10
9
|
|
|
11
10
|
export type RouteNode = {
|
|
12
11
|
filePath: string
|
|
@@ -202,10 +201,10 @@ export async function generator(config: Config) {
|
|
|
202
201
|
node.isLoader
|
|
203
202
|
? 'loader'
|
|
204
203
|
: node.isErrorComponent
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
204
|
+
? 'errorComponent'
|
|
205
|
+
: node.isPendingComponent
|
|
206
|
+
? 'pendingComponent'
|
|
207
|
+
: 'component'
|
|
209
208
|
] = node
|
|
210
209
|
|
|
211
210
|
const anchorRoute = routeNodes.find((d) => d.routePath === node.routePath)
|
|
@@ -253,12 +252,12 @@ export async function generator(config: Config) {
|
|
|
253
252
|
// we have to double escape it into $$$$. For more information, see
|
|
254
253
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement
|
|
255
254
|
const escapedRoutePath = removeTrailingUnderscores(
|
|
256
|
-
node.routePath?.replaceAll('$', '
|
|
255
|
+
node.routePath?.replaceAll('$', '$$') ?? '',
|
|
257
256
|
)
|
|
258
257
|
const quote = config.quoteStyle === 'single' ? `'` : `"`
|
|
259
258
|
const replaced = routeCode.replace(
|
|
260
|
-
|
|
261
|
-
|
|
259
|
+
/(FileRoute\(\s*['"])([^\s]+)(['"](?:,?)\s*\))/g,
|
|
260
|
+
(match, p1, p2, p3) => `${p1}${escapedRoutePath}${p3}`,
|
|
262
261
|
)
|
|
263
262
|
|
|
264
263
|
if (replaced !== routeCode) {
|
|
@@ -363,7 +362,7 @@ export async function generator(config: Config) {
|
|
|
363
362
|
]
|
|
364
363
|
.filter(Boolean)
|
|
365
364
|
.join(',')}
|
|
366
|
-
} as any)`,
|
|
365
|
+
}${config.disableTypes ? '' : 'as any'})`,
|
|
367
366
|
loaderNode
|
|
368
367
|
? `.updateLoader({ loader: lazyFn(() => import('./${replaceBackslash(
|
|
369
368
|
removeExt(
|
|
@@ -402,8 +401,11 @@ export async function generator(config: Config) {
|
|
|
402
401
|
].join('')
|
|
403
402
|
})
|
|
404
403
|
.join('\n\n'),
|
|
405
|
-
|
|
406
|
-
|
|
404
|
+
...(config.disableTypes
|
|
405
|
+
? []
|
|
406
|
+
: [
|
|
407
|
+
'// Populate the FileRoutesByPath interface',
|
|
408
|
+
`declare module '@tanstack/react-router' {
|
|
407
409
|
interface FileRoutesByPath {
|
|
408
410
|
${routeNodes
|
|
409
411
|
.map((routeNode) => {
|
|
@@ -419,6 +421,7 @@ export async function generator(config: Config) {
|
|
|
419
421
|
.join('\n')}
|
|
420
422
|
}
|
|
421
423
|
}`,
|
|
424
|
+
]),
|
|
422
425
|
'// Create and export the route tree',
|
|
423
426
|
`export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`,
|
|
424
427
|
]
|