{"version":3,"file":"config.cjs","names":[],"sources":["../../src/config.ts"],"sourcesContent":["import path from 'node:path'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { z } from 'zod'\nimport { virtualRootRouteSchema } from './filesystem/virtual/config'\nimport type { GeneratorPlugin } from './plugin/types'\n\nconst tokenJsonRegexSchema = z.object({\n  regex: z.string(),\n  flags: z.string().optional(),\n})\n\nconst tokenMatcherSchema = z.union([\n  z.string(),\n  z.instanceof(RegExp),\n  tokenJsonRegexSchema,\n])\n\nexport type TokenMatcherJson = string | z.infer<typeof tokenJsonRegexSchema>\n\nexport type TokenMatcher = z.infer<typeof tokenMatcherSchema>\n\nexport const baseConfigSchema = z.object({\n  target: z.enum(['react', 'solid', 'vue']).optional().default('react'),\n  virtualRouteConfig: virtualRootRouteSchema.or(z.string()).optional(),\n  routeFilePrefix: z.string().optional(),\n  routeFileIgnorePrefix: z.string().optional().default('-'),\n  routeFileIgnorePattern: z.string().optional(),\n  routesDirectory: z.string().optional().default('./src/routes'),\n  quoteStyle: z.enum(['single', 'double']).optional().default('single'),\n  semicolons: z.boolean().optional().default(false),\n  disableLogging: z.boolean().optional().default(false),\n  routeTreeFileHeader: z\n    .array(z.string())\n    .optional()\n    .default([\n      '/* eslint-disable */',\n      '// @ts-nocheck',\n      '// noinspection JSUnusedGlobalSymbols',\n    ]),\n  indexToken: tokenMatcherSchema.optional().default('index'),\n  routeToken: tokenMatcherSchema.optional().default('route'),\n  pathParamsAllowedCharacters: z\n    .array(z.enum([';', ':', '@', '&', '=', '+', '$', ',']))\n    .optional(),\n})\n\nexport type BaseConfig = z.infer<typeof baseConfigSchema>\n\nexport const configSchema = baseConfigSchema.extend({\n  generatedRouteTree: z.string().optional().default('./src/routeTree.gen.ts'),\n  disableTypes: z.boolean().optional().default(false),\n  addExtensions: z\n    .union([z.boolean(), z.string()])\n    .optional()\n    .default(false)\n    .transform((v) =>\n      typeof v === 'string' ? (v.startsWith('.') ? v : `.${v}`) : v,\n    ),\n  enableRouteTreeFormatting: z.boolean().optional().default(true),\n  routeTreeFileFooter: z\n    .union([\n      z.array(z.string()).optional().default([]),\n      z.custom<() => Array<string>>((value) => typeof value === 'function'),\n    ])\n    .optional(),\n  autoCodeSplitting: z.boolean().optional(),\n  customScaffolding: z\n    .object({\n      routeTemplate: z.string().optional(),\n      lazyRouteTemplate: z.string().optional(),\n    })\n    .optional(),\n  experimental: z\n    .object({\n      // TODO: This has been made stable and is now \"autoCodeSplitting\". Remove in next major version.\n      enableCodeSplitting: z.boolean().optional(),\n    })\n    .optional(),\n  plugins: z.array(z.custom<GeneratorPlugin>()).optional(),\n  tmpDir: z.string().optional().default(''),\n  importRoutesUsingAbsolutePaths: z.boolean().optional().default(false),\n})\n\nexport type Config = z.infer<typeof configSchema>\n\ntype ResolveParams = {\n  configDirectory: string\n}\n\nexport function resolveConfigPath({ configDirectory }: ResolveParams) {\n  return path.resolve(configDirectory, 'tsr.config.json')\n}\n\nexport function getConfig(\n  inlineConfig: Partial<Config> = {},\n  configDirectory?: string,\n): Config {\n  if (configDirectory === undefined) {\n    configDirectory = process.cwd()\n  }\n  const configFilePathJson = resolveConfigPath({ configDirectory })\n  const exists = existsSync(configFilePathJson)\n\n  let config: Config\n\n  if (exists) {\n    // Parse file config (allows JSON regex-object form)\n    const fileConfigRaw = JSON.parse(readFileSync(configFilePathJson, 'utf-8'))\n\n    // Merge raw configs (inline overrides file), then parse once to apply defaults\n    // This ensures file config values aren't overwritten by inline defaults\n    const merged = {\n      ...fileConfigRaw,\n      ...inlineConfig,\n    }\n    config = configSchema.parse(merged)\n  } else {\n    config = configSchema.parse(inlineConfig)\n  }\n\n  // If typescript is disabled, make sure the generated route tree is a .js file\n  if (config.disableTypes) {\n    config.generatedRouteTree = config.generatedRouteTree.replace(\n      /\\.(ts|tsx)$/,\n      '.js',\n    )\n  }\n\n  // if a configDirectory is used, paths should be relative to that directory\n  if (configDirectory) {\n    // if absolute configDirectory is provided, use it as the root\n    if (path.isAbsolute(configDirectory)) {\n      config.routesDirectory = path.resolve(\n        configDirectory,\n        config.routesDirectory,\n      )\n      config.generatedRouteTree = path.resolve(\n        configDirectory,\n        config.generatedRouteTree,\n      )\n    } else {\n      config.routesDirectory = path.resolve(\n        process.cwd(),\n        configDirectory,\n        config.routesDirectory,\n      )\n      config.generatedRouteTree = path.resolve(\n        process.cwd(),\n        configDirectory,\n        config.generatedRouteTree,\n      )\n    }\n  }\n\n  const resolveTmpDir = (dir: string | Array<string>) => {\n    if (Array.isArray(dir)) {\n      dir = path.join(...dir)\n    }\n    if (!path.isAbsolute(dir)) {\n      dir = path.resolve(process.cwd(), dir)\n    }\n    return dir\n  }\n\n  if (config.tmpDir) {\n    config.tmpDir = resolveTmpDir(config.tmpDir)\n  } else if (process.env.TSR_TMP_DIR) {\n    config.tmpDir = resolveTmpDir(process.env.TSR_TMP_DIR)\n  } else {\n    config.tmpDir = resolveTmpDir(['.tanstack', 'tmp'])\n  }\n\n  validateConfig(config)\n  return config\n}\n\nfunction validateConfig(config: Config) {\n  if (typeof config.experimental?.enableCodeSplitting !== 'undefined') {\n    const message = `\n------\n⚠️ ⚠️ ⚠️\nERROR: The \"experimental.enableCodeSplitting\" flag has been made stable and is now \"autoCodeSplitting\". Please update your configuration file to use \"autoCodeSplitting\" instead of \"experimental.enableCodeSplitting\".\n------\n`\n    console.error(message)\n    throw new Error(message)\n  }\n\n  // Check that indexToken and routeToken are not identical\n  // Works for strings, RegExp, and JSON regex objects\n  if (areTokensEqual(config.indexToken, config.routeToken)) {\n    throw new Error(\n      `The \"indexToken\" and \"routeToken\" options must be different.`,\n    )\n  }\n\n  if (\n    config.routeFileIgnorePrefix &&\n    config.routeFileIgnorePrefix.trim() === '_'\n  ) {\n    throw new Error(\n      `The \"routeFileIgnorePrefix\" cannot be an underscore (\"_\"). This is a reserved character used to denote a pathless route. Please use a different prefix.`,\n    )\n  }\n\n  return config\n}\n\n/**\n * Compares two token matchers for equality.\n * Handles strings, RegExp instances, and JSON regex objects.\n */\nfunction areTokensEqual(a: TokenMatcher, b: TokenMatcher): boolean {\n  // Both strings\n  if (typeof a === 'string' && typeof b === 'string') {\n    return a === b\n  }\n\n  // Both RegExp instances\n  if (a instanceof RegExp && b instanceof RegExp) {\n    return a.source === b.source && a.flags === b.flags\n  }\n\n  // Both JSON regex objects\n  if (\n    typeof a === 'object' &&\n    'regex' in a &&\n    typeof b === 'object' &&\n    'regex' in b\n  ) {\n    return a.regex === b.regex && (a.flags ?? '') === (b.flags ?? '')\n  }\n\n  // Mixed types - not equal\n  return false\n}\n"],"mappings":"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"}