@tanstack/router-cli 0.0.1-beta.174 → 0.0.1-beta.176

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.
@@ -54,7 +54,7 @@ async function getRouteNodes(config) {
54
54
  const fullDir = path__default["default"].resolve(config.routesDirectory, dir);
55
55
  let dirList = await fs__default["default"].readdir(fullDir);
56
56
  dirList = dirList.filter(d => {
57
- if (d.startsWith('.') || d.startsWith(routeFileIgnorePrefix)) {
57
+ if (d.startsWith('.') || routeFileIgnorePrefix && d.startsWith(routeFileIgnorePrefix)) {
58
58
  return false;
59
59
  }
60
60
  if (routeFilePrefix) {
@@ -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/router-core'\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 isRoot?: boolean\n children?: RouteNode[]\n parent?: RouteNode\n layoutLimit?: string\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 (d.startsWith('.') || d.startsWith(routeFileIgnorePrefix)) {\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 = cleanPath(`/${filePathNoExt.split('.').join('/')}`)\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.endsWith('/index')) {\n routePath = routePath.replace(/\\/index$/, '/')\n } else if (routePath === 'index') {\n routePath = '/'\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\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\n let routeNodes = await getRouteNodes(config)\n\n routeNodes = multiSortBy(routeNodes, [\n (d) => (d.routePath === '/' ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.routePath?.endsWith('/') ? -1 : 1),\n (d) => d.routePath,\n ]).filter((d) => d.routePath !== `/${rootPathId}`)\n\n const routeTree: RouteNode[] = []\n\n // Loop over the flat list of routeNodes and\n // build up a tree based on the routeNodes' routePath\n routeNodes.forEach((node) => {\n routeNodes.forEach((existingNode) => {\n if (\n node.routePath?.startsWith(`${existingNode?.routePath ?? ''}/`)\n // node.routePath.length > existingNode.routePath!.length\n ) {\n node.parent = existingNode\n }\n })\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 (node.parent) {\n node.parent.children = node.parent.children ?? []\n node.parent.children.push(node)\n } else {\n routeTree.push(node)\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 replace with FileRoute(${node.routePath})\n const replaced = routeCode.replace(\n fileRouteRegex,\n `new FileRoute('${node.routePath}')`,\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 routeImports = [\n `import { route as rootRoute } from './${path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, rootPathId),\n )}'`,\n ...multiSortBy(routeNodes, [\n (d) => (d.routePath?.includes(`/${rootPathId}`) ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.routePath?.endsWith(\"index'\") ? -1 : 1),\n (d) => d,\n ]).map((node) => {\n return `import { route as ${node.variableName}Route } from './${removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\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 parentRoute: typeof ${routeNode.parent?.variableName ?? 'root'}Route\n }`\n })\n .join('\\n')} \n }\n}`\n\n const routeOptions = routeNodes\n .map((routeNode) => {\n return `Object.assign(${routeNode.variableName ?? 'root'}Route.options, {\n ${[\n routeNode.isNonPath\n ? `id: '${routeNode.cleanedPath}'`\n : `path: '${routeNode.cleanedPath}'`,\n `getParentRoute: () => ${\n routeNode.parent?.variableName ?? 'root'\n }Route`,\n routeNode.layoutLimit\n ? `layoutLimit: '${routeNode.layoutLimit}'`\n : '',\n // `\\n// ${JSON.stringify(\n // {\n // ...routeNode,\n // parent: undefined,\n // children: undefined,\n // fullPath: undefined,\n // variableName: undefined,\n // },\n // null,\n // 2,\n // )\n // .split('\\n')\n // .join('\\n// ')}`,\n ]\n .filter(Boolean)\n .join(',')}\n })`\n })\n .join('\\n\\n')\n\n const routeConfig = `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`\n\n const routeConfigFileContent = await prettier.format(\n [routeImports, routeTypes, routeOptions, 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 removeUnderscores(s?: string) {\n return s?.replace(/(^_|_$)/, '').replace(/(\\/_|_\\/)/, '/')\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","cleanPath","split","variableName","fileToVariable","endsWith","replace","push","first","skipMessage","generator","console","log","taskId","checkLatest","start","Date","now","multiSortBy","length","routeTree","forEach","node","existingNode","parent","trimmedPath","trimPathLeft","isNonPath","isNonLayout","cleanedPath","removeUnderscores","children","buildRouteConfig","nodes","depth","routeCode","readFile","isRoot","replaced","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","routeImports","relative","dirname","generatedRouteTree","includes","routeTypes","routeNode","routeOptions","layoutLimit","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"],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sources":["../../src/generator.ts"],"sourcesContent":["import path from 'path'\nimport fs from 'fs-extra'\nimport * as prettier from 'prettier'\nimport { Config } from './config'\nimport { cleanPath, trimPathLeft } from '@tanstack/router-core'\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 isRoot?: boolean\n children?: RouteNode[]\n parent?: RouteNode\n layoutLimit?: string\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 = cleanPath(`/${filePathNoExt.split('.').join('/')}`)\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.endsWith('/index')) {\n routePath = routePath.replace(/\\/index$/, '/')\n } else if (routePath === 'index') {\n routePath = '/'\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\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\n let routeNodes = await getRouteNodes(config)\n\n routeNodes = multiSortBy(routeNodes, [\n (d) => (d.routePath === '/' ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.routePath?.endsWith('/') ? -1 : 1),\n (d) => d.routePath,\n ]).filter((d) => d.routePath !== `/${rootPathId}`)\n\n const routeTree: RouteNode[] = []\n\n // Loop over the flat list of routeNodes and\n // build up a tree based on the routeNodes' routePath\n routeNodes.forEach((node) => {\n routeNodes.forEach((existingNode) => {\n if (\n node.routePath?.startsWith(`${existingNode?.routePath ?? ''}/`)\n // node.routePath.length > existingNode.routePath!.length\n ) {\n node.parent = existingNode\n }\n })\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 (node.parent) {\n node.parent.children = node.parent.children ?? []\n node.parent.children.push(node)\n } else {\n routeTree.push(node)\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 replace with FileRoute(${node.routePath})\n const replaced = routeCode.replace(\n fileRouteRegex,\n `new FileRoute('${node.routePath}')`,\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 routeImports = [\n `import { route as rootRoute } from './${path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, rootPathId),\n )}'`,\n ...multiSortBy(routeNodes, [\n (d) => (d.routePath?.includes(`/${rootPathId}`) ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.routePath?.endsWith(\"index'\") ? -1 : 1),\n (d) => d,\n ]).map((node) => {\n return `import { route as ${node.variableName}Route } from './${removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\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 parentRoute: typeof ${routeNode.parent?.variableName ?? 'root'}Route\n }`\n })\n .join('\\n')} \n }\n}`\n\n const routeOptions = routeNodes\n .map((routeNode) => {\n return `Object.assign(${routeNode.variableName ?? 'root'}Route.options, {\n ${[\n routeNode.isNonPath\n ? `id: '${routeNode.cleanedPath}'`\n : `path: '${routeNode.cleanedPath}'`,\n `getParentRoute: () => ${\n routeNode.parent?.variableName ?? 'root'\n }Route`,\n routeNode.layoutLimit\n ? `layoutLimit: '${routeNode.layoutLimit}'`\n : '',\n // `\\n// ${JSON.stringify(\n // {\n // ...routeNode,\n // parent: undefined,\n // children: undefined,\n // fullPath: undefined,\n // variableName: undefined,\n // },\n // null,\n // 2,\n // )\n // .split('\\n')\n // .join('\\n// ')}`,\n ]\n .filter(Boolean)\n .join(',')}\n })`\n })\n .join('\\n\\n')\n\n const routeConfig = `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`\n\n const routeConfigFileContent = await prettier.format(\n [routeImports, routeTypes, routeOptions, 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 removeUnderscores(s?: string) {\n return s?.replace(/(^_|_$)/, '').replace(/(\\/_|_\\/)/, '/')\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","cleanPath","split","variableName","fileToVariable","endsWith","replace","push","first","skipMessage","generator","console","log","taskId","checkLatest","start","Date","now","multiSortBy","length","routeTree","forEach","node","existingNode","parent","trimmedPath","trimPathLeft","isNonPath","isNonLayout","cleanedPath","removeUnderscores","children","buildRouteConfig","nodes","depth","routeCode","readFile","isRoot","replaced","writeFile","route","childConfigs","spaces","Boolean","routeConfigChildrenText","routeImports","relative","dirname","generatedRouteTree","includes","routeTypes","routeNode","routeOptions","layoutLimit","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"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ declare const configSchema: z.ZodObject<{
3
+ routeFilePrefix: z.ZodOptional<z.ZodString>;
4
+ routeFileIgnorePrefix: z.ZodOptional<z.ZodString>;
5
+ routesDirectory: z.ZodString;
6
+ generatedRouteTree: z.ZodString;
7
+ }, "strip", z.ZodTypeAny, {
8
+ routesDirectory: string;
9
+ generatedRouteTree: string;
10
+ routeFilePrefix?: string | undefined;
11
+ routeFileIgnorePrefix?: string | undefined;
12
+ }, {
13
+ routesDirectory: string;
14
+ generatedRouteTree: string;
15
+ routeFilePrefix?: string | undefined;
16
+ routeFileIgnorePrefix?: string | undefined;
17
+ }>;
18
+ export type Config = z.infer<typeof configSchema>;
19
+ export declare function getConfig(): Promise<{
20
+ routesDirectory: string;
21
+ generatedRouteTree: string;
22
+ routeFilePrefix?: string | undefined;
23
+ routeFileIgnorePrefix?: string | undefined;
24
+ }>;
25
+ export {};
@@ -0,0 +1,2 @@
1
+ import { Config } from './config';
2
+ export declare function generate(config: Config): Promise<void>;
@@ -0,0 +1,20 @@
1
+ import { Config } from './config';
2
+ export declare const rootPathId = "__root";
3
+ export declare const fileRouteRegex: RegExp;
4
+ export type RouteNode = {
5
+ filePath: string;
6
+ fullPath: string;
7
+ variableName: string;
8
+ routePath?: string;
9
+ cleanedPath?: string;
10
+ path?: string;
11
+ isNonPath?: boolean;
12
+ isNonLayout?: boolean;
13
+ isRoot?: boolean;
14
+ children?: RouteNode[];
15
+ parent?: RouteNode;
16
+ layoutLimit?: string;
17
+ };
18
+ export declare function generator(config: Config): Promise<void>;
19
+ export declare function removeExt(d: string): string;
20
+ export declare function multiSortBy<T>(arr: T[], accessors?: ((item: T) => any)[]): T[];
@@ -1,13 +1 @@
1
- /**
2
- * @tanstack/router-cli/src/index.ts
3
- *
4
- * Copyright (c) TanStack
5
- *
6
- * This source code is licensed under the MIT license found in the
7
- * LICENSE.md file in the root directory of this source tree.
8
- *
9
- * @license MIT
10
- */
11
- declare function main(): void;
12
-
13
- export { main };
1
+ export declare function main(): void;
@@ -0,0 +1 @@
1
+ export declare function watch(): Promise<void>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tanstack/router-cli",
3
3
  "author": "Tanner Linsley",
4
- "version": "0.0.1-beta.174",
4
+ "version": "0.0.1-beta.176",
5
5
  "license": "MIT",
6
6
  "repository": "tanstack/router",
7
7
  "homepage": "https://tanstack.com/router",
package/src/generator.ts CHANGED
@@ -33,7 +33,10 @@ async function getRouteNodes(config: Config) {
33
33
  let dirList = await fs.readdir(fullDir)
34
34
 
35
35
  dirList = dirList.filter((d) => {
36
- if (d.startsWith('.') || d.startsWith(routeFileIgnorePrefix)) {
36
+ if (
37
+ d.startsWith('.') ||
38
+ (routeFileIgnorePrefix && d.startsWith(routeFileIgnorePrefix))
39
+ ) {
37
40
  return false
38
41
  }
39
42