TypeSchema
✨ https://typeschema.com ✨
Universal adapter for schema validation
Setup
•
API
•
Coverage
•
GitHub
•
npm
•
Deno
Many libraries rely on some sort of type validation. Their maintainers have the choice of either to:
- Implement their own validation logic: which leads to more code to maintain, and we already have many good solutions out there (e.g.
zod
, arktype
, typia
) - Couple their code with a specific validation library: which limits adoption by developers who use another
- Support multiple validation libraries: which is a burden to keep up-to-date (e.g. tRPC)
There's no best validation library because there's always a tradeoff. Each developer chooses the library that makes the most sense to them. TypeSchema solves this problem by easily providing option 3: support multiple validation libraries out-of-the-box.
Features
- 🚀 Decouple from schema validation libraries
- 🍃 Tiny client footprint, tree-shakeable
- 🛋️ Easy-to-use, minimal API
Usage
import type {Infer, InferIn, Schema} from '@decs/typeschema';
import {assert, validate, wrap} from '@decs/typeschema';
const schema: Schema = z.string();
const schema: Schema = type('string');
const schema: Schema = typia.createAssert<string>();
type Output = Infer<typeof schema>;
type Input = InferIn<typeof schema>;
const wrapped = wrap(schema);
await wrapped.validate('123');
await wrapped.assert('123');
await validate(schema, '123');
await validate(schema, 123);
await assert(schema, '123');
await assert(schema, 123);
tRPC
You can use any supported schema on tRPC through the wrap
function:
import {wrap} from '@decs/typeschema';
import {initTRPC} from '@trpc/server';
import {object, string} from 'valibot';
const schema = object({name: string()});
const t = initTRPC.create();
const appRouter = t.router({
hello: t.procedure
.input(wrap(schema))
.query(({input}) => `Hello, ${input.name}!`),
});
Coverage
TypeSchema supports all major schema validation libraries:
Custom validations are also supported:
export function assertString(data: unknown): string {
if (typeof data !== 'string') {
throw new Error('Expected a string, got: ' + data);
}
return data;
}
await validate(assertString, '123');
await validate(assertString, 123);
await assert(assertString, '123');
await assert(assertString, 123);
Setup
Install TypeSchema with your package manager of choice:
npm | npm install @decs/typeschema |
---|
Yarn | yarn add @decs/typeschema |
---|
pnpm | pnpm add @decs/typeschema |
---|
Deno | https://deno.land/x/typeschema |
---|
API
Types
-
Schema
Generic interface for schemas
An union of the schema types of all supported libraries
-
TypeSchema<TOutput, TInput = TOutput>
Interface for a wrapped schema, exposing all its operations
-
Infer<TSchema extends Schema>
Extracts the output type of a schema
-
InferIn<TSchema extends Schema>
Extracts the input type of a schema
-
ValidationIssue
Generic interface for validation issues
Includes a message
and an optional path
Functions
-
wrap(schema)
wrap<TSchema extends Schema>(
schema: TSchema,
): TypeSchema<Infer<TSchema>, InferIn<TSchema>>
Returns the wrapped schema with access to all its operations
-
validate(schema, data)
validate<TSchema extends Schema>(
schema: TSchema,
data: unknown,
): Promise<ValidationResult<Infer<TSchema>>>
Returns the validated data or a list of ValidationIssue
s
-
assert(schema, data)
assert<TSchema extends Schema>(
schema: TSchema,
data: unknown,
): Promise<Infer<TSchema>>
Returns the validated data or throws an AggregateError
Acknowledgements