@speclynx/apidom-core 1.12.2 → 2.1.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 +25 -0
- package/NOTICE +16 -7
- package/README.md +102 -330
- package/dist/apidom-core.browser.js +13110 -10559
- package/dist/apidom-core.browser.min.js +1 -1
- package/package.json +7 -12
- package/src/identity/index.cjs +8 -6
- package/src/identity/index.mjs +6 -4
- package/src/index.cjs +13 -79
- package/src/index.mjs +3 -13
- package/src/merge/deepmerge.cjs +22 -20
- package/src/merge/deepmerge.mjs +9 -7
- package/src/merge/merge-right.cjs +2 -2
- package/src/merge/merge-right.mjs +1 -1
- package/src/namespace.cjs +4 -36
- package/src/namespace.mjs +2 -30
- package/src/refractor/plugins/dispatcher/index.cjs +5 -12
- package/src/refractor/plugins/dispatcher/index.mjs +5 -12
- package/src/refractor/plugins/element-identity.cjs +2 -2
- package/src/refractor/plugins/element-identity.mjs +2 -2
- package/src/refractor/plugins/semantic-element-identity.cjs +5 -10
- package/src/refractor/plugins/semantic-element-identity.mjs +5 -9
- package/src/refractor/toolbox.cjs +22 -5
- package/src/refractor/toolbox.mjs +25 -6
- package/src/specification.cjs +51 -0
- package/src/specification.mjs +47 -0
- package/src/transcluder/Transcluder.cjs +8 -8
- package/src/transcluder/Transcluder.mjs +1 -1
- package/src/transformers/from.mjs +2 -2
- package/src/transformers/serializers/json.cjs +2 -2
- package/src/transformers/serializers/json.mjs +1 -1
- package/src/transformers/serializers/value.cjs +50 -0
- package/src/transformers/serializers/value.mjs +47 -0
- package/src/transformers/serializers/yaml-1-2.cjs +22 -18
- package/src/transformers/serializers/yaml-1-2.mjs +22 -18
- package/src/transformers/sexprs.cjs +20 -23
- package/src/transformers/sexprs.mjs +20 -22
- package/src/transformers/to-string.mjs +2 -2
- package/types/apidom-core.d.ts +67 -519
- package/src/clone/errors/CloneError.cjs +0 -22
- package/src/clone/errors/CloneError.mjs +0 -19
- package/src/clone/errors/DeepCloneError.cjs +0 -11
- package/src/clone/errors/DeepCloneError.mjs +0 -6
- package/src/clone/errors/ShallowCloneError.cjs +0 -11
- package/src/clone/errors/ShallowCloneError.mjs +0 -6
- package/src/clone/index.cjs +0 -155
- package/src/clone/index.mjs +0 -146
- package/src/elements/Annotation.cjs +0 -23
- package/src/elements/Annotation.mjs +0 -20
- package/src/elements/Comment.cjs +0 -15
- package/src/elements/Comment.mjs +0 -12
- package/src/elements/ParseResult.cjs +0 -53
- package/src/elements/ParseResult.mjs +0 -50
- package/src/elements/SourceMap.cjs +0 -39
- package/src/elements/SourceMap.mjs +0 -36
- package/src/predicates/helpers.cjs +0 -85
- package/src/predicates/helpers.mjs +0 -77
- package/src/predicates/index.cjs +0 -208
- package/src/predicates/index.mjs +0 -198
- package/src/refractor/index.cjs +0 -46
- package/src/refractor/index.mjs +0 -40
- package/src/refractor/registration.cjs +0 -34
- package/src/refractor/registration.mjs +0 -19
- package/src/transformers/serializers/value/ast/ephemeral-array.cjs +0 -21
- package/src/transformers/serializers/value/ast/ephemeral-array.mjs +0 -17
- package/src/transformers/serializers/value/ast/ephemeral-object.cjs +0 -20
- package/src/transformers/serializers/value/ast/ephemeral-object.mjs +0 -16
- package/src/transformers/serializers/value/index.cjs +0 -85
- package/src/transformers/serializers/value/index.mjs +0 -80
- package/src/transformers/serializers/value/visitor.cjs +0 -52
- package/src/transformers/serializers/value/visitor.mjs +0 -47
- package/src/traversal/filter.cjs +0 -18
- package/src/traversal/filter.mjs +0 -14
- package/src/traversal/find.cjs +0 -19
- package/src/traversal/find.mjs +0 -15
- package/src/traversal/findAtOffset.cjs +0 -65
- package/src/traversal/findAtOffset.mjs +0 -60
- package/src/traversal/index.cjs +0 -19
- package/src/traversal/index.mjs +0 -7
- package/src/traversal/parents.cjs +0 -38
- package/src/traversal/parents.mjs +0 -34
- package/src/traversal/reject.cjs +0 -15
- package/src/traversal/reject.mjs +0 -10
- package/src/traversal/some.cjs +0 -15
- package/src/traversal/some.mjs +0 -10
- package/src/traversal/traverse.cjs +0 -60
- package/src/traversal/traverse.mjs +0 -53
- package/src/traversal/visitor.cjs +0 -123
- package/src/traversal/visitor.mjs +0 -115
- package/src/util.cjs +0 -28
- package/src/util.mjs +0 -24
- package/types/minim.d.ts +0 -236
|
@@ -2,20 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
4
|
exports.default = void 0;
|
|
5
|
+
var _apidomDatamodel = require("@speclynx/apidom-datamodel");
|
|
5
6
|
var _index = require("../../identity/index.cjs");
|
|
6
|
-
/**
|
|
7
|
-
* @public
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
7
|
/**
|
|
11
8
|
* Plugin for decorating every semantic element in ApiDOM tree with UUID.
|
|
12
9
|
* @public
|
|
13
10
|
*/
|
|
14
11
|
const plugin = ({
|
|
15
12
|
length = 6
|
|
16
|
-
} = {}) => ({
|
|
17
|
-
predicates
|
|
18
|
-
}) => {
|
|
13
|
+
} = {}) => () => {
|
|
19
14
|
let identityManager;
|
|
20
15
|
return {
|
|
21
16
|
pre() {
|
|
@@ -24,9 +19,9 @@ const plugin = ({
|
|
|
24
19
|
});
|
|
25
20
|
},
|
|
26
21
|
visitor: {
|
|
27
|
-
enter(
|
|
28
|
-
if (!
|
|
29
|
-
|
|
22
|
+
enter(path) {
|
|
23
|
+
if (!(0, _apidomDatamodel.isPrimitiveElement)(path.node)) {
|
|
24
|
+
path.node.id = identityManager.identify(path.node);
|
|
30
25
|
}
|
|
31
26
|
}
|
|
32
27
|
},
|
|
@@ -1,16 +1,12 @@
|
|
|
1
|
+
import { isPrimitiveElement } from '@speclynx/apidom-datamodel';
|
|
1
2
|
import { IdentityManager } from "../../identity/index.mjs";
|
|
2
|
-
/**
|
|
3
|
-
* @public
|
|
4
|
-
*/
|
|
5
3
|
/**
|
|
6
4
|
* Plugin for decorating every semantic element in ApiDOM tree with UUID.
|
|
7
5
|
* @public
|
|
8
6
|
*/
|
|
9
7
|
const plugin = ({
|
|
10
8
|
length = 6
|
|
11
|
-
} = {}) => ({
|
|
12
|
-
predicates
|
|
13
|
-
}) => {
|
|
9
|
+
} = {}) => () => {
|
|
14
10
|
let identityManager;
|
|
15
11
|
return {
|
|
16
12
|
pre() {
|
|
@@ -19,9 +15,9 @@ const plugin = ({
|
|
|
19
15
|
});
|
|
20
16
|
},
|
|
21
17
|
visitor: {
|
|
22
|
-
enter(
|
|
23
|
-
if (!
|
|
24
|
-
|
|
18
|
+
enter(path) {
|
|
19
|
+
if (!isPrimitiveElement(path.node)) {
|
|
20
|
+
path.node.id = identityManager.identify(path.node);
|
|
25
21
|
}
|
|
26
22
|
}
|
|
27
23
|
},
|
|
@@ -1,15 +1,35 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
|
4
|
-
var _interopRequireWildcard = require("@babel/runtime-corejs3/helpers/interopRequireWildcard").default;
|
|
5
4
|
exports.__esModule = true;
|
|
6
5
|
exports.default = void 0;
|
|
7
|
-
var
|
|
6
|
+
var _apidomDatamodel = require("@speclynx/apidom-datamodel");
|
|
8
7
|
var _namespace = _interopRequireDefault(require("../namespace.cjs"));
|
|
9
8
|
/**
|
|
10
9
|
* @public
|
|
11
10
|
*/
|
|
12
11
|
|
|
12
|
+
const predicates = {
|
|
13
|
+
isElement: _apidomDatamodel.isElement,
|
|
14
|
+
isStringElement: _apidomDatamodel.isStringElement,
|
|
15
|
+
isNumberElement: _apidomDatamodel.isNumberElement,
|
|
16
|
+
isNullElement: _apidomDatamodel.isNullElement,
|
|
17
|
+
isBooleanElement: _apidomDatamodel.isBooleanElement,
|
|
18
|
+
isArrayElement: _apidomDatamodel.isArrayElement,
|
|
19
|
+
isObjectElement: _apidomDatamodel.isObjectElement,
|
|
20
|
+
isMemberElement: _apidomDatamodel.isMemberElement,
|
|
21
|
+
isPrimitiveElement: _apidomDatamodel.isPrimitiveElement,
|
|
22
|
+
isLinkElement: _apidomDatamodel.isLinkElement,
|
|
23
|
+
isRefElement: _apidomDatamodel.isRefElement,
|
|
24
|
+
isAnnotationElement: _apidomDatamodel.isAnnotationElement,
|
|
25
|
+
isCommentElement: _apidomDatamodel.isCommentElement,
|
|
26
|
+
isParseResultElement: _apidomDatamodel.isParseResultElement,
|
|
27
|
+
isSourceMapElement: _apidomDatamodel.isSourceMapElement,
|
|
28
|
+
hasElementSourceMap: _apidomDatamodel.hasElementSourceMap,
|
|
29
|
+
includesSymbols: _apidomDatamodel.includesSymbols,
|
|
30
|
+
includesClasses: _apidomDatamodel.includesClasses
|
|
31
|
+
};
|
|
32
|
+
|
|
13
33
|
/**
|
|
14
34
|
* @public
|
|
15
35
|
*/
|
|
@@ -18,9 +38,6 @@ var _namespace = _interopRequireDefault(require("../namespace.cjs"));
|
|
|
18
38
|
* @public
|
|
19
39
|
*/
|
|
20
40
|
const createToolbox = () => {
|
|
21
|
-
const predicates = {
|
|
22
|
-
...basePredicates
|
|
23
|
-
};
|
|
24
41
|
return {
|
|
25
42
|
predicates,
|
|
26
43
|
namespace: _namespace.default
|
|
@@ -1,21 +1,40 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import { isElement, isStringElement, isNumberElement, isNullElement, isBooleanElement, isArrayElement, isObjectElement, isMemberElement, isPrimitiveElement, isLinkElement, isRefElement, isAnnotationElement, isCommentElement, isParseResultElement, isSourceMapElement, hasElementSourceMap, includesSymbols, includesClasses } from '@speclynx/apidom-datamodel';
|
|
2
|
+
import defaultNamespace from "../namespace.mjs";
|
|
3
3
|
/**
|
|
4
4
|
* @public
|
|
5
5
|
*/
|
|
6
|
+
const predicates = {
|
|
7
|
+
isElement,
|
|
8
|
+
isStringElement,
|
|
9
|
+
isNumberElement,
|
|
10
|
+
isNullElement,
|
|
11
|
+
isBooleanElement,
|
|
12
|
+
isArrayElement,
|
|
13
|
+
isObjectElement,
|
|
14
|
+
isMemberElement,
|
|
15
|
+
isPrimitiveElement,
|
|
16
|
+
isLinkElement,
|
|
17
|
+
isRefElement,
|
|
18
|
+
isAnnotationElement,
|
|
19
|
+
isCommentElement,
|
|
20
|
+
isParseResultElement,
|
|
21
|
+
isSourceMapElement,
|
|
22
|
+
hasElementSourceMap,
|
|
23
|
+
includesSymbols,
|
|
24
|
+
includesClasses
|
|
25
|
+
};
|
|
26
|
+
|
|
6
27
|
/**
|
|
7
28
|
* @public
|
|
8
29
|
*/
|
|
30
|
+
|
|
9
31
|
/**
|
|
10
32
|
* @public
|
|
11
33
|
*/
|
|
12
34
|
const createToolbox = () => {
|
|
13
|
-
const predicates = {
|
|
14
|
-
...basePredicates
|
|
15
|
-
};
|
|
16
35
|
return {
|
|
17
36
|
predicates,
|
|
18
|
-
namespace:
|
|
37
|
+
namespace: defaultNamespace
|
|
19
38
|
};
|
|
20
39
|
};
|
|
21
40
|
export default createToolbox;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.resolveSpecification = void 0;
|
|
5
|
+
var _ramda = require("ramda");
|
|
6
|
+
var _ramdaAdjunct = require("ramda-adjunct");
|
|
7
|
+
/**
|
|
8
|
+
* Base type for resolved specification objects.
|
|
9
|
+
* Extend this in namespace packages to add specific type information.
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const specCache = new WeakMap();
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Resolves a specification object by:
|
|
17
|
+
* 1. Dereferencing all $ref pointers
|
|
18
|
+
* 2. Building elementMap from objects with `element` property
|
|
19
|
+
* 3. Caching results for efficiency
|
|
20
|
+
*
|
|
21
|
+
* @public
|
|
22
|
+
*/
|
|
23
|
+
const resolveSpecification = specification => {
|
|
24
|
+
if (specCache.has(specification)) {
|
|
25
|
+
return specCache.get(specification);
|
|
26
|
+
}
|
|
27
|
+
const elementMap = {};
|
|
28
|
+
const traverse = (obj, root, currentPath) => {
|
|
29
|
+
// Collect element mapping
|
|
30
|
+
if (typeof obj.element === 'string') {
|
|
31
|
+
elementMap[obj.element] = obj.$visitor ? [...currentPath, '$visitor'] : currentPath;
|
|
32
|
+
}
|
|
33
|
+
return (0, _ramda.mapObjIndexed)((val, key) => {
|
|
34
|
+
const newPath = [...currentPath, key];
|
|
35
|
+
if ((0, _ramdaAdjunct.isPlainObject)(val) && (0, _ramda.has)('$ref', val) && (0, _ramda.propSatisfies)(_ramdaAdjunct.isString, '$ref', val)) {
|
|
36
|
+
const $ref = (0, _ramda.path)(['$ref'], val);
|
|
37
|
+
const pointer = (0, _ramdaAdjunct.trimCharsStart)('#/', $ref);
|
|
38
|
+
return (0, _ramda.path)(pointer.split('/'), root);
|
|
39
|
+
}
|
|
40
|
+
if ((0, _ramdaAdjunct.isPlainObject)(val)) {
|
|
41
|
+
return traverse(val, root, newPath);
|
|
42
|
+
}
|
|
43
|
+
return val;
|
|
44
|
+
}, obj);
|
|
45
|
+
};
|
|
46
|
+
const resolved = traverse(specification, specification, []);
|
|
47
|
+
resolved.elementMap = elementMap;
|
|
48
|
+
specCache.set(specification, resolved);
|
|
49
|
+
return resolved;
|
|
50
|
+
};
|
|
51
|
+
exports.resolveSpecification = resolveSpecification;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { mapObjIndexed, path, has, propSatisfies } from 'ramda';
|
|
2
|
+
import { isPlainObject, trimCharsStart, isString } from 'ramda-adjunct';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Base type for resolved specification objects.
|
|
6
|
+
* Extend this in namespace packages to add specific type information.
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const specCache = new WeakMap();
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Resolves a specification object by:
|
|
14
|
+
* 1. Dereferencing all $ref pointers
|
|
15
|
+
* 2. Building elementMap from objects with `element` property
|
|
16
|
+
* 3. Caching results for efficiency
|
|
17
|
+
*
|
|
18
|
+
* @public
|
|
19
|
+
*/
|
|
20
|
+
export const resolveSpecification = specification => {
|
|
21
|
+
if (specCache.has(specification)) {
|
|
22
|
+
return specCache.get(specification);
|
|
23
|
+
}
|
|
24
|
+
const elementMap = {};
|
|
25
|
+
const traverse = (obj, root, currentPath) => {
|
|
26
|
+
// Collect element mapping
|
|
27
|
+
if (typeof obj.element === 'string') {
|
|
28
|
+
elementMap[obj.element] = obj.$visitor ? [...currentPath, '$visitor'] : currentPath;
|
|
29
|
+
}
|
|
30
|
+
return mapObjIndexed((val, key) => {
|
|
31
|
+
const newPath = [...currentPath, key];
|
|
32
|
+
if (isPlainObject(val) && has('$ref', val) && propSatisfies(isString, '$ref', val)) {
|
|
33
|
+
const $ref = path(['$ref'], val);
|
|
34
|
+
const pointer = trimCharsStart('#/', $ref);
|
|
35
|
+
return path(pointer.split('/'), root);
|
|
36
|
+
}
|
|
37
|
+
if (isPlainObject(val)) {
|
|
38
|
+
return traverse(val, root, newPath);
|
|
39
|
+
}
|
|
40
|
+
return val;
|
|
41
|
+
}, obj);
|
|
42
|
+
};
|
|
43
|
+
const resolved = traverse(specification, specification, []);
|
|
44
|
+
resolved.elementMap = elementMap;
|
|
45
|
+
specCache.set(specification, resolved);
|
|
46
|
+
return resolved;
|
|
47
|
+
};
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
4
|
exports.default = void 0;
|
|
5
|
+
var _apidomDatamodel = require("@speclynx/apidom-datamodel");
|
|
5
6
|
var _ramdaAdjunct = require("ramda-adjunct");
|
|
6
|
-
var _index = require("../predicates/index.cjs");
|
|
7
7
|
const computeEdges = (element, edges = new WeakMap()) => {
|
|
8
|
-
if ((0,
|
|
8
|
+
if ((0, _apidomDatamodel.isMemberElement)(element)) {
|
|
9
9
|
// @ts-ignore
|
|
10
10
|
edges.set(element.key, element);
|
|
11
11
|
// @ts-ignore
|
|
@@ -24,7 +24,7 @@ const computeEdges = (element, edges = new WeakMap()) => {
|
|
|
24
24
|
};
|
|
25
25
|
const transcludeChildOfMemberElement = (search, replace, edges) => {
|
|
26
26
|
const memberElement = edges.get(search);
|
|
27
|
-
if (!(0,
|
|
27
|
+
if (!(0, _apidomDatamodel.isMemberElement)(memberElement)) {
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
30
|
if (memberElement.key === search) {
|
|
@@ -40,7 +40,7 @@ const transcludeChildOfMemberElement = (search, replace, edges) => {
|
|
|
40
40
|
};
|
|
41
41
|
const transcludeChildOfObjectElement = (search, replace, edges) => {
|
|
42
42
|
const objectElement = edges.get(search);
|
|
43
|
-
if (!(0,
|
|
43
|
+
if (!(0, _apidomDatamodel.isObjectElement)(objectElement)) {
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
46
46
|
objectElement.content = objectElement.map((value, key, member) => {
|
|
@@ -54,7 +54,7 @@ const transcludeChildOfObjectElement = (search, replace, edges) => {
|
|
|
54
54
|
};
|
|
55
55
|
const transcludeChildOfArrayElement = (search, replace, edges) => {
|
|
56
56
|
const arrayElement = edges.get(search);
|
|
57
|
-
if (!(0,
|
|
57
|
+
if (!(0, _apidomDatamodel.isArrayElement)(arrayElement)) {
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
60
|
arrayElement.content = arrayElement.map(element => {
|
|
@@ -97,12 +97,12 @@ class Transcluder {
|
|
|
97
97
|
* isArrayElement returns true for ObjectElements.
|
|
98
98
|
* (classical problems with polymorphism)
|
|
99
99
|
*/
|
|
100
|
-
if ((0,
|
|
100
|
+
if ((0, _apidomDatamodel.isObjectElement)(parent)) {
|
|
101
101
|
// @ts-ignore
|
|
102
102
|
transcludeChildOfObjectElement(search, replace, this.edges);
|
|
103
|
-
} else if ((0,
|
|
103
|
+
} else if ((0, _apidomDatamodel.isArrayElement)(parent)) {
|
|
104
104
|
transcludeChildOfArrayElement(search, replace, this.edges);
|
|
105
|
-
} else if ((0,
|
|
105
|
+
} else if ((0, _apidomDatamodel.isMemberElement)(parent)) {
|
|
106
106
|
transcludeChildOfMemberElement(search, replace, this.edges);
|
|
107
107
|
}
|
|
108
108
|
return this.element;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { isObjectElement, isArrayElement, isMemberElement } from '@speclynx/apidom-datamodel';
|
|
1
2
|
import { isUndefined } from 'ramda-adjunct';
|
|
2
|
-
import { isObjectElement, isArrayElement, isMemberElement } from "../predicates/index.mjs";
|
|
3
3
|
const computeEdges = (element, edges = new WeakMap()) => {
|
|
4
4
|
if (isMemberElement(element)) {
|
|
5
5
|
// @ts-ignore
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { has } from 'ramda';
|
|
2
2
|
import { isPlainObject, isString } from 'ramda-adjunct';
|
|
3
|
-
import
|
|
3
|
+
import defaultNamespace from "../namespace.mjs";
|
|
4
4
|
/**
|
|
5
5
|
* Transforms data to an Element from a particular namespace.
|
|
6
6
|
*
|
|
@@ -11,7 +11,7 @@ import defaultNamespaceInstance from "../namespace.mjs";
|
|
|
11
11
|
* - https://github.com/swagger-api/swagger-ui/issues/9466#issuecomment-1881053410
|
|
12
12
|
* @public
|
|
13
13
|
*/
|
|
14
|
-
const fromFn = (data, namespace =
|
|
14
|
+
const fromFn = (data, namespace = defaultNamespace) => {
|
|
15
15
|
if (isString(data)) {
|
|
16
16
|
// JSON serialized refract
|
|
17
17
|
try {
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
|
4
4
|
exports.__esModule = true;
|
|
5
5
|
exports.default = void 0;
|
|
6
|
-
var
|
|
6
|
+
var _value = _interopRequireDefault(require("./value.cjs"));
|
|
7
7
|
/**
|
|
8
8
|
* @public
|
|
9
9
|
*/
|
|
10
|
-
const serializer = (element, replacer, space) => JSON.stringify((0,
|
|
10
|
+
const serializer = (element, replacer, space) => JSON.stringify((0, _value.default)(element), replacer, space);
|
|
11
11
|
var _default = exports.default = serializer;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.default = void 0;
|
|
5
|
+
var _apidomDatamodel = require("@speclynx/apidom-datamodel");
|
|
6
|
+
/**
|
|
7
|
+
* Transforms the ApiDOM into JavaScript POJO.
|
|
8
|
+
* This POJO would be the result of interpreting the ApiDOM
|
|
9
|
+
* into JavaScript structure.
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
const serializer = element => {
|
|
13
|
+
if (!(0, _apidomDatamodel.isElement)(element)) return element;
|
|
14
|
+
|
|
15
|
+
// Shortcut optimization for primitive element types
|
|
16
|
+
if ((0, _apidomDatamodel.isStringElement)(element) || (0, _apidomDatamodel.isNumberElement)(element) || (0, _apidomDatamodel.isBooleanElement)(element) || (0, _apidomDatamodel.isNullElement)(element)) {
|
|
17
|
+
return element.toValue();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// WeakMap for cycle handling - stores references to already-visited elements
|
|
21
|
+
const references = new WeakMap();
|
|
22
|
+
const serialize = node => {
|
|
23
|
+
if (!(0, _apidomDatamodel.isElement)(node)) return node;
|
|
24
|
+
if ((0, _apidomDatamodel.isObjectElement)(node)) {
|
|
25
|
+
if (references.has(node)) return references.get(node);
|
|
26
|
+
const obj = {};
|
|
27
|
+
references.set(node, obj);
|
|
28
|
+
node.forEach((value, key) => {
|
|
29
|
+
const k = serialize(key);
|
|
30
|
+
const v = serialize(value);
|
|
31
|
+
if (typeof k === 'string') obj[k] = v;
|
|
32
|
+
});
|
|
33
|
+
return obj;
|
|
34
|
+
}
|
|
35
|
+
if ((0, _apidomDatamodel.isArrayElement)(node)) {
|
|
36
|
+
if (references.has(node)) return references.get(node);
|
|
37
|
+
const arr = [];
|
|
38
|
+
references.set(node, arr);
|
|
39
|
+
node.forEach(item => arr.push(serialize(item)));
|
|
40
|
+
return arr;
|
|
41
|
+
}
|
|
42
|
+
if ((0, _apidomDatamodel.isRefElement)(node)) return String(node.toValue());
|
|
43
|
+
if ((0, _apidomDatamodel.isLinkElement)(node)) {
|
|
44
|
+
return (0, _apidomDatamodel.isStringElement)(node.href) ? node.href.toValue() : '';
|
|
45
|
+
}
|
|
46
|
+
return node.toValue();
|
|
47
|
+
};
|
|
48
|
+
return serialize(element);
|
|
49
|
+
};
|
|
50
|
+
var _default = exports.default = serializer;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { isElement, isObjectElement, isArrayElement, isRefElement, isLinkElement, isStringElement, isBooleanElement, isNumberElement, isNullElement } from '@speclynx/apidom-datamodel';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Transforms the ApiDOM into JavaScript POJO.
|
|
5
|
+
* This POJO would be the result of interpreting the ApiDOM
|
|
6
|
+
* into JavaScript structure.
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
const serializer = element => {
|
|
10
|
+
if (!isElement(element)) return element;
|
|
11
|
+
|
|
12
|
+
// Shortcut optimization for primitive element types
|
|
13
|
+
if (isStringElement(element) || isNumberElement(element) || isBooleanElement(element) || isNullElement(element)) {
|
|
14
|
+
return element.toValue();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// WeakMap for cycle handling - stores references to already-visited elements
|
|
18
|
+
const references = new WeakMap();
|
|
19
|
+
const serialize = node => {
|
|
20
|
+
if (!isElement(node)) return node;
|
|
21
|
+
if (isObjectElement(node)) {
|
|
22
|
+
if (references.has(node)) return references.get(node);
|
|
23
|
+
const obj = {};
|
|
24
|
+
references.set(node, obj);
|
|
25
|
+
node.forEach((value, key) => {
|
|
26
|
+
const k = serialize(key);
|
|
27
|
+
const v = serialize(value);
|
|
28
|
+
if (typeof k === 'string') obj[k] = v;
|
|
29
|
+
});
|
|
30
|
+
return obj;
|
|
31
|
+
}
|
|
32
|
+
if (isArrayElement(node)) {
|
|
33
|
+
if (references.has(node)) return references.get(node);
|
|
34
|
+
const arr = [];
|
|
35
|
+
references.set(node, arr);
|
|
36
|
+
node.forEach(item => arr.push(serialize(item)));
|
|
37
|
+
return arr;
|
|
38
|
+
}
|
|
39
|
+
if (isRefElement(node)) return String(node.toValue());
|
|
40
|
+
if (isLinkElement(node)) {
|
|
41
|
+
return isStringElement(node.href) ? node.href.toValue() : '';
|
|
42
|
+
}
|
|
43
|
+
return node.toValue();
|
|
44
|
+
};
|
|
45
|
+
return serialize(element);
|
|
46
|
+
};
|
|
47
|
+
export default serializer;
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
|
4
4
|
exports.__esModule = true;
|
|
5
5
|
exports.default = void 0;
|
|
6
|
-
var
|
|
7
|
-
var
|
|
6
|
+
var _apidomTraverse = require("@speclynx/apidom-traverse");
|
|
7
|
+
var _value = _interopRequireDefault(require("./value.cjs"));
|
|
8
8
|
class YamlVisitor {
|
|
9
9
|
static indentChar = ' ';
|
|
10
10
|
result;
|
|
@@ -16,42 +16,46 @@ class YamlVisitor {
|
|
|
16
16
|
this.result = directive ? '%YAML 1.2\n---\n' : '';
|
|
17
17
|
this.indent = indent;
|
|
18
18
|
}
|
|
19
|
-
NumberElement(
|
|
20
|
-
this.result += (0,
|
|
19
|
+
NumberElement(path) {
|
|
20
|
+
this.result += (0, _value.default)(path.node);
|
|
21
21
|
}
|
|
22
|
-
BooleanElement(
|
|
23
|
-
const value = (0,
|
|
22
|
+
BooleanElement(path) {
|
|
23
|
+
const value = (0, _value.default)(path.node);
|
|
24
24
|
this.result += value ? 'true' : 'false';
|
|
25
25
|
}
|
|
26
|
-
StringElement(
|
|
26
|
+
StringElement(path) {
|
|
27
27
|
// for simplicity and avoiding ambiguity we always wrap strings in quotes
|
|
28
|
-
this.result += JSON.stringify((0,
|
|
28
|
+
this.result += JSON.stringify((0, _value.default)(path.node));
|
|
29
29
|
}
|
|
30
30
|
NullElement() {
|
|
31
31
|
this.result += 'null';
|
|
32
32
|
}
|
|
33
|
-
ArrayElement(
|
|
33
|
+
ArrayElement(path) {
|
|
34
|
+
const element = path.node;
|
|
34
35
|
if (element.length === 0) {
|
|
35
36
|
this.result += '[]';
|
|
36
|
-
|
|
37
|
+
path.skip();
|
|
38
|
+
return;
|
|
37
39
|
}
|
|
38
40
|
element.forEach(item => {
|
|
39
41
|
const visitor = new YamlVisitor({
|
|
40
42
|
indent: this.indent + 1
|
|
41
43
|
});
|
|
42
44
|
const indent = YamlVisitor.indentChar.repeat(this.indent);
|
|
43
|
-
(0,
|
|
45
|
+
(0, _apidomTraverse.traverse)(item, visitor);
|
|
44
46
|
const {
|
|
45
47
|
result
|
|
46
48
|
} = visitor;
|
|
47
49
|
this.result += result.startsWith('\n') ? `\n${indent}-${result}` : `\n${indent}- ${result}`;
|
|
48
50
|
});
|
|
49
|
-
|
|
51
|
+
path.skip();
|
|
50
52
|
}
|
|
51
|
-
ObjectElement(
|
|
53
|
+
ObjectElement(path) {
|
|
54
|
+
const element = path.node;
|
|
52
55
|
if (element.length === 0) {
|
|
53
56
|
this.result += '{}';
|
|
54
|
-
|
|
57
|
+
path.skip();
|
|
58
|
+
return;
|
|
55
59
|
}
|
|
56
60
|
element.forEach((value, key) => {
|
|
57
61
|
const keyVisitor = new YamlVisitor({
|
|
@@ -61,8 +65,8 @@ class YamlVisitor {
|
|
|
61
65
|
indent: this.indent + 1
|
|
62
66
|
});
|
|
63
67
|
const indent = YamlVisitor.indentChar.repeat(this.indent);
|
|
64
|
-
(0,
|
|
65
|
-
(0,
|
|
68
|
+
(0, _apidomTraverse.traverse)(key, keyVisitor);
|
|
69
|
+
(0, _apidomTraverse.traverse)(value, valueVisitor);
|
|
66
70
|
const {
|
|
67
71
|
result: keyResult
|
|
68
72
|
} = keyVisitor;
|
|
@@ -71,7 +75,7 @@ class YamlVisitor {
|
|
|
71
75
|
} = valueVisitor;
|
|
72
76
|
this.result += valueResult.startsWith('\n') ? `\n${indent}${keyResult}:${valueResult}` : `\n${indent}${keyResult}: ${valueResult}`;
|
|
73
77
|
});
|
|
74
|
-
|
|
78
|
+
path.skip();
|
|
75
79
|
}
|
|
76
80
|
}
|
|
77
81
|
|
|
@@ -84,7 +88,7 @@ const serializer = (element, {
|
|
|
84
88
|
const visitor = new YamlVisitor({
|
|
85
89
|
directive
|
|
86
90
|
});
|
|
87
|
-
(0,
|
|
91
|
+
(0, _apidomTraverse.traverse)(element, visitor);
|
|
88
92
|
return visitor.result;
|
|
89
93
|
};
|
|
90
94
|
var _default = exports.default = serializer;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import serializeValue from "./value
|
|
1
|
+
import { traverse } from '@speclynx/apidom-traverse';
|
|
2
|
+
import serializeValue from "./value.mjs";
|
|
3
3
|
class YamlVisitor {
|
|
4
4
|
static indentChar = ' ';
|
|
5
5
|
result;
|
|
@@ -11,42 +11,46 @@ class YamlVisitor {
|
|
|
11
11
|
this.result = directive ? '%YAML 1.2\n---\n' : '';
|
|
12
12
|
this.indent = indent;
|
|
13
13
|
}
|
|
14
|
-
NumberElement(
|
|
15
|
-
this.result += serializeValue(
|
|
14
|
+
NumberElement(path) {
|
|
15
|
+
this.result += serializeValue(path.node);
|
|
16
16
|
}
|
|
17
|
-
BooleanElement(
|
|
18
|
-
const value = serializeValue(
|
|
17
|
+
BooleanElement(path) {
|
|
18
|
+
const value = serializeValue(path.node);
|
|
19
19
|
this.result += value ? 'true' : 'false';
|
|
20
20
|
}
|
|
21
|
-
StringElement(
|
|
21
|
+
StringElement(path) {
|
|
22
22
|
// for simplicity and avoiding ambiguity we always wrap strings in quotes
|
|
23
|
-
this.result += JSON.stringify(serializeValue(
|
|
23
|
+
this.result += JSON.stringify(serializeValue(path.node));
|
|
24
24
|
}
|
|
25
25
|
NullElement() {
|
|
26
26
|
this.result += 'null';
|
|
27
27
|
}
|
|
28
|
-
ArrayElement(
|
|
28
|
+
ArrayElement(path) {
|
|
29
|
+
const element = path.node;
|
|
29
30
|
if (element.length === 0) {
|
|
30
31
|
this.result += '[]';
|
|
31
|
-
|
|
32
|
+
path.skip();
|
|
33
|
+
return;
|
|
32
34
|
}
|
|
33
35
|
element.forEach(item => {
|
|
34
36
|
const visitor = new YamlVisitor({
|
|
35
37
|
indent: this.indent + 1
|
|
36
38
|
});
|
|
37
39
|
const indent = YamlVisitor.indentChar.repeat(this.indent);
|
|
38
|
-
|
|
40
|
+
traverse(item, visitor);
|
|
39
41
|
const {
|
|
40
42
|
result
|
|
41
43
|
} = visitor;
|
|
42
44
|
this.result += result.startsWith('\n') ? `\n${indent}-${result}` : `\n${indent}- ${result}`;
|
|
43
45
|
});
|
|
44
|
-
|
|
46
|
+
path.skip();
|
|
45
47
|
}
|
|
46
|
-
ObjectElement(
|
|
48
|
+
ObjectElement(path) {
|
|
49
|
+
const element = path.node;
|
|
47
50
|
if (element.length === 0) {
|
|
48
51
|
this.result += '{}';
|
|
49
|
-
|
|
52
|
+
path.skip();
|
|
53
|
+
return;
|
|
50
54
|
}
|
|
51
55
|
element.forEach((value, key) => {
|
|
52
56
|
const keyVisitor = new YamlVisitor({
|
|
@@ -56,8 +60,8 @@ class YamlVisitor {
|
|
|
56
60
|
indent: this.indent + 1
|
|
57
61
|
});
|
|
58
62
|
const indent = YamlVisitor.indentChar.repeat(this.indent);
|
|
59
|
-
|
|
60
|
-
|
|
63
|
+
traverse(key, keyVisitor);
|
|
64
|
+
traverse(value, valueVisitor);
|
|
61
65
|
const {
|
|
62
66
|
result: keyResult
|
|
63
67
|
} = keyVisitor;
|
|
@@ -66,7 +70,7 @@ class YamlVisitor {
|
|
|
66
70
|
} = valueVisitor;
|
|
67
71
|
this.result += valueResult.startsWith('\n') ? `\n${indent}${keyResult}:${valueResult}` : `\n${indent}${keyResult}: ${valueResult}`;
|
|
68
72
|
});
|
|
69
|
-
|
|
73
|
+
path.skip();
|
|
70
74
|
}
|
|
71
75
|
}
|
|
72
76
|
|
|
@@ -79,7 +83,7 @@ const serializer = (element, {
|
|
|
79
83
|
const visitor = new YamlVisitor({
|
|
80
84
|
directive
|
|
81
85
|
});
|
|
82
|
-
|
|
86
|
+
traverse(element, visitor);
|
|
83
87
|
return visitor.result;
|
|
84
88
|
};
|
|
85
89
|
export default serializer;
|