@creditkarma/dynamic-config
Version:
Dynamic Config for Node.js backed by Consul and Vault
140 lines • 4.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.loadSettings = exports.configSettingsSchema = exports.SETTINGS_FILE_NAME = void 0;
const fs = require("fs");
const logger_1 = require("./logger");
const utils_1 = require("./utils");
const translators_1 = require("./translators");
const resolvers_1 = require("./resolvers");
const loaders_1 = require("./loaders");
exports.SETTINGS_FILE_NAME = 'config-settings.json';
exports.configSettingsSchema = {
type: 'object',
properties: {
configPath: {
type: 'string',
},
configEnv: {
type: 'string',
},
remoteOptions: {
type: 'object',
},
resolvers: {
type: 'array',
items: {
type: 'string',
},
},
loaders: {
type: 'array',
items: {
type: 'string',
},
},
translators: {
type: 'array',
items: {
type: 'string',
},
},
schemas: {
type: 'object',
},
},
};
const defaultTranslatorMap = {
debug: translators_1.debugTranslator,
env: translators_1.envTranslator,
consul: translators_1.consulTranslator,
};
const defaultLoaderMap = {
js: loaders_1.jsLoader,
ts: loaders_1.tsLoader,
json: loaders_1.jsonLoader,
yml: loaders_1.ymlLoader,
yaml: loaders_1.ymlLoader,
};
const defaultResolverMap = {
package: resolvers_1.packageResolver,
consul: resolvers_1.consulResolver,
vault: resolvers_1.vaultResolver,
};
function settingsToOptions(settings) {
const result = {};
if (settings.configPath !== undefined) {
result.configPath = settings.configPath;
}
if (settings.configEnv !== undefined) {
result.configEnv = settings.configEnv;
}
if (settings.remoteOptions !== undefined) {
result.remoteOptions = settings.remoteOptions;
}
if (settings.resolvers !== undefined) {
result.resolvers = {};
if (settings.resolvers.indexOf('consul') > -1) {
result.resolvers.remote = defaultResolverMap.consul();
}
if (settings.resolvers.indexOf('vault') > -1) {
result.resolvers.secret = defaultResolverMap.vault();
}
}
else {
result.resolvers = {
remote: (0, resolvers_1.consulResolver)(),
secret: (0, resolvers_1.vaultResolver)(),
};
}
if (settings.loaders !== undefined) {
result.loaders = settings.loaders.reduce((acc, next) => {
if (defaultLoaderMap[next] !== undefined) {
acc.push(defaultLoaderMap[next]);
}
return acc;
}, []);
}
else {
result.loaders = [loaders_1.jsonLoader, loaders_1.ymlLoader, loaders_1.jsLoader, loaders_1.tsLoader];
}
if (settings.translators !== undefined) {
result.translators = settings.translators.reduce((acc, next) => {
if (defaultTranslatorMap[next] !== undefined) {
acc.push(defaultTranslatorMap[next]);
}
return acc;
}, []);
}
else {
result.translators = [translators_1.envTranslator, translators_1.consulTranslator];
}
return result;
}
function loadSettings() {
const settingsPath = utils_1.FileUtils.findFile(exports.SETTINGS_FILE_NAME, []);
if (settingsPath !== null) {
try {
const content = fs
.readFileSync(settingsPath)
.toString('utf-8');
const settings = JSON.parse(content);
if (utils_1.JSONUtils.objectMatchesSchema(exports.configSettingsSchema, settings)) {
return settingsToOptions(settings);
}
else {
logger_1.defaultLogger.error(`Config settings does not match the expected schema`);
return settingsToOptions({});
}
}
catch (e) {
logger_1.defaultLogger.error(`Failed to load config-settings from file[${settingsPath}]`);
return settingsToOptions({});
}
}
else {
logger_1.defaultLogger.log(`Unable to find static config-settings`);
return settingsToOptions({});
}
}
exports.loadSettings = loadSettings;
//# sourceMappingURL=SettingsLoader.js.map