ngx-reactive-form-class-validator
Version:
A lightweight library for dynamically validate Angular reactive forms using class-validator library.
1 lines • 21.7 kB
Source Map (JSON)
{"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, eagerValidation: boolean = false): void {\n this.name = name;\n this.formGroupClassValue = value;\n\n if (eagerValidation) {\n this.updateValueAndValidity();\n }\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';\nimport { ClassValidatorFormGroupOptions } from './class-validator-form-group-options.interface';\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 * @param options Options object of type `ClassValidatorFormGroupOptions` allowing\n * to define eagerValidation that validate controls immediately upon creation. Default is false (validators are executed starting from ngAfterViewInit hook)\n * See https://github.com/abarghoud/ngx-reactive-form-class-validator/issues/47\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 private readonly options?: ClassValidatorFormGroupOptions,\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 control.setNameAndFormGroupClassValue(controlName, this.classValue, this.options?.eagerValidation);\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';\nimport { ClassValidatorFormGroupOptions } from './class-validator-form-group-options.interface';\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 * @param classValidatorGroupOptions Options object of type `ClassValidatorFormGroupOptions` allowing\n * to define eagerValidation that validate controls immediately upon creation. Default is false (validators are executed starting from ngAfterViewInit hook)\n * See https://github.com/abarghoud/ngx-reactive-form-class-validator/issues/47\n *\n */\n public group(\n formClassType: ClassType<any>,\n controlsConfig: { [p: string]: any },\n options?: AbstractControlOptions | { [p: string]: any } | null,\n classValidatorGroupOptions?: ClassValidatorFormGroupOptions,\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 }, undefined, classValidatorGroupOptions);\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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"}