From fb7711dbaac5bc5aa7f8783b2733f342310f88ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Furkan=20K=C3=B6se?= Date: Sun, 3 May 2020 22:40:55 +0300 Subject: [PATCH] FIX string parsing issue of number format --- packages/convict/src/main.js | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/convict/src/main.js b/packages/convict/src/main.js index 5aad9325..0c371ffe 100644 --- a/packages/convict/src/main.js +++ b/packages/convict/src/main.js @@ -42,6 +42,24 @@ function isWindowsNamedPipe(x) { return String(x).includes('\\\\.\\pipe\\') } +/** + * Checks if x is a number + * + * @param {*} x + * @returns {Boolean} + */ +function isNumber(x) { + if (typeof x === 'number') { + return true + } else if (parseFloat(x)) { + return true + } else if (typeof x === 'string' && x === 'NaN') { + return true + } + + return false +} + const types = { '*': function() { }, int: function(x) { @@ -406,7 +424,7 @@ function coerce(k, v, schema, instance) { case 'integer': 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 'number': v = isNumber(v) ? parseFloat(v) : v; break case 'boolean': v = String(v).toLowerCase() !== 'false'; break case 'array': v = v.split(','); break case 'object': v = JSON.parse(v); break