@tanstack/router-vite-plugin 1.4.6 → 1.4.10

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.
@@ -45,24 +45,25 @@ async function getRouteNodes(config) {
45
45
  let routeNodes = [];
46
46
  async function recurse(dir) {
47
47
  const fullDir = path.resolve(config.routesDirectory, dir);
48
- let dirList = await fs__namespace.readdir(fullDir);
48
+ let dirList = await fs__namespace.readdir(fullDir, {
49
+ withFileTypes: true
50
+ });
49
51
  dirList = dirList.filter(d => {
50
- if (d.startsWith('.') || routeFileIgnorePrefix && d.startsWith(routeFileIgnorePrefix)) {
52
+ if (d.name.startsWith('.') || routeFileIgnorePrefix && d.name.startsWith(routeFileIgnorePrefix)) {
51
53
  return false;
52
54
  }
53
55
  if (routeFilePrefix) {
54
- return d.startsWith(routeFilePrefix);
56
+ return d.name.startsWith(routeFilePrefix);
55
57
  }
56
58
  return true;
57
59
  });
58
- await Promise.all(dirList.map(async fileName => {
59
- const fullPath = path.join(fullDir, fileName);
60
- const relativePath = path.join(dir, fileName);
61
- const stat = await fs__namespace.stat(fullPath);
62
- if (stat.isDirectory()) {
60
+ await Promise.all(dirList.map(async dirent => {
61
+ const fullPath = path.join(fullDir, dirent.name);
62
+ const relativePath = path.join(dir, dirent.name);
63
+ if (dirent.isDirectory()) {
63
64
  await recurse(relativePath);
64
65
  } else if (fullPath.match(/\.(tsx|ts|jsx|js)$/)) {
65
- const filePath = replaceBackslash(path.join(dir, fileName));
66
+ const filePath = replaceBackslash(path.join(dir, dirent.name));
66
67
  const filePathNoExt = removeExt(filePath);
67
68
  let routePath = reactRouter.cleanPath(`/${filePathNoExt.split('.').join('/')}`) || '';
68
69
  const variableName = routePathToVariable(routePath);
@@ -199,8 +200,8 @@ async function generator(config) {
199
200
  lazyFn: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.loader),
200
201
  lazyRouteComponent: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.component || routePiecesByPath[node.routePath]?.errorComponent || routePiecesByPath[node.routePath]?.pendingComponent)
201
202
  }).filter(d => d[1]).map(d => d[0]);
202
- 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
- return `import { Route as ${node.variableName}Import } from './${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, node.filePath))))}'`;
203
+ const routeImports = [imports.length ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\n` : '', `import { Route as rootRoute } from './${replaceBackslash(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, routePathIdPrefix + rootPathId)))}'`, ...sortedRouteNodes.filter(d => !d.isVirtual).map(node => {
204
+ return `import { Route as ${node.variableName}Import } from './${replaceBackslash(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, node.filePath))))}'`;
204
205
  }), '\n', sortedRouteNodes.filter(d => d.isVirtual).map(node => {
205
206
  return `const ${node.variableName}Import = new FileRoute('${removeTrailingUnderscores(node.routePath)}').createRoute()`;
206
207
  }).join('\n'), '\n', sortedRouteNodes.map(node => {
@@ -210,9 +211,9 @@ async function generator(config) {
210
211
  const pendingComponentNode = routePiecesByPath[node.routePath]?.pendingComponent;
211
212
  return [`const ${node.variableName}Route = ${node.variableName}Import.update({
212
213
  ${[node.isNonPath ? `id: '${node.path}'` : `path: '${node.cleanedPath}'`, `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`].filter(Boolean).join(',')}
213
- } as any)`, loaderNode ? `.updateLoader({ loader: lazyFn(() => import('./${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, loaderNode.filePath))))}'), 'loader') })` : '', componentNode || errorComponentNode || pendingComponentNode ? `.update({
214
+ } 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({
214
215
  ${[['component', componentNode], ['errorComponent', errorComponentNode], ['pendingComponent', pendingComponentNode]].filter(d => d[1]).map(d => {
215
- return `${d[0]}: lazyRouteComponent(() => import('./${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, d[1].filePath))))}'), '${d[0]}')`;
216
+ return `${d[0]}: lazyRouteComponent(() => import('./${replaceBackslash(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, d[1].filePath))))}'), '${d[0]}')`;
216
217
  }).join('\n,')}
217
218
  })` : ''].join('');
218
219
  }).join('\n\n'), `declare module '@tanstack/react-router' {
@@ -280,9 +281,6 @@ function capitalize(s) {
280
281
  if (typeof s !== 'string') return '';
281
282
  return s.charAt(0).toUpperCase() + s.slice(1);
282
283
  }
283
- function sanitize(s) {
284
- return replaceBackslash(s.replace(/\\index/gi, ''));
285
- }
286
284
  function removeUnderscores(s) {
287
285
  return s?.replace(/(^_|_$)/, '').replace(/(\/_|_\/)/, '/');
288
286
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sources":["../../../../../../router-cli/src/generator.ts"],"sourcesContent":["import path from 'path'\nimport * as fs from 'fs/promises'\nimport * as prettier from 'prettier'\nimport { Config } from './config'\nimport { cleanPath, trimPathLeft } from '@tanstack/react-router'\nimport { existsSync } from 'fs'\n\nlet latestTask = 0\nexport const rootPathId = '__root'\nexport const fileRouteRegex = /new\\s+FileRoute\\(([^)]*)\\)/g\n\nexport type RouteNode = {\n filePath: string\n fullPath: string\n variableName: string\n routePath?: string\n cleanedPath?: string\n path?: string\n isNonPath?: boolean\n isNonLayout?: boolean\n isRoute?: boolean\n isLoader?: boolean\n isComponent?: boolean\n isErrorComponent?: boolean\n isPendingComponent?: boolean\n isVirtual?: boolean\n isRoot?: boolean\n children?: RouteNode[]\n parent?: RouteNode\n}\n\nasync function getRouteNodes(config: Config) {\n const { routeFilePrefix, routeFileIgnorePrefix } = config\n\n let routeNodes: RouteNode[] = []\n\n async function recurse(dir: string) {\n const fullDir = path.resolve(config.routesDirectory, dir)\n let dirList = await fs.readdir(fullDir)\n\n dirList = dirList.filter((d) => {\n if (\n d.startsWith('.') ||\n (routeFileIgnorePrefix && d.startsWith(routeFileIgnorePrefix))\n ) {\n return false\n }\n\n if (routeFilePrefix) {\n return d.startsWith(routeFilePrefix)\n }\n\n return true\n })\n\n await Promise.all(\n dirList.map(async (fileName) => {\n const fullPath = path.join(fullDir, fileName)\n const relativePath = path.join(dir, fileName)\n const stat = await fs.stat(fullPath)\n\n if (stat.isDirectory()) {\n await recurse(relativePath)\n } else if (fullPath.match(/\\.(tsx|ts|jsx|js)$/)) {\n const filePath = replaceBackslash(path.join(dir, fileName))\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 routeImports = [\n imports.length\n ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\\n`\n : '',\n `import { Route as rootRoute } from './${sanitize(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, routePathIdPrefix + rootPathId),\n ),\n )}'`,\n ...sortedRouteNodes\n .filter((d) => !d.isVirtual)\n .map((node) => {\n return `import { Route as ${\n node.variableName\n }Import } from './${sanitize(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n ),\n )}'`\n }),\n '\\n',\n sortedRouteNodes\n .filter((d) => d.isVirtual)\n .map((node) => {\n return `const ${\n node.variableName\n }Import = new FileRoute('${removeTrailingUnderscores(\n node.routePath,\n )}').createRoute()`\n })\n .join('\\n'),\n '\\n',\n sortedRouteNodes\n .map((node) => {\n const loaderNode = routePiecesByPath[node.routePath!]?.loader\n const componentNode = routePiecesByPath[node.routePath!]?.component\n const errorComponentNode =\n routePiecesByPath[node.routePath!]?.errorComponent\n const pendingComponentNode =\n routePiecesByPath[node.routePath!]?.pendingComponent\n\n return [\n `const ${node.variableName}Route = ${node.variableName}Import.update({\n ${[\n node.isNonPath\n ? `id: '${node.path}'`\n : `path: '${node.cleanedPath}'`,\n `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`,\n ]\n .filter(Boolean)\n .join(',')}\n } as any)`,\n loaderNode\n ? `.updateLoader({ loader: lazyFn(() => import('./${sanitize(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, loaderNode.filePath),\n ),\n ),\n )}'), 'loader') })`\n : '',\n componentNode || errorComponentNode || pendingComponentNode\n ? `.update({\n ${(\n [\n ['component', componentNode],\n ['errorComponent', errorComponentNode],\n ['pendingComponent', pendingComponentNode],\n ] as const\n )\n .filter((d) => d[1])\n .map((d) => {\n return `${\n d[0]\n }: lazyRouteComponent(() => import('./${sanitize(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, d[1]!.filePath),\n ),\n ),\n )}'), '${d[0]}')`\n })\n .join('\\n,')}\n })`\n : '',\n ].join('')\n })\n .join('\\n\\n'),\n `declare module '@tanstack/react-router' {\n interface FileRoutesByPath {\n ${routeNodes\n .map((routeNode) => {\n return `'${removeTrailingUnderscores(routeNode.routePath)}': {\n preLoaderRoute: typeof ${routeNode.variableName}Import\n parentRoute: typeof ${\n routeNode.parent?.variableName\n ? `${routeNode.parent?.variableName}Import`\n : 'rootRoute'\n }\n }`\n })\n .join('\\n')}\n }\n}`,\n `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`,\n ]\n .filter(Boolean)\n .join('\\n')\n\n const routeConfigFileContent = await prettier.format(routeImports, {\n semi: false,\n singleQuote: config.quoteStyle === 'single',\n parser: 'typescript',\n })\n\n const routeTreeContent = await fs\n .readFile(path.resolve(config.generatedRouteTree), 'utf-8')\n .catch((err: any) => {\n if (err.code === 'ENOENT') {\n return undefined\n }\n throw err\n })\n\n if (!checkLatest()) return\n\n if (routeTreeContent !== routeConfigFileContent) {\n await fs.mkdir(path.dirname(path.resolve(config.generatedRouteTree)), {\n recursive: true,\n })\n if (!checkLatest()) return\n await fs.writeFile(\n path.resolve(config.generatedRouteTree),\n routeConfigFileContent,\n )\n }\n\n console.log(\n `🌲 Processed ${routeNodes.length} routes in ${Date.now() - start}ms`,\n )\n}\n\nfunction 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 sanitize(s: string) {\n return replaceBackslash(s.replace(/\\\\index/gi, ''))\n}\n\nfunction removeUnderscores(s?: string) {\n return s?.replace(/(^_|_$)/, '').replace(/(\\/_|_\\/)/, '/')\n}\n\nfunction removeTrailingUnderscores(s?: string) {\n return s?.replace(/(_$)/, '').replace(/(_\\/)/, '/')\n}\n\nfunction replaceBackslash(s: string) {\n return s.replace(/\\\\/gi, '/')\n}\n\nexport function hasParentRoute(\n routes: RouteNode[],\n routePathToCheck: string | undefined,\n): RouteNode | null {\n if (!routePathToCheck || routePathToCheck === '/') {\n return null\n }\n\n const sortedNodes = multiSortBy(routes, [\n (d) => d.routePath!.length * -1,\n (d) => d.variableName,\n ]).filter((d) => d.routePath !== `/${rootPathId}`)\n\n for (const route of sortedNodes) {\n if (route.routePath === '/') continue\n\n if (\n routePathToCheck.startsWith(`${route.routePath}/`) &&\n route.routePath !== routePathToCheck\n ) {\n return route\n }\n }\n const segments = routePathToCheck.split('/')\n segments.pop() // Remove the last segment\n const parentRoutePath = segments.join('/')\n\n return hasParentRoute(routes, parentRoutePath)\n}\n"],"names":["latestTask","rootPathId","fileRouteRegex","getRouteNodes","config","routeFilePrefix","routeFileIgnorePrefix","routeNodes","recurse","dir","fullDir","path","resolve","routesDirectory","dirList","fs","readdir","filter","d","startsWith","Promise","all","map","fileName","fullPath","join","relativePath","stat","isDirectory","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","routeImports","sanitize","relative","dirname","generatedRouteTree","loaderNode","componentNode","errorComponentNode","pendingComponentNode","routeNode","routeConfigFileContent","prettier","semi","singleQuote","parser","routeTreeContent","catch","err","code","undefined","mkdir","recursive","i","capitalize","substring","lastIndexOf","Array","from","arr","accessors","sort","a","ai","b","bi","accessor","ao","bo","s","charAt","toUpperCase","slice","routes","routePathToCheck","sortedNodes","segments","pop","parentRoutePath"],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sources":["../../../../../../router-cli/src/generator.ts"],"sourcesContent":["import path from 'path'\nimport * as fs from 'fs/promises'\nimport * as prettier from 'prettier'\nimport { Config } from './config'\nimport { cleanPath, trimPathLeft } from '@tanstack/react-router'\nimport { existsSync } from 'fs'\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 routeImports = [\n imports.length\n ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\\n`\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 '\\n',\n sortedRouteNodes\n .filter((d) => d.isVirtual)\n .map((node) => {\n return `const ${\n node.variableName\n }Import = new FileRoute('${removeTrailingUnderscores(\n node.routePath,\n )}').createRoute()`\n })\n .join('\\n'),\n '\\n',\n sortedRouteNodes\n .map((node) => {\n const loaderNode = routePiecesByPath[node.routePath!]?.loader\n const componentNode = routePiecesByPath[node.routePath!]?.component\n const errorComponentNode =\n routePiecesByPath[node.routePath!]?.errorComponent\n const pendingComponentNode =\n routePiecesByPath[node.routePath!]?.pendingComponent\n\n return [\n `const ${node.variableName}Route = ${node.variableName}Import.update({\n ${[\n node.isNonPath\n ? `id: '${node.path}'`\n : `path: '${node.cleanedPath}'`,\n `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`,\n ]\n .filter(Boolean)\n .join(',')}\n } as any)`,\n loaderNode\n ? `.updateLoader({ loader: lazyFn(() => import('./${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 `declare module '@tanstack/react-router' {\n interface FileRoutesByPath {\n ${routeNodes\n .map((routeNode) => {\n return `'${removeTrailingUnderscores(routeNode.routePath)}': {\n preLoaderRoute: typeof ${routeNode.variableName}Import\n parentRoute: typeof ${\n routeNode.parent?.variableName\n ? `${routeNode.parent?.variableName}Import`\n : 'rootRoute'\n }\n }`\n })\n .join('\\n')}\n }\n}`,\n `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`,\n ]\n .filter(Boolean)\n .join('\\n')\n\n const routeConfigFileContent = await prettier.format(routeImports, {\n semi: false,\n singleQuote: config.quoteStyle === 'single',\n parser: 'typescript',\n })\n\n const routeTreeContent = await fs\n .readFile(path.resolve(config.generatedRouteTree), 'utf-8')\n .catch((err: any) => {\n if (err.code === 'ENOENT') {\n return undefined\n }\n throw err\n })\n\n if (!checkLatest()) return\n\n if (routeTreeContent !== routeConfigFileContent) {\n await fs.mkdir(path.dirname(path.resolve(config.generatedRouteTree)), {\n recursive: true,\n })\n if (!checkLatest()) return\n await fs.writeFile(\n path.resolve(config.generatedRouteTree),\n routeConfigFileContent,\n )\n }\n\n console.log(\n `🌲 Processed ${routeNodes.length} routes in ${Date.now() - start}ms`,\n )\n}\n\nfunction 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","routeImports","relative","dirname","generatedRouteTree","loaderNode","componentNode","errorComponentNode","pendingComponentNode","routeNode","routeConfigFileContent","prettier","semi","singleQuote","parser","routeTreeContent","catch","err","code","undefined","mkdir","recursive","i","capitalize","substring","lastIndexOf","Array","from","arr","accessors","sort","a","ai","b","bi","accessor","ao","bo","s","charAt","toUpperCase","slice","routes","routePathToCheck","sortedNodes","segments","pop","parentRoutePath"],"mappings":"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"}
@@ -33011,24 +33011,25 @@ async function getRouteNodes(config) {
33011
33011
  let routeNodes = [];
33012
33012
  async function recurse(dir) {
33013
33013
  const fullDir = path.resolve(config.routesDirectory, dir);
33014
- let dirList = await fs.readdir(fullDir);
33014
+ let dirList = await fs.readdir(fullDir, {
33015
+ withFileTypes: true
33016
+ });
33015
33017
  dirList = dirList.filter(d => {
33016
- if (d.startsWith('.') || routeFileIgnorePrefix && d.startsWith(routeFileIgnorePrefix)) {
33018
+ if (d.name.startsWith('.') || routeFileIgnorePrefix && d.name.startsWith(routeFileIgnorePrefix)) {
33017
33019
  return false;
33018
33020
  }
33019
33021
  if (routeFilePrefix) {
33020
- return d.startsWith(routeFilePrefix);
33022
+ return d.name.startsWith(routeFilePrefix);
33021
33023
  }
33022
33024
  return true;
33023
33025
  });
33024
- await Promise.all(dirList.map(async fileName => {
33025
- const fullPath = path.join(fullDir, fileName);
33026
- const relativePath = path.join(dir, fileName);
33027
- const stat = await fs.stat(fullPath);
33028
- if (stat.isDirectory()) {
33026
+ await Promise.all(dirList.map(async dirent => {
33027
+ const fullPath = path.join(fullDir, dirent.name);
33028
+ const relativePath = path.join(dir, dirent.name);
33029
+ if (dirent.isDirectory()) {
33029
33030
  await recurse(relativePath);
33030
33031
  } else if (fullPath.match(/\.(tsx|ts|jsx|js)$/)) {
33031
- const filePath = replaceBackslash(path.join(dir, fileName));
33032
+ const filePath = replaceBackslash(path.join(dir, dirent.name));
33032
33033
  const filePathNoExt = removeExt(filePath);
33033
33034
  let routePath = cleanPath(`/${filePathNoExt.split('.').join('/')}`) || '';
33034
33035
  const variableName = routePathToVariable(routePath);
@@ -33165,8 +33166,8 @@ async function generator(config) {
33165
33166
  lazyFn: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.loader),
33166
33167
  lazyRouteComponent: sortedRouteNodes.some(node => routePiecesByPath[node.routePath]?.component || routePiecesByPath[node.routePath]?.errorComponent || routePiecesByPath[node.routePath]?.pendingComponent)
33167
33168
  }).filter(d => d[1]).map(d => d[0]);
33168
- 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 => {
33169
- return `import { Route as ${node.variableName}Import } from './${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, node.filePath))))}'`;
33169
+ const routeImports = [imports.length ? `import { ${imports.join(', ')} } from '@tanstack/react-router'\n` : '', `import { Route as rootRoute } from './${replaceBackslash(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, routePathIdPrefix + rootPathId)))}'`, ...sortedRouteNodes.filter(d => !d.isVirtual).map(node => {
33170
+ return `import { Route as ${node.variableName}Import } from './${replaceBackslash(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, node.filePath))))}'`;
33170
33171
  }), '\n', sortedRouteNodes.filter(d => d.isVirtual).map(node => {
33171
33172
  return `const ${node.variableName}Import = new FileRoute('${removeTrailingUnderscores(node.routePath)}').createRoute()`;
33172
33173
  }).join('\n'), '\n', sortedRouteNodes.map(node => {
@@ -33176,9 +33177,9 @@ async function generator(config) {
33176
33177
  const pendingComponentNode = routePiecesByPath[node.routePath]?.pendingComponent;
33177
33178
  return [`const ${node.variableName}Route = ${node.variableName}Import.update({
33178
33179
  ${[node.isNonPath ? `id: '${node.path}'` : `path: '${node.cleanedPath}'`, `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`].filter(Boolean).join(',')}
33179
- } as any)`, loaderNode ? `.updateLoader({ loader: lazyFn(() => import('./${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, loaderNode.filePath))))}'), 'loader') })` : '', componentNode || errorComponentNode || pendingComponentNode ? `.update({
33180
+ } 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({
33180
33181
  ${[['component', componentNode], ['errorComponent', errorComponentNode], ['pendingComponent', pendingComponentNode]].filter(d => d[1]).map(d => {
33181
- return `${d[0]}: lazyRouteComponent(() => import('./${sanitize(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, d[1].filePath))))}'), '${d[0]}')`;
33182
+ return `${d[0]}: lazyRouteComponent(() => import('./${replaceBackslash(removeExt(path.relative(path.dirname(config.generatedRouteTree), path.resolve(config.routesDirectory, d[1].filePath))))}'), '${d[0]}')`;
33182
33183
  }).join('\n,')}
33183
33184
  })` : ''].join('');
33184
33185
  }).join('\n\n'), `declare module '@tanstack/react-router' {
@@ -33246,9 +33247,6 @@ function capitalize(s) {
33246
33247
  if (typeof s !== 'string') return '';
33247
33248
  return s.charAt(0).toUpperCase() + s.slice(1);
33248
33249
  }
33249
- function sanitize(s) {
33250
- return replaceBackslash(s.replace(/\\index/gi, ''));
33251
- }
33252
33250
  function removeUnderscores(s) {
33253
33251
  return s?.replace(/(^_|_$)/, '').replace(/(\/_|_\/)/, '/');
33254
33252
  }