validia
v0.3.0
Published
A TypeScript-friendly validation utility.
Maintainers
Readme
Validia
A TypeScript-friendly validator.
🏁 Goal
This package provides:
- Compiler; It compiles schemas then creates a validation function. The validation is fast.
- Type Assertion; It can compute the value type of schemas. The validated values will get well typing.
- Customizable; You can use a function (with type guard) to define your validation.
- Localization; Every validation error is represented with a code and arguments. You can define error messages in your primary language. (Of course, this package provides the default error messages.)
💿 Installation
Use npm or a compatible tool to install.
npm install validia📖 Usage
➡️ One-shot Validation
import { validate } from "validia";
// 1. Define your schema.
const myOptionSchema = {
type: "object",
properties: {
include: { type: "array", elements: { type: "string" } },
exclude: { type: "array", elements: { type: "string" } },
},
} as const; // `as const` is important.
// 2. Validate a value.
declare let value: any;
validate(myOptionSchema, value);
// The `value` is `{ include?: string[]; exclude?: string[] }` here.Schema is simple objects. But I'd like to recommend using factory functions to utilize input completion and ensure good typings.
➡️ Using Factory Functions
import { schemas as s, validate } from "validia";
// 1. Define your schema.
const myOptionSchema = s.object({
include: s.array(s.string()),
exclude: s.array(s.string()),
});
// 2. Validate a value.
declare let value: any;
validate(myOptionSchema, value);
// The `value` is `{ include?: string[]; exclude?: string[] }` here.The schemas is the namespace of factory functions.
➡️ Compile Validation Functions
import { createValidation, schemas as s, Validate } from "validia";
// 1. Define your schema.
const myOptionSchema = s.object({
include: s.array(s.string()),
exclude: s.array(s.string()),
});
// 2. Compile validation.
const validate: Validate<typeof myOptionSchema> = createValidation(
myOptionSchema
);
// 3. Validate a value.
declare let value: any;
validate(value);
// The `value` is `{ include?: string[]; exclude?: string[] }` here.Unfortunately, you have to declare the type of the validate function explicitly because of microsoft/TypeScript#33580. In short, the type of Assertion Functions must be decided before the type inference phase.
➡️ For Legacy Platform
This package requires ES2018 or later.
If you want to use this package on a legacy platform, use the validia/es5 entry point along with core-js, @babel/runtime, and regenerator-runtime.
For example:
const { schemas, createValidate } = require("validia/es5");
// ...Or you can merely configure your bundler to transpile this package as well.
The generated code of createValidation(schema) function is ES5 then it works well on IE11. (probably!)
📚 References
import {
// objects
createValidation,
validate,
schemas,
ValidationError,
DefaultMessage,
// types
Message,
Schema,
TypeOf,
Validate,
} from "validia";➡️ function createValidation<T>(schema: T, options?: Options)
Compile the validation function of given schema object.
Parameters
schema... The schema object.options... The options to compile.options.defaultMessages... The error message generator. Optional. Default isDefaultMessage.
Return Value
- The validation function of the schema;
(value: any, options?: Options) => void.- If the
valueargument passed the validation, thevalueargument gets good typing. Otherwise, the validation function throws aValidationErrorinstance. - The
options.messagesargument is the error message generator. Optional. Default isoptions.defaultMessages. - The
options.nameargument will be used in error messages. Optional. Default is"value".
- If the
➡️ function validate<T>(schema: T, value: any, options?: Options)
This is equivalent to createValidation<T>(schema)(value, options).
➡️ object schemas
The schema factories.
schemas.any()... The schema representingany.schemas.array(schema?, options?)... The schema representing specific arrays.schemais the schema of array elements. Default isschemas.any().options.maxLengthis the maximum length.options.minLengthis the minimum length.options.uniqueis the flag to disallow duplicated values.
schemas.bigInt(options?)... The schema representing specificbigintvalues.options.maxValueis the maximum value.options.minValueis the minimum value.
schemas.boolean()... The schema representingtrueorfalse.schemas.instanceOf(constructor)... The schema representing instances of a specific class.constructoris the class.
schemas.custom(name, check)... The schema representing a user-defined check.nameis the name of this check. It will be used in error messages.checkis the function of this chck;<T>(value: unknown) => value is T. Returntrueif thevaluepassed validation.
schemas.enum(...values)... The schema representing any of specific values.valuesis the list of allowed values.
schemas.function()... The schema representing any functions.schemas.number(options?)... The schema representing specific numbers.options.allowInfinityis the flag to allowInfinityand-Infinity.options.allowNaNis the flag to allowNaN.options.intOnlyis the flag to disallow non-integers.options.maxValueis the maximum value.options.minValueis the minimum value.
schemas.object(properties?, options?)... The schema representing specific objects. If you give no arguments, the returned schema matches any objects.propertiesis the definition of known properties;Record<string, Schema>.options.allowUnknownis the flag to allow unknown properties.options.requiredistrueor the array of known property names to be required. Iftrue, all known properties are required.
schemas.record(schema?)... The schema representing specific objects.schemais the schema of properties. Default isschemas.any().
schemas.string(options?)... The schema representing specific strings.options.maxLengthis the maximum number of characters.options.minLengthis the minimum number of characters.options.patternis the regular expression of allowed strings.
schemas.symbol()... The schema representing any symbols.schemas.tuple(...elements)... The schema representing specific tuples.elementsis the schemas of elements.
schemas.anyOf(...schemas)... The schema representing specific union types.schemasis the schema of allowed types.
schemas.bigInt64... Equivalent toschemas.bigInt({ maxValue: 9223372036854775807n, minValue: -9223372036854775808n }).schemas.bigUint64... Equivalent toschemas.bigInt({ maxValue: 18446744073709551615n, minValue: 0 }).schemas.null... Equivalent toschemas.enum(null).schemas.int8... Equivalent toschemas.number({ intOnly: true, maxValue: 127, minValue: -128 }).schemas.int16... Equivalent toschemas.number({ intOnly: true, maxValue: 32767, minValue: -32768 }).schemas.int32... Equivalent toschemas.number({ intOnly: true, maxValue: 2147483647, minValue: -2147483648 }).schemas.uint8... Equivalent toschemas.number({ intOnly: true, maxValue: 255, minValue: 0 }).schemas.uint16... Equivalent toschemas.number({ intOnly: true, maxValue: 65535, minValue: 0 }).schemas.uint32... Equivalent toschemas.number({ intOnly: true, maxValue: 4294967295, minValue: 0 }).
➡️ class ValidationError
The Error class for validation errors.
➡️ object DefaultMessage
The default error messages.
➡️ type Message
The interface to define your own error messages.
See src/message/default-message.ts for example.
➡️ type Schema
The types of schemas.
See src/schema-types.ts for details.
➡️ type TypeOf<T>
The types for calculating the value type of schemas.
See src/real-types.ts for details.
➡️ type Validate<T>
The type of validation functions.
type Validate<T extends Schema> = (
name: string,
value: any
) => asserts value is TypeOf<T>;📰 Changelog
See GitHub Releases.
🍻 Contributing
Welcome contributing!
Please use GitHub's Issues/PRs.
Development Tools
npm testruns tests and measures coverage.npm run buildcompiles source code to index.mjs, index.js, index.mjs.map, index.js.map, and index.d.ts.npm run cleanremoves the temporary files which are created by npm test and npm run build.npm run formatruns Prettier.npm run lintruns ESLint.npm version <patch|minor|major>makes a new release.
