{"version":3,"file":"setup.mjs","names":[],"sources":["../../src/vitest/setup.ts"],"sourcesContent":["/**\n * Vitest setup file that seeds the SecretManager mock from `tailor.config.ts`.\n *\n * This file is auto-injected by tailorRuntime() but only activates when\n * the tailor-runtime environment is active (detected via __tailorRuntimeActive,\n * a flag set by injectMocks() during environment setup).\n */\nimport { pathToFileURL } from \"node:url\";\nimport { beforeAll } from \"vitest\";\nimport { RUNTIME_FLAG_KEY, mockSecretmanager } from \"./mock\";\n\nfunction isTailorRuntime(): boolean {\n  return RUNTIME_FLAG_KEY in globalThis;\n}\n\n/**\n * Extract a vault store from a secrets-shaped value.\n *\n * `defineSecretManager()` returns `{ vaults, options, get, getAll }` (get/getAll\n * are non-enumerable). When that shape is present, the actual vaults live\n * under `.vaults`. Otherwise fall back to treating the object itself as the\n * vault map (for plain object configs).\n * @param secrets - Value from `appConfig.secrets` or `config.secrets`\n * @returns Vault store, or null if the value is unusable\n */\nexport function extractVaultStore(secrets: unknown): Record<string, Record<string, string>> | null {\n  if (!secrets || typeof secrets !== \"object\") return null;\n\n  const source =\n    \"vaults\" in secrets &&\n    typeof (secrets as { vaults?: unknown }).vaults === \"object\" &&\n    (secrets as { vaults?: unknown }).vaults !== null\n      ? (secrets as { vaults: Record<string, unknown> }).vaults\n      : (secrets as Record<string, unknown>);\n\n  const store: Record<string, Record<string, string>> = {};\n  for (const [vaultName, vaultData] of Object.entries(source)) {\n    if (typeof vaultData === \"object\" && vaultData !== null) {\n      store[vaultName] = { ...(vaultData as Record<string, string>) };\n    }\n  }\n  return Object.keys(store).length > 0 ? store : null;\n}\n\n/**\n * Load and parse secrets from a tailor.config.ts file.\n *\n * Returns a vault store on success, or `null` on any failure (missing config,\n * import failure, missing/invalid secrets shape). Errors are swallowed so a\n * misconfigured project still boots — the user can set secrets manually via\n * `mockSecretmanager().setSecrets()`.\n * @param configPath - Absolute path to tailor.config.ts\n * @returns Vault store keyed by vault name, or null if unavailable\n */\nexport async function loadSecretsFromConfig(\n  configPath: string,\n): Promise<Record<string, Record<string, string>> | null> {\n  try {\n    // Convert to file URL so absolute Windows paths (e.g. \"C:\\...\") parse as\n    // valid ESM specifiers.\n    const config = await import(pathToFileURL(configPath).href);\n    const appConfig = config.default;\n    const secrets = appConfig?.secrets ?? config.secrets;\n    return extractVaultStore(secrets);\n  } catch {\n    return null;\n  }\n}\n\n// Load secrets from tailor.config.ts if config path is provided via env var\nbeforeAll(async () => {\n  if (!isTailorRuntime()) return;\n  const configPath = process.env.__TAILOR_RUNTIME_CONFIG;\n  if (!configPath) return;\n\n  const store = await loadSecretsFromConfig(configPath);\n  if (store) {\n    // Acquire without `using`: this is a one-time global seed that must persist\n    // across tests, so we deliberately do not dispose (which would reset it).\n    mockSecretmanager().setSecrets(store);\n  }\n});\n"],"mappings":"qKAWA,SAAS,iBAA2B,CAClC,OAAO,KAAoB,UAC7B,CAYA,SAAgB,kBAAkB,EAAiE,CACjG,GAAI,CAAC,GAAW,OAAO,GAAY,SAAU,OAAO,KAEpD,IAAM,EACJ,WAAY,GACZ,OAAQ,EAAiC,QAAW,UACnD,EAAiC,SAAW,KACxC,EAAgD,OAChD,EAED,EAAgD,CAAC,EACvD,IAAK,GAAM,CAAC,EAAW,KAAc,OAAO,QAAQ,CAAM,EACpD,OAAO,GAAc,UAAY,IACnC,EAAM,GAAa,CAAE,GAAI,CAAqC,GAGlE,OAAO,OAAO,KAAK,CAAK,CAAC,CAAC,OAAS,EAAI,EAAQ,IACjD,CAYA,eAAsB,sBACpB,EACwD,CACxD,GAAI,CAGF,IAAM,EAAS,MAAM,OAAO,EAAc,CAAU,CAAC,CAAC,MAGtD,OAAO,kBAFW,EAAO,SACE,SAAW,EAAO,OACb,CAClC,MAAQ,CACN,OAAO,IACT,CACF,CAGA,EAAU,SAAY,CACpB,GAAI,CAAC,gBAAgB,EAAG,OACxB,IAAM,EAAa,QAAQ,IAAI,wBAC/B,GAAI,CAAC,EAAY,OAEjB,IAAM,EAAQ,MAAM,sBAAsB,CAAU,EAChD,GAGF,EAAkB,CAAC,CAAC,WAAW,CAAK,CAExC,CAAC"}