63 lines
2.6 KiB
JavaScript
63 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
var propertyProvider = require('@smithy/property-provider');
|
|
var sharedIniFileLoader = require('@smithy/shared-ini-file-loader');
|
|
|
|
function getSelectorName(functionString) {
|
|
try {
|
|
const constants = new Set(Array.from(functionString.match(/([A-Z_]){3,}/g) ?? []));
|
|
constants.delete("CONFIG");
|
|
constants.delete("CONFIG_PREFIX_SEPARATOR");
|
|
constants.delete("ENV");
|
|
return [...constants].join(", ");
|
|
}
|
|
catch (e) {
|
|
return functionString;
|
|
}
|
|
}
|
|
|
|
const fromEnv = (envVarSelector, options) => async () => {
|
|
try {
|
|
const config = envVarSelector(process.env, options);
|
|
if (config === undefined) {
|
|
throw new Error();
|
|
}
|
|
return config;
|
|
}
|
|
catch (e) {
|
|
throw new propertyProvider.CredentialsProviderError(e.message || `Not found in ENV: ${getSelectorName(envVarSelector.toString())}`, { logger: options?.logger });
|
|
}
|
|
};
|
|
|
|
const fromSharedConfigFiles = (configSelector, { preferredFile = "config", ...init } = {}) => async () => {
|
|
const profile = sharedIniFileLoader.getProfileName(init);
|
|
const { configFile, credentialsFile } = await sharedIniFileLoader.loadSharedConfigFiles(init);
|
|
const profileFromCredentials = credentialsFile[profile] || {};
|
|
const profileFromConfig = configFile[profile] || {};
|
|
const mergedProfile = preferredFile === "config"
|
|
? { ...profileFromCredentials, ...profileFromConfig }
|
|
: { ...profileFromConfig, ...profileFromCredentials };
|
|
try {
|
|
const cfgFile = preferredFile === "config" ? configFile : credentialsFile;
|
|
const configValue = configSelector(mergedProfile, cfgFile);
|
|
if (configValue === undefined) {
|
|
throw new Error();
|
|
}
|
|
return configValue;
|
|
}
|
|
catch (e) {
|
|
throw new propertyProvider.CredentialsProviderError(e.message || `Not found in config files w/ profile [${profile}]: ${getSelectorName(configSelector.toString())}`, { logger: init.logger });
|
|
}
|
|
};
|
|
|
|
const isFunction = (func) => typeof func === "function";
|
|
const fromStatic = (defaultValue) => isFunction(defaultValue) ? async () => await defaultValue() : propertyProvider.fromStatic(defaultValue);
|
|
|
|
const loadConfig = ({ environmentVariableSelector, configFileSelector, default: defaultValue }, configuration = {}) => {
|
|
const { signingName, logger } = configuration;
|
|
const envOptions = { signingName, logger };
|
|
return propertyProvider.memoize(propertyProvider.chain(fromEnv(environmentVariableSelector, envOptions), fromSharedConfigFiles(configFileSelector, configuration), fromStatic(defaultValue)));
|
|
};
|
|
|
|
exports.loadConfig = loadConfig;
|