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