Type-aware object validator.
npm install @darkobits/valida
Options validator using ow.
* If used with a type argument, validates the provided ow spec against the provided type, ensuring
that your runtime type checking stays in sync with your compile-time type-checking.
* If used without a type argument, ensures that validated values conform to the shape of the provided
ow spec.
* Uses Levenshtein distance to suggest correct names for misspelled keys (a-la Jest, Babel).
* Allows for optional defaults to be specified, which are merged with user input before validation.
```
npm install @darkobits/valida
`ts
import createValidator from '@darkobits/valida';
interface Person {
name: string;
address: {
street: string;
locality: string;
postalCode: string;
administrativeArea: string;
countryCode?: string;
}
age: number;
}
/**
* - Pass a function to createValidator. This function will be invoked with aow
* context object containing an reference.validate
* - By default, will try to return the right shape based on yourcreateValidator
* spec object, but if you need to be precise, provide a type argument to
* with your expected return type.spec
*/
const validate = createValidator
/**
* - Return an object containing a property and an optional defaultsoptional
* property.
* - Note: Validation will take place _after_ defaults have been merged with
* user-provided data, so any fields for which you provide defaults should
* not use the predicate. You can, however, mark those fields as
* optional in your type defs so the user doesn't yelled-at if they omit a
* field with a default value.
*/
spec: {
name: ow.string,
address: ow.object.exactShape({
street: ow.string,
locality: ow.string,
postalCode: ow.string.numerical,
administrativeArea: ow.string,
countryCode: ow.string.maxLength(2)
}),
age: ow.number.positive
},
defaults: {
address: {
countryCode: 'GB'
}
}
}));
// - person will be of type Personaddress.CountryCode
// - will be merged-in.
const person = validate({
name: 'Ervin Howell',
address: {
street: '692 Victor Plains',
locality: 'Gwenborough',
postalCode: '44932',
administrativeArea: 'Chestertonshire',
}
});
// This will throw; postalCode is non-numeric.
const person = validate({
name: 'Ervin Howell',
address: {
street: '692 Victor Plains',
locality: 'Gwenborough',
postalCode: 'kittens',
administrativeArea: 'Chestertonshire',
}
});
`
* ow`