Skip to content

Commit

Permalink
feat: change class-validator to class-validator-multi-lang for suppor…
Browse files Browse the repository at this point in the history
…t i18n
  • Loading branch information
EndyKaufman committed Sep 9, 2020
1 parent 1a80144 commit df0eab4
Show file tree
Hide file tree
Showing 23 changed files with 1,029 additions and 1,771 deletions.
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
[![npm version](https://badge.fury.io/js/ngx-dynamic-form-builder.svg)](https://badge.fury.io/js/ngx-dynamic-form-builder)


[FormBuilder](https://angular.io/api/forms/FormBuilder) + [class-transformer](https://github.com/typestack/class-transformer) + [class-validator](https://github.com/typestack/class-validator) = dynamic form group builder for [Angular10+](https://angular.io)
[FormBuilder](https://angular.io/api/forms/FormBuilder) + [class-transformer](https://github.com/typestack/class-transformer) + [class-validator-multi-lang](https://github.com/endykaufman/class-validator-multi-lang) = dynamic form group builder for [Angular10+](https://angular.io)

## Installation

```bash
npm i --save class-transformer class-validator ngx-dynamic-form-builder
npm i --save class-transformer class-validator-multi-lang ngx-dynamic-form-builder
```

## Links
Expand All @@ -22,7 +22,7 @@ npm i --save class-transformer class-validator ngx-dynamic-form-builder

company.ts
```js
import { Validate, IsNotEmpty } from 'class-validator';
import { Validate, IsNotEmpty } from 'class-validator-multi-lang';
import { plainToClassFromExist } from 'class-transformer';
import { TextLengthMore15 } from '../utils/custom-validators';

Expand Down Expand Up @@ -71,7 +71,7 @@ company-panel.component.html
</p>
<p>Form status: {{ form.status | json }}</p>
<p>
Form class-validator errors: {{errors|json}}
Form class-validator-multi-lang errors: {{errors|json}}
</p>
<p>
Form native errors: {{form?.nativeValidateErrors|async|json}}
Expand Down Expand Up @@ -138,7 +138,7 @@ custom-validators.ts
```js
import {
ValidatorConstraintInterface, ValidatorConstraint
} from 'class-validator';
} from 'class-validator-multi-lang';

@ValidatorConstraint()
export class TextLengthMore15 implements ValidatorConstraintInterface {
Expand Down
14 changes: 11 additions & 3 deletions angular.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"allowedCommonJsDependencies": [
"class-transformer",
"validator",
"class-validator-multi-lang"
],
"outputPath": "dist/demo",
"index": "apps/demo/src/index.html",
"main": "apps/demo/src/main.ts",
Expand Down Expand Up @@ -50,15 +55,15 @@
"with": "apps/demo/src/environments/environment.prod.ts"
}
],
"optimization": true,
"optimization": false,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"buildOptimizer": false,
"serviceWorker": true
}
}
Expand Down Expand Up @@ -192,5 +197,8 @@
}
}
},
"defaultProject": "demo"
"defaultProject": "demo",
"cli": {
"analytics": false
}
}
3 changes: 1 addition & 2 deletions apps/demo/src/app/shared/models/company.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { Validate, IsNotEmpty, MaxLength, Min, Max, IsOptional } from 'class-validator';
import { plainToClassFromExist } from 'class-transformer';
import { IsNotEmpty, IsOptional, Max, MaxLength, Min, Validate } from 'class-validator-multi-lang';
import { TextLengthMore15 } from '../utils/custom-validators';

