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