88 lines
1.5 KiB
JavaScript
88 lines
1.5 KiB
JavaScript
|
'use strict'
|
|||
|
|
|||
|
module.exports = convert
|
|||
|
|
|||
|
function convert(test) {
|
|||
|
if (typeof test === 'string') {
|
|||
|
return typeFactory(test)
|
|||
|
}
|
|||
|
|
|||
|
if (test === null || test === undefined) {
|
|||
|
return ok
|
|||
|
}
|
|||
|
|
|||
|
if (typeof test === 'object') {
|
|||
|
return ('length' in test ? anyFactory : matchesFactory)(test)
|
|||
|
}
|
|||
|
|
|||
|
if (typeof test === 'function') {
|
|||
|
return test
|
|||
|
}
|
|||
|
|
|||
|
throw new Error('Expected function, string, or object as test')
|
|||
|
}
|
|||
|
|
|||
|
function convertAll(tests) {
|
|||
|
var results = []
|
|||
|
var length = tests.length
|
|||
|
var index = -1
|
|||
|
|
|||
|
while (++index < length) {
|
|||
|
results[index] = convert(tests[index])
|
|||
|
}
|
|||
|
|
|||
|
return results
|
|||
|
}
|
|||
|
|
|||
|
// Utility assert each property in `test` is represented in `node`, and each
|
|||
|
// values are strictly equal.
|
|||
|
function matchesFactory(test) {
|
|||
|
return matches
|
|||
|
|
|||
|
function matches(node) {
|
|||
|
var key
|
|||
|
|
|||
|
for (key in test) {
|
|||
|
if (node[key] !== test[key]) {
|
|||
|
return false
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return true
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function anyFactory(tests) {
|
|||
|
var checks = convertAll(tests)
|
|||
|
var length = checks.length
|
|||
|
|
|||
|
return matches
|
|||
|
|
|||
|
function matches() {
|
|||
|
var index = -1
|
|||
|
|
|||
|
while (++index < length) {
|
|||
|
if (checks[index].apply(this, arguments)) {
|
|||
|
return true
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return false
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Utility to convert a string into a function which checks a given node’s type
|
|||
|
// for said string.
|
|||
|
function typeFactory(test) {
|
|||
|
return type
|
|||
|
|
|||
|
function type(node) {
|
|||
|
return Boolean(node && node.type === test)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Utility to return true.
|
|||
|
function ok() {
|
|||
|
return true
|
|||
|
}
|