@speclynx/apidom-reference 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 (263) hide show
  1. package/CHANGELOG.md +86 -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 +2107 -0
  9. package/dist/167.apidom-reference.browser.js +10 -0
  10. package/dist/167.apidom-reference.browser.min.js +1 -0
  11. package/dist/451.apidom-reference.browser.js +10 -0
  12. package/dist/451.apidom-reference.browser.min.js +1 -0
  13. package/dist/9786785aaddf11f37840fad896531940.wasm +0 -0
  14. package/dist/apidom-reference.browser.js +85376 -0
  15. package/dist/apidom-reference.browser.min.js +1 -0
  16. package/package.json +304 -0
  17. package/src/File.cjs +50 -0
  18. package/src/File.mjs +44 -0
  19. package/src/Reference.cjs +31 -0
  20. package/src/Reference.mjs +27 -0
  21. package/src/ReferenceSet.cjs +60 -0
  22. package/src/ReferenceSet.mjs +57 -0
  23. package/src/bundle/index.cjs +61 -0
  24. package/src/bundle/index.mjs +55 -0
  25. package/src/bundle/strategies/BundleStrategy.cjs +20 -0
  26. package/src/bundle/strategies/BundleStrategy.mjs +16 -0
  27. package/src/bundle/strategies/openapi-3-1/index.cjs +35 -0
  28. package/src/bundle/strategies/openapi-3-1/index.mjs +29 -0
  29. package/src/configuration/empty.cjs +9 -0
  30. package/src/configuration/empty.mjs +1 -0
  31. package/src/configuration/saturated.cjs +95 -0
  32. package/src/configuration/saturated.mjs +87 -0
  33. package/src/dereference/index.cjs +86 -0
  34. package/src/dereference/index.mjs +79 -0
  35. package/src/dereference/strategies/DereferenceStrategy.cjs +20 -0
  36. package/src/dereference/strategies/DereferenceStrategy.mjs +16 -0
  37. package/src/dereference/strategies/apidom/index.cjs +89 -0
  38. package/src/dereference/strategies/apidom/index.mjs +84 -0
  39. package/src/dereference/strategies/apidom/selectors/element-id.cjs +36 -0
  40. package/src/dereference/strategies/apidom/selectors/element-id.mjs +30 -0
  41. package/src/dereference/strategies/apidom/visitor.cjs +165 -0
  42. package/src/dereference/strategies/apidom/visitor.mjs +159 -0
  43. package/src/dereference/strategies/asyncapi-2/index.cjs +100 -0
  44. package/src/dereference/strategies/asyncapi-2/index.mjs +94 -0
  45. package/src/dereference/strategies/asyncapi-2/visitor.cjs +412 -0
  46. package/src/dereference/strategies/asyncapi-2/visitor.mjs +406 -0
  47. package/src/dereference/strategies/openapi-2/index.cjs +102 -0
  48. package/src/dereference/strategies/openapi-2/index.mjs +96 -0
  49. package/src/dereference/strategies/openapi-2/visitor.cjs +530 -0
  50. package/src/dereference/strategies/openapi-2/visitor.mjs +524 -0
  51. package/src/dereference/strategies/openapi-3-0/index.cjs +102 -0
  52. package/src/dereference/strategies/openapi-3-0/index.mjs +96 -0
  53. package/src/dereference/strategies/openapi-3-0/visitor.cjs +519 -0
  54. package/src/dereference/strategies/openapi-3-0/visitor.mjs +513 -0
  55. package/src/dereference/strategies/openapi-3-1/index.cjs +105 -0
  56. package/src/dereference/strategies/openapi-3-1/index.mjs +96 -0
  57. package/src/dereference/strategies/openapi-3-1/selectors/$anchor.cjs +66 -0
  58. package/src/dereference/strategies/openapi-3-1/selectors/$anchor.mjs +55 -0
  59. package/src/dereference/strategies/openapi-3-1/selectors/uri.cjs +50 -0
  60. package/src/dereference/strategies/openapi-3-1/selectors/uri.mjs +42 -0
  61. package/src/dereference/strategies/openapi-3-1/util.cjs +67 -0
  62. package/src/dereference/strategies/openapi-3-1/util.mjs +58 -0
  63. package/src/dereference/strategies/openapi-3-1/visitor.cjs +776 -0
  64. package/src/dereference/strategies/openapi-3-1/visitor.mjs +770 -0
  65. package/src/dereference/util.cjs +31 -0
  66. package/src/dereference/util.mjs +27 -0
  67. package/src/errors/BundleError.cjs +10 -0
  68. package/src/errors/BundleError.mjs +7 -0
  69. package/src/errors/DereferenceError.cjs +10 -0
  70. package/src/errors/DereferenceError.mjs +7 -0
  71. package/src/errors/EvaluationElementIdError.cjs +10 -0
  72. package/src/errors/EvaluationElementIdError.mjs +7 -0
  73. package/src/errors/EvaluationJsonSchema$anchorError.cjs +11 -0
  74. package/src/errors/EvaluationJsonSchema$anchorError.mjs +6 -0
  75. package/src/errors/EvaluationJsonSchemaUriError.cjs +11 -0
  76. package/src/errors/EvaluationJsonSchemaUriError.mjs +6 -0
  77. package/src/errors/InvalidJsonSchema$anchorError.cjs +15 -0
  78. package/src/errors/InvalidJsonSchema$anchorError.mjs +10 -0
  79. package/src/errors/JsonSchema$anchorError.cjs +10 -0
  80. package/src/errors/JsonSchema$anchorError.mjs +7 -0
  81. package/src/errors/JsonSchemaUriError.cjs +10 -0
  82. package/src/errors/JsonSchemaUriError.mjs +7 -0
  83. package/src/errors/MaximumBundleDepthError.cjs +11 -0
  84. package/src/errors/MaximumBundleDepthError.mjs +6 -0
  85. package/src/errors/MaximumDereferenceDepthError.cjs +11 -0
  86. package/src/errors/MaximumDereferenceDepthError.mjs +6 -0
  87. package/src/errors/MaximumResolveDepthError.cjs +11 -0
  88. package/src/errors/MaximumResolveDepthError.mjs +6 -0
  89. package/src/errors/ParseError.cjs +10 -0
  90. package/src/errors/ParseError.mjs +7 -0
  91. package/src/errors/ParserError.cjs +11 -0
  92. package/src/errors/ParserError.mjs +6 -0
  93. package/src/errors/PluginError.cjs +18 -0
  94. package/src/errors/PluginError.mjs +15 -0
  95. package/src/errors/ResolveError.cjs +10 -0
  96. package/src/errors/ResolveError.mjs +7 -0
  97. package/src/errors/ResolverError.cjs +11 -0
  98. package/src/errors/ResolverError.mjs +6 -0
  99. package/src/errors/UnmatchedBundleStrategyError.cjs +11 -0
  100. package/src/errors/UnmatchedBundleStrategyError.mjs +6 -0
  101. package/src/errors/UnmatchedDereferenceStrategyError.cjs +11 -0
  102. package/src/errors/UnmatchedDereferenceStrategyError.mjs +6 -0
  103. package/src/errors/UnmatchedResolveStrategyError.cjs +11 -0
  104. package/src/errors/UnmatchedResolveStrategyError.mjs +6 -0
  105. package/src/errors/UnmatchedResolverError.cjs +11 -0
  106. package/src/errors/UnmatchedResolverError.mjs +6 -0
  107. package/src/index.cjs +142 -0
  108. package/src/index.mjs +101 -0
  109. package/src/options/index.cjs +185 -0
  110. package/src/options/index.mjs +182 -0
  111. package/src/options/util.cjs +24 -0
  112. package/src/options/util.mjs +19 -0
  113. package/src/parse/index.cjs +69 -0
  114. package/src/parse/index.mjs +63 -0
  115. package/src/parse/parsers/Parser.cjs +48 -0
  116. package/src/parse/parsers/Parser.mjs +44 -0
  117. package/src/parse/parsers/api-design-systems-json/index.cjs +55 -0
  118. package/src/parse/parsers/api-design-systems-json/index.mjs +49 -0
  119. package/src/parse/parsers/api-design-systems-yaml/index.cjs +54 -0
  120. package/src/parse/parsers/api-design-systems-yaml/index.mjs +48 -0
  121. package/src/parse/parsers/apidom-json/index.cjs +70 -0
  122. package/src/parse/parsers/apidom-json/index.mjs +64 -0
  123. package/src/parse/parsers/arazzo-json-1/index.cjs +55 -0
  124. package/src/parse/parsers/arazzo-json-1/index.mjs +49 -0
  125. package/src/parse/parsers/arazzo-yaml-1/index.cjs +54 -0
  126. package/src/parse/parsers/arazzo-yaml-1/index.mjs +48 -0
  127. package/src/parse/parsers/asyncapi-json-2/index.cjs +55 -0
  128. package/src/parse/parsers/asyncapi-json-2/index.mjs +49 -0
  129. package/src/parse/parsers/asyncapi-yaml-2/index.cjs +54 -0
  130. package/src/parse/parsers/asyncapi-yaml-2/index.mjs +48 -0
  131. package/src/parse/parsers/binary/index-browser.cjs +56 -0
  132. package/src/parse/parsers/binary/index-browser.mjs +50 -0
  133. package/src/parse/parsers/binary/index-node.cjs +51 -0
  134. package/src/parse/parsers/binary/index-node.mjs +45 -0
  135. package/src/parse/parsers/json/index.cjs +54 -0
  136. package/src/parse/parsers/json/index.mjs +48 -0
  137. package/src/parse/parsers/openapi-json-2/index.cjs +55 -0
  138. package/src/parse/parsers/openapi-json-2/index.mjs +49 -0
  139. package/src/parse/parsers/openapi-json-3-0/index.cjs +55 -0
  140. package/src/parse/parsers/openapi-json-3-0/index.mjs +49 -0
  141. package/src/parse/parsers/openapi-json-3-1/index.cjs +55 -0
  142. package/src/parse/parsers/openapi-json-3-1/index.mjs +49 -0
  143. package/src/parse/parsers/openapi-yaml-2/index.cjs +54 -0
  144. package/src/parse/parsers/openapi-yaml-2/index.mjs +48 -0
  145. package/src/parse/parsers/openapi-yaml-3-0/index.cjs +54 -0
  146. package/src/parse/parsers/openapi-yaml-3-0/index.mjs +48 -0
  147. package/src/parse/parsers/openapi-yaml-3-1/index.cjs +54 -0
  148. package/src/parse/parsers/openapi-yaml-3-1/index.mjs +48 -0
  149. package/src/parse/parsers/yaml-1-2/index.cjs +54 -0
  150. package/src/parse/parsers/yaml-1-2/index.mjs +48 -0
  151. package/src/resolve/index.cjs +67 -0
  152. package/src/resolve/index.mjs +60 -0
  153. package/src/resolve/resolvers/HTTPResolver.cjs +38 -0
  154. package/src/resolve/resolvers/HTTPResolver.mjs +31 -0
  155. package/src/resolve/resolvers/Resolver.cjs +20 -0
  156. package/src/resolve/resolvers/Resolver.mjs +16 -0
  157. package/src/resolve/resolvers/file/index-browser.cjs +24 -0
  158. package/src/resolve/resolvers/file/index-browser.mjs +19 -0
  159. package/src/resolve/resolvers/file/index-node.cjs +49 -0
  160. package/src/resolve/resolvers/file/index-node.mjs +42 -0
  161. package/src/resolve/resolvers/http-axios/index.cjs +80 -0
  162. package/src/resolve/resolvers/http-axios/index.mjs +73 -0
  163. package/src/resolve/strategies/ResolveStrategy.cjs +20 -0
  164. package/src/resolve/strategies/ResolveStrategy.mjs +16 -0
  165. package/src/resolve/strategies/apidom/index.cjs +49 -0
  166. package/src/resolve/strategies/apidom/index.mjs +43 -0
  167. package/src/resolve/strategies/asyncapi-2/index.cjs +49 -0
  168. package/src/resolve/strategies/asyncapi-2/index.mjs +43 -0
  169. package/src/resolve/strategies/openapi-2/index.cjs +49 -0
  170. package/src/resolve/strategies/openapi-2/index.mjs +43 -0
  171. package/src/resolve/strategies/openapi-3-0/index.cjs +49 -0
  172. package/src/resolve/strategies/openapi-3-0/index.mjs +43 -0
  173. package/src/resolve/strategies/openapi-3-1/index.cjs +49 -0
  174. package/src/resolve/strategies/openapi-3-1/index.mjs +43 -0
  175. package/src/resolve/util.cjs +37 -0
  176. package/src/resolve/util.mjs +30 -0
  177. package/src/util/plugins.cjs +44 -0
  178. package/src/util/plugins.mjs +37 -0
  179. package/src/util/url.cjs +288 -0
  180. package/src/util/url.mjs +274 -0
  181. package/types/File.d.ts +24 -0
  182. package/types/Reference.d.ts +23 -0
  183. package/types/ReferenceSet.d.ts +25 -0
  184. package/types/apidom-reference.d.ts +584 -0
  185. package/types/bundle/index.d.ts +7 -0
  186. package/types/bundle/strategies/BundleStrategy.d.ts +19 -0
  187. package/types/bundle/strategies/openapi-3-1/index.d.ts +26 -0
  188. package/types/configuration/empty.d.ts +1 -0
  189. package/types/configuration/saturated.d.ts +1 -0
  190. package/types/dereference/index.d.ts +11 -0
  191. package/types/dereference/strategies/DereferenceStrategy.d.ts +19 -0
  192. package/types/dereference/strategies/apidom/index.d.ts +30 -0
  193. package/types/dereference/strategies/apidom/selectors/element-id.d.ts +11 -0
  194. package/types/dereference/strategies/apidom/visitor.d.ts +32 -0
  195. package/types/dereference/strategies/asyncapi-2/index.d.ts +31 -0
  196. package/types/dereference/strategies/asyncapi-2/visitor.d.ts +43 -0
  197. package/types/dereference/strategies/openapi-2/index.d.ts +32 -0
  198. package/types/dereference/strategies/openapi-2/visitor.d.ts +47 -0
  199. package/types/dereference/strategies/openapi-3-0/index.d.ts +31 -0
  200. package/types/dereference/strategies/openapi-3-0/visitor.d.ts +49 -0
  201. package/types/dereference/strategies/openapi-3-1/index.d.ts +32 -0
  202. package/types/dereference/strategies/openapi-3-1/selectors/$anchor.d.ts +22 -0
  203. package/types/dereference/strategies/openapi-3-1/selectors/uri.d.ts +12 -0
  204. package/types/dereference/strategies/openapi-3-1/util.d.ts +21 -0
  205. package/types/dereference/strategies/openapi-3-1/visitor.d.ts +52 -0
  206. package/types/dereference/util.d.ts +9 -0
  207. package/types/errors/BundleError.d.ts +7 -0
  208. package/types/errors/DereferenceError.d.ts +7 -0
  209. package/types/errors/EvaluationElementIdError.d.ts +7 -0
  210. package/types/errors/EvaluationJsonSchema$anchorError.d.ts +7 -0
  211. package/types/errors/EvaluationJsonSchemaUriError.d.ts +7 -0
  212. package/types/errors/InvalidJsonSchema$anchorError.d.ts +8 -0
  213. package/types/errors/JsonSchema$anchorError.d.ts +7 -0
  214. package/types/errors/JsonSchemaUriError.d.ts +7 -0
  215. package/types/errors/MaximumBundleDepthError.d.ts +7 -0
  216. package/types/errors/MaximumDereferenceDepthError.d.ts +7 -0
  217. package/types/errors/MaximumResolveDepthError.d.ts +7 -0
  218. package/types/errors/ParseError.d.ts +7 -0
  219. package/types/errors/ParserError.d.ts +7 -0
  220. package/types/errors/PluginError.d.ts +12 -0
  221. package/types/errors/ResolveError.d.ts +7 -0
  222. package/types/errors/ResolverError.d.ts +7 -0
  223. package/types/errors/UnmatchedBundleStrategyError.d.ts +7 -0
  224. package/types/errors/UnmatchedDereferenceStrategyError.d.ts +7 -0
  225. package/types/errors/UnmatchedResolveStrategyError.d.ts +7 -0
  226. package/types/errors/UnmatchedResolverError.d.ts +7 -0
  227. package/types/index.d.ts +75 -0
  228. package/types/options/index.d.ts +62 -0
  229. package/types/options/util.d.ts +5 -0
  230. package/types/parse/index.d.ts +7 -0
  231. package/types/parse/parsers/Parser.d.ts +38 -0
  232. package/types/parse/parsers/api-design-systems-json/index.d.ts +21 -0
  233. package/types/parse/parsers/api-design-systems-yaml/index.d.ts +20 -0
  234. package/types/parse/parsers/apidom-json/index.d.ts +24 -0
  235. package/types/parse/parsers/arazzo-json-1/index.d.ts +21 -0
  236. package/types/parse/parsers/arazzo-yaml-1/index.d.ts +20 -0
  237. package/types/parse/parsers/asyncapi-json-2/index.d.ts +21 -0
  238. package/types/parse/parsers/asyncapi-yaml-2/index.d.ts +20 -0
  239. package/types/parse/parsers/binary/index-browser.d.ts +21 -0
  240. package/types/parse/parsers/binary/index-node.d.ts +21 -0
  241. package/types/parse/parsers/json/index.d.ts +20 -0
  242. package/types/parse/parsers/openapi-json-2/index.d.ts +21 -0
  243. package/types/parse/parsers/openapi-json-3-0/index.d.ts +21 -0
  244. package/types/parse/parsers/openapi-json-3-1/index.d.ts +21 -0
  245. package/types/parse/parsers/openapi-yaml-2/index.d.ts +20 -0
  246. package/types/parse/parsers/openapi-yaml-3-0/index.d.ts +20 -0
  247. package/types/parse/parsers/openapi-yaml-3-1/index.d.ts +20 -0
  248. package/types/parse/parsers/yaml-1-2/index.d.ts +20 -0
  249. package/types/resolve/index.d.ts +12 -0
  250. package/types/resolve/resolvers/HTTPResolver.d.ts +22 -0
  251. package/types/resolve/resolvers/Resolver.d.ts +17 -0
  252. package/types/resolve/resolvers/file/index-browser.d.ts +12 -0
  253. package/types/resolve/resolvers/file/index-node.d.ts +20 -0
  254. package/types/resolve/resolvers/http-axios/index.d.ts +30 -0
  255. package/types/resolve/strategies/ResolveStrategy.d.ts +19 -0
  256. package/types/resolve/strategies/apidom/index.d.ts +27 -0
  257. package/types/resolve/strategies/asyncapi-2/index.d.ts +27 -0
  258. package/types/resolve/strategies/openapi-2/index.d.ts +27 -0
  259. package/types/resolve/strategies/openapi-3-0/index.d.ts +27 -0
  260. package/types/resolve/strategies/openapi-3-1/index.d.ts +27 -0
  261. package/types/resolve/util.d.ts +6 -0
  262. package/types/util/plugins.d.ts +14 -0
  263. package/types/util/url.d.ts +106 -0
