projen
Version:
CDK for software projects
66 lines • 8.63 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolve = resolve;
const util_1 = require("util");
function isResolvable(obj) {
return obj.toJSON !== undefined;
}
function resolve(value, options = {}) {
const args = options.args ?? [];
const omitEmpty = options.omitEmpty ?? false;
if (value == null) {
return value;
}
if (isResolvable(value)) {
const resolved = value.toJSON();
return resolve(resolved, options);
}
// Special resolution for few JavaScript built-in types
// that by default would be stringified as empty objects ('{}')
// as they are missing a `toJSON` implementation.
switch (true) {
case util_1.types.isRegExp(value):
if (value.flags) {
throw new Error("RegExp with flags should be explicitly converted to a string");
}
return value.source;
case util_1.types.isSet(value):
return resolve(Array.from(value), options);
case util_1.types.isMap(value):
return resolve(Object.fromEntries(value), options);
case util_1.types.isBoxedPrimitive(value):
return resolve(value.valueOf(), options);
}
// if value is a function, call it and resolve the result.
if (typeof value === "function") {
const resolved = value.apply(undefined, args);
return resolve(resolved, options);
}
if (typeof value !== "object") {
return value;
}
if (Array.isArray(value)) {
if (omitEmpty && value.length === 0) {
return undefined;
}
return value.map((x) => resolve(x, options)).filter((x) => x != null); // filter undefined/null/omitted
}
// only allow data types (i.e. objects without constructors)
if (value.constructor && value.constructor?.name !== "Object") {
throw new Error(`only data types can be resolved. trying to resolve object of type ${value.constructor?.name}`);
}
const result = {};
for (const [k, v] of Object.entries(value)) {
const resolved = resolve(v, options);
// skip undefined values
if (resolved === undefined) {
continue;
}
result[k] = resolved;
}
if (omitEmpty && Object.keys(result).length === 0) {
return undefined;
}
return result;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3Jlc29sdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvX3Jlc29sdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFPQSwwQkE2RUM7QUFwRkQsK0JBQTZCO0FBRzdCLFNBQVMsWUFBWSxDQUFDLEdBQVE7SUFDNUIsT0FBUSxHQUFtQixDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUM7QUFDbkQsQ0FBQztBQUVELFNBQWdCLE9BQU8sQ0FBQyxLQUFVLEVBQUUsVUFBMEIsRUFBRTtJQUM5RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNoQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztJQUU3QyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQyxPQUFPLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELHVEQUF1RDtJQUN2RCwrREFBK0Q7SUFDL0QsaURBQWlEO0lBQ2pELFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDYixLQUFLLFlBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3hCLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksS0FBSyxDQUNiLDhEQUE4RCxDQUMvRCxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUV0QixLQUFLLFlBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3JCLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFN0MsS0FBSyxZQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNyQixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXJELEtBQUssWUFBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQztZQUNoQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlDLE9BQU8sT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixJQUFJLFNBQVMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLGdDQUFnQztJQUN6RyxDQUFDO0lBRUQsNERBQTREO0lBQzVELElBQUksS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5RCxNQUFNLElBQUksS0FBSyxDQUNiLHFFQUFxRSxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUMvRixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFRLEVBQUUsQ0FBQztJQUV2QixLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFckMsd0JBQXdCO1FBQ3hCLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNCLFNBQVM7UUFDWCxDQUFDO1FBRUQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlcyB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVPcHRpb25zLCBJUmVzb2x2YWJsZSB9IGZyb20gXCIuL2ZpbGVcIjtcblxuZnVuY3Rpb24gaXNSZXNvbHZhYmxlKG9iajogYW55KTogb2JqIGlzIElSZXNvbHZhYmxlIHtcbiAgcmV0dXJuIChvYmogYXMgSVJlc29sdmFibGUpLnRvSlNPTiAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZSh2YWx1ZTogYW55LCBvcHRpb25zOiBSZXNvbHZlT3B0aW9ucyA9IHt9KTogYW55IHtcbiAgY29uc3QgYXJncyA9IG9wdGlvbnMuYXJncyA/PyBbXTtcbiAgY29uc3Qgb21pdEVtcHR5ID0gb3B0aW9ucy5vbWl0RW1wdHkgPz8gZmFsc2U7XG5cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpZiAoaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gdmFsdWUudG9KU09OKCk7XG4gICAgcmV0dXJuIHJlc29sdmUocmVzb2x2ZWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gU3BlY2lhbCByZXNvbHV0aW9uIGZvciBmZXcgSmF2YVNjcmlwdCBidWlsdC1pbiB0eXBlc1xuICAvLyB0aGF0IGJ5IGRlZmF1bHQgd291bGQgYmUgc3RyaW5naWZpZWQgYXMgZW1wdHkgb2JqZWN0cyAoJ3t9JylcbiAgLy8gYXMgdGhleSBhcmUgbWlzc2luZyBhIGB0b0pTT05gIGltcGxlbWVudGF0aW9uLlxuICBzd2l0Y2ggKHRydWUpIHtcbiAgICBjYXNlIHR5cGVzLmlzUmVnRXhwKHZhbHVlKTpcbiAgICAgIGlmICh2YWx1ZS5mbGFncykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJSZWdFeHAgd2l0aCBmbGFncyBzaG91bGQgYmUgZXhwbGljaXRseSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmdcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZS5zb3VyY2U7XG5cbiAgICBjYXNlIHR5cGVzLmlzU2V0KHZhbHVlKTpcbiAgICAgIHJldHVybiByZXNvbHZlKEFycmF5LmZyb20odmFsdWUpLCBvcHRpb25zKTtcblxuICAgIGNhc2UgdHlwZXMuaXNNYXAodmFsdWUpOlxuICAgICAgcmV0dXJuIHJlc29sdmUoT2JqZWN0LmZyb21FbnRyaWVzKHZhbHVlKSwgb3B0aW9ucyk7XG5cbiAgICBjYXNlIHR5cGVzLmlzQm94ZWRQcmltaXRpdmUodmFsdWUpOlxuICAgICAgcmV0dXJuIHJlc29sdmUodmFsdWUudmFsdWVPZigpLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIGlmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGNhbGwgaXQgYW5kIHJlc29sdmUgdGhlIHJlc3VsdC5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB2YWx1ZS5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgIHJldHVybiByZXNvbHZlKHJlc29sdmVkLCBvcHRpb25zKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBpZiAob21pdEVtcHR5ICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLm1hcCgoeCkgPT4gcmVzb2x2ZSh4LCBvcHRpb25zKSkuZmlsdGVyKCh4KSA9PiB4ICE9IG51bGwpOyAvLyBmaWx0ZXIgdW5kZWZpbmVkL251bGwvb21pdHRlZFxuICB9XG5cbiAgLy8gb25seSBhbGxvdyBkYXRhIHR5cGVzIChpLmUuIG9iamVjdHMgd2l0aG91dCBjb25zdHJ1Y3RvcnMpXG4gIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvcj8ubmFtZSAhPT0gXCJPYmplY3RcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBvbmx5IGRhdGEgdHlwZXMgY2FuIGJlIHJlc29sdmVkLiB0cnlpbmcgdG8gcmVzb2x2ZSBvYmplY3Qgb2YgdHlwZSAke3ZhbHVlLmNvbnN0cnVjdG9yPy5uYW1lfWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG5cbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKHYsIG9wdGlvbnMpO1xuXG4gICAgLy8gc2tpcCB1bmRlZmluZWQgdmFsdWVzXG4gICAgaWYgKHJlc29sdmVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc3VsdFtrXSA9IHJlc29sdmVkO1xuICB9XG5cbiAgaWYgKG9taXRFbXB0eSAmJiBPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl19