0.0.8 • Published 22 days ago

desy v0.0.8

Weekly downloads
-
License
MIT
Repository
-
Last release
22 days ago

desy - Dead Extraordinary Simple Yup

Install

npm install desy

Basic usage

Creating a simple string schema

import {d} from 'desy';

// creating a schema for strings
const mySchema = d.string();

// validating
mySchema.validate('tuna'); // => ""
mySchema.validate(12); // => "Value must be string"

Key ideas

  • be simple
  • be as fast as point 1 allows

Key features

  • Stop validating on the first error. Desy stops validating on the first error and returns it.
  • A string is an indicator. Desy returns an empty string in a valid case. In case of an error, Desy returns a string with a description of the error.
  • No throwing errors. Desy only returns an empty or non-empty string.

Examples

Deep schema

const schema = d.array(
  d.object({
    type: d.string().oneOf(['person']),
    hair: d.string().oneOf(['blue', 'brown']),
    active: d.boolean(),
    name: d.string(),
    age: d.number().int(),
    hobbies: d.array(d.string()),
    address: d.object({
      street: d.string(),
      zip: d.string(),
      country: d.string(),
    }),
  }),
);
schema.validate(people);

Get schema's types

import {d, InferDesy} from 'desy';

const userSchema = d.object({
  username: d.string(),
});

const error = userSchema.validate({username: 'Ludwig'}); // error is ""

// extract the inferred type
type User = InferDesy<typeof user>; // { username: string }

API

Common

  • validate(value: any)
const schema = d.mixed();

schema.validate('a'); // valid
schema.validate(''); // valid
schema.validate(null); // valid
  • .test(func: (value: sting) => string)
const schema = d.mixed().test((value) => {
  if (value === 'world') {
    return ''; // valid case
  }

  return 'MUST BE WORLD'; // error message
});

schema.validate('hello'); // error
schema.validate('world'); // valid

mixed

  • mixed()
const schema = d.mixed();

schema.validate('a'); // valid
schema.validate(''); // valid
schema.validate(null); // valid

string

  • .string()
const schema = d.string();

schema.validate('a'); // valid
schema.validate(''); // error
schema.validate(null); // error
  • .length(chars)
const schema = d.string().length(1);

schema.validate('aa'); // error
schema.validate('a'); // valid
  • .optional()
const schema = d.string().optional();

schema.validate(''); // valid
schema.validate('a'); // valid
  • .oneOf(variants: string[])
const schema = d.string().oneOf(['hello', 'world']);

schema.validate('hello'); // valid
schema.validate('world'); // valid
schema.validate('foo'); // error
  • .regexp(regexp: Regexp)
const schema = d.string().regexp(/hello/i);

schema.validate('123hello'); // valid
schema.validate('hell'); // error
  • .min(min_chars: number)
const schema = d.string().min(1);

schema.validate(''); // error
schema.validate('a'); // valid
  • .max(max_chars: number)
const schema = d.string().max(1);

schema.validate('aa'); // error
schema.validate('a'); // valid

number

  • .number()
const schema = d.number();

schema.validate(42); // valid
schema.validate('42'); // error
  • .int()
const schema = d.number().int();

schema.validate(42); // valid
schema.validate(42.2); // error
  • .float()
const schema = d.number().float();

schema.validate(42); // error
schema.validate(42.2); // valid
  • .min(num: number)
const schema = d.number().min(1);

schema.validate(0); // error
schema.validate(1); // valid
  • .max(num: number)
const schema = d.number().max(1);

schema.validate(1); // valid
schema.validate(2); // error

boolean

  • .boolean()
const schema = d.boolean();

schema.validate(true); // valid
schema.validate(false); // valid
schema.validate(1); // error
  • .true()
const schema = d.boolean().true();

schema.validate(true); // valid
schema.validate(false); // error
  • .false()
const schema = d.boolean().false();

schema.validate(true); // error
schema.validate(false); // valid

date

  • .date()
const schema = d.date();

schema.validate(0); // valid
schema.validate('2024-03-15T23:21:48.605Z'); // valid
schema.validate(new Date()); // valid
schema.validate(undefined); // error
  • .min(date: DateValue)
const now = Date.now();
const schema = d.date().min(now);

schema.validate(now); // valid
schema.validate(now - 1); // error
  • .max(date: DateValue)
const now = Date.now();
const schema = d.date().max(now);

schema.validate(now); // valid
schema.validate(now + 1); // error

null

  • .null()
const schema = d.null();

schema.validate(null); // valid
schema.validate(undefined); // error

object

  • .object(objschema: Record<string, Schema>)
const schema = d.object({
  name: d.sting(),
});

schema.validate({name: 'alex'}); // valid
schema.validate({name: 'alex', age: 42}); // error
schema.validate({name: 42}); // error
  • .notStrict()
const schema = d
  .object({
    name: d.sting(),
  })
  .notStrict();

schema.validate({name: 'alex'}); // valid
schema.validate({name: 'alex', age: 42}); // valid
schema.validate({name: 42}); // error
  • .optionalFields(fileds: string[])
const schema = d
  .object({
    name: d.sting(),
  })
  .optionalFields(['name']);

schema.validate({name: 'alex'}); // valid
schema.validate({}); // valid
schema.validate({name: 42}); // error

array

  • .array(schemas: Schema[])
const schema = d.arrar(d.sting());

schema.validate(['hello', 'world']); // valid
schema.validate(['hello', 42]); // error
  • .length(length: number)
const schema = d.arrar(d.sting()).length(2);

schema.validate(['hello', 'world']); // valid
schema.validate(['world']); // error
  • .min(min_length: number)
const schema = d.arrar(d.sting()).min(2);

schema.validate(['hello', 'world']); // valid
schema.validate(['world']); // error
  • .max(max_length: number)
const schema = d.arrar(d.sting()).max(2);

schema.validate(['hello', 'world']); // valid
schema.validate(['hello', 'world', 'foo']); // error

benchmark

Simple string resultComplex object result
desyxx
zod10x8x
yup43x31x

smaller is better

0.0.8

22 days ago

0.0.7

2 months ago

0.0.3

8 months ago

0.0.5

8 months ago

0.0.4

8 months ago

0.0.6

7 months ago

0.0.2

10 months ago

0.0.1

10 months ago