UNPKG

ngx-reactive-form-class-validator

Version:

A lightweight library for dynamically validate Angular reactive forms using class-validator library.

1 lines 20.3 kB
{"version":3,"file":"ngx-reactive-form-class-validator.mjs","sources":["../../../../libs/ngx-reactive-form-class-validator/src/lib/class-validator-form-array.ts","../../../../libs/ngx-reactive-form-class-validator/src/lib/class-validator-form-control.ts","../../../../libs/ngx-reactive-form-class-validator/src/lib/class-validator-form-group.ts","../../../../libs/ngx-reactive-form-class-validator/src/lib/class-validator-form-builder.service.ts","../../../../libs/ngx-reactive-form-class-validator/src/lib/class-validator-form-builder.module.ts","../../../../libs/ngx-reactive-form-class-validator/src/ngx-reactive-form-class-validator.ts"],"sourcesContent":["import {\n AbstractControl,\n AbstractControlOptions,\n AsyncValidatorFn,\n FormArray,\n ValidatorFn\n} from '@angular/forms';\n\nexport class ClassValidatorFormArray extends FormArray {\n public constructor(\n controls: AbstractControl[],\n validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,\n asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null,\n ) {\n super(\n controls,\n validatorOrOpts,\n asyncValidator,\n );\n }\n}\n","import {\n AbstractControlOptions,\n AsyncValidatorFn,\n FormControl,\n ValidationErrors,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport { validateSync } from 'class-validator';\n\nexport class ClassValidatorFormControl<T = any> extends FormControl<T | any> {\n private formGroupClassValue: any;\n private name: string;\n\n /**\n * Creates a new `ClassValidatorFormControl` instance.\n *\n * @param formState Initializes the control with an initial value,\n * or an object that defines the initial value and disabled state.\n *\n * @param validatorOrOpts A synchronous validator function, or an array of\n * such functions, or an `AbstractControlOptions` object that contains validation functions\n * and a validation trigger.\n *\n * @param asyncValidator A single async validator or array of async validator functions\n *\n */\n public constructor(\n formState?: any,\n validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,\n asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\n ) {\n super(formState, validatorOrOpts, asyncValidator);\n\n this.setValidatorsWithDynamicValidation(validatorOrOpts);\n }\n\n /**\n * @internal\n */\n public setNameAndFormGroupClassValue(name: string, value: any): void {\n this.name = name;\n this.formGroupClassValue = value;\n }\n\n /**\n * Sets the synchronous validators that are active on this control as well as resetting the dynamic `class-validator`. Calling\n * this overwrites any existing sync validators.\n *\n * When you add or remove a validator at run time, you must call\n * `updateValueAndValidity()` for the new validation to take effect.\n *\n */\n public setValidatorsWithDynamicValidation(newValidator: ValidatorFn | ValidatorFn[] | AbstractControlOptions | undefined): void {\n this.setValidators(\n newValidator\n ? [this.composeValidators(newValidator), this.dynamicValidator]\n : this.dynamicValidator);\n }\n\n private composeValidators(validator: ValidatorFn | ValidatorFn[] | AbstractControlOptions): ValidatorFn {\n if (validator instanceof Array) {\n return Validators.compose(validator);\n }\n\n if ((validator as AbstractControlOptions).validators) {\n return this.composeValidators((validator as AbstractControlOptions).validators);\n }\n\n return validator as ValidatorFn;\n }\n\n private readonly dynamicValidator = (control: ClassValidatorFormControl): ValidationErrors => {\n this.formGroupClassValue[this.name] = control.value;\n\n const validationErrors = validateSync(this.formGroupClassValue)\n .find(error => error.property === this.name);\n\n return validationErrors ? validationErrors.constraints : undefined;\n };\n}\n","import {\n AbstractControl,\n AbstractControlOptions,\n AsyncValidatorFn,\n FormGroup,\n ValidatorFn,\n ɵOptionalKeys\n} from '@angular/forms';\n\nimport { ClassValidatorFormControl } from './class-validator-form-control';\nimport { ClassType } from './types';\n\nexport class ClassValidatorFormGroup<TControl extends {\n [K in keyof TControl]: AbstractControl<any>;\n} = any> extends FormGroup<TControl> {\n private classValue: any;\n\n /**\n * Creates a new `ClassValidatorFormGroup` instance.\n *\n * @param formClassType the `classType` containing `class-validator` decorators to be used to validate form\n * @param controls A collection of child controls. The key for each child is the name\n * under which it is registered.\n *\n * @param validatorOrOpts A synchronous validator function, or an array of\n * such functions, or an `AbstractControlOptions` object that contains validation functions\n * and a validation trigger.\n *\n * @param asyncValidator A single async validator or array of async validator functions\n *\n */\n public constructor(\n private readonly formClassType: ClassType<any>,\n controls: TControl,\n validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,\n asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null,\n ) {\n super(controls, validatorOrOpts, asyncValidator);\n\n this.assignFormValueToClassValue();\n this.setClassValidatorControlsContainerGroupClassValue();\n }\n\n /**\n * Add a control to this group.\n *\n * This method also updates the value and validity of the control.\n *\n * @param name The control name to add to the collection\n * @param control Provides the control for the given name\n * @param options Specifies whether this FormGroup instance should emit events after a new\n * control is added.\n * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and\n * `valueChanges` observables emit events with the latest status and value when the control is\n * added. When false, no events are emitted.\n *\n */\n public addControl<K extends string&keyof TControl>(\n name: K,\n control: Required<TControl>[K],\n options?: {\n emitEvent?: boolean;\n },\n ): void {\n super.addControl(name, control, options);\n this.assignFormValueToClassValue();\n this.setClassValidatorControlsContainerGroupClassValue();\n }\n\n /**\n * Remove a control from this group.\n *\n * @param name The control name to remove from the collection\n * @param options Specifies whether this FormGroup instance should emit events after a\n * control is removed.\n * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and\n * `valueChanges` observables emit events with the latest status and value when the control is\n * removed. When false, no events are emitted.\n */\n public removeControl<S extends string>(\n name: ɵOptionalKeys<TControl>&S, options: {emitEvent?: boolean;} = {}\n ): void {\n super.removeControl(name, options);\n this.assignFormValueToClassValue();\n this.setClassValidatorControlsContainerGroupClassValue();\n }\n\n private setClassValidatorControlsContainerGroupClassValue(): void {\n Object.entries(this.controls).forEach(([controlName, control]) => {\n if (control instanceof ClassValidatorFormControl) {\n (this.controls[controlName] as ClassValidatorFormControl)\n .setNameAndFormGroupClassValue(controlName, this.classValue);\n }\n });\n }\n\n private assignFormValueToClassValue(): void {\n this.classValue = Object.assign(new this.formClassType(), this.value);\n }\n}\n\n","import { Injectable } from '@angular/core';\nimport {\n AbstractControl,\n AbstractControlOptions,\n AsyncValidatorFn,\n FormArray,\n FormControl,\n FormControlState,\n FormGroup,\n ValidatorFn\n} from '@angular/forms';\n\nimport { ClassValidatorFormGroup } from './class-validator-form-group';\nimport { ClassValidatorFormControl } from './class-validator-form-control';\nimport { ClassValidatorFormArray } from './class-validator-form-array';\nimport { ClassType } from './types';\n\n// Coming from https://github.com/angular/angular/blob/3b0b7d22109c79b4dceb4ae069c3927894cf1bd6/packages/forms/src/form_builder.ts#L14\nconst isAbstractControlOptions = (options: AbstractControlOptions | { [key: string]: any }): options is AbstractControlOptions =>\n (options as AbstractControlOptions).asyncValidators !== undefined ||\n (options as AbstractControlOptions).validators !== undefined ||\n (options as AbstractControlOptions).updateOn !== undefined;\n\n@Injectable()\nexport class ClassValidatorFormBuilderService {\n /**\n * @description\n * Construct a new `FormGroup` instance.\n *\n * @param formClassType the `classType` containing `class-validator` decorators to be used to validate form\n * @param controlsConfig A collection of child controls. The key for each child is the name\n * under which it is registered.\n *\n * @param options Configuration options object for the `FormGroup`. The object can\n * have two shapes:\n *\n * 1) `AbstractControlOptions` object (preferred), which consists of:\n * * `validators`: A synchronous validator function, or an array of validator functions\n * * `asyncValidators`: A single async validator or array of async validator functions\n * * `updateOn`: The event upon which the control should be updated (options: 'change' | 'blur' |\n * submit')\n *\n * 2) Legacy configuration object, which consists of:\n * * `validator`: A synchronous validator function, or an array of validator functions\n * * `asyncValidator`: A single async validator or array of async validator functions\n *\n */\n public group(\n formClassType: ClassType<any>,\n controlsConfig: { [p: string]: any },\n options?: AbstractControlOptions | { [p: string]: any } | null\n ): ClassValidatorFormGroup {\n // Coming from https://github.com/angular/angular/blob/3b0b7d22109c79b4dceb4ae069c3927894cf1bd6/packages/forms/src/form_builder.ts#L59\n const controls = this.reduceControls(controlsConfig);\n\n let validators: ValidatorFn | ValidatorFn[] | null = null;\n let asyncValidators: AsyncValidatorFn | AsyncValidatorFn[] | null = null;\n let updateOn;\n\n if (options) {\n if (isAbstractControlOptions(options)) {\n // `options` are `AbstractControlOptions`\n validators = options.validators ? options.validators : null;\n asyncValidators = options.asyncValidators ? options.asyncValidators : null;\n updateOn = options.updateOn ? options.updateOn : undefined;\n } else {\n // `options` are legacy form group options\n validators = options['validator'] !== null ? options['validator'] : null;\n asyncValidators = options['asyncValidator'] !== null ? options['asyncValidator'] : null;\n }\n }\n\n return new ClassValidatorFormGroup(formClassType, controls, { asyncValidators, updateOn, validators });\n }\n\n /**\n * Constructs a new `FormArray` from the given array of configurations,\n * validators and options.\n *\n * @param controlsConfig An array of child controls or control configs. Each\n * child control is given an index when it is registered.\n *\n * @param validatorOrOpts A synchronous validator function, or an array of\n * such functions, or an `AbstractControlOptions` object that contains\n * validation functions and a validation trigger.\n *\n * @param asyncValidator A single async validator or array of async validator\n * functions.\n */\n public array<T>(\n controlsConfig: Array<T>,\n validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,\n asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\n ): FormArray {\n const controls = controlsConfig.map(control => this.createControl(control));\n\n return new ClassValidatorFormArray(controls, validatorOrOpts, asyncValidator);\n }\n\n\n /**\n * @description\n * Construct a new `FormControl` with the given state, validators and options.\n *\n * @param formState Initializes the control with an initial state value, or\n * with an object that contains both a value and a disabled status.\n *\n * @param validatorOrOpts A synchronous validator function, or an array of\n * such functions, or an `AbstractControlOptions` object that contains\n * validation functions and a validation trigger.\n *\n * @param asyncValidator A single async validator or array of async validator\n * functions.\n *\n * @usageNotes\n *\n * ### Initialize a control as disabled\n *\n * The following example returns a control with an initial value in a disabled state.\n *\n * <code-example path=\"forms/ts/formBuilder/form_builder_example.ts\" region=\"disabled-control\">\n * </code-example>\n */\n public control<T>(\n formState: T|FormControlState<T>,\n validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,\n asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\n ): ClassValidatorFormControl {\n return new ClassValidatorFormControl(formState, validatorOrOpts, asyncValidator);\n }\n\n // Coming from https://github.com/angular/angular/blob/3b0b7d22109c79b4dceb4ae069c3927894cf1bd6/packages/forms/src/form_builder.ts#L133\n private reduceControls(controlsConfig: { [k: string]: any }): { [key: string]: AbstractControl } {\n const controls: { [key: string]: AbstractControl } = {};\n\n Object.keys(controlsConfig).forEach(controlName => {\n controls[controlName] = this.createControl(controlsConfig[controlName]);\n });\n\n return controls;\n }\n\n private createControl(controlConfig: any): AbstractControl {\n if (\n controlConfig instanceof FormControl\n || controlConfig instanceof FormGroup\n || controlConfig instanceof FormArray\n ) {\n return controlConfig;\n } else if (Array.isArray(controlConfig)) {\n const value = controlConfig[0];\n const validator: ValidatorFn = controlConfig.length > 1 ? controlConfig[1] : null;\n const asyncValidator: AsyncValidatorFn = controlConfig.length > 2 ? controlConfig[2] : null;\n\n return this.control(value, validator, asyncValidator);\n } else {\n return this.control(controlConfig);\n }\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { ClassValidatorFormBuilderService } from './class-validator-form-builder.service';\n\n@NgModule({\n imports: [CommonModule],\n providers: [ClassValidatorFormBuilderService],\n})\nexport class ClassValidatorFormBuilderModule {\n public static forRoot(): ModuleWithProviders<ClassValidatorFormBuilderModule> {\n return {\n ngModule: ClassValidatorFormBuilderModule,\n providers: [\n ClassValidatorFormBuilderService,\n ],\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}