Comments (3)
Hello,
We had similar need for the application we develop and we created custom validators to manage those cases:
- IsEmptyIf
- IsOptionalIf
- IsNotEmptyIf
- ...
For the case you show it would be:
export class CreateItemDto {
@IsBoolean()
price_show: boolean;
@IsOptionalIf<CreateItemDto>(o => o.price_show === false)
@IsEmptyIf<CreateItemDto>(o => o.price_show === false)
@IsNotEmptyIf<CreateItemDto>(o => o.price_show === true)
@IsNumber()
@Min(10)
//TODO: if price_show is false, then price MUST BE NULL. How to achieve that?
price: number | null;
}
It is a bit heavy but it works fine!
The custom validators
import { isEmpty, registerDecorator, ValidationArguments, ValidationOptions } from 'class-validator';
export function IsEmptyIf<T>(condition: (object: T) => boolean, validationOptions?: ValidationOptions) {
return function (object: Object, propertyName: string) {
registerDecorator({
name: 'isEmpty',
target: object.constructor,
propertyName: propertyName,
constraints: [condition],
options: validationOptions,
validator: {
validate(value: any, args: ValidationArguments) {
const [relatedCondition] = args.constraints;
const cond = relatedCondition(args.object);
if (cond && Array.isArray(value) && validationOptions && validationOptions.each)
return value.every(v => isEmpty(v));
else if (cond)
return isEmpty(value);
return true;
}
}
});
};
}
// eslint-disable-next-line no-restricted-imports
import { isNotEmpty, registerDecorator, ValidationArguments, ValidationOptions } from 'class-validator';
export function IsNotEmptyIf<T>(condition: (object: T) => boolean, validationOptions?: ValidationOptions) {
return function (object: Object, propertyName: string) {
registerDecorator({
name: 'isNotEmpty',
target: object.constructor,
propertyName: propertyName,
constraints: [condition],
options: validationOptions,
validator: {
validate(value: any, args: ValidationArguments) {
const [relatedCondition] = args.constraints;
const cond = relatedCondition(args.object);
if (cond)
return isNotEmpty(value);
return true;
}
}
});
};
}
import { ValidateIf, ValidationOptions } from 'class-validator';
/**
* Checks if value is missing and if so, ignores all validators.
**/
export function IsOptionalIf<T>(condition: (object: T, value: any) => boolean, validationOptions?: ValidationOptions) {
return ValidateIf((object: T, value: any) => {
const valueIsNil = (value === '' || value === null || value === undefined);
return !valueIsNil || !condition(object, value);
}, validationOptions);
}
If you find a better way, I would be interested. Indeed we would have loved to have a single validator to merge the 3 validator as we often use them together...
from class-validator.
Thanks for your reply BUONJG!
Someone helped me on stackoverflow a couple days ago.
I think that for my specific case it's the simplest method.
Anyway, validating more complex data is strange in this library...
from class-validator.
Related Issues (20)
- question: How do I set a default error message for my decorator? HOT 2
- question: Default definition "strong password" is unclear HOT 3
- question: isPhoneNumber validation input without country code HOT 1
- question: nested validation but discriminated depending on a field value in the root dto HOT 3
- feature: return promise from validation only if necessary and validate sync if possible
- fix: Typo in MaxDate comment HOT 2
- question: get constrains in decorators and not the message HOT 1
- fix please: class level decorator makes bug HOT 2
- feature: add `@IsVatId()` decorator HOT 1
- Please add a JavaScript verification decorator item
- question: How to get object state before it was transformed in Validator?
- Unable to use cutom validator, since it is saying it is not a function
- feature: accsess eachPrefix in error messages
- Easy way to compose ORed validators HOT 1
- question: array of numbers with null values HOT 1
- fix: Cannot find namespace 'ValidatorJS'
- fix: ValidateNested allows empty arrays as objecs
- question: Validating based upon root object's property
- feature: ValidateNested Array is not Working
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from class-validator.