| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- '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
- }
|