1 | "use strict";
|
---|
2 |
|
---|
3 | var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
---|
4 | exports.__esModule = true;
|
---|
5 | exports.cloneShallow = exports.cloneDeep = void 0;
|
---|
6 | var _minim = require("minim");
|
---|
7 | var _index = require("../predicates/index.cjs");
|
---|
8 | var _DeepCloneError = _interopRequireDefault(require("./errors/DeepCloneError.cjs"));
|
---|
9 | var _ShallowCloneError = _interopRequireDefault(require("./errors/ShallowCloneError.cjs"));
|
---|
10 | const cloneDeep = (value, options = {}) => {
|
---|
11 | const {
|
---|
12 | visited = new WeakMap()
|
---|
13 | } = options;
|
---|
14 | const passThroughOptions = {
|
---|
15 | ...options,
|
---|
16 | visited
|
---|
17 | };
|
---|
18 |
|
---|
19 | // detect cycle and return memoized value
|
---|
20 | if (visited.has(value)) {
|
---|
21 | return visited.get(value);
|
---|
22 | }
|
---|
23 | if (value instanceof _minim.KeyValuePair) {
|
---|
24 | const {
|
---|
25 | key,
|
---|
26 | value: val
|
---|
27 | } = value;
|
---|
28 | const keyCopy = (0, _index.isElement)(key) ? cloneDeep(key, passThroughOptions) : key;
|
---|
29 | const valueCopy = (0, _index.isElement)(val) ? cloneDeep(val, passThroughOptions) : val;
|
---|
30 | const copy = new _minim.KeyValuePair(keyCopy, valueCopy);
|
---|
31 | visited.set(value, copy);
|
---|
32 | return copy;
|
---|
33 | }
|
---|
34 | if (value instanceof _minim.ObjectSlice) {
|
---|
35 | const mapper = element => cloneDeep(element, passThroughOptions);
|
---|
36 | const items = [...value].map(mapper);
|
---|
37 | const copy = new _minim.ObjectSlice(items);
|
---|
38 | visited.set(value, copy);
|
---|
39 | return copy;
|
---|
40 | }
|
---|
41 | if (value instanceof _minim.ArraySlice) {
|
---|
42 | const mapper = element => cloneDeep(element, passThroughOptions);
|
---|
43 | const items = [...value].map(mapper);
|
---|
44 | const copy = new _minim.ArraySlice(items);
|
---|
45 | visited.set(value, copy);
|
---|
46 | return copy;
|
---|
47 | }
|
---|
48 | if ((0, _index.isElement)(value)) {
|
---|
49 | const copy = cloneShallow(value); // eslint-disable-line @typescript-eslint/no-use-before-define
|
---|
50 |
|
---|
51 | visited.set(value, copy);
|
---|
52 | if (value.content) {
|
---|
53 | if ((0, _index.isElement)(value.content)) {
|
---|
54 | copy.content = cloneDeep(value.content, passThroughOptions);
|
---|
55 | } else if (value.content instanceof _minim.KeyValuePair) {
|
---|
56 | copy.content = cloneDeep(value.content, passThroughOptions);
|
---|
57 | } else if (Array.isArray(value.content)) {
|
---|
58 | const mapper = element => cloneDeep(element, passThroughOptions);
|
---|
59 | copy.content = value.content.map(mapper);
|
---|
60 | } else {
|
---|
61 | copy.content = value.content;
|
---|
62 | }
|
---|
63 | } else {
|
---|
64 | copy.content = value.content;
|
---|
65 | }
|
---|
66 | return copy;
|
---|
67 | }
|
---|
68 | throw new _DeepCloneError.default("Value provided to cloneDeep function couldn't be cloned", {
|
---|
69 | value
|
---|
70 | });
|
---|
71 | };
|
---|
72 | exports.cloneDeep = cloneDeep;
|
---|
73 | cloneDeep.safe = value => {
|
---|
74 | try {
|
---|
75 | return cloneDeep(value);
|
---|
76 | } catch {
|
---|
77 | return value;
|
---|
78 | }
|
---|
79 | };
|
---|
80 | const cloneShallowKeyValuePair = keyValuePair => {
|
---|
81 | const {
|
---|
82 | key,
|
---|
83 | value
|
---|
84 | } = keyValuePair;
|
---|
85 | return new _minim.KeyValuePair(key, value);
|
---|
86 | };
|
---|
87 | const cloneShallowArraySlice = arraySlice => {
|
---|
88 | const items = [...arraySlice];
|
---|
89 | return new _minim.ArraySlice(items);
|
---|
90 | };
|
---|
91 | const cloneShallowObjectSlice = objectSlice => {
|
---|
92 | const items = [...objectSlice];
|
---|
93 | return new _minim.ObjectSlice(items);
|
---|
94 | };
|
---|
95 |
|
---|
96 | /* eslint-disable no-underscore-dangle */
|
---|
97 | const cloneShallowElement = element => {
|
---|
98 | // @ts-ignore
|
---|
99 | const copy = new element.constructor();
|
---|
100 | copy.element = element.element;
|
---|
101 | if (element.meta.length > 0) {
|
---|
102 | copy._meta = cloneDeep(element.meta);
|
---|
103 | }
|
---|
104 | if (element.attributes.length > 0) {
|
---|
105 | copy._attributes = cloneDeep(element.attributes);
|
---|
106 | }
|
---|
107 | if ((0, _index.isElement)(element.content)) {
|
---|
108 | const content = element.content;
|
---|
109 | copy.content = cloneShallowElement(content);
|
---|
110 | } else if (Array.isArray(element.content)) {
|
---|
111 | copy.content = [...element.content];
|
---|
112 | } else if (element.content instanceof _minim.KeyValuePair) {
|
---|
113 | copy.content = cloneShallowKeyValuePair(element.content);
|
---|
114 | } else {
|
---|
115 | copy.content = element.content;
|
---|
116 | }
|
---|
117 | return copy;
|
---|
118 | };
|
---|
119 | /* eslint-enable */
|
---|
120 |
|
---|
121 | const cloneShallow = value => {
|
---|
122 | if (value instanceof _minim.KeyValuePair) {
|
---|
123 | return cloneShallowKeyValuePair(value);
|
---|
124 | }
|
---|
125 | if (value instanceof _minim.ObjectSlice) {
|
---|
126 | return cloneShallowObjectSlice(value);
|
---|
127 | }
|
---|
128 | if (value instanceof _minim.ArraySlice) {
|
---|
129 | return cloneShallowArraySlice(value);
|
---|
130 | }
|
---|
131 | if ((0, _index.isElement)(value)) {
|
---|
132 | return cloneShallowElement(value);
|
---|
133 | }
|
---|
134 | throw new _ShallowCloneError.default("Value provided to cloneShallow function couldn't be cloned", {
|
---|
135 | value
|
---|
136 | });
|
---|
137 | };
|
---|
138 | exports.cloneShallow = cloneShallow;
|
---|
139 | cloneShallow.safe = value => {
|
---|
140 | try {
|
---|
141 | return cloneShallow(value);
|
---|
142 | } catch {
|
---|
143 | return value;
|
---|
144 | }
|
---|
145 | }; |
---|