aboutsummaryrefslogtreecommitdiff
path: root/node_modules/espurify/lib/clone-ast.js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2018-09-20 02:56:13 +0200
committerFlorian Dold <florian.dold@gmail.com>2018-09-20 02:56:13 +0200
commitbbff7403fbf46f9ad92240ac213df8d30ef31b64 (patch)
treec58400ec5124da1c7d56b01aea83309f80a56c3b /node_modules/espurify/lib/clone-ast.js
parent003fb34971cf63466184351b4db5f7c67df4f444 (diff)
update packages
Diffstat (limited to 'node_modules/espurify/lib/clone-ast.js')
-rw-r--r--node_modules/espurify/lib/clone-ast.js113
1 files changed, 64 insertions, 49 deletions
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;
};