Skip to content

Commit

Permalink
feat(OpenApi3.1): add support for additional fields to Operation
Browse files Browse the repository at this point in the history
Refs #66
  • Loading branch information
char0n committed Sep 7, 2020
1 parent 4f3684b commit 4b2452a
Show file tree
Hide file tree
Showing 21 changed files with 163 additions and 129 deletions.
6 changes: 5 additions & 1 deletion apidom/packages/@types/minim.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@ declare module 'minim' {

export class NullElement extends Element {}

export class BooleanElement extends Element {}
export class BooleanElement extends Element {
constructor(content?: boolean, meta?: Meta, attributes?: Attributes);
}

export class ArrayElement extends Element {
first: Element | undefined;
Expand All @@ -80,6 +82,8 @@ declare module 'minim' {
get(key: string): any;

set(key: string | StringElement, value: any): void;

hasKey(value: string): boolean;
}

export class MemberElement extends Element {
Expand Down
13 changes: 12 additions & 1 deletion apidom/packages/apidom-ns-openapi3-1/src/elements/Operation.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Attributes, Meta, ObjectElement, StringElement } from 'minim';
import { Attributes, BooleanElement, Meta, ObjectElement, StringElement } from 'minim';
import ParameterElement from './Parameter';
import ReferenceElement from './Reference';

Expand Down Expand Up @@ -40,6 +40,17 @@ class Operation extends ObjectElement {
this.set('operationId', operationId);
}

get deprecated(): BooleanElement {
if (this.hasKey('deprecated')) {
return this.get('deprecated');
}
return new BooleanElement(false);
}

set deprecated(deprecated: BooleanElement) {
this.set('deprecated', deprecated);
}

get parameters(): ParameterElement | ReferenceElement {
return this.get('parameters');
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,13 @@ import PathItemVisitor from './visitors/open-api-3-1/path-item';
import PathItem$RefVisitor from './visitors/open-api-3-1/path-item/$RefVisitor';
import PathItemSummaryVisitor from './visitors/open-api-3-1/path-item/SummaryVisitor';
import PathItemDescriptionVisitor from './visitors/open-api-3-1/path-item/DescriptionVisitor';
import PathItemGetVisitor from './visitors/open-api-3-1/path-item/GetVisitor';
import PathItemPutVisitor from './visitors/open-api-3-1/path-item/PutVisitor';
import PathItemPostVisitor from './visitors/open-api-3-1/path-item/PostVisitor';
import PathItemDeleteVisitor from './visitors/open-api-3-1/path-item/DeleteVisitor';
import PathItemOptionsVisitor from './visitors/open-api-3-1/path-item/OptionsVisitor';
import PathItemHeadVisitor from './visitors/open-api-3-1/path-item/HeadVisitor';
import PathItemPatchVisitor from './visitors/open-api-3-1/path-item/PatchVisitor';
import PathItemTraceVisitor from './visitors/open-api-3-1/path-item/TraceVisitor';
import ParametersVisitor from './visitors/open-api-3-1/ParametersVisitor';
import OperationVisitor from './visitors/open-api-3-1/operation';
import OperationSummaryVisitor from './visitors/open-api-3-1/operation/SummaryVisitor';
import OperationDescriptionVisitor from './visitors/open-api-3-1/operation/DescriptionVisitor';
import OperationOperationIdVisitor from './visitors/open-api-3-1/operation/OperationIdVisitor';
import OperationTagsVisitor from './visitors/open-api-3-1/operation/TagsVisitor';
import OperationDeprecatedVisitor from './visitors/open-api-3-1/operation/DeprecatedVisitor';

import ErrorVisitor from './visitors/ErrorVisitor';
import { ValueVisitor, ObjectVisitor, ArrayVisitor } from './visitors/generics';
Expand Down Expand Up @@ -145,18 +143,44 @@ const specification = {
$ref: PathItem$RefVisitor,
summary: PathItemSummaryVisitor,
description: PathItemDescriptionVisitor,
get: PathItemGetVisitor,
put: PathItemPutVisitor,
post: PathItemPostVisitor,
delete: PathItemDeleteVisitor,
options: PathItemOptionsVisitor,
head: PathItemHeadVisitor,
patch: PathItemPatchVisitor,
trace: PathItemTraceVisitor,
get: {
$ref: '#/visitors/document/objects/Operation',
},
put: {
$ref: '#/visitors/document/objects/Operation',
},
post: {
$ref: '#/visitors/document/objects/Operation',
},
delete: {
$ref: '#/visitors/document/objects/Operation',
},
options: {
$ref: '#/visitors/document/objects/Operation',
},
head: {
$ref: '#/visitors/document/objects/Operation',
},
patch: {
$ref: '#/visitors/document/objects/Operation',
},
trace: {
$ref: '#/visitors/document/objects/Operation',
},
servers: ServersVisitor,
parameters: ParametersVisitor,
},
},
Operation: {
$visitor: OperationVisitor,
fields: {
tags: OperationTagsVisitor,
summary: OperationSummaryVisitor,
description: OperationDescriptionVisitor,
operationId: OperationOperationIdVisitor,
deprecated: OperationDeprecatedVisitor,
},
},
},
extension: SpecificationExtensionVisitor,
},
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import stampit from 'stampit';
import { BREAK } from '..';
import SpecificationVisitor from '../SpecificationVisitor';

