Skip to content

Commit

Permalink
feat(ns-json-schema-draft-7): handle inheritance of $schema and $id (#…
Browse files Browse the repository at this point in the history
glowcloud authored Jan 17, 2025
1 parent 86ddd8b commit a4fbd7b
Showing 5 changed files with 185 additions and 22 deletions.
6 changes: 2 additions & 4 deletions packages/apidom-ns-json-schema-draft-6/src/index.ts
Original file line number Diff line number Diff line change
@@ -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,
6 changes: 2 additions & 4 deletions packages/apidom-ns-json-schema-draft-7/src/index.ts
Original file line number Diff line number Diff line change
@@ -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,
Original file line number Diff line number Diff line change
@@ -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;
Original file line number Diff line number Diff line change
@@ -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"
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -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",

0 comments on commit a4fbd7b

Please sign in to comment.