Skip to content

Commit

Permalink
feat(ns-workflows-1): add support for Info Object (#3393)
Browse files Browse the repository at this point in the history
Refs: #3392

Co-authored-by: Vladimir Gorej <[email protected]>
  • Loading branch information
frankkilcommins and char0n authored Nov 15, 2023
1 parent ea33e51 commit 5508c54
Show file tree
Hide file tree
Showing 37 changed files with 1,326 additions and 27 deletions.
1 change: 1 addition & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"useTabs": false,
"tabWidth": 2,
"printWidth": 100,
"endOfLine": "lf",
"overrides": [
{
"files": "*.ts",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { Element, BREAK, cloneDeep } from '@swagger-api/apidom-core';
import Visitor from './Visitor';

/**
* This visitor is responsible for falling back to current traversed element
* This visitor is responsible for falling back to current traversed element.
* Given AsyncApi2Visitor expects ObjectElement to be traversed. If
* different Element is provided FallBackVisitor is responsible to assigning
* this Element as current element.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ const SpecificationExtensionVisitor = stampit(SpecificationVisitor, {
MemberElement(memberElement: MemberElement) {
this.element = cloneDeep(memberElement);
this.element.classes.push('specification-extension');

return BREAK;
},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ const Visitor = stampit({
props: {
element: null,
},
// @ts-ignore
methods: {
copyMetaAndAttributes(from, to) {
// copy sourcemaps
Expand Down
49 changes: 26 additions & 23 deletions packages/apidom-ns-workflows-1/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# @swagger-api/apidom-ns-workflows-1

`@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).
`@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).

## Installation

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

const objectElement = new namespace.elements.Object();
const workflowsElement = new namespace.elements.Workflows1();
const workflowsElement = new namespace.elements.WorkflowsSpecification1();
```

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

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

const infoElement = new InfoElement();
const workflowsElement = new Workflows1Element();
const workflowsElement = new WorkflowsSpecification1Element();
```

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

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

const workflowsElement = new Workflows1Element();
const workflowsElement = new WorkflowsSpecification1Element();

isWorkflows1Element(workflowsElement); // => true
isWorkflowsSpecification1Element(workflowsElement); // => true
```

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

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

const element = new Workflows1Element();
const element = new WorkflowsSpecification1Element();

const visitor = {
Workflows1Element(workflowsElement) {
WorkflowsSpecification1Element(workflowsElement) {
console.dir(workflowsElement);
},
};
Expand Down Expand Up @@ -151,19 +151,19 @@ this missing value with the most appropriate semantic element type.

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

const yamlDefinition = `
workflows: 1.0.0
info:
`;
const apiDOM = await parse(yamlDefinition);
const workflowsElement = Workflows1Element.refract(apiDOM.result, {
const workflowsElement = WorkflowsSpecification1Element.refract(apiDOM.result, {
plugins: [refractorPluginReplaceEmptyElement()],
});

// =>
// (Workflows1Element
// (WorkflowsSpecification1Element
// (MemberElement
// (StringElement)
// (StringElement))
Expand All @@ -172,7 +172,7 @@ const workflowsElement = Workflows1Element.refract(apiDOM.result, {
// (InfoElement)))

// => without the plugin the result would be as follows:
// (Workflows1Element
// (WorkflowsSpecification1Element
// (MemberElement
// (StringElement)
// (StringElement))
Expand All @@ -185,12 +185,15 @@ const workflowsElement = Workflows1Element.refract(apiDOM.result, {

Only fully implemented specification objects should be checked here.

- [ ] [Workflows Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#workflows-specification-object)
- [ ] [Info Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#info-object)
- [ ] [Source Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#source-object)
- [ ] [Workflow Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#workflow-object)
- [ ] [Step Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#step-object)
- [ ] [Parameter Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#parameter-object)
- [ ] [Success Action Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#success-action-object)
- [ ] [Failure Action Object](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#failure-action-object)
- [ ] [Specification extensions](https://github.com/OAI/sig-workflows/blob/draft-version-minor-enrichment/versions/1.0.0.md#specification-extensions)
- [ ] [Workflows Specification Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#workflows-specification-object)
- [x] [Info Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#info-object)
- [ ] [Source Description Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#source-description-object)
- [ ] [Workflow Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#workflow-object)
- [ ] [Step Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#step-object)
- [ ] [Parameter Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#parameter-object)
- [ ] [Success Action Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#success-action-object)
- [ ] [Failure Action Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#failure-action-object)
- [ ] [Component Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#component-object)
- [ ] [Criterion Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#criterion-object)
- [ ] [Reference Object](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#reference-object)
- [x] [Specification extensions](https://github.com/OAI/sig-workflows/blob/main/versions/1.0.0.md#specification-extensions)
43 changes: 43 additions & 0 deletions packages/apidom-ns-workflows-1/src/elements/Info.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { StringElement, ObjectElement, Attributes, Meta } from '@swagger-api/apidom-core';

class Info extends ObjectElement {
constructor(content?: Record<string, unknown>, meta?: Meta, attributes?: Attributes) {
super(content, meta, attributes);
this.element = 'info';
this.classes.push('info');
}

get title(): StringElement | undefined {
return this.get('title');
}

set title(title: StringElement | undefined) {
this.set('title', title);
}

get summary(): StringElement | undefined {
return this.get('summary');
}

set summary(summary: StringElement | undefined) {
this.set('summary', summary);
}

get description(): StringElement | undefined {
return this.get('description');
}

set description(description: StringElement | undefined) {
this.set('description', description);
}

get version(): StringElement | undefined {
return this.get('version');
}

set version(version: StringElement | undefined) {
this.set('version', version);
}
}

export default Info;
12 changes: 12 additions & 0 deletions packages/apidom-ns-workflows-1/src/elements/WorkflowsSpec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { StringElement, Attributes, Meta } from '@swagger-api/apidom-core';

class WorkflowsSpec extends StringElement {
constructor(content?: string, meta?: Meta, attributes?: Attributes) {
super(content, meta, attributes);
this.element = 'workflowsSpec';
this.classes.push('spec-version');
this.classes.push('version');
}
}

export default WorkflowsSpec;
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { ObjectElement, Attributes, Meta } from '@swagger-api/apidom-core';

import WorkflowsSpecElement from './WorkflowsSpec';
import InfoElement from './Info';

class WorkflowsSpecification1 extends ObjectElement {
constructor(content?: Record<string, unknown>, meta?: Meta, attributes?: Attributes) {
super(content, meta, attributes);
this.element = 'workflowsSpecification1';
this.classes.push('api');
this.classes.push('workflow');
}

get workflowsSpec(): WorkflowsSpecElement | undefined {
return this.get('workflowsSpec');
}

set workflowsSpec(workflowsSpec: WorkflowsSpecElement | undefined) {
this.set('workflowsSpec', workflowsSpec);
}

get info(): InfoElement | undefined {
return this.get('info');
}

set info(info: InfoElement | undefined) {
this.set('info', info);
}
}

export default WorkflowsSpecification1;
47 changes: 45 additions & 2 deletions packages/apidom-ns-workflows-1/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,46 @@
const variable = 'value';
export {
isRefElement,
isLinkElement as isLinkPrimitiveElement,
isMemberElement,
isObjectElement,
isArrayElement,
isBooleanElement,
isNullElement,
isElement,
isNumberElement,
isStringElement,
} from '@swagger-api/apidom-core';

export default variable;
export { default as mediaTypes, WorkflowsMediaTypes } from './media-types';

// eslint-disable-next-line no-restricted-exports
export { default } from './namespace';

export { default as refractorPluginReplaceEmptyElement } from './refractor/plugins/replace-empty-element';

export { default as refract, createRefractor } from './refractor';
export { default as specificationObj } from './refractor/specification';

export {
isWorkflowsSpecElement,
isWorkflowsSpecification1Element,
isInfoElement,
} from './predicates';

export { isWorkflowsSpecificationExtension } from './refractor/predicates';

export { default as FixedFieldsVisitor } from './refractor/visitors/generics/FixedFieldsVisitor';
export { default as MapVisitor } from './refractor/visitors/generics/MapVisitor';
export { default as MixedFieldsVisitor } from './refractor/visitors/generics/MixedFieldsVisitor';
export { default as FallbackVisitor } from './refractor/visitors/FallbackVisitor';
export { default as SpecificationVisitor } from './refractor/visitors/SpecificationVisitor';
export { default as Visitor } from './refractor/visitors/Visitor';

export { keyMap, getNodeType } from './traversal/visitor';

// Workflows 1.0.0 elements
export {
WorkflowsSpecification1Element,
WorkflowsSpecElement,
InfoElement,
} from './refractor/registration';
33 changes: 33 additions & 0 deletions packages/apidom-ns-workflows-1/src/media-types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { last } from 'ramda';
import { MediaTypes } from '@swagger-api/apidom-core';

type Format = 'generic' | 'json' | 'yaml';

export class WorkflowsMediaTypes extends MediaTypes<string> {
filterByFormat(format: Format = 'generic') {
const effectiveFormat = format === 'generic' ? 'workflows;version' : format;
return this.filter((mediaType) => mediaType.includes(effectiveFormat));
}

findBy(version = '1.0.0', format: Format = 'generic') {
const search =
format === 'generic'
? `vnd.oai.workflows;version=${version}`
: `vnd.oai.workflows+${format};version=${version}`;
const found = this.find((mediaType) => mediaType.includes(search));

return found || this.unknownMediaType;
}

latest(format: Format = 'generic') {
return last(this.filterByFormat(format)) as string;
}
}

const mediaTypes = new WorkflowsMediaTypes(
'application/vnd.oai.workflows;version=3.0.0',
'application/vnd.oai.workflows+json;version=3.0.0',
'application/vnd.oai.workflows+yaml;version=3.0.0',
);

export default mediaTypes;
19 changes: 19 additions & 0 deletions packages/apidom-ns-workflows-1/src/namespace.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { NamespacePluginOptions } from '@swagger-api/apidom-core';

import WorkflowsSpecification1Element from './elements/WorkflowsSpecification1';
import WorkflowsSpecElement from './elements/WorkflowsSpec';
import InfoElement from './elements/Info';

const workflows1 = {
namespace: (options: NamespacePluginOptions) => {
const { base } = options;

base.register('workflowsSpecification1', WorkflowsSpecification1Element);
base.register('workflowsSpec', WorkflowsSpecElement);
base.register('info', InfoElement);

return base;
},
};

export default workflows1;
38 changes: 38 additions & 0 deletions packages/apidom-ns-workflows-1/src/predicates.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { createPredicate } from '@swagger-api/apidom-core';

import WorkflowsSpecification1Element from './elements/WorkflowsSpecification1';
import WorkflowsSpecElement from './elements/WorkflowsSpec';
import InfoElement from './elements/Info';

export const isWorkflowsSpecElement = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq }) => {
return (element: unknown): element is WorkflowsSpecElement =>
element instanceof WorkflowsSpecElement ||
(hasBasicElementProps(element) &&
isElementType('workflowsSpec', element) &&
primitiveEq('string', element));
},
);

export const isWorkflowsSpecification1Element = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq, hasClass }) => {
return (element: unknown): element is WorkflowsSpecification1Element =>
element instanceof WorkflowsSpecification1Element ||
(hasBasicElementProps(element) &&
isElementType('workflowsSpecification1', element) &&
primitiveEq('object', element) &&
hasClass('api', element) &&
hasClass('workflow', element));
},
);

export const isInfoElement = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq, hasClass }) => {
return (element: unknown): element is InfoElement =>
element instanceof InfoElement ||
(hasBasicElementProps(element) &&
isElementType('info', element) &&
primitiveEq('object', element) &&
hasClass('info', element));
},
);
Loading

0 comments on commit 5508c54

Please sign in to comment.