(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (factory((global.estreeWalker = {}))); }(this, (function (exports) { 'use strict'; function walk(ast, { enter, leave }) { return visit(ast, null, enter, leave); } let should_skip = false; let should_remove = false; let replacement = null; const context = { skip: () => should_skip = true, remove: () => should_remove = true, replace: (node) => replacement = node }; function replace(parent, prop, index, node) { if (parent) { if (index !== null) { parent[prop][index] = node; } else { parent[prop] = node; } } } function remove(parent, prop, index) { if (parent) { if (index !== null) { parent[prop].splice(index, 1); } else { delete parent[prop]; } } } function visit( node, parent, enter, leave, prop, index ) { if (node) { if (enter) { const _should_skip = should_skip; const _should_remove = should_remove; const _replacement = replacement; should_skip = false; should_remove = false; replacement = null; enter.call(context, node, parent, prop, index); if (replacement) { node = replacement; replace(parent, prop, index, node); } if (should_remove) { remove(parent, prop, index); } const skipped = should_skip; const removed = should_remove; should_skip = _should_skip; should_remove = _should_remove; replacement = _replacement; if (skipped) return node; if (removed) return null; } for (const key in node) { const value = (node )[key]; if (typeof value !== 'object') { continue; } else if (Array.isArray(value)) { for (let j = 0, k = 0; j < value.length; j += 1, k += 1) { if (value[j] !== null && typeof value[j].type === 'string') { if (!visit(value[j], node, enter, leave, key, k)) { // removed j--; } } } } else if (value !== null && typeof value.type === 'string') { visit(value, node, enter, leave, key, null); } } if (leave) { const _replacement = replacement; const _should_remove = should_remove; replacement = null; should_remove = false; leave.call(context, node, parent, prop, index); if (replacement) { node = replacement; replace(parent, prop, index, node); } if (should_remove) { remove(parent, prop, index); } const removed = should_remove; replacement = _replacement; should_remove = _should_remove; if (removed) return null; } } return node; } exports.walk = walk; Object.defineProperty(exports, '__esModule', { value: true }); })));