
Security News
GitHub Actions Checkout Now Blocks Risky pull_request_target Checkouts
GitHub Actions checkout now blocks risky pull_request_target checkouts by default to help prevent pwn request supply chain attacks.
npm install desy
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"
simplefast as point 1 allowsDeep 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 }
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()const schema = d.mixed();
schema.validate('a'); // valid
schema.validate(''); // valid
schema.validate(null); // valid
.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()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()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()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()const schema = d.null();
schema.validate(null); // valid
schema.validate(undefined); // error
.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(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
| Simple string result | Complex object result | |
|---|---|---|
| desy | x | x |
| zod | 10x | 8x |
| yup | 43x | 31x |
smaller is better
FAQs
Unknown package
The npm package desy receives a total of 24 weekly downloads. As such, desy popularity was classified as not popular.
We found that desy demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
GitHub Actions checkout now blocks risky pull_request_target checkouts by default to help prevent pwn request supply chain attacks.

Product
Socket now supports Custom Roles and Repository Access Permissions so organizations can control who can access specific repositories and actions.

Product
Socket MCP now lets AI assistants review org alerts, investigate threats using the Socket threat feed, and inspect package files in addition to dependency scoring.