https://github.com/savory/validatte
A Savory Class validator for Deno
https://github.com/savory/validatte
deno hacktoberfest typescript validation validator
Last synced: 4 months ago
JSON representation
A Savory Class validator for Deno
- Host: GitHub
- URL: https://github.com/savory/validatte
- Owner: Savory
- License: other
- Created: 2022-08-28T07:49:28.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2025-02-11T11:51:03.000Z (over 1 year ago)
- Last Synced: 2025-02-11T12:21:42.058Z (over 1 year ago)
- Topics: deno, hacktoberfest, typescript, validation, validator
- Language: TypeScript
- Homepage:
- Size: 244 KB
- Stars: 11
- Watchers: 0
- Forks: 2
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
Awesome Lists containing this project
README
## A Savory class validator for Deno.

[](https://github.com/Savory/validatte/actions/workflows/run-tests.yml)
[](https://codecov.io/gh/Savory/validatte)
## Available decorators
| Decorator | Description |
| ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Type validation decorators** | |
| `IsBoolean()` | Checks if a value is a boolean. |
| `IsString()` | Checks if the string is a string. |
| `IsNumber()` | Checks if the value is a number. |
| `IsBigInt()` | Checks if the value is a big int. |
| `IsArray()` | Checks if the value is an array |
| `IsObject()` | Checks if the value is an object |
| `IsSymbol()` | Checks if the value is a Symbol |
| `IsUndefined()` | Checks if the value is undefined |
| `Contains(seed [, options])` | Check if the string contains the seed.
`options` is an object which defaults to `{ ignoreCase: false }`. |
| `IsAfter(date? string)` | Check if the string is a date that's after the specified date (defaults to `now`). |
| `IsAlpha(locale?: string)` | Check if the string contains only alphabets depending on the locale.
Locale is one of `['ar', 'ar-AE', 'ar-BH', 'ar-DZ', 'ar-EG', 'ar-IQ', 'ar-JO', 'ar-KW', 'ar-LB', 'ar-LY', 'ar-MA', 'ar-QA', 'ar-QM', 'ar-SA', 'ar-SD', 'ar-SY', 'ar-TN', 'ar-YE', 'bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-AU', 'en-GB', 'en-HK', 'en-IN', 'en-NZ', 'en-US', 'en-ZA', 'en-ZM', 'es-ES', 'fa-IR', 'fr-FR', 'he', 'hu-HU', 'it-IT', 'ku-IQ', 'nb-NO', 'nl-NL', 'nn-NO', 'pl-PL', 'pl-Pl', 'pt-BR', 'pt-PT', 'ru-RU', 'sk-SK', 'sl-SI', 'sr-RS', 'sr-RSlatin', 'sv-SE', 'tr-TR', 'uk-UA']` and defaults to `en-US`. |
| `IsAlphanumeric(locale?: string)` | Check if the string contains only alphabets and digits depending on the locale.
Locale is one of `['ar', 'ar-AE', 'ar-BH', 'ar-DZ', 'ar-EG', 'ar-IQ', 'ar-JO', 'ar-KW', 'ar-LB', 'ar-LY', 'ar-MA', 'ar-QA', 'ar-QM', 'ar-SA', 'ar-SD', 'ar-SY', 'ar-TN', 'ar-YE', 'bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-AU', 'en-GB', 'en-HK', 'en-IN', 'en-NZ', 'en-US', 'en-ZA', 'en-ZM', 'es-ES', 'fa-IR', 'fr-FR', 'he', 'hu-HU', 'it-IT', 'ku-IQ', 'nb-NO', 'nl-NL', 'nn-NO', 'pl-PL', 'pl-Pl', 'pt-BR', 'pt-PT', 'ru-RU', 'sk-SK', 'sl-SI', 'sr-RS', 'sr-RSlatin', 'sv-SE', 'tr-TR', 'uk-UA']` and defaults to `en-US`. |
| `IsAscii()` | Check if the string contains ASCII chars only. |
| `IsBase32()` | Check if a string is base32 encoded. |
| `IsBase64(options?: { urlSafe: boolean })` | Check if a string is base64 encoded.
`options` is an object which defaults to `{ urlSafe: false }`. |
| `IsBefore(date?: string)` | Check if the string is a date that's before the specified date (defaults to `now`). |
| `IsBIC()` | Check if a string is a BIC (Bank Identification Code) or SWIFT code. |
| `IsBoolean()` | Check if a string is a boolean. |
| `IsBtcAddress()` | Check if the string is a valid BTC address. |
| `ByteLength(options: { min: number, max: number? })` | Check if the string's length (in UTF-8 bytes) falls in a range.
`options` is an object which defaults to `{ min: 0, max: undefined }`. |
| `IsCreditCard()` | Check if the string is a valid Credit Card number. |
| `IsCurrency(option)` | Check if the string is a valid currency amount.
`options` is an object which defaults to `{ symbol: '$', require_symbol: false, allow_space_after_symbol: false, symbol_after_digits: false, allow_negatives: true, parens_for_negatives: false, negative_sign_before_digits: false, negative_sign_after_digits: false, allow_negative_sign_placeholder: false, thousands_separator: ',', decimal_separator: '.', allow_decimal: true, require_decimal: false, digits_after_decimal: [2], allow_space_after_digits: false }.`
`Note`: The array `digits_after_decimal` is filled with the exact number of digits allowed not a range, for example a range 1 to 3 will be given as [1, 2, 3]. |
| `IsDataURI()` | Check if the string is in Data URI format. |
| `IsDate(format?: string)` | Check if the string is a valid date. Example `[2002-07-15, new Date()]`.
`format` is a string that defaults to `YYYY/MM/DD` |
| `IsDecimal(options? )` | Check if the string represents a decimal number, such as 0.1, .3, 1.1, 1.00003, 4.0, etc.
`options` is an object which defaults to `{force_decimal: false, decimal_digits: '1,', locale: 'en-US'}`
`locale` determine the decimal separator and is one of `['ar', 'ar-AE', 'ar-BH', 'ar-DZ', 'ar-EG', 'ar-IQ', 'ar-JO', 'ar-KW', 'ar-LB', 'ar-LY', 'ar-MA', 'ar-QA', 'ar-QM', 'ar-SA', 'ar-SD', 'ar-SY', 'ar-TN', 'ar-YE', 'bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'en-AU', 'en-GB', 'en-HK', 'en-IN', 'en-NZ', 'en-US', 'en-ZA', 'en-ZM', 'es-ES', 'fr-FR', 'hu-HU', 'it-IT', 'ku-IQ', nb-NO', 'nl-NL', 'nn-NO', 'pl-PL', 'pt-BR', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS', 'sr-RSlatin', 'sv-SE', 'tr-TR', 'uk-UA']`.
**Note:** `decimal_digits` is given as a range like '1,3', a specific value like '3' or min like '1,'. |
| `IsHexadecimal()` | Check if the string represents a hexadecimal number, such as 28E, AC7, etc. |
| `IsEmpty()` | Check if a string is empty. |
| `IsHexColor()` | Check if the string represent a hex color. |
| `IsIP()` | Check if the string is a valid ip address. |
| `IsDivisibleBy(dividend: number)` | Check if the property is divisible by the given number. |
| `IsPort()` | Check if the string is a valid port number (between 0 and 65535). |
| `IsURL()` | Check if the string is a valid URL. |
| **Number validation decorators** | |
| `GreaterOrEqual(num: number)` | Checks if the value is greater than or equal to the specified number. |
| `Greater(num: number)` | Checks if the value is greater than the specified number. |
| `LowerOrEqual(num: number)` | Checks if the value is lower than or equal to the specified number. |
| `Lower(num: number)` | Checks if the value is lower than the specified number. |
| **String validation decorators** | |
| `LengthGreaterOrEqual(num: number)` | Checks if the length is greater than or equal to the specified number. |
| `LengthGreater(num: number)` | Checks if the length is greater than the specified number. |
| `LengthLowerOrEqual(num: number)` | Checks if the length is lower than or equal to the specified number. |
| `LengthLower(num: number)` | Checks if the length is lower than the specified number. |
| `IsRegex(regex: RegExp)` | Checks if the string match the given RegExp. |
| `IsEmail()` | Checks if the string is an email. |
| `IsFullWidth()` | Checks if the string is a full-width string. Example a, b, c. |
| `IsPhoneNumber(country: string)` | Checks if the string is a local phone number for a country. Country must be ISO 3166 c.a.d 2 letter code. Example: FR, US, UK, DE |
| `IsHalfWidth()` | Checks if the string is half-width string. Example: A, b, c. |
| `IsInternationalPhoneNumber()` | Checks if the string is an international phone number with extension and with or without leading 0. Example: +330XXXXXXXXX or +33XXXXXXXXX |
| `IsLowerCase()` | Checks if the string is in lower case. |
| `IsUpperCase()` | Checks if the string is in uppercase. |
| **Object validation decorators** | |
| `Nested(class: Class)` | Checks if the property is a valid "instance" of Class. This means that all Validators of Class will be checked on the given object. The property can either be a plain object or a class instance |
## Usage
Create a Class using TypeScript Decorators and run `validateObject`.
If you need more built-in validators, please **open an issue** or **create merge request**
```ts
import {
createValidator,
IsEmail, // this is a decorator (PascalCase)
isEmail, // this is a check function, called behavior (camelCase)
IsString,
LengthLowerOrEqual,
validateObject,
} from 'https://deno.land/x/validatte/mod.ts';
// Custom validator with custom error message containing argument. $constraint1 will be replaced by first argument. $constraint2 by second etc...
const IsWhiteListedEmailDomain = createValidator(
(whiteListedDomain: string) => {
return (prop) => {
if (isEmail(prop)) {
return false;
}
return prop.indexOf(`@${whiteListedDomain}`) !== -1;
};
},
'Email shoud be from $constraint1 domain',
);
class User {
@IsString()
@IsEmail()
@IsWhiteListedEmailDomain('mydomain.com')
email!: string;
}
// ---------- //
// Valid
const user = new User();
user.email = 'myemailmydomain.com';
console.log(validateObject(user, User));
// []
// ---------- //
// Invalid
const failingUser = new User();
failingUser.email = 'wrongemail@email.com';
console.log(validateObject(failingUser, User));
/*
[
{
property: 'email',
errorMessage: `Email shoud be from mydomain.com domain`,
constraints: ['mydomain.com'],
},
];
*/
```
## Come with us on this awesome journey
We always welcome contributors, feel free to submit a new feature or report a bug on our
[Github Repository](https://github.com/Savory/validatte) and [join our discord](https://discord.gg/Q7ZHuDPgjA)
## License
MIT