37 lines
1.2 KiB
TypeScript
37 lines
1.2 KiB
TypeScript
/**
|
|
* Parse compose YAML to extract environment variable interpolation mappings.
|
|
* Returns pairs of [containerEnvKey, interpolationVariable].
|
|
*
|
|
* Handles patterns:
|
|
* - VAR=${ref}
|
|
* - VAR=${ref:-default}
|
|
* - VAR=${ref:+alt}
|
|
* - VAR=${ref?error}
|
|
*
|
|
* Only extracts from `environment:` sections (list format: `- KEY=value`).
|
|
*/
|
|
export function parseEnvInterpolation(composeContent: string): Array<[string, string]> {
|
|
const results: Array<[string, string]> = [];
|
|
|
|
// Step 1: Find lines matching `- ENV_KEY=...${...}...`
|
|
const linePattern = /^\s*-\s*([A-Za-z_][A-Za-z0-9_]*)=(.*)/gm;
|
|
let lineMatch;
|
|
while ((lineMatch = linePattern.exec(composeContent)) !== null) {
|
|
const containerKey = lineMatch[1];
|
|
const valueStr = lineMatch[2];
|
|
|
|
// Step 2: Extract all ${VAR} references from the value
|
|
const varPattern = /\$\{([A-Za-z_][A-Za-z0-9_]*)(?:[:\-\+\?][^}]*)?\}/g;
|
|
let varMatch;
|
|
while ((varMatch = varPattern.exec(valueStr)) !== null) {
|
|
const varName = varMatch[1];
|
|
// Only add if names differ — same-name case handled by direct key matching
|
|
if (containerKey !== varName) {
|
|
results.push([containerKey, varName]);
|
|
}
|
|
}
|
|
}
|
|
|
|
return results;
|
|
}
|