@ngneat/reactive-forms
Version:
(Angular Reactive) Forms with Benefits
1 lines • 59.1 kB
Source Map (JSON)
{"version":3,"file":"ngneat-reactive-forms.mjs","sources":["../../../../libs/reactive-forms/src/lib/core.ts","../../../../libs/reactive-forms/src/lib/form-group.ts","../../../../libs/reactive-forms/src/lib/form-control.ts","../../../../libs/reactive-forms/src/lib/form-array.ts","../../../../libs/reactive-forms/src/lib/form-builder.ts","../../../../libs/reactive-forms/src/lib/operators/diff.ts","../../../../libs/reactive-forms/src/lib/persist/persist.ts","../../../../libs/reactive-forms/src/lib/control-value.accessor.ts","../../../../libs/reactive-forms/src/ngneat-reactive-forms.ts"],"sourcesContent":["import { AbstractControl, ValidationErrors } from '@angular/forms';\nimport { defer, merge, Observable, of, Subscription } from 'rxjs';\nimport { distinctUntilChanged, map } from 'rxjs/operators';\n\nexport function selectControlValue$<T, R>(\n control: any,\n mapFn: (state: T) => R\n): Observable<R> {\n return (control.value$ as Observable<any>).pipe(\n map(mapFn),\n distinctUntilChanged()\n );\n}\n\nexport function controlValueChanges$<T>(\n control: AbstractControl & { getRawValue: () => T }\n): Observable<T> {\n return merge(\n defer(() => of(control.getRawValue())),\n control.valueChanges.pipe(map(() => control.getRawValue()))\n ) as Observable<T>;\n}\n\nexport type ControlState = 'VALID' | 'INVALID' | 'PENDING' | 'DISABLED';\n\nexport function controlStatus$<\n K extends 'disabled' | 'enabled' | 'invalid' | 'valid' | 'status'\n>(\n control: AbstractControl,\n type: K\n): Observable<K extends 'status' ? ControlState : boolean> {\n return merge(\n defer(() => of(control[type])),\n control.statusChanges.pipe(\n map(() => control[type]),\n distinctUntilChanged()\n )\n ) as Observable<any>;\n}\n\nexport function enableControl(\n control: AbstractControl,\n enabled: boolean,\n opts?: any\n) {\n if (enabled) {\n control.enable(opts);\n } else {\n control.disable(opts);\n }\n}\n\nexport function disableControl(\n control: AbstractControl,\n disabled: boolean,\n opts?: any\n) {\n enableControl(control, !disabled, opts);\n}\n\nexport function controlDisabledWhile(\n control: AbstractControl,\n observable: Observable<boolean>,\n opts?: any\n): Subscription {\n return observable.subscribe((isDisabled) =>\n disableControl(control, isDisabled, opts)\n );\n}\n\nexport function controlEnabledWhile(\n control: AbstractControl,\n observable: Observable<boolean>,\n opts?: any\n): Subscription {\n return observable.subscribe((isEnabled) =>\n enableControl(control, isEnabled, opts)\n );\n}\n\nexport function mergeErrors(\n existing: ValidationErrors | null,\n toAdd: ValidationErrors | null\n) {\n if (!existing && !toAdd) {\n return null;\n }\n\n return {\n ...existing,\n ...toAdd,\n };\n}\n\nexport function removeError(errors: ValidationErrors | null, key: string) {\n if (!errors) {\n return null;\n }\n\n const updatedErrors = {\n ...errors,\n };\n\n delete updatedErrors[key];\n\n return Object.keys(updatedErrors).length > 0 ? updatedErrors : null;\n}\n\nexport function hasErrorAnd(\n and: 'touched' | 'dirty',\n control: AbstractControl,\n error: string,\n path?: Parameters<AbstractControl['hasError']>[1]\n): boolean {\n const hasError = control.hasError(\n error,\n !path || path.length === 0 ? undefined : path\n );\n return hasError && control[and];\n}\n\nexport function controlErrorChanges$(\n control: AbstractControl,\n errors$: Observable<ValidationErrors | null>\n): Observable<ValidationErrors | null> {\n return merge(\n defer(() => of(control.errors)),\n errors$,\n control.valueChanges.pipe(\n map(() => control.errors),\n distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b))\n )\n );\n}\n\nexport function markAllDirty(control: AbstractControl): void {\n control.markAsDirty({ onlySelf: true });\n\n (control as any)._forEachChild((control: any) => control.markAllAsDirty?.() || control.markAsDirty({ onlySelf: true }));\n}\n","import {\n AbstractControl,\n UntypedFormGroup,\n ValidationErrors,\n} from '@angular/forms';\nimport { isObservable, Observable, Subject, Subscription } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport {\n controlDisabledWhile,\n controlEnabledWhile,\n controlErrorChanges$,\n controlStatus$,\n controlValueChanges$,\n disableControl,\n enableControl,\n hasErrorAnd,\n markAllDirty,\n mergeErrors,\n removeError,\n selectControlValue$,\n} from './core';\nimport { DeepPartial, ValuesOf } from './types';\n\nexport class FormGroup<T extends Record<string, any>> extends UntypedFormGroup {\n readonly value!: ValuesOf<T>;\n readonly valueChanges!: Observable<ValuesOf<T>>;\n\n private touchChanges = new Subject<boolean>();\n private dirtyChanges = new Subject<boolean>();\n private errorsSubject = new Subject<ValidationErrors | null>();\n\n readonly touch$ = this.touchChanges\n .asObservable()\n .pipe(distinctUntilChanged());\n readonly dirty$ = this.dirtyChanges\n .asObservable()\n .pipe(distinctUntilChanged());\n readonly value$ = controlValueChanges$<ValuesOf<T>>(this);\n readonly disabled$ = controlStatus$(this, 'disabled');\n readonly enabled$ = controlStatus$(this, 'enabled');\n readonly invalid$ = controlStatus$(this, 'invalid');\n readonly valid$ = controlStatus$(this, 'valid');\n readonly status$ = controlStatus$(this, 'status');\n readonly errors$ = controlErrorChanges$(\n this,\n this.errorsSubject.asObservable()\n );\n\n constructor(\n public controls: T,\n validatorOrOpts?: ConstructorParameters<typeof UntypedFormGroup>[1],\n asyncValidator?: ConstructorParameters<typeof UntypedFormGroup>[2]\n ) {\n super(controls, validatorOrOpts, asyncValidator);\n }\n\n select<R>(mapFn: (state: ValuesOf<T>) => R): Observable<R> {\n return selectControlValue$(this, mapFn);\n }\n\n get<\n K extends keyof ValuesOf<T>,\n K1 extends keyof ValuesOf<T>[K],\n K2 extends keyof ValuesOf<T>[K][K1],\n FirstLevel = GroupPath<T[K], K1 & string>,\n SecondLevel = GroupPath<FirstLevel, K2 & string>\n >(keys: [K, K1, K2]): SecondLevel;\n get<K extends keyof ValuesOf<T>, K1 extends keyof ValuesOf<T>[K]>(\n keys: [K, K1]\n ): GroupPath<T[K], K1 & string>;\n\n get<K extends keyof ValuesOf<T>>(keys: [K]): T[K];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n get<\n K extends string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n P = K extends `${infer Key}.${infer Rest}` ? unknown : K\n >(key: K): unknown extends P ? AbstractControl : T[K];\n get(key: string | string[]): AbstractControl {\n return super.get(key) as AbstractControl;\n }\n\n setValue(\n valueOrObservable: Observable<ValuesOf<T>>,\n options?: Parameters<AbstractControl['setValue']>[1]\n ): Subscription;\n setValue(\n valueOrObservable: ValuesOf<T>,\n options?: Parameters<AbstractControl['setValue']>[1]\n ): void;\n setValue(\n valueOrObservable: any,\n options?: Parameters<AbstractControl['setValue']>[1]\n ): any {\n if (isObservable(valueOrObservable)) {\n return valueOrObservable.subscribe((value) =>\n super.setValue(value as ValuesOf<T>, options)\n );\n }\n\n super.setValue(valueOrObservable, options);\n }\n\n patchValue(\n valueOrObservable: Observable<DeepPartial<ValuesOf<T>>>,\n options?: Parameters<AbstractControl['patchValue']>[1]\n ): Subscription;\n patchValue(\n valueOrObservable: DeepPartial<ValuesOf<T>>,\n options?: Parameters<AbstractControl['patchValue']>[1]\n ): void;\n patchValue(valueOrObservable: any, options?: any): any {\n if (isObservable(valueOrObservable)) {\n return valueOrObservable.subscribe((value) =>\n super.patchValue(value as DeepPartial<ValuesOf<T>>, options)\n );\n }\n\n super.patchValue(valueOrObservable, options);\n }\n\n getRawValue(): ValuesOf<T> {\n return super.getRawValue();\n }\n\n markAsTouched(\n ...opts: Parameters<AbstractControl['markAsTouched']>\n ): ReturnType<AbstractControl['markAsTouched']> {\n super.markAsTouched(...opts);\n this.touchChanges.next(true);\n }\n\n markAsUntouched(\n ...opts: Parameters<AbstractControl['markAsUntouched']>\n ): ReturnType<AbstractControl['markAsUntouched']> {\n super.markAsUntouched(...opts);\n this.touchChanges.next(false);\n }\n\n markAsPristine(\n ...opts: Parameters<AbstractControl['markAsPristine']>\n ): ReturnType<AbstractControl['markAsPristine']> {\n super.markAsPristine(...opts);\n this.dirtyChanges.next(false);\n }\n\n markAsDirty(\n ...opts: Parameters<AbstractControl['markAsDirty']>\n ): ReturnType<AbstractControl['markAsDirty']> {\n super.markAsDirty(...opts);\n this.dirtyChanges.next(true);\n }\n\n markAllAsDirty(): void {\n markAllDirty(this);\n }\n\n setEnable(enable = true, opts?: Parameters<AbstractControl['enable']>[0]) {\n enableControl(this, enable, opts);\n }\n\n setDisable(disable = true, opts?: Parameters<AbstractControl['disable']>[0]) {\n disableControl(this, disable, opts);\n }\n\n disabledWhile(\n observable: Observable<boolean>,\n options?: Parameters<AbstractControl['disable']>[0]\n ) {\n return controlDisabledWhile(this, observable, options);\n }\n\n enabledWhile(\n observable: Observable<boolean>,\n options?: Parameters<AbstractControl['enable']>[0]\n ) {\n return controlEnabledWhile(this, observable, options);\n }\n\n reset(\n formState?: ValuesOf<T>,\n options?: Parameters<AbstractControl['reset']>[1]\n ): void {\n super.reset(formState, options);\n }\n\n setValidators(\n newValidators: Parameters<AbstractControl['setValidators']>[0],\n options?: Parameters<AbstractControl['updateValueAndValidity']>[0]\n ) {\n super.setValidators(newValidators);\n super.updateValueAndValidity(options);\n }\n\n setAsyncValidators(\n newValidator: Parameters<AbstractControl['setAsyncValidators']>[0],\n options?: Parameters<AbstractControl['updateValueAndValidity']>[0]\n ) {\n super.setAsyncValidators(newValidator);\n super.updateValueAndValidity(options);\n }\n\n getError<E>(...params: Parameters<AbstractControl['getError']>): E | null {\n return super.getError(...params);\n }\n\n setErrors(...opts: Parameters<AbstractControl['setErrors']>) {\n /**\n * @description\n * Use an elvis operator to avoid a throw when the control is used with an async validator\n * Which will be instantly resolved (like with `of(null)`)\n * In such case, Angular will call this method instantly before even instancing the properties causing the throw\n * Can be easily reproduced with a step-by-step debug once compiled when checking the stack trace of the constructor\n *\n * Issue: https://github.com/ngneat/reactive-forms/issues/91\n * Reproduction: https://codesandbox.io/embed/github/C0ZEN/ngneat-reactive-forms-error-issue-cs/tree/main/?autoresize=1&expanddevtools=1&fontsize=14&hidenavigation=1&theme=dark\n */\n this.errorsSubject?.next(opts[0]);\n return super.setErrors(...opts);\n }\n\n mergeErrors(\n errors: ValidationErrors | null,\n opts?: Parameters<AbstractControl['setErrors']>[1]\n ) {\n this.setErrors(mergeErrors(this.errors, errors), opts);\n }\n\n removeError(\n key: string,\n opts?: Parameters<AbstractControl['setErrors']>[1]\n ): void {\n this.setErrors(removeError(this.errors, key), opts);\n }\n\n hasErrorAndTouched(\n error: string,\n path?: Parameters<AbstractControl['hasError']>[1]\n ): boolean {\n return hasErrorAnd('touched', this, error, path);\n }\n\n hasErrorAndDirty(\n error: string,\n path?: Parameters<AbstractControl['hasError']>[1]\n ): boolean {\n return hasErrorAnd('dirty', this, error, path);\n }\n}\n\ntype GroupPath<T, K extends string> = T extends FormGroup<infer U>\n ? U[K & string]\n : never;\n","import {\n UntypedFormControl,\n AbstractControl,\n ValidationErrors,\n} from '@angular/forms';\nimport { isObservable, Observable, Subject, Subscription } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport {\n controlValueChanges$,\n controlStatus$,\n controlDisabledWhile,\n controlEnabledWhile,\n disableControl,\n enableControl,\n mergeErrors,\n removeError,\n hasErrorAnd,\n controlErrorChanges$,\n} from './core';\nimport { BoxedValue } from './types';\n\nexport class FormControl<T> extends UntypedFormControl {\n readonly value!: T;\n readonly valueChanges!: Observable<T>;\n\n private touchChanges = new Subject<boolean>();\n private dirtyChanges = new Subject<boolean>();\n private errorsSubject = new Subject<ValidationErrors | null>();\n\n readonly touch$ = this.touchChanges\n .asObservable()\n .pipe(distinctUntilChanged());\n readonly dirty$ = this.dirtyChanges\n .asObservable()\n .pipe(distinctUntilChanged());\n readonly value$ = controlValueChanges$<T>(this);\n readonly disabled$ = controlStatus$(this, 'disabled');\n readonly enabled$ = controlStatus$(this, 'enabled');\n readonly invalid$ = controlStatus$(this, 'invalid');\n readonly valid$ = controlStatus$(this, 'valid');\n readonly status$ = controlStatus$(this, 'status');\n readonly errors$ = controlErrorChanges$(\n this,\n this.errorsSubject.asObservable()\n );\n\n constructor(\n formState?: BoxedValue<T>,\n validatorOrOpts?: ConstructorParameters<typeof UntypedFormControl>[1],\n asyncValidator?: ConstructorParameters<typeof UntypedFormControl>[2]\n ) {\n super(formState, validatorOrOpts, asyncValidator);\n }\n\n setValue(\n valueOrObservable: Observable<T>,\n options?: Parameters<AbstractControl['setValue']>[1]\n ): Subscription;\n setValue(\n valueOrObservable: T,\n options?: Parameters<AbstractControl['setValue']>[1]\n ): void;\n setValue(\n valueOrObservable: any,\n options?: Parameters<AbstractControl['setValue']>[1]\n ): any {\n if (isObservable(valueOrObservable)) {\n return valueOrObservable.subscribe((value) =>\n super.setValue(value as T, options)\n );\n }\n\n super.setValue(valueOrObservable, options);\n }\n\n patchValue(\n valueOrObservable: Observable<T>,\n options?: Parameters<AbstractControl['patchValue']>[1]\n ): Subscription;\n patchValue(\n valueOrObservable: T,\n options?: Parameters<AbstractControl['patchValue']>[1]\n ): void;\n patchValue(valueOrObservable: any, options?: any): any {\n if (isObservable(valueOrObservable)) {\n return valueOrObservable.subscribe((value) =>\n super.patchValue(value as T, options)\n );\n }\n\n super.patchValue(valueOrObservable, options);\n }\n\n getRawValue(): T {\n return this.value;\n }\n\n markAsTouched(\n ...opts: Parameters<AbstractControl['markAsTouched']>\n ): ReturnType<AbstractControl['markAsTouched']> {\n super.markAsTouched(...opts);\n this.touchChanges.next(true);\n }\n\n markAsUntouched(\n ...opts: Parameters<AbstractControl['markAsUntouched']>\n ): ReturnType<AbstractControl['markAsUntouched']> {\n super.markAsUntouched(...opts);\n this.touchChanges.next(false);\n }\n\n markAsPristine(\n ...opts: Parameters<AbstractControl['markAsPristine']>\n ): ReturnType<AbstractControl['markAsPristine']> {\n super.markAsPristine(...opts);\n this.dirtyChanges.next(false);\n }\n\n markAsDirty(\n ...opts: Parameters<AbstractControl['markAsDirty']>\n ): ReturnType<AbstractControl['markAsDirty']> {\n super.markAsDirty(...opts);\n this.dirtyChanges.next(true);\n }\n\n setEnable(enable = true, opts?: Parameters<AbstractControl['enable']>[0]) {\n enableControl(this, enable, opts);\n }\n\n setDisable(disable = true, opts?: Parameters<AbstractControl['disable']>[0]) {\n disableControl(this, disable, opts);\n }\n\n disabledWhile(\n observable: Observable<boolean>,\n options?: Parameters<AbstractControl['disable']>[0]\n ) {\n return controlDisabledWhile(this, observable, options);\n }\n\n enabledWhile(\n observable: Observable<boolean>,\n options?: Parameters<AbstractControl['enable']>[0]\n ) {\n return controlEnabledWhile(this, observable, options);\n }\n\n reset(\n formState?: T,\n options?: Parameters<AbstractControl['reset']>[1]\n ): void {\n super.reset(formState, options);\n }\n\n setValidators(\n newValidators: Parameters<AbstractControl['setValidators']>[0],\n options?: Parameters<AbstractControl['updateValueAndValidity']>[0]\n ) {\n super.setValidators(newValidators);\n super.updateValueAndValidity(options);\n }\n\n setAsyncValidators(\n newValidator: Parameters<AbstractControl['setAsyncValidators']>[0],\n options?: Parameters<AbstractControl['updateValueAndValidity']>[0]\n ) {\n super.setAsyncValidators(newValidator);\n super.updateValueAndValidity(options);\n }\n\n getError<E>(...params: Parameters<AbstractControl['getError']>): E | null {\n return super.getError(...params);\n }\n\n setErrors(...opts: Parameters<AbstractControl['setErrors']>) {\n /**\n * @description\n * Use an elvis operator to avoid a throw when the control is used with an async validator\n * Which will be instantly resolved (like with `of(null)`)\n * In such case, Angular will call this method instantly before even instancing the properties causing the throw\n * Can be easily reproduced with a step-by-step debug once compiled when checking the stack trace of the constructor\n *\n * Issue: https://github.com/ngneat/reactive-forms/issues/91\n * Reproduction: https://codesandbox.io/embed/github/C0ZEN/ngneat-reactive-forms-error-issue-cs/tree/main/?autoresize=1&expanddevtools=1&fontsize=14&hidenavigation=1&theme=dark\n */\n this.errorsSubject?.next(opts[0]);\n return super.setErrors(...opts);\n }\n\n mergeErrors(\n errors: ValidationErrors | null,\n opts?: Parameters<AbstractControl['setErrors']>[1]\n ) {\n this.setErrors(mergeErrors(this.errors, errors), opts);\n }\n\n removeError(\n key: string,\n opts?: Parameters<AbstractControl['setErrors']>[1]\n ): void {\n this.setErrors(removeError(this.errors, key), opts);\n }\n\n hasErrorAndTouched(error: string): boolean {\n return hasErrorAnd('touched', this, error);\n }\n\n hasErrorAndDirty(error: string): boolean {\n return hasErrorAnd('dirty', this, error);\n }\n}\n","import {\n AbstractControl,\n UntypedFormArray,\n ValidationErrors,\n} from '@angular/forms';\nimport { isObservable, Observable, Subject, Subscription } from 'rxjs';\nimport { distinctUntilChanged, map } from 'rxjs/operators';\nimport {ControlsOf, FormControl, FormGroup, ValuesOf} from '..';\nimport {\n controlValueChanges$,\n controlStatus$,\n controlErrorChanges$,\n hasErrorAnd,\n mergeErrors,\n removeError,\n controlDisabledWhile,\n controlEnabledWhile,\n disableControl,\n enableControl,\n markAllDirty,\n} from './core';\nimport { DeepPartial } from './types';\n\ntype ValueOfControl<T> = T extends FormControl<infer C>\n ? C\n : T extends FormGroup<infer C> ? ValuesOf<C> : never;\n\n\nexport class FormArray<\n T,\n Control extends AbstractControl = T extends Record<any, any>\n ? FormGroup<ControlsOf<T>>\n : FormControl<T>\n> extends UntypedFormArray {\n readonly value!: ValueOfControl<Control>[];\n readonly valueChanges!: Observable<ValueOfControl<Control>[]>;\n\n private touchChanges = new Subject<boolean>();\n private dirtyChanges = new Subject<boolean>();\n private errorsSubject = new Subject<ValidationErrors | null>();\n\n readonly touch$ = this.touchChanges\n .asObservable()\n .pipe(distinctUntilChanged());\n readonly dirty$ = this.dirtyChanges\n .asObservable()\n .pipe(distinctUntilChanged());\n readonly value$ = controlValueChanges$<Array<ValueOfControl<Control>>>(this);\n readonly disabled$ = controlStatus$(this, 'disabled');\n readonly enabled$ = controlStatus$(this, 'enabled');\n readonly invalid$ = controlStatus$(this, 'invalid');\n readonly valid$ = controlStatus$(this, 'valid');\n readonly status$ = controlStatus$(this, 'status');\n readonly errors$ = controlErrorChanges$(\n this,\n this.errorsSubject.asObservable()\n );\n\n constructor(\n public controls: Array<Control>,\n validatorOrOpts?: ConstructorParameters<typeof UntypedFormArray>[1],\n asyncValidator?: ConstructorParameters<typeof UntypedFormArray>[2]\n ) {\n super(controls, validatorOrOpts, asyncValidator);\n }\n\n select<R>(mapFn: (state: ValueOfControl<Control>[]) => R): Observable<R> {\n return this.value$.pipe(map(mapFn), distinctUntilChanged());\n }\n\n setValue(\n valueOrObservable: Observable<ValueOfControl<Control>[]>,\n options?: Parameters<UntypedFormArray['setValue']>[1]\n ): Subscription;\n setValue(\n valueOrObservable: ValueOfControl<Control>[],\n options?: Parameters<UntypedFormArray['setValue']>[1]\n ): void;\n setValue(\n valueOrObservable: any,\n options?: Parameters<UntypedFormArray['setValue']>[1]\n ): any {\n if (isObservable(valueOrObservable)) {\n return valueOrObservable.subscribe((value) =>\n super.setValue(value as T[], options)\n );\n }\n\n super.setValue(valueOrObservable, options);\n }\n\n patchValue(\n valueOrObservable: Observable<DeepPartial<ValueOfControl<Control>>[]>,\n options?: Parameters<UntypedFormArray['patchValue']>[1]\n ): Subscription;\n patchValue(\n valueOrObservable: DeepPartial<ValueOfControl<Control>>[],\n options?: Parameters<UntypedFormArray['patchValue']>[1]\n ): void;\n patchValue(valueOrObservable: any, options?: any): any {\n if (isObservable(valueOrObservable)) {\n return valueOrObservable.subscribe((value) =>\n super.patchValue(value as T[], options)\n );\n }\n\n super.patchValue(valueOrObservable, options);\n }\n\n getRawValue(): ValueOfControl<Control>[] {\n return super.getRawValue();\n }\n\n push(control: Control, options?: Parameters<UntypedFormArray['push']>[1]) {\n return super.push(control, options);\n }\n\n insert(index: number, control: Control, options?: Parameters<UntypedFormArray['insert']>[2]) {\n return super.insert(index, control, options);\n }\n\n setControl(index: number, control: Control, options?: Parameters<UntypedFormArray['setControl']>[2]) {\n return super.setControl(index, control, options);\n }\n\n at(index: number): Control {\n return super.at(index) as Control;\n }\n\n remove(value: ValueOfControl<Control>, options?: Parameters<UntypedFormArray['removeAt']>[1]): void {\n this.removeWhen((v) => v.value === value);\n }\n\n removeWhen(predicate: (element: Control) => boolean, options?: Parameters<UntypedFormArray['removeAt']>[1]): void {\n for (let i = this.length - 1; i >= 0; --i) {\n if (predicate(this.at(i))) {\n this.removeAt(i, options);\n }\n }\n }\n\n markAsTouched(\n ...opts: Parameters<UntypedFormArray['markAsTouched']>\n ): ReturnType<UntypedFormArray['markAsTouched']> {\n super.markAsTouched(...opts);\n this.touchChanges.next(true);\n }\n\n markAsUntouched(\n ...opts: Parameters<UntypedFormArray['markAsUntouched']>\n ): ReturnType<UntypedFormArray['markAsUntouched']> {\n super.markAsUntouched(...opts);\n this.touchChanges.next(false);\n }\n\n markAsPristine(\n ...opts: Parameters<UntypedFormArray['markAsPristine']>\n ): ReturnType<UntypedFormArray['markAsPristine']> {\n super.markAsPristine(...opts);\n this.dirtyChanges.next(false);\n }\n\n markAsDirty(\n ...opts: Parameters<UntypedFormArray['markAsDirty']>\n ): ReturnType<UntypedFormArray['markAsDirty']> {\n super.markAsDirty(...opts);\n this.dirtyChanges.next(true);\n }\n\n markAllAsDirty(): void {\n markAllDirty(this);\n }\n\n setEnable(enable = true, opts?: Parameters<UntypedFormArray['enable']>[0]) {\n enableControl(this, enable, opts);\n }\n\n setDisable(disable = true, opts?: Parameters<UntypedFormArray['disable']>[0]) {\n disableControl(this, disable, opts);\n }\n\n disabledWhile(\n observable: Observable<boolean>,\n options?: Parameters<UntypedFormArray['disable']>[0]\n ) {\n return controlDisabledWhile(this, observable, options);\n }\n\n enabledWhile(\n observable: Observable<boolean>,\n options?: Parameters<UntypedFormArray['enable']>[0]\n ) {\n return controlEnabledWhile(this, observable, options);\n }\n\n reset(\n formState?: ValueOfControl<Control>[],\n options?: Parameters<UntypedFormArray['reset']>[1]\n ): void {\n super.reset(formState, options);\n }\n\n setValidators(\n newValidators: Parameters<UntypedFormArray['setValidators']>[0],\n options?: Parameters<UntypedFormArray['updateValueAndValidity']>[0]\n ) {\n super.setValidators(newValidators);\n super.updateValueAndValidity(options);\n }\n\n setAsyncValidators(\n newValidator: Parameters<UntypedFormArray['setAsyncValidators']>[0],\n options?: Parameters<UntypedFormArray['updateValueAndValidity']>[0]\n ) {\n super.setAsyncValidators(newValidator);\n super.updateValueAndValidity(options);\n }\n\n getError<E>(...params: Parameters<UntypedFormArray['getError']>): E | null {\n return super.getError(...params);\n }\n\n setErrors(...opts: Parameters<UntypedFormArray['setErrors']>) {\n /**\n * @description\n * Use an elvis operator to avoid a throw when the control is used with an async validator\n * Which will be instantly resolved (like with `of(null)`)\n * In such case, Angular will call this method instantly before even instancing the properties causing the throw\n * Can be easily reproduced with a step-by-step debug once compiled when checking the stack trace of the constructor\n *\n * Issue: https://github.com/ngneat/reactive-forms/issues/91\n * Reproduction: https://codesandbox.io/embed/github/C0ZEN/ngneat-reactive-forms-error-issue-cs/tree/main/?autoresize=1&expanddevtools=1&fontsize=14&hidenavigation=1&theme=dark\n */\n this.errorsSubject?.next(opts[0]);\n return super.setErrors(...opts);\n }\n\n mergeErrors(\n errors: ValidationErrors | null,\n opts?: Parameters<UntypedFormArray['setErrors']>[1]\n ) {\n this.setErrors(mergeErrors(this.errors, errors), opts);\n }\n\n removeError(\n key: string,\n opts?: Parameters<UntypedFormArray['setErrors']>[1]\n ): void {\n this.setErrors(removeError(this.errors, key), opts);\n }\n\n hasErrorAndTouched(\n error: string,\n path?: Parameters<UntypedFormArray['hasError']>[1]\n ): boolean {\n return hasErrorAnd('touched', this, error, path);\n }\n\n hasErrorAndDirty(\n error: string,\n path?: Parameters<UntypedFormArray['hasError']>[1]\n ): boolean {\n return hasErrorAnd('dirty', this, error, path);\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { AbstractControl, AbstractControlOptions, AsyncValidatorFn, UntypedFormBuilder, ValidatorFn } from '@angular/forms';\nimport { FormControl, FormGroup } from \"..\";\nimport { FormArray } from \"./form-array\";\nimport { BoxedValue, ControlsOf } from \"./types\";\n\n@Injectable({ providedIn: 'root' })\nexport class FormBuilder extends UntypedFormBuilder {\n\n control<T>(\n formState?: BoxedValue<T>,\n validatorOrOpts?: ConstructorParameters<typeof FormControl>[1],\n asyncValidator?: ConstructorParameters<typeof FormControl>[2]\n ) {\n return new FormControl<T>(formState, validatorOrOpts, asyncValidator);\n }\n\n array<T, Control extends AbstractControl = T extends Record<any, any> ? FormGroup<ControlsOf<T>> : FormControl<T>>(\n controlsConfig: Control[],\n validatorOrOpts?: ConstructorParameters<typeof FormArray>[1],\n asyncValidator?: ConstructorParameters<typeof FormArray>[2]) {\n const controls = controlsConfig.map(c => (this as any)._createControl(c));\n\n return new FormArray<T,Control>(controls, validatorOrOpts, asyncValidator);\n }\n\n\n group<T extends Record<string, any>>(\n controlsConfig: Controls<T>,\n options?: AbstractControlOptions,\n ): FormGroup<GroupResolverFormBuilder<T>> {\n const controls = (this as any)._reduceControls(controlsConfig);\n\n let validators: any = null;\n let asyncValidators: any = null;\n let updateOn: any;\n\n if (options != null) {\n validators = options.validators != null ? options.validators : null;\n asyncValidators = options.asyncValidators != null ? options.asyncValidators : null;\n updateOn = options.updateOn != null ? options.updateOn : undefined;\n }\n\n return new FormGroup(controls, { asyncValidators, updateOn, validators });\n }\n}\n\nexport type GroupResolverFormBuilder<T extends Record<string, any>> = {\n [K in keyof T]:\n // { key: builder.group/array()/FormControl([]) }\n T[K] extends AbstractControl ? T[K] :\n\n // { key: [''], ['', Validators.required] }\n T[K] extends (infer U)[] ? FormControl<ResolveTypeArray<U>> :\n\n // { key: '' }\n FormControl<T[K]>\n}\n\ntype FormControlBuilderOptions<T> = [T, (ValidatorFn | ValidatorFn[] | null)?, (AsyncValidatorFn | AsyncValidatorFn[] | null)?]\n\n// { key: ['', Validators.required] } - get the first key type\ntype ResolveTypeArray<U> = Exclude<U, null | ValidatorFn | ValidatorFn[] | AsyncValidatorFn | AsyncValidatorFn[]>\n\ntype Controls<T> = {\n [K in keyof T]: T[K] extends AbstractControl ? T[K] :\n T[K] extends (infer U)[] ? FormControlBuilderOptions<ResolveTypeArray<U>> :\n T[K] extends Record<any, any> ? FormGroup<Controls<T[K]>> :\n T[K]\n}\n","import { MonoTypeOperatorFunction, Observable } from 'rxjs';\nimport { filter, pairwise, startWith, map } from 'rxjs/operators';\n\nconst toArray = (object: Record<any, any>) => Object.keys(object);\nconst isArray = (value: any): boolean => value && Array.isArray(value);\nconst isObject = (value: any): boolean => typeof value === 'object' && value !== null;\nconst isFormArray = (prev: any, curr: any): boolean => isArray(curr) || isArray(prev);\nconst isFormGroup = (prev: any, curr: any): boolean => isObject(curr) || isObject(prev);\nconst isFormControl = (prev: any, curr: any): boolean => !isFormArray(prev, curr) && !isFormGroup(prev, curr);\nconst convertTypesToArray = (left: any, right: any): Array<[]> => [(left as unknown) as [], (right as unknown) as []];\n\n/**\n * An operator which is used to filter valueChanges$ output, that it would emit only changed parts.\n * \n * @return {MonoTypeOperatorFunction} An Observable that emits items from the source Observable with only changed values.\n */\nexport function diff<T>(): MonoTypeOperatorFunction<T | undefined> {\n return (source$: Observable<T | undefined>) =>\n source$.pipe(\n startWith(undefined),\n pairwise(),\n map(control => reduceControlValue<T>(...control)),\n filter(control => control !== undefined)\n )\n}\n\nfunction reduceControlValue<T>(prev: T | undefined, curr: T | undefined): T | undefined {\n if (prev === undefined) {\n return curr;\n }\n\n if (isFormControl(prev, curr)) {\n return prev === curr ? undefined : curr;\n }\n\n if (isFormArray(prev, curr)) {\n const [left, right] = convertTypesToArray(prev, curr);\n return compareArraysContent(left, right) ? undefined : curr;\n }\n\n return compareFormGroup(prev, curr);\n}\n\nfunction compareFormGroup<T>(prev: T, curr: T): T | undefined {\n const reduced = reduceFormGroup(prev, curr);\n\n return toArray(reduced).length === 0 ? undefined : reduced;\n}\n\nfunction reduceFormGroup<T extends Record<any, any>>(prev: T, curr: T): T {\n if (!prev) {\n return curr;\n }\n\n return toArray(curr).reduce((acc, key) => {\n const control = reduceControlValue(prev[key], curr[key]);\n if (control !== undefined) {\n acc[key] = control;\n }\n\n return acc;\n }, {} as Record<any, any>);\n}\n\n\nfunction compareArraysContent<T extends []>(left: T, right: T): boolean {\n left = Array.isArray(left) ? left : ([] as T);\n right = Array.isArray(right) ? right : ([] as T);\n return left.length === right.length && left.every(value => right.includes(value));\n}","\nimport { AbstractControl, UntypedFormArray } from \"@angular/forms\";\nimport { from, isObservable, Observable, of } from \"rxjs\";\nimport { debounceTime, switchMap, take, tap } from \"rxjs/operators\";\n\nexport interface PersistOptions<T> {\n debounceTime?: number;\n manager?: PersistManager<T>;\n arrControlFactory?: ControlFactoryMap<T>;\n persistDisabledControls?: boolean;\n}\n\nexport function persistControl<T>(\n control: AbstractControl,\n key: string,\n { debounceTime, manager, arrControlFactory, persistDisabledControls }: PersistOptions<T>\n): Observable<unknown> {\n const persistManager = manager || new LocalStorageManager();\n\n return restoreControl(control, key, persistManager, arrControlFactory).pipe(\n switchMap(() =>\n persistValue$(control, key, {\n debounceTime: debounceTime || 250,\n manager: persistManager,\n persistDisabledControls\n })\n )\n );\n}\n\nfunction persistValue$<T>(control: AbstractControl, key: string, options: PersistOptions<T>): Observable<T> {\n return control.valueChanges.pipe(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n debounceTime(options.debounceTime!),\n switchMap(value =>\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n wrapIntoObservable(options.manager!.setValue(key, options.persistDisabledControls ? (control as any).getRawValue() : value))\n )\n );\n}\n\n\nexport function restoreControl<T>(control: AbstractControl, key: string, manager: PersistManager<T>, arrControlFactory: ControlFactoryMap<T> | undefined): Observable<T> {\n return wrapIntoObservable(manager.getValue(key)).pipe(\n take(1),\n tap(value => {\n if (!value) return;\n\n if (arrControlFactory) {\n handleFormArrays(control, value, arrControlFactory);\n }\n\n control.patchValue(value, { emitEvent: false });\n })\n );\n}\n\n\nfunction handleFormArrays<T>(\n control: AbstractControl,\n formValue: T,\n arrControlFactory: ControlFactoryMap<T>\n) {\n Object.keys(formValue).forEach(controlName => {\n const value = (formValue as any)[controlName];\n\n if (Array.isArray(value) && control.get(controlName) instanceof UntypedFormArray) {\n if (!arrControlFactory || (arrControlFactory && !(controlName in arrControlFactory))) {\n throw new Error(`Please provide arrControlFactory for ${controlName}`);\n }\n const current = control.get(controlName) as UntypedFormArray;\n const fc = (arrControlFactory as any)[controlName]\n clearFormArray(current);\n value.forEach((v, i) => current.insert(i, fc(v)));\n }\n });\n}\n\nexport function clearFormArray(control: UntypedFormArray) {\n while (control.length !== 0) {\n control.removeAt(0);\n }\n}\n\nexport function wrapIntoObservable<T>(value: T | Promise<T> | Observable<T>): Observable<T> {\n if (isObservable(value) || isPromise(value)) {\n return from(value);\n }\n\n return of(value);\n}\n\nfunction isPromise(value: any): value is Promise<unknown> {\n return typeof value?.then === 'function';\n}\n\nexport type ArrayKeys<T> = { [K in keyof T]: T[K] extends any[] ? K : never }[keyof T];\nexport type ControlFactory<T> = (value: T) => AbstractControl;\nexport type ControlFactoryMap<T> = {\n [K in ArrayKeys<T>]?: ControlFactory<ArrayType<T[K]>>;\n};\ntype ArrayType<T> = T extends Array<infer R> ? R : any;\n\n\nexport interface PersistManager<T> {\n setValue(key: string, data: T): T | Promise<T> | Observable<T>;\n getValue(key: string): T | Promise<T> | Observable<T>;\n}\n\n\nexport class LocalStorageManager<T> implements PersistManager<T> {\n setValue(key: string, data: T): T {\n localStorage.setItem(key, JSON.stringify(data));\n return data;\n }\n\n getValue(key: string): T {\n return JSON.parse(localStorage.getItem(key) || '{}');\n }\n}\n\nexport class SessionStorageManager<T> implements PersistManager<T> {\n setValue(key: string, data: T): T {\n sessionStorage.setItem(key, JSON.stringify(data));\n return data;\n }\n\n getValue(key: string): T {\n return JSON.parse(sessionStorage.getItem(key) || '{}');\n }\n}","import { ControlValueAccessor as NgControlValueAccessor } from '@angular/forms';\n\nexport abstract class ControlValueAccessor<T = any> implements NgControlValueAccessor {\n abstract writeValue(value: T): void;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onChange?= (value: T | null) => {\n //\n };\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onTouched?= () => { };\n\n registerOnChange(fn: (value: T | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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