const JsonBooleanVisitor = stampit(SpecificationVisitor, {
methods: {
true(trueNode) {
const booleanElement = new this.namespace.elements.Boolean(true);
this.element = this.maybeAddSourceMap(trueNode, booleanElement);

return BREAK;
},
false(falseNode) {
const booleanElement = new this.namespace.elements.Boolean(false);
this.element = this.maybeAddSourceMap(falseNode, booleanElement);

return BREAK;
},
},
});

export default JsonBooleanVisitor;
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import stampit from 'stampit';
import JsonBooleanVisitor from '../../generics/JsonBooleanVisitor';

const DeprecatedVisitor = stampit(JsonBooleanVisitor);

export default DeprecatedVisitor;
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import stampit from 'stampit';
import JsonStringVisitor from '../../generics/JsonStringVisitor';

const DescriptionVisitor = stampit(JsonStringVisitor);

export default DescriptionVisitor;
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import stampit from 'stampit';
import JsonStringVisitor from '../../generics/JsonStringVisitor';

const OperationIdVisitor = stampit(JsonStringVisitor);

export default OperationIdVisitor;
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import stampit from 'stampit';
import JsonStringVisitor from '../../generics/JsonStringVisitor';

const SummaryVisitor = stampit(JsonStringVisitor);

export default SummaryVisitor;
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import stampit from 'stampit';
import { JsonString, isJsonString } from 'apidom-ast';

import { BREAK } from '../..';
import SpecificationVisitor from '../../SpecificationVisitor';

const TagsVisitor = stampit(SpecificationVisitor, {
methods: {
array(arrayNode) {
const tagElements = arrayNode.items
.filter(isJsonString)
.map((stringNode: JsonString) => this.nodeToElement(['value'], stringNode));

const tagsElement = new this.namespace.elements.Array(tagElements);
tagsElement.classes.push('tags');

this.element = this.maybeAddSourceMap(arrayNode, tagsElement);

return BREAK;
},
},
});

export default TagsVisitor;
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import stampit from 'stampit';

import FixedFieldsJsonObjectVisitor from '../../generics/FixedFieldsJsonObjectVisitor';

const OperationVisitor = stampit(FixedFieldsJsonObjectVisitor, {
props: {
specPath: ['document', 'objects', 'Operation'],
},
init() {
this.element = new this.namespace.elements.Operation();
},
});

export default OperationVisitor;

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import stampit from 'stampit';
import { StringElement } from 'minim';
import { isOperationElement, OperationElement } from 'apidom-ns-openapi3-1';

import FixedFieldsJsonObjectVisitor from '../../generics/FixedFieldsJsonObjectVisitor';

Expand All @@ -9,6 +11,23 @@ const PathItemVisitor = stampit(FixedFieldsJsonObjectVisitor, {
init() {
this.element = new this.namespace.elements.PathItem();
},
methods: {
object(objectNode) {
// @ts-ignore
const result = FixedFieldsJsonObjectVisitor.compose.methods.object.call(this, objectNode);

// decorate Operation elements with HTTP method
this.element
.filter(isOperationElement)
.forEach((operationElement: OperationElement, httpMethodElementCI: StringElement) => {
const httpMethod = httpMethodElementCI.toValue().toUpperCase();
const httpMethodElementCS = new this.namespace.elements.String(httpMethod);
operationElement.setMetaProperty('httpMethod', httpMethodElementCS);
});

return result;
},
},
});

export default PathItemVisitor;
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,11 @@
"summary": "path item summary",
"description": "path item description",
"get": {
"tags": ["tag1", "tag2"],
"summary": "Returns a list of users.",
"description": "Optional extended description in CommonMark or HTML.",
"operationId": "getUserList",
"deprecated": true,
"responses": {
"200": {
"description": "A JSON array of user names",
Expand Down

0 comments on commit 4b2452a

Please sign in to comment.