@speclynx/apidom-reference 4.0.2 → 4.0.4

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 (186) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/apidom-reference.browser.js +15 -15
  3. package/dist/apidom-reference.browser.min.js +1 -1
  4. package/package.json +25 -25
  5. package/src/File.cjs +50 -0
  6. package/src/File.mjs +44 -0
  7. package/src/Reference.cjs +31 -0
  8. package/src/Reference.mjs +27 -0
  9. package/src/ReferenceSet.cjs +60 -0
  10. package/src/ReferenceSet.mjs +57 -0
  11. package/src/bundle/index.cjs +61 -0
  12. package/src/bundle/index.mjs +55 -0
  13. package/src/bundle/strategies/BundleStrategy.cjs +20 -0
  14. package/src/bundle/strategies/BundleStrategy.mjs +16 -0
  15. package/src/bundle/strategies/openapi-3-1/index.cjs +35 -0
  16. package/src/bundle/strategies/openapi-3-1/index.mjs +29 -0
  17. package/src/configuration/empty.cjs +9 -0
  18. package/src/configuration/empty.mjs +1 -0
  19. package/src/configuration/saturated.cjs +88 -0
  20. package/src/configuration/saturated.mjs +80 -0
  21. package/src/dereference/index.cjs +90 -0
  22. package/src/dereference/index.mjs +83 -0
  23. package/src/dereference/strategies/DereferenceStrategy.cjs +20 -0
  24. package/src/dereference/strategies/DereferenceStrategy.mjs +16 -0
  25. package/src/dereference/strategies/apidom/index.cjs +89 -0
  26. package/src/dereference/strategies/apidom/index.mjs +83 -0
  27. package/src/dereference/strategies/apidom/selectors/element-id.cjs +47 -0
  28. package/src/dereference/strategies/apidom/selectors/element-id.mjs +41 -0
  29. package/src/dereference/strategies/apidom/visitor.cjs +266 -0
  30. package/src/dereference/strategies/apidom/visitor.mjs +259 -0
  31. package/src/dereference/strategies/arazzo-1/index.cjs +109 -0
  32. package/src/dereference/strategies/arazzo-1/index.mjs +100 -0
  33. package/src/dereference/strategies/arazzo-1/selectors/$anchor.cjs +12 -0
  34. package/src/dereference/strategies/arazzo-1/selectors/$anchor.mjs +1 -0
  35. package/src/dereference/strategies/arazzo-1/selectors/uri.cjs +8 -0
  36. package/src/dereference/strategies/arazzo-1/selectors/uri.mjs +1 -0
  37. package/src/dereference/strategies/arazzo-1/source-descriptions.cjs +248 -0
  38. package/src/dereference/strategies/arazzo-1/source-descriptions.mjs +243 -0
  39. package/src/dereference/strategies/arazzo-1/util.cjs +37 -0
  40. package/src/dereference/strategies/arazzo-1/util.mjs +29 -0
  41. package/src/dereference/strategies/arazzo-1/visitor.cjs +507 -0
  42. package/src/dereference/strategies/arazzo-1/visitor.mjs +500 -0
  43. package/src/dereference/strategies/asyncapi-2/index.cjs +94 -0
  44. package/src/dereference/strategies/asyncapi-2/index.mjs +88 -0
  45. package/src/dereference/strategies/asyncapi-2/visitor.cjs +501 -0
  46. package/src/dereference/strategies/asyncapi-2/visitor.mjs +494 -0
  47. package/src/dereference/strategies/openapi-2/index.cjs +96 -0
  48. package/src/dereference/strategies/openapi-2/index.mjs +90 -0
  49. package/src/dereference/strategies/openapi-2/visitor.cjs +629 -0
  50. package/src/dereference/strategies/openapi-2/visitor.mjs +622 -0
  51. package/src/dereference/strategies/openapi-3-0/index.cjs +96 -0
  52. package/src/dereference/strategies/openapi-3-0/index.mjs +90 -0
  53. package/src/dereference/strategies/openapi-3-0/visitor.cjs +622 -0
  54. package/src/dereference/strategies/openapi-3-0/visitor.mjs +615 -0
  55. package/src/dereference/strategies/openapi-3-1/index.cjs +99 -0
  56. package/src/dereference/strategies/openapi-3-1/index.mjs +90 -0
  57. package/src/dereference/strategies/openapi-3-1/selectors/$anchor.cjs +65 -0
  58. package/src/dereference/strategies/openapi-3-1/selectors/$anchor.mjs +54 -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 +68 -0
  62. package/src/dereference/strategies/openapi-3-1/util.mjs +59 -0
  63. package/src/dereference/strategies/openapi-3-1/visitor.cjs +874 -0
  64. package/src/dereference/strategies/openapi-3-1/visitor.mjs +867 -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/UnmatchedParserError.cjs +11 -0
  104. package/src/errors/UnmatchedParserError.mjs +6 -0
  105. package/src/errors/UnmatchedResolveStrategyError.cjs +11 -0
  106. package/src/errors/UnmatchedResolveStrategyError.mjs +6 -0
  107. package/src/errors/UnmatchedResolverError.cjs +11 -0
  108. package/src/errors/UnmatchedResolverError.mjs +6 -0
  109. package/src/errors/UnresolvableReferenceError.cjs +11 -0
  110. package/src/errors/UnresolvableReferenceError.mjs +6 -0
  111. package/src/index.cjs +146 -0
  112. package/src/index.mjs +103 -0
  113. package/src/options/index.cjs +194 -0
  114. package/src/options/index.mjs +191 -0
  115. package/src/options/util.cjs +24 -0
  116. package/src/options/util.mjs +19 -0
  117. package/src/parse/index.cjs +69 -0
  118. package/src/parse/index.mjs +63 -0
  119. package/src/parse/parsers/Parser.cjs +62 -0
  120. package/src/parse/parsers/Parser.mjs +58 -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 +62 -0
  124. package/src/parse/parsers/arazzo-json-1/index.mjs +56 -0
  125. package/src/parse/parsers/arazzo-json-1/source-descriptions.cjs +221 -0
  126. package/src/parse/parsers/arazzo-json-1/source-descriptions.mjs +214 -0
  127. package/src/parse/parsers/arazzo-yaml-1/index.cjs +62 -0
  128. package/src/parse/parsers/arazzo-yaml-1/index.mjs +56 -0
  129. package/src/parse/parsers/arazzo-yaml-1/source-descriptions.cjs +12 -0
  130. package/src/parse/parsers/arazzo-yaml-1/source-descriptions.mjs +7 -0
  131. package/src/parse/parsers/asyncapi-json-2/index.cjs +54 -0
  132. package/src/parse/parsers/asyncapi-json-2/index.mjs +48 -0
  133. package/src/parse/parsers/asyncapi-yaml-2/index.cjs +54 -0
  134. package/src/parse/parsers/asyncapi-yaml-2/index.mjs +48 -0
  135. package/src/parse/parsers/binary/index-browser.cjs +56 -0
  136. package/src/parse/parsers/binary/index-browser.mjs +50 -0
  137. package/src/parse/parsers/binary/index-node.cjs +51 -0
  138. package/src/parse/parsers/binary/index-node.mjs +45 -0
  139. package/src/parse/parsers/json/index.cjs +53 -0
  140. package/src/parse/parsers/json/index.mjs +47 -0
  141. package/src/parse/parsers/openapi-json-2/index.cjs +54 -0
  142. package/src/parse/parsers/openapi-json-2/index.mjs +48 -0
  143. package/src/parse/parsers/openapi-json-3-0/index.cjs +54 -0
  144. package/src/parse/parsers/openapi-json-3-0/index.mjs +48 -0
  145. package/src/parse/parsers/openapi-json-3-1/index.cjs +54 -0
  146. package/src/parse/parsers/openapi-json-3-1/index.mjs +48 -0
  147. package/src/parse/parsers/openapi-yaml-2/index.cjs +54 -0
  148. package/src/parse/parsers/openapi-yaml-2/index.mjs +48 -0
  149. package/src/parse/parsers/openapi-yaml-3-0/index.cjs +54 -0
  150. package/src/parse/parsers/openapi-yaml-3-0/index.mjs +48 -0
  151. package/src/parse/parsers/openapi-yaml-3-1/index.cjs +54 -0
  152. package/src/parse/parsers/openapi-yaml-3-1/index.mjs +48 -0
  153. package/src/parse/parsers/yaml-1-2/index.cjs +56 -0
  154. package/src/parse/parsers/yaml-1-2/index.mjs +50 -0
  155. package/src/resolve/index.cjs +67 -0
  156. package/src/resolve/index.mjs +60 -0
  157. package/src/resolve/resolvers/HTTPResolver.cjs +45 -0
  158. package/src/resolve/resolvers/HTTPResolver.mjs +37 -0
  159. package/src/resolve/resolvers/Resolver.cjs +20 -0
  160. package/src/resolve/resolvers/Resolver.mjs +16 -0
  161. package/src/resolve/resolvers/file/index-browser.cjs +24 -0
  162. package/src/resolve/resolvers/file/index-browser.mjs +19 -0
  163. package/src/resolve/resolvers/file/index-node.cjs +49 -0
  164. package/src/resolve/resolvers/file/index-node.mjs +42 -0
  165. package/src/resolve/resolvers/http-axios/cache/MemoryCache.cjs +41 -0
  166. package/src/resolve/resolvers/http-axios/cache/MemoryCache.mjs +37 -0
  167. package/src/resolve/resolvers/http-axios/index.cjs +113 -0
  168. package/src/resolve/resolvers/http-axios/index.mjs +105 -0
  169. package/src/resolve/strategies/ResolveStrategy.cjs +20 -0
  170. package/src/resolve/strategies/ResolveStrategy.mjs +16 -0
  171. package/src/resolve/strategies/apidom/index.cjs +49 -0
  172. package/src/resolve/strategies/apidom/index.mjs +43 -0
  173. package/src/resolve/strategies/asyncapi-2/index.cjs +49 -0
  174. package/src/resolve/strategies/asyncapi-2/index.mjs +43 -0
  175. package/src/resolve/strategies/openapi-2/index.cjs +49 -0
  176. package/src/resolve/strategies/openapi-2/index.mjs +43 -0
  177. package/src/resolve/strategies/openapi-3-0/index.cjs +49 -0
  178. package/src/resolve/strategies/openapi-3-0/index.mjs +43 -0
  179. package/src/resolve/strategies/openapi-3-1/index.cjs +49 -0
  180. package/src/resolve/strategies/openapi-3-1/index.mjs +43 -0
  181. package/src/resolve/util.cjs +37 -0
  182. package/src/resolve/util.mjs +30 -0
  183. package/src/util/plugins.cjs +39 -0
  184. package/src/util/plugins.mjs +34 -0
  185. package/src/util/url.cjs +288 -0
  186. package/src/util/url.mjs +274 -0
