@speclynx/apidom-reference 4.0.1 → 4.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/package.json +26 -27
- package/src/File.cjs +50 -0
- package/src/File.mjs +44 -0
- package/src/File.ts +63 -0
- package/src/Reference.cjs +31 -0
- package/src/Reference.mjs +27 -0
- package/src/Reference.ts +38 -0
- package/src/ReferenceSet.cjs +60 -0
- package/src/ReferenceSet.mjs +57 -0
- package/src/ReferenceSet.ts +73 -0
- package/src/bundle/index.cjs +61 -0
- package/src/bundle/index.mjs +55 -0
- package/src/bundle/index.ts +57 -0
- package/src/bundle/strategies/BundleStrategy.cjs +20 -0
- package/src/bundle/strategies/BundleStrategy.mjs +16 -0
- package/src/bundle/strategies/BundleStrategy.ts +27 -0
- package/src/bundle/strategies/openapi-3-1/index.cjs +35 -0
- package/src/bundle/strategies/openapi-3-1/index.mjs +29 -0
- package/src/bundle/strategies/openapi-3-1/index.ts +57 -0
- package/src/configuration/empty.cjs +9 -0
- package/src/configuration/empty.mjs +1 -0
- package/src/configuration/empty.ts +1 -0
- package/src/configuration/saturated.cjs +88 -0
- package/src/configuration/saturated.mjs +80 -0
- package/src/configuration/saturated.ts +72 -0
- package/src/dereference/index.cjs +90 -0
- package/src/dereference/index.mjs +83 -0
- package/src/dereference/index.ts +96 -0
- package/src/dereference/strategies/DereferenceStrategy.cjs +20 -0
- package/src/dereference/strategies/DereferenceStrategy.mjs +16 -0
- package/src/dereference/strategies/DereferenceStrategy.ts +27 -0
- package/src/dereference/strategies/apidom/index.cjs +89 -0
- package/src/dereference/strategies/apidom/index.mjs +83 -0
- package/src/dereference/strategies/apidom/index.ts +128 -0
- package/src/dereference/strategies/apidom/selectors/element-id.cjs +47 -0
- package/src/dereference/strategies/apidom/selectors/element-id.mjs +41 -0
- package/src/dereference/strategies/apidom/selectors/element-id.ts +48 -0
- package/src/dereference/strategies/apidom/visitor.cjs +266 -0
- package/src/dereference/strategies/apidom/visitor.mjs +259 -0
- package/src/dereference/strategies/apidom/visitor.ts +316 -0
- package/src/dereference/strategies/arazzo-1/index.cjs +109 -0
- package/src/dereference/strategies/arazzo-1/index.mjs +100 -0
- package/src/dereference/strategies/arazzo-1/index.ts +158 -0
- package/src/dereference/strategies/arazzo-1/selectors/$anchor.cjs +12 -0
- package/src/dereference/strategies/arazzo-1/selectors/$anchor.mjs +1 -0
- package/src/dereference/strategies/arazzo-1/selectors/$anchor.ts +9 -0
- package/src/dereference/strategies/arazzo-1/selectors/uri.cjs +8 -0
- package/src/dereference/strategies/arazzo-1/selectors/uri.mjs +1 -0
- package/src/dereference/strategies/arazzo-1/selectors/uri.ts +5 -0
- package/src/dereference/strategies/arazzo-1/source-descriptions.cjs +248 -0
- package/src/dereference/strategies/arazzo-1/source-descriptions.mjs +243 -0
- package/src/dereference/strategies/arazzo-1/source-descriptions.ts +317 -0
- package/src/dereference/strategies/arazzo-1/util.cjs +37 -0
- package/src/dereference/strategies/arazzo-1/util.mjs +29 -0
- package/src/dereference/strategies/arazzo-1/util.ts +33 -0
- package/src/dereference/strategies/arazzo-1/visitor.cjs +507 -0
- package/src/dereference/strategies/arazzo-1/visitor.mjs +500 -0
- package/src/dereference/strategies/arazzo-1/visitor.ts +574 -0
- package/src/dereference/strategies/asyncapi-2/index.cjs +94 -0
- package/src/dereference/strategies/asyncapi-2/index.mjs +88 -0
- package/src/dereference/strategies/asyncapi-2/index.ts +133 -0
- package/src/dereference/strategies/asyncapi-2/visitor.cjs +501 -0
- package/src/dereference/strategies/asyncapi-2/visitor.mjs +494 -0
- package/src/dereference/strategies/asyncapi-2/visitor.ts +589 -0
- package/src/dereference/strategies/openapi-2/index.cjs +96 -0
- package/src/dereference/strategies/openapi-2/index.mjs +90 -0
- package/src/dereference/strategies/openapi-2/index.ts +136 -0
- package/src/dereference/strategies/openapi-2/visitor.cjs +629 -0
- package/src/dereference/strategies/openapi-2/visitor.mjs +622 -0
- package/src/dereference/strategies/openapi-2/visitor.ts +745 -0
- package/src/dereference/strategies/openapi-3-0/index.cjs +96 -0
- package/src/dereference/strategies/openapi-3-0/index.mjs +90 -0
- package/src/dereference/strategies/openapi-3-0/index.ts +134 -0
- package/src/dereference/strategies/openapi-3-0/visitor.cjs +622 -0
- package/src/dereference/strategies/openapi-3-0/visitor.mjs +615 -0
- package/src/dereference/strategies/openapi-3-0/visitor.ts +760 -0
- package/src/dereference/strategies/openapi-3-1/index.cjs +99 -0
- package/src/dereference/strategies/openapi-3-1/index.mjs +90 -0
- package/src/dereference/strategies/openapi-3-1/index.ts +141 -0
- package/src/dereference/strategies/openapi-3-1/selectors/$anchor.cjs +65 -0
- package/src/dereference/strategies/openapi-3-1/selectors/$anchor.mjs +54 -0
- package/src/dereference/strategies/openapi-3-1/selectors/$anchor.ts +64 -0
- package/src/dereference/strategies/openapi-3-1/selectors/uri.cjs +50 -0
- package/src/dereference/strategies/openapi-3-1/selectors/uri.mjs +42 -0
- package/src/dereference/strategies/openapi-3-1/selectors/uri.ts +54 -0
- package/src/dereference/strategies/openapi-3-1/util.cjs +68 -0
- package/src/dereference/strategies/openapi-3-1/util.mjs +59 -0
- package/src/dereference/strategies/openapi-3-1/util.ts +83 -0
- package/src/dereference/strategies/openapi-3-1/visitor.cjs +874 -0
- package/src/dereference/strategies/openapi-3-1/visitor.mjs +867 -0
- package/src/dereference/strategies/openapi-3-1/visitor.ts +1053 -0
- package/src/dereference/util.cjs +31 -0
- package/src/dereference/util.mjs +27 -0
- package/src/dereference/util.ts +29 -0
- package/src/errors/BundleError.cjs +10 -0
- package/src/errors/BundleError.mjs +7 -0
- package/src/errors/BundleError.ts +8 -0
- package/src/errors/DereferenceError.cjs +10 -0
- package/src/errors/DereferenceError.mjs +7 -0
- package/src/errors/DereferenceError.ts +8 -0
- package/src/errors/EvaluationElementIdError.cjs +10 -0
- package/src/errors/EvaluationElementIdError.mjs +7 -0
- package/src/errors/EvaluationElementIdError.ts +8 -0
- package/src/errors/EvaluationJsonSchema$anchorError.cjs +11 -0
- package/src/errors/EvaluationJsonSchema$anchorError.mjs +6 -0
- package/src/errors/EvaluationJsonSchema$anchorError.ts +8 -0
- package/src/errors/EvaluationJsonSchemaUriError.cjs +11 -0
- package/src/errors/EvaluationJsonSchemaUriError.mjs +6 -0
- package/src/errors/EvaluationJsonSchemaUriError.ts +8 -0
- package/src/errors/InvalidJsonSchema$anchorError.cjs +15 -0
- package/src/errors/InvalidJsonSchema$anchorError.mjs +10 -0
- package/src/errors/InvalidJsonSchema$anchorError.ts +12 -0
- package/src/errors/JsonSchema$anchorError.cjs +10 -0
- package/src/errors/JsonSchema$anchorError.mjs +7 -0
- package/src/errors/JsonSchema$anchorError.ts +8 -0
- package/src/errors/JsonSchemaUriError.cjs +10 -0
- package/src/errors/JsonSchemaUriError.mjs +7 -0
- package/src/errors/JsonSchemaUriError.ts +8 -0
- package/src/errors/MaximumBundleDepthError.cjs +11 -0
- package/src/errors/MaximumBundleDepthError.mjs +6 -0
- package/src/errors/MaximumBundleDepthError.ts +8 -0
- package/src/errors/MaximumDereferenceDepthError.cjs +11 -0
- package/src/errors/MaximumDereferenceDepthError.mjs +6 -0
- package/src/errors/MaximumDereferenceDepthError.ts +8 -0
- package/src/errors/MaximumResolveDepthError.cjs +11 -0
- package/src/errors/MaximumResolveDepthError.mjs +6 -0
- package/src/errors/MaximumResolveDepthError.ts +8 -0
- package/src/errors/ParseError.cjs +10 -0
- package/src/errors/ParseError.mjs +7 -0
- package/src/errors/ParseError.ts +8 -0
- package/src/errors/ParserError.cjs +11 -0
- package/src/errors/ParserError.mjs +6 -0
- package/src/errors/ParserError.ts +8 -0
- package/src/errors/PluginError.cjs +18 -0
- package/src/errors/PluginError.mjs +15 -0
- package/src/errors/PluginError.ts +15 -0
- package/src/errors/ResolveError.cjs +10 -0
- package/src/errors/ResolveError.mjs +7 -0
- package/src/errors/ResolveError.ts +8 -0
- package/src/errors/ResolverError.cjs +11 -0
- package/src/errors/ResolverError.mjs +6 -0
- package/src/errors/ResolverError.ts +8 -0
- package/src/errors/UnmatchedBundleStrategyError.cjs +11 -0
- package/src/errors/UnmatchedBundleStrategyError.mjs +6 -0
- package/src/errors/UnmatchedBundleStrategyError.ts +8 -0
- package/src/errors/UnmatchedDereferenceStrategyError.cjs +11 -0
- package/src/errors/UnmatchedDereferenceStrategyError.mjs +6 -0
- package/src/errors/UnmatchedDereferenceStrategyError.ts +8 -0
- package/src/errors/UnmatchedParserError.cjs +11 -0
- package/src/errors/UnmatchedParserError.mjs +6 -0
- package/src/errors/UnmatchedParserError.ts +8 -0
- package/src/errors/UnmatchedResolveStrategyError.cjs +11 -0
- package/src/errors/UnmatchedResolveStrategyError.mjs +6 -0
- package/src/errors/UnmatchedResolveStrategyError.ts +8 -0
- package/src/errors/UnmatchedResolverError.cjs +11 -0
- package/src/errors/UnmatchedResolverError.mjs +6 -0
- package/src/errors/UnmatchedResolverError.ts +8 -0
- package/src/errors/UnresolvableReferenceError.cjs +11 -0
- package/src/errors/UnresolvableReferenceError.mjs +6 -0
- package/src/errors/UnresolvableReferenceError.ts +8 -0
- package/src/index.cjs +146 -0
- package/src/index.mjs +103 -0
- package/src/index.ts +135 -0
- package/src/options/index.cjs +194 -0
- package/src/options/index.mjs +191 -0
- package/src/options/index.ts +239 -0
- package/src/options/util.cjs +24 -0
- package/src/options/util.mjs +19 -0
- package/src/options/util.ts +22 -0
- package/src/parse/index.cjs +69 -0
- package/src/parse/index.mjs +63 -0
- package/src/parse/index.ts +67 -0
- package/src/parse/parsers/Parser.cjs +62 -0
- package/src/parse/parsers/Parser.mjs +58 -0
- package/src/parse/parsers/Parser.ts +80 -0
- package/src/parse/parsers/apidom-json/index.cjs +70 -0
- package/src/parse/parsers/apidom-json/index.mjs +64 -0
- package/src/parse/parsers/apidom-json/index.ts +78 -0
- package/src/parse/parsers/arazzo-json-1/index.cjs +62 -0
- package/src/parse/parsers/arazzo-json-1/index.mjs +56 -0
- package/src/parse/parsers/arazzo-json-1/index.ts +76 -0
- package/src/parse/parsers/arazzo-json-1/source-descriptions.cjs +221 -0
- package/src/parse/parsers/arazzo-json-1/source-descriptions.mjs +214 -0
- package/src/parse/parsers/arazzo-json-1/source-descriptions.ts +280 -0
- package/src/parse/parsers/arazzo-yaml-1/index.cjs +62 -0
- package/src/parse/parsers/arazzo-yaml-1/index.mjs +56 -0
- package/src/parse/parsers/arazzo-yaml-1/index.ts +77 -0
- package/src/parse/parsers/arazzo-yaml-1/source-descriptions.cjs +12 -0
- package/src/parse/parsers/arazzo-yaml-1/source-descriptions.mjs +7 -0
- package/src/parse/parsers/arazzo-yaml-1/source-descriptions.ts +16 -0
- package/src/parse/parsers/asyncapi-json-2/index.cjs +54 -0
- package/src/parse/parsers/asyncapi-json-2/index.mjs +48 -0
- package/src/parse/parsers/asyncapi-json-2/index.ts +58 -0
- package/src/parse/parsers/asyncapi-yaml-2/index.cjs +54 -0
- package/src/parse/parsers/asyncapi-yaml-2/index.mjs +48 -0
- package/src/parse/parsers/asyncapi-yaml-2/index.ts +58 -0
- package/src/parse/parsers/binary/index-browser.cjs +56 -0
- package/src/parse/parsers/binary/index-browser.mjs +50 -0
- package/src/parse/parsers/binary/index-browser.ts +60 -0
- package/src/parse/parsers/binary/index-node.cjs +51 -0
- package/src/parse/parsers/binary/index-node.mjs +45 -0
- package/src/parse/parsers/binary/index-node.ts +57 -0
- package/src/parse/parsers/json/index.cjs +53 -0
- package/src/parse/parsers/json/index.mjs +47 -0
- package/src/parse/parsers/json/index.ts +52 -0
- package/src/parse/parsers/openapi-json-2/index.cjs +54 -0
- package/src/parse/parsers/openapi-json-2/index.mjs +48 -0
- package/src/parse/parsers/openapi-json-2/index.ts +58 -0
- package/src/parse/parsers/openapi-json-3-0/index.cjs +54 -0
- package/src/parse/parsers/openapi-json-3-0/index.mjs +48 -0
- package/src/parse/parsers/openapi-json-3-0/index.ts +59 -0
- package/src/parse/parsers/openapi-json-3-1/index.cjs +54 -0
- package/src/parse/parsers/openapi-json-3-1/index.mjs +48 -0
- package/src/parse/parsers/openapi-json-3-1/index.ts +59 -0
- package/src/parse/parsers/openapi-yaml-2/index.cjs +54 -0
- package/src/parse/parsers/openapi-yaml-2/index.mjs +48 -0
- package/src/parse/parsers/openapi-yaml-2/index.ts +58 -0
- package/src/parse/parsers/openapi-yaml-3-0/index.cjs +54 -0
- package/src/parse/parsers/openapi-yaml-3-0/index.mjs +48 -0
- package/src/parse/parsers/openapi-yaml-3-0/index.ts +59 -0
- package/src/parse/parsers/openapi-yaml-3-1/index.cjs +54 -0
- package/src/parse/parsers/openapi-yaml-3-1/index.mjs +48 -0
- package/src/parse/parsers/openapi-yaml-3-1/index.ts +59 -0
- package/src/parse/parsers/yaml-1-2/index.cjs +56 -0
- package/src/parse/parsers/yaml-1-2/index.mjs +50 -0
- package/src/parse/parsers/yaml-1-2/index.ts +60 -0
- package/src/resolve/index.cjs +67 -0
- package/src/resolve/index.mjs +60 -0
- package/src/resolve/index.ts +75 -0
- package/src/resolve/resolvers/HTTPResolver.cjs +45 -0
- package/src/resolve/resolvers/HTTPResolver.mjs +37 -0
- package/src/resolve/resolvers/HTTPResolver.ts +58 -0
- package/src/resolve/resolvers/Resolver.cjs +20 -0
- package/src/resolve/resolvers/Resolver.mjs +16 -0
- package/src/resolve/resolvers/Resolver.ts +25 -0
- package/src/resolve/resolvers/file/index-browser.cjs +24 -0
- package/src/resolve/resolvers/file/index-browser.mjs +19 -0
- package/src/resolve/resolvers/file/index-browser.ts +24 -0
- package/src/resolve/resolvers/file/index-node.cjs +49 -0
- package/src/resolve/resolvers/file/index-node.mjs +42 -0
- package/src/resolve/resolvers/file/index-node.ts +55 -0
- package/src/resolve/resolvers/http-axios/cache/MemoryCache.cjs +41 -0
- package/src/resolve/resolvers/http-axios/cache/MemoryCache.mjs +37 -0
- package/src/resolve/resolvers/http-axios/cache/MemoryCache.ts +46 -0
- package/src/resolve/resolvers/http-axios/index.cjs +113 -0
- package/src/resolve/resolvers/http-axios/index.mjs +105 -0
- package/src/resolve/resolvers/http-axios/index.ts +130 -0
- package/src/resolve/strategies/ResolveStrategy.cjs +20 -0
- package/src/resolve/strategies/ResolveStrategy.mjs +16 -0
- package/src/resolve/strategies/ResolveStrategy.ts +26 -0
- package/src/resolve/strategies/apidom/index.cjs +49 -0
- package/src/resolve/strategies/apidom/index.mjs +43 -0
- package/src/resolve/strategies/apidom/index.ts +78 -0
- package/src/resolve/strategies/asyncapi-2/index.cjs +49 -0
- package/src/resolve/strategies/asyncapi-2/index.mjs +43 -0
- package/src/resolve/strategies/asyncapi-2/index.ts +78 -0
- package/src/resolve/strategies/openapi-2/index.cjs +49 -0
- package/src/resolve/strategies/openapi-2/index.mjs +43 -0
- package/src/resolve/strategies/openapi-2/index.ts +78 -0
- package/src/resolve/strategies/openapi-3-0/index.cjs +49 -0
- package/src/resolve/strategies/openapi-3-0/index.mjs +43 -0
- package/src/resolve/strategies/openapi-3-0/index.ts +78 -0
- package/src/resolve/strategies/openapi-3-1/index.cjs +49 -0
- package/src/resolve/strategies/openapi-3-1/index.mjs +43 -0
- package/src/resolve/strategies/openapi-3-1/index.ts +78 -0
- package/src/resolve/util.cjs +37 -0
- package/src/resolve/util.mjs +30 -0
- package/src/resolve/util.ts +39 -0
- package/src/util/plugins.cjs +39 -0
- package/src/util/plugins.mjs +34 -0
- package/src/util/plugins.ts +37 -0
- package/src/util/url.cjs +288 -0
- package/src/util/url.mjs +274 -0
- package/src/util/url.ts +285 -0
|
@@ -0,0 +1,266 @@
|
|
|
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.default = void 0;
|
|
7
|
+
var _ramda = require("ramda");
|
|
8
|
+
var _apidomError = require("@speclynx/apidom-error");
|
|
9
|
+
var _apidomDatamodel = require("@speclynx/apidom-datamodel");
|
|
10
|
+
var _apidomCore = require("@speclynx/apidom-core");
|
|
11
|
+
var _apidomTraverse = require("@speclynx/apidom-traverse");
|
|
12
|
+
var _apidomJsonPointer = require("@speclynx/apidom-json-pointer");
|
|
13
|
+
var _MaximumResolveDepthError = _interopRequireDefault(require("../../../errors/MaximumResolveDepthError.cjs"));
|
|
14
|
+
var _UnresolvableReferenceError = _interopRequireDefault(require("../../../errors/UnresolvableReferenceError.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
|
+
var _elementId = require("./selectors/element-id.cjs");
|
|
19
|
+
/**
|
|
20
|
+
* The following rules apply:
|
|
21
|
+
*
|
|
22
|
+
* 1. When referencing an element in the local document, the id of the element MAY be used
|
|
23
|
+
* 2. When referencing remote elements, an absolute URL or relative URL MAY be used
|
|
24
|
+
* 3. When a URL fragment exists in the URL given, it references the element with the matching id in the given document. The URL fragment MAY need to be URL decoded before making a match.
|
|
25
|
+
* 4. When a URL fragment does not exist, the URL references the root element
|
|
26
|
+
* 5. When path is used, it references the given property of the referenced element
|
|
27
|
+
* 6. When path is used in an element that includes the data of the pointer (such as with ref), the referenced path MAY need to be converted to a refract structure in order to be valid
|
|
28
|
+
*
|
|
29
|
+
* WARNING: this implementation only supports referencing elements in the local document. Points 2-4 are not supported.
|
|
30
|
+
* @public
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @public
|
|
35
|
+
*/
|
|
36
|
+
class ApiDOMDereferenceVisitor {
|
|
37
|
+
reference;
|
|
38
|
+
options;
|
|
39
|
+
constructor({
|
|
40
|
+
reference,
|
|
41
|
+
options
|
|
42
|
+
}) {
|
|
43
|
+
this.reference = reference;
|
|
44
|
+
this.options = options;
|
|
45
|
+
}
|
|
46
|
+
toBaseURI(uri) {
|
|
47
|
+
return url.resolve(this.reference.uri, url.sanitize(url.stripHash(uri)));
|
|
48
|
+
}
|
|
49
|
+
async toReference(uri) {
|
|
50
|
+
// detect maximum depth of resolution
|
|
51
|
+
if (this.reference.depth >= this.options.resolve.maxDepth) {
|
|
52
|
+
throw new _MaximumResolveDepthError.default(`Maximum resolution depth of ${this.options.resolve.maxDepth} has been exceeded by file "${this.reference.uri}"`, {
|
|
53
|
+
maxDepth: this.options.resolve.maxDepth,
|
|
54
|
+
uri: this.reference.uri
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const baseURI = this.toBaseURI(uri);
|
|
58
|
+
const {
|
|
59
|
+
refSet
|
|
60
|
+
} = this.reference;
|
|
61
|
+
|
|
62
|
+
// we've already processed this Reference in past
|
|
63
|
+
if (refSet.has(baseURI)) {
|
|
64
|
+
return refSet.find((0, _ramda.propEq)(baseURI, 'uri'));
|
|
65
|
+
}
|
|
66
|
+
const parseResult = await (0, _index.default)(url.unsanitize(baseURI), {
|
|
67
|
+
...this.options,
|
|
68
|
+
parse: {
|
|
69
|
+
...this.options.parse,
|
|
70
|
+
mediaType: 'text/plain'
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// register new mutable reference with a refSet
|
|
75
|
+
const mutableReference = new _Reference.default({
|
|
76
|
+
uri: baseURI,
|
|
77
|
+
value: (0, _apidomDatamodel.cloneDeep)(parseResult),
|
|
78
|
+
depth: this.reference.depth + 1
|
|
79
|
+
});
|
|
80
|
+
refSet.add(mutableReference);
|
|
81
|
+
if (this.options.dereference.immutable) {
|
|
82
|
+
// register new immutable reference with a refSet
|
|
83
|
+
const immutableReference = new _Reference.default({
|
|
84
|
+
uri: `immutable://${baseURI}`,
|
|
85
|
+
value: parseResult,
|
|
86
|
+
depth: this.reference.depth + 1
|
|
87
|
+
});
|
|
88
|
+
refSet.add(immutableReference);
|
|
89
|
+
}
|
|
90
|
+
return mutableReference;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Handles an error according to the continueOnError option.
|
|
95
|
+
*
|
|
96
|
+
* For new errors: wraps in UnresolvableReferenceError with structured context.
|
|
97
|
+
* For errors already wrapped by a nested visitor: prepends the current hop to the trace.
|
|
98
|
+
*
|
|
99
|
+
* Inner/intermediate visitors always throw to let the trace accumulate.
|
|
100
|
+
* Only the entry document visitor respects continueOnError (callback/swallow/throw).
|
|
101
|
+
*/
|
|
102
|
+
handleError(message, error, referencingElement, refFieldName, refFieldValue, visitorPath) {
|
|
103
|
+
const {
|
|
104
|
+
continueOnError
|
|
105
|
+
} = this.options.dereference;
|
|
106
|
+
const isEntryDocument = url.stripHash(this.reference.refSet?.rootRef?.uri ?? '') === this.reference.uri;
|
|
107
|
+
const uri = this.reference.uri;
|
|
108
|
+
const type = referencingElement.element;
|
|
109
|
+
// find element location by identity in the document tree.
|
|
110
|
+
// guarded: this.reference.value may not be a ParseResultElement or may lack a result.
|
|
111
|
+
// falls back to visitorPath which may produce an incomplete path when
|
|
112
|
+
// dereferenceApiDOM is called with a fragment (cloneShallow creates a new root identity).
|
|
113
|
+
let location;
|
|
114
|
+
const root = this.reference.value.result;
|
|
115
|
+
if ((0, _apidomDatamodel.isElement)(root)) {
|
|
116
|
+
(0, _apidomTraverse.traverse)(root, {
|
|
117
|
+
enter(p) {
|
|
118
|
+
if (p.node === referencingElement) {
|
|
119
|
+
location = p.formatPath();
|
|
120
|
+
p.stop();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
location ??= visitorPath.formatPath();
|
|
126
|
+
const codeFrame = (0, _apidomCore.toYAML)(referencingElement);
|
|
127
|
+
const hop = {
|
|
128
|
+
uri,
|
|
129
|
+
type,
|
|
130
|
+
refFieldName,
|
|
131
|
+
refFieldValue,
|
|
132
|
+
location,
|
|
133
|
+
codeFrame
|
|
134
|
+
};
|
|
135
|
+
let unresolvedError;
|
|
136
|
+
if (error instanceof _UnresolvableReferenceError.default) {
|
|
137
|
+
const refBaseURI = this.toBaseURI(refFieldValue);
|
|
138
|
+
const fragment = _apidomJsonPointer.URIFragmentIdentifier.fromURIReference(refFieldValue);
|
|
139
|
+
if (fragment) {
|
|
140
|
+
if (refBaseURI === error.uri && error.location) {
|
|
141
|
+
error.location = fragment + error.location;
|
|
142
|
+
}
|
|
143
|
+
for (const h of error.trace) {
|
|
144
|
+
if (h.uri === refBaseURI && h.location) h.location = fragment + h.location;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// @ts-ignore
|
|
148
|
+
error.trace = [hop, ...error.trace];
|
|
149
|
+
unresolvedError = error;
|
|
150
|
+
} else {
|
|
151
|
+
unresolvedError = new _UnresolvableReferenceError.default(message, {
|
|
152
|
+
cause: error,
|
|
153
|
+
type,
|
|
154
|
+
uri,
|
|
155
|
+
location,
|
|
156
|
+
codeFrame,
|
|
157
|
+
refFieldName,
|
|
158
|
+
refFieldValue,
|
|
159
|
+
trace: []
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
if (!isEntryDocument || continueOnError === false) throw unresolvedError;
|
|
163
|
+
if (typeof continueOnError === 'function') continueOnError(unresolvedError);
|
|
164
|
+
}
|
|
165
|
+
async RefElement(path) {
|
|
166
|
+
const refElement = path.node;
|
|
167
|
+
const {
|
|
168
|
+
parent,
|
|
169
|
+
key
|
|
170
|
+
} = path;
|
|
171
|
+
const ancestors = path.getAncestorNodes();
|
|
172
|
+
const refURI = (0, _apidomCore.toValue)(refElement);
|
|
173
|
+
const refNormalizedURI = refURI.includes('#') ? refURI : `#${refURI}`;
|
|
174
|
+
const retrievalURI = this.toBaseURI(refNormalizedURI);
|
|
175
|
+
const isInternalReference = url.stripHash(this.reference.uri) === retrievalURI;
|
|
176
|
+
const isExternalReference = !isInternalReference;
|
|
177
|
+
|
|
178
|
+
// ignore resolving internal RefElements
|
|
179
|
+
if (!this.options.resolve.internal && isInternalReference) {
|
|
180
|
+
// skip traversing this ref element
|
|
181
|
+
path.skip();
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
// ignore resolving external RefElements
|
|
185
|
+
if (!this.options.resolve.external && isExternalReference) {
|
|
186
|
+
// skip traversing this ref element
|
|
187
|
+
path.skip();
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
try {
|
|
191
|
+
const reference = await this.toReference(refNormalizedURI);
|
|
192
|
+
const refBaseURI = url.resolve(retrievalURI, refNormalizedURI);
|
|
193
|
+
const elementID = _apidomJsonPointer.URIFragmentIdentifier.fromURIReference(refBaseURI);
|
|
194
|
+
let referencedElement = (0, _elementId.evaluate)(elementID, reference.value.result);
|
|
195
|
+
if (!(0, _apidomDatamodel.isElement)(referencedElement)) {
|
|
196
|
+
throw new _apidomError.ApiDOMStructuredError(`Referenced element with id="${elementID}" was not found`, {
|
|
197
|
+
elementID
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
if (refElement === referencedElement) {
|
|
201
|
+
throw new _apidomError.ApiDOMStructuredError(`RefElement with id="${elementID}" cannot reference itself`, {
|
|
202
|
+
elementID
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
if ((0, _apidomDatamodel.isRefElement)(referencedElement)) {
|
|
206
|
+
throw new _apidomError.ApiDOMStructuredError(`RefElement with id="${elementID}" cannot reference another RefElement`, {
|
|
207
|
+
elementID
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
if (isExternalReference) {
|
|
211
|
+
// dive deep into the fragment
|
|
212
|
+
const visitor = new ApiDOMDereferenceVisitor({
|
|
213
|
+
reference,
|
|
214
|
+
options: this.options
|
|
215
|
+
});
|
|
216
|
+
referencedElement = await (0, _apidomTraverse.traverseAsync)(referencedElement, visitor, {
|
|
217
|
+
mutable: true
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* When path is used, it references the given property of the referenced element.
|
|
223
|
+
* Valid paths are: 'element', 'content', 'meta', 'attributes'.
|
|
224
|
+
*/
|
|
225
|
+
const referencedElementPath = (0, _apidomCore.toValue)(refElement.path);
|
|
226
|
+
if (referencedElementPath !== 'element' && (0, _apidomDatamodel.isElement)(referencedElement)) {
|
|
227
|
+
referencedElement = (0, _apidomDatamodel.refract)(referencedElement[referencedElementPath]);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Transclusion of a Ref Element SHALL be defined in the if/else block below.
|
|
232
|
+
*/
|
|
233
|
+
// ancestors[0] is the grandparent (nearest ancestor from getAncestorNodes())
|
|
234
|
+
const grandparent = ancestors[0];
|
|
235
|
+
if ((0, _apidomDatamodel.isObjectElement)(referencedElement) && (0, _apidomDatamodel.isObjectElement)(grandparent) && Array.isArray(parent) && typeof key === 'number') {
|
|
236
|
+
/**
|
|
237
|
+
* If the Ref Element is held by an Object Element and references an Object Element,
|
|
238
|
+
* its content entries SHALL be inserted in place of the Ref Element.
|
|
239
|
+
*/
|
|
240
|
+
parent.splice(key, 1, ...referencedElement.content);
|
|
241
|
+
} else if ((0, _apidomDatamodel.isArrayElement)(referencedElement) && Array.isArray(parent) && typeof key === 'number') {
|
|
242
|
+
/**
|
|
243
|
+
* If the Ref Element is held by an Array Element and references an Array Element,
|
|
244
|
+
* its content entries SHALL be inserted in place of the Ref Element.
|
|
245
|
+
*/
|
|
246
|
+
parent.splice(key, 1, ...referencedElement.content);
|
|
247
|
+
} else if ((0, _apidomDatamodel.isMemberElement)(parent)) {
|
|
248
|
+
/**
|
|
249
|
+
* The Ref Element is substituted by the Element it references.
|
|
250
|
+
*/
|
|
251
|
+
parent.value = referencedElement;
|
|
252
|
+
} else if (Array.isArray(parent)) {
|
|
253
|
+
/**
|
|
254
|
+
* The Ref Element is substituted by the Element it references.
|
|
255
|
+
*/
|
|
256
|
+
parent[key] = referencedElement;
|
|
257
|
+
}
|
|
258
|
+
if (!parent) {
|
|
259
|
+
path.replaceWith(referencedElement);
|
|
260
|
+
}
|
|
261
|
+
} catch (error) {
|
|
262
|
+
this.handleError(`Error while dereferencing Ref Element. Cannot resolve ref "${refURI}": ${error.message}`, error, refElement, null, refURI, path);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
var _default = exports.default = ApiDOMDereferenceVisitor;
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { propEq } from 'ramda';
|
|
2
|
+
import { ApiDOMStructuredError } from '@speclynx/apidom-error';
|
|
3
|
+
import { isElement, isMemberElement, isArrayElement, isObjectElement, isRefElement, refract, cloneDeep } from '@speclynx/apidom-datamodel';
|
|
4
|
+
import { toValue, toYAML } from '@speclynx/apidom-core';
|
|
5
|
+
import { traverse, traverseAsync } from '@speclynx/apidom-traverse';
|
|
6
|
+
import { URIFragmentIdentifier } from '@speclynx/apidom-json-pointer';
|
|
7
|
+
import MaximumResolveDepthError from "../../../errors/MaximumResolveDepthError.mjs";
|
|
8
|
+
import UnresolvableReferenceError from "../../../errors/UnresolvableReferenceError.mjs";
|
|
9
|
+
import * as url from "../../../util/url.mjs";
|
|
10
|
+
import parse from "../../../parse/index.mjs";
|
|
11
|
+
import Reference from "../../../Reference.mjs";
|
|
12
|
+
import { evaluate } from "./selectors/element-id.mjs";
|
|
13
|
+
/**
|
|
14
|
+
* The following rules apply:
|
|
15
|
+
*
|
|
16
|
+
* 1. When referencing an element in the local document, the id of the element MAY be used
|
|
17
|
+
* 2. When referencing remote elements, an absolute URL or relative URL MAY be used
|
|
18
|
+
* 3. When a URL fragment exists in the URL given, it references the element with the matching id in the given document. The URL fragment MAY need to be URL decoded before making a match.
|
|
19
|
+
* 4. When a URL fragment does not exist, the URL references the root element
|
|
20
|
+
* 5. When path is used, it references the given property of the referenced element
|
|
21
|
+
* 6. When path is used in an element that includes the data of the pointer (such as with ref), the referenced path MAY need to be converted to a refract structure in order to be valid
|
|
22
|
+
*
|
|
23
|
+
* WARNING: this implementation only supports referencing elements in the local document. Points 2-4 are not supported.
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* @public
|
|
28
|
+
*/
|
|
29
|
+
class ApiDOMDereferenceVisitor {
|
|
30
|
+
reference;
|
|
31
|
+
options;
|
|
32
|
+
constructor({
|
|
33
|
+
reference,
|
|
34
|
+
options
|
|
35
|
+
}) {
|
|
36
|
+
this.reference = reference;
|
|
37
|
+
this.options = options;
|
|
38
|
+
}
|
|
39
|
+
toBaseURI(uri) {
|
|
40
|
+
return url.resolve(this.reference.uri, url.sanitize(url.stripHash(uri)));
|
|
41
|
+
}
|
|
42
|
+
async toReference(uri) {
|
|
43
|
+
// detect maximum depth of resolution
|
|
44
|
+
if (this.reference.depth >= this.options.resolve.maxDepth) {
|
|
45
|
+
throw new MaximumResolveDepthError(`Maximum resolution depth of ${this.options.resolve.maxDepth} has been exceeded by file "${this.reference.uri}"`, {
|
|
46
|
+
maxDepth: this.options.resolve.maxDepth,
|
|
47
|
+
uri: this.reference.uri
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
const baseURI = this.toBaseURI(uri);
|
|
51
|
+
const {
|
|
52
|
+
refSet
|
|
53
|
+
} = this.reference;
|
|
54
|
+
|
|
55
|
+
// we've already processed this Reference in past
|
|
56
|
+
if (refSet.has(baseURI)) {
|
|
57
|
+
return refSet.find(propEq(baseURI, 'uri'));
|
|
58
|
+
}
|
|
59
|
+
const parseResult = await parse(url.unsanitize(baseURI), {
|
|
60
|
+
...this.options,
|
|
61
|
+
parse: {
|
|
62
|
+
...this.options.parse,
|
|
63
|
+
mediaType: 'text/plain'
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// register new mutable reference with a refSet
|
|
68
|
+
const mutableReference = new Reference({
|
|
69
|
+
uri: baseURI,
|
|
70
|
+
value: cloneDeep(parseResult),
|
|
71
|
+
depth: this.reference.depth + 1
|
|
72
|
+
});
|
|
73
|
+
refSet.add(mutableReference);
|
|
74
|
+
if (this.options.dereference.immutable) {
|
|
75
|
+
// register new immutable reference with a refSet
|
|
76
|
+
const immutableReference = new Reference({
|
|
77
|
+
uri: `immutable://${baseURI}`,
|
|
78
|
+
value: parseResult,
|
|
79
|
+
depth: this.reference.depth + 1
|
|
80
|
+
});
|
|
81
|
+
refSet.add(immutableReference);
|
|
82
|
+
}
|
|
83
|
+
return mutableReference;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Handles an error according to the continueOnError option.
|
|
88
|
+
*
|
|
89
|
+
* For new errors: wraps in UnresolvableReferenceError with structured context.
|
|
90
|
+
* For errors already wrapped by a nested visitor: prepends the current hop to the trace.
|
|
91
|
+
*
|
|
92
|
+
* Inner/intermediate visitors always throw to let the trace accumulate.
|
|
93
|
+
* Only the entry document visitor respects continueOnError (callback/swallow/throw).
|
|
94
|
+
*/
|
|
95
|
+
handleError(message, error, referencingElement, refFieldName, refFieldValue, visitorPath) {
|
|
96
|
+
const {
|
|
97
|
+
continueOnError
|
|
98
|
+
} = this.options.dereference;
|
|
99
|
+
const isEntryDocument = url.stripHash(this.reference.refSet?.rootRef?.uri ?? '') === this.reference.uri;
|
|
100
|
+
const uri = this.reference.uri;
|
|
101
|
+
const type = referencingElement.element;
|
|
102
|
+
// find element location by identity in the document tree.
|
|
103
|
+
// guarded: this.reference.value may not be a ParseResultElement or may lack a result.
|
|
104
|
+
// falls back to visitorPath which may produce an incomplete path when
|
|
105
|
+
// dereferenceApiDOM is called with a fragment (cloneShallow creates a new root identity).
|
|
106
|
+
let location;
|
|
107
|
+
const root = this.reference.value.result;
|
|
108
|
+
if (isElement(root)) {
|
|
109
|
+
traverse(root, {
|
|
110
|
+
enter(p) {
|
|
111
|
+
if (p.node === referencingElement) {
|
|
112
|
+
location = p.formatPath();
|
|
113
|
+
p.stop();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
location ??= visitorPath.formatPath();
|
|
119
|
+
const codeFrame = toYAML(referencingElement);
|
|
120
|
+
const hop = {
|
|
121
|
+
uri,
|
|
122
|
+
type,
|
|
123
|
+
refFieldName,
|
|
124
|
+
refFieldValue,
|
|
125
|
+
location,
|
|
126
|
+
codeFrame
|
|
127
|
+
};
|
|
128
|
+
let unresolvedError;
|
|
129
|
+
if (error instanceof UnresolvableReferenceError) {
|
|
130
|
+
const refBaseURI = this.toBaseURI(refFieldValue);
|
|
131
|
+
const fragment = URIFragmentIdentifier.fromURIReference(refFieldValue);
|
|
132
|
+
if (fragment) {
|
|
133
|
+
if (refBaseURI === error.uri && error.location) {
|
|
134
|
+
error.location = fragment + error.location;
|
|
135
|
+
}
|
|
136
|
+
for (const h of error.trace) {
|
|
137
|
+
if (h.uri === refBaseURI && h.location) h.location = fragment + h.location;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// @ts-ignore
|
|
141
|
+
error.trace = [hop, ...error.trace];
|
|
142
|
+
unresolvedError = error;
|
|
143
|
+
} else {
|
|
144
|
+
unresolvedError = new UnresolvableReferenceError(message, {
|
|
145
|
+
cause: error,
|
|
146
|
+
type,
|
|
147
|
+
uri,
|
|
148
|
+
location,
|
|
149
|
+
codeFrame,
|
|
150
|
+
refFieldName,
|
|
151
|
+
refFieldValue,
|
|
152
|
+
trace: []
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
if (!isEntryDocument || continueOnError === false) throw unresolvedError;
|
|
156
|
+
if (typeof continueOnError === 'function') continueOnError(unresolvedError);
|
|
157
|
+
}
|
|
158
|
+
async RefElement(path) {
|
|
159
|
+
const refElement = path.node;
|
|
160
|
+
const {
|
|
161
|
+
parent,
|
|
162
|
+
key
|
|
163
|
+
} = path;
|
|
164
|
+
const ancestors = path.getAncestorNodes();
|
|
165
|
+
const refURI = toValue(refElement);
|
|
166
|
+
const refNormalizedURI = refURI.includes('#') ? refURI : `#${refURI}`;
|
|
167
|
+
const retrievalURI = this.toBaseURI(refNormalizedURI);
|
|
168
|
+
const isInternalReference = url.stripHash(this.reference.uri) === retrievalURI;
|
|
169
|
+
const isExternalReference = !isInternalReference;
|
|
170
|
+
|
|
171
|
+
// ignore resolving internal RefElements
|
|
172
|
+
if (!this.options.resolve.internal && isInternalReference) {
|
|
173
|
+
// skip traversing this ref element
|
|
174
|
+
path.skip();
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
// ignore resolving external RefElements
|
|
178
|
+
if (!this.options.resolve.external && isExternalReference) {
|
|
179
|
+
// skip traversing this ref element
|
|
180
|
+
path.skip();
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
const reference = await this.toReference(refNormalizedURI);
|
|
185
|
+
const refBaseURI = url.resolve(retrievalURI, refNormalizedURI);
|
|
186
|
+
const elementID = URIFragmentIdentifier.fromURIReference(refBaseURI);
|
|
187
|
+
let referencedElement = evaluate(elementID, reference.value.result);
|
|
188
|
+
if (!isElement(referencedElement)) {
|
|
189
|
+
throw new ApiDOMStructuredError(`Referenced element with id="${elementID}" was not found`, {
|
|
190
|
+
elementID
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
if (refElement === referencedElement) {
|
|
194
|
+
throw new ApiDOMStructuredError(`RefElement with id="${elementID}" cannot reference itself`, {
|
|
195
|
+
elementID
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
if (isRefElement(referencedElement)) {
|
|
199
|
+
throw new ApiDOMStructuredError(`RefElement with id="${elementID}" cannot reference another RefElement`, {
|
|
200
|
+
elementID
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
if (isExternalReference) {
|
|
204
|
+
// dive deep into the fragment
|
|
205
|
+
const visitor = new ApiDOMDereferenceVisitor({
|
|
206
|
+
reference,
|
|
207
|
+
options: this.options
|
|
208
|
+
});
|
|
209
|
+
referencedElement = await traverseAsync(referencedElement, visitor, {
|
|
210
|
+
mutable: true
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* When path is used, it references the given property of the referenced element.
|
|
216
|
+
* Valid paths are: 'element', 'content', 'meta', 'attributes'.
|
|
217
|
+
*/
|
|
218
|
+
const referencedElementPath = toValue(refElement.path);
|
|
219
|
+
if (referencedElementPath !== 'element' && isElement(referencedElement)) {
|
|
220
|
+
referencedElement = refract(referencedElement[referencedElementPath]);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Transclusion of a Ref Element SHALL be defined in the if/else block below.
|
|
225
|
+
*/
|
|
226
|
+
// ancestors[0] is the grandparent (nearest ancestor from getAncestorNodes())
|
|
227
|
+
const grandparent = ancestors[0];
|
|
228
|
+
if (isObjectElement(referencedElement) && isObjectElement(grandparent) && Array.isArray(parent) && typeof key === 'number') {
|
|
229
|
+
/**
|
|
230
|
+
* If the Ref Element is held by an Object Element and references an Object Element,
|
|
231
|
+
* its content entries SHALL be inserted in place of the Ref Element.
|
|
232
|
+
*/
|
|
233
|
+
parent.splice(key, 1, ...referencedElement.content);
|
|
234
|
+
} else if (isArrayElement(referencedElement) && Array.isArray(parent) && typeof key === 'number') {
|
|
235
|
+
/**
|
|
236
|
+
* If the Ref Element is held by an Array Element and references an Array Element,
|
|
237
|
+
* its content entries SHALL be inserted in place of the Ref Element.
|
|
238
|
+
*/
|
|
239
|
+
parent.splice(key, 1, ...referencedElement.content);
|
|
240
|
+
} else if (isMemberElement(parent)) {
|
|
241
|
+
/**
|
|
242
|
+
* The Ref Element is substituted by the Element it references.
|
|
243
|
+
*/
|
|
244
|
+
parent.value = referencedElement;
|
|
245
|
+
} else if (Array.isArray(parent)) {
|
|
246
|
+
/**
|
|
247
|
+
* The Ref Element is substituted by the Element it references.
|
|
248
|
+
*/
|
|
249
|
+
parent[key] = referencedElement;
|
|
250
|
+
}
|
|
251
|
+
if (!parent) {
|
|
252
|
+
path.replaceWith(referencedElement);
|
|
253
|
+
}
|
|
254
|
+
} catch (error) {
|
|
255
|
+
this.handleError(`Error while dereferencing Ref Element. Cannot resolve ref "${refURI}": ${error.message}`, error, refElement, null, refURI, path);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
export default ApiDOMDereferenceVisitor;
|