0-Deps, simple, fast, for browser and node js object schema validator
MIT License
0-Deps, simple, blazing fast, for browser and Node.js object schema validator
import { compile, optional, and, or, $keys, $values, Schema, as } from 'ascertain';
const validate = compile({
number: Number,
string: String,
boolean: Boolean,
function: Function,
array: Array,
object: Object,
date: and(Date, { toJSON: Function }),
regexp: /regexp/,
oneOfValue: or(1, 2, 3),
arrayOfNumbers: [Number],
objectSchema: {
number: Number,
},
optional: optional({
number: Number,
}),
keyValue: {
[$keys]: /^key[A-Z]/,
[$values]: Number
},
parsedNumber: Number,
parsedString: String,
parsedBoolean: Boolean,
parsedArray: [String],
parsedJSON: {
number: 1,
},
parsedBase64: String,
parsedTime: 2 * 60 * 1000, // two minutes
parsedDate: Date,
});
Create data ascertain
import { ascertain, optional, and, or, $keys, $values, Schema, as } from 'ascertain';
// create data sample
const data = {
number: 1,
string: 'string',
boolean: true,
function: () => {},
array: [],
object: {},
date: new Date,
regexp: 'regexp',
oneOfValue: 1,
arrayOfNumbers: [1,2,3,4,5],
objectSchema: {
number: 1,
},
optional: null,
keyValue: {
keyOne: 1,
keyTwo: 2,
keyThree: 3,
},
// fault tolernat type casting
parsedNumber: as.number('1'),
parsedString: as.string('string'),
parsedBoolean: as.boolean('false'),
parsedArray: as.array('1,2,3,4,5', ','),
parsedJSON: as.json('{ "number": 1 }'),
parsedBase64: as.base64('dGVzdA=='),
parsedTime: as.time('2m'),
parsedDate: as.date('31-12-2024'),
};
// create data schema
const schema: Schema<typeof data> = {
number: Number,
string: String,
boolean: Boolean,
function: Function,
array: Array,
object: Object,
date: and(Date, { toJSON: Function }),
regexp: /regexp/,
oneOfValue: or(1, 2, 3),
arrayOfNumbers: [Number],
objectSchema: {
number: Number,
},
optional: optional({
number: Number,
}),
keyValue: {
[$keys]: /^key[A-Z]/,
[$values]: Number
},
parsedNumber: Number,
parsedString: String,
parsedBoolean: Boolean,
parsedArray: [String],
parsedJSON: {
number: 1,
},
parsedBase64: String,
parsedTime: 2 * 60 * 1000, // two minutes
parsedDate: Date,
};
// validate
const validate = ascertain<typeof data>(schema, data, '[DATA]');
Script ajv-vs-zod-vs-ascertain.js
Suite ajv vs zod vs ascertain
Perform benchmark
Measure 500000 zod static schema validation
(index) med p95 p99 total count
0.000699 0.000788 0.000996 0.001624 462.602373 500000
Measure 500000 zod dynamic schema validation
(index) med p95 p99 total count
0.006248 0.006918 0.007524 0.016948 3780.465563 500000
Measure 500000 ascertain static schema validation
(index) med p95 p99 total count
0.000063 0.000071 0.000098 0.000267 41.673271 500000
Measure 500000 ascertain dynamic schema validation
(index) med p95 p99 total count
0.000367 0.000415 0.000525 0.001055 239.078129 500000
Measure 500000 ajv compiled schema validation
(index) med p95 p99 total count
0.000063 0.000072 0.000124 0.000307 44.542936 500000
License The MIT License Copyright (c) 2019-2024 Ivan Zakharchanka