@@ -0,0 +1,80 @@
1
+ import FileResolver from "../resolve/resolvers/file/index-node.mjs";
2
+ import HTTPResolverAxios from "../resolve/resolvers/http-axios/index.mjs";
3
+ import OpenAPI2ResolveStrategy from "../resolve/strategies/openapi-2/index.mjs";
4
+ import OpenAPI3_0ResolveStrategy from "../resolve/strategies/openapi-3-0/index.mjs";
5
+ import OpenAPI3_1ResolveStrategy from "../resolve/strategies/openapi-3-1/index.mjs";
6
+ import AsyncAPI2ResolveStrategy from "../resolve/strategies/asyncapi-2/index.mjs";
7
+ import ApiDOMResolveStrategy from "../resolve/strategies/apidom/index.mjs";
8
+ import OpenAPIJSON2Parser from "../parse/parsers/openapi-json-2/index.mjs";
9
+ import OpenAPIYAML2Parser from "../parse/parsers/openapi-yaml-2/index.mjs";
10
+ import OpenAPIJSON3_0Parser from "../parse/parsers/openapi-json-3-0/index.mjs";
11
+ import OpenAPIYAML3_0Parser from "../parse/parsers/openapi-yaml-3-0/index.mjs";
12
+ import OpenAPIJSON3_1Parser from "../parse/parsers/openapi-json-3-1/index.mjs";
13
+ import OpenAPIYAML3_1Parser from "../parse/parsers/openapi-yaml-3-1/index.mjs";
14
+ import AsyncAPIJSON2Parser from "../parse/parsers/asyncapi-json-2/index.mjs";
15
+ import AsyncAPIYAML2Parser from "../parse/parsers/asyncapi-yaml-2/index.mjs";
16
+ import ArazzoJSON1Parser from "../parse/parsers/arazzo-json-1/index.mjs";
17
+ import ArazzoYAML1Parser from "../parse/parsers/arazzo-yaml-1/index.mjs";
18
+ import APIDOMJSONParser from "../parse/parsers/apidom-json/index.mjs";
19
+ import JSONParser from "../parse/parsers/json/index.mjs";
20
+ import YAMLParser from "../parse/parsers/yaml-1-2/index.mjs";
21
+ import BinaryParser from "../parse/parsers/binary/index-node.mjs";
22
+ import ApiDOMDereferenceStrategy from "../dereference/strategies/apidom/index.mjs";
23
+ import OpenAPI2DereferenceStrategy from "../dereference/strategies/openapi-2/index.mjs";
24
+ import OpenAPI3_0DereferenceStrategy from "../dereference/strategies/openapi-3-0/index.mjs";
25
+ import OpenAPI3_1DereferenceStrategy from "../dereference/strategies/openapi-3-1/index.mjs";
26
+ import AsyncAPI2DereferenceStrategy from "../dereference/strategies/asyncapi-2/index.mjs";
27
+ import Arazzo1DereferenceStrategy from "../dereference/strategies/arazzo-1/index.mjs";
28
+ import OpenAPI3_1BundleStrategy from "../bundle/strategies/openapi-3-1/index.mjs";
29
+ import { options } from "../index.mjs";
30
+ options.parse.parsers = [new OpenAPIJSON2Parser({
31
+ allowEmpty: true,
32
+ sourceMap: false
33
+ }), new OpenAPIYAML2Parser({
34
+ allowEmpty: true,
35
+ sourceMap: false
36
+ }), new OpenAPIJSON3_0Parser({
37
+ allowEmpty: true,
38
+ sourceMap: false
39
+ }), new OpenAPIYAML3_0Parser({
40
+ allowEmpty: true,
41
+ sourceMap: false
42
+ }), new OpenAPIJSON3_1Parser({
43
+ allowEmpty: true,
44
+ sourceMap: false
45
+ }), new OpenAPIYAML3_1Parser({
46
+ allowEmpty: true,
47
+ sourceMap: false
48
+ }), new AsyncAPIJSON2Parser({
49
+ allowEmpty: true,
50
+ sourceMap: false
51
+ }), new AsyncAPIYAML2Parser({
52
+ allowEmpty: true,
53
+ sourceMap: false
54
+ }), new ArazzoJSON1Parser({
55
+ allowEmpty: true,
56
+ sourceMap: false
57
+ }), new ArazzoYAML1Parser({
58
+ allowEmpty: true,
59
+ sourceMap: false
60
+ }), new APIDOMJSONParser({
61
+ allowEmpty: true,
62
+ sourceMap: false
63
+ }), new JSONParser({
64
+ allowEmpty: true,
65
+ sourceMap: false
66
+ }), new YAMLParser({
67
+ allowEmpty: true,
68
+ sourceMap: false
69
+ }), new BinaryParser({
70
+ allowEmpty: true
71
+ })];
72
+ options.resolve.resolvers = [new FileResolver(), new HTTPResolverAxios({
73
+ timeout: 5000,
74
+ redirects: 5,
75
+ withCredentials: false
76
+ })];
77
+ options.resolve.strategies = [new OpenAPI2ResolveStrategy(), new OpenAPI3_0ResolveStrategy(), new OpenAPI3_1ResolveStrategy(), new AsyncAPI2ResolveStrategy(), new ApiDOMResolveStrategy()];
78
+ options.dereference.strategies = [new OpenAPI2DereferenceStrategy(), new OpenAPI3_0DereferenceStrategy(), new OpenAPI3_1DereferenceStrategy(), new AsyncAPI2DereferenceStrategy(), new Arazzo1DereferenceStrategy(), new ApiDOMDereferenceStrategy()];
79
+ options.bundle.strategies = [new OpenAPI3_1BundleStrategy()];
80
+ export * from "../index.mjs";
@@ -0,0 +1,90 @@
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.dereferenceApiDOM = exports.default = void 0;
7
+ var _ramda = require("ramda");
8
+ var _apidomDatamodel = require("@speclynx/apidom-datamodel");
9
+ var _File = _interopRequireDefault(require("../File.cjs"));
10
+ var plugins = _interopRequireWildcard(require("../util/plugins.cjs"));
11
+ var _UnmatchedDereferenceStrategyError = _interopRequireDefault(require("../errors/UnmatchedDereferenceStrategyError.cjs"));
12
+ var _DereferenceError = _interopRequireDefault(require("../errors/DereferenceError.cjs"));
13
+ var _UnresolvableReferenceError = _interopRequireDefault(require("../errors/UnresolvableReferenceError.cjs"));
14
+ var _index = _interopRequireDefault(require("../parse/index.cjs"));
15
+ var _util = require("../options/util.cjs");
16
+ var url = _interopRequireWildcard(require("../util/url.cjs"));
17
+ /**
18
+ * Dereferences ApiDOM with all its external references.
19
+ */
20
+ const dereferenceApiDOM = async (element, options) => {
21
+ // @ts-ignore
22
+ let parseResult = element;
23
+ let surrogateWrapping = false;
24
+
25
+ // wrap element into parse result
26
+ if (!(0, _apidomDatamodel.isParseResultElement)(element)) {
27
+ const elementClone = (0, _apidomDatamodel.cloneShallow)(element);
28
+ elementClone.classes.push('result');
29
+ parseResult = new _apidomDatamodel.ParseResultElement([elementClone]);
30
+ surrogateWrapping = true;
31
+ }
32
+ const file = new _File.default({
33
+ uri: options.resolve.baseURI,
34
+ parseResult,
35
+ mediaType: options.parse.mediaType
36
+ });
37
+ const dereferenceStrategies = await plugins.filter('canDereference', [file, options], options.dereference.strategies);
38
+
39
+ // we couldn't find any dereference strategy for this File
40
+ if ((0, _ramda.isEmpty)(dereferenceStrategies)) {
41
+ throw new _UnmatchedDereferenceStrategyError.default(`Could not find a dereference strategy that can dereference the file "${file.uri}"`);
42
+ }
43
+ try {
44
+ const {
45
+ result
46
+ } = await plugins.run('dereference', [file, options], dereferenceStrategies);
47
+ // unwrap the element from ParseResult assuming first element is the actual result
48
+ return surrogateWrapping ? result.get(0) : result;
49
+ } catch (error) {
50
+ if (error instanceof _UnresolvableReferenceError.default) {
51
+ throw error;
52
+ }
53
+ throw new _DereferenceError.default(`Error while dereferencing file "${file.uri}"`, {
54
+ cause: error
55
+ });
56
+ }
57
+ };
58
+
59
+ /**
60
+ * Dereferences a file with all its external references.
61
+ */
62
+ exports.dereferenceApiDOM = dereferenceApiDOM;
63
+ const dereference = async (uri, options) => {
64
+ const {
65
+ refSet
66
+ } = options.dereference;
67
+ const sanitizedURI = url.sanitize(uri);
68
+ let parseResult;
69
+
70
+ // if refSet was provided, use it to avoid unnecessary parsing
71
+ if (refSet !== null && refSet.has(sanitizedURI)) {
72
+ // @ts-ignore
73
+ ({
74
+ value: parseResult
75
+ } = refSet.find((0, _ramda.propEq)(sanitizedURI, 'uri')));
76
+ } else {
77
+ parseResult = await (0, _index.default)(uri, options);
78
+ }
79
+ const mergedOptions = (0, _util.merge)(options, {
80
+ resolve: {
81
+ baseURI: sanitizedURI
82
+ },
83
+ dereference: {
84
+ // if refSet was not provided, then we can work in mutable mode
85
+ immutable: options.dereference.immutable && refSet !== null
86
+ }
87
+ });
88
+ return dereferenceApiDOM(parseResult, mergedOptions);
89
+ };
90
+ var _default = exports.default = dereference;
@@ -0,0 +1,83 @@
1
+ import { isEmpty, propEq } from 'ramda';
2
+ import { isParseResultElement, ParseResultElement, cloneShallow } from '@speclynx/apidom-datamodel';
3
+ import File from "../File.mjs";
4
+ import * as plugins from "../util/plugins.mjs";
5
+ import UnmatchedDereferenceStrategyError from "../errors/UnmatchedDereferenceStrategyError.mjs";
6
+ import DereferenceError from "../errors/DereferenceError.mjs";
7
+ import UnresolvableReferenceError from "../errors/UnresolvableReferenceError.mjs";
8
+ import parse from "../parse/index.mjs";
9
+ import { merge as mergeOptions } from "../options/util.mjs";
10
+ import * as url from "../util/url.mjs";
11
+ /**
12
+ * Dereferences ApiDOM with all its external references.
13
+ */
14
+ export const dereferenceApiDOM = async (element, options) => {
15
+ // @ts-ignore
16
+ let parseResult = element;
17
+ let surrogateWrapping = false;
18
+
19
+ // wrap element into parse result
20
+ if (!isParseResultElement(element)) {
21
+ const elementClone = cloneShallow(element);
22
+ elementClone.classes.push('result');
23
+ parseResult = new ParseResultElement([elementClone]);
24
+ surrogateWrapping = true;
25
+ }
26
+ const file = new File({
27
+ uri: options.resolve.baseURI,
28
+ parseResult,
29
+ mediaType: options.parse.mediaType
30
+ });
31
+ const dereferenceStrategies = await plugins.filter('canDereference', [file, options], options.dereference.strategies);
32
+
33
+ // we couldn't find any dereference strategy for this File
34
+ if (isEmpty(dereferenceStrategies)) {
35
+ throw new UnmatchedDereferenceStrategyError(`Could not find a dereference strategy that can dereference the file "${file.uri}"`);
36
+ }
37
+ try {
38
+ const {
39
+ result
40
+ } = await plugins.run('dereference', [file, options], dereferenceStrategies);
41
+ // unwrap the element from ParseResult assuming first element is the actual result
42
+ return surrogateWrapping ? result.get(0) : result;
43
+ } catch (error) {
44
+ if (error instanceof UnresolvableReferenceError) {
45
+ throw error;
46
+ }
47
+ throw new DereferenceError(`Error while dereferencing file "${file.uri}"`, {
48
+ cause: error
49
+ });
50
+ }
51
+ };
52
+
53
+ /**
54
+ * Dereferences a file with all its external references.
55
+ */
56
+ const dereference = async (uri, options) => {
57
+ const {
58
+ refSet
59
+ } = options.dereference;
60
+ const sanitizedURI = url.sanitize(uri);
61
+ let parseResult;
62
+
63
+ // if refSet was provided, use it to avoid unnecessary parsing
64
+ if (refSet !== null && refSet.has(sanitizedURI)) {
65
+ // @ts-ignore
66
+ ({
67
+ value: parseResult
68
+ } = refSet.find(propEq(sanitizedURI, 'uri')));
69
+ } else {
70
+ parseResult = await parse(uri, options);
71
+ }
72
+ const mergedOptions = mergeOptions(options, {
73
+ resolve: {
74
+ baseURI: sanitizedURI
75
+ },
76
+ dereference: {
77
+ // if refSet was not provided, then we can work in mutable mode
78
+ immutable: options.dereference.immutable && refSet !== null
79
+ }
80
+ });
81
+ return dereferenceApiDOM(parseResult, mergedOptions);
82
+ };
83
+ export default dereference;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.default = void 0;
5
+ /**
6
+ * @public
7
+ */
8
+
9
+ /**
10
+ * @public
11
+ */
12
+ class DereferenceStrategy {
13
+ name;
14
+ constructor({
15
+ name
16
+ }) {
17
+ this.name = name;
18
+ }
19
+ }
20
+ var _default = exports.default = DereferenceStrategy;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @public
3
+ */
4
+
5
+ /**
6
+ * @public
7
+ */
8
+ class DereferenceStrategy {
9
+ name;
10
+ constructor({
11
+ name
12
+ }) {
13
+ this.name = name;
14
+ }
15
+ }
16
+ export default DereferenceStrategy;
@@ -0,0 +1,89 @@
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 _apidomDatamodel = require("@speclynx/apidom-datamodel");
7
+ var _apidomTraverse = require("@speclynx/apidom-traverse");
8
+ var _DereferenceStrategy = _interopRequireDefault(require("../DereferenceStrategy.cjs"));
9
+ var _Reference = _interopRequireDefault(require("../../../Reference.cjs"));
10
+ var _ReferenceSet = _interopRequireDefault(require("../../../ReferenceSet.cjs"));
11
+ var _visitor = _interopRequireDefault(require("./visitor.cjs"));
12
+ exports.ApiDOMDereferenceVisitor = _visitor.default;
13
+ /**
14
+ * @public
15
+ */
16
+
17
+ /**
18
+ * @public
19
+ */
20
+ class ApiDOMDereferenceStrategy extends _DereferenceStrategy.default {
21
+ constructor(options) {
22
+ super({
23
+ ...(options ?? {}),
24
+ name: 'apidom'
25
+ });
26
+ }
27
+ canDereference(file) {
28
+ return file.mediaType.startsWith('application/vnd.apidom') && (0, _apidomDatamodel.isElement)(file.parseResult?.result);
29
+ }
30
+ async dereference(file, options) {
31
+ const immutableRefSet = options.dereference.refSet ?? new _ReferenceSet.default();
32
+ const mutableRefSet = new _ReferenceSet.default();
33
+ let refSet = immutableRefSet;
34
+ let reference;
35
+
36
+ // determine the initial reference
37
+ if (!immutableRefSet.has(file.uri)) {
38
+ reference = new _Reference.default({
39
+ uri: file.uri,
40
+ value: file.parseResult
41
+ });
42
+ immutableRefSet.add(reference);
43
+ } else {
44
+ // pre-computed refSet was provided as configuration option
45
+ reference = immutableRefSet.find(ref => ref.uri === file.uri);
46
+ }
47
+
48
+ /**
49
+ * Clone refSet due the dereferencing process being mutable.
50
+ * We don't want to mutate the original refSet and the references.
51
+ */
52
+ if (options.dereference.immutable) {
53
+ immutableRefSet.refs.map(ref => new _Reference.default({
54
+ ...ref,
55
+ value: (0, _apidomDatamodel.cloneDeep)(ref.value)
56
+ })).forEach(ref => mutableRefSet.add(ref));
57
+ reference = mutableRefSet.find(ref => ref.uri === file.uri);
58
+ refSet = mutableRefSet;
59
+ }
60
+ const visitor = new _visitor.default({
61
+ reference: reference,
62
+ options
63
+ });
64
+ const dereferencedElement = await (0, _apidomTraverse.traverseAsync)(refSet.rootRef.value, visitor, {
65
+ mutable: true
66
+ });
67
+
68
+ /**
69
+ * If immutable option is set, replay refs from the refSet.
70
+ */
71
+ if (options.dereference.immutable) {
72
+ mutableRefSet.refs.filter(ref => ref.uri.startsWith('immutable://')).map(ref => new _Reference.default({
73
+ ...ref,
74
+ uri: ref.uri.replace(/^immutable:\/\//, '')
75
+ })).forEach(ref => immutableRefSet.add(ref));
76
+ }
77
+
78
+ /**
79
+ * Release all memory if this refSet was not provided as a configuration option.
80
+ * If provided as configuration option, then provider is responsible for cleanup.
81
+ */
82
+ if (options.dereference.refSet === null) {
83
+ immutableRefSet.clean();
84
+ }
85
+ mutableRefSet.clean();
86
+ return dereferencedElement;
87
+ }
88
+ }
89
+ var _default = exports.default = ApiDOMDereferenceStrategy;
@@ -0,0 +1,83 @@
1
+ import { isElement, cloneDeep } from '@speclynx/apidom-datamodel';
2
+ import { traverseAsync } from '@speclynx/apidom-traverse';
3
+ import DereferenceStrategy from "../DereferenceStrategy.mjs";
4
+ import Reference from "../../../Reference.mjs";
5
+ import ReferenceSet from "../../../ReferenceSet.mjs";
6
+ import ApiDOMDereferenceVisitor from "./visitor.mjs";
7
+ /**
8
+ * @public
9
+ */
10
+ /**
11
+ * @public
12
+ */
13
+ class ApiDOMDereferenceStrategy extends DereferenceStrategy {
14
+ constructor(options) {
15
+ super({
16
+ ...(options ?? {}),
17
+ name: 'apidom'
18
+ });
19
+ }
20
+ canDereference(file) {
21
+ return file.mediaType.startsWith('application/vnd.apidom') && isElement(file.parseResult?.result);
22
+ }
23
+ async dereference(file, options) {
24
+ const immutableRefSet = options.dereference.refSet ?? new ReferenceSet();
25
+ const mutableRefSet = new ReferenceSet();
26
+ let refSet = immutableRefSet;
27
+ let reference;
28
+
29
+ // determine the initial reference
30
+ if (!immutableRefSet.has(file.uri)) {
31
+ reference = new Reference({
32
+ uri: file.uri,
33
+ value: file.parseResult
34
+ });
35
+ immutableRefSet.add(reference);
36
+ } else {
37
+ // pre-computed refSet was provided as configuration option
38
+ reference = immutableRefSet.find(ref => ref.uri === file.uri);
39
+ }
40
+
41
+ /**
42
+ * Clone refSet due the dereferencing process being mutable.
43
+ * We don't want to mutate the original refSet and the references.
44
+ */
45
+ if (options.dereference.immutable) {
46
+ immutableRefSet.refs.map(ref => new Reference({
47
+ ...ref,
48
+ value: cloneDeep(ref.value)
49
+ })).forEach(ref => mutableRefSet.add(ref));
50
+ reference = mutableRefSet.find(ref => ref.uri === file.uri);
51
+ refSet = mutableRefSet;
52
+ }
53
+ const visitor = new ApiDOMDereferenceVisitor({
54
+ reference: reference,
55
+ options
56
+ });
57
+ const dereferencedElement = await traverseAsync(refSet.rootRef.value, visitor, {
58
+ mutable: true
59
+ });
60
+
61
+ /**
62
+ * If immutable option is set, replay refs from the refSet.
63
+ */
64
+ if (options.dereference.immutable) {
65
+ mutableRefSet.refs.filter(ref => ref.uri.startsWith('immutable://')).map(ref => new Reference({
66
+ ...ref,
67
+ uri: ref.uri.replace(/^immutable:\/\//, '')
68
+ })).forEach(ref => immutableRefSet.add(ref));
69
+ }
70
+
71
+ /**
72
+ * Release all memory if this refSet was not provided as a configuration option.
73
+ * If provided as configuration option, then provider is responsible for cleanup.
74
+ */
75
+ if (options.dereference.refSet === null) {
76
+ immutableRefSet.clean();
77
+ }
78
+ mutableRefSet.clean();
79
+ return dereferencedElement;
80
+ }
81
+ }
82
+ export { ApiDOMDereferenceVisitor };
83
+ export default ApiDOMDereferenceStrategy;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
+ exports.__esModule = true;
5
+ exports.evaluate = void 0;
6
+ var _ramdaAdjunct = require("ramda-adjunct");
7
+ var _apidomDatamodel = require("@speclynx/apidom-datamodel");
8
+ var _apidomCore = require("@speclynx/apidom-core");
9
+ var _apidomTraverse = require("@speclynx/apidom-traverse");
10
+ var _EvaluationElementIdError = _interopRequireDefault(require("../../../../errors/EvaluationElementIdError.cjs"));
11
+ exports.EvaluationElementIdError = _EvaluationElementIdError.default;
12
+ const getElementID = element => {
13
+ const id = element.meta.get('id');
14
+ // handle both raw string (new format) and StringElement (legacy Refract without __meta_raw__)
15
+ return (0, _apidomDatamodel.isElement)(id) ? (0, _apidomCore.toValue)(id) : id;
16
+ };
17
+ const hasElementID = path => {
18
+ if (!path.node.hasMetaProperty('id')) return false;
19
+ const id = getElementID(path.node);
20
+ return typeof id === 'string' && id !== '';
21
+ };
22
+
23
+ /**
24
+ * Evaluates element ID against ApiDOM fragment.
25
+ * @public
26
+ */
27
+ const evaluate = (elementID, element) => {
28
+ const {
29
+ cache
30
+ } = evaluate;
31
+ // warm the cache
32
+ if (!cache.has(element)) {
33
+ const pathsWithID = (0, _apidomTraverse.filter)(element, hasElementID);
34
+ cache.set(element, pathsWithID.map(path => path.node));
35
+ }
36
+
37
+ // search for the matching element
38
+ const result = cache.get(element).find(e => {
39
+ return getElementID(e) === elementID;
40
+ });
41
+ if ((0, _ramdaAdjunct.isUndefined)(result)) {
42
+ throw new _EvaluationElementIdError.default(`Evaluation failed on element ID: "${elementID}"`);
43
+ }
44
+ return result;
45
+ };
46
+ exports.evaluate = evaluate;
47
+ evaluate.cache = new WeakMap();
@@ -0,0 +1,41 @@
1
+ import { isUndefined } from 'ramda-adjunct';
2
+ import { isElement } from '@speclynx/apidom-datamodel';
3
+ import { toValue } from '@speclynx/apidom-core';
4
+ import { filter } from '@speclynx/apidom-traverse';
5
+ import EvaluationElementIdError from "../../../../errors/EvaluationElementIdError.mjs";
6
+ const getElementID = element => {
7
+ const id = element.meta.get('id');
8
+ // handle both raw string (new format) and StringElement (legacy Refract without __meta_raw__)
9
+ return isElement(id) ? toValue(id) : id;
10
+ };
11
+ const hasElementID = path => {
12
+ if (!path.node.hasMetaProperty('id')) return false;
13
+ const id = getElementID(path.node);
14
+ return typeof id === 'string' && id !== '';
15
+ };
16
+
17
+ /**
18
+ * Evaluates element ID against ApiDOM fragment.
19
+ * @public
20
+ */
21
+ export const evaluate = (elementID, element) => {
22
+ const {
23
+ cache
24
+ } = evaluate;
25
+ // warm the cache
26
+ if (!cache.has(element)) {
27
+ const pathsWithID = filter(element, hasElementID);
28
+ cache.set(element, pathsWithID.map(path => path.node));
29
+ }
30
+
31
+ // search for the matching element
32
+ const result = cache.get(element).find(e => {
33
+ return getElementID(e) === elementID;
34
+ });
35
+ if (isUndefined(result)) {
36
+ throw new EvaluationElementIdError(`Evaluation failed on element ID: "${elementID}"`);
37
+ }
38
+ return result;
39
+ };
40
+ evaluate.cache = new WeakMap();
41
+ export { EvaluationElementIdError };