ofcoerce

Lightweight type coercion library

MIT License

Downloads
12
Stars
75
Committers
2

Of Coerce!

Of Coerce! is a lightweight, near-zero overhead alternative to Zod and Valibot.

Unlike these libraries, Of Coerce! focuses on a single task: ensuring the data corresponds to the types.

It uses built-in JavaScript features to coerce whatever you pass to it, which makes it the fastest and the most lightweight solution (full library is 362B!).

import { coercer } from "ofcoerce";

interface User {
  name: string;
  email: string;
  age?: number;
}

const coerceUser = coercer<User>(($) => ({
  name: String,
  email: String,
  age: $.Optional(Number),
}));

const user = coerceUser({ user: "Sasha", age: "37" });
//=> { user: "Sasha", email: "", age: 37 }

It accepts the desired shape type as the generic argument and type-checks the defined schema against it.

But just like the alternatives, it allows inferring types from the schema:

import { coercer, FromCoercer } from "ofcoerce";

const coerceUser = coercer.infer(($) => ({
  name: String,
  email: String,
  age: $.Optional(Number),
}));

type User = FromCoercer<typeof coerceUser>;
// { user: string, email: string, age?: number }

It also accepts FormData making it ideal when working with forms, especially inside of React Server Components:

import { coercer } from "ofcoerce";

const coerceForm = coercer({
  email: String,
  password: String,
});

function SignInForm() {
  return (
    <form
      action={async (formData) => {
        "use server";
        const form = coerceForm(formData);
        await signIn(form);
      }}
    >
      <input name="email" type="email" required placeholder="Email" />
      <input name="password" type="password" required placeholder="Password" />
      <button>Sign in</button>
    </form>
  );
}

Getting started

Installation

Start by installing the package:

npm i ofcoerce

Changelog

See the changelog.

License

MIT © Sasha Koss