diff --git a/packages/convict/src/main.js b/packages/convict/src/main.js index 2474998..edb36a8 100644 --- a/packages/convict/src/main.js +++ b/packages/convict/src/main.js @@ -410,7 +410,7 @@ function coerce(k, v, schema, instance) { case 'int': v = parseInt(v, 10); break case 'port_or_windows_named_pipe': v = isWindowsNamedPipe(v) ? v : parseInt(v, 10); break case 'number': v = parseFloat(v); break - case 'boolean': v = String(v).toLowerCase() !== 'false'; break + case 'boolean': v = parseBoolean(v); break case 'array': v = v.split(','); break case 'object': v = JSON.parse(v); break case 'regexp': v = new RegExp(v); break @@ -422,6 +422,14 @@ function coerce(k, v, schema, instance) { return v } +function parseBoolean(v) { + if (String(v).toLowerCase() === 'false') { + return false + } + + return Boolean(v) +} + function loadFile(path) { const segments = path.split('.') const extension = segments.length > 1 ? segments.pop() : '' diff --git a/packages/convict/test/format.test.js b/packages/convict/test/format.test.js index 92e1cbd..e01ffce 100644 --- a/packages/convict/test/format.test.js +++ b/packages/convict/test/format.test.js @@ -94,12 +94,22 @@ describe('convict formats', function() { optional: { format: '*', default: undefined + }, + boolean: { + format: Boolean, + default: false } } }) }) + test('validates empty string boolean', function() { + conf.set('foo.boolean', '') + const val = conf.get('foo.boolean') + expect(val).toBe(false) + }) + test('validates default schema', function() { expect(function() { conf.validate()