@swagger-api/apidom-core 0.78.0 → 0.80.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,18 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [0.80.0](https://github.com/swagger-api/apidom/compare/v0.79.0...v0.80.0) (2023-10-26)
7
+
8
+ ### Features
9
+
10
+ - **core:** support cycles in deep cloning ([#3322](https://github.com/swagger-api/apidom/issues/3322)) ([a9ba0a5](https://github.com/swagger-api/apidom/commit/a9ba0a5e2ad04395682cd9e7bb2feea2e4473fe3)), closes [#3290](https://github.com/swagger-api/apidom/issues/3290)
11
+
12
+ # [0.79.0](https://github.com/swagger-api/apidom/compare/v0.78.0...v0.79.0) (2023-10-24)
13
+
14
+ ### Features
15
+
16
+ - **predicates:** implement TypeScript type guards ([#3289](https://github.com/swagger-api/apidom/issues/3289)) ([0cae70a](https://github.com/swagger-api/apidom/commit/0cae70aa3edc17ecc628c21e30a6b2ac1e992372)), closes [#3280](https://github.com/swagger-api/apidom/issues/3280)
17
+
6
18
  # [0.78.0](https://github.com/swagger-api/apidom/compare/v0.77.0...v0.78.0) (2023-10-17)
7
19
 
8
20
  ### Bug Fixes
@@ -3,5 +3,12 @@
3
3
  exports.__esModule = true;
4
4
  exports.default = void 0;
5
5
  var _apidomError = require("@swagger-api/apidom-error");
6
- class CloneError extends _apidomError.ApiDOMStructuredError {}
6
+ class CloneError extends _apidomError.ApiDOMStructuredError {
7
+ constructor(message, structuredOptions) {
8
+ super(message, structuredOptions);
9
+ if (typeof structuredOptions !== 'undefined') {
10
+ this.value = structuredOptions.source;
11
+ }
12
+ }
13
+ }
7
14
  var _default = exports.default = CloneError;
@@ -7,23 +7,63 @@ var _minim = require("minim");
7
7
  var _index = require("../predicates/index.cjs");
8
8
  var _DeepCloneError = _interopRequireDefault(require("./errors/DeepCloneError.cjs"));
9
9
  var _ShallowCloneError = _interopRequireDefault(require("./errors/ShallowCloneError.cjs"));
10
- const invokeClone = value => {
11
- if (typeof (value == null ? void 0 : value.clone) === 'function') {
12
- return value.clone();
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;
13
33
  }
14
- return value;
15
- };
16
- const cloneDeep = value => {
17
34
  if (value instanceof _minim.ObjectSlice) {
18
- const items = [...value].map(invokeClone);
19
- return new _minim.ObjectSlice(items);
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;
20
40
  }
21
41
  if (value instanceof _minim.ArraySlice) {
22
- const items = [...value].map(invokeClone);
23
- return new _minim.ArraySlice(items);
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;
24
47
  }
25
- if (typeof (value == null ? void 0 : value.clone) === 'function') {
26
- return value.clone();
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;
27
67
  }
28
68
  throw new _DeepCloneError.default("Value provided to cloneDeep function couldn't be cloned", {
29
69
  value
package/cjs/deepmerge.cjs CHANGED
@@ -79,7 +79,7 @@ function deepmerge(targetElement, sourceElement, options) {
79
79
  }
80
80
  deepmerge.all = (list, options) => {
81
81
  if (!Array.isArray(list)) {
82
- throw new TypeError('First argument should be an array.');
82
+ throw new TypeError('First argument of deepmerge should be an array.');
83
83
  }
84
84
  if (list.length === 0) {
85
85
  return new _minim.ObjectElement();
@@ -2,17 +2,25 @@
2
2
 
3
3
  exports.__esModule = true;
4
4
  exports.isElementType = exports.default = void 0;
5
- const hasMethod = (name, obj) => typeof (obj == null ? void 0 : obj[name]) === 'function';
6
- const hasBasicElementProps = element => element != null && Object.prototype.hasOwnProperty.call(element, '_storedElement') && Object.prototype.hasOwnProperty.call(element, '_content');
7
- const primitiveEq = (val, obj) => (obj == null || obj.primitive == null ? void 0 : obj.primitive()) === val;
8
- const hasClass = (cls, obj) => {
9
- var _obj$classes;
10
- return (obj == null || (_obj$classes = obj.classes) == null || _obj$classes.includes == null ? void 0 : _obj$classes.includes(cls)) || false;
5
+ var _minim = require("minim");
6
+ const hasMethod = (name, element) => {
7
+ return typeof element === 'object' && element !== null && name in element && typeof element[name] === 'function';
11
8
  };
12
- const isElementType = (name, element) => (element == null ? void 0 : element.element) === name;
9
+ const hasBasicElementProps = element => typeof element === 'object' && element != null && '_storedElement' in element && typeof element._storedElement === 'string' &&
10
+ // eslint-disable-line no-underscore-dangle
11
+ '_content' in element;
12
+ const primitiveEq = (val, element) => {
13
+ if (typeof element === 'object' && element !== null && 'primitive' in element) {
14
+ return typeof element.primitive === 'function' && element.primitive() === val;
15
+ }
16
+ return false;
17
+ };
18
+ const hasClass = (cls, element) => {
19
+ return typeof element === 'object' && element !== null && 'classes' in element && (Array.isArray(element.classes) || element.classes instanceof _minim.ArrayElement) && element.classes.includes(cls);
20
+ };
21
+ const isElementType = (name, element) => typeof element === 'object' && element !== null && 'element' in element && element.element === name;
13
22
  exports.isElementType = isElementType;
14
23
  const createPredicate = predicateCreator => {
15
- // @ts-ignore
16
24
  return predicateCreator({
17
25
  hasMethod,
18
26
  hasBasicElementProps,
@@ -110,8 +110,7 @@ const isPrimitiveElement = element => {
110
110
  };
111
111
  exports.isPrimitiveElement = isPrimitiveElement;
112
112
  const hasElementSourceMap = element => {
113
- var _element$meta;
114
- return isSourceMapElement(element == null || (_element$meta = element.meta) == null || _element$meta.get == null ? void 0 : _element$meta.get('sourceMap'));
113
+ return isSourceMapElement(element.meta.get('sourceMap'));
115
114
  };
116
115
  exports.hasElementSourceMap = hasElementSourceMap;
117
116
  const includesSymbols = (symbols, element) => {
@@ -21,7 +21,14 @@ __webpack_require__.r(__webpack_exports__);
21
21
  /* harmony export */ });
22
22
  /* harmony import */ var _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9985);
23
23
 
24
- class CloneError extends _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_0__["default"] {}
24
+ class CloneError extends _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_0__["default"] {
25
+ constructor(message, structuredOptions) {
26
+ super(message, structuredOptions);
27
+ if (typeof structuredOptions !== 'undefined') {
28
+ this.value = structuredOptions.source;
29
+ }
30
+ }
31
+ }
25
32
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CloneError);
26
33
 
27
34
  /***/ }),
@@ -66,32 +73,72 @@ __webpack_require__.r(__webpack_exports__);
66
73
  /* harmony export */ cloneShallow: () => (/* binding */ cloneShallow)
67
74
  /* harmony export */ });
68
75
  /* harmony import */ var minim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7952);
69
- /* harmony import */ var _predicates__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4529);
70
- /* harmony import */ var _errors_DeepCloneError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4775);
76
+ /* harmony import */ var _predicates__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4529);
77
+ /* harmony import */ var _errors_DeepCloneError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4775);
71
78
  /* harmony import */ var _errors_ShallowCloneError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8872);
72
79
 
73
80
 
74
81
 
75
82
 
76
- const invokeClone = value => {
77
- if (typeof value?.clone === 'function') {
78
- return value.clone();
83
+ const cloneDeep = (value, options = {}) => {
84
+ const {
85
+ visited = new WeakMap()
86
+ } = options;
87
+ const passThroughOptions = {
88
+ ...options,
89
+ visited
90
+ };
91
+
92
+ // detect cycle and return memoized value
93
+ if (visited.has(value)) {
94
+ return visited.get(value);
95
+ }
96
+ if (value instanceof minim__WEBPACK_IMPORTED_MODULE_0__.KeyValuePair) {
97
+ const {
98
+ key,
99
+ value: val
100
+ } = value;
101
+ const keyCopy = (0,_predicates__WEBPACK_IMPORTED_MODULE_1__.isElement)(key) ? cloneDeep(key, passThroughOptions) : key;
102
+ const valueCopy = (0,_predicates__WEBPACK_IMPORTED_MODULE_1__.isElement)(val) ? cloneDeep(val, passThroughOptions) : val;
103
+ const copy = new minim__WEBPACK_IMPORTED_MODULE_0__.KeyValuePair(keyCopy, valueCopy);
104
+ visited.set(value, copy);
105
+ return copy;
79
106
  }
80
- return value;
81
- };
82
- const cloneDeep = value => {
83
107
  if (value instanceof minim__WEBPACK_IMPORTED_MODULE_0__.ObjectSlice) {
84
- const items = [...value].map(invokeClone);
85
- return new minim__WEBPACK_IMPORTED_MODULE_0__.ObjectSlice(items);
108
+ const mapper = element => cloneDeep(element, passThroughOptions);
109
+ const items = [...value].map(mapper);
110
+ const copy = new minim__WEBPACK_IMPORTED_MODULE_0__.ObjectSlice(items);
111
+ visited.set(value, copy);
112
+ return copy;
86
113
  }
87
114
  if (value instanceof minim__WEBPACK_IMPORTED_MODULE_0__.ArraySlice) {
88
- const items = [...value].map(invokeClone);
89
- return new minim__WEBPACK_IMPORTED_MODULE_0__.ArraySlice(items);
115
+ const mapper = element => cloneDeep(element, passThroughOptions);
116
+ const items = [...value].map(mapper);
117
+ const copy = new minim__WEBPACK_IMPORTED_MODULE_0__.ArraySlice(items);
118
+ visited.set(value, copy);
119
+ return copy;
90
120
  }
91
- if (typeof value?.clone === 'function') {
92
- return value.clone();
121
+ if ((0,_predicates__WEBPACK_IMPORTED_MODULE_1__.isElement)(value)) {
122
+ const copy = cloneShallow(value); // eslint-disable-line @typescript-eslint/no-use-before-define
123
+
124
+ visited.set(value, copy);
125
+ if (value.content) {
126
+ if ((0,_predicates__WEBPACK_IMPORTED_MODULE_1__.isElement)(value.content)) {
127
+ copy.content = cloneDeep(value.content, passThroughOptions);
128
+ } else if (value.content instanceof minim__WEBPACK_IMPORTED_MODULE_0__.KeyValuePair) {
129
+ copy.content = cloneDeep(value.content, passThroughOptions);
130
+ } else if (Array.isArray(value.content)) {
131
+ const mapper = element => cloneDeep(element, passThroughOptions);
132
+ copy.content = value.content.map(mapper);
133
+ } else {
134
+ copy.content = value.content;
135
+ }
136
+ } else {
137
+ copy.content = value.content;
138
+ }
139
+ return copy;
93
140
  }
94
- throw new _errors_DeepCloneError__WEBPACK_IMPORTED_MODULE_1__["default"]("Value provided to cloneDeep function couldn't be cloned", {
141
+ throw new _errors_DeepCloneError__WEBPACK_IMPORTED_MODULE_2__["default"]("Value provided to cloneDeep function couldn't be cloned", {
95
142
  value
96
143
  });
97
144
  };
@@ -129,7 +176,7 @@ const cloneShallowElement = element => {
129
176
  if (element.attributes.length > 0) {
130
177
  copy._attributes = cloneDeep(element.attributes);
131
178
  }
132
- if ((0,_predicates__WEBPACK_IMPORTED_MODULE_2__.isElement)(element.content)) {
179
+ if ((0,_predicates__WEBPACK_IMPORTED_MODULE_1__.isElement)(element.content)) {
133
180
  const content = element.content;
134
181
  copy.content = cloneShallowElement(content);
135
182
  } else if (Array.isArray(element.content)) {
@@ -153,7 +200,7 @@ const cloneShallow = value => {
153
200
  if (value instanceof minim__WEBPACK_IMPORTED_MODULE_0__.ArraySlice) {
154
201
  return cloneShallowArraySlice(value);
155
202
  }
156
- if ((0,_predicates__WEBPACK_IMPORTED_MODULE_2__.isElement)(value)) {
203
+ if ((0,_predicates__WEBPACK_IMPORTED_MODULE_1__.isElement)(value)) {
157
204
  return cloneShallowElement(value);
158
205
  }
159
206
  throw new _errors_ShallowCloneError__WEBPACK_IMPORTED_MODULE_3__["default"]("Value provided to cloneShallow function couldn't be cloned", {
@@ -258,7 +305,7 @@ function deepmerge(targetElement, sourceElement, options) {
258
305
  }
259
306
  deepmerge.all = (list, options) => {
260
307
  if (!Array.isArray(list)) {
261
- throw new TypeError('First argument should be an array.');
308
+ throw new TypeError('First argument of deepmerge should be an array.');
262
309
  }
263
310
  if (list.length === 0) {
264
311
  return new minim__WEBPACK_IMPORTED_MODULE_0__.ObjectElement();
@@ -498,13 +545,25 @@ __webpack_require__.r(__webpack_exports__);
498
545
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
499
546
  /* harmony export */ isElementType: () => (/* binding */ isElementType)
500
547
  /* harmony export */ });
501
- const hasMethod = (name, obj) => typeof obj?.[name] === 'function';
502
- const hasBasicElementProps = element => element != null && Object.prototype.hasOwnProperty.call(element, '_storedElement') && Object.prototype.hasOwnProperty.call(element, '_content');
503
- const primitiveEq = (val, obj) => obj?.primitive?.() === val;
504
- const hasClass = (cls, obj) => obj?.classes?.includes?.(cls) || false;
505
- const isElementType = (name, element) => element?.element === name;
548
+ /* harmony import */ var minim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7952);
549
+
550
+ const hasMethod = (name, element) => {
551
+ return typeof element === 'object' && element !== null && name in element && typeof element[name] === 'function';
552
+ };
553
+ const hasBasicElementProps = element => typeof element === 'object' && element != null && '_storedElement' in element && typeof element._storedElement === 'string' &&
554
+ // eslint-disable-line no-underscore-dangle
555
+ '_content' in element;
556
+ const primitiveEq = (val, element) => {
557
+ if (typeof element === 'object' && element !== null && 'primitive' in element) {
558
+ return typeof element.primitive === 'function' && element.primitive() === val;
559
+ }
560
+ return false;
561
+ };
562
+ const hasClass = (cls, element) => {
563
+ return typeof element === 'object' && element !== null && 'classes' in element && (Array.isArray(element.classes) || element.classes instanceof minim__WEBPACK_IMPORTED_MODULE_0__.ArrayElement) && element.classes.includes(cls);
564
+ };
565
+ const isElementType = (name, element) => typeof element === 'object' && element !== null && 'element' in element && element.element === name;
506
566
  const createPredicate = predicateCreator => {
507
- // @ts-ignore
508
567
  return predicateCreator({
509
568
  hasMethod,
510
569
  hasBasicElementProps,
@@ -655,7 +714,7 @@ const isPrimitiveElement = element => {
655
714
  return (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isElementType)('object', element) || (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isElementType)('array', element) || (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isElementType)('boolean', element) || (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isElementType)('number', element) || (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isElementType)('string', element) || (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isElementType)('null', element) || (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isElementType)('member', element);
656
715
  };
657
716
  const hasElementSourceMap = element => {
658
- return isSourceMapElement(element?.meta?.get?.('sourceMap'));
717
+ return isSourceMapElement(element.meta.get('sourceMap'));
659
718
  };
660
719
  const includesSymbols = (symbols, element) => {
661
720
  if (symbols.length === 0) {
@@ -16438,7 +16497,7 @@ __webpack_require__.r(__webpack_exports__);
16438
16497
  /* harmony export */ mergeAll: () => (/* binding */ mergeAll),
16439
16498
  /* harmony export */ visit: () => (/* binding */ visit)
16440
16499
  /* harmony export */ });
16441
- /* harmony import */ var _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7471);
16500
+ /* harmony import */ var _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9985);
16442
16501
 
16443
16502
 
16444
16503
  /**
@@ -16709,7 +16768,9 @@ visitor, {
16709
16768
  let result;
16710
16769
  if (!Array.isArray(node)) {
16711
16770
  if (!nodePredicate(node)) {
16712
- throw new _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_0__["default"](`Invalid AST Node: ${JSON.stringify(node)}`);
16771
+ throw new _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_0__["default"](`Invalid AST Node: ${String(node)}`, {
16772
+ node
16773
+ });
16713
16774
  }
16714
16775
 
16715
16776
  // cycle detected; skipping over a sub-tree to avoid recursion
@@ -16858,7 +16919,9 @@ visitor, {
16858
16919
  let result;
16859
16920
  if (!Array.isArray(node)) {
16860
16921
  if (!nodePredicate(node)) {
16861
- throw new _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_0__["default"](`Invalid AST Node: ${JSON.stringify(node)}`);
16922
+ throw new _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_0__["default"](`Invalid AST Node: ${String(node)}`, {
16923
+ node
16924
+ });
16862
16925
  }
16863
16926
 
16864
16927
  // cycle detected; skipping over a sub-tree to avoid recursion