@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,530 @@
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 _apidomNsOpenapi = require("@speclynx/apidom-ns-openapi-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 OpenAPI2DereferenceVisitor {
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 element 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 element 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, _apidomNsOpenapi.isReferenceLikeElement)(referencedElement)) {
155
+ // handling indirect references
156
+ referencedElement = _apidomNsOpenapi.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['openapi-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-entry 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 isNonEntryDocument = url.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
205
+ const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
206
+ if ((isExternalReference || isNonEntryDocument || (0, _apidomNsOpenapi.isReferenceElement)(referencedElement) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
207
+ // append referencing reference to ancestors lineage
208
+ directAncestors.add(referencingElement);
209
+ const visitor = new OpenAPI2DereferenceVisitor({
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: _apidomNsOpenapi.keyMap,
219
+ nodeTypeGetter: _apidomNsOpenapi.getNodeType
220
+ });
221
+
222
+ // remove referencing reference from ancestors lineage
223
+ directAncestors.delete(referencingElement);
224
+ }
225
+ this.indirections.pop();
226
+
227
+ /**
228
+ * Creating a new version of referenced element to avoid modifying the original one.
229
+ */
230
+ const mergedElement = (0, _apidomCore.cloneShallow)(referencedElement);
231
+ // assign unique id to merged element
232
+ mergedElement.setMetaProperty('id', identityManager.generateId());
233
+ // annotate referenced element with info about original referencing element
234
+ mergedElement.setMetaProperty('ref-fields', {
235
+ // @ts-ignore
236
+ $ref: (0, _apidomCore.toValue)(referencingElement.$ref)
237
+ });
238
+ // annotate fragment with info about origin
239
+ mergedElement.setMetaProperty('ref-origin', reference.uri);
240
+ // annotate fragment with info about referencing element
241
+ mergedElement.setMetaProperty('ref-referencing-element-id', (0, _apidomCore.cloneDeep)(identityManager.identify(referencingElement)));
242
+
243
+ /**
244
+ * Transclude referencing element with merged referenced element.
245
+ */
246
+ link.replaceWith(mergedElement, mutationReplacer);
247
+
248
+ /**
249
+ * We're at the root of the tree, so we're just replacing the entire tree.
250
+ */
251
+ return !parent ? mergedElement : false;
252
+ }
253
+ async PathItemElement(referencingElement, key, parent, path, ancestors, link) {
254
+ // ignore PathItemElement without $ref field
255
+ if (!(0, _apidomCore.isStringElement)(referencingElement.$ref)) {
256
+ return undefined;
257
+ }
258
+
259
+ // skip current referencing element as it's already been access
260
+ if (this.indirections.includes(referencingElement)) {
261
+ return false;
262
+ }
263
+ const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
264
+ const retrievalURI = this.toBaseURI((0, _apidomCore.toValue)(referencingElement.$ref));
265
+ const isInternalReference = url.stripHash(this.reference.uri) === retrievalURI;
266
+ const isExternalReference = !isInternalReference;
267
+
268
+ // ignore resolving internal Path Item Objects
269
+ if (!this.options.resolve.internal && isInternalReference) {
270
+ // skip traversing this Path Item element but traverse all it's child elements
271
+ return undefined;
272
+ }
273
+ // ignore resolving external Path Item Objects
274
+ if (!this.options.resolve.external && isExternalReference) {
275
+ // skip traversing this Path Item element but traverse all it's child elements
276
+ return undefined;
277
+ }
278
+ const reference = await this.toReference((0, _apidomCore.toValue)(referencingElement.$ref));
279
+ const $refBaseURI = url.resolve(retrievalURI, (0, _apidomCore.toValue)(referencingElement.$ref));
280
+ this.indirections.push(referencingElement);
281
+ const jsonPointer = _apidomJsonPointer.URIFragmentIdentifier.fromURIReference($refBaseURI);
282
+
283
+ // possibly non-semantic referenced element
284
+ let referencedElement = (0, _apidomJsonPointer.evaluate)(reference.value.result, jsonPointer);
285
+ referencedElement.id = identityManager.identify(referencedElement);
286
+
287
+ /**
288
+ * Applying semantics to a referenced element if semantics are missing.
289
+ */
290
+ if ((0, _apidomCore.isPrimitiveElement)(referencedElement)) {
291
+ const cacheKey = `pathItem-${(0, _apidomCore.toValue)(identityManager.identify(referencedElement))}`;
292
+ if (this.refractCache.has(cacheKey)) {
293
+ referencedElement = this.refractCache.get(cacheKey);
294
+ } else {
295
+ referencedElement = _apidomNsOpenapi.PathItemElement.refract(referencedElement);
296
+ this.refractCache.set(cacheKey, referencedElement);
297
+ }
298
+ }
299
+
300
+ // detect direct or indirect reference
301
+ if (referencingElement === referencedElement) {
302
+ throw new _apidomError.ApiDOMError('Recursive Path Item Object reference detected');
303
+ }
304
+
305
+ // detect maximum depth of dereferencing
306
+ if (this.indirections.length > this.options.dereference.maxDepth) {
307
+ throw new _MaximumDereferenceDepthError.default(`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`);
308
+ }
309
+
310
+ // detect second deep dive into the same fragment and avoid it
311
+ if (ancestorsLineage.includes(referencedElement)) {
312
+ reference.refSet.circular = true;
313
+ if (this.options.dereference.circular === 'error') {
314
+ throw new _apidomError.ApiDOMError('Circular reference detected');
315
+ } else if (this.options.dereference.circular === 'replace') {
316
+ const refElement = new _apidomCore.RefElement(referencedElement.id, {
317
+ type: 'path-item',
318
+ uri: reference.uri,
319
+ $ref: (0, _apidomCore.toValue)(referencingElement.$ref)
320
+ });
321
+ const replacer = this.options.dereference.strategyOpts['openapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
322
+ const replacement = replacer(refElement);
323
+ link.replaceWith(replacement, mutationReplacer);
324
+ return !parent ? replacement : false;
325
+ }
326
+ }
327
+
328
+ /**
329
+ * Dive deep into the fragment.
330
+ *
331
+ * Cases to consider:
332
+ * 1. We're crossing document boundary
333
+ * 2. Fragment is from non-entry document
334
+ * 3. Fragment is a Path Item Object with $ref field. We need to follow it to get the eventual value
335
+ * 4. We are dereferencing the fragment lazily/eagerly depending on circular mode
336
+ */
337
+ const isNonEntryDocument = url.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
338
+ const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
339
+ if ((isExternalReference || isNonEntryDocument || (0, _apidomNsOpenapi.isPathItemElement)(referencedElement) && (0, _apidomCore.isStringElement)(referencedElement.$ref) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
340
+ // append referencing reference to ancestors lineage
341
+ directAncestors.add(referencingElement);
342
+ const visitor = new OpenAPI2DereferenceVisitor({
343
+ reference,
344
+ namespace: this.namespace,
345
+ indirections: [...this.indirections],
346
+ options: this.options,
347
+ refractCache: this.refractCache,
348
+ ancestors: ancestorsLineage
349
+ });
350
+ referencedElement = await visitAsync(referencedElement, visitor, {
351
+ keyMap: _apidomNsOpenapi.keyMap,
352
+ nodeTypeGetter: _apidomNsOpenapi.getNodeType
353
+ });
354
+
355
+ // remove referencing reference from ancestors lineage
356
+ directAncestors.delete(referencingElement);
357
+ }
358
+ this.indirections.pop();
359
+
360
+ // merge fields from referenced Path Item with referencing one
361
+ if ((0, _apidomNsOpenapi.isPathItemElement)(referencedElement)) {
362
+ const mergedElement = new _apidomNsOpenapi.PathItemElement([...referencedElement.content], (0, _apidomCore.cloneDeep)(referencedElement.meta), (0, _apidomCore.cloneDeep)(referencedElement.attributes));
363
+ // assign unique id to merged element
364
+ mergedElement.setMetaProperty('id', identityManager.generateId());
365
+ // existing keywords from referencing PathItemElement overrides ones from referenced element
366
+ referencingElement.forEach((value, keyElement, item) => {
367
+ mergedElement.remove((0, _apidomCore.toValue)(keyElement));
368
+ mergedElement.content.push(item);
369
+ });
370
+ mergedElement.remove('$ref');
371
+
372
+ // annotate referenced element with info about original referencing element
373
+ mergedElement.setMetaProperty('ref-fields', {
374
+ $ref: (0, _apidomCore.toValue)(referencingElement.$ref)
375
+ });
376
+ // annotate referenced element with info about origin
377
+ mergedElement.setMetaProperty('ref-origin', reference.uri);
378
+ // annotate fragment with info about referencing element
379
+ mergedElement.setMetaProperty('ref-referencing-element-id', (0, _apidomCore.cloneDeep)(identityManager.identify(referencingElement)));
380
+ referencedElement = mergedElement;
381
+ }
382
+
383
+ /**
384
+ * Transclude referencing element with merged referenced element.
385
+ */
386
+ link.replaceWith(referencedElement, mutationReplacer);
387
+
388
+ /**
389
+ * We're at the root of the tree, so we're just replacing the entire tree.
390
+ */
391
+ return !parent ? referencedElement : undefined;
392
+ }
393
+ async JSONReferenceElement(referencingElement, key, parent, path, ancestors, link) {
394
+ // skip current referencing element as it's already been access
395
+ if (this.indirections.includes(referencingElement)) {
396
+ return false;
397
+ }
398
+ const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
399
+ const retrievalURI = this.toBaseURI((0, _apidomCore.toValue)(referencingElement.$ref));
400
+ const isInternalReference = url.stripHash(this.reference.uri) === retrievalURI;
401
+ const isExternalReference = !isInternalReference;
402
+
403
+ // ignore resolving internal JSONReference Objects
404
+ if (!this.options.resolve.internal && isInternalReference) {
405
+ // skip traversing this JSONReference element and all it's child elements
406
+ return false;
407
+ }
408
+ // ignore resolving external JSONReference Objects
409
+ if (!this.options.resolve.external && isExternalReference) {
410
+ // skip traversing this JSONReference element and all it's child elements
411
+ return false;
412
+ }
413
+ const reference = await this.toReference((0, _apidomCore.toValue)(referencingElement.$ref));
414
+ const $refBaseURI = url.resolve(retrievalURI, (0, _apidomCore.toValue)(referencingElement.$ref));
415
+ this.indirections.push(referencingElement);
416
+ const jsonPointer = _apidomJsonPointer.URIFragmentIdentifier.fromURIReference($refBaseURI);
417
+
418
+ // possibly non-semantic fragment
419
+ let referencedElement = (0, _apidomJsonPointer.evaluate)(reference.value.result, jsonPointer);
420
+ referencedElement.id = identityManager.identify(referencedElement);
421
+
422
+ /**
423
+ * Applying semantics to a referenced element if semantics are missing.
424
+ */
425
+ if ((0, _apidomCore.isPrimitiveElement)(referencedElement)) {
426
+ const referencedElementType = (0, _apidomCore.toValue)(referencingElement.meta.get('referenced-element'));
427
+ const cacheKey = `path-item-${(0, _apidomCore.toValue)(identityManager.identify(referencedElement))}`;
428
+ if (this.refractCache.has(cacheKey)) {
429
+ referencedElement = this.refractCache.get(cacheKey);
430
+ } else if ((0, _apidomNsOpenapi.isJSONReferenceLikeElement)(referencedElement)) {
431
+ // handling indirect references
432
+ referencedElement = _apidomNsOpenapi.ReferenceElement.refract(referencedElement);
433
+ referencedElement.setMetaProperty('referenced-element', referencedElementType);
434
+ this.refractCache.set(cacheKey, referencedElement);
435
+ } else {
436
+ // handling direct references
437
+ const ElementClass = this.namespace.getElementClass(referencedElementType);
438
+ referencedElement = ElementClass.refract(referencedElement);
439
+ this.refractCache.set(cacheKey, referencedElement);
440
+ }
441
+ }
442
+
443
+ // detect direct or circular reference
444
+ if (referencingElement === referencedElement) {
445
+ throw new _apidomError.ApiDOMError('Recursive Reference Object detected');
446
+ }
447
+
448
+ // detect maximum depth of dereferencing
449
+ if (this.indirections.length > this.options.dereference.maxDepth) {
450
+ throw new _MaximumDereferenceDepthError.default(`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`);
451
+ }
452
+
453
+ // detect second deep dive into the same fragment and avoid it
454
+ if (ancestorsLineage.includes(referencedElement)) {
455
+ reference.refSet.circular = true;
456
+ if (this.options.dereference.circular === 'error') {
457
+ throw new _apidomError.ApiDOMError('Circular reference detected');
458
+ } else if (this.options.dereference.circular === 'replace') {
459
+ const refElement = new _apidomCore.RefElement(referencedElement.id, {
460
+ type: 'json-reference',
461
+ uri: reference.uri,
462
+ $ref: (0, _apidomCore.toValue)(referencingElement.$ref)
463
+ });
464
+ const replacer = this.options.dereference.strategyOpts['openapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
465
+ const replacement = replacer(refElement);
466
+ link.replaceWith(replacement, mutationReplacer);
467
+ return !parent ? replacement : false;
468
+ }
469
+ }
470
+
471
+ /**
472
+ * Dive deep into the fragment.
473
+ *
474
+ * Cases to consider:
475
+ * 1. We're crossing document boundary
476
+ 2. Fragment is from non-entry document
477
+ * 3. Fragment is a JSON Reference Object. We need to follow it to get the eventual value
478
+ * 4. We are dereferencing the fragment lazily/eagerly depending on circular mode
479
+ */
480
+ const isNonEntryDocument = url.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
481
+ const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
482
+ if ((isExternalReference || isNonEntryDocument || (0, _apidomNsOpenapi.isJSONReferenceElement)(referencedElement) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
483
+ // append referencing reference to ancestors lineage
484
+ directAncestors.add(referencingElement);
485
+ const visitor = new OpenAPI2DereferenceVisitor({
486
+ reference,
487
+ namespace: this.namespace,
488
+ indirections: [...this.indirections],
489
+ options: this.options,
490
+ refractCache: this.refractCache,
491
+ ancestors: ancestorsLineage
492
+ });
493
+ referencedElement = await visitAsync(referencedElement, visitor, {
494
+ keyMap: _apidomNsOpenapi.keyMap,
495
+ nodeTypeGetter: _apidomNsOpenapi.getNodeType
496
+ });
497
+
498
+ // remove referencing reference from ancestors lineage
499
+ directAncestors.delete(referencingElement);
500
+ }
501
+ this.indirections.pop();
502
+
503
+ /**
504
+ * Creating a new version of referenced element to avoid modifying the original one.
505
+ */
506
+ const mergedElement = (0, _apidomCore.cloneShallow)(referencedElement);
507
+ // assign unique id to merged element
508
+ mergedElement.setMetaProperty('id', identityManager.generateId());
509
+ // annotate referenced element with info about original referencing element
510
+ mergedElement.setMetaProperty('ref-fields', {
511
+ // @ts-ignore
512
+ $ref: (0, _apidomCore.toValue)(referencingElement.$ref)
513
+ });
514
+ // annotate fragment with info about origin
515
+ mergedElement.setMetaProperty('ref-origin', reference.uri);
516
+ // annotate fragment with info about referencing element
517
+ mergedElement.setMetaProperty('ref-referencing-element-id', (0, _apidomCore.cloneDeep)(identityManager.identify(referencingElement)));
518
+
519
+ /**
520
+ * Transclude referencing element with merged referenced element.
521
+ */
522
+ link.replaceWith(mergedElement, mutationReplacer);
523
+
524
+ /**
525
+ * We're at the root of the tree, so we're just replacing the entire tree.
526
+ */
527
+ return !parent ? mergedElement : false;
528
+ }
529
+ }
530
+ var _default = exports.default = OpenAPI2DereferenceVisitor;