Skip to content

toomuchdesign/ajv-type-provider-json-schema-to-ts

Repository files navigation

@toomuchdesign/ajv-type-provider-json-schema-to-ts

Build Status Npm version Coveralls

An ajv type provider based on json-schema-to-ts.

import Ajv from 'ajv';
import { enhanceCompileWithTypeInference } from '@toomuchdesign/ajv-type-provider-json-schema-to-ts';

const ajv = new Ajv();
const compile = enhanceCompileWithTypeInference(ajv.compile.bind(ajv));

const schema = {
  type: 'object',
  properties: {
    foo: { type: 'integer' },
    bar: { type: 'string' },
  },
  required: ['foo'],
  additionalProperties: false,
} as const;

const validate = compile(schema);
let data: unknown = { foo: 6 };

if (validate(data)) {
  // data type inferred from schema
  console.log('Validation ok', data);
} else {
  // validate is the usual AJV validate function
  console.log('Validation ko', validate.errors);
}

Installation

npm i @toomuchdesign/ajv-type-provider-json-schema-to-ts

API

enhanceCompileWithTypeInference

Enhance Ajv compile method with type inference:

import Ajv from 'ajv';
import { enhanceCompileWithTypeInference } from '@toomuchdesign/ajv-type-provider-json-schema-to-ts';

const ajv = new Ajv();
const compile = enhanceCompileWithTypeInference(ajv.compile.bind(ajv));

enhanceValidateWithTypeInference

Enhance Ajv validate method with type inference:

import Ajv from 'ajv';
import { enhanceValidateWithTypeInference } from '@toomuchdesign/ajv-type-provider-json-schema-to-ts';

const ajv = new Ajv();
const validate = enhanceValidateWithTypeInference(ajv.validate.bind(ajv));

Type provider options

enhanceCompileWithTypeInference and enhanceValidateWithTypeInference accept a json-schema-to-ts FromSchema option object to configure inferred types output:

const compile = enhanceCompileWithTypeInference<{ parseNotKeyword: true }>(
  ajv.compile.bind(ajv),
);

const validate = enhanceValidateWithTypeInference<{ parseNotKeyword: true }>(
  ajv.validate.bind(ajv),
);

references option can be used to resolve $ref schema types:

const userSchema = {
  $id: 'http://example.com/schemas/user.json',
  type: 'object',
  properties: {
    name: { type: 'string' },
    age: { type: 'integer' },
  },
  required: ['name', 'age'],
  additionalProperties: false,
} as const;

const usersSchema = {
  type: 'array',
  items: {
    $ref: 'http://example.com/schemas/user.json',
  },
} as const;

// Register ref schema in ajv
ajv.addSchema(userSchema);

const compile = enhanceCompileWithTypeInference<{
  // Register ref schema type provider
  references: [typeof userSchema];
}>(ajv.compile.bind(ajv));

const validate = compile(schema);

if (validate(data)) {
  // Inferred data with resolved $ref schemas
  const expectedData: { name: string; age: number }[] = data;
}

Developer notes

The current API is completely decoupled from Ajv. This means enhancing Ajv methods singularly, bypassing their original type implementation.

A different approach could consist of Ajv exposing a hook to provide external type inference implementation, as done with Fastify's type providers:

import Ajv from 'ajv';
import type { JsonSchemaToTsProvider } from '@toomuchdesign/ajv-type-provider-json-schema-to-ts';

const ajv = new Ajv();
const typedAjv = ajv.withTypeProvider<JsonSchemaToTsProvider>();

Contributing

Any contribution should be provided with a changesets update:

npx changeset

About

An AJV type provider based on json-schema-to-ts

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •