// file: loaders.ts constfetchEnv = newFetchConfigLoader<OverrideMap>(() =>newRequest('https://example.com/config.json')); constenv = newEnvConfigLoader<OverrideMap>(undefined, {PORT:'HTTP_PORT'}); // loads from process.env, with override PORT key from HTTP_PORT value constreactEnv = newReactEnvConfigLoader<OverrideMap>(); // loads from process.env in react app // other loaders like dotenv from "@avanio/variable-util-node" can be added here
// Define the custom parser instances for the config values constobjectSchema = z.object({ foo:z.string(), baz:z.string(), secret:z.string(), });
// parses 'foo=bar;baz=qux;secret=secret' string to {foo: "bar", baz: "qux", secret: "secret"} exportconstfooBarSemicolonParser = newSemicolonConfigParser({ validate: (value) =>objectSchema.parse(value), protectedKeys: ['secret'], showProtectedKeys:'prefix-suffix', // shows secret value with few characters from start and end on logging });
// parses '{"foo": "bar", "baz": "qux", "secret": "secret"}' string to {foo: "bar", baz: "qux", secret: "secret"} exportconstfooBarJsonParser = newJsonConfigParser({ validate: (value) =>objectSchema.parse(value), protectedKeys: ['secret'], showProtectedKeys:'prefix-suffix', // shows secret value with few characters from start and end on logging });
exportconsturlParser = newUrlParser({urlSanitize:true}); // urlSanitize hides credentials from logs
Legacy setup
constfetchEnv = newFetchConfigLoader(() =>newRequest('https://example.com/config.json')); constenv = newEnvConfigLoader(); // loads from process.env constreactEnv = newReactEnvConfigLoader(); // loads from process.env in react app exportconstloaders: IConfigLoader[] = [env, fetchEnv, reactEnv];