{"version":3,"file":"serialize.mjs","names":[],"sources":["../../../src/services/resolution/serialize.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { type BosConfig, BosConfigSchema } from \"../../types\";\nimport { readLocalAuthoredConfigInput } from \"./load\";\nimport { type BosEnv, isPlainObject, type ResolvedConfigMeta, rebuildOrderedConfig } from \"./merge\";\n\nconst RESOLVED_CONFIG_FILENAME = \"bos.resolved-config.json\";\n\nexport function getResolvedConfigPath(configDir: string): string {\n  return join(configDir, \".bos\", RESOLVED_CONFIG_FILENAME);\n}\n\nexport function loadGeneratedResolvedConfig(configDir: string): BosConfig | null {\n  const resolvedPath = getResolvedConfigPath(configDir);\n  if (!existsSync(resolvedPath)) return null;\n  try {\n    const raw = JSON.parse(readFileSync(resolvedPath, \"utf-8\"));\n    if (!isPlainObject(raw)) return null;\n    const { _resolved, ...configData } = raw;\n    return BosConfigSchema.parse(configData);\n  } catch {\n    return null;\n  }\n}\n\nexport function writeResolvedConfig(\n  configDir: string,\n  config: BosConfig,\n  env: BosEnv,\n  extendsChain?: string[],\n  source?: string,\n): void {\n  const resolvedPath = getResolvedConfigPath(configDir);\n  const resolvedDir = dirname(resolvedPath);\n  if (!existsSync(resolvedDir)) {\n    mkdirSync(resolvedDir, { recursive: true });\n  }\n\n  const ordered = rebuildOrderedConfig(config);\n  const meta: ResolvedConfigMeta = {\n    env,\n    resolvedAt: new Date().toISOString(),\n    extendsChain: extendsChain ?? [],\n    ...(source ? { source } : {}),\n  };\n  const output = {\n    _resolved: meta,\n    ...ordered,\n  };\n\n  const content = `${JSON.stringify(output, null, 2)}\\n`;\n  try {\n    if (readFileSync(resolvedPath, \"utf-8\") === content) return;\n  } catch {\n    // file doesn't exist yet\n  }\n  writeFileSync(resolvedPath, content);\n}\n\nexport function resolveBosConfigPath(configDir: string): string {\n  const resolvedPath = getResolvedConfigPath(configDir);\n  if (existsSync(resolvedPath)) return resolvedPath;\n  return join(configDir, \"bos.config.json\");\n}\n\nexport async function readBosConfigForBuild(configDir: string): Promise<Record<string, unknown>> {\n  const resolvedPath = getResolvedConfigPath(configDir);\n  if (existsSync(resolvedPath)) {\n    try {\n      const raw = JSON.parse(readFileSync(resolvedPath, \"utf-8\"));\n      if (isPlainObject(raw)) {\n        const { _resolved, ...configData } = raw;\n        return configData as Record<string, unknown>;\n      }\n    } catch (e) {\n      console.warn(\n        `[Config] Failed to parse _resolved.json, falling back to the authored config: ${String(e)}`,\n      );\n    }\n  }\n  // Form-aware fallback: the authored `bos.app.ts` descriptor is canonical —\n  // a TS-form child has no committed bos.config.json to parse.\n  const authored = await readLocalAuthoredConfigInput(configDir);\n  if (authored) return authored as unknown as Record<string, unknown>;\n  const bosConfigPath = join(configDir, \"bos.config.json\");\n  return JSON.parse(readFileSync(bosConfigPath, \"utf-8\")) as Record<string, unknown>;\n}\n"],"mappings":";;;;;;;AAMA,MAAM,2BAA2B;AAEjC,SAAgB,sBAAsB,WAA2B;CAC/D,OAAO,KAAK,WAAW,QAAQ,wBAAwB;AACzD;AAEA,SAAgB,4BAA4B,WAAqC;CAC/E,MAAM,eAAe,sBAAsB,SAAS;CACpD,IAAI,CAAC,WAAW,YAAY,GAAG,OAAO;CACtC,IAAI;EACF,MAAM,MAAM,KAAK,MAAM,aAAa,cAAc,OAAO,CAAC;EAC1D,IAAI,CAAC,cAAc,GAAG,GAAG,OAAO;EAChC,MAAM,EAAE,WAAW,GAAG,eAAe;EACrC,OAAO,gBAAgB,MAAM,UAAU;CACzC,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAgB,oBACd,WACA,QACA,KACA,cACA,QACM;CACN,MAAM,eAAe,sBAAsB,SAAS;CACpD,MAAM,cAAc,QAAQ,YAAY;CACxC,IAAI,CAAC,WAAW,WAAW,GACzB,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;CAG5C,MAAM,UAAU,qBAAqB,MAAM;CAO3C,MAAM,SAAS;EACb,WAAW;GANX;GACA,6BAAY,IAAI,KAAK,EAAC,CAAC,YAAY;GACnC,cAAc,gBAAgB,CAAC;GAC/B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAGb;EACd,GAAG;CACL;CAEA,MAAM,UAAU,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;CACnD,IAAI;EACF,IAAI,aAAa,cAAc,OAAO,MAAM,SAAS;CACvD,QAAQ,CAER;CACA,cAAc,cAAc,OAAO;AACrC;AAEA,SAAgB,qBAAqB,WAA2B;CAC9D,MAAM,eAAe,sBAAsB,SAAS;CACpD,IAAI,WAAW,YAAY,GAAG,OAAO;CACrC,OAAO,KAAK,WAAW,iBAAiB;AAC1C;AAEA,eAAsB,sBAAsB,WAAqD;CAC/F,MAAM,eAAe,sBAAsB,SAAS;CACpD,IAAI,WAAW,YAAY,GACzB,IAAI;EACF,MAAM,MAAM,KAAK,MAAM,aAAa,cAAc,OAAO,CAAC;EAC1D,IAAI,cAAc,GAAG,GAAG;GACtB,MAAM,EAAE,WAAW,GAAG,eAAe;GACrC,OAAO;EACT;CACF,SAAS,GAAG;EACV,QAAQ,KACN,iFAAiF,OAAO,CAAC,GAC3F;CACF;CAIF,MAAM,WAAW,MAAM,6BAA6B,SAAS;CAC7D,IAAI,UAAU,OAAO;CACrB,MAAM,gBAAgB,KAAK,WAAW,iBAAiB;CACvD,OAAO,KAAK,MAAM,aAAa,eAAe,OAAO,CAAC;AACxD"}