diff --git a/index.js b/index.js index f7a16fd..a156092 100644 --- a/index.js +++ b/index.js @@ -163,4 +163,12 @@ is.inRange = (x, range) => { is.infinite = x => x === Infinity || x === -Infinity; +is.empty = value => { + return ( + ((is.string(value) || is.array(value)) && !value.length) || + (!is.map(value) && !is.set(value) && is.object(value) && !Object.keys(value).length) || + ((is.map(value) || is.set(value)) && !value.size) + ); +}; + module.exports = is; diff --git a/readme.md b/readme.md index fab01c1..e9b250a 100644 --- a/readme.md +++ b/readme.md @@ -150,6 +150,11 @@ is.inRange(3, 10); Check if `value` is `Infinity` or `-Infinity`. +##### .empty(value) + +Returns `true` if `value` is an empty string, array, object, map, or set. + + ## FAQ ### Why yet another type checking module? diff --git a/test.js b/test.js index a2c4337..39b1a50 100644 --- a/test.js +++ b/test.js @@ -373,3 +373,26 @@ test('is.inRange', t => { test('is.infinite', t => { testType(t, 'infinite', ['number']); }); + +test('is.empty', t => { + t.true(m.empty('')); + t.false(m.empty('🦄')); + + t.true(m.empty([])); + t.false(m.empty(['🦄'])); + + t.true(m.empty({})); + t.false(m.empty({unicorn: '🦄'})); + + const tempMap = new Map(); + t.true(m.empty(tempMap)); + + tempMap.set('unicorn', '🦄'); + t.false(m.empty(tempMap)); + + const tempSet = new Set(); + t.true(m.empty(tempSet)); + + tempSet.add(1); + t.false(m.empty(tempSet)); +});