| 'use strict'; |
| exports.__esModule = true; |
| |
| exports.default = function visit(node, keys, visitorSpec) { |
| if (!node || !keys) { |
| return; |
| } |
| const type = node.type; |
| if (typeof visitorSpec[type] === 'function') { |
| visitorSpec[type](node); |
| } |
| const childFields = keys[type]; |
| if (!childFields) { |
| return; |
| } |
| childFields.forEach((fieldName) => { |
| [].concat(node[fieldName]).forEach((item) => { |
| visit(item, keys, visitorSpec); |
| }); |
| }); |
| if (typeof visitorSpec[`${type}:Exit`] === 'function') { |
| visitorSpec[`${type}:Exit`](node); |
| } |
| }; |