source: node_modules/@swagger-api/apidom-core/es/clone/index.mjs

main
Last change on this file was d24f17c, checked in by Aleksandar Panovski <apano77@…>, 15 months ago

Initial commit

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