Skip to main content
Home

Built and signed on GitHub Actions

A tiny (359b) utility to build JSON schema types.

This package works with Cloudflare Workers, Node.js, Deno, Bun, Browsers
This package works with Cloudflare Workers
This package works with Node.js
This package works with Deno
This package works with Bun
This package works with Browsers
JSR Score
100%
Published
a year ago (3.2.0)

tschema CI licenses

A tiny (500b) utility to build JSON schema types.

Install

This package is compatible with all JavaScript runtimes and is available on multiple registries:

Usage

import * as t from 'tschema';

// Define JSON object schema
let User = t.object({
  uid: t.integer(),
  name: t.string({
    description: 'full name',
    examples: ['Alex Johnson'],
  }),
  isActive: t.boolean(),
  avatar: t.optional(
    t.string({ format: 'uri' }),
  ),
  achievements: t.tuple([
    t.number({ minimum: 0 }), // points
    t.enum(['novice', 'pro', 'expert', 'master']),
  ]),
  interests: t.array(
    t.string({
      minLength: 4,
      maxLength: 36,
    }),
  ),
  last_updated: t.integer({
    minimum: 0,
    examples: [1722642982],
    description: 'unix seconds',
  }),
}, {
  description: 'a User record',
});

// Infer its TypeScript definition:
// NOTE: names do not have to match~!
type User = t.Infer<typeof User>;
//-> {
//->   uid: number;
//->   name: string;
//->   isActive: boolean;
//->   avatar?: string | undefined;
//->   achievements: [number, "novice" | "pro" | "expert" | "master"];
//->   interests: string[];
//->   last_updated: number;
//-> }

console.log(User);
//-> {
//->   type: "object",
//->   description: "a User record",
//->   additionalProperties: false,
//->   properties: {
//->     uid: {
//->       type: "integer"
//->     },
//->     name: {
//->       type: "string",
//->       description: "full name",
//->       examples: ["Alex Johnson"]
//->     },
//->     isActive: {
//->       type: "boolean"
//->     },
//->     avatar: {
//->       type: "string",
//->       format: "uri"
//->     },
//->     achievements: {
//->       type: "array",
//->       prefixItems: [{
//->         type: "number",
//->         minimum: 0
//->       }, {
//->         enum: ["novice", "pro", "expert", "master"]
//->       }],
//->       minItems: 2,
//->       maxItems: 2
//->     },
//->     interests: {
//->       type: "array",
//->       items: {
//->         type: "string",
//->         minLength: 4,
//->         maxLength: 36
//->       }
//->     },
//->     last_updated: {
//->       type: "integer",
//->       minimum: 0,
//->       examples: [1722642982],
//->       description: "unix seconds"
//->     }
//->   },
//->   required: [
//->     "uid",
//->     "name",
//->     "isActive",
//->     "achievements",
//->     "interests",
//->     "last_updated"
//->   ]
//-> }

API

Please refer to the generated API documentation, as it's always kept up-to-date.

Note: The API is the same across all JavaScript runtimes, regardless of installation source. Only the package's name changes.

Benchmarks

Run on Deno 1.45.5 (release, aarch64-apple-darwin) with v8 12.7.224.13

file: tschema/scripts/bench.ts
runtime: deno 1.45.5 (aarch64-apple-darwin)

# Builders
  tschema              5,328,603.3 iter/sec     187.67 ns/iter
  sinclair/typebox       130,480.2 iter/sec       7.66 µs/iter
  zod-to-json-schema      46,928.5 iter/sec      21.31 µs/iter

# Summary
  tschema
    40.84x faster than sinclair/typebox
   113.55x faster than zod-to-json-schema

License

MIT © Luke Edwards

Built and signed on
GitHub Actions

New Ticket: Report package

Please provide a reason for reporting this package. We will review your report and take appropriate action.

Please review the JSR usage policy before submitting a report.

Add Package

deno add jsr:@lukeed/tschema

Import symbol

import * as tschema from "@lukeed/tschema";
or

Import directly with a jsr specifier

import * as tschema from "jsr:@lukeed/tschema";

Add Package

pnpm i jsr:@lukeed/tschema
or (using pnpm 10.8 or older)
pnpm dlx jsr add @lukeed/tschema

Import symbol

import * as tschema from "@lukeed/tschema";

Add Package

yarn add jsr:@lukeed/tschema
or (using Yarn 4.8 or older)
yarn dlx jsr add @lukeed/tschema

Import symbol

import * as tschema from "@lukeed/tschema";

Add Package

vlt install jsr:@lukeed/tschema

Import symbol

import * as tschema from "@lukeed/tschema";

Add Package

npx jsr add @lukeed/tschema

Import symbol

import * as tschema from "@lukeed/tschema";

Add Package

bunx jsr add @lukeed/tschema

Import symbol

import * as tschema from "@lukeed/tschema";