is-instance-of
Version:
Like instanceof, but uses class name strings.
29 lines (26 loc) • 1.03 kB
JavaScript
const arrify = require('arrify')
const classChain = require('class-chain')
const caseInsensitive = require('case-insensitive')
const flatten = require('@lamansky/flatten')
const isFunc = x => typeof x === 'function'
const isObject = require('is-obj')
const qfn = require('qfn')
const sbo = require('sbo')
module.exports = sbo(function isInstanceOf (x, classes, {ci = false} = {}) {
if (!isObject(x)) return false
ci = qfn(caseInsensitive, ci)
const actualClassNames = ci(classChain.names(x))
return flatten(arrify(classes)).some(cls => {
switch (typeof cls) {
case 'function':
if (!isFunc(x) && cls === Array) return Array.isArray(x)
return ((x instanceof cls) || (cls.name && actualClassNames.includes(cls.name)))
case 'string':
if (!isFunc(x) && ci('Array') === cls) return Array.isArray(x)
return actualClassNames.includes(cls)
case 'undefined': return false
default: throw new TypeError('Class must be a function or a name string')
}
})
})