Valibot
About
Valibot is the open source schema library for TypeScript with bundle size, type safety and developer experience in mind.
The Valibot plugin for Hey API generates schemas from your OpenAPI spec, fully compatible with validators, transformers, and all core features.
Features
- Valibot v1 support
- seamless integration with
@hey-api/openapi-ts
ecosystem - Valibot schemas for requests, responses, and reusable definitions
Installation
In your configuration, add valibot
to your plugins and you'll be ready to generate Valibot artifacts. 🎉
export default {
input: 'https://get.heyapi.dev/hey-api/backend',
output: 'src/client',
plugins: [
// ...other plugins
'valibot',
],
};
SDKs
To add data validators to your SDKs, set sdk.validator
to true
.
export default {
input: 'https://get.heyapi.dev/hey-api/backend',
output: 'src/client',
plugins: [
// ...other plugins
'valibot',
{
name: '@hey-api/sdk',
validator: true,
},
],
};
Learn more about data validators in your SDKs on the SDKs page.
Output
The Valibot plugin will generate the following artifacts, depending on the input specification.
Requests
A single request schema is generated for each endpoint. It may contain a request body, parameters, and headers.
const vData = v.object({
body: v.optional(
v.object({
foo: v.optional(v.string()),
bar: v.optional(v.union([v.number(), v.null()])),
}),
),
path: v.object({
baz: v.string(),
}),
query: v.optional(v.never()),
});
export default {
input: 'https://get.heyapi.dev/hey-api/backend',
output: 'src/client',
plugins: [
// ...other plugins
{
name: 'valibot',
requests: true,
},
],
};
TIP
If you need to access individual fields, you can do so using the .entries
API. For example, we can get the request body schema with vData.entries.body
.
You can customize the naming and casing pattern for requests
schemas using the .name
and .case
options.
Responses
A single Valibot schema is generated for all endpoint's responses. If the endpoint describes multiple responses, the generated schema is a union of all possible response shapes.
const vResponse = v.union([
v.object({
foo: v.optional(v.string()),
}),
v.object({
bar: v.optional(v.number()),
}),
]);
export default {
input: 'https://get.heyapi.dev/hey-api/backend',
output: 'src/client',
plugins: [
// ...other plugins
{
name: 'valibot',
responses: true,
},
],
};
You can customize the naming and casing pattern for responses
schemas using the .name
and .case
options.
Definitions
A Valibot schema is generated for every reusable definition from your input.
const vFoo = v.pipe(v.number(), v.integer());
const vBar = v.object({
bar: v.optional(v.array(v.pipe(v.number(), v.integer()))),
});
export default {
input: 'https://get.heyapi.dev/hey-api/backend',
output: 'src/client',
plugins: [
// ...other plugins
{
name: 'valibot',
definitions: true,
},
],
};
You can customize the naming and casing pattern for definitions
schemas using the .name
and .case
options.
Metadata
It's often useful to associate a schema with some additional metadata for documentation, code generation, AI structured outputs, form validation, and other purposes. If this is your use case, you can set metadata
to true
to generate additional metadata about schemas.
export const vFoo = v.pipe(
v.string(),
v.metadata({
description: 'Additional metadata',
}),
);
export default {
input: 'https://get.heyapi.dev/hey-api/backend',
output: 'src/client',
plugins: [
// ...other plugins
{
name: 'valibot',
metadata: true,
},
],
};
API
You can view the complete list of options in the UserConfig interface.
Examples
You can view live examples on StackBlitz.
Sponsors
Help Hey API stay around for the long haul by becoming a sponsor.