UNPKG

cdk-sops-secrets

Version:

CDK Constructs that syncs your sops secrets into AWS SecretsManager secrets.

95 lines 12.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.inferStructuredFileFormat = inferStructuredFileFormat; exports.parseStructuredFile = parseStructuredFile; exports.flattenStructuredFile = flattenStructuredFile; exports.flattenStructuredFileToStringMap = flattenStructuredFileToStringMap; const fs = require("fs"); const YAML = require("yaml"); function flattenJSON(data, parentKey = '', result = {}, keySeparator = '') { for (const key of Object.keys(data)) { const value = data[key]; const newKey = parentKey ? `${parentKey}${keySeparator}${key}` : key; if (Array.isArray(value)) { value.forEach((item, index) => { const arrayKey = `${newKey}[${index}]`; if (item !== null && typeof item === 'object' && !Array.isArray(item)) { flattenJSON(item, arrayKey, result, keySeparator); } else { result[arrayKey] = item; } }); } else if (value !== null && typeof value === 'object' && !Array.isArray(value)) { flattenJSON(value, newKey, result, keySeparator); } else { result[newKey] = value; } } return result; } function ensureObject(data, filePath) { if (data === null || typeof data !== 'object' || Array.isArray(data)) { throw new Error(`Expected structured object content in ${filePath}`); } return data; } function parseDotenv(content) { const result = {}; for (const line of content.split('\n')) { if (line !== '' && !line.startsWith('#')) { const parts = line.split('=', 2); if (parts.length === 2) { const key = parts[0].trim(); const value = parts[1].trim(); result[key] = value; } } } return result; } function inferStructuredFileFormat(sopsFilePath) { const extension = sopsFilePath.split('.').pop(); switch (extension) { case 'json': return 'json'; case 'yaml': case 'yml': return 'yaml'; case 'dotenv': case 'env': return 'dotenv'; default: return undefined; } } function parseStructuredFile(sopsFilePath, fileFormat) { const resolvedFormat = fileFormat ?? inferStructuredFileFormat(sopsFilePath); if (resolvedFormat === undefined) { throw new Error(`Unsupported structured file format for ${sopsFilePath}. Supported formats: json, yaml, dotenv`); } const content = fs.readFileSync(sopsFilePath, 'utf-8'); switch (resolvedFormat) { case 'json': return ensureObject(JSON.parse(content), sopsFilePath); case 'yaml': return ensureObject(YAML.parse(content), sopsFilePath); case 'dotenv': return parseDotenv(content); } } function flattenStructuredFile(sopsFilePath, keySeparator, fileFormat) { return flattenJSON(parseStructuredFile(sopsFilePath, fileFormat), '', {}, keySeparator); } function flattenStructuredFileToStringMap(sopsFilePath, keySeparator, fileFormat) { const flat = flattenStructuredFile(sopsFilePath, keySeparator, fileFormat); return Object.fromEntries(Object.entries(flat).map(([key, value]) => [ key, value === null || value === undefined ? '' : String(value), ])); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJlZERhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3RydWN0dXJlZERhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFpRUEsOERBaUJDO0FBRUQsa0RBcUJDO0FBRUQsc0RBV0M7QUFFRCw0RUFhQztBQXJJRCx5QkFBeUI7QUFDekIsNkJBQTZCO0FBUTdCLFNBQVMsV0FBVyxDQUNsQixJQUFnQixFQUNoQixZQUFvQixFQUFFLEVBQ3RCLFNBQXFCLEVBQUUsRUFDdkIsWUFBWSxHQUFHLEVBQUU7SUFFakIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFFckUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDNUIsTUFBTSxRQUFRLEdBQUcsR0FBRyxNQUFNLElBQUksS0FBSyxHQUFHLENBQUM7Z0JBQ3ZDLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3RFLFdBQVcsQ0FBQyxJQUFrQixFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ2xFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixDQUFDO1lBQ0gsQ0FBQyxD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QUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDekQsS0FBSyxRQUFRO1lBQ1gsT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFnQixxQkFBcUIsQ0FDbkMsWUFBb0IsRUFDcEIsWUFBb0IsRUFDcEIsVUFBaUM7SUFFakMsT0FBTyxXQUFXLENBQ2hCLG1CQUFtQixDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsRUFDN0MsRUFBRSxFQUNGLEVBQUUsRUFDRixZQUFZLENBQ2IsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQixnQ0FBZ0MsQ0FDOUMsWUFBb0IsRUFDcEIsWUFBb0IsRUFDcEIsVUFBaUM7SUFFakMsTUFBTSxJQUFJLEdBQUcscUJBQXFCLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUUzRSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3pDLEdBQUc7UUFDSCxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztLQUMzRCxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBZQU1MIGZyb20gJ3lhbWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEpTT05PYmplY3Qge1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgdHlwZSBTdHJ1Y3R1cmVkRmlsZUZvcm1hdCA9ICdqc29uJyB8ICd5YW1sJyB8ICdkb3RlbnYnO1xuXG5mdW5jdGlvbiBmbGF0dGVuSlNPTihcbiAgZGF0YTogSlNPTk9iamVjdCxcbiAgcGFyZW50S2V5OiBzdHJpbmcgPSAnJyxcbiAgcmVzdWx0OiBKU09OT2JqZWN0ID0ge30sXG4gIGtleVNlcGFyYXRvciA9ICcnLFxuKTogSlNPTk9iamVjdCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGRhdGEpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBkYXRhW2tleV07XG4gICAgY29uc3QgbmV3S2V5ID0gcGFyZW50S2V5ID8gYCR7cGFyZW50S2V5fSR7a2V5U2VwYXJhdG9yfSR7a2V5fWAgOiBrZXk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGFycmF5S2V5ID0gYCR7bmV3S2V5fVske2luZGV4fV1gO1xuICAgICAgICBpZiAoaXRlbSAhPT0gbnVsbCAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgICBmbGF0dGVuSlNPTihpdGVtIGFzIEpTT05PYmplY3QsIGFycmF5S2V5LCByZXN1bHQsIGtleVNlcGFyYXRvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2FycmF5S2V5XSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgKSB7XG4gICAgICBmbGF0dGVuSlNPTih2YWx1ZSBhcyBKU09OT2JqZWN0LCBuZXdLZXksIHJlc3VsdCwga2V5U2VwYXJhdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W25ld0tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZW5zdXJlT2JqZWN0KGRhdGE6IHVua25vd24sIGZpbGVQYXRoOiBzdHJpbmcpOiBKU09OT2JqZWN0IHtcbiAgaWYgKGRhdGEgPT09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHN0cnVjdHVyZWQgb2JqZWN0IGNvbnRlbnQgaW4gJHtmaWxlUGF0aH1gKTtcbiAgfVxuICByZXR1cm4gZGF0YSBhcyBKU09OT2JqZWN0O1xufVxuXG5mdW5jdGlvbiBwYXJzZURvdGVudihjb250ZW50OiBzdHJpbmcpOiBKU09OT2JqZWN0IHtcbiAgY29uc3QgcmVzdWx0OiBKU09OT2JqZWN0ID0ge307XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKGxpbmUgIT09ICcnICYmICFsaW5lLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgY29uc3QgcGFydHMgPSBsaW5lLnNwbGl0KCc9JywgMik7XG4gICAgICBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHBhcnRzWzBdLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJ0c1sxXS50cmltKCk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluZmVyU3RydWN0dXJlZEZpbGVGb3JtYXQoXG4gIHNvcHNGaWxlUGF0aDogc3RyaW5nLFxuKTogU3RydWN0dXJlZEZpbGVGb3JtYXQgfCB1bmRlZmluZWQge1xuICBjb25zdCBleHRlbnNpb24gPSBzb3BzRmlsZVBhdGguc3BsaXQoJy4nKS5wb3AoKTtcblxuICBzd2l0Y2ggKGV4dGVuc2lvbikge1xuICAgIGNhc2UgJ2pzb24nOlxuICAgICAgcmV0dXJuICdqc29uJztcbiAgICBjYXNlICd5YW1sJzpcbiAgICBjYXNlICd5bWwnOlxuICAgICAgcmV0dXJuICd5YW1sJztcbiAgICBjYXNlICdkb3RlbnYnOlxuICAgIGNhc2UgJ2Vudic6XG4gICAgICByZXR1cm4gJ2RvdGVudic7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RydWN0dXJlZEZpbGUoXG4gIHNvcHNGaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlRm9ybWF0PzogU3RydWN0dXJlZEZpbGVGb3JtYXQsXG4pOiBKU09OT2JqZWN0IHtcbiAgY29uc3QgcmVzb2x2ZWRGb3JtYXQgPSBmaWxlRm9ybWF0ID8/IGluZmVyU3RydWN0dXJlZEZpbGVGb3JtYXQoc29wc0ZpbGVQYXRoKTtcbiAgaWYgKHJlc29sdmVkRm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVW5zdXBwb3J0ZWQgc3RydWN0dXJlZCBmaWxlIGZvcm1hdCBmb3IgJHtzb3BzRmlsZVBhdGh9LiBTdXBwb3J0ZWQgZm9ybWF0czoganNvbiwgeWFtbCwgZG90ZW52YCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzb3BzRmlsZVBhdGgsICd1dGYtOCcpO1xuXG4gIHN3aXRjaCAocmVzb2x2ZWRGb3JtYXQpIHtcbiAgICBjYXNlICdqc29uJzpcbiAgICAgIHJldHVybiBlbnN1cmVPYmplY3QoSlNPTi5wYXJzZShjb250ZW50KSwgc29wc0ZpbGVQYXRoKTtcbiAgICBjYXNlICd5YW1sJzpcbiAgICAgIHJldHVybiBlbnN1cmVPYmplY3QoWUFNTC5wYXJzZShjb250ZW50KSwgc29wc0ZpbGVQYXRoKTtcbiAgICBjYXNlICdkb3RlbnYnOlxuICAgICAgcmV0dXJuIHBhcnNlRG90ZW52KGNvbnRlbnQpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuU3RydWN0dXJlZEZpbGUoXG4gIHNvcHNGaWxlUGF0aDogc3RyaW5nLFxuICBrZXlTZXBhcmF0b3I6IHN0cmluZyxcbiAgZmlsZUZvcm1hdD86IFN0cnVjdHVyZWRGaWxlRm9ybWF0LFxuKTogSlNPTk9iamVjdCB7XG4gIHJldHVybiBmbGF0dGVuSlNPTihcbiAgICBwYXJzZVN0cnVjdHVyZWRGaWxlKHNvcHNGaWxlUGF0aCwgZmlsZUZvcm1hdCksXG4gICAgJycsXG4gICAge30sXG4gICAga2V5U2VwYXJhdG9yLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlblN0cnVjdHVyZWRGaWxlVG9TdHJpbmdNYXAoXG4gIHNvcHNGaWxlUGF0aDogc3RyaW5nLFxuICBrZXlTZXBhcmF0b3I6IHN0cmluZyxcbiAgZmlsZUZvcm1hdD86IFN0cnVjdHVyZWRGaWxlRm9ybWF0LFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGZsYXQgPSBmbGF0dGVuU3RydWN0dXJlZEZpbGUoc29wc0ZpbGVQYXRoLCBrZXlTZXBhcmF0b3IsIGZpbGVGb3JtYXQpO1xuXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoZmxhdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyh2YWx1ZSksXG4gICAgXSksXG4gICk7XG59XG4iXX0=