ngx-vest-forms
Version:
Opinionated template-driven forms library for Angular
1 lines • 51.6 kB
Source Map (JSON)
{"version":3,"file":"ngx-vest-forms.mjs","sources":["../../../projects/ngx-vest-forms/src/lib/constants.ts","../../../projects/ngx-vest-forms/src/lib/utils/form-utils.ts","../../../projects/ngx-vest-forms/src/lib/directives/validate-root-form.directive.ts","../../../projects/ngx-vest-forms/src/lib/utils/shape-validation.ts","../../../projects/ngx-vest-forms/src/lib/directives/form.directive.ts","../../../projects/ngx-vest-forms/src/lib/components/control-wrapper/control-wrapper.component.ts","../../../projects/ngx-vest-forms/src/lib/components/control-wrapper/control-wrapper.component.html","../../../projects/ngx-vest-forms/src/lib/directives/form-model.directive.ts","../../../projects/ngx-vest-forms/src/lib/directives/form-model-group.directive.ts","../../../projects/ngx-vest-forms/src/lib/exports.ts","../../../projects/ngx-vest-forms/src/lib/utils/array-to-object.ts","../../../projects/ngx-vest-forms/src/public-api.ts","../../../projects/ngx-vest-forms/src/ngx-vest-forms.ts"],"sourcesContent":["export const ROOT_FORM = 'rootForm';\n","import { AbstractControl, FormArray, FormGroup } from '@angular/forms';\nimport { ROOT_FORM } from '../constants';\n\n/**\n * Recursively calculates the path of a form control\n * @param formGroup\n * @param control\n */\nfunction getControlPath(\n formGroup: FormGroup,\n control: AbstractControl\n): string {\n for (const key in formGroup.controls) {\n if (formGroup.controls.hasOwnProperty(key)) {\n const ctrl = formGroup.get(key);\n if (ctrl instanceof FormGroup) {\n const path = getControlPath(ctrl, control);\n if (path) {\n return key + '.' + path;\n }\n } else if (ctrl === control) {\n return key;\n }\n }\n }\n return '';\n}\n\n/**\n * Recursively calculates the path of a form group\n * @param formGroup\n * @param control\n */\nfunction getGroupPath(formGroup: FormGroup, control: AbstractControl): string {\n for (const key in formGroup.controls) {\n if (formGroup.controls.hasOwnProperty(key)) {\n const ctrl = formGroup.get(key);\n if (ctrl === control) {\n return key;\n }\n if (ctrl instanceof FormGroup) {\n const path = getGroupPath(ctrl, control);\n if (path) {\n return key + '.' + path;\n }\n }\n }\n }\n return '';\n}\n\n/**\n * Calculates the field name of a form control: Eg: addresses.shippingAddress.street\n * @param rootForm\n * @param control\n */\nexport function getFormControlField(\n rootForm: FormGroup,\n control: AbstractControl\n): string {\n return getControlPath(rootForm, control);\n}\n\n/**\n * Calcuates the field name of a form group Eg: addresses.shippingAddress\n * @param rootForm\n * @param control\n */\nexport function getFormGroupField(\n rootForm: FormGroup,\n control: AbstractControl\n): string {\n return getGroupPath(rootForm, control);\n}\n\n/**\n * This RxJS operator merges the value of the form with the raw value.\n * By doing this we can assure that we don't lose values of disabled form fields\n * @param form\n */\nexport function mergeValuesAndRawValues<T>(form: FormGroup): T {\n // Retrieve the standard values (respecting references)\n const value = { ...form.value };\n\n // Retrieve the raw values (including disabled values)\n const rawValue = form.getRawValue();\n\n // Recursive function to merge rawValue into value\n function mergeRecursive(target: any, source: any) {\n Object.keys(source).forEach((key) => {\n if (target[key] === undefined) {\n // If the key is not in the target, add it directly (for disabled fields)\n target[key] = source[key];\n } else if (\n typeof source[key] === 'object' &&\n source[key] !== null &&\n !Array.isArray(source[key])\n ) {\n // If the value is an object, merge it recursively\n mergeRecursive(target[key], source[key]);\n }\n // If the target already has the key with a primitive value, it's left as is to maintain references\n });\n }\n\n mergeRecursive(value, rawValue);\n return value;\n}\n\ntype Primitive = undefined | null | boolean | string | number | Function;\n\nfunction isPrimitive(value: any): value is Primitive {\n return (\n value === null || (typeof value !== 'object' && typeof value !== 'function')\n );\n}\n\n/**\n * Performs a deep-clone of an object\n * @param obj\n */\nexport function cloneDeep<T>(obj: T): T {\n // Handle primitives (null, undefined, boolean, string, number, function)\n if (isPrimitive(obj)) {\n return obj;\n }\n\n // Handle Date\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as any as T;\n }\n\n // Handle Array\n if (Array.isArray(obj)) {\n return obj.map((item) => cloneDeep(item)) as any as T;\n }\n\n // Handle Object\n if (obj instanceof Object) {\n const clonedObj: any = {};\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n clonedObj[key] = cloneDeep((obj as any)[key]);\n }\n }\n return clonedObj as T;\n }\n\n throw new Error(\"Unable to copy object! Its type isn't supported.\");\n}\n\n/**\n * Sets a value in an object in the correct path\n * @param obj\n * @param path\n * @param value\n */\nexport function set(obj: object, path: string, value: any): void {\n const keys = path.split('.');\n let current: any = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!current[key]) {\n current[key] = {};\n }\n current = current[key];\n }\n\n current[keys[keys.length - 1]] = value;\n}\n\n/**\n * Traverses the form and returns the errors by path\n * @param form\n */\nexport function getAllFormErrors(\n form?: AbstractControl\n): Record<string, string> {\n const errors: Record<string, string> = {};\n if (!form) {\n return errors;\n }\n\n function collect(control: AbstractControl, path: string): void {\n if (control instanceof FormGroup || control instanceof FormArray) {\n Object.keys(control.controls).forEach((key) => {\n const childControl = control.get(key);\n const controlPath = path ? `${path}.${key}` : key;\n if (path && control.errors && control.enabled) {\n Object.keys(control.errors).forEach((errorKey) => {\n errors[path] = control.errors![errorKey];\n });\n }\n if (childControl) {\n collect(childControl, controlPath);\n }\n });\n } else {\n if (control.errors && control.enabled) {\n Object.keys(control.errors).forEach((errorKey) => {\n errors[path] = control.errors![errorKey];\n });\n }\n }\n }\n\n collect(form, '');\n if (form.errors && form.errors!['errors']) {\n errors[ROOT_FORM] = form.errors && form.errors!['errors'];\n }\n\n return errors;\n}\n","import { Directive, input, OnDestroy } from '@angular/core';\nimport {\n AbstractControl,\n AsyncValidator,\n AsyncValidatorFn,\n NG_ASYNC_VALIDATORS,\n ValidationErrors,\n} from '@angular/forms';\nimport {\n debounceTime,\n Observable,\n of,\n ReplaySubject,\n Subject,\n switchMap,\n take,\n takeUntil,\n} from 'rxjs';\nimport { StaticSuite } from 'vest';\nimport { cloneDeep, set } from '../utils/form-utils';\nimport { ValidationOptions } from './validation-options';\n\n@Directive({\n selector: 'form[validateRootForm][formValue][suite]',\n standalone: true,\n providers: [\n {\n provide: NG_ASYNC_VALIDATORS,\n useExisting: ValidateRootFormDirective,\n multi: true,\n },\n ],\n})\nexport class ValidateRootFormDirective<T> implements AsyncValidator, OnDestroy {\n public validationOptions = input<ValidationOptions>({ debounceTime: 0 });\n private readonly destroy$$ = new Subject<void>();\n\n public readonly formValue = input<T | null>(null);\n public readonly suite = input<StaticSuite<\n string,\n string,\n (model: T, field: string) => void\n > | null>(null);\n\n /**\n * Whether the root form should be validated or not\n * This will use the field rootForm\n */\n public readonly validateRootForm = input(false);\n\n /**\n * Used to debounce formValues to make sure vest isn't triggered all the time\n */\n private readonly formValueCache: {\n [field: string]: Partial<{\n sub$$: ReplaySubject<unknown>;\n debounced: Observable<any>;\n }>;\n } = {};\n\n public validate(\n control: AbstractControl<any, any>\n ): Observable<ValidationErrors | null> {\n if (!this.suite() || !this.formValue()) {\n return of(null);\n }\n return this.createAsyncValidator('rootForm', this.validationOptions())(\n control.getRawValue()\n ) as Observable<ValidationErrors | null>;\n }\n\n public createAsyncValidator(field: string, validationOptions: ValidationOptions): AsyncValidatorFn {\n if (!this.suite()) {\n return () => of(null);\n }\n return (value: any) => {\n if (!this.formValue()) {\n return of(null);\n }\n const mod = cloneDeep(value as T);\n set(mod as object, field, value); // Update the property with path\n if (!this.formValueCache[field]) {\n this.formValueCache[field] = {\n sub$$: new ReplaySubject(1), // Keep track of the last model\n };\n this.formValueCache[field].debounced = this.formValueCache[\n field\n ].sub$$!.pipe(debounceTime(validationOptions.debounceTime));\n }\n // Next the latest model in the cache for a certain field\n this.formValueCache[field].sub$$!.next(mod);\n\n return this.formValueCache[field].debounced!.pipe(\n // When debounced, take the latest value and perform the asynchronous vest validation\n take(1),\n switchMap(() => {\n return new Observable((observer) => {\n this.suite()!(mod, field).done((result) => {\n const errors = result.getErrors()[field];\n observer.next(errors ? { error: errors[0], errors } : null);\n observer.complete();\n });\n }) as Observable<ValidationErrors | null>;\n }),\n takeUntil(this.destroy$$)\n );\n };\n }\n\n public ngOnDestroy(): void {\n this.destroy$$.next();\n }\n}\n","import { isDevMode } from '@angular/core';\n\n/**\n * Clean error that improves the DX when making typo's in the `name` or `ngModelGroup` attributes\n */\nexport class ShapeMismatchError extends Error {\n constructor(errorList: string[]) {\n super(`Shape mismatch:\\n\\n${errorList.join('\\n')}\\n\\n`);\n }\n}\n\n/**\n * Validates a form value against a shape\n * When there is something in the form value that is not in the shape, throw an error\n * This is how we throw runtime errors in develop when the developer has made a typo in the `name` or `ngModelGroup`\n * attributes.\n * @param formVal\n * @param shape\n */\nexport function validateShape(\n formVal: Record<string, any>,\n shape: Record<string, any>\n): void {\n // Only execute in dev mode\n if (isDevMode()) {\n const errors = validateFormValue(formVal, shape);\n if (errors.length) {\n throw new ShapeMismatchError(errors);\n }\n }\n}\n\n/**\n * Validates a form value against a shape value to see if it matches\n * Returns clean errors that have a good DX\n * @param formValue\n * @param shape\n * @param path\n */\nfunction validateFormValue(\n formValue: Record<string, any>,\n shape: Record<string, any>,\n path: string = ''\n): string[] {\n const errors: string[] = [];\n for (const key in formValue) {\n if (Object.keys(formValue).includes(key)) {\n // In form arrays we don't know how many items there are\n // This means that we always need to provide one record in the shape of our form array\n // so every time reset the key to '0' when the key is a number and is bigger than 0\n let keyToCompareWith = key;\n if (parseFloat(key) > 0) {\n keyToCompareWith = '0';\n }\n const newPath = path ? `${path}.${key}` : key;\n if (typeof formValue[key] === 'object' && formValue[key] !== null) {\n if (\n (typeof shape[keyToCompareWith] !== 'object' ||\n shape[keyToCompareWith] === null) &&\n isNaN(parseFloat(key))\n ) {\n errors.push(`[ngModelGroup] Mismatch: '${newPath}'`);\n }\n errors.push(\n ...validateFormValue(formValue[key], shape[keyToCompareWith], newPath)\n );\n } else if ((shape ? !(key in shape) : true) && isNaN(parseFloat(key))) {\n errors.push(`[ngModel] Mismatch '${newPath}'`);\n }\n }\n }\n return errors;\n}\n","import { Directive, inject, input, OnDestroy, Output } from '@angular/core';\nimport {\n AsyncValidatorFn,\n NgForm,\n PristineChangeEvent,\n StatusChangeEvent,\n ValidationErrors,\n ValueChangeEvent,\n} from '@angular/forms';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n Observable,\n of,\n ReplaySubject,\n startWith,\n Subject,\n switchMap,\n take,\n takeUntil,\n tap,\n zip,\n} from 'rxjs';\nimport { StaticSuite } from 'vest';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { DeepRequired } from '../utils/deep-required';\nimport {\n cloneDeep,\n getAllFormErrors,\n mergeValuesAndRawValues,\n set,\n} from '../utils/form-utils';\nimport { validateShape } from '../utils/shape-validation';\nimport { ValidationOptions } from './validation-options';\n\n@Directive({\n selector: 'form[scVestForm]',\n standalone: true,\n})\nexport class FormDirective<T extends Record<string, any>> implements OnDestroy {\n public readonly ngForm = inject(NgForm, { self: true, optional: false });\n\n /**\n * The value of the form, this is needed for the validation part\n */\n public readonly formValue = input<T | null>(null);\n\n /**\n * Static vest suite that will be used to feed our angular validators\n */\n public readonly suite = input<StaticSuite<\n string,\n string,\n (model: T, field: string) => void\n > | null>(null);\n\n /**\n * The shape of our form model. This is a deep required version of the form model\n * The goal is to add default values to the shape so when the template-driven form\n * contains values that shouldn't be there (typo's) that the developer gets run-time\n * errors in dev mode\n */\n public readonly formShape = input<DeepRequired<T> | null>(null);\n\n /**\n * Updates the validation config which is a dynamic object that will be used to\n * trigger validations on the dependant fields\n * Eg: ```typescript\n * validationConfig = {\n * 'passwords.password': ['passwords.confirmPassword']\n * }\n * ```\n *\n * This will trigger the updateValueAndValidity on passwords.confirmPassword every time the passwords.password gets a new value\n *\n * @param v\n */\n public readonly validationConfig = input<{ [key: string]: string[] } | null>(\n null\n );\n\n private readonly pending$ = this.ngForm.form.events.pipe(\n filter((v) => v instanceof StatusChangeEvent),\n map((v) => (v as StatusChangeEvent).status),\n filter((v) => v === 'PENDING'),\n distinctUntilChanged()\n );\n\n /**\n * Emits every time the form status changes in a state\n * that is not PENDING\n * We need this to assure that the form is in 'idle' state\n */\n public readonly idle$ = this.ngForm.form.events.pipe(\n filter((v) => v instanceof StatusChangeEvent),\n map((v) => (v as StatusChangeEvent).status),\n filter((v) => v !== 'PENDING'),\n distinctUntilChanged()\n );\n\n /**\n * Triggered as soon as the form value changes\n * Also every time Angular creates a new control or group\n * It also contains the disabled values (raw values)\n */\n @Output() public readonly formValueChange = this.ngForm.form.events.pipe(\n filter((v) => v instanceof ValueChangeEvent),\n map((v) => (v as ValueChangeEvent<any>).value),\n map(() => mergeValuesAndRawValues<T>(this.ngForm.form))\n );\n\n /**\n * Emits an object with all the errors of the form\n * every time a form control or form groups changes its status to valid or invalid\n */\n @Output() public readonly errorsChange = this.ngForm.form.events.pipe(\n filter((v) => v instanceof StatusChangeEvent),\n map((v) => (v as StatusChangeEvent).status),\n filter((v) => v !== 'PENDING'),\n map(() => getAllFormErrors(this.ngForm.form))\n );\n\n /**\n * Triggered as soon as the form becomes dirty\n */\n @Output() public readonly dirtyChange = this.ngForm.form.events.pipe(\n filter((v) => v instanceof PristineChangeEvent),\n map((v) => !(v as PristineChangeEvent).pristine),\n startWith(this.ngForm.form.dirty),\n distinctUntilChanged()\n );\n private readonly destroy$$ = new Subject<void>();\n\n /**\n * Fired when the status of the root form changes.\n */\n private readonly statusChanges$ = this.ngForm.form.statusChanges.pipe(\n startWith(this.ngForm.form.status),\n distinctUntilChanged()\n );\n\n /**\n * Triggered When the form becomes valid but waits until the form is idle\n */\n @Output() public readonly validChange = this.statusChanges$.pipe(\n filter((e) => e === 'VALID' || e === 'INVALID'),\n map((v) => v === 'VALID'),\n distinctUntilChanged()\n );\n\n /**\n * Used to debounce formValues to make sure vest isn't triggered all the time\n */\n private readonly formValueCache: {\n [field: string]: Partial<{\n sub$$: ReplaySubject<unknown>;\n debounced: Observable<any>;\n }>;\n } = {};\n\n public constructor() {\n // When the validation config changes\n // Listen to changes of the left-side of the config and trigger the updateValueAndValidity\n // function on the dependant controls or groups at the right-side of the config\n toObservable(this.validationConfig)\n .pipe(\n filter((conf) => !!conf),\n switchMap((conf) => {\n if (!conf) {\n return of(null);\n }\n const streams = Object.keys(conf).map((key) => {\n return this.ngForm?.form.get(key)?.valueChanges.pipe(\n // Wait until something is pending\n switchMap(() => this.pending$),\n // Wait until the form is not pending anymore\n switchMap(() => this.idle$),\n map(() => this.ngForm?.form.get(key)?.value),\n takeUntil(this.destroy$$),\n tap((v) => {\n conf[key]?.forEach((path: string) => {\n this.ngForm?.form.get(path)?.updateValueAndValidity({\n onlySelf: true,\n emitEvent: true,\n });\n });\n })\n );\n });\n return zip(streams);\n })\n )\n .subscribe();\n\n /**\n * Trigger shape validations if the form gets updated\n * This is how we can throw run-time errors\n */\n this.formValueChange.pipe(takeUntil(this.destroy$$)).subscribe((v) => {\n if (this.formShape()) {\n validateShape(v, this.formShape() as DeepRequired<T>);\n }\n });\n\n /**\n * Mark all the fields as touched when the form is submitted\n */\n this.ngForm.ngSubmit.subscribe(() => {\n this.ngForm.form.markAllAsTouched();\n });\n }\n\n /**\n * This will feed the formValueCache, debounce it till the next tick\n * and create an asynchronous validator that runs a vest suite\n * @param field\n * @param validationOptions\n * @returns an asynchronous validator function\n */\n public createAsyncValidator(field: string, validationOptions: ValidationOptions): AsyncValidatorFn {\n if (!this.suite()) {\n return () => of(null);\n }\n return (value: any) => {\n if (!this.formValue()) {\n return of(null);\n }\n const mod = cloneDeep(this.formValue() as T);\n set(mod as object, field, value); // Update the property with path\n if (!this.formValueCache[field]) {\n this.formValueCache[field] = {\n sub$$: new ReplaySubject(1), // Keep track of the last model\n };\n this.formValueCache[field].debounced = this.formValueCache[\n field\n ].sub$$!.pipe(debounceTime(validationOptions.debounceTime));\n }\n // Next the latest model in the cache for a certain field\n this.formValueCache[field].sub$$!.next(mod);\n\n return this.formValueCache[field].debounced!.pipe(\n // When debounced, take the latest value and perform the asynchronous vest validation\n take(1),\n switchMap(() => {\n return new Observable((observer) => {\n this.suite()!(mod, field).done((result) => {\n const errors = result.getErrors()[field];\n observer.next(errors ? { error: errors[0], errors } : null);\n observer.complete();\n });\n }) as Observable<ValidationErrors | null>;\n }),\n takeUntil(this.destroy$$)\n );\n };\n }\n\n public ngOnDestroy(): void {\n this.destroy$$.next();\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n HostBinding,\n inject,\n OnDestroy,\n} from '@angular/core';\n\nimport { AbstractControl, NgModel, NgModelGroup } from '@angular/forms';\nimport { mergeWith, of, Subject, switchMap, takeUntil } from 'rxjs';\nimport { FormDirective } from '../../directives/form.directive';\n\n@Component({\n selector: '[sc-control-wrapper]',\n standalone: true,\n templateUrl: './control-wrapper.component.html',\n styleUrls: ['./control-wrapper.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ControlWrapperComponent implements AfterViewInit, OnDestroy {\n @ContentChild(NgModel) public ngModel?: NgModel; // Optional ngModel\n public readonly ngModelGroup: NgModelGroup | null = inject(NgModelGroup, {\n optional: true,\n self: true,\n });\n private readonly destroy$$ = new Subject<void>();\n private readonly cdRef = inject(ChangeDetectorRef);\n private readonly formDirective = inject(FormDirective);\n // Cache the previous error to avoid 'flickering'\n private previousError?: string[];\n\n @HostBinding('class.sc-control-wrapper--invalid')\n public get invalid() {\n return this.control?.touched && this.errors;\n }\n\n public get errors(): string[] | undefined {\n if (this.control?.pending) {\n return this.previousError;\n } else {\n this.previousError = this.control?.errors?.['errors'];\n }\n return this.control?.errors?.['errors'];\n }\n\n private get control(): AbstractControl | undefined {\n return this.ngModelGroup\n ? this.ngModelGroup.control\n : this.ngModel?.control;\n }\n\n public ngOnDestroy(): void {\n this.destroy$$.next();\n }\n\n public ngAfterViewInit(): void {\n // Wait until the form is idle\n // Then, listen to all events of the ngModelGroup or ngModel\n // and mark the component and its ancestors as dirty\n // This allows us to use the OnPush ChangeDetection Strategy\n this.formDirective.idle$\n .pipe(\n switchMap(() => this.ngModelGroup?.control?.events || of(null)),\n mergeWith(this.control?.events || of(null)),\n takeUntil(this.destroy$$)\n )\n .subscribe(() => {\n this.cdRef.markForCheck();\n });\n }\n}\n","<div class=\"sc-control-wrapper\">\n <div class=\"sc-control-wrapper__content\">\n <ng-content></ng-content>\n </div>\n <div class=\"sc-control-wrapper__errors\">\n <ul [hidden]=\"!invalid\">\n @for (error of errors; track error) {\n <li>{{ error }}</li>\n }\n </ul>\n </div>\n</div>\n","import { Directive, inject, input } from '@angular/core';\nimport {\n AbstractControl,\n AsyncValidator,\n NG_ASYNC_VALIDATORS,\n ValidationErrors,\n} from '@angular/forms';\nimport { FormDirective } from './form.directive';\nimport { Observable } from 'rxjs';\nimport { getFormControlField } from '../utils/form-utils';\nimport { ValidationOptions } from './validation-options';\n\n/**\n * Hooks into the ngModel selector and triggers an asynchronous validation for a form model\n * It will use a vest suite behind the scenes\n */\n@Directive({\n selector: '[ngModel]',\n standalone: true,\n providers: [\n {\n provide: NG_ASYNC_VALIDATORS,\n useExisting: FormModelDirective,\n multi: true,\n },\n ],\n})\nexport class FormModelDirective implements AsyncValidator {\n public validationOptions = input<ValidationOptions>({ debounceTime: 0 });\n private readonly formDirective = inject(FormDirective);\n\n public validate(\n control: AbstractControl\n ): Observable<ValidationErrors | null> {\n const { ngForm, suite, formValue } = this.formDirective;\n const field = getFormControlField(ngForm.control, control);\n return this.formDirective.createAsyncValidator(field, this.validationOptions())(\n control.getRawValue()\n ) as Observable<ValidationErrors | null>;\n }\n}\n","import { Directive, inject, input } from '@angular/core';\nimport {\n AbstractControl,\n AsyncValidator,\n NG_ASYNC_VALIDATORS,\n ValidationErrors,\n} from '@angular/forms';\nimport { FormDirective } from './form.directive';\nimport { Observable } from 'rxjs';\nimport { getFormGroupField } from '../utils/form-utils';\nimport { ValidationOptions } from './validation-options';\n\n/**\n * Hooks into the ngModelGroup selector and triggers an asynchronous validation for a form group\n * It will use a vest suite behind the scenes\n */\n@Directive({\n selector: '[ngModelGroup]',\n standalone: true,\n providers: [\n {\n provide: NG_ASYNC_VALIDATORS,\n useExisting: FormModelGroupDirective,\n multi: true,\n },\n ],\n})\nexport class FormModelGroupDirective implements AsyncValidator {\n public validationOptions = input<ValidationOptions>({ debounceTime: 0 });\n private readonly formDirective = inject(FormDirective);\n\n public validate(\n control: AbstractControl\n ): Observable<ValidationErrors | null> {\n const { ngForm } = this.formDirective;\n const field = getFormGroupField(ngForm.control, control);\n return this.formDirective.createAsyncValidator(field, this.validationOptions())(\n control.value\n ) as Observable<ValidationErrors | null>;\n }\n}\n","import { Optional, Provider } from '@angular/core';\nimport {\n ControlContainer,\n FormsModule,\n NgForm,\n NgModelGroup,\n} from '@angular/forms';\nimport { ValidateRootFormDirective } from './directives/validate-root-form.directive';\nimport { ControlWrapperComponent } from './components/control-wrapper/control-wrapper.component';\nimport { FormDirective } from './directives/form.directive';\nimport { FormModelDirective } from './directives/form-model.directive';\nimport { FormModelGroupDirective } from './directives/form-model-group.directive';\n\n/**\n * This is borrowed from [https://github.com/wardbell/ngc-validate/blob/main/src/app/core/form-container-view-provider.ts](https://github.com/wardbell/ngc-validate/blob/main/src/app/core/form-container-view-provider.ts)\n * Thank you so much Ward Bell for your effort!:\n *\n * Provide a ControlContainer to a form component from the\n * nearest parent NgModelGroup (preferred) or NgForm.\n *\n * Required for Reactive Forms as well (unless you write CVA)\n *\n * @example\n * ```\n * @Component({\n * ...\n * viewProviders[ formViewProvider ]\n * })\n * ```\n * @see Kara's AngularConnect 2017 talk: https://youtu.be/CD_t3m2WMM8?t=1826\n *\n * Without this provider\n * - Controls are not registered with parent NgForm or NgModelGroup\n * - Form-level flags say \"untouched\" and \"valid\"\n * - No form-level validation roll-up\n * - Controls still validate, update model, and update their statuses\n * - If within NgForm, no compiler error because ControlContainer is optional for ngModel\n *\n * Note: if the SubForm Component that uses this Provider\n * is not within a Form or NgModelGroup, the provider returns `null`\n * resulting in an error, something like\n * ```\n * preview-fef3604083950c709c52b.js:1 ERROR Error:\n * ngModelGroup cannot be used with a parent formGroup directive.\n *```\n */\nconst formViewProvider: Provider = {\n provide: ControlContainer,\n useFactory: _formViewProviderFactory,\n deps: [\n [new Optional(), NgForm],\n [new Optional(), NgModelGroup],\n ],\n};\n\nfunction _formViewProviderFactory(ngForm: NgForm, ngModelGroup: NgModelGroup) {\n return ngModelGroup || ngForm || null;\n}\n\n/**\n * The providers we need in every child component that holds an ngModelGroup\n */\nexport const vestFormsViewProviders = [\n { provide: ControlContainer, useExisting: NgForm },\n formViewProvider, // very important if we want nested components with ngModelGroup\n];\n\n/**\n * Exports all the stuff we need to use the template driven forms\n */\nexport const vestForms = [\n ValidateRootFormDirective,\n ControlWrapperComponent,\n FormDirective,\n FormsModule,\n FormModelDirective,\n FormModelGroupDirective,\n] as const;\n","export function arrayToObject<T>(arr: T[]): { [key: number]: T } {\n return arr.reduce((acc, value, index) => ({ ...acc, [index]: value }), {});\n}\n","/*\n * Public API Surface of ngx-vest-forms\n */\n\nexport { vestForms, vestFormsViewProviders } from './lib/exports';\nexport { DeepPartial } from './lib/utils/deep-partial';\nexport { DeepRequired } from './lib/utils/deep-required';\nexport {\n set,\n cloneDeep,\n getAllFormErrors,\n getFormControlField,\n getFormGroupField,\n mergeValuesAndRawValues,\n} from './lib/utils/form-utils';\nexport {\n validateShape,\n ShapeMismatchError,\n} from './lib/utils/shape-validation';\nexport { arrayToObject } from './lib/utils/array-to-object';\nexport { ROOT_FORM } from './lib/constants';\nexport { ControlWrapperComponent } from './lib/components/control-wrapper/control-wrapper.component';\nexport { FormDirective } from './lib/directives/form.directive';\nexport { FormModelDirective } from './lib/directives/form-model.directive';\nexport { FormModelGroupDirective } from './lib/directives/form-model-group.directive';\nexport { ValidateRootFormDirective } from './lib/directives/validate-root-form.directive';\nexport { ValidationOptions } from './lib/directives/validation-options';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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