{
  "version": 3,
  "sources": ["../../src/runtime/deployment.ts"],
  "sourcesContent": ["import { extname, isAbsolute, join, resolve } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport {\n\tdirectMatch,\n\texactAlias,\n\tformatVersion,\n\tisRecord,\n\tjoinHome,\n\tMAX_METADATA_FILE_BYTES,\n\toptionBoolean,\n\toptionMap,\n\toptionNumber,\n\toptionString,\n\toptionStrings,\n\trunBounded,\n\tsafeMetadata,\n} from \"./helpers.js\";\nimport type { CollectorContext, MutableModuleSnapshot } from \"./types.js\";\n\nexport async function collectDeployment(context: CollectorContext): Promise<MutableModuleSnapshot> {\n\tconst result: MutableModuleSnapshot = {};\n\tif (context.needs(\"docker_context\")) {\n\t\tconst docker = await collectDocker(context);\n\t\tif (docker) result.docker_context = docker;\n\t}\n\tif (context.needs(\"kubernetes\")) {\n\t\tconst kubernetes = await collectKubernetes(context);\n\t\tif (kubernetes) result.kubernetes = kubernetes;\n\t}\n\tif (context.needs(\"terraform\")) {\n\t\tconst terraform = await collectTerraform(context);\n\t\tif (terraform) result.terraform = terraform;\n\t}\n\treturn result;\n}\n\nasync function collectDocker(\n\tcontext: CollectorContext,\n): Promise<Record<string, string> | undefined> {\n\tconst entries = await context.entries();\n\tif (optionBoolean(context, \"docker_context\", \"only_with_files\")) {\n\t\tconst configuredFiles = optionStrings(context, \"docker_context\", \"detect_files\");\n\t\tif (\n\t\t\t!directMatch(\n\t\t\t\tentries,\n\t\t\t\tconfiguredFiles.length > 0\n\t\t\t\t\t? configuredFiles\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t\"Dockerfile\",\n\t\t\t\t\t\t\t\"docker-compose.yml\",\n\t\t\t\t\t\t\t\"docker-compose.yaml\",\n\t\t\t\t\t\t\t\"compose.yml\",\n\t\t\t\t\t\t\t\"compose.yaml\",\n\t\t\t\t\t\t],\n\t\t\t\toptionStrings(context, \"docker_context\", \"detect_extensions\"),\n\t\t\t\toptionStrings(context, \"docker_context\", \"detect_folders\"),\n\t\t\t)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\tlet active = safeMetadata(context.input.environment.DOCKER_CONTEXT);\n\tif (!active) {\n\t\tconst configDirectory =\n\t\t\tsafeMetadata(context.input.environment.DOCKER_CONFIG, 1_024) ??\n\t\t\tjoinHome(context.input, \".docker\");\n\t\tconst source = await context.fs.readFile(\n\t\t\tjoin(configDirectory, \"config.json\"),\n\t\t\tMAX_METADATA_FILE_BYTES,\n\t\t);\n\t\tif (source) {\n\t\t\ttry {\n\t\t\t\tconst document = JSON.parse(source) as unknown;\n\t\t\t\tactive = isRecord(document) ? safeMetadata(document.currentContext) : undefined;\n\t\t\t} catch {\n\t\t\t\t// Malformed metadata degrades to an empty module.\n\t\t\t}\n\t\t}\n\t}\n\treturn active && active !== \"default\" ? { context: active } : undefined;\n}\n\nasync function collectKubernetes(\n\tcontext: CollectorContext,\n): Promise<Record<string, string> | undefined> {\n\tconst selected = safeMetadata(context.input.environment.KUBECONFIG, 4_096);\n\tconst candidates = selected\n\t\t? selected.split(context.input.platform === \"win32\" ? \";\" : \":\").filter(Boolean)\n\t\t: [joinHome(context.input, \".kube\", \"config\")];\n\tconst limit = optionNumber(context, \"kubernetes\", \"max_config_files\") ?? 8;\n\tconst contexts = new Map<string, Record<string, unknown>>();\n\tconst clusters = new Set<string>();\n\tconst users = new Set<string>();\n\tlet currentContext: string | undefined;\n\tfor (const path of candidates.slice(0, limit)) {\n\t\tconst source = await context.fs.readFile(path, MAX_METADATA_FILE_BYTES);\n\t\tif (!source) continue;\n\t\ttry {\n\t\t\tconst document = parseYaml(source) as unknown;\n\t\t\tif (!isRecord(document)) continue;\n\t\t\tcurrentContext ??= safeMetadata(document[\"current-context\"]);\n\t\t\tfor (const item of arrayRecords(document.contexts)) {\n\t\t\t\tconst name = safeMetadata(item.name);\n\t\t\t\tif (name && !contexts.has(name) && isRecord(item.context)) contexts.set(name, item.context);\n\t\t\t}\n\t\t\tfor (const item of arrayRecords(document.clusters)) {\n\t\t\t\tconst name = safeMetadata(item.name);\n\t\t\t\tif (name) clusters.add(name);\n\t\t\t}\n\t\t\tfor (const item of arrayRecords(document.users)) {\n\t\t\t\tconst name = safeMetadata(item.name);\n\t\t\t\tif (name) users.add(name);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore malformed files independently.\n\t\t}\n\t}\n\tif (!currentContext) return undefined;\n\tconst selectedContext = contexts.get(currentContext);\n\tconst cluster = safeMetadata(selectedContext?.cluster);\n\tconst user = safeMetadata(selectedContext?.user);\n\tconst namespace = safeMetadata(selectedContext?.namespace) ?? \"default\";\n\tconst values: Record<string, string> = {\n\t\tcontext:\n\t\t\texactAlias(currentContext, optionMap(context, \"kubernetes\", \"context_aliases\")) ??\n\t\t\tcurrentContext,\n\t\tnamespace:\n\t\t\texactAlias(namespace, optionMap(context, \"kubernetes\", \"namespace_aliases\")) ?? namespace,\n\t};\n\tif (cluster && clusters.has(cluster)) {\n\t\tvalues.cluster =\n\t\t\texactAlias(cluster, optionMap(context, \"kubernetes\", \"cluster_aliases\")) ?? cluster;\n\t}\n\tif (user && users.has(user)) {\n\t\tvalues.user = exactAlias(user, optionMap(context, \"kubernetes\", \"user_aliases\")) ?? user;\n\t}\n\treturn values;\n}\n\nasync function collectTerraform(\n\tcontext: CollectorContext,\n): Promise<Record<string, string> | undefined> {\n\tconst entries = await context.entries();\n\tconst configuredFiles = optionStrings(context, \"terraform\", \"detect_files\");\n\tconst configuredExtensions = optionStrings(context, \"terraform\", \"detect_extensions\");\n\tconst configuredFolders = optionStrings(context, \"terraform\", \"detect_folders\");\n\tconst detected =\n\t\tconfiguredFiles.length + configuredExtensions.length + configuredFolders.length > 0\n\t\t\t? directMatch(entries, configuredFiles, configuredExtensions, configuredFolders)\n\t\t\t: entries.some(\n\t\t\t\t\t(entry) =>\n\t\t\t\t\t\t(entry.isFile && [\".tf\", \".tfplan\", \".tfstate\"].includes(extname(entry.name))) ||\n\t\t\t\t\t\t(entry.isDirectory && entry.name === \".terraform\"),\n\t\t\t\t);\n\tif (!detected) return undefined;\n\tconst values: Record<string, string> = {};\n\tconst workspace = await terraformWorkspace(context);\n\tif (workspace) values.workspace = workspace;\n\tif (context.needs(\"terraform\", \"version\")) {\n\t\tfor (const command of [\"terraform\", \"tofu\"]) {\n\t\t\tconst output = await runBounded(context, command, [\"version\"]);\n\t\t\tconst parsed = output ? parseTerraformVersion(output, command) : undefined;\n\t\t\tif (parsed) {\n\t\t\t\tvalues.version = formatVersion(\n\t\t\t\t\tparsed,\n\t\t\t\t\toptionString(context, \"terraform\", \"version_format\"),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn values;\n}\n\nasync function terraformWorkspace(context: CollectorContext): Promise<string | undefined> {\n\tconst direct = safeMetadata(context.input.environment.TF_WORKSPACE);\n\tif (direct) return direct;\n\tconst dataDirectory = safeMetadata(context.input.environment.TF_DATA_DIR, 1_024);\n\tconst candidate = dataDirectory\n\t\t? join(\n\t\t\t\tisAbsolute(dataDirectory) ? dataDirectory : resolve(context.input.cwd, dataDirectory),\n\t\t\t\t\"environment\",\n\t\t\t)\n\t\t: join(context.input.cwd, \".terraform\", \"environment\");\n\treturn safeMetadata(await context.fs.readFile(candidate, 1_024));\n}\n\nexport function parseTerraformVersion(\n\toutput: string,\n\tcommand: \"terraform\" | \"tofu\" | string,\n): string | undefined {\n\tconst escaped = command === \"tofu\" ? \"OpenTofu\" : \"Terraform\";\n\tconst match = new RegExp(`^${escaped} v?(\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:[-+][0-9A-Za-z.-]+)?)$`, \"u\").exec(\n\t\toutput.trim().split(/\\r?\\n/u)[0] ?? \"\",\n\t);\n\treturn match?.[1] ? `v${match[1]}` : undefined;\n}\n\nfunction arrayRecords(value: unknown): Record<string, unknown>[] {\n\treturn Array.isArray(value) ? value.filter(isRecord) : [];\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;AAAA,SAAS,SAAS,YAAY,MAAM,eAAe;AACnD,SAAS,SAAS,iBAAiB;AAkBnC,eAAsB,kBAAkB,SAA2D;AAClG,QAAM,SAAgC,CAAC;AACvC,MAAI,QAAQ,MAAM,gBAAgB,GAAG;AACpC,UAAM,SAAS,MAAM,cAAc,OAAO;AAC1C,QAAI,OAAQ,QAAO,iBAAiB;AAAA,EACrC;AACA,MAAI,QAAQ,MAAM,YAAY,GAAG;AAChC,UAAM,aAAa,MAAM,kBAAkB,OAAO;AAClD,QAAI,WAAY,QAAO,aAAa;AAAA,EACrC;AACA,MAAI,QAAQ,MAAM,WAAW,GAAG;AAC/B,UAAM,YAAY,MAAM,iBAAiB,OAAO;AAChD,QAAI,UAAW,QAAO,YAAY;AAAA,EACnC;AACA,SAAO;AACR;AAEA,eAAe,cACd,SAC8C;AAC9C,QAAM,UAAU,MAAM,QAAQ,QAAQ;AACtC,MAAI,cAAc,SAAS,kBAAkB,iBAAiB,GAAG;AAChE,UAAM,kBAAkB,cAAc,SAAS,kBAAkB,cAAc;AAC/E,QACC,CAAC;AAAA,MACA;AAAA,MACA,gBAAgB,SAAS,IACtB,kBACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MACF,cAAc,SAAS,kBAAkB,mBAAmB;AAAA,MAC5D,cAAc,SAAS,kBAAkB,gBAAgB;AAAA,IAC1D,GACC;AACD,aAAO;AAAA,IACR;AAAA,EACD;AACA,MAAI,SAAS,aAAa,QAAQ,MAAM,YAAY,cAAc;AAClE,MAAI,CAAC,QAAQ;AACZ,UAAM,kBACL,aAAa,QAAQ,MAAM,YAAY,eAAe,IAAK,KAC3D,SAAS,QAAQ,OAAO,SAAS;AAClC,UAAM,SAAS,MAAM,QAAQ,GAAG;AAAA,MAC/B,KAAK,iBAAiB,aAAa;AAAA,MACnC;AAAA,IACD;AACA,QAAI,QAAQ;AACX,UAAI;AACH,cAAM,WAAW,KAAK,MAAM,MAAM;AAClC,iBAAS,SAAS,QAAQ,IAAI,aAAa,SAAS,cAAc,IAAI;AAAA,MACvE,QAAQ;AAAA,MAER;AAAA,IACD;AAAA,EACD;AACA,SAAO,UAAU,WAAW,YAAY,EAAE,SAAS,OAAO,IAAI;AAC/D;AAEA,eAAe,kBACd,SAC8C;AAC9C,QAAM,WAAW,aAAa,QAAQ,MAAM,YAAY,YAAY,IAAK;AACzE,QAAM,aAAa,WAChB,SAAS,MAAM,QAAQ,MAAM,aAAa,UAAU,MAAM,GAAG,EAAE,OAAO,OAAO,IAC7E,CAAC,SAAS,QAAQ,OAAO,SAAS,QAAQ,CAAC;AAC9C,QAAM,QAAQ,aAAa,SAAS,cAAc,kBAAkB,KAAK;AACzE,QAAM,WAAW,oBAAI,IAAqC;AAC1D,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,QAAQ,oBAAI,IAAY;AAC9B,MAAI;AACJ,aAAW,QAAQ,WAAW,MAAM,GAAG,KAAK,GAAG;AAC9C,UAAM,SAAS,MAAM,QAAQ,GAAG,SAAS,MAAM,uBAAuB;AACtE,QAAI,CAAC,OAAQ;AACb,QAAI;AACH,YAAM,WAAW,UAAU,MAAM;AACjC,UAAI,CAAC,SAAS,QAAQ,EAAG;AACzB,yBAAmB,aAAa,SAAS,iBAAiB,CAAC;AAC3D,iBAAW,QAAQ,aAAa,SAAS,QAAQ,GAAG;AACnD,cAAM,OAAO,aAAa,KAAK,IAAI;AACnC,YAAI,QAAQ,CAAC,SAAS,IAAI,IAAI,KAAK,SAAS,KAAK,OAAO,EAAG,UAAS,IAAI,MAAM,KAAK,OAAO;AAAA,MAC3F;AACA,iBAAW,QAAQ,aAAa,SAAS,QAAQ,GAAG;AACnD,cAAM,OAAO,aAAa,KAAK,IAAI;AACnC,YAAI,KAAM,UAAS,IAAI,IAAI;AAAA,MAC5B;AACA,iBAAW,QAAQ,aAAa,SAAS,KAAK,GAAG;AAChD,cAAM,OAAO,aAAa,KAAK,IAAI;AACnC,YAAI,KAAM,OAAM,IAAI,IAAI;AAAA,MACzB;AAAA,IACD,QAAQ;AAAA,IAER;AAAA,EACD;AACA,MAAI,CAAC,eAAgB,QAAO;AAC5B,QAAM,kBAAkB,SAAS,IAAI,cAAc;AACnD,QAAM,UAAU,aAAa,iBAAiB,OAAO;AACrD,QAAM,OAAO,aAAa,iBAAiB,IAAI;AAC/C,QAAM,YAAY,aAAa,iBAAiB,SAAS,KAAK;AAC9D,QAAM,SAAiC;AAAA,IACtC,SACC,WAAW,gBAAgB,UAAU,SAAS,cAAc,iBAAiB,CAAC,KAC9E;AAAA,IACD,WACC,WAAW,WAAW,UAAU,SAAS,cAAc,mBAAmB,CAAC,KAAK;AAAA,EAClF;AACA,MAAI,WAAW,SAAS,IAAI,OAAO,GAAG;AACrC,WAAO,UACN,WAAW,SAAS,UAAU,SAAS,cAAc,iBAAiB,CAAC,KAAK;AAAA,EAC9E;AACA,MAAI,QAAQ,MAAM,IAAI,IAAI,GAAG;AAC5B,WAAO,OAAO,WAAW,MAAM,UAAU,SAAS,cAAc,cAAc,CAAC,KAAK;AAAA,EACrF;AACA,SAAO;AACR;AAEA,eAAe,iBACd,SAC8C;AAC9C,QAAM,UAAU,MAAM,QAAQ,QAAQ;AACtC,QAAM,kBAAkB,cAAc,SAAS,aAAa,cAAc;AAC1E,QAAM,uBAAuB,cAAc,SAAS,aAAa,mBAAmB;AACpF,QAAM,oBAAoB,cAAc,SAAS,aAAa,gBAAgB;AAC9E,QAAM,WACL,gBAAgB,SAAS,qBAAqB,SAAS,kBAAkB,SAAS,IAC/E,YAAY,SAAS,iBAAiB,sBAAsB,iBAAiB,IAC7E,QAAQ;AAAA,IACR,CAAC,UACC,MAAM,UAAU,CAAC,OAAO,WAAW,UAAU,EAAE,SAAS,QAAQ,MAAM,IAAI,CAAC,KAC3E,MAAM,eAAe,MAAM,SAAS;AAAA,EACvC;AACH,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,SAAiC,CAAC;AACxC,QAAM,YAAY,MAAM,mBAAmB,OAAO;AAClD,MAAI,UAAW,QAAO,YAAY;AAClC,MAAI,QAAQ,MAAM,aAAa,SAAS,GAAG;AAC1C,eAAW,WAAW,CAAC,aAAa,MAAM,GAAG;AAC5C,YAAM,SAAS,MAAM,WAAW,SAAS,SAAS,CAAC,SAAS,CAAC;AAC7D,YAAM,SAAS,SAAS,sBAAsB,QAAQ,OAAO,IAAI;AACjE,UAAI,QAAQ;AACX,eAAO,UAAU;AAAA,UAChB;AAAA,UACA,aAAa,SAAS,aAAa,gBAAgB;AAAA,QACpD;AACA;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACA,SAAO;AACR;AAEA,eAAe,mBAAmB,SAAwD;AACzF,QAAM,SAAS,aAAa,QAAQ,MAAM,YAAY,YAAY;AAClE,MAAI,OAAQ,QAAO;AACnB,QAAM,gBAAgB,aAAa,QAAQ,MAAM,YAAY,aAAa,IAAK;AAC/E,QAAM,YAAY,gBACf;AAAA,IACA,WAAW,aAAa,IAAI,gBAAgB,QAAQ,QAAQ,MAAM,KAAK,aAAa;AAAA,IACpF;AAAA,EACD,IACC,KAAK,QAAQ,MAAM,KAAK,cAAc,aAAa;AACtD,SAAO,aAAa,MAAM,QAAQ,GAAG,SAAS,WAAW,IAAK,CAAC;AAChE;AAEO,SAAS,sBACf,QACA,SACqB;AACrB,QAAM,UAAU,YAAY,SAAS,aAAa;AAClD,QAAM,QAAQ,IAAI,OAAO,IAAI,OAAO,mDAAmD,GAAG,EAAE;AAAA,IAC3F,OAAO,KAAK,EAAE,MAAM,QAAQ,EAAE,CAAC,KAAK;AAAA,EACrC;AACA,SAAO,QAAQ,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,KAAK;AACtC;AAEA,SAAS,aAAa,OAA2C;AAChE,SAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,QAAQ,IAAI,CAAC;AACzD;",
  "names": []
}
