@tanstack/router-cli 1.1.11 → 1.2.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.
@@ -11,12 +11,12 @@
11
11
  'use strict';
12
12
 
13
13
  var path = require('path');
14
- var fs = require('fs-extra');
14
+ var fs = require('fs');
15
15
  var zod = require('zod');
16
16
 
17
17
  const configSchema = zod.z.object({
18
18
  routeFilePrefix: zod.z.string().optional(),
19
- routeFileIgnorePrefix: zod.z.string().optional(),
19
+ routeFileIgnorePrefix: zod.z.string().optional().default('-'),
20
20
  routesDirectory: zod.z.string(),
21
21
  generatedRouteTree: zod.z.string(),
22
22
  quoteStyle: zod.z.enum(['single', 'double']).optional().default('single'),
@@ -26,12 +26,9 @@ const configSchema = zod.z.object({
26
26
  });
27
27
  const configFilePathJson = path.resolve(process.cwd(), 'tsr.config.json');
28
28
  async function getConfig() {
29
- const config = await fs.readJson(configFilePathJson);
30
- return {
31
- routeFileIgnorePrefix: '-',
32
- ...configSchema.parse(config)
33
- };
29
+ return configSchema.parse(JSON.parse(fs.readFileSync(configFilePathJson, 'utf-8')));
34
30
  }
35
31
 
32
+ exports.configSchema = configSchema;
36
33
  exports.getConfig = getConfig;
37
34
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sources":["../../src/config.ts"],"sourcesContent":["import path from 'path'\nimport fs from 'fs-extra'\nimport { z } from 'zod'\n\nconst configSchema = z.object({\n routeFilePrefix: z.string().optional(),\n routeFileIgnorePrefix: z.string().optional(),\n routesDirectory: z.string(),\n generatedRouteTree: z.string(),\n quoteStyle: z.enum(['single', 'double']).optional().default('single'),\n future: z\n .object({\n unstable_codeSplitting: z.boolean().optional(),\n })\n .optional(),\n})\n\nexport type Config = z.infer<typeof configSchema>\n\nconst configFilePathJson = path.resolve(process.cwd(), 'tsr.config.json')\n\nexport async function getConfig(): Promise<Config> {\n const config = (await fs.readJson(configFilePathJson)) as unknown as Config\n\n return { routeFileIgnorePrefix: '-', ...configSchema.parse(config) }\n}\n"],"names":["configSchema","z","object","routeFilePrefix","string","optional","routeFileIgnorePrefix","routesDirectory","generatedRouteTree","quoteStyle","enum","default","future","unstable_codeSplitting","boolean","configFilePathJson","path","resolve","process","cwd","getConfig","config","fs","readJson","parse"],"mappings":";;;;;;;;;;;;;;;;AAIA,MAAMA,YAAY,GAAGC,KAAC,CAACC,MAAM,CAAC;EAC5BC,eAAe,EAAEF,KAAC,CAACG,MAAM,EAAE,CAACC,QAAQ,EAAE;EACtCC,qBAAqB,EAAEL,KAAC,CAACG,MAAM,EAAE,CAACC,QAAQ,EAAE;AAC5CE,EAAAA,eAAe,EAAEN,KAAC,CAACG,MAAM,EAAE;AAC3BI,EAAAA,kBAAkB,EAAEP,KAAC,CAACG,MAAM,EAAE;AAC9BK,EAAAA,UAAU,EAAER,KAAC,CAACS,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAACL,QAAQ,EAAE,CAACM,OAAO,CAAC,QAAQ,CAAC;AACrEC,EAAAA,MAAM,EAAEX,KAAC,CACNC,MAAM,CAAC;IACNW,sBAAsB,EAAEZ,KAAC,CAACa,OAAO,EAAE,CAACT,QAAQ,EAAC;GAC9C,CAAC,CACDA,QAAQ,EAAC;AACd,CAAC,CAAC,CAAA;AAIF,MAAMU,kBAAkB,GAAGC,IAAI,CAACC,OAAO,CAACC,OAAO,CAACC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAA;AAElE,eAAeC,SAASA,GAAoB;EACjD,MAAMC,MAAM,GAAI,MAAMC,EAAE,CAACC,QAAQ,CAACR,kBAAkB,CAAuB,CAAA;EAE3E,OAAO;AAAET,IAAAA,qBAAqB,EAAE,GAAG;AAAE,IAAA,GAAGN,YAAY,CAACwB,KAAK,CAACH,MAAM,CAAA;GAAG,CAAA;AACtE;;;;"}
1
+ {"version":3,"file":"config.js","sources":["../../src/config.ts"],"sourcesContent":["import path from 'path'\nimport { readFileSync } 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(),\n generatedRouteTree: z.string(),\n quoteStyle: z.enum(['single', 'double']).optional().default('single'),\n future: z\n .object({\n unstable_codeSplitting: z.boolean().optional(),\n })\n .optional(),\n})\n\nexport type Config = z.infer<typeof configSchema>\n\nconst configFilePathJson = path.resolve(process.cwd(), 'tsr.config.json')\n\nexport async function getConfig(): Promise<Config> {\n return configSchema.parse(\n JSON.parse(readFileSync(configFilePathJson, 'utf-8')),\n )\n}\n"],"names":["configSchema","z","object","routeFilePrefix","string","optional","routeFileIgnorePrefix","default","routesDirectory","generatedRouteTree","quoteStyle","enum","future","unstable_codeSplitting","boolean","configFilePathJson","path","resolve","process","cwd","getConfig","parse","JSON","readFileSync"],"mappings":";;;;;;;;;;;;;;;;MAIaA,YAAY,GAAGC,KAAC,CAACC,MAAM,CAAC;EACnCC,eAAe,EAAEF,KAAC,CAACG,MAAM,EAAE,CAACC,QAAQ,EAAE;AACtCC,EAAAA,qBAAqB,EAAEL,KAAC,CAACG,MAAM,EAAE,CAACC,QAAQ,EAAE,CAACE,OAAO,CAAC,GAAG,CAAC;AACzDC,EAAAA,eAAe,EAAEP,KAAC,CAACG,MAAM,EAAE;AAC3BK,EAAAA,kBAAkB,EAAER,KAAC,CAACG,MAAM,EAAE;AAC9BM,EAAAA,UAAU,EAAET,KAAC,CAACU,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAACN,QAAQ,EAAE,CAACE,OAAO,CAAC,QAAQ,CAAC;AACrEK,EAAAA,MAAM,EAAEX,KAAC,CACNC,MAAM,CAAC;IACNW,sBAAsB,EAAEZ,KAAC,CAACa,OAAO,EAAE,CAACT,QAAQ,EAAC;GAC9C,CAAC,CACDA,QAAQ,EAAC;AACd,CAAC,EAAC;AAIF,MAAMU,kBAAkB,GAAGC,IAAI,CAACC,OAAO,CAACC,OAAO,CAACC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAA;AAElE,eAAeC,SAASA,GAAoB;AACjD,EAAA,OAAOpB,YAAY,CAACqB,KAAK,CACvBC,IAAI,CAACD,KAAK,CAACE,eAAY,CAACR,kBAAkB,EAAE,OAAO,CAAC,CACtD,CAAC,CAAA;AACH;;;;;"}
@@ -32,6 +32,7 @@ function _interopNamespaceDefault(e) {
32
32
  return Object.freeze(n);
33
33
  }
34
34
 
35
+ var fs__namespace = /*#__PURE__*/_interopNamespaceDefault(fs);
35
36
  var prettier__namespace = /*#__PURE__*/_interopNamespaceDefault(prettier);
36
37
 
37
38
  let latestTask = 0;
@@ -45,7 +46,7 @@ async function getRouteNodes(config) {
45
46
  let routeNodes = [];
46
47
  async function recurse(dir) {
47
48
  const fullDir = path.resolve(config.routesDirectory, dir);
48
- let dirList = await fs.readdir(fullDir);
49
+ let dirList = await fs__namespace.readdir(fullDir);
49
50
  dirList = dirList.filter(d => {
50
51
  if (d.startsWith('.') || routeFileIgnorePrefix && d.startsWith(routeFileIgnorePrefix)) {
51
52
  return false;
@@ -58,7 +59,7 @@ async function getRouteNodes(config) {
58
59
  await Promise.all(dirList.map(async fileName => {
59
60
  const fullPath = path.join(fullDir, fileName);
60
61
  const relativePath = path.join(dir, fileName);
61
- const stat = await fs.stat(fullPath);
62
+ const stat = await fs__namespace.stat(fullPath);
62
63
  if (stat.isDirectory()) {
63
64
  await recurse(relativePath);
64
65
  } else {
@@ -112,7 +113,7 @@ async function generator(config) {
112
113
  const routePathIdPrefix = config.routeFilePrefix ?? '';
113
114
  let preRouteNodes = await getRouteNodes(config);
114
115
  const sortRouteNodes = nodes => {
115
- return multiSortBy(nodes, [d => d.routePath === '/' ? -1 : 1, d => d.routePath?.split('/').length, d => d.routePath?.endsWith('/') ? -1 : 1, d => d.routePath]).filter(d => d.routePath !== `/${routePathIdPrefix + rootPathId}`);
116
+ return multiSortBy(nodes, [d => d.routePath === '/' ? -1 : 1, d => d.routePath?.split('/').length, d => d.filePath?.match(/[./]index[.]/) ? 1 : -1, d => d.filePath?.match(/[./]route[.]/) ? -1 : 1, d => d.routePath?.endsWith('/') ? -1 : 1, d => d.routePath]).filter(d => d.routePath !== `/${routePathIdPrefix + rootPathId}`);
116
117
  };
117
118
  preRouteNodes = sortRouteNodes(preRouteNodes);
118
119
  const routeTree = [];
@@ -143,6 +144,18 @@ async function generator(config) {
143
144
  if (node.isLoader || node.isComponent) {
144
145
  routePiecesByPath[node.routePath] = routePiecesByPath[node.routePath] || {};
145
146
  routePiecesByPath[node.routePath][node.isLoader ? 'loader' : 'component'] = node;
147
+ const anchorRoute = routeNodes.find(d => d.routePath === node.routePath);
148
+ if (!anchorRoute) {
149
+ handleNode({
150
+ ...node,
151
+ isVirtual: true
152
+ });
153
+ }
154
+ // if (!node.parent) {
155
+ // }
156
+
157
+ // componentOrLoader.isVirtual = true
158
+ // handleNode(componentOrLoader)
146
159
  return;
147
160
  }
148
161
  }
@@ -155,22 +168,9 @@ async function generator(config) {
155
168
  routeNodes.push(node);
156
169
  };
157
170
  preRouteNodes.forEach(node => handleNode(node));
158
- if (config.future?.unstable_codeSplitting) {
159
- Object.keys(routePiecesByPath).forEach(routePath => {
160
- const found = routeNodes.find(d => d.routePath === routePath);
161
- if (!found) {
162
- const pieces = routePiecesByPath[routePath];
163
- const componentOrLoader = pieces.component || pieces.loader;
164
- if (componentOrLoader) {
165
- componentOrLoader.isVirtual = true;
166
- handleNode(componentOrLoader);
167
- }
168
- }
169
- });
170
- }
171
171
  async function buildRouteConfig(nodes, depth = 1) {
172
172
  const children = nodes.map(async node => {
173
- const routeCode = await fs.readFile(node.fullPath, 'utf-8');
173
+ const routeCode = await fs__namespace.readFile(node.fullPath, 'utf-8');
174
174
 
175
175
  // Ensure the boilerplate for the route exists
176
176
  if (node.isRoot) {
@@ -186,7 +186,7 @@ async function generator(config) {
186
186
  const quote = config.quoteStyle === 'single' ? `'` : `"`;
187
187
  const replaced = routeCode.replace(fileRouteRegex, `new FileRoute(${quote}${escapedRoutePath}${quote})`);
188
188
  if (replaced !== routeCode) {
189
- await fs.writeFile(node.fullPath, replaced);
189
+ await fs__namespace.writeFile(node.fullPath, replaced);
190
190
  }
191
191
  const route = `${node.variableName}Route`;
192
192
  if (node.children?.length) {
@@ -199,7 +199,12 @@ async function generator(config) {
199
199
  }
200
200
  const routeConfigChildrenText = await buildRouteConfig(routeTree);
201
201
  const sortedRouteNodes = multiSortBy(routeNodes, [d => d.routePath?.includes(`/${routePathIdPrefix + rootPathId}`) ? -1 : 1, d => d.routePath?.split('/').length, d => d.routePath?.endsWith("index'") ? -1 : 1, d => d]);
202
- const routeImports = [`import { FileRoute, lazyFn, lazyRouteComponent } from '@tanstack/react-router'`, '\n', `import { Route as rootRoute } from './${sanitize(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, routePathIdPrefix + rootPathId)))}'`, ...sortedRouteNodes.filter(d => !d.isVirtual).map(node => {
202
+ const imports = Object.entries({
203
+ FileRoute: sortedRouteNodes.some(d => d.isVirtual),
204
+ lazyFn: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.loader),
205
+ lazyRouteComponent: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.component)
206
+ }).filter(d => d[1]).map(d => d[0]);
207
+ const routeImports = [imports.length ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\n` : '', `import { Route as rootRoute } from './${sanitize(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, routePathIdPrefix + rootPathId)))}'`, ...sortedRouteNodes.filter(d => !d.isVirtual).map(node => {
203
208
  return `import { Route as ${node.variableName}Import } from './${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, node.filePath))))}'`;
204
209
  }), '\n', sortedRouteNodes.filter(d => d.isVirtual).map(node => {
205
210
  return `const ${node.variableName}Import = new FileRoute('${node.routePath}').createRoute()`;
@@ -209,23 +214,21 @@ async function generator(config) {
209
214
  return [`const ${node.variableName}Route = ${node.variableName}Import.update({
210
215
  ${[node.isNonPath ? `id: '${node.path}'` : `path: '${node.cleanedPath}'`, `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`].filter(Boolean).join(',')}
211
216
  } as any)`, loaderNode ? `.updateLoader({ loader: lazyFn(() => import('./${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, loaderNode.filePath))))}'), 'loader') })` : '', componentNode ? `.update({ component: lazyRouteComponent(() => import('./${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, componentNode.filePath))))}'), 'component') })` : ''].join('');
212
- }).join('\n\n')].join('\n');
213
- const routeTypes = `declare module '@tanstack/react-router' {
217
+ }).join('\n\n'), `declare module '@tanstack/react-router' {
214
218
  interface FileRoutesByPath {
215
219
  ${routeNodes.map(routeNode => {
216
220
  return `'${routeNode.routePath}': {
217
221
  preLoaderRoute: typeof ${routeNode.variableName}Import
218
- parentRoute: typeof ${routeNode.parent?.variableName ?? 'root'}Route
222
+ parentRoute: typeof ${routeNode.parent?.variableName ? `${routeNode.parent?.variableName}Import` : 'rootRoute'}
219
223
  }`;
220
224
  }).join('\n')}
221
225
  }
222
- }`;
223
- const routeConfig = `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`;
224
- const routeConfigFileContent = await prettier__namespace.format([routeImports, routeTypes, routeConfig].join('\n\n'), {
226
+ }`, `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`].join('\n');
227
+ const routeConfigFileContent = await prettier__namespace.format(routeImports, {
225
228
  semi: false,
226
229
  parser: 'typescript'
227
230
  });
228
- const routeTreeContent = await fs.readFile(path.resolve(config.generatedRouteTree), 'utf-8').catch(err => {
231
+ const routeTreeContent = await fs__namespace.readFile(path.resolve(config.generatedRouteTree), 'utf-8').catch(err => {
229
232
  if (err.code === 'ENOENT') {
230
233
  return undefined;
231
234
  }
@@ -233,9 +236,9 @@ async function generator(config) {
233
236
  });
234
237
  if (!checkLatest()) return;
235
238
  if (routeTreeContent !== routeConfigFileContent) {
236
- await fs.ensureDir(path.dirname(path.resolve(config.generatedRouteTree)));
239
+ await fs__namespace.ensureDir(path.dirname(path.resolve(config.generatedRouteTree)));
237
240
  if (!checkLatest()) return;
238
- await fs.writeFile(path.resolve(config.generatedRouteTree), routeConfigFileContent);
241
+ await fs__namespace.writeFile(path.resolve(config.generatedRouteTree), routeConfigFileContent);
239
242
  }
240
243
  console.log(`🌲 Processed ${routeNodes.length} routes in ${Date.now() - start}ms`);
241
244
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sources":["../../src/generator.ts"],"sourcesContent":["import path from 'path'\nimport fs from 'fs-extra'\nimport * as prettier from 'prettier'\nimport { Config } from './config'\nimport { cleanPath, trimPathLeft } from '@tanstack/react-router'\n\nlet latestTask = 0\nexport const rootPathId = '__root'\nexport const fileRouteRegex = /new\\s+FileRoute\\(([^)]*)\\)/g\n\nexport type RouteNode = {\n filePath: string\n fullPath: string\n variableName: string\n routePath?: string\n cleanedPath?: string\n path?: string\n isNonPath?: boolean\n isNonLayout?: boolean\n isRoute?: boolean\n isLoader?: boolean\n isComponent?: boolean\n isVirtual?: boolean\n isRoot?: boolean\n children?: RouteNode[]\n parent?: RouteNode\n}\n\nasync function getRouteNodes(config: Config) {\n const { routeFilePrefix, routeFileIgnorePrefix } = config\n\n let routeNodes: RouteNode[] = []\n\n async function recurse(dir: string) {\n const fullDir = path.resolve(config.routesDirectory, dir)\n let dirList = await fs.readdir(fullDir)\n\n dirList = dirList.filter((d) => {\n if (\n d.startsWith('.') ||\n (routeFileIgnorePrefix && d.startsWith(routeFileIgnorePrefix))\n ) {\n return false\n }\n\n if (routeFilePrefix) {\n return d.startsWith(routeFilePrefix)\n }\n\n return true\n })\n\n await Promise.all(\n dirList.map(async (fileName) => {\n const fullPath = path.join(fullDir, fileName)\n const relativePath = path.join(dir, fileName)\n const stat = await fs.stat(fullPath)\n\n if (stat.isDirectory()) {\n await recurse(relativePath)\n } else {\n const filePath = path.join(dir, fileName)\n const filePathNoExt = removeExt(filePath)\n let routePath =\n replaceBackslash(\n cleanPath(`/${filePathNoExt.split('.').join('/')}`),\n ) ?? ''\n const variableName = fileToVariable(routePath)\n\n // Remove the index from the route path and\n // if the route path is empty, use `/'\n if (routePath === 'index') {\n routePath = '/'\n } else if (routePath.endsWith('/index')) {\n routePath = routePath.replace(/\\/index$/, '/')\n }\n\n routeNodes.push({\n filePath,\n fullPath,\n routePath,\n variableName,\n })\n }\n }),\n )\n\n return routeNodes\n }\n\n await recurse('./')\n\n return routeNodes\n}\n\nlet first = false\nlet skipMessage = false\n\ntype RouteSubNode = {\n component?: RouteNode\n loader?: RouteNode\n}\n\nexport async function generator(config: Config) {\n console.log()\n\n if (!first) {\n console.log('🔄 Generating routes...')\n first = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n console.log('♻️ Regenerating routes...')\n }\n\n const taskId = latestTask + 1\n latestTask = taskId\n\n const checkLatest = () => {\n if (latestTask !== taskId) {\n skipMessage = true\n return false\n }\n\n return true\n }\n\n const start = Date.now()\n const routePathIdPrefix = config.routeFilePrefix ?? ''\n\n let preRouteNodes = await getRouteNodes(config)\n\n const sortRouteNodes = (nodes: RouteNode[]): RouteNode[] => {\n return multiSortBy(nodes, [\n (d) => (d.routePath === '/' ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.routePath?.endsWith('/') ? -1 : 1),\n (d) => d.routePath,\n ]).filter((d) => d.routePath !== `/${routePathIdPrefix + rootPathId}`)\n }\n\n preRouteNodes = sortRouteNodes(preRouteNodes)\n\n const routeTree: RouteNode[] = []\n const routePiecesByPath: Record<string, RouteSubNode> = {}\n\n // Loop over the flat list of routeNodes and\n // build up a tree based on the routeNodes' routePath\n let routeNodes: RouteNode[] = []\n\n const handleNode = (node: RouteNode) => {\n if (config.future?.unstable_codeSplitting) {\n node.isRoute = node.routePath?.endsWith('/route')\n node.isComponent = node.routePath?.endsWith('/component')\n node.isLoader = node.routePath?.endsWith('/loader')\n\n if (node.isComponent || node.isLoader || node.isRoute) {\n node.routePath = node.routePath?.replace(\n /\\/(component|loader|route)$/,\n '',\n )\n }\n }\n\n const parentRoute = hasParentRoute(routeNodes, node.routePath)\n if (parentRoute) node.parent = parentRoute\n\n node.path = node.parent\n ? node.routePath?.replace(node.parent.routePath!, '') || '/'\n : node.routePath\n\n const trimmedPath = trimPathLeft(node.path ?? '')\n\n const split = trimmedPath?.split('/') ?? []\n let first = split[0] ?? trimmedPath ?? ''\n\n node.isNonPath = first.startsWith('_')\n node.isNonLayout = first.endsWith('_')\n\n node.cleanedPath = removeUnderscores(node.path) ?? ''\n\n if (config.future?.unstable_codeSplitting) {\n if (node.isLoader || node.isComponent) {\n routePiecesByPath[node.routePath!] =\n routePiecesByPath[node.routePath!] || {}\n\n routePiecesByPath[node.routePath!]![\n node.isLoader ? 'loader' : 'component'\n ] = node\n\n return\n }\n }\n\n if (node.parent) {\n node.parent.children = node.parent.children ?? []\n node.parent.children.push(node)\n } else {\n routeTree.push(node)\n }\n\n routeNodes.push(node)\n }\n\n preRouteNodes.forEach((node) => handleNode(node))\n\n if (config.future?.unstable_codeSplitting) {\n Object.keys(routePiecesByPath).forEach((routePath) => {\n const found = routeNodes.find((d) => d.routePath === routePath)\n\n if (!found) {\n const pieces = routePiecesByPath[routePath]!\n const componentOrLoader = pieces.component || pieces.loader\n if (componentOrLoader) {\n componentOrLoader.isVirtual = true\n handleNode(componentOrLoader)\n }\n }\n })\n }\n\n async function buildRouteConfig(\n nodes: RouteNode[],\n depth = 1,\n ): Promise<string> {\n const children = nodes.map(async (node) => {\n const routeCode = await fs.readFile(node.fullPath, 'utf-8')\n\n // Ensure the boilerplate for the route exists\n if (node.isRoot) {\n return\n }\n\n // Ensure that new FileRoute(anything?) is replaced with FileRoute(${node.routePath})\n // routePath can contain $ characters, which have special meaning when used in replace\n // so we have to escape it by turning all $ into $$. But since we do it through a replace call\n // we have to double escape it into $$$$. For more information, see\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement\n const escapedRoutePath = node.routePath?.replaceAll('$', '$$$$') ?? ''\n const quote = config.quoteStyle === 'single' ? `'` : `\"`\n const replaced = routeCode.replace(\n fileRouteRegex,\n `new FileRoute(${quote}${escapedRoutePath}${quote})`,\n )\n\n if (replaced !== routeCode) {\n await fs.writeFile(node.fullPath, replaced)\n }\n\n const route = `${node.variableName}Route`\n\n if (node.children?.length) {\n const childConfigs = await buildRouteConfig(node.children, depth + 1)\n return `${route}.addChildren([${spaces(depth * 4)}${childConfigs}])`\n }\n\n return route\n })\n\n return (await Promise.all(children)).filter(Boolean).join(`,`)\n }\n\n const routeConfigChildrenText = await buildRouteConfig(routeTree)\n\n const sortedRouteNodes = multiSortBy(routeNodes, [\n (d) =>\n d.routePath?.includes(`/${routePathIdPrefix + rootPathId}`) ? -1 : 1,\n (d) => d.routePath?.split('/').length,\n (d) => (d.routePath?.endsWith(\"index'\") ? -1 : 1),\n (d) => d,\n ])\n\n const routeImports = [\n `import { FileRoute, lazyFn, lazyRouteComponent } from '@tanstack/react-router'`,\n '\\n',\n `import { Route as rootRoute } from './${sanitize(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, routePathIdPrefix + rootPathId),\n ),\n )}'`,\n ...sortedRouteNodes\n .filter((d) => !d.isVirtual)\n .map((node) => {\n return `import { Route as ${\n node.variableName\n }Import } from './${sanitize(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n ),\n )}'`\n }),\n '\\n',\n sortedRouteNodes\n .filter((d) => d.isVirtual)\n .map((node) => {\n return `const ${node.variableName}Import = new FileRoute('${node.routePath}').createRoute()`\n })\n .join('\\n'),\n '\\n',\n sortedRouteNodes\n .map((node) => {\n const loaderNode = routePiecesByPath[node.routePath!]?.loader\n const componentNode = routePiecesByPath[node.routePath!]?.component\n\n return [\n `const ${node.variableName}Route = ${node.variableName}Import.update({\n ${[\n node.isNonPath\n ? `id: '${node.path}'`\n : `path: '${node.cleanedPath}'`,\n `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`,\n ]\n .filter(Boolean)\n .join(',')}\n } as any)`,\n loaderNode\n ? `.updateLoader({ loader: lazyFn(() => import('./${sanitize(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, loaderNode.filePath),\n ),\n ),\n )}'), 'loader') })`\n : '',\n componentNode\n ? `.update({ component: lazyRouteComponent(() => import('./${sanitize(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(\n config.routesDirectory,\n componentNode.filePath,\n ),\n ),\n ),\n )}'), 'component') })`\n : '',\n ].join('')\n })\n .join('\\n\\n'),\n ].join('\\n')\n\n const routeTypes = `declare module '@tanstack/react-router' {\n interface FileRoutesByPath {\n ${routeNodes\n .map((routeNode) => {\n return `'${routeNode.routePath}': {\n preLoaderRoute: typeof ${routeNode.variableName}Import\n parentRoute: typeof ${routeNode.parent?.variableName ?? 'root'}Route\n }`\n })\n .join('\\n')}\n }\n}`\n\n const routeConfig = `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`\n\n const routeConfigFileContent = await prettier.format(\n [routeImports, routeTypes, routeConfig].join('\\n\\n'),\n {\n semi: false,\n parser: 'typescript',\n },\n )\n\n const routeTreeContent = await fs\n .readFile(path.resolve(config.generatedRouteTree), 'utf-8')\n .catch((err: any) => {\n if (err.code === 'ENOENT') {\n return undefined\n }\n throw err\n })\n\n if (!checkLatest()) return\n\n if (routeTreeContent !== routeConfigFileContent) {\n await fs.ensureDir(path.dirname(path.resolve(config.generatedRouteTree)))\n if (!checkLatest()) return\n await fs.writeFile(\n path.resolve(config.generatedRouteTree),\n routeConfigFileContent,\n )\n }\n\n console.log(\n `🌲 Processed ${routeNodes.length} routes in ${Date.now() - start}ms`,\n )\n}\n\nfunction fileToVariable(d: string): string {\n return (\n removeUnderscores(d)\n ?.replace(/\\$/g, '')\n ?.split(/[/-]/g)\n .map((d, i) => (i > 0 ? capitalize(d) : d))\n .join('')\n .replace(/([^a-zA-Z0-9]|[\\.])/gm, '') ?? ''\n )\n}\n\nexport function removeExt(d: string) {\n return d.substring(0, d.lastIndexOf('.')) || d\n}\n\nfunction spaces(d: number): string {\n return Array.from({ length: d })\n .map(() => ' ')\n .join('')\n}\n\nexport function multiSortBy<T>(\n arr: T[],\n accessors: ((item: T) => any)[] = [(d) => d],\n): T[] {\n return arr\n .map((d, i) => [d, i] as const)\n .sort(([a, ai], [b, bi]) => {\n for (const accessor of accessors) {\n const ao = accessor(a)\n const bo = accessor(b)\n\n if (typeof ao === 'undefined') {\n if (typeof bo === 'undefined') {\n continue\n }\n return 1\n }\n\n if (ao === bo) {\n continue\n }\n\n return ao > bo ? 1 : -1\n }\n\n return ai - bi\n })\n .map(([d]) => d)\n}\n\nfunction capitalize(s: string) {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nfunction sanitize(s?: string) {\n return replaceBackslash(s?.replace(/\\\\index/gi, ''))\n}\n\nfunction removeUnderscores(s?: string) {\n return s?.replace(/(^_|_$)/, '').replace(/(\\/_|_\\/)/, '/')\n}\n\nfunction replaceBackslash(s?: string) {\n return s?.replace(/\\\\/gi, '/')\n}\n\nexport function hasParentRoute(\n routes: RouteNode[],\n routePathToCheck: string | undefined,\n): RouteNode | null {\n if (!routePathToCheck || routePathToCheck === '/') {\n return null\n }\n\n const sortedNodes = multiSortBy(routes, [\n (d) => d.routePath!.length * -1,\n (d) => d.variableName,\n ]).filter((d) => d.routePath !== `/${rootPathId}`)\n\n for (const route of sortedNodes) {\n if (route.routePath === '/') continue\n\n if (\n routePathToCheck.startsWith(`${route.routePath}/`) &&\n route.routePath !== routePathToCheck\n ) {\n return route\n }\n }\n const segments = routePathToCheck.split('/')\n segments.pop() // Remove the last segment\n const parentRoutePath = segments.join('/')\n\n return hasParentRoute(routes, parentRoutePath)\n}\n"],"names":["latestTask","rootPathId","fileRouteRegex","getRouteNodes","config","routeFilePrefix","routeFileIgnorePrefix","routeNodes","recurse","dir","fullDir","path","resolve","routesDirectory","dirList","fs","readdir","filter","d","startsWith","Promise","all","map","fileName","fullPath","join","relativePath","stat","isDirectory","filePath","filePathNoExt","removeExt","routePath","replaceBackslash","cleanPath","split","variableName","fileToVariable","endsWith","replace","push","first","skipMessage","generator","console","log","taskId","checkLatest","start","Date","now","routePathIdPrefix","preRouteNodes","sortRouteNodes","nodes","multiSortBy","length","routeTree","routePiecesByPath","handleNode","node","future","unstable_codeSplitting","isRoute","isComponent","isLoader","parentRoute","hasParentRoute","parent","trimmedPath","trimPathLeft","isNonPath","isNonLayout","cleanedPath","removeUnderscores","children","forEach","Object","keys","found","find","pieces","componentOrLoader","component","loader","isVirtual","buildRouteConfig","depth","routeCode","readFile","isRoot","escapedRoutePath","replaceAll","quote","quoteStyle","replaced","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","sortedRouteNodes","includes","routeImports","sanitize","relative","dirname","generatedRouteTree","loaderNode","componentNode","routeTypes","routeNode","routeConfig","routeConfigFileContent","prettier","format","semi","parser","routeTreeContent","catch","err","code","undefined","ensureDir","i","capitalize","substring","lastIndexOf","Array","from","arr","accessors","sort","a","ai","b","bi","accessor","ao","bo","s","charAt","toUpperCase","slice","routes","routePathToCheck","sortedNodes","segments","pop","parentRoutePath"],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sources":["../../src/generator.ts"],"sourcesContent":["import path from 'path'\nimport * as fs from 'fs-extra'\nimport * as prettier from 'prettier'\nimport { Config } from './config'\nimport { cleanPath, trimPathLeft } from '@tanstack/react-router'\n\nlet latestTask = 0\nexport const rootPathId = '__root'\nexport const fileRouteRegex = /new\\s+FileRoute\\(([^)]*)\\)/g\n\nexport type RouteNode = {\n filePath: string\n fullPath: string\n variableName: string\n routePath?: string\n cleanedPath?: string\n path?: string\n isNonPath?: boolean\n isNonLayout?: boolean\n isRoute?: boolean\n isLoader?: boolean\n isComponent?: boolean\n isVirtual?: boolean\n isRoot?: boolean\n children?: RouteNode[]\n parent?: RouteNode\n}\n\nasync function getRouteNodes(config: Config) {\n const { routeFilePrefix, routeFileIgnorePrefix } = config\n\n let routeNodes: RouteNode[] = []\n\n async function recurse(dir: string) {\n const fullDir = path.resolve(config.routesDirectory, dir)\n let dirList = await fs.readdir(fullDir)\n\n dirList = dirList.filter((d) => {\n if (\n d.startsWith('.') ||\n (routeFileIgnorePrefix && d.startsWith(routeFileIgnorePrefix))\n ) {\n return false\n }\n\n if (routeFilePrefix) {\n return d.startsWith(routeFilePrefix)\n }\n\n return true\n })\n\n await Promise.all(\n dirList.map(async (fileName) => {\n const fullPath = path.join(fullDir, fileName)\n const relativePath = path.join(dir, fileName)\n const stat = await fs.stat(fullPath)\n\n if (stat.isDirectory()) {\n await recurse(relativePath)\n } else {\n const filePath = path.join(dir, fileName)\n const filePathNoExt = removeExt(filePath)\n let routePath =\n replaceBackslash(\n cleanPath(`/${filePathNoExt.split('.').join('/')}`),\n ) ?? ''\n const variableName = fileToVariable(routePath)\n\n // Remove the index from the route path and\n // if the route path is empty, use `/'\n if (routePath === 'index') {\n routePath = '/'\n } else if (routePath.endsWith('/index')) {\n routePath = routePath.replace(/\\/index$/, '/')\n }\n\n routeNodes.push({\n filePath,\n fullPath,\n routePath,\n variableName,\n })\n }\n }),\n )\n\n return routeNodes\n }\n\n await recurse('./')\n\n return routeNodes\n}\n\nlet first = false\nlet skipMessage = false\n\ntype RouteSubNode = {\n component?: RouteNode\n loader?: RouteNode\n}\n\nexport async function generator(config: Config) {\n console.log()\n\n if (!first) {\n console.log('🔄 Generating routes...')\n first = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n console.log('♻️ Regenerating routes...')\n }\n\n const taskId = latestTask + 1\n latestTask = taskId\n\n const checkLatest = () => {\n if (latestTask !== taskId) {\n skipMessage = true\n return false\n }\n\n return true\n }\n\n const start = Date.now()\n const routePathIdPrefix = config.routeFilePrefix ?? ''\n\n let preRouteNodes = await getRouteNodes(config)\n\n const sortRouteNodes = (nodes: RouteNode[]): RouteNode[] => {\n return multiSortBy(nodes, [\n (d) => (d.routePath === '/' ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.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 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.ensureDir(path.dirname(path.resolve(config.generatedRouteTree)))\n if (!checkLatest()) return\n await fs.writeFile(\n path.resolve(config.generatedRouteTree),\n routeConfigFileContent,\n )\n }\n\n console.log(\n `🌲 Processed ${routeNodes.length} routes in ${Date.now() - start}ms`,\n )\n}\n\nfunction fileToVariable(d: string): string {\n return (\n removeUnderscores(d)\n ?.replace(/\\$/g, '')\n ?.split(/[/-]/g)\n .map((d, i) => (i > 0 ? capitalize(d) : d))\n .join('')\n .replace(/([^a-zA-Z0-9]|[\\.])/gm, '') ?? ''\n )\n}\n\nexport function removeExt(d: string) {\n return d.substring(0, d.lastIndexOf('.')) || d\n}\n\nfunction spaces(d: number): string {\n return Array.from({ length: d })\n .map(() => ' ')\n .join('')\n}\n\nexport function multiSortBy<T>(\n arr: T[],\n accessors: ((item: T) => any)[] = [(d) => d],\n): T[] {\n return arr\n .map((d, i) => [d, i] as const)\n .sort(([a, ai], [b, bi]) => {\n for (const accessor of accessors) {\n const ao = accessor(a)\n const bo = accessor(b)\n\n if (typeof ao === 'undefined') {\n if (typeof bo === 'undefined') {\n continue\n }\n return 1\n }\n\n if (ao === bo) {\n continue\n }\n\n return ao > bo ? 1 : -1\n }\n\n return ai - bi\n })\n .map(([d]) => d)\n}\n\nfunction capitalize(s: string) {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nfunction sanitize(s?: string) {\n return replaceBackslash(s?.replace(/\\\\index/gi, ''))\n}\n\nfunction removeUnderscores(s?: string) {\n return s?.replace(/(^_|_$)/, '').replace(/(\\/_|_\\/)/, '/')\n}\n\nfunction replaceBackslash(s?: string) {\n return s?.replace(/\\\\/gi, '/')\n}\n\nexport function hasParentRoute(\n routes: RouteNode[],\n routePathToCheck: string | undefined,\n): RouteNode | null {\n if (!routePathToCheck || routePathToCheck === '/') {\n return null\n }\n\n const sortedNodes = multiSortBy(routes, [\n (d) => d.routePath!.length * -1,\n (d) => d.variableName,\n ]).filter((d) => d.routePath !== `/${rootPathId}`)\n\n for (const route of sortedNodes) {\n if (route.routePath === '/') continue\n\n if (\n routePathToCheck.startsWith(`${route.routePath}/`) &&\n route.routePath !== routePathToCheck\n ) {\n return route\n }\n }\n const segments = routePathToCheck.split('/')\n segments.pop() // Remove the last segment\n const parentRoutePath = segments.join('/')\n\n return hasParentRoute(routes, parentRoutePath)\n}\n"],"names":["latestTask","rootPathId","fileRouteRegex","getRouteNodes","config","routeFilePrefix","routeFileIgnorePrefix","routeNodes","recurse","dir","fullDir","path","resolve","routesDirectory","dirList","fs","readdir","filter","d","startsWith","Promise","all","map","fileName","fullPath","join","relativePath","stat","isDirectory","filePath","filePathNoExt","removeExt","routePath","replaceBackslash","cleanPath","split","variableName","fileToVariable","endsWith","replace","push","first","skipMessage","generator","console","log","taskId","checkLatest","start","Date","now","routePathIdPrefix","preRouteNodes","sortRouteNodes","nodes","multiSortBy","length","match","routeTree","routePiecesByPath","handleNode","node","future","unstable_codeSplitting","isRoute","isComponent","isLoader","parentRoute","hasParentRoute","parent","trimmedPath","trimPathLeft","isNonPath","isNonLayout","cleanedPath","removeUnderscores","anchorRoute","find","isVirtual","children","forEach","buildRouteConfig","depth","routeCode","readFile","isRoot","escapedRoutePath","replaceAll","quote","quoteStyle","replaced","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","sortedRouteNodes","includes","imports","Object","entries","FileRoute","some","lazyFn","loader","lazyRouteComponent","component","routeImports","sanitize","relative","dirname","generatedRouteTree","loaderNode","componentNode","routeNode","routeConfigFileContent","prettier","format","semi","parser","routeTreeContent","catch","err","code","undefined","ensureDir","i","capitalize","substring","lastIndexOf","Array","from","arr","accessors","sort","a","ai","b","bi","accessor","ao","bo","s","charAt","toUpperCase","slice","routes","routePathToCheck","sortedNodes","segments","pop","parentRoutePath"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
- declare const configSchema: z.ZodObject<{
2
+ export declare const configSchema: z.ZodObject<{
3
3
  routeFilePrefix: z.ZodOptional<z.ZodString>;
4
- routeFileIgnorePrefix: z.ZodOptional<z.ZodString>;
4
+ routeFileIgnorePrefix: z.ZodDefault<z.ZodOptional<z.ZodString>>;
5
5
  routesDirectory: z.ZodString;
6
6
  generatedRouteTree: z.ZodString;
7
7
  quoteStyle: z.ZodDefault<z.ZodOptional<z.ZodEnum<["single", "double"]>>>;
@@ -13,11 +13,11 @@ declare const configSchema: z.ZodObject<{
13
13
  unstable_codeSplitting?: boolean | undefined;
14
14
  }>>;
15
15
  }, "strip", z.ZodTypeAny, {
16
+ routeFileIgnorePrefix: string;
16
17
  routesDirectory: string;
17
18
  generatedRouteTree: string;
18
19
  quoteStyle: "single" | "double";
19
20
  routeFilePrefix?: string | undefined;
20
- routeFileIgnorePrefix?: string | undefined;
21
21
  future?: {
22
22
  unstable_codeSplitting?: boolean | undefined;
23
23
  } | undefined;
@@ -33,4 +33,3 @@ declare const configSchema: z.ZodObject<{
33
33
  }>;
34
34
  export type Config = z.infer<typeof configSchema>;
35
35
  export declare function getConfig(): Promise<Config>;
36
- export {};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tanstack/router-cli",
3
3
  "author": "Tanner Linsley",
4
- "version": "1.1.11",
4
+ "version": "1.2.0",
5
5
  "license": "MIT",
6
6
  "repository": "tanstack/router",
7
7
  "homepage": "https://tanstack.com/router",
@@ -59,7 +59,7 @@
59
59
  "through2": "^4.0.2",
60
60
  "yargs": "^17.6.2",
61
61
  "zod": "^3.19.1",
62
- "@tanstack/react-router": "1.1.11"
62
+ "@tanstack/react-router": "1.2.0"
63
63
  },
64
64
  "scripts": {
65
65
  "build": "rollup --config rollup.config.js"
package/src/config.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import path from 'path'
2
- import fs from 'fs-extra'
2
+ import { readFileSync } from 'fs'
3
3
  import { z } from 'zod'
4
4
 
5
- const configSchema = z.object({
5
+ export const configSchema = z.object({
6
6
  routeFilePrefix: z.string().optional(),
7
- routeFileIgnorePrefix: z.string().optional(),
7
+ routeFileIgnorePrefix: z.string().optional().default('-'),
8
8
  routesDirectory: z.string(),
9
9
  generatedRouteTree: z.string(),
10
10
  quoteStyle: z.enum(['single', 'double']).optional().default('single'),
@@ -20,7 +20,7 @@ export type Config = z.infer<typeof configSchema>
20
20
  const configFilePathJson = path.resolve(process.cwd(), 'tsr.config.json')
21
21
 
22
22
  export async function getConfig(): Promise<Config> {
23
- const config = (await fs.readJson(configFilePathJson)) as unknown as Config
24
-
25
- return { routeFileIgnorePrefix: '-', ...configSchema.parse(config) }
23
+ return configSchema.parse(
24
+ JSON.parse(readFileSync(configFilePathJson, 'utf-8')),
25
+ )
26
26
  }
package/src/generator.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import path from 'path'
2
- import fs from 'fs-extra'
2
+ import * as fs from 'fs-extra'
3
3
  import * as prettier from 'prettier'
4
4
  import { Config } from './config'
5
5
  import { cleanPath, trimPathLeft } from '@tanstack/react-router'
@@ -134,6 +134,8 @@ export async function generator(config: Config) {
134
134
  return multiSortBy(nodes, [
135
135
  (d) => (d.routePath === '/' ? -1 : 1),
136
136
  (d) => d.routePath?.split('/').length,
137
+ (d) => (d.filePath?.match(/[./]index[.]/) ? 1 : -1),
138
+ (d) => (d.filePath?.match(/[./]route[.]/) ? -1 : 1),
137
139
  (d) => (d.routePath?.endsWith('/') ? -1 : 1),
138
140
  (d) => d.routePath,
139
141
  ]).filter((d) => d.routePath !== `/${routePathIdPrefix + rootPathId}`)
@@ -188,6 +190,20 @@ export async function generator(config: Config) {
188
190
  node.isLoader ? 'loader' : 'component'
189
191
  ] = node
190
192
 
193
+ const anchorRoute = routeNodes.find(
194
+ (d) => d.routePath === node.routePath,
195
+ )
196
+ if (!anchorRoute) {
197
+ handleNode({
198
+ ...node,
199
+ isVirtual: true,
200
+ })
201
+ }
202
+ // if (!node.parent) {
203
+ // }
204
+
205
+ // componentOrLoader.isVirtual = true
206
+ // handleNode(componentOrLoader)
191
207
  return
192
208
  }
193
209
  }
@@ -204,21 +220,6 @@ export async function generator(config: Config) {
204
220
 
205
221
  preRouteNodes.forEach((node) => handleNode(node))
206
222
 
207
- if (config.future?.unstable_codeSplitting) {
208
- Object.keys(routePiecesByPath).forEach((routePath) => {
209
- const found = routeNodes.find((d) => d.routePath === routePath)
210
-
211
- if (!found) {
212
- const pieces = routePiecesByPath[routePath]!
213
- const componentOrLoader = pieces.component || pieces.loader
214
- if (componentOrLoader) {
215
- componentOrLoader.isVirtual = true
216
- handleNode(componentOrLoader)
217
- }
218
- }
219
- })
220
- }
221
-
222
223
  async function buildRouteConfig(
223
224
  nodes: RouteNode[],
224
225
  depth = 1,
@@ -270,9 +271,22 @@ export async function generator(config: Config) {
270
271
  (d) => d,
271
272
  ])
272
273
 
274
+ const imports = Object.entries({
275
+ FileRoute: sortedRouteNodes.some((d) => d.isVirtual),
276
+ lazyFn: sortedRouteNodes.some(
277
+ (node) => routePiecesByPath[node.routePath!]?.loader,
278
+ ),
279
+ lazyRouteComponent: sortedRouteNodes.some(
280
+ (node) => routePiecesByPath[node.routePath!]?.component,
281
+ ),
282
+ })
283
+ .filter((d) => d[1])
284
+ .map((d) => d[0])
285
+
273
286
  const routeImports = [
274
- `import { FileRoute, lazyFn, lazyRouteComponent } from '@tanstack/react-router'`,
275
- '\n',
287
+ imports.length
288
+ ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\n`
289
+ : '',
276
290
  `import { Route as rootRoute } from './${sanitize(
277
291
  path.relative(
278
292
  path.dirname(config.generatedRouteTree),
@@ -343,30 +357,29 @@ export async function generator(config: Config) {
343
357
  ].join('')
344
358
  })
345
359
  .join('\n\n'),
346
- ].join('\n')
347
-
348
- const routeTypes = `declare module '@tanstack/react-router' {
360
+ `declare module '@tanstack/react-router' {
349
361
  interface FileRoutesByPath {
350
362
  ${routeNodes
351
363
  .map((routeNode) => {
352
364
  return `'${routeNode.routePath}': {
353
365
  preLoaderRoute: typeof ${routeNode.variableName}Import
354
- parentRoute: typeof ${routeNode.parent?.variableName ?? 'root'}Route
366
+ parentRoute: typeof ${
367
+ routeNode.parent?.variableName
368
+ ? `${routeNode.parent?.variableName}Import`
369
+ : 'rootRoute'
370
+ }
355
371
  }`
356
372
  })
357
373
  .join('\n')}
358
374
  }
359
- }`
360
-
361
- const routeConfig = `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`
375
+ }`,
376
+ `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`,
377
+ ].join('\n')
362
378
 
363
- const routeConfigFileContent = await prettier.format(
364
- [routeImports, routeTypes, routeConfig].join('\n\n'),
365
- {
366
- semi: false,
367
- parser: 'typescript',
368
- },
369
- )
379
+ const routeConfigFileContent = await prettier.format(routeImports, {
380
+ semi: false,
381
+ parser: 'typescript',
382
+ })
370
383
 
371
384
  const routeTreeContent = await fs
372
385
  .readFile(path.resolve(config.generatedRouteTree), 'utf-8')