ngx-sub-form
Version:

1 lines • 38.5 kB
Source Map (JSON)
{"version":3,"file":"ngx-sub-form.mjs","sources":["../../../projects/ngx-sub-form/src/lib/shared/ngx-sub-form-utils.ts","../../../projects/ngx-sub-form/src/lib/helpers.ts","../../../projects/ngx-sub-form/src/lib/ngx-sub-form.types.ts","../../../projects/ngx-sub-form/src/lib/create-form.ts","../../../projects/ngx-sub-form/src/public_api.ts","../../../projects/ngx-sub-form/src/ngx-sub-form.ts"],"sourcesContent":["import { InjectionToken, Type } from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n UntypedFormArray,\n UntypedFormControl,\n UntypedFormGroup,\n ValidationErrors,\n} from '@angular/forms';\nimport { getObservableLifecycle } from 'ngx-observable-lifecycle';\nimport { Observable, timer } from 'rxjs';\nimport { debounce, takeUntil } from 'rxjs/operators';\n\nexport type Controls<T> = { [K in keyof T]-?: AbstractControl };\n\nexport type ControlsNames<T> = { [K in keyof T]-?: K };\n\nexport type ControlMap<T, V> = { [K in keyof T]-?: V };\n\nexport type ControlsType<T> = {\n [K in keyof T]-?: T[K] extends any[]\n ? TypedFormArray<T[K]>\n : TypedFormControl<T[K]> | (T[K] extends {} ? TypedFormGroup<T[K]> : never);\n};\n\nexport type OneOfControlsTypes<T = any> = ControlsType<T>[keyof ControlsType<T>];\n\n// @todo rename to `FormErrorsType` once the deprecated one is removed\nexport type NewFormErrorsType<T> = {\n [K in keyof T]-?: T[K] extends any[] ? Record<number, ValidationErrors> : ValidationErrors;\n};\n\n// @todo rename to `FormErrors` once the deprecated one is removed\nexport type NewFormErrors<FormInterface> = null | Partial<\n NewFormErrorsType<FormInterface> & {\n formGroup?: ValidationErrors;\n }\n>;\n\n// using set/patch value options signature from form controls to allow typing without additional casting\nexport interface TypedAbstractControl<TValue> extends AbstractControl {\n value: TValue;\n valueChanges: Observable<TValue>;\n setValue(value: TValue, options?: Parameters<AbstractControl['setValue']>[1]): void;\n patchValue(value: Partial<TValue>, options?: Parameters<AbstractControl['patchValue']>[1]): void;\n}\n\nexport interface TypedFormGroup<TValue extends {}> extends UntypedFormGroup {\n value: TValue;\n valueChanges: Observable<TValue>;\n controls: ControlsType<TValue>;\n setValue(value: TValue, options?: Parameters<UntypedFormGroup['setValue']>[1]): void;\n patchValue(value: Partial<TValue>, options?: Parameters<UntypedFormGroup['patchValue']>[1]): void;\n getRawValue(): TValue;\n}\n\nexport interface TypedFormArray<TValue extends any[]> extends UntypedFormArray {\n value: TValue;\n valueChanges: Observable<TValue>;\n controls: TypedAbstractControl<TValue[0]>[];\n setValue(value: TValue, options?: Parameters<UntypedFormArray['setValue']>[1]): void;\n patchValue(value: TValue, options?: Parameters<UntypedFormArray['patchValue']>[1]): void;\n getRawValue(): TValue;\n}\n\nexport interface TypedFormControl<TValue> extends UntypedFormControl {\n value: TValue;\n valueChanges: Observable<TValue>;\n setValue(value: TValue, options?: Parameters<UntypedFormControl['setValue']>[1]): void;\n patchValue(value: Partial<TValue>, options?: Parameters<UntypedFormControl['patchValue']>[1]): void;\n}\n\nexport type KeysWithType<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T];\n\nexport type ArrayPropertyKey<T> = KeysWithType<T, Array<any>>;\n\nexport type ArrayPropertyValue<T, K extends ArrayPropertyKey<T> = ArrayPropertyKey<T>> = T[K] extends Array<infer U>\n ? U\n : never;\n\nexport function subformComponentProviders(component: any): {\n provide: InjectionToken<ControlValueAccessor>;\n useExisting: Type<any>;\n multi?: boolean;\n}[] {\n return [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: component,\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: component,\n multi: true,\n },\n ];\n}\n\nconst wrapAsQuote = (str: string): string => `\"${str}\"`;\n\nexport class MissingFormControlsError<T extends string> extends Error {\n constructor(missingFormControls: T[]) {\n super(\n `Attempt to update the form value with an object that doesn't contains some of the required form control keys.\\nMissing: ${missingFormControls\n .map(wrapAsQuote)\n .join(`, `)}`,\n );\n }\n}\n\nexport const NGX_SUB_FORM_HANDLE_VALUE_CHANGES_RATE_STRATEGIES = {\n debounce:\n <T>(time: number) =>\n (obs: Observable<T>): Observable<T> =>\n obs.pipe(debounce(() => timer(time))),\n};\n\n/**\n * Easily unsubscribe from an observable stream by appending `takeUntilDestroyed(this)` to the observable pipe.\n * If the component already has a `ngOnDestroy` method defined, it will call this first.\n */\nexport function takeUntilDestroyed<T>(component: any): (source: Observable<T>) => Observable<T> {\n const { ngOnDestroy } = getObservableLifecycle(component);\n return (source: Observable<T>): Observable<T> => source.pipe(takeUntil(ngOnDestroy));\n}\n\n/** @internal */\nexport function isNullOrUndefined(obj: any): obj is null | undefined {\n return obj === null || obj === undefined;\n}\n","import {\n AbstractControlOptions,\n ControlValueAccessor,\n UntypedFormArray,\n UntypedFormGroup,\n ValidationErrors,\n} from '@angular/forms';\nimport { cloneDeep } from 'lodash-es';\nimport { ReplaySubject } from 'rxjs';\nimport { Nilable } from 'tsdef';\nimport {\n ControlValueAccessorComponentInstance,\n FormBindings,\n NgxSubFormArrayOptions,\n NgxSubFormOptions,\n} from './ngx-sub-form.types';\nimport {\n ArrayPropertyKey,\n Controls,\n ControlsNames,\n NewFormErrors,\n OneOfControlsTypes,\n TypedFormGroup,\n} from './shared/ngx-sub-form-utils';\n\n/** @internal */\nexport const patchClassInstance = (componentInstance: any, obj: Object) => {\n Object.entries(obj).forEach(([key, newMethod]) => {\n componentInstance[key] = newMethod;\n });\n};\n\n/** @internal */\nexport const getControlValueAccessorBindings = <ControlInterface>(\n componentInstance: ControlValueAccessorComponentInstance,\n): FormBindings<ControlInterface> => {\n const writeValue$$: ReplaySubject<Nilable<ControlInterface>> = new ReplaySubject(1);\n const registerOnChange$$: ReplaySubject<(formValue: ControlInterface | null) => void> = new ReplaySubject(1);\n const registerOnTouched$$: ReplaySubject<() => void> = new ReplaySubject(1);\n const setDisabledState$$: ReplaySubject<boolean> = new ReplaySubject(1);\n\n const controlValueAccessorPatch: Required<ControlValueAccessor> = {\n writeValue: (obj: Nilable<any>): void => {\n writeValue$$.next(obj);\n },\n registerOnChange: (fn: (formValue: ControlInterface | null) => void): void => {\n registerOnChange$$.next(fn);\n },\n registerOnTouched: (fn: () => void): void => {\n registerOnTouched$$.next(fn);\n },\n setDisabledState: (shouldDisable: boolean | undefined): void => {\n setDisabledState$$.next(!!shouldDisable);\n },\n };\n\n patchClassInstance(componentInstance, controlValueAccessorPatch);\n\n return {\n writeValue$: writeValue$$.asObservable(),\n registerOnChange$: registerOnChange$$.asObservable(),\n registerOnTouched$: registerOnTouched$$.asObservable(),\n setDisabledState$: setDisabledState$$.asObservable(),\n };\n};\n\nexport const getFormGroupErrors = <ControlInterface, FormInterface extends {}>(\n formGroup: TypedFormGroup<FormInterface>,\n): NewFormErrors<FormInterface> => {\n const formErrors: NewFormErrors<ControlInterface> = Object.entries<OneOfControlsTypes>(formGroup.controls).reduce<\n Exclude<NewFormErrors<ControlInterface>, null>\n >((acc, [key, control]) => {\n if (control.errors) {\n // all of FormControl, FormArray and FormGroup can have errors so we assign them first\n const accumulatedGenericError = acc as Record<keyof ControlInterface, ValidationErrors>;\n accumulatedGenericError[key as keyof ControlInterface] = control.errors;\n }\n\n if (control instanceof UntypedFormArray) {\n // errors within an array are represented as a map\n // with the index and the error\n // this way, we avoid holding a lot of potential `null`\n // values in the array for the valid form controls\n const errorsInArray: Record<number, ValidationErrors> = {};\n\n for (let i = 0; i < control.length; i++) {\n const controlErrors = control.at(i).errors;\n if (controlErrors) {\n errorsInArray[i] = controlErrors;\n }\n }\n\n if (Object.values(errorsInArray).length > 0) {\n const accumulatedArrayErrors = acc as Record<keyof ControlInterface, Record<number, ValidationErrors>>;\n if (!(key in accumulatedArrayErrors)) {\n accumulatedArrayErrors[key as keyof ControlInterface] = {};\n }\n Object.assign(accumulatedArrayErrors[key as keyof ControlInterface], errorsInArray);\n }\n }\n\n return acc;\n }, {});\n\n if (!formGroup.errors && !Object.values(formErrors).length) {\n return null;\n }\n\n // todo remove any\n return Object.assign<any, any, any>({}, formGroup.errors ? { formGroup: formGroup.errors } : {}, formErrors);\n};\n\ninterface FormArrayWrapper<FormInterface> {\n key: keyof FormInterface;\n control: UntypedFormArray;\n}\n\nexport function createFormDataFromOptions<ControlInterface, FormInterface extends {}>(\n options: NgxSubFormOptions<ControlInterface, FormInterface>,\n) {\n const formGroup: TypedFormGroup<FormInterface> = new UntypedFormGroup(\n options.formControls,\n options.formGroupOptions as AbstractControlOptions,\n ) as TypedFormGroup<FormInterface>;\n const defaultValues: FormInterface = cloneDeep(formGroup.value);\n const formGroupKeys: (keyof Controls<FormInterface>)[] = Object.keys(\n options.formControls,\n ) as (keyof Controls<FormInterface>)[];\n const formControlNames: ControlsNames<FormInterface> = formGroupKeys.reduce<ControlsNames<FormInterface>>(\n (acc, curr) => {\n acc[curr] = curr;\n return acc;\n },\n {} as ControlsNames<FormInterface>,\n );\n\n const formArrays: FormArrayWrapper<FormInterface>[] = formGroupKeys.reduce<FormArrayWrapper<FormInterface>[]>(\n (acc, key) => {\n const control = formGroup.get(key as string);\n if (control instanceof UntypedFormArray) {\n acc.push({ key, control });\n }\n return acc;\n },\n [],\n );\n return { formGroup, defaultValues, formControlNames, formArrays };\n}\n\nexport const handleFormArrays = <FormInterface>(\n formArrayWrappers: FormArrayWrapper<FormInterface>[],\n obj: FormInterface,\n createFormArrayControl: Required<NgxSubFormArrayOptions<FormInterface>>['createFormArrayControl'],\n) => {\n if (!formArrayWrappers.length) {\n return;\n }\n\n formArrayWrappers.forEach(({ key, control }) => {\n const value = obj[key];\n\n if (!Array.isArray(value)) {\n return;\n }\n\n // instead of creating a new array every time and push a new FormControl\n // we just remove or add what is necessary so that:\n // - it is as efficient as possible and do not create unnecessary FormControl every time\n // - validators are not destroyed/created again and eventually fire again for no reason\n while (control.length > value.length) {\n control.removeAt(control.length - 1);\n }\n\n for (let i = control.length; i < value.length; i++) {\n const newControl = createFormArrayControl(key as ArrayPropertyKey<FormInterface>, value[i]);\n if (control.disabled) {\n newControl.disable();\n }\n control.insert(i, newControl);\n }\n });\n};\n","import { ControlValueAccessor, UntypedFormControl, Validator } from '@angular/forms';\nimport { Observable, Subject } from 'rxjs';\nimport { Nilable } from 'tsdef';\nimport {\n ArrayPropertyKey,\n ArrayPropertyValue,\n Controls,\n ControlsNames,\n NewFormErrors,\n TypedFormGroup,\n} from './shared/ngx-sub-form-utils';\nimport { FormGroupOptions } from './shared/ngx-sub-form.types';\n\nexport interface ComponentHooks {\n onDestroy: Observable<void>;\n afterViewInit: Observable<void>;\n}\n\nexport interface FormBindings<ControlInterface> {\n readonly writeValue$: Observable<Nilable<ControlInterface>>;\n readonly registerOnChange$: Observable<(formValue: ControlInterface | null) => void>;\n readonly registerOnTouched$: Observable<() => void>;\n readonly setDisabledState$: Observable<boolean>;\n}\n\nexport type ControlValueAccessorComponentInstance = Object &\n // ControlValueAccessor methods are called\n // directly by Angular and expects a value\n // so we have to define it within ngx-sub-form\n // and this should *never* be overridden by the component\n Partial<Record<keyof ControlValueAccessor, never> & Record<keyof Validator, never>>;\n\nexport interface NgxSubForm<ControlInterface, FormInterface extends {}> {\n readonly formGroup: TypedFormGroup<FormInterface>;\n readonly formControlNames: ControlsNames<FormInterface>;\n readonly formGroupErrors: NewFormErrors<FormInterface>;\n readonly createFormArrayControl: CreateFormArrayControlMethod<FormInterface>;\n readonly controlValue$: Observable<Nilable<ControlInterface>>;\n}\n\nexport type CreateFormArrayControlMethod<FormInterface> = <K extends ArrayPropertyKey<FormInterface>>(\n key: K,\n initialValue: ArrayPropertyValue<FormInterface, K>,\n) => UntypedFormControl;\n\nexport interface NgxRootForm<ControlInterface, FormInterface extends {}>\n extends NgxSubForm<ControlInterface, FormInterface> {\n // @todo: anything else needed here?\n}\n\nexport interface NgxSubFormArrayOptions<FormInterface> {\n createFormArrayControl?: CreateFormArrayControlMethod<FormInterface>;\n}\n\nexport interface NgxSubFormRemapOptions<ControlInterface, FormInterface> {\n toFormGroup: (obj: ControlInterface) => FormInterface;\n fromFormGroup: (formValue: FormInterface) => ControlInterface;\n}\n\nexport type AreTypesSimilar<T, U> = T extends U ? (U extends T ? true : false) : false;\n\n// if the 2 types are the same, instead of hiding the remap options\n// we expose them as optional so that it's possible for example to\n// override some defaults\ntype NgxSubFormRemap<ControlInterface, FormInterface> = AreTypesSimilar<ControlInterface, FormInterface> extends true // we expose them\n ? Partial<NgxSubFormRemapOptions<ControlInterface, FormInterface>>\n : NgxSubFormRemapOptions<ControlInterface, FormInterface>;\n\ntype NgxSubFormArray<FormInterface> = ArrayPropertyKey<FormInterface> extends never\n ? {} // no point defining `createFormArrayControl` if there's not a single array in the `FormInterface`\n : NgxSubFormArrayOptions<FormInterface>;\n\nexport type NgxSubFormOptions<\n ControlInterface,\n FormInterface extends {} = ControlInterface extends {} ? ControlInterface : never,\n> = {\n formType: FormType;\n formControls: Controls<FormInterface>;\n formGroupOptions?: FormGroupOptions<FormInterface>;\n emitNullOnDestroy?: boolean;\n emitInitialValueOnInit?: boolean;\n componentHooks?: ComponentHooks;\n // emit on this observable to mark the control as touched\n touched$?: Observable<void>;\n} & NgxSubFormRemap<ControlInterface, FormInterface> &\n NgxSubFormArray<FormInterface>;\n\nexport type NgxRootFormOptions<\n ControlInterface,\n FormInterface extends {} = ControlInterface extends {} ? ControlInterface : never,\n> = NgxSubFormOptions<ControlInterface, FormInterface> & {\n input$: Observable<ControlInterface | undefined>;\n output$: Subject<ControlInterface>;\n disabled$?: Observable<boolean>;\n // by default, a root form is considered as an automatic root form\n // if you want to transform it into a manual root form, provide the\n // following observable which trigger a save every time a value is emitted\n manualSave$?: Observable<void>;\n // The default behavior is to compare the current transformed value of input$ with the current value of the form, and\n // if these are equal emission on output$ is suppressed to prevent the from broadcasting the current value.\n // Configure this option to provide your own custom predicate whether or not the form should emit.\n outputFilterPredicate?: (currentInputValue: FormInterface, outputValue: FormInterface) => boolean;\n // if you want to control how frequently the form emits on the output$, you can customise the emission rate with this\n // option. e.g. `handleEmissionRate: formValue$ => formValue$.pipe(debounceTime(300)),`\n handleEmissionRate?: (obs$: Observable<FormInterface>) => Observable<FormInterface>;\n};\n\nexport enum FormType {\n SUB = 'Sub',\n ROOT = 'Root',\n}\n\nexport type NgxFormOptions<ControlInterface, FormInterface extends {}> =\n | NgxSubFormOptions<ControlInterface, FormInterface>\n | NgxRootFormOptions<ControlInterface, FormInterface>;\n","import { ChangeDetectorRef, inject } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport isEqual from 'fast-deep-equal';\nimport { getObservableLifecycle } from 'ngx-observable-lifecycle';\nimport { combineLatest, concat, EMPTY, identity, merge, Observable, of, timer } from 'rxjs';\nimport {\n delay,\n filter,\n map,\n mapTo,\n shareReplay,\n startWith,\n switchMap,\n take,\n takeUntil,\n tap,\n withLatestFrom,\n} from 'rxjs/operators';\nimport {\n createFormDataFromOptions,\n getControlValueAccessorBindings,\n getFormGroupErrors,\n handleFormArrays,\n patchClassInstance,\n} from './helpers';\nimport {\n ComponentHooks,\n ControlValueAccessorComponentInstance,\n FormBindings,\n FormType,\n NgxFormOptions,\n NgxRootForm,\n NgxRootFormOptions,\n NgxSubForm,\n NgxSubFormArrayOptions,\n NgxSubFormOptions,\n} from './ngx-sub-form.types';\nimport { isNullOrUndefined } from './shared/ngx-sub-form-utils';\n\nconst optionsHaveInstructionsToCreateArrays = <ControlInterface, FormInterface extends {}>(\n options: NgxFormOptions<ControlInterface, FormInterface> & Partial<NgxSubFormArrayOptions<FormInterface>>,\n): options is NgxSubFormOptions<ControlInterface, FormInterface> & NgxSubFormArrayOptions<FormInterface> =>\n !!options.createFormArrayControl;\n\n// @todo find a better name\nconst isRoot = <ControlInterface, FormInterface extends {}>(\n options: any,\n): options is NgxRootFormOptions<ControlInterface, FormInterface> => {\n const opt = options as NgxRootFormOptions<ControlInterface, FormInterface>;\n return opt.formType === FormType.ROOT;\n};\n\nexport function createForm<\n ControlInterface,\n FormInterface extends {} = ControlInterface extends {} ? ControlInterface : never,\n>(\n componentInstance: ControlValueAccessorComponentInstance,\n options: NgxRootFormOptions<ControlInterface, FormInterface>,\n): NgxRootForm<ControlInterface, FormInterface>;\nexport function createForm<\n ControlInterface,\n FormInterface extends {} = ControlInterface extends {} ? ControlInterface : never,\n>(\n componentInstance: ControlValueAccessorComponentInstance,\n options: NgxSubFormOptions<ControlInterface, FormInterface>,\n): NgxSubForm<ControlInterface, FormInterface>;\nexport function createForm<ControlInterface, FormInterface extends {}>(\n componentInstance: ControlValueAccessorComponentInstance,\n options: NgxFormOptions<ControlInterface, FormInterface>,\n): NgxSubForm<ControlInterface, FormInterface> {\n const { formGroup, defaultValues, formControlNames, formArrays } = createFormDataFromOptions<\n ControlInterface,\n FormInterface\n >(options);\n\n let isRemoved = false;\n\n const lifecyleHooks: ComponentHooks = options.componentHooks ?? {\n onDestroy: getObservableLifecycle(componentInstance).ngOnDestroy,\n afterViewInit: getObservableLifecycle(componentInstance).ngAfterViewInit,\n };\n\n const changeDetectorRef = inject(ChangeDetectorRef);\n\n lifecyleHooks.onDestroy.pipe(take(1)).subscribe(() => {\n isRemoved = true;\n });\n\n // define the `validate` method to improve errors\n // and support nested errors\n patchClassInstance(componentInstance, {\n validate: () => {\n if (isRemoved) return null;\n\n if (formGroup.valid) {\n return null;\n }\n\n return getFormGroupErrors<ControlInterface, FormInterface>(formGroup);\n },\n });\n\n // in order to ensure the form has the correct state (and validation errors) we update the value and validity\n // immediately after the first tick\n const updateValueAndValidity$ = timer(0);\n\n const componentHooks = getControlValueAccessorBindings<ControlInterface>(componentInstance);\n\n const writeValue$: FormBindings<ControlInterface>['writeValue$'] = isRoot<ControlInterface, FormInterface>(options)\n ? options.input$.pipe(\n // we need to start with a value here otherwise if a root form does not bind\n // its input (and only uses an output, for example a filter) then\n // `broadcastValueToParent$` would never start and we would never get updates\n startWith(null),\n )\n : componentHooks.writeValue$;\n\n const registerOnChange$: FormBindings<ControlInterface>['registerOnChange$'] = isRoot<\n ControlInterface,\n FormInterface\n >(options)\n ? of(data => {\n if (!data) {\n return;\n }\n options.output$.next(data);\n })\n : componentHooks.registerOnChange$;\n\n const setDisabledState$: FormBindings<ControlInterface>['setDisabledState$'] = isRoot<\n ControlInterface,\n FormInterface\n >(options)\n ? options.disabled$ ?? of(false)\n : componentHooks.setDisabledState$;\n\n const transformedValue$: Observable<FormInterface> = writeValue$.pipe(\n map(value => {\n if (isNullOrUndefined(value)) {\n return defaultValues;\n }\n\n if (options.toFormGroup) {\n return options.toFormGroup(value);\n }\n\n // if it's not a remap component, the ControlInterface === the FormInterface\n return value as any as FormInterface;\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n const broadcastDefaultValueToParent$: Observable<ControlInterface> = !options.emitInitialValueOnInit\n ? EMPTY\n : transformedValue$.pipe(\n take(1),\n switchMap(transformedValue => {\n const transformedValueDelayed$ = of(transformedValue).pipe(\n delay(0),\n filter(() => formGroup.valid),\n );\n\n if (!isRoot<ControlInterface, FormInterface>(options)) {\n return transformedValueDelayed$;\n }\n\n return of(transformedValue).pipe(\n filter(formValue =>\n !options.outputFilterPredicate ? true : options.outputFilterPredicate(transformedValue, formValue),\n ),\n );\n }),\n map(value =>\n options.fromFormGroup\n ? options.fromFormGroup(value)\n : // if it's not a remap component, the ControlInterface === the FormInterface\n (value as any as ControlInterface),\n ),\n );\n\n const broadcastValueToParent$: Observable<ControlInterface> = transformedValue$.pipe(\n switchMap(transformedValue => {\n if (!isRoot<ControlInterface, FormInterface>(options)) {\n return formGroup.valueChanges.pipe(delay(0));\n } else {\n const formValues$ = options.manualSave$\n ? options.manualSave$.pipe(\n withLatestFrom(formGroup.valueChanges),\n map(([_, formValue]) => formValue),\n )\n : formGroup.valueChanges;\n\n // it might be surprising to see formGroup validity being checked twice\n // here, however this is intentional. The delay(0) allows any sub form\n // components to populate values into the form, and it is possible for\n // the form to be invalid after this process. In which case we suppress\n // outputting an invalid value, and wait for the user to make the value\n // become valid.\n return formValues$.pipe(\n filter(() => formGroup.valid),\n delay(0),\n filter(formValue => {\n if (formGroup.invalid) {\n return false;\n }\n\n if (options.outputFilterPredicate) {\n return options.outputFilterPredicate(transformedValue, formValue);\n }\n\n return !isEqual(transformedValue, formValue);\n }),\n options.handleEmissionRate ?? identity,\n );\n }\n }),\n map(value =>\n options.fromFormGroup\n ? options.fromFormGroup(value)\n : // if it's not a remap component, the ControlInterface === the FormInterface\n (value as any as ControlInterface),\n ),\n );\n\n // components often need to know what the current value of the FormControl that it is representing is, usually for\n // display purposes in the template. This value is the composition of the value written from the parent, and the\n // transformed current value that was most recently written to the parent\n const controlValue$: NgxSubForm<ControlInterface, FormInterface>['controlValue$'] = merge(\n writeValue$,\n broadcastValueToParent$,\n ).pipe(shareReplay({ bufferSize: 1, refCount: true }));\n\n const emitNullOnDestroy$: Observable<null> =\n // emit null when destroyed by default\n isNullOrUndefined(options.emitNullOnDestroy) || options.emitNullOnDestroy\n ? lifecyleHooks.onDestroy.pipe(mapTo(null))\n : EMPTY;\n\n const createFormArrayControl: Required<NgxSubFormArrayOptions<FormInterface>>['createFormArrayControl'] =\n optionsHaveInstructionsToCreateArrays<ControlInterface, FormInterface>(options) && options.createFormArrayControl\n ? options.createFormArrayControl\n : (key, initialValue) => new UntypedFormControl(initialValue);\n\n const sideEffects = {\n broadcastValueToParent$: registerOnChange$.pipe(\n switchMap(onChange => broadcastValueToParent$.pipe(tap(value => onChange(value)))),\n ),\n broadcastDefaultValueToParent$: registerOnChange$.pipe(\n switchMap(onChange => broadcastDefaultValueToParent$.pipe(tap(value => onChange(value)))),\n ),\n applyUpstreamUpdateOnLocalForm$: transformedValue$.pipe(\n tap(value => {\n handleFormArrays<FormInterface>(formArrays, value, createFormArrayControl);\n\n formGroup.reset(value, { emitEvent: false });\n }),\n ),\n supportChangeDetectionStrategyOnPush: concat(\n lifecyleHooks.afterViewInit.pipe(take(1)),\n merge(controlValue$, setDisabledState$).pipe(\n delay(0),\n tap(() => {\n changeDetectorRef.markForCheck();\n }),\n ),\n ),\n setDisabledState$: setDisabledState$.pipe(\n tap((shouldDisable: boolean) => {\n shouldDisable ? formGroup.disable({ emitEvent: false }) : formGroup.enable({ emitEvent: false });\n }),\n ),\n updateValue$: updateValueAndValidity$.pipe(\n tap(() => {\n formGroup.updateValueAndValidity({ emitEvent: false });\n }),\n ),\n bindTouched$: combineLatest([componentHooks.registerOnTouched$, options.touched$ ?? EMPTY]).pipe(\n delay(0),\n tap(([onTouched]) => onTouched()),\n ),\n };\n\n merge(...Object.values(sideEffects))\n .pipe(takeUntil(lifecyleHooks.onDestroy))\n .subscribe();\n\n // following cannot be part of `forkJoin(sideEffects)`\n // because it uses `takeUntilDestroyed` which destroys\n // the subscription when the component is being destroyed\n // and therefore prevents the emit of the null value if needed\n registerOnChange$\n .pipe(\n switchMap(onChange => emitNullOnDestroy$.pipe(tap(value => onChange(value)))),\n takeUntil(lifecyleHooks.onDestroy.pipe(delay(0))),\n )\n .subscribe();\n\n return {\n formGroup,\n formControlNames,\n get formGroupErrors() {\n return getFormGroupErrors<ControlInterface, FormInterface>(formGroup);\n },\n createFormArrayControl,\n controlValue$,\n };\n}\n","/*\n * Public API Surface of sub-form\n */\n\nexport * from './lib/shared/ngx-sub-form-utils';\nexport * from './lib/shared/ngx-sub-form.types';\n\nexport * from './lib/helpers';\nexport * from './lib/create-form';\nexport * from './lib/ngx-sub-form.types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}