UNPKG

@feugene/mu

Version:

Helpful TS utilities without dependencies

73 lines (61 loc) 1.78 kB
const symToStringTag = Symbol.toStringTag const asyncTag = '[object AsyncFunction]', funcTag = '[object Function]', genTag = '[object GeneratorFunction]', nullTag = '[object Null]', proxyTag = '[object Proxy]', undefinedTag = '[object Undefined]' /** * This function evaluates whether all parameters are function */ export function isFunctions(...parameters: any[]): boolean { if (parameters.length === 0) { throw new Error('Please provide at least one number to evaluate isInteger.') } const invalid = parameters.some(parameter => !isFunction(parameter)) return !invalid } export default function isFunction(parameter: any): boolean { const tag = baseGetTag(parameter) return tag === funcTag || tag === genTag || tag === asyncTag || tag === proxyTag } /** * The base implementation of `getTag` without fallbacks for buggy environments. * * @private */ function baseGetTag(value: any): string { if (value == null) { return value === undefined ? undefinedTag : nullTag } return symToStringTag in new Object(value) ? getRawTag(value) : objectToString(value) } /** * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. * * @private */ function getRawTag(value: any): string { const isOwn = Object.prototype.hasOwnProperty.call(value, symToStringTag) const tag = value[symToStringTag] let unmasked = false try { value[symToStringTag] = undefined unmasked = true } catch (error) {} const result = objectToString(value) if (unmasked) { if (isOwn) { value[symToStringTag] = tag } else { delete value[symToStringTag] } } return result } /** * @private */ function objectToString(value: any): string { return Object.prototype.toString.call(value) }