Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions src/config/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,16 @@ export const EXPECTED_HUMAN_LOG = 'true';
const LOG_LEVEL_ENV = process.env['LOG_LEVEL'] || '';
const HUMAN_LOG_ENV = process.env['HUMAN'] || '';

export const level = validateEnvironmentValue(LOG_LEVEL_ENV, Object.keys(levels));
export const humanReadable = validateEnvironmentValue(HUMAN_LOG_ENV, [EXPECTED_HUMAN_LOG, DEFAULT_HUMAN_LOG], DEFAULT_HUMAN_LOG);
export const level = validateEnvironmentValue(
LOG_LEVEL_ENV,
Object.keys(levels),
'info', // fallback to default
{ allowTest: true } // ensure that module does not crash in test env if LOG_LEVEL=test
);

export const humanReadable = validateEnvironmentValue(
HUMAN_LOG_ENV,
[EXPECTED_HUMAN_LOG, DEFAULT_HUMAN_LOG],
DEFAULT_HUMAN_LOG,
{ allowTest: true } // allows fallback if HUMAN is 'test'
);
26 changes: 22 additions & 4 deletions src/utils/validateEnvironmentValue.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,28 @@
export const validateEnvironmentValue = (value: string, validValues: string[], defaultValue: string = ''): string => {
type ValidateEnvOptions = {
allowTest?: boolean;
};

export const validateEnvironmentValue = (
value: string,
validValues: string[],
defaultValue: string = '',
options: ValidateEnvOptions = {}
): string => {
const normalisedValue = value.toLowerCase();
const isTestEnv = normalisedValue === 'test';

// Force-allow 'test' if option enabled
if (isTestEnv && options.allowTest) {
return 'test';
}

if (!defaultValue && !validValues.includes(normalisedValue)) {
throw new Error('No valid environment variable set');
} else if (defaultValue && !validValues.includes(normalisedValue)) {
return defaultValue;
throw new Error(
'No valid environment variable set');
}

if (defaultValue && !validValues.includes(normalisedValue)) {
return defaultValue.toLowerCase();
}

return normalisedValue;
Expand Down
12 changes: 10 additions & 2 deletions test/unit/utils/validateEnvironmentValue.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,21 @@ import { validateEnvironmentValue } from '../../../src/utils/validateEnvironment
import { MOCK_VALID_LEVEL } from '../../mock/data.mock';

describe('validateEnvironmentValue test suites', () => {
const validValues = ['development', 'production'];
test('Should return a valid value', () => {
const validValue = 'debug';
const validatedValue = validateEnvironmentValue(validValue, Object.keys(MOCK_VALID_LEVEL));

expect(validatedValue).toEqual('debug');
});

it('should return the default if the value is invalid and default is valid', () => {
expect(validateEnvironmentValue('invalid', validValues, 'test')).toBe('test');
});
it('should return "test" if allowTest is true even if not in validValues', () => {
expect(
validateEnvironmentValue('test', ['production', 'development'], 'development', { allowTest: true })
).toBe('test');
});
test('Should throw error if value is invalid and no default value provided', () => {
const invalidValue = 'invalid value';

Expand All @@ -21,7 +29,7 @@ describe('validateEnvironmentValue test suites', () => {

test('Should return default value if value is invalid but default value is provided', () => {
const invalidValue = 'invalid value';
const defaultValue = 'default value';
const defaultValue = 'info';

const validatedValue = validateEnvironmentValue(invalidValue, Object.keys(MOCK_VALID_LEVEL), defaultValue);

Expand Down
Loading