ngx-form-signal 1.18.0 → 1.18.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +3 -20
  2. package/esm2022/lib/deep-form-signal.mjs +27 -0
  3. package/esm2022/lib/form-signal.mjs +44 -0
  4. package/esm2022/lib/helpers/form-dirty-signal.mjs +30 -0
  5. package/esm2022/lib/helpers/form-error-signal.mjs +10 -0
  6. package/esm2022/lib/helpers/form-snapshot-signal.mjs +27 -0
  7. package/esm2022/lib/helpers/form-status-signal.mjs +37 -0
  8. package/esm2022/lib/helpers/form-touched-signal.mjs +32 -0
  9. package/esm2022/lib/helpers/form-value-signal.mjs +27 -0
  10. package/esm2022/lib/types/deep-form-signal-type.mjs +2 -0
  11. package/esm2022/lib/types/form-signal-options.mjs +4 -0
  12. package/esm2022/lib/types/form-signal-type.mjs +2 -0
  13. package/esm2022/lib/types/form-type.mjs +2 -0
  14. package/esm2022/ngx-form-signal.mjs +5 -0
  15. package/esm2022/public-api.mjs +10 -0
  16. package/fesm2022/ngx-form-signal.mjs +230 -0
  17. package/fesm2022/ngx-form-signal.mjs.map +1 -0
  18. package/index.d.ts +5 -0
  19. package/lib/deep-form-signal.d.ts +5 -0
  20. package/lib/form-signal.d.ts +5 -0
  21. package/lib/helpers/form-dirty-signal.d.ts +9 -0
  22. package/lib/helpers/form-error-signal.d.ts +5 -0
  23. package/lib/helpers/form-snapshot-signal.d.ts +2 -0
  24. package/lib/helpers/form-status-signal.d.ts +14 -0
  25. package/lib/helpers/form-touched-signal.d.ts +9 -0
  26. package/lib/helpers/form-value-signal.d.ts +9 -0
  27. package/lib/types/deep-form-signal-type.d.ts +17 -0
  28. package/lib/types/form-signal-options.d.ts +19 -0
  29. package/lib/types/form-signal-type.d.ts +37 -0
  30. package/lib/types/form-type.d.ts +5 -0
  31. package/package.json +45 -13
  32. package/{src/public-api.ts → public-api.d.ts} +6 -8
  33. package/ng-package.json +0 -7
  34. package/src/lib/form-signal.ts +0 -75
  35. package/src/lib/helpers/form-dirty-signal.ts +0 -46
  36. package/src/lib/helpers/form-error-signal.ts +0 -28
  37. package/src/lib/helpers/form-invalid-signal.ts +0 -23
  38. package/src/lib/helpers/form-snapshot-signal.ts +0 -37
  39. package/src/lib/helpers/form-status-signal.ts +0 -57
  40. package/src/lib/helpers/form-touched-signal.ts +0 -48
  41. package/src/lib/helpers/form-value-signal.ts +0 -48
  42. package/src/lib/types/form-signal-options.ts +0 -20
  43. package/src/lib/types/form-signal-type.ts +0 -68
  44. package/src/lib/types/form-type.ts +0 -18
  45. package/tsconfig.lib.json +0 -15
  46. package/tsconfig.lib.prod.json +0 -11
  47. package/tsconfig.spec.json +0 -15
package/README.md CHANGED
@@ -1,24 +1,7 @@
1
1
  # NgxFormSignal
2
2
 
3
- This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.2.0.
3
+ Signal based form api for angular.
4
4
 
5
- ## Code scaffolding
5
+ The goal of NgxFormSignal is to allow easy conversion from existing form objects to reactive signal primitives. This gives developers the ability to derive state off an existing form object as well as react to form state changes such as dirty, invalid, touched, etc... while remaining in the signal realm.
6
6
 
