@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.
@@ -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 "./predicates/index.mjs";
3
- import { cloneDeep, cloneShallow } from "./clone/index.mjs";
4
- import toValue from "./transformers/serializers/value/index.mjs";
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
- if (sourceIsArrayElement && typeof mergedOptions.arrayElementMerge === 'function') {
70
- return mergedOptions.arrayElementMerge(targetElement, sourceElement, mergedOptions);
71
- }
72
- return mergedOptions.objectElementMerge(targetElement, sourceElement, mergedOptions);
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;
@@ -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 = new StringElement(identityManager.generateId()); // eslint-disable-line no-param-reassign
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 = new StringElement(identityManager.generateId()); // eslint-disable-line no-param-reassign
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.95.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.95.0",
46
- "@swagger-api/apidom-error": "^0.95.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": "c56f672154649ce4b6236e4f5e12e05e34867fd7"
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?: DeepMergeOptions | undefined) => any;
331
+ var all: (list: ObjectOrArrayElement[], options?: DeepMergeUserOptions | undefined) => any;
325
332
  }
326
333
 
327
- export { Annotation as AnnotationElement, CloneError, Comment as CommentElement, DeepCloneError, ElementIdentityError, type ElementPredicate, IdentityManager, MediaTypes, Namespace, 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, 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 };
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?: Array<unknown>, meta?: Meta, attributes?: Attributes);
174
+ constructor(content?: unknown, meta?: Meta, attributes?: Attributes);
173
175
 
174
- get relation(): unknown;
176
+ get relation(): string;
175
177
 
176
- set relation(relation: unknown);
178
+ set relation(relation: string);
177
179
 
178
- get href(): unknown;
180
+ get href(): string;
179
181
 
180
- set href(key: unknown);
182
+ set href(key: string);
181
183
  }
182
184
 
183
185
  export class RefElement extends Element {
184
- constructor(content?: Array<unknown>, meta?: Meta, attributes?: Attributes);
186
+ constructor(content?: unknown, meta?: Meta, attributes?: Attributes);
185
187
 
186
- get path(): unknown;
188
+ get path(): string;
187
189
 
188
- set path(path: unknown);
190
+ set path(path: string);
189
191
  }
190
192
 
191
193
  export class ArraySlice {