blob: abdb0b03bfbaea1e628ff888f73c218a0bb6a1b4 [file] [log] [blame]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function resolveRefString(str, values) {
var _a = parse(str), strings = _a.strings, rawRefs = _a.rawRefs;
var refValues = rawRefs.map(function (ref) { return resolveRef(ref, values); });
var res = '';
for (var i = 0; i < refValues.length; i++) {
res += strings[i];
res += refValues[i];
}
res += strings.pop();
return res;
}
exports.resolveRefString = resolveRefString;
function resolveEnvsInValues(config, env) {
for (var key in config) {
var value = config[key];
if (typeof value === 'string') {
config[key] = resolveRefString(value, { env: env });
}
else if (typeof value === 'object') {
config[key] = resolveEnvsInValues(value, env);
}
}
return config;
}
exports.resolveEnvsInValues = resolveEnvsInValues;
function getUsedEnvs(config) {
var result = {};
var traverse = function (val) {
if (typeof val === 'string') {
var rawRefs = parse(val).rawRefs;
for (var _i = 0, rawRefs_1 = rawRefs; _i < rawRefs_1.length; _i++) {
var ref = rawRefs_1[_i];
result[parseRef(ref).ref] = resolveRef(ref, {}, false);
}
}
else if (typeof val === 'object') {
for (var key in val) {
traverse(val[key]);
}
}
};
traverse(config);
return result;
}
exports.getUsedEnvs = getUsedEnvs;
function parseRef(rawRef) {
var _a = rawRef.split(/\s*:\s*/), type = _a[0], ref = _a[1];
return { type: type, ref: ref };
}
function resolveRef(rawRef, values, throwIfUndef) {
if (values === void 0) { values = {}; }
if (throwIfUndef === void 0) { throwIfUndef = true; }
var _a = parseRef(rawRef), type = _a.type, ref = _a.ref;
if (type === 'env') {
if (!ref) {
throw new Error("Reference value is not present for " + type + ": " + rawRef);
}
var refValue = (values.env && values.env[ref]) || process.env[ref];
if (!refValue) {
if (throwIfUndef) {
throw new Error("Environment variable " + ref + " is not set");
}
else {
return null;
}
}
return refValue;
}
else {
// support only 'env' for now
throw new Error('Undefined reference type ${refType}. Only "env" is supported');
}
}
function parse(str) {
var regex = /\${([^}]*)}/g;
var strings = [];
var rawRefs = [];
var prevIdx = 0;
var match;
// tslint:disable-next-line:no-conditional-assignment
while ((match = regex.exec(str)) !== null) {
if (match.index > 0 && str[match.index - 1] === '\\') {
continue;
}
strings.push(str.substring(prevIdx, match.index));
rawRefs.push(match[1]);
prevIdx = match.index + match[0].length;
}
strings.push(str.substring(prevIdx));
return { strings: strings, rawRefs: rawRefs };
}