From 73f6631a92e73a3c1cd85bb9e2efc574e69be254 Mon Sep 17 00:00:00 2001 From: Andrew Luca <1881266+iamandrewluca@users.noreply.github.com> Date: Thu, 2 Mar 2023 11:57:59 +0200 Subject: [PATCH] Add oneOf env helper for union values --- .../utils/lib/__tests__/env-helper.test.js | 23 +++++++++++++++++++ packages/core/utils/lib/env-helper.js | 20 ++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/packages/core/utils/lib/__tests__/env-helper.test.js b/packages/core/utils/lib/__tests__/env-helper.test.js index a77412af17..86173dcd7a 100644 --- a/packages/core/utils/lib/__tests__/env-helper.test.js +++ b/packages/core/utils/lib/__tests__/env-helper.test.js @@ -144,4 +144,27 @@ describe('Env helper', () => { expect(envHelper.date('DATE_VAR')).toEqual(new Date(2010, 1, 21, 12, 34, 12)); }); }); + + describe('env with union cast', () => { + test('Throws if expectedValues is not provided', () => { + expect(() => envHelper.oneOf('NO_VAR')).toThrow(); + }); + + test('Throws if defaultValue not included in expectedValues', () => { + expect(() => envHelper.oneOf('NO_VAR', ['lorem', 'ipsum'], 'test')).toThrow(); + }); + + test('Return undefined if value is missing in expectedValues and no defaultValue', () => { + expect(envHelper.oneOf('NO_VAR', ['lorem', 'ipsum'])).toBeUndefined(); + }); + + test('Return defaultValue if value does not exist in expectedValues', () => { + expect(envHelper.oneOf('NO_VAR', ['lorem', 'ipsum'], 'ipsum')).toBe('ipsum'); + }); + + test('Return defaultValue if value exists and is missing in expectedValues', () => { + process.env.WITH_VAR = 'test'; + expect(envHelper.oneOf('WITH_VAR', ['lorem', 'ipsum'], 'ipsum')).toBe('ipsum'); + }); + }); }); diff --git a/packages/core/utils/lib/env-helper.js b/packages/core/utils/lib/env-helper.js index b26a893fed..b14c1b520d 100644 --- a/packages/core/utils/lib/env-helper.js +++ b/packages/core/utils/lib/env-helper.js @@ -71,6 +71,26 @@ const utils = { const value = process.env[key]; return new Date(value); }, + + /** + * Gets a value from env that matches oneOf provided values + * @param {string} key + * @param {string[]} expectedValues + * @param {string|undefined} defaultValue + * @returns {string|undefined} + */ + oneOf(key, expectedValues, defaultValue) { + if (!expectedValues) { + throw new Error(`env.oneOf requires expectedValues`); + } + + if (defaultValue && !expectedValues.includes(defaultValue)) { + throw new Error(`env.oneOf requires defaultValue to be included in expectedValues`); + } + + const rawValue = env(key, defaultValue); + return expectedValues.includes(rawValue) ? rawValue : defaultValue; + }, }; Object.assign(env, utils);