@@ -0,0 +1,412 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime-corejs3/helpers/interopRequireWildcard").default;
4
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
5
+ exports.__esModule = true;
6
+ exports.mutationReplacer = exports.default = void 0;
7
+ var _ramda = require("ramda");
8
+ var _apidomCore = require("@speclynx/apidom-core");
9
+ var _apidomError = require("@speclynx/apidom-error");
10
+ var _apidomJsonPointer = require("@speclynx/apidom-json-pointer");
11
+ var _apidomNsAsyncapi = require("@speclynx/apidom-ns-asyncapi-2");
12
+ var _MaximumDereferenceDepthError = _interopRequireDefault(require("../../../errors/MaximumDereferenceDepthError.cjs"));
13
+ var _MaximumResolveDepthError = _interopRequireDefault(require("../../../errors/MaximumResolveDepthError.cjs"));
14
+ var _util = require("../../util.cjs");
15
+ var url = _interopRequireWildcard(require("../../../util/url.cjs"));
16
+ var _index = _interopRequireDefault(require("../../../parse/index.cjs"));
17
+ var _Reference = _interopRequireDefault(require("../../../Reference.cjs"));
18
+ // @ts-ignore
19
+ const visitAsync = _apidomCore.visit[Symbol.for('nodejs.util.promisify.custom')];
20
+
21
+ // initialize element identity manager
22
+ const identityManager = new _apidomCore.IdentityManager();
23
+
24
+ /**
25
+ * Custom mutation replacer.
26
+ * @public
27
+ */
28
+ const mutationReplacer = (newElement, oldElement, key, parent) => {
29
+ if ((0, _apidomCore.isMemberElement)(parent)) {
30
+ parent.value = newElement;
31
+ } else if (Array.isArray(parent)) {
32
+ parent[key] = newElement;
33
+ }
34
+ };
35
+
36
+ /**
37
+ * @public
38
+ */
39
+ exports.mutationReplacer = mutationReplacer;
40
+ /**
41
+ * @public
42
+ */
43
+ class AsyncAPI2DereferenceVisitor {
44
+ indirections;
45
+ namespace;
46
+ reference;
47
+ options;
48
+ ancestors;
49
+ refractCache;
50
+ constructor({
51
+ reference,
52
+ namespace,
53
+ options,
54
+ indirections = [],
55
+ ancestors = new _util.AncestorLineage(),
56
+ refractCache = new Map()
57
+ }) {
58
+ this.indirections = indirections;
59
+ this.namespace = namespace;
60
+ this.reference = reference;
61
+ this.options = options;
62
+ this.ancestors = new _util.AncestorLineage(...ancestors);
63
+ this.refractCache = refractCache;
64
+ }
65
+ toBaseURI(uri) {
66
+ return url.resolve(this.reference.uri, url.sanitize(url.stripHash(uri)));
67
+ }
68
+ async toReference(uri) {
69
+ // detect maximum depth of resolution
70
+ if (this.reference.depth >= this.options.resolve.maxDepth) {
71
+ throw new _MaximumResolveDepthError.default(`Maximum resolution depth of ${this.options.resolve.maxDepth} has been exceeded by file "${this.reference.uri}"`);
72
+ }
73
+ const baseURI = this.toBaseURI(uri);
74
+ const {
75
+ refSet
76
+ } = this.reference;
77
+
78
+ // we've already processed this Reference in past
79
+ if (refSet.has(baseURI)) {
80
+ return refSet.find((0, _ramda.propEq)(baseURI, 'uri'));
81
+ }
82
+ const parseResult = await (0, _index.default)(url.unsanitize(baseURI), {
83
+ ...this.options,
84
+ parse: {
85
+ ...this.options.parse,
86
+ mediaType: 'text/plain'
87
+ }
88
+ });
89
+
90
+ // register new mutable reference with a refSet
91
+ const mutableReference = new _Reference.default({
92
+ uri: baseURI,
93
+ value: (0, _apidomCore.cloneDeep)(parseResult),
94
+ depth: this.reference.depth + 1
95
+ });
96
+ refSet.add(mutableReference);
97
+ if (this.options.dereference.immutable) {
98
+ // register new immutable reference with a refSet
99
+ const immutableReference = new _Reference.default({
100
+ uri: `immutable://${baseURI}`,
101
+ value: parseResult,
102
+ depth: this.reference.depth + 1
103
+ });
104
+ refSet.add(immutableReference);
105
+ }
106
+ return mutableReference;
107
+ }
108
+ toAncestorLineage(ancestors) {
109
+ /**
110
+ * Compute full ancestors lineage.
111
+ * Ancestors are flatten to unwrap all Element instances.
112
+ */
113
+ const directAncestors = new Set(ancestors.filter(_apidomCore.isElement));
114
+ const ancestorsLineage = new _util.AncestorLineage(...this.ancestors, directAncestors);
115
+ return [ancestorsLineage, directAncestors];
116
+ }
117
+ async ReferenceElement(referencingElement, key, parent, path, ancestors, link) {
118
+ // skip current referencing element as it's already been access
119
+ if (this.indirections.includes(referencingElement)) {
120
+ return false;
121
+ }
122
+ const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
123
+ const retrievalURI = this.toBaseURI((0, _apidomCore.toValue)(referencingElement.$ref));
124
+ const isInternalReference = url.stripHash(this.reference.uri) === retrievalURI;
125
+ const isExternalReference = !isInternalReference;
126
+
127
+ // ignore resolving internal Reference Objects
128
+ if (!this.options.resolve.internal && isInternalReference) {
129
+ // skip traversing this reference and all it's child elements
130
+ return false;
131
+ }
132
+ // ignore resolving external Reference Objects
133
+ if (!this.options.resolve.external && isExternalReference) {
134
+ // skip traversing this reference and all it's child elements
135
+ return false;
136
+ }
137
+ const reference = await this.toReference((0, _apidomCore.toValue)(referencingElement.$ref));
138
+ const $refBaseURI = url.resolve(retrievalURI, (0, _apidomCore.toValue)(referencingElement.$ref));
139
+ this.indirections.push(referencingElement);
140
+ const jsonPointer = _apidomJsonPointer.URIFragmentIdentifier.fromURIReference($refBaseURI);
141
+
142
+ // possibly non-semantic fragment
143
+ let referencedElement = (0, _apidomJsonPointer.evaluate)(reference.value.result, jsonPointer);
144
+ referencedElement.id = identityManager.identify(referencedElement);
145
+
146
+ /**
147
+ * Applying semantics to a referenced element if semantics are missing.
148
+ */
149
+ if ((0, _apidomCore.isPrimitiveElement)(referencedElement)) {
150
+ const referencedElementType = (0, _apidomCore.toValue)(referencingElement.meta.get('referenced-element'));
151
+ const cacheKey = `${referencedElementType}-${(0, _apidomCore.toValue)(identityManager.identify(referencedElement))}`;
152
+ if (this.refractCache.has(cacheKey)) {
153
+ referencedElement = this.refractCache.get(cacheKey);
154
+ } else if ((0, _apidomNsAsyncapi.isReferenceLikeElement)(referencedElement)) {
155
+ // handling indirect references
156
+ referencedElement = _apidomNsAsyncapi.ReferenceElement.refract(referencedElement);
157
+ referencedElement.setMetaProperty('referenced-element', referencedElementType);
158
+ this.refractCache.set(cacheKey, referencedElement);
159
+ } else {
160
+ // handling direct references
161
+ const ElementClass = this.namespace.getElementClass(referencedElementType);
162
+ referencedElement = ElementClass.refract(referencedElement);
163
+ this.refractCache.set(cacheKey, referencedElement);
164
+ }
165
+ }
166
+
167
+ // detect direct or circular reference
168
+ if (referencingElement === referencedElement) {
169
+ throw new _apidomError.ApiDOMError('Recursive Reference Object detected');
170
+ }
171
+
172
+ // detect maximum depth of dereferencing
173
+ if (this.indirections.length > this.options.dereference.maxDepth) {
174
+ throw new _MaximumDereferenceDepthError.default(`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`);
175
+ }
176
+
177
+ // detect second deep dive into the same fragment and avoid it
178
+ if (ancestorsLineage.includes(referencedElement)) {
179
+ reference.refSet.circular = true;
180
+ if (this.options.dereference.circular === 'error') {
181
+ throw new _apidomError.ApiDOMError('Circular reference detected');
182
+ } else if (this.options.dereference.circular === 'replace') {
183
+ const refElement = new _apidomCore.RefElement(referencedElement.id, {
184
+ type: 'reference',
185
+ uri: reference.uri,
186
+ $ref: (0, _apidomCore.toValue)(referencingElement.$ref)
187
+ });
188
+ const replacer = this.options.dereference.strategyOpts['asyncapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
189
+ const replacement = replacer(refElement);
190
+ link.replaceWith(replacement, mutationReplacer);
191
+ return !parent ? replacement : false;
192
+ }
193
+ }
194
+
195
+ /**
196
+ * Dive deep into the fragment.
197
+ *
198
+ * Cases to consider:
199
+ * 1. We're crossing document boundary
200
+ * 2. Fragment is from non-root document
201
+ * 3. Fragment is a Reference Object. We need to follow it to get the eventual value
202
+ * 4. We are dereferencing the fragment lazily/eagerly depending on circular mode
203
+ */
204
+ const isNonRootDocument = url.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
205
+ const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
206
+ if ((isExternalReference || isNonRootDocument || (0, _apidomNsAsyncapi.isReferenceElement)(referencedElement) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
207
+ // append referencing reference to ancestors lineage
208
+ directAncestors.add(referencingElement);
209
+ const visitor = new AsyncAPI2DereferenceVisitor({
210
+ reference,
211
+ namespace: this.namespace,
212
+ indirections: [...this.indirections],
213
+ options: this.options,
214
+ refractCache: this.refractCache,
215
+ ancestors: ancestorsLineage
216
+ });
217
+ referencedElement = await visitAsync(referencedElement, visitor, {
218
+ keyMap: _apidomNsAsyncapi.keyMap,
219
+ nodeTypeGetter: _apidomNsAsyncapi.getNodeType
220
+ });
221
+
222
+ // remove referencing reference from ancestors lineage
223
+ directAncestors.delete(referencingElement);
224
+ }
225
+ this.indirections.pop();
226
+
227
+ // Boolean JSON Schemas
228
+ if ((0, _apidomNsAsyncapi.isBooleanJsonSchemaElement)(referencedElement)) {
229
+ const booleanJsonSchemaElement = (0, _apidomCore.cloneDeep)(referencedElement);
230
+ // assign unique id to merged element
231
+ booleanJsonSchemaElement.setMetaProperty('id', identityManager.generateId());
232
+ // annotate referenced element with info about original referencing element
233
+ booleanJsonSchemaElement.setMetaProperty('ref-fields', {
234
+ $ref: (0, _apidomCore.toValue)(referencingElement.$ref)
235
+ });
236
+ // annotate referenced element with info about origin
237
+ booleanJsonSchemaElement.setMetaProperty('ref-origin', reference.uri);
238
+ // annotate fragment with info about referencing element
239
+ booleanJsonSchemaElement.setMetaProperty('ref-referencing-element-id', (0, _apidomCore.cloneDeep)(identityManager.identify(referencingElement)));
240
+ link.replaceWith(booleanJsonSchemaElement, mutationReplacer);
241
+ return !parent ? booleanJsonSchemaElement : false;
242
+ }
243
+
244
+ /**
245
+ * Creating a new version of referenced element to avoid modifying the original one.
246
+ */
247
+ const mergedElement = (0, _apidomCore.cloneShallow)(referencedElement);
248
+ // assign unique id to merged element
249
+ mergedElement.setMetaProperty('id', identityManager.generateId());
250
+ // annotate referenced element with info about original referencing element
251
+ mergedElement.setMetaProperty('ref-fields', {
252
+ $ref: (0, _apidomCore.toValue)(referencingElement.$ref)
253
+ });
254
+ // annotate fragment with info about origin
255
+ mergedElement.setMetaProperty('ref-origin', reference.uri);
256
+ // annotate fragment with info about referencing element
257
+ mergedElement.setMetaProperty('ref-referencing-element-id', (0, _apidomCore.cloneDeep)(identityManager.identify(referencingElement)));
258
+
259
+ /**
260
+ * Transclude referencing element with merged referenced element.
261
+ */
262
+ link.replaceWith(mergedElement, mutationReplacer);
263
+
264
+ /**
265
+ * We're at the root of the tree, so we're just replacing the entire tree.
266
+ */
267
+ return !parent ? mergedElement : false;
268
+ }
269
+ async ChannelItemElement(referencingElement, key, parent, path, ancestors, link) {
270
+ // ignore ChannelItemElement without $ref field
271
+ if (!(0, _apidomCore.isStringElement)(referencingElement.$ref)) {
272
+ return undefined;
273
+ }
274
+
275
+ // skip current referencing element as it's already been access
276
+ if (this.indirections.includes(referencingElement)) {
277
+ return false;
278
+ }
279
+ const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
280
+ const retrievalURI = this.toBaseURI((0, _apidomCore.toValue)(referencingElement.$ref));
281
+ const isInternalReference = url.stripHash(this.reference.uri) === retrievalURI;
282
+ const isExternalReference = !isInternalReference;
283
+
284
+ // ignore resolving internal Channel Item Objects
285
+ if (!this.options.resolve.internal && isInternalReference) {
286
+ // skip traversing this channel item but traverse all it's child elements
287
+ return undefined;
288
+ }
289
+ // ignore resolving external Channel Item Objects
290
+ if (!this.options.resolve.external && isExternalReference) {
291
+ // skip traversing this channel item but traverse all it's child elements
292
+ return undefined;
293
+ }
294
+ const reference = await this.toReference((0, _apidomCore.toValue)(referencingElement.$ref));
295
+ const $refBaseURI = url.resolve(retrievalURI, (0, _apidomCore.toValue)(referencingElement.$ref));
296
+ this.indirections.push(referencingElement);
297
+ const jsonPointer = _apidomJsonPointer.URIFragmentIdentifier.fromURIReference($refBaseURI);
298
+
299
+ // possibly non-semantic referenced element
300
+ let referencedElement = (0, _apidomJsonPointer.evaluate)(reference.value.result, jsonPointer);
301
+ referencedElement.id = identityManager.identify(referencedElement);
302
+
303
+ /**
304
+ * Applying semantics to a referenced element if semantics are missing.
305
+ */
306
+ if ((0, _apidomCore.isPrimitiveElement)(referencedElement)) {
307
+ const cacheKey = `channel-item-${(0, _apidomCore.toValue)(identityManager.identify(referencedElement))}`;
308
+ if (this.refractCache.has(cacheKey)) {
309
+ referencedElement = this.refractCache.get(cacheKey);
310
+ } else {
311
+ referencedElement = _apidomNsAsyncapi.ChannelItemElement.refract(referencedElement);
312
+ this.refractCache.set(cacheKey, referencedElement);
313
+ }
314
+ }
315
+
316
+ // detect direct or indirect reference
317
+ if (referencingElement === referencedElement) {
318
+ throw new _apidomError.ApiDOMError('Recursive Channel Item Object reference detected');
319
+ }
320
+
321
+ // detect maximum depth of dereferencing
322
+ if (this.indirections.length > this.options.dereference.maxDepth) {
323
+ throw new _MaximumDereferenceDepthError.default(`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`);
324
+ }
325
+
326
+ // detect second deep dive into the same fragment and avoid it
327
+ if (ancestorsLineage.includes(referencedElement)) {
328
+ reference.refSet.circular = true;
329
+ if (this.options.dereference.circular === 'error') {
330
+ throw new _apidomError.ApiDOMError('Circular reference detected');
331
+ } else if (this.options.dereference.circular === 'replace') {
332
+ const refElement = new _apidomCore.RefElement(referencedElement.id, {
333
+ type: 'channel-item',
334
+ uri: reference.uri,
335
+ $ref: (0, _apidomCore.toValue)(referencingElement.$ref)
336
+ });
337
+ const replacer = this.options.dereference.strategyOpts['asyncapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
338
+ const replacement = replacer(refElement);
339
+ link.replaceWith(replacement, mutationReplacer);
340
+ return !parent ? replacement : undefined;
341
+ }
342
+ }
343
+
344
+ /**
345
+ * Dive deep into the fragment.
346
+ *
347
+ * Cases to consider:
348
+ * 1. We're crossing document boundary
349
+ * 2. Fragment is from non-root document
350
+ * 3. Fragment is a Channel Item Object with $ref field. We need to follow it to get the eventual value
351
+ * 4. We are dereferencing the fragment lazily/eagerly depending on circular mode
352
+ */
353
+ const isNonRootDocument = url.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
354
+ const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
355
+ if ((isExternalReference || isNonRootDocument || (0, _apidomNsAsyncapi.isChannelItemElement)(referencedElement) && (0, _apidomCore.isStringElement)(referencedElement.$ref) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
356
+ // append referencing reference to ancestors lineage
357
+ directAncestors.add(referencingElement);
358
+ const visitor = new AsyncAPI2DereferenceVisitor({
359
+ reference,
360
+ namespace: this.namespace,
361
+ indirections: [...this.indirections],
362
+ options: this.options,
363
+ refractCache: this.refractCache,
364
+ ancestors: ancestorsLineage
365
+ });
366
+ referencedElement = await visitAsync(referencedElement, visitor, {
367
+ keyMap: _apidomNsAsyncapi.keyMap,
368
+ nodeTypeGetter: _apidomNsAsyncapi.getNodeType
369
+ });
370
+
371
+ // remove referencing reference from ancestors lineage
372
+ directAncestors.delete(referencingElement);
373
+ }
374
+ this.indirections.pop();
375
+
376
+ /**
377
+ * Creating a new version of Channel Item by merging fields from referenced Channel Item with referencing one.
378
+ */
379
+ if ((0, _apidomNsAsyncapi.isChannelItemElement)(referencedElement)) {
380
+ const mergedElement = new _apidomNsAsyncapi.ChannelItemElement([...referencedElement.content], (0, _apidomCore.cloneDeep)(referencedElement.meta), (0, _apidomCore.cloneDeep)(referencedElement.attributes));
381
+ // assign unique id to merged element
382
+ mergedElement.setMetaProperty('id', identityManager.generateId());
383
+ // existing keywords from referencing ChannelItemElement overrides ones from referenced ChannelItemElement
384
+ referencingElement.forEach((value, keyElement, item) => {
385
+ mergedElement.remove((0, _apidomCore.toValue)(keyElement));
386
+ mergedElement.content.push(item);
387
+ });
388
+ mergedElement.remove('$ref');
389
+
390
+ // annotate referenced element with info about original referencing element
391
+ mergedElement.setMetaProperty('ref-fields', {
392
+ $ref: (0, _apidomCore.toValue)(referencingElement.$ref)
393
+ });
394
+ // annotate referenced with info about origin
395
+ mergedElement.setMetaProperty('ref-origin', reference.uri);
396
+ // annotate fragment with info about referencing element
397
+ mergedElement.setMetaProperty('ref-referencing-element-id', (0, _apidomCore.cloneDeep)(identityManager.identify(referencingElement)));
398
+ referencedElement = mergedElement;
399
+ }
400
+
401
+ /**
402
+ * Transclude referencing element with merged referenced element.
403
+ */
404
+ link.replaceWith(referencedElement, mutationReplacer);
405
+
406
+ /**
407
+ * We're at the root of the tree, so we're just replacing the entire tree.
408
+ */
409
+ return !parent ? referencedElement : undefined;
410
+ }
411
+ }
412
+ var _default = exports.default = AsyncAPI2DereferenceVisitor;