123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- 'use strict'
- module.exports = {
-
- walk: function (cb) {
- return traverse(this, cb)
- },
-
- match: function (expression, cb) {
- return Array.isArray(expression)
- ? traverse(this, function (node) {
- for (var i = 0; i < expression.length; i++) {
- if (compare(expression[i], node)) return cb(node)
- }
- return node
- })
- : traverse(this, function (node) {
- if (compare(expression, node)) return cb(node)
- return node
- })
- }
- }
- function traverse (tree, cb) {
- if (Array.isArray(tree)) {
- for (var i = 0; i < tree.length; i++) {
- tree[i] = traverse(cb(tree[i]), cb)
- }
- } else if (
- tree &&
- typeof tree === 'object' &&
- tree.hasOwnProperty('content')
- ) traverse(tree.content, cb)
- return tree
- }
- function compare (expected, actual) {
- if (expected instanceof RegExp) {
- if (typeof actual === 'object') return false
- if (typeof actual === 'string') return expected.test(actual)
- }
- if (typeof expected !== typeof actual) return false
- if (typeof expected !== 'object' || expected === null) {
- return expected === actual
- }
- if (Array.isArray(expected)) {
- return expected.every(function (exp) {
- return [].some.call(actual, function (act) {
- return compare(exp, act)
- })
- })
- }
- return Object.keys(expected).every(function (key) {
- var ao = actual[key]
- var eo = expected[key]
- if (typeof eo === 'object' && eo !== null && ao !== null) {
- return compare(eo, ao)
- }
- if (typeof eo === 'boolean') {
- return eo !== (ao == null)
- }
- return ao === eo
- })
- }
|