{"version":3,"sources":["../src/layers.ts"],"sourcesContent":["import { existsSync, readFileSync, realpathSync, statSync } from \"node:fs\";\nimport { mkdir, unlink } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\ntype EsbuildTransform = (typeof import(\"esbuild\"))[\"transform\"];\n\nexport type FarmLayerEntry = string;\n\nexport interface ResolvedFarmLayer {\n  /** The value used in `extends`. */\n  source: string;\n  /** Stable name used by the `#layers/<name>` alias. */\n  name: string;\n  /** Absolute layer package or directory root. */\n  root: string;\n  /** Source directory relative to the layer root. */\n  srcDir: string;\n  /** Resolved layer config file when one exists. */\n  configFile?: string;\n}\n\nexport interface FarmSourceRoot {\n  name: string;\n  root: string;\n  srcDir: string;\n  layer: boolean;\n}\n\nexport interface ResolveFarmLayersOptions {\n  root: string;\n  mode: \"development\" | \"production\";\n}\n\nexport interface FarmLayerResolution<TConfig extends Record<string, any>> {\n  config: TConfig & {\n    extends?: readonly FarmLayerEntry[];\n    layers: ResolvedFarmLayer[];\n  };\n  layers: ResolvedFarmLayer[];\n}\n\nconst FARM_CORE_PACKAGE = \"@farm.js/core\";\nconst FARM_CONFIG_ENTRY = \"@farm.js/core/config\";\nconst FARM_CORE_REFERENCE_RE = /([\"'])@farm.js\\/core\\1/g;\nconst FARM_CONFIG_HELPER_IMPORT_RE =\n  /(?:^|\\n)[\\t ]*import[\\t ]*\\{([^{}]*)\\}[\\t ]*from[\\t ]*([\"'])@farm.js\\/core\\2[\\t ]*;?[\\t ]*(?:\\n|$)/g;\nconst FARM_CONFIG_HELPER_SPECIFIER_RE =\n  /^(?:defineConfig|defineFarmConfig)(?:\\s+as\\s+[$A-Z_a-z][$\\w]*)?$/;\n\nconst CONFIG_FILENAMES = [\n  \"farm.config.ts\",\n  \"farm.config.tsx\",\n  \"farm.config.mts\",\n  \"farm.config.cts\",\n  \"farm.config.js\",\n  \"farm.config.jsx\",\n  \"farm.config.mjs\",\n  \"farm.config.cjs\",\n  \"config.ts\",\n  \"config.tsx\",\n  \"config.mts\",\n  \"config.cts\",\n  \"config.js\",\n  \"config.jsx\",\n  \"config.mjs\",\n  \"config.cjs\",\n];\n\nconst LAYER_LOCAL_CONFIG_KEYS = new Set([\n  \"root\",\n  \"srcDir\",\n  \"outDir\",\n  \"distDir\",\n  \"deploy\",\n  \"output\",\n  \"preset\",\n  \"publicDir\",\n  \"generateBuildId\",\n]);\n\ntype LoadedLayer = ResolvedFarmLayer & {\n  config: Record<string, any>;\n};\n\nexport async function resolveFarmLayers<TConfig extends Record<string, any>>(\n  projectConfig: TConfig,\n  options: ResolveFarmLayersOptions,\n): Promise<FarmLayerResolution<TConfig>> {\n  const projectRoot = path.resolve(options.root);\n  const entries = normalizeLayerEntries(projectConfig.extends, \"project config\");\n\n  if (entries.length === 0) {\n    return {\n      config: {\n        ...projectConfig,\n        layers: [],\n      },\n      layers: [],\n    };\n  }\n\n  const loadedLayers: LoadedLayer[] = [];\n  const visited = new Set<string>();\n  const aliases = new Map<string, string>();\n\n  const visit = async (\n    source: string,\n    ownerRoot: string,\n    stack: Array<{ root: string; source: string }>,\n  ): Promise<void> => {\n    const resolvedSource = resolveLayerSource(source, ownerRoot);\n    const cycleIndex = stack.findIndex((entry) => entry.root === resolvedSource.root);\n    if (cycleIndex !== -1) {\n      const cycle = [...stack.slice(cycleIndex).map((entry) => entry.source), source];\n      throw new Error(`Farm layer cycle detected: ${cycle.join(\" -> \")}`);\n    }\n    if (visited.has(resolvedSource.root)) return;\n\n    const configFile = findFarmConfigFile(resolvedSource.root, resolvedSource.configFile);\n    const config = configFile\n      ? await loadFarmConfigFile(configFile, {\n          cacheRoot: projectRoot,\n          root: resolvedSource.root,\n        })\n      : {};\n    const nestedEntries = normalizeLayerEntries(config.extends, `layer ${JSON.stringify(source)}`);\n    const nextStack = [...stack, { root: resolvedSource.root, source }];\n\n    for (const nestedSource of nestedEntries) {\n      await visit(nestedSource, resolvedSource.root, nextStack);\n    }\n\n    if (visited.has(resolvedSource.root)) return;\n\n    const name = getLayerName(source, resolvedSource.root);\n    const conflictingRoot = aliases.get(name);\n    if (conflictingRoot && conflictingRoot !== resolvedSource.root) {\n      throw new Error(\n        `Farm layer alias \"#layers/${name}\" is ambiguous between ${conflictingRoot} and ${resolvedSource.root}`,\n      );\n    }\n    aliases.set(name, resolvedSource.root);\n\n    visited.add(resolvedSource.root);\n    loadedLayers.push({\n      source,\n      name,\n      root: resolvedSource.root,\n      srcDir: normalizeLayerSrcDir(config.srcDir),\n      configFile,\n      config,\n    });\n  };\n\n  for (const source of entries) {\n    await visit(source, projectRoot, []);\n  }\n\n  let mergedConfig: Record<string, any> = {};\n  for (const layer of loadedLayers) {\n    mergedConfig = mergeFarmLayerConfig(mergedConfig, getLayerDefaults(layer.config));\n  }\n  mergedConfig = mergeFarmLayerConfig(mergedConfig, projectConfig);\n\n  const layers = loadedLayers.map(({ config: _config, ...layer }) => layer);\n  return {\n    config: {\n      ...mergedConfig,\n      root: projectConfig.root,\n      srcDir: projectConfig.srcDir,\n      extends: projectConfig.extends,\n      layers,\n    } as unknown as FarmLayerResolution<TConfig>[\"config\"],\n    layers,\n  };\n}\n\nexport function getFarmSourceRoots(config: {\n  root?: string;\n  srcDir?: string;\n  layers?: readonly ResolvedFarmLayer[];\n}): FarmSourceRoot[] {\n  const roots: FarmSourceRoot[] = (config.layers ?? []).map((layer) => ({\n    name: layer.name,\n    root: layer.root,\n    srcDir: layer.srcDir,\n    layer: true,\n  }));\n\n  roots.push({\n    name: \"project\",\n    root: path.resolve(config.root || process.cwd()),\n    srcDir: config.srcDir || \"src\",\n    layer: false,\n  });\n\n  return roots;\n}\n\nexport function getFarmAppDirectories(config: {\n  root?: string;\n  srcDir?: string;\n  layers?: readonly ResolvedFarmLayer[];\n}): string[] {\n  return getFarmSourceRoots(config).map((source) => path.join(source.root, source.srcDir, \"app\"));\n}\n\nexport function getFarmLayerAliases(\n  layers: readonly ResolvedFarmLayer[] | undefined,\n): Record<string, string> {\n  return Object.fromEntries(\n    (layers ?? []).map((layer) => [`#layers/${layer.name}`, path.join(layer.root, layer.srcDir)]),\n  );\n}\n\n// Matches Windows drive-letter (`E:\\`, `E:/`) and UNC (`\\\\server\\share`) paths,\n// which would otherwise pass the \"bare specifier\" filter below. `path.isAbsolute`\n// only recognizes these on Windows, but esbuild can hand us such paths on any\n// platform (e.g. in cross-platform tests), and no valid package name contains\n// `:` or starts with `\\`.\nconst WINDOWS_ABSOLUTE_PATH_RE = /^(?:[A-Za-z]:[\\\\/]|\\\\\\\\)/;\n\n// External paths are written verbatim into the bundled config's import\n// statements. Node's ESM loader accepts `/abs/path` specifiers on POSIX, but a\n// raw Windows path like `E:\\...` is parsed as a URL with protocol `e:` and\n// rejected, so absolute paths must be emitted as file:// URLs.\nfunction toExternalSpecifier(resolvedPath: string): string {\n  return path.isAbsolute(resolvedPath) ? pathToFileURL(resolvedPath).href : resolvedPath;\n}\n\nexport function createFarmConfigResolutionPlugin(options: {\n  transform: EsbuildTransform;\n}): import(\"esbuild\").Plugin {\n  const configEntryChecks = new Map<string, Promise<boolean>>();\n\n  return {\n    name: \"farm-config-package-resolution\",\n    setup(pluginBuild) {\n      pluginBuild.onResolve({ filter: /^@farm\\.js\\/core$/ }, async (args) => {\n        if (\n          args.pluginData?.farmConfigExternal ||\n          args.kind !== \"import-statement\" ||\n          !args.importer\n        ) {\n          return;\n        }\n\n        let configEntryCheck = configEntryChecks.get(args.importer);\n        if (!configEntryCheck) {\n          configEntryCheck = onlyImportsFarmConfigHelpers(args.importer, options.transform);\n          configEntryChecks.set(args.importer, configEntryCheck);\n        }\n        if (!(await configEntryCheck)) return;\n\n        const resolved = await pluginBuild.resolve(FARM_CONFIG_ENTRY, {\n          importer: args.importer,\n          kind: args.kind,\n          namespace: args.namespace,\n          resolveDir: args.resolveDir,\n          pluginData: { farmConfigExternal: true },\n        });\n        if (resolved.errors.length > 0 || !resolved.path) return;\n\n        return {\n          path: toExternalSpecifier(resolved.path),\n          external: true,\n          warnings: resolved.warnings,\n        };\n      });\n\n      pluginBuild.onResolve({ filter: /^[^./]/ }, async (args) => {\n        // The filter is meant to catch bare package specifiers, but Windows\n        // absolute paths (`E:\\...`) match it too — including the entry point\n        // itself, which esbuild rejects when marked external.\n        if (\n          args.kind === \"entry-point\" ||\n          path.isAbsolute(args.path) ||\n          WINDOWS_ABSOLUTE_PATH_RE.test(args.path)\n        ) {\n          return;\n        }\n        if (args.pluginData?.farmConfigExternal) return;\n\n        const resolved = await pluginBuild.resolve(args.path, {\n          importer: args.importer,\n          kind: args.kind,\n          namespace: args.namespace,\n          resolveDir: args.resolveDir,\n          pluginData: { farmConfigExternal: true },\n        });\n\n        if (resolved.errors.length > 0 || !resolved.path) {\n          return { path: args.path, external: true };\n        }\n\n        return {\n          path: toExternalSpecifier(resolved.path),\n          external: true,\n          warnings: resolved.warnings,\n        };\n      });\n    },\n  };\n}\n\nexport async function loadFarmConfigFile<TConfig = Record<string, any>>(\n  configPath: string,\n  options: { root: string; cacheRoot?: string },\n): Promise<TConfig> {\n  const { build, transform } = await import(\"esbuild\");\n  const cacheRoot = path.resolve(options.cacheRoot || options.root);\n  const configCacheDir = path.join(cacheRoot, \".farm\", \".config-loader\");\n  await mkdir(configCacheDir, { recursive: true });\n\n  const modulePath = path.join(\n    configCacheDir,\n    `farm-config-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n  );\n\n  await build({\n    absWorkingDir: path.resolve(options.root),\n    entryPoints: [path.resolve(configPath)],\n    outfile: modulePath,\n    bundle: true,\n    format: \"esm\",\n    platform: \"node\",\n    target: `node${process.versions.node.split(\".\")[0]}`,\n    plugins: [createFarmConfigResolutionPlugin({ transform })],\n    jsx: \"automatic\",\n    logLevel: \"silent\",\n    sourcemap: \"inline\",\n  });\n\n  const moduleUrl = `${pathToFileURL(modulePath).href}?t=${Date.now()}`;\n  try {\n    const loaded = await import(/* @vite-ignore */ moduleUrl);\n    const config = loaded.default || loaded;\n    if (!config || typeof config !== \"object\" || Array.isArray(config)) {\n      throw new TypeError(`Farm config ${configPath} must export an object`);\n    }\n    return config as TConfig;\n  } finally {\n    await unlink(modulePath).catch(() => undefined);\n  }\n}\n\nasync function onlyImportsFarmConfigHelpers(\n  importer: string,\n  transform: EsbuildTransform,\n): Promise<boolean> {\n  try {\n    const source = readFileSync(importer, \"utf8\");\n    if (!source.includes(FARM_CORE_PACKAGE)) return false;\n\n    const transformed = await transform(source, {\n      format: \"esm\",\n      jsx: \"automatic\",\n      loader: getEsbuildLoader(importer),\n      sourcefile: importer,\n    });\n    const references = [...transformed.code.matchAll(FARM_CORE_REFERENCE_RE)];\n    if (references.length === 0) return false;\n\n    const safeImportRanges: Array<{ start: number; end: number }> = [];\n    for (const match of transformed.code.matchAll(FARM_CONFIG_HELPER_IMPORT_RE)) {\n      const specifiers = match[1]\n        .split(\",\")\n        .map((specifier) => specifier.trim())\n        .filter(Boolean);\n      if (\n        specifiers.length === 0 ||\n        !specifiers.every((specifier) => FARM_CONFIG_HELPER_SPECIFIER_RE.test(specifier))\n      ) {\n        continue;\n      }\n\n      const start = match.index ?? 0;\n      safeImportRanges.push({ start, end: start + match[0].length });\n    }\n\n    return references.every((reference) => {\n      const index = reference.index ?? -1;\n      return safeImportRanges.some((range) => index >= range.start && index < range.end);\n    });\n  } catch {\n    // Unsupported syntax or non-file importers retain the existing package resolution path.\n    return false;\n  }\n}\n\nfunction getEsbuildLoader(file: string): \"js\" | \"jsx\" | \"ts\" | \"tsx\" {\n  switch (path.extname(file)) {\n    case \".ts\":\n    case \".mts\":\n    case \".cts\":\n      return \"ts\";\n    case \".tsx\":\n      return \"tsx\";\n    case \".jsx\":\n      return \"jsx\";\n    default:\n      return \"js\";\n  }\n}\n\nfunction normalizeLayerEntries(value: unknown, owner: string): string[] {\n  if (value === undefined) return [];\n  if (!Array.isArray(value)) {\n    throw new TypeError(`${owner} \"extends\" must be an array of layer paths or package names`);\n  }\n\n  return value.map((entry, index) => {\n    if (typeof entry !== \"string\" || entry.trim() === \"\") {\n      throw new TypeError(`${owner} \"extends\" entry ${index} must be a non-empty string`);\n    }\n    return entry.trim();\n  });\n}\n\nfunction resolveLayerSource(\n  source: string,\n  ownerRoot: string,\n): { root: string; configFile?: string } {\n  if (isPathLayerSource(source)) {\n    const target = source.startsWith(\"file:\")\n      ? path.resolve(ownerRoot, source.slice(\"file:\".length))\n      : path.resolve(ownerRoot, source);\n    if (!existsSync(target)) {\n      throw new Error(`Cannot resolve Farm layer ${JSON.stringify(source)} from ${ownerRoot}`);\n    }\n\n    const stats = statSync(target);\n    const root = stats.isDirectory() ? target : path.dirname(target);\n    return {\n      root: normalizeRealPath(root),\n      configFile: stats.isFile() ? normalizeRealPath(target) : undefined,\n    };\n  }\n\n  const requireFromOwner = createRequire(path.join(ownerRoot, \"package.json\"));\n  let packageJsonPath: string | undefined;\n  try {\n    packageJsonPath = requireFromOwner.resolve(`${source}/package.json`);\n  } catch {\n    // Packages with an exports map often hide package.json. Resolve their entry and walk upward.\n  }\n\n  if (packageJsonPath) {\n    return { root: normalizeRealPath(path.dirname(packageJsonPath)) };\n  }\n\n  try {\n    const entryPath = requireFromOwner.resolve(source);\n    const packageRoot = findNearestPackageRoot(entryPath);\n    if (packageRoot) return { root: normalizeRealPath(packageRoot) };\n  } catch {\n    // Use the common error below so local and package failures have the same shape.\n  }\n\n  throw new Error(`Cannot resolve Farm layer package ${JSON.stringify(source)} from ${ownerRoot}`);\n}\n\nfunction findNearestPackageRoot(entryPath: string): string | null {\n  let current = statSync(entryPath).isDirectory() ? entryPath : path.dirname(entryPath);\n  while (true) {\n    if (existsSync(path.join(current, \"package.json\"))) return current;\n    const parent = path.dirname(current);\n    if (parent === current) return null;\n    current = parent;\n  }\n}\n\nfunction findFarmConfigFile(root: string, explicitPath?: string): string | undefined {\n  if (explicitPath) return explicitPath;\n  for (const fileName of CONFIG_FILENAMES) {\n    const candidate = path.join(root, fileName);\n    if (existsSync(candidate)) return candidate;\n  }\n  return undefined;\n}\n\nfunction getLayerName(source: string, root: string): string {\n  if (!isPathLayerSource(source)) {\n    const packageName = source.split(\"/\").filter(Boolean).pop();\n    if (packageName) return sanitizeLayerName(packageName);\n  }\n\n  try {\n    const packageJson = JSON.parse(readFileSync(path.join(root, \"package.json\"), \"utf8\"));\n    if (typeof packageJson.name === \"string\") {\n      return sanitizeLayerName(packageJson.name.split(\"/\").pop() || packageJson.name);\n    }\n  } catch {\n    // A local layer does not need package metadata.\n  }\n\n  return sanitizeLayerName(path.basename(root));\n}\n\nfunction sanitizeLayerName(value: string): string {\n  const name = value\n    .trim()\n    .replace(/[^a-zA-Z0-9_-]+/g, \"-\")\n    .replace(/^-+|-+$/g, \"\");\n  if (!name) throw new Error(`Cannot derive a name for Farm layer ${JSON.stringify(value)}`);\n  return name;\n}\n\nfunction normalizeLayerSrcDir(value: unknown): string {\n  if (value === undefined) return \"src\";\n  if (typeof value !== \"string\" || value.trim() === \"\" || path.isAbsolute(value)) {\n    throw new TypeError(\"A Farm layer srcDir must be a non-empty relative path\");\n  }\n  const normalized = path.normalize(value.trim());\n  if (normalized === \"..\" || normalized.startsWith(`..${path.sep}`)) {\n    throw new TypeError(\"A Farm layer srcDir cannot leave the layer root\");\n  }\n  return normalized;\n}\n\nfunction getLayerDefaults(config: Record<string, any>): Record<string, any> {\n  return Object.fromEntries(\n    Object.entries(config).filter(\n      ([key, value]) =>\n        key !== \"extends\" && value !== undefined && !LAYER_LOCAL_CONFIG_KEYS.has(key),\n    ),\n  );\n}\n\nfunction mergeFarmLayerConfig(\n  base: Record<string, any>,\n  override: Record<string, any>,\n): Record<string, any> {\n  const output: Record<string, any> = { ...base };\n\n  for (const [key, value] of Object.entries(override)) {\n    if (value === undefined || key === \"layers\") continue;\n\n    if (key === \"plugins\") {\n      output[key] = [...toArray(output[key]), ...toArray(value)];\n      continue;\n    }\n\n    if (key === \"middleware\" && output[key] !== undefined) {\n      output[key] = [...toArray(output[key]), ...toArray(value)];\n      continue;\n    }\n\n    if ((key === \"redirects\" || key === \"rewrites\" || key === \"headers\") && output[key]) {\n      output[key] = mergeConfigListResolvers(output[key], value);\n      continue;\n    }\n\n    if (isPlainObject(output[key]) && isPlainObject(value)) {\n      output[key] = mergePlainObjects(output[key], value);\n      continue;\n    }\n\n    output[key] = value;\n  }\n\n  return output;\n}\n\nfunction mergePlainObjects(base: Record<string, any>, override: Record<string, any>) {\n  const output: Record<string, any> = { ...base };\n  for (const [key, value] of Object.entries(override)) {\n    if (value === undefined) continue;\n    output[key] =\n      isPlainObject(output[key]) && isPlainObject(value)\n        ? mergePlainObjects(output[key], value)\n        : value;\n  }\n  return output;\n}\n\nfunction mergeConfigListResolvers(base: unknown, override: unknown) {\n  return async () => [...(await resolveConfigList(base)), ...(await resolveConfigList(override))];\n}\n\nasync function resolveConfigList(value: unknown): Promise<any[]> {\n  const resolved = typeof value === \"function\" ? await value() : value;\n  return toArray(resolved);\n}\n\nfunction toArray(value: unknown): any[] {\n  if (value === undefined || value === null) return [];\n  return Array.isArray(value) ? value : [value];\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, any> {\n  if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n  const prototype = Object.getPrototypeOf(value);\n  return prototype === Object.prototype || prototype === null;\n}\n\nfunction isPathLayerSource(source: string): boolean {\n  return (\n    source.startsWith(\".\") ||\n    source.startsWith(\"/\") ||\n    source.startsWith(\"file:\") ||\n    /^[a-zA-Z]:[\\\\/]/.test(source)\n  );\n}\n\nfunction normalizeRealPath(value: string): string {\n  return path.resolve(realpathSync(value));\n}\n"],"mappings":"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","names":[]}