export class Company {
static strings = {
id: 'Id',
Expand Down
5 changes: 3 additions & 2 deletions apps/demo/src/app/shared/models/department.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Type, plainToClassFromExist } from 'class-transformer';
import { IsNotEmpty, IsOptional, ValidateNested } from 'class-validator';
import { plainToClassFromExist } from 'class-transformer';
import { Type } from 'class-transformer';
import { IsNotEmpty, IsOptional, ValidateNested } from 'class-validator-multi-lang';
import { serializeModel } from '../utils/custom-transforms';
import { Company } from './company';

Expand Down
2 changes: 1 addition & 1 deletion apps/demo/src/app/shared/models/exp-company.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Validate, IsNotEmpty, Min, Max, MaxLength, IsOptional } from 'class-validator';
import { Validate, IsNotEmpty, Min, Max, MaxLength, IsOptional } from 'class-validator-multi-lang';
import { TextLengthMore15 } from '../utils/custom-validators';

export class ExpCompany {
Expand Down
2 changes: 1 addition & 1 deletion apps/demo/src/app/shared/models/exp-department.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { IsNotEmpty, ValidateNested, IsOptional } from 'class-validator';
import { IsNotEmpty, ValidateNested, IsOptional } from 'class-validator-multi-lang';
import { ExpCompany } from './exp-company';

export class ExpDepartment {
Expand Down
2 changes: 1 addition & 1 deletion apps/demo/src/app/shared/models/exp-user.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { IsEmail, IsNotEmpty, IsOptional, Validate, ValidateIf, ValidateNested } from 'class-validator';
import { IsEmail, IsNotEmpty, IsOptional, Validate, ValidateIf, ValidateNested } from 'class-validator-multi-lang';
import { EqualsTo } from '../utils/custom-validators';
import { ExpDepartment } from './exp-department';

Expand Down
2 changes: 1 addition & 1 deletion apps/demo/src/app/shared/models/project.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Type } from 'class-transformer';
import { IsNotEmpty, IsOptional, Validate, ValidateNested } from 'class-validator';
import { IsNotEmpty, IsOptional, Validate, ValidateNested } from 'class-validator-multi-lang';
import { ProjectPanelStepsEnum } from '../enums/project-panel-steps.enum';
import { serializeModel } from '../utils/custom-transforms';
import { ObjectMustBeNotEmpty } from '../utils/custom-validators';
Expand Down
2 changes: 1 addition & 1 deletion apps/demo/src/app/shared/models/task.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { plainToClassFromExist } from 'class-transformer';
import { IsNotEmpty } from 'class-validator';
import { IsNotEmpty } from 'class-validator-multi-lang';

export class Task {
id?: number = undefined;
Expand Down
5 changes: 3 additions & 2 deletions apps/demo/src/app/shared/models/user.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { plainToClassFromExist, Transform, Type } from 'class-transformer';
import { IsEmail, IsNotEmpty, IsOptional, Matches, ValidateNested } from 'class-validator';
import { IsEmail, IsNotEmpty, IsOptional, Matches, ValidateNested } from 'class-validator-multi-lang';
import { serializeModel, transformDateToString, transformStringToDate } from '../utils/custom-transforms';
import { Department } from './department';
import { Type, Transform } from 'class-transformer';
import { plainToClassFromExist } from 'class-transformer';

export class User {
static strings = {
Expand Down
2 changes: 1 addition & 1 deletion apps/demo/src/app/shared/utils/custom-validators.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ValidationArguments, ValidatorConstraint, ValidatorConstraintInterface } from 'class-validator';
import { ValidationArguments, ValidatorConstraint, ValidatorConstraintInterface } from 'class-validator-multi-lang';

@ValidatorConstraint()
export class TextLengthMore15 implements ValidatorConstraintInterface {
Expand Down
10 changes: 5 additions & 5 deletions libs/ngx-dynamic-form-builder/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
[![npm version](https://badge.fury.io/js/ngx-dynamic-form-builder.svg)](https://badge.fury.io/js/ngx-dynamic-form-builder)


[FormBuilder](https://angular.io/api/forms/FormBuilder) + [class-transformer](https://github.com/typestack/class-transformer) + [class-validator](https://github.com/typestack/class-validator) = dynamic form group builder for [Angular10+](https://angular.io)
[FormBuilder](https://angular.io/api/forms/FormBuilder) + [class-transformer](https://github.com/typestack/class-transformer) + [class-validator-multi-lang](https://github.com/typestack/class-validator-multi-lang) = dynamic form group builder for [Angular10+](https://angular.io)

## Installation

```bash
npm i --save class-transformer class-validator ngx-dynamic-form-builder
npm i --save class-transformer class-validator-multi-lang ngx-dynamic-form-builder
```

## Links
Expand Down Expand Up @@ -42,7 +42,7 @@ export class AppModule {}

company.ts
```js
import { Validate, IsNotEmpty } from 'class-validator';
import { Validate, IsNotEmpty } from 'class-validator-multi-lang';
import { plainToClassFromExist } from 'class-transformer';
import { TextLengthMore15 } from '../utils/custom-validators';

Expand All @@ -69,7 +69,7 @@ company-panel.component.html
</p>
<p>Form status: {{ form.status | json }}</p>
<p>
Form class-validator errors: {{errors|json}}
Form class-validator-multi-lang errors: {{errors|json}}
</p>
<p>
Form native errors: {{form?.nativeValidateErrors|async|json}}
Expand Down Expand Up @@ -136,7 +136,7 @@ custom-validators.ts
```js
import {
ValidatorConstraintInterface, ValidatorConstraint
} from 'class-validator';
} from 'class-validator-multi-lang';

@ValidatorConstraint()
export class TextLengthMore15 implements ValidatorConstraintInterface {
Expand Down
2 changes: 1 addition & 1 deletion libs/ngx-dynamic-form-builder/ng-package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"entryFile": "src/public_api.ts",
"umdModuleIds": {
"class-transformer": "class-transformer",
"class-validator": "class-validator"
"class-validator-multi-lang": "class-validator-multi-lang"
}
},
"whitelistedNonPeerDependencies": [
Expand Down
2 changes: 1 addition & 1 deletion libs/ngx-dynamic-form-builder/ng-package.prod.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"entryFile": "src/public_api.ts",
"umdModuleIds": {
"class-transformer": "class-transformer",
"class-validator": "class-validator"
"class-validator-multi-lang": "class-validator-multi-lang"
}
},
"whitelistedNonPeerDependencies": [
Expand Down
13 changes: 7 additions & 6 deletions libs/ngx-dynamic-form-builder/package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
{
"name": "ngx-dynamic-form-builder",
"version": "1.6.1",
"description": "FormBuilder + class-transformer + class-validator = dynamic form group builder for Angular10+",
"description": "FormBuilder + class-transformer + class-validator-multi-lang = dynamic form group builder for Angular10+",
"keywords": [
"form-builder",
"class-transformer",
"class-validator",
"class-validator-multi-lang",
"auto",
"dynamic",
"formgroup",
Expand Down Expand Up @@ -43,12 +44,12 @@
],
"peerDependencies": {
"rxjs": "^6.6.2",
"@angular/forms": "^10.0.9",
"@angular/common": "^10.0.9",
"@angular/compiler": "^10.0.9",
"@angular/core": "^10.0.9",
"@angular/forms": "^10.1.0",
"@angular/common": "^10.1.0",
"@angular/compiler": "^10.1.0",
"@angular/core": "^10.1.0",
"class-transformer": "^0.3.1",
"class-validator": "^0.12.2"
"class-validator-multi-lang": "^0.120.201"
},
"dependencies": {
"lodash.clonedeep": "^4.5.0",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { AbstractControlOptions, AsyncValidatorFn, ValidatorFn } from '@angular/forms';
import { ValidatorOptions } from 'class-validator';
import { ValidatorOptions } from 'class-validator-multi-lang';

export interface DynamicFormGroupConfig {
validator?: ValidatorFn | undefined;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ValidationMetadata } from 'class-validator/types/metadata/ValidationMetadata';
import { DynamicFormGroup } from '../utils/dynamic-form-group';
import { ValidatorFunctionType } from './validator-function-type';
import { ValidationMetadata } from 'class-validator-multi-lang';

export interface DynamicFormGroupField {
data: any | DynamicFormGroup<any>;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { AsyncValidatorFn, FormControl, ValidatorFn } from '@angular/forms';
import { ValidationMetadata } from 'class-validator/types/metadata/ValidationMetadata';
import { Observable } from 'rxjs';
import { DynamicFormGroupField } from '../models/dynamic-form-group-field';
import { ValidationMetadata } from 'class-validator-multi-lang';

export class DynamicFormControl extends FormControl {
public controlName: string;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { ValidationError } from 'class-validator';
import { ShortValidationErrors } from '../models/short-validation-errors';
import { ValidationError } from 'class-validator-multi-lang';

const cloneDeep = require('lodash.clonedeep');
const mergeWith = require('lodash.mergewith');
Expand Down
30 changes: 22 additions & 8 deletions libs/ngx-dynamic-form-builder/src/lib/utils/dynamic-form-group.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,14 @@ import {
} from '@angular/forms';
import { classToClass, plainToClass } from 'class-transformer';
import { ClassType } from 'class-transformer/ClassTransformer';
import { getMetadataStorage, validateSync, ValidationTypes, Validator, ValidatorOptions } from 'class-validator';
import { ValidationMetadata } from 'class-validator/types/metadata/ValidationMetadata';
import {
getMetadataStorage,
validateSync,
ValidationMetadata,
ValidationTypes,
Validator,
ValidatorOptions,
} from 'class-validator-multi-lang';
import stringify from 'fast-safe-stringify';
import 'reflect-metadata';
import { BehaviorSubject, Subject, Subscription } from 'rxjs';
Expand Down Expand Up @@ -581,18 +587,26 @@ export function getClassValidators<TModel>(
fields?: Dictionary,
validatorOptions?: ValidatorOptions
) {
const groups = validatorOptions ? validatorOptions.groups : undefined;
const strictGroups = (validatorOptions && validatorOptions.strictGroups) || false;
const always = (validatorOptions && validatorOptions.always) || false;

// console.time(String(factoryModel));
// Get the validation rules from the object decorators
let allValidationMetadatas: ValidationMetadata[] | any = getMetadataStorage().getTargetValidationMetadatas(
factoryModel,
''
'',
always,
strictGroups
);

// Get the validation rules for the validation group: https://github.com/typestack/class-validator#validation-groups
// Get the validation rules for the validation group: https://github.com/typestack/class-validator-multi-lang#validation-groups
let validationGroupMetadatas: ValidationMetadata[] | any = getMetadataStorage().getTargetValidationMetadatas(
factoryModel,
'',
validatorOptions && validatorOptions.groups ? validatorOptions.groups : undefined
always,
strictGroups,
groups
);
const formGroupFields = {};

Expand Down Expand Up @@ -626,7 +640,7 @@ export function getClassValidators<TModel>(
}
});

// Nested Validation for the field for the requested class-validator group
// Nested Validation for the field for the requested class-validator-multi-lang group
nestedGroupValidations = [];
validationGroupMetadatas.forEach((validationMetadata) => {
if (isPropertyValidatorOfType(validationMetadata, fieldName, ValidationKeys.nested.type)) {
Expand Down Expand Up @@ -814,7 +828,7 @@ export function getClassValidators<TModel>(

/**
* marked with @Validate(...)
* https://github.com/typestack/class-validator#custom-validation-classes
* https://github.com/typestack/class-validator-multi-lang#custom-validation-classes
*/
function isCustomValidate(validationMetadata: ValidationMetadata, typeKey: string) {
return (
Expand All @@ -826,7 +840,7 @@ export function getClassValidators<TModel>(

/**
* marked with @ValidateNested()
* https://github.com/typestack/class-validator#validating-nested-objects
* https://github.com/typestack/class-validator-multi-lang#validating-nested-objects
*/
function isNestedValidate(validationMetadata: ValidationMetadata, typeKey: string) {
return (
Expand Down
Loading

0 comments on commit df0eab4

Please sign in to comment.