@swagger-api/apidom-core 0.76.1 → 0.77.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 +17 -0
- package/README.md +53 -5
- package/cjs/clone/errors/CloneError.cjs +7 -0
- package/cjs/clone/errors/DeepCloneError.cjs +8 -0
- package/cjs/clone/errors/ShallowCloneError.cjs +8 -0
- package/cjs/clone/index.cjs +105 -0
- package/cjs/deepmerge.cjs +9 -7
- package/cjs/elements/Annotation.cjs +1 -2
- package/cjs/elements/Comment.cjs +1 -2
- package/cjs/elements/ParseResult.cjs +1 -2
- package/cjs/elements/SourceMap.cjs +1 -2
- package/cjs/index.cjs +62 -103
- package/cjs/media-types.cjs +1 -2
- package/cjs/namespace.cjs +2 -3
- package/cjs/predicates/helpers.cjs +1 -2
- package/cjs/predicates/index.cjs +16 -31
- package/cjs/refractor/index.cjs +2 -3
- package/cjs/refractor/plugins/element-identity.cjs +2 -3
- package/cjs/refractor/plugins/semantic-element-identity.cjs +2 -3
- package/cjs/refractor/plugins/utils/index.cjs +1 -1
- package/cjs/refractor/registration.cjs +1 -1
- package/cjs/refractor/toolbox.cjs +3 -5
- package/cjs/transcluder/Transcluder.cjs +2 -3
- package/cjs/transcluder/index.cjs +2 -3
- package/cjs/transformers/dehydrate.cjs +14 -0
- package/cjs/transformers/from.cjs +27 -0
- package/cjs/{serializers → transformers/serializers}/json.cjs +2 -3
- package/cjs/{serializers → transformers/serializers}/value/ast/ephemeral-array.cjs +1 -2
- package/cjs/{serializers → transformers/serializers}/value/ast/ephemeral-object.cjs +1 -2
- package/cjs/{serializers → transformers/serializers}/value/index.cjs +9 -3
- package/cjs/{serializers → transformers/serializers}/value/visitor.cjs +1 -1
- package/cjs/{serializers → transformers/serializers}/yaml-1-2.cjs +3 -4
- package/cjs/{sexprs.cjs → transformers/sexprs.cjs} +3 -4
- package/cjs/transformers/to-string.cjs +15 -0
- package/cjs/traversal/filter.cjs +1 -2
- package/cjs/traversal/find.cjs +1 -2
- package/cjs/traversal/findAtOffset.cjs +5 -5
- package/cjs/traversal/index.cjs +1 -1
- package/cjs/traversal/parents.cjs +2 -3
- package/cjs/traversal/reject.cjs +2 -3
- package/cjs/traversal/some.cjs +2 -3
- package/cjs/traversal/traverse.cjs +3 -5
- package/cjs/traversal/visitor.cjs +18 -9
- package/dist/apidom-core.browser.js +9851 -11614
- package/dist/apidom-core.browser.min.js +1 -1
- package/es/clone/errors/CloneError.mjs +3 -0
- package/es/clone/errors/DeepCloneError.mjs +3 -0
- package/es/clone/errors/ShallowCloneError.mjs +3 -0
- package/es/clone/index.mjs +98 -0
- package/es/{deepmerge.js → deepmerge.mjs} +14 -13
- package/es/index.mjs +46 -0
- package/es/{media-types.js → media-types.mjs} +2 -5
- package/es/{namespace.js → namespace.mjs} +4 -4
- package/es/predicates/{index.js → index.mjs} +5 -5
- package/es/refractor/index.mjs +30 -0
- package/es/refractor/plugins/utils/{index.js → index.mjs} +2 -2
- package/es/refractor/{registration.js → registration.mjs} +5 -5
- package/es/refractor/toolbox.mjs +12 -0
- package/es/transcluder/{Transcluder.js → Transcluder.mjs} +1 -1
- package/es/transcluder/{index.js → index.mjs} +1 -1
- package/es/transformers/dehydrate.mjs +9 -0
- package/es/transformers/from.mjs +22 -0
- package/es/{serializers/json.js → transformers/serializers/json.mjs} +1 -1
- package/es/transformers/serializers/value/ast/ephemeral-array.mjs +17 -0
- package/es/transformers/serializers/value/ast/ephemeral-object.mjs +16 -0
- package/es/{serializers/value/index.js → transformers/serializers/value/index.mjs} +10 -3
- package/es/transformers/serializers/value/visitor.mjs +49 -0
- package/es/{serializers/yaml-1-2.js → transformers/serializers/yaml-1-2.mjs} +2 -2
- package/es/{sexprs.js → transformers/sexprs.mjs} +1 -1
- package/es/transformers/to-string.mjs +10 -0
- package/es/traversal/{filter.js → filter.mjs} +1 -1
- package/es/traversal/{find.js → find.mjs} +1 -1
- package/es/traversal/{findAtOffset.js → findAtOffset.mjs} +5 -4
- package/es/traversal/index.mjs +7 -0
- package/es/traversal/{parents.js → parents.mjs} +1 -1
- package/es/traversal/{reject.js → reject.mjs} +1 -1
- package/es/traversal/{some.js → some.mjs} +1 -1
- package/es/traversal/{traverse.js → traverse.mjs} +2 -2
- package/es/traversal/{visitor.js → visitor.mjs} +29 -24
- package/package.json +8 -8
- package/types/dist.d.ts +47 -32
- package/types/minim.d.ts +14 -2
- package/es/index.js +0 -72
- package/es/refractor/index.js +0 -32
- package/es/refractor/toolbox.js +0 -13
- package/es/serializers/value/ast/ephemeral-array.js +0 -18
- package/es/serializers/value/ast/ephemeral-object.js +0 -17
- package/es/serializers/value/visitor.js +0 -54
- package/es/traversal/index.js +0 -7
- /package/es/elements/{Annotation.js → Annotation.mjs} +0 -0
- /package/es/elements/{Comment.js → Comment.mjs} +0 -0
- /package/es/elements/{ParseResult.js → ParseResult.mjs} +0 -0
- /package/es/elements/{SourceMap.js → SourceMap.mjs} +0 -0
- /package/es/predicates/{helpers.js → helpers.mjs} +0 -0
- /package/es/refractor/plugins/{element-identity.js → element-identity.mjs} +0 -0
- /package/es/refractor/plugins/{semantic-element-identity.js → semantic-element-identity.mjs} +0 -0
- /package/es/{util.js → util.mjs} +0 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { ArraySlice, ObjectSlice, KeyValuePair } from 'minim';
|
|
2
|
+
import { isElement } from "../predicates/index.mjs";
|
|
3
|
+
import DeepCloneError from "./errors/DeepCloneError.mjs";
|
|
4
|
+
import ShallowCloneError from "./errors/ShallowCloneError.mjs";
|
|
5
|
+
const invokeClone = value => {
|
|
6
|
+
if (typeof (value === null || value === void 0 ? void 0 : value.clone) === 'function') {
|
|
7
|
+
return value.clone();
|
|
8
|
+
}
|
|
9
|
+
return value;
|
|
10
|
+
};
|
|
11
|
+
export const cloneDeep = value => {
|
|
12
|
+
if (value instanceof ObjectSlice) {
|
|
13
|
+
const items = [...value].map(invokeClone);
|
|
14
|
+
return new ObjectSlice(items);
|
|
15
|
+
}
|
|
16
|
+
if (value instanceof ArraySlice) {
|
|
17
|
+
const items = [...value].map(invokeClone);
|
|
18
|
+
return new ArraySlice(items);
|
|
19
|
+
}
|
|
20
|
+
if (typeof (value === null || value === void 0 ? void 0 : value.clone) === 'function') {
|
|
21
|
+
return value.clone();
|
|
22
|
+
}
|
|
23
|
+
throw new DeepCloneError("Value provided to cloneDeep function couldn't be cloned", {
|
|
24
|
+
value
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
cloneDeep.safe = value => {
|
|
28
|
+
try {
|
|
29
|
+
return cloneDeep(value);
|
|
30
|
+
} catch {
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const cloneShallowKeyValuePair = keyValuePair => {
|
|
35
|
+
const {
|
|
36
|
+
key,
|
|
37
|
+
value
|
|
38
|
+
} = keyValuePair;
|
|
39
|
+
return new KeyValuePair(key, value);
|
|
40
|
+
};
|
|
41
|
+
const cloneShallowArraySlice = arraySlice => {
|
|
42
|
+
const items = [...arraySlice];
|
|
43
|
+
return new ArraySlice(items);
|
|
44
|
+
};
|
|
45
|
+
const cloneShallowObjectSlice = objectSlice => {
|
|
46
|
+
const items = [...objectSlice];
|
|
47
|
+
return new ObjectSlice(items);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/* eslint-disable no-underscore-dangle */
|
|
51
|
+
const cloneShallowElement = element => {
|
|
52
|
+
// @ts-ignore
|
|
53
|
+
const copy = new element.constructor();
|
|
54
|
+
copy.element = element.element;
|
|
55
|
+
if (element.meta.length > 0) {
|
|
56
|
+
copy._meta = cloneDeep(element.meta);
|
|
57
|
+
}
|
|
58
|
+
if (element.attributes.length > 0) {
|
|
59
|
+
copy._attributes = cloneDeep(element.attributes);
|
|
60
|
+
}
|
|
61
|
+
if (isElement(element.content)) {
|
|
62
|
+
const content = element.content;
|
|
63
|
+
copy.content = cloneShallowElement(content);
|
|
64
|
+
} else if (Array.isArray(element.content)) {
|
|
65
|
+
copy.content = [...element.content];
|
|
66
|
+
} else if (element.content instanceof KeyValuePair) {
|
|
67
|
+
copy.content = cloneShallowKeyValuePair(element.content);
|
|
68
|
+
} else {
|
|
69
|
+
copy.content = element.content;
|
|
70
|
+
}
|
|
71
|
+
return copy;
|
|
72
|
+
};
|
|
73
|
+
/* eslint-enable */
|
|
74
|
+
|
|
75
|
+
export const cloneShallow = value => {
|
|
76
|
+
if (value instanceof KeyValuePair) {
|
|
77
|
+
return cloneShallowKeyValuePair(value);
|
|
78
|
+
}
|
|
79
|
+
if (value instanceof ObjectSlice) {
|
|
80
|
+
return cloneShallowObjectSlice(value);
|
|
81
|
+
}
|
|
82
|
+
if (value instanceof ArraySlice) {
|
|
83
|
+
return cloneShallowArraySlice(value);
|
|
84
|
+
}
|
|
85
|
+
if (isElement(value)) {
|
|
86
|
+
return cloneShallowElement(value);
|
|
87
|
+
}
|
|
88
|
+
throw new ShallowCloneError("Value provided to cloneShallow function couldn't be cloned", {
|
|
89
|
+
value
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
cloneShallow.safe = value => {
|
|
93
|
+
try {
|
|
94
|
+
return cloneShallow(value);
|
|
95
|
+
} catch {
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
};
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
import { isObjectElement, isArrayElement } from "./predicates/index.js";
|
|
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";
|
|
6
5
|
/* eslint-disable @typescript-eslint/no-use-before-define */
|
|
7
6
|
const emptyElement = element => {
|
|
8
|
-
const meta = element.meta
|
|
9
|
-
const attributes = element.attributes
|
|
7
|
+
const meta = cloneDeep(element.meta);
|
|
8
|
+
const attributes = cloneDeep(element.attributes);
|
|
10
9
|
|
|
11
10
|
// @ts-ignore
|
|
12
11
|
return new element.constructor(undefined, meta, attributes);
|
|
13
12
|
};
|
|
14
|
-
const cloneMemberElement = memberElement => new MemberElement(memberElement.key, memberElement.value, memberElement.meta.clone(), memberElement.attributes.clone());
|
|
15
13
|
const cloneUnlessOtherwiseSpecified = (element, options) => options.clone && options.isMergeableElement(element) ? deepmerge(emptyElement(element), element, options) : element;
|
|
16
14
|
const getMergeFunction = (keyElement, options) => {
|
|
17
15
|
if (typeof options.customMerge !== 'function') {
|
|
@@ -25,20 +23,20 @@ const mergeObjectElement = (targetElement, sourceElement, options) => {
|
|
|
25
23
|
const destination = isObjectElement(targetElement) ? emptyElement(targetElement) : emptyElement(sourceElement);
|
|
26
24
|
if (isObjectElement(targetElement)) {
|
|
27
25
|
targetElement.forEach((value, key, member) => {
|
|
28
|
-
const clonedMember =
|
|
26
|
+
const clonedMember = cloneShallow(member);
|
|
29
27
|
clonedMember.value = cloneUnlessOtherwiseSpecified(value, options);
|
|
30
28
|
destination.content.push(clonedMember);
|
|
31
29
|
});
|
|
32
30
|
}
|
|
33
31
|
sourceElement.forEach((value, key, member) => {
|
|
34
|
-
const keyValue =
|
|
32
|
+
const keyValue = toValue(key);
|
|
35
33
|
let clonedMember;
|
|
36
34
|
if (isObjectElement(targetElement) && targetElement.hasKey(keyValue) && options.isMergeableElement(value)) {
|
|
37
35
|
const targetValue = targetElement.get(keyValue);
|
|
38
|
-
clonedMember =
|
|
36
|
+
clonedMember = cloneShallow(member);
|
|
39
37
|
clonedMember.value = getMergeFunction(key, options)(targetValue, value);
|
|
40
38
|
} else {
|
|
41
|
-
clonedMember =
|
|
39
|
+
clonedMember = cloneShallow(member);
|
|
42
40
|
clonedMember.value = cloneUnlessOtherwiseSpecified(value, options);
|
|
43
41
|
}
|
|
44
42
|
destination.remove(keyValue);
|
|
@@ -55,7 +53,10 @@ export default function deepmerge(targetElement, sourceElement, options) {
|
|
|
55
53
|
objectElementMerge: mergeObjectElement,
|
|
56
54
|
customMerge: undefined
|
|
57
55
|
};
|
|
58
|
-
const mergedOptions =
|
|
56
|
+
const mergedOptions = {
|
|
57
|
+
...defaultOptions,
|
|
58
|
+
...options
|
|
59
|
+
};
|
|
59
60
|
mergedOptions.isMergeableElement = (_mergedOptions$isMerg = mergedOptions.isMergeableElement) !== null && _mergedOptions$isMerg !== void 0 ? _mergedOptions$isMerg : defaultOptions.isMergeableElement;
|
|
60
61
|
mergedOptions.arrayElementMerge = (_mergedOptions$arrayE = mergedOptions.arrayElementMerge) !== null && _mergedOptions$arrayE !== void 0 ? _mergedOptions$arrayE : defaultOptions.arrayElementMerge;
|
|
61
62
|
mergedOptions.objectElementMerge = (_mergedOptions$object = mergedOptions.objectElementMerge) !== null && _mergedOptions$object !== void 0 ? _mergedOptions$object : defaultOptions.objectElementMerge;
|
package/es/index.mjs
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export { dispatchPlugins as dispatchRefractorPlugins } from "./refractor/plugins/utils/index.mjs";
|
|
2
|
+
export { default as refractorPluginElementIdentity } from "./refractor/plugins/element-identity.mjs";
|
|
3
|
+
export { default as refractorPluginSemanticElementIdentity } from "./refractor/plugins/semantic-element-identity.mjs";
|
|
4
|
+
export { default as MediaTypes } from "./media-types.mjs";
|
|
5
|
+
export { Element, MemberElement, KeyValuePair, ObjectSlice, ArraySlice, refract } from 'minim';
|
|
6
|
+
export { default as namespace, Namespace, createNamespace } from "./namespace.mjs";
|
|
7
|
+
export { ObjectElement, ArrayElement, BooleanElement, NullElement, NumberElement, StringElement, LinkElement, RefElement, AnnotationElement, CommentElement, ParseResultElement, SourceMapElement } from "./refractor/registration.mjs";
|
|
8
|
+
export { isElement, isStringElement, isNumberElement, isNullElement, isBooleanElement, isArrayElement, isObjectElement, isMemberElement, isLinkElement, isRefElement, isAnnotationElement, isParseResultElement, isSourceMapElement, isPrimitiveElement, hasElementSourceMap, includesSymbols, includesClasses } from "./predicates/index.mjs";
|
|
9
|
+
export { default as createPredicate } from "./predicates/helpers.mjs";
|
|
10
|
+
export { filter, reject, find, findAtOffset, some, traverse, parents } from "./traversal/index.mjs";
|
|
11
|
+
export { visit, BREAK, mergeAllVisitors, getNodeType, cloneNode, keyMapDefault as keyMap } from "./traversal/visitor.mjs";
|
|
12
|
+
export { transclude, default as Transcluder } from "./transcluder/index.mjs";
|
|
13
|
+
export { dereference } from "./util.mjs";
|
|
14
|
+
export { cloneShallow, cloneDeep } from "./clone/index.mjs";
|
|
15
|
+
export { default as CloneError } from "./clone/errors/CloneError.mjs";
|
|
16
|
+
export { default as DeepCloneError } from "./clone/errors/DeepCloneError.mjs";
|
|
17
|
+
export { default as ShallowCloneError } from "./clone/errors/ShallowCloneError.mjs";
|
|
18
|
+
/**
|
|
19
|
+
* Transforms data to an Element from a particular namespace.
|
|
20
|
+
*/
|
|
21
|
+
export { default as from } from "./transformers/from.mjs";
|
|
22
|
+
/**
|
|
23
|
+
* Transforms the ApiDOM into JavaScript POJO.
|
|
24
|
+
* This POJO would be the result of interpreting the ApiDOM
|
|
25
|
+
* into JavaScript structure.
|
|
26
|
+
*/
|
|
27
|
+
export { default as toValue } from "./transformers/serializers/value/index.mjs";
|
|
28
|
+
/**
|
|
29
|
+
* Transforms the ApiDOM into JSON string.
|
|
30
|
+
*/
|
|
31
|
+
export { default as toJSON } from "./transformers/serializers/json.mjs";
|
|
32
|
+
/**
|
|
33
|
+
* Transforms the ApiDOM into YAML string.
|
|
34
|
+
*/
|
|
35
|
+
export { default as toYAML } from "./transformers/serializers/yaml-1-2.mjs";
|
|
36
|
+
/**
|
|
37
|
+
* Creates a refract representation of an Element.
|
|
38
|
+
* https://github.com/refractproject/refract-spec
|
|
39
|
+
*/
|
|
40
|
+
export { default as dehydrate } from "./transformers/dehydrate.mjs";
|
|
41
|
+
/**
|
|
42
|
+
* Create a refracted string representation of an Element.
|
|
43
|
+
*/
|
|
44
|
+
export { default as toString } from "./transformers/to-string.mjs";
|
|
45
|
+
export { default as sexprs } from "./transformers/sexprs.mjs";
|
|
46
|
+
export { default as deepmerge } from "./deepmerge.mjs";
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
|
|
2
1
|
import { NotImplementedError } from '@swagger-api/apidom-error';
|
|
3
2
|
class MediaTypes extends Array {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
_defineProperty(this, "unknownMediaType", 'application/octet-stream');
|
|
7
|
-
}
|
|
3
|
+
unknownMediaType = 'application/octet-stream';
|
|
4
|
+
|
|
8
5
|
// eslint-disable-next-line class-methods-use-this
|
|
9
6
|
filterByFormat() {
|
|
10
7
|
throw new NotImplementedError('"filterByFormat" method is not implemented.');
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Namespace as MinimNamespace } from 'minim';
|
|
2
2
|
import { isPlainObject } from 'ramda-adjunct';
|
|
3
|
-
import AnnotationElement from "./elements/Annotation.
|
|
4
|
-
import CommentElement from "./elements/Comment.
|
|
5
|
-
import ParseResultElement from "./elements/ParseResult.
|
|
6
|
-
import SourceMapElement from "./elements/SourceMap.
|
|
3
|
+
import AnnotationElement from "./elements/Annotation.mjs";
|
|
4
|
+
import CommentElement from "./elements/Comment.mjs";
|
|
5
|
+
import ParseResultElement from "./elements/ParseResult.mjs";
|
|
6
|
+
import SourceMapElement from "./elements/SourceMap.mjs";
|
|
7
7
|
export class Namespace extends MinimNamespace {
|
|
8
8
|
constructor() {
|
|
9
9
|
super();
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Element, StringElement, NumberElement, NullElement, BooleanElement, ArrayElement, ObjectElement, MemberElement, LinkElement, RefElement } from 'minim';
|
|
2
2
|
import { all } from 'ramda';
|
|
3
3
|
import { included } from 'ramda-adjunct';
|
|
4
|
-
import AnnotationElement from "../elements/Annotation.
|
|
5
|
-
import CommentElement from "../elements/Comment.
|
|
6
|
-
import ParserResultElement from "../elements/ParseResult.
|
|
7
|
-
import SourceMapElement from "../elements/SourceMap.
|
|
8
|
-
import createPredicate, { isElementType as isElementTypeHelper } from "./helpers.
|
|
4
|
+
import AnnotationElement from "../elements/Annotation.mjs";
|
|
5
|
+
import CommentElement from "../elements/Comment.mjs";
|
|
6
|
+
import ParserResultElement from "../elements/ParseResult.mjs";
|
|
7
|
+
import SourceMapElement from "../elements/SourceMap.mjs";
|
|
8
|
+
import createPredicate, { isElementType as isElementTypeHelper } from "./helpers.mjs";
|
|
9
9
|
export const isElement = createPredicate(({
|
|
10
10
|
hasBasicElementProps,
|
|
11
11
|
primitiveEq
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { dispatchPlugins } from "./plugins/utils/index.mjs";
|
|
2
|
+
import { getNodeType } from "../traversal/visitor.mjs";
|
|
3
|
+
import createToolbox from "./toolbox.mjs";
|
|
4
|
+
const refract = (value, {
|
|
5
|
+
Type,
|
|
6
|
+
plugins = []
|
|
7
|
+
}) => {
|
|
8
|
+
/**
|
|
9
|
+
* This is where values gets refracted into generic ApiDOM.
|
|
10
|
+
* We don't allow consumers to hook into this translation.
|
|
11
|
+
* Though we allow consumers to define their onw plugins on already transformed ApiDOM.
|
|
12
|
+
*/
|
|
13
|
+
const element = new Type(value);
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Run plugins only when necessary.
|
|
17
|
+
* Running plugins visitors means extra single traversal === performance hit.
|
|
18
|
+
*/
|
|
19
|
+
return dispatchPlugins(element, plugins, {
|
|
20
|
+
toolboxCreator: createToolbox,
|
|
21
|
+
visitorOptions: {
|
|
22
|
+
nodeTypeGetter: getNodeType
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
export const createRefractor = Type => (value, options = {}) => refract(value, {
|
|
27
|
+
...options,
|
|
28
|
+
Type
|
|
29
|
+
});
|
|
30
|
+
export default refract;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { propOr } from 'ramda';
|
|
2
2
|
import { invokeArgs } from 'ramda-adjunct';
|
|
3
|
-
import createToolbox from "../../toolbox.
|
|
4
|
-
import { getNodeType, mergeAllVisitors, visit } from "../../../traversal/visitor.
|
|
3
|
+
import createToolbox from "../../toolbox.mjs";
|
|
4
|
+
import { getNodeType, mergeAllVisitors, visit } from "../../../traversal/visitor.mjs"; // eslint-disable-next-line import/prefer-default-export
|
|
5
5
|
export const dispatchPlugins = (element, plugins, options = {}) => {
|
|
6
6
|
if (plugins.length === 0) return element;
|
|
7
7
|
const toolboxCreator = propOr(createToolbox, 'toolboxCreator', options);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ObjectElement, ArrayElement, StringElement, BooleanElement, NullElement, NumberElement, LinkElement, RefElement } from 'minim';
|
|
2
|
-
import AnnotationElement from "../elements/Annotation.
|
|
3
|
-
import CommentElement from "../elements/Comment.
|
|
4
|
-
import ParseResultElement from "../elements/ParseResult.
|
|
5
|
-
import SourceMapElement from "../elements/SourceMap.
|
|
6
|
-
import { createRefractor } from "./index.
|
|
2
|
+
import AnnotationElement from "../elements/Annotation.mjs";
|
|
3
|
+
import CommentElement from "../elements/Comment.mjs";
|
|
4
|
+
import ParseResultElement from "../elements/ParseResult.mjs";
|
|
5
|
+
import SourceMapElement from "../elements/SourceMap.mjs";
|
|
6
|
+
import { createRefractor } from "./index.mjs";
|
|
7
7
|
ObjectElement.refract = createRefractor(ObjectElement);
|
|
8
8
|
ArrayElement.refract = createRefractor(ArrayElement);
|
|
9
9
|
StringElement.refract = createRefractor(StringElement);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as basePredicates from "../predicates/index.mjs";
|
|
2
|
+
import defaultNamespaceInstance from "../namespace.mjs";
|
|
3
|
+
const createToolbox = () => {
|
|
4
|
+
const predicates = {
|
|
5
|
+
...basePredicates
|
|
6
|
+
};
|
|
7
|
+
return {
|
|
8
|
+
predicates,
|
|
9
|
+
namespace: defaultNamespaceInstance
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export default createToolbox;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import stampit from 'stampit';
|
|
2
2
|
import { isUndefined } from 'ramda-adjunct';
|
|
3
|
-
import { isObjectElement, isArrayElement, isMemberElement } from "../predicates/index.
|
|
3
|
+
import { isObjectElement, isArrayElement, isMemberElement } from "../predicates/index.mjs";
|
|
4
4
|
const computeEdges = (element, edges = new WeakMap()) => {
|
|
5
5
|
if (isMemberElement(element)) {
|
|
6
6
|
// @ts-ignore
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import defaultNamespaceInstance from "../namespace.mjs";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a refract representation of an Element.
|
|
4
|
+
* https://github.com/refractproject/refract-spec
|
|
5
|
+
*/
|
|
6
|
+
const dehydrate = (element, namespace = defaultNamespaceInstance) => {
|
|
7
|
+
return namespace.toRefract(element);
|
|
8
|
+
};
|
|
9
|
+
export default dehydrate;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { has } from 'ramda';
|
|
2
|
+
import { isPlainObject, isString } from 'ramda-adjunct';
|
|
3
|
+
import defaultNamespaceInstance from "../namespace.mjs";
|
|
4
|
+
/**
|
|
5
|
+
* Transforms data to an Element from a particular namespace.
|
|
6
|
+
*/
|
|
7
|
+
const from = (data, namespace = defaultNamespaceInstance) => {
|
|
8
|
+
if (isString(data)) {
|
|
9
|
+
// JSON serialized refract
|
|
10
|
+
try {
|
|
11
|
+
return namespace.fromRefract(JSON.parse(data));
|
|
12
|
+
} catch {
|
|
13
|
+
// noop
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if (isPlainObject(data) && has('element', data)) {
|
|
17
|
+
// refract javascript structure
|
|
18
|
+
return namespace.fromRefract(data);
|
|
19
|
+
}
|
|
20
|
+
return namespace.toElement(data);
|
|
21
|
+
};
|
|
22
|
+
export default from;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class EphemeralArray {
|
|
2
|
+
type = 'EphemeralArray';
|
|
3
|
+
content = [];
|
|
4
|
+
reference = undefined;
|
|
5
|
+
constructor(content) {
|
|
6
|
+
this.content = content;
|
|
7
|
+
this.reference = [];
|
|
8
|
+
}
|
|
9
|
+
toReference() {
|
|
10
|
+
return this.reference;
|
|
11
|
+
}
|
|
12
|
+
toArray() {
|
|
13
|
+
this.reference.push(...this.content);
|
|
14
|
+
return this.reference;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export default EphemeralArray;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class EphemeralObject {
|
|
2
|
+
type = 'EphemeralObject';
|
|
3
|
+
content = [];
|
|
4
|
+
reference = undefined;
|
|
5
|
+
constructor(content) {
|
|
6
|
+
this.content = content;
|
|
7
|
+
this.reference = {};
|
|
8
|
+
}
|
|
9
|
+
toReference() {
|
|
10
|
+
return this.reference;
|
|
11
|
+
}
|
|
12
|
+
toObject() {
|
|
13
|
+
return Object.assign(this.reference, Object.fromEntries(this.content));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export default EphemeralObject;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import stampit from 'stampit';
|
|
2
|
-
import { visit } from "./visitor.
|
|
3
|
-
import EphemeralArray from "./ast/ephemeral-array.
|
|
4
|
-
import EphemeralObject from "./ast/ephemeral-object.
|
|
2
|
+
import { visit } from "./visitor.mjs";
|
|
3
|
+
import EphemeralArray from "./ast/ephemeral-array.mjs";
|
|
4
|
+
import EphemeralObject from "./ast/ephemeral-object.mjs";
|
|
5
|
+
import { isElement, isBooleanElement, isNumberElement, isStringElement, isNullElement } from "../../../predicates/index.mjs";
|
|
5
6
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
6
7
|
const Visitor = stampit.init(function _Visitor() {
|
|
7
8
|
const references = new WeakMap();
|
|
@@ -56,6 +57,12 @@ const Visitor = stampit.init(function _Visitor() {
|
|
|
56
57
|
/* eslint-enable */
|
|
57
58
|
|
|
58
59
|
const serializer = element => {
|
|
60
|
+
if (!isElement(element)) return element;
|
|
61
|
+
|
|
62
|
+
// shortcut optimization for certain element types
|
|
63
|
+
if (isStringElement(element) || isNumberElement(element) || isBooleanElement(element) || isNullElement(element)) {
|
|
64
|
+
return element.toValue();
|
|
65
|
+
}
|
|
59
66
|
return visit(element, Visitor());
|
|
60
67
|
};
|
|
61
68
|
export default serializer;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { T as stubTrue } from 'ramda';
|
|
2
|
+
import { visit as astVisit, keyMapDefault as baseKeyMap, getNodeType as baseGetNodeType } from "../../../traversal/visitor.mjs";
|
|
3
|
+
const nodeTypeGetter = node => {
|
|
4
|
+
if (typeof (node === null || node === void 0 ? void 0 : node.type) === 'string') {
|
|
5
|
+
return node.type;
|
|
6
|
+
}
|
|
7
|
+
return baseGetNodeType(node);
|
|
8
|
+
};
|
|
9
|
+
const keyMapDefault = {
|
|
10
|
+
EphemeralObject: ['content'],
|
|
11
|
+
EphemeralArray: ['content'],
|
|
12
|
+
...baseKeyMap
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
16
|
+
export const visit = (root,
|
|
17
|
+
// @ts-ignore
|
|
18
|
+
visitor, {
|
|
19
|
+
keyMap = keyMapDefault,
|
|
20
|
+
...rest
|
|
21
|
+
} = {}) => {
|
|
22
|
+
return astVisit(root, visitor, {
|
|
23
|
+
keyMap,
|
|
24
|
+
// @ts-ignore
|
|
25
|
+
nodeTypeGetter,
|
|
26
|
+
nodePredicate: stubTrue,
|
|
27
|
+
detectCycles: false,
|
|
28
|
+
deleteNodeSymbol: Symbol.for('delete-node'),
|
|
29
|
+
skipVisitingNodeSymbol: Symbol.for('skip-visiting-node'),
|
|
30
|
+
...rest
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// @ts-ignore
|
|
35
|
+
visit[Symbol.for('nodejs.util.promisify.custom')] = async (root, {
|
|
36
|
+
keyMap = keyMapDefault,
|
|
37
|
+
...rest
|
|
38
|
+
} = {}) => {
|
|
39
|
+
// @ts-ignore
|
|
40
|
+
return astVisit[Symbol.for('nodejs.util.promisify.custom')](root, visitor, {
|
|
41
|
+
keyMap,
|
|
42
|
+
nodeTypeGetter,
|
|
43
|
+
nodePredicate: stubTrue,
|
|
44
|
+
detectCycles: false,
|
|
45
|
+
deleteNodeSymbol: Symbol.for('delete-node'),
|
|
46
|
+
skipVisitingNodeSymbol: Symbol.for('skip-visiting-node'),
|
|
47
|
+
...rest
|
|
48
|
+
});
|
|
49
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import stampit from 'stampit';
|
|
2
|
-
import { visit } from "
|
|
3
|
-
import serializeValue from "./value/index.
|
|
2
|
+
import { visit } from "../../traversal/visitor.mjs";
|
|
3
|
+
import serializeValue from "./value/index.mjs";
|
|
4
4
|
const YamlVisitor = stampit({
|
|
5
5
|
props: {
|
|
6
6
|
result: '',
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import defaultNamespaceInstance from "../namespace.mjs";
|
|
2
|
+
import dehydrate from "./dehydrate.mjs";
|
|
3
|
+
/**
|
|
4
|
+
* Create a refracted string representation of an Element.
|
|
5
|
+
*/
|
|
6
|
+
const toString = (element, namespace = defaultNamespaceInstance) => {
|
|
7
|
+
const refractStructure = dehydrate(element, namespace);
|
|
8
|
+
return JSON.stringify(refractStructure);
|
|
9
|
+
};
|
|
10
|
+
export default toString;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ArraySlice } from 'minim';
|
|
2
|
-
import { PredicateVisitor, visit } from "./visitor.
|
|
2
|
+
import { PredicateVisitor, visit } from "./visitor.mjs"; // finds all elements matching the predicate
|
|
3
3
|
const filter = (predicate, element) => {
|
|
4
4
|
const visitor = PredicateVisitor({
|
|
5
5
|
predicate
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { pathOr } from 'ramda';
|
|
2
|
-
import { PredicateVisitor, BREAK, visit } from "./visitor.
|
|
2
|
+
import { PredicateVisitor, BREAK, visit } from "./visitor.mjs"; // find first element that satisfies the provided predicate
|
|
3
3
|
const find = (predicate, element) => {
|
|
4
4
|
const visitor = PredicateVisitor({
|
|
5
5
|
predicate,
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import stampit from 'stampit';
|
|
2
2
|
import { last, pathOr } from 'ramda';
|
|
3
3
|
import { isNumber } from 'ramda-adjunct';
|
|
4
|
-
import { hasElementSourceMap } from "../predicates/index.
|
|
5
|
-
import { visit } from "./visitor.
|
|
4
|
+
import { hasElementSourceMap } from "../predicates/index.mjs";
|
|
5
|
+
import { visit } from "./visitor.mjs";
|
|
6
|
+
import toValue from "../transformers/serializers/value/index.mjs";
|
|
6
7
|
const Visitor = stampit({
|
|
7
8
|
props: {
|
|
8
9
|
result: [],
|
|
@@ -25,8 +26,8 @@ const Visitor = stampit({
|
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
const sourceMapElement = element.getMetaProperty('sourceMap');
|
|
28
|
-
const charStart = sourceMapElement.positionStart.get(2)
|
|
29
|
-
const charEnd = sourceMapElement.positionEnd.get(2)
|
|
29
|
+
const charStart = toValue(sourceMapElement.positionStart.get(2));
|
|
30
|
+
const charEnd = toValue(sourceMapElement.positionEnd.get(2));
|
|
30
31
|
const isWithinOffsetRange = this.offset >= charStart && (this.offset < charEnd || this.includeRightBound && this.offset <= charEnd);
|
|
31
32
|
if (isWithinOffsetRange) {
|
|
32
33
|
this.result.push(element);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { default as filter } from "./filter.mjs";
|
|
2
|
+
export { default as find } from "./find.mjs";
|
|
3
|
+
export { default as findAtOffset } from "./findAtOffset.mjs";
|
|
4
|
+
export { default as reject } from "./reject.mjs";
|
|
5
|
+
export { default as some } from "./some.mjs";
|
|
6
|
+
export { default as traverse } from "./traverse.mjs";
|
|
7
|
+
export { default as parents } from "./parents.mjs";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isNotUndefined } from 'ramda-adjunct';
|
|
2
|
-
import find from "./find.
|
|
2
|
+
import find from "./find.mjs"; // tests whether at least one element passes the predicate
|
|
3
3
|
const some = (predicate, element) => {
|
|
4
4
|
return isNotUndefined(find(predicate, element));
|
|
5
5
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import stampit from 'stampit';
|
|
2
2
|
import { pathOr } from 'ramda';
|
|
3
3
|
import { isFunction, noop } from 'ramda-adjunct';
|
|
4
|
-
import { visit, PredicateVisitor } from "./visitor.
|
|
5
|
-
import { isElement } from "../predicates/index.
|
|
4
|
+
import { visit, PredicateVisitor } from "./visitor.mjs";
|
|
5
|
+
import { isElement } from "../predicates/index.mjs";
|
|
6
6
|
export const CallbackVisitor = stampit(PredicateVisitor, {
|
|
7
7
|
props: {
|
|
8
8
|
callback: noop
|