You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.3 KiB
77 lines
1.3 KiB
'use strict' |
|
|
|
module.exports = convert |
|
|
|
function convert(test) { |
|
if (test == null) { |
|
return ok |
|
} |
|
|
|
if (typeof test === 'string') { |
|
return typeFactory(test) |
|
} |
|
|
|
if (typeof test === 'object') { |
|
return 'length' in test ? anyFactory(test) : allFactory(test) |
|
} |
|
|
|
if (typeof test === 'function') { |
|
return test |
|
} |
|
|
|
throw new Error('Expected function, string, or object as test') |
|
} |
|
|
|
// Utility assert each property in `test` is represented in `node`, and each |
|
// values are strictly equal. |
|
function allFactory(test) { |
|
return all |
|
|
|
function all(node) { |
|
var key |
|
|
|
for (key in test) { |
|
if (node[key] !== test[key]) return false |
|
} |
|
|
|
return true |
|
} |
|
} |
|
|
|
function anyFactory(tests) { |
|
var checks = [] |
|
var index = -1 |
|
|
|
while (++index < tests.length) { |
|
checks[index] = convert(tests[index]) |
|
} |
|
|
|
return any |
|
|
|
function any() { |
|
var index = -1 |
|
|
|
while (++index < checks.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 |
|
}
|
|
|