Spaces:
Sleeping
Sleeping
(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 }); | |
}))); | |