You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
2.8 KiB
135 lines
2.8 KiB
(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 }); |
|
|
|
})));
|
|
|