@tanstack/router-generator 1.102.5 → 1.102.6

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.
@@ -1,8 +1,7 @@
1
1
  import path from "node:path";
2
2
  import * as fs from "node:fs";
3
3
  import * as fsp from "node:fs/promises";
4
- import * as prettier from "prettier";
5
- import { logging, multiSortBy, replaceBackslash, removeExt, writeIfDifferent, determineInitialRoutePath, resetRegex, trimPathLeft, removeUnderscores, routePathToVariable, removeTrailingSlash } from "./utils.js";
4
+ import { logging, multiSortBy, replaceBackslash, removeExt, writeIfDifferent, format, determineInitialRoutePath, resetRegex, trimPathLeft, removeUnderscores, routePathToVariable, removeTrailingSlash } from "./utils.js";
6
5
  import { getRouteNodes as getRouteNodes$1 } from "./filesystem/physical/getRouteNodes.js";
7
6
  import { getRouteNodes } from "./filesystem/virtual/getRouteNodes.js";
8
7
  import { rootPathId } from "./filesystem/physical/rootPathId.js";
@@ -39,11 +38,6 @@ async function generator(config, root) {
39
38
  };
40
39
  const start = Date.now();
41
40
  const TYPES_DISABLED = config.disableTypes;
42
- const prettierOptions = {
43
- semi: config.semicolons,
44
- singleQuote: config.quoteStyle === "single",
45
- parser: "typescript"
46
- };
47
41
  let getRouteNodesResult;
