diff --git a/src/schema-accessor.ts b/src/schema-accessor.ts index 88f79e6..edf6128 100644 --- a/src/schema-accessor.ts +++ b/src/schema-accessor.ts @@ -33,14 +33,24 @@ export class InternalSchemaBasedAccessor implements SchemaAccessor { return this.internalSchema; } + /** + * Get standard JSON Schema - as per + * https://json-schema.org/draft/2020-12/schema + */ async getStandardJsonSchema(options: Options = {}): Promise { return this.standardJSONSchema ??= await convertors.internalSchemaToStandard(this.internalSchema, options); } + /** + * Get MongoDB's $jsonSchema + */ async getMongoDBJsonSchema(options: Options = {}): Promise { return this.mongodbJSONSchema ??= await convertors.internalSchemaToMongoDB(this.internalSchema, options); } + /** + * Get expanded JSON Schema - with additional properties + */ async getExpandedJSONSchema(options: Options = {}): Promise { return this.ExpandedJSONSchema ??= await convertors.internalSchemaToExpanded(this.internalSchema, options); } diff --git a/src/schema-convertors/internalToMongoDB.ts b/src/schema-convertors/internalToMongoDB.ts index 0aaf952..5d6875b 100644 --- a/src/schema-convertors/internalToMongoDB.ts +++ b/src/schema-convertors/internalToMongoDB.ts @@ -1,7 +1,11 @@ +/** + * Transforms the internal schema to $jsonSchema + */ import { ArraySchemaType, DocumentSchemaType, Schema as InternalSchema, SchemaType } from '../schema-analyzer'; import { MongoDBJSONSchema } from '../types'; +import { allowAbort } from './util'; -const InternalTypeToBsonTypeMap: Record< +export const InternalTypeToBsonTypeMap: Record< SchemaType['name'] | 'Double' | 'BSONSymbol', string > = { @@ -36,15 +40,6 @@ const convertInternalType = (type: string) => { return bsonType; }; -async function allowAbort(signal?: AbortSignal) { - return new Promise((resolve, reject) => - setTimeout(() => { - if (signal?.aborted) return reject(signal?.reason || new Error('Operation aborted')); - resolve(); - }) - ); -} - async function parseType(type: SchemaType, signal?: AbortSignal): Promise { await allowAbort(signal); const schema: MongoDBJSONSchema = { diff --git a/src/schema-convertors/internalToStandard.test.ts b/src/schema-convertors/internalToStandard.test.ts index 4f08100..614c8bc 100644 --- a/src/schema-convertors/internalToStandard.test.ts +++ b/src/schema-convertors/internalToStandard.test.ts @@ -1,5 +1,5 @@ import assert from 'assert'; -import Ajv2020 from 'ajv'; +import Ajv2020 from 'ajv/dist/2020'; import internalSchemaToStandard, { RELAXED_EJSON_DEFINITIONS } from './internalToStandard'; describe('internalSchemaToStandard', async function() { diff --git a/src/schema-convertors/internalToStandard.ts b/src/schema-convertors/internalToStandard.ts index 049a7d2..ad86442 100644 --- a/src/schema-convertors/internalToStandard.ts +++ b/src/schema-convertors/internalToStandard.ts @@ -1,6 +1,7 @@ import { JSONSchema4TypeName } from 'json-schema'; import { ArraySchemaType, DocumentSchemaType, Schema as InternalSchema, SchemaType } from '../schema-analyzer'; import { StandardJSONSchema } from '../types'; +import { allowAbort } from './util'; type StandardTypeDefinition = { type: JSONSchema4TypeName, $ref?: never; } | { $ref: string, type?: never }; @@ -246,15 +247,6 @@ const convertInternalType = (internalType: string) => { return type; }; -async function allowAbort(signal?: AbortSignal) { - return new Promise((resolve, reject) => - setTimeout(() => { - if (signal?.aborted) return reject(signal?.reason || new Error('Operation aborted')); - resolve(); - }) - ); -} - async function parseType(type: SchemaType, signal?: AbortSignal): Promise { await allowAbort(signal); const schema: StandardJSONSchema = convertInternalType(type.bsonType); diff --git a/src/schema-convertors/util.ts b/src/schema-convertors/util.ts new file mode 100644 index 0000000..941ceee --- /dev/null +++ b/src/schema-convertors/util.ts @@ -0,0 +1,8 @@ +export async function allowAbort(signal?: AbortSignal) { + return new Promise((resolve, reject) => + setTimeout(() => { + if (signal?.aborted) return reject(signal?.reason || new Error('Operation aborted')); + resolve(); + }) + ); +}