@speclynx/apidom-core 1.12.1
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 +82 -0
- package/LICENSE +202 -0
- package/LICENSES/AFL-3.0.txt +182 -0
- package/LICENSES/Apache-2.0.txt +202 -0
- package/LICENSES/BSD-3-Clause.txt +26 -0
- package/LICENSES/MIT.txt +9 -0
- package/NOTICE +65 -0
- package/README.md +881 -0
- package/dist/apidom-core.browser.js +14724 -0
- package/dist/apidom-core.browser.min.js +1 -0
- package/package.json +67 -0
- package/src/clone/errors/CloneError.cjs +22 -0
- package/src/clone/errors/CloneError.mjs +19 -0
- package/src/clone/errors/DeepCloneError.cjs +11 -0
- package/src/clone/errors/DeepCloneError.mjs +6 -0
- package/src/clone/errors/ShallowCloneError.cjs +11 -0
- package/src/clone/errors/ShallowCloneError.mjs +6 -0
- package/src/clone/index.cjs +155 -0
- package/src/clone/index.mjs +146 -0
- package/src/elements/Annotation.cjs +23 -0
- package/src/elements/Annotation.mjs +20 -0
- package/src/elements/Comment.cjs +15 -0
- package/src/elements/Comment.mjs +12 -0
- package/src/elements/ParseResult.cjs +53 -0
- package/src/elements/ParseResult.mjs +50 -0
- package/src/elements/SourceMap.cjs +39 -0
- package/src/elements/SourceMap.mjs +36 -0
- package/src/identity/errors/ElementIdentityError.cjs +22 -0
- package/src/identity/errors/ElementIdentityError.mjs +19 -0
- package/src/identity/index.cjs +62 -0
- package/src/identity/index.mjs +56 -0
- package/src/index.cjs +112 -0
- package/src/index.mjs +50 -0
- package/src/media-types.cjs +21 -0
- package/src/media-types.mjs +18 -0
- package/src/merge/deepmerge.cjs +151 -0
- package/src/merge/deepmerge.mjs +135 -0
- package/src/merge/merge-left.cjs +16 -0
- package/src/merge/merge-left.mjs +11 -0
- package/src/merge/merge-right.cjs +35 -0
- package/src/merge/merge-right.mjs +29 -0
- package/src/namespace.cjs +42 -0
- package/src/namespace.mjs +35 -0
- package/src/predicates/helpers.cjs +85 -0
- package/src/predicates/helpers.mjs +77 -0
- package/src/predicates/index.cjs +208 -0
- package/src/predicates/index.mjs +198 -0
- package/src/refractor/index.cjs +46 -0
- package/src/refractor/index.mjs +40 -0
- package/src/refractor/plugins/dispatcher/index.cjs +71 -0
- package/src/refractor/plugins/dispatcher/index.mjs +61 -0
- package/src/refractor/plugins/element-identity.cjs +31 -0
- package/src/refractor/plugins/element-identity.mjs +26 -0
- package/src/refractor/plugins/semantic-element-identity.cjs +38 -0
- package/src/refractor/plugins/semantic-element-identity.mjs +33 -0
- package/src/refractor/registration.cjs +34 -0
- package/src/refractor/registration.mjs +19 -0
- package/src/refractor/toolbox.cjs +29 -0
- package/src/refractor/toolbox.mjs +21 -0
- package/src/transcluder/Transcluder.cjs +111 -0
- package/src/transcluder/Transcluder.mjs +107 -0
- package/src/transcluder/index.cjs +19 -0
- package/src/transcluder/index.mjs +13 -0
- package/src/transformers/dehydrate.cjs +15 -0
- package/src/transformers/dehydrate.mjs +10 -0
- package/src/transformers/from.cjs +34 -0
- package/src/transformers/from.mjs +29 -0
- package/src/transformers/serializers/json.cjs +11 -0
- package/src/transformers/serializers/json.mjs +6 -0
- package/src/transformers/serializers/value/ast/ephemeral-array.cjs +21 -0
- package/src/transformers/serializers/value/ast/ephemeral-array.mjs +17 -0
- package/src/transformers/serializers/value/ast/ephemeral-object.cjs +20 -0
- package/src/transformers/serializers/value/ast/ephemeral-object.mjs +16 -0
- package/src/transformers/serializers/value/index.cjs +85 -0
- package/src/transformers/serializers/value/index.mjs +80 -0
- package/src/transformers/serializers/value/visitor.cjs +52 -0
- package/src/transformers/serializers/value/visitor.mjs +47 -0
- package/src/transformers/serializers/yaml-1-2.cjs +90 -0
- package/src/transformers/serializers/yaml-1-2.mjs +85 -0
- package/src/transformers/sexprs.cjs +34 -0
- package/src/transformers/sexprs.mjs +30 -0
- package/src/transformers/to-string.cjs +16 -0
- package/src/transformers/to-string.mjs +11 -0
- package/src/traversal/filter.cjs +18 -0
- package/src/traversal/filter.mjs +14 -0
- package/src/traversal/find.cjs +19 -0
- package/src/traversal/find.mjs +15 -0
- package/src/traversal/findAtOffset.cjs +65 -0
- package/src/traversal/findAtOffset.mjs +60 -0
- package/src/traversal/index.cjs +19 -0
- package/src/traversal/index.mjs +7 -0
- package/src/traversal/parents.cjs +38 -0
- package/src/traversal/parents.mjs +34 -0
- package/src/traversal/reject.cjs +15 -0
- package/src/traversal/reject.mjs +10 -0
- package/src/traversal/some.cjs +15 -0
- package/src/traversal/some.mjs +10 -0
- package/src/traversal/traverse.cjs +60 -0
- package/src/traversal/traverse.mjs +53 -0
- package/src/traversal/visitor.cjs +123 -0
- package/src/traversal/visitor.mjs +115 -0
- package/src/util.cjs +28 -0
- package/src/util.mjs +24 -0
- package/types/apidom-core.d.ts +806 -0
- package/types/minim.d.ts +236 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { last, pathOr } from 'ramda';
|
|
2
|
+
import { isNumber } from 'ramda-adjunct';
|
|
3
|
+
import { hasElementSourceMap } from "../predicates/index.mjs";
|
|
4
|
+
import { visit } from "./visitor.mjs";
|
|
5
|
+
import toValue from "../transformers/serializers/value/index.mjs";
|
|
6
|
+
class Visitor {
|
|
7
|
+
result;
|
|
8
|
+
offset;
|
|
9
|
+
includeRightBound;
|
|
10
|
+
constructor({
|
|
11
|
+
offset = 0,
|
|
12
|
+
includeRightBound = false
|
|
13
|
+
} = {}) {
|
|
14
|
+
this.result = [];
|
|
15
|
+
this.offset = offset;
|
|
16
|
+
this.includeRightBound = includeRightBound;
|
|
17
|
+
}
|
|
18
|
+
enter(element) {
|
|
19
|
+
if (!hasElementSourceMap(element)) {
|
|
20
|
+
return undefined; // dive in
|
|
21
|
+
}
|
|
22
|
+
const sourceMapElement = element.getMetaProperty('sourceMap');
|
|
23
|
+
const charStart = toValue(sourceMapElement.positionStart.get(2));
|
|
24
|
+
const charEnd = toValue(sourceMapElement.positionEnd.get(2));
|
|
25
|
+
const isWithinOffsetRange = this.offset >= charStart && (this.offset < charEnd || this.includeRightBound && this.offset <= charEnd);
|
|
26
|
+
if (isWithinOffsetRange) {
|
|
27
|
+
this.result.push(element);
|
|
28
|
+
return undefined; // push to stack and dive in
|
|
29
|
+
}
|
|
30
|
+
return false; // skip entire sub-tree
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @public
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Finds the most inner node at the given offset.
|
|
40
|
+
* If includeRightBound is set, also finds nodes that end at the given offset.
|
|
41
|
+
* @public
|
|
42
|
+
*/
|
|
43
|
+
const findAtOffset = (options, element) => {
|
|
44
|
+
let offset;
|
|
45
|
+
let includeRightBound;
|
|
46
|
+
if (isNumber(options)) {
|
|
47
|
+
offset = options;
|
|
48
|
+
includeRightBound = false;
|
|
49
|
+
} else {
|
|
50
|
+
offset = pathOr(0, ['offset'], options);
|
|
51
|
+
includeRightBound = pathOr(false, ['includeRightBound'], options);
|
|
52
|
+
}
|
|
53
|
+
const visitor = new Visitor({
|
|
54
|
+
offset,
|
|
55
|
+
includeRightBound
|
|
56
|
+
});
|
|
57
|
+
visit(element, visitor);
|
|
58
|
+
return last(visitor.result);
|
|
59
|
+
};
|
|
60
|
+
export default findAtOffset;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
|
4
|
+
exports.__esModule = true;
|
|
5
|
+
exports.traverse = exports.some = exports.reject = exports.parents = exports.findAtOffset = exports.find = exports.filter = void 0;
|
|
6
|
+
var _filter = _interopRequireDefault(require("./filter.cjs"));
|
|
7
|
+
exports.filter = _filter.default;
|
|
8
|
+
var _find = _interopRequireDefault(require("./find.cjs"));
|
|
9
|
+
exports.find = _find.default;
|
|
10
|
+
var _findAtOffset = _interopRequireDefault(require("./findAtOffset.cjs"));
|
|
11
|
+
exports.findAtOffset = _findAtOffset.default;
|
|
12
|
+
var _reject = _interopRequireDefault(require("./reject.cjs"));
|
|
13
|
+
exports.reject = _reject.default;
|
|
14
|
+
var _some = _interopRequireDefault(require("./some.cjs"));
|
|
15
|
+
exports.some = _some.default;
|
|
16
|
+
var _traverse = _interopRequireDefault(require("./traverse.cjs"));
|
|
17
|
+
exports.traverse = _traverse.default;
|
|
18
|
+
var _parents = _interopRequireDefault(require("./parents.cjs"));
|
|
19
|
+
exports.parents = _parents.default;
|
|
@@ -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";
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.default = void 0;
|
|
5
|
+
var _visitor = require("./visitor.cjs");
|
|
6
|
+
class Visitor {
|
|
7
|
+
parentEdges;
|
|
8
|
+
parent;
|
|
9
|
+
constructor() {
|
|
10
|
+
this.parentEdges = new WeakMap();
|
|
11
|
+
}
|
|
12
|
+
ObjectElement(objectElement) {
|
|
13
|
+
this.parentEdges.set(objectElement, this.parent);
|
|
14
|
+
this.parent = objectElement;
|
|
15
|
+
}
|
|
16
|
+
ArrayElement(arrayElement) {
|
|
17
|
+
this.parentEdges.set(arrayElement, this.parent);
|
|
18
|
+
this.parent = arrayElement;
|
|
19
|
+
}
|
|
20
|
+
MemberElement(memberElement) {
|
|
21
|
+
this.parentEdges.set(memberElement, this.parent);
|
|
22
|
+
this.parent = memberElement;
|
|
23
|
+
}
|
|
24
|
+
enter(element) {
|
|
25
|
+
this.parentEdges.set(element, this.parent);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Computes upwards edges from every child to its parent.
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
const parents = element => {
|
|
34
|
+
const visitor = new Visitor();
|
|
35
|
+
(0, _visitor.visit)(element, visitor);
|
|
36
|
+
return visitor.parentEdges;
|
|
37
|
+
};
|
|
38
|
+
var _default = exports.default = parents;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { visit } from "./visitor.mjs";
|
|
2
|
+
class Visitor {
|
|
3
|
+
parentEdges;
|
|
4
|
+
parent;
|
|
5
|
+
constructor() {
|
|
6
|
+
this.parentEdges = new WeakMap();
|
|
7
|
+
}
|
|
8
|
+
ObjectElement(objectElement) {
|
|
9
|
+
this.parentEdges.set(objectElement, this.parent);
|
|
10
|
+
this.parent = objectElement;
|
|
11
|
+
}
|
|
12
|
+
ArrayElement(arrayElement) {
|
|
13
|
+
this.parentEdges.set(arrayElement, this.parent);
|
|
14
|
+
this.parent = arrayElement;
|
|
15
|
+
}
|
|
16
|
+
MemberElement(memberElement) {
|
|
17
|
+
this.parentEdges.set(memberElement, this.parent);
|
|
18
|
+
this.parent = memberElement;
|
|
19
|
+
}
|
|
20
|
+
enter(element) {
|
|
21
|
+
this.parentEdges.set(element, this.parent);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Computes upwards edges from every child to its parent.
|
|
27
|
+
* @public
|
|
28
|
+
*/
|
|
29
|
+
const parents = element => {
|
|
30
|
+
const visitor = new Visitor();
|
|
31
|
+
visit(element, visitor);
|
|
32
|
+
return visitor.parentEdges;
|
|
33
|
+
};
|
|
34
|
+
export default parents;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
|
4
|
+
exports.__esModule = true;
|
|
5
|
+
exports.default = void 0;
|
|
6
|
+
var _ramda = require("ramda");
|
|
7
|
+
var _filter = _interopRequireDefault(require("./filter.cjs"));
|
|
8
|
+
/**
|
|
9
|
+
* Complement of filter.
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
const reject = (predicate, element) => {
|
|
13
|
+
return (0, _filter.default)((0, _ramda.complement)(predicate), element);
|
|
14
|
+
};
|
|
15
|
+
var _default = exports.default = reject;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
|
4
|
+
exports.__esModule = true;
|
|
5
|
+
exports.default = void 0;
|
|
6
|
+
var _ramdaAdjunct = require("ramda-adjunct");
|
|
7
|
+
var _find = _interopRequireDefault(require("./find.cjs"));
|
|
8
|
+
/**
|
|
9
|
+
* Tests whether at least one element passes the predicate.
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
const some = (predicate, element) => {
|
|
13
|
+
return (0, _ramdaAdjunct.isNotUndefined)((0, _find.default)(predicate, element));
|
|
14
|
+
};
|
|
15
|
+
var _default = exports.default = some;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { isNotUndefined } from 'ramda-adjunct';
|
|
2
|
+
import find from "./find.mjs";
|
|
3
|
+
/**
|
|
4
|
+
* Tests whether at least one element passes the predicate.
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
const some = (predicate, element) => {
|
|
8
|
+
return isNotUndefined(find(predicate, element));
|
|
9
|
+
};
|
|
10
|
+
export default some;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.default = exports.CallbackVisitor = void 0;
|
|
5
|
+
var _ramda = require("ramda");
|
|
6
|
+
var _ramdaAdjunct = require("ramda-adjunct");
|
|
7
|
+
var _visitor = require("./visitor.cjs");
|
|
8
|
+
var _index = require("../predicates/index.cjs");
|
|
9
|
+
/**
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
class CallbackVisitor extends _visitor.PredicateVisitor {
|
|
18
|
+
callback;
|
|
19
|
+
constructor({
|
|
20
|
+
callback = _ramdaAdjunct.noop,
|
|
21
|
+
...rest
|
|
22
|
+
} = {}) {
|
|
23
|
+
super({
|
|
24
|
+
...rest
|
|
25
|
+
});
|
|
26
|
+
this.callback = callback;
|
|
27
|
+
}
|
|
28
|
+
enter(element) {
|
|
29
|
+
if (this.predicate(element)) {
|
|
30
|
+
this.callback(element);
|
|
31
|
+
return this.returnOnTrue;
|
|
32
|
+
}
|
|
33
|
+
return this.returnOnFalse;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Executes the callback on this element and all descendants.
|
|
39
|
+
* @public
|
|
40
|
+
*/
|
|
41
|
+
exports.CallbackVisitor = CallbackVisitor;
|
|
42
|
+
const traverse = (options, element) => {
|
|
43
|
+
let callback;
|
|
44
|
+
let predicate;
|
|
45
|
+
if ((0, _ramdaAdjunct.isFunction)(options)) {
|
|
46
|
+
callback = options;
|
|
47
|
+
predicate = _index.isElement;
|
|
48
|
+
} else {
|
|
49
|
+
callback = (0, _ramda.pathOr)(_ramdaAdjunct.noop, ['callback'], options);
|
|
50
|
+
predicate = (0, _ramda.pathOr)(_index.isElement, ['predicate'], options);
|
|
51
|
+
}
|
|
52
|
+
const visitor = new CallbackVisitor({
|
|
53
|
+
callback,
|
|
54
|
+
predicate
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// @ts-ignore
|
|
58
|
+
(0, _visitor.visit)(element, visitor);
|
|
59
|
+
};
|
|
60
|
+
var _default = exports.default = traverse;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { pathOr } from 'ramda';
|
|
2
|
+
import { isFunction, noop } from 'ramda-adjunct';
|
|
3
|
+
import { visit, PredicateVisitor } from "./visitor.mjs";
|
|
4
|
+
import { isElement } from "../predicates/index.mjs";
|
|
5
|
+
/**
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
export class CallbackVisitor extends PredicateVisitor {
|
|
12
|
+
callback;
|
|
13
|
+
constructor({
|
|
14
|
+
callback = noop,
|
|
15
|
+
...rest
|
|
16
|
+
} = {}) {
|
|
17
|
+
super({
|
|
18
|
+
...rest
|
|
19
|
+
});
|
|
20
|
+
this.callback = callback;
|
|
21
|
+
}
|
|
22
|
+
enter(element) {
|
|
23
|
+
if (this.predicate(element)) {
|
|
24
|
+
this.callback(element);
|
|
25
|
+
return this.returnOnTrue;
|
|
26
|
+
}
|
|
27
|
+
return this.returnOnFalse;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Executes the callback on this element and all descendants.
|
|
33
|
+
* @public
|
|
34
|
+
*/
|
|
35
|
+
const traverse = (options, element) => {
|
|
36
|
+
let callback;
|
|
37
|
+
let predicate;
|
|
38
|
+
if (isFunction(options)) {
|
|
39
|
+
callback = options;
|
|
40
|
+
predicate = isElement;
|
|
41
|
+
} else {
|
|
42
|
+
callback = pathOr(noop, ['callback'], options);
|
|
43
|
+
predicate = pathOr(isElement, ['predicate'], options);
|
|
44
|
+
}
|
|
45
|
+
const visitor = new CallbackVisitor({
|
|
46
|
+
callback,
|
|
47
|
+
predicate
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// @ts-ignore
|
|
51
|
+
visit(element, visitor);
|
|
52
|
+
};
|
|
53
|
+
export default traverse;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.visit = exports.keyMapDefault = exports.isNode = exports.getNodeType = exports.cloneNode = exports.PredicateVisitor = void 0;
|
|
5
|
+
var _ramda = require("ramda");
|
|
6
|
+
var _ramdaAdjunct = require("ramda-adjunct");
|
|
7
|
+
var _apidomAst = require("@speclynx/apidom-ast");
|
|
8
|
+
exports.BREAK = _apidomAst.BREAK;
|
|
9
|
+
exports.mergeAllVisitors = _apidomAst.mergeAllVisitors;
|
|
10
|
+
var _index = require("../predicates/index.cjs");
|
|
11
|
+
var _index2 = require("../clone/index.cjs");
|
|
12
|
+
/**
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
const getNodeType = element => {
|
|
16
|
+
/*
|
|
17
|
+
* We're translating every possible higher element type to primitive minim type here.
|
|
18
|
+
* We're using polymorphism to recognize any higher element type as ObjectElement or ArrayElement.
|
|
19
|
+
* Using polymorphism allows us to assume any namespace.
|
|
20
|
+
*
|
|
21
|
+
* There is a problem with naming visitor methods described here: https://github.com/babel/babel/discussions/12874
|
|
22
|
+
*/
|
|
23
|
+
return (0, _index.isObjectElement)(element) ? 'ObjectElement' : (0, _index.isArrayElement)(element) ? 'ArrayElement' : (0, _index.isMemberElement)(element) ? 'MemberElement' : (0, _index.isStringElement)(element) ? 'StringElement' : (0, _index.isBooleanElement)(element) ? 'BooleanElement' : (0, _index.isNumberElement)(element) ? 'NumberElement' : (0, _index.isNullElement)(element) ? 'NullElement' : (0, _index.isLinkElement)(element) ? 'LinkElement' : (0, _index.isRefElement)(element) ? 'RefElement' : undefined;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @public
|
|
28
|
+
*/
|
|
29
|
+
exports.getNodeType = getNodeType;
|
|
30
|
+
const cloneNode = node => {
|
|
31
|
+
if ((0, _index.isElement)(node)) {
|
|
32
|
+
return (0, _index2.cloneShallow)(node);
|
|
33
|
+
}
|
|
34
|
+
return (0, _apidomAst.cloneNode)(node);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// isNode :: Node -> Boolean
|
|
38
|
+
exports.cloneNode = cloneNode;
|
|
39
|
+
const isNode = exports.isNode = (0, _ramda.pipe)(getNodeType, _ramdaAdjunct.isString);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @public
|
|
43
|
+
*/
|
|
44
|
+
const keyMapDefault = exports.keyMapDefault = {
|
|
45
|
+
ObjectElement: ['content'],
|
|
46
|
+
ArrayElement: ['content'],
|
|
47
|
+
MemberElement: ['key', 'value'],
|
|
48
|
+
StringElement: [],
|
|
49
|
+
BooleanElement: [],
|
|
50
|
+
NumberElement: [],
|
|
51
|
+
NullElement: [],
|
|
52
|
+
RefElement: [],
|
|
53
|
+
LinkElement: [],
|
|
54
|
+
Annotation: [],
|
|
55
|
+
Comment: [],
|
|
56
|
+
ParseResultElement: ['content'],
|
|
57
|
+
SourceMap: ['content']
|
|
58
|
+
};
|
|
59
|
+
class PredicateVisitor {
|
|
60
|
+
result;
|
|
61
|
+
predicate;
|
|
62
|
+
returnOnTrue;
|
|
63
|
+
returnOnFalse;
|
|
64
|
+
constructor({
|
|
65
|
+
predicate = _ramda.F,
|
|
66
|
+
returnOnTrue,
|
|
67
|
+
returnOnFalse
|
|
68
|
+
} = {}) {
|
|
69
|
+
this.result = [];
|
|
70
|
+
this.predicate = predicate;
|
|
71
|
+
this.returnOnTrue = returnOnTrue;
|
|
72
|
+
this.returnOnFalse = returnOnFalse;
|
|
73
|
+
}
|
|
74
|
+
enter(element) {
|
|
75
|
+
if (this.predicate(element)) {
|
|
76
|
+
this.result.push(element);
|
|
77
|
+
return this.returnOnTrue;
|
|
78
|
+
}
|
|
79
|
+
return this.returnOnFalse;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* @public
|
|
85
|
+
*/
|
|
86
|
+
exports.PredicateVisitor = PredicateVisitor;
|
|
87
|
+
const visit = (root,
|
|
88
|
+
// @ts-ignore
|
|
89
|
+
visitor, {
|
|
90
|
+
keyMap = keyMapDefault,
|
|
91
|
+
...rest
|
|
92
|
+
} = {}) => {
|
|
93
|
+
// @ts-ignore
|
|
94
|
+
return (0, _apidomAst.visit)(root, visitor, {
|
|
95
|
+
// @ts-ignore
|
|
96
|
+
keyMap,
|
|
97
|
+
// @ts-ignore
|
|
98
|
+
nodeTypeGetter: getNodeType,
|
|
99
|
+
nodePredicate: isNode,
|
|
100
|
+
nodeCloneFn: cloneNode,
|
|
101
|
+
...rest
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// @ts-ignore
|
|
106
|
+
exports.visit = visit;
|
|
107
|
+
visit[Symbol.for('nodejs.util.promisify.custom')] = async (root,
|
|
108
|
+
// @ts-ignore
|
|
109
|
+
visitor, {
|
|
110
|
+
keyMap = keyMapDefault,
|
|
111
|
+
...rest
|
|
112
|
+
} = {}) => {
|
|
113
|
+
// @ts-ignore
|
|
114
|
+
return _apidomAst.visit[Symbol.for('nodejs.util.promisify.custom')](root, visitor, {
|
|
115
|
+
// @ts-ignore
|
|
116
|
+
keyMap,
|
|
117
|
+
// @ts-ignore
|
|
118
|
+
nodeTypeGetter: getNodeType,
|
|
119
|
+
nodePredicate: isNode,
|
|
120
|
+
nodeCloneFn: cloneNode,
|
|
121
|
+
...rest
|
|
122
|
+
});
|
|
123
|
+
};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { F as stubFalse, pipe } from 'ramda';
|
|
2
|
+
import { isString } from 'ramda-adjunct';
|
|
3
|
+
import { visit as astVisit, BREAK, mergeAllVisitors, cloneNode as cloneNodeDefault } from '@speclynx/apidom-ast';
|
|
4
|
+
import { isElement, isMemberElement, isArrayElement, isStringElement, isBooleanElement, isLinkElement, isRefElement, isObjectElement, isNullElement, isNumberElement } from "../predicates/index.mjs";
|
|
5
|
+
import { cloneShallow } from "../clone/index.mjs";
|
|
6
|
+
export { BREAK, mergeAllVisitors };
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
export const getNodeType = element => {
|
|
12
|
+
/*
|
|
13
|
+
* We're translating every possible higher element type to primitive minim type here.
|
|
14
|
+
* We're using polymorphism to recognize any higher element type as ObjectElement or ArrayElement.
|
|
15
|
+
* Using polymorphism allows us to assume any namespace.
|
|
16
|
+
*
|
|
17
|
+
* There is a problem with naming visitor methods described here: https://github.com/babel/babel/discussions/12874
|
|
18
|
+
*/
|
|
19
|
+
return isObjectElement(element) ? 'ObjectElement' : isArrayElement(element) ? 'ArrayElement' : isMemberElement(element) ? 'MemberElement' : isStringElement(element) ? 'StringElement' : isBooleanElement(element) ? 'BooleanElement' : isNumberElement(element) ? 'NumberElement' : isNullElement(element) ? 'NullElement' : isLinkElement(element) ? 'LinkElement' : isRefElement(element) ? 'RefElement' : undefined;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @public
|
|
24
|
+
*/
|
|
25
|
+
export const cloneNode = node => {
|
|
26
|
+
if (isElement(node)) {
|
|
27
|
+
return cloneShallow(node);
|
|
28
|
+
}
|
|
29
|
+
return cloneNodeDefault(node);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// isNode :: Node -> Boolean
|
|
33
|
+
export const isNode = pipe(getNodeType, isString);
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @public
|
|
37
|
+
*/
|
|
38
|
+
export const keyMapDefault = {
|
|
39
|
+
ObjectElement: ['content'],
|
|
40
|
+
ArrayElement: ['content'],
|
|
41
|
+
MemberElement: ['key', 'value'],
|
|
42
|
+
StringElement: [],
|
|
43
|
+
BooleanElement: [],
|
|
44
|
+
NumberElement: [],
|
|
45
|
+
NullElement: [],
|
|
46
|
+
RefElement: [],
|
|
47
|
+
LinkElement: [],
|
|
48
|
+
Annotation: [],
|
|
49
|
+
Comment: [],
|
|
50
|
+
ParseResultElement: ['content'],
|
|
51
|
+
SourceMap: ['content']
|
|
52
|
+
};
|
|
53
|
+
export class PredicateVisitor {
|
|
54
|
+
result;
|
|
55
|
+
predicate;
|
|
56
|
+
returnOnTrue;
|
|
57
|
+
returnOnFalse;
|
|
58
|
+
constructor({
|
|
59
|
+
predicate = stubFalse,
|
|
60
|
+
returnOnTrue,
|
|
61
|
+
returnOnFalse
|
|
62
|
+
} = {}) {
|
|
63
|
+
this.result = [];
|
|
64
|
+
this.predicate = predicate;
|
|
65
|
+
this.returnOnTrue = returnOnTrue;
|
|
66
|
+
this.returnOnFalse = returnOnFalse;
|
|
67
|
+
}
|
|
68
|
+
enter(element) {
|
|
69
|
+
if (this.predicate(element)) {
|
|
70
|
+
this.result.push(element);
|
|
71
|
+
return this.returnOnTrue;
|
|
72
|
+
}
|
|
73
|
+
return this.returnOnFalse;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @public
|
|
79
|
+
*/
|
|
80
|
+
export const visit = (root,
|
|
81
|
+
// @ts-ignore
|
|
82
|
+
visitor, {
|
|
83
|
+
keyMap = keyMapDefault,
|
|
84
|
+
...rest
|
|
85
|
+
} = {}) => {
|
|
86
|
+
// @ts-ignore
|
|
87
|
+
return astVisit(root, visitor, {
|
|
88
|
+
// @ts-ignore
|
|
89
|
+
keyMap,
|
|
90
|
+
// @ts-ignore
|
|
91
|
+
nodeTypeGetter: getNodeType,
|
|
92
|
+
nodePredicate: isNode,
|
|
93
|
+
nodeCloneFn: cloneNode,
|
|
94
|
+
...rest
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
// @ts-ignore
|
|
99
|
+
visit[Symbol.for('nodejs.util.promisify.custom')] = async (root,
|
|
100
|
+
// @ts-ignore
|
|
101
|
+
visitor, {
|
|
102
|
+
keyMap = keyMapDefault,
|
|
103
|
+
...rest
|
|
104
|
+
} = {}) => {
|
|
105
|
+
// @ts-ignore
|
|
106
|
+
return astVisit[Symbol.for('nodejs.util.promisify.custom')](root, visitor, {
|
|
107
|
+
// @ts-ignore
|
|
108
|
+
keyMap,
|
|
109
|
+
// @ts-ignore
|
|
110
|
+
nodeTypeGetter: getNodeType,
|
|
111
|
+
nodePredicate: isNode,
|
|
112
|
+
nodeCloneFn: cloneNode,
|
|
113
|
+
...rest
|
|
114
|
+
});
|
|
115
|
+
};
|
package/src/util.cjs
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.dereference = void 0;
|
|
5
|
+
var _ramda = require("ramda");
|
|
6
|
+
var _ramdaAdjunct = require("ramda-adjunct");
|
|
7
|
+
/**
|
|
8
|
+
* This dereference algorithm is used exclusively for dereferencing specification objects.
|
|
9
|
+
* It doesn't handle circular references of external references and works on objects only (not arrays).
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const dereference = (object, root) => {
|
|
14
|
+
const rootObject = (0, _ramda.defaultTo)(object, root);
|
|
15
|
+
return (0, _ramda.mapObjIndexed)(val => {
|
|
16
|
+
if ((0, _ramdaAdjunct.isPlainObject)(val) && (0, _ramda.has)('$ref', val) && (0, _ramda.propSatisfies)(_ramdaAdjunct.isString, '$ref', val)) {
|
|
17
|
+
const $ref = (0, _ramda.path)(['$ref'], val);
|
|
18
|
+
// @ts-ignore
|
|
19
|
+
const pointer = (0, _ramdaAdjunct.trimCharsStart)('#/', $ref);
|
|
20
|
+
return (0, _ramda.path)(pointer.split('/'), rootObject);
|
|
21
|
+
}
|
|
22
|
+
if ((0, _ramdaAdjunct.isPlainObject)(val)) {
|
|
23
|
+
return dereference(val, rootObject);
|
|
24
|
+
}
|
|
25
|
+
return val;
|
|
26
|
+
}, object);
|
|
27
|
+
};
|
|
28
|
+
exports.dereference = dereference;
|
package/src/util.mjs
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { defaultTo, has, mapObjIndexed, path, propSatisfies } from 'ramda';
|
|
2
|
+
import { isPlainObject, isString, trimCharsStart } from 'ramda-adjunct';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* This dereference algorithm is used exclusively for dereferencing specification objects.
|
|
6
|
+
* It doesn't handle circular references of external references and works on objects only (not arrays).
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export const dereference = (object, root) => {
|
|
11
|
+
const rootObject = defaultTo(object, root);
|
|
12
|
+
return mapObjIndexed(val => {
|
|
13
|
+
if (isPlainObject(val) && has('$ref', val) && propSatisfies(isString, '$ref', val)) {
|
|
14
|
+
const $ref = path(['$ref'], val);
|
|
15
|
+
// @ts-ignore
|
|
16
|
+
const pointer = trimCharsStart('#/', $ref);
|
|
17
|
+
return path(pointer.split('/'), rootObject);
|
|
18
|
+
}
|
|
19
|
+
if (isPlainObject(val)) {
|
|
20
|
+
return dereference(val, rootObject);
|
|
21
|
+
}
|
|
22
|
+
return val;
|
|
23
|
+
}, object);
|
|
24
|
+
};
|