@@ -165037,3 +165037,338 @@ void (function(root, factory) {
165037165037 return resolveUrl
165038165038
165039165039}));
165040+
165041+ (function (root, factory) {
165042+ if (typeof define === 'function' && define.amd) {
165043+ // AMD. Register as an anonymous module.
165044+ define([], factory);
165045+ } else if (typeof exports === 'object') {
165046+ // Node. Does not work with strict CommonJS, but
165047+ // only CommonJS-like environments that support module.exports,
165048+ // like Node.
165049+ module.exports = factory();
165050+ } else {
165051+ // Browser globals (root is window)
165052+ root.traverse = factory();
165053+ }
165054+ }(this, function () {
165055+
165056+ var traverse = function (obj) {
165057+ return new Traverse(obj);
165058+ };
165059+
165060+ function Traverse (obj) {
165061+ this.value = obj;
165062+ }
165063+
165064+ Traverse.prototype.get = function (ps) {
165065+ var node = this.value;
165066+ for (var i = 0; i < ps.length; i ++) {
165067+ var key = ps[i];
165068+ if (!node || !hasOwnProperty.call(node, key)) {
165069+ node = undefined;
165070+ break;
165071+ }
165072+ node = node[key];
165073+ }
165074+ return node;
165075+ };
165076+
165077+ Traverse.prototype.has = function (ps) {
165078+ var node = this.value;
165079+ for (var i = 0; i < ps.length; i ++) {
165080+ var key = ps[i];
165081+ if (!node || !hasOwnProperty.call(node, key)) {
165082+ return false;
165083+ }
165084+ node = node[key];
165085+ }
165086+ return true;
165087+ };
165088+
165089+ Traverse.prototype.set = function (ps, value) {
165090+ var node = this.value;
165091+ for (var i = 0; i < ps.length - 1; i ++) {
165092+ var key = ps[i];
165093+ if (!hasOwnProperty.call(node, key)) node[key] = {};
165094+ node = node[key];
165095+ }
165096+ node[ps[i]] = value;
165097+ return value;
165098+ };
165099+
165100+ Traverse.prototype.map = function (cb) {
165101+ return walk(this.value, cb, true);
165102+ };
165103+
165104+ Traverse.prototype.forEach = function (cb) {
165105+ this.value = walk(this.value, cb, false);
165106+ return this.value;
165107+ };
165108+
165109+ Traverse.prototype.reduce = function (cb, init) {
165110+ var skip = arguments.length === 1;
165111+ var acc = skip ? this.value : init;
165112+ this.forEach(function (x) {
165113+ if (!this.isRoot || !skip) {
165114+ acc = cb.call(this, acc, x);
165115+ }
165116+ });
165117+ return acc;
165118+ };
165119+
165120+ Traverse.prototype.paths = function () {
165121+ var acc = [];
165122+ this.forEach(function (x) {
165123+ acc.push(this.path);
165124+ });
165125+ return acc;
165126+ };
165127+
165128+ Traverse.prototype.nodes = function () {
165129+ var acc = [];
165130+ this.forEach(function (x) {
165131+ acc.push(this.node);
165132+ });
165133+ return acc;
165134+ };
165135+
165136+ Traverse.prototype.clone = function () {
165137+ var parents = [], nodes = [];
165138+
165139+ return (function clone (src) {
165140+ for (var i = 0; i < parents.length; i++) {
165141+ if (parents[i] === src) {
165142+ return nodes[i];
165143+ }
165144+ }
165145+
165146+ if (typeof src === 'object' && src !== null) {
165147+ var dst = copy(src);
165148+
165149+ parents.push(src);
165150+ nodes.push(dst);
165151+
165152+ forEach(objectKeys(src), function (key) {
165153+ dst[key] = clone(src[key]);
165154+ });
165155+
165156+ parents.pop();
165157+ nodes.pop();
165158+ return dst;
165159+ }
165160+ else {
165161+ return src;
165162+ }
165163+ })(this.value);
165164+ };
165165+
165166+ function walk (root, cb, immutable) {
165167+ var path = [];
165168+ var parents = [];
165169+ var alive = true;
165170+
165171+ return (function walker (node_) {
165172+ var node = immutable ? copy(node_) : node_;
165173+ var modifiers = {};
165174+
165175+ var keepGoing = true;
165176+
165177+ var state = {
165178+ node : node,
165179+ node_ : node_,
165180+ path : [].concat(path),
165181+ parent : parents[parents.length - 1],
165182+ parents : parents,
165183+ key : path.slice(-1)[0],
165184+ isRoot : path.length === 0,
165185+ level : path.length,
165186+ circular : null,
165187+ update : function (x, stopHere) {
165188+ if (!state.isRoot) {
165189+ state.parent.node[state.key] = x;
165190+ }
165191+ state.node = x;
165192+ if (stopHere) keepGoing = false;
165193+ },
165194+ 'delete' : function (stopHere) {
165195+ delete state.parent.node[state.key];
165196+ if (stopHere) keepGoing = false;
165197+ },
165198+ remove : function (stopHere) {
165199+ if (isArray(state.parent.node)) {
165200+ state.parent.node.splice(state.key, 1);
165201+ }
165202+ else {
165203+ delete state.parent.node[state.key];
165204+ }
165205+ if (stopHere) keepGoing = false;
165206+ },
165207+ keys : null,
165208+ before : function (f) { modifiers.before = f },
165209+ after : function (f) { modifiers.after = f },
165210+ pre : function (f) { modifiers.pre = f },
165211+ post : function (f) { modifiers.post = f },
165212+ stop : function () { alive = false },
165213+ block : function () { keepGoing = false }
165214+ };
165215+
165216+ if (!alive) return state;
165217+
165218+ function updateState() {
165219+ if (typeof state.node === 'object' && state.node !== null) {
165220+ if (!state.keys || state.node_ !== state.node) {
165221+ state.keys = objectKeys(state.node)
165222+ }
165223+
165224+ state.isLeaf = state.keys.length == 0;
165225+
165226+ for (var i = 0; i < parents.length; i++) {
165227+ if (parents[i].node_ === node_) {
165228+ state.circular = parents[i];
165229+ break;
165230+ }
165231+ }
165232+ }
165233+ else {
165234+ state.isLeaf = true;
165235+ state.keys = null;
165236+ }
165237+
165238+ state.notLeaf = !state.isLeaf;
165239+ state.notRoot = !state.isRoot;
165240+ }
165241+
165242+ updateState();
165243+
165244+ // use return values to update if defined
165245+ var ret = cb.call(state, state.node);
165246+ if (ret !== undefined && state.update) state.update(ret);
165247+
165248+ if (modifiers.before) modifiers.before.call(state, state.node);
165249+
165250+ if (!keepGoing) return state;
165251+
165252+ if (typeof state.node == 'object'
165253+ && state.node !== null && !state.circular) {
165254+ parents.push(state);
165255+
165256+ updateState();
165257+
165258+ forEach(state.keys, function (key, i) {
165259+ path.push(key);
165260+
165261+ if (modifiers.pre) modifiers.pre.call(state, state.node[key], key);
165262+
165263+ var child = walker(state.node[key]);
165264+ if (immutable && hasOwnProperty.call(state.node, key)) {
165265+ state.node[key] = child.node;
165266+ }
165267+
165268+ child.isLast = i == state.keys.length - 1;
165269+ child.isFirst = i == 0;
165270+
165271+ if (modifiers.post) modifiers.post.call(state, child);
165272+
165273+ path.pop();
165274+ });
165275+ parents.pop();
165276+ }
165277+
165278+ if (modifiers.after) modifiers.after.call(state, state.node);
165279+
165280+ return state;
165281+ })(root).node;
165282+ }
165283+
165284+ function copy (src) {
165285+ if (typeof src === 'object' && src !== null) {
165286+ var dst;
165287+
165288+ if (isArray(src)) {
165289+ dst = [];
165290+ }
165291+ else if (isDate(src)) {
165292+ dst = new Date(src.getTime ? src.getTime() : src);
165293+ }
165294+ else if (isRegExp(src)) {
165295+ dst = new RegExp(src);
165296+ }
165297+ else if (isError(src)) {
165298+ dst = { message: src.message };
165299+ }
165300+ else if (isBoolean(src)) {
165301+ dst = new Boolean(src);
165302+ }
165303+ else if (isNumber(src)) {
165304+ dst = new Number(src);
165305+ }
165306+ else if (isString(src)) {
165307+ dst = new String(src);
165308+ }
165309+ else if (Object.create && Object.getPrototypeOf) {
165310+ dst = Object.create(Object.getPrototypeOf(src));
165311+ }
165312+ else if (src.constructor === Object) {
165313+ dst = {};
165314+ }
165315+ else {
165316+ var proto =
165317+ (src.constructor && src.constructor.prototype)
165318+ || src.__proto__
165319+ || {}
165320+ ;
165321+ var T = function () {};
165322+ T.prototype = proto;
165323+ dst = new T;
165324+ }
165325+
165326+ forEach(objectKeys(src), function (key) {
165327+ dst[key] = src[key];
165328+ });
165329+ return dst;
165330+ }
165331+ else return src;
165332+ }
165333+
165334+ var objectKeys = Object.keys || function keys (obj) {
165335+ var res = [];
165336+ for (var key in obj) res.push(key)
165337+ return res;
165338+ };
165339+
165340+ function toS (obj) { return Object.prototype.toString.call(obj) }
165341+ function isDate (obj) { return toS(obj) === '[object Date]' }
165342+ function isRegExp (obj) { return toS(obj) === '[object RegExp]' }
165343+ function isError (obj) { return toS(obj) === '[object Error]' }
165344+ function isBoolean (obj) { return toS(obj) === '[object Boolean]' }
165345+ function isNumber (obj) { return toS(obj) === '[object Number]' }
165346+ function isString (obj) { return toS(obj) === '[object String]' }
165347+
165348+ var isArray = Array.isArray || function isArray (xs) {
165349+ return Object.prototype.toString.call(xs) === '[object Array]';
165350+ };
165351+
165352+ var forEach = function (xs, fn) {
165353+ if (xs.forEach) return xs.forEach(fn)
165354+ else for (var i = 0; i < xs.length; i++) {
165355+ fn(xs[i], i, xs);
165356+ }
165357+ };
165358+
165359+ forEach(objectKeys(Traverse.prototype), function (key) {
165360+ traverse[key] = function (obj) {
165361+ var args = [].slice.call(arguments, 1);
165362+ var t = new Traverse(obj);
165363+ return t[key].apply(t, args);
165364+ };
165365+ });
165366+
165367+ var hasOwnProperty = Object.hasOwnProperty || function (obj, key) {
165368+ return key in obj;
165369+ };
165370+
165371+ return traverse
165372+
165373+
165374+ }));
0 commit comments