@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.
Files changed (105) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/LICENSE +202 -0
  3. package/LICENSES/AFL-3.0.txt +182 -0
  4. package/LICENSES/Apache-2.0.txt +202 -0
  5. package/LICENSES/BSD-3-Clause.txt +26 -0
  6. package/LICENSES/MIT.txt +9 -0
  7. package/NOTICE +65 -0
  8. package/README.md +881 -0
  9. package/dist/apidom-core.browser.js +14724 -0
  10. package/dist/apidom-core.browser.min.js +1 -0
  11. package/package.json +67 -0
  12. package/src/clone/errors/CloneError.cjs +22 -0
  13. package/src/clone/errors/CloneError.mjs +19 -0
  14. package/src/clone/errors/DeepCloneError.cjs +11 -0
  15. package/src/clone/errors/DeepCloneError.mjs +6 -0
  16. package/src/clone/errors/ShallowCloneError.cjs +11 -0
  17. package/src/clone/errors/ShallowCloneError.mjs +6 -0
  18. package/src/clone/index.cjs +155 -0
  19. package/src/clone/index.mjs +146 -0
  20. package/src/elements/Annotation.cjs +23 -0
  21. package/src/elements/Annotation.mjs +20 -0
  22. package/src/elements/Comment.cjs +15 -0
  23. package/src/elements/Comment.mjs +12 -0
  24. package/src/elements/ParseResult.cjs +53 -0
  25. package/src/elements/ParseResult.mjs +50 -0
  26. package/src/elements/SourceMap.cjs +39 -0
  27. package/src/elements/SourceMap.mjs +36 -0
  28. package/src/identity/errors/ElementIdentityError.cjs +22 -0
  29. package/src/identity/errors/ElementIdentityError.mjs +19 -0
  30. package/src/identity/index.cjs +62 -0
  31. package/src/identity/index.mjs +56 -0
  32. package/src/index.cjs +112 -0
  33. package/src/index.mjs +50 -0
  34. package/src/media-types.cjs +21 -0
  35. package/src/media-types.mjs +18 -0
  36. package/src/merge/deepmerge.cjs +151 -0
  37. package/src/merge/deepmerge.mjs +135 -0
  38. package/src/merge/merge-left.cjs +16 -0
  39. package/src/merge/merge-left.mjs +11 -0
  40. package/src/merge/merge-right.cjs +35 -0
  41. package/src/merge/merge-right.mjs +29 -0
  42. package/src/namespace.cjs +42 -0
  43. package/src/namespace.mjs +35 -0
  44. package/src/predicates/helpers.cjs +85 -0
  45. package/src/predicates/helpers.mjs +77 -0
  46. package/src/predicates/index.cjs +208 -0
  47. package/src/predicates/index.mjs +198 -0
  48. package/src/refractor/index.cjs +46 -0
  49. package/src/refractor/index.mjs +40 -0
  50. package/src/refractor/plugins/dispatcher/index.cjs +71 -0
  51. package/src/refractor/plugins/dispatcher/index.mjs +61 -0
  52. package/src/refractor/plugins/element-identity.cjs +31 -0
  53. package/src/refractor/plugins/element-identity.mjs +26 -0
  54. package/src/refractor/plugins/semantic-element-identity.cjs +38 -0
  55. package/src/refractor/plugins/semantic-element-identity.mjs +33 -0
  56. package/src/refractor/registration.cjs +34 -0
  57. package/src/refractor/registration.mjs +19 -0
  58. package/src/refractor/toolbox.cjs +29 -0
  59. package/src/refractor/toolbox.mjs +21 -0
  60. package/src/transcluder/Transcluder.cjs +111 -0
  61. package/src/transcluder/Transcluder.mjs +107 -0
  62. package/src/transcluder/index.cjs +19 -0
  63. package/src/transcluder/index.mjs +13 -0
  64. package/src/transformers/dehydrate.cjs +15 -0
  65. package/src/transformers/dehydrate.mjs +10 -0
  66. package/src/transformers/from.cjs +34 -0
  67. package/src/transformers/from.mjs +29 -0
  68. package/src/transformers/serializers/json.cjs +11 -0
  69. package/src/transformers/serializers/json.mjs +6 -0
  70. package/src/transformers/serializers/value/ast/ephemeral-array.cjs +21 -0
  71. package/src/transformers/serializers/value/ast/ephemeral-array.mjs +17 -0
  72. package/src/transformers/serializers/value/ast/ephemeral-object.cjs +20 -0
  73. package/src/transformers/serializers/value/ast/ephemeral-object.mjs +16 -0
  74. package/src/transformers/serializers/value/index.cjs +85 -0
  75. package/src/transformers/serializers/value/index.mjs +80 -0
  76. package/src/transformers/serializers/value/visitor.cjs +52 -0
  77. package/src/transformers/serializers/value/visitor.mjs +47 -0
  78. package/src/transformers/serializers/yaml-1-2.cjs +90 -0
  79. package/src/transformers/serializers/yaml-1-2.mjs +85 -0
  80. package/src/transformers/sexprs.cjs +34 -0
  81. package/src/transformers/sexprs.mjs +30 -0
  82. package/src/transformers/to-string.cjs +16 -0
  83. package/src/transformers/to-string.mjs +11 -0
  84. package/src/traversal/filter.cjs +18 -0
  85. package/src/traversal/filter.mjs +14 -0
  86. package/src/traversal/find.cjs +19 -0
  87. package/src/traversal/find.mjs +15 -0
  88. package/src/traversal/findAtOffset.cjs +65 -0
  89. package/src/traversal/findAtOffset.mjs +60 -0
  90. package/src/traversal/index.cjs +19 -0
  91. package/src/traversal/index.mjs +7 -0
  92. package/src/traversal/parents.cjs +38 -0
  93. package/src/traversal/parents.mjs +34 -0
  94. package/src/traversal/reject.cjs +15 -0
  95. package/src/traversal/reject.mjs +10 -0
  96. package/src/traversal/some.cjs +15 -0
  97. package/src/traversal/some.mjs +10 -0
  98. package/src/traversal/traverse.cjs +60 -0
  99. package/src/traversal/traverse.mjs +53 -0
  100. package/src/traversal/visitor.cjs +123 -0
  101. package/src/traversal/visitor.mjs +115 -0
  102. package/src/util.cjs +28 -0
  103. package/src/util.mjs +24 -0
  104. package/types/apidom-core.d.ts +806 -0
  105. 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,10 @@
1
+ import { complement } from 'ramda';
2
+ import filter from "./filter.mjs";
3
+ /**
4
+ * Complement of filter.
5
+ * @public
6
+ */
7
+ const reject = (predicate, element) => {
8
+ return filter(complement(predicate), element);
9
+ };
10
+ export 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
+ };