UNPKG

@deps/traverse

Version:

A Traverser library for object.

129 lines 4.34 kB
"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