Skip to content

Commit

Permalink
feat(ns-openapi-2): add support for Header Object (#3250)
Browse files Browse the repository at this point in the history
Refs #3097
  • Loading branch information
char0n authored Oct 10, 2023
1 parent 568908a commit 67abec5
Show file tree
Hide file tree
Showing 12 changed files with 479 additions and 1 deletion.
2 changes: 1 addition & 1 deletion packages/apidom-ns-openapi-2/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ Only fully implemented specification objects should be checked here.
- [ ] [Response Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#user-content-response-object)
- [ ] [Headers Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#user-content-headers-object)
- [x] [Example Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#user-content-example-object)
- [ ] [Header Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#user-content-header-object)
- [x] [Header Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#user-content-header-object)
- [x] [Tag Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#user-content-tag-object)
- [ ] [Reference Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#user-content-reference-object)
- [ ] [Schema Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#user-content-schema-object)
Expand Down
281 changes: 281 additions & 0 deletions packages/apidom-ns-openapi-2/src/elements/Header.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,281 @@
import {
StringElement,
BooleanElement,
Attributes,
Meta,
NumberElement,
ArrayElement,
ObjectElement,
} from '@swagger-api/apidom-core';
import { UnsupportedOperationError } from '@swagger-api/apidom-error';
import {
JSONReferenceElement,
JSONSchemaElement,
MediaElement,
} from '@swagger-api/apidom-ns-json-schema-draft-4';

/* eslint-disable class-methods-use-this */
class Header extends JSONSchemaElement {
constructor(content?: Record<string, unknown>, meta?: Meta, attributes?: Attributes) {
super(content, meta, attributes);
this.element = 'header';
this.classes.push('json-schema-draft-4');
}

/**
* Core vocabulary
*
* URI: https://tools.ietf.org/html/draft-wright-json-schema-00
*/

get idProp(): StringElement | undefined {
throw new UnsupportedOperationError('idProp getter in Header class is not not supported.');
}

set idProp(idProps: StringElement | undefined) {
throw new UnsupportedOperationError('idProp setter in Header class is not not supported.');
}

get $schema(): StringElement | undefined {
throw new UnsupportedOperationError('$schema getter in Header class is not not supported.');
}

set $schema($schema: StringElement | undefined) {
throw new UnsupportedOperationError('$schema setter in Header class is not not supported.');
}

/**
* Validation keywords for arrays
*/

get additionalItems(): this | JSONReferenceElement | BooleanElement | undefined {
throw new UnsupportedOperationError(
'additionalItems getter in Header class is not not supported.',
);
}

set additionalItems(additionalItems: this | JSONReferenceElement | BooleanElement | undefined) {
throw new UnsupportedOperationError(
'additionalItems setter in Header class is not not supported.',
);
}

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

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

/**
* Validation keywords for objects
*/

get maxProperties(): NumberElement | undefined {
throw new UnsupportedOperationError(
'maxProperties getter in Header class is not not supported.',
);
}

set maxProperties(maxProperties: NumberElement | undefined) {
throw new UnsupportedOperationError(
'maxProperties setter in Header class is not not supported.',
);
}

get minProperties(): NumberElement | undefined {
throw new UnsupportedOperationError(
'minProperties getter in Header class is not not supported.',
);
}

set minProperties(minProperties: NumberElement | undefined) {
throw new UnsupportedOperationError(
'minProperties setter in Header class is not not supported.',
);
}

get required(): ArrayElement | undefined {
throw new UnsupportedOperationError('required getter in Header class is not not supported.');
}

set required(required: ArrayElement | undefined) {
throw new UnsupportedOperationError('required setter in Header class is not not supported.');
}

get properties(): ObjectElement | undefined {
throw new UnsupportedOperationError('properties getter in Header class is not not supported.');
}

set properties(properties: ObjectElement | undefined) {
throw new UnsupportedOperationError('properties setter in Header class is not not supported.');
}

get additionalProperties(): this | JSONReferenceElement | BooleanElement | undefined {
throw new UnsupportedOperationError(
'additionalProperties getter in Header class is not not supported.',
);
}

set additionalProperties(
additionalProperties: this | JSONReferenceElement | BooleanElement | undefined,
) {
throw new UnsupportedOperationError(
'additionalProperties setter in Header class is not not supported.',
);
}

get patternProperties(): ObjectElement | undefined {
throw new UnsupportedOperationError(
'patternProperties getter in Header class is not not supported.',
);
}

set patternProperties(patternProperties: ObjectElement | undefined) {
throw new UnsupportedOperationError(
'patternProperties setter in Header class is not not supported.',
);
}

get dependencies(): ObjectElement | undefined {
throw new UnsupportedOperationError(
'dependencies getter in Header class is not not supported.',
);
}

set dependencies(dependencies: ObjectElement | undefined) {
throw new UnsupportedOperationError(
'dependencies setter in Header class is not not supported.',
);
}

/**
* Validation keywords for any instance type
*/

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

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

get allOf(): ArrayElement | undefined {
throw new UnsupportedOperationError('allOf getter in Header class is not not supported.');
}

set allOf(allOf: ArrayElement | undefined) {
throw new UnsupportedOperationError('allOf setter in Header class is not not supported.');
}

get anyOf(): ArrayElement | undefined {
throw new UnsupportedOperationError('anyOf getter in Header class is not not supported.');
}

set anyOf(anyOf: ArrayElement | undefined) {
throw new UnsupportedOperationError('anyOf setter in Header class is not not supported.');
}

get oneOf(): ArrayElement | undefined {
throw new UnsupportedOperationError('oneOf getter in Header class is not not supported.');
}

set oneOf(oneOf: ArrayElement | undefined) {
throw new UnsupportedOperationError('oneOf setter in Header class is not not supported.');
}

get not(): this | JSONReferenceElement | undefined {
throw new UnsupportedOperationError('not getter in Header class is not not supported.');
}

set not(not: this | JSONReferenceElement | undefined) {
throw new UnsupportedOperationError('not setter in Header class is not not supported.');
}

get definitions(): ObjectElement | undefined {
throw new UnsupportedOperationError('definitions getter in Header class is not not supported.');
}

set definitions(definitions: ObjectElement | undefined) {
throw new UnsupportedOperationError('definitions setter in Header class is not not supported.');
}

/**
* Metadata keywords
*
* URI: https://datatracker.ietf.org/doc/html/draft-wright-json-schema-validation-00#section-6
*/

get title(): StringElement | undefined {
throw new UnsupportedOperationError('title getter in Header class is not not supported.');
}

set title(title: StringElement | undefined) {
throw new UnsupportedOperationError('title setter in Header class is not not supported.');
}

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

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

/**
* Semantic validation with "format"
*
* URI: https://datatracker.ietf.org/doc/html/draft-wright-json-schema-validation-00#section-7
*/

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

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

/**
* JSON Hyper-Schema
*
* URI: https://datatracker.ietf.org/doc/html/draft-wright-json-schema-hyperschema-00
*/

get base(): StringElement | undefined {
throw new UnsupportedOperationError('base getter in Header class is not not supported.');
}

set base(base: StringElement | undefined) {
throw new UnsupportedOperationError('base setter in Header class is not not supported.');
}

get links(): ArrayElement | undefined {
throw new UnsupportedOperationError('links getter in Header class is not not supported.');
}

set links(links: ArrayElement | undefined) {
throw new UnsupportedOperationError('links setter in Header class is not not supported.');
}

get media(): MediaElement | undefined {
throw new UnsupportedOperationError('media getter in Header class is not not supported.');
}

set media(media: MediaElement | undefined) {
throw new UnsupportedOperationError('media setter in Header class is not not supported.');
}

get readOnly(): BooleanElement | undefined {
throw new UnsupportedOperationError('readOnly getter in Header class is not not supported.');
}

set readOnly(readOnly: BooleanElement | undefined) {
throw new UnsupportedOperationError('readOnly setter in Header class is not not supported.');
}
}
/* eslint-enable class-methods-use-this */

export default Header;
2 changes: 2 additions & 0 deletions packages/apidom-ns-openapi-2/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export {
isExternalDocumentationElement,
isItemsElement,
isExampleElement,
isHeaderElement,
isTagElement,
isXmlElement,
isSecurityDefinitionsElement,
Expand All @@ -44,6 +45,7 @@ export {
ExternalDocumentationElement,
ItemsElement,
ExampleElement,
HeaderElement,
TagElement,
XmlElement,
SecurityDefinitionsElement,
Expand Down
2 changes: 2 additions & 0 deletions packages/apidom-ns-openapi-2/src/namespace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import ContactElement from './elements/Contact';
import ExternalDocumentation from './elements/ExternalDocumentation';
import ItemsElement from './elements/Items';
import ExampleElement from './elements/Example';
import HeaderElement from './elements/Header';
import TagElement from './elements/Tag';
import XmlElement from './elements/Xml';
import SecurityDefinitionsElement from './elements/SecurityDefinitions';
Expand All @@ -23,6 +24,7 @@ const openApi2 = {
base.register('externalDocumentation', ExternalDocumentation);
base.register('items', ItemsElement);
base.register('example', ExampleElement);
base.register('header', HeaderElement);
base.register('tag', TagElement);
base.register('xml', XmlElement);
base.register('securityDefinitions', SecurityDefinitionsElement);
Expand Down
11 changes: 11 additions & 0 deletions packages/apidom-ns-openapi-2/src/predicates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import ContactElement from './elements/Contact';
import ExternalDocumentation from './elements/ExternalDocumentation';
import ItemsElement from './elements/Items';
import ExampleElement from './elements/Example';
import HeaderElement from './elements/Header';
import TagElement from './elements/Tag';
import XmlElement from './elements/Xml';
import SecurityDefinitionsElement from './elements/SecurityDefinitions';
Expand Down Expand Up @@ -72,6 +73,16 @@ export const isExampleElement = createPredicate(
},
);

export const isHeaderElement = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq }) => {
return (element: unknown) =>
element instanceof HeaderElement ||
(hasBasicElementProps(element) &&
isElementType('header', element) &&
primitiveEq('object', element));
},
);

export const isTagElement = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq }) => {
return (element: unknown) =>
Expand Down
3 changes: 3 additions & 0 deletions packages/apidom-ns-openapi-2/src/refractor/registration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import ContactElement from '../elements/Contact';
import ExternalDocumentationElement from '../elements/ExternalDocumentation';
import ItemsElement from '../elements/Items';
import ExampleElement from '../elements/Example';
import HeaderElement from '../elements/Header';
import TagElement from '../elements/Tag';
import XmlElement from '../elements/Xml';
import SecurityDefinitionsElement from '../elements/SecurityDefinitions';
Expand Down Expand Up @@ -43,6 +44,7 @@ ExampleElement.refract = createRefractor([
'Example',
'$visitor',
]);
HeaderElement.refract = createRefractor(['visitors', 'document', 'objects', 'Header', '$visitor']);
TagElement.refract = createRefractor(['visitors', 'document', 'objects', 'Tag', '$visitor']);
XmlElement.refract = createRefractor(['visitors', 'document', 'objects', 'XML', '$visitor']);
SecurityDefinitionsElement.refract = createRefractor([
Expand Down Expand Up @@ -75,6 +77,7 @@ export {
ExternalDocumentationElement,
ItemsElement,
ExampleElement,
HeaderElement,
TagElement,
XmlElement,
SecurityDefinitionsElement,
Expand Down
Loading

0 comments on commit 67abec5

Please sign in to comment.