@swagger-api/apidom-core 0.95.0 → 0.97.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 +21 -0
- package/README.md +138 -3
- package/cjs/identity/index.cjs +1 -1
- package/cjs/index.cjs +7 -3
- package/cjs/{deepmerge.cjs → merge/deepmerge.cjs} +36 -16
- package/cjs/merge/merge-left.cjs +13 -0
- package/cjs/merge/merge-right.cjs +28 -0
- package/cjs/refractor/index.cjs +10 -0
- package/cjs/refractor/plugins/element-identity.cjs +1 -2
- package/cjs/refractor/plugins/semantic-element-identity.cjs +1 -2
- package/cjs/transformers/serializers/value/index.cjs +14 -0
- package/dist/apidom-core.browser.js +1504 -1413
- package/dist/apidom-core.browser.min.js +1 -1
- package/es/identity/index.mjs +1 -1
- package/es/index.mjs +3 -1
- package/es/{deepmerge.mjs → merge/deepmerge.mjs} +35 -17
- package/es/merge/merge-left.mjs +8 -0
- package/es/merge/merge-right.mjs +23 -0
- package/es/refractor/index.mjs +10 -0
- package/es/refractor/plugins/element-identity.mjs +1 -2
- package/es/refractor/plugins/semantic-element-identity.mjs +1 -2
- package/es/transformers/serializers/value/index.mjs +14 -0
- package/package.json +5 -5
- package/types/dist.d.ts +20 -2
- package/types/minim.d.ts +10 -8
package/es/identity/index.mjs
CHANGED
|
@@ -28,7 +28,7 @@ export const IdentityManager = stampit({
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
// use already assigned identity
|
|
31
|
-
if (element.meta.hasKey('id') && isStringElement(element.meta.id) && !element.meta.id.equals('')) {
|
|
31
|
+
if (element.meta.hasKey('id') && isStringElement(element.meta.get('id')) && !element.meta.get('id').equals('')) {
|
|
32
32
|
return element.id;
|
|
33
33
|
}
|
|
34
34
|
|
package/es/index.mjs
CHANGED
|
@@ -45,4 +45,6 @@ export { default as dehydrate } from "./transformers/dehydrate.mjs";
|
|
|
45
45
|
*/
|
|
46
46
|
export { default as toString } from "./transformers/to-string.mjs";
|
|
47
47
|
export { default as sexprs } from "./transformers/sexprs.mjs";
|
|
48
|
-
export { default as deepmerge } from "./deepmerge.mjs";
|
|
48
|
+
export { default as deepmerge } from "./merge/deepmerge.mjs";
|
|
49
|
+
export { default as mergeRight } from "./merge/merge-right.mjs";
|
|
50
|
+
export { default as mergeLeft } from "./merge/merge-left.mjs";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { ObjectElement } from 'minim';
|
|
2
|
-
import { isObjectElement, isArrayElement } from "
|
|
3
|
-
import { cloneDeep, cloneShallow } from "
|
|
4
|
-
import toValue from "
|
|
2
|
+
import { isObjectElement, isArrayElement } from "../predicates/index.mjs";
|
|
3
|
+
import { cloneDeep, cloneShallow } from "../clone/index.mjs";
|
|
4
|
+
import toValue from "../transformers/serializers/value/index.mjs";
|
|
5
5
|
/* eslint-disable @typescript-eslint/no-use-before-define */
|
|
6
|
-
const emptyElement = element => {
|
|
7
|
-
const meta = cloneDeep(element.meta);
|
|
8
|
-
const attributes = cloneDeep(element.attributes);
|
|
6
|
+
export const emptyElement = element => {
|
|
7
|
+
const meta = element.meta.length > 0 ? cloneDeep(element.meta) : undefined;
|
|
8
|
+
const attributes = element.attributes.length > 0 ? cloneDeep(element.attributes) : undefined;
|
|
9
9
|
|
|
10
10
|
// @ts-ignore
|
|
11
11
|
return new element.constructor(undefined, meta, attributes);
|
|
@@ -18,6 +18,18 @@ const getMergeFunction = (keyElement, options) => {
|
|
|
18
18
|
const customMerge = options.customMerge(keyElement, options);
|
|
19
19
|
return typeof customMerge === 'function' ? customMerge : deepmerge;
|
|
20
20
|
};
|
|
21
|
+
const getMetaMergeFunction = options => {
|
|
22
|
+
if (typeof options.customMetaMerge !== 'function') {
|
|
23
|
+
return targetMeta => cloneDeep(targetMeta);
|
|
24
|
+
}
|
|
25
|
+
return options.customMetaMerge;
|
|
26
|
+
};
|
|
27
|
+
const getAttributesMergeFunction = options => {
|
|
28
|
+
if (typeof options.customAttributesMerge !== 'function') {
|
|
29
|
+
return targetAttributes => cloneDeep(targetAttributes);
|
|
30
|
+
}
|
|
31
|
+
return options.customAttributesMerge;
|
|
32
|
+
};
|
|
21
33
|
const mergeArrayElement = (targetElement, sourceElement, options) => targetElement.concat(sourceElement)['fantasy-land/map'](item => cloneUnlessOtherwiseSpecified(item, options));
|
|
22
34
|
const mergeObjectElement = (targetElement, sourceElement, options) => {
|
|
23
35
|
const destination = isObjectElement(targetElement) ? emptyElement(targetElement) : emptyElement(sourceElement);
|
|
@@ -44,15 +56,17 @@ const mergeObjectElement = (targetElement, sourceElement, options) => {
|
|
|
44
56
|
});
|
|
45
57
|
return destination;
|
|
46
58
|
};
|
|
59
|
+
export const defaultOptions = {
|
|
60
|
+
clone: true,
|
|
61
|
+
isMergeableElement: element => isObjectElement(element) || isArrayElement(element),
|
|
62
|
+
arrayElementMerge: mergeArrayElement,
|
|
63
|
+
objectElementMerge: mergeObjectElement,
|
|
64
|
+
customMerge: undefined,
|
|
65
|
+
customMetaMerge: undefined,
|
|
66
|
+
customAttributesMerge: undefined
|
|
67
|
+
};
|
|
47
68
|
export default function deepmerge(targetElement, sourceElement, options) {
|
|
48
69
|
var _mergedOptions$isMerg, _mergedOptions$arrayE, _mergedOptions$object;
|
|
49
|
-
const defaultOptions = {
|
|
50
|
-
clone: true,
|
|
51
|
-
isMergeableElement: element => isObjectElement(element) || isArrayElement(element),
|
|
52
|
-
arrayElementMerge: mergeArrayElement,
|
|
53
|
-
objectElementMerge: mergeObjectElement,
|
|
54
|
-
customMerge: undefined
|
|
55
|
-
};
|
|
56
70
|
const mergedOptions = {
|
|
57
71
|
...defaultOptions,
|
|
58
72
|
...options
|
|
@@ -66,10 +80,14 @@ export default function deepmerge(targetElement, sourceElement, options) {
|
|
|
66
80
|
if (!sourceAndTargetTypesMatch) {
|
|
67
81
|
return cloneUnlessOtherwiseSpecified(sourceElement, mergedOptions);
|
|
68
82
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
83
|
+
|
|
84
|
+
// merging two elements
|
|
85
|
+
const mergedElement = sourceIsArrayElement && typeof mergedOptions.arrayElementMerge === 'function' ? mergedOptions.arrayElementMerge(targetElement, sourceElement, mergedOptions) : mergedOptions.objectElementMerge(targetElement, sourceElement, mergedOptions);
|
|
86
|
+
|
|
87
|
+
// merging meta & attributes
|
|
88
|
+
mergedElement.meta = getMetaMergeFunction(mergedOptions)(targetElement.meta, sourceElement.meta);
|
|
89
|
+
mergedElement.attributes = getAttributesMergeFunction(mergedOptions)(targetElement.attributes, sourceElement.attributes);
|
|
90
|
+
return mergedElement;
|
|
73
91
|
}
|
|
74
92
|
deepmerge.all = (list, options) => {
|
|
75
93
|
if (!Array.isArray(list)) {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import mergeRight from "./merge-right.mjs";
|
|
2
|
+
const mergeLeft = (...[sourceElement, targetElement, options]) => {
|
|
3
|
+
return mergeRight(targetElement, sourceElement, options);
|
|
4
|
+
};
|
|
5
|
+
mergeLeft.all = (...[list, options]) => {
|
|
6
|
+
return mergeRight.all([...list].reverse(), options);
|
|
7
|
+
};
|
|
8
|
+
export default mergeLeft;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ObjectElement } from 'minim';
|
|
2
|
+
import deepmerge, { defaultOptions as defaultDeepmergeOptions, emptyElement } from "./deepmerge.mjs";
|
|
3
|
+
const mergeRight = (targetElement, sourceElement, options) => {
|
|
4
|
+
const mergedOptions = {
|
|
5
|
+
...defaultDeepmergeOptions,
|
|
6
|
+
...options,
|
|
7
|
+
customMerge: () => (target, source) => source,
|
|
8
|
+
clone: false
|
|
9
|
+
};
|
|
10
|
+
return deepmerge(targetElement, sourceElement, mergedOptions);
|
|
11
|
+
};
|
|
12
|
+
mergeRight.all = (list, options) => {
|
|
13
|
+
if (!Array.isArray(list)) {
|
|
14
|
+
throw new TypeError('First argument of mergeRight should be an array.');
|
|
15
|
+
}
|
|
16
|
+
if (list.length === 0) {
|
|
17
|
+
return new ObjectElement();
|
|
18
|
+
}
|
|
19
|
+
return list.reduce((target, source) => {
|
|
20
|
+
return mergeRight(target, source, options);
|
|
21
|
+
}, emptyElement(list[0]));
|
|
22
|
+
};
|
|
23
|
+
export default mergeRight;
|
package/es/refractor/index.mjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { dispatchPlugins } from "./plugins/utils/index.mjs";
|
|
2
2
|
import { getNodeType } from "../traversal/visitor.mjs";
|
|
3
|
+
import { cloneDeep } from "../clone/index.mjs";
|
|
4
|
+
import { isElement } from "../predicates/index.mjs";
|
|
3
5
|
import createToolbox from "./toolbox.mjs";
|
|
4
6
|
const refract = (value, {
|
|
5
7
|
Type,
|
|
@@ -11,6 +13,14 @@ const refract = (value, {
|
|
|
11
13
|
* Though we allow consumers to define their onw plugins on already transformed ApiDOM.
|
|
12
14
|
*/
|
|
13
15
|
const element = new Type(value);
|
|
16
|
+
if (isElement(value)) {
|
|
17
|
+
if (value.meta.length > 0) {
|
|
18
|
+
element.meta = cloneDeep(value.meta);
|
|
19
|
+
}
|
|
20
|
+
if (value.attributes.length > 0) {
|
|
21
|
+
element.attributes = cloneDeep(value.attributes);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
14
24
|
|
|
15
25
|
/**
|
|
16
26
|
* Run plugins only when necessary.
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { StringElement } from 'minim';
|
|
2
1
|
import { IdentityManager } from "../../identity/index.mjs";
|
|
3
2
|
/**
|
|
4
3
|
* Plugin for decorating every element in ApiDOM tree with UUID.
|
|
@@ -15,7 +14,7 @@ const plugin = ({
|
|
|
15
14
|
},
|
|
16
15
|
visitor: {
|
|
17
16
|
enter(element) {
|
|
18
|
-
element.id =
|
|
17
|
+
element.id = identityManager.identify(element); // eslint-disable-line no-param-reassign
|
|
19
18
|
}
|
|
20
19
|
},
|
|
21
20
|
post() {
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { StringElement } from 'minim';
|
|
2
1
|
import { IdentityManager } from "../../identity/index.mjs";
|
|
3
2
|
/**
|
|
4
3
|
* Plugin for decorating every semantic element in ApiDOM tree with UUID.
|
|
@@ -18,7 +17,7 @@ const plugin = ({
|
|
|
18
17
|
visitor: {
|
|
19
18
|
enter(element) {
|
|
20
19
|
if (!predicates.isPrimitiveElement(element)) {
|
|
21
|
-
element.id =
|
|
20
|
+
element.id = identityManager.identify(element); // eslint-disable-line no-param-reassign
|
|
22
21
|
}
|
|
23
22
|
}
|
|
24
23
|
},
|
|
@@ -52,6 +52,20 @@ class Visitor {
|
|
|
52
52
|
NullElement() {
|
|
53
53
|
return null;
|
|
54
54
|
}
|
|
55
|
+
RefElement(element, ...rest) {
|
|
56
|
+
var _ancestors;
|
|
57
|
+
const ancestors = rest[3];
|
|
58
|
+
if (((_ancestors = ancestors[ancestors.length - 1]) === null || _ancestors === void 0 ? void 0 : _ancestors.type) === 'EphemeralObject') {
|
|
59
|
+
return Symbol.for('delete-node');
|
|
60
|
+
}
|
|
61
|
+
return String(element.toValue());
|
|
62
|
+
}
|
|
63
|
+
LinkElement(element) {
|
|
64
|
+
if (isStringElement(element.href)) {
|
|
65
|
+
return element.href.toValue();
|
|
66
|
+
}
|
|
67
|
+
return '';
|
|
68
|
+
}
|
|
55
69
|
}
|
|
56
70
|
const serializer = element => {
|
|
57
71
|
if (!isElement(element)) return element;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swagger-api/apidom-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.97.0",
|
|
4
4
|
"description": "Tools for manipulating ApiDOM structures.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"typescript:check-types": "tsc -p check-types.tsconfig.json --noEmit",
|
|
31
31
|
"typescript:declaration": "tsc -p declaration.tsconfig.json && rollup -c config/rollup/types.dist.js && copyfiles -u 2 ../@types/minim.d.ts ./types && node ../../scripts/file-replace-bof.js './types/dist.d.ts' '/// <reference path=\"./minim.d.ts\" />'",
|
|
32
32
|
"test": "cross-env NODE_ENV=test BABEL_ENV=cjs mocha",
|
|
33
|
-
"test:update-snapshots": "cross-env UPDATE_SNAPSHOT=1 BABEL_ENV=cjs mocha",
|
|
33
|
+
"test:update-snapshots": "cross-env UPDATE_SNAPSHOT=1 NODE_ENV=test BABEL_ENV=cjs mocha",
|
|
34
34
|
"prepack": "copyfiles -u 3 ../../LICENSES/* LICENSES && copyfiles -u 2 ../../NOTICE .",
|
|
35
35
|
"postpack": "rimraf NOTICE LICENSES"
|
|
36
36
|
},
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"license": "Apache-2.0",
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@babel/runtime-corejs3": "^7.20.7",
|
|
45
|
-
"@swagger-api/apidom-ast": "^0.
|
|
46
|
-
"@swagger-api/apidom-error": "^0.
|
|
45
|
+
"@swagger-api/apidom-ast": "^0.97.0",
|
|
46
|
+
"@swagger-api/apidom-error": "^0.97.0",
|
|
47
47
|
"@types/ramda": "~0.29.6",
|
|
48
48
|
"minim": "~0.23.8",
|
|
49
49
|
"ramda": "~0.29.1",
|
|
@@ -62,5 +62,5 @@
|
|
|
62
62
|
"README.md",
|
|
63
63
|
"CHANGELOG.md"
|
|
64
64
|
],
|
|
65
|
-
"gitHead": "
|
|
65
|
+
"gitHead": "b616e76738c48401d651a272daef174f6c1a6510"
|
|
66
66
|
}
|
package/types/dist.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/// <reference path="./minim.d.ts" />
|
|
2
|
+
import * as minim from 'minim';
|
|
2
3
|
import { Element, StringElement, Meta, Attributes, ArrayElement, ArraySlice, NumberElement, NullElement, BooleanElement, ObjectElement, MemberElement, LinkElement, RefElement, Namespace as Namespace$1, NamespacePlugin, KeyValuePair, ObjectSlice } from 'minim';
|
|
3
4
|
export { ArrayElement, ArraySlice, Attributes, BooleanElement, Element, KeyValuePair, LinkElement, MemberElement, Meta, NamespacePluginOptions, NullElement, NumberElement, ObjectElement, ObjectSlice, RefElement, StringElement, refract } from 'minim';
|
|
4
5
|
import { ApiDOMStructuredError, ApiDOMErrorOptions } from '@swagger-api/apidom-error';
|
|
@@ -303,6 +304,8 @@ type ObjectOrArrayElement = ObjectElement | ArrayElement;
|
|
|
303
304
|
type AnyElement = ObjectElement | ArrayElement | Element;
|
|
304
305
|
type DeepMerge = (targetElement: ObjectOrArrayElement, sourceElement: ObjectOrArrayElement, options?: DeepMergeOptions) => AnyElement;
|
|
305
306
|
type CustomMerge = (keyElement: Element, options: DeepMergeOptions) => DeepMerge;
|
|
307
|
+
type CustomMetaMerge = (targetElementMeta: ObjectElement, sourceElementMeta: ObjectElement) => ObjectElement;
|
|
308
|
+
type CustomAttributesMerge = (targetElementAttributes: ObjectElement, sourceElementAttributes: ObjectElement) => ObjectElement;
|
|
306
309
|
type ArrayElementMerge = (targetElement: ArrayElement, sourceElement: ArrayElement, options: DeepMergeOptions) => ArrayElement;
|
|
307
310
|
type ObjectElementMerge = (targetElement: ObjectElement, source: ObjectElement, options: DeepMergeOptions) => ObjectElement;
|
|
308
311
|
type DeepMergeUserOptions = {
|
|
@@ -311,6 +314,8 @@ type DeepMergeUserOptions = {
|
|
|
311
314
|
arrayElementMerge?: ArrayElementMerge;
|
|
312
315
|
objectElementMerge?: ObjectElementMerge;
|
|
313
316
|
customMerge?: CustomMerge;
|
|
317
|
+
customMetaMerge?: CustomMetaMerge;
|
|
318
|
+
customAttributesMerge?: CustomAttributesMerge;
|
|
314
319
|
};
|
|
315
320
|
type DeepMergeOptions = DeepMergeUserOptions & {
|
|
316
321
|
clone: boolean;
|
|
@@ -318,10 +323,23 @@ type DeepMergeOptions = DeepMergeUserOptions & {
|
|
|
318
323
|
arrayElementMerge: ArrayElementMerge;
|
|
319
324
|
objectElementMerge: ObjectElementMerge;
|
|
320
325
|
customMerge: CustomMerge | undefined;
|
|
326
|
+
customMetaMerge: CustomMetaMerge | undefined;
|
|
327
|
+
customAttributesMerge: CustomAttributesMerge | undefined;
|
|
321
328
|
};
|
|
322
329
|
declare function deepmerge(targetElement: ObjectOrArrayElement, sourceElement: ObjectOrArrayElement, options?: DeepMergeUserOptions): AnyElement;
|
|
323
330
|
declare namespace deepmerge {
|
|
324
|
-
var all: (list: ObjectOrArrayElement[], options?:
|
|
331
|
+
var all: (list: ObjectOrArrayElement[], options?: DeepMergeUserOptions | undefined) => any;
|
|
325
332
|
}
|
|
326
333
|
|
|
327
|
-
|
|
334
|
+
type MergeRightOptions = Omit<DeepMergeUserOptions, 'customMerge' | 'clone'>;
|
|
335
|
+
declare const mergeRight: {
|
|
336
|
+
(targetElement: ObjectOrArrayElement, sourceElement: ObjectOrArrayElement, options?: MergeRightOptions): minim.Element | ObjectElement | minim.ArrayElement;
|
|
337
|
+
all(list: ObjectOrArrayElement[], options?: MergeRightOptions): any;
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
declare const mergeLeft: {
|
|
341
|
+
(targetElement: ObjectOrArrayElement, sourceElement: ObjectOrArrayElement, options?: MergeRightOptions | undefined): minim.Element | minim.ObjectElement | minim.ArrayElement;
|
|
342
|
+
all(list: ObjectOrArrayElement[], options?: MergeRightOptions | undefined): any;
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
export { Annotation as AnnotationElement, CloneError, Comment as CommentElement, DeepCloneError, type DeepMergeUserOptions, ElementIdentityError, type ElementPredicate, IdentityManager, MediaTypes, type MergeRightOptions as MergeLeftOptions, type MergeRightOptions, Namespace, type ObjectOrArrayElement, ParseResult as ParseResultElement, type Position, type PositionRange, ShallowCloneError, SourceMap as SourceMapElement, Transcluder, cloneDeep, cloneNode, cloneShallow, createNamespace, createPredicate, deepmerge, defaultIdentityManager, dehydrate, dereference, dispatchPlugins as dispatchRefractorPlugins, filter, find, findAtOffset, fromFn as from, getNodeType, hasElementSourceMap, includesClasses, includesSymbols, isAnnotationElement, isArrayElement, isBooleanElement, isElement, isLinkElement, isMemberElement, isNullElement, isNumberElement, isObjectElement, isParseResultElement, isPrimitiveElement, isRefElement, isSourceMapElement, isStringElement, keyMapDefault as keyMap, mergeLeft, mergeRight, namespace, parents, plugin$1 as refractorPluginElementIdentity, plugin as refractorPluginSemanticElementIdentity, reject, sexprs, some, serializer$1 as toJSON, toString, serializer$2 as toValue, serializer as toYAML, transclude, traverse, visit };
|
package/types/minim.d.ts
CHANGED
|
@@ -45,6 +45,8 @@ declare module 'minim' {
|
|
|
45
45
|
clone(): Element;
|
|
46
46
|
|
|
47
47
|
primitive(): string | undefined;
|
|
48
|
+
|
|
49
|
+
[key: string]: unknown;
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
interface Type<T> extends Element {
|
|
@@ -169,23 +171,23 @@ declare module 'minim' {
|
|
|
169
171
|
}
|
|
170
172
|
|
|
171
173
|
export class LinkElement extends Element {
|
|
172
|
-
constructor(content?:
|
|
174
|
+
constructor(content?: unknown, meta?: Meta, attributes?: Attributes);
|
|
173
175
|
|
|
174
|
-
get relation():
|
|
176
|
+
get relation(): string;
|
|
175
177
|
|
|
176
|
-
set relation(relation:
|
|
178
|
+
set relation(relation: string);
|
|
177
179
|
|
|
178
|
-
get href():
|
|
180
|
+
get href(): string;
|
|
179
181
|
|
|
180
|
-
set href(key:
|
|
182
|
+
set href(key: string);
|
|
181
183
|
}
|
|
182
184
|
|
|
183
185
|
export class RefElement extends Element {
|
|
184
|
-
constructor(content?:
|
|
186
|
+
constructor(content?: unknown, meta?: Meta, attributes?: Attributes);
|
|
185
187
|
|
|
186
|
-
get path():
|
|
188
|
+
get path(): string;
|
|
187
189
|
|
|
188
|
-
set path(path:
|
|
190
|
+
set path(path: string);
|
|
189
191
|
}
|
|
190
192
|
|
|
191
193
|
export class ArraySlice {
|