@speclynx/apidom-reference 4.2.0 → 4.3.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.
- package/CHANGELOG.md +11 -0
- package/README.md +327 -0
- package/dist/apidom-reference.browser.js +23493 -21596
- package/dist/apidom-reference.browser.min.js +1 -1
- package/package.json +56 -28
- package/src/configuration/saturated.cjs +47 -36
- package/src/configuration/saturated.mjs +13 -2
- package/src/dereference/strategies/arazzo-1/index.cjs +7 -2
- package/src/dereference/strategies/arazzo-1/index.mjs +8 -3
- package/src/dereference/strategies/overlay-1/extends.cjs +93 -0
- package/src/dereference/strategies/overlay-1/extends.mjs +87 -0
- package/src/dereference/strategies/overlay-1/index.cjs +93 -0
- package/src/dereference/strategies/overlay-1/index.mjs +87 -0
- package/src/parse/parsers/overlay-json-1/extends.cjs +66 -0
- package/src/parse/parsers/overlay-json-1/extends.mjs +60 -0
- package/src/parse/parsers/overlay-json-1/index.cjs +61 -0
- package/src/parse/parsers/overlay-json-1/index.mjs +55 -0
- package/src/parse/parsers/overlay-yaml-1/extends.cjs +6 -0
- package/src/parse/parsers/overlay-yaml-1/extends.mjs +2 -0
- package/src/parse/parsers/overlay-yaml-1/index.cjs +61 -0
- package/src/parse/parsers/overlay-yaml-1/index.mjs +55 -0
- package/src/resolve/strategies/arazzo-1/index.cjs +49 -0
- package/src/resolve/strategies/arazzo-1/index.mjs +43 -0
- package/src/resolve/strategies/overlay-1/index.cjs +49 -0
- package/src/resolve/strategies/overlay-1/index.mjs +43 -0
- package/types/dereference/strategies/overlay-1/extends.d.ts +21 -0
- package/types/dereference/strategies/overlay-1/index.d.ts +28 -0
- package/types/parse/parsers/overlay-json-1/extends.d.ts +16 -0
- package/types/parse/parsers/overlay-json-1/index.d.ts +22 -0
- package/types/parse/parsers/overlay-yaml-1/extends.d.ts +1 -0
- package/types/parse/parsers/overlay-yaml-1/index.d.ts +22 -0
- package/types/resolve/strategies/arazzo-1/index.d.ts +27 -0
- package/types/resolve/strategies/overlay-1/index.d.ts +27 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { cloneDeep } from '@speclynx/apidom-datamodel';
|
|
2
|
+
import { isOverlay1Element, mediaTypes } from '@speclynx/apidom-ns-overlay-1';
|
|
3
|
+
import DereferenceStrategy from "../DereferenceStrategy.mjs";
|
|
4
|
+
import Reference from "../../../Reference.mjs";
|
|
5
|
+
import ReferenceSet from "../../../ReferenceSet.mjs";
|
|
6
|
+
import { dereferenceExtends } from "./extends.mjs";
|
|
7
|
+
/**
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* @public
|
|
12
|
+
*/
|
|
13
|
+
class Overlay1DereferenceStrategy extends DereferenceStrategy {
|
|
14
|
+
constructor(options) {
|
|
15
|
+
super({
|
|
16
|
+
...(options ?? {}),
|
|
17
|
+
name: 'overlay-1'
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
canDereference(file) {
|
|
21
|
+
// assert by media type
|
|
22
|
+
if (file.mediaType !== 'text/plain') {
|
|
23
|
+
return mediaTypes.includes(file.mediaType);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// assert by inspecting ApiDOM
|
|
27
|
+
return isOverlay1Element(file.parseResult?.result);
|
|
28
|
+
}
|
|
29
|
+
async dereference(file, options) {
|
|
30
|
+
const immutableRefSet = options.dereference.refSet ?? new ReferenceSet();
|
|
31
|
+
const mutableRefSet = new ReferenceSet();
|
|
32
|
+
let reference;
|
|
33
|
+
if (!immutableRefSet.has(file.uri)) {
|
|
34
|
+
reference = new Reference({
|
|
35
|
+
uri: file.uri,
|
|
36
|
+
value: file.parseResult
|
|
37
|
+
});
|
|
38
|
+
immutableRefSet.add(reference);
|
|
39
|
+
} else {
|
|
40
|
+
// pre-computed refSet was provided as configuration option
|
|
41
|
+
reference = immutableRefSet.find(ref => ref.uri === file.uri);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Clone refSet due the dereferencing process being mutable.
|
|
46
|
+
* We don't want to mutate the original refSet and the references.
|
|
47
|
+
*/
|
|
48
|
+
if (options.dereference.immutable) {
|
|
49
|
+
immutableRefSet.refs.map(ref => new Reference({
|
|
50
|
+
...ref,
|
|
51
|
+
value: cloneDeep(ref.value)
|
|
52
|
+
})).forEach(ref => mutableRefSet.add(ref));
|
|
53
|
+
reference = mutableRefSet.find(ref => ref.uri === file.uri);
|
|
54
|
+
}
|
|
55
|
+
const dereferencedElement = reference.value;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Dereference extends target if option is enabled.
|
|
59
|
+
*/
|
|
60
|
+
const shouldDereferenceExtends = options?.dereference?.strategyOpts?.[this.name]?.extends ?? options?.dereference?.strategyOpts?.extends;
|
|
61
|
+
if (shouldDereferenceExtends) {
|
|
62
|
+
await dereferenceExtends(dereferencedElement, reference.uri, options);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* If immutable option is set, replay refs from the refSet.
|
|
67
|
+
*/
|
|
68
|
+
if (options.dereference.immutable) {
|
|
69
|
+
mutableRefSet.refs.filter(ref => ref.uri.startsWith('immutable://')).map(ref => new Reference({
|
|
70
|
+
...ref,
|
|
71
|
+
uri: ref.uri.replace(/^immutable:\/\//, '')
|
|
72
|
+
})).forEach(ref => immutableRefSet.add(ref));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Release all memory if this refSet was not provided as a configuration option.
|
|
77
|
+
* If provided as configuration option, then provider is responsible for cleanup.
|
|
78
|
+
*/
|
|
79
|
+
if (options.dereference.refSet === null) {
|
|
80
|
+
immutableRefSet.clean();
|
|
81
|
+
}
|
|
82
|
+
mutableRefSet.clean();
|
|
83
|
+
return dereferencedElement;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export { dereferenceExtends } from "./extends.mjs";
|
|
87
|
+
export default Overlay1DereferenceStrategy;
|
|
@@ -0,0 +1,66 @@
|
|
|
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.parseExtends = parseExtends;
|
|
7
|
+
var _apidomDatamodel = require("@speclynx/apidom-datamodel");
|
|
8
|
+
var _apidomNsOverlay = require("@speclynx/apidom-ns-overlay-1");
|
|
9
|
+
var _apidomCore = require("@speclynx/apidom-core");
|
|
10
|
+
var _File = _interopRequireDefault(require("../../../File.cjs"));
|
|
11
|
+
var url = _interopRequireWildcard(require("../../../util/url.cjs"));
|
|
12
|
+
var _util = require("../../../options/util.cjs");
|
|
13
|
+
var _index = _interopRequireDefault(require("../../index.cjs"));
|
|
14
|
+
/**
|
|
15
|
+
* Parses the `extends` target document from an Overlay document's ParseResult.
|
|
16
|
+
*
|
|
17
|
+
* The parsed extends document is pushed directly into the overlay's ParseResult
|
|
18
|
+
* and always attached to the extends element's meta as 'parseResult',
|
|
19
|
+
* regardless of success or failure.
|
|
20
|
+
*
|
|
21
|
+
* @param parseResult - ParseResult containing an Overlay specification
|
|
22
|
+
* @param parseResultRetrievalURI - URI from which the parseResult was retrieved
|
|
23
|
+
* @param options - Full ReferenceOptions
|
|
24
|
+
*
|
|
25
|
+
* @public
|
|
26
|
+
*/
|
|
27
|
+
async function parseExtends(parseResult, parseResultRetrievalURI, options) {
|
|
28
|
+
const {
|
|
29
|
+
api
|
|
30
|
+
} = parseResult;
|
|
31
|
+
const file = new _File.default({
|
|
32
|
+
uri: url.sanitize(url.stripHash(parseResultRetrievalURI))
|
|
33
|
+
});
|
|
34
|
+
if (!(0, _apidomNsOverlay.isOverlay1Element)(api)) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const extendsElement = api.get('extends');
|
|
38
|
+
if (!(0, _apidomDatamodel.isStringElement)(extendsElement)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const extendsURI = (0, _apidomCore.toValue)(extendsElement);
|
|
42
|
+
const retrievalURI = url.sanitize(url.stripHash(url.resolve(file.uri, extendsURI)));
|
|
43
|
+
const extendsParseResult = new _apidomDatamodel.ParseResultElement();
|
|
44
|
+
extendsParseResult.classes.push('extends');
|
|
45
|
+
extendsParseResult.setMetaProperty('retrievalURI', retrievalURI);
|
|
46
|
+
try {
|
|
47
|
+
const targetParseResult = await (0, _index.default)(retrievalURI, (0, _util.merge)(options, {
|
|
48
|
+
parse: {
|
|
49
|
+
mediaType: 'text/plain' // force auto-detection
|
|
50
|
+
}
|
|
51
|
+
}));
|
|
52
|
+
// merge parsed result into our wrapper
|
|
53
|
+
for (const item of targetParseResult) {
|
|
54
|
+
extendsParseResult.push(item);
|
|
55
|
+
}
|
|
56
|
+
} catch (error) {
|
|
57
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
58
|
+
const annotation = new _apidomDatamodel.AnnotationElement(`Error parsing extends target "${retrievalURI}": ${message}`);
|
|
59
|
+
annotation.classes.push('error');
|
|
60
|
+
extendsParseResult.push(annotation);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// always attach result to extends element meta (even on failure - contains annotations)
|
|
64
|
+
extendsElement.meta.set('parseResult', extendsParseResult);
|
|
65
|
+
parseResult.push(extendsParseResult);
|
|
66
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ParseResultElement, AnnotationElement, isStringElement } from '@speclynx/apidom-datamodel';
|
|
2
|
+
import { isOverlay1Element } from '@speclynx/apidom-ns-overlay-1';
|
|
3
|
+
import { toValue } from '@speclynx/apidom-core';
|
|
4
|
+
import File from "../../../File.mjs";
|
|
5
|
+
import * as url from "../../../util/url.mjs";
|
|
6
|
+
import { merge as mergeOptions } from "../../../options/util.mjs";
|
|
7
|
+
import parse from "../../index.mjs";
|
|
8
|
+
/**
|
|
9
|
+
* Parses the `extends` target document from an Overlay document's ParseResult.
|
|
10
|
+
*
|
|
11
|
+
* The parsed extends document is pushed directly into the overlay's ParseResult
|
|
12
|
+
* and always attached to the extends element's meta as 'parseResult',
|
|
13
|
+
* regardless of success or failure.
|
|
14
|
+
*
|
|
15
|
+
* @param parseResult - ParseResult containing an Overlay specification
|
|
16
|
+
* @param parseResultRetrievalURI - URI from which the parseResult was retrieved
|
|
17
|
+
* @param options - Full ReferenceOptions
|
|
18
|
+
*
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
export async function parseExtends(parseResult, parseResultRetrievalURI, options) {
|
|
22
|
+
const {
|
|
23
|
+
api
|
|
24
|
+
} = parseResult;
|
|
25
|
+
const file = new File({
|
|
26
|
+
uri: url.sanitize(url.stripHash(parseResultRetrievalURI))
|
|
27
|
+
});
|
|
28
|
+
if (!isOverlay1Element(api)) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const extendsElement = api.get('extends');
|
|
32
|
+
if (!isStringElement(extendsElement)) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const extendsURI = toValue(extendsElement);
|
|
36
|
+
const retrievalURI = url.sanitize(url.stripHash(url.resolve(file.uri, extendsURI)));
|
|
37
|
+
const extendsParseResult = new ParseResultElement();
|
|
38
|
+
extendsParseResult.classes.push('extends');
|
|
39
|
+
extendsParseResult.setMetaProperty('retrievalURI', retrievalURI);
|
|
40
|
+
try {
|
|
41
|
+
const targetParseResult = await parse(retrievalURI, mergeOptions(options, {
|
|
42
|
+
parse: {
|
|
43
|
+
mediaType: 'text/plain' // force auto-detection
|
|
44
|
+
}
|
|
45
|
+
}));
|
|
46
|
+
// merge parsed result into our wrapper
|
|
47
|
+
for (const item of targetParseResult) {
|
|
48
|
+
extendsParseResult.push(item);
|
|
49
|
+
}
|
|
50
|
+
} catch (error) {
|
|
51
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
52
|
+
const annotation = new AnnotationElement(`Error parsing extends target "${retrievalURI}": ${message}`);
|
|
53
|
+
annotation.classes.push('error');
|
|
54
|
+
extendsParseResult.push(annotation);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// always attach result to extends element meta (even on failure - contains annotations)
|
|
58
|
+
extendsElement.meta.set('parseResult', extendsParseResult);
|
|
59
|
+
parseResult.push(extendsParseResult);
|
|
60
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
|
4
|
+
exports.__esModule = true;
|
|
5
|
+
exports.default = void 0;
|
|
6
|
+
var _ramda = require("ramda");
|
|
7
|
+
var _apidomParserAdapterOverlayJson = require("@speclynx/apidom-parser-adapter-overlay-json-1");
|
|
8
|
+
var _ParserError = _interopRequireDefault(require("../../../errors/ParserError.cjs"));
|
|
9
|
+
var _Parser = _interopRequireDefault(require("../Parser.cjs"));
|
|
10
|
+
var _extends = require("./extends.cjs");
|
|
11
|
+
exports.parseExtends = _extends.parseExtends;
|
|
12
|
+
/**
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @public
|
|
18
|
+
*/
|
|
19
|
+
class OverlayJSON1Parser extends _Parser.default {
|
|
20
|
+
refractorOpts;
|
|
21
|
+
constructor(options) {
|
|
22
|
+
const {
|
|
23
|
+
fileExtensions = [],
|
|
24
|
+
mediaTypes = _apidomParserAdapterOverlayJson.mediaTypes,
|
|
25
|
+
...rest
|
|
26
|
+
} = options ?? {};
|
|
27
|
+
super({
|
|
28
|
+
...rest,
|
|
29
|
+
name: 'overlay-json-1',
|
|
30
|
+
fileExtensions,
|
|
31
|
+
mediaTypes
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async canParse(file) {
|
|
35
|
+
const hasSupportedFileExtension = this.fileExtensions.length === 0 ? true : this.fileExtensions.includes(file.extension);
|
|
36
|
+
const hasSupportedMediaType = this.mediaTypes.includes(file.mediaType);
|
|
37
|
+
if (!hasSupportedFileExtension) return false;
|
|
38
|
+
if (hasSupportedMediaType) return true;
|
|
39
|
+
if (!hasSupportedMediaType) {
|
|
40
|
+
return (0, _apidomParserAdapterOverlayJson.detect)(file.toString());
|
|
41
|
+
}
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
async parse(file, options) {
|
|
45
|
+
const source = file.toString();
|
|
46
|
+
try {
|
|
47
|
+
const parserOpts = (0, _ramda.pick)(['sourceMap', 'style', 'strict', 'refractorOpts'], this);
|
|
48
|
+
const parseResult = await (0, _apidomParserAdapterOverlayJson.parse)(source, parserOpts);
|
|
49
|
+
const shouldParseExtends = options?.parse?.parserOpts?.[this.name]?.extends ?? options?.parse?.parserOpts?.extends;
|
|
50
|
+
if (shouldParseExtends) {
|
|
51
|
+
await (0, _extends.parseExtends)(parseResult, file.uri, options);
|
|
52
|
+
}
|
|
53
|
+
return parseResult;
|
|
54
|
+
} catch (error) {
|
|
55
|
+
throw new _ParserError.default(`Error parsing "${file.uri}"`, {
|
|
56
|
+
cause: error
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
var _default = exports.default = OverlayJSON1Parser;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { pick } from 'ramda';
|
|
2
|
+
import { parse, mediaTypes as OverlayJSON1MediaTypes, detect } from '@speclynx/apidom-parser-adapter-overlay-json-1';
|
|
3
|
+
import ParserError from "../../../errors/ParserError.mjs";
|
|
4
|
+
import Parser from "../Parser.mjs";
|
|
5
|
+
import { parseExtends } from "./extends.mjs";
|
|
6
|
+
/**
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
class OverlayJSON1Parser extends Parser {
|
|
13
|
+
refractorOpts;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
const {
|
|
16
|
+
fileExtensions = [],
|
|
17
|
+
mediaTypes = OverlayJSON1MediaTypes,
|
|
18
|
+
...rest
|
|
19
|
+
} = options ?? {};
|
|
20
|
+
super({
|
|
21
|
+
...rest,
|
|
22
|
+
name: 'overlay-json-1',
|
|
23
|
+
fileExtensions,
|
|
24
|
+
mediaTypes
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async canParse(file) {
|
|
28
|
+
const hasSupportedFileExtension = this.fileExtensions.length === 0 ? true : this.fileExtensions.includes(file.extension);
|
|
29
|
+
const hasSupportedMediaType = this.mediaTypes.includes(file.mediaType);
|
|
30
|
+
if (!hasSupportedFileExtension) return false;
|
|
31
|
+
if (hasSupportedMediaType) return true;
|
|
32
|
+
if (!hasSupportedMediaType) {
|
|
33
|
+
return detect(file.toString());
|
|
34
|
+
}
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
async parse(file, options) {
|
|
38
|
+
const source = file.toString();
|
|
39
|
+
try {
|
|
40
|
+
const parserOpts = pick(['sourceMap', 'style', 'strict', 'refractorOpts'], this);
|
|
41
|
+
const parseResult = await parse(source, parserOpts);
|
|
42
|
+
const shouldParseExtends = options?.parse?.parserOpts?.[this.name]?.extends ?? options?.parse?.parserOpts?.extends;
|
|
43
|
+
if (shouldParseExtends) {
|
|
44
|
+
await parseExtends(parseResult, file.uri, options);
|
|
45
|
+
}
|
|
46
|
+
return parseResult;
|
|
47
|
+
} catch (error) {
|
|
48
|
+
throw new ParserError(`Error parsing "${file.uri}"`, {
|
|
49
|
+
cause: error
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export { parseExtends } from "./extends.mjs";
|
|
55
|
+
export default OverlayJSON1Parser;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
|
4
|
+
exports.__esModule = true;
|
|
5
|
+
exports.default = void 0;
|
|
6
|
+
var _ramda = require("ramda");
|
|
7
|
+
var _apidomParserAdapterOverlayYaml = require("@speclynx/apidom-parser-adapter-overlay-yaml-1");
|
|
8
|
+
var _ParserError = _interopRequireDefault(require("../../../errors/ParserError.cjs"));
|
|
9
|
+
var _Parser = _interopRequireDefault(require("../Parser.cjs"));
|
|
10
|
+
var _extends = require("./extends.cjs");
|
|
11
|
+
exports.parseExtends = _extends.parseExtends;
|
|
12
|
+
/**
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @public
|
|
18
|
+
*/
|
|
19
|
+
class OverlayYAML1Parser extends _Parser.default {
|
|
20
|
+
refractorOpts;
|
|
21
|
+
constructor(options) {
|
|
22
|
+
const {
|
|
23
|
+
fileExtensions = [],
|
|
24
|
+
mediaTypes = _apidomParserAdapterOverlayYaml.mediaTypes,
|
|
25
|
+
...rest
|
|
26
|
+
} = options ?? {};
|
|
27
|
+
super({
|
|
28
|
+
...rest,
|
|
29
|
+
name: 'overlay-yaml-1',
|
|
30
|
+
fileExtensions,
|
|
31
|
+
mediaTypes
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async canParse(file) {
|
|
35
|
+
const hasSupportedFileExtension = this.fileExtensions.length === 0 ? true : this.fileExtensions.includes(file.extension);
|
|
36
|
+
const hasSupportedMediaType = this.mediaTypes.includes(file.mediaType);
|
|
37
|
+
if (!hasSupportedFileExtension) return false;
|
|
38
|
+
if (hasSupportedMediaType) return true;
|
|
39
|
+
if (!hasSupportedMediaType) {
|
|
40
|
+
return (0, _apidomParserAdapterOverlayYaml.detect)(file.toString());
|
|
41
|
+
}
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
async parse(file, options) {
|
|
45
|
+
const source = file.toString();
|
|
46
|
+
try {
|
|
47
|
+
const parserOpts = (0, _ramda.pick)(['sourceMap', 'style', 'strict', 'refractorOpts'], this);
|
|
48
|
+
const parseResult = await (0, _apidomParserAdapterOverlayYaml.parse)(source, parserOpts);
|
|
49
|
+
const shouldParseExtends = options?.parse?.parserOpts?.[this.name]?.extends ?? options?.parse?.parserOpts?.extends;
|
|
50
|
+
if (shouldParseExtends) {
|
|
51
|
+
await (0, _extends.parseExtends)(parseResult, file.uri, options);
|
|
52
|
+
}
|
|
53
|
+
return parseResult;
|
|
54
|
+
} catch (error) {
|
|
55
|
+
throw new _ParserError.default(`Error parsing "${file.uri}"`, {
|
|
56
|
+
cause: error
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
var _default = exports.default = OverlayYAML1Parser;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { pick } from 'ramda';
|
|
2
|
+
import { parse, mediaTypes as OverlayYAML1MediaTypes, detect } from '@speclynx/apidom-parser-adapter-overlay-yaml-1';
|
|
3
|
+
import ParserError from "../../../errors/ParserError.mjs";
|
|
4
|
+
import Parser from "../Parser.mjs";
|
|
5
|
+
import { parseExtends } from "./extends.mjs";
|
|
6
|
+
/**
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
class OverlayYAML1Parser extends Parser {
|
|
13
|
+
refractorOpts;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
const {
|
|
16
|
+
fileExtensions = [],
|
|
17
|
+
mediaTypes = OverlayYAML1MediaTypes,
|
|
18
|
+
...rest
|
|
19
|
+
} = options ?? {};
|
|
20
|
+
super({
|
|
21
|
+
...rest,
|
|
22
|
+
name: 'overlay-yaml-1',
|
|
23
|
+
fileExtensions,
|
|
24
|
+
mediaTypes
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async canParse(file) {
|
|
28
|
+
const hasSupportedFileExtension = this.fileExtensions.length === 0 ? true : this.fileExtensions.includes(file.extension);
|
|
29
|
+
const hasSupportedMediaType = this.mediaTypes.includes(file.mediaType);
|
|
30
|
+
if (!hasSupportedFileExtension) return false;
|
|
31
|
+
if (hasSupportedMediaType) return true;
|
|
32
|
+
if (!hasSupportedMediaType) {
|
|
33
|
+
return detect(file.toString());
|
|
34
|
+
}
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
async parse(file, options) {
|
|
38
|
+
const source = file.toString();
|
|
39
|
+
try {
|
|
40
|
+
const parserOpts = pick(['sourceMap', 'style', 'strict', 'refractorOpts'], this);
|
|
41
|
+
const parseResult = await parse(source, parserOpts);
|
|
42
|
+
const shouldParseExtends = options?.parse?.parserOpts?.[this.name]?.extends ?? options?.parse?.parserOpts?.extends;
|
|
43
|
+
if (shouldParseExtends) {
|
|
44
|
+
await parseExtends(parseResult, file.uri, options);
|
|
45
|
+
}
|
|
46
|
+
return parseResult;
|
|
47
|
+
} catch (error) {
|
|
48
|
+
throw new ParserError(`Error parsing "${file.uri}"`, {
|
|
49
|
+
cause: error
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export { parseExtends } from "./extends.mjs";
|
|
55
|
+
export default OverlayYAML1Parser;
|
|
@@ -0,0 +1,49 @@
|
|
|
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 _ResolveStrategy = _interopRequireDefault(require("../ResolveStrategy.cjs"));
|
|
7
|
+
var _ReferenceSet = _interopRequireDefault(require("../../../ReferenceSet.cjs"));
|
|
8
|
+
var _util = require("../../../options/util.cjs");
|
|
9
|
+
var _UnmatchedDereferenceStrategyError = _interopRequireDefault(require("../../../errors/UnmatchedDereferenceStrategyError.cjs"));
|
|
10
|
+
/**
|
|
11
|
+
* @public
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @public
|
|
16
|
+
*/
|
|
17
|
+
class Arazzo1ResolveStrategy extends _ResolveStrategy.default {
|
|
18
|
+
constructor(options) {
|
|
19
|
+
super({
|
|
20
|
+
...(options ?? {}),
|
|
21
|
+
name: 'arazzo-1'
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
canResolve(file, options) {
|
|
25
|
+
const dereferenceStrategy = options.dereference.strategies.find(strategy => strategy.name === 'arazzo-1');
|
|
26
|
+
if (dereferenceStrategy === undefined) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return dereferenceStrategy.canDereference(file, options);
|
|
30
|
+
}
|
|
31
|
+
async resolve(file, options) {
|
|
32
|
+
const dereferenceStrategy = options.dereference.strategies.find(strategy => strategy.name === 'arazzo-1');
|
|
33
|
+
if (dereferenceStrategy === undefined) {
|
|
34
|
+
throw new _UnmatchedDereferenceStrategyError.default(`"arazzo-1" resolve strategy requires "arazzo-1" dereference strategy to be configured for file "${file.uri}"`);
|
|
35
|
+
}
|
|
36
|
+
const refSet = new _ReferenceSet.default();
|
|
37
|
+
const mergedOptions = (0, _util.merge)(options, {
|
|
38
|
+
resolve: {
|
|
39
|
+
internal: false
|
|
40
|
+
},
|
|
41
|
+
dereference: {
|
|
42
|
+
refSet
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
await dereferenceStrategy.dereference(file, mergedOptions);
|
|
46
|
+
return refSet;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
var _default = exports.default = Arazzo1ResolveStrategy;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import ResolveStrategy from "../ResolveStrategy.mjs";
|
|
2
|
+
import ReferenceSet from "../../../ReferenceSet.mjs";
|
|
3
|
+
import { merge as mergeOptions } from "../../../options/util.mjs";
|
|
4
|
+
import UnmatchedDereferenceStrategyError from "../../../errors/UnmatchedDereferenceStrategyError.mjs";
|
|
5
|
+
/**
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
class Arazzo1ResolveStrategy extends ResolveStrategy {
|
|
12
|
+
constructor(options) {
|
|
13
|
+
super({
|
|
14
|
+
...(options ?? {}),
|
|
15
|
+
name: 'arazzo-1'
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
canResolve(file, options) {
|
|
19
|
+
const dereferenceStrategy = options.dereference.strategies.find(strategy => strategy.name === 'arazzo-1');
|
|
20
|
+
if (dereferenceStrategy === undefined) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return dereferenceStrategy.canDereference(file, options);
|
|
24
|
+
}
|
|
25
|
+
async resolve(file, options) {
|
|
26
|
+
const dereferenceStrategy = options.dereference.strategies.find(strategy => strategy.name === 'arazzo-1');
|
|
27
|
+
if (dereferenceStrategy === undefined) {
|
|
28
|
+
throw new UnmatchedDereferenceStrategyError(`"arazzo-1" resolve strategy requires "arazzo-1" dereference strategy to be configured for file "${file.uri}"`);
|
|
29
|
+
}
|
|
30
|
+
const refSet = new ReferenceSet();
|
|
31
|
+
const mergedOptions = mergeOptions(options, {
|
|
32
|
+
resolve: {
|
|
33
|
+
internal: false
|
|
34
|
+
},
|
|
35
|
+
dereference: {
|
|
36
|
+
refSet
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
await dereferenceStrategy.dereference(file, mergedOptions);
|
|
40
|
+
return refSet;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export default Arazzo1ResolveStrategy;
|
|
@@ -0,0 +1,49 @@
|
|
|
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 _ResolveStrategy = _interopRequireDefault(require("../ResolveStrategy.cjs"));
|
|
7
|
+
var _ReferenceSet = _interopRequireDefault(require("../../../ReferenceSet.cjs"));
|
|
8
|
+
var _util = require("../../../options/util.cjs");
|
|
9
|
+
var _UnmatchedDereferenceStrategyError = _interopRequireDefault(require("../../../errors/UnmatchedDereferenceStrategyError.cjs"));
|
|
10
|
+
/**
|
|
11
|
+
* @public
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @public
|
|
16
|
+
*/
|
|
17
|
+
class Overlay1ResolveStrategy extends _ResolveStrategy.default {
|
|
18
|
+
constructor(options) {
|
|
19
|
+
super({
|
|
20
|
+
...(options ?? {}),
|
|
21
|
+
name: 'overlay-1'
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
canResolve(file, options) {
|
|
25
|
+
const dereferenceStrategy = options.dereference.strategies.find(strategy => strategy.name === 'overlay-1');
|
|
26
|
+
if (dereferenceStrategy === undefined) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return dereferenceStrategy.canDereference(file, options);
|
|
30
|
+
}
|
|
31
|
+
async resolve(file, options) {
|
|
32
|
+
const dereferenceStrategy = options.dereference.strategies.find(strategy => strategy.name === 'overlay-1');
|
|
33
|
+
if (dereferenceStrategy === undefined) {
|
|
34
|
+
throw new _UnmatchedDereferenceStrategyError.default(`"overlay-1" resolve strategy requires "overlay-1" dereference strategy to be configured for file "${file.uri}"`);
|
|
35
|
+
}
|
|
36
|
+
const refSet = new _ReferenceSet.default();
|
|
37
|
+
const mergedOptions = (0, _util.merge)(options, {
|
|
38
|
+
resolve: {
|
|
39
|
+
internal: false
|
|
40
|
+
},
|
|
41
|
+
dereference: {
|
|
42
|
+
refSet
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
await dereferenceStrategy.dereference(file, mergedOptions);
|
|
46
|
+
return refSet;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
var _default = exports.default = Overlay1ResolveStrategy;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import ResolveStrategy from "../ResolveStrategy.mjs";
|
|
2
|
+
import ReferenceSet from "../../../ReferenceSet.mjs";
|
|
3
|
+
import { merge as mergeOptions } from "../../../options/util.mjs";
|
|
4
|
+
import UnmatchedDereferenceStrategyError from "../../../errors/UnmatchedDereferenceStrategyError.mjs";
|
|
5
|
+
/**
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
class Overlay1ResolveStrategy extends ResolveStrategy {
|
|
12
|
+
constructor(options) {
|
|
13
|
+
super({
|
|
14
|
+
...(options ?? {}),
|
|
15
|
+
name: 'overlay-1'
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
canResolve(file, options) {
|
|
19
|
+
const dereferenceStrategy = options.dereference.strategies.find(strategy => strategy.name === 'overlay-1');
|
|
20
|
+
if (dereferenceStrategy === undefined) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return dereferenceStrategy.canDereference(file, options);
|
|
24
|
+
}
|
|
25
|
+
async resolve(file, options) {
|
|
26
|
+
const dereferenceStrategy = options.dereference.strategies.find(strategy => strategy.name === 'overlay-1');
|
|
27
|
+
if (dereferenceStrategy === undefined) {
|
|
28
|
+
throw new UnmatchedDereferenceStrategyError(`"overlay-1" resolve strategy requires "overlay-1" dereference strategy to be configured for file "${file.uri}"`);
|
|
29
|
+
}
|
|
30
|
+
const refSet = new ReferenceSet();
|
|
31
|
+
const mergedOptions = mergeOptions(options, {
|
|
32
|
+
resolve: {
|
|
33
|
+
internal: false
|
|
34
|
+
},
|
|
35
|
+
dereference: {
|
|
36
|
+
refSet
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
await dereferenceStrategy.dereference(file, mergedOptions);
|
|
40
|
+
return refSet;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export default Overlay1ResolveStrategy;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ParseResultElement } from '@speclynx/apidom-datamodel';
|
|
2
|
+
import type { ReferenceOptions } from '../../../options/index.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Dereferences the `extends` target document from an Overlay document's ParseResult.
|
|
5
|
+
*
|
|
6
|
+
* If the extends element already has a parsed result attached (from the parse phase),
|
|
7
|
+
* it will be dereferenced in place. Otherwise, the target document will be fetched,
|
|
8
|
+
* parsed, and dereferenced.
|
|
9
|
+
*
|
|
10
|
+
* The dereferenced result is pushed into the overlay's ParseResult
|
|
11
|
+
* and always attached to the extends element's meta as 'parseResult',
|
|
12
|
+
* overriding any existing parse result from the parse phase.
|
|
13
|
+
* On failure, the result contains error annotations.
|
|
14
|
+
*
|
|
15
|
+
* @param parseResult - ParseResult containing an Overlay specification
|
|
16
|
+
* @param parseResultRetrievalURI - URI from which the parseResult was retrieved
|
|
17
|
+
* @param options - Full ReferenceOptions
|
|
18
|
+
*
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
export declare function dereferenceExtends(parseResult: ParseResultElement, parseResultRetrievalURI: string, options: ReferenceOptions): Promise<void>;
|