From 32a4da583c3fecf9acae9085de161e5f26e8a74e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 18 Jun 2020 11:03:29 +0200 Subject: [PATCH] packages/config: add getOptionalConfig and getOptionalConfigArray to mirror other accessors --- packages/config/src/reader.test.ts | 12 ++++++++---- packages/config/src/reader.ts | 29 +++++++++++++++++++++++------ packages/config/src/types.ts | 2 ++ 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/packages/config/src/reader.test.ts b/packages/config/src/reader.test.ts index 365fddd4cf..64e4b3ed69 100644 --- a/packages/config/src/reader.test.ts +++ b/packages/config/src/reader.test.ts @@ -46,10 +46,11 @@ function expectValidValues(config: ConfigReader) { expect(config.getStringArray('strings')).toEqual(['string1', 'string2']); expect(config.getConfig('nested').getNumber('one')).toBe(1); expect(config.getConfig('nested').getString('string')).toBe('string'); - expect(config.getConfig('nested').getStringArray('strings')).toEqual([ - 'string1', - 'string2', - ]); + expect( + config.getOptionalConfig('nested')!.getStringArray('strings'), + ).toEqual(['string1', 'string2']); + expect(config.getOptionalConfig('missing')).toBe(undefined); + expect(config.getOptionalConfigArray('missing')).toBe(undefined); expect(config.getNumber('zero')).toBe(0); expect(config.getBoolean('true')).toBe(true); expect(config.getString('string')).toBe('string'); @@ -59,6 +60,9 @@ function expectValidValues(config: ConfigReader) { expect(config1.getBoolean('boolean')).toBe(true); expect(config2.getString('string')).toBe('string'); expect(config3.getNumber('number')).toBe(42); + expect( + config.getOptionalConfigArray('nestlings')![0].getBoolean('boolean'), + ).toBe(true); } function expectInvalidValues(config: ConfigReader) { diff --git a/packages/config/src/reader.ts b/packages/config/src/reader.ts index e4c4c4d304..4e302a73a4 100644 --- a/packages/config/src/reader.ts +++ b/packages/config/src/reader.ts @@ -79,8 +79,16 @@ export class ConfigReader implements Config { } getConfig(key: string): ConfigReader { + const value = this.getOptionalConfig(key); + if (value === undefined) { + throw new Error(errors.missing(this.fullKey(key))); + } + return value; + } + + getOptionalConfig(key: string): ConfigReader | undefined { const value = this.readValue(key); - const fallbackConfig = this.fallback?.getConfig(key); + const fallbackConfig = this.fallback?.getOptionalConfig(key); const prefix = this.fullKey(key); if (isObject(value)) { @@ -91,13 +99,18 @@ export class ConfigReader implements Config { errors.type(this.fullKey(key), this.context, typeOf(value), 'object'), ); } - return ( - fallbackConfig ?? - new ConfigReader(undefined, undefined, undefined, prefix) - ); + return fallbackConfig; } getConfigArray(key: string): ConfigReader[] { + const value = this.getOptionalConfigArray(key); + if (value === undefined) { + throw new Error(errors.missing(this.fullKey(key))); + } + return value; + } + + getOptionalConfigArray(key: string): ConfigReader[] | undefined { const configs = this.readConfigValue(key, values => { if (!Array.isArray(values)) { return { expected: 'object-array' }; @@ -111,7 +124,11 @@ export class ConfigReader implements Config { return true; }); - return (configs ?? []).map( + if (!configs) { + return undefined; + } + + return configs.map( (obj, index) => new ConfigReader( obj, diff --git a/packages/config/src/types.ts b/packages/config/src/types.ts index 9c49a45af4..180d526b40 100644 --- a/packages/config/src/types.ts +++ b/packages/config/src/types.ts @@ -33,8 +33,10 @@ export type Config = { keys(): string[]; getConfig(key: string): Config; + getOptionalConfig(key: string): Config | undefined; getConfigArray(key: string): Config[]; + getOptionalConfigArray(key: string): Config[] | undefined; getNumber(key: string): number; getOptionalNumber(key: string): number | undefined;