diff --git a/packages/node-config-provider/src/booleanSelector.spec.ts b/packages/node-config-provider/src/booleanSelector.spec.ts new file mode 100644 index 0000000000000..e2b264a747398 --- /dev/null +++ b/packages/node-config-provider/src/booleanSelector.spec.ts @@ -0,0 +1,31 @@ +import { booleanSelector, SelectorType } from "./booleanSelector"; + +describe(booleanSelector.name, () => { + const key = "key"; + const obj: { [key]: any } = {} as any; + + describe.each(Object.entries(SelectorType))(`Selector %s`, (selectorKey, selectorValue) => { + beforeEach(() => { + delete obj[key]; + }); + + it(`should return undefined if ${key} is not defined`, () => { + expect(booleanSelector(obj, key, SelectorType[selectorKey])).toBeUndefined(); + }); + + it.each([ + [true, "true"], + [false, "false"], + ])(`should return boolean %s if ${key}="%s"`, (output, input) => { + obj[key] = input; + expect(booleanSelector(obj, key, SelectorType[selectorKey])).toBe(output); + }); + + it.each(["0", "1", "yes", "no", undefined, null, void 0, ""])(`should throw if ${key}=%s`, (input) => { + obj[key] = input; + expect(() => booleanSelector(obj, key, SelectorType[selectorKey])).toThrow( + `Cannot load ${selectorValue} "${key}". Expected "true" or "false", got ${obj[key]}.` + ); + }); + }); +}); diff --git a/packages/node-config-provider/src/booleanSelector.ts b/packages/node-config-provider/src/booleanSelector.ts new file mode 100644 index 0000000000000..184b883575e80 --- /dev/null +++ b/packages/node-config-provider/src/booleanSelector.ts @@ -0,0 +1,19 @@ +export enum SelectorType { + ENV = "env", + CONFIG = "shared config entry", +} + +/** + * Returns boolean value true/false for string value "true"/"false", + * if the string is defined in obj[key] + * Returns undefined, if obj[key] is not defined. + * Throws error for all other cases. + * + * @internal + */ +export const booleanSelector = (obj: { [key: string]: string }, key: string, type: SelectorType) => { + if (!(key in obj)) return undefined; + if (obj[key] === "true") return true; + if (obj[key] === "false") return false; + throw new Error(`Cannot load ${type} "${key}". Expected "true" or "false", got ${obj[key]}.`); +}; diff --git a/packages/node-config-provider/src/index.ts b/packages/node-config-provider/src/index.ts index 2d035d9111065..0ce785e952def 100644 --- a/packages/node-config-provider/src/index.ts +++ b/packages/node-config-provider/src/index.ts @@ -1 +1,2 @@ +export * from "./booleanSelector"; export * from "./configLoader";