From d0a81d363f1a94456d51c5312cfb4b3d4129b2fe Mon Sep 17 00:00:00 2001 From: Jose Ramirez Date: Mon, 30 Oct 2023 13:13:29 +0100 Subject: [PATCH 1/4] Add isFunction --- README.md | 1 + index.js | 2 ++ src/isFunction.js | 7 ++++++ src/isPlainObject.js | 4 +++- test/isFunction.js | 57 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/isFunction.js create mode 100644 test/isFunction.js diff --git a/README.md b/README.md index 80b8324..31ff24b 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ Currently supported utils: - `isEmpty` - checks if value is an empty object, collection, map, or set - `isNil` - checks whenever value is null or undefined - `isPlainObject` - checks if input is object, not null object and not array object +- `isFunction` - checks if input is a Function object. - `merge` - deep merge functionality for objects - `omit` - provides new object that omits only specific fields of source object - `omitBy` - provides new object that omits only specific fields of source object depending on predicate function filter diff --git a/index.js b/index.js index 24cc2dd..663f831 100644 --- a/index.js +++ b/index.js @@ -8,6 +8,7 @@ const getArrayUniq = require('./src/getArrayUniq') const isEmpty = require('./src/isEmpty') const isNil = require('./src/isNil') const isPlainObject = require('./src/isPlainObject') +const isFunction = require('./src/isFunction') const merge = require('./src/merge') const omit = require('./src/omit') const omitBy = require('./src/omitBy') @@ -23,6 +24,7 @@ module.exports = { isEmpty, isNil, isPlainObject, + isFunction, merge, omit, omitBy, diff --git a/src/isFunction.js b/src/isFunction.js new file mode 100644 index 0000000..e6da723 --- /dev/null +++ b/src/isFunction.js @@ -0,0 +1,7 @@ +'use strict' + +const isPlainObject = require('./isPlainObject') + +const isFunction = (val) => !isPlainObject(val) && typeof val === 'function' + +module.exports = isFunction diff --git a/src/isPlainObject.js b/src/isPlainObject.js index e166e90..25c3b5d 100644 --- a/src/isPlainObject.js +++ b/src/isPlainObject.js @@ -1,5 +1,7 @@ 'use strict' -const isPlainObject = (val) => val !== null && typeof val === 'object' && !Array.isArray(val) +const isNil = require('./isNil') + +const isPlainObject = (val) => !isNil(val) && typeof val === 'object' && !Array.isArray(val) module.exports = isPlainObject diff --git a/test/isFunction.js b/test/isFunction.js new file mode 100644 index 0000000..f8c4a61 --- /dev/null +++ b/test/isFunction.js @@ -0,0 +1,57 @@ +'use strict' + +/* eslint-env mocha */ + +const assert = require('assert') +const { isFunction } = require('../index') + +describe('isPlainObject', () => { + it('should return true for a Function object', () => { + assert.strictEqual(isFunction(function () {}), true) + assert.strictEqual(isFunction(() => {}), true) + assert.strictEqual(isFunction(Object.keys), true) + }) + + it('should return `true` for async functions', () => { + assert.strictEqual(isFunction(async function () {}), true) + assert.strictEqual(isFunction(async () => {}), true) + }) + + it('should return `true` for generator functions', () => { + assert.strictEqual(isFunction(function * () {}), true) + }) + + it('should return `true` for the `Proxy` constructor', () => { + assert.strictEqual(isFunction(Proxy), true) + }) + + it('should return `true` for array view constructors', () => { + assert.strictEqual(isFunction(Float32Array), true) + assert.strictEqual(isFunction(Float64Array), true) + assert.strictEqual(isFunction(Int8Array), true) + assert.strictEqual(isFunction(Int16Array), true) + assert.strictEqual(isFunction(Uint8Array), true) + assert.strictEqual(isFunction(Uint8ClampedArray), true) + assert.strictEqual(isFunction(Uint16Array), true) + assert.strictEqual(isFunction(Uint32Array), true) + assert.strictEqual(isFunction(DataView), true) + }) + + it('should return `false` for non-functions', () => { + assert.strictEqual(isFunction(function () { return arguments }.apply(undefined, [1, 2, 3])), false) // eslint-disable-line no-useless-call + assert.strictEqual(isFunction([1, 2, 3]), false) + assert.strictEqual(isFunction(true), false) + assert.strictEqual(isFunction(false), false) + assert.strictEqual(isFunction(new Date()), false) + assert.strictEqual(isFunction(new Error()), false) + assert.strictEqual(isFunction({ a: 1 }), false) + assert.strictEqual(isFunction(0), false) + assert.strictEqual(isFunction(/x/), false) + assert.strictEqual(isFunction('a'), false) + assert.strictEqual(isFunction(Symbol('test')), false) + assert.strictEqual(isFunction(null), false) + assert.strictEqual(isFunction(undefined), false) + assert.strictEqual(isFunction(NaN), false) + assert.strictEqual(isFunction(''), false) + }) +}) From b14fe094b53727decbbcfa9fdff26f372af26e80 Mon Sep 17 00:00:00 2001 From: Jose Ramirez Date: Mon, 30 Oct 2023 13:17:36 +0100 Subject: [PATCH 2/4] update version --- CHANGELOG | 3 +++ index.d.ts | 1 + package.json | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 5e2b386..792cb97 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +# 1.2.2 +- feat: isFunction + # 1.2.1 - fix: merge should not throw an error with non-plain objects in sources diff --git a/index.d.ts b/index.d.ts index ad18d6a..eb10a7a 100644 --- a/index.d.ts +++ b/index.d.ts @@ -6,6 +6,7 @@ export function getArrayUniq (arr: Array): Array export function isEmpty(val: any): boolean export function isNil(val: any): boolean export function isPlainObject(val: any): boolean +export function isFunction(val: any): boolean export function merge(obj: Object, ...sources: Object[]): Object export function omit(obj: Object, keys: Array): Object export function omitBy(obj: Object, predicate: (val: any, key: string) => boolean): Object diff --git a/package.json b/package.json index 05099a4..c0ee3d7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bitfinex/lib-js-util-base", - "version": "1.2.1", + "version": "1.2.2", "description": "general utils", "main": "index.js", "scripts": { From a0a48d8fdd788d36c93756df24fa43306d6a5938 Mon Sep 17 00:00:00 2001 From: Jose Ramirez Date: Mon, 30 Oct 2023 16:12:58 +0100 Subject: [PATCH 3/4] fix from review --- CHANGELOG | 2 +- README.md | 2 +- index.d.ts | 2 +- index.js | 4 ++-- package.json | 2 +- src/isFunction.js | 4 +--- src/isPlainObject.js | 4 +--- test/isFunction.js | 2 +- 8 files changed, 9 insertions(+), 13 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 792cb97..fc84d63 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,4 @@ -# 1.2.2 +# 1.3.0 - feat: isFunction # 1.2.1 diff --git a/README.md b/README.md index 31ff24b..743302f 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,9 @@ Currently supported utils: - `getArrayHasIntersect` - checks if arrays have at least one common value - `getArrayUniq` - gets unique values form array - `isEmpty` - checks if value is an empty object, collection, map, or set +- `isFunction` - checks if input is a Function object. - `isNil` - checks whenever value is null or undefined - `isPlainObject` - checks if input is object, not null object and not array object -- `isFunction` - checks if input is a Function object. - `merge` - deep merge functionality for objects - `omit` - provides new object that omits only specific fields of source object - `omitBy` - provides new object that omits only specific fields of source object depending on predicate function filter diff --git a/index.d.ts b/index.d.ts index eb10a7a..1ce8996 100644 --- a/index.d.ts +++ b/index.d.ts @@ -4,9 +4,9 @@ export function get(obj: Object, path: string | Array, defaultV export function getArrayHasIntersect (arr1: Array, arr2: Array): boolean export function getArrayUniq (arr: Array): Array export function isEmpty(val: any): boolean +export function isFunction(val: any): boolean export function isNil(val: any): boolean export function isPlainObject(val: any): boolean -export function isFunction(val: any): boolean export function merge(obj: Object, ...sources: Object[]): Object export function omit(obj: Object, keys: Array): Object export function omitBy(obj: Object, predicate: (val: any, key: string) => boolean): Object diff --git a/index.js b/index.js index 663f831..668e48e 100644 --- a/index.js +++ b/index.js @@ -6,9 +6,9 @@ const get = require('./src/get') const getArrayHasIntersect = require('./src/getArrayHasIntersect') const getArrayUniq = require('./src/getArrayUniq') const isEmpty = require('./src/isEmpty') +const isFunction = require('./src/isFunction') const isNil = require('./src/isNil') const isPlainObject = require('./src/isPlainObject') -const isFunction = require('./src/isFunction') const merge = require('./src/merge') const omit = require('./src/omit') const omitBy = require('./src/omitBy') @@ -22,9 +22,9 @@ module.exports = { getArrayHasIntersect, getArrayUniq, isEmpty, + isFunction, isNil, isPlainObject, - isFunction, merge, omit, omitBy, diff --git a/package.json b/package.json index c0ee3d7..2c2ad37 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bitfinex/lib-js-util-base", - "version": "1.2.2", + "version": "1.3.0", "description": "general utils", "main": "index.js", "scripts": { diff --git a/src/isFunction.js b/src/isFunction.js index e6da723..07b39ad 100644 --- a/src/isFunction.js +++ b/src/isFunction.js @@ -1,7 +1,5 @@ 'use strict' -const isPlainObject = require('./isPlainObject') - -const isFunction = (val) => !isPlainObject(val) && typeof val === 'function' +const isFunction = (val) => typeof val === 'function' module.exports = isFunction diff --git a/src/isPlainObject.js b/src/isPlainObject.js index 25c3b5d..09c8a01 100644 --- a/src/isPlainObject.js +++ b/src/isPlainObject.js @@ -1,7 +1,5 @@ 'use strict' -const isNil = require('./isNil') - -const isPlainObject = (val) => !isNil(val) && typeof val === 'object' && !Array.isArray(val) +const isPlainObject = (val) => val !== null && typeof val === 'object' && !Array.isArray(val) module.exports = isPlainObject diff --git a/test/isFunction.js b/test/isFunction.js index f8c4a61..54dfb59 100644 --- a/test/isFunction.js +++ b/test/isFunction.js @@ -5,7 +5,7 @@ const assert = require('assert') const { isFunction } = require('../index') -describe('isPlainObject', () => { +describe('isFunction', () => { it('should return true for a Function object', () => { assert.strictEqual(isFunction(function () {}), true) assert.strictEqual(isFunction(() => {}), true) From 8bdb2383afb707b6fb4939270ff9b94d1ce5abaa Mon Sep 17 00:00:00 2001 From: Jose Ramirez Date: Mon, 30 Oct 2023 16:52:47 +0100 Subject: [PATCH 4/4] fix lint --- src/isPlainObject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/isPlainObject.js b/src/isPlainObject.js index 09c8a01..e166e90 100644 --- a/src/isPlainObject.js +++ b/src/isPlainObject.js @@ -1,5 +1,5 @@ 'use strict' -const isPlainObject = (val) => val !== null && typeof val === 'object' && !Array.isArray(val) +const isPlainObject = (val) => val !== null && typeof val === 'object' && !Array.isArray(val) module.exports = isPlainObject