diff --git a/src/js/util.js b/src/js/util.js index 429393a91..9dd1dea28 100644 --- a/src/js/util.js +++ b/src/js/util.js @@ -1144,7 +1144,10 @@ export function parseString (str) { const num = Number(str) // will nicely fail with '123ab' const numFloat = parseFloat(str) // will nicely fail with ' ' - if (!isNaN(num) && !isNaN(numFloat)) { + const isFiniteNumber = !isNaN(num) && !isNaN(numFloat) && isFinite(num) + const isInSafeRange = num <= Number.MAX_SAFE_INTEGER && num >= Number.MIN_SAFE_INTEGER + const isInteger = /^\d+$/.test(str) + if (isFiniteNumber && (isInSafeRange || !isInteger)) { return num } diff --git a/test/util.test.js b/test/util.test.js index 7b0cdc994..88d8ee297 100644 --- a/test/util.test.js +++ b/test/util.test.js @@ -305,33 +305,42 @@ describe('util', () => { }) }) - it('should parse a string', () => { - assert.strictEqual(parseString('foo'), 'foo') - assert.strictEqual(parseString('234foo'), '234foo') - assert.strictEqual(parseString(' 234'), 234) - assert.strictEqual(parseString('234 '), 234) - assert.strictEqual(parseString('2.3'), 2.3) - assert.strictEqual(parseString('null'), null) - assert.strictEqual(parseString('true'), true) - assert.strictEqual(parseString('false'), false) - assert.strictEqual(parseString('+1'), 1) - assert.strictEqual(parseString('01'), '01') - assert.strictEqual(parseString('001'), '001') - assert.strictEqual(parseString('0.3'), 0.3) - assert.strictEqual(parseString('0e3'), 0) - assert.strictEqual(parseString(' '), ' ') - assert.strictEqual(parseString(''), '') - assert.strictEqual(parseString('"foo"'), '"foo"') - assert.strictEqual(parseString('"2"'), '"2"') - assert.strictEqual(parseString('\'foo\''), '\'foo\'') - assert.strictEqual(parseString('0x1A'), '0x1A') - assert.strictEqual(parseString('0x1F'), '0x1F') - assert.strictEqual(parseString('0x1a'), '0x1a') - assert.strictEqual(parseString('0b1101'), '0b1101') - assert.strictEqual(parseString('0o3700'), '0o3700') - assert.strictEqual(parseString('0X1a'), '0X1a') - assert.strictEqual(parseString('0B1101'), '0B1101') - assert.strictEqual(parseString('0O3700'), '0O3700') + describe('parseString', () => { + it('should parse a string', () => { + assert.strictEqual(parseString('foo'), 'foo') + assert.strictEqual(parseString('234foo'), '234foo') + assert.strictEqual(parseString(' 234'), 234) + assert.strictEqual(parseString('234 '), 234) + assert.strictEqual(parseString('2.3'), 2.3) + assert.strictEqual(parseString('null'), null) + assert.strictEqual(parseString('true'), true) + assert.strictEqual(parseString('false'), false) + assert.strictEqual(parseString('+1'), 1) + assert.strictEqual(parseString('01'), '01') + assert.strictEqual(parseString('001'), '001') + assert.strictEqual(parseString('0.3'), 0.3) + assert.strictEqual(parseString('0e3'), 0) + assert.strictEqual(parseString(' '), ' ') + assert.strictEqual(parseString(''), '') + assert.strictEqual(parseString('"foo"'), '"foo"') + assert.strictEqual(parseString('"2"'), '"2"') + assert.strictEqual(parseString('\'foo\''), '\'foo\'') + assert.strictEqual(parseString('0x1A'), '0x1A') + assert.strictEqual(parseString('0x1F'), '0x1F') + assert.strictEqual(parseString('0x1a'), '0x1a') + assert.strictEqual(parseString('0b1101'), '0b1101') + assert.strictEqual(parseString('0o3700'), '0o3700') + assert.strictEqual(parseString('0X1a'), '0X1a') + assert.strictEqual(parseString('0B1101'), '0B1101') + assert.strictEqual(parseString('0O3700'), '0O3700') + assert.strictEqual(parseString('7405242042266046865'), '7405242042266046865') + assert.strictEqual(parseString('9007199254740991'), 9007199254740991) + assert.strictEqual(parseString('9007199254740991'), 9007199254740991) + assert.strictEqual(parseString('-9007199254740991'), -9007199254740991) + assert.strictEqual(parseString('1e25'), 1e25) + assert.strictEqual(parseString('1e308'), 1e308) + assert.strictEqual(parseString('1e309'), '1e309') + }) }) it('should find a unique name', () => {