48
42
  if (config.virtualRouteConfig) {
49
43
  getRouteNodesResult = await getRouteNodes(config, root);
@@ -87,16 +81,22 @@ Add the file in: "${config.routesDirectory}/${rootPathId}.${config.disableTypes
87
81
  const routeCode = fs.readFileSync(node.fullPath, "utf-8");
88
82
  if (!routeCode) {
89
83
  const _rootTemplate = ROUTE_TEMPLATE.rootRoute;
90
- const replaced = fillTemplate(_rootTemplate.template(), {
84
+ const replaced = await fillTemplate(config, _rootTemplate.template(), {
91
85
  tsrImports: _rootTemplate.imports.tsrImports(),
92
86
  tsrPath: rootPathId,
93
87
  tsrExportStart: _rootTemplate.imports.tsrExportStart(),
94
88
  tsrExportEnd: _rootTemplate.imports.tsrExportEnd()
95
89
  });
96
- logger.log(`🟡 Creating ${node.fullPath}`);
97
- fs.writeFileSync(
90
+ await writeIfDifferent(
98
91
  node.fullPath,
99
- await prettier.format(replaced, prettierOptions)
92
+ "",
93
+ // Empty string because the file doesn't exist yet
94
+ replaced,
95
+ {
96
+ beforeWrite: () => {
97
+ logger.log(`🟡 Creating ${node.fullPath}`);
98
+ }
99
+ }
100
100
  );
101
101
  }
102
102
  };
@@ -132,7 +132,8 @@ Add the file in: "${config.routesDirectory}/${rootPathId}.${config.disableTypes
132
132
  const tLazyRouteTemplate = ROUTE_TEMPLATE.lazyRoute;
133
133
  if (!routeCode) {
134
134
  if (node.isLazy) {
135
- replaced = fillTemplate(
135
+ replaced = await fillTemplate(
136
+ config,
136
137
  (((_c = config.customScaffolding) == null ? void 0 : _c.lazyRouteTemplate) || ((_d = config.customScaffolding) == null ? void 0 : _d.routeTemplate)) ?? tLazyRouteTemplate.template(),
137
138
  {
138
139
  tsrImports: tLazyRouteTemplate.imports.tsrImports(),
@@ -142,7 +143,8 @@ Add the file in: "${config.routesDirectory}/${rootPathId}.${config.disableTypes
142
143
  }
143
144
  );
144
145
  } else if (node.isRoute || !node.isComponent && !node.isErrorComponent && !node.isPendingComponent && !node.isLoader) {
145
- replaced = fillTemplate(
146
+ replaced = await fillTemplate(
147
+ config,
146
148
  ((_e = config.customScaffolding) == null ? void 0 : _e.routeTemplate) ?? tRouteTemplate.template(),
147
149
  {
148
150
  tsrImports: tRouteTemplate.imports.tsrImports(),
@@ -167,17 +169,11 @@ Add the file in: "${config.routesDirectory}/${rootPathId}.${config.disableTypes
167
169
  (_, __, p2, ___, p4) => `${node.isLazy ? "createLazyFileRoute" : "createFileRoute"}${p2}${escapedRoutePath}${p4}`
168
170
  );
169
171
  }
170
- await writeIfDifferent(
171
- node.fullPath,
172
- prettierOptions,
173
- routeCode,
174
- replaced,
175
- {
176
- beforeWrite: () => {
177
- logger.log(`🟡 Updating ${node.fullPath}`);
178
- }
172
+ await writeIfDifferent(node.fullPath, routeCode, replaced, {
173
+ beforeWrite: () => {
174
+ logger.log(`🟡 Updating ${node.fullPath}`);
179
175
  }
180
- );
176
+ });
181
177
  }
182
178
  if (!node.isVirtual && (node.isLoader || node.isComponent || node.isErrorComponent || node.isPendingComponent || node.isLazy)) {
183
179
  routePiecesByPath[node.routePath] = routePiecesByPath[node.routePath] || {};
@@ -259,7 +255,8 @@ Add the file in: "${config.routesDirectory}/${rootPathId}.${config.disableTypes
259
255
  const routeCode = fs.readFileSync(node.fullPath, "utf-8");
260
256
  const escapedRoutePath = ((_a = node.routePath) == null ? void 0 : _a.replaceAll("$", "$$")) ?? "";
261
257
  if (!routeCode) {
262
- const replaced = fillTemplate(
258
+ const replaced = await fillTemplate(
259
+ config,
263
260
  ((_b = config.customScaffolding) == null ? void 0 : _b.apiTemplate) ?? defaultAPIRouteTemplate,
264
261
  {
265
262
  tsrImports: "import { createAPIFileRoute } from '@tanstack/start/api';",
@@ -268,15 +265,20 @@ Add the file in: "${config.routesDirectory}/${rootPathId}.${config.disableTypes
268
265
  tsrExportEnd: ");"
269
266
  }
270
267
  );
271
- logger.log(`🟡 Creating ${node.fullPath}`);
272
- fs.writeFileSync(
268
+ await writeIfDifferent(
273
269
  node.fullPath,
274
- await prettier.format(replaced, prettierOptions)
270
+ "",
271
+ // Empty string because the file doesn't exist yet
272
+ replaced,
273
+ {
274
+ beforeWrite: () => {
275
+ logger.log(`🟡 Creating ${node.fullPath}`);
276
+ }
277
+ }
275
278
  );
276
279
  } else {
277
280
  await writeIfDifferent(
278
281
  node.fullPath,
279
- prettierOptions,
280
282
  routeCode,
281
283
  routeCode.replace(
282
284
  /(createAPIFileRoute\(\s*['"])([^\s]*)(['"],?\s*\))/g,
@@ -551,9 +553,8 @@ Add the file in: "${config.routesDirectory}/${rootPathId}.${config.disableTypes
551
553
  if (!checkLatest()) return;
552
554
  const routeTreeWriteResult = await writeIfDifferent(
553
555
  path.resolve(config.generatedRouteTree),
554
- prettierOptions,
555
- existingRouteTreeContent,
556
- routeConfigFileContent,
556
+ await format(existingRouteTreeContent, config),
557
+ await format(routeConfigFileContent, config),
557
558
  {
558
559
  beforeWrite: () => {
559
560
  logger.log(`🟡 Updating ${config.generatedRouteTree}`);
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sources":["../../src/generator.ts"],"sourcesContent":["import path from 'node:path'\nimport * as fs from 'node:fs'\nimport * as fsp from 'node:fs/promises'\nimport * as prettier from 'prettier'\nimport {\n determineInitialRoutePath,\n logging,\n multiSortBy,\n removeExt,\n removeTrailingSlash,\n removeUnderscores,\n replaceBackslash,\n resetRegex,\n routePathToVariable,\n trimPathLeft,\n writeIfDifferent,\n} from './utils'\nimport { getRouteNodes as physicalGetRouteNodes } from './filesystem/physical/getRouteNodes'\nimport { getRouteNodes as virtualGetRouteNodes } from './filesystem/virtual/getRouteNodes'\nimport { rootPathId } from './filesystem/physical/rootPathId'\nimport {\n defaultAPIRouteTemplate,\n fillTemplate,\n getTargetTemplate,\n} from './template'\nimport type { GetRouteNodesResult, RouteNode } from './types'\nimport type { Config } from './config'\n\nexport const CONSTANTS = {\n // When changing this, you'll want to update the import in `start/api/index.ts#defaultAPIFileRouteHandler`\n APIRouteExportVariable: 'APIRoute',\n}\n\nlet latestTask = 0\nconst routeGroupPatternRegex = /\\(.+\\)/g\nconst possiblyNestedRouteGroupPatternRegex = /\\([^/]+\\)\\/?/g\n\nlet isFirst = false\nlet skipMessage = false\n\ntype RouteSubNode = {\n component?: RouteNode\n errorComponent?: RouteNode\n pendingComponent?: RouteNode\n loader?: RouteNode\n lazy?: RouteNode\n}\n\nexport async function generator(config: Config, root: string) {\n const ROUTE_TEMPLATE = getTargetTemplate(config.target)\n const logger = logging({ disabled: config.disableLogging })\n logger.log('')\n\n if (!isFirst) {\n logger.log('♻️ Generating routes...')\n isFirst = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n logger.log('♻️ Regenerating routes...')\n }\n\n const taskId = latestTask + 1\n latestTask = taskId\n\n const checkLatest = () => {\n if (latestTask !== taskId) {\n skipMessage = true\n return false\n }\n\n return true\n }\n\n const start = Date.now()\n\n const TYPES_DISABLED = config.disableTypes\n\n const prettierOptions: prettier.Options = {\n semi: config.semicolons,\n singleQuote: config.quoteStyle === 'single',\n parser: 'typescript',\n }\n\n let getRouteNodesResult: GetRouteNodesResult\n\n if (config.virtualRouteConfig) {\n getRouteNodesResult = await virtualGetRouteNodes(config, root)\n } else {\n getRouteNodesResult = await physicalGetRouteNodes(config, root)\n }\n\n const { rootRouteNode, routeNodes: beforeRouteNodes } = getRouteNodesResult\n if (rootRouteNode === undefined) {\n let errorMessage = `rootRouteNode must not be undefined. Make sure you've added your root route into the route-tree.`\n if (!config.virtualRouteConfig) {\n errorMessage += `\\nMake sure that you add a \"${rootPathId}.${config.disableTypes ? 'js' : 'tsx'}\" file to your routes directory.\\nAdd the file in: \"${config.routesDirectory}/${rootPathId}.${config.disableTypes ? 'js' : 'tsx'}\"`\n }\n throw new Error(errorMessage)\n }\n\n const preRouteNodes = multiSortBy(beforeRouteNodes, [\n (d) => (d.routePath === '/' ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) =>\n d.filePath.match(new RegExp(`[./]${config.indexToken}[.]`)) ? 1 : -1,\n (d) =>\n d.filePath.match(\n /[./](component|errorComponent|pendingComponent|loader|lazy)[.]/,\n )\n ? 1\n : -1,\n (d) =>\n d.filePath.match(new RegExp(`[./]${config.routeToken}[.]`)) ? -1 : 1,\n (d) => (d.routePath?.endsWith('/') ? -1 : 1),\n (d) => d.routePath,\n ]).filter((d) => ![`/${rootPathId}`].includes(d.routePath || ''))\n\n const routeTree: Array<RouteNode> = []\n const routePiecesByPath: Record<string, RouteSubNode> = {}\n\n // Loop over the flat list of routeNodes and\n // build up a tree based on the routeNodes' routePath\n const routeNodes: Array<RouteNode> = []\n\n // the handleRootNode function is not being collapsed into the handleNode function\n // because it requires only a subset of the logic that the handleNode function requires\n // and it's easier to read and maintain this way\n const handleRootNode = async (node?: RouteNode) => {\n if (!node) {\n // currently this is not being handled, but it could be in the future\n // for example to handle a virtual root route\n return\n }\n\n // from here on, we are only handling the root node that's present in the file system\n const routeCode = fs.readFileSync(node.fullPath, 'utf-8')\n\n if (!routeCode) {\n const _rootTemplate = ROUTE_TEMPLATE.rootRoute\n const replaced = fillTemplate(_rootTemplate.template(), {\n tsrImports: _rootTemplate.imports.tsrImports(),\n tsrPath: rootPathId,\n tsrExportStart: _rootTemplate.imports.tsrExportStart(),\n tsrExportEnd: _rootTemplate.imports.tsrExportEnd(),\n })\n\n logger.log(`🟡 Creating ${node.fullPath}`)\n fs.writeFileSync(\n node.fullPath,\n await prettier.format(replaced, prettierOptions),\n )\n }\n }\n\n await handleRootNode(rootRouteNode)\n\n const handleNode = async (node: RouteNode) => {\n // Do not remove this as we need to set the lastIndex to 0 as it\n // is necessary to reset the regex's index when using the global flag\n // otherwise it might not match the next time it's used\n resetRegex(routeGroupPatternRegex)\n\n let parentRoute = hasParentRoute(routeNodes, node, node.routePath)\n\n // if the parent route is a virtual parent route, we need to find the real parent route\n if (parentRoute?.isVirtualParentRoute && parentRoute.children?.length) {\n // only if this sub-parent route returns a valid parent route, we use it, if not leave it as it\n const possibleParentRoute = hasParentRoute(\n parentRoute.children,\n node,\n node.routePath,\n )\n if (possibleParentRoute) {\n parentRoute = possibleParentRoute\n }\n }\n\n if (parentRoute) node.parent = parentRoute\n\n node.path = determineNodePath(node)\n\n const trimmedPath = trimPathLeft(node.path ?? '')\n\n const split = trimmedPath.split('/')\n const lastRouteSegment = split[split.length - 1] ?? trimmedPath\n\n node.isNonPath =\n lastRouteSegment.startsWith('_') ||\n routeGroupPatternRegex.test(lastRouteSegment)\n\n node.cleanedPath = removeGroups(\n removeUnderscores(removeLayoutSegments(node.path)) ?? '',\n )\n\n // Ensure the boilerplate for the route exists, which can be skipped for virtual parent routes and virtual routes\n if (!node.isVirtualParentRoute && !node.isVirtual) {\n const routeCode = fs.readFileSync(node.fullPath, 'utf-8')\n\n const escapedRoutePath = node.routePath?.replaceAll('$', '$$') ?? ''\n\n let replaced = routeCode\n\n const tRouteTemplate = ROUTE_TEMPLATE.route\n const tLazyRouteTemplate = ROUTE_TEMPLATE.lazyRoute\n\n if (!routeCode) {\n if (node.isLazy) {\n // Check by default check if the user has a specific lazy route template\n // If not, check if the user has a route template and use that instead\n replaced = fillTemplate(\n (config.customScaffolding?.lazyRouteTemplate ||\n config.customScaffolding?.routeTemplate) ??\n tLazyRouteTemplate.template(),\n {\n tsrImports: tLazyRouteTemplate.imports.tsrImports(),\n tsrPath: escapedRoutePath,\n tsrExportStart:\n tLazyRouteTemplate.imports.tsrExportStart(escapedRoutePath),\n tsrExportEnd: tLazyRouteTemplate.imports.tsrExportEnd(),\n },\n )\n } else if (\n node.isRoute ||\n (!node.isComponent &&\n !node.isErrorComponent &&\n !node.isPendingComponent &&\n !node.isLoader)\n ) {\n replaced = fillTemplate(\n config.customScaffolding?.routeTemplate ??\n tRouteTemplate.template(),\n {\n tsrImports: tRouteTemplate.imports.tsrImports(),\n tsrPath: escapedRoutePath,\n tsrExportStart:\n tRouteTemplate.imports.tsrExportStart(escapedRoutePath),\n tsrExportEnd: tRouteTemplate.imports.tsrExportEnd(),\n },\n )\n }\n } else {\n replaced = routeCode\n .replace(\n /(FileRoute\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (_, p1, __, p3) => `${p1}${escapedRoutePath}${p3}`,\n )\n .replace(\n new RegExp(\n `(import\\\\s*\\\\{.*)(create(Lazy)?FileRoute)(.*\\\\}\\\\s*from\\\\s*['\"]@tanstack\\\\/${ROUTE_TEMPLATE.subPkg}['\"])`,\n 'gs',\n ),\n (_, p1, __, ___, p4) =>\n `${p1}${node.isLazy ? 'createLazyFileRoute' : 'createFileRoute'}${p4}`,\n )\n .replace(\n /create(Lazy)?FileRoute(\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (_, __, p2, ___, p4) =>\n `${node.isLazy ? 'createLazyFileRoute' : 'createFileRoute'}${p2}${escapedRoutePath}${p4}`,\n )\n }\n\n await writeIfDifferent(\n node.fullPath,\n prettierOptions,\n routeCode,\n replaced,\n {\n beforeWrite: () => {\n logger.log(`🟡 Updating ${node.fullPath}`)\n },\n },\n )\n }\n\n if (\n !node.isVirtual &&\n (node.isLoader ||\n node.isComponent ||\n node.isErrorComponent ||\n node.isPendingComponent ||\n node.isLazy)\n ) {\n routePiecesByPath[node.routePath!] =\n routePiecesByPath[node.routePath!] || {}\n\n routePiecesByPath[node.routePath!]![\n node.isLazy\n ? 'lazy'\n : node.isLoader\n ? 'loader'\n : node.isErrorComponent\n ? 'errorComponent'\n : node.isPendingComponent\n ? 'pendingComponent'\n : 'component'\n ] = node\n\n const anchorRoute = routeNodes.find((d) => d.routePath === node.routePath)\n\n if (!anchorRoute) {\n await handleNode({\n ...node,\n isVirtual: true,\n isLazy: false,\n isLoader: false,\n isComponent: false,\n isErrorComponent: false,\n isPendingComponent: false,\n })\n }\n return\n }\n\n const cleanedPathIsEmpty = (node.cleanedPath || '').length === 0\n const nonPathRoute = node.isRoute && node.isNonPath\n node.isVirtualParentRequired =\n node.isLayout || nonPathRoute ? !cleanedPathIsEmpty : false\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 = {\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 isLayout: false,\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.isLayout) {\n // since `node.path` is used as the `id` on the route definition, we need to update it\n node.path = determineNodePath(node)\n }\n\n await handleNode(parentNode)\n } else {\n anchorRoute.children = anchorRoute.children ?? []\n anchorRoute.children.push(node)\n\n node.parent = anchorRoute\n }\n }\n\n if (node.parent) {\n if (!node.isVirtualParentRequired) {\n node.parent.children = node.parent.children ?? []\n node.parent.children.push(node)\n }\n } else {\n routeTree.push(node)\n }\n\n routeNodes.push(node)\n }\n\n for (const node of preRouteNodes.filter((d) => !d.isAPIRoute)) {\n await handleNode(node)\n }\n checkRouteFullPathUniqueness(\n preRouteNodes.filter(\n (d) => !d.isAPIRoute && d.children === undefined && d.isLazy !== true,\n ),\n config,\n )\n\n const startAPIRouteNodes: Array<RouteNode> = checkStartAPIRoutes(\n preRouteNodes.filter((d) => d.isAPIRoute),\n config,\n )\n\n const handleAPINode = async (node: RouteNode) => {\n const routeCode = fs.readFileSync(node.fullPath, 'utf-8')\n\n const escapedRoutePath = node.routePath?.replaceAll('$', '$$') ?? ''\n\n if (!routeCode) {\n const replaced = fillTemplate(\n config.customScaffolding?.apiTemplate ?? defaultAPIRouteTemplate,\n {\n tsrImports:\n \"import { createAPIFileRoute } from '@tanstack/start/api';\",\n tsrPath: escapedRoutePath,\n tsrExportStart: `export const ${CONSTANTS.APIRouteExportVariable} = createAPIFileRoute('${escapedRoutePath}')(`,\n tsrExportEnd: ');',\n },\n )\n\n logger.log(`🟡 Creating ${node.fullPath}`)\n fs.writeFileSync(\n node.fullPath,\n await prettier.format(replaced, prettierOptions),\n )\n } else {\n await writeIfDifferent(\n node.fullPath,\n prettierOptions,\n routeCode,\n routeCode.replace(\n /(createAPIFileRoute\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (_, p1, __, p3) => `${p1}${escapedRoutePath}${p3}`,\n ),\n {\n beforeWrite: () => {\n logger.log(`🟡 Updating ${node.fullPath}`)\n },\n },\n )\n }\n }\n\n for (const node of startAPIRouteNodes) {\n await handleAPINode(node)\n }\n\n function buildRouteTreeConfig(nodes: Array<RouteNode>, depth = 1): string {\n const children = nodes.map((node) => {\n if (node.isRoot) {\n return\n }\n\n if (node.isLayout && !node.children?.length) {\n return\n }\n\n const route = `${node.variableName}Route`\n\n if (node.children?.length) {\n const childConfigs = buildRouteTreeConfig(node.children, depth + 1)\n\n const childrenDeclaration = TYPES_DISABLED\n ? ''\n : `interface ${route}Children {\n ${node.children.map((child) => `${child.variableName}Route: typeof ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`\n\n const children = `const ${route}Children${TYPES_DISABLED ? '' : `: ${route}Children`} = {\n ${node.children.map((child) => `${child.variableName}Route: ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`\n\n const routeWithChildren = `const ${route}WithChildren = ${route}._addFileChildren(${route}Children)`\n\n return [\n childConfigs,\n childrenDeclaration,\n children,\n routeWithChildren,\n ].join('\\n\\n')\n }\n\n return undefined\n })\n\n return children.filter(Boolean).join('\\n\\n')\n }\n\n const routeConfigChildrenText = buildRouteTreeConfig(routeTree)\n\n const sortedRouteNodes = multiSortBy(routeNodes, [\n (d) => (d.routePath?.includes(`/${rootPathId}`) ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.routePath?.endsWith(config.indexToken) ? -1 : 1),\n (d) => d,\n ])\n\n const imports = Object.entries({\n createFileRoute: sortedRouteNodes.some((d) => d.isVirtual),\n lazyFn: sortedRouteNodes.some(\n (node) => routePiecesByPath[node.routePath!]?.loader,\n ),\n lazyRouteComponent: sortedRouteNodes.some(\n (node) =>\n routePiecesByPath[node.routePath!]?.component ||\n routePiecesByPath[node.routePath!]?.errorComponent ||\n routePiecesByPath[node.routePath!]?.pendingComponent,\n ),\n })\n .filter((d) => d[1])\n .map((d) => d[0])\n\n const virtualRouteNodes = sortedRouteNodes.filter((d) => d.isVirtual)\n\n function getImportPath(node: RouteNode) {\n return replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n config.addExtensions,\n ),\n )\n }\n const routeImports = [\n ...config.routeTreeFileHeader,\n `// This file was automatically generated by TanStack Router.\n// You should NOT make any changes in this file as it will be overwritten.\n// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.`,\n imports.length\n ? `import { ${imports.join(', ')} } from '${ROUTE_TEMPLATE.fullPkg}'\\n`\n : '',\n '// Import Routes',\n [\n `import { Route as rootRoute } from './${getImportPath(rootRouteNode)}'`,\n ...sortedRouteNodes\n .filter((d) => !d.isVirtual)\n .map((node) => {\n return `import { Route as ${\n node.variableName\n }Import } from './${getImportPath(node)}'`\n }),\n ].join('\\n'),\n virtualRouteNodes.length ? '// Create Virtual Routes' : '',\n virtualRouteNodes\n .map((node) => {\n return `const ${\n node.variableName\n }Import = createFileRoute('${node.routePath}')()`\n })\n .join('\\n'),\n '// Create/Update Routes',\n sortedRouteNodes\n .map((node) => {\n const loaderNode = routePiecesByPath[node.routePath!]?.loader\n const componentNode = routePiecesByPath[node.routePath!]?.component\n const errorComponentNode =\n routePiecesByPath[node.routePath!]?.errorComponent\n const pendingComponentNode =\n routePiecesByPath[node.routePath!]?.pendingComponent\n const lazyComponentNode = routePiecesByPath[node.routePath!]?.lazy\n\n return [\n `const ${node.variableName}Route = ${node.variableName}Import.update({\n ${[\n `id: '${node.path}'`,\n !node.isNonPath ? `path: '${node.cleanedPath}'` : undefined,\n `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`,\n ]\n .filter(Boolean)\n .join(',')}\n }${TYPES_DISABLED ? '' : 'as any'})`,\n loaderNode\n ? `.updateLoader({ loader: lazyFn(() => import('./${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, loaderNode.filePath),\n ),\n config.addExtensions,\n ),\n )}'), 'loader') })`\n : '',\n componentNode || errorComponentNode || pendingComponentNode\n ? `.update({\n ${(\n [\n ['component', componentNode],\n ['errorComponent', errorComponentNode],\n ['pendingComponent', pendingComponentNode],\n ] as const\n )\n .filter((d) => d[1])\n .map((d) => {\n return `${\n d[0]\n }: lazyRouteComponent(() => import('./${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, d[1]!.filePath),\n ),\n config.addExtensions,\n ),\n )}'), '${d[0]}')`\n })\n .join('\\n,')}\n })`\n : '',\n lazyComponentNode\n ? `.lazy(() => import('./${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(\n config.routesDirectory,\n lazyComponentNode.filePath,\n ),\n ),\n config.addExtensions,\n ),\n )}').then((d) => d.Route))`\n : '',\n ].join('')\n })\n .join('\\n\\n'),\n ...(TYPES_DISABLED\n ? []\n : [\n '// Populate the FileRoutesByPath interface',\n `declare module '${ROUTE_TEMPLATE.fullPkg}' {\n interface FileRoutesByPath {\n ${routeNodes\n .map((routeNode) => {\n const filePathId = routeNode.routePath\n\n return `'${filePathId}': {\n id: '${filePathId}'\n path: '${inferPath(routeNode)}'\n fullPath: '${inferFullPath(routeNode)}'\n preLoaderRoute: typeof ${routeNode.variableName}Import\n parentRoute: typeof ${\n routeNode.isVirtualParentRequired\n ? `${routeNode.parent?.variableName}Route`\n : routeNode.parent?.variableName\n ? `${routeNode.parent.variableName}Import`\n : 'rootRoute'\n }\n }`\n })\n .join('\\n')}\n }\n}`,\n ]),\n '// Create and export the route tree',\n routeConfigChildrenText,\n ...(TYPES_DISABLED\n ? []\n : [\n `export interface FileRoutesByFullPath {\n ${[...createRouteNodesByFullPath(routeNodes).entries()].map(\n ([fullPath, routeNode]) => {\n return `'${fullPath}': typeof ${getResolvedRouteNodeVariableName(routeNode)}`\n },\n )}\n}`,\n `export interface FileRoutesByTo {\n ${[...createRouteNodesByTo(routeNodes).entries()].map(([to, routeNode]) => {\n return `'${to}': typeof ${getResolvedRouteNodeVariableName(routeNode)}`\n })}\n}`,\n `export interface FileRoutesById {\n '__root__': typeof rootRoute,\n ${[...createRouteNodesById(routeNodes).entries()].map(([id, routeNode]) => {\n return `'${id}': typeof ${getResolvedRouteNodeVariableName(routeNode)}`\n })}\n}`,\n `export interface FileRouteTypes {\n fileRoutesByFullPath: FileRoutesByFullPath\n fullPaths: ${routeNodes.length > 0 ? [...createRouteNodesByFullPath(routeNodes).keys()].map((fullPath) => `'${fullPath}'`).join('|') : 'never'}\n fileRoutesByTo: FileRoutesByTo\n to: ${routeNodes.length > 0 ? [...createRouteNodesByTo(routeNodes).keys()].map((to) => `'${to}'`).join('|') : 'never'}\n id: ${[`'__root__'`, ...[...createRouteNodesById(routeNodes).keys()].map((id) => `'${id}'`)].join('|')}\n fileRoutesById: FileRoutesById\n}`,\n `export interface RootRouteChildren {\n ${routeTree.map((child) => `${child.variableName}Route: typeof ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`,\n ]),\n `const rootRouteChildren${TYPES_DISABLED ? '' : ': RootRouteChildren'} = {\n ${routeTree.map((child) => `${child.variableName}Route: ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`,\n `export const routeTree = rootRoute._addFileChildren(rootRouteChildren)${TYPES_DISABLED ? '' : '._addFileTypes<FileRouteTypes>()'}`,\n ...config.routeTreeFileFooter,\n ]\n .filter(Boolean)\n .join('\\n\\n')\n\n const createRouteManifest = () => {\n const routesManifest = {\n __root__: {\n filePath: rootRouteNode.filePath,\n children: routeTree.map((d) => d.routePath),\n },\n ...Object.fromEntries(\n routeNodes.map((d) => {\n const filePathId = d.routePath\n\n return [\n filePathId,\n {\n filePath: d.filePath,\n parent: d.parent?.routePath ? d.parent.routePath : undefined,\n children: d.children?.map((childRoute) => childRoute.routePath),\n },\n ]\n }),\n ),\n }\n\n return JSON.stringify(\n {\n routes: routesManifest,\n },\n null,\n 2,\n )\n }\n\n const routeConfigFileContent =\n // TODO: Remove this disabled eslint rule when more target types are added.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n config.disableManifestGeneration || config.target !== 'react'\n ? routeImports\n : [\n routeImports,\n '\\n',\n '/* ROUTE_MANIFEST_START',\n createRouteManifest(),\n 'ROUTE_MANIFEST_END */',\n ].join('\\n')\n\n if (!checkLatest()) return\n\n const existingRouteTreeContent = await fsp\n .readFile(path.resolve(config.generatedRouteTree), 'utf-8')\n .catch((err) => {\n if (err.code === 'ENOENT') {\n return ''\n }\n\n throw err\n })\n\n if (!checkLatest()) return\n\n // Ensure the directory exists\n await fsp.mkdir(path.dirname(path.resolve(config.generatedRouteTree)), {\n recursive: true,\n })\n\n if (!checkLatest()) return\n\n // Write the route tree file, if it has changed\n const routeTreeWriteResult = await writeIfDifferent(\n path.resolve(config.generatedRouteTree),\n prettierOptions,\n existingRouteTreeContent,\n routeConfigFileContent,\n {\n beforeWrite: () => {\n logger.log(`🟡 Updating ${config.generatedRouteTree}`)\n },\n },\n )\n if (routeTreeWriteResult && !checkLatest()) {\n return\n }\n\n logger.log(\n `✅ Processed ${routeNodes.length === 1 ? 'route' : 'routes'} in ${\n Date.now() - start\n }ms`,\n )\n}\n\n// function removeTrailingUnderscores(s?: string) {\n// return s?.replaceAll(/(_$)/gi, '').replaceAll(/(_\\/)/gi, '/')\n// }\n\nfunction removeGroups(s: string) {\n return s.replace(possiblyNestedRouteGroupPatternRegex, '')\n}\n\n/**\n * The `node.path` is used as the `id` in the route definition.\n * This function checks if the given node has a parent and if so, it determines the correct path for the given node.\n * @param node - The node to determine the path for.\n * @returns The correct path for the given node.\n */\nfunction determineNodePath(node: RouteNode) {\n return (node.path = node.parent\n ? node.routePath?.replace(node.parent.routePath ?? '', '') || '/'\n : node.routePath)\n}\n\n/**\n * Removes the last segment from a given path. Segments are considered to be separated by a '/'.\n *\n * @param {string} routePath - The path from which to remove the last segment. Defaults to '/'.\n * @returns {string} The path with the last segment removed.\n * @example\n * removeLastSegmentFromPath('/workspace/_auth/foo') // '/workspace/_auth'\n */\nexport function removeLastSegmentFromPath(routePath: string = '/'): string {\n const segments = routePath.split('/')\n segments.pop() // Remove the last segment\n return segments.join('/')\n}\n\n/**\n * Removes all segments from a given path that start with an underscore ('_').\n *\n * @param {string} routePath - The path from which to remove segments. Defaults to '/'.\n * @returns {string} The path with all underscore-prefixed segments removed.\n * @example\n * removeLayoutSegments('/workspace/_auth/foo') // '/workspace/foo'\n */\nfunction removeLayoutSegments(routePath: string = '/'): string {\n const segments = routePath.split('/')\n const newSegments = segments.filter((segment) => !segment.startsWith('_'))\n return newSegments.join('/')\n}\n\nexport function hasParentRoute(\n routes: Array<RouteNode>,\n node: RouteNode,\n routePathToCheck: string | undefined,\n): RouteNode | null {\n if (!routePathToCheck || routePathToCheck === '/') {\n return null\n }\n\n const sortedNodes = multiSortBy(routes, [\n (d) => d.routePath!.length * -1,\n (d) => d.variableName,\n ]).filter((d) => d.routePath !== `/${rootPathId}`)\n\n for (const route of sortedNodes) {\n if (route.routePath === '/') continue\n\n if (\n routePathToCheck.startsWith(`${route.routePath}/`) &&\n route.routePath !== routePathToCheck\n ) {\n return route\n }\n }\n\n const segments = routePathToCheck.split('/')\n segments.pop() // Remove the last segment\n const parentRoutePath = segments.join('/')\n\n return hasParentRoute(routes, node, parentRoutePath)\n}\n\n/**\n * Gets the final variable name for a route\n */\nexport const getResolvedRouteNodeVariableName = (\n routeNode: RouteNode,\n): string => {\n return routeNode.children?.length\n ? `${routeNode.variableName}RouteWithChildren`\n : `${routeNode.variableName}Route`\n}\n\n/**\n * Creates a map from fullPath to routeNode\n */\nexport const createRouteNodesByFullPath = (\n routeNodes: Array<RouteNode>,\n): Map<string, RouteNode> => {\n return new Map(\n routeNodes.map((routeNode) => [inferFullPath(routeNode), routeNode]),\n )\n}\n\n/**\n * Create a map from 'to' to a routeNode\n */\nexport const createRouteNodesByTo = (\n routeNodes: Array<RouteNode>,\n): Map<string, RouteNode> => {\n return new Map(\n dedupeBranchesAndIndexRoutes(routeNodes).map((routeNode) => [\n inferTo(routeNode),\n routeNode,\n ]),\n )\n}\n\n/**\n * Create a map from 'id' to a routeNode\n */\nexport const createRouteNodesById = (\n routeNodes: Array<RouteNode>,\n): Map<string, RouteNode> => {\n return new Map(\n routeNodes.map((routeNode) => {\n const id = routeNode.routePath ?? ''\n return [id, routeNode]\n }),\n )\n}\n\n/**\n * Infers the full path for use by TS\n */\nexport const inferFullPath = (routeNode: RouteNode): string => {\n const fullPath = removeGroups(\n removeUnderscores(removeLayoutSegments(routeNode.routePath)) ?? '',\n )\n\n return routeNode.cleanedPath === '/' ? fullPath : fullPath.replace(/\\/$/, '')\n}\n\n/**\n * Infers the path for use by TS\n */\nexport const inferPath = (routeNode: RouteNode): string => {\n return routeNode.cleanedPath === '/'\n ? routeNode.cleanedPath\n : (routeNode.cleanedPath?.replace(/\\/$/, '') ?? '')\n}\n\n/**\n * Infers to path\n */\nexport const inferTo = (routeNode: RouteNode): string => {\n const fullPath = inferFullPath(routeNode)\n\n if (fullPath === '/') return fullPath\n\n return fullPath.replace(/\\/$/, '')\n}\n\n/**\n * Dedupes branches and index routes\n */\nexport const dedupeBranchesAndIndexRoutes = (\n routes: Array<RouteNode>,\n): Array<RouteNode> => {\n return routes.filter((route) => {\n if (route.children?.find((child) => child.cleanedPath === '/')) return false\n return true\n })\n}\n\nfunction checkUnique<TElement>(routes: Array<TElement>, key: keyof TElement) {\n // Check no two routes have the same `key`\n // if they do, throw an error with the conflicting filePaths\n const keys = routes.map((d) => d[key])\n const uniqueKeys = new Set(keys)\n if (keys.length !== uniqueKeys.size) {\n const duplicateKeys = keys.filter((d, i) => keys.indexOf(d) !== i)\n const conflictingFiles = routes.filter((d) =>\n duplicateKeys.includes(d[key]),\n )\n return conflictingFiles\n }\n return undefined\n}\n\nfunction checkRouteFullPathUniqueness(\n _routes: Array<RouteNode>,\n config: Config,\n) {\n const routes = _routes.map((d) => {\n const inferredFullPath = inferFullPath(d)\n return { ...d, inferredFullPath }\n })\n\n const conflictingFiles = checkUnique(routes, 'inferredFullPath')\n\n if (conflictingFiles !== undefined) {\n const errorMessage = `Conflicting configuration paths were found for the following route${conflictingFiles.length > 1 ? 's' : ''}: ${conflictingFiles\n .map((p) => `\"${p.inferredFullPath}\"`)\n .join(', ')}.\nPlease ensure each route has a unique full path.\nConflicting files: \\n ${conflictingFiles.map((d) => path.resolve(config.routesDirectory, d.filePath)).join('\\n ')}\\n`\n throw new Error(errorMessage)\n }\n}\n\nfunction checkStartAPIRoutes(_routes: Array<RouteNode>, config: Config) {\n if (_routes.length === 0) {\n return []\n }\n\n // Make sure these are valid URLs\n // Route Groups and Layout Routes aren't being removed since\n // you may want to have an API route that starts with an underscore\n // or be wrapped in parentheses\n const routes = _routes.map((d) => {\n const routePath = removeTrailingSlash(d.routePath ?? '')\n return { ...d, routePath }\n })\n\n const conflictingFiles = checkUnique(routes, 'routePath')\n\n if (conflictingFiles !== undefined) {\n const errorMessage = `Conflicting configuration paths were found for the following API route${conflictingFiles.length > 1 ? 's' : ''}: ${conflictingFiles\n .map((p) => `\"${p}\"`)\n .join(', ')}.\n Please ensure each API route has a unique route path.\nConflicting files: \\n ${conflictingFiles.map((d) => path.resolve(config.routesDirectory, d.filePath)).join('\\n ')}\\n`\n throw new Error(errorMessage)\n }\n\n return routes\n}\n\nexport type StartAPIRoutePathSegment = {\n value: string\n type: 'path' | 'param' | 'splat'\n}\n\n/**\n * This function takes in a path in the format accepted by TanStack Router\n * and returns an array of path segments that can be used to generate\n * the pathname of the TanStack Start API route.\n *\n * @param src\n * @returns\n */\nexport function startAPIRouteSegmentsFromTSRFilePath(\n src: string,\n config: Config,\n): Array<StartAPIRoutePathSegment> {\n const routePath = determineInitialRoutePath(src)\n\n const parts = routePath\n .replaceAll('.', '/')\n .split('/')\n .filter((p) => !!p && p !== config.indexToken)\n const segments: Array<StartAPIRoutePathSegment> = parts.map((part) => {\n if (part.startsWith('$')) {\n if (part === '$') {\n return { value: part, type: 'splat' }\n }\n\n part.replaceAll('$', '')\n return { value: part, type: 'param' }\n }\n\n return { value: part, type: 'path' }\n })\n\n return segments\n}\n"],"names":["virtualGetRouteNodes","physicalGetRouteNodes","children"],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sources":["../../src/generator.ts"],"sourcesContent":["import path from 'node:path'\nimport * as fs from 'node:fs'\nimport * as fsp from 'node:fs/promises'\nimport {\n determineInitialRoutePath,\n format,\n logging,\n multiSortBy,\n removeExt,\n removeTrailingSlash,\n removeUnderscores,\n replaceBackslash,\n resetRegex,\n routePathToVariable,\n trimPathLeft,\n writeIfDifferent,\n} from './utils'\nimport { getRouteNodes as physicalGetRouteNodes } from './filesystem/physical/getRouteNodes'\nimport { getRouteNodes as virtualGetRouteNodes } from './filesystem/virtual/getRouteNodes'\nimport { rootPathId } from './filesystem/physical/rootPathId'\nimport {\n defaultAPIRouteTemplate,\n fillTemplate,\n getTargetTemplate,\n} from './template'\nimport type { GetRouteNodesResult, RouteNode } from './types'\nimport type { Config } from './config'\n\nexport const CONSTANTS = {\n // When changing this, you'll want to update the import in `start/api/index.ts#defaultAPIFileRouteHandler`\n APIRouteExportVariable: 'APIRoute',\n}\n\nlet latestTask = 0\nconst routeGroupPatternRegex = /\\(.+\\)/g\nconst possiblyNestedRouteGroupPatternRegex = /\\([^/]+\\)\\/?/g\n\nlet isFirst = false\nlet skipMessage = false\n\ntype RouteSubNode = {\n component?: RouteNode\n errorComponent?: RouteNode\n pendingComponent?: RouteNode\n loader?: RouteNode\n lazy?: RouteNode\n}\n\nexport async function generator(config: Config, root: string) {\n const ROUTE_TEMPLATE = getTargetTemplate(config.target)\n const logger = logging({ disabled: config.disableLogging })\n logger.log('')\n\n if (!isFirst) {\n logger.log('♻️ Generating routes...')\n isFirst = true\n } else if (skipMessage) {\n skipMessage = false\n } else {\n logger.log('♻️ Regenerating routes...')\n }\n\n const taskId = latestTask + 1\n latestTask = taskId\n\n const checkLatest = () => {\n if (latestTask !== taskId) {\n skipMessage = true\n return false\n }\n\n return true\n }\n\n const start = Date.now()\n\n const TYPES_DISABLED = config.disableTypes\n\n let getRouteNodesResult: GetRouteNodesResult\n\n if (config.virtualRouteConfig) {\n getRouteNodesResult = await virtualGetRouteNodes(config, root)\n } else {\n getRouteNodesResult = await physicalGetRouteNodes(config, root)\n }\n\n const { rootRouteNode, routeNodes: beforeRouteNodes } = getRouteNodesResult\n if (rootRouteNode === undefined) {\n let errorMessage = `rootRouteNode must not be undefined. Make sure you've added your root route into the route-tree.`\n if (!config.virtualRouteConfig) {\n errorMessage += `\\nMake sure that you add a \"${rootPathId}.${config.disableTypes ? 'js' : 'tsx'}\" file to your routes directory.\\nAdd the file in: \"${config.routesDirectory}/${rootPathId}.${config.disableTypes ? 'js' : 'tsx'}\"`\n }\n throw new Error(errorMessage)\n }\n\n const preRouteNodes = multiSortBy(beforeRouteNodes, [\n (d) => (d.routePath === '/' ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) =>\n d.filePath.match(new RegExp(`[./]${config.indexToken}[.]`)) ? 1 : -1,\n (d) =>\n d.filePath.match(\n /[./](component|errorComponent|pendingComponent|loader|lazy)[.]/,\n )\n ? 1\n : -1,\n (d) =>\n d.filePath.match(new RegExp(`[./]${config.routeToken}[.]`)) ? -1 : 1,\n (d) => (d.routePath?.endsWith('/') ? -1 : 1),\n (d) => d.routePath,\n ]).filter((d) => ![`/${rootPathId}`].includes(d.routePath || ''))\n\n const routeTree: Array<RouteNode> = []\n const routePiecesByPath: Record<string, RouteSubNode> = {}\n\n // Loop over the flat list of routeNodes and\n // build up a tree based on the routeNodes' routePath\n const routeNodes: Array<RouteNode> = []\n\n // the handleRootNode function is not being collapsed into the handleNode function\n // because it requires only a subset of the logic that the handleNode function requires\n // and it's easier to read and maintain this way\n const handleRootNode = async (node?: RouteNode) => {\n if (!node) {\n // currently this is not being handled, but it could be in the future\n // for example to handle a virtual root route\n return\n }\n\n // from here on, we are only handling the root node that's present in the file system\n const routeCode = fs.readFileSync(node.fullPath, 'utf-8')\n\n if (!routeCode) {\n const _rootTemplate = ROUTE_TEMPLATE.rootRoute\n const replaced = await fillTemplate(config, _rootTemplate.template(), {\n tsrImports: _rootTemplate.imports.tsrImports(),\n tsrPath: rootPathId,\n tsrExportStart: _rootTemplate.imports.tsrExportStart(),\n tsrExportEnd: _rootTemplate.imports.tsrExportEnd(),\n })\n\n await writeIfDifferent(\n node.fullPath,\n '', // Empty string because the file doesn't exist yet\n replaced,\n {\n beforeWrite: () => {\n logger.log(`🟡 Creating ${node.fullPath}`)\n },\n },\n )\n }\n }\n\n await handleRootNode(rootRouteNode)\n\n const handleNode = async (node: RouteNode) => {\n // Do not remove this as we need to set the lastIndex to 0 as it\n // is necessary to reset the regex's index when using the global flag\n // otherwise it might not match the next time it's used\n resetRegex(routeGroupPatternRegex)\n\n let parentRoute = hasParentRoute(routeNodes, node, node.routePath)\n\n // if the parent route is a virtual parent route, we need to find the real parent route\n if (parentRoute?.isVirtualParentRoute && parentRoute.children?.length) {\n // only if this sub-parent route returns a valid parent route, we use it, if not leave it as it\n const possibleParentRoute = hasParentRoute(\n parentRoute.children,\n node,\n node.routePath,\n )\n if (possibleParentRoute) {\n parentRoute = possibleParentRoute\n }\n }\n\n if (parentRoute) node.parent = parentRoute\n\n node.path = determineNodePath(node)\n\n const trimmedPath = trimPathLeft(node.path ?? '')\n\n const split = trimmedPath.split('/')\n const lastRouteSegment = split[split.length - 1] ?? trimmedPath\n\n node.isNonPath =\n lastRouteSegment.startsWith('_') ||\n routeGroupPatternRegex.test(lastRouteSegment)\n\n node.cleanedPath = removeGroups(\n removeUnderscores(removeLayoutSegments(node.path)) ?? '',\n )\n\n // Ensure the boilerplate for the route exists, which can be skipped for virtual parent routes and virtual routes\n if (!node.isVirtualParentRoute && !node.isVirtual) {\n const routeCode = fs.readFileSync(node.fullPath, 'utf-8')\n\n const escapedRoutePath = node.routePath?.replaceAll('$', '$$') ?? ''\n\n let replaced = routeCode\n\n const tRouteTemplate = ROUTE_TEMPLATE.route\n const tLazyRouteTemplate = ROUTE_TEMPLATE.lazyRoute\n\n if (!routeCode) {\n if (node.isLazy) {\n // Check by default check if the user has a specific lazy route template\n // If not, check if the user has a route template and use that instead\n replaced = await fillTemplate(\n config,\n (config.customScaffolding?.lazyRouteTemplate ||\n config.customScaffolding?.routeTemplate) ??\n tLazyRouteTemplate.template(),\n {\n tsrImports: tLazyRouteTemplate.imports.tsrImports(),\n tsrPath: escapedRoutePath,\n tsrExportStart:\n tLazyRouteTemplate.imports.tsrExportStart(escapedRoutePath),\n tsrExportEnd: tLazyRouteTemplate.imports.tsrExportEnd(),\n },\n )\n } else if (\n node.isRoute ||\n (!node.isComponent &&\n !node.isErrorComponent &&\n !node.isPendingComponent &&\n !node.isLoader)\n ) {\n replaced = await fillTemplate(\n config,\n config.customScaffolding?.routeTemplate ??\n tRouteTemplate.template(),\n {\n tsrImports: tRouteTemplate.imports.tsrImports(),\n tsrPath: escapedRoutePath,\n tsrExportStart:\n tRouteTemplate.imports.tsrExportStart(escapedRoutePath),\n tsrExportEnd: tRouteTemplate.imports.tsrExportEnd(),\n },\n )\n }\n } else {\n replaced = routeCode\n .replace(\n /(FileRoute\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (_, p1, __, p3) => `${p1}${escapedRoutePath}${p3}`,\n )\n .replace(\n new RegExp(\n `(import\\\\s*\\\\{.*)(create(Lazy)?FileRoute)(.*\\\\}\\\\s*from\\\\s*['\"]@tanstack\\\\/${ROUTE_TEMPLATE.subPkg}['\"])`,\n 'gs',\n ),\n (_, p1, __, ___, p4) =>\n `${p1}${node.isLazy ? 'createLazyFileRoute' : 'createFileRoute'}${p4}`,\n )\n .replace(\n /create(Lazy)?FileRoute(\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (_, __, p2, ___, p4) =>\n `${node.isLazy ? 'createLazyFileRoute' : 'createFileRoute'}${p2}${escapedRoutePath}${p4}`,\n )\n }\n\n await writeIfDifferent(node.fullPath, routeCode, replaced, {\n beforeWrite: () => {\n logger.log(`🟡 Updating ${node.fullPath}`)\n },\n })\n }\n\n if (\n !node.isVirtual &&\n (node.isLoader ||\n node.isComponent ||\n node.isErrorComponent ||\n node.isPendingComponent ||\n node.isLazy)\n ) {\n routePiecesByPath[node.routePath!] =\n routePiecesByPath[node.routePath!] || {}\n\n routePiecesByPath[node.routePath!]![\n node.isLazy\n ? 'lazy'\n : node.isLoader\n ? 'loader'\n : node.isErrorComponent\n ? 'errorComponent'\n : node.isPendingComponent\n ? 'pendingComponent'\n : 'component'\n ] = node\n\n const anchorRoute = routeNodes.find((d) => d.routePath === node.routePath)\n\n if (!anchorRoute) {\n await handleNode({\n ...node,\n isVirtual: true,\n isLazy: false,\n isLoader: false,\n isComponent: false,\n isErrorComponent: false,\n isPendingComponent: false,\n })\n }\n return\n }\n\n const cleanedPathIsEmpty = (node.cleanedPath || '').length === 0\n const nonPathRoute = node.isRoute && node.isNonPath\n node.isVirtualParentRequired =\n node.isLayout || nonPathRoute ? !cleanedPathIsEmpty : false\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 = {\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 isLayout: false,\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.isLayout) {\n // since `node.path` is used as the `id` on the route definition, we need to update it\n node.path = determineNodePath(node)\n }\n\n await handleNode(parentNode)\n } else {\n anchorRoute.children = anchorRoute.children ?? []\n anchorRoute.children.push(node)\n\n node.parent = anchorRoute\n }\n }\n\n if (node.parent) {\n if (!node.isVirtualParentRequired) {\n node.parent.children = node.parent.children ?? []\n node.parent.children.push(node)\n }\n } else {\n routeTree.push(node)\n }\n\n routeNodes.push(node)\n }\n\n for (const node of preRouteNodes.filter((d) => !d.isAPIRoute)) {\n await handleNode(node)\n }\n checkRouteFullPathUniqueness(\n preRouteNodes.filter(\n (d) => !d.isAPIRoute && d.children === undefined && d.isLazy !== true,\n ),\n config,\n )\n\n const startAPIRouteNodes: Array<RouteNode> = checkStartAPIRoutes(\n preRouteNodes.filter((d) => d.isAPIRoute),\n config,\n )\n\n const handleAPINode = async (node: RouteNode) => {\n const routeCode = fs.readFileSync(node.fullPath, 'utf-8')\n\n const escapedRoutePath = node.routePath?.replaceAll('$', '$$') ?? ''\n\n if (!routeCode) {\n const replaced = await fillTemplate(\n config,\n config.customScaffolding?.apiTemplate ?? defaultAPIRouteTemplate,\n {\n tsrImports:\n \"import { createAPIFileRoute } from '@tanstack/start/api';\",\n tsrPath: escapedRoutePath,\n tsrExportStart: `export const ${CONSTANTS.APIRouteExportVariable} = createAPIFileRoute('${escapedRoutePath}')(`,\n tsrExportEnd: ');',\n },\n )\n\n await writeIfDifferent(\n node.fullPath,\n '', // Empty string because the file doesn't exist yet\n replaced,\n {\n beforeWrite: () => {\n logger.log(`🟡 Creating ${node.fullPath}`)\n },\n },\n )\n } else {\n await writeIfDifferent(\n node.fullPath,\n routeCode,\n routeCode.replace(\n /(createAPIFileRoute\\(\\s*['\"])([^\\s]*)(['\"],?\\s*\\))/g,\n (_, p1, __, p3) => `${p1}${escapedRoutePath}${p3}`,\n ),\n {\n beforeWrite: () => {\n logger.log(`🟡 Updating ${node.fullPath}`)\n },\n },\n )\n }\n }\n\n for (const node of startAPIRouteNodes) {\n await handleAPINode(node)\n }\n\n function buildRouteTreeConfig(nodes: Array<RouteNode>, depth = 1): string {\n const children = nodes.map((node) => {\n if (node.isRoot) {\n return\n }\n\n if (node.isLayout && !node.children?.length) {\n return\n }\n\n const route = `${node.variableName}Route`\n\n if (node.children?.length) {\n const childConfigs = buildRouteTreeConfig(node.children, depth + 1)\n\n const childrenDeclaration = TYPES_DISABLED\n ? ''\n : `interface ${route}Children {\n ${node.children.map((child) => `${child.variableName}Route: typeof ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`\n\n const children = `const ${route}Children${TYPES_DISABLED ? '' : `: ${route}Children`} = {\n ${node.children.map((child) => `${child.variableName}Route: ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`\n\n const routeWithChildren = `const ${route}WithChildren = ${route}._addFileChildren(${route}Children)`\n\n return [\n childConfigs,\n childrenDeclaration,\n children,\n routeWithChildren,\n ].join('\\n\\n')\n }\n\n return undefined\n })\n\n return children.filter(Boolean).join('\\n\\n')\n }\n\n const routeConfigChildrenText = buildRouteTreeConfig(routeTree)\n\n const sortedRouteNodes = multiSortBy(routeNodes, [\n (d) => (d.routePath?.includes(`/${rootPathId}`) ? -1 : 1),\n (d) => d.routePath?.split('/').length,\n (d) => (d.routePath?.endsWith(config.indexToken) ? -1 : 1),\n (d) => d,\n ])\n\n const imports = Object.entries({\n createFileRoute: sortedRouteNodes.some((d) => d.isVirtual),\n lazyFn: sortedRouteNodes.some(\n (node) => routePiecesByPath[node.routePath!]?.loader,\n ),\n lazyRouteComponent: sortedRouteNodes.some(\n (node) =>\n routePiecesByPath[node.routePath!]?.component ||\n routePiecesByPath[node.routePath!]?.errorComponent ||\n routePiecesByPath[node.routePath!]?.pendingComponent,\n ),\n })\n .filter((d) => d[1])\n .map((d) => d[0])\n\n const virtualRouteNodes = sortedRouteNodes.filter((d) => d.isVirtual)\n\n function getImportPath(node: RouteNode) {\n return replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, node.filePath),\n ),\n config.addExtensions,\n ),\n )\n }\n const routeImports = [\n ...config.routeTreeFileHeader,\n `// This file was automatically generated by TanStack Router.\n// You should NOT make any changes in this file as it will be overwritten.\n// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.`,\n imports.length\n ? `import { ${imports.join(', ')} } from '${ROUTE_TEMPLATE.fullPkg}'\\n`\n : '',\n '// Import Routes',\n [\n `import { Route as rootRoute } from './${getImportPath(rootRouteNode)}'`,\n ...sortedRouteNodes\n .filter((d) => !d.isVirtual)\n .map((node) => {\n return `import { Route as ${\n node.variableName\n }Import } from './${getImportPath(node)}'`\n }),\n ].join('\\n'),\n virtualRouteNodes.length ? '// Create Virtual Routes' : '',\n virtualRouteNodes\n .map((node) => {\n return `const ${\n node.variableName\n }Import = createFileRoute('${node.routePath}')()`\n })\n .join('\\n'),\n '// Create/Update Routes',\n sortedRouteNodes\n .map((node) => {\n const loaderNode = routePiecesByPath[node.routePath!]?.loader\n const componentNode = routePiecesByPath[node.routePath!]?.component\n const errorComponentNode =\n routePiecesByPath[node.routePath!]?.errorComponent\n const pendingComponentNode =\n routePiecesByPath[node.routePath!]?.pendingComponent\n const lazyComponentNode = routePiecesByPath[node.routePath!]?.lazy\n\n return [\n `const ${node.variableName}Route = ${node.variableName}Import.update({\n ${[\n `id: '${node.path}'`,\n !node.isNonPath ? `path: '${node.cleanedPath}'` : undefined,\n `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`,\n ]\n .filter(Boolean)\n .join(',')}\n }${TYPES_DISABLED ? '' : 'as any'})`,\n loaderNode\n ? `.updateLoader({ loader: lazyFn(() => import('./${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, loaderNode.filePath),\n ),\n config.addExtensions,\n ),\n )}'), 'loader') })`\n : '',\n componentNode || errorComponentNode || pendingComponentNode\n ? `.update({\n ${(\n [\n ['component', componentNode],\n ['errorComponent', errorComponentNode],\n ['pendingComponent', pendingComponentNode],\n ] as const\n )\n .filter((d) => d[1])\n .map((d) => {\n return `${\n d[0]\n }: lazyRouteComponent(() => import('./${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(config.routesDirectory, d[1]!.filePath),\n ),\n config.addExtensions,\n ),\n )}'), '${d[0]}')`\n })\n .join('\\n,')}\n })`\n : '',\n lazyComponentNode\n ? `.lazy(() => import('./${replaceBackslash(\n removeExt(\n path.relative(\n path.dirname(config.generatedRouteTree),\n path.resolve(\n config.routesDirectory,\n lazyComponentNode.filePath,\n ),\n ),\n config.addExtensions,\n ),\n )}').then((d) => d.Route))`\n : '',\n ].join('')\n })\n .join('\\n\\n'),\n ...(TYPES_DISABLED\n ? []\n : [\n '// Populate the FileRoutesByPath interface',\n `declare module '${ROUTE_TEMPLATE.fullPkg}' {\n interface FileRoutesByPath {\n ${routeNodes\n .map((routeNode) => {\n const filePathId = routeNode.routePath\n\n return `'${filePathId}': {\n id: '${filePathId}'\n path: '${inferPath(routeNode)}'\n fullPath: '${inferFullPath(routeNode)}'\n preLoaderRoute: typeof ${routeNode.variableName}Import\n parentRoute: typeof ${\n routeNode.isVirtualParentRequired\n ? `${routeNode.parent?.variableName}Route`\n : routeNode.parent?.variableName\n ? `${routeNode.parent.variableName}Import`\n : 'rootRoute'\n }\n }`\n })\n .join('\\n')}\n }\n}`,\n ]),\n '// Create and export the route tree',\n routeConfigChildrenText,\n ...(TYPES_DISABLED\n ? []\n : [\n `export interface FileRoutesByFullPath {\n ${[...createRouteNodesByFullPath(routeNodes).entries()].map(\n ([fullPath, routeNode]) => {\n return `'${fullPath}': typeof ${getResolvedRouteNodeVariableName(routeNode)}`\n },\n )}\n}`,\n `export interface FileRoutesByTo {\n ${[...createRouteNodesByTo(routeNodes).entries()].map(([to, routeNode]) => {\n return `'${to}': typeof ${getResolvedRouteNodeVariableName(routeNode)}`\n })}\n}`,\n `export interface FileRoutesById {\n '__root__': typeof rootRoute,\n ${[...createRouteNodesById(routeNodes).entries()].map(([id, routeNode]) => {\n return `'${id}': typeof ${getResolvedRouteNodeVariableName(routeNode)}`\n })}\n}`,\n `export interface FileRouteTypes {\n fileRoutesByFullPath: FileRoutesByFullPath\n fullPaths: ${routeNodes.length > 0 ? [...createRouteNodesByFullPath(routeNodes).keys()].map((fullPath) => `'${fullPath}'`).join('|') : 'never'}\n fileRoutesByTo: FileRoutesByTo\n to: ${routeNodes.length > 0 ? [...createRouteNodesByTo(routeNodes).keys()].map((to) => `'${to}'`).join('|') : 'never'}\n id: ${[`'__root__'`, ...[...createRouteNodesById(routeNodes).keys()].map((id) => `'${id}'`)].join('|')}\n fileRoutesById: FileRoutesById\n}`,\n `export interface RootRouteChildren {\n ${routeTree.map((child) => `${child.variableName}Route: typeof ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`,\n ]),\n `const rootRouteChildren${TYPES_DISABLED ? '' : ': RootRouteChildren'} = {\n ${routeTree.map((child) => `${child.variableName}Route: ${getResolvedRouteNodeVariableName(child)}`).join(',')}\n}`,\n `export const routeTree = rootRoute._addFileChildren(rootRouteChildren)${TYPES_DISABLED ? '' : '._addFileTypes<FileRouteTypes>()'}`,\n ...config.routeTreeFileFooter,\n ]\n .filter(Boolean)\n .join('\\n\\n')\n\n const createRouteManifest = () => {\n const routesManifest = {\n __root__: {\n filePath: rootRouteNode.filePath,\n children: routeTree.map((d) => d.routePath),\n },\n ...Object.fromEntries(\n routeNodes.map((d) => {\n const filePathId = d.routePath\n\n return [\n filePathId,\n {\n filePath: d.filePath,\n parent: d.parent?.routePath ? d.parent.routePath : undefined,\n children: d.children?.map((childRoute) => childRoute.routePath),\n },\n ]\n }),\n ),\n }\n\n return JSON.stringify(\n {\n routes: routesManifest,\n },\n null,\n 2,\n )\n }\n\n const routeConfigFileContent =\n // TODO: Remove this disabled eslint rule when more target types are added.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n config.disableManifestGeneration || config.target !== 'react'\n ? routeImports\n : [\n routeImports,\n '\\n',\n '/* ROUTE_MANIFEST_START',\n createRouteManifest(),\n 'ROUTE_MANIFEST_END */',\n ].join('\\n')\n\n if (!checkLatest()) return\n\n const existingRouteTreeContent = await fsp\n .readFile(path.resolve(config.generatedRouteTree), 'utf-8')\n .catch((err) => {\n if (err.code === 'ENOENT') {\n return ''\n }\n\n throw err\n })\n\n if (!checkLatest()) return\n\n // Ensure the directory exists\n await fsp.mkdir(path.dirname(path.resolve(config.generatedRouteTree)), {\n recursive: true,\n })\n\n if (!checkLatest()) return\n\n // Write the route tree file, if it has changed\n const routeTreeWriteResult = await writeIfDifferent(\n path.resolve(config.generatedRouteTree),\n await format(existingRouteTreeContent, config),\n await format(routeConfigFileContent, config),\n {\n beforeWrite: () => {\n logger.log(`🟡 Updating ${config.generatedRouteTree}`)\n },\n },\n )\n if (routeTreeWriteResult && !checkLatest()) {\n return\n }\n\n logger.log(\n `✅ Processed ${routeNodes.length === 1 ? 'route' : 'routes'} in ${\n Date.now() - start\n }ms`,\n )\n}\n\n// function removeTrailingUnderscores(s?: string) {\n// return s?.replaceAll(/(_$)/gi, '').replaceAll(/(_\\/)/gi, '/')\n// }\n\nfunction removeGroups(s: string) {\n return s.replace(possiblyNestedRouteGroupPatternRegex, '')\n}\n\n/**\n * The `node.path` is used as the `id` in the route definition.\n * This function checks if the given node has a parent and if so, it determines the correct path for the given node.\n * @param node - The node to determine the path for.\n * @returns The correct path for the given node.\n */\nfunction determineNodePath(node: RouteNode) {\n return (node.path = node.parent\n ? node.routePath?.replace(node.parent.routePath ?? '', '') || '/'\n : node.routePath)\n}\n\n/**\n * Removes the last segment from a given path. Segments are considered to be separated by a '/'.\n *\n * @param {string} routePath - The path from which to remove the last segment. Defaults to '/'.\n * @returns {string} The path with the last segment removed.\n * @example\n * removeLastSegmentFromPath('/workspace/_auth/foo') // '/workspace/_auth'\n */\nexport function removeLastSegmentFromPath(routePath: string = '/'): string {\n const segments = routePath.split('/')\n segments.pop() // Remove the last segment\n return segments.join('/')\n}\n\n/**\n * Removes all segments from a given path that start with an underscore ('_').\n *\n * @param {string} routePath - The path from which to remove segments. Defaults to '/'.\n * @returns {string} The path with all underscore-prefixed segments removed.\n * @example\n * removeLayoutSegments('/workspace/_auth/foo') // '/workspace/foo'\n */\nfunction removeLayoutSegments(routePath: string = '/'): string {\n const segments = routePath.split('/')\n const newSegments = segments.filter((segment) => !segment.startsWith('_'))\n return newSegments.join('/')\n}\n\nexport function hasParentRoute(\n routes: Array<RouteNode>,\n node: RouteNode,\n routePathToCheck: string | undefined,\n): RouteNode | null {\n if (!routePathToCheck || routePathToCheck === '/') {\n return null\n }\n\n const sortedNodes = multiSortBy(routes, [\n (d) => d.routePath!.length * -1,\n (d) => d.variableName,\n ]).filter((d) => d.routePath !== `/${rootPathId}`)\n\n for (const route of sortedNodes) {\n if (route.routePath === '/') continue\n\n if (\n routePathToCheck.startsWith(`${route.routePath}/`) &&\n route.routePath !== routePathToCheck\n ) {\n return route\n }\n }\n\n const segments = routePathToCheck.split('/')\n segments.pop() // Remove the last segment\n const parentRoutePath = segments.join('/')\n\n return hasParentRoute(routes, node, parentRoutePath)\n}\n\n/**\n * Gets the final variable name for a route\n */\nexport const getResolvedRouteNodeVariableName = (\n routeNode: RouteNode,\n): string => {\n return routeNode.children?.length\n ? `${routeNode.variableName}RouteWithChildren`\n : `${routeNode.variableName}Route`\n}\n\n/**\n * Creates a map from fullPath to routeNode\n */\nexport const createRouteNodesByFullPath = (\n routeNodes: Array<RouteNode>,\n): Map<string, RouteNode> => {\n return new Map(\n routeNodes.map((routeNode) => [inferFullPath(routeNode), routeNode]),\n )\n}\n\n/**\n * Create a map from 'to' to a routeNode\n */\nexport const createRouteNodesByTo = (\n routeNodes: Array<RouteNode>,\n): Map<string, RouteNode> => {\n return new Map(\n dedupeBranchesAndIndexRoutes(routeNodes).map((routeNode) => [\n inferTo(routeNode),\n routeNode,\n ]),\n )\n}\n\n/**\n * Create a map from 'id' to a routeNode\n */\nexport const createRouteNodesById = (\n routeNodes: Array<RouteNode>,\n): Map<string, RouteNode> => {\n return new Map(\n routeNodes.map((routeNode) => {\n const id = routeNode.routePath ?? ''\n return [id, routeNode]\n }),\n )\n}\n\n/**\n * Infers the full path for use by TS\n */\nexport const inferFullPath = (routeNode: RouteNode): string => {\n const fullPath = removeGroups(\n removeUnderscores(removeLayoutSegments(routeNode.routePath)) ?? '',\n )\n\n return routeNode.cleanedPath === '/' ? fullPath : fullPath.replace(/\\/$/, '')\n}\n\n/**\n * Infers the path for use by TS\n */\nexport const inferPath = (routeNode: RouteNode): string => {\n return routeNode.cleanedPath === '/'\n ? routeNode.cleanedPath\n : (routeNode.cleanedPath?.replace(/\\/$/, '') ?? '')\n}\n\n/**\n * Infers to path\n */\nexport const inferTo = (routeNode: RouteNode): string => {\n const fullPath = inferFullPath(routeNode)\n\n if (fullPath === '/') return fullPath\n\n return fullPath.replace(/\\/$/, '')\n}\n\n/**\n * Dedupes branches and index routes\n */\nexport const dedupeBranchesAndIndexRoutes = (\n routes: Array<RouteNode>,\n): Array<RouteNode> => {\n return routes.filter((route) => {\n if (route.children?.find((child) => child.cleanedPath === '/')) return false\n return true\n })\n}\n\nfunction checkUnique<TElement>(routes: Array<TElement>, key: keyof TElement) {\n // Check no two routes have the same `key`\n // if they do, throw an error with the conflicting filePaths\n const keys = routes.map((d) => d[key])\n const uniqueKeys = new Set(keys)\n if (keys.length !== uniqueKeys.size) {\n const duplicateKeys = keys.filter((d, i) => keys.indexOf(d) !== i)\n const conflictingFiles = routes.filter((d) =>\n duplicateKeys.includes(d[key]),\n )\n return conflictingFiles\n }\n return undefined\n}\n\nfunction checkRouteFullPathUniqueness(\n _routes: Array<RouteNode>,\n config: Config,\n) {\n const routes = _routes.map((d) => {\n const inferredFullPath = inferFullPath(d)\n return { ...d, inferredFullPath }\n })\n\n const conflictingFiles = checkUnique(routes, 'inferredFullPath')\n\n if (conflictingFiles !== undefined) {\n const errorMessage = `Conflicting configuration paths were found for the following route${conflictingFiles.length > 1 ? 's' : ''}: ${conflictingFiles\n .map((p) => `\"${p.inferredFullPath}\"`)\n .join(', ')}.\nPlease ensure each route has a unique full path.\nConflicting files: \\n ${conflictingFiles.map((d) => path.resolve(config.routesDirectory, d.filePath)).join('\\n ')}\\n`\n throw new Error(errorMessage)\n }\n}\n\nfunction checkStartAPIRoutes(_routes: Array<RouteNode>, config: Config) {\n if (_routes.length === 0) {\n return []\n }\n\n // Make sure these are valid URLs\n // Route Groups and Layout Routes aren't being removed since\n // you may want to have an API route that starts with an underscore\n // or be wrapped in parentheses\n const routes = _routes.map((d) => {\n const routePath = removeTrailingSlash(d.routePath ?? '')\n return { ...d, routePath }\n })\n\n const conflictingFiles = checkUnique(routes, 'routePath')\n\n if (conflictingFiles !== undefined) {\n const errorMessage = `Conflicting configuration paths were found for the following API route${conflictingFiles.length > 1 ? 's' : ''}: ${conflictingFiles\n .map((p) => `\"${p}\"`)\n .join(', ')}.\n Please ensure each API route has a unique route path.\nConflicting files: \\n ${conflictingFiles.map((d) => path.resolve(config.routesDirectory, d.filePath)).join('\\n ')}\\n`\n throw new Error(errorMessage)\n }\n\n return routes\n}\n\nexport type StartAPIRoutePathSegment = {\n value: string\n type: 'path' | 'param' | 'splat'\n}\n\n/**\n * This function takes in a path in the format accepted by TanStack Router\n * and returns an array of path segments that can be used to generate\n * the pathname of the TanStack Start API route.\n *\n * @param src\n * @returns\n */\nexport function startAPIRouteSegmentsFromTSRFilePath(\n src: string,\n config: Config,\n): Array<StartAPIRoutePathSegment> {\n const routePath = determineInitialRoutePath(src)\n\n const parts = routePath\n .replaceAll('.', '/')\n .split('/')\n .filter((p) => !!p && p !== config.indexToken)\n const segments: Array<StartAPIRoutePathSegment> = parts.map((part) => {\n if (part.startsWith('$')) {\n if (part === '$') {\n return { value: part, type: 'splat' }\n }\n\n part.replaceAll('$', '')\n return { value: part, type: 'param' }\n }\n\n return { value: part, type: 'path' }\n })\n\n return segments\n}\n"],"names":["virtualGetRouteNodes","physicalGetRouteNodes","children"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Config } from './config.js';
2
2
  type TemplateTag = 'tsrImports' | 'tsrPath' | 'tsrExportStart' | 'tsrExportEnd';
3
- export declare function fillTemplate(template: string, values: Record<TemplateTag, string>): string;
3
+ export declare function fillTemplate(config: Config, template: string, values: Record<TemplateTag, string>): Promise<string>;
4
4
  type TargetTemplate = {
5
5
  fullPkg: string;
6
6
  subPkg: string;
@@ -1,8 +1,10 @@
1
- function fillTemplate(template, values) {
2
- return template.replace(
1
+ import { format } from "./utils.js";
2
+ function fillTemplate(config, template, values) {
3
+ const replaced = template.replace(
3
4
  /%%(\w+)%%/g,
4
5
  (_, key) => values[key] || ""
5
6
  );
7
+ return format(replaced, config);
6
8
  }
7
9
  function getTargetTemplate(target) {
8
10
  switch (target) {
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","sources":["../../src/template.ts"],"sourcesContent":["import type { Config } from './config'\n\ntype TemplateTag = 'tsrImports' | 'tsrPath' | 'tsrExportStart' | 'tsrExportEnd'\n\nexport function fillTemplate(\n template: string,\n values: Record<TemplateTag, string>,\n) {\n return template.replace(\n /%%(\\w+)%%/g,\n (_, key) => values[key as TemplateTag] || '',\n )\n}\n\ntype TargetTemplate = {\n fullPkg: string\n subPkg: string\n rootRoute: {\n template: () => string\n imports: {\n tsrImports: () => string\n tsrExportStart: () => string\n tsrExportEnd: () => string\n }\n }\n route: {\n template: () => string\n imports: {\n tsrImports: () => string\n tsrExportStart: (routePath: string) => string\n tsrExportEnd: () => string\n }\n }\n lazyRoute: {\n template: () => string\n imports: {\n tsrImports: () => string\n tsrExportStart: (routePath: string) => string\n tsrExportEnd: () => string\n }\n }\n}\n\nexport function getTargetTemplate(target: Config['target']): TargetTemplate {\n switch (target) {\n // TODO: Remove this disabled eslint rule when more target types are added.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n case 'react':\n return {\n fullPkg: '@tanstack/react-router',\n subPkg: 'react-router',\n rootRoute: {\n template: () =>\n [\n 'import * as React from \"react\"\\n',\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{\\n component: RootComponent\\n }%%tsrExportEnd%%\\n\\n',\n 'function RootComponent() { return (<React.Fragment><div>Hello \"%%tsrPath%%\"!</div><Outlet /></React.Fragment>) };\\n',\n ].join(''),\n imports: {\n tsrImports: () =>\n \"import { Outlet, createRootRoute } from '@tanstack/react-router';\",\n tsrExportStart: () => 'export const Route = createRootRoute(',\n tsrExportEnd: () => ');',\n },\n },\n route: {\n template: () =>\n [\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{\\n component: RouteComponent\\n }%%tsrExportEnd%%\\n\\n',\n 'function RouteComponent() { return <div>Hello \"%%tsrPath%%\"!</div> };\\n',\n ].join(''),\n imports: {\n tsrImports: () =>\n \"import { createFileRoute } from '@tanstack/react-router';\",\n tsrExportStart: (routePath) =>\n `export const Route = createFileRoute('${routePath}')(`,\n tsrExportEnd: () => ');',\n },\n },\n lazyRoute: {\n template: () =>\n [\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{\\n component: RouteComponent\\n }%%tsrExportEnd%%\\n\\n',\n 'function RouteComponent() { return <div>Hello \"%%tsrPath%%\"!</div> };\\n',\n ].join(''),\n imports: {\n tsrImports: () =>\n \"import { createLazyFileRoute } from '@tanstack/react-router';\",\n tsrExportStart: (routePath) =>\n `export const Route = createLazyFileRoute('${routePath}')(`,\n tsrExportEnd: () => ');',\n },\n },\n }\n default:\n throw new Error(`router-generator: Unknown target type: ${target}`)\n }\n}\n\nexport const defaultAPIRouteTemplate = [\n 'import { json } from \"@tanstack/start\";\\n',\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{ GET: ({ request, params }) => { return json({ message:\\'Hello \"%%tsrPath%%\"!\\' }) }}%%tsrExportEnd%%\\n',\n].join('')\n"],"names":[],"mappings":"AAIgB,SAAA,aACd,UACA,QACA;AACA,SAAO,SAAS;AAAA,IACd;AAAA,IACA,CAAC,GAAG,QAAQ,OAAO,GAAkB,KAAK;AAAA,EAC5C;AACF;AA+BO,SAAS,kBAAkB,QAA0C;AAC1E,UAAQ,QAAQ;AAAA;AAAA;AAAA,IAGd,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,UACT,UAAU,MACR;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,EAAE;AAAA,UACX,SAAS;AAAA,YACP,YAAY,MACV;AAAA,YACF,gBAAgB,MAAM;AAAA,YACtB,cAAc,MAAM;AAAA,UAAA;AAAA,QAExB;AAAA,QACA,OAAO;AAAA,UACL,UAAU,MACR;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,EAAE;AAAA,UACX,SAAS;AAAA,YACP,YAAY,MACV;AAAA,YACF,gBAAgB,CAAC,cACf,yCAAyC,SAAS;AAAA,YACpD,cAAc,MAAM;AAAA,UAAA;AAAA,QAExB;AAAA,QACA,WAAW;AAAA,UACT,UAAU,MACR;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,EAAE;AAAA,UACX,SAAS;AAAA,YACP,YAAY,MACV;AAAA,YACF,gBAAgB,CAAC,cACf,6CAA6C,SAAS;AAAA,YACxD,cAAc,MAAM;AAAA,UAAA;AAAA,QACtB;AAAA,MAEJ;AAAA,IACF;AACE,YAAM,IAAI,MAAM,0CAA0C,MAAM,EAAE;AAAA,EAAA;AAExE;AAEO,MAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AACF,EAAE,KAAK,EAAE;"}
1
+ {"version":3,"file":"template.js","sources":["../../src/template.ts"],"sourcesContent":["import { format } from './utils'\nimport type { Config } from './config'\n\ntype TemplateTag = 'tsrImports' | 'tsrPath' | 'tsrExportStart' | 'tsrExportEnd'\n\nexport function fillTemplate(\n config: Config,\n template: string,\n values: Record<TemplateTag, string>,\n) {\n const replaced = template.replace(\n /%%(\\w+)%%/g,\n (_, key) => values[key as TemplateTag] || '',\n )\n return format(replaced, config)\n}\n\ntype TargetTemplate = {\n fullPkg: string\n subPkg: string\n rootRoute: {\n template: () => string\n imports: {\n tsrImports: () => string\n tsrExportStart: () => string\n tsrExportEnd: () => string\n }\n }\n route: {\n template: () => string\n imports: {\n tsrImports: () => string\n tsrExportStart: (routePath: string) => string\n tsrExportEnd: () => string\n }\n }\n lazyRoute: {\n template: () => string\n imports: {\n tsrImports: () => string\n tsrExportStart: (routePath: string) => string\n tsrExportEnd: () => string\n }\n }\n}\n\nexport function getTargetTemplate(target: Config['target']): TargetTemplate {\n switch (target) {\n // TODO: Remove this disabled eslint rule when more target types are added.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n case 'react':\n return {\n fullPkg: '@tanstack/react-router',\n subPkg: 'react-router',\n rootRoute: {\n template: () =>\n [\n 'import * as React from \"react\"\\n',\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{\\n component: RootComponent\\n }%%tsrExportEnd%%\\n\\n',\n 'function RootComponent() { return (<React.Fragment><div>Hello \"%%tsrPath%%\"!</div><Outlet /></React.Fragment>) };\\n',\n ].join(''),\n imports: {\n tsrImports: () =>\n \"import { Outlet, createRootRoute } from '@tanstack/react-router';\",\n tsrExportStart: () => 'export const Route = createRootRoute(',\n tsrExportEnd: () => ');',\n },\n },\n route: {\n template: () =>\n [\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{\\n component: RouteComponent\\n }%%tsrExportEnd%%\\n\\n',\n 'function RouteComponent() { return <div>Hello \"%%tsrPath%%\"!</div> };\\n',\n ].join(''),\n imports: {\n tsrImports: () =>\n \"import { createFileRoute } from '@tanstack/react-router';\",\n tsrExportStart: (routePath) =>\n `export const Route = createFileRoute('${routePath}')(`,\n tsrExportEnd: () => ');',\n },\n },\n lazyRoute: {\n template: () =>\n [\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{\\n component: RouteComponent\\n }%%tsrExportEnd%%\\n\\n',\n 'function RouteComponent() { return <div>Hello \"%%tsrPath%%\"!</div> };\\n',\n ].join(''),\n imports: {\n tsrImports: () =>\n \"import { createLazyFileRoute } from '@tanstack/react-router';\",\n tsrExportStart: (routePath) =>\n `export const Route = createLazyFileRoute('${routePath}')(`,\n tsrExportEnd: () => ');',\n },\n },\n }\n default:\n throw new Error(`router-generator: Unknown target type: ${target}`)\n }\n}\n\nexport const defaultAPIRouteTemplate = [\n 'import { json } from \"@tanstack/start\";\\n',\n '%%tsrImports%%',\n '\\n\\n',\n '%%tsrExportStart%%{ GET: ({ request, params }) => { return json({ message:\\'Hello \"%%tsrPath%%\"!\\' }) }}%%tsrExportEnd%%\\n',\n].join('')\n"],"names":[],"mappings":";AAKgB,SAAA,aACd,QACA,UACA,QACA;AACA,QAAM,WAAW,SAAS;AAAA,IACxB;AAAA,IACA,CAAC,GAAG,QAAQ,OAAO,GAAkB,KAAK;AAAA,EAC5C;AACO,SAAA,OAAO,UAAU,MAAM;AAChC;AA+BO,SAAS,kBAAkB,QAA0C;AAC1E,UAAQ,QAAQ;AAAA;AAAA;AAAA,IAGd,KAAK;AACI,aAAA;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,UACT,UAAU,MACR;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,EAAE;AAAA,UACX,SAAS;AAAA,YACP,YAAY,MACV;AAAA,YACF,gBAAgB,MAAM;AAAA,YACtB,cAAc,MAAM;AAAA,UAAA;AAAA,QAExB;AAAA,QACA,OAAO;AAAA,UACL,UAAU,MACR;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,EAAE;AAAA,UACX,SAAS;AAAA,YACP,YAAY,MACV;AAAA,YACF,gBAAgB,CAAC,cACf,yCAAyC,SAAS;AAAA,YACpD,cAAc,MAAM;AAAA,UAAA;AAAA,QAExB;AAAA,QACA,WAAW;AAAA,UACT,UAAU,MACR;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,EAAE;AAAA,UACX,SAAS;AAAA,YACP,YAAY,MACV;AAAA,YACF,gBAAgB,CAAC,cACf,6CAA6C,SAAS;AAAA,YACxD,cAAc,MAAM;AAAA,UAAA;AAAA,QACtB;AAAA,MAEJ;AAAA,IACF;AACE,YAAM,IAAI,MAAM,0CAA0C,MAAM,EAAE;AAAA,EAAA;AAExE;AAEO,MAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AACF,EAAE,KAAK,EAAE;"}
@@ -1,4 +1,4 @@
1
- import * as prettier from 'prettier';
1
+ import { Config } from './config.js';
2
2
  export declare function multiSortBy<T>(arr: Array<T>, accessors?: Array<(item: T) => any>): Array<T>;
3
3
  export declare function cleanPath(path: string): string;
4
4
  export declare function trimPathLeft(path: string): string;
@@ -23,16 +23,23 @@ export declare function removeExt(d: string, keepExtension?: boolean): string;
23
23
  * This function writes to a file if the content is different.
24
24
  *
25
25
  * @param filepath The path to the file
26
- * @param prettierOptions Prettier options
27
26
  * @param content Original content
28
27
  * @param incomingContent New content
29
28
  * @param callbacks Callbacks to run before and after writing
30
29
  * @returns Whether the file was written
31
30
  */
32
- export declare function writeIfDifferent(filepath: string, prettierOptions: prettier.Options, content: string, incomingContent: string, callbacks?: {
31
+ export declare function writeIfDifferent(filepath: string, content: string, incomingContent: string, callbacks?: {
33
32
  beforeWrite?: () => void;
34
33
  afterWrite?: () => void;
35
34
  }): Promise<boolean>;
35
+ /**
36
+ * This function formats the source code using the default formatter (Prettier).
37
+ *
38
+ * @param source The content to format
39
+ * @param config The configuration object
40
+ * @returns The formatted content
41
+ */
42
+ export declare function format(source: string, config: Config): Promise<string>;
36
43
  /**
37
44
  * This function resets the regex index to 0 so that it can be reused
38
45
  * without having to create a new regex object or worry about the last
package/dist/esm/utils.js CHANGED
@@ -84,20 +84,24 @@ function capitalize(s) {
84
84
  function removeExt(d, keepExtension = false) {
85
85
  return keepExtension ? d : d.substring(0, d.lastIndexOf(".")) || d;
86
86
  }
87
- async function writeIfDifferent(filepath, prettierOptions, content, incomingContent, callbacks) {
87
+ async function writeIfDifferent(filepath, content, incomingContent, callbacks) {
88
88
  var _a, _b;
89
- const [formattedContent, updatedContent] = await Promise.all([
90
- prettier.format(content, prettierOptions),
91
- prettier.format(incomingContent, prettierOptions)
92
- ]);
93
- if (formattedContent !== updatedContent) {
89
+ if (content !== incomingContent) {
94
90
  (_a = callbacks == null ? void 0 : callbacks.beforeWrite) == null ? void 0 : _a.call(callbacks);
95
- fs.writeFileSync(filepath, updatedContent);
91
+ fs.writeFileSync(filepath, incomingContent);
96
92
  (_b = callbacks == null ? void 0 : callbacks.afterWrite) == null ? void 0 : _b.call(callbacks);
97
93
  return true;
98
94
  }
99
95
  return false;
100
96
  }
97
+ async function format(source, config) {
98
+ const prettierOptions = {
99
+ semi: config.semicolons,
100
+ singleQuote: config.quoteStyle === "single",
101
+ parser: "typescript"
102
+ };
103
+ return prettier.format(source, prettierOptions);
104
+ }
101
105
  function resetRegex(regex) {
102
106
  regex.lastIndex = 0;
103
107
  return;
@@ -106,6 +110,7 @@ export {
106
110
  capitalize,
107
111
  cleanPath,
108
112
  determineInitialRoutePath,
113
+ format,
109
114
  logging,
110
115
  multiSortBy,
111
116
  removeExt,
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../src/utils.ts"],"sourcesContent":["import * as fs from 'node:fs'\nimport * as prettier from 'prettier'\n\nexport function multiSortBy<T>(\n arr: Array<T>,\n accessors: Array<(item: T) => any> = [(d) => d],\n): Array<T> {\n return arr\n .map((d, i) => [d, i] as const)\n .sort(([a, ai], [b, bi]) => {\n for (const accessor of accessors) {\n const ao = accessor(a)\n const bo = accessor(b)\n\n if (typeof ao === 'undefined') {\n if (typeof bo === 'undefined') {\n continue\n }\n return 1\n }\n\n if (ao === bo) {\n continue\n }\n\n return ao > bo ? 1 : -1\n }\n\n return ai - bi\n })\n .map(([d]) => d)\n}\n\nexport function cleanPath(path: string) {\n // remove double slashes\n return path.replace(/\\/{2,}/g, '/')\n}\n\nexport function trimPathLeft(path: string) {\n return path === '/' ? path : path.replace(/^\\/{1,}/, '')\n}\n\nexport function logging(config: { disabled: boolean }) {\n function stripEmojis(str: string) {\n return str.replace(\n /[\\p{Emoji_Presentation}\\p{Extended_Pictographic}]/gu,\n '',\n )\n }\n\n function formatLogArgs(args: Array<any>): Array<any> {\n if (process.env.CI) {\n return args.map((arg) =>\n typeof arg === 'string' ? stripEmojis(arg) : arg,\n )\n }\n return args\n }\n\n return {\n log: (...args: Array<any>) => {\n if (!config.disabled) console.log(...formatLogArgs(args))\n },\n debug: (...args: Array<any>) => {\n if (!config.disabled) console.debug(...formatLogArgs(args))\n },\n info: (...args: Array<any>) => {\n if (!config.disabled) console.info(...formatLogArgs(args))\n },\n warn: (...args: Array<any>) => {\n if (!config.disabled) console.warn(...formatLogArgs(args))\n },\n error: (...args: Array<any>) => {\n if (!config.disabled) console.error(...formatLogArgs(args))\n },\n }\n}\n\nexport function removeLeadingSlash(path: string): string {\n return path.replace(/^\\//, '')\n}\n\nexport function removeTrailingSlash(s: string) {\n return s.replace(/\\/$/, '')\n}\n\nexport function determineInitialRoutePath(routePath: string) {\n return cleanPath(`/${routePath.split('.').join('/')}`) || ''\n}\n\nexport function replaceBackslash(s: string) {\n return s.replaceAll(/\\\\/gi, '/')\n}\n\nexport function routePathToVariable(routePath: string): string {\n return (\n removeUnderscores(routePath)\n ?.replace(/\\/\\$\\//g, '/splat/')\n .replace(/\\$$/g, 'splat')\n .replace(/\\$/g, '')\n .split(/[/-]/g)\n .map((d, i) => (i > 0 ? capitalize(d) : d))\n .join('')\n .replace(/([^a-zA-Z0-9]|[.])/gm, '')\n .replace(/^(\\d)/g, 'R$1') ?? ''\n )\n}\n\nexport function removeUnderscores(s?: string) {\n return s?.replaceAll(/(^_|_$)/gi, '').replaceAll(/(\\/_|_\\/)/gi, '/')\n}\n\nexport function capitalize(s: string) {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nexport function removeExt(d: string, keepExtension: boolean = false) {\n return keepExtension ? d : d.substring(0, d.lastIndexOf('.')) || d\n}\n\n/**\n * This function writes to a file if the content is different.\n *\n * @param filepath The path to the file\n * @param prettierOptions Prettier options\n * @param content Original content\n * @param incomingContent New content\n * @param callbacks Callbacks to run before and after writing\n * @returns Whether the file was written\n */\nexport async function writeIfDifferent(\n filepath: string,\n prettierOptions: prettier.Options,\n content: string,\n incomingContent: string,\n callbacks?: { beforeWrite?: () => void; afterWrite?: () => void },\n): Promise<boolean> {\n const [formattedContent, updatedContent] = await Promise.all([\n prettier.format(content, prettierOptions),\n prettier.format(incomingContent, prettierOptions),\n ])\n\n if (formattedContent !== updatedContent) {\n callbacks?.beforeWrite?.()\n fs.writeFileSync(filepath, updatedContent)\n callbacks?.afterWrite?.()\n return true\n }\n\n return false\n}\n\n/**\n * This function resets the regex index to 0 so that it can be reused\n * without having to create a new regex object or worry about the last\n * state when using the global flag.\n *\n * @param regex The regex object to reset\n * @returns\n */\nexport function resetRegex(regex: RegExp) {\n regex.lastIndex = 0\n return\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../src/utils.ts"],"sourcesContent":["import * as fs from 'node:fs'\nimport * as prettier from 'prettier'\nimport type { Config } from './config'\n\nexport function multiSortBy<T>(\n arr: Array<T>,\n accessors: Array<(item: T) => any> = [(d) => d],\n): Array<T> {\n return arr\n .map((d, i) => [d, i] as const)\n .sort(([a, ai], [b, bi]) => {\n for (const accessor of accessors) {\n const ao = accessor(a)\n const bo = accessor(b)\n\n if (typeof ao === 'undefined') {\n if (typeof bo === 'undefined') {\n continue\n }\n return 1\n }\n\n if (ao === bo) {\n continue\n }\n\n return ao > bo ? 1 : -1\n }\n\n return ai - bi\n })\n .map(([d]) => d)\n}\n\nexport function cleanPath(path: string) {\n // remove double slashes\n return path.replace(/\\/{2,}/g, '/')\n}\n\nexport function trimPathLeft(path: string) {\n return path === '/' ? path : path.replace(/^\\/{1,}/, '')\n}\n\nexport function logging(config: { disabled: boolean }) {\n function stripEmojis(str: string) {\n return str.replace(\n /[\\p{Emoji_Presentation}\\p{Extended_Pictographic}]/gu,\n '',\n )\n }\n\n function formatLogArgs(args: Array<any>): Array<any> {\n if (process.env.CI) {\n return args.map((arg) =>\n typeof arg === 'string' ? stripEmojis(arg) : arg,\n )\n }\n return args\n }\n\n return {\n log: (...args: Array<any>) => {\n if (!config.disabled) console.log(...formatLogArgs(args))\n },\n debug: (...args: Array<any>) => {\n if (!config.disabled) console.debug(...formatLogArgs(args))\n },\n info: (...args: Array<any>) => {\n if (!config.disabled) console.info(...formatLogArgs(args))\n },\n warn: (...args: Array<any>) => {\n if (!config.disabled) console.warn(...formatLogArgs(args))\n },\n error: (...args: Array<any>) => {\n if (!config.disabled) console.error(...formatLogArgs(args))\n },\n }\n}\n\nexport function removeLeadingSlash(path: string): string {\n return path.replace(/^\\//, '')\n}\n\nexport function removeTrailingSlash(s: string) {\n return s.replace(/\\/$/, '')\n}\n\nexport function determineInitialRoutePath(routePath: string) {\n return cleanPath(`/${routePath.split('.').join('/')}`) || ''\n}\n\nexport function replaceBackslash(s: string) {\n return s.replaceAll(/\\\\/gi, '/')\n}\n\nexport function routePathToVariable(routePath: string): string {\n return (\n removeUnderscores(routePath)\n ?.replace(/\\/\\$\\//g, '/splat/')\n .replace(/\\$$/g, 'splat')\n .replace(/\\$/g, '')\n .split(/[/-]/g)\n .map((d, i) => (i > 0 ? capitalize(d) : d))\n .join('')\n .replace(/([^a-zA-Z0-9]|[.])/gm, '')\n .replace(/^(\\d)/g, 'R$1') ?? ''\n )\n}\n\nexport function removeUnderscores(s?: string) {\n return s?.replaceAll(/(^_|_$)/gi, '').replaceAll(/(\\/_|_\\/)/gi, '/')\n}\n\nexport function capitalize(s: string) {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nexport function removeExt(d: string, keepExtension: boolean = false) {\n return keepExtension ? d : d.substring(0, d.lastIndexOf('.')) || d\n}\n\n/**\n * This function writes to a file if the content is different.\n *\n * @param filepath The path to the file\n * @param content Original content\n * @param incomingContent New content\n * @param callbacks Callbacks to run before and after writing\n * @returns Whether the file was written\n */\nexport async function writeIfDifferent(\n filepath: string,\n content: string,\n incomingContent: string,\n callbacks?: { beforeWrite?: () => void; afterWrite?: () => void },\n): Promise<boolean> {\n if (content !== incomingContent) {\n callbacks?.beforeWrite?.()\n fs.writeFileSync(filepath, incomingContent)\n callbacks?.afterWrite?.()\n return true\n }\n return false\n}\n\n/**\n * This function formats the source code using the default formatter (Prettier).\n *\n * @param source The content to format\n * @param config The configuration object\n * @returns The formatted content\n */\nexport async function format(source: string, config: Config): Promise<string> {\n const prettierOptions: prettier.Config = {\n semi: config.semicolons,\n singleQuote: config.quoteStyle === 'single',\n parser: 'typescript',\n }\n return prettier.format(source, prettierOptions)\n}\n\n/**\n * This function resets the regex index to 0 so that it can be reused\n * without having to create a new regex object or worry about the last\n * state when using the global flag.\n *\n * @param regex The regex object to reset\n * @returns\n */\nexport function resetRegex(regex: RegExp) {\n regex.lastIndex = 0\n return\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/router-generator",
3
- "version": "1.102.5",
3
+ "version": "1.102.6",
4
4
  "description": "Modern and scalable routing for React applications",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",