7
- Run `ng generate component component-name --project ngx-form-signal` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ngx-form-signal`.
8
- > Note: Don't forget to add `--project ngx-form-signal` or else it will be added to the default project in your `angular.json` file.
9
-
10
- ## Build
11
-
12
- Run `ng build ngx-form-signal` to build the project. The build artifacts will be stored in the `dist/` directory.
13
-
14
- ## Publishing
15
-
16
- After building your library with `ng build ngx-form-signal`, go to the dist folder `cd dist/ngx-form-signal` and run `npm publish`.
17
-
18
- ## Running unit tests
19
-
20
- Run `ng test ngx-form-signal` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
-
22
- ## Further help
23
-
24
- To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
7
+ See full documentation on [github repository](https://github.com/Devin-Harris/ngx-form-signal)
@@ -0,0 +1,27 @@
1
+ import { isSignal } from '@angular/core';
2
+ import { FormArray, FormControl, FormGroup } from '@angular/forms';
3
+ import { formSignal } from './form-signal';
4
+ import { buildDefaultFormSignalOptions, } from './types/form-signal-options';
5
+ export function deepFormSignal(form, options = buildDefaultFormSignalOptions()) {
6
+ const root = formSignal(form, options);
7
+ const formVal = isSignal(form) ? form() : form;
8
+ if (formVal && !(formVal instanceof FormControl)) {
9
+ let children = null;
10
+ if (formVal instanceof FormArray) {
11
+ // @ts-ignore
12
+ children = formVal.controls.map((c) => deepFormSignal(c, options));
13
+ }
14
+ else if (formVal instanceof FormGroup) {
15
+ const controls = formVal.controls;
16
+ const keys = Object.keys(controls);
17
+ children = keys.reduce((acc, cKey) => {
18
+ // @ts-ignore
19
+ acc[cKey] = deepFormSignal(controls[cKey], options);
20
+ return acc;
21
+ }, {});
22
+ }
23
+ root.children = children;
24
+ }
25
+ return root;
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcC1mb3JtLXNpZ25hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1mb3JtLXNpZ25hbC9zcmMvbGliL2RlZXAtZm9ybS1zaWduYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFDSiw2QkFBNkIsR0FFL0IsTUFBTSw2QkFBNkIsQ0FBQztBQUdyQyxNQUFNLFVBQVUsY0FBYyxDQUMzQixJQUErRCxFQUMvRCxVQUFvQyw2QkFBNkIsRUFBSztJQUV0RSxNQUFNLElBQUksR0FBc0IsVUFBVSxDQUN2QyxJQUFJLEVBQ0osT0FBTyxDQUNZLENBQUM7SUFFdkIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQy9DLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLFlBQVksV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxJQUFJLFFBQVEsR0FBeUMsSUFBSSxDQUFDO1FBRTFELElBQUksT0FBTyxZQUFZLFNBQVMsRUFBRSxDQUFDO1lBQ2hDLGFBQWE7WUFDYixRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN0RSxDQUFDO2FBQU0sSUFBSSxPQUFPLFlBQVksU0FBUyxFQUFFLENBQUM7WUFDdkMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUNsQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUNuQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDWCxhQUFhO2dCQUNiLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRCxPQUFPLEdBQUcsQ0FBQztZQUNkLENBQUMsRUFDRCxFQUFtQyxDQUNyQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzVCLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1NpZ25hbCwgU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZm9ybVNpZ25hbCB9IGZyb20gJy4vZm9ybS1zaWduYWwnO1xyXG5pbXBvcnQgeyBEZWVwRm9ybVNpZ25hbCB9IGZyb20gJy4vdHlwZXMvZGVlcC1mb3JtLXNpZ25hbC10eXBlJztcclxuaW1wb3J0IHtcclxuICAgYnVpbGREZWZhdWx0Rm9ybVNpZ25hbE9wdGlvbnMsXHJcbiAgIERlZXBGb3JtU2lnbmFsT3B0aW9ucyxcclxufSBmcm9tICcuL3R5cGVzL2Zvcm0tc2lnbmFsLW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBPcHRpb25hbEZvcm1Gcm9tVHlwZSB9IGZyb20gJy4vdHlwZXMvZm9ybS10eXBlJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWVwRm9ybVNpZ25hbDxUID0gYW55PihcclxuICAgZm9ybTogU2lnbmFsPE9wdGlvbmFsRm9ybUZyb21UeXBlPFQ+PiB8IE9wdGlvbmFsRm9ybUZyb21UeXBlPFQ+LFxyXG4gICBvcHRpb25zOiBEZWVwRm9ybVNpZ25hbE9wdGlvbnM8VD4gPSBidWlsZERlZmF1bHRGb3JtU2lnbmFsT3B0aW9uczxUPigpXHJcbik6IERlZXBGb3JtU2lnbmFsPFQ+IHtcclxuICAgY29uc3Qgcm9vdDogRGVlcEZvcm1TaWduYWw8VD4gPSBmb3JtU2lnbmFsPFQ+KFxyXG4gICAgICBmb3JtLFxyXG4gICAgICBvcHRpb25zXHJcbiAgICkgYXMgRGVlcEZvcm1TaWduYWw8VD47XHJcblxyXG4gICBjb25zdCBmb3JtVmFsID0gaXNTaWduYWwoZm9ybSkgPyBmb3JtKCkgOiBmb3JtO1xyXG4gICBpZiAoZm9ybVZhbCAmJiAhKGZvcm1WYWwgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkpIHtcclxuICAgICAgbGV0IGNoaWxkcmVuOiBEZWVwRm9ybVNpZ25hbDxUPlsnY2hpbGRyZW4nXSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgaWYgKGZvcm1WYWwgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcclxuICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICBjaGlsZHJlbiA9IGZvcm1WYWwuY29udHJvbHMubWFwKChjKSA9PiBkZWVwRm9ybVNpZ25hbChjLCBvcHRpb25zKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZm9ybVZhbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xyXG4gICAgICAgICBjb25zdCBjb250cm9scyA9IGZvcm1WYWwuY29udHJvbHM7XHJcbiAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb250cm9scyk7XHJcbiAgICAgICAgIGNoaWxkcmVuID0ga2V5cy5yZWR1Y2UoXHJcbiAgICAgICAgICAgIChhY2MsIGNLZXkpID0+IHtcclxuICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICBhY2NbY0tleV0gPSBkZWVwRm9ybVNpZ25hbChjb250cm9sc1tjS2V5XSwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHt9IGFzIERlZXBGb3JtU2lnbmFsPFQ+WydjaGlsZHJlbiddXHJcbiAgICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJvb3QuY2hpbGRyZW4gPSBjaGlsZHJlbjtcclxuICAgfVxyXG5cclxuICAgcmV0dXJuIHJvb3Q7XHJcbn1cclxuIl19
@@ -0,0 +1,44 @@
1
+ import { assertInInjectionContext, isSignal, signal, } from '@angular/core';
2
+ import { buildFormDirtySignal } from './helpers/form-dirty-signal';
3
+ import { buildFormErrorSignal } from './helpers/form-error-signal';
4
+ import { buildFormSnapshotSignal } from './helpers/form-snapshot-signal';
5
+ import { buildFormStatusSignal } from './helpers/form-status-signal';
6
+ import { buildFormTouchedSignal } from './helpers/form-touched-signal';
7
+ import { buildFormValueSignal } from './helpers/form-value-signal';
8
+ import { buildDefaultFormSignalOptions, } from './types/form-signal-options';
9
+ export function formSignal(form, options = buildDefaultFormSignalOptions()) {
10
+ const formAsSignal = isSignal(form) ? form : signal(form);
11
+ if (!options.injector) {
12
+ assertInInjectionContext(() => { });
13
+ }
14
+ const { value$, rawValue$, valueChangeSubscription$ } = buildFormValueSignal(formAsSignal, options);
15
+ const { status$, valid$, invalid$, pending$, disabled$, enabled$, statusChangeSubscription$, } = buildFormStatusSignal(formAsSignal, options);
16
+ const { touched$, untouched$, touchedChangeSubscription$ } = buildFormTouchedSignal(formAsSignal, options);
17
+ const { dirty$, pristine$, dirtyChangeSubscription$ } = buildFormDirtySignal(formAsSignal, options);
18
+ const errors$ = buildFormErrorSignal(formAsSignal, value$, status$, options);
19
+ const formSignals = {
20
+ status: status$.asReadonly(),
21
+ value: value$.asReadonly(),
22
+ rawValue: rawValue$.asReadonly(),
23
+ touched: touched$.asReadonly(),
24
+ untouched: untouched$,
25
+ dirty: dirty$.asReadonly(),
26
+ pristine: pristine$,
27
+ valid: valid$,
28
+ invalid: invalid$,
29
+ pending: pending$,
30
+ disabled: disabled$,
31
+ enabled: enabled$,
32
+ errors: errors$,
33
+ subscriptions: {
34
+ valueChangeSubscription: valueChangeSubscription$.asReadonly(),
35
+ statusChangeSubscription: statusChangeSubscription$.asReadonly(),
36
+ touchedChangeSubscription: touchedChangeSubscription$.asReadonly(),
37
+ dirtyChangeSubscription: dirtyChangeSubscription$.asReadonly(),
38
+ },
39
+ };
40
+ const snapshot$ = buildFormSnapshotSignal(formSignals);
41
+ Object.setPrototypeOf(snapshot$, formSignals);
42
+ return snapshot$;
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybS1zaWduYWwvc3JjL2xpYi9mb3JtLXNpZ25hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0osd0JBQXdCLEVBQ3hCLFFBQVEsRUFFUixNQUFNLEdBQ1IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUNKLDZCQUE2QixHQUUvQixNQUFNLDZCQUE2QixDQUFDO0FBSXJDLE1BQU0sVUFBVSxVQUFVLENBQ3ZCLElBQStELEVBQy9ELFVBQWdDLDZCQUE2QixFQUFLO0lBRWxFLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyQix3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsd0JBQXdCLEVBQUUsR0FDbEQsb0JBQW9CLENBQUksWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELE1BQU0sRUFDSCxPQUFPLEVBQ1AsTUFBTSxFQUNOLFFBQVEsRUFDUixRQUFRLEVBQ1IsU0FBUyxFQUNULFFBQVEsRUFDUix5QkFBeUIsR0FDM0IsR0FBRyxxQkFBcUIsQ0FBSSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEQsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsMEJBQTBCLEVBQUUsR0FDdkQsc0JBQXNCLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixFQUFFLEdBQUcsb0JBQW9CLENBQ3pFLFlBQVksRUFDWixPQUFPLENBQ1QsQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTdFLE1BQU0sV0FBVyxHQUF1QjtRQUNyQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRTtRQUM1QixLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUMxQixRQUFRLEVBQUUsU0FBUyxDQUFDLFVBQVUsRUFBRTtRQUNoQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRTtRQUM5QixTQUFTLEVBQUUsVUFBVTtRQUNyQixLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUMxQixRQUFRLEVBQUUsU0FBUztRQUNuQixLQUFLLEVBQUUsTUFBTTtRQUNiLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLFFBQVEsRUFBRSxTQUFTO1FBQ25CLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLE1BQU0sRUFBRSxPQUFPO1FBQ2YsYUFBYSxFQUFFO1lBQ1osdUJBQXVCLEVBQUUsd0JBQXdCLENBQUMsVUFBVSxFQUFFO1lBQzlELHdCQUF3QixFQUFFLHlCQUF5QixDQUFDLFVBQVUsRUFBRTtZQUNoRSx5QkFBeUIsRUFBRSwwQkFBMEIsQ0FBQyxVQUFVLEVBQUU7WUFDbEUsdUJBQXVCLEVBQUUsd0JBQXdCLENBQUMsVUFBVSxFQUFFO1NBQ2hFO0tBQ0gsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLHVCQUF1QixDQUFDLFdBQVcsQ0FBa0IsQ0FBQztJQUV4RSxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUU5QyxPQUFPLFNBQVMsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgYXNzZXJ0SW5JbmplY3Rpb25Db250ZXh0LFxyXG4gICBpc1NpZ25hbCxcclxuICAgU2lnbmFsLFxyXG4gICBzaWduYWwsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGJ1aWxkRm9ybURpcnR5U2lnbmFsIH0gZnJvbSAnLi9oZWxwZXJzL2Zvcm0tZGlydHktc2lnbmFsJztcclxuaW1wb3J0IHsgYnVpbGRGb3JtRXJyb3JTaWduYWwgfSBmcm9tICcuL2hlbHBlcnMvZm9ybS1lcnJvci1zaWduYWwnO1xyXG5pbXBvcnQgeyBidWlsZEZvcm1TbmFwc2hvdFNpZ25hbCB9IGZyb20gJy4vaGVscGVycy9mb3JtLXNuYXBzaG90LXNpZ25hbCc7XHJcbmltcG9ydCB7IGJ1aWxkRm9ybVN0YXR1c1NpZ25hbCB9IGZyb20gJy4vaGVscGVycy9mb3JtLXN0YXR1cy1zaWduYWwnO1xyXG5pbXBvcnQgeyBidWlsZEZvcm1Ub3VjaGVkU2lnbmFsIH0gZnJvbSAnLi9oZWxwZXJzL2Zvcm0tdG91Y2hlZC1zaWduYWwnO1xyXG5pbXBvcnQgeyBidWlsZEZvcm1WYWx1ZVNpZ25hbCB9IGZyb20gJy4vaGVscGVycy9mb3JtLXZhbHVlLXNpZ25hbCc7XHJcbmltcG9ydCB7XHJcbiAgIGJ1aWxkRGVmYXVsdEZvcm1TaWduYWxPcHRpb25zLFxyXG4gICBGb3JtU2lnbmFsT3B0aW9ucyxcclxufSBmcm9tICcuL3R5cGVzL2Zvcm0tc2lnbmFsLW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBGb3JtU2lnbmFsLCBGb3JtU2lnbmFsU3RhdGUgfSBmcm9tICcuL3R5cGVzL2Zvcm0tc2lnbmFsLXR5cGUnO1xyXG5pbXBvcnQgeyBPcHRpb25hbEZvcm1Gcm9tVHlwZSB9IGZyb20gJy4vdHlwZXMvZm9ybS10eXBlJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmb3JtU2lnbmFsPFQgPSBhbnk+KFxyXG4gICBmb3JtOiBTaWduYWw8T3B0aW9uYWxGb3JtRnJvbVR5cGU8VD4+IHwgT3B0aW9uYWxGb3JtRnJvbVR5cGU8VD4sXHJcbiAgIG9wdGlvbnM6IEZvcm1TaWduYWxPcHRpb25zPFQ+ID0gYnVpbGREZWZhdWx0Rm9ybVNpZ25hbE9wdGlvbnM8VD4oKVxyXG4pOiBGb3JtU2lnbmFsPFQ+IHtcclxuICAgY29uc3QgZm9ybUFzU2lnbmFsID0gaXNTaWduYWwoZm9ybSkgPyBmb3JtIDogc2lnbmFsKGZvcm0pO1xyXG4gICBpZiAoIW9wdGlvbnMuaW5qZWN0b3IpIHtcclxuICAgICAgYXNzZXJ0SW5JbmplY3Rpb25Db250ZXh0KCgpID0+IHt9KTtcclxuICAgfVxyXG4gICBjb25zdCB7IHZhbHVlJCwgcmF3VmFsdWUkLCB2YWx1ZUNoYW5nZVN1YnNjcmlwdGlvbiQgfSA9XHJcbiAgICAgIGJ1aWxkRm9ybVZhbHVlU2lnbmFsPFQ+KGZvcm1Bc1NpZ25hbCwgb3B0aW9ucyk7XHJcbiAgIGNvbnN0IHtcclxuICAgICAgc3RhdHVzJCxcclxuICAgICAgdmFsaWQkLFxyXG4gICAgICBpbnZhbGlkJCxcclxuICAgICAgcGVuZGluZyQsXHJcbiAgICAgIGRpc2FibGVkJCxcclxuICAgICAgZW5hYmxlZCQsXHJcbiAgICAgIHN0YXR1c0NoYW5nZVN1YnNjcmlwdGlvbiQsXHJcbiAgIH0gPSBidWlsZEZvcm1TdGF0dXNTaWduYWw8VD4oZm9ybUFzU2lnbmFsLCBvcHRpb25zKTtcclxuICAgY29uc3QgeyB0b3VjaGVkJCwgdW50b3VjaGVkJCwgdG91Y2hlZENoYW5nZVN1YnNjcmlwdGlvbiQgfSA9XHJcbiAgICAgIGJ1aWxkRm9ybVRvdWNoZWRTaWduYWwoZm9ybUFzU2lnbmFsLCBvcHRpb25zKTtcclxuICAgY29uc3QgeyBkaXJ0eSQsIHByaXN0aW5lJCwgZGlydHlDaGFuZ2VTdWJzY3JpcHRpb24kIH0gPSBidWlsZEZvcm1EaXJ0eVNpZ25hbChcclxuICAgICAgZm9ybUFzU2lnbmFsLFxyXG4gICAgICBvcHRpb25zXHJcbiAgICk7XHJcbiAgIGNvbnN0IGVycm9ycyQgPSBidWlsZEZvcm1FcnJvclNpZ25hbChmb3JtQXNTaWduYWwsIHZhbHVlJCwgc3RhdHVzJCwgb3B0aW9ucyk7XHJcblxyXG4gICBjb25zdCBmb3JtU2lnbmFsczogRm9ybVNpZ25hbFN0YXRlPFQ+ID0ge1xyXG4gICAgICBzdGF0dXM6IHN0YXR1cyQuYXNSZWFkb25seSgpLFxyXG4gICAgICB2YWx1ZTogdmFsdWUkLmFzUmVhZG9ubHkoKSxcclxuICAgICAgcmF3VmFsdWU6IHJhd1ZhbHVlJC5hc1JlYWRvbmx5KCksXHJcbiAgICAgIHRvdWNoZWQ6IHRvdWNoZWQkLmFzUmVhZG9ubHkoKSxcclxuICAgICAgdW50b3VjaGVkOiB1bnRvdWNoZWQkLFxyXG4gICAgICBkaXJ0eTogZGlydHkkLmFzUmVhZG9ubHkoKSxcclxuICAgICAgcHJpc3RpbmU6IHByaXN0aW5lJCxcclxuICAgICAgdmFsaWQ6IHZhbGlkJCxcclxuICAgICAgaW52YWxpZDogaW52YWxpZCQsXHJcbiAgICAgIHBlbmRpbmc6IHBlbmRpbmckLFxyXG4gICAgICBkaXNhYmxlZDogZGlzYWJsZWQkLFxyXG4gICAgICBlbmFibGVkOiBlbmFibGVkJCxcclxuICAgICAgZXJyb3JzOiBlcnJvcnMkLFxyXG4gICAgICBzdWJzY3JpcHRpb25zOiB7XHJcbiAgICAgICAgIHZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uOiB2YWx1ZUNoYW5nZVN1YnNjcmlwdGlvbiQuYXNSZWFkb25seSgpLFxyXG4gICAgICAgICBzdGF0dXNDaGFuZ2VTdWJzY3JpcHRpb246IHN0YXR1c0NoYW5nZVN1YnNjcmlwdGlvbiQuYXNSZWFkb25seSgpLFxyXG4gICAgICAgICB0b3VjaGVkQ2hhbmdlU3Vic2NyaXB0aW9uOiB0b3VjaGVkQ2hhbmdlU3Vic2NyaXB0aW9uJC5hc1JlYWRvbmx5KCksXHJcbiAgICAgICAgIGRpcnR5Q2hhbmdlU3Vic2NyaXB0aW9uOiBkaXJ0eUNoYW5nZVN1YnNjcmlwdGlvbiQuYXNSZWFkb25seSgpLFxyXG4gICAgICB9LFxyXG4gICB9O1xyXG5cclxuICAgY29uc3Qgc25hcHNob3QkID0gYnVpbGRGb3JtU25hcHNob3RTaWduYWwoZm9ybVNpZ25hbHMpIGFzIEZvcm1TaWduYWw8VD47XHJcblxyXG4gICBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc25hcHNob3QkLCBmb3JtU2lnbmFscyk7XHJcblxyXG4gICByZXR1cm4gc25hcHNob3QkO1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,30 @@
1
+ import { computed, effect, signal, untracked } from '@angular/core';
2
+ import { PristineChangeEvent } from '@angular/forms';
3
+ import { filter } from 'rxjs';
4
+ export function buildFormDirtySignal(formAsSignal, options) {
5
+ const dirty$ = signal(!!formAsSignal()?.dirty, {
6
+ equal: options.equalityFns?.dirtyEquality,
7
+ });
8
+ const dirtyChangeSubscription$ = signal(null);
9
+ const formDirtyChangeEffect = effect((onCleanup) => {
10
+ const form = formAsSignal();
11
+ untracked(() => {
12
+ const setDirty = () => {
13
+ untracked(() => {
14
+ dirty$.set(!!form?.dirty);
15
+ });
16
+ };
17
+ dirtyChangeSubscription$()?.unsubscribe();
18
+ dirtyChangeSubscription$.set(form?.events
19
+ .pipe(filter((e) => e instanceof PristineChangeEvent))
20
+ .subscribe((e) => {
21
+ setDirty();
22
+ }) ?? null);
23
+ setDirty();
24
+ });
25
+ onCleanup(() => untracked(() => dirtyChangeSubscription$())?.unsubscribe());
26
+ }, { injector: options.injector });
27
+ const pristine$ = computed(() => !dirty$());
28
+ return { dirty$, pristine$, dirtyChangeSubscription$ };
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1kaXJ0eS1zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybS1zaWduYWwvc3JjL2xpYi9oZWxwZXJzL2Zvcm0tZGlydHktc2lnbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFJNUMsTUFBTSxVQUFVLG9CQUFvQixDQUNqQyxZQUErQyxFQUMvQyxPQUEwQjtJQUUxQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQVUsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRTtRQUNyRCxLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxhQUFhO0tBQzNDLENBQUMsQ0FBQztJQUNILE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUVuRSxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FDakMsQ0FBQyxTQUFtQixFQUFFLEVBQUU7UUFDckIsTUFBTSxJQUFJLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFDNUIsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNaLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRTtnQkFDbkIsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDWixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxDQUFDO1lBQ04sQ0FBQyxDQUFDO1lBRUYsd0JBQXdCLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUMxQyx3QkFBd0IsQ0FBQyxHQUFHLENBQ3pCLElBQUksRUFBRSxNQUFNO2lCQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxtQkFBbUIsQ0FBQyxDQUFDO2lCQUNyRCxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDZCxRQUFRLEVBQUUsQ0FBQztZQUNkLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FDZixDQUFDO1lBQ0YsUUFBUSxFQUFFLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FDTixHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUNsRSxDQUFDO0lBQ0wsQ0FBQyxFQUNELEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FDaEMsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFNUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQztBQUMxRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQsIGVmZmVjdCwgU2lnbmFsLCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQcmlzdGluZUNoYW5nZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGb3JtU2lnbmFsT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzL2Zvcm0tc2lnbmFsLW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBPcHRpb25hbEZvcm1Gcm9tVHlwZSB9IGZyb20gJy4uL3R5cGVzL2Zvcm0tdHlwZSc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGb3JtRGlydHlTaWduYWwoXHJcbiAgIGZvcm1Bc1NpZ25hbDogU2lnbmFsPE9wdGlvbmFsRm9ybUZyb21UeXBlPGFueT4+LFxyXG4gICBvcHRpb25zOiBGb3JtU2lnbmFsT3B0aW9uc1xyXG4pIHtcclxuICAgY29uc3QgZGlydHkkID0gc2lnbmFsPGJvb2xlYW4+KCEhZm9ybUFzU2lnbmFsKCk/LmRpcnR5LCB7XHJcbiAgICAgIGVxdWFsOiBvcHRpb25zLmVxdWFsaXR5Rm5zPy5kaXJ0eUVxdWFsaXR5LFxyXG4gICB9KTtcclxuICAgY29uc3QgZGlydHlDaGFuZ2VTdWJzY3JpcHRpb24kID0gc2lnbmFsPFN1YnNjcmlwdGlvbiB8IG51bGw+KG51bGwpO1xyXG5cclxuICAgY29uc3QgZm9ybURpcnR5Q2hhbmdlRWZmZWN0ID0gZWZmZWN0KFxyXG4gICAgICAob25DbGVhbnVwOiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICAgICBjb25zdCBmb3JtID0gZm9ybUFzU2lnbmFsKCk7XHJcbiAgICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldERpcnR5ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBkaXJ0eSQuc2V0KCEhZm9ybT8uZGlydHkpO1xyXG4gICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGRpcnR5Q2hhbmdlU3Vic2NyaXB0aW9uJCgpPy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICBkaXJ0eUNoYW5nZVN1YnNjcmlwdGlvbiQuc2V0KFxyXG4gICAgICAgICAgICAgICBmb3JtPy5ldmVudHNcclxuICAgICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKChlKSA9PiBlIGluc3RhbmNlb2YgUHJpc3RpbmVDaGFuZ2VFdmVudCkpXHJcbiAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgc2V0RGlydHkoKTtcclxuICAgICAgICAgICAgICAgICAgfSkgPz8gbnVsbFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBzZXREaXJ0eSgpO1xyXG4gICAgICAgICB9KTtcclxuICAgICAgICAgb25DbGVhbnVwKFxyXG4gICAgICAgICAgICAoKSA9PiB1bnRyYWNrZWQoKCkgPT4gZGlydHlDaGFuZ2VTdWJzY3JpcHRpb24kKCkpPy51bnN1YnNjcmliZSgpXHJcbiAgICAgICAgICk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHsgaW5qZWN0b3I6IG9wdGlvbnMuaW5qZWN0b3IgfVxyXG4gICApO1xyXG5cclxuICAgY29uc3QgcHJpc3RpbmUkID0gY29tcHV0ZWQoKCkgPT4gIWRpcnR5JCgpKTtcclxuXHJcbiAgIHJldHVybiB7IGRpcnR5JCwgcHJpc3RpbmUkLCBkaXJ0eUNoYW5nZVN1YnNjcmlwdGlvbiQgfTtcclxufVxyXG4iXX0=
@@ -0,0 +1,10 @@
1
+ import { computed, isSignal, signal, } from '@angular/core';
2
+ export function buildFormErrorSignal(form, valueSignal, statusSignal, options) {
3
+ const formAsSignal = isSignal(form) ? form : signal(form);
4
+ return computed(() => {
5
+ const v = valueSignal();
6
+ const s = statusSignal();
7
+ return formAsSignal()?.errors ?? null;
8
+ }, { equal: options.equalityFns?.errorsEquality });
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lcnJvci1zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybS1zaWduYWwvc3JjL2xpYi9oZWxwZXJzL2Zvcm0tZXJyb3Itc2lnbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSixRQUFRLEVBQ1IsUUFBUSxFQUNSLE1BQU0sR0FDUixNQUFNLGVBQWUsQ0FBQztBQUt2QixNQUFNLFVBQVUsb0JBQW9CLENBQ2pDLElBQStELEVBQy9ELFdBQTRELEVBQzVELFlBQXNELEVBQ3RELE9BQTZCO0lBRTdCLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFMUQsT0FBTyxRQUFRLENBQ1osR0FBRyxFQUFFO1FBQ0YsTUFBTSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFDekIsT0FBTyxZQUFZLEVBQUUsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDO0lBQ3pDLENBQUMsRUFDRCxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLGNBQWMsRUFBRSxDQUNoRCxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgIFNpZ25hbCxcclxuICAgV3JpdGFibGVTaWduYWwsXHJcbiAgIGNvbXB1dGVkLFxyXG4gICBpc1NpZ25hbCxcclxuICAgc2lnbmFsLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbFN0YXR1cyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRm9ybVNpZ25hbE9wdGlvbnMgfSBmcm9tICcuLi90eXBlcy9mb3JtLXNpZ25hbC1vcHRpb25zJztcclxuaW1wb3J0IHsgRm9ybUZyb21UeXBlLCBPcHRpb25hbEZvcm1Gcm9tVHlwZSB9IGZyb20gJy4uL3R5cGVzL2Zvcm0tdHlwZSc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGb3JtRXJyb3JTaWduYWw8VCA9IGFueT4oXHJcbiAgIGZvcm06IFNpZ25hbDxPcHRpb25hbEZvcm1Gcm9tVHlwZTxUPj4gfCBPcHRpb25hbEZvcm1Gcm9tVHlwZTxUPixcclxuICAgdmFsdWVTaWduYWw6IFdyaXRhYmxlU2lnbmFsPEZvcm1Gcm9tVHlwZTxUPlsndmFsdWUnXSB8IG51bGw+LFxyXG4gICBzdGF0dXNTaWduYWw6IFdyaXRhYmxlU2lnbmFsPEZvcm1Db250cm9sU3RhdHVzIHwgbnVsbD4sXHJcbiAgIG9wdGlvbnM6IEZvcm1TaWduYWxPcHRpb25zPFQ+XHJcbikge1xyXG4gICBjb25zdCBmb3JtQXNTaWduYWwgPSBpc1NpZ25hbChmb3JtKSA/IGZvcm0gOiBzaWduYWwoZm9ybSk7XHJcblxyXG4gICByZXR1cm4gY29tcHV0ZWQoXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICAgY29uc3QgdiA9IHZhbHVlU2lnbmFsKCk7XHJcbiAgICAgICAgIGNvbnN0IHMgPSBzdGF0dXNTaWduYWwoKTtcclxuICAgICAgICAgcmV0dXJuIGZvcm1Bc1NpZ25hbCgpPy5lcnJvcnMgPz8gbnVsbDtcclxuICAgICAgfSxcclxuICAgICAgeyBlcXVhbDogb3B0aW9ucy5lcXVhbGl0eUZucz8uZXJyb3JzRXF1YWxpdHkgfVxyXG4gICApO1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,27 @@
1
+ import { computed } from '@angular/core';
2
+ export function buildFormSnapshotSignal(formSignalState) {
3
+ return computed(() => {
4
+ return {
5
+ status: formSignalState.status(),
6
+ value: formSignalState.value(),
7
+ rawValue: formSignalState.rawValue(),
8
+ touched: formSignalState.touched(),
9
+ untouched: formSignalState.untouched(),
10
+ dirty: formSignalState.dirty(),
11
+ pristine: formSignalState.pristine(),
12
+ valid: formSignalState.valid(),
13
+ invalid: formSignalState.invalid(),
14
+ pending: formSignalState.pending(),
15
+ disabled: formSignalState.disabled(),
16
+ enabled: formSignalState.enabled(),
17
+ errors: formSignalState.errors(),
18
+ subscriptions: {
19
+ valueChangeSubscription: formSignalState.subscriptions.valueChangeSubscription(),
20
+ statusChangeSubscription: formSignalState.subscriptions.statusChangeSubscription(),
21
+ touchedChangeSubscription: formSignalState.subscriptions.touchedChangeSubscription(),
22
+ dirtyChangeSubscription: formSignalState.subscriptions.dirtyChangeSubscription(),
23
+ },
24
+ };
25
+ });
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zbmFwc2hvdC1zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybS1zaWduYWwvc3JjL2xpYi9oZWxwZXJzL2Zvcm0tc25hcHNob3Qtc2lnbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFNekMsTUFBTSxVQUFVLHVCQUF1QixDQUNwQyxlQUFtQztJQUVuQyxPQUFPLFFBQVEsQ0FBNkIsR0FBRyxFQUFFO1FBQzlDLE9BQU87WUFDSixNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRTtZQUNoQyxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUssRUFBRTtZQUM5QixRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRTtZQUNwQyxPQUFPLEVBQUUsZUFBZSxDQUFDLE9BQU8sRUFBRTtZQUNsQyxTQUFTLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRTtZQUN0QyxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUssRUFBRTtZQUM5QixRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRTtZQUNwQyxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUssRUFBRTtZQUM5QixPQUFPLEVBQUUsZUFBZSxDQUFDLE9BQU8sRUFBRTtZQUNsQyxPQUFPLEVBQUUsZUFBZSxDQUFDLE9BQU8sRUFBRTtZQUNsQyxRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRTtZQUNwQyxPQUFPLEVBQUUsZUFBZSxDQUFDLE9BQU8sRUFBRTtZQUNsQyxNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRTtZQUNoQyxhQUFhLEVBQUU7Z0JBQ1osdUJBQXVCLEVBQ3BCLGVBQWUsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLEVBQUU7Z0JBQzFELHdCQUF3QixFQUNyQixlQUFlLENBQUMsYUFBYSxDQUFDLHdCQUF3QixFQUFFO2dCQUMzRCx5QkFBeUIsRUFDdEIsZUFBZSxDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsRUFBRTtnQkFDNUQsdUJBQXVCLEVBQ3BCLGVBQWUsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLEVBQUU7YUFDNUQ7U0FDSCxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICAgRm9ybVNpZ25hbFN0YXRlLFxyXG4gICBGb3JtU25hcHNob3RTaWduYWxTdGF0ZSxcclxufSBmcm9tICcuLi90eXBlcy9mb3JtLXNpZ25hbC10eXBlJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZvcm1TbmFwc2hvdFNpZ25hbDxUID0gYW55PihcclxuICAgZm9ybVNpZ25hbFN0YXRlOiBGb3JtU2lnbmFsU3RhdGU8VD5cclxuKSB7XHJcbiAgIHJldHVybiBjb21wdXRlZDxGb3JtU25hcHNob3RTaWduYWxTdGF0ZTxUPj4oKCkgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgICBzdGF0dXM6IGZvcm1TaWduYWxTdGF0ZS5zdGF0dXMoKSxcclxuICAgICAgICAgdmFsdWU6IGZvcm1TaWduYWxTdGF0ZS52YWx1ZSgpLFxyXG4gICAgICAgICByYXdWYWx1ZTogZm9ybVNpZ25hbFN0YXRlLnJhd1ZhbHVlKCksXHJcbiAgICAgICAgIHRvdWNoZWQ6IGZvcm1TaWduYWxTdGF0ZS50b3VjaGVkKCksXHJcbiAgICAgICAgIHVudG91Y2hlZDogZm9ybVNpZ25hbFN0YXRlLnVudG91Y2hlZCgpLFxyXG4gICAgICAgICBkaXJ0eTogZm9ybVNpZ25hbFN0YXRlLmRpcnR5KCksXHJcbiAgICAgICAgIHByaXN0aW5lOiBmb3JtU2lnbmFsU3RhdGUucHJpc3RpbmUoKSxcclxuICAgICAgICAgdmFsaWQ6IGZvcm1TaWduYWxTdGF0ZS52YWxpZCgpLFxyXG4gICAgICAgICBpbnZhbGlkOiBmb3JtU2lnbmFsU3RhdGUuaW52YWxpZCgpLFxyXG4gICAgICAgICBwZW5kaW5nOiBmb3JtU2lnbmFsU3RhdGUucGVuZGluZygpLFxyXG4gICAgICAgICBkaXNhYmxlZDogZm9ybVNpZ25hbFN0YXRlLmRpc2FibGVkKCksXHJcbiAgICAgICAgIGVuYWJsZWQ6IGZvcm1TaWduYWxTdGF0ZS5lbmFibGVkKCksXHJcbiAgICAgICAgIGVycm9yczogZm9ybVNpZ25hbFN0YXRlLmVycm9ycygpLFxyXG4gICAgICAgICBzdWJzY3JpcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uOlxyXG4gICAgICAgICAgICAgICBmb3JtU2lnbmFsU3RhdGUuc3Vic2NyaXB0aW9ucy52YWx1ZUNoYW5nZVN1YnNjcmlwdGlvbigpLFxyXG4gICAgICAgICAgICBzdGF0dXNDaGFuZ2VTdWJzY3JpcHRpb246XHJcbiAgICAgICAgICAgICAgIGZvcm1TaWduYWxTdGF0ZS5zdWJzY3JpcHRpb25zLnN0YXR1c0NoYW5nZVN1YnNjcmlwdGlvbigpLFxyXG4gICAgICAgICAgICB0b3VjaGVkQ2hhbmdlU3Vic2NyaXB0aW9uOlxyXG4gICAgICAgICAgICAgICBmb3JtU2lnbmFsU3RhdGUuc3Vic2NyaXB0aW9ucy50b3VjaGVkQ2hhbmdlU3Vic2NyaXB0aW9uKCksXHJcbiAgICAgICAgICAgIGRpcnR5Q2hhbmdlU3Vic2NyaXB0aW9uOlxyXG4gICAgICAgICAgICAgICBmb3JtU2lnbmFsU3RhdGUuc3Vic2NyaXB0aW9ucy5kaXJ0eUNoYW5nZVN1YnNjcmlwdGlvbigpLFxyXG4gICAgICAgICB9LFxyXG4gICAgICB9O1xyXG4gICB9KTtcclxufVxyXG4iXX0=
@@ -0,0 +1,37 @@
1
+ import { computed, effect, signal, untracked } from '@angular/core';
2
+ export function buildFormStatusSignal(formAsSignal, options) {
3
+ const equal = options.equalityFns?.statusEquality ?? (() => false);
4
+ const status$ = signal(formAsSignal()?.status ?? null, { equal });
5
+ const statusChangeSubscription$ = signal(null);
6
+ const formStatusChangeEffect = effect((onCleanup) => {
7
+ const form = formAsSignal();
8
+ untracked(() => {
9
+ const setStatus = () => {
10
+ untracked(() => {
11
+ status$.set(form?.status ?? null);
12
+ });
13
+ };
14
+ statusChangeSubscription$()?.unsubscribe();
15
+ statusChangeSubscription$.set(form?.statusChanges.subscribe(() => {
16
+ setStatus();
17
+ }) ?? null);
18
+ setStatus();
19
+ });
20
+ onCleanup(() => untracked(() => statusChangeSubscription$())?.unsubscribe());
21
+ }, { injector: options.injector });
22
+ const valid$ = computed(() => status$() === 'VALID');
23
+ const invalid$ = computed(() => status$() === 'INVALID');
24
+ const pending$ = computed(() => status$() == 'PENDING');
25
+ const disabled$ = computed(() => status$() === 'DISABLED');
26
+ const enabled$ = computed(() => status$() !== 'DISABLED');
27
+ return {
28
+ status$,
29
+ valid$,
30
+ invalid$,
31
+ pending$,
32
+ disabled$,
33
+ enabled$,
34
+ statusChangeSubscription$,
35
+ };
36
+ }
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zdGF0dXMtc2lnbmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWZvcm0tc2lnbmFsL3NyYy9saWIvaGVscGVycy9mb3JtLXN0YXR1cy1zaWduYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU01RSxNQUFNLFVBQVUscUJBQXFCLENBQ2xDLFlBQTZDLEVBQzdDLE9BQTZCO0lBRTdCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsY0FBYyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUNuQixZQUFZLEVBQUUsRUFBRSxNQUFNLElBQUksSUFBSSxFQUM5QixFQUFFLEtBQUssRUFBRSxDQUNYLENBQUM7SUFDRixNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBc0IsSUFBSSxDQUFDLENBQUM7SUFDcEUsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLENBQ2xDLENBQUMsU0FBbUIsRUFBRSxFQUFFO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWixNQUFNLFNBQVMsR0FBRyxHQUFHLEVBQUU7Z0JBQ3BCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxDQUFDLENBQUMsQ0FBQztZQUNOLENBQUMsQ0FBQztZQUVGLHlCQUF5QixFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUM7WUFDM0MseUJBQXlCLENBQUMsR0FBRyxDQUMxQixJQUFJLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2hDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUNaLENBQUM7WUFDRixTQUFTLEVBQUUsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUNOLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQ25FLENBQUM7SUFDTCxDQUFDLEVBQ0QsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUNoQyxDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQztJQUN6RCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksU0FBUyxDQUFDLENBQUM7SUFDeEQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLFVBQVUsQ0FBQyxDQUFDO0lBQzNELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxVQUFVLENBQUMsQ0FBQztJQUUxRCxPQUFPO1FBQ0osT0FBTztRQUNQLE1BQU07UUFDTixRQUFRO1FBQ1IsUUFBUTtRQUNSLFNBQVM7UUFDVCxRQUFRO1FBQ1IseUJBQXlCO0tBQzNCLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQsIGVmZmVjdCwgU2lnbmFsLCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbFN0YXR1cyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEZvcm1TaWduYWxPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvZm9ybS1zaWduYWwtb3B0aW9ucyc7XHJcbmltcG9ydCB7IE9wdGlvbmFsRm9ybUZyb21UeXBlIH0gZnJvbSAnLi4vdHlwZXMvZm9ybS10eXBlJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZvcm1TdGF0dXNTaWduYWw8VCA9IGFueT4oXHJcbiAgIGZvcm1Bc1NpZ25hbDogU2lnbmFsPE9wdGlvbmFsRm9ybUZyb21UeXBlPFQ+PixcclxuICAgb3B0aW9uczogRm9ybVNpZ25hbE9wdGlvbnM8VD5cclxuKSB7XHJcbiAgIGNvbnN0IGVxdWFsID0gb3B0aW9ucy5lcXVhbGl0eUZucz8uc3RhdHVzRXF1YWxpdHkgPz8gKCgpID0+IGZhbHNlKTtcclxuICAgY29uc3Qgc3RhdHVzJCA9IHNpZ25hbDxGb3JtQ29udHJvbFN0YXR1cyB8IG51bGw+KFxyXG4gICAgICBmb3JtQXNTaWduYWwoKT8uc3RhdHVzID8/IG51bGwsXHJcbiAgICAgIHsgZXF1YWwgfVxyXG4gICApO1xyXG4gICBjb25zdCBzdGF0dXNDaGFuZ2VTdWJzY3JpcHRpb24kID0gc2lnbmFsPFN1YnNjcmlwdGlvbiB8IG51bGw+KG51bGwpO1xyXG4gICBjb25zdCBmb3JtU3RhdHVzQ2hhbmdlRWZmZWN0ID0gZWZmZWN0KFxyXG4gICAgICAob25DbGVhbnVwOiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICAgICBjb25zdCBmb3JtID0gZm9ybUFzU2lnbmFsKCk7XHJcbiAgICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldFN0YXR1cyA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgdW50cmFja2VkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgc3RhdHVzJC5zZXQoZm9ybT8uc3RhdHVzID8/IG51bGwpO1xyXG4gICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHN0YXR1c0NoYW5nZVN1YnNjcmlwdGlvbiQoKT8udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgc3RhdHVzQ2hhbmdlU3Vic2NyaXB0aW9uJC5zZXQoXHJcbiAgICAgICAgICAgICAgIGZvcm0/LnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgc2V0U3RhdHVzKCk7XHJcbiAgICAgICAgICAgICAgIH0pID8/IG51bGxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgc2V0U3RhdHVzKCk7XHJcbiAgICAgICAgIH0pO1xyXG4gICAgICAgICBvbkNsZWFudXAoXHJcbiAgICAgICAgICAgICgpID0+IHVudHJhY2tlZCgoKSA9PiBzdGF0dXNDaGFuZ2VTdWJzY3JpcHRpb24kKCkpPy51bnN1YnNjcmliZSgpXHJcbiAgICAgICAgICk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHsgaW5qZWN0b3I6IG9wdGlvbnMuaW5qZWN0b3IgfVxyXG4gICApO1xyXG5cclxuICAgY29uc3QgdmFsaWQkID0gY29tcHV0ZWQoKCkgPT4gc3RhdHVzJCgpID09PSAnVkFMSUQnKTtcclxuICAgY29uc3QgaW52YWxpZCQgPSBjb21wdXRlZCgoKSA9PiBzdGF0dXMkKCkgPT09ICdJTlZBTElEJyk7XHJcbiAgIGNvbnN0IHBlbmRpbmckID0gY29tcHV0ZWQoKCkgPT4gc3RhdHVzJCgpID09ICdQRU5ESU5HJyk7XHJcbiAgIGNvbnN0IGRpc2FibGVkJCA9IGNvbXB1dGVkKCgpID0+IHN0YXR1cyQoKSA9PT0gJ0RJU0FCTEVEJyk7XHJcbiAgIGNvbnN0IGVuYWJsZWQkID0gY29tcHV0ZWQoKCkgPT4gc3RhdHVzJCgpICE9PSAnRElTQUJMRUQnKTtcclxuXHJcbiAgIHJldHVybiB7XHJcbiAgICAgIHN0YXR1cyQsXHJcbiAgICAgIHZhbGlkJCxcclxuICAgICAgaW52YWxpZCQsXHJcbiAgICAgIHBlbmRpbmckLFxyXG4gICAgICBkaXNhYmxlZCQsXHJcbiAgICAgIGVuYWJsZWQkLFxyXG4gICAgICBzdGF0dXNDaGFuZ2VTdWJzY3JpcHRpb24kLFxyXG4gICB9O1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,32 @@
1
+ import { computed, effect, signal, untracked } from '@angular/core';
2
+ import { TouchedChangeEvent } from '@angular/forms';
3
+ import { filter } from 'rxjs';
4
+ export function buildFormTouchedSignal(formAsSignal, options) {
5
+ const touched$ = signal(!!formAsSignal()?.touched, {
6
+ equal: options.equalityFns?.touchedEquality,
7
+ });
8
+ const touchedChangeSubscription$ = signal(null);
9
+ const formTouchedChangeEffect = effect((onCleanup) => {
10
+ const form = formAsSignal();
11
+ untracked(() => {
12
+ const setTouched = () => {
13
+ untracked(() => {
14
+ touched$.set(!!form?.touched);
15
+ });
16
+ };
17
+ touchedChangeSubscription$()?.unsubscribe();
18
+ touchedChangeSubscription$.set(form?.events
19
+ .pipe(filter((e) => e instanceof TouchedChangeEvent))
20
+ .subscribe((e) => {
21
+ setTouched();
22
+ }) ?? null);
23
+ setTouched();
24
+ });
25
+ onCleanup(() => untracked(() => touchedChangeSubscription$())?.unsubscribe());
26
+ }, { injector: options.injector });
27
+ const untouched$ = computed(() => !touched$(), {
28
+ equal: options.equalityFns?.touchedEquality,
29
+ });
30
+ return { touched$, untouched$, touchedChangeSubscription$ };
31
+ }
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS10b3VjaGVkLXNpZ25hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1mb3JtLXNpZ25hbC9zcmMvbGliL2hlbHBlcnMvZm9ybS10b3VjaGVkLXNpZ25hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBSTVDLE1BQU0sVUFBVSxzQkFBc0IsQ0FDbkMsWUFBK0MsRUFDL0MsT0FBMEI7SUFFMUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxPQUFPLEVBQUU7UUFDekQsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsZUFBZTtLQUM3QyxDQUFDLENBQUM7SUFDSCxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBc0IsSUFBSSxDQUFDLENBQUM7SUFFckUsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQ25DLENBQUMsU0FBbUIsRUFBRSxFQUFFO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWixNQUFNLFVBQVUsR0FBRyxHQUFHLEVBQUU7Z0JBQ3JCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQ1osUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNqQyxDQUFDLENBQUMsQ0FBQztZQUNOLENBQUMsQ0FBQztZQUVGLDBCQUEwQixFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUM7WUFDNUMsMEJBQTBCLENBQUMsR0FBRyxDQUMzQixJQUFJLEVBQUUsTUFBTTtpQkFDUixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksa0JBQWtCLENBQUMsQ0FBQztpQkFDcEQsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2QsVUFBVSxFQUFFLENBQUM7WUFDaEIsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUNmLENBQUM7WUFDRixVQUFVLEVBQUUsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FDTixHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUNwRSxDQUFDO0lBQ0wsQ0FBQyxFQUNELEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FDaEMsQ0FBQztJQUVGLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQzVDLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLGVBQWU7S0FDN0MsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQztBQUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQsIGVmZmVjdCwgU2lnbmFsLCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUb3VjaGVkQ2hhbmdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEZvcm1TaWduYWxPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvZm9ybS1zaWduYWwtb3B0aW9ucyc7XHJcbmltcG9ydCB7IE9wdGlvbmFsRm9ybUZyb21UeXBlIH0gZnJvbSAnLi4vdHlwZXMvZm9ybS10eXBlJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZvcm1Ub3VjaGVkU2lnbmFsKFxyXG4gICBmb3JtQXNTaWduYWw6IFNpZ25hbDxPcHRpb25hbEZvcm1Gcm9tVHlwZTxhbnk+PixcclxuICAgb3B0aW9uczogRm9ybVNpZ25hbE9wdGlvbnNcclxuKSB7XHJcbiAgIGNvbnN0IHRvdWNoZWQkID0gc2lnbmFsPGJvb2xlYW4+KCEhZm9ybUFzU2lnbmFsKCk/LnRvdWNoZWQsIHtcclxuICAgICAgZXF1YWw6IG9wdGlvbnMuZXF1YWxpdHlGbnM/LnRvdWNoZWRFcXVhbGl0eSxcclxuICAgfSk7XHJcbiAgIGNvbnN0IHRvdWNoZWRDaGFuZ2VTdWJzY3JpcHRpb24kID0gc2lnbmFsPFN1YnNjcmlwdGlvbiB8IG51bGw+KG51bGwpO1xyXG5cclxuICAgY29uc3QgZm9ybVRvdWNoZWRDaGFuZ2VFZmZlY3QgPSBlZmZlY3QoXHJcbiAgICAgIChvbkNsZWFudXA6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgICAgIGNvbnN0IGZvcm0gPSBmb3JtQXNTaWduYWwoKTtcclxuICAgICAgICAgdW50cmFja2VkKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2V0VG91Y2hlZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgdW50cmFja2VkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgdG91Y2hlZCQuc2V0KCEhZm9ybT8udG91Y2hlZCk7XHJcbiAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdG91Y2hlZENoYW5nZVN1YnNjcmlwdGlvbiQoKT8udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgdG91Y2hlZENoYW5nZVN1YnNjcmlwdGlvbiQuc2V0KFxyXG4gICAgICAgICAgICAgICBmb3JtPy5ldmVudHNcclxuICAgICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKChlKSA9PiBlIGluc3RhbmNlb2YgVG91Y2hlZENoYW5nZUV2ZW50KSlcclxuICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICBzZXRUb3VjaGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgIH0pID8/IG51bGxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgc2V0VG91Y2hlZCgpO1xyXG4gICAgICAgICB9KTtcclxuICAgICAgICAgb25DbGVhbnVwKFxyXG4gICAgICAgICAgICAoKSA9PiB1bnRyYWNrZWQoKCkgPT4gdG91Y2hlZENoYW5nZVN1YnNjcmlwdGlvbiQoKSk/LnVuc3Vic2NyaWJlKClcclxuICAgICAgICAgKTtcclxuICAgICAgfSxcclxuICAgICAgeyBpbmplY3Rvcjogb3B0aW9ucy5pbmplY3RvciB9XHJcbiAgICk7XHJcblxyXG4gICBjb25zdCB1bnRvdWNoZWQkID0gY29tcHV0ZWQoKCkgPT4gIXRvdWNoZWQkKCksIHtcclxuICAgICAgZXF1YWw6IG9wdGlvbnMuZXF1YWxpdHlGbnM/LnRvdWNoZWRFcXVhbGl0eSxcclxuICAgfSk7XHJcblxyXG4gICByZXR1cm4geyB0b3VjaGVkJCwgdW50b3VjaGVkJCwgdG91Y2hlZENoYW5nZVN1YnNjcmlwdGlvbiQgfTtcclxufVxyXG4iXX0=
@@ -0,0 +1,27 @@
1
+ import { effect, signal, untracked } from '@angular/core';
2
+ export function buildFormValueSignal(formAsSignal, options) {
3
+ const value$ = signal(formAsSignal()?.value ?? null, { equal: options.equalityFns?.valueEquality ?? (() => false) });
4
+ const rawValue$ = signal(formAsSignal()?.getRawValue() ?? null, {
5
+ equal: options.equalityFns?.valueEquality ?? (() => false),
6
+ });
7
+ const valueChangeSubscription$ = signal(null);
8
+ const formValueChangeEffect = effect((onCleanup) => {
9
+ const form = formAsSignal();
10
+ untracked(() => {
11
+ const setValue = () => {
12
+ untracked(() => {
13
+ value$.set(form?.value ?? null);
14
+ rawValue$.set(form?.getRawValue() ?? null);
15
+ });
16
+ };
17
+ valueChangeSubscription$()?.unsubscribe();
18
+ valueChangeSubscription$.set(form?.valueChanges.subscribe(() => {
19
+ setValue();
20
+ }) ?? null);
21
+ setValue();
22
+ });
23
+ onCleanup(() => untracked(() => valueChangeSubscription$())?.unsubscribe());
24
+ }, { injector: options.injector });
25
+ return { value$, rawValue$, valueChangeSubscription$ };
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12YWx1ZS1zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybS1zaWduYWwvc3JjL2xpYi9oZWxwZXJzL2Zvcm0tdmFsdWUtc2lnbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU1sRSxNQUFNLFVBQVUsb0JBQW9CLENBQ2pDLFlBQTZDLEVBQzdDLE9BQTZCO0lBRTdCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FDbEIsWUFBWSxFQUFFLEVBQUUsS0FBSyxJQUFJLElBQUksRUFDN0IsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxhQUFhLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUNoRSxDQUFDO0lBQ0YsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUNyQixZQUFZLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQ3JDO1FBQ0csS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsYUFBYSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0tBQzVELENBQ0gsQ0FBQztJQUNGLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUNuRSxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FDakMsQ0FBQyxTQUFtQixFQUFFLEVBQUU7UUFDckIsTUFBTSxJQUFJLEdBQUcsWUFBWSxFQUErQixDQUFDO1FBQ3pELFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWixNQUFNLFFBQVEsR0FBRyxHQUFHLEVBQUU7Z0JBQ25CLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDO29CQUNoQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQztnQkFDOUMsQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDLENBQUM7WUFFRix3QkFBd0IsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQzFDLHdCQUF3QixDQUFDLEdBQUcsQ0FDekIsSUFBSSxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUMvQixRQUFRLEVBQUUsQ0FBQztZQUNkLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FDWixDQUFDO1lBQ0YsUUFBUSxFQUFFLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FDTixHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUNsRSxDQUFDO0lBQ0wsQ0FBQyxFQUNELEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FDaEMsQ0FBQztJQUNGLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixFQUFFLENBQUM7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVmZmVjdCwgU2lnbmFsLCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGb3JtU2lnbmFsT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzL2Zvcm0tc2lnbmFsLW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBGb3JtRnJvbVR5cGUsIE9wdGlvbmFsRm9ybUZyb21UeXBlIH0gZnJvbSAnLi4vdHlwZXMvZm9ybS10eXBlJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZvcm1WYWx1ZVNpZ25hbDxUID0gYW55PihcclxuICAgZm9ybUFzU2lnbmFsOiBTaWduYWw8T3B0aW9uYWxGb3JtRnJvbVR5cGU8VD4+LFxyXG4gICBvcHRpb25zOiBGb3JtU2lnbmFsT3B0aW9uczxUPlxyXG4pIHtcclxuICAgY29uc3QgdmFsdWUkID0gc2lnbmFsPEZvcm1Gcm9tVHlwZTxUPlsndmFsdWUnXSB8IG51bGw+KFxyXG4gICAgICBmb3JtQXNTaWduYWwoKT8udmFsdWUgPz8gbnVsbCxcclxuICAgICAgeyBlcXVhbDogb3B0aW9ucy5lcXVhbGl0eUZucz8udmFsdWVFcXVhbGl0eSA/PyAoKCkgPT4gZmFsc2UpIH1cclxuICAgKTtcclxuICAgY29uc3QgcmF3VmFsdWUkID0gc2lnbmFsPEZvcm1Gcm9tVHlwZTxUPlsndmFsdWUnXSB8IG51bGw+KFxyXG4gICAgICBmb3JtQXNTaWduYWwoKT8uZ2V0UmF3VmFsdWUoKSA/PyBudWxsLFxyXG4gICAgICB7XHJcbiAgICAgICAgIGVxdWFsOiBvcHRpb25zLmVxdWFsaXR5Rm5zPy52YWx1ZUVxdWFsaXR5ID8/ICgoKSA9PiBmYWxzZSksXHJcbiAgICAgIH1cclxuICAgKTtcclxuICAgY29uc3QgdmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24kID0gc2lnbmFsPFN1YnNjcmlwdGlvbiB8IG51bGw+KG51bGwpO1xyXG4gICBjb25zdCBmb3JtVmFsdWVDaGFuZ2VFZmZlY3QgPSBlZmZlY3QoXHJcbiAgICAgIChvbkNsZWFudXA6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgICAgIGNvbnN0IGZvcm0gPSBmb3JtQXNTaWduYWwoKSBhcyBBYnN0cmFjdENvbnRyb2w8VD4gfCBudWxsO1xyXG4gICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXRWYWx1ZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgdW50cmFja2VkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgdmFsdWUkLnNldChmb3JtPy52YWx1ZSA/PyBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgcmF3VmFsdWUkLnNldChmb3JtPy5nZXRSYXdWYWx1ZSgpID8/IG51bGwpO1xyXG4gICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uJCgpPy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB2YWx1ZUNoYW5nZVN1YnNjcmlwdGlvbiQuc2V0KFxyXG4gICAgICAgICAgICAgICBmb3JtPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgc2V0VmFsdWUoKTtcclxuICAgICAgICAgICAgICAgfSkgPz8gbnVsbFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBzZXRWYWx1ZSgpO1xyXG4gICAgICAgICB9KTtcclxuICAgICAgICAgb25DbGVhbnVwKFxyXG4gICAgICAgICAgICAoKSA9PiB1bnRyYWNrZWQoKCkgPT4gdmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24kKCkpPy51bnN1YnNjcmliZSgpXHJcbiAgICAgICAgICk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHsgaW5qZWN0b3I6IG9wdGlvbnMuaW5qZWN0b3IgfVxyXG4gICApO1xyXG4gICByZXR1cm4geyB2YWx1ZSQsIHJhd1ZhbHVlJCwgdmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24kIH07XHJcbn1cclxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcC1mb3JtLXNpZ25hbC10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWZvcm0tc2lnbmFsL3NyYy9saWIvdHlwZXMvZGVlcC1mb3JtLXNpZ25hbC10eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEZvcm1TaWduYWwgfSBmcm9tICcuL2Zvcm0tc2lnbmFsLXR5cGUnO1xyXG5pbXBvcnQgeyBGb3JtRnJvbVR5cGUgfSBmcm9tICcuL2Zvcm0tdHlwZSc7XHJcblxyXG50eXBlIERlZXBGb3JtU2lnbmFsTmVzdGVkSGVscGVyPFQsIEs+ID0gRm9ybUZyb21UeXBlPFQ+IGV4dGVuZHNcclxuICAgfCBGb3JtR3JvdXBcclxuICAgfCBGb3JtQXJyYXlcclxuICAgPyBLIGV4dGVuZHMga2V5b2YgRm9ybUZyb21UeXBlPFQ+Wydjb250cm9scyddXHJcbiAgICAgID8gRm9ybUZyb21UeXBlPFQ+Wydjb250cm9scyddW0tdIGV4dGVuZHMgRm9ybUNvbnRyb2xcclxuICAgICAgICAgPyBGb3JtU2lnbmFsPEZvcm1Gcm9tVHlwZTxUPlsnY29udHJvbHMnXVtLXVsndmFsdWUnXT5cclxuICAgICAgICAgOiBGb3JtRnJvbVR5cGU8VD5bJ2NvbnRyb2xzJ11bS10gZXh0ZW5kcyBGb3JtR3JvdXBcclxuICAgICAgICAgICA/IERlZXBGb3JtU2lnbmFsPEZvcm1Gcm9tVHlwZTxUPlsnY29udHJvbHMnXVtLXVsnY29udHJvbHMnXT5cclxuICAgICAgICAgICA6IEZvcm1Gcm9tVHlwZTxUPlsnY29udHJvbHMnXVtLXSBleHRlbmRzIEZvcm1BcnJheVxyXG4gICAgICAgICAgICAgPyBEZWVwRm9ybVNpZ25hbDxGb3JtRnJvbVR5cGU8VD5bJ2NvbnRyb2xzJ11bS11bJ2NvbnRyb2xzJ10+XHJcbiAgICAgICAgICAgICA6IG5ldmVyXHJcbiAgICAgIDogbmV2ZXJcclxuICAgOiBuZXZlcjtcclxuXHJcbmV4cG9ydCB0eXBlIERlZXBGb3JtU2lnbmFsQ2hpbGRyZW48VCA9IGFueT4gPVxyXG4gICBGb3JtRnJvbVR5cGU8VD4gZXh0ZW5kcyBGb3JtQ29udHJvbFxyXG4gICAgICA/IEZvcm1TaWduYWw8VD5cclxuICAgICAgOiBGb3JtRnJvbVR5cGU8VD4gZXh0ZW5kcyBGb3JtR3JvdXBcclxuICAgICAgICA/IEZvcm1Gcm9tVHlwZTxUPlsnY29udHJvbHMnXSBleHRlbmRzIEFycmF5PGFueT5cclxuICAgICAgICAgICA/IHtcclxuICAgICAgICAgICAgICAgIFtLOiBudW1iZXJdOiBEZWVwRm9ybVNpZ25hbE5lc3RlZEhlbHBlcjxULCBudW1iZXI+O1xyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgIDoge1xyXG4gICAgICAgICAgICAgICAgW0sgaW4ga2V5b2YgRm9ybUZyb21UeXBlPFQ+Wydjb250cm9scyddXTogRGVlcEZvcm1TaWduYWxOZXN0ZWRIZWxwZXI8XHJcbiAgICAgICAgICAgICAgICAgICBULFxyXG4gICAgICAgICAgICAgICAgICAgS1xyXG4gICAgICAgICAgICAgICAgPjtcclxuICAgICAgICAgICAgIH1cclxuICAgICAgICA6IEZvcm1Gcm9tVHlwZTxUPiBleHRlbmRzIEZvcm1BcnJheVxyXG4gICAgICAgICAgPyB7XHJcbiAgICAgICAgICAgICAgIFtLOiBudW1iZXJdOiBEZWVwRm9ybVNpZ25hbE5lc3RlZEhlbHBlcjxULCBudW1iZXI+O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA6IG51bGw7XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwRm9ybVNpZ25hbDxUID0gYW55PiA9IEZvcm1TaWduYWw8VD4gJlxyXG4gICAoRm9ybUZyb21UeXBlPFQ+IGV4dGVuZHMgRm9ybUNvbnRyb2xcclxuICAgICAgPyB7IGNoaWxkcmVuOiBudWxsIH1cclxuICAgICAgOiB7XHJcbiAgICAgICAgICAgY2hpbGRyZW46IERlZXBGb3JtU2lnbmFsQ2hpbGRyZW48VD47XHJcbiAgICAgICAgfSk7XHJcbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export function buildDefaultFormSignalOptions() {
2
+ return {};
3
+ }
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zaWduYWwtb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1mb3JtLXNpZ25hbC9zcmMvbGliL3R5cGVzL2Zvcm0tc2lnbmFsLW9wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBc0JBLE1BQU0sVUFBVSw2QkFBNkI7SUFDMUMsT0FBTyxFQUFFLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0b3IsIFZhbHVlRXF1YWxpdHlGbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbFN0YXR1cywgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRm9ybUZyb21UeXBlIH0gZnJvbSAnLi9mb3JtLXR5cGUnO1xyXG5cclxuZXhwb3J0IHR5cGUgRm9ybVNpZ25hbEVxdWFsaXR5T3B0aW9uczxUID0gYW55PiA9IHtcclxuICAgZGlydHlFcXVhbGl0eTogVmFsdWVFcXVhbGl0eUZuPGJvb2xlYW4+O1xyXG4gICB0b3VjaGVkRXF1YWxpdHk6IFZhbHVlRXF1YWxpdHlGbjxib29sZWFuPjtcclxuICAgdmFsdWVFcXVhbGl0eTogVmFsdWVFcXVhbGl0eUZuPEZvcm1Gcm9tVHlwZTxUPlsndmFsdWUnXSB8IG51bGw+O1xyXG4gICBzdGF0dXNFcXVhbGl0eTogVmFsdWVFcXVhbGl0eUZuPEZvcm1Db250cm9sU3RhdHVzIHwgbnVsbD47XHJcbiAgIGVycm9yc0VxdWFsaXR5OiBWYWx1ZUVxdWFsaXR5Rm48VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+O1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgRm9ybVNpZ25hbE9wdGlvbnM8VCA9IGFueT4gPSB7XHJcbiAgIGluamVjdG9yPzogSW5qZWN0b3I7XHJcbiAgIGVxdWFsaXR5Rm5zPzogUGFydGlhbDxGb3JtU2lnbmFsRXF1YWxpdHlPcHRpb25zPFQ+PjtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIERlZXBGb3JtU2lnbmFsT3B0aW9uczxUID0gYW55PiA9IHtcclxuICAgaW5qZWN0b3I/OiBJbmplY3RvcjtcclxuICAgZXF1YWxpdHlGbnM/OiBQYXJ0aWFsPE9taXQ8Rm9ybVNpZ25hbEVxdWFsaXR5T3B0aW9uczxUPiwgJ3ZhbHVlRXF1YWxpdHknPj47XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREZWZhdWx0Rm9ybVNpZ25hbE9wdGlvbnM8VCA9IGFueT4oKTogRm9ybVNpZ25hbE9wdGlvbnM8VD4ge1xyXG4gICByZXR1cm4ge307XHJcbn1cclxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zaWduYWwtdHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1mb3JtLXNpZ25hbC9zcmMvbGliL3R5cGVzL2Zvcm0tc2lnbmFsLXR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBidWlsZEZvcm1EaXJ0eVNpZ25hbCB9IGZyb20gJy4uL2hlbHBlcnMvZm9ybS1kaXJ0eS1zaWduYWwnO1xyXG5pbXBvcnQgeyBidWlsZEZvcm1FcnJvclNpZ25hbCB9IGZyb20gJy4uL2hlbHBlcnMvZm9ybS1lcnJvci1zaWduYWwnO1xyXG5pbXBvcnQgeyBidWlsZEZvcm1TdGF0dXNTaWduYWwgfSBmcm9tICcuLi9oZWxwZXJzL2Zvcm0tc3RhdHVzLXNpZ25hbCc7XHJcbmltcG9ydCB7IGJ1aWxkRm9ybVRvdWNoZWRTaWduYWwgfSBmcm9tICcuLi9oZWxwZXJzL2Zvcm0tdG91Y2hlZC1zaWduYWwnO1xyXG5pbXBvcnQgeyBidWlsZEZvcm1WYWx1ZVNpZ25hbCB9IGZyb20gJy4uL2hlbHBlcnMvZm9ybS12YWx1ZS1zaWduYWwnO1xyXG5cclxuZXhwb3J0IHR5cGUgRm9ybVNpZ25hbFN1YnNjcmlwdGlvbnNTdGF0ZTxUID0gYW55PiA9IHtcclxuICAgdmFsdWVDaGFuZ2VTdWJzY3JpcHRpb246IFJldHVyblR5cGU8XHJcbiAgICAgIFJldHVyblR5cGU8XHJcbiAgICAgICAgIHR5cGVvZiBidWlsZEZvcm1WYWx1ZVNpZ25hbDxUPlxyXG4gICAgICA+Wyd2YWx1ZUNoYW5nZVN1YnNjcmlwdGlvbiQnXVsnYXNSZWFkb25seSddXHJcbiAgID47XHJcbiAgIHN0YXR1c0NoYW5nZVN1YnNjcmlwdGlvbjogUmV0dXJuVHlwZTxcclxuICAgICAgUmV0dXJuVHlwZTxcclxuICAgICAgICAgdHlwZW9mIGJ1aWxkRm9ybVN0YXR1c1NpZ25hbFxyXG4gICAgICA+WydzdGF0dXNDaGFuZ2VTdWJzY3JpcHRpb24kJ11bJ2FzUmVhZG9ubHknXVxyXG4gICA+O1xyXG4gICB0b3VjaGVkQ2hhbmdlU3Vic2NyaXB0aW9uOiBSZXR1cm5UeXBlPFxyXG4gICAgICBSZXR1cm5UeXBlPFxyXG4gICAgICAgICB0eXBlb2YgYnVpbGRGb3JtVG91Y2hlZFNpZ25hbFxyXG4gICAgICA+Wyd0b3VjaGVkQ2hhbmdlU3Vic2NyaXB0aW9uJCddWydhc1JlYWRvbmx5J11cclxuICAgPjtcclxuICAgZGlydHlDaGFuZ2VTdWJzY3JpcHRpb246IFJldHVyblR5cGU8XHJcbiAgICAgIFJldHVyblR5cGU8XHJcbiAgICAgICAgIHR5cGVvZiBidWlsZEZvcm1EaXJ0eVNpZ25hbFxyXG4gICAgICA+WydkaXJ0eUNoYW5nZVN1YnNjcmlwdGlvbiQnXVsnYXNSZWFkb25seSddXHJcbiAgID47XHJcbn07XHJcbmV4cG9ydCB0eXBlIEZvcm1TaWduYWxTdGF0ZTxUID0gYW55PiA9IHtcclxuICAgc3RhdHVzOiBSZXR1cm5UeXBlPFxyXG4gICAgICBSZXR1cm5UeXBlPHR5cGVvZiBidWlsZEZvcm1TdGF0dXNTaWduYWw+WydzdGF0dXMkJ11bJ2FzUmVhZG9ubHknXVxyXG4gICA+O1xyXG4gICB2YWx1ZTogUmV0dXJuVHlwZTxcclxuICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgYnVpbGRGb3JtVmFsdWVTaWduYWw8VD4+Wyd2YWx1ZSQnXVsnYXNSZWFkb25seSddXHJcbiAgID47XHJcbiAgIHJhd1ZhbHVlOiBSZXR1cm5UeXBlPFxyXG4gICAgICBSZXR1cm5UeXBlPHR5cGVvZiBidWlsZEZvcm1WYWx1ZVNpZ25hbDxUPj5bJ3Jhd1ZhbHVlJCddWydhc1JlYWRvbmx5J11cclxuICAgPjtcclxuICAgdG91Y2hlZDogUmV0dXJuVHlwZTxcclxuICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgYnVpbGRGb3JtVG91Y2hlZFNpZ25hbD5bJ3RvdWNoZWQkJ11bJ2FzUmVhZG9ubHknXVxyXG4gICA+O1xyXG4gICB1bnRvdWNoZWQ6IFJldHVyblR5cGU8dHlwZW9mIGJ1aWxkRm9ybVRvdWNoZWRTaWduYWw+Wyd1bnRvdWNoZWQkJ107XHJcbiAgIGRpcnR5OiBSZXR1cm5UeXBlPFxyXG4gICAgICBSZXR1cm5UeXBlPHR5cGVvZiBidWlsZEZvcm1EaXJ0eVNpZ25hbD5bJ2RpcnR5JCddWydhc1JlYWRvbmx5J11cclxuICAgPjtcclxuICAgcHJpc3RpbmU6IFJldHVyblR5cGU8dHlwZW9mIGJ1aWxkRm9ybURpcnR5U2lnbmFsPlsncHJpc3RpbmUkJ107XHJcbiAgIHZhbGlkOiBSZXR1cm5UeXBlPHR5cGVvZiBidWlsZEZvcm1TdGF0dXNTaWduYWw+Wyd2YWxpZCQnXTtcclxuICAgaW52YWxpZDogUmV0dXJuVHlwZTx0eXBlb2YgYnVpbGRGb3JtU3RhdHVzU2lnbmFsPlsnaW52YWxpZCQnXTtcclxuICAgcGVuZGluZzogUmV0dXJuVHlwZTx0eXBlb2YgYnVpbGRGb3JtU3RhdHVzU2lnbmFsPlsncGVuZGluZyQnXTtcclxuICAgZGlzYWJsZWQ6IFJldHVyblR5cGU8dHlwZW9mIGJ1aWxkRm9ybVN0YXR1c1NpZ25hbD5bJ2Rpc2FibGVkJCddO1xyXG4gICBlbmFibGVkOiBSZXR1cm5UeXBlPHR5cGVvZiBidWlsZEZvcm1TdGF0dXNTaWduYWw+WydlbmFibGVkJCddO1xyXG4gICBlcnJvcnM6IFJldHVyblR5cGU8dHlwZW9mIGJ1aWxkRm9ybUVycm9yU2lnbmFsPjtcclxuICAgc3Vic2NyaXB0aW9uczogRm9ybVNpZ25hbFN1YnNjcmlwdGlvbnNTdGF0ZTxUPjtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIEZvcm1TbmFwc2hvdFNpZ25hbFN1YnNjcmlwdGlvbnNTdGF0ZTxUID0gYW55PiA9IHtcclxuICAgW3ggaW4ga2V5b2YgRm9ybVNpZ25hbFN1YnNjcmlwdGlvbnNTdGF0ZTxUPl06IFJldHVyblR5cGU8XHJcbiAgICAgIEZvcm1TaWduYWxTdWJzY3JpcHRpb25zU3RhdGU8VD5beF1cclxuICAgPjtcclxufTtcclxuZXhwb3J0IHR5cGUgRm9ybVNuYXBzaG90U2lnbmFsU3RhdGU8VCA9IGFueT4gPSB7XHJcbiAgIFt4IGluIGtleW9mIE9taXQ8Rm9ybVNpZ25hbFN0YXRlPFQ+LCAnc3Vic2NyaXB0aW9ucyc+XTogUmV0dXJuVHlwZTxcclxuICAgICAgRm9ybVNpZ25hbFN0YXRlPFQ+W3hdXHJcbiAgID47XHJcbn0gJiB7IHN1YnNjcmlwdGlvbnM6IEZvcm1TbmFwc2hvdFNpZ25hbFN1YnNjcmlwdGlvbnNTdGF0ZTxUPiB9O1xyXG5cclxuZXhwb3J0IHR5cGUgRm9ybVNpZ25hbDxUID0gYW55PiA9IEZvcm1TaWduYWxTdGF0ZTxUPiAmXHJcbiAgIFNpZ25hbDxGb3JtU25hcHNob3RTaWduYWxTdGF0ZTxUPj47XHJcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWZvcm0tc2lnbmFsL3NyYy9saWIvdHlwZXMvZm9ybS10eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgIEZvcm1BcnJheSxcclxuICAgRm9ybUNvbnRyb2wsXHJcbiAgIEZvcm1Hcm91cCxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5leHBvcnQgdHlwZSBGb3JtRnJvbVR5cGU8VD4gPSBUIGV4dGVuZHMgeyBbSyBpbiBrZXlvZiBUXTogQWJzdHJhY3RDb250cm9sPGFueT4gfVxyXG4gICA/IEZvcm1Hcm91cDxUPlxyXG4gICA6IFQgZXh0ZW5kcyBBYnN0cmFjdENvbnRyb2w8YW55PlxyXG4gICAgID8gRm9ybUFycmF5PFQ+XHJcbiAgICAgOiBUIGV4dGVuZHMgQWJzdHJhY3RDb250cm9sPGFueT5bXVxyXG4gICAgICAgPyBGb3JtQXJyYXk8VFswXT5cclxuICAgICAgIDogRm9ybUNvbnRyb2w8VD47XHJcblxyXG5leHBvcnQgdHlwZSBPcHRpb25hbEZvcm1Gcm9tVHlwZTxUID0gYW55PiA9XHJcbiAgIHwgRm9ybUZyb21UeXBlPFQ+XHJcbiAgIHwgRm9ybUNvbnRyb2w8VD5cclxuICAgfCBudWxsO1xyXG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZvcm0tc2lnbmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvbmd4LWZvcm0tc2lnbmFsL3NyYy9uZ3gtZm9ybS1zaWduYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,10 @@
1
+ /*
2
+ * Public API Surface of ngx-form-signal
3
+ */
4
+ export * from './lib/deep-form-signal';
5
+ export * from './lib/form-signal';
6
+ export * from './lib/types/deep-form-signal-type';
7
+ export * from './lib/types/form-signal-options';
8
+ export * from './lib/types/form-signal-type';
9
+ export * from './lib/types/form-type';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1mb3JtLXNpZ25hbC9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLG1DQUFtQyxDQUFDO0FBQ2xELGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIG5neC1mb3JtLXNpZ25hbFxyXG4gKi9cclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2RlZXAtZm9ybS1zaWduYWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9mb3JtLXNpZ25hbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3R5cGVzL2RlZXAtZm9ybS1zaWduYWwtdHlwZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3R5cGVzL2Zvcm0tc2lnbmFsLW9wdGlvbnMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi90eXBlcy9mb3JtLXNpZ25hbC10eXBlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvdHlwZXMvZm9ybS10eXBlJztcclxuIl19
@@ -0,0 +1,230 @@
1
+ import { signal, effect, untracked, computed, isSignal, assertInInjectionContext } from '@angular/core';
2
+ import { PristineChangeEvent, TouchedChangeEvent, FormControl, FormArray, FormGroup } from '@angular/forms';
3
+ import { filter } from 'rxjs';
4
+
5
+ function buildFormDirtySignal(formAsSignal, options) {
6
+ const dirty$ = signal(!!formAsSignal()?.dirty, {
7
+ equal: options.equalityFns?.dirtyEquality,
8
+ });
9
+ const dirtyChangeSubscription$ = signal(null);
10
+ const formDirtyChangeEffect = effect((onCleanup) => {
11
+ const form = formAsSignal();
12
+ untracked(() => {
13
+ const setDirty = () => {
14
+ untracked(() => {
15
+ dirty$.set(!!form?.dirty);
16
+ });
17
+ };
18
+ dirtyChangeSubscription$()?.unsubscribe();
19
+ dirtyChangeSubscription$.set(form?.events
20
+ .pipe(filter((e) => e instanceof PristineChangeEvent))
21
+ .subscribe((e) => {
22
+ setDirty();
23
+ }) ?? null);
24
+ setDirty();
25
+ });
26
+ onCleanup(() => untracked(() => dirtyChangeSubscription$())?.unsubscribe());
27
+ }, { injector: options.injector });
28
+ const pristine$ = computed(() => !dirty$());
29
+ return { dirty$, pristine$, dirtyChangeSubscription$ };
30
+ }
31
+
32
+ function buildFormErrorSignal(form, valueSignal, statusSignal, options) {
33
+ const formAsSignal = isSignal(form) ? form : signal(form);
34
+ return computed(() => {
35
+ const v = valueSignal();
36
+ const s = statusSignal();
37
+ return formAsSignal()?.errors ?? null;
38
+ }, { equal: options.equalityFns?.errorsEquality });
39
+ }
40
+
41
+ function buildFormSnapshotSignal(formSignalState) {
42
+ return computed(() => {
43
+ return {
44
+ status: formSignalState.status(),
45
+ value: formSignalState.value(),
46
+ rawValue: formSignalState.rawValue(),
47
+ touched: formSignalState.touched(),
48
+ untouched: formSignalState.untouched(),
49
+ dirty: formSignalState.dirty(),
50
+ pristine: formSignalState.pristine(),
51
+ valid: formSignalState.valid(),
52
+ invalid: formSignalState.invalid(),
53
+ pending: formSignalState.pending(),
54
+ disabled: formSignalState.disabled(),
55
+ enabled: formSignalState.enabled(),
56
+ errors: formSignalState.errors(),
57
+ subscriptions: {
58
+ valueChangeSubscription: formSignalState.subscriptions.valueChangeSubscription(),
59
+ statusChangeSubscription: formSignalState.subscriptions.statusChangeSubscription(),
60
+ touchedChangeSubscription: formSignalState.subscriptions.touchedChangeSubscription(),
61
+ dirtyChangeSubscription: formSignalState.subscriptions.dirtyChangeSubscription(),
62
+ },
63
+ };
64
+ });
65
+ }
66
+
67
+ function buildFormStatusSignal(formAsSignal, options) {
68
+ const equal = options.equalityFns?.statusEquality ?? (() => false);
69
+ const status$ = signal(formAsSignal()?.status ?? null, { equal });
70
+ const statusChangeSubscription$ = signal(null);
71
+ const formStatusChangeEffect = effect((onCleanup) => {
72
+ const form = formAsSignal();
73
+ untracked(() => {
74
+ const setStatus = () => {
75
+ untracked(() => {
76
+ status$.set(form?.status ?? null);
77
+ });
78
+ };
79
+ statusChangeSubscription$()?.unsubscribe();
80
+ statusChangeSubscription$.set(form?.statusChanges.subscribe(() => {
81
+ setStatus();
82
+ }) ?? null);
83
+ setStatus();
84
+ });
85
+ onCleanup(() => untracked(() => statusChangeSubscription$())?.unsubscribe());
86
+ }, { injector: options.injector });
87
+ const valid$ = computed(() => status$() === 'VALID');
88
+ const invalid$ = computed(() => status$() === 'INVALID');
89
+ const pending$ = computed(() => status$() == 'PENDING');
90
+ const disabled$ = computed(() => status$() === 'DISABLED');
91
+ const enabled$ = computed(() => status$() !== 'DISABLED');
92
+ return {
93
+ status$,
94
+ valid$,
95
+ invalid$,
96
+ pending$,
97
+ disabled$,
98
+ enabled$,
99
+ statusChangeSubscription$,
100
+ };
101
+ }
102
+
103
+ function buildFormTouchedSignal(formAsSignal, options) {
104
+ const touched$ = signal(!!formAsSignal()?.touched, {
105
+ equal: options.equalityFns?.touchedEquality,
106
+ });
107
+ const touchedChangeSubscription$ = signal(null);
108
+ const formTouchedChangeEffect = effect((onCleanup) => {
109
+ const form = formAsSignal();
110
+ untracked(() => {
111
+ const setTouched = () => {
112
+ untracked(() => {
113
+ touched$.set(!!form?.touched);
114
+ });
115
+ };
116
+ touchedChangeSubscription$()?.unsubscribe();
117
+ touchedChangeSubscription$.set(form?.events
118
+ .pipe(filter((e) => e instanceof TouchedChangeEvent))
119
+ .subscribe((e) => {
120
+ setTouched();
121
+ }) ?? null);
122
+ setTouched();
123
+ });
124
+ onCleanup(() => untracked(() => touchedChangeSubscription$())?.unsubscribe());
125
+ }, { injector: options.injector });
126
+ const untouched$ = computed(() => !touched$(), {
127
+ equal: options.equalityFns?.touchedEquality,
128
+ });
129
+ return { touched$, untouched$, touchedChangeSubscription$ };
130
+ }
131
+
132
+ function buildFormValueSignal(formAsSignal, options) {
133
+ const value$ = signal(formAsSignal()?.value ?? null, { equal: options.equalityFns?.valueEquality ?? (() => false) });
134
+ const rawValue$ = signal(formAsSignal()?.getRawValue() ?? null, {
135
+ equal: options.equalityFns?.valueEquality ?? (() => false),
136
+ });
137
+ const valueChangeSubscription$ = signal(null);
138
+ const formValueChangeEffect = effect((onCleanup) => {
139
+ const form = formAsSignal();
140
+ untracked(() => {
141
+ const setValue = () => {
142
+ untracked(() => {
143
+ value$.set(form?.value ?? null);
144
+ rawValue$.set(form?.getRawValue() ?? null);
145
+ });
146
+ };
147
+ valueChangeSubscription$()?.unsubscribe();
148
+ valueChangeSubscription$.set(form?.valueChanges.subscribe(() => {
149
+ setValue();
150
+ }) ?? null);
151
+ setValue();
152
+ });
153
+ onCleanup(() => untracked(() => valueChangeSubscription$())?.unsubscribe());
154
+ }, { injector: options.injector });
155
+ return { value$, rawValue$, valueChangeSubscription$ };
156
+ }
157
+
158
+ function buildDefaultFormSignalOptions() {
159
+ return {};
160
+ }
161
+
162
+ function formSignal(form, options = buildDefaultFormSignalOptions()) {
163
+ const formAsSignal = isSignal(form) ? form : signal(form);
164
+ if (!options.injector) {
165
+ assertInInjectionContext(() => { });
166
+ }
167
+ const { value$, rawValue$, valueChangeSubscription$ } = buildFormValueSignal(formAsSignal, options);
168
+ const { status$, valid$, invalid$, pending$, disabled$, enabled$, statusChangeSubscription$, } = buildFormStatusSignal(formAsSignal, options);
169
+ const { touched$, untouched$, touchedChangeSubscription$ } = buildFormTouchedSignal(formAsSignal, options);
170
+ const { dirty$, pristine$, dirtyChangeSubscription$ } = buildFormDirtySignal(formAsSignal, options);
171
+ const errors$ = buildFormErrorSignal(formAsSignal, value$, status$, options);
172
+ const formSignals = {
173
+ status: status$.asReadonly(),
174
+ value: value$.asReadonly(),
175
+ rawValue: rawValue$.asReadonly(),
176
+ touched: touched$.asReadonly(),
177
+ untouched: untouched$,
178
+ dirty: dirty$.asReadonly(),
179
+ pristine: pristine$,
180
+ valid: valid$,
181
+ invalid: invalid$,
182
+ pending: pending$,
183
+ disabled: disabled$,
184
+ enabled: enabled$,
185
+ errors: errors$,
186
+ subscriptions: {
187
+ valueChangeSubscription: valueChangeSubscription$.asReadonly(),
188
+ statusChangeSubscription: statusChangeSubscription$.asReadonly(),
189
+ touchedChangeSubscription: touchedChangeSubscription$.asReadonly(),
190
+ dirtyChangeSubscription: dirtyChangeSubscription$.asReadonly(),
191
+ },
192
+ };
193
+ const snapshot$ = buildFormSnapshotSignal(formSignals);
194
+ Object.setPrototypeOf(snapshot$, formSignals);
195
+ return snapshot$;
196
+ }
197
+
198
+ function deepFormSignal(form, options = buildDefaultFormSignalOptions()) {
199
+ const root = formSignal(form, options);
200
+ const formVal = isSignal(form) ? form() : form;
201
+ if (formVal && !(formVal instanceof FormControl)) {
202
+ let children = null;
203
+ if (formVal instanceof FormArray) {
204
+ // @ts-ignore
205
+ children = formVal.controls.map((c) => deepFormSignal(c, options));
206
+ }
207
+ else if (formVal instanceof FormGroup) {
208
+ const controls = formVal.controls;
209
+ const keys = Object.keys(controls);
210
+ children = keys.reduce((acc, cKey) => {
211
+ // @ts-ignore
212
+ acc[cKey] = deepFormSignal(controls[cKey], options);
213
+ return acc;
214
+ }, {});
215
+ }
216
+ root.children = children;
217
+ }
218
+ return root;
219
+ }
220
+
221
+ /*
222
+ * Public API Surface of ngx-form-signal
223
+ */
224
+
225
+ /**
226
+ * Generated bundle index. Do not edit.
227
+ */
228
+
229
+ export { buildDefaultFormSignalOptions, deepFormSignal, formSignal };
230
+ //# sourceMappingURL=ngx-form-signal.mjs.map