From f0b535e90e890cfac9cb47720b345381b2dc2500 Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Wed, 7 Apr 2021 10:06:12 +0200 Subject: [PATCH] feat(ns-openapi-3-1): add support for JSON Schema Dialect Closes #339 --- .../src/elements/JsonSchemaDialect.ts | 12 +++++++++++ .../apidom-ns-openapi-3-1/src/index.ts | 1 + .../apidom-ns-openapi-3-1/src/namespace.ts | 2 ++ .../src/refractor/registration.ts | 9 ++++++++ .../src/refractor/specification.ts | 2 ++ .../open-api-3-1/JsonSchemaDialectVisitor.ts | 21 +++++++++++++++++++ .../src/traversal/visitor.ts | 2 +- 7 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 apidom/packages/apidom-ns-openapi-3-1/src/elements/JsonSchemaDialect.ts create mode 100644 apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/JsonSchemaDialectVisitor.ts diff --git a/apidom/packages/apidom-ns-openapi-3-1/src/elements/JsonSchemaDialect.ts b/apidom/packages/apidom-ns-openapi-3-1/src/elements/JsonSchemaDialect.ts new file mode 100644 index 0000000000..dca62b4e69 --- /dev/null +++ b/apidom/packages/apidom-ns-openapi-3-1/src/elements/JsonSchemaDialect.ts @@ -0,0 +1,12 @@ +import { Attributes, Meta, StringElement } from 'minim'; + +class JsonSchemaDialect extends StringElement { + static default = new JsonSchemaDialect('https://spec.openapis.org/oas/3.1/dialect/base'); + + constructor(content?: string, meta?: Meta, attributes?: Attributes) { + super(content, meta, attributes); + this.element = 'jsonSchemaDialect'; + } +} + +export default JsonSchemaDialect; diff --git a/apidom/packages/apidom-ns-openapi-3-1/src/index.ts b/apidom/packages/apidom-ns-openapi-3-1/src/index.ts index 7b74a2fbda..8f20d29b54 100644 --- a/apidom/packages/apidom-ns-openapi-3-1/src/index.ts +++ b/apidom/packages/apidom-ns-openapi-3-1/src/index.ts @@ -57,6 +57,7 @@ export { default as ComponentsElement } from './elements/Components'; export { default as ContactElement } from './elements/Contact'; export { default as ExternalDocumentationElement } from './elements/ExternalDocumentation'; export { default as InfoElement } from './elements/Info'; +export { default as JsonSchemaDialectVisitor } from './elements/JsonSchemaDialect'; export { default as LicenseElement } from './elements/License'; export { default as OpenapiElement } from './elements/Openapi'; export { default as OpenApi3_1Element } from './elements/OpenApi3-1'; diff --git a/apidom/packages/apidom-ns-openapi-3-1/src/namespace.ts b/apidom/packages/apidom-ns-openapi-3-1/src/namespace.ts index d8183c7b35..1671ac2b13 100644 --- a/apidom/packages/apidom-ns-openapi-3-1/src/namespace.ts +++ b/apidom/packages/apidom-ns-openapi-3-1/src/namespace.ts @@ -5,6 +5,7 @@ import ComponentsElement from './elements/Components'; import ContactElement from './elements/Contact'; import ExternalDocumentationElement from './elements/ExternalDocumentation'; import InfoElement from './elements/Info'; +import JsonSchemaDialectElement from './elements/JsonSchemaDialect'; import LicenseElement from './elements/License'; import OpenapiElement from './elements/Openapi'; import OpenApi3_1Element from './elements/OpenApi3-1'; @@ -31,6 +32,7 @@ const openApi3_1 = { base.register('contact', ContactElement); base.register('externalDocumentation', ExternalDocumentationElement); base.register('info', InfoElement); + base.register('jsonSchemaDialect', JsonSchemaDialectElement); base.register('license', LicenseElement); base.register('openapi', OpenapiElement); base.register('openApi3_1', OpenApi3_1Element); diff --git a/apidom/packages/apidom-ns-openapi-3-1/src/refractor/registration.ts b/apidom/packages/apidom-ns-openapi-3-1/src/refractor/registration.ts index fd7780816a..e19b7b5cfd 100644 --- a/apidom/packages/apidom-ns-openapi-3-1/src/refractor/registration.ts +++ b/apidom/packages/apidom-ns-openapi-3-1/src/refractor/registration.ts @@ -3,6 +3,7 @@ import ComponentsElement from '../elements/Components'; import ContactElement from '../elements/Contact'; import ExternalDocumentationElement from '../elements/ExternalDocumentation'; import InfoElement from '../elements/Info'; +import JsonSchemaDialectElement from '../elements/JsonSchemaDialect'; import LicenseElement from '../elements/License'; import OpenapiElement from '../elements/Openapi'; import OpenApi3_1Element from '../elements/OpenApi3-1'; @@ -50,6 +51,14 @@ ExternalDocumentationElement.refract = createRefractor([ '$visitor', ]); InfoElement.refract = createRefractor(['visitors', 'document', 'objects', 'Info', '$visitor']); +JsonSchemaDialectElement.refract = createRefractor([ + 'visitors', + 'document', + 'objects', + 'OpenApi', + 'fixedFields', + 'jsonSchemaDialect', +]); LicenseElement.refract = createRefractor([ 'visitors', 'document', diff --git a/apidom/packages/apidom-ns-openapi-3-1/src/refractor/specification.ts b/apidom/packages/apidom-ns-openapi-3-1/src/refractor/specification.ts index a911b95c71..2c5c920882 100644 --- a/apidom/packages/apidom-ns-openapi-3-1/src/refractor/specification.ts +++ b/apidom/packages/apidom-ns-openapi-3-1/src/refractor/specification.ts @@ -15,6 +15,7 @@ import LicenseVisitor from './visitors/open-api-3-1/license'; import LicenseNameVisitor from './visitors/open-api-3-1/license/NameVisitor'; import LicenseIdentifierVisitor from './visitors/open-api-3-1/license/IdentifierVisitor'; import LicenseUrlVisitor from './visitors/open-api-3-1/license/UrlVisitor'; +import JsonSchemaDialectVisitor from './visitors/open-api-3-1/JsonSchemaDialectVisitor'; import ServerVisitor from './visitors/open-api-3-1/server'; import ServerUrlVisitor from './visitors/open-api-3-1/server/UrlVisitor'; import ServerDescriptionVisitor from './visitors/open-api-3-1/server/DescriptionVisitor'; @@ -92,6 +93,7 @@ const specification = { info: { $ref: '#/visitors/document/objects/Info', }, + jsonSchemaDialect: JsonSchemaDialectVisitor, servers: ServersVisitor, paths: { $ref: '#/visitors/document/objects/Paths', diff --git a/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/JsonSchemaDialectVisitor.ts b/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/JsonSchemaDialectVisitor.ts new file mode 100644 index 0000000000..65b841f87d --- /dev/null +++ b/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/JsonSchemaDialectVisitor.ts @@ -0,0 +1,21 @@ +import stampit from 'stampit'; +import { StringElement, BREAK } from 'apidom'; + +import FallbackVisitor from '../FallbackVisitor'; +import SpecificationVisitor from '../SpecificationVisitor'; +import JsonSchemaDialectElement from '../../../elements/JsonSchemaDialect'; + +const JsonSchemaDialectVisitor = stampit(SpecificationVisitor, FallbackVisitor, { + methods: { + StringElement(stringElement: StringElement) { + const jsonSchemaDialectElement = new JsonSchemaDialectElement(stringElement.toValue()); + + this.copyMetaAndAttributes(stringElement, jsonSchemaDialectElement); + + this.element = jsonSchemaDialectElement; + return BREAK; + }, + }, +}); + +export default JsonSchemaDialectVisitor; diff --git a/apidom/packages/apidom-ns-openapi-3-1/src/traversal/visitor.ts b/apidom/packages/apidom-ns-openapi-3-1/src/traversal/visitor.ts index a7d05ff04b..da6edd10cc 100644 --- a/apidom/packages/apidom-ns-openapi-3-1/src/traversal/visitor.ts +++ b/apidom/packages/apidom-ns-openapi-3-1/src/traversal/visitor.ts @@ -15,6 +15,7 @@ export const keyMap = { ExternalDocumentationElement: ['content'], InfoElement: ['content'], LicenseElement: ['content'], + MediaTypeElement: ['content'], OpenApi3_1Element: ['content'], OperationElement: ['content'], ParameterElement: ['content'], @@ -28,6 +29,5 @@ export const keyMap = { SecurityRequirementElement: ['content'], ServerElement: ['content'], ServerVariableElement: ['content'], - MediaTypeElement: ['content'], ...keyMapBase, };