pulumi/sdk/nodejs/runtime/config.ts
Joe Duffy 150f57168a
Fix SxS config (#1175)
We weren't properly lazily loading everywhere we need to.
2018-04-13 11:26:01 -07:00

71 lines
2.1 KiB
TypeScript

// Copyright 2016-2018, Pulumi Corporation. All rights reserved.
/**
* configEnvKey is the environment variable key that the language plugin uses to set configuration values.
*/
const configEnvKey = "PULUMI_CONFIG";
const config: {[key: string]: string} = {};
/**
* allConfig returns a copy of the full config map.
*/
export function allConfig(): {[key: string]: string} {
ensureConfig();
return Object.assign({}, config);
}
/**
* setConfig sets a configuration variable.
*/
export function setConfig(k: string, v: string): void {
ensureConfig();
config[cleanKey(k)] = v;
}
/**
* getConfig returns a configuration variable's value or undefined if it is unset.
*/
export function getConfig(k: string): string | undefined {
ensureConfig();
return config[k];
}
/**
* loaded is set to true if and when we've attempted to load config from the environment.
*/
let loaded: boolean = false;
/**
* ensureConfig populates the runtime.config object based on configuration set in the environment.
*/
export function ensureConfig() {
if (!loaded) {
const envConfig = process.env.PULUMI_CONFIG;
if (envConfig) {
const envObject: {[key: string]: string} = JSON.parse(envConfig);
for (const k of Object.keys(envObject)) {
config[cleanKey(k)] = envObject[k];
}
}
loaded = true;
}
}
/**
* cleanKey takes a configuration key, and if it is of the form "<string>:config:<string>" removes the ":config:"
* portion. Previously, our keys always had the string ":config:" in them, and we'd like to remove it. However, the
* language host needs to continue to set it so we can be compatable with older versions of our packages. Once we
* stop supporting older packages, we can change the language host to not add this :config: thing and remove this
* function.
*/
function cleanKey(key: string): string {
const idx = key.indexOf(":");
if (idx > 0 && key.startsWith("config:", idx + 1)) {
return key.substring(0, idx) + ":" + key.substring(idx + 1 + "config:".length);
}
return key;
}