Skip to content

Commit ed60acc

Browse files
authored
feat(reference): add OpenAPI 2.0 YAML parser plugin (#3344)
Refs #3100
1 parent 70f345d commit ed60acc

File tree

8 files changed

+1016
-5
lines changed

8 files changed

+1016
-5
lines changed

package-lock.json

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/apidom-reference/README.md

+19
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,20 @@ Supported media types are:
134134
]
135135
```
136136

137+
#### [openapi-yaml-2](https://github.com/swagger-api/apidom/tree/main/packages/apidom-reference/src/parse/parsers/openapi-yaml-2)
138+
139+
Wraps [@swagger-api/apidom-parser-adapter-openapi-yaml-2](https://github.com/swagger-api/apidom/tree/main/packages/apidom-parser-adapter-openapi-yaml-2) package
140+
and is uniquely identified by `openapi-yaml-2` name.
141+
142+
Supported media types are:
143+
144+
```js
145+
[
146+
'application/vnd.oai.openapi;version=2.0',
147+
'application/vnd.oai.openapi+yaml;version=2.0',
148+
]
149+
```
150+
137151
#### [openapi-yaml-3-0](https://github.com/swagger-api/apidom/tree/main/packages/apidom-reference/src/parse/parsers/openapi-yaml-3-0)
138152

139153
Wraps [@swagger-api/apidom-parser-adapter-openapi-yaml-3-0](https://github.com/swagger-api/apidom/tree/main/packages/apidom-parser-adapter-openapi-yaml-3-0) package
@@ -315,6 +329,7 @@ returns `true` or until entire list of parser plugins is exhausted (throws error
315329
```js
316330
[
317331
OpenApiJson2Parser({ allowEmpty: true, sourceMap: false }),
332+
OpenApiYaml2Parser({ allowEmpty: true, sourceMap: false }),
318333
OpenApiJson3_0Parser({ allowEmpty: true, sourceMap: false }),
319334
OpenApiYaml3_0Parser({ allowEmpty: true, sourceMap: false }),
320335
OpenApiYaml3_1Parser({ allowEmpty: true, sourceMap: false }),
@@ -336,6 +351,7 @@ It's possible to **change** the parser plugins **order globally** by mutating gl
336351
```js
337352
import { options } from '@swagger-api/apidom-reference';
338353
import OpenApiJson2Parser from '@swagger-api/apidom-reference/parse/parsers/openapi-json-2';
354+
import OpenApiYaml2Parser from '@swagger-api/apidom-reference/parse/parsers/openapi-yaml-2';
339355
import OpenApiJson3_0Parser from '@swagger-api/apidom-reference/parse/parsers/openapi-json-3-0';
340356
import OpenApiYaml3_0Parser from '@swagger-api/apidom-reference/parse/parsers/openapi-yaml-3-0'
341357
import OpenApiJson3_1Parser from '@swagger-api/apidom-reference/parse/parsers/openapi-json-3-1';
@@ -351,6 +367,7 @@ import BinaryParser from '@swagger-api/apidom-reference/parse/parsers/binary';
351367

352368
options.parse.parsers = [
353369
OpenApiJson2Parser({ allowEmpty: true, sourceMap: false }),
370+
OpenApiYaml2Parser({ allowEmpty: true, sourceMap: false }),
354371
OpenApiJson3_0Parser({ allowEmpty: true, sourceMap: false }),
355372
OpenApiYaml3_0Parser({ allowEmpty: true, sourceMap: false }),
356373
OpenApiJson3_1Parser({ allowEmpty: true, sourceMap: false }),
@@ -370,6 +387,7 @@ To **change** the parser plugins **order** on ad-hoc basis:
370387
```js
371388
import { parse } from '@swagger-api/apidom-reference';
372389
import OpenApiJson2Parser from '@swagger-api/apidom-reference/parse/parsers/openapi-json-2';
390+
import OpenApiYaml2Parser from '@swagger-api/apidom-reference/parse/parsers/openapi-yaml-2';
373391
import OpenApiJson3_0Parser from '@swagger-api/apidom-reference/parse/parsers/openapi-json-3-0';
374392
import OpenApiYaml3_0Parser from '@swagger-api/apidom-reference/parse/parsers/openapi-yaml-3-0'
375393
import OpenApiJson3_1Parser from '@swagger-api/apidom-reference/parse/parsers/openapi-json-3-1';
@@ -387,6 +405,7 @@ await parse('/home/user/oas.json', {
387405
mediaType: 'application/vnd.oai.openapi+json;version=3.1.0',
388406
parsers: [
389407
OpenApiJson2Parser({ allowEmpty: true, sourceMap: false }),
408+
OpenApiYaml2Parser({ allowEmpty: true, sourceMap: false }),
390409
OpenApiJson3_1Parser({ allowEmpty: true, sourceMap: false }),
391410
OpenApiYaml3_1Parser({ allowEmpty: true, sourceMap: false }),
392411
OpenApiJson3_0Parser({ allowEmpty: true, sourceMap: false }),

packages/apidom-reference/package.json

+10
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,11 @@
110110
"require": "./cjs/parse/parsers/openapi-json-2/index.cjs",
111111
"types": "./types/parse/parsers/openapi-json-2/index.d.ts"
112112
},
113+
"./parse/parsers/openapi-yaml-2": {
114+
"import": "./es/parse/parsers/openapi-yaml-2/index.mjs",
115+
"require": "./cjs/parse/parsers/openapi-yaml-2/index.cjs",
116+
"types": "./types/parse/parsers/openapi-yaml-2/index.d.ts"
117+
},
113118
"./parse/parsers/openapi-json-3-0": {
114119
"import": "./es/parse/parsers/openapi-json-3-0/index.mjs",
115120
"require": "./cjs/parse/parsers/openapi-json-3-0/index.cjs",
@@ -230,22 +235,27 @@
230235
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^0.81.0",
231236
"@swagger-api/apidom-parser-adapter-json": "^0.81.0",
232237
"@swagger-api/apidom-parser-adapter-openapi-json-2": "^0.81.0",
238+
"@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^0.81.0",
233239
"@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^0.81.0",
234240
"@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^0.81.0",
235241
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^0.81.0",
236242
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^0.81.0",
237243
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.81.0"
238244
},
239245
"devDependencies": {
246+
"@swagger-api/apidom-error": "*",
240247
"@swagger-api/apidom-json-pointer": "*",
241248
"@swagger-api/apidom-ns-asyncapi-2": "*",
249+
"@swagger-api/apidom-ns-openapi-2": "*",
242250
"@swagger-api/apidom-ns-openapi-3-0": "*",
243251
"@swagger-api/apidom-ns-openapi-3-1": "*",
244252
"@swagger-api/apidom-parser-adapter-api-design-systems-json": "*",
245253
"@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "*",
246254
"@swagger-api/apidom-parser-adapter-asyncapi-json-2": "*",
247255
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "*",
248256
"@swagger-api/apidom-parser-adapter-json": "*",
257+
"@swagger-api/apidom-parser-adapter-openapi-json-2": "*",
258+
"@swagger-api/apidom-parser-adapter-openapi-yaml-2": "*",
249259
"@swagger-api/apidom-parser-adapter-openapi-json-3-0": "*",
250260
"@swagger-api/apidom-parser-adapter-openapi-json-3-1": "*",
251261
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "*",

packages/apidom-reference/src/configuration/saturated.ts

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import AsyncApi2ResolveStrategy from '../resolve/strategies/asyncapi-2';
66
import ApiDesignSystemsJsonParser from '../parse/parsers/api-design-systems-json';
77
import ApiDesignSystemsYamlParser from '../parse/parsers/api-design-systems-yaml';
88
import OpenApiJson2Parser from '../parse/parsers/openapi-json-2';
9+
import OpenApiYaml2Parser from '../parse/parsers/openapi-yaml-2';
910
import OpenApiJson3_0Parser from '../parse/parsers/openapi-json-3-0';
1011
import OpenApiYaml3_0Parser from '../parse/parsers/openapi-yaml-3-0';
1112
import OpenApiJson3_1Parser from '../parse/parsers/openapi-json-3-1';
@@ -22,6 +23,7 @@ import { options } from '../index';
2223

2324
options.parse.parsers = [
2425
OpenApiJson2Parser({ allowEmpty: true, sourceMap: false }),
26+
OpenApiYaml2Parser({ allowEmpty: true, sourceMap: false }),
2527
OpenApiJson3_0Parser({ allowEmpty: true, sourceMap: false }),
2628
OpenApiYaml3_0Parser({ allowEmpty: true, sourceMap: false }),
2729
OpenApiJson3_1Parser({ allowEmpty: true, sourceMap: false }),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import stampit from 'stampit';
2+
import { pick } from 'ramda';
3+
import { ParseResultElement } from '@swagger-api/apidom-core';
4+
import { parse, mediaTypes, detect } from '@swagger-api/apidom-parser-adapter-openapi-yaml-2';
5+
6+
import ParserError from '../../../errors/ParserError';
7+
import { File as IFile, Parser as IParser } from '../../../types';
8+
import Parser from '../Parser';
9+
10+
const OpenApiYaml2Parser: stampit.Stamp<IParser> = stampit(Parser, {
11+
props: {
12+
name: 'openapi-yaml-2',
13+
fileExtensions: ['.yaml', '.yml'],
14+
mediaTypes,
15+
},
16+
methods: {
17+
async canParse(file: IFile): Promise<boolean> {
18+
const hasSupportedFileExtension =
19+
this.fileExtensions.length === 0 ? true : this.fileExtensions.includes(file.extension);
20+
const hasSupportedMediaType = this.mediaTypes.includes(file.mediaType);
21+
22+
if (!hasSupportedFileExtension) return false;
23+
if (hasSupportedMediaType) return true;
24+
if (!hasSupportedMediaType) {
25+
return detect(file.toString());
26+
}
27+
return false;
28+
},
29+
async parse(file: IFile): Promise<ParseResultElement> {
30+
const source = file.toString();
31+
32+
try {
33+
const parserOpts = pick(['sourceMap', 'refractorOpts'], this);
34+
return await parse(source, parserOpts);
35+
} catch (error: any) {
36+
throw new ParserError(`Error parsing "${file.uri}"`, { cause: error });
37+
}
38+
},
39+
},
40+
});
41+
42+
export default OpenApiYaml2Parser;

0 commit comments

Comments
 (0)