{"version":3,"file":"ngxtension-form-events.mjs","sources":["../../../../libs/ngxtension/form-events/src/form-events.ts","../../../../libs/ngxtension/form-events/src/ngxtension-form-events.ts"],"sourcesContent":["import { Injector, Signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport {\n\tAbstractControl,\n\tControlEvent,\n\tFormControlStatus,\n\tFormGroup,\n\tPristineChangeEvent,\n\tStatusChangeEvent,\n\tTouchedChangeEvent,\n\tValidationErrors,\n\tValueChangeEvent,\n} from '@angular/forms';\nimport {\n\tObservable,\n\tcombineLatest,\n\tdefer,\n\tdistinctUntilChanged,\n\tfilter,\n\tmap,\n\tof,\n\tstartWith,\n\tswitchMap,\n\tthrowError,\n} from 'rxjs';\n\nfunction valueEvents$<T>(form: AbstractControl<T>) {\n\treturn form.events.pipe(\n\t\tfilter(\n\t\t\t(event: ControlEvent): event is ValueChangeEvent<typeof form.value> =>\n\t\t\t\tevent instanceof ValueChangeEvent,\n\t\t),\n\t);\n}\n\nfunction statusEvents$<T>(form: AbstractControl<T>) {\n\treturn form.events.pipe(\n\t\tfilter(\n\t\t\t(event: ControlEvent): event is StatusChangeEvent =>\n\t\t\t\tevent instanceof StatusChangeEvent,\n\t\t),\n\t);\n}\n\nfunction touchedEvents$<T>(form: AbstractControl<T>) {\n\treturn form.events.pipe(\n\t\tfilter(\n\t\t\t(event: ControlEvent): event is TouchedChangeEvent =>\n\t\t\t\tevent instanceof TouchedChangeEvent,\n\t\t),\n\t);\n}\n\nfunction pristineEvents$<T>(form: AbstractControl<T>) {\n\treturn form.events.pipe(\n\t\tfilter(\n\t\t\t(event: ControlEvent): event is PristineChangeEvent =>\n\t\t\t\tevent instanceof PristineChangeEvent,\n\t\t),\n\t);\n}\n\nfunction errorsEvents$<T>(form: AbstractControl<T>) {\n\treturn form.valueChanges.pipe(\n\t\tstartWith(null),\n\t\tswitchMap(() => {\n\t\t\tif (form instanceof FormGroup) {\n\t\t\t\treturn of(\n\t\t\t\t\tObject.entries(form.controls).reduce(\n\t\t\t\t\t\t(acc: ValidationErrors, [key, control]) => {\n\t\t\t\t\t\t\tif (!acc[key]) {\n\t\t\t\t\t\t\t\tacc[key];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tacc[key] = control.errors;\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{},\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (form instanceof AbstractControl) {\n\t\t\t\treturn of(form.errors);\n\t\t\t}\n\t\t\treturn throwError(\n\t\t\t\t() =>\n\t\t\t\t\tnew Error('NGXTENSION: form is not a FormGroup or AbstractControl'),\n\t\t\t);\n\t\t}),\n\t);\n}\n\nfunction isValueEvent<T>(\n\tevent: ControlEvent | T,\n): event is ValueChangeEvent<T> {\n\treturn event instanceof ValueChangeEvent;\n}\nfunction isStatusEvent<T>(event: ControlEvent | T): event is StatusChangeEvent {\n\treturn event instanceof StatusChangeEvent;\n}\nfunction isPristineEvent<T>(\n\tevent: ControlEvent | T,\n): event is PristineChangeEvent {\n\treturn event instanceof PristineChangeEvent;\n}\nfunction isTouchedEvent<T>(\n\tevent: ControlEvent | T,\n): event is TouchedChangeEvent {\n\treturn event instanceof TouchedChangeEvent;\n}\n\ntype FormEventData<T> = {\n\tvalue: T;\n\tstatus: FormControlStatus;\n\ttouched: boolean;\n\tpristine: boolean;\n\tvalid: boolean;\n\tinvalid: boolean;\n\tpending: boolean;\n\tdirty: boolean;\n\tuntouched: boolean;\n\tcontrolErrors: ValidationErrors | null;\n};\n\nexport function allEventsObservable<T>(\n\tform: AbstractControl<T>,\n): Observable<FormEventData<T>>;\nexport function allEventsObservable<T>(\n\tform: AbstractControl,\n): Observable<FormEventData<T>>;\n\nexport function allEventsObservable<T>(\n\tform: AbstractControl<T>,\n): Observable<FormEventData<T>> {\n\treturn defer(() =>\n\t\tcombineLatest([\n\t\t\tvalueEvents$(form).pipe(\n\t\t\t\tstartWith(form.getRawValue()),\n\t\t\t\tmap(() => form.getRawValue()),\n\t\t\t\tdistinctUntilChanged(\n\t\t\t\t\t(previous, current) =>\n\t\t\t\t\t\tJSON.stringify(previous) === JSON.stringify(current),\n\t\t\t\t),\n\t\t\t),\n\t\t\tstatusEvents$(form).pipe(startWith(form.status)),\n\t\t\ttouchedEvents$(form).pipe(startWith(form.touched)),\n\t\t\tpristineEvents$(form).pipe(startWith(form.pristine)),\n\t\t\terrorsEvents$(form),\n\t\t]).pipe(\n\t\t\tmap(([valueParam, statusParam, touchedParam, pristineParam, errors]) => {\n\t\t\t\t// Original values (plus value)\n\t\t\t\tconst stat: FormControlStatus | StatusChangeEvent = isStatusEvent(\n\t\t\t\t\tstatusParam,\n\t\t\t\t)\n\t\t\t\t\t? statusParam.status\n\t\t\t\t\t: statusParam;\n\t\t\t\tconst touch: boolean | TouchedChangeEvent = isTouchedEvent(touchedParam)\n\t\t\t\t\t? touchedParam.touched\n\t\t\t\t\t: touchedParam;\n\t\t\t\tconst prist: boolean | PristineChangeEvent = isPristineEvent(\n\t\t\t\t\tpristineParam,\n\t\t\t\t)\n\t\t\t\t\t? pristineParam.pristine\n\t\t\t\t\t: pristineParam;\n\n\t\t\t\t// Derived values - not directly named as events but are aliases for something that can be derived from original values\n\t\t\t\tconst validDerived = stat === 'VALID';\n\t\t\t\tconst invalidDerived = stat === 'INVALID';\n\t\t\t\tconst pendingDerived = stat === 'PENDING';\n\t\t\t\tconst dirtyDerived = !prist;\n\t\t\t\tconst untouchedDerived = !touch;\n\n\t\t\t\treturn {\n\t\t\t\t\tvalue: valueParam,\n\t\t\t\t\tstatus: stat,\n\t\t\t\t\ttouched: touch,\n\t\t\t\t\tpristine: prist,\n\t\t\t\t\tvalid: validDerived,\n\t\t\t\t\tinvalid: invalidDerived,\n\t\t\t\t\tpending: pendingDerived,\n\t\t\t\t\tdirty: dirtyDerived,\n\t\t\t\t\tuntouched: untouchedDerived,\n\t\t\t\t\tcontrolErrors: errors,\n\t\t\t\t};\n\t\t\t}),\n\t\t),\n\t);\n}\n\nexport function allEventsSignal<T>(\n\tform: AbstractControl<T>,\n\tinjector?: Injector,\n): Signal<FormEventData<T>>;\n\nexport function allEventsSignal<T>(\n\tform: AbstractControl,\n\tinjector?: Injector,\n): Signal<FormEventData<T>>;\n\nexport function allEventsSignal<T>(\n\tform: AbstractControl<T>,\n\tinjector?: Injector,\n): Signal<FormEventData<T>> {\n\treturn toSignal(allEventsObservable(form), {\n\t\tinitialValue: {\n\t\t\tvalue: form.getRawValue(),\n\t\t\tstatus: form.status,\n\t\t\tpristine: form.pristine,\n\t\t\ttouched: form.touched,\n\t\t\tvalid: form.valid,\n\t\t\tinvalid: form.invalid,\n\t\t\tpending: form.pending,\n\t\t\tdirty: form.dirty,\n\t\t\tuntouched: form.untouched,\n\t\t\tcontrolErrors: form.errors,\n\t\t},\n\t\tinjector: injector,\n\t});\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AA0BA,SAAS,YAAY,CAAI,IAAwB,EAAA;AAChD,IAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACtB,MAAM,CACL,CAAC,KAAmB,KACnB,KAAK,YAAY,gBAAgB,CAClC,CACD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAI,IAAwB,EAAA;AACjD,IAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACtB,MAAM,CACL,CAAC,KAAmB,KACnB,KAAK,YAAY,iBAAiB,CACnC,CACD,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAI,IAAwB,EAAA;AAClD,IAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACtB,MAAM,CACL,CAAC,KAAmB,KACnB,KAAK,YAAY,kBAAkB,CACpC,CACD,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAI,IAAwB,EAAA;AACnD,IAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACtB,MAAM,CACL,CAAC,KAAmB,KACnB,KAAK,YAAY,mBAAmB,CACrC,CACD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAI,IAAwB,EAAA;AACjD,IAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAC5B,SAAS,CAAC,IAAI,CAAC,EACf,SAAS,CAAC,MAAK;AACd,QAAA,IAAI,IAAI,YAAY,SAAS,EAAE;YAC9B,OAAO,EAAE,CACR,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CACnC,CAAC,GAAqB,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,KAAI;AACzC,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBACd,GAAG,CAAC,GAAG,CAAC,CAAC;iBACT;AACD,gBAAA,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;AAC1B,gBAAA,OAAO,GAAG,CAAC;AACZ,aAAC,EACD,EAAE,CACF,CACD,CAAC;SACF;AACD,QAAA,IAAI,IAAI,YAAY,eAAe,EAAE;AACpC,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACvB;QACD,OAAO,UAAU,CAChB,MACC,IAAI,KAAK,CAAC,wDAAwD,CAAC,CACpE,CAAC;KACF,CAAC,CACF,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CACpB,KAAuB,EAAA;IAEvB,OAAO,KAAK,YAAY,gBAAgB,CAAC;AAC1C,CAAC;AACD,SAAS,aAAa,CAAI,KAAuB,EAAA;IAChD,OAAO,KAAK,YAAY,iBAAiB,CAAC;AAC3C,CAAC;AACD,SAAS,eAAe,CACvB,KAAuB,EAAA;IAEvB,OAAO,KAAK,YAAY,mBAAmB,CAAC;AAC7C,CAAC;AACD,SAAS,cAAc,CACtB,KAAuB,EAAA;IAEvB,OAAO,KAAK,YAAY,kBAAkB,CAAC;AAC5C,CAAC;AAsBK,SAAU,mBAAmB,CAClC,IAAwB,EAAA;AAExB,IAAA,OAAO,KAAK,CAAC,MACZ,aAAa,CAAC;QACb,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CACtB,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAC7B,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,EAC7B,oBAAoB,CACnB,CAAC,QAAQ,EAAE,OAAO,KACjB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CACrD,CACD;AACD,QAAA,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAChD,QAAA,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClD,QAAA,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,aAAa,CAAC,IAAI,CAAC;AACnB,KAAA,CAAC,CAAC,IAAI,CACN,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,KAAI;;AAEtE,QAAA,MAAM,IAAI,GAA0C,aAAa,CAChE,WAAW,CACX;cACE,WAAW,CAAC,MAAM;cAClB,WAAW,CAAC;AACf,QAAA,MAAM,KAAK,GAAiC,cAAc,CAAC,YAAY,CAAC;cACrE,YAAY,CAAC,OAAO;cACpB,YAAY,CAAC;AAChB,QAAA,MAAM,KAAK,GAAkC,eAAe,CAC3D,aAAa,CACb;cACE,aAAa,CAAC,QAAQ;cACtB,aAAa,CAAC;;AAGjB,QAAA,MAAM,YAAY,GAAG,IAAI,KAAK,OAAO,CAAC;AACtC,QAAA,MAAM,cAAc,GAAG,IAAI,KAAK,SAAS,CAAC;AAC1C,QAAA,MAAM,cAAc,GAAG,IAAI,KAAK,SAAS,CAAC;AAC1C,QAAA,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,MAAM,gBAAgB,GAAG,CAAC,KAAK,CAAC;QAEhC,OAAO;AACN,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,KAAK,EAAE,YAAY;AACnB,YAAA,OAAO,EAAE,cAAc;AACvB,YAAA,OAAO,EAAE,cAAc;AACvB,YAAA,KAAK,EAAE,YAAY;AACnB,YAAA,SAAS,EAAE,gBAAgB;AAC3B,YAAA,aAAa,EAAE,MAAM;SACrB,CAAC;KACF,CAAC,CACF,CACD,CAAC;AACH,CAAC;AAYe,SAAA,eAAe,CAC9B,IAAwB,EACxB,QAAmB,EAAA;AAEnB,IAAA,OAAO,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE;AAC1C,QAAA,YAAY,EAAE;AACb,YAAA,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,aAAa,EAAE,IAAI,CAAC,MAAM;AAC1B,SAAA;AACD,QAAA,QAAQ,EAAE,QAAQ;AAClB,KAAA,CAAC,CAAC;AACJ;;ACzNA;;AAEG;;;;"}