@tanstack/router-generator 1.120.5 → 1.121.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/config.cjs +14 -14
- package/dist/cjs/config.cjs.map +1 -1
- package/dist/cjs/config.d.cts +68 -31
- package/dist/cjs/filesystem/physical/getRouteNodes.cjs +1 -5
- package/dist/cjs/filesystem/physical/getRouteNodes.cjs.map +1 -1
- package/dist/cjs/filesystem/physical/getRouteNodes.d.cts +2 -2
- package/dist/cjs/filesystem/virtual/getRouteNodes.cjs.map +1 -1
- package/dist/cjs/filesystem/virtual/getRouteNodes.d.cts +2 -2
- package/dist/cjs/generator.cjs +160 -172
- package/dist/cjs/generator.cjs.map +1 -1
- package/dist/cjs/generator.d.cts +0 -59
- package/dist/cjs/index.cjs +23 -2
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +8 -4
- package/dist/cjs/template.cjs +4 -12
- package/dist/cjs/template.cjs.map +1 -1
- package/dist/cjs/template.d.cts +0 -1
- package/dist/cjs/types.d.cts +1 -1
- package/dist/cjs/utils.cjs +64 -5
- package/dist/cjs/utils.cjs.map +1 -1
- package/dist/cjs/utils.d.cts +11 -2
- package/dist/esm/config.d.ts +68 -31
- package/dist/esm/config.js +14 -14
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/filesystem/physical/getRouteNodes.d.ts +2 -2
- package/dist/esm/filesystem/physical/getRouteNodes.js +2 -6
- package/dist/esm/filesystem/physical/getRouteNodes.js.map +1 -1
- package/dist/esm/filesystem/virtual/getRouteNodes.d.ts +2 -2
- package/dist/esm/filesystem/virtual/getRouteNodes.js.map +1 -1
- package/dist/esm/generator.d.ts +0 -59
- package/dist/esm/generator.js +163 -175
- package/dist/esm/generator.js.map +1 -1
- package/dist/esm/index.d.ts +8 -4
- package/dist/esm/index.js +25 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/template.d.ts +0 -1
- package/dist/esm/template.js +4 -12
- package/dist/esm/template.js.map +1 -1
- package/dist/esm/types.d.ts +1 -1
- package/dist/esm/utils.d.ts +11 -2
- package/dist/esm/utils.js +63 -4
- package/dist/esm/utils.js.map +1 -1
- package/package.json +3 -3
- package/src/config.ts +14 -11
- package/src/filesystem/physical/getRouteNodes.ts +13 -14
- package/src/filesystem/virtual/getRouteNodes.ts +18 -3
- package/src/generator.ts +242 -221
- package/src/index.ts +32 -7
- package/src/template.ts +4 -15
- package/src/types.ts +0 -1
- package/src/utils.ts +102 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.cjs","sources":["../../src/generator.ts"],"sourcesContent":["import path from 'node:path'\nimport * as fs from 'node:fs'\nimport * as fsp from 'node:fs/promises'\nimport {\n determineInitialRoutePath,\n format,\n logging,\n multiSortBy,\n removeExt,\n removeTrailingSlash,\n removeUnderscores,\n replaceBackslash,\n resetRegex,\n routePathToVariable,\n trimPathLeft,\n writeIfDifferent,\n} from './utils'\nimport { getRouteNodes as physicalGetRouteNodes } from './filesystem/physical/getRouteNodes'\nimport { getRouteNodes as virtualGetRouteNodes } from './filesystem/virtual/getRouteNodes'\nimport { rootPathId } from './filesystem/physical/rootPathId'\nimport {\n defaultAPIRouteTemplate,\n fillTemplate,\n getTargetTemplate,\n} from './template'\nimport type { FsRouteType, GetRouteNodesResult, RouteNode } from './types'\nimport type { Config } from './config'\n\nexport const CONSTANTS = {\n // When changing this, you'll want to update the import in `start-api-routes/src/index.ts#defaultAPIFileRouteHandler`\n APIRouteExportVariable: 'APIRoute',\n}\n\nlet latestTask = 0\nconst routeGroupPatternRegex = /\\(.+\\)/g\nconst possiblyNestedRouteGroupPatternRegex = /\\([^/]+\\)\\/?/g\n\nlet isFirst = false\nlet skipMessage = false\n\ntype RouteSubNode = {\n component?: RouteNode\n errorComponent?: RouteNode\n pendingComponent?: RouteNode\n loader?: RouteNode\n lazy?: RouteNode\n}\n\nexport async function generator(config: Config, root: string) {\n const ROUTE_TEMPLATE = getTargetTemplate(config.target)\n const logger = logging({ disabled: config.disableLogging })\n logger.log('')\n\n if (!isFirst) {\n logger.log('♻️ Generating routes...')\n isFirst = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n logger.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 const TYPES_DISABLED = config.disableTypes\n\n // Controls whether API Routes are generated for TanStack Start\n const ENABLED_API_ROUTES_GENERATION =\n config.__enableAPIRoutesGeneration ?? false\n\n let getRouteNodesResult: GetRouteNodesResult\n\n if (config.virtualRouteConfig) {\n getRouteNodesResult = await virtualGetRouteNodes(config, root)\n } else {\n getRouteNodesResult = await physicalGetRouteNodes(config, root)\n }\n\n const { rootRouteNode, routeNodes: beforeRouteNodes } = getRouteNodesResult\n if (rootRouteNode === undefined) {\n let errorMessage = `rootRouteNode must not be undefined. Make sure you've added your root route into the route-tree.`\n if (!config.virtualRouteConfig) {\n errorMessage += `\\nMake sure that you add a \"${rootPathId}.${config.disableTypes ? 'js' : 'tsx'}\" file to your routes directory.\\nAdd the file in: \"${config.routesDirectory}/${rootPathId}.${config.disableTypes ? 'js' : 'tsx'}\"`\n }\n throw new Error(errorMessage)\n }\n\n const preRouteNodes = multiSortBy(beforeRouteNodes, [\n (d) => (d.routePath === '/' ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) =>\n d.filePath.match(new RegExp(`[./]${config.indexToken}[.]`)) ? 1 : -1,\n (d) =>\n d.filePath.match(\n /[./](component|errorComponent|pendingComponent|loader|lazy)[.]/,\n )\n ? 1\n : -1,\n (d) =>\n d.filePath.match(new RegExp(`[./]${config.routeToken}[.]`)) ? -1 : 1,\n (d) => (d.routePath?.endsWith('/') ? -1 : 1),\n (d) => d.routePath,\n ]).filter((d) => ![`/${rootPathId}`].includes(d.routePath || ''))\n\n const routeTree: Array<RouteNode> = []\n const routePiecesByPath: Record<string, RouteSubNode> = {}\n\n // Filtered API Route nodes\n const onlyAPIRouteNodes = preRouteNodes.filter((d) => {\n if (!ENABLED_API_ROUTES_GENERATION) {\n return false\n }\n\n if (d._fsRouteType !== 'api') {\n return false\n }\n\n return true\n })\n\n // Filtered Generator Route nodes\n const onlyGeneratorRouteNodes = preRouteNodes.filter((d) => {\n if (ENABLED_API_ROUTES_GENERATION) {\n if (d._fsRouteType === 'api') {\n return false\n }\n }\n\n return true\n })\n\n // Loop over the flat list of routeNodes and\n // build up a tree based on the routeNodes' routePath\n const routeNodes: Array<RouteNode> = []\n\n // the handleRootNode function is not being collapsed into the handleNode function\n // because it requires only a subset of the logic that the handleNode function requires\n // and it's easier to read and maintain this way\n const handleRootNode = async (node?: RouteNode) => {\n if (!node) {\n // currently this is not being handled, but it could be in the future\n // for example to handle a virtual root route\n return\n }\n\n // from here on, we are only handling the root node that's present in the file system\n const routeCode = fs.readFileSync(node.fullPath, 'utf-8')\n\n if (!routeCode) {\n const _rootTemplate = ROUTE_TEMPLATE.rootRoute\n const replaced = await fillTemplate(config, _rootTemplate.template(), {\n tsrImports: _rootTemplate.imports.tsrImports(),\n tsrPath: rootPathId,\n tsrExportStart: _rootTemplate.imports.tsrExportStart(),\n tsrExportEnd: _rootTemplate.imports.tsrExportEnd(),\n })\n\n await writeIfDifferent(\n node.fullPath,\n '', // Empty string because the file doesn't exist yet\n replaced,\n {\n beforeWrite: () => {\n logger.log(`🟡 Creating ${node.fullPath}`)\n },\n },\n )\n }\n }\n\n await handleRootNode(rootRouteNode)\n\n const handleNode = async (node: RouteNode) => {\n // Do not remove this as we need to set the lastIndex to 0 as it\n // is necessary to reset the regex's index when using the global flag\n // otherwise it might not match the next time it's used\n resetRegex(routeGroupPatternRegex)\n\n let parentRoute = hasParentRoute(routeNodes, node, node.routePath)\n\n // if the parent route is a virtual parent route, we need to find the real parent route\n if (parentRoute?.isVirtualParentRoute && parentRoute.children?.length) {\n // only if this sub-parent route returns a valid parent route, we use it, if not leave it as it\n const possibleParentRoute = hasParentRoute(\n parentRoute.children,\n node,\n node.routePath,\n )\n if (possibleParentRoute) {\n parentRoute = possibleParentRoute\n }\n }\n\n if (parentRoute) node.parent = parentRoute\n\n node.path = determineNodePath(node)\n\n const trimmedPath = trimPathLeft(node.path ?? '')\n\n const split = trimmedPath.split('/')\n const lastRouteSegment = split[split.length - 1] ?? trimmedPath\n\n node.isNonPath =\n lastRouteSegment.startsWith('_') ||\n routeGroupPatternRegex.test(lastRouteSegment)\n\n node.cleanedPath = removeGroups(\n removeUnderscores(removeLayoutSegments(node.path)) ?? '',\n )\n\n // Ensure the boilerplate for the route exists, which can be skipped for virtual parent routes and virtual routes\n if (!node.isVirtualParentRoute && !node.isVirtual) {\n const routeCode = fs.readFileSync(node.fullPath, 'utf-8')\n\n const escapedRoutePath = node.routePath?.replaceAll('$', '$$') ?? ''\n\n let replaced = routeCode\n\n const tRouteTemplate = ROUTE_TEMPLATE.route\n const tLazyRouteTemplate = ROUTE_TEMPLATE.lazyRoute\n\n if (!routeCode) {\n // Creating a new lazy route file\n if (node._fsRouteType === 'lazy') {\n // Check by default check if the user has a specific lazy route template\n // If not, check if the user has a route template and use that instead\n replaced = await fillTemplate(\n config,\n (config.customScaffolding?.lazyRouteTemplate ||\n config.customScaffolding?.routeTemplate) ??\n tLazyRouteTemplate.template(),\n {\n tsrImports: tLazyRouteTemplate.imports.tsrImports(),\n tsrPath: escapedRoutePath,\n tsrExportStart:\n tLazyRouteTemplate.imports.tsrExportStart(escapedRoutePath),\n tsrExportEnd: tLazyRouteTemplate.imports.tsrExportEnd(),\n },\n )\n } else if (\n // Creating a new normal route file\n (['layout', 'static'] satisfies Array<FsRouteType>).some(\n (d) => d === node._fsRouteType,\n ) ||\n (\n [\n 'component',\n 'pendingComponent',\n 'errorComponent',\n 'loader',\n ] satisfies Array<FsRouteType>\n ).every((d) => d !== node._fsRouteType)\n ) {\n replaced = await fillTemplate(\n config,\n config.customScaffolding?.routeTemplate ??\n tRouteTemplate.template(),\n {\n tsrImports: tRouteTemplate.imports.tsrImports(),\n tsrPath: escapedRoutePath,\n tsrExportStart:\n tRouteTemplate.imports.tsrExportStart(escapedRoutePath),\n tsrExportEnd: tRouteTemplate.imports.tsrExportEnd(),\n },\n )\n }\n } else {\n // Update the existing route file\n replaced = routeCode\n .replace(\n /(FileRoute\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (_, p1, __, p3) => `${p1}${escapedRoutePath}${p3}`,\n )\n .replace(\n new RegExp(\n `(import\\\\s*\\\\{.*)(create(Lazy)?FileRoute)(.*\\\\}\\\\s*from\\\\s*['\"]@tanstack\\\\/${ROUTE_TEMPLATE.subPkg}['\"])`,\n 'gs',\n ),\n (_, p1, __, ___, p4) =>\n `${p1}${node._fsRouteType === 'lazy' ? 'createLazyFileRoute' : 'createFileRoute'}${p4}`,\n )\n .replace(\n /create(Lazy)?FileRoute(\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (_, __, p2, ___, p4) =>\n `${node._fsRouteType === 'lazy' ? 'createLazyFileRoute' : 'createFileRoute'}${p2}${escapedRoutePath}${p4}`,\n )\n }\n\n await writeIfDifferent(node.fullPath, routeCode, replaced, {\n beforeWrite: () => {\n logger.log(`🟡 Updating ${node.fullPath}`)\n },\n })\n }\n\n if (\n !node.isVirtual &&\n (\n [\n 'lazy',\n 'loader',\n 'component',\n 'pendingComponent',\n 'errorComponent',\n ] satisfies Array<FsRouteType>\n ).some((d) => d === node._fsRouteType)\n ) {\n routePiecesByPath[node.routePath!] =\n routePiecesByPath[node.routePath!] || {}\n\n routePiecesByPath[node.routePath!]![\n node._fsRouteType === 'lazy'\n ? 'lazy'\n : node._fsRouteType === 'loader'\n ? 'loader'\n : node._fsRouteType === 'errorComponent'\n ? 'errorComponent'\n : node._fsRouteType === 'pendingComponent'\n ? 'pendingComponent'\n : 'component'\n ] = node\n\n const anchorRoute = routeNodes.find((d) => d.routePath === node.routePath)\n\n if (!anchorRoute) {\n await handleNode({\n ...node,\n isVirtual: true,\n _fsRouteType: 'static',\n })\n }\n return\n }\n\n const cleanedPathIsEmpty = (node.cleanedPath || '').length === 0\n const nonPathRoute =\n node._fsRouteType === 'pathless_layout' && node.isNonPath\n\n node.isVirtualParentRequired =\n node._fsRouteType === 'pathless_layout' || nonPathRoute\n ? !cleanedPathIsEmpty\n : false\n\n if (!node.isVirtual && node.isVirtualParentRequired) {\n const parentRoutePath = removeLastSegmentFromPath(node.routePath) || '/'\n const parentVariableName = routePathToVariable(parentRoutePath)\n\n const anchorRoute = routeNodes.find(\n (d) => d.routePath === parentRoutePath,\n )\n\n if (!anchorRoute) {\n const parentNode: RouteNode = {\n ...node,\n path: removeLastSegmentFromPath(node.path) || '/',\n filePath: removeLastSegmentFromPath(node.filePath) || '/',\n fullPath: removeLastSegmentFromPath(node.fullPath) || '/',\n routePath: parentRoutePath,\n variableName: parentVariableName,\n isVirtual: true,\n _fsRouteType: 'layout', // layout since this route will wrap other routes\n isVirtualParentRoute: true,\n isVirtualParentRequired: false,\n }\n\n parentNode.children = parentNode.children ?? []\n parentNode.children.push(node)\n\n node.parent = parentNode\n\n if (node._fsRouteType === 'pathless_layout') {\n // since `node.path` is used as the `id` on the route definition, we need to update it\n node.path = determineNodePath(node)\n }\n\n await handleNode(parentNode)\n } else {\n anchorRoute.children = anchorRoute.children ?? []\n anchorRoute.children.push(node)\n\n node.parent = anchorRoute\n }\n }\n\n if (node.parent) {\n if (!node.isVirtualParentRequired) {\n node.parent.children = node.parent.children ?? []\n node.parent.children.push(node)\n }\n } else {\n routeTree.push(node)\n }\n\n routeNodes.push(node)\n }\n\n for (const node of onlyGeneratorRouteNodes) {\n await handleNode(node)\n }\n checkRouteFullPathUniqueness(\n preRouteNodes.filter(\n (d) =>\n d.children === undefined &&\n (['api', 'lazy'] satisfies Array<FsRouteType>).every(\n (type) => type !== d._fsRouteType,\n ),\n ),\n config,\n )\n\n const startAPIRouteNodes: Array<RouteNode> = checkStartAPIRoutes(\n onlyAPIRouteNodes,\n config,\n )\n\n const handleAPINode = async (node: RouteNode) => {\n const routeCode = fs.readFileSync(node.fullPath, 'utf-8')\n\n const escapedRoutePath = node.routePath?.replaceAll('$', '$$') ?? ''\n\n if (!routeCode) {\n const replaced = await fillTemplate(\n config,\n config.customScaffolding?.apiTemplate ?? defaultAPIRouteTemplate,\n {\n tsrImports:\n \"import { createAPIFileRoute } from '@tanstack/react-start/api';\",\n tsrPath: escapedRoutePath,\n tsrExportStart: `export const ${CONSTANTS.APIRouteExportVariable} = createAPIFileRoute('${escapedRoutePath}')(`,\n tsrExportEnd: ');',\n },\n )\n\n await writeIfDifferent(\n node.fullPath,\n '', // Empty string because the file doesn't exist yet\n replaced,\n {\n beforeWrite: () => {\n logger.log(`🟡 Creating ${node.fullPath}`)\n },\n },\n )\n } else {\n await writeIfDifferent(\n node.fullPath,\n routeCode,\n routeCode.replace(\n /(createAPIFileRoute\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (_, p1, __, p3) => `${p1}${escapedRoutePath}${p3}`,\n ),\n {\n beforeWrite: () => {\n logger.log(`🟡 Updating ${node.fullPath}`)\n },\n },\n )\n }\n }\n\n // Handle the API routes for TanStack Start\n if (ENABLED_API_ROUTES_GENERATION) {\n for (const node of startAPIRouteNodes) {\n await handleAPINode(node)\n }\n }\n\n function buildRouteTreeConfig(nodes: Array<RouteNode>, depth = 1): string {\n const children = nodes.map((node) => {\n if (node._fsRouteType === '__root') {\n return\n }\n\n if (node._fsRouteType === 'pathless_layout' && !node.children?.length) {\n return\n }\n\n const route = `${node.variableName}Route`\n\n if (node.children?.length) {\n const childConfigs = buildRouteTreeConfig(node.children, depth + 1)\n\n const childrenDeclaration = TYPES_DISABLED\n ? ''\n : `interface ${route}Children {\n ${node.children.map((child) => `${child.variableName}Route: typeof ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`\n\n const children = `const ${route}Children${TYPES_DISABLED ? '' : `: ${route}Children`} = {\n ${node.children.map((child) => `${child.variableName}Route: ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`\n\n const routeWithChildren = `const ${route}WithChildren = ${route}._addFileChildren(${route}Children)`\n\n return [\n childConfigs,\n childrenDeclaration,\n children,\n routeWithChildren,\n ].join('\\n\\n')\n }\n\n return undefined\n })\n\n return children.filter(Boolean).join('\\n\\n')\n }\n\n const routeConfigChildrenText = buildRouteTreeConfig(routeTree)\n\n const sortedRouteNodes = multiSortBy(routeNodes, [\n (d) => (d.routePath?.includes(`/${rootPathId}`) ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.routePath?.endsWith(config.indexToken) ? -1 : 1),\n (d) => d,\n ])\n\n const imports = Object.entries({\n createFileRoute: sortedRouteNodes.some((d) => d.isVirtual),\n lazyFn: sortedRouteNodes.some(\n (node) => routePiecesByPath[node.routePath!]?.loader,\n ),\n lazyRouteComponent: sortedRouteNodes.some(\n (node) =>\n routePiecesByPath[node.routePath!]?.component ||\n routePiecesByPath[node.routePath!]?.errorComponent ||\n routePiecesByPath[node.routePath!]?.pendingComponent,\n ),\n })\n .filter((d) => d[1])\n .map((d) => d[0])\n\n const virtualRouteNodes = sortedRouteNodes.filter((d) => d.isVirtual)\n\n function getImportPath(node: RouteNode) {\n return replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n config.addExtensions,\n ),\n )\n }\n const routeImports = [\n ...config.routeTreeFileHeader,\n `// This file was automatically generated by TanStack Router.\n// You should NOT make any changes in this file as it will be overwritten.\n// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.`,\n imports.length\n ? `import { ${imports.join(', ')} } from '${ROUTE_TEMPLATE.fullPkg}'\\n`\n : '',\n '// Import Routes',\n [\n `import { Route as rootRoute } from './${getImportPath(rootRouteNode)}'`,\n ...sortedRouteNodes\n .filter((d) => !d.isVirtual)\n .map((node) => {\n return `import { Route as ${\n node.variableName\n }Import } from './${getImportPath(node)}'`\n }),\n ].join('\\n'),\n virtualRouteNodes.length ? '// Create Virtual Routes' : '',\n virtualRouteNodes\n .map((node) => {\n return `const ${\n node.variableName\n }Import = createFileRoute('${node.routePath}')()`\n })\n .join('\\n'),\n '// Create/Update Routes',\n sortedRouteNodes\n .map((node) => {\n const loaderNode = routePiecesByPath[node.routePath!]?.loader\n const componentNode = routePiecesByPath[node.routePath!]?.component\n const errorComponentNode =\n routePiecesByPath[node.routePath!]?.errorComponent\n const pendingComponentNode =\n routePiecesByPath[node.routePath!]?.pendingComponent\n const lazyComponentNode = routePiecesByPath[node.routePath!]?.lazy\n\n return [\n `const ${node.variableName}Route = ${node.variableName}Import.update({\n ${[\n `id: '${node.path}'`,\n !node.isNonPath ? `path: '${node.cleanedPath}'` : undefined,\n `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`,\n ]\n .filter(Boolean)\n .join(',')}\n }${TYPES_DISABLED ? '' : '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 config.addExtensions,\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 config.addExtensions,\n ),\n )}'), '${d[0]}')`\n })\n .join('\\n,')}\n })`\n : '',\n lazyComponentNode\n ? `.lazy(() => import('./${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(\n config.routesDirectory,\n lazyComponentNode.filePath,\n ),\n ),\n config.addExtensions,\n ),\n )}').then((d) => d.Route))`\n : '',\n ].join('')\n })\n .join('\\n\\n'),\n ...(TYPES_DISABLED\n ? []\n : [\n '// Populate the FileRoutesByPath interface',\n `declare module '${ROUTE_TEMPLATE.fullPkg}' {\n interface FileRoutesByPath {\n ${routeNodes\n .map((routeNode) => {\n const filePathId = routeNode.routePath\n\n return `'${filePathId}': {\n id: '${filePathId}'\n path: '${inferPath(routeNode)}'\n fullPath: '${inferFullPath(routeNode)}'\n preLoaderRoute: typeof ${routeNode.variableName}Import\n parentRoute: typeof ${\n routeNode.isVirtualParentRequired\n ? `${routeNode.parent?.variableName}Route`\n : routeNode.parent?.variableName\n ? `${routeNode.parent.variableName}Import`\n : 'rootRoute'\n }\n }`\n })\n .join('\\n')}\n }\n}`,\n ]),\n '// Create and export the route tree',\n routeConfigChildrenText,\n ...(TYPES_DISABLED\n ? []\n : [\n `export interface FileRoutesByFullPath {\n ${[...createRouteNodesByFullPath(routeNodes).entries()].map(\n ([fullPath, routeNode]) => {\n return `'${fullPath}': typeof ${getResolvedRouteNodeVariableName(routeNode)}`\n },\n )}\n}`,\n `export interface FileRoutesByTo {\n ${[...createRouteNodesByTo(routeNodes).entries()].map(([to, routeNode]) => {\n return `'${to}': typeof ${getResolvedRouteNodeVariableName(routeNode)}`\n })}\n}`,\n `export interface FileRoutesById {\n '__root__': typeof rootRoute,\n ${[...createRouteNodesById(routeNodes).entries()].map(([id, routeNode]) => {\n return `'${id}': typeof ${getResolvedRouteNodeVariableName(routeNode)}`\n })}\n}`,\n `export interface FileRouteTypes {\n fileRoutesByFullPath: FileRoutesByFullPath\n fullPaths: ${routeNodes.length > 0 ? [...createRouteNodesByFullPath(routeNodes).keys()].map((fullPath) => `'${fullPath}'`).join('|') : 'never'}\n fileRoutesByTo: FileRoutesByTo\n to: ${routeNodes.length > 0 ? [...createRouteNodesByTo(routeNodes).keys()].map((to) => `'${to}'`).join('|') : 'never'}\n id: ${[`'__root__'`, ...[...createRouteNodesById(routeNodes).keys()].map((id) => `'${id}'`)].join('|')}\n fileRoutesById: FileRoutesById\n}`,\n `export interface RootRouteChildren {\n ${routeTree.map((child) => `${child.variableName}Route: typeof ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`,\n ]),\n `const rootRouteChildren${TYPES_DISABLED ? '' : ': RootRouteChildren'} = {\n ${routeTree.map((child) => `${child.variableName}Route: ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`,\n `export const routeTree = rootRoute._addFileChildren(rootRouteChildren)${TYPES_DISABLED ? '' : '._addFileTypes<FileRouteTypes>()'}`,\n ...config.routeTreeFileFooter,\n ]\n .filter(Boolean)\n .join('\\n\\n')\n\n const createRouteManifest = () => {\n const routesManifest = {\n __root__: {\n filePath: rootRouteNode.filePath,\n children: routeTree.map((d) => d.routePath),\n },\n ...Object.fromEntries(\n routeNodes.map((d) => {\n const filePathId = d.routePath\n\n return [\n filePathId,\n {\n filePath: d.filePath,\n parent: d.parent?.routePath ? d.parent.routePath : undefined,\n children: d.children?.map((childRoute) => childRoute.routePath),\n },\n ]\n }),\n ),\n }\n\n return JSON.stringify(\n {\n routes: routesManifest,\n },\n null,\n 2,\n )\n }\n\n const includeManifest = ['react', 'solid']\n const routeConfigFileContent =\n config.disableManifestGeneration || !includeManifest.includes(config.target)\n ? routeImports\n : [\n routeImports,\n '\\n',\n '/* ROUTE_MANIFEST_START',\n createRouteManifest(),\n 'ROUTE_MANIFEST_END */',\n ].join('\\n')\n\n if (!checkLatest()) return\n\n const existingRouteTreeContent = await fsp\n .readFile(path.resolve(config.generatedRouteTree), 'utf-8')\n .catch((err) => {\n if (err.code === 'ENOENT') {\n return ''\n }\n\n throw err\n })\n\n if (!checkLatest()) return\n\n // Ensure the directory exists\n await fsp.mkdir(path.dirname(path.resolve(config.generatedRouteTree)), {\n recursive: true,\n })\n\n if (!checkLatest()) return\n\n // Write the route tree file, if it has changed\n const routeTreeWriteResult = await writeIfDifferent(\n path.resolve(config.generatedRouteTree),\n config.enableRouteTreeFormatting\n ? await format(existingRouteTreeContent, config)\n : existingRouteTreeContent,\n config.enableRouteTreeFormatting\n ? await format(routeConfigFileContent, config)\n : routeConfigFileContent,\n {\n beforeWrite: () => {\n logger.log(`🟡 Updating ${config.generatedRouteTree}`)\n },\n },\n )\n if (routeTreeWriteResult && !checkLatest()) {\n return\n }\n\n logger.log(\n `✅ Processed ${routeNodes.length === 1 ? 'route' : 'routes'} in ${\n Date.now() - start\n }ms`,\n )\n}\n\n// function removeTrailingUnderscores(s?: string) {\n// return s?.replaceAll(/(_$)/gi, '').replaceAll(/(_\\/)/gi, '/')\n// }\n\nfunction removeGroups(s: string) {\n return s.replace(possiblyNestedRouteGroupPatternRegex, '')\n}\n\n/**\n * The `node.path` is used as the `id` in the route definition.\n * This function checks if the given node has a parent and if so, it determines the correct path for the given node.\n * @param node - The node to determine the path for.\n * @returns The correct path for the given node.\n */\nfunction determineNodePath(node: RouteNode) {\n return (node.path = node.parent\n ? node.routePath?.replace(node.parent.routePath ?? '', '') || '/'\n : node.routePath)\n}\n\n/**\n * Removes the last segment from a given path. Segments are considered to be separated by a '/'.\n *\n * @param {string} routePath - The path from which to remove the last segment. Defaults to '/'.\n * @returns {string} The path with the last segment removed.\n * @example\n * removeLastSegmentFromPath('/workspace/_auth/foo') // '/workspace/_auth'\n */\nexport function removeLastSegmentFromPath(routePath: string = '/'): string {\n const segments = routePath.split('/')\n segments.pop() // Remove the last segment\n return segments.join('/')\n}\n\n/**\n * Removes all segments from a given path that start with an underscore ('_').\n *\n * @param {string} routePath - The path from which to remove segments. Defaults to '/'.\n * @returns {string} The path with all underscore-prefixed segments removed.\n * @example\n * removeLayoutSegments('/workspace/_auth/foo') // '/workspace/foo'\n */\nfunction removeLayoutSegments(routePath: string = '/'): string {\n const segments = routePath.split('/')\n const newSegments = segments.filter((segment) => !segment.startsWith('_'))\n return newSegments.join('/')\n}\n\nexport function hasParentRoute(\n routes: Array<RouteNode>,\n node: 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\n const segments = routePathToCheck.split('/')\n segments.pop() // Remove the last segment\n const parentRoutePath = segments.join('/')\n\n return hasParentRoute(routes, node, parentRoutePath)\n}\n\n/**\n * Gets the final variable name for a route\n */\nexport const getResolvedRouteNodeVariableName = (\n routeNode: RouteNode,\n): string => {\n return routeNode.children?.length\n ? `${routeNode.variableName}RouteWithChildren`\n : `${routeNode.variableName}Route`\n}\n\n/**\n * Creates a map from fullPath to routeNode\n */\nexport const createRouteNodesByFullPath = (\n routeNodes: Array<RouteNode>,\n): Map<string, RouteNode> => {\n return new Map(\n routeNodes.map((routeNode) => [inferFullPath(routeNode), routeNode]),\n )\n}\n\n/**\n * Create a map from 'to' to a routeNode\n */\nexport const createRouteNodesByTo = (\n routeNodes: Array<RouteNode>,\n): Map<string, RouteNode> => {\n return new Map(\n dedupeBranchesAndIndexRoutes(routeNodes).map((routeNode) => [\n inferTo(routeNode),\n routeNode,\n ]),\n )\n}\n\n/**\n * Create a map from 'id' to a routeNode\n */\nexport const createRouteNodesById = (\n routeNodes: Array<RouteNode>,\n): Map<string, RouteNode> => {\n return new Map(\n routeNodes.map((routeNode) => {\n const id = routeNode.routePath ?? ''\n return [id, routeNode]\n }),\n )\n}\n\n/**\n * Infers the full path for use by TS\n */\nexport const inferFullPath = (routeNode: RouteNode): string => {\n const fullPath = removeGroups(\n removeUnderscores(removeLayoutSegments(routeNode.routePath)) ?? '',\n )\n\n return routeNode.cleanedPath === '/' ? fullPath : fullPath.replace(/\\/$/, '')\n}\n\n/**\n * Infers the path for use by TS\n */\nexport const inferPath = (routeNode: RouteNode): string => {\n return routeNode.cleanedPath === '/'\n ? routeNode.cleanedPath\n : (routeNode.cleanedPath?.replace(/\\/$/, '') ?? '')\n}\n\n/**\n * Infers to path\n */\nexport const inferTo = (routeNode: RouteNode): string => {\n const fullPath = inferFullPath(routeNode)\n\n if (fullPath === '/') return fullPath\n\n return fullPath.replace(/\\/$/, '')\n}\n\n/**\n * Dedupes branches and index routes\n */\nexport const dedupeBranchesAndIndexRoutes = (\n routes: Array<RouteNode>,\n): Array<RouteNode> => {\n return routes.filter((route) => {\n if (route.children?.find((child) => child.cleanedPath === '/')) return false\n return true\n })\n}\n\nfunction checkUnique<TElement>(routes: Array<TElement>, key: keyof TElement) {\n // Check no two routes have the same `key`\n // if they do, throw an error with the conflicting filePaths\n const keys = routes.map((d) => d[key])\n const uniqueKeys = new Set(keys)\n if (keys.length !== uniqueKeys.size) {\n const duplicateKeys = keys.filter((d, i) => keys.indexOf(d) !== i)\n const conflictingFiles = routes.filter((d) =>\n duplicateKeys.includes(d[key]),\n )\n return conflictingFiles\n }\n return undefined\n}\n\nfunction checkRouteFullPathUniqueness(\n _routes: Array<RouteNode>,\n config: Config,\n) {\n const routes = _routes.map((d) => {\n const inferredFullPath = inferFullPath(d)\n return { ...d, inferredFullPath }\n })\n\n const conflictingFiles = checkUnique(routes, 'inferredFullPath')\n\n if (conflictingFiles !== undefined) {\n const errorMessage = `Conflicting configuration paths were found for the following route${conflictingFiles.length > 1 ? 's' : ''}: ${conflictingFiles\n .map((p) => `\"${p.inferredFullPath}\"`)\n .join(', ')}.\nPlease ensure each route has a unique full path.\nConflicting files: \\n ${conflictingFiles.map((d) => path.resolve(config.routesDirectory, d.filePath)).join('\\n ')}\\n`\n throw new Error(errorMessage)\n }\n}\n\nfunction checkStartAPIRoutes(_routes: Array<RouteNode>, config: Config) {\n if (_routes.length === 0) {\n return []\n }\n\n // Make sure these are valid URLs\n // Route Groups and Layout Routes aren't being removed since\n // you may want to have an API route that starts with an underscore\n // or be wrapped in parentheses\n const routes = _routes.map((d) => {\n const routePath = removeTrailingSlash(d.routePath ?? '')\n return { ...d, routePath }\n })\n\n const conflictingFiles = checkUnique(routes, 'routePath')\n\n if (conflictingFiles !== undefined) {\n const errorMessage = `Conflicting configuration paths were found for the following API route${conflictingFiles.length > 1 ? 's' : ''}: ${conflictingFiles\n .map((p) => `\"${p}\"`)\n .join(', ')}.\n Please ensure each API route has a unique route path.\nConflicting files: \\n ${conflictingFiles.map((d) => path.resolve(config.routesDirectory, d.filePath)).join('\\n ')}\\n`\n throw new Error(errorMessage)\n }\n\n return routes\n}\n\nexport type StartAPIRoutePathSegment = {\n value: string\n type: 'path' | 'param' | 'splat'\n}\n\n/**\n * This function takes in a path in the format accepted by TanStack Router\n * and returns an array of path segments that can be used to generate\n * the pathname of the TanStack Start API route.\n *\n * @param src\n * @returns\n */\nexport function startAPIRouteSegmentsFromTSRFilePath(\n src: string,\n config: Config,\n): Array<StartAPIRoutePathSegment> {\n const routePath = determineInitialRoutePath(src)\n\n const parts = routePath\n .replaceAll('.', '/')\n .split('/')\n .filter((p) => !!p && p !== config.indexToken)\n const segments: Array<StartAPIRoutePathSegment> = parts.map((part) => {\n if (part.startsWith('$')) {\n if (part === '$') {\n return { value: part, type: 'splat' }\n }\n\n part.replaceAll('$', '')\n return { value: part, type: 'param' }\n }\n\n return { value: part, type: 'path' }\n })\n\n return segments\n}\n"],"names":["getTargetTemplate","logging","virtualGetRouteNodes","physicalGetRouteNodes","rootPathId","multiSortBy","fs","fillTemplate","writeIfDifferent","resetRegex","trimPathLeft","removeUnderscores","routePathToVariable","defaultAPIRouteTemplate","children","replaceBackslash","removeExt","fsp","format","removeTrailingSlash","determineInitialRoutePath"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generator.cjs","sources":["../../src/generator.ts"],"sourcesContent":["import path from 'node:path'\nimport * as fs from 'node:fs'\nimport * as fsp from 'node:fs/promises'\nimport {\n format,\n logging,\n multiSortBy,\n removeExt,\n removeUnderscores,\n replaceBackslash,\n resetRegex,\n routePathToVariable,\n trimPathLeft,\n writeIfDifferent,\n} from './utils'\nimport { getRouteNodes as physicalGetRouteNodes } from './filesystem/physical/getRouteNodes'\nimport { getRouteNodes as virtualGetRouteNodes } from './filesystem/virtual/getRouteNodes'\nimport { rootPathId } from './filesystem/physical/rootPathId'\nimport { fillTemplate, getTargetTemplate } from './template'\nimport type { FsRouteType, GetRouteNodesResult, RouteNode } from './types'\nimport type { Config } from './config'\n\n// Maybe import this from `@tanstack/router-core` in the future???\nconst rootRouteId = '__root__'\n\nlet latestTask = 0\nconst routeGroupPatternRegex = /\\(.+\\)/g\nconst possiblyNestedRouteGroupPatternRegex = /\\([^/]+\\)\\/?/g\n\nlet isFirst = false\nlet skipMessage = false\n\ntype RouteSubNode = {\n component?: RouteNode\n errorComponent?: RouteNode\n pendingComponent?: RouteNode\n loader?: RouteNode\n lazy?: RouteNode\n}\n\nexport async function generator(config: Config, root: string) {\n const ROUTE_TEMPLATE = getTargetTemplate(config.target)\n const logger = logging({ disabled: config.disableLogging })\n logger.log('')\n\n if (!isFirst) {\n logger.log('♻️ Generating routes...')\n isFirst = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n logger.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 const TYPES_DISABLED = config.disableTypes\n\n let getRouteNodesResult: GetRouteNodesResult\n\n if (config.virtualRouteConfig) {\n getRouteNodesResult = await virtualGetRouteNodes(config, root)\n } else {\n getRouteNodesResult = await physicalGetRouteNodes(config, root)\n }\n\n const { rootRouteNode, routeNodes: beforeRouteNodes } = getRouteNodesResult\n if (rootRouteNode === undefined) {\n let errorMessage = `rootRouteNode must not be undefined. Make sure you've added your root route into the route-tree.`\n if (!config.virtualRouteConfig) {\n errorMessage += `\\nMake sure that you add a \"${rootPathId}.${config.disableTypes ? 'js' : 'tsx'}\" file to your routes directory.\\nAdd the file in: \"${config.routesDirectory}/${rootPathId}.${config.disableTypes ? 'js' : 'tsx'}\"`\n }\n throw new Error(errorMessage)\n }\n\n const preRouteNodes = multiSortBy(beforeRouteNodes, [\n (d) => (d.routePath === '/' ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) =>\n d.filePath.match(new RegExp(`[./]${config.indexToken}[.]`)) ? 1 : -1,\n (d) =>\n d.filePath.match(\n /[./](component|errorComponent|pendingComponent|loader|lazy)[.]/,\n )\n ? 1\n : -1,\n (d) =>\n d.filePath.match(new RegExp(`[./]${config.routeToken}[.]`)) ? -1 : 1,\n (d) => (d.routePath?.endsWith('/') ? -1 : 1),\n (d) => d.routePath,\n ]).filter((d) => ![`/${rootPathId}`].includes(d.routePath || ''))\n\n const routeTree: Array<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 const routeNodes: Array<RouteNode> = []\n\n // the handleRootNode function is not being collapsed into the handleNode function\n // because it requires only a subset of the logic that the handleNode function requires\n // and it's easier to read and maintain this way\n const handleRootNode = async (node?: RouteNode) => {\n if (!node) {\n // currently this is not being handled, but it could be in the future\n // for example to handle a virtual root route\n return\n }\n\n // from here on, we are only handling the root node that's present in the file system\n const routeCode = fs.readFileSync(node.fullPath, 'utf-8')\n\n if (!routeCode) {\n const _rootTemplate = ROUTE_TEMPLATE.rootRoute\n const replaced = await fillTemplate(config, _rootTemplate.template(), {\n tsrImports: _rootTemplate.imports.tsrImports(),\n tsrPath: rootPathId,\n tsrExportStart: _rootTemplate.imports.tsrExportStart(),\n tsrExportEnd: _rootTemplate.imports.tsrExportEnd(),\n })\n\n await writeIfDifferent(\n node.fullPath,\n '', // Empty string because the file doesn't exist yet\n replaced,\n {\n beforeWrite: () => {\n logger.log(`🟡 Creating ${node.fullPath}`)\n },\n },\n )\n }\n }\n\n await handleRootNode(rootRouteNode)\n\n const handleNode = async (node: RouteNode) => {\n // Do not remove this as we need to set the lastIndex to 0 as it\n // is necessary to reset the regex's index when using the global flag\n // otherwise it might not match the next time it's used\n resetRegex(routeGroupPatternRegex)\n\n let parentRoute = hasParentRoute(routeNodes, node, node.routePath)\n\n // if the parent route is a virtual parent route, we need to find the real parent route\n if (parentRoute?.isVirtualParentRoute && parentRoute.children?.length) {\n // only if this sub-parent route returns a valid parent route, we use it, if not leave it as it\n const possibleParentRoute = hasParentRoute(\n parentRoute.children,\n node,\n node.routePath,\n )\n if (possibleParentRoute) {\n parentRoute = possibleParentRoute\n }\n }\n\n if (parentRoute) node.parent = parentRoute\n\n node.path = determineNodePath(node)\n\n const trimmedPath = trimPathLeft(node.path ?? '')\n\n const split = trimmedPath.split('/')\n const lastRouteSegment = split[split.length - 1] ?? trimmedPath\n\n node.isNonPath =\n lastRouteSegment.startsWith('_') ||\n routeGroupPatternRegex.test(lastRouteSegment)\n\n node.cleanedPath = removeGroups(\n removeUnderscores(removeLayoutSegments(node.path)) ?? '',\n )\n\n // Ensure the boilerplate for the route exists, which can be skipped for virtual parent routes and virtual routes\n if (!node.isVirtualParentRoute && !node.isVirtual) {\n const routeCode = fs.readFileSync(node.fullPath, 'utf-8')\n\n const escapedRoutePath = node.routePath?.replaceAll('$', '$$') ?? ''\n\n let replaced = routeCode\n\n const tRouteTemplate = ROUTE_TEMPLATE.route\n const tLazyRouteTemplate = ROUTE_TEMPLATE.lazyRoute\n\n if (!routeCode) {\n // Creating a new lazy route file\n if (node._fsRouteType === 'lazy') {\n // Check by default check if the user has a specific lazy route template\n // If not, check if the user has a route template and use that instead\n replaced = await fillTemplate(\n config,\n (config.customScaffolding?.lazyRouteTemplate ||\n config.customScaffolding?.routeTemplate) ??\n tLazyRouteTemplate.template(),\n {\n tsrImports: tLazyRouteTemplate.imports.tsrImports(),\n tsrPath: escapedRoutePath.replaceAll(/\\{(.+)\\}/gm, '$1'),\n tsrExportStart:\n tLazyRouteTemplate.imports.tsrExportStart(escapedRoutePath),\n tsrExportEnd: tLazyRouteTemplate.imports.tsrExportEnd(),\n },\n )\n } else if (\n // Creating a new normal route file\n (['layout', 'static'] satisfies Array<FsRouteType>).some(\n (d) => d === node._fsRouteType,\n ) ||\n (\n [\n 'component',\n 'pendingComponent',\n 'errorComponent',\n 'loader',\n ] satisfies Array<FsRouteType>\n ).every((d) => d !== node._fsRouteType)\n ) {\n replaced = await fillTemplate(\n config,\n config.customScaffolding?.routeTemplate ??\n tRouteTemplate.template(),\n {\n tsrImports: tRouteTemplate.imports.tsrImports(),\n tsrPath: escapedRoutePath.replaceAll(/\\{(.+)\\}/gm, '$1'),\n tsrExportStart:\n tRouteTemplate.imports.tsrExportStart(escapedRoutePath),\n tsrExportEnd: tRouteTemplate.imports.tsrExportEnd(),\n },\n )\n }\n } else if (config.verboseFileRoutes === false) {\n // Check if the route file has a Route export\n if (\n !routeCode\n .split('\\n')\n .some((line) => line.trim().startsWith('export const Route'))\n ) {\n return\n }\n\n // Update the existing route file\n replaced = routeCode\n .replace(\n /(FileRoute\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (_, p1, __, p3) => `${p1}${escapedRoutePath}${p3}`,\n )\n .replace(\n new RegExp(\n `(import\\\\s*\\\\{)(.*)(create(Lazy)?FileRoute)(.*)(\\\\}\\\\s*from\\\\s*['\"]@tanstack\\\\/${ROUTE_TEMPLATE.subPkg}['\"])`,\n 'gs',\n ),\n (_, p1, p2, ___, ____, p5, p6) => {\n const beforeCreateFileRoute = () => {\n if (!p2) return ''\n\n let trimmed = p2.trim()\n\n if (trimmed.endsWith(',')) {\n trimmed = trimmed.slice(0, -1)\n }\n\n return trimmed\n }\n\n const afterCreateFileRoute = () => {\n if (!p5) return ''\n\n let trimmed = p5.trim()\n\n if (trimmed.startsWith(',')) {\n trimmed = trimmed.slice(1)\n }\n\n return trimmed\n }\n\n const newImport = () => {\n const before = beforeCreateFileRoute()\n const after = afterCreateFileRoute()\n\n if (!before) return after\n\n if (!after) return before\n\n return `${before},${after}`\n }\n\n const middle = newImport()\n\n if (middle === '') return ''\n\n return `${p1} ${newImport()} ${p6}`\n },\n )\n .replace(\n /create(Lazy)?FileRoute(\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (_, __, p2, ___, p4) =>\n `${node._fsRouteType === 'lazy' ? 'createLazyFileRoute' : 'createFileRoute'}`,\n )\n } else {\n // Check if the route file has a Route export\n if (\n !routeCode\n .split('\\n')\n .some((line) => line.trim().startsWith('export const Route'))\n ) {\n return\n }\n\n // Update the existing route file\n replaced = routeCode\n // fix wrong ids\n .replace(\n /(FileRoute\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (_, p1, __, p3) => `${p1}${escapedRoutePath}${p3}`,\n )\n // fix missing ids\n .replace(\n /((FileRoute)(\\s*)(\\({))/g,\n (_, __, p2, p3, p4) => `${p2}('${escapedRoutePath}')${p3}${p4}`,\n )\n .replace(\n new RegExp(\n `(import\\\\s*\\\\{.*)(create(Lazy)?FileRoute)(.*\\\\}\\\\s*from\\\\s*['\"]@tanstack\\\\/${ROUTE_TEMPLATE.subPkg}['\"])`,\n 'gs',\n ),\n (_, p1, __, ___, p4) =>\n `${p1}${node._fsRouteType === 'lazy' ? 'createLazyFileRoute' : 'createFileRoute'}${p4}`,\n )\n .replace(\n /create(Lazy)?FileRoute(\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (_, __, p2, ___, p4) =>\n `${node._fsRouteType === 'lazy' ? 'createLazyFileRoute' : 'createFileRoute'}${p2}${escapedRoutePath}${p4}`,\n )\n\n // check whether the import statement is already present\n const regex = new RegExp(\n `(import\\\\s*\\\\{.*)(create(Lazy)?FileRoute)(.*\\\\}\\\\s*from\\\\s*['\"]@tanstack\\\\/${ROUTE_TEMPLATE.subPkg}['\"])`,\n 'gm',\n )\n if (!replaced.match(regex)) {\n replaced = [\n `import { ${node._fsRouteType === 'lazy' ? 'createLazyFileRoute' : 'createFileRoute'} } from '@tanstack/${ROUTE_TEMPLATE.subPkg}'`,\n ...replaced.split('\\n'),\n ].join('\\n')\n }\n }\n\n await writeIfDifferent(node.fullPath, routeCode, replaced, {\n beforeWrite: () => {\n logger.log(`🟡 Updating ${node.fullPath}`)\n },\n })\n }\n\n if (\n !node.isVirtual &&\n (\n [\n 'lazy',\n 'loader',\n 'component',\n 'pendingComponent',\n 'errorComponent',\n ] satisfies Array<FsRouteType>\n ).some((d) => d === node._fsRouteType)\n ) {\n routePiecesByPath[node.routePath!] =\n routePiecesByPath[node.routePath!] || {}\n\n routePiecesByPath[node.routePath!]![\n node._fsRouteType === 'lazy'\n ? 'lazy'\n : node._fsRouteType === 'loader'\n ? 'loader'\n : node._fsRouteType === 'errorComponent'\n ? 'errorComponent'\n : node._fsRouteType === 'pendingComponent'\n ? 'pendingComponent'\n : 'component'\n ] = node\n\n const anchorRoute = routeNodes.find((d) => d.routePath === node.routePath)\n\n if (!anchorRoute) {\n await handleNode({\n ...node,\n isVirtual: true,\n _fsRouteType: 'static',\n })\n }\n return\n }\n\n const cleanedPathIsEmpty = (node.cleanedPath || '').length === 0\n const nonPathRoute =\n node._fsRouteType === 'pathless_layout' && node.isNonPath\n\n node.isVirtualParentRequired =\n node._fsRouteType === 'pathless_layout' || nonPathRoute\n ? !cleanedPathIsEmpty\n : false\n\n if (!node.isVirtual && node.isVirtualParentRequired) {\n const parentRoutePath = removeLastSegmentFromPath(node.routePath) || '/'\n const parentVariableName = routePathToVariable(parentRoutePath)\n\n const anchorRoute = routeNodes.find(\n (d) => d.routePath === parentRoutePath,\n )\n\n if (!anchorRoute) {\n const parentNode: RouteNode = {\n ...node,\n path: removeLastSegmentFromPath(node.path) || '/',\n filePath: removeLastSegmentFromPath(node.filePath) || '/',\n fullPath: removeLastSegmentFromPath(node.fullPath) || '/',\n routePath: parentRoutePath,\n variableName: parentVariableName,\n isVirtual: true,\n _fsRouteType: 'layout', // layout since this route will wrap other routes\n isVirtualParentRoute: true,\n isVirtualParentRequired: false,\n }\n\n parentNode.children = parentNode.children ?? []\n parentNode.children.push(node)\n\n node.parent = parentNode\n\n if (node._fsRouteType === 'pathless_layout') {\n // since `node.path` is used as the `id` on the route definition, we need to update it\n node.path = determineNodePath(node)\n }\n\n await handleNode(parentNode)\n } else {\n anchorRoute.children = anchorRoute.children ?? []\n anchorRoute.children.push(node)\n\n node.parent = anchorRoute\n }\n }\n\n if (node.parent) {\n if (!node.isVirtualParentRequired) {\n node.parent.children = node.parent.children ?? []\n node.parent.children.push(node)\n }\n } else {\n routeTree.push(node)\n }\n\n routeNodes.push(node)\n }\n\n for (const node of preRouteNodes) {\n await handleNode(node)\n }\n\n // This is run against the `preRouteNodes` array since it\n // has the flattened Route nodes and not the full tree\n // Since TSR allows multiple way of defining a route,\n // we need to ensure that a user hasn't defined the\n // same route in multiple ways (i.e. `flat`, `nested`, `virtual`)\n checkRouteFullPathUniqueness(\n preRouteNodes.filter(\n (d) => d.children === undefined && 'lazy' !== d._fsRouteType,\n ),\n config,\n )\n\n function buildRouteTreeConfig(nodes: Array<RouteNode>, depth = 1): string {\n const children = nodes.map((node) => {\n if (node._fsRouteType === '__root') {\n return\n }\n\n if (node._fsRouteType === 'pathless_layout' && !node.children?.length) {\n return\n }\n\n const route = `${node.variableName}Route`\n\n if (node.children?.length) {\n const childConfigs = buildRouteTreeConfig(node.children, depth + 1)\n\n const childrenDeclaration = TYPES_DISABLED\n ? ''\n : `interface ${route}Children {\n ${node.children.map((child) => `${child.variableName}Route: typeof ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`\n\n const children = `const ${route}Children${TYPES_DISABLED ? '' : `: ${route}Children`} = {\n ${node.children.map((child) => `${child.variableName}Route: ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`\n\n const routeWithChildren = `const ${route}WithChildren = ${route}._addFileChildren(${route}Children)`\n\n return [\n childConfigs,\n childrenDeclaration,\n children,\n routeWithChildren,\n ].join('\\n\\n')\n }\n\n return undefined\n })\n\n return children.filter(Boolean).join('\\n\\n')\n }\n\n const routeConfigChildrenText = buildRouteTreeConfig(routeTree)\n\n const sortedRouteNodes = multiSortBy(routeNodes, [\n (d) => (d.routePath?.includes(`/${rootPathId}`) ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.routePath?.endsWith(config.indexToken) ? -1 : 1),\n (d) => d,\n ])\n\n const typeImports = Object.entries({\n // Used for augmentation of regular routes\n CreateFileRoute:\n config.verboseFileRoutes === false &&\n sortedRouteNodes.some(\n (d) => isRouteNodeValidForAugmentation(d) && d._fsRouteType !== 'lazy',\n ),\n // Used for augmentation of lazy (`.lazy`) routes\n CreateLazyFileRoute:\n config.verboseFileRoutes === false &&\n sortedRouteNodes.some(\n (node) =>\n routePiecesByPath[node.routePath!]?.lazy &&\n isRouteNodeValidForAugmentation(node),\n ),\n // Used in the process of augmenting the routes\n FileRoutesByPath:\n config.verboseFileRoutes === false &&\n sortedRouteNodes.some((d) => isRouteNodeValidForAugmentation(d)),\n })\n .filter((d) => d[1])\n .map((d) => d[0])\n .sort((a, b) => a.localeCompare(b))\n\n const imports = Object.entries({\n createFileRoute: sortedRouteNodes.some((d) => d.isVirtual),\n lazyFn: sortedRouteNodes.some(\n (node) => routePiecesByPath[node.routePath!]?.loader,\n ),\n lazyRouteComponent: sortedRouteNodes.some(\n (node) =>\n routePiecesByPath[node.routePath!]?.component ||\n routePiecesByPath[node.routePath!]?.errorComponent ||\n routePiecesByPath[node.routePath!]?.pendingComponent,\n ),\n })\n .filter((d) => d[1])\n .map((d) => d[0])\n\n const virtualRouteNodes = sortedRouteNodes.filter((d) => d.isVirtual)\n\n function getImportPath(node: RouteNode) {\n return replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n config.addExtensions,\n ),\n )\n }\n\n const routeImports = [\n ...config.routeTreeFileHeader,\n `// This file was automatically generated by TanStack Router.\n// You should NOT make any changes in this file as it will be overwritten.\n// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.`,\n [\n imports.length\n ? `import { ${imports.join(', ')} } from '${ROUTE_TEMPLATE.fullPkg}'`\n : '',\n !TYPES_DISABLED && typeImports.length\n ? `import type { ${typeImports.join(', ')} } from '${ROUTE_TEMPLATE.fullPkg}'`\n : '',\n ]\n .filter(Boolean)\n .join('\\n'),\n '// Import Routes',\n [\n `import { Route as rootRoute } from './${getImportPath(rootRouteNode)}'`,\n ...sortedRouteNodes\n .filter((d) => !d.isVirtual)\n .map((node) => {\n return `import { Route as ${\n node.variableName\n }RouteImport } from './${getImportPath(node)}'`\n }),\n ].join('\\n'),\n virtualRouteNodes.length ? '// Create Virtual Routes' : '',\n virtualRouteNodes\n .map((node) => {\n return `const ${\n node.variableName\n }RouteImport = createFileRoute('${node.routePath}')()`\n })\n .join('\\n'),\n '// Create/Update Routes',\n sortedRouteNodes\n .map((node) => {\n const loaderNode = routePiecesByPath[node.routePath!]?.loader\n const componentNode = routePiecesByPath[node.routePath!]?.component\n const errorComponentNode =\n routePiecesByPath[node.routePath!]?.errorComponent\n const pendingComponentNode =\n routePiecesByPath[node.routePath!]?.pendingComponent\n const lazyComponentNode = routePiecesByPath[node.routePath!]?.lazy\n\n return [\n [\n `const ${node.variableName}Route = ${node.variableName}RouteImport.update({\n ${[\n `id: '${node.path}'`,\n !node.isNonPath ? `path: '${node.cleanedPath}'` : undefined,\n `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`,\n ]\n .filter(Boolean)\n .join(',')}\n }${TYPES_DISABLED ? '' : '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 config.addExtensions,\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 config.addExtensions,\n ),\n )}'), '${d[0]}')`\n })\n .join('\\n,')}\n })`\n : '',\n lazyComponentNode\n ? `.lazy(() => import('./${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(\n config.routesDirectory,\n lazyComponentNode.filePath,\n ),\n ),\n config.addExtensions,\n ),\n )}').then((d) => d.Route))`\n : '',\n ].join(''),\n ].join('\\n\\n')\n })\n .join('\\n\\n'),\n ...(TYPES_DISABLED\n ? []\n : [\n '// Populate the FileRoutesByPath interface',\n `declare module '${ROUTE_TEMPLATE.fullPkg}' {\n interface FileRoutesByPath {\n ${routeNodes\n .map((routeNode) => {\n const filePathId = routeNode.routePath\n\n return `'${filePathId}': {\n id: '${filePathId}'\n path: '${inferPath(routeNode)}'\n fullPath: '${inferFullPath(routeNode)}'\n preLoaderRoute: typeof ${routeNode.variableName}RouteImport\n parentRoute: typeof ${\n routeNode.isVirtualParentRequired\n ? `${routeNode.parent?.variableName}Route`\n : routeNode.parent?.variableName\n ? `${routeNode.parent.variableName}RouteImport`\n : 'rootRoute'\n }\n }`\n })\n .join('\\n')}\n }\n}`,\n ]),\n ...(TYPES_DISABLED\n ? []\n : config.verboseFileRoutes !== false\n ? []\n : [\n `// Add type-safety to the createFileRoute function across the route tree`,\n routeNodes\n .map((routeNode) => {\n function getModuleDeclaration(routeNode?: RouteNode) {\n if (!isRouteNodeValidForAugmentation(routeNode)) {\n return ''\n }\n return `declare module './${getImportPath(routeNode)}' {\n const ${routeNode._fsRouteType === 'lazy' ? 'createLazyFileRoute' : 'createFileRoute'}: ${\n routeNode._fsRouteType === 'lazy'\n ? `CreateLazyFileRoute<FileRoutesByPath['${routeNode.routePath}']['preLoaderRoute']>}`\n : `CreateFileRoute<\n '${routeNode.routePath}',\n FileRoutesByPath['${routeNode.routePath}']['parentRoute'],\n FileRoutesByPath['${routeNode.routePath}']['id'],\n FileRoutesByPath['${routeNode.routePath}']['path'],\n FileRoutesByPath['${routeNode.routePath}']['fullPath']\n >\n }`\n }`\n }\n return (\n getModuleDeclaration(routeNode) +\n getModuleDeclaration(\n routePiecesByPath[routeNode.routePath!]?.lazy,\n )\n )\n })\n .join('\\n'),\n ]),\n '// Create and export the route tree',\n routeConfigChildrenText,\n ...(TYPES_DISABLED\n ? []\n : [\n `export interface FileRoutesByFullPath {\n ${[...createRouteNodesByFullPath(routeNodes).entries()].map(\n ([fullPath, routeNode]) => {\n return `'${fullPath}': typeof ${getResolvedRouteNodeVariableName(routeNode)}`\n },\n )}\n}`,\n `export interface FileRoutesByTo {\n ${[...createRouteNodesByTo(routeNodes).entries()].map(([to, routeNode]) => {\n return `'${to}': typeof ${getResolvedRouteNodeVariableName(routeNode)}`\n })}\n}`,\n `export interface FileRoutesById {\n '${rootRouteId}': typeof rootRoute,\n ${[...createRouteNodesById(routeNodes).entries()].map(([id, routeNode]) => {\n return `'${id}': typeof ${getResolvedRouteNodeVariableName(routeNode)}`\n })}\n}`,\n `export interface FileRouteTypes {\n fileRoutesByFullPath: FileRoutesByFullPath\n fullPaths: ${routeNodes.length > 0 ? [...createRouteNodesByFullPath(routeNodes).keys()].map((fullPath) => `'${fullPath}'`).join('|') : 'never'}\n fileRoutesByTo: FileRoutesByTo\n to: ${routeNodes.length > 0 ? [...createRouteNodesByTo(routeNodes).keys()].map((to) => `'${to}'`).join('|') : 'never'}\n id: ${[`'${rootRouteId}'`, ...[...createRouteNodesById(routeNodes).keys()].map((id) => `'${id}'`)].join('|')}\n fileRoutesById: FileRoutesById\n}`,\n `export interface RootRouteChildren {\n ${routeTree.map((child) => `${child.variableName}Route: typeof ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`,\n ]),\n `const rootRouteChildren${TYPES_DISABLED ? '' : ': RootRouteChildren'} = {\n ${routeTree.map((child) => `${child.variableName}Route: ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`,\n `export const routeTree = rootRoute._addFileChildren(rootRouteChildren)${TYPES_DISABLED ? '' : '._addFileTypes<FileRouteTypes>()'}`,\n ...config.routeTreeFileFooter,\n ]\n .filter(Boolean)\n .join('\\n\\n')\n\n const createRouteManifest = () => {\n const routesManifest = {\n [rootRouteId]: {\n filePath: rootRouteNode.filePath,\n children: routeTree.map((d) => d.routePath),\n },\n ...Object.fromEntries(\n routeNodes.map((d) => {\n const filePathId = d.routePath\n\n return [\n filePathId,\n {\n filePath: d.filePath,\n parent: d.parent?.routePath ? d.parent.routePath : undefined,\n children: d.children?.map((childRoute) => childRoute.routePath),\n },\n ]\n }),\n ),\n }\n\n return JSON.stringify(\n {\n routes: routesManifest,\n },\n null,\n 2,\n )\n }\n\n const includeManifest = ['react', 'solid']\n const routeConfigFileContent =\n config.disableManifestGeneration || !includeManifest.includes(config.target)\n ? routeImports\n : [\n routeImports,\n '\\n',\n '/* ROUTE_MANIFEST_START',\n createRouteManifest(),\n 'ROUTE_MANIFEST_END */',\n ].join('\\n')\n\n if (!checkLatest()) return\n\n const existingRouteTreeContent = await fsp\n .readFile(path.resolve(config.generatedRouteTree), 'utf-8')\n .catch((err) => {\n if (err.code === 'ENOENT') {\n return ''\n }\n\n throw err\n })\n\n if (!checkLatest()) return\n\n // Ensure the directory exists\n await fsp.mkdir(path.dirname(path.resolve(config.generatedRouteTree)), {\n recursive: true,\n })\n\n if (!checkLatest()) return\n\n // Write the route tree file, if it has changed\n const routeTreeWriteResult = await writeIfDifferent(\n path.resolve(config.generatedRouteTree),\n config.enableRouteTreeFormatting\n ? await format(existingRouteTreeContent, config)\n : existingRouteTreeContent,\n config.enableRouteTreeFormatting\n ? await format(routeConfigFileContent, config)\n : routeConfigFileContent,\n {\n beforeWrite: () => {\n logger.log(`🟡 Updating ${config.generatedRouteTree}`)\n },\n },\n )\n if (routeTreeWriteResult && !checkLatest()) {\n return\n }\n\n logger.log(\n `✅ Processed ${routeNodes.length === 1 ? 'route' : 'routes'} in ${\n Date.now() - start\n }ms`,\n )\n}\n\n// function removeTrailingUnderscores(s?: string) {\n// return s?.replaceAll(/(_$)/gi, '').replaceAll(/(_\\/)/gi, '/')\n// }\n\nfunction removeGroups(s: string) {\n return s.replace(possiblyNestedRouteGroupPatternRegex, '')\n}\n\n/**\n * Checks if a given RouteNode is valid for augmenting it with typing based on conditions.\n * Also asserts that the RouteNode is defined.\n *\n * @param routeNode - The RouteNode to check.\n * @returns A boolean indicating whether the RouteNode is defined.\n */\nfunction isRouteNodeValidForAugmentation(\n routeNode?: RouteNode,\n): routeNode is RouteNode {\n if (!routeNode || routeNode.isVirtual) {\n return false\n }\n return true\n}\n\n/**\n * The `node.path` is used as the `id` in the route definition.\n * This function checks if the given node has a parent and if so, it determines the correct path for the given node.\n * @param node - The node to determine the path for.\n * @returns The correct path for the given node.\n */\nfunction determineNodePath(node: RouteNode) {\n return (node.path = node.parent\n ? node.routePath?.replace(node.parent.routePath ?? '', '') || '/'\n : node.routePath)\n}\n\n/**\n * Removes the last segment from a given path. Segments are considered to be separated by a '/'.\n *\n * @param {string} routePath - The path from which to remove the last segment. Defaults to '/'.\n * @returns {string} The path with the last segment removed.\n * @example\n * removeLastSegmentFromPath('/workspace/_auth/foo') // '/workspace/_auth'\n */\nfunction removeLastSegmentFromPath(routePath: string = '/'): string {\n const segments = routePath.split('/')\n segments.pop() // Remove the last segment\n return segments.join('/')\n}\n\n/**\n * Removes all segments from a given path that start with an underscore ('_').\n *\n * @param {string} routePath - The path from which to remove segments. Defaults to '/'.\n * @returns {string} The path with all underscore-prefixed segments removed.\n * @example\n * removeLayoutSegments('/workspace/_auth/foo') // '/workspace/foo'\n */\nfunction removeLayoutSegments(routePath: string = '/'): string {\n const segments = routePath.split('/')\n const newSegments = segments.filter((segment) => !segment.startsWith('_'))\n return newSegments.join('/')\n}\n\nfunction hasParentRoute(\n routes: Array<RouteNode>,\n node: 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\n const segments = routePathToCheck.split('/')\n segments.pop() // Remove the last segment\n const parentRoutePath = segments.join('/')\n\n return hasParentRoute(routes, node, parentRoutePath)\n}\n\n/**\n * Gets the final variable name for a route\n */\nconst getResolvedRouteNodeVariableName = (routeNode: RouteNode): string => {\n return routeNode.children?.length\n ? `${routeNode.variableName}RouteWithChildren`\n : `${routeNode.variableName}Route`\n}\n\n/**\n * Creates a map from fullPath to routeNode\n */\nconst createRouteNodesByFullPath = (\n routeNodes: Array<RouteNode>,\n): Map<string, RouteNode> => {\n return new Map(\n routeNodes.map((routeNode) => [inferFullPath(routeNode), routeNode]),\n )\n}\n\n/**\n * Create a map from 'to' to a routeNode\n */\nconst createRouteNodesByTo = (\n routeNodes: Array<RouteNode>,\n): Map<string, RouteNode> => {\n return new Map(\n dedupeBranchesAndIndexRoutes(routeNodes).map((routeNode) => [\n inferTo(routeNode),\n routeNode,\n ]),\n )\n}\n\n/**\n * Create a map from 'id' to a routeNode\n */\nconst createRouteNodesById = (\n routeNodes: Array<RouteNode>,\n): Map<string, RouteNode> => {\n return new Map(\n routeNodes.map((routeNode) => {\n const id = routeNode.routePath ?? ''\n return [id, routeNode]\n }),\n )\n}\n\n/**\n * Infers the full path for use by TS\n */\nconst inferFullPath = (routeNode: RouteNode): string => {\n const fullPath = removeGroups(\n removeUnderscores(removeLayoutSegments(routeNode.routePath)) ?? '',\n )\n\n return routeNode.cleanedPath === '/' ? fullPath : fullPath.replace(/\\/$/, '')\n}\n\n/**\n * Infers the path for use by TS\n */\nconst inferPath = (routeNode: RouteNode): string => {\n return routeNode.cleanedPath === '/'\n ? routeNode.cleanedPath\n : (routeNode.cleanedPath?.replace(/\\/$/, '') ?? '')\n}\n\n/**\n * Infers to path\n */\nconst inferTo = (routeNode: RouteNode): string => {\n const fullPath = inferFullPath(routeNode)\n\n if (fullPath === '/') return fullPath\n\n return fullPath.replace(/\\/$/, '')\n}\n\n/**\n * Dedupes branches and index routes\n */\nconst dedupeBranchesAndIndexRoutes = (\n routes: Array<RouteNode>,\n): Array<RouteNode> => {\n return routes.filter((route) => {\n if (route.children?.find((child) => child.cleanedPath === '/')) return false\n return true\n })\n}\n\nfunction checkUnique<TElement>(routes: Array<TElement>, key: keyof TElement) {\n // Check no two routes have the same `key`\n // if they do, throw an error with the conflicting filePaths\n const keys = routes.map((d) => d[key])\n const uniqueKeys = new Set(keys)\n if (keys.length !== uniqueKeys.size) {\n const duplicateKeys = keys.filter((d, i) => keys.indexOf(d) !== i)\n const conflictingFiles = routes.filter((d) =>\n duplicateKeys.includes(d[key]),\n )\n return conflictingFiles\n }\n return undefined\n}\n\nfunction checkRouteFullPathUniqueness(\n _routes: Array<RouteNode>,\n config: Config,\n) {\n const routes = _routes.map((d) => {\n const inferredFullPath = inferFullPath(d)\n return { ...d, inferredFullPath }\n })\n\n const conflictingFiles = checkUnique(routes, 'inferredFullPath')\n\n if (conflictingFiles !== undefined) {\n const errorMessage = `Conflicting configuration paths were found for the following route${conflictingFiles.length > 1 ? 's' : ''}: ${conflictingFiles\n .map((p) => `\"${p.inferredFullPath}\"`)\n .join(', ')}.\nPlease ensure each Route has a unique full path.\nConflicting files: \\n ${conflictingFiles.map((d) => path.resolve(config.routesDirectory, d.filePath)).join('\\n ')}\\n`\n throw new Error(errorMessage)\n }\n}\n"],"names":["getTargetTemplate","logging","virtualGetRouteNodes","physicalGetRouteNodes","rootPathId","multiSortBy","fs","fillTemplate","writeIfDifferent","resetRegex","trimPathLeft","removeUnderscores","routePathToVariable","children","replaceBackslash","removeExt","routeNode","fsp","format"],"mappings":"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"}
|
package/dist/cjs/generator.d.cts
CHANGED
|
@@ -1,61 +1,2 @@
|
|
|
1
|
-
import { RouteNode } from './types.cjs';
|
|
2
1
|
import { Config } from './config.cjs';
|
|
3
|
-
export declare const CONSTANTS: {
|
|
4
|
-
APIRouteExportVariable: string;
|
|
5
|
-
};
|
|
6
2
|
export declare function generator(config: Config, root: string): Promise<void>;
|
|
7
|
-
/**
|
|
8
|
-
* Removes the last segment from a given path. Segments are considered to be separated by a '/'.
|
|
9
|
-
*
|
|
10
|
-
* @param {string} routePath - The path from which to remove the last segment. Defaults to '/'.
|
|
11
|
-
* @returns {string} The path with the last segment removed.
|
|
12
|
-
* @example
|
|
13
|
-
* removeLastSegmentFromPath('/workspace/_auth/foo') // '/workspace/_auth'
|
|
14
|
-
*/
|
|
15
|
-
export declare function removeLastSegmentFromPath(routePath?: string): string;
|
|
16
|
-
export declare function hasParentRoute(routes: Array<RouteNode>, node: RouteNode, routePathToCheck: string | undefined): RouteNode | null;
|
|
17
|
-
/**
|
|
18
|
-
* Gets the final variable name for a route
|
|
19
|
-
*/
|
|
20
|
-
export declare const getResolvedRouteNodeVariableName: (routeNode: RouteNode) => string;
|
|
21
|
-
/**
|
|
22
|
-
* Creates a map from fullPath to routeNode
|
|
23
|
-
*/
|
|
24
|
-
export declare const createRouteNodesByFullPath: (routeNodes: Array<RouteNode>) => Map<string, RouteNode>;
|
|
25
|
-
/**
|
|
26
|
-
* Create a map from 'to' to a routeNode
|
|
27
|
-
*/
|
|
28
|
-
export declare const createRouteNodesByTo: (routeNodes: Array<RouteNode>) => Map<string, RouteNode>;
|
|
29
|
-
/**
|
|
30
|
-
* Create a map from 'id' to a routeNode
|
|
31
|
-
*/
|
|
32
|
-
export declare const createRouteNodesById: (routeNodes: Array<RouteNode>) => Map<string, RouteNode>;
|
|
33
|
-
/**
|
|
34
|
-
* Infers the full path for use by TS
|
|
35
|
-
*/
|
|
36
|
-
export declare const inferFullPath: (routeNode: RouteNode) => string;
|
|
37
|
-
/**
|
|
38
|
-
* Infers the path for use by TS
|
|
39
|
-
*/
|
|
40
|
-
export declare const inferPath: (routeNode: RouteNode) => string;
|
|
41
|
-
/**
|
|
42
|
-
* Infers to path
|
|
43
|
-
*/
|
|
44
|
-
export declare const inferTo: (routeNode: RouteNode) => string;
|
|
45
|
-
/**
|
|
46
|
-
* Dedupes branches and index routes
|
|
47
|
-
*/
|
|
48
|
-
export declare const dedupeBranchesAndIndexRoutes: (routes: Array<RouteNode>) => Array<RouteNode>;
|
|
49
|
-
export type StartAPIRoutePathSegment = {
|
|
50
|
-
value: string;
|
|
51
|
-
type: 'path' | 'param' | 'splat';
|
|
52
|
-
};
|
|
53
|
-
/**
|
|
54
|
-
* This function takes in a path in the format accepted by TanStack Router
|
|
55
|
-
* and returns an array of path segments that can be used to generate
|
|
56
|
-
* the pathname of the TanStack Start API route.
|
|
57
|
-
*
|
|
58
|
-
* @param src
|
|
59
|
-
* @returns
|
|
60
|
-
*/
|
|
61
|
-
export declare function startAPIRouteSegmentsFromTSRFilePath(src: string, config: Config): Array<StartAPIRoutePathSegment>;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -2,10 +2,31 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const config = require("./config.cjs");
|
|
4
4
|
const generator = require("./generator.cjs");
|
|
5
|
+
const utils = require("./utils.cjs");
|
|
6
|
+
const getRouteNodes = require("./filesystem/physical/getRouteNodes.cjs");
|
|
7
|
+
const getRouteNodes$1 = require("./filesystem/virtual/getRouteNodes.cjs");
|
|
8
|
+
const rootPathId = require("./filesystem/physical/rootPathId.cjs");
|
|
9
|
+
exports.baseConfigSchema = config.baseConfigSchema;
|
|
5
10
|
exports.configSchema = config.configSchema;
|
|
6
11
|
exports.getConfig = config.getConfig;
|
|
7
12
|
exports.resolveConfigPath = config.resolveConfigPath;
|
|
8
|
-
exports.CONSTANTS = generator.CONSTANTS;
|
|
9
13
|
exports.generator = generator.generator;
|
|
10
|
-
exports.
|
|
14
|
+
exports.capitalize = utils.capitalize;
|
|
15
|
+
exports.cleanPath = utils.cleanPath;
|
|
16
|
+
exports.determineInitialRoutePath = utils.determineInitialRoutePath;
|
|
17
|
+
exports.format = utils.format;
|
|
18
|
+
exports.logging = utils.logging;
|
|
19
|
+
exports.multiSortBy = utils.multiSortBy;
|
|
20
|
+
exports.removeExt = utils.removeExt;
|
|
21
|
+
exports.removeLeadingSlash = utils.removeLeadingSlash;
|
|
22
|
+
exports.removeTrailingSlash = utils.removeTrailingSlash;
|
|
23
|
+
exports.removeUnderscores = utils.removeUnderscores;
|
|
24
|
+
exports.replaceBackslash = utils.replaceBackslash;
|
|
25
|
+
exports.resetRegex = utils.resetRegex;
|
|
26
|
+
exports.routePathToVariable = utils.routePathToVariable;
|
|
27
|
+
exports.trimPathLeft = utils.trimPathLeft;
|
|
28
|
+
exports.writeIfDifferent = utils.writeIfDifferent;
|
|
29
|
+
exports.physicalGetRouteNodes = getRouteNodes.getRouteNodes;
|
|
30
|
+
exports.virtualGetRouteNodes = getRouteNodes$1.getRouteNodes;
|
|
31
|
+
exports.rootPathId = rootPathId.rootPathId;
|
|
11
32
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
export { configSchema, getConfig, resolveConfigPath } from './config.cjs';
|
|
2
|
-
export type { Config } from './config.cjs';
|
|
3
|
-
export { generator
|
|
4
|
-
export
|
|
1
|
+
export { configSchema, getConfig, resolveConfigPath, baseConfigSchema, } from './config.cjs';
|
|
2
|
+
export type { Config, BaseConfig } from './config.cjs';
|
|
3
|
+
export { generator } from './generator.cjs';
|
|
4
|
+
export { logging, capitalize, cleanPath, trimPathLeft, removeLeadingSlash, removeTrailingSlash, determineInitialRoutePath, replaceBackslash, routePathToVariable, removeUnderscores, resetRegex, multiSortBy, writeIfDifferent, format, removeExt, } from './utils.cjs';
|
|
5
|
+
export type { RouteNode, GetRouteNodesResult } from './types.cjs';
|
|
6
|
+
export { getRouteNodes as physicalGetRouteNodes } from './filesystem/physical/getRouteNodes.cjs';
|
|
7
|
+
export { getRouteNodes as virtualGetRouteNodes } from './filesystem/virtual/getRouteNodes.cjs';
|
|
8
|
+
export { rootPathId } from './filesystem/physical/rootPathId.cjs';
|
package/dist/cjs/template.cjs
CHANGED
|
@@ -37,8 +37,8 @@ function getTargetTemplate(target) {
|
|
|
37
37
|
'function RouteComponent() { return <div>Hello "%%tsrPath%%"!</div> };\n'
|
|
38
38
|
].join(""),
|
|
39
39
|
imports: {
|
|
40
|
-
tsrImports: () => "
|
|
41
|
-
tsrExportStart: (
|
|
40
|
+
tsrImports: () => "",
|
|
41
|
+
tsrExportStart: () => `export const Route = createFileRoute(`,
|
|
42
42
|
tsrExportEnd: () => ");"
|
|
43
43
|
}
|
|
44
44
|
},
|
|
@@ -82,8 +82,8 @@ function getTargetTemplate(target) {
|
|
|
82
82
|
'function RouteComponent() { return <div>Hello "%%tsrPath%%"!</div> };\n'
|
|
83
83
|
].join(""),
|
|
84
84
|
imports: {
|
|
85
|
-
tsrImports: () => "
|
|
86
|
-
tsrExportStart: (
|
|
85
|
+
tsrImports: () => "",
|
|
86
|
+
tsrExportStart: () => `export const Route = createFileRoute(`,
|
|
87
87
|
tsrExportEnd: () => ");"
|
|
88
88
|
}
|
|
89
89
|
},
|
|
@@ -105,14 +105,6 @@ function getTargetTemplate(target) {
|
|
|
105
105
|
throw new Error(`router-generator: Unknown target type: ${target}`);
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
|
-
const defaultAPIRouteTemplate = [
|
|
109
|
-
'import { json } from "@tanstack/react-start";\n',
|
|
110
|
-
"%%tsrImports%%",
|
|
111
|
-
"\n\n",
|
|
112
|
-
`%%tsrExportStart%%{ GET: ({ request, params }) => { return json({ message:'Hello "%%tsrPath%%"!' }) }}%%tsrExportEnd%%
|
|
113
|
-
`
|
|
114
|
-
].join("");
|
|
115
|
-
exports.defaultAPIRouteTemplate = defaultAPIRouteTemplate;
|
|
116
108
|
exports.fillTemplate = fillTemplate;
|
|
117
109
|
exports.getTargetTemplate = getTargetTemplate;
|
|
118
110
|
//# sourceMappingURL=template.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.cjs","sources":["../../src/template.ts"],"sourcesContent":["import { format } from './utils'\nimport type { Config } from './config'\n\ntype TemplateTag = 'tsrImports' | 'tsrPath' | 'tsrExportStart' | 'tsrExportEnd'\n\nexport function fillTemplate(\n config: Config,\n template: string,\n values: Record<TemplateTag, string>,\n) {\n const replaced = template.replace(\n /%%(\\w+)%%/g,\n (_, key) => values[key as TemplateTag] || '',\n )\n return format(replaced, config)\n}\n\ntype TargetTemplate = {\n fullPkg: string\n subPkg: string\n rootRoute: {\n template: () => string\n imports: {\n tsrImports: () => string\n tsrExportStart: () => string\n tsrExportEnd: () => string\n }\n }\n route: {\n template: () => string\n imports: {\n tsrImports: () => string\n tsrExportStart: (routePath: string) => string\n tsrExportEnd: () => string\n }\n }\n lazyRoute: {\n template: () => string\n imports: {\n tsrImports: () => string\n tsrExportStart: (routePath: string) => string\n tsrExportEnd: () => string\n }\n }\n}\n\nexport function getTargetTemplate(target: Config['target']): TargetTemplate {\n switch (target) {\n // TODO: Remove this disabled eslint rule when more target types are added.\n\n case 'react':\n return {\n fullPkg: '@tanstack/react-router',\n subPkg: 'react-router',\n rootRoute: {\n template: () =>\n [\n 'import * as React from \"react\"\\n',\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{\\n component: RootComponent\\n }%%tsrExportEnd%%\\n\\n',\n 'function RootComponent() { return (<React.Fragment><div>Hello \"%%tsrPath%%\"!</div><Outlet /></React.Fragment>) };\\n',\n ].join(''),\n imports: {\n tsrImports: () =>\n \"import { Outlet, createRootRoute } from '@tanstack/react-router';\",\n tsrExportStart: () => 'export const Route = createRootRoute(',\n tsrExportEnd: () => ');',\n },\n },\n route: {\n template: () =>\n [\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{\\n component: RouteComponent\\n }%%tsrExportEnd%%\\n\\n',\n 'function RouteComponent() { return <div>Hello \"%%tsrPath%%\"!</div> };\\n',\n ].join(''),\n imports: {\n tsrImports: ()
|
|
1
|
+
{"version":3,"file":"template.cjs","sources":["../../src/template.ts"],"sourcesContent":["import { format } from './utils'\nimport type { Config } from './config'\n\ntype TemplateTag = 'tsrImports' | 'tsrPath' | 'tsrExportStart' | 'tsrExportEnd'\n\nexport function fillTemplate(\n config: Config,\n template: string,\n values: Record<TemplateTag, string>,\n) {\n const replaced = template.replace(\n /%%(\\w+)%%/g,\n (_, key) => values[key as TemplateTag] || '',\n )\n return format(replaced, config)\n}\n\ntype TargetTemplate = {\n fullPkg: string\n subPkg: string\n rootRoute: {\n template: () => string\n imports: {\n tsrImports: () => string\n tsrExportStart: () => string\n tsrExportEnd: () => string\n }\n }\n route: {\n template: () => string\n imports: {\n tsrImports: () => string\n tsrExportStart: (routePath: string) => string\n tsrExportEnd: () => string\n }\n }\n lazyRoute: {\n template: () => string\n imports: {\n tsrImports: () => string\n tsrExportStart: (routePath: string) => string\n tsrExportEnd: () => string\n }\n }\n}\n\nexport function getTargetTemplate(target: Config['target']): TargetTemplate {\n switch (target) {\n // TODO: Remove this disabled eslint rule when more target types are added.\n\n case 'react':\n return {\n fullPkg: '@tanstack/react-router',\n subPkg: 'react-router',\n rootRoute: {\n template: () =>\n [\n 'import * as React from \"react\"\\n',\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{\\n component: RootComponent\\n }%%tsrExportEnd%%\\n\\n',\n 'function RootComponent() { return (<React.Fragment><div>Hello \"%%tsrPath%%\"!</div><Outlet /></React.Fragment>) };\\n',\n ].join(''),\n imports: {\n tsrImports: () =>\n \"import { Outlet, createRootRoute } from '@tanstack/react-router';\",\n tsrExportStart: () => 'export const Route = createRootRoute(',\n tsrExportEnd: () => ');',\n },\n },\n route: {\n template: () =>\n [\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{\\n component: RouteComponent\\n }%%tsrExportEnd%%\\n\\n',\n 'function RouteComponent() { return <div>Hello \"%%tsrPath%%\"!</div> };\\n',\n ].join(''),\n imports: {\n tsrImports: () => '',\n tsrExportStart: () => `export const Route = createFileRoute(`,\n tsrExportEnd: () => ');',\n },\n },\n lazyRoute: {\n template: () =>\n [\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{\\n component: RouteComponent\\n }%%tsrExportEnd%%\\n\\n',\n 'function RouteComponent() { return <div>Hello \"%%tsrPath%%\"!</div> };\\n',\n ].join(''),\n imports: {\n tsrImports: () =>\n \"import { createLazyFileRoute } from '@tanstack/react-router';\",\n tsrExportStart: (routePath) =>\n `export const Route = createLazyFileRoute('${routePath}')(`,\n tsrExportEnd: () => ');',\n },\n },\n }\n case 'solid':\n return {\n fullPkg: '@tanstack/solid-router',\n subPkg: 'solid-router',\n rootRoute: {\n template: () =>\n [\n 'import * as Solid from \"solid-js\"\\n',\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{\\n component: RootComponent\\n }%%tsrExportEnd%%\\n\\n',\n 'function RootComponent() { return (<><div>Hello \"%%tsrPath%%\"!</div><Outlet /></>) };\\n',\n ].join(''),\n imports: {\n tsrImports: () =>\n \"import { Outlet, createRootRoute } from '@tanstack/solid-router';\",\n tsrExportStart: () => 'export const Route = createRootRoute(',\n tsrExportEnd: () => ');',\n },\n },\n route: {\n template: () =>\n [\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{\\n component: RouteComponent\\n }%%tsrExportEnd%%\\n\\n',\n 'function RouteComponent() { return <div>Hello \"%%tsrPath%%\"!</div> };\\n',\n ].join(''),\n imports: {\n tsrImports: () => '',\n tsrExportStart: () => `export const Route = createFileRoute(`,\n tsrExportEnd: () => ');',\n },\n },\n lazyRoute: {\n template: () =>\n [\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{\\n component: RouteComponent\\n }%%tsrExportEnd%%\\n\\n',\n 'function RouteComponent() { return <div>Hello \"%%tsrPath%%\"!</div> };\\n',\n ].join(''),\n imports: {\n tsrImports: () =>\n \"import { createLazyFileRoute } from '@tanstack/solid-router';\",\n tsrExportStart: (routePath) =>\n `export const Route = createLazyFileRoute('${routePath}')(`,\n tsrExportEnd: () => ');',\n },\n },\n }\n default:\n throw new Error(`router-generator: Unknown target type: ${target}`)\n }\n}\n"],"names":["format"],"mappings":";;;AAKgB,SAAA,aACd,QACA,UACA,QACA;AACA,QAAM,WAAW,SAAS;AAAA,IACxB;AAAA,IACA,CAAC,GAAG,QAAQ,OAAO,GAAkB,KAAK;AAAA,EAC5C;AACO,SAAAA,MAAA,OAAO,UAAU,MAAM;AAChC;AA+BO,SAAS,kBAAkB,QAA0C;AAC1E,UAAQ,QAAQ;AAAA;AAAA,IAGd,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,UACT,UAAU,MACR;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,EAAE;AAAA,UACX,SAAS;AAAA,YACP,YAAY,MACV;AAAA,YACF,gBAAgB,MAAM;AAAA,YACtB,cAAc,MAAM;AAAA,UAAA;AAAA,QAExB;AAAA,QACA,OAAO;AAAA,UACL,UAAU,MACR;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,EAAE;AAAA,UACX,SAAS;AAAA,YACP,YAAY,MAAM;AAAA,YAClB,gBAAgB,MAAM;AAAA,YACtB,cAAc,MAAM;AAAA,UAAA;AAAA,QAExB;AAAA,QACA,WAAW;AAAA,UACT,UAAU,MACR;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,EAAE;AAAA,UACX,SAAS;AAAA,YACP,YAAY,MACV;AAAA,YACF,gBAAgB,CAAC,cACf,6CAA6C,SAAS;AAAA,YACxD,cAAc,MAAM;AAAA,UAAA;AAAA,QACtB;AAAA,MAEJ;AAAA,IACF,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,UACT,UAAU,MACR;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,EAAE;AAAA,UACX,SAAS;AAAA,YACP,YAAY,MACV;AAAA,YACF,gBAAgB,MAAM;AAAA,YACtB,cAAc,MAAM;AAAA,UAAA;AAAA,QAExB;AAAA,QACA,OAAO;AAAA,UACL,UAAU,MACR;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,EAAE;AAAA,UACX,SAAS;AAAA,YACP,YAAY,MAAM;AAAA,YAClB,gBAAgB,MAAM;AAAA,YACtB,cAAc,MAAM;AAAA,UAAA;AAAA,QAExB;AAAA,QACA,WAAW;AAAA,UACT,UAAU,MACR;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,EAAE;AAAA,UACX,SAAS;AAAA,YACP,YAAY,MACV;AAAA,YACF,gBAAgB,CAAC,cACf,6CAA6C,SAAS;AAAA,YACxD,cAAc,MAAM;AAAA,UAAA;AAAA,QACtB;AAAA,MAEJ;AAAA,IACF;AACE,YAAM,IAAI,MAAM,0CAA0C,MAAM,EAAE;AAAA,EAAA;AAExE;;;"}
|
package/dist/cjs/template.d.cts
CHANGED
package/dist/cjs/types.d.cts
CHANGED
|
@@ -17,4 +17,4 @@ export interface GetRouteNodesResult {
|
|
|
17
17
|
rootRouteNode?: RouteNode;
|
|
18
18
|
routeNodes: Array<RouteNode>;
|
|
19
19
|
}
|
|
20
|
-
export type FsRouteType = '__root' | 'static' | 'layout' | 'pathless_layout' | 'lazy' | '
|
|
20
|
+
export type FsRouteType = '__root' | 'static' | 'layout' | 'pathless_layout' | 'lazy' | 'loader' | 'component' | 'pendingComponent' | 'errorComponent';
|
package/dist/cjs/utils.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const
|
|
3
|
+
const fsp = require("node:fs/promises");
|
|
4
4
|
const prettier = require("prettier");
|
|
5
5
|
function _interopNamespaceDefault(e) {
|
|
6
6
|
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
@@ -18,7 +18,7 @@ function _interopNamespaceDefault(e) {
|
|
|
18
18
|
n.default = e;
|
|
19
19
|
return Object.freeze(n);
|
|
20
20
|
}
|
|
21
|
-
const
|
|
21
|
+
const fsp__namespace = /* @__PURE__ */ _interopNamespaceDefault(fsp);
|
|
22
22
|
const prettier__namespace = /* @__PURE__ */ _interopNamespaceDefault(prettier);
|
|
23
23
|
function multiSortBy(arr, accessors = [(d) => d]) {
|
|
24
24
|
return arr.map((d, i) => [d, i]).sort(([a, ai], [b, bi]) => {
|
|
@@ -85,14 +85,73 @@ function removeTrailingSlash(s) {
|
|
|
85
85
|
return s.replace(/\/$/, "");
|
|
86
86
|
}
|
|
87
87
|
function determineInitialRoutePath(routePath) {
|
|
88
|
-
|
|
88
|
+
const DISALLOWED_ESCAPE_CHARS = /* @__PURE__ */ new Set([
|
|
89
|
+
"/",
|
|
90
|
+
"\\",
|
|
91
|
+
"?",
|
|
92
|
+
"#",
|
|
93
|
+
":",
|
|
94
|
+
"*",
|
|
95
|
+
"<",
|
|
96
|
+
">",
|
|
97
|
+
"|",
|
|
98
|
+
"!",
|
|
99
|
+
"$",
|
|
100
|
+
"%"
|
|
101
|
+
]);
|
|
102
|
+
const parts = routePath.split(new RegExp("(?<!\\[)\\.(?!\\])", "g"));
|
|
103
|
+
const escapedParts = parts.map((part) => {
|
|
104
|
+
const BRACKET_CONTENT_RE = /\[(.*?)\]/g;
|
|
105
|
+
let match;
|
|
106
|
+
while ((match = BRACKET_CONTENT_RE.exec(part)) !== null) {
|
|
107
|
+
const character = match[1];
|
|
108
|
+
if (character === void 0) continue;
|
|
109
|
+
if (DISALLOWED_ESCAPE_CHARS.has(character)) {
|
|
110
|
+
console.error(
|
|
111
|
+
`Error: Disallowed character "${character}" found in square brackets in route path "${routePath}".
|
|
112
|
+
You cannot use any of the following characters in square brackets: ${Array.from(
|
|
113
|
+
DISALLOWED_ESCAPE_CHARS
|
|
114
|
+
).join(", ")}
|
|
115
|
+
Please remove and/or replace them.`
|
|
116
|
+
);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return part.replace(/\[(.)\]/g, "$1");
|
|
121
|
+
});
|
|
122
|
+
const final = cleanPath(`/${escapedParts.join("/")}`) || "";
|
|
123
|
+
return final;
|
|
89
124
|
}
|
|
90
125
|
function replaceBackslash(s) {
|
|
91
126
|
return s.replaceAll(/\\/gi, "/");
|
|
92
127
|
}
|
|
93
128
|
function routePathToVariable(routePath) {
|
|
94
129
|
var _a;
|
|
95
|
-
|
|
130
|
+
const toVariableSafeChar = (char) => {
|
|
131
|
+
if (/[a-zA-Z0-9_]/.test(char)) {
|
|
132
|
+
return char;
|
|
133
|
+
}
|
|
134
|
+
switch (char) {
|
|
135
|
+
case ".":
|
|
136
|
+
return "Dot";
|
|
137
|
+
case "-":
|
|
138
|
+
return "Dash";
|
|
139
|
+
case "@":
|
|
140
|
+
return "At";
|
|
141
|
+
case "(":
|
|
142
|
+
return "";
|
|
143
|
+
// Removed since route groups use parentheses
|
|
144
|
+
case ")":
|
|
145
|
+
return "";
|
|
146
|
+
// Removed since route groups use parentheses
|
|
147
|
+
case " ":
|
|
148
|
+
return "";
|
|
149
|
+
// Remove spaces
|
|
150
|
+
default:
|
|
151
|
+
return `Char${char.charCodeAt(0)}`;
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
return ((_a = removeUnderscores(routePath)) == null ? void 0 : _a.replace(/\/\$\//g, "/splat/").replace(/\$$/g, "splat").replace(/\$\{\$\}/g, "splat").replace(/\$/g, "").split(/[/-]/g).map((d, i) => i > 0 ? capitalize(d) : d).join("").split("").map(toVariableSafeChar).join("").replace(/^(\d)/g, "R$1")) ?? "";
|
|
96
155
|
}
|
|
97
156
|
function removeUnderscores(s) {
|
|
98
157
|
return s == null ? void 0 : s.replaceAll(/(^_|_$)/gi, "").replaceAll(/(\/_|_\/)/gi, "/");
|
|
@@ -108,7 +167,7 @@ async function writeIfDifferent(filepath, content, incomingContent, callbacks) {
|
|
|
108
167
|
var _a, _b;
|
|
109
168
|
if (content !== incomingContent) {
|
|
110
169
|
(_a = callbacks == null ? void 0 : callbacks.beforeWrite) == null ? void 0 : _a.call(callbacks);
|
|
111
|
-
|
|
170
|
+
await fsp__namespace.writeFile(filepath, incomingContent);
|
|
112
171
|
(_b = callbacks == null ? void 0 : callbacks.afterWrite) == null ? void 0 : _b.call(callbacks);
|
|
113
172
|
return true;
|
|
114
173
|
}
|