Skip to content

Commit 9871371

Browse files
authored
Merge branch 'develop' into feat/add-isiprange-validator
2 parents 15746fa + bb7aa02 commit 9871371

27 files changed

+595
-437
lines changed

package-lock.json

+515-400
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+14-14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "class-validator",
3-
"version": "0.14.0",
3+
"version": "0.14.1",
44
"description": "Decorator-based property validation for classes.",
55
"author": "TypeStack contributors",
66
"license": "MIT",
@@ -36,30 +36,30 @@
3636
"test:ci": "jest --runInBand --no-cache --coverage --verbose"
3737
},
3838
"dependencies": {
39-
"@types/validator": "^13.9.0",
40-
"libphonenumber-js": "^1.10.51",
39+
"@types/validator": "^13.11.8",
40+
"libphonenumber-js": "^1.10.57",
4141
"validator": "^13.9.0"
4242
},
4343
"devDependencies": {
4444
"@rollup/plugin-commonjs": "^25.0.7",
4545
"@rollup/plugin-node-resolve": "^15.2.3",
46-
"@types/jest": "^29.5.10",
47-
"@types/node": "^20.10.0",
48-
"@typescript-eslint/eslint-plugin": "^5.61.0",
46+
"@types/jest": "^29.5.12",
47+
"@types/node": "^20.11.20",
48+
"@typescript-eslint/eslint-plugin": "^5.62.0",
4949
"@typescript-eslint/parser": "^5.62.0",
50-
"eslint": "^8.54.0",
51-
"eslint-config-prettier": "^9.0.0",
52-
"eslint-plugin-jest": "^27.6.0",
50+
"eslint": "^8.57.0",
51+
"eslint-config-prettier": "^9.1.0",
52+
"eslint-plugin-jest": "^27.9.0",
5353
"husky": "^4.3.8",
5454
"jest": "^29.7.0",
55-
"lint-staged": "^15.1.0",
55+
"lint-staged": "^15.2.2",
5656
"prettier": "^2.8.8",
57-
"reflect-metadata": "0.1.13",
57+
"reflect-metadata": "0.2.1",
5858
"rimraf": "5.0.5",
5959
"rollup": "^2.79.1",
6060
"rollup-plugin-terser": "^7.0.2",
61-
"ts-jest": "^29.1.1",
62-
"ts-node": "^10.9.1",
63-
"typescript": "^5.3.2"
61+
"ts-jest": "^29.1.2",
62+
"ts-node": "^10.9.2",
63+
"typescript": "^5.3.3"
6464
}
6565
}

