diff --git a/index.js b/index.js index ed9fed7..55ecfa8 100644 --- a/index.js +++ b/index.js @@ -5,6 +5,7 @@ const toString = Object.prototype.toString; const getObjectType = x => toString.call(x).slice(8, -1); const isOfType = type => x => typeof x === type; // eslint-disable-line valid-typeof const isObjectOfType = type => x => getObjectType(x) === type; +const emojiRegex = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32-\ude3a]|[\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/; const is = value => { if (value === null) { @@ -196,6 +197,7 @@ const isEmptyMapOrSet = x => (is.map(x) || is.set(x)) && x.size === 0; is.empty = x => is.falsy(x) || isEmptyStringOrArray(x) || isEmptyObject(x) || isEmptyMapOrSet(x); is.emptyOrWhitespace = x => is.empty(x) || isWhiteSpaceString(x); +is.emoji = x => is.string(x) && emojiRegex.test(x); const predicateOnArray = (method, predicate, values) => { // `values` is the calling function's "arguments object". diff --git a/readme.md b/readme.md index 20e9441..b73046f 100644 --- a/readme.md +++ b/readme.md @@ -212,6 +212,8 @@ Returns `true` if `value` is an odd integer. Returns `true` if `value` is falsy or an empty string, array, object, map, or set. +##### .emoji(value) + ##### .emptyOrWhitespace(value) Returns `true` if `is.empty(value)` or a string that is all whitespace. diff --git a/test.js b/test.js index 8b7967c..925122f 100644 --- a/test.js +++ b/test.js @@ -504,6 +504,15 @@ test('is.emptyOrWhitespace', t => { t.false(m.emptyOrWhitespace('unicorn')); }); +test('is.emoji', t => { + t.true(m.emoji('🙏')); + t.true(m.emoji('👑')); + t.true(m.emoji('\uD83D\uDC04')); + t.true(m.emoji('9️⃣')); + t.true(m.emoji('🎌')); + t.false(m.emoji(':unicorn:')); +}); + test('is.any', t => { t.true(m.any(m.string, {}, true, '🦄')); t.true(m.any(m.object, false, {}, 'unicorns'));