cdk-sops-secrets
Version:
CDK Constructs that syncs your sops secrets into AWS SecretsManager secrets.
95 lines • 12.8 kB
JavaScript
;
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=