Validasaur is Deno validation library slightly inspired by Laravel Validation.
- Table of Contents
- Examples
- Available Rules
required
either(ruleSets: (Rule|Rule[])[], errorCode: string = 'either')
endsWith(str: string)
isArray
isBool
isDate
isEmail
isFloat
isIn(allowedValues: PrimitiveTypes[])
isInt
isIPv4
isIPv6
isNumber
isNumeric
isString
lengthBetween(minLength: number, maxLength: number)
match(regex: RegExp, trim: boolean = false)
maxLength(minValue: number)
maxNumber(maxValue: number)
minLength(minValue: number)
minNumber(minValue: number)
notIn(disallowedValues: PrimitiveTypes[])
notNull
nullable
numberBetween(minValue: number, maxValue: number)
requiredIf(field: string, fieldValue: any)
requiredUnless(field: string, fieldValue: any)
requiredWhen(callback: (value: any, utils: ValidationUtils) => boolean|Promise<boolean>)
startsWith(str: string)
- Contributing
Write your example.ts
like this:
import { validate, required, isNumber } from "https://deno.land/x/validasaur/mod.ts";
const inputs = {
name: "",
age: "20"
};
const [ passes, errors ] = await validate(inputs, {
name: required,
age: [required, isNumber]
});
console.log({ passes, errors });
Run code above with:
deno run example.ts
And this is the result:
{
"passes": false,
"errors": {
"name": {
"required": "name is required"
},
"age": {
"isNumber": "age must be a number"
}
}
}
If you want a simpler error message,
you can use flattenMessages
or firstMessages
to format error messages.
For example:
import {
validate,
flattenMessages,
firstMessages,
required,
isNumber
} from "https://deno.land/x/validasaur/mod.ts";
const inputs = {
name: "",
age: "20"
};
const [ passes, errors ] = await validate(inputs, {
name: required,
age: [required, isNumber]
});
const firstErrors = firstMessages(errors);
const flattenErrors = flattenMessages(errors);
// Show the difference
console.log({
defaultErrors: errors,
firstErrors,
flattenErrors
});
Result:
{
"defaultErrors": {
"name": {
"required": "name is required"
},
"age": {
"isNumber": "age must be a number"
}
},
"firstErrors": {
"name": "name is required",
"age": "age must be a number"
},
"flattenErrors": {
"name.required": "name is required",
"age.isNumber": "age must be a number",
"name": "name is required",
"age": "age must be a number"
}
}
import {
validate,
InvalidParams,
required,
isNumber,
isIn,
isString,
} from "https://deno.land/x/validasaur/mod.ts";
const inputs = {
name: "",
age: "12",
sex: "unknown",
};
const [passes, errors] = await validate(inputs, {
name: required,
age: [required, isNumber],
sex: [required, isString, isIn(["male", "female"])]
}, {
messages: {
"name": "Nama tidak boleh kosong",
"age.required": "Usia tidak boleh kosong",
"age.isNumber": "Usia harus berupa angka",
// Using function
"isIn": (params: InvalidParams): string => {
const allowedValues = params.allowedValues.join("/");
return `${params.attr} field doesn't allow '${params.value}', it only allows ${allowedValues}`;
},
// Use this if you want same message for any rule fail
// "age": "Usia tidak valid",
},
});
console.log({ passes, errors });
Result:
{
"passes": false,
"errors": {
"name": {
"required": "Nama tidak boleh kosong"
},
"age": {
"isNumber": "Usia harus berupa angka"
}
}
}
import {
validate,
flattenMessages,
required,
isNumber,
isString,
validateArray,
validateObject
} from "https://deno.land/x/validasaur/mod.ts";
const inputs = {
name: "",
age: "20",
skills: ["PHP", "Node.js", 0, "Deno"],
address: {
street: null,
city: "Jakarta",
country: "Indonesia",
}
};
const [ passes, errors ] = await validate(inputs, {
name: required,
age: [required, isNumber],
// validateArray(required: boolean, rules: Rule[])
skills: validateArray(true, [isString]),
// validateObject(required: boolean, rules: ValidationRule)
address: validateObject(true, {
street: required,
city: required,
country: required,
}),
});
const flattenErrors = flattenMessages(errors);
console.log({ passes, flattenErrors });
Result:
{
"passes": false,
"flattenErrors": {
"name.required": "name is required",
"age.isNumber": "age must be a number",
"skills.2.isString": "2 must be a string",
"address.street.required": "street is required",
"name": "name is required",
"age": "age must be a number",
"skills.2": "2 must be a string",
"address.street": "street is required"
}
}
In this example we will make an isOdd
rule validation that check odd number.
First, let's make is_odd.ts
like this:
import { invalid, Validity } from "https://deno.land/x/validasaur/mod.ts"; export function isOdd(value: any): Validity { if (typeof value !== "number") { return invalid("isOdd", { value }); } if (value % 2 !== 1) { return invalid("isOdd", { value }); } }