diff --git a/src/vine/validator.ts b/src/vine/validator.ts index 1608f19..7cc5442 100644 --- a/src/vine/validator.ts +++ b/src/vine/validator.ts @@ -8,7 +8,7 @@ */ import { Compiler, refsBuilder } from '@vinejs/compiler' -import type { StandardSchemaV1 } from '@standard-schema/spec' +import type { StandardJSONSchemaV1, StandardSchemaV1 } from '@standard-schema/spec' import type { MessagesProviderContact, Refs, RootNode } from '@vinejs/compiler/types' import { messages } from '../defaults.js' @@ -254,9 +254,20 @@ export class VineValidator< return this.#jsonSchema } - readonly '~standard': StandardSchemaV1.Props = { + readonly '~standard': StandardSchemaV1.Props & + StandardJSONSchemaV1.Props = { version: 1, vendor: 'vinejs', + + jsonSchema: { + input: () => { + return this.toJSONSchema() as Record + }, + output: () => { + throw new Error('Vine.js does not support creating validators using JSON Schema.') + }, + }, + validate: async (data: unknown) => { const [error, result] = await this.tryValidate(data, {} as any) if (result) { diff --git a/tests/integration/json_schema.spec.ts b/tests/integration/json_schema.spec.ts index bea4129..c20c56c 100644 --- a/tests/integration/json_schema.spec.ts +++ b/tests/integration/json_schema.spec.ts @@ -3,6 +3,7 @@ import vine from '../../index.js' import Ajv from 'ajv' import { type SchemaTypes } from '../../src/types.js' import { inspect } from 'node:util' +import { type StandardJSONSchemaV1 } from '@standard-schema/spec' const ajv = new Ajv() @@ -669,3 +670,42 @@ test.group('JsonSchema', () => { }) .tags(['@literal']) }) + +test.group('JsonSchema | StandardJsonSchema', () => { + test('should respect StandardJSONSchemaV1 type', ({ expectTypeOf }) => { + const validator = vine.create({ + name: vine.string(), + email: vine.string().email(), + }) + + expectTypeOf(validator) + }) + + test('convert to json-schema as per standard schema spec', ({ assert }) => { + const validator = vine.create({ + name: vine.string(), + email: vine.string().email(), + }) + + const result = validator['~standard'].jsonSchema.input({ target: 'draft-2020-12' }) + + assert.deepEqual(result, { + type: 'object', + properties: { + name: { type: 'string' }, + email: { type: 'string', format: 'email' }, + }, + additionalProperties: false, + required: ['name', 'email'], + }) + }) + + test('convert from json-schema as per standard schema spec should throw', ({ assert }) => { + const validator = vine.create({ + name: vine.string(), + email: vine.string().email(), + }) + + assert.throws(() => validator['~standard'].jsonSchema.output({ target: 'draft-2020-12' })) + }) +})