Skip to content

Commit 7e4ba45

Browse files
feat(reference): add Workflows 1.0.0 YAML parser plugin (#3572)
1 parent 1679c7d commit 7e4ba45

File tree

7 files changed

+363
-3
lines changed

7 files changed

+363
-3
lines changed

package-lock.json

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

packages/apidom-reference/README.md

+21-2
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,20 @@ Supported media types are:
265265
]
266266
```
267267

268+
#### [workflows-yaml-1](https://github.com/swagger-api/apidom/tree/main/packages/apidom-reference/src/parse/parsers/workflows-yaml-1)
269+
270+
Wraps [@swagger-api/apidom-parser-adapter-workflows-yaml-1](https://github.com/swagger-api/apidom/tree/main/packages/apidom-parser-adapter-workflows-yaml-1) package
271+
and is uniquely identified by `workflows-yaml-1` name.
272+
273+
Supported media types are:
274+
275+
```js
276+
[
277+
'application/vnd.oai.workflows;version=1.0.0',
278+
'application/vnd.oai.workflows+yaml;version=1.0.0',
279+
]
280+
```
281+
268282
#### [api-design-systems-json](https://github.com/swagger-api/apidom/tree/main/packages/apidom-reference/src/parse/parsers/api-design-systems-json)
269283

270284
Wraps [@swagger-api/apidom-parser-adapter-api-design-systsems-json](https://github.com/swagger-api/apidom/tree/main/packages/apidom-parser-adapter-api-design-systems-json) package
@@ -353,6 +367,7 @@ returns `true` or until entire list of parser plugins is exhausted (throws error
353367
AsyncApiJson2Parser({ allowEmpty: true, sourceMap: false }),
354368
AsyncApiYaml2Parser({ allowEmpty: true, sourceMap: false }),
355369
WorkflowsJson1Parser({ allowEmpty: true, sourceMap: false }),
370+
WorkflowsYaml1Parser({ allowEmpty: true, sourceMap: false }),
356371
ApiDesignSystemsJsonParser({ allowEmpty: true, sourceMap: false }),
357372
ApiDesignSystemsYamlParser({ allowEmpty: true, sourceMap: false }),
358373
JsonParser({ allowEmpty: true, sourceMap: false }),
@@ -374,7 +389,8 @@ import OpenApiJson3_1Parser from '@swagger-api/apidom-reference/parse/parsers/op
374389
import OpenApiYaml3_1Parser from '@swagger-api/apidom-reference/parse/parsers/openapi-yaml-3-1'
375390
import AsyncApiJson2Parser from '@swagger-api/apidom-reference/parse/parsers/asyncapi-json-2';
376391
import AsyncApiYaml2Parser from '@swagger-api/apidom-reference/parse/parsers/asyncapi-yaml-2';
377-
import WorkflowsJson1Parser from '@swagger-api/apidom-reference/parse/parsers/workflows-json-1';
392+
import WorkflowsJson1Parser from '@swagger-api/apidom-reference/parse/parsers/workflows-json-1';
393+
import WorkflowsYaml1Parser from '@swagger-api/apidom-reference/parse/parsers/workflows-yaml-1';
378394
import ApiDesignSystemsJsonParser from '@swagger-api/apidom-reference/parse/parsers/api-design-systems-json';
379395
import ApiDesignSystemsYamlParser from '@swagger-api/apidom-reference/parse/parsers/api-design-systems-json';
380396
import JsonParser from '@swagger-api/apidom-reference/parse/parsers/json';
@@ -392,6 +408,7 @@ options.parse.parsers = [
392408
AsyncApiJson2Parser({ allowEmpty: true, sourceMap: false }),
393409
AsyncApiYaml2Parser({ allowEmpty: true, sourceMap: false }),
394410
WorkflowsJson1Parser({ allowEmpty: true, sourceMap: false }),
411+
WorkflowsYaml1Parser({ allowEmpty: true, sourceMap: false }),
395412
ApiDesignSystemsJsonParser({ allowEmpty: true, sourceMap: false }),
396413
ApiDesignSystemsYamlParser({ allowEmpty: true, sourceMap: false }),
397414
YamlParser({ allowEmpty: true, sourceMap: false }),
@@ -412,7 +429,8 @@ import OpenApiJson3_1Parser from '@swagger-api/apidom-reference/parse/parsers/op
412429
import OpenApiYaml3_1Parser from '@swagger-api/apidom-reference/parse/parsers/openapi-yaml-3-1'
413430
import AsyncApiJson2Parser from '@swagger-api/apidom-reference/parse/parsers/asyncapi-json-2';
414431
import AsyncApiYaml2Parser from '@swagger-api/apidom-reference/parse/parsers/asyncapi-yaml-2';
415-
import WorkflowsJson1Parser from '@swagger-api/apidom-reference/parse/parsers/workflows-json-2';
432+
import WorkflowsJson1Parser from '@swagger-api/apidom-reference/parse/parsers/workflows-json-1';
433+
import WorkflowsYaml1Parser from '@swagger-api/apidom-reference/parse/parsers/workflows-yaml-1';
416434
import ApiDesignSystemsJsonParser from '@swagger-api/apidom-reference/parse/parsers/api-design-systems-json';
417435
import ApiDesignSystemsYamlParser from '@swagger-api/apidom-reference/parse/parsers/api-design-systems-json';
418436
import JsonParser from '@swagger-api/apidom-reference/parse/parsers/json';
@@ -432,6 +450,7 @@ await parse('/home/user/oas.json', {
432450
AsyncApiJson2Parser({ allowEmpty: true, sourceMap: false }),
433451
AsyncApiYaml2Parser({ allowEmpty: true, sourceMap: false }),
434452
WorkflowsJson1Parser({ allowEmpty: true, sourceMap: false }),
453+
WorkflowsYaml1Parser({ allowEmpty: true, sourceMap: false }),
435454
ApiDesignSystemsJsonParser({ allowEmpty: true, sourceMap: false }),
436455
ApiDesignSystemsYamlParser({ allowEmpty: true, sourceMap: false }),
437456
YamlParser({ allowEmpty: true, sourceMap: false }),

packages/apidom-reference/package.json

+10-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,12 @@
9797
"import": "./es/parse/parsers/workflows-json-1/index.mjs",
9898
"require": "./cjs/parse/parsers/workflows-json-1/index.cjs",
9999
"types": "./types/parse/parsers/workflows-json-1/index.d.ts"
100-
},
100+
},
101+
"./parse/parsers/workflows-yaml-1": {
102+
"import": "./es/parse/parsers/workflows-yaml-1/index.mjs",
103+
"require": "./cjs/parse/parsers/workflows-yaml-1/index.cjs",
104+
"types": "./types/parse/parsers/workflows-yaml-1/index.d.ts"
105+
},
101106
"./parse/parsers/binary": {
102107
"browser": {
103108
"import": "./es/parse/parsers/binary/index-browser.mjs",
@@ -261,6 +266,8 @@
261266
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^0.89.0",
262267
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^0.89.0",
263268
"@swagger-api/apidom-ns-workflows-1": "^0.89.0",
269+
"@swagger-api/apidom-parser-adapter-workflows-json-1": "^0.89.0",
270+
"@swagger-api/apidom-parser-adapter-workflows-yaml-1": "^0.89.0",
264271
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.89.0"
265272
},
266273
"devDependencies": {
@@ -282,6 +289,8 @@
282289
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "*",
283290
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "*",
284291
"@swagger-api/apidom-ns-workflows-1": "*",
292+
"@swagger-api/apidom-parser-adapter-workflows-json-1": "*",
293+
"@swagger-api/apidom-parser-adapter-workflows-yaml-1": "*",
285294
"@swagger-api/apidom-parser-adapter-yaml-1-2": "*",
286295
"axios-mock-adapter": "^1.21.4"
287296
},

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

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import OpenApiYaml3_1Parser from '../parse/parsers/openapi-yaml-3-1';
1515
import AsyncApiJson2Parser from '../parse/parsers/asyncapi-json-2';
1616
import AsyncApiYaml2Parser from '../parse/parsers/asyncapi-yaml-2';
1717
import WorkflowsJson1Parser from '../parse/parsers/workflows-json-1';
18+
import WorkflowsYaml1Parser from '../parse/parsers/workflows-yaml-1';
1819
import JsonParser from '../parse/parsers/json';
1920
import YamlParser from '../parse/parsers/yaml-1-2';
2021
import BinaryParser from '../parse/parsers/binary/index-node';
@@ -35,6 +36,7 @@ options.parse.parsers = [
3536
AsyncApiJson2Parser({ allowEmpty: true, sourceMap: false }),
3637
AsyncApiYaml2Parser({ allowEmpty: true, sourceMap: false }),
3738
WorkflowsJson1Parser({ allowEmpty: true, sourceMap: false }),
39+
WorkflowsYaml1Parser({ allowEmpty: true, sourceMap: false }),
3840
ApiDesignSystemsJsonParser({ allowEmpty: true, sourceMap: false }),
3941
ApiDesignSystemsYamlParser({ allowEmpty: true, sourceMap: false }),
4042
JsonParser({ 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-workflows-yaml-1';
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 WorkflowsYaml1Parser: stampit.Stamp<IParser> = stampit(Parser, {
11+
props: {
12+
name: 'workflows-yaml-1',
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 WorkflowsYaml1Parser;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
workflowsSpec: 1.0.0
2+
info:
3+
title: A pet purchasing workflow
4+
summary: This workflow showcases how to purchase a pet through a sequence of API calls
5+
description: |
6+
This workflow walks you through the steps of `searching` for, `selecting`, and `purchasing` an available pet.
7+
version: 1.0.1
8+
sourceDescriptions:
9+
- name: petStoreDescription
10+
url: https://github.com/swagger-api/swagger-petstore/blob/master/src/main/resources/openapi.yaml
11+
type: openapi
12+
13+
workflows:
14+
- workflowId: loginUserRetrievePet
15+
summary: Login User and then retrieve pets
16+
description: This procedure lays out the steps to login a user and then retrieve pets
17+
inputs:
18+
type: object
19+
properties:
20+
username:
21+
type: string
22+
password:
23+
type: string
24+
steps:
25+
- stepId: loginStep
26+
description: This step demonstrates the user login step
27+
operationId: petStoreDescription.loginUser
28+
parameters:
29+
# parameters to inject into the loginUser operation (parameter name must be resolvable at the referenced operation and the value is determined using {expression} syntax)
30+
- name: username
31+
in: query
32+
value: $inputs.username
33+
- name: password
34+
in: query
35+
value: $inputs.password
36+
successCriteria:
37+
# assertions to determine step was successful
38+
- condition: $statusCode == 200
39+
outputs:
40+
# outputs from this step
41+
tokenExpires: $response.header.X-Expires-After
42+
rateLimit: $response.header.X-Rate-Limit
43+
sessionToken: $response.body
44+
- stepId: getPetStep
45+
description: retrieve a pet by status from the GET pets endpoint
46+
operationRef: https://petstore3.swagger.io/api/v3/openapi.json#/paths/users/~findbystatus~1{status}/get
47+
dependsOn: loginStep
48+
parameters:
49+
- name: status
50+
in: query
51+
value: 'available'
52+
- name: Authorization
53+
in: header
54+
value: $steps.loginUser.outputs.sessionToken
55+
successCriteria:
56+
- condition: $statusCode == 200
57+
outputs:
58+
# outputs from this step
59+
availablePets: $response.body
60+
outputs:
61+
available: $steps.getPetStep.availablePets

0 commit comments

Comments
 (0)