From ac1e91c252396a9fb2645c3553ab233162f711ab Mon Sep 17 00:00:00 2001 From: Sayak Mukhopadhyay Date: Sun, 25 Dec 2022 20:32:09 +0530 Subject: [PATCH] feat: handle string representation of boolean values in the config Signed-off-by: Sayak Mukhopadhyay --- packages/config/src/reader.test.ts | 5 ++++- packages/config/src/reader.ts | 20 ++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/config/src/reader.test.ts b/packages/config/src/reader.test.ts index b6179bd67e..13ee243f3f 100644 --- a/packages/config/src/reader.test.ts +++ b/packages/config/src/reader.test.ts @@ -87,8 +87,11 @@ function expectValidValues(config: ConfigReader) { } function expectInvalidValues(config: ConfigReader) { + expect(() => config.getBoolean('zero')).toThrow( + "Invalid type in config for key 'zero' in 'ctx', got number, wanted boolean", + ); expect(() => config.getBoolean('string')).toThrow( - "Invalid type in config for key 'string' in 'ctx', got string, wanted boolean", + "Unable to convert config value for key 'string' in 'ctx' to a boolean", ); expect(() => config.getNumber('string')).toThrow( "Unable to convert config value for key 'string' in 'ctx' to a number", diff --git a/packages/config/src/reader.ts b/packages/config/src/reader.ts index 1ce54590b5..743c20f95c 100644 --- a/packages/config/src/reader.ts +++ b/packages/config/src/reader.ts @@ -280,10 +280,26 @@ export class ConfigReader implements Config { /** {@inheritdoc Config.getOptionalBoolean} */ getOptionalBoolean(key: string): boolean | undefined { - return this.readConfigValue( + const value = this.readConfigValue( key, - value => typeof value === 'boolean' || { expected: 'boolean' }, + val => + typeof val === 'boolean' || + typeof val === 'string' || { expected: 'boolean' }, ); + if (typeof value === 'boolean' || value === undefined) { + return value; + } + let boolean; + if (value === 'true') { + boolean = true; + } else if (value === 'false') { + boolean = false; + } else { + throw new Error( + errors.convert(this.fullKey(key), this.context, 'boolean'), + ); + } + return boolean; } /** {@inheritdoc Config.getString} */