Skip to content

Commit 5508c54

Browse files
feat(ns-workflows-1): add support for Info Object (#3393)
Refs: #3392 Co-authored-by: Vladimir Gorej <[email protected]>
1 parent ea33e51 commit 5508c54

37 files changed

+1326
-27
lines changed

.prettierrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"useTabs": false,
55
"tabWidth": 2,
66
"printWidth": 100,
7+
"endOfLine": "lf",
78
"overrides": [
89
{
910
"files": "*.ts",

packages/apidom-ns-asyncapi-2/src/refractor/visitors/FallbackVisitor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Element, BREAK, cloneDeep } from '@swagger-api/apidom-core';
44
import Visitor from './Visitor';
55

66
/**
7-
* This visitor is responsible for falling back to current traversed element
7+
* This visitor is responsible for falling back to current traversed element.
88
* Given AsyncApi2Visitor expects ObjectElement to be traversed. If
99
* different Element is provided FallBackVisitor is responsible to assigning
1010
* this Element as current element.

packages/apidom-ns-asyncapi-2/src/refractor/visitors/SpecificationExtensionVisitor.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const SpecificationExtensionVisitor = stampit(SpecificationVisitor, {
88
MemberElement(memberElement: MemberElement) {
99
this.element = cloneDeep(memberElement);
1010
this.element.classes.push('specification-extension');
11+
1112
return BREAK;
1213
},
1314
},

packages/apidom-ns-openapi-2/src/refractor/visitors/Visitor.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ const Visitor = stampit({
55
props: {
66
element: null,
77
},
8-
// @ts-ignore
98
methods: {
109
copyMetaAndAttributes(from, to) {
1110
// copy sourcemaps

packages/apidom-ns-workflows-1/README.md

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# @swagger-api/apidom-ns-workflows-1
22

3-
`@swagger-api/apidom-ns-workflows-1` contains ApiDOM namespace specific to [Workflows 1.0.0 specification](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md).
3+
`@swagger-api/apidom-ns-workflows-1` contains ApiDOM namespace specific to [Workflows 1.0.0 specification](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md).
44

55
## Installation
66

@@ -22,7 +22,7 @@ import workflows1Namespace from '@swagger-api/apidom-ns-workflows-1';
2222
const namespace = createNamespace(workflows1Namespace);
2323

2424
const objectElement = new namespace.elements.Object();
25-
const workflowsElement = new namespace.elements.Workflows1();
25+
const workflowsElement = new namespace.elements.WorkflowsSpecification1();
2626
```
2727

2828
When namespace instance is created in this way, it will extend the base namespace
@@ -31,10 +31,10 @@ with the namespace provided as an argument.
3131
Elements from the namespace can also be used directly by importing them.
3232

3333
```js
34-
import { Workflows1Element, InfoElement } from '@swagger-api/apidom-ns-workflows-1';
34+
import { WorkflowsSpecification1Element, InfoElement } from '@swagger-api/apidom-ns-workflows-1';
3535

3636
const infoElement = new InfoElement();
37-
const workflowsElement = new Workflows1Element();
37+
const workflowsElement = new WorkflowsSpecification1Element();
3838
```
3939

4040
## Predicates
@@ -43,11 +43,11 @@ This package exposes [predicates](https://github.com/swagger-api/apidom/blob/mai
4343
for all higher order elements that are part of this namespace.
4444

4545
```js
46-
import { isWorkflows1Element, Workflows1Element } from '@swagger-api/apidom-ns-workflows-1';
46+
import { isWorkflowsSpecification1Element, WorkflowsSpecification1Element } from '@swagger-api/apidom-ns-workflows-1';
4747

48-
const workflowsElement = new Workflows1Element();
48+
const workflowsElement = new WorkflowsSpecification1Element();
4949

50-
isWorkflows1Element(workflowsElement); // => true
50+
isWorkflowsSpecification1Element(workflowsElement); // => true
5151
```
5252

5353
## Traversal
@@ -58,12 +58,12 @@ To learn more about these `visit` configuration options please refer to [@swagge
5858

5959
```js
6060
import { visit } from '@swagger-api/apidom-core';
61-
import { Workflows1Element, keyMap, getNodeType } from '@swagger-api/apidom-ns-workflows-1';
61+
import { WorkflowsSpecification1Element, keyMap, getNodeType } from '@swagger-api/apidom-ns-workflows-1';
6262

63-
const element = new Workflows1Element();
63+
const element = new WorkflowsSpecification1Element();
6464

6565
const visitor = {
66-
Workflows1Element(workflowsElement) {
66+
WorkflowsSpecification1Element(workflowsElement) {
6767
console.dir(workflowsElement);
6868
},
6969
};
@@ -151,19 +151,19 @@ this missing value with the most appropriate semantic element type.
151151

152152
```js
153153
import { parse } from '@swagger-api/apidom-parser-adapter-yaml-1-2';
154-
import { refractorPluginReplaceEmptyElement, Workflows1Element } from '@swagger-api/apidom-ns-workflows-1';
154+
import { refractorPluginReplaceEmptyElement, WorkflowsSpecification1Element } from '@swagger-api/apidom-ns-workflows-1';
155155

156156
const yamlDefinition = `
157157
workflows: 1.0.0
158158
info:
159159
`;
160160
const apiDOM = await parse(yamlDefinition);
161-
const workflowsElement = Workflows1Element.refract(apiDOM.result, {
161+
const workflowsElement = WorkflowsSpecification1Element.refract(apiDOM.result, {
162162
plugins: [refractorPluginReplaceEmptyElement()],
163163
});
164164

165165
// =>
166-
// (Workflows1Element
166+
// (WorkflowsSpecification1Element
167167
// (MemberElement
168168
// (StringElement)
169169
// (StringElement))
@@ -172,7 +172,7 @@ const workflowsElement = Workflows1Element.refract(apiDOM.result, {
172172
// (InfoElement)))
173173

174174
// => without the plugin the result would be as follows:
175-
// (Workflows1Element
175+
// (WorkflowsSpecification1Element
176176
// (MemberElement
177177
// (StringElement)
178178
// (StringElement))
@@ -185,12 +185,15 @@ const workflowsElement = Workflows1Element.refract(apiDOM.result, {
185185

186186
Only fully implemented specification objects should be checked here.
187187

188-
- [ ] [Workflows Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#workflows-specification-object)
189-
- [ ] [Info Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#info-object)
190-
- [ ] [Source Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#source-object)
191-
- [ ] [Workflow Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#workflow-object)
192-
- [ ] [Step Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#step-object)
193-
- [ ] [Parameter Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#parameter-object)
194-
- [ ] [Success Action Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#success-action-object)
195-
- [ ] [Failure Action Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#failure-action-object)
196-
- [ ] [Specification extensions](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#specification-extensions)
188+
- [ ] [Workflows Specification Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#workflows-specification-object)
189+
- [x] [Info Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#info-object)
190+
- [ ] [Source Description Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#source-description-object)
191+
- [ ] [Workflow Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#workflow-object)
192+
- [ ] [Step Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#step-object)
193+
- [ ] [Parameter Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#parameter-object)
194+
- [ ] [Success Action Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#success-action-object)
195+
- [ ] [Failure Action Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#failure-action-object)
196+
- [ ] [Component Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#component-object)
197+
- [ ] [Criterion Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#criterion-object)
198+
- [ ] [Reference Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#reference-object)
199+
- [x] [Specification extensions](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#specification-extensions)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { StringElement, ObjectElement, Attributes, Meta } from '@swagger-api/apidom-core';
2+
3+
class Info extends ObjectElement {
4+
constructor(content?: Record<string, unknown>, meta?: Meta, attributes?: Attributes) {
5+
super(content, meta, attributes);
6+
this.element = 'info';
7+
this.classes.push('info');
8+
}
9+
10+
get title(): StringElement | undefined {
11+
return this.get('title');
12+
}
13+
14+
set title(title: StringElement | undefined) {
15+
this.set('title', title);
16+
}
17+
18+
get summary(): StringElement | undefined {
19+
return this.get('summary');
20+
}
21+
22+
set summary(summary: StringElement | undefined) {
23+
this.set('summary', summary);
24+
}
25+
26+
get description(): StringElement | undefined {
27+
return this.get('description');
28+
}
29+
30+
set description(description: StringElement | undefined) {
31+
this.set('description', description);
32+
}
33+
34+
get version(): StringElement | undefined {
35+
return this.get('version');
36+
}
37+
38+
set version(version: StringElement | undefined) {
39+
this.set('version', version);
40+
}
41+
}
42+
43+
export default Info;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { StringElement, Attributes, Meta } from '@swagger-api/apidom-core';
2+
3+
class WorkflowsSpec extends StringElement {
4+
constructor(content?: string, meta?: Meta, attributes?: Attributes) {
5+
super(content, meta, attributes);
6+
this.element = 'workflowsSpec';
7+
this.classes.push('spec-version');
8+
this.classes.push('version');
9+
}
10+
}
11+
12+
export default WorkflowsSpec;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { ObjectElement, Attributes, Meta } from '@swagger-api/apidom-core';
2+
3+
import WorkflowsSpecElement from './WorkflowsSpec';
4+
import InfoElement from './Info';
5+
6+
class WorkflowsSpecification1 extends ObjectElement {
7+
constructor(content?: Record<string, unknown>, meta?: Meta, attributes?: Attributes) {
8+
super(content, meta, attributes);
9+
this.element = 'workflowsSpecification1';
10+
this.classes.push('api');
11+
this.classes.push('workflow');
12+
}
13+
14+
get workflowsSpec(): WorkflowsSpecElement | undefined {
15+
return this.get('workflowsSpec');
16+
}
17+
18+
set workflowsSpec(workflowsSpec: WorkflowsSpecElement | undefined) {
19+
this.set('workflowsSpec', workflowsSpec);
20+
}
21+
22+
get info(): InfoElement | undefined {
23+
return this.get('info');
24+
}
25+
26+
set info(info: InfoElement | undefined) {
27+
this.set('info', info);
28+
}
29+
}
30+
31+
export default WorkflowsSpecification1;
Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,46 @@
1-
const variable = 'value';
1+
export {
2+
isRefElement,
3+
isLinkElement as isLinkPrimitiveElement,
4+
isMemberElement,
5+
isObjectElement,
6+
isArrayElement,
7+
isBooleanElement,
8+
isNullElement,
9+
isElement,
10+
isNumberElement,
11+
isStringElement,
12+
} from '@swagger-api/apidom-core';
213

3-
export default variable;
14+
export { default as mediaTypes, WorkflowsMediaTypes } from './media-types';
15+
16+
// eslint-disable-next-line no-restricted-exports
17+
export { default } from './namespace';
18+
19+
export { default as refractorPluginReplaceEmptyElement } from './refractor/plugins/replace-empty-element';
20+
21+
export { default as refract, createRefractor } from './refractor';
22+
export { default as specificationObj } from './refractor/specification';
23+
24+
export {
25+
isWorkflowsSpecElement,
26+
isWorkflowsSpecification1Element,
27+
isInfoElement,
28+
} from './predicates';
29+
30+
export { isWorkflowsSpecificationExtension } from './refractor/predicates';
31+
32+
export { default as FixedFieldsVisitor } from './refractor/visitors/generics/FixedFieldsVisitor';
33+
export { default as MapVisitor } from './refractor/visitors/generics/MapVisitor';
34+
export { default as MixedFieldsVisitor } from './refractor/visitors/generics/MixedFieldsVisitor';
35+
export { default as FallbackVisitor } from './refractor/visitors/FallbackVisitor';
36+
export { default as SpecificationVisitor } from './refractor/visitors/SpecificationVisitor';
37+
export { default as Visitor } from './refractor/visitors/Visitor';
38+
39+
export { keyMap, getNodeType } from './traversal/visitor';
40+
41+
// Workflows 1.0.0 elements
42+
export {
43+
WorkflowsSpecification1Element,
44+
WorkflowsSpecElement,
45+
InfoElement,
46+
} from './refractor/registration';
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { last } from 'ramda';
2+
import { MediaTypes } from '@swagger-api/apidom-core';
3+
4+
type Format = 'generic' | 'json' | 'yaml';
5+
6+
export class WorkflowsMediaTypes extends MediaTypes<string> {
7+
filterByFormat(format: Format = 'generic') {
8+
const effectiveFormat = format === 'generic' ? 'workflows;version' : format;
9+
return this.filter((mediaType) => mediaType.includes(effectiveFormat));
10+
}
11+
12+
findBy(version = '1.0.0', format: Format = 'generic') {
13+
const search =
14+
format === 'generic'
15+
? `vnd.oai.workflows;version=${version}`
16+
: `vnd.oai.workflows+${format};version=${version}`;
17+
const found = this.find((mediaType) => mediaType.includes(search));
18+
19+
return found || this.unknownMediaType;
20+
}
21+
22+
latest(format: Format = 'generic') {
23+
return last(this.filterByFormat(format)) as string;
24+
}
25+
}
26+
27+
const mediaTypes = new WorkflowsMediaTypes(
28+
'application/vnd.oai.workflows;version=3.0.0',
29+
'application/vnd.oai.workflows+json;version=3.0.0',
30+
'application/vnd.oai.workflows+yaml;version=3.0.0',
31+
);
32+
33+
export default mediaTypes;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { NamespacePluginOptions } from '@swagger-api/apidom-core';
2+
3+
import WorkflowsSpecification1Element from './elements/WorkflowsSpecification1';
4+
import WorkflowsSpecElement from './elements/WorkflowsSpec';
5+
import InfoElement from './elements/Info';
6+
7+
const workflows1 = {
8+
namespace: (options: NamespacePluginOptions) => {
9+
const { base } = options;
10+
11+
base.register('workflowsSpecification1', WorkflowsSpecification1Element);
12+
base.register('workflowsSpec', WorkflowsSpecElement);
13+
base.register('info', InfoElement);
14+
15+
return base;
16+
},
17+
};
18+
19+
export default workflows1;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { createPredicate } from '@swagger-api/apidom-core';
2+
3+
import WorkflowsSpecification1Element from './elements/WorkflowsSpecification1';
4+
import WorkflowsSpecElement from './elements/WorkflowsSpec';
5+
import InfoElement from './elements/Info';
6+
7+
export const isWorkflowsSpecElement = createPredicate(
8+
({ hasBasicElementProps, isElementType, primitiveEq }) => {
9+
return (element: unknown): element is WorkflowsSpecElement =>
10+
element instanceof WorkflowsSpecElement ||
11+
(hasBasicElementProps(element) &&
12+
isElementType('workflowsSpec', element) &&
13+
primitiveEq('string', element));
14+
},
15+
);
16+
17+
export const isWorkflowsSpecification1Element = createPredicate(
18+
({ hasBasicElementProps, isElementType, primitiveEq, hasClass }) => {
19+
return (element: unknown): element is WorkflowsSpecification1Element =>
20+
element instanceof WorkflowsSpecification1Element ||
21+
(hasBasicElementProps(element) &&
22+
isElementType('workflowsSpecification1', element) &&
23+
primitiveEq('object', element) &&
24+
hasClass('api', element) &&
25+
hasClass('workflow', element));
26+
},
27+
);
28+
29+
export const isInfoElement = createPredicate(
30+
({ hasBasicElementProps, isElementType, primitiveEq, hasClass }) => {
31+
return (element: unknown): element is InfoElement =>
32+
element instanceof InfoElement ||
33+
(hasBasicElementProps(element) &&
34+
isElementType('info', element) &&
35+
primitiveEq('object', element) &&
36+
hasClass('info', element));
37+
},
38+
);

0 commit comments

Comments
 (0)