From a4fbd7b962fb5af752cff521eeb19b318a974c46 Mon Sep 17 00:00:00 2001 From: Oliwia Rogala Date: Fri, 17 Jan 2025 15:22:10 +0100 Subject: [PATCH] feat(ns-json-schema-draft-7): handle inheritance of $schema and $id (#4659) Refs #1819 --- .../src/index.ts | 6 +- .../src/index.ts | 6 +- .../refractor/visitors/json-schema/index.ts | 32 +++- .../refractor/__snapshots__/index.mjs.snap | 154 ++++++++++++++++-- .../JSONSchema/__snapshots__/index.mjs.snap | 9 + 5 files changed, 185 insertions(+), 22 deletions(-) diff --git a/packages/apidom-ns-json-schema-draft-6/src/index.ts b/packages/apidom-ns-json-schema-draft-6/src/index.ts index 0db55c07a5..07b9672b0b 100644 --- a/packages/apidom-ns-json-schema-draft-6/src/index.ts +++ b/packages/apidom-ns-json-schema-draft-6/src/index.ts @@ -73,10 +73,8 @@ export type { default as LinkDescriptionVisitor, LinkDescriptionVisitorOptions, } from './refractor/visitors/json-schema/link-description/index.ts'; -export type { - default as JSONSchemaVisitor, - JSONSchemaVisitorOptions, -} from './refractor/visitors/json-schema/index.ts'; +export { default as JSONSchemaVisitor } from './refractor/visitors/json-schema/index.ts'; +export type { JSONSchemaVisitorOptions } from './refractor/visitors/json-schema/index.ts'; export type { default as ExamplesVisitor, ExamplesVisitorOptions, diff --git a/packages/apidom-ns-json-schema-draft-7/src/index.ts b/packages/apidom-ns-json-schema-draft-7/src/index.ts index f1b363488e..15bb05106e 100644 --- a/packages/apidom-ns-json-schema-draft-7/src/index.ts +++ b/packages/apidom-ns-json-schema-draft-7/src/index.ts @@ -69,10 +69,8 @@ export type { JSONSchemaDraft4ItemsVisitor, } from '@swagger-api/apidom-ns-json-schema-draft-6'; -export type { - default as JSONSchemaVisitor, - JSONSchemaVisitorOptions, -} from './refractor/visitors/json-schema/index.ts'; +export { default as JSONSchemaVisitor } from './refractor/visitors/json-schema/index.ts'; +export type { JSONSchemaVisitorOptions } from './refractor/visitors/json-schema/index.ts'; export type { default as LinkDescriptionVisitor, LinkDescriptionVisitorOptions, diff --git a/packages/apidom-ns-json-schema-draft-7/src/refractor/visitors/json-schema/index.ts b/packages/apidom-ns-json-schema-draft-7/src/refractor/visitors/json-schema/index.ts index a173b9b679..4549ab67f4 100644 --- a/packages/apidom-ns-json-schema-draft-7/src/refractor/visitors/json-schema/index.ts +++ b/packages/apidom-ns-json-schema-draft-7/src/refractor/visitors/json-schema/index.ts @@ -4,9 +4,12 @@ import { ObjectElement, BooleanElement } from '@swagger-api/apidom-core'; import { FixedFieldsVisitor, FixedFieldsVisitorOptions, + ParentSchemaAwareVisitor, + ParentSchemaAwareVisitorOptions, FallbackVisitor, FallbackVisitorOptions, SpecPath, + JSONSchemaVisitor as JSONSchemaDraft6Visitor, } from '@swagger-api/apidom-ns-json-schema-draft-6'; import JSONSchemaElement from '../../../elements/JSONSchema.ts'; @@ -16,12 +19,17 @@ import JSONSchemaElement from '../../../elements/JSONSchema.ts'; */ export interface JSONSchemaVisitorOptions extends FixedFieldsVisitorOptions, + ParentSchemaAwareVisitorOptions, FallbackVisitorOptions {} /** * @public */ -class JSONSchemaVisitor extends Mixin(FixedFieldsVisitor, FallbackVisitor) { +class JSONSchemaVisitor extends Mixin( + FixedFieldsVisitor, + ParentSchemaAwareVisitor, + FallbackVisitor, +) { declare public element: JSONSchemaElement; declare protected readonly specPath: SpecPath<['document', 'objects', 'JSONSchema']>; @@ -31,8 +39,18 @@ class JSONSchemaVisitor extends Mixin(FixedFieldsVisitor, FallbackVisitor) { this.specPath = always(['document', 'objects', 'JSONSchema']); } + // eslint-disable-next-line class-methods-use-this + get defaultDialectIdentifier(): string { + return 'http://json-schema.org/draft-07/schema#'; + } + ObjectElement(objectElement: ObjectElement) { this.element = new JSONSchemaElement(); + this.handleDialectIdentifier(objectElement); + this.handleSchemaIdentifier(objectElement); + + // for further processing consider this Schema Element as parent for all embedded Schema Elements + this.parent = this.element; return FixedFieldsVisitor.prototype.ObjectElement.call(this, objectElement); } @@ -43,6 +61,18 @@ class JSONSchemaVisitor extends Mixin(FixedFieldsVisitor, FallbackVisitor) { return result; } + + handleDialectIdentifier(objectElement: ObjectElement): void { + return JSONSchemaDraft6Visitor.prototype.handleDialectIdentifier.call(this, objectElement); + } + + handleSchemaIdentifier(objectElement: ObjectElement, identifierKeyword: string = '$id'): void { + return JSONSchemaDraft6Visitor.prototype.handleSchemaIdentifier.call( + this, + objectElement, + identifierKeyword, + ); + } } export default JSONSchemaVisitor; diff --git a/packages/apidom-ns-json-schema-draft-7/test/refractor/__snapshots__/index.mjs.snap b/packages/apidom-ns-json-schema-draft-7/test/refractor/__snapshots__/index.mjs.snap index 3ed27edc1b..cbbc8dc12e 100644 --- a/packages/apidom-ns-json-schema-draft-7/test/refractor/__snapshots__/index.mjs.snap +++ b/packages/apidom-ns-json-schema-draft-7/test/refractor/__snapshots__/index.mjs.snap @@ -3,6 +3,17 @@ exports[`refractor given generic ApiDOM object in JSON Schema Draft 7 shape should refract to JSONSchema Element 1`] = ` { "element": "JSONSchemaDraft7", + "meta": { + "ancestorsSchemaIdentifiers": { + "element": "array", + "content": [ + { + "element": "string", + "content": "http://x.y.z/rootschema.json#" + } + ] + } + }, "content": [ { "element": "member", @@ -263,7 +274,16 @@ exports[`refractor given generic ApiDOM object in JSON Schema Draft 7 shape shou "content": "additionalItems" }, "value": { - "element": "JSONSchemaDraft7" + "element": "JSONSchemaDraft7", + "meta": { + "inheritedDialectIdentifier": { + "element": "string", + "content": "http://json-schema.org/draft-07/schema#" + }, + "ancestorsSchemaIdentifiers": { + "element": "array" + } + } } } }, @@ -300,7 +320,16 @@ exports[`refractor given generic ApiDOM object in JSON Schema Draft 7 shape shou }, "content": [ { - "element": "JSONSchemaDraft7" + "element": "JSONSchemaDraft7", + "meta": { + "inheritedDialectIdentifier": { + "element": "string", + "content": "http://json-schema.org/draft-07/schema#" + }, + "ancestorsSchemaIdentifiers": { + "element": "array" + } + } } ] } @@ -397,7 +426,16 @@ exports[`refractor given generic ApiDOM object in JSON Schema Draft 7 shape shou "content": "contains" }, "value": { - "element": "JSONSchemaDraft7" + "element": "JSONSchemaDraft7", + "meta": { + "inheritedDialectIdentifier": { + "element": "string", + "content": "http://json-schema.org/draft-07/schema#" + }, + "ancestorsSchemaIdentifiers": { + "element": "array" + } + } } } }, @@ -544,7 +582,16 @@ exports[`refractor given generic ApiDOM object in JSON Schema Draft 7 shape shou "content": "prop1" }, "value": { - "element": "JSONSchemaDraft7" + "element": "JSONSchemaDraft7", + "meta": { + "inheritedDialectIdentifier": { + "element": "string", + "content": "http://json-schema.org/draft-07/schema#" + }, + "ancestorsSchemaIdentifiers": { + "element": "array" + } + } } } } @@ -571,7 +618,16 @@ exports[`refractor given generic ApiDOM object in JSON Schema Draft 7 shape shou "content": "additionalProperties" }, "value": { - "element": "JSONSchemaDraft7" + "element": "JSONSchemaDraft7", + "meta": { + "inheritedDialectIdentifier": { + "element": "string", + "content": "http://json-schema.org/draft-07/schema#" + }, + "ancestorsSchemaIdentifiers": { + "element": "array" + } + } } } }, @@ -626,7 +682,16 @@ exports[`refractor given generic ApiDOM object in JSON Schema Draft 7 shape shou "content": "[a-z]+" }, "value": { - "element": "JSONSchemaDraft7" + "element": "JSONSchemaDraft7", + "meta": { + "inheritedDialectIdentifier": { + "element": "string", + "content": "http://json-schema.org/draft-07/schema#" + }, + "ancestorsSchemaIdentifiers": { + "element": "array" + } + } } } } @@ -685,7 +750,16 @@ exports[`refractor given generic ApiDOM object in JSON Schema Draft 7 shape shou "content": "dep1" }, "value": { - "element": "JSONSchemaDraft7" + "element": "JSONSchemaDraft7", + "meta": { + "inheritedDialectIdentifier": { + "element": "string", + "content": "http://json-schema.org/draft-07/schema#" + }, + "ancestorsSchemaIdentifiers": { + "element": "array" + } + } } } } @@ -712,7 +786,16 @@ exports[`refractor given generic ApiDOM object in JSON Schema Draft 7 shape shou "content": "propertyNames" }, "value": { - "element": "JSONSchemaDraft7" + "element": "JSONSchemaDraft7", + "meta": { + "inheritedDialectIdentifier": { + "element": "string", + "content": "http://json-schema.org/draft-07/schema#" + }, + "ancestorsSchemaIdentifiers": { + "element": "array" + } + } } } }, @@ -856,7 +939,16 @@ exports[`refractor given generic ApiDOM object in JSON Schema Draft 7 shape shou }, "content": [ { - "element": "JSONSchemaDraft7" + "element": "JSONSchemaDraft7", + "meta": { + "inheritedDialectIdentifier": { + "element": "string", + "content": "http://json-schema.org/draft-07/schema#" + }, + "ancestorsSchemaIdentifiers": { + "element": "array" + } + } } ] } @@ -895,7 +987,16 @@ exports[`refractor given generic ApiDOM object in JSON Schema Draft 7 shape shou }, "content": [ { - "element": "JSONSchemaDraft7" + "element": "JSONSchemaDraft7", + "meta": { + "inheritedDialectIdentifier": { + "element": "string", + "content": "http://json-schema.org/draft-07/schema#" + }, + "ancestorsSchemaIdentifiers": { + "element": "array" + } + } } ] } @@ -934,7 +1035,16 @@ exports[`refractor given generic ApiDOM object in JSON Schema Draft 7 shape shou }, "content": [ { - "element": "JSONSchemaDraft7" + "element": "JSONSchemaDraft7", + "meta": { + "inheritedDialectIdentifier": { + "element": "string", + "content": "http://json-schema.org/draft-07/schema#" + }, + "ancestorsSchemaIdentifiers": { + "element": "array" + } + } } ] } @@ -959,7 +1069,16 @@ exports[`refractor given generic ApiDOM object in JSON Schema Draft 7 shape shou "content": "not" }, "value": { - "element": "JSONSchemaDraft7" + "element": "JSONSchemaDraft7", + "meta": { + "inheritedDialectIdentifier": { + "element": "string", + "content": "http://json-schema.org/draft-07/schema#" + }, + "ancestorsSchemaIdentifiers": { + "element": "array" + } + } } } }, @@ -1014,7 +1133,16 @@ exports[`refractor given generic ApiDOM object in JSON Schema Draft 7 shape shou "content": "def1" }, "value": { - "element": "JSONSchemaDraft7" + "element": "JSONSchemaDraft7", + "meta": { + "inheritedDialectIdentifier": { + "element": "string", + "content": "http://json-schema.org/draft-07/schema#" + }, + "ancestorsSchemaIdentifiers": { + "element": "array" + } + } } } } diff --git a/packages/apidom-ns-json-schema-draft-7/test/refractor/elements/JSONSchema/__snapshots__/index.mjs.snap b/packages/apidom-ns-json-schema-draft-7/test/refractor/elements/JSONSchema/__snapshots__/index.mjs.snap index 14a4df5694..a51bfca896 100644 --- a/packages/apidom-ns-json-schema-draft-7/test/refractor/elements/JSONSchema/__snapshots__/index.mjs.snap +++ b/packages/apidom-ns-json-schema-draft-7/test/refractor/elements/JSONSchema/__snapshots__/index.mjs.snap @@ -3,6 +3,15 @@ exports[`refractor elements Boolean JSON Schema support should refract to semantic ApiDOM tree 1`] = ` { "element": "JSONSchemaDraft7", + "meta": { + "inheritedDialectIdentifier": { + "element": "string", + "content": "http://json-schema.org/draft-07/schema#" + }, + "ancestorsSchemaIdentifiers": { + "element": "array" + } + }, "content": [ { "element": "member",