| 'use strict'; |
| |
| exports.__esModule = true; |
| |
| /** @type {import('./visit').default} */ |
| exports.default = function visit(node, keys, visitorSpec) { |
| if (!node || !keys) { |
| return; |
| } |
| const type = node.type; |
| const visitor = visitorSpec[type]; |
| if (typeof visitor === 'function') { |
| visitor(node); |
| } |
| const childFields = keys[type]; |
| if (!childFields) { |
| return; |
| } |
| childFields.forEach((fieldName) => { |
| // @ts-expect-error TS sucks with concat |
| [].concat(node[fieldName]).forEach((item) => { |
| visit(item, keys, visitorSpec); |
| }); |
| }); |
| |
| const exit = visitorSpec[`${type}:Exit`]; |
| if (typeof exit === 'function') { |
| exit(node); |
| } |
| }; |