Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 28 additions & 5 deletions apidom/packages/apidom-ns-openapi-3-1/src/elements/Response.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,43 @@
import { Attributes, Meta, ObjectElement } from 'minim';

import MediaType from './MediaType';
import { Attributes, Meta } from 'minim';
import { ObjectElement, StringElement } from 'apidom';

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

get contentProp(): Record<string, MediaType> {
get description(): StringElement {
return this.get('description');
}

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

get headers(): ObjectElement | undefined {
return this.get('headers');
}

set headers(headers: ObjectElement | undefined) {
this.set('headers', headers);
}

get contentProp(): ObjectElement | undefined {
return this.get('content');
}

set contentProp(contentProp: Record<string, MediaType>) {
set contentProp(contentProp: ObjectElement | undefined) {
this.set('content', contentProp);
}

get links(): ObjectElement | undefined {
return this.get('links');
}

set links(links: ObjectElement | undefined) {
this.set('links', links);
}
}

export default Response;
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
import stampit from 'stampit';
import { ObjectElement, Element } from 'apidom';
import { ObjectElement, StringElement, Element } from 'apidom';

import ReferenceElement from '../../../elements/Reference';
import PathItemElement from '../../../elements/PathItem';
import MapVisitor from '../generics/MapVisitor';
import FallbackVisitor from '../FallbackVisitor';
import { isPathItemLikeElement, isReferenceLikeElement } from '../../predicates';
import { isReferenceElement } from '../../../predicates';
import { isReferenceLikeElement } from '../../predicates';
import { isPathItemElement, isReferenceElement } from '../../../predicates';

const WebhooksVisitor = stampit(MapVisitor, FallbackVisitor, {
props: {
specPath: (element: Element) => {
// eslint-disable-next-line no-nested-ternary
return isReferenceLikeElement(element)
? ['document', 'objects', 'Reference']
: isPathItemLikeElement(element)
? ['document', 'objects', 'PathItem']
: ['value'];
: ['document', 'objects', 'PathItem'];
},
},
init() {
Expand All @@ -27,10 +26,18 @@ const WebhooksVisitor = stampit(MapVisitor, FallbackVisitor, {
// @ts-ignore
const result = MapVisitor.compose.methods.ObjectElement.call(this, objectElement);

// decorate every ReferenceElement with metadata about their referencing type
this.element.filter(isReferenceElement).forEach((referenceElement: ReferenceElement) => {
referenceElement.setMetaProperty('referenced-element', 'pathItem');
});

// decorate every PathItemElement with Webhook name metadata
this.element
.filter(isPathItemElement)
.forEach((pathItemElement: PathItemElement, key: StringElement) => {
pathItemElement.setMetaProperty('webhook-name', key.toValue());
});

return result;
},
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import stampit from 'stampit';
import { test } from 'ramda';
import { Element, ObjectElement } from 'apidom';
import { Element, ObjectElement, StringElement } from 'apidom';

import CallbackElement from '../../../../elements/Callback';
import PathItemElement from '../../../../elements/PathItem';
import ReferenceElement from '../../../../elements/Reference';
import PatternedFieldsJsonObjectVisitor from '../../generics/PatternedFieldsVisitor';
import FallbackVisitor from '../../FallbackVisitor';
import MapVisitor from '../../generics/MapVisitor';
import { isReferenceLikeElement } from '../../../predicates';
import { isReferenceElement } from '../../../../predicates';
import ReferenceElement from '../../../../elements/Reference';
import { isReferenceElement, isPathItemElement } from '../../../../predicates';

const CallbackVisitor = stampit(PatternedFieldsJsonObjectVisitor, FallbackVisitor, {
props: {
Expand All @@ -29,10 +30,18 @@ const CallbackVisitor = stampit(PatternedFieldsJsonObjectVisitor, FallbackVisito
// @ts-ignore
const result = MapVisitor.compose.methods.ObjectElement.call(this, objectElement);

// decorate every ReferenceElement with metadata about their referencing type
this.element.filter(isReferenceElement).forEach((referenceElement: ReferenceElement) => {
referenceElement.setMetaProperty('referenced-element', 'pathItem');
});

// decorate every PathItemElement with Callback Object expression metadata
this.element
.filter(isPathItemElement)
.forEach((pathItemElement: PathItemElement, key: StringElement) => {
pathItemElement.setMetaProperty('runtime-expression', key.toValue());
});

return result;
},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,8 @@ const HeadersVisitor = stampit(MapVisitor, FallbackVisitor, {
});

// decorate every HeaderElement with metadata about their name
this.element.forEach((value: Element, key: StringElement): void => {
if (!isHeaderElement(value)) return;

const headerName = key.toValue();

value.setMetaProperty('headerName', headerName);
this.element.filter(isHeaderElement).forEach((value: Element, key: StringElement) => {
value.setMetaProperty('header-name', key.toValue());
});

return result;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,8 @@ const ResponsesVisitor = stampit(MapVisitor, FallbackVisitor, {
});

// decorate every ResponseElement with metadata about their status code
this.element.forEach((value: Element, key: StringElement): void => {
if (!isResponseElement(value)) return;

const httpStatusCode = key.toValue();

value.setMetaProperty('httpStatusCode', httpStatusCode);
this.element.filter(isResponseElement).forEach((value: Element, key: StringElement) => {
value.setMetaProperty('http-status-code', key.toValue());
});

return result;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import stampit from 'stampit';
import { always } from 'ramda';
import { isObjectElement, ObjectElement, StringElement } from 'apidom';

import EncodingElement from '../../../../elements/Encoding';
import HeaderElement from '../../../../elements/Header';
import FallbackVisitor from '../../FallbackVisitor';
import FixedFieldsVisitor from '../../generics/FixedFieldsVisitor';
import { isHeaderElement } from '../../../../predicates';

const EncodingVisitor = stampit(FixedFieldsVisitor, FallbackVisitor, {
props: {
Expand All @@ -13,6 +16,23 @@ const EncodingVisitor = stampit(FixedFieldsVisitor, FallbackVisitor, {
init() {
this.element = new EncodingElement();
},
methods: {
ObjectElement(objectElement: ObjectElement) {
// @ts-ignore
const result = FixedFieldsVisitor.compose.methods.ObjectElement.call(this, objectElement);

// decorate every Header with media type metadata
if (isObjectElement(this.element.headers)) {
this.element.headers
.filter(isHeaderElement)
.forEach((headerElement: HeaderElement, key: StringElement) => {
headerElement.setMetaProperty('header-name', key.toValue());
});
}

return result;
},
},
});

export default EncodingVisitor;
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import stampit from 'stampit';
import { always } from 'ramda';
import { isObjectElement, ObjectElement, StringElement } from 'apidom';

import ParameterElement from '../../../../elements/Parameter';
import MediaTypeElement from '../../../../elements/MediaType';
import FixedFieldsVisitor from '../../generics/FixedFieldsVisitor';
import FallbackVisitor from '../../FallbackVisitor';
import { isMediaTypeElement } from '../../../../predicates';

const ParameterVisitor = stampit(FixedFieldsVisitor, FallbackVisitor, {
props: {
Expand All @@ -13,6 +16,23 @@ const ParameterVisitor = stampit(FixedFieldsVisitor, FallbackVisitor, {
init() {
this.element = new ParameterElement();
},
methods: {
ObjectElement(objectElement: ObjectElement) {
// @ts-ignore
const result = FixedFieldsVisitor.compose.methods.ObjectElement.call(this, objectElement);

// decorate every MediaTypeElement with media type metadata
if (isObjectElement(this.element.contentProp)) {
this.element.contentProp
.filter(isMediaTypeElement)
.forEach((mediaTypeElement: MediaTypeElement, key: StringElement) => {
mediaTypeElement.setMetaProperty('media-type', key.toValue());
});
}

return result;
},
},
});

export default ParameterVisitor;
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import stampit from 'stampit';
import { test, always } from 'ramda';
import { ObjectElement, StringElement } from 'apidom';

import PathsElement from '../../../../elements/Paths';
import PathItemElement from '../../../../elements/PathItem';
import PatternedFieldsVisitor from '../../generics/PatternedFieldsVisitor';
import FallbackVisitor from '../../FallbackVisitor';
import { isPathItemElement } from '../../../../predicates';

const PathsVisitor = stampit(PatternedFieldsVisitor, FallbackVisitor, {
props: {
Expand All @@ -14,6 +17,21 @@ const PathsVisitor = stampit(PatternedFieldsVisitor, FallbackVisitor, {
init() {
this.element = new PathsElement();
},
methods: {
ObjectElement(objectElement: ObjectElement) {
// @ts-ignore
const result = PatternedFieldsVisitor.compose.methods.ObjectElement.call(this, objectElement);

// decorate every PathItemElement with path metadata
this.element
.filter(isPathItemElement)
.forEach((pathItemElement: PathItemElement, key: StringElement) => {
pathItemElement.setMetaProperty('path', key.toValue());
});

return result;
},
},
});

export default PathsVisitor;
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import stampit from 'stampit';
import { always } from 'ramda';
import { StringElement, ObjectElement, isObjectElement } from 'apidom';

import RequestBodyElement from '../../../../elements/RequestBody';
import MediaTypeElement from '../../../../elements/MediaType';
import FixedFieldsVisitor from '../../generics/FixedFieldsVisitor';
import FallbackVisitor from '../../FallbackVisitor';
import { isMediaTypeElement } from '../../../../predicates';

const RequestBodyVisitor = stampit(FixedFieldsVisitor, FallbackVisitor, {
props: {
Expand All @@ -12,6 +15,23 @@ const RequestBodyVisitor = stampit(FixedFieldsVisitor, FallbackVisitor, {
init() {
this.element = new RequestBodyElement();
},
methods: {
ObjectElement(objectElement: ObjectElement) {
// @ts-ignore
const result = FixedFieldsVisitor.compose.methods.ObjectElement.call(this, objectElement);

// decorate every MediaTypeElement with media type metadata
if (isObjectElement(this.element.contentProp)) {
this.element.contentProp
.filter(isMediaTypeElement)
.forEach((mediaTypeElement: MediaTypeElement, key: StringElement) => {
mediaTypeElement.setMetaProperty('media-type', key.toValue());
});
}

return result;
},
},
});

export default RequestBodyVisitor;
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import stampit from 'stampit';
import { always } from 'ramda';
import { isObjectElement, ObjectElement, StringElement } from 'apidom';

import ResponseElement from '../../../../elements/Response';
import MediaTypeElement from '../../../../elements/MediaType';
import HeaderElement from '../../../../elements/Header';
import FixedFieldsVisitor from '../../generics/FixedFieldsVisitor';
import FallbackVisitor from '../../FallbackVisitor';
import { isHeaderElement, isMediaTypeElement } from '../../../../predicates';

const ResponseVisitor = stampit(FixedFieldsVisitor, FallbackVisitor, {
props: {
Expand All @@ -12,6 +16,32 @@ const ResponseVisitor = stampit(FixedFieldsVisitor, FallbackVisitor, {
init() {
this.element = new ResponseElement();
},
methods: {
ObjectElement(objectElement: ObjectElement) {
// @ts-ignore
const result = FixedFieldsVisitor.compose.methods.ObjectElement.call(this, objectElement);

// decorate every MediaTypeElement with media type metadata
if (isObjectElement(this.element.contentProp)) {
this.element.contentProp
.filter(isMediaTypeElement)
.forEach((mediaTypeElement: MediaTypeElement, key: StringElement) => {
mediaTypeElement.setMetaProperty('media-type', key.toValue());
});
}

// decorate every MediaTypeElement with media type metadata
if (isObjectElement(this.element.headers)) {
this.element.headers
.filter(isHeaderElement)
.forEach((headerElement: HeaderElement, key: StringElement) => {
headerElement.setMetaProperty('header-name', key.toValue());
});
}

return result;
},
},
});

export default ResponseVisitor;
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { T as stubTrue } from 'ramda';
import { ObjectElement } from 'apidom';

import { isReferenceLikeElement } from '../../../predicates';
import { isReferenceElement } from '../../../../predicates';
import { isReferenceElement, isResponseElement } from '../../../../predicates';
import AlternatingVisitor from '../../generics/AlternatingVisitor';
import FallbackVisitor from '../../FallbackVisitor';

Expand All @@ -22,6 +22,8 @@ const DefaultVisitor = stampit(AlternatingVisitor, FallbackVisitor, {
// decorate ReferenceElement with type of referencing element
if (isReferenceElement(this.element)) {
this.element.setMetaProperty('referenced-element', 'response');
} else if (isResponseElement(this.element)) {
this.element.setMetaProperty('http-status-code', 'default');
}

return result;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,10 @@ const ResponsesVisitor = stampit(MixedFieldsVisitor, FallbackVisitor, {
});

// decorate every ResponseElement with metadata about their status code
this.element.forEach((value: Element, key: StringElement): void => {
if (!isResponseElement(value)) return;

this.element.filter(isResponseElement).forEach((value: Element, key: StringElement) => {
const httpStatusCode = key.toValue();

if (!this.fieldPatternPredicate(httpStatusCode)) return;

value.setMetaProperty('httpStatusCode', httpStatusCode);
value.setMetaProperty('http-status-code', httpStatusCode);
});

return result;
Expand Down
Loading