src/decorator/common/IsDefined.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export const IS_DEFINED = ValidationTypes.IS_DEFINED;
88
/**
99
* Checks if value is defined (!== undefined, !== null).
1010
*/
11-
export function isDefined(value: any): boolean {
11+
export function isDefined<T>(value: T | undefined | null): value is T {
1212
return value !== undefined && value !== null;
1313
}
1414

src/decorator/common/IsOptional.ts

+3
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@ import { ValidationTypes } from '../../validation/ValidationTypes';
44
import { ValidationMetadata } from '../../metadata/ValidationMetadata';
55
import { getMetadataStorage } from '../../metadata/MetadataStorage';
66

7+
export const IS_OPTIONAL = 'isOptional';
8+
79
/**
810
* Checks if value is missing and if so, ignores all validators.
911
*/
1012
export function IsOptional(validationOptions?: ValidationOptions): PropertyDecorator {
1113
return function (object: object, propertyName: string): void {
1214
const args: ValidationMetadataArgs = {
1315
type: ValidationTypes.CONDITIONAL_VALIDATION,
16+
name: IS_OPTIONAL,
1417
target: object.constructor,
1518
propertyName: propertyName,
1619
constraints: [

src/decorator/string/IsAlpha.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isAlphaValidator from 'validator/lib/isAlpha';
4-
import ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_ALPHA = 'isAlpha';
77

src/decorator/string/IsAlphanumeric.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isAlphanumericValidator from 'validator/lib/isAlphanumeric';
4-
import ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_ALPHANUMERIC = 'isAlphanumeric';
77

src/decorator/string/IsBase64.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isBase64Validator from 'validator/lib/isBase64';
4-
import type ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_BASE64 = 'isBase64';
77

src/decorator/string/IsCurrency.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isCurrencyValidator from 'validator/lib/isCurrency';
4-
import ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_CURRENCY = 'isCurrency';
77

src/decorator/string/IsDateString.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
3-
import ValidatorJS from 'validator';
3+
import * as ValidatorJS from 'validator';
44
import { isISO8601 } from './IsISO8601';
55

66
export const IS_DATE_STRING = 'isDateString';

src/decorator/string/IsDecimal.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isDecimalValidator from 'validator/lib/isDecimal';
4-
import ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_DECIMAL = 'isDecimal';
77

src/decorator/string/IsEmail.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isEmailValidator from 'validator/lib/isEmail';
4-
import ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_EMAIL = 'isEmail';
77

src/decorator/string/IsFQDN.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isFqdnValidator from 'validator/lib/isFQDN';
4-
import ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_FQDN = 'isFqdn';
77

src/decorator/string/IsHash.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isHashValidator from 'validator/lib/isHash';
4-
import ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_HASH = 'isHash';
77

src/decorator/string/IsISO8601.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isIso8601Validator from 'validator/lib/isISO8601';
4-
import ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_ISO8601 = 'isIso8601';
77

src/decorator/string/IsISSN.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isISSNValidator from 'validator/lib/isISSN';
4-
import ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_ISSN = 'isISSN';
77

src/decorator/string/IsIdentityCard.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isIdentityCardValidator from 'validator/lib/isIdentityCard';
4-
import ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_IDENTITY_CARD = 'isIdentityCard';
77

src/decorator/string/IsMacAddress.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions, isValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isMacAddressValidator from 'validator/lib/isMACAddress';
4-
import ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_MAC_ADDRESS = 'isMacAddress';
77

src/decorator/string/IsMobilePhone.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isMobilePhoneValidator from 'validator/lib/isMobilePhone';
4-
import ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_MOBILE_PHONE = 'isMobilePhone';
77

src/decorator/string/IsNumberString.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isNumericValidator from 'validator/lib/isNumeric';
4-
import ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_NUMBER_STRING = 'isNumberString';
77

src/decorator/string/IsPostalCode.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isPostalCodeValidator from 'validator/lib/isPostalCode';
4-
import ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_POSTAL_CODE = 'isPostalCode';
77

src/decorator/string/IsStrongPassword.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import validator from 'validator';
1+
import * as validator from 'validator';
22
import { ValidationOptions } from '../ValidationOptions';
33
import { buildMessage, ValidateBy } from '../common/ValidateBy';
44

src/decorator/string/IsUUID.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isUuidValidator from 'validator/lib/isUUID';
4-
import type ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_UUID = 'isUuid';
77

src/decorator/string/IsUrl.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ValidationOptions } from '../ValidationOptions';
22
import { buildMessage, ValidateBy } from '../common/ValidateBy';
33
import isUrlValidator from 'validator/lib/isURL';
4-
import ValidatorJS from 'validator';
4+
import * as ValidatorJS from 'validator';
55

66
export const IS_URL = 'isUrl';
77

src/validation/ValidationExecutor.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export class ValidationExecutor {
6767
);
6868
const groupedMetadatas = this.metadataStorage.groupByPropertyName(targetMetadatas);
6969

70-
if (this.validatorOptions && forbidUnknownValues && !targetMetadatas.length) {
70+
if (forbidUnknownValues && !targetMetadatas.length) {
7171
const validationError = new ValidationError();
7272

7373
if (

src/validation/ValidatorOptions.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,9 @@ export interface ValidatorOptions {
7575
* Fails validation for objects unknown to class-validator. Defaults to true.
7676
*
7777
* For instance, since a plain empty object has no annotations used for validation:
78-
* - `validate({})` // passes
78+
* - `validate({})` // fails.
7979
* - `validate({}, { forbidUnknownValues: true })` // fails.
80+
* - `validate({}, { forbidUnknownValues: false })` // passes.
8081
* - `validate(new SomeAnnotatedEmptyClass(), { forbidUnknownValues: true })` // passes.
8182
*/
8283
forbidUnknownValues?: boolean;

test/functional/validation-functions-and-decorators.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ import {
199199
import { Validator } from '../../src/validation/Validator';
200200
import { ValidatorOptions } from '../../src/validation/ValidatorOptions';
201201
import { constraintToString } from '../../src/validation/ValidationUtils';
202-
import { default as ValidatorJS } from 'validator';
202+
import * as ValidatorJS from 'validator';
203203

204204
function checkValidValues(
205205
object: { someProperty: any },

test/functional/validator-options.spec.ts

+39
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,43 @@ describe('validator options', () => {
4444
expect(errors.length).toEqual(0);
4545
});
4646
});
47+
48+
it(`should return error on unknown objects if no options object argument is passed`, () => {
49+
const anonymousObject = { badKey: 'This should not pass.' };
50+
51+
return validator.validate(anonymousObject, undefined).then(errors => {
52+
expect(errors.length).toEqual(1);
53+
expect(errors[0].target).toEqual(anonymousObject);
54+
expect(errors[0].property).toEqual(undefined);
55+
expect(errors[0].value).toEqual(undefined);
56+
expect(errors[0].children).toBeInstanceOf(Array);
57+
expect(errors[0].constraints).toEqual({ unknownValue: 'an unknown value was passed to the validate function' });
58+
});
59+
});
60+
61+
it(`should return error on unknown objects if empty options object argument passed`, () => {
62+
const anonymousObject = { badKey: 'This should not pass.' };
63+
64+
return validator.validate(anonymousObject, {}).then(errors => {
65+
expect(errors.length).toEqual(1);
66+
expect(errors[0].target).toEqual(anonymousObject);
67+
expect(errors[0].property).toEqual(undefined);
68+
expect(errors[0].value).toEqual(undefined);
69+
expect(errors[0].children).toBeInstanceOf(Array);
70+
expect(errors[0].constraints).toEqual({ unknownValue: 'an unknown value was passed to the validate function' });
71+
});
72+
});
73+
74+
it(`should return error on unknown objects if options object argument passed with forbidUnknownValues undefined`, () => {
75+
const anonymousObject = { badKey: 'This should not pass.' };
76+
77+
return validator.validate(anonymousObject, { forbidUnknownValues: undefined }).then(errors => {
78+
expect(errors.length).toEqual(1);
79+
expect(errors[0].target).toEqual(anonymousObject);
80+
expect(errors[0].property).toEqual(undefined);
81+
expect(errors[0].value).toEqual(undefined);
82+
expect(errors[0].children).toBeInstanceOf(Array);
83+
expect(errors[0].constraints).toEqual({ unknownValue: 'an unknown value was passed to the validate function' });
84+
});
85+
});
4786
});

0 commit comments

Comments
 (0)