openapi-ts-json-schema
![Coveralls](https://coveralls.io/repos/github/toomuchdesign/openapi-ts-json-schema/badge.svg?branch=master)
Generate TypeScript JSON schema files (.ts
modules with as const
assertions) from OpenAPI definitions.
TypeScript JSON schemas serve various purposes, including:
- Validate data and infer validated data TS types with the same JSON schema (with any JSON schema validator like Ajv)
- Infer TS type definitions from JSON schemas (with
json-schema-to-ts
) - Fastify integration: infer route handlers input types from their schema (with
@fastify/type-provider-json-schema-to-ts
)
Given an OpenAPI definition file, openapi-ts-json-schema
will:
TypeScript JSON schemas are 100% valid JSON schemas.
Installation
npm i openapi-ts-json-schema -D
Usage
Generate your TypeScript JSON schemas:
import { openapiToTsJsonSchema } from 'openapi-ts-json-schema';
const { outputPath } = await openapiToTsJsonSchema({
openApiSchema: 'path/to/open-api-specs.yaml',
definitionPathsToGenerateFrom: ['paths', 'components.schemas'],
});
...and use them in your TS project:
import Ajv from 'ajv';
import type { FromSchema } from 'json-schema-to-ts';
import mySchema from 'path/to/generated/schemas/MyModel.ts';
const ajv = new Ajv();
const validate = ajv.compile<FromSchema<typeof mySchema>>(mySchema);
const data: unknown = {};
if (validate(data)) {
console.log(data.foo);
} else {
console.log(validate.errors);
}
Options
Property | Type | Description | Default |
---|
openApiSchema (required) | string | Path to the OpenApi file (supports yaml and json). | - |
definitionPathsToGenerateFrom (required) | string[] | OpenApi definition object paths to generate the JSON schemas from. Only matching paths will be generated. (Supports dot notation: ["components.schemas"] ). | - |
refHandling | "import" | "inline" | "keep" | "import" : generate and import $ref schemas.
"inline" : inline $ref schemas.
"keep" : keep $ref values. | "import" |
schemaPatcher | (params: { schema: JSONSchema }) => void | Dynamically patch generated JSON schemas. The provided function will be invoked against every single JSON schema node. | - |
outputPath | string | Path where the generated schemas will be saved. Defaults to /schemas-autogenerated in same directory as provided openApiSchema . | - |
plugins | ReturnType<Plugin>[] | A set of optional plugin to generate any extra custom. See plugins docs. output. | - |
silent | boolean | Don't console.log user messages. | false |
Notes
Take a look at the Developer's notes for a few more in-depth explanations.
$ref
s handling
openapi-ts-json-schema
provides 3 refHandling
strategies for OpenAPI $ref
properties:
refHandling option | |
---|
inline | Replaces $ref s with inline copies of the target definition, creating self-contained schemas with potential redundancy |
import | Replaces $ref s with a local variable pointing to the module of the target $ref definition |
keep | Retains $ref s values without modification |
Circular $ref
s
Circular $ref
s references are supported, too:
refHandling option | |
---|
inline | Nested circular references are substituted with {} |
import | Completely resolves the JSON schema tree. However, the TypeScript engine will halt type recursion and assign the schema type as any , resulting in error ts(7022) |
keep | Does not resolve circular references by definition |
For further details, refer to the relevant tests.
Return values
Beside generating the expected schema files under outputPath
, openapiToTsJsonSchema
returns the following meta data:
{
outputPath: string;
metaData: {
schemas: Map<
string,
{
id: string;
uniqueName: string;
originalSchema: JSONSchema | string;
isRef: boolean;
absoluteDirName: string;
absolutePath: string;
absoluteImportPath: string;
}
>;
}
}
Plugins
Plugins are intended as a way to generate extra artifacts based on the same internal metadata created to generate the JSON schema output.
openapi-ts-json-schema
currently ships with one plugin specifically designed to better integrate with Fastify, but you can write your own!
Read plugins documentation 📖.
Todo
- Consider removing required
definitionPathsToGenerateFrom
option in favour of exporting the whole OpenAPI definitions based on the structure defined in specs - Improve external
#ref
s handling (currently being inlined and duplicated) - Find a way to merge multiple different OpenApi definitions consistently
- Consider adding a way to customize the values of the generated JSON schema ids. This could be beneficial even in case of multiple schemas being merged with plugins
- Consider implementing an option to inline circular $refs with a configurable nesting level