@avanio/variable-util

NodeJS Installation
npm i @avanio/variable-util
Browser Installation (use browserify events for compatibility)
npm i @avanio/variable-util events
Usage examples
Base ConfigMap project setup
const fetchEnv = new FetchConfigLoader<OverrideMap>(() => new Request('https://example.com/config.json'));
const env = new EnvConfigLoader<OverrideMap>(undefined, {PORT: 'HTTP_PORT'});
const reactEnv = new ReactEnvConfigLoader<OverrideMap>();
export const loaders: IConfigLoader[] = [env, fetchEnv, reactEnv];
export type MainEnv = {
PORT: number;
HOST: string;
DEBUG: boolean;
URL: URL;
};
export type TestEnv = {
TEST: string;
API_SERVER: URL;
};
export type OverrideMap = InferOverrideKeyMap<MainEnv & TestEnv>;
export const mainConfig = new ConfigMap<MainEnv>(
{
DEBUG: {parser: booleanParser(), defaultValue: false},
HOST: {parser: stringParser(), defaultValue: 'localhost'},
PORT: {parser: integerParser(), defaultValue: 3000},
URL: {parser: new UrlParser({urlSanitize: true}), defaultValue: new URL('http://localhost:3000')},
},
loaders,
);
Complex parsers
const objectSchema = z.object({
foo: z.string(),
baz: z.string(),
secret: z.string(),
});
export const fooBarSemicolonParser = new SemicolonConfigParser({
validate: (value) => objectSchema.parse(value),
protectedKeys: ['secret'],
showProtectedKeys: 'prefix-suffix',
});
export const fooBarJsonParser = new JsonConfigParser({
validate: (value) => objectSchema.parse(value),
protectedKeys: ['secret'],
showProtectedKeys: 'prefix-suffix',
});
export const urlParser = new UrlParser({urlSanitize: true});
Legacy setup
const fetchEnv = new FetchConfigLoader(() => new Request('https://example.com/config.json'));
const env = new EnvConfigLoader();
const reactEnv = new ReactEnvConfigLoader();
export const loaders: IConfigLoader[] = [env, fetchEnv, reactEnv];
const valueFromEnv = getConfigVariable('TEST', loaders, stringParser(), undefined, {showValue: true});