38 lines
948 B
JavaScript
38 lines
948 B
JavaScript
'use strict'
|
|
|
|
var convert = require('./convert')
|
|
|
|
module.exports = is
|
|
|
|
is.convert = convert
|
|
|
|
// Assert if `test` passes for `node`.
|
|
// When a `parent` node is known the `index` of node should also be given.
|
|
// eslint-disable-next-line max-params
|
|
function is(node, test, index, parent, context) {
|
|
var hasParent = parent !== null && parent !== undefined
|
|
var hasIndex = index !== null && index !== undefined
|
|
var check = convert(test)
|
|
|
|
if (
|
|
hasIndex &&
|
|
(typeof index !== 'number' || index < 0 || index === Infinity)
|
|
) {
|
|
throw new Error('Expected positive finite index or child node')
|
|
}
|
|
|
|
if (hasParent && (!is(parent) || !parent.children)) {
|
|
throw new Error('Expected parent node')
|
|
}
|
|
|
|
if (!node || !node.type || typeof node.type !== 'string') {
|
|
return false
|
|
}
|
|
|
|
if (hasParent !== hasIndex) {
|
|
throw new Error('Expected both parent and index')
|
|
}
|
|
|
|
return Boolean(check.call(context, node, index, parent))
|
|
}
|