From 2a2c1143af655146442a03d361d6791edb653487 Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Wed, 7 Apr 2021 15:15:28 +0200 Subject: [PATCH 1/2] feat(ns-openapi-3-1): add Discriminator Object Refs #337 --- .../src/elements/Discriminator.ts | 26 +++++++++++++++++++ .../apidom-ns-openapi-3-1/src/index.ts | 1 + .../apidom-ns-openapi-3-1/src/namespace.ts | 2 ++ .../src/refractor/registration.ts | 8 ++++++ .../src/refractor/specification.ts | 10 +++++++ .../distriminator/MappingVisitor.ts | 19 ++++++++++++++ .../distriminator/PropertyNameVisitor.ts | 7 +++++ .../open-api-3-1/distriminator/index.ts | 18 +++++++++++++ .../src/traversal/visitor.ts | 1 + 9 files changed, 92 insertions(+) create mode 100644 apidom/packages/apidom-ns-openapi-3-1/src/elements/Discriminator.ts create mode 100644 apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/MappingVisitor.ts create mode 100644 apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/PropertyNameVisitor.ts create mode 100644 apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/index.ts diff --git a/apidom/packages/apidom-ns-openapi-3-1/src/elements/Discriminator.ts b/apidom/packages/apidom-ns-openapi-3-1/src/elements/Discriminator.ts new file mode 100644 index 0000000000..6d322fd6d5 --- /dev/null +++ b/apidom/packages/apidom-ns-openapi-3-1/src/elements/Discriminator.ts @@ -0,0 +1,26 @@ +import { Attributes, Meta, ObjectElement, StringElement } from 'minim'; + +class Discriminator extends ObjectElement { + constructor(content?: Record, meta?: Meta, attributes?: Attributes) { + super(content, meta, attributes); + this.element = 'discriminator'; + } + + get propertyName(): StringElement { + return this.get('propertyName'); + } + + set propertyName(propertyName: StringElement) { + this.set('propertyName', propertyName); + } + + get mapping(): ObjectElement { + return this.get('mapping'); + } + + set mapping(mapping: ObjectElement) { + this.set('mapping', mapping); + } +} + +export default Discriminator; 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 8f20d29b54..32564f8191 100644 --- a/apidom/packages/apidom-ns-openapi-3-1/src/index.ts +++ b/apidom/packages/apidom-ns-openapi-3-1/src/index.ts @@ -55,6 +55,7 @@ export { keyMap, getNodeType } from './traversal/visitor'; export { default as CallbackElement } from './elements/Callback'; export { default as ComponentsElement } from './elements/Components'; export { default as ContactElement } from './elements/Contact'; +export { default as DiscriminatorElement } from './elements/Discriminator'; export { default as ExternalDocumentationElement } from './elements/ExternalDocumentation'; export { default as InfoElement } from './elements/Info'; export { default as JsonSchemaDialectVisitor } from './elements/JsonSchemaDialect'; 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 1671ac2b13..c8e5d4006e 100644 --- a/apidom/packages/apidom-ns-openapi-3-1/src/namespace.ts +++ b/apidom/packages/apidom-ns-openapi-3-1/src/namespace.ts @@ -3,6 +3,7 @@ import { NamespacePluginOptions } from 'minim'; import CallbackElement from './elements/Callback'; import ComponentsElement from './elements/Components'; import ContactElement from './elements/Contact'; +import DiscriminatorElement from './elements/Discriminator'; import ExternalDocumentationElement from './elements/ExternalDocumentation'; import InfoElement from './elements/Info'; import JsonSchemaDialectElement from './elements/JsonSchemaDialect'; @@ -30,6 +31,7 @@ const openApi3_1 = { base.register('callback', CallbackElement); base.register('components', ComponentsElement); base.register('contact', ContactElement); + base.register('discriminator', DiscriminatorElement); base.register('externalDocumentation', ExternalDocumentationElement); base.register('info', InfoElement); base.register('jsonSchemaDialect', JsonSchemaDialectElement); 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 e19b7b5cfd..9351c108a2 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 @@ -1,6 +1,7 @@ import CallbackElement from '../elements/Callback'; import ComponentsElement from '../elements/Components'; import ContactElement from '../elements/Contact'; +import DiscriminatorElement from '../elements/Discriminator'; import ExternalDocumentationElement from '../elements/ExternalDocumentation'; import InfoElement from '../elements/Info'; import JsonSchemaDialectElement from '../elements/JsonSchemaDialect'; @@ -43,6 +44,13 @@ ContactElement.refract = createRefractor([ 'Contact', '$visitor', ]); +DiscriminatorElement.refract = createRefractor([ + 'visitors', + 'document', + 'objects', + 'Discriminator', + '$visitor', +]); ExternalDocumentationElement.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 2c5c920882..b870fc8224 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 @@ -44,6 +44,9 @@ import ParameterStyleVisitor from './visitors/open-api-3-1/parameter/StyleVisito import ParameterExplodeVisitor from './visitors/open-api-3-1/parameter/ExplodeVisitor'; import ParameterAllowReservedVisitor from './visitors/open-api-3-1/parameter/AllowReservedVisitor'; import SchemaVisitor from './visitors/open-api-3-1/schema'; +import DiscriminatorVisitor from './visitors/open-api-3-1/distriminator'; +import DiscriminatorPropertyNameVisitor from './visitors/open-api-3-1/distriminator/PropertyNameVisitor'; +import DiscriminatorMappingVisitor from './visitors/open-api-3-1/distriminator/MappingVisitor'; import ParameterExampleVisitor from './visitors/open-api-3-1/parameter/ExampleVisitor'; import ExamplesVisitor from './visitors/open-api-3-1/ExamplesVisitor'; import ContentVisitor from './visitors/open-api-3-1/ContentVisitor'; @@ -282,6 +285,13 @@ const specification = { Schema: { $visitor: SchemaVisitor, }, + Discriminator: { + $visitor: DiscriminatorVisitor, + fixedFields: { + propertyName: DiscriminatorPropertyNameVisitor, + mapping: DiscriminatorMappingVisitor, + }, + }, SecurityRequirement: { $visitor: SecurityRequirementVisitor, }, diff --git a/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/MappingVisitor.ts b/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/MappingVisitor.ts new file mode 100644 index 0000000000..139dea7a45 --- /dev/null +++ b/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/MappingVisitor.ts @@ -0,0 +1,19 @@ +import stampit from 'stampit'; +import { always } from 'ramda'; +import { ObjectElement } from 'apidom'; + +import MapVisitor from '../../generics/MapVisitor'; +import FallbackVisitor from '../../FallbackVisitor'; +import { appendMetadata } from '../../../metadata'; + +const MappingVisitor = stampit(MapVisitor, FallbackVisitor, { + props: { + specPath: always(['value']), + }, + init() { + this.element = new ObjectElement(); + appendMetadata(['mapping'], this.element); + }, +}); + +export default MappingVisitor; diff --git a/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/PropertyNameVisitor.ts b/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/PropertyNameVisitor.ts new file mode 100644 index 0000000000..1904d21058 --- /dev/null +++ b/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/PropertyNameVisitor.ts @@ -0,0 +1,7 @@ +import stampit from 'stampit'; + +import FallbackVisitor from '../../FallbackVisitor'; + +const PropertyNameVisitor = stampit(FallbackVisitor); + +export default PropertyNameVisitor; diff --git a/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/index.ts b/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/index.ts new file mode 100644 index 0000000000..94f3fc0565 --- /dev/null +++ b/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/index.ts @@ -0,0 +1,18 @@ +import stampit from 'stampit'; +import { always } from 'ramda'; + +import DiscriminatorElement from '../../../../elements/Discriminator'; +import FallbackVisitor from '../../FallbackVisitor'; +import FixedFieldsVisitor from '../../generics/FixedFieldsVisitor'; + +const DiscriminatorVisitor = stampit(FixedFieldsVisitor, FallbackVisitor, { + props: { + specPath: always(['document', 'objects', 'Contact']), + canSupportSpecificationExtensions: true, + }, + init() { + this.element = new DiscriminatorElement(); + }, +}); + +export default DiscriminatorVisitor; 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 da6edd10cc..2859dd9bef 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 @@ -12,6 +12,7 @@ export const keyMap = { CallbackElement: ['content'], ComponentsElement: ['content'], ContactElement: ['content'], + DiscriminatorElement: ['content'], ExternalDocumentationElement: ['content'], InfoElement: ['content'], LicenseElement: ['content'], From 548812b69e557e48a2ce91a26c3f8b98dd99e650 Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Wed, 7 Apr 2021 15:18:04 +0200 Subject: [PATCH 2/2] fix: object name --- .../src/refractor/visitors/open-api-3-1/distriminator/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/index.ts b/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/index.ts index 94f3fc0565..729cbbb03c 100644 --- a/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/index.ts +++ b/apidom/packages/apidom-ns-openapi-3-1/src/refractor/visitors/open-api-3-1/distriminator/index.ts @@ -7,7 +7,7 @@ import FixedFieldsVisitor from '../../generics/FixedFieldsVisitor'; const DiscriminatorVisitor = stampit(FixedFieldsVisitor, FallbackVisitor, { props: { - specPath: always(['document', 'objects', 'Contact']), + specPath: always(['document', 'objects', 'Discriminator']), canSupportSpecificationExtensions: true, }, init() {