@tanstack/start-plugin-core 1.121.0-alpha.20 → 1.121.0-alpha.21
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/start-server-routes-plugin/plugin.cjs +2 -1
- package/dist/cjs/start-server-routes-plugin/plugin.cjs.map +1 -1
- package/dist/esm/start-server-routes-plugin/plugin.js +2 -1
- package/dist/esm/start-server-routes-plugin/plugin.js.map +1 -1
- package/package.json +3 -3
- package/src/start-server-routes-plugin/plugin.ts +2 -1
|
@@ -163,7 +163,8 @@ Add the file in: "${config.routesDirectory}/${routerGenerator.rootPathId}.tsx"`;
|
|
|
163
163
|
node.cleanedPath = removeGroups(
|
|
164
164
|
routerGenerator.removeUnderscores(removeLayoutSegments(node.path)) ?? ""
|
|
165
165
|
);
|
|
166
|
-
const
|
|
166
|
+
const stats = fs.statSync(node.fullPath);
|
|
167
|
+
const routeCode = stats.isFile() ? fs.readFileSync(node.fullPath, "utf-8") : "";
|
|
167
168
|
if (!node.isVirtualParentRoute && !node.isVirtual) ;
|
|
168
169
|
const cleanedPathIsEmpty = (node.cleanedPath || "").length === 0;
|
|
169
170
|
const nonPathRoute = node._fsRouteType === "pathless_layout" && node.isNonPath;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs","sources":["../../../src/start-server-routes-plugin/plugin.ts"],"sourcesContent":["import path, { isAbsolute, join, normalize } from 'node:path'\nimport fs from 'node:fs'\nimport fsp from 'node:fs/promises'\nimport {\n format,\n logging,\n multiSortBy,\n physicalGetRouteNodes,\n removeExt,\n removeUnderscores,\n replaceBackslash,\n resetRegex,\n rootPathId,\n routePathToVariable,\n trimPathLeft,\n virtualGetRouteNodes,\n writeIfDifferent,\n} from '@tanstack/router-generator'\nimport { rootRouteId } from '@tanstack/router-core'\nimport { fillTemplate, getTargetTemplate } from './template'\nimport type { GetRouteNodesResult, RouteNode } from '@tanstack/router-generator'\nimport type { Config } from './config'\nimport type { Plugin } from 'vite'\n\nlet lock = false\nconst checkLock = () => lock\nconst setLock = (bool: boolean) => {\n lock = bool\n}\n\nexport function TanStackStartServerRoutesVite(config: Config): Plugin {\n let ROOT: string = process.cwd()\n const moduleId = 'tanstack-start-server-routes-manifest:v'\n\n const getRoutesDirectoryPath = () => {\n return isAbsolute(config.routesDirectory)\n ? config.routesDirectory\n : join(ROOT, config.routesDirectory)\n }\n\n const generate = async () => {\n if (checkLock()) {\n return\n }\n\n setLock(true)\n\n try {\n await generator(config, ROOT)\n } catch (err) {\n console.error(err)\n console.info()\n } finally {\n setLock(false)\n }\n }\n\n const handleFile = async (file: string) => {\n const filePath = normalize(file)\n\n const routesDirectoryPath = getRoutesDirectoryPath()\n if (filePath.startsWith(routesDirectoryPath)) {\n await generate()\n }\n }\n\n return {\n name: 'tanstack-start-server-routes-plugin',\n configureServer(server) {\n server.watcher.on('all', (event, path) => {\n handleFile(path)\n })\n },\n configResolved(config) {\n ROOT = config.root\n },\n async buildStart() {\n await generate()\n // if (this.environment.name === 'server') {\n // }\n },\n sharedDuringBuild: true,\n resolveId(id) {\n if (id === moduleId) {\n const generatedRouteTreePath = getGeneratedRouteTreePath(ROOT)\n return generatedRouteTreePath\n }\n return null\n },\n }\n}\n\n// Maybe import this from `@tanstack/router-core` in the future???\nlet latestTask = 0\nconst routeGroupPatternRegex = /\\(.+\\)/g\nconst possiblyNestedRouteGroupPatternRegex = /\\([^/]+\\)\\/?/g\n\nlet isFirst = false\nlet skipMessage = false\n\nfunction getGeneratedRouteTreePath(root: string) {\n return path.resolve(root, '.tanstack-start/server-routes/routeTree.gen.ts')\n}\n\nasync function generator(config: Config, root: string) {\n const generatedServerRouteTreePath = getGeneratedRouteTreePath(root)\n const ROUTE_TEMPLATE = getTargetTemplate(config.target)\n const logger = logging({ disabled: config.disableLogging })\n\n if (!isFirst) {\n // logger.log('♻️ Generating server routes...')\n isFirst = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n // logger.log('♻️ Regenerating server routes...')\n }\n\n const taskId = latestTask + 1\n latestTask = taskId\n\n const checkLatest = () => {\n if (latestTask !== taskId) {\n skipMessage = true\n return false\n }\n\n return true\n }\n\n const start = Date.now()\n\n let 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}.tsx\" file to your routes directory.\\nAdd the file in: \"${config.routesDirectory}/${rootPathId}.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\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 const routeCode = node.fullPath\n ? fs.readFileSync(node.fullPath, 'utf-8')\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 escapedRoutePath = node.routePath?.replaceAll('$', '$$') ?? ''\n // let replaced = routeCode\n // await writeIfDifferent(node.fullPath, routeCode, replaced, {\n // beforeWrite: () => {\n // // logger.log(`🟡 Updating ${node.fullPath}`)\n // },\n // })\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 (\n !routeCode\n .split('\\n')\n .some((line) => line.trim().startsWith('export const ServerRoute'))\n ) {\n return\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 `routeNodes` array since it\n // has the accumulated (intended) Server Route nodes\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(routeNodes, config)\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 = `interface ${route}Children {\n ${node.children.map((child) => `${child.variableName}Route: typeof ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`\n\n const children = `const ${route}Children: ${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 })\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(generatedServerRouteTreePath),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n ),\n )\n }\n\n const rootRouteExists = fs.existsSync(rootRouteNode.fullPath)\n const rootRouteCode = rootRouteExists\n ? fs.readFileSync(rootRouteNode.fullPath, 'utf-8')\n : ''\n const hasServerRootRoute =\n rootRouteExists && rootRouteCode.includes('export const ServerRoute')\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 type { FileRoutesByPath, CreateServerFileRoute } from '${ROUTE_TEMPLATE.fullPkg}'`,\n `import { createServerRoute, createServerFileRoute } from '${ROUTE_TEMPLATE.fullPkg}'`,\n hasServerRootRoute\n ? `import { ServerRoute as rootRouteImport } from './${getImportPath(rootRouteNode)}'`\n : '',\n ...sortedRouteNodes\n .filter((d) => !d.isVirtual)\n .map((node) => {\n return `import { ServerRoute 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 !hasServerRootRoute\n ? `\n const rootRoute = createServerRoute()\n `\n : '',\n sortedRouteNodes\n .map((node) => {\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 } as any)`,\n ].join(''),\n ].join('\\n\\n')\n })\n .join('\\n\\n'),\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 `// Add type-safety to the createFileRoute function across the route tree`,\n routeNodes\n .map((routeNode) => {\n return `declare module './${getImportPath(routeNode)}' {\nconst createServerFileRoute: CreateServerFileRoute<\nFileRoutesByPath['${routeNode.routePath}']['parentRoute'],\nFileRoutesByPath['${routeNode.routePath}']['id'],\nFileRoutesByPath['${routeNode.routePath}']['path'],\nFileRoutesByPath['${routeNode.routePath}']['fullPath'],\n${routeNode.children?.length ? `${routeNode.variableName}RouteChildren` : 'unknown'}\n>\n}`\n })\n .join('\\n'),\n '// Create and export the route tree',\n routeConfigChildrenText,\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 `const rootRouteChildren: RootRouteChildren = {\n ${routeTree.map((child) => `${child.variableName}Route: ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`,\n `export const routeTree = rootRoute._addFileChildren(rootRouteChildren)._addFileTypes<FileRouteTypes>()`,\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 = !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(generatedServerRouteTreePath), '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(generatedServerRouteTreePath)), {\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(generatedServerRouteTreePath),\n await format(existingRouteTreeContent, config),\n await format(routeConfigFileContent, config),\n {\n beforeWrite: () => {\n // logger.log(`🟡 Updating ${generatedRouteTreePath}`)\n },\n },\n )\n\n // Write declaration file\n const startDeclarationFilePath = path.join(\n path.resolve(root, config.srcDirectory),\n 'tanstack-start.d.ts',\n )\n const serverRoutesRelativePath = removeExt(\n path.relative(\n path.dirname(startDeclarationFilePath),\n generatedServerRouteTreePath,\n ),\n )\n const startDeclarationFileContent = buildStartDeclarationFile({\n serverRoutesRelativePath,\n })\n if (!fs.existsSync(startDeclarationFilePath)) {\n await writeIfDifferent(\n startDeclarationFilePath,\n '',\n startDeclarationFileContent,\n {\n beforeWrite: () => {\n logger.log(`🟡 Creating tanstack-start.d.ts`)\n },\n },\n )\n } else {\n const existingDeclarationFileContent = await fsp\n .readFile(startDeclarationFilePath, 'utf-8')\n .catch((err) => {\n if (err.code === 'ENOENT') {\n return ''\n }\n throw err\n })\n await writeIfDifferent(\n startDeclarationFilePath,\n existingDeclarationFileContent,\n startDeclarationFileContent,\n {\n beforeWrite: () => {\n logger.log(`🟡 Updating tanstack-start.d.ts`)\n },\n },\n )\n }\n\n if (routeTreeWriteResult && !checkLatest()) {\n return\n }\n\n // logger.log(\n // `✅ Processed ${routeNodes.length === 1 ? 'server route' : 'server routes'} in ${\n // Date.now() - start\n // }ms`,\n // )\n}\n\nfunction buildStartDeclarationFile({\n serverRoutesRelativePath,\n}: {\n serverRoutesRelativePath: string\n}) {\n const serverRoutesPath = replaceBackslash(serverRoutesRelativePath)\n return (\n [\n '/// <reference types=\"vite/client\" />',\n `import '${serverRoutesPath}'`,\n ].join('\\n') + '\\n'\n )\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 */\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 Server Route has a unique full path.\nConflicting files: \\n ${conflictingFiles.map((d) => path.resolve(config.routesDirectory, d.filePath)).join('\\n ')}\\n`\n console.error(errorMessage)\n process.exit(1)\n }\n}\n"],"names":["isAbsolute","join","normalize","path","config","getTargetTemplate","logging","virtualGetRouteNodes","physicalGetRouteNodes","rootPathId","multiSortBy","fillTemplate","writeIfDifferent","resetRegex","trimPathLeft","removeUnderscores","routePathToVariable","children","replaceBackslash","removeExt","rootRouteId","format"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.cjs","sources":["../../../src/start-server-routes-plugin/plugin.ts"],"sourcesContent":["import path, { isAbsolute, join, normalize } from 'node:path'\nimport fs from 'node:fs'\nimport fsp from 'node:fs/promises'\nimport {\n format,\n logging,\n multiSortBy,\n physicalGetRouteNodes,\n removeExt,\n removeUnderscores,\n replaceBackslash,\n resetRegex,\n rootPathId,\n routePathToVariable,\n trimPathLeft,\n virtualGetRouteNodes,\n writeIfDifferent,\n} from '@tanstack/router-generator'\nimport { rootRouteId } from '@tanstack/router-core'\nimport { fillTemplate, getTargetTemplate } from './template'\nimport type { GetRouteNodesResult, RouteNode } from '@tanstack/router-generator'\nimport type { Config } from './config'\nimport type { Plugin } from 'vite'\n\nlet lock = false\nconst checkLock = () => lock\nconst setLock = (bool: boolean) => {\n lock = bool\n}\n\nexport function TanStackStartServerRoutesVite(config: Config): Plugin {\n let ROOT: string = process.cwd()\n const moduleId = 'tanstack-start-server-routes-manifest:v'\n\n const getRoutesDirectoryPath = () => {\n return isAbsolute(config.routesDirectory)\n ? config.routesDirectory\n : join(ROOT, config.routesDirectory)\n }\n\n const generate = async () => {\n if (checkLock()) {\n return\n }\n\n setLock(true)\n\n try {\n await generator(config, ROOT)\n } catch (err) {\n console.error(err)\n console.info()\n } finally {\n setLock(false)\n }\n }\n\n const handleFile = async (file: string) => {\n const filePath = normalize(file)\n\n const routesDirectoryPath = getRoutesDirectoryPath()\n if (filePath.startsWith(routesDirectoryPath)) {\n await generate()\n }\n }\n\n return {\n name: 'tanstack-start-server-routes-plugin',\n configureServer(server) {\n server.watcher.on('all', (event, path) => {\n handleFile(path)\n })\n },\n configResolved(config) {\n ROOT = config.root\n },\n async buildStart() {\n await generate()\n // if (this.environment.name === 'server') {\n // }\n },\n sharedDuringBuild: true,\n resolveId(id) {\n if (id === moduleId) {\n const generatedRouteTreePath = getGeneratedRouteTreePath(ROOT)\n return generatedRouteTreePath\n }\n return null\n },\n }\n}\n\n// Maybe import this from `@tanstack/router-core` in the future???\nlet latestTask = 0\nconst routeGroupPatternRegex = /\\(.+\\)/g\nconst possiblyNestedRouteGroupPatternRegex = /\\([^/]+\\)\\/?/g\n\nlet isFirst = false\nlet skipMessage = false\n\nfunction getGeneratedRouteTreePath(root: string) {\n return path.resolve(root, '.tanstack-start/server-routes/routeTree.gen.ts')\n}\n\nasync function generator(config: Config, root: string) {\n const generatedServerRouteTreePath = getGeneratedRouteTreePath(root)\n const ROUTE_TEMPLATE = getTargetTemplate(config.target)\n const logger = logging({ disabled: config.disableLogging })\n\n if (!isFirst) {\n // logger.log('♻️ Generating server routes...')\n isFirst = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n // logger.log('♻️ Regenerating server routes...')\n }\n\n const taskId = latestTask + 1\n latestTask = taskId\n\n const checkLatest = () => {\n if (latestTask !== taskId) {\n skipMessage = true\n return false\n }\n\n return true\n }\n\n const start = Date.now()\n\n let 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}.tsx\" file to your routes directory.\\nAdd the file in: \"${config.routesDirectory}/${rootPathId}.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\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 const stats = fs.statSync(node.fullPath)\n const routeCode = stats.isFile()\n ? fs.readFileSync(node.fullPath, 'utf-8')\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 escapedRoutePath = node.routePath?.replaceAll('$', '$$') ?? ''\n // let replaced = routeCode\n // await writeIfDifferent(node.fullPath, routeCode, replaced, {\n // beforeWrite: () => {\n // // logger.log(`🟡 Updating ${node.fullPath}`)\n // },\n // })\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 (\n !routeCode\n .split('\\n')\n .some((line) => line.trim().startsWith('export const ServerRoute'))\n ) {\n return\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 `routeNodes` array since it\n // has the accumulated (intended) Server Route nodes\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(routeNodes, config)\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 = `interface ${route}Children {\n ${node.children.map((child) => `${child.variableName}Route: typeof ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`\n\n const children = `const ${route}Children: ${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 })\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(generatedServerRouteTreePath),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n ),\n )\n }\n\n const rootRouteExists = fs.existsSync(rootRouteNode.fullPath)\n const rootRouteCode = rootRouteExists\n ? fs.readFileSync(rootRouteNode.fullPath, 'utf-8')\n : ''\n const hasServerRootRoute =\n rootRouteExists && rootRouteCode.includes('export const ServerRoute')\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 type { FileRoutesByPath, CreateServerFileRoute } from '${ROUTE_TEMPLATE.fullPkg}'`,\n `import { createServerRoute, createServerFileRoute } from '${ROUTE_TEMPLATE.fullPkg}'`,\n hasServerRootRoute\n ? `import { ServerRoute as rootRouteImport } from './${getImportPath(rootRouteNode)}'`\n : '',\n ...sortedRouteNodes\n .filter((d) => !d.isVirtual)\n .map((node) => {\n return `import { ServerRoute 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 !hasServerRootRoute\n ? `\n const rootRoute = createServerRoute()\n `\n : '',\n sortedRouteNodes\n .map((node) => {\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 } as any)`,\n ].join(''),\n ].join('\\n\\n')\n })\n .join('\\n\\n'),\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 `// Add type-safety to the createFileRoute function across the route tree`,\n routeNodes\n .map((routeNode) => {\n return `declare module './${getImportPath(routeNode)}' {\nconst createServerFileRoute: CreateServerFileRoute<\nFileRoutesByPath['${routeNode.routePath}']['parentRoute'],\nFileRoutesByPath['${routeNode.routePath}']['id'],\nFileRoutesByPath['${routeNode.routePath}']['path'],\nFileRoutesByPath['${routeNode.routePath}']['fullPath'],\n${routeNode.children?.length ? `${routeNode.variableName}RouteChildren` : 'unknown'}\n>\n}`\n })\n .join('\\n'),\n '// Create and export the route tree',\n routeConfigChildrenText,\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 `const rootRouteChildren: RootRouteChildren = {\n ${routeTree.map((child) => `${child.variableName}Route: ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`,\n `export const routeTree = rootRoute._addFileChildren(rootRouteChildren)._addFileTypes<FileRouteTypes>()`,\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 = !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(generatedServerRouteTreePath), '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(generatedServerRouteTreePath)), {\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(generatedServerRouteTreePath),\n await format(existingRouteTreeContent, config),\n await format(routeConfigFileContent, config),\n {\n beforeWrite: () => {\n // logger.log(`🟡 Updating ${generatedRouteTreePath}`)\n },\n },\n )\n\n // Write declaration file\n const startDeclarationFilePath = path.join(\n path.resolve(root, config.srcDirectory),\n 'tanstack-start.d.ts',\n )\n const serverRoutesRelativePath = removeExt(\n path.relative(\n path.dirname(startDeclarationFilePath),\n generatedServerRouteTreePath,\n ),\n )\n const startDeclarationFileContent = buildStartDeclarationFile({\n serverRoutesRelativePath,\n })\n if (!fs.existsSync(startDeclarationFilePath)) {\n await writeIfDifferent(\n startDeclarationFilePath,\n '',\n startDeclarationFileContent,\n {\n beforeWrite: () => {\n logger.log(`🟡 Creating tanstack-start.d.ts`)\n },\n },\n )\n } else {\n const existingDeclarationFileContent = await fsp\n .readFile(startDeclarationFilePath, 'utf-8')\n .catch((err) => {\n if (err.code === 'ENOENT') {\n return ''\n }\n throw err\n })\n await writeIfDifferent(\n startDeclarationFilePath,\n existingDeclarationFileContent,\n startDeclarationFileContent,\n {\n beforeWrite: () => {\n logger.log(`🟡 Updating tanstack-start.d.ts`)\n },\n },\n )\n }\n\n if (routeTreeWriteResult && !checkLatest()) {\n return\n }\n\n // logger.log(\n // `✅ Processed ${routeNodes.length === 1 ? 'server route' : 'server routes'} in ${\n // Date.now() - start\n // }ms`,\n // )\n}\n\nfunction buildStartDeclarationFile({\n serverRoutesRelativePath,\n}: {\n serverRoutesRelativePath: string\n}) {\n const serverRoutesPath = replaceBackslash(serverRoutesRelativePath)\n return (\n [\n '/// <reference types=\"vite/client\" />',\n `import '${serverRoutesPath}'`,\n ].join('\\n') + '\\n'\n )\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 */\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 Server Route has a unique full path.\nConflicting files: \\n ${conflictingFiles.map((d) => path.resolve(config.routesDirectory, d.filePath)).join('\\n ')}\\n`\n console.error(errorMessage)\n process.exit(1)\n }\n}\n"],"names":["isAbsolute","join","normalize","path","config","getTargetTemplate","logging","virtualGetRouteNodes","physicalGetRouteNodes","rootPathId","multiSortBy","fillTemplate","writeIfDifferent","resetRegex","trimPathLeft","removeUnderscores","routePathToVariable","children","replaceBackslash","removeExt","rootRouteId","format"],"mappings":";;;;;;;;AAwBA,IAAI,OAAO;AACX,MAAM,YAAY,MAAM;AACxB,MAAM,UAAU,CAAC,SAAkB;AAC1B,SAAA;AACT;AAEO,SAAS,8BAA8B,QAAwB;AAChE,MAAA,OAAe,QAAQ,IAAI;AAC/B,QAAM,WAAW;AAEjB,QAAM,yBAAyB,MAAM;AAC5B,WAAAA,KAAA,WAAW,OAAO,eAAe,IACpC,OAAO,kBACPC,UAAK,MAAM,OAAO,eAAe;AAAA,EACvC;AAEA,QAAM,WAAW,YAAY;AAC3B,QAAI,aAAa;AACf;AAAA,IAAA;AAGF,YAAQ,IAAI;AAER,QAAA;AACI,YAAA,UAAU,QAAQ,IAAI;AAAA,aACrB,KAAK;AACZ,cAAQ,MAAM,GAAG;AACjB,cAAQ,KAAK;AAAA,IAAA,UACb;AACA,cAAQ,KAAK;AAAA,IAAA;AAAA,EAEjB;AAEM,QAAA,aAAa,OAAO,SAAiB;AACnC,UAAA,WAAWC,eAAU,IAAI;AAE/B,UAAM,sBAAsB,uBAAuB;AAC/C,QAAA,SAAS,WAAW,mBAAmB,GAAG;AAC5C,YAAM,SAAS;AAAA,IAAA;AAAA,EAEnB;AAEO,SAAA;AAAA,IACL,MAAM;AAAA,IACN,gBAAgB,QAAQ;AACtB,aAAO,QAAQ,GAAG,OAAO,CAAC,OAAOC,UAAS;AACxC,mBAAWA,KAAI;AAAA,MAAA,CAChB;AAAA,IACH;AAAA,IACA,eAAeC,SAAQ;AACrB,aAAOA,QAAO;AAAA,IAChB;AAAA,IACA,MAAM,aAAa;AACjB,YAAM,SAAS;AAAA,IAGjB;AAAA,IACA,mBAAmB;AAAA,IACnB,UAAU,IAAI;AACZ,UAAI,OAAO,UAAU;AACb,cAAA,yBAAyB,0BAA0B,IAAI;AACtD,eAAA;AAAA,MAAA;AAEF,aAAA;AAAA,IAAA;AAAA,EAEX;AACF;AAGA,IAAI,aAAa;AACjB,MAAM,yBAAyB;AAC/B,MAAM,uCAAuC;AAK7C,SAAS,0BAA0B,MAAc;AACxC,SAAA,KAAK,QAAQ,MAAM,gDAAgD;AAC5E;AAEA,eAAe,UAAU,QAAgB,MAAc;AAC/C,QAAA,+BAA+B,0BAA0B,IAAI;AAC7D,QAAA,iBAAiBC,SAAAA,kBAAkB,OAAO,MAAM;AACtD,QAAM,SAASC,gBAAAA,QAAQ,EAAE,UAAU,OAAO,gBAAgB;AAW1D,QAAM,SAAS,aAAa;AACf,eAAA;AAEb,QAAM,cAAc,MAAM;AACxB,QAAI,eAAe,QAAQ;AAElB,aAAA;AAAA,IAAA;AAGF,WAAA;AAAA,EACT;AAII,MAAA;AAEJ,MAAI,OAAO,oBAAoB;AACP,0BAAA,MAAMC,gBAAAA,qBAAqB,QAAQ,IAAI;AAAA,EAAA,OACxD;AACiB,0BAAA,MAAMC,gBAAAA,sBAAsB,QAAQ,IAAI;AAAA,EAAA;AAGhE,QAAM,EAAE,eAAe,YAAY,iBAAqB,IAAA;AACxD,MAAI,kBAAkB,QAAW;AAC/B,QAAI,eAAe;AACf,QAAA,CAAC,OAAO,oBAAoB;AACd,sBAAA;AAAA,4BAA+BC,0BAAU;AAAA,oBAA2D,OAAO,eAAe,IAAIA,gBAAAA,UAAU;AAAA,IAAA;AAEpJ,UAAA,IAAI,MAAM,YAAY;AAAA,EAAA;AAGxB,QAAA,gBAAgBC,4BAAY,kBAAkB;AAAA,IAClD,CAAC,MAAO,EAAE,cAAc,MAAM,KAAK;AAAA,IACnC,CAAC,MAAM;;AAAA,qBAAE,cAAF,mBAAa,MAAM,KAAK;AAAA;AAAA,IAC/B,CAAC,MACC,EAAE,SAAS,MAAM,IAAI,OAAO,OAAO,OAAO,UAAU,KAAK,CAAC,IAAI,IAAI;AAAA,IACpE,CAAC,MACC,EAAE,SAAS;AAAA,MACT;AAAA,QAEE,IACA;AAAA,IACN,CAAC,MACC,EAAE,SAAS,MAAM,IAAI,OAAO,OAAO,OAAO,UAAU,KAAK,CAAC,IAAI,KAAK;AAAA,IACrE,CAAC,MAAO;;AAAA,sBAAE,cAAF,mBAAa,SAAS,QAAO,KAAK;AAAA;AAAA,IAC1C,CAAC,MAAM,EAAE;AAAA,EACV,CAAA,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,IAAID,0BAAU,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAEhE,QAAM,YAA8B,CAAC;AAIrC,QAAM,aAA+B,CAAC;AAKhC,QAAA,iBAAiB,OAAO,SAAqB;AACjD,QAAI,CAAC,MAAM;AAGT;AAAA,IAAA;AAIF,UAAM,YAAY,GAAG,aAAa,KAAK,UAAU,OAAO;AAExD,QAAI,CAAC,WAAW;AACd,YAAM,gBAAgB,eAAe;AACrC,YAAM,WAAW,MAAME,SAAA,aAAa,QAAQ,cAAc,YAAY;AAAA,QACpE,YAAY,cAAc,QAAQ,WAAW;AAAA,QAC7C,SAASF,gBAAA;AAAA,QACT,gBAAgB,cAAc,QAAQ,eAAe;AAAA,QACrD,cAAc,cAAc,QAAQ,aAAa;AAAA,MAAA,CAClD;AAEK,YAAAG,gBAAA;AAAA,QACJ,KAAK;AAAA,QACL;AAAA;AAAA,QACA;AAAA,QACA;AAAA,UACE,aAAa,MAAM;AAAA,UAAA;AAAA,QAEnB;AAAA,MAEJ;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAM,eAAe,aAAa;AAE5B,QAAA,aAAa,OAAO,SAAoB;;AAI5CC,oBAAAA,WAAW,sBAAsB;AAEjC,QAAI,cAAc,eAAe,YAAY,MAAM,KAAK,SAAS;AAGjE,SAAI,2CAAa,2BAAwB,iBAAY,aAAZ,mBAAsB,SAAQ;AAErE,YAAM,sBAAsB;AAAA,QAC1B,YAAY;AAAA,QACZ;AAAA,QACA,KAAK;AAAA,MACP;AACA,UAAI,qBAAqB;AACT,sBAAA;AAAA,MAAA;AAAA,IAChB;AAGE,QAAA,kBAAkB,SAAS;AAE1B,SAAA,OAAO,kBAAkB,IAAI;AAElC,UAAM,cAAcC,gBAAA,aAAa,KAAK,QAAQ,EAAE;AAE1C,UAAA,QAAQ,YAAY,MAAM,GAAG;AACnC,UAAM,mBAAmB,MAAM,MAAM,SAAS,CAAC,KAAK;AAEpD,SAAK,YACH,iBAAiB,WAAW,GAAG,KAC/B,uBAAuB,KAAK,gBAAgB;AAE9C,SAAK,cAAc;AAAA,MACjBC,gBAAAA,kBAAkB,qBAAqB,KAAK,IAAI,CAAC,KAAK;AAAA,IACxD;AAEA,UAAM,QAAQ,GAAG,SAAS,KAAK,QAAQ;AACjC,UAAA,YAAY,MAAM,WACpB,GAAG,aAAa,KAAK,UAAU,OAAO,IACtC;AAGJ,QAAI,CAAC,KAAK,wBAAwB,CAAC,KAAK,UAAW;AAUnD,UAAM,sBAAsB,KAAK,eAAe,IAAI,WAAW;AAC/D,UAAM,eACJ,KAAK,iBAAiB,qBAAqB,KAAK;AAElD,SAAK,0BACH,KAAK,iBAAiB,qBAAqB,eACvC,CAAC,qBACD;AAEN,QAAI,CAAC,KAAK,aAAa,KAAK,yBAAyB;AACnD,YAAM,kBAAkB,0BAA0B,KAAK,SAAS,KAAK;AAC/D,YAAA,qBAAqBC,oCAAoB,eAAe;AAE9D,YAAM,cAAc,WAAW;AAAA,QAC7B,CAAC,MAAM,EAAE,cAAc;AAAA,MACzB;AAEA,UAAI,CAAC,aAAa;AAChB,cAAM,aAAwB;AAAA,UAC5B,GAAG;AAAA,UACH,MAAM,0BAA0B,KAAK,IAAI,KAAK;AAAA,UAC9C,UAAU,0BAA0B,KAAK,QAAQ,KAAK;AAAA,UACtD,UAAU,0BAA0B,KAAK,QAAQ,KAAK;AAAA,UACtD,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW;AAAA,UACX,cAAc;AAAA;AAAA,UACd,sBAAsB;AAAA,UACtB,yBAAyB;AAAA,QAC3B;AAEW,mBAAA,WAAW,WAAW,YAAY,CAAC;AACnC,mBAAA,SAAS,KAAK,IAAI;AAE7B,aAAK,SAAS;AAEV,YAAA,KAAK,iBAAiB,mBAAmB;AAEtC,eAAA,OAAO,kBAAkB,IAAI;AAAA,QAAA;AAGpC,cAAM,WAAW,UAAU;AAAA,MAAA,OACtB;AACO,oBAAA,WAAW,YAAY,YAAY,CAAC;AACpC,oBAAA,SAAS,KAAK,IAAI;AAE9B,aAAK,SAAS;AAAA,MAAA;AAAA,IAChB;AAGF,QACE,CAAC,UACE,MAAM,IAAI,EACV,KAAK,CAAC,SAAS,KAAK,KAAK,EAAE,WAAW,0BAA0B,CAAC,GACpE;AACA;AAAA,IAAA;AAGF,QAAI,KAAK,QAAQ;AACX,UAAA,CAAC,KAAK,yBAAyB;AACjC,aAAK,OAAO,WAAW,KAAK,OAAO,YAAY,CAAC;AAC3C,aAAA,OAAO,SAAS,KAAK,IAAI;AAAA,MAAA;AAAA,IAChC,OACK;AACL,gBAAU,KAAK,IAAI;AAAA,IAAA;AAGrB,eAAW,KAAK,IAAI;AAAA,EACtB;AAEA,aAAW,QAAQ,eAAe;AAChC,UAAM,WAAW,IAAI;AAAA,EAAA;AAQvB,+BAA6B,YAAY,MAAM;AAEtC,WAAA,qBAAqB,OAAyB,QAAQ,GAAW;AACxE,UAAM,WAAW,MAAM,IAAI,CAAC,SAAS;;AAC/B,UAAA,KAAK,iBAAiB,UAAU;AAClC;AAAA,MAAA;AAGF,UAAI,KAAK,iBAAiB,qBAAqB,GAAC,UAAK,aAAL,mBAAe,SAAQ;AACrE;AAAA,MAAA;AAGI,YAAA,QAAQ,GAAG,KAAK,YAAY;AAE9B,WAAA,UAAK,aAAL,mBAAe,QAAQ;AACzB,cAAM,eAAe,qBAAqB,KAAK,UAAU,QAAQ,CAAC;AAE5D,cAAA,sBAAsB,aAAa,KAAK;AAAA,IAClD,KAAK,SAAS,IAAI,CAAC,UAAU,GAAG,MAAM,YAAY,iBAAiB,iCAAiC,KAAK,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AAAA;AAGnH,cAAMC,YAAW,SAAS,KAAK,aAAa,KAAK;AAAA,IACrD,KAAK,SAAS,IAAI,CAAC,UAAU,GAAG,MAAM,YAAY,UAAU,iCAAiC,KAAK,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AAAA;AAG5G,cAAM,oBAAoB,SAAS,KAAK,kBAAkB,KAAK,qBAAqB,KAAK;AAElF,eAAA;AAAA,UACL;AAAA,UACA;AAAA,UACAA;AAAAA,UACA;AAAA,QAAA,EACA,KAAK,MAAM;AAAA,MAAA;AAGR,aAAA;AAAA,IAAA,CACR;AAED,WAAO,SAAS,OAAO,OAAO,EAAE,KAAK,MAAM;AAAA,EAAA;AAGvC,QAAA,0BAA0B,qBAAqB,SAAS;AAExD,QAAA,mBAAmBP,4BAAY,YAAY;AAAA,IAC/C,CAAC;;AAAO,sBAAE,cAAF,mBAAa,SAAS,IAAID,0BAAU,OAAM,KAAK;AAAA;AAAA,IACvD,CAAC,MAAM;;AAAA,qBAAE,cAAF,mBAAa,MAAM,KAAK;AAAA;AAAA,IAC/B,CAAC;;AAAO,sBAAE,cAAF,mBAAa,SAAS,OAAO,eAAc,KAAK;AAAA;AAAA,IACxD,CAAC,MAAM;AAAA,EAAA,CACR;AAEK,QAAA,UAAU,OAAO,QAAQ;AAAA,IAC7B,iBAAiB,iBAAiB,KAAK,CAAC,MAAM,EAAE,SAAS;AAAA,EAC1D,CAAA,EACE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAClB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAElB,QAAM,oBAAoB,iBAAiB,OAAO,CAAC,MAAM,EAAE,SAAS;AAEpE,WAAS,cAAc,MAAiB;AAC/B,WAAAS,gBAAA;AAAA,MACLC,gBAAA;AAAA,QACE,KAAK;AAAA,UACH,KAAK,QAAQ,4BAA4B;AAAA,UACzC,KAAK,QAAQ,OAAO,iBAAiB,KAAK,QAAQ;AAAA,QAAA;AAAA,MACpD;AAAA,IAEJ;AAAA,EAAA;AAGF,QAAM,kBAAkB,GAAG,WAAW,cAAc,QAAQ;AAC5D,QAAM,gBAAgB,kBAClB,GAAG,aAAa,cAAc,UAAU,OAAO,IAC/C;AACJ,QAAM,qBACJ,mBAAmB,cAAc,SAAS,0BAA0B;AAEtE,QAAM,eAAe;AAAA,IACnB,GAAG,OAAO;AAAA,IACV;AAAA;AAAA;AAAA,IAGA,QAAQ,SACJ,YAAY,QAAQ,KAAK,IAAI,CAAC,YAAY,eAAe,OAAO;AAAA,IAChE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,iEAAiE,eAAe,OAAO;AAAA,MACvF,6DAA6D,eAAe,OAAO;AAAA,MACnF,qBACI,qDAAqD,cAAc,aAAa,CAAC,MACjF;AAAA,MACJ,GAAG,iBACA,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAC1B,IAAI,CAAC,SAAS;AACb,eAAO,2BACL,KAAK,YACP,yBAAyB,cAAc,IAAI,CAAC;AAAA,MAC7C,CAAA;AAAA,IAAA,EACH,KAAK,IAAI;AAAA,IACX,kBAAkB,SAAS,6BAA6B;AAAA,IACxD,kBACG,IAAI,CAAC,SAAS;AACb,aAAO,SACL,KAAK,YACP,kCAAkC,KAAK,SAAS;AAAA,IAAA,CACjD,EACA,KAAK,IAAI;AAAA,IACZ;AAAA,IACA,CAAC,qBACG;AAAA;AAAA,QAGA;AAAA,IACJ,iBACG,IAAI,CAAC,SAAS;;AACN,aAAA;AAAA,QACL;AAAA,UACE,SAAS,KAAK,YAAY,WAAW,KAAK,YAAY;AAAA,YACtD;AAAA,YACA,QAAQ,KAAK,IAAI;AAAA,YACjB,CAAC,KAAK,YAAY,UAAU,KAAK,WAAW,MAAM;AAAA,YAClD,2BAAyB,UAAK,WAAL,mBAAa,iBAAgB,MAAM;AAAA,YAE3D,OAAO,OAAO,EACd,KAAK,GAAG,CAAC;AAAA;AAAA,QAEZ,EAAE,KAAK,EAAE;AAAA,MAAA,EACT,KAAK,MAAM;AAAA,IAAA,CACd,EACA,KAAK,MAAM;AAAA,IACd;AAAA,IAEA;AAAA,IACA,mBAAmB,eAAe,OAAO;AAAA;AAAA,MAEvC,WACC,IAAI,CAAC,cAAc;;AAClB,YAAM,aAAa,UAAU;AAE7B,aAAO,IAAI,UAAU;AAAA,iBACZ,UAAU;AAAA,mBACR,UAAU,SAAS,CAAC;AAAA,uBAChB,cAAc,SAAS,CAAC;AAAA,mCACZ,UAAU,YAAY;AAAA,gCAE7C,UAAU,0BACN,IAAG,eAAU,WAAV,mBAAkB,YAAY,YACjC,eAAU,WAAV,mBAAkB,gBAChB,GAAG,UAAU,OAAO,YAAY,gBAChC,WACR;AAAA;AAAA,IAAA,CAEH,EACA,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,IAGb;AAAA,IACA,WACG,IAAI,CAAC,cAAc;;AACX,aAAA,qBAAqB,cAAc,SAAS,CAAC;AAAA;AAAA,oBAExC,UAAU,SAAS;AAAA,oBACnB,UAAU,SAAS;AAAA,oBACnB,UAAU,SAAS;AAAA,oBACnB,UAAU,SAAS;AAAA,IACrC,eAAU,aAAV,mBAAoB,UAAS,GAAG,UAAU,YAAY,kBAAkB,SAAS;AAAA;AAAA;AAAA,IAAA,CAG5E,EACA,KAAK,IAAI;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,GAAG,2BAA2B,UAAU,EAAE,QAAA,CAAS,EAAE;AAAA,MACtD,CAAC,CAAC,UAAU,SAAS,MAAM;AACzB,eAAO,IAAI,QAAQ,aAAa,iCAAiC,SAAS,CAAC;AAAA,MAAA;AAAA,IAE9E,CAAA;AAAA;AAAA,IAEC;AAAA,IACA,CAAC,GAAG,qBAAqB,UAAU,EAAE,QAAA,CAAS,EAAE,IAAI,CAAC,CAAC,IAAI,SAAS,MAAM;AACzE,aAAO,IAAI,EAAE,aAAa,iCAAiC,SAAS,CAAC;AAAA,IAAA,CACtE,CAAC;AAAA;AAAA,IAEA;AAAA,KACCC,sBAAW;AAAA,IACZ,CAAC,GAAG,qBAAqB,UAAU,EAAE,QAAA,CAAS,EAAE,IAAI,CAAC,CAAC,IAAI,SAAS,MAAM;AACzE,aAAO,IAAI,EAAE,aAAa,iCAAiC,SAAS,CAAC;AAAA,IAAA,CACtE,CAAC;AAAA;AAAA,IAEA;AAAA;AAAA,eAEW,WAAW,SAAS,IAAI,CAAC,GAAG,2BAA2B,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,IAAI,QAAQ,GAAG,EAAE,KAAK,GAAG,IAAI,OAAO;AAAA;AAAA,QAExI,WAAW,SAAS,IAAI,CAAC,GAAG,qBAAqB,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,OAAO;AAAA,QAC/G,CAAC,IAAIA,WAAAA,WAAW,KAAK,GAAG,CAAC,GAAG,qBAAqB,UAAU,EAAE,KAAA,CAAM,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA;AAAA;AAAA,IAG1G;AAAA,IACA,UAAU,IAAI,CAAC,UAAU,GAAG,MAAM,YAAY,iBAAiB,iCAAiC,KAAK,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AAAA;AAAA,IAEnH;AAAA,IACA,UAAU,IAAI,CAAC,UAAU,GAAG,MAAM,YAAY,UAAU,iCAAiC,KAAK,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AAAA;AAAA,IAE5G;AAAA,EAEC,EAAA,OAAO,OAAO,EACd,KAAK,MAAM;AAEd,QAAM,sBAAsB,MAAM;AAChC,UAAM,iBAAiB;AAAA,MACrB,CAACA,sBAAW,GAAG;AAAA,QACb,UAAU,cAAc;AAAA,QACxB,UAAU,UAAU,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,MAC5C;AAAA,MACA,GAAG,OAAO;AAAA,QACR,WAAW,IAAI,CAAC,MAAM;;AACpB,gBAAM,aAAa,EAAE;AAEd,iBAAA;AAAA,YACL;AAAA,YACA;AAAA,cACE,UAAU,EAAE;AAAA,cACZ,UAAQ,OAAE,WAAF,mBAAU,aAAY,EAAE,OAAO,YAAY;AAAA,cACnD,WAAU,OAAE,aAAF,mBAAY,IAAI,CAAC,eAAe,WAAW;AAAA,YAAS;AAAA,UAElE;AAAA,QACD,CAAA;AAAA,MAAA;AAAA,IAEL;AAEA,WAAO,KAAK;AAAA,MACV;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEM,QAAA,kBAAkB,CAAC,SAAS,OAAO;AACzC,QAAM,yBAAyB,CAAC,gBAAgB,SAAS,OAAO,MAAM,IAClE,eACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,IACpB;AAAA,EAAA,EACA,KAAK,IAAI;AAEX,MAAA,CAAC,cAAe;AAEpB,QAAM,2BAA2B,MAAM,IACpC,SAAS,KAAK,QAAQ,4BAA4B,GAAG,OAAO,EAC5D,MAAM,CAAC,QAAQ;AACV,QAAA,IAAI,SAAS,UAAU;AAClB,aAAA;AAAA,IAAA;AAGH,UAAA;AAAA,EAAA,CACP;AAEC,MAAA,CAAC,cAAe;AAGd,QAAA,IAAI,MAAM,KAAK,QAAQ,KAAK,QAAQ,4BAA4B,CAAC,GAAG;AAAA,IACxE,WAAW;AAAA,EAAA,CACZ;AAEG,MAAA,CAAC,cAAe;AAGpB,QAAM,uBAAuB,MAAMR,gBAAA;AAAA,IACjC,KAAK,QAAQ,4BAA4B;AAAA,IACzC,MAAMS,gBAAO,OAAA,0BAA0B,MAAM;AAAA,IAC7C,MAAMA,gBAAO,OAAA,wBAAwB,MAAM;AAAA,IAC3C;AAAA,MACE,aAAa,MAAM;AAAA,MAAA;AAAA,IAEnB;AAAA,EAEJ;AAGA,QAAM,2BAA2B,KAAK;AAAA,IACpC,KAAK,QAAQ,MAAM,OAAO,YAAY;AAAA,IACtC;AAAA,EACF;AACA,QAAM,2BAA2BF,gBAAA;AAAA,IAC/B,KAAK;AAAA,MACH,KAAK,QAAQ,wBAAwB;AAAA,MACrC;AAAA,IAAA;AAAA,EAEJ;AACA,QAAM,8BAA8B,0BAA0B;AAAA,IAC5D;AAAA,EAAA,CACD;AACD,MAAI,CAAC,GAAG,WAAW,wBAAwB,GAAG;AACtC,UAAAP,gBAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,aAAa,MAAM;AACjB,iBAAO,IAAI,iCAAiC;AAAA,QAAA;AAAA,MAC9C;AAAA,IAEJ;AAAA,EAAA,OACK;AACC,UAAA,iCAAiC,MAAM,IAC1C,SAAS,0BAA0B,OAAO,EAC1C,MAAM,CAAC,QAAQ;AACV,UAAA,IAAI,SAAS,UAAU;AAClB,eAAA;AAAA,MAAA;AAEH,YAAA;AAAA,IAAA,CACP;AACG,UAAAA,gBAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,aAAa,MAAM;AACjB,iBAAO,IAAI,iCAAiC;AAAA,QAAA;AAAA,MAC9C;AAAA,IAEJ;AAAA,EAAA;AAGE,MAAA,wBAAwB,CAAC,eAAe;AAC1C;AAAA,EAAA;AAQJ;AAEA,SAAS,0BAA0B;AAAA,EACjC;AACF,GAEG;AACK,QAAA,mBAAmBM,iCAAiB,wBAAwB;AAEhE,SAAA;AAAA,IACE;AAAA,IACA,WAAW,gBAAgB;AAAA,EAAA,EAC3B,KAAK,IAAI,IAAI;AAEnB;AAEA,SAAS,aAAa,GAAW;AACxB,SAAA,EAAE,QAAQ,sCAAsC,EAAE;AAC3D;AAQA,SAAS,kBAAkB,MAAiB;;AAC1C,SAAQ,KAAK,OAAO,KAAK,WACrB,UAAK,cAAL,mBAAgB,QAAQ,KAAK,OAAO,aAAa,IAAI,QAAO,MAC5D,KAAK;AACX;AAUA,SAAS,0BAA0B,YAAoB,KAAa;AAC5D,QAAA,WAAW,UAAU,MAAM,GAAG;AACpC,WAAS,IAAI;AACN,SAAA,SAAS,KAAK,GAAG;AAC1B;AAUA,SAAS,qBAAqB,YAAoB,KAAa;AACvD,QAAA,WAAW,UAAU,MAAM,GAAG;AAC9B,QAAA,cAAc,SAAS,OAAO,CAAC,YAAY,CAAC,QAAQ,WAAW,GAAG,CAAC;AAClE,SAAA,YAAY,KAAK,GAAG;AAC7B;AAEA,SAAS,eACP,QACA,MACA,kBACkB;AACd,MAAA,CAAC,oBAAoB,qBAAqB,KAAK;AAC1C,WAAA;AAAA,EAAA;AAGH,QAAA,cAAcR,4BAAY,QAAQ;AAAA,IACtC,CAAC,MAAM,EAAE,UAAW,SAAS;AAAA,IAC7B,CAAC,MAAM,EAAE;AAAA,EAAA,CACV,EAAE,OAAO,CAAC,MAAM,EAAE,cAAc,IAAID,gBAAU,UAAA,EAAE;AAEjD,aAAW,SAAS,aAAa;AAC3B,QAAA,MAAM,cAAc,IAAK;AAG3B,QAAA,iBAAiB,WAAW,GAAG,MAAM,SAAS,GAAG,KACjD,MAAM,cAAc,kBACpB;AACO,aAAA;AAAA,IAAA;AAAA,EACT;AAGI,QAAA,WAAW,iBAAiB,MAAM,GAAG;AAC3C,WAAS,IAAI;AACP,QAAA,kBAAkB,SAAS,KAAK,GAAG;AAElC,SAAA,eAAe,QAAQ,MAAM,eAAe;AACrD;AAKA,MAAM,mCAAmC,CAAC,cAAiC;;AAClE,WAAA,eAAU,aAAV,mBAAoB,UACvB,GAAG,UAAU,YAAY,sBACzB,GAAG,UAAU,YAAY;AAC/B;AAKA,MAAM,6BAA6B,CACjC,eAC2B;AAC3B,SAAO,IAAI;AAAA,IACT,WAAW,IAAI,CAAC,cAAc,CAAC,cAAc,SAAS,GAAG,SAAS,CAAC;AAAA,EACrE;AACF;AAKA,MAAM,uBAAuB,CAC3B,eAC2B;AAC3B,SAAO,IAAI;AAAA,IACT,6BAA6B,UAAU,EAAE,IAAI,CAAC,cAAc;AAAA,MAC1D,QAAQ,SAAS;AAAA,MACjB;AAAA,IACD,CAAA;AAAA,EACH;AACF;AAKA,MAAM,uBAAuB,CAC3B,eAC2B;AAC3B,SAAO,IAAI;AAAA,IACT,WAAW,IAAI,CAAC,cAAc;AACtB,YAAA,KAAK,UAAU,aAAa;AAC3B,aAAA,CAAC,IAAI,SAAS;AAAA,IACtB,CAAA;AAAA,EACH;AACF;AAKA,MAAM,gBAAgB,CAAC,cAAiC;AACtD,QAAM,WAAW;AAAA,IACfM,gBAAAA,kBAAkB,qBAAqB,UAAU,SAAS,CAAC,KAAK;AAAA,EAClE;AAEA,SAAO,UAAU,gBAAgB,MAAM,WAAW,SAAS,QAAQ,OAAO,EAAE;AAC9E;AAKA,MAAM,YAAY,CAAC,cAAiC;;AAC3C,SAAA,UAAU,gBAAgB,MAC7B,UAAU,gBACT,eAAU,gBAAV,mBAAuB,QAAQ,OAAO,QAAO;AACpD;AAKA,MAAM,UAAU,CAAC,cAAiC;AAC1C,QAAA,WAAW,cAAc,SAAS;AAEpC,MAAA,aAAa,IAAY,QAAA;AAEtB,SAAA,SAAS,QAAQ,OAAO,EAAE;AACnC;AAKA,MAAM,+BAA+B,CACnC,WACqB;AACd,SAAA,OAAO,OAAO,CAAC,UAAU;;AAC1B,SAAA,WAAM,aAAN,mBAAgB,KAAK,CAAC,UAAU,MAAM,gBAAgB,KAAa,QAAA;AAChE,WAAA;AAAA,EAAA,CACR;AACH;AAEA,SAAS,YAAsB,QAAyB,KAAqB;AAG3E,QAAM,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AAC/B,QAAA,aAAa,IAAI,IAAI,IAAI;AAC3B,MAAA,KAAK,WAAW,WAAW,MAAM;AAC7B,UAAA,gBAAgB,KAAK,OAAO,CAAC,GAAG,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC;AACjE,UAAM,mBAAmB,OAAO;AAAA,MAAO,CAAC,MACtC,cAAc,SAAS,EAAE,GAAG,CAAC;AAAA,IAC/B;AACO,WAAA;AAAA,EAAA;AAEF,SAAA;AACT;AAEA,SAAS,6BACP,SACA,QACA;AACA,QAAM,SAAS,QAAQ,IAAI,CAAC,MAAM;AAC1B,UAAA,mBAAmB,cAAc,CAAC;AACjC,WAAA,EAAE,GAAG,GAAG,iBAAiB;AAAA,EAAA,CACjC;AAEK,QAAA,mBAAmB,YAAY,QAAQ,kBAAkB;AAE/D,MAAI,qBAAqB,QAAW;AAClC,UAAM,eAAe,qEAAqE,iBAAiB,SAAS,IAAI,MAAM,EAAE,KAAK,iBAClI,IAAI,CAAC,MAAM,IAAI,EAAE,gBAAgB,GAAG,EACpC,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,GAEO,iBAAiB,IAAI,CAAC,MAAM,KAAK,QAAQ,OAAO,iBAAiB,EAAE,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC;AAAA;AAC7G,YAAQ,MAAM,YAAY;AAC1B,YAAQ,KAAK,CAAC;AAAA,EAAA;AAElB;;"}
|
|
@@ -161,7 +161,8 @@ Add the file in: "${config.routesDirectory}/${rootPathId}.tsx"`;
|
|
|
161
161
|
node.cleanedPath = removeGroups(
|
|
162
162
|
removeUnderscores(removeLayoutSegments(node.path)) ?? ""
|
|
163
163
|
);
|
|
164
|
-
const
|
|
164
|
+
const stats = fs.statSync(node.fullPath);
|
|
165
|
+
const routeCode = stats.isFile() ? fs.readFileSync(node.fullPath, "utf-8") : "";
|
|
165
166
|
if (!node.isVirtualParentRoute && !node.isVirtual) ;
|
|
166
167
|
const cleanedPathIsEmpty = (node.cleanedPath || "").length === 0;
|
|
167
168
|
const nonPathRoute = node._fsRouteType === "pathless_layout" && node.isNonPath;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["../../../src/start-server-routes-plugin/plugin.ts"],"sourcesContent":["import path, { isAbsolute, join, normalize } from 'node:path'\nimport fs from 'node:fs'\nimport fsp from 'node:fs/promises'\nimport {\n format,\n logging,\n multiSortBy,\n physicalGetRouteNodes,\n removeExt,\n removeUnderscores,\n replaceBackslash,\n resetRegex,\n rootPathId,\n routePathToVariable,\n trimPathLeft,\n virtualGetRouteNodes,\n writeIfDifferent,\n} from '@tanstack/router-generator'\nimport { rootRouteId } from '@tanstack/router-core'\nimport { fillTemplate, getTargetTemplate } from './template'\nimport type { GetRouteNodesResult, RouteNode } from '@tanstack/router-generator'\nimport type { Config } from './config'\nimport type { Plugin } from 'vite'\n\nlet lock = false\nconst checkLock = () => lock\nconst setLock = (bool: boolean) => {\n lock = bool\n}\n\nexport function TanStackStartServerRoutesVite(config: Config): Plugin {\n let ROOT: string = process.cwd()\n const moduleId = 'tanstack-start-server-routes-manifest:v'\n\n const getRoutesDirectoryPath = () => {\n return isAbsolute(config.routesDirectory)\n ? config.routesDirectory\n : join(ROOT, config.routesDirectory)\n }\n\n const generate = async () => {\n if (checkLock()) {\n return\n }\n\n setLock(true)\n\n try {\n await generator(config, ROOT)\n } catch (err) {\n console.error(err)\n console.info()\n } finally {\n setLock(false)\n }\n }\n\n const handleFile = async (file: string) => {\n const filePath = normalize(file)\n\n const routesDirectoryPath = getRoutesDirectoryPath()\n if (filePath.startsWith(routesDirectoryPath)) {\n await generate()\n }\n }\n\n return {\n name: 'tanstack-start-server-routes-plugin',\n configureServer(server) {\n server.watcher.on('all', (event, path) => {\n handleFile(path)\n })\n },\n configResolved(config) {\n ROOT = config.root\n },\n async buildStart() {\n await generate()\n // if (this.environment.name === 'server') {\n // }\n },\n sharedDuringBuild: true,\n resolveId(id) {\n if (id === moduleId) {\n const generatedRouteTreePath = getGeneratedRouteTreePath(ROOT)\n return generatedRouteTreePath\n }\n return null\n },\n }\n}\n\n// Maybe import this from `@tanstack/router-core` in the future???\nlet latestTask = 0\nconst routeGroupPatternRegex = /\\(.+\\)/g\nconst possiblyNestedRouteGroupPatternRegex = /\\([^/]+\\)\\/?/g\n\nlet isFirst = false\nlet skipMessage = false\n\nfunction getGeneratedRouteTreePath(root: string) {\n return path.resolve(root, '.tanstack-start/server-routes/routeTree.gen.ts')\n}\n\nasync function generator(config: Config, root: string) {\n const generatedServerRouteTreePath = getGeneratedRouteTreePath(root)\n const ROUTE_TEMPLATE = getTargetTemplate(config.target)\n const logger = logging({ disabled: config.disableLogging })\n\n if (!isFirst) {\n // logger.log('♻️ Generating server routes...')\n isFirst = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n // logger.log('♻️ Regenerating server routes...')\n }\n\n const taskId = latestTask + 1\n latestTask = taskId\n\n const checkLatest = () => {\n if (latestTask !== taskId) {\n skipMessage = true\n return false\n }\n\n return true\n }\n\n const start = Date.now()\n\n let 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}.tsx\" file to your routes directory.\\nAdd the file in: \"${config.routesDirectory}/${rootPathId}.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\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 const routeCode = node.fullPath\n ? fs.readFileSync(node.fullPath, 'utf-8')\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 escapedRoutePath = node.routePath?.replaceAll('$', '$$') ?? ''\n // let replaced = routeCode\n // await writeIfDifferent(node.fullPath, routeCode, replaced, {\n // beforeWrite: () => {\n // // logger.log(`🟡 Updating ${node.fullPath}`)\n // },\n // })\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 (\n !routeCode\n .split('\\n')\n .some((line) => line.trim().startsWith('export const ServerRoute'))\n ) {\n return\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 `routeNodes` array since it\n // has the accumulated (intended) Server Route nodes\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(routeNodes, config)\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 = `interface ${route}Children {\n ${node.children.map((child) => `${child.variableName}Route: typeof ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`\n\n const children = `const ${route}Children: ${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 })\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(generatedServerRouteTreePath),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n ),\n )\n }\n\n const rootRouteExists = fs.existsSync(rootRouteNode.fullPath)\n const rootRouteCode = rootRouteExists\n ? fs.readFileSync(rootRouteNode.fullPath, 'utf-8')\n : ''\n const hasServerRootRoute =\n rootRouteExists && rootRouteCode.includes('export const ServerRoute')\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 type { FileRoutesByPath, CreateServerFileRoute } from '${ROUTE_TEMPLATE.fullPkg}'`,\n `import { createServerRoute, createServerFileRoute } from '${ROUTE_TEMPLATE.fullPkg}'`,\n hasServerRootRoute\n ? `import { ServerRoute as rootRouteImport } from './${getImportPath(rootRouteNode)}'`\n : '',\n ...sortedRouteNodes\n .filter((d) => !d.isVirtual)\n .map((node) => {\n return `import { ServerRoute 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 !hasServerRootRoute\n ? `\n const rootRoute = createServerRoute()\n `\n : '',\n sortedRouteNodes\n .map((node) => {\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 } as any)`,\n ].join(''),\n ].join('\\n\\n')\n })\n .join('\\n\\n'),\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 `// Add type-safety to the createFileRoute function across the route tree`,\n routeNodes\n .map((routeNode) => {\n return `declare module './${getImportPath(routeNode)}' {\nconst createServerFileRoute: CreateServerFileRoute<\nFileRoutesByPath['${routeNode.routePath}']['parentRoute'],\nFileRoutesByPath['${routeNode.routePath}']['id'],\nFileRoutesByPath['${routeNode.routePath}']['path'],\nFileRoutesByPath['${routeNode.routePath}']['fullPath'],\n${routeNode.children?.length ? `${routeNode.variableName}RouteChildren` : 'unknown'}\n>\n}`\n })\n .join('\\n'),\n '// Create and export the route tree',\n routeConfigChildrenText,\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 `const rootRouteChildren: RootRouteChildren = {\n ${routeTree.map((child) => `${child.variableName}Route: ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`,\n `export const routeTree = rootRoute._addFileChildren(rootRouteChildren)._addFileTypes<FileRouteTypes>()`,\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 = !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(generatedServerRouteTreePath), '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(generatedServerRouteTreePath)), {\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(generatedServerRouteTreePath),\n await format(existingRouteTreeContent, config),\n await format(routeConfigFileContent, config),\n {\n beforeWrite: () => {\n // logger.log(`🟡 Updating ${generatedRouteTreePath}`)\n },\n },\n )\n\n // Write declaration file\n const startDeclarationFilePath = path.join(\n path.resolve(root, config.srcDirectory),\n 'tanstack-start.d.ts',\n )\n const serverRoutesRelativePath = removeExt(\n path.relative(\n path.dirname(startDeclarationFilePath),\n generatedServerRouteTreePath,\n ),\n )\n const startDeclarationFileContent = buildStartDeclarationFile({\n serverRoutesRelativePath,\n })\n if (!fs.existsSync(startDeclarationFilePath)) {\n await writeIfDifferent(\n startDeclarationFilePath,\n '',\n startDeclarationFileContent,\n {\n beforeWrite: () => {\n logger.log(`🟡 Creating tanstack-start.d.ts`)\n },\n },\n )\n } else {\n const existingDeclarationFileContent = await fsp\n .readFile(startDeclarationFilePath, 'utf-8')\n .catch((err) => {\n if (err.code === 'ENOENT') {\n return ''\n }\n throw err\n })\n await writeIfDifferent(\n startDeclarationFilePath,\n existingDeclarationFileContent,\n startDeclarationFileContent,\n {\n beforeWrite: () => {\n logger.log(`🟡 Updating tanstack-start.d.ts`)\n },\n },\n )\n }\n\n if (routeTreeWriteResult && !checkLatest()) {\n return\n }\n\n // logger.log(\n // `✅ Processed ${routeNodes.length === 1 ? 'server route' : 'server routes'} in ${\n // Date.now() - start\n // }ms`,\n // )\n}\n\nfunction buildStartDeclarationFile({\n serverRoutesRelativePath,\n}: {\n serverRoutesRelativePath: string\n}) {\n const serverRoutesPath = replaceBackslash(serverRoutesRelativePath)\n return (\n [\n '/// <reference types=\"vite/client\" />',\n `import '${serverRoutesPath}'`,\n ].join('\\n') + '\\n'\n )\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 */\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 Server Route has a unique full path.\nConflicting files: \\n ${conflictingFiles.map((d) => path.resolve(config.routesDirectory, d.filePath)).join('\\n ')}\\n`\n console.error(errorMessage)\n process.exit(1)\n }\n}\n"],"names":["path","config","children"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["../../../src/start-server-routes-plugin/plugin.ts"],"sourcesContent":["import path, { isAbsolute, join, normalize } from 'node:path'\nimport fs from 'node:fs'\nimport fsp from 'node:fs/promises'\nimport {\n format,\n logging,\n multiSortBy,\n physicalGetRouteNodes,\n removeExt,\n removeUnderscores,\n replaceBackslash,\n resetRegex,\n rootPathId,\n routePathToVariable,\n trimPathLeft,\n virtualGetRouteNodes,\n writeIfDifferent,\n} from '@tanstack/router-generator'\nimport { rootRouteId } from '@tanstack/router-core'\nimport { fillTemplate, getTargetTemplate } from './template'\nimport type { GetRouteNodesResult, RouteNode } from '@tanstack/router-generator'\nimport type { Config } from './config'\nimport type { Plugin } from 'vite'\n\nlet lock = false\nconst checkLock = () => lock\nconst setLock = (bool: boolean) => {\n lock = bool\n}\n\nexport function TanStackStartServerRoutesVite(config: Config): Plugin {\n let ROOT: string = process.cwd()\n const moduleId = 'tanstack-start-server-routes-manifest:v'\n\n const getRoutesDirectoryPath = () => {\n return isAbsolute(config.routesDirectory)\n ? config.routesDirectory\n : join(ROOT, config.routesDirectory)\n }\n\n const generate = async () => {\n if (checkLock()) {\n return\n }\n\n setLock(true)\n\n try {\n await generator(config, ROOT)\n } catch (err) {\n console.error(err)\n console.info()\n } finally {\n setLock(false)\n }\n }\n\n const handleFile = async (file: string) => {\n const filePath = normalize(file)\n\n const routesDirectoryPath = getRoutesDirectoryPath()\n if (filePath.startsWith(routesDirectoryPath)) {\n await generate()\n }\n }\n\n return {\n name: 'tanstack-start-server-routes-plugin',\n configureServer(server) {\n server.watcher.on('all', (event, path) => {\n handleFile(path)\n })\n },\n configResolved(config) {\n ROOT = config.root\n },\n async buildStart() {\n await generate()\n // if (this.environment.name === 'server') {\n // }\n },\n sharedDuringBuild: true,\n resolveId(id) {\n if (id === moduleId) {\n const generatedRouteTreePath = getGeneratedRouteTreePath(ROOT)\n return generatedRouteTreePath\n }\n return null\n },\n }\n}\n\n// Maybe import this from `@tanstack/router-core` in the future???\nlet latestTask = 0\nconst routeGroupPatternRegex = /\\(.+\\)/g\nconst possiblyNestedRouteGroupPatternRegex = /\\([^/]+\\)\\/?/g\n\nlet isFirst = false\nlet skipMessage = false\n\nfunction getGeneratedRouteTreePath(root: string) {\n return path.resolve(root, '.tanstack-start/server-routes/routeTree.gen.ts')\n}\n\nasync function generator(config: Config, root: string) {\n const generatedServerRouteTreePath = getGeneratedRouteTreePath(root)\n const ROUTE_TEMPLATE = getTargetTemplate(config.target)\n const logger = logging({ disabled: config.disableLogging })\n\n if (!isFirst) {\n // logger.log('♻️ Generating server routes...')\n isFirst = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n // logger.log('♻️ Regenerating server routes...')\n }\n\n const taskId = latestTask + 1\n latestTask = taskId\n\n const checkLatest = () => {\n if (latestTask !== taskId) {\n skipMessage = true\n return false\n }\n\n return true\n }\n\n const start = Date.now()\n\n let 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}.tsx\" file to your routes directory.\\nAdd the file in: \"${config.routesDirectory}/${rootPathId}.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\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 const stats = fs.statSync(node.fullPath)\n const routeCode = stats.isFile()\n ? fs.readFileSync(node.fullPath, 'utf-8')\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 escapedRoutePath = node.routePath?.replaceAll('$', '$$') ?? ''\n // let replaced = routeCode\n // await writeIfDifferent(node.fullPath, routeCode, replaced, {\n // beforeWrite: () => {\n // // logger.log(`🟡 Updating ${node.fullPath}`)\n // },\n // })\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 (\n !routeCode\n .split('\\n')\n .some((line) => line.trim().startsWith('export const ServerRoute'))\n ) {\n return\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 `routeNodes` array since it\n // has the accumulated (intended) Server Route nodes\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(routeNodes, config)\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 = `interface ${route}Children {\n ${node.children.map((child) => `${child.variableName}Route: typeof ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`\n\n const children = `const ${route}Children: ${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 })\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(generatedServerRouteTreePath),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n ),\n )\n }\n\n const rootRouteExists = fs.existsSync(rootRouteNode.fullPath)\n const rootRouteCode = rootRouteExists\n ? fs.readFileSync(rootRouteNode.fullPath, 'utf-8')\n : ''\n const hasServerRootRoute =\n rootRouteExists && rootRouteCode.includes('export const ServerRoute')\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 type { FileRoutesByPath, CreateServerFileRoute } from '${ROUTE_TEMPLATE.fullPkg}'`,\n `import { createServerRoute, createServerFileRoute } from '${ROUTE_TEMPLATE.fullPkg}'`,\n hasServerRootRoute\n ? `import { ServerRoute as rootRouteImport } from './${getImportPath(rootRouteNode)}'`\n : '',\n ...sortedRouteNodes\n .filter((d) => !d.isVirtual)\n .map((node) => {\n return `import { ServerRoute 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 !hasServerRootRoute\n ? `\n const rootRoute = createServerRoute()\n `\n : '',\n sortedRouteNodes\n .map((node) => {\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 } as any)`,\n ].join(''),\n ].join('\\n\\n')\n })\n .join('\\n\\n'),\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 `// Add type-safety to the createFileRoute function across the route tree`,\n routeNodes\n .map((routeNode) => {\n return `declare module './${getImportPath(routeNode)}' {\nconst createServerFileRoute: CreateServerFileRoute<\nFileRoutesByPath['${routeNode.routePath}']['parentRoute'],\nFileRoutesByPath['${routeNode.routePath}']['id'],\nFileRoutesByPath['${routeNode.routePath}']['path'],\nFileRoutesByPath['${routeNode.routePath}']['fullPath'],\n${routeNode.children?.length ? `${routeNode.variableName}RouteChildren` : 'unknown'}\n>\n}`\n })\n .join('\\n'),\n '// Create and export the route tree',\n routeConfigChildrenText,\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 `const rootRouteChildren: RootRouteChildren = {\n ${routeTree.map((child) => `${child.variableName}Route: ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`,\n `export const routeTree = rootRoute._addFileChildren(rootRouteChildren)._addFileTypes<FileRouteTypes>()`,\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 = !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(generatedServerRouteTreePath), '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(generatedServerRouteTreePath)), {\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(generatedServerRouteTreePath),\n await format(existingRouteTreeContent, config),\n await format(routeConfigFileContent, config),\n {\n beforeWrite: () => {\n // logger.log(`🟡 Updating ${generatedRouteTreePath}`)\n },\n },\n )\n\n // Write declaration file\n const startDeclarationFilePath = path.join(\n path.resolve(root, config.srcDirectory),\n 'tanstack-start.d.ts',\n )\n const serverRoutesRelativePath = removeExt(\n path.relative(\n path.dirname(startDeclarationFilePath),\n generatedServerRouteTreePath,\n ),\n )\n const startDeclarationFileContent = buildStartDeclarationFile({\n serverRoutesRelativePath,\n })\n if (!fs.existsSync(startDeclarationFilePath)) {\n await writeIfDifferent(\n startDeclarationFilePath,\n '',\n startDeclarationFileContent,\n {\n beforeWrite: () => {\n logger.log(`🟡 Creating tanstack-start.d.ts`)\n },\n },\n )\n } else {\n const existingDeclarationFileContent = await fsp\n .readFile(startDeclarationFilePath, 'utf-8')\n .catch((err) => {\n if (err.code === 'ENOENT') {\n return ''\n }\n throw err\n })\n await writeIfDifferent(\n startDeclarationFilePath,\n existingDeclarationFileContent,\n startDeclarationFileContent,\n {\n beforeWrite: () => {\n logger.log(`🟡 Updating tanstack-start.d.ts`)\n },\n },\n )\n }\n\n if (routeTreeWriteResult && !checkLatest()) {\n return\n }\n\n // logger.log(\n // `✅ Processed ${routeNodes.length === 1 ? 'server route' : 'server routes'} in ${\n // Date.now() - start\n // }ms`,\n // )\n}\n\nfunction buildStartDeclarationFile({\n serverRoutesRelativePath,\n}: {\n serverRoutesRelativePath: string\n}) {\n const serverRoutesPath = replaceBackslash(serverRoutesRelativePath)\n return (\n [\n '/// <reference types=\"vite/client\" />',\n `import '${serverRoutesPath}'`,\n ].join('\\n') + '\\n'\n )\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 */\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 Server Route has a unique full path.\nConflicting files: \\n ${conflictingFiles.map((d) => path.resolve(config.routesDirectory, d.filePath)).join('\\n ')}\\n`\n console.error(errorMessage)\n process.exit(1)\n }\n}\n"],"names":["path","config","children"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/start-plugin-core",
|
|
3
|
-
"version": "1.121.0-alpha.
|
|
3
|
+
"version": "1.121.0-alpha.21",
|
|
4
4
|
"description": "Modern and scalable routing for React applications",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -64,10 +64,10 @@
|
|
|
64
64
|
"xmlbuilder2": "^3.1.1",
|
|
65
65
|
"zod": "^3.24.2",
|
|
66
66
|
"@tanstack/router-core": "^1.121.0-alpha.14",
|
|
67
|
-
"@tanstack/router-plugin": "^1.121.0-alpha.14",
|
|
68
67
|
"@tanstack/router-generator": "^1.121.0-alpha.14",
|
|
69
68
|
"@tanstack/router-utils": "^1.121.0-alpha.2",
|
|
70
|
-
"@tanstack/server-functions-plugin": "^1.121.0-alpha.8"
|
|
69
|
+
"@tanstack/server-functions-plugin": "^1.121.0-alpha.8",
|
|
70
|
+
"@tanstack/router-plugin": "^1.121.0-alpha.14"
|
|
71
71
|
},
|
|
72
72
|
"devDependencies": {
|
|
73
73
|
"vite": "^6.0.0"
|
|
@@ -245,7 +245,8 @@ async function generator(config: Config, root: string) {
|
|
|
245
245
|
removeUnderscores(removeLayoutSegments(node.path)) ?? '',
|
|
246
246
|
)
|
|
247
247
|
|
|
248
|
-
const
|
|
248
|
+
const stats = fs.statSync(node.fullPath)
|
|
249
|
+
const routeCode = stats.isFile()
|
|
249
250
|
? fs.readFileSync(node.fullPath, 'utf-8')
|
|
250
251
|
: ''
|
|
251
252
|
|