diff --git a/index.js b/index.js index 0da91b3..e98bd94 100644 --- a/index.js +++ b/index.js @@ -124,6 +124,7 @@ const primitiveTypes = new Set([ is.primitive = x => is.null(x) || primitiveTypes.has(typeof x); is.integer = Number.isInteger; +is.safeInteger = Number.isSafeInteger; is.plainObject = x => { // From: https://github.com/sindresorhus/is-plain-obj/blob/master/index.js diff --git a/readme.md b/readme.md index 9e565fb..3f3e20d 100644 --- a/readme.md +++ b/readme.md @@ -128,6 +128,11 @@ is.asyncFunction(() => {}); JavaScript primitives are as follows: `null`, `undefined`, `string`, `number`, `boolean`, `symbol`. ##### .integer(value) + +##### .safeInteger(value) + +Returns `true` if `value` is a [safe integer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger). + ##### .plainObject(value) An object is plain if it's created by either `{}`, `new Object()`, or `Object.create(null)`. diff --git a/test.js b/test.js index 0d62dce..d65a7a0 100644 --- a/test.js +++ b/test.js @@ -98,6 +98,10 @@ const types = new Map([ new Object() // eslint-disable-line no-new-object ]], ['integer', 6], + ['safeInteger', [ + Math.pow(2, 53) - 1, + -Math.pow(2, 53) + 1 + ]], ['domElement', [ 'div', 'input', @@ -160,7 +164,7 @@ test('is.string', t => { }); test('is.number', t => { - testType(t, 'number', ['nan', 'integer', 'infinite']); + testType(t, 'number', ['nan', 'integer', 'safeInteger', 'infinite']); }); test('is.boolean', t => { @@ -312,10 +316,16 @@ test('is.primitive', t => { }); test('is.integer', t => { - testType(t, 'integer', ['number']); + testType(t, 'integer', ['number', 'safeInteger']); t.false(m.integer(1.4)); }); +test('is.safeInteger', t => { + testType(t, 'safeInteger', ['number', 'integer']); + t.false(m.safeInteger(Math.pow(2, 53))); + t.false(m.safeInteger(-Math.pow(2, 53))); +}); + test('is.plainObject', t => { testType(t, 'plainObject', ['object', 'promise']); });