From bbff7403fbf46f9ad92240ac213df8d30ef31b64 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Thu, 20 Sep 2018 02:56:13 +0200 Subject: update packages --- node_modules/espurify/lib/clone-ast.js | 113 +++++++++++++++++++-------------- 1 file changed, 64 insertions(+), 49 deletions(-) (limited to 'node_modules/espurify/lib/clone-ast.js') diff --git a/node_modules/espurify/lib/clone-ast.js b/node_modules/espurify/lib/clone-ast.js index f748b885d..f6804e716 100644 --- a/node_modules/espurify/lib/clone-ast.js +++ b/node_modules/espurify/lib/clone-ast.js @@ -3,67 +3,82 @@ var isArray = require('core-js/library/fn/array/is-array'); var objectKeys = require('core-js/library/fn/object/keys'); var indexOf = require('core-js/library/fn/array/index-of'); +var Map = require('core-js/library/fn/map'); var reduce = require('core-js/library/fn/array/reduce'); module.exports = function cloneWithWhitelist (astWhiteList) { - var whitelist = reduce(objectKeys(astWhiteList), function (props, key) { - var propNames = astWhiteList[key]; - var prepend = (indexOf(propNames, 'type') === -1) ? ['type'] : []; - props[key] = prepend.concat(propNames); - return props; - }, {}); + var whitelist = reduce(objectKeys(astWhiteList), function (props, key) { + var propNames = astWhiteList[key]; + var prepend = (indexOf(propNames, 'type') === -1) ? ['type'] : []; + props[key] = prepend.concat(propNames || []); + return props; + }, {}); - function cloneNodeOrObject (obj) { - var props = obj.type ? whitelist[obj.type] : null; - if (props) { - return cloneNode(obj, props); - } else { - return cloneObject(obj); - } + function cloneNodeOrObject (obj, seen) { + var props = obj.type ? whitelist[obj.type] : null; + if (props) { + return cloneNode(obj, props, seen); + } else { + return cloneObject(obj, seen); } + } - function cloneArray (ary) { - var i = ary.length, clone = []; - while (i--) { - clone[i] = cloneOf(ary[i]); - } - return clone; + function cloneArray (ary, seen) { + var i = ary.length; + var clone = []; + while (i--) { + clone[i] = cloneOf(ary[i], seen); } + return clone; + } - function cloneNode (node, props) { - var i, len, key, clone = {}; - for (i = 0, len = props.length; i < len; i += 1) { - key = props[i]; - if (node.hasOwnProperty(key)) { - clone[key] = cloneOf(node[key]); - } - } - return clone; + function cloneNode (node, props, seen) { + var i, len, key; + var clone = {}; + for (i = 0, len = props.length; i < len; i += 1) { + key = props[i]; + if (node.hasOwnProperty(key)) { + clone[key] = cloneOf(node[key], seen); + } } + return clone; + } - function cloneObject (obj) { - var props = objectKeys(obj); - var i, len, key, clone = {}; - for (i = 0, len = props.length; i < len; i += 1) { - key = props[i]; - clone[key] = cloneOf(obj[key]); - } - return clone; + function cloneObject (obj, seen) { + var props = objectKeys(obj); + var i, len, key, value; + var clone = {}; + for (i = 0, len = props.length; i < len; i += 1) { + key = props[i]; + value = obj[key]; + if (seen.has(value)) { + continue; + } + clone[key] = cloneOf(value, seen); } + return clone; + } - function cloneOf (val) { - if (typeof val === 'object' && val !== null) { - if (val instanceof RegExp) { - return new RegExp(val); - } else if (isArray(val)) { - return cloneArray(val); - } else { - return cloneNodeOrObject(val); - } - } else { - return val; - } + function cloneOf (val, seen) { + if (typeof val === 'object' && val !== null) { + seen.set(val, true); + if (val instanceof RegExp) { + return new RegExp(val); + } else if (isArray(val)) { + return cloneArray(val, seen); + } else { + return cloneNodeOrObject(val, seen); + } + } else { + return val; } + } - return cloneNodeOrObject; + function cloneRoot (obj) { + var seen = new Map(); + seen.set(obj, true); + return cloneNodeOrObject(obj, seen); + } + + return cloneRoot; }; -- cgit v1.2.3