diff --git a/src/index.js b/src/index.js index 156c267..2ce3553 100644 --- a/src/index.js +++ b/src/index.js @@ -3,3 +3,4 @@ export * as Metadata from './metadata/index.js'; export * as Path from './path/index.js'; export * as Record from './record/index.js'; export * as Template from './template/index.js'; +export * as Value from './value/index.js'; diff --git a/src/value/boolean.js b/src/value/boolean.js new file mode 100644 index 0000000..309664a --- /dev/null +++ b/src/value/boolean.js @@ -0,0 +1,30 @@ +const TRUE_VALUES = ['yes', 'true']; + +/** + * Parse a field value as a boolean. + * **Attention:** Any value other than `'true'`, `'yes'` and `true` (ignoring case) will be parsed as `false`! + * + * @param {any} value - Value to parse as boolean + * @returns {boolean} `true` if value was a boolean `true` or a string `'yes'` or `'true'` (ignoring case); `false` otherwise + */ +export const parseBool = (value) => { + if (typeof value === 'boolean') { + return value; + } + + if (typeof value === 'string') { + return TRUE_VALUES.includes(value.toLowerCase()); + } + + return false; +}; + +/** + * Intended as a replacement for legacy @quickcase/node-toolkit `isYes()`. + */ +export const isTrue = parseBool; + +/** + * Intended as a replacement for legacy @quickcase/node-toolkit `isNo()`. + */ +export const isFalse = (value) => !parseBool(value); diff --git a/src/value/boolean.test.js b/src/value/boolean.test.js new file mode 100644 index 0000000..7749c57 --- /dev/null +++ b/src/value/boolean.test.js @@ -0,0 +1,46 @@ +import {isFalse, isTrue, parseBool} from './boolean.js'; + +const TEST_CASES = [ + // Actual, Expected + ['', false], + ['yes', true], + ['yeS', true], + ['Yes', true], + ['YES', true], + ['true', true], + ['True', true], + ['TRUE', true], + ['TRuE', true], + [true, true], + ['no', false], + ['NO', false], + ['No', false], + ['nO', false], + ['false', false], + ['False', false], + ['FALSE', false], + ['FalsE', false], + [false, false], + ['word', false], + ['Yess', false], + ['Noo', false], + [123, false], +]; + +describe('parseBool', () => { + test.each(TEST_CASES)(`should parse '%s' as %s`, (actual, expected) => { + expect(parseBool(actual)).toBe(expected); + }); +}); + +describe('isTrue', () => { + test.each(TEST_CASES)(`should identify '%s' as %s`, (actual, expected) => { + expect(isTrue(actual)).toBe(expected); + }); +}); + +describe('isFalse', () => { + test.each(TEST_CASES)(`should identify '%s' as not %s`, (actual, expected) => { + expect(isFalse(actual)).toBe(!expected); + }); +}); diff --git a/src/value/index.js b/src/value/index.js new file mode 100644 index 0000000..c4a2a6b --- /dev/null +++ b/src/value/index.js @@ -0,0 +1 @@ +export * from './boolean.js';