visit.js 672 B

123456789101112131415161718192021222324252627282930
  1. 'use strict';
  2. exports.__esModule = true;
  3. /** @type {import('./visit').default} */
  4. exports.default = function visit(node, keys, visitorSpec) {
  5. if (!node || !keys) {
  6. return;
  7. }
  8. const type = node.type;
  9. const visitor = visitorSpec[type];
  10. if (typeof visitor === 'function') {
  11. visitor(node);
  12. }
  13. const childFields = keys[type];
  14. if (!childFields) {
  15. return;
  16. }
  17. childFields.forEach((fieldName) => {
  18. // @ts-expect-error TS sucks with concat
  19. [].concat(node[fieldName]).forEach((item) => {
  20. visit(item, keys, visitorSpec);
  21. });
  22. });
  23. const exit = visitorSpec[`${type}:Exit`];
  24. if (typeof exit === 'function') {
  25. exit(node);
  26. }
  27. };