Befor generating
This commit is contained in:
+135
@@ -0,0 +1,135 @@
|
||||
(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 });
|
||||
|
||||
})));
|
||||
Reference in New Issue
Block a user