@deps/traverse
Version:
A Traverser library for object.
129 lines • 4.34 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var createContexts = function () {
var state = {};
var context = {
skip: function () {
state.shouldSkip = true;
},
remove: function () {
state.shouldRemove = true;
},
replace: function (node) {
state.replacementNode = node;
}
};
return {
state: state,
context: context
};
};
exports.createTraverser = function (options) {
var nodePredicate = (options && options.nodePredicate) ||
function () {
return true;
};
var replace = function (parent, prop, index, node) {
if (parent && prop) {
if (index !== undefined) {
parent[prop][index] = node;
}
else {
parent[prop] = node;
}
}
};
var remove = function (parent, prop, index) {
if (parent && prop) {
if (index !== undefined) {
parent[prop].splice(index, 1);
}
else {
delete parent[prop];
}
}
};
var visit = function (_a) {
var node = _a.node, parent = _a.parent, prop = _a.prop, index = _a.index, enter = _a.enter, leave = _a.leave;
if (node) {
var _b = createContexts(), context_1 = _b.context, state = _b.state;
if (enter) {
enter({
node: node,
parent: parent,
context: context_1,
prop: prop,
index: index
});
if (state.replacementNode) {
replace(parent, prop, index, state.replacementNode);
}
if (state.shouldRemove) {
remove(parent, prop, index);
}
if (state.shouldSkip) {
return node;
}
if (state.shouldRemove) {
return null;
}
}
var keys = Object.keys(node);
for (var index_1 = 0; index_1 < keys.length; index_1++) {
var key = keys[index_1];
var value = node[key];
if (typeof value !== "object") {
continue;
}
else if (Array.isArray(value)) {
for (var i = 0; i < value.length; i += 1) {
if (value[i] !== null && nodePredicate(value[i])) {
if (!visit({
node: value[i],
parent: node,
enter: enter,
leave: leave,
prop: key,
index: i
})) {
// removed
i--;
}
}
}
}
else if (value !== null && nodePredicate(value)) {
visit({
node: value,
parent: node,
enter: enter,
leave: leave,
prop: key,
index: undefined
});
}
}
if (leave) {
var _c = createContexts(), context_2 = _c.context, state_1 = _c.state;
leave({ context: context_2, node: node, parent: parent, prop: prop, index: index });
if (state_1.replacementNode) {
replace(parent, prop, index, state_1.replacementNode);
}
if (state_1.shouldRemove) {
remove(parent, prop, index);
}
if (state_1.shouldRemove) {
return null;
}
}
}
return node;
};
return {
visit: function (node, _a) {
var enter = _a.enter, leave = _a.leave;
return visit({ node: node, parent: null, enter: enter, leave: leave });
}
};
};
//# sourceMappingURL=Walker.js.map