ngx-form-signal 1.18.0 → 1.18.1

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 (43) hide show
  1. package/README.md +3 -20
  2. package/esm2022/lib/form-signal.mjs +45 -0
  3. package/esm2022/lib/helpers/form-dirty-signal.mjs +30 -0
  4. package/esm2022/lib/helpers/form-error-signal.mjs +10 -0
  5. package/esm2022/lib/helpers/form-snapshot-signal.mjs +27 -0
  6. package/esm2022/lib/helpers/form-status-signal.mjs +37 -0
  7. package/esm2022/lib/helpers/form-touched-signal.mjs +32 -0
  8. package/esm2022/lib/helpers/form-value-signal.mjs +27 -0
  9. package/esm2022/lib/types/form-signal-options.mjs +5 -0
  10. package/esm2022/lib/types/form-signal-type.mjs +2 -0
  11. package/esm2022/lib/types/form-type.mjs +2 -0
  12. package/esm2022/ngx-form-signal.mjs +5 -0
  13. package/esm2022/public-api.mjs +8 -0
  14. package/fesm2022/ngx-form-signal.mjs +209 -0
  15. package/fesm2022/ngx-form-signal.mjs.map +1 -0
  16. package/index.d.ts +5 -0
  17. package/lib/form-signal.d.ts +5 -0
  18. package/lib/helpers/form-dirty-signal.d.ts +9 -0
  19. package/lib/helpers/form-error-signal.d.ts +5 -0
  20. package/lib/helpers/form-snapshot-signal.d.ts +2 -0
  21. package/lib/helpers/form-status-signal.d.ts +14 -0
  22. package/lib/helpers/form-touched-signal.d.ts +9 -0
  23. package/lib/helpers/form-value-signal.d.ts +9 -0
  24. package/lib/types/form-signal-options.d.ts +16 -0
  25. package/lib/types/form-signal-type.d.ts +36 -0
  26. package/lib/types/form-type.d.ts +7 -0
  27. package/package.json +45 -13
  28. package/{src/public-api.ts → public-api.d.ts} +4 -8
  29. package/ng-package.json +0 -7
  30. package/src/lib/form-signal.ts +0 -75
  31. package/src/lib/helpers/form-dirty-signal.ts +0 -46
  32. package/src/lib/helpers/form-error-signal.ts +0 -28
  33. package/src/lib/helpers/form-invalid-signal.ts +0 -23
  34. package/src/lib/helpers/form-snapshot-signal.ts +0 -37
  35. package/src/lib/helpers/form-status-signal.ts +0 -57
  36. package/src/lib/helpers/form-touched-signal.ts +0 -48
  37. package/src/lib/helpers/form-value-signal.ts +0 -48
  38. package/src/lib/types/form-signal-options.ts +0 -20
  39. package/src/lib/types/form-signal-type.ts +0 -68
  40. package/src/lib/types/form-type.ts +0 -18
  41. package/tsconfig.lib.json +0 -15
  42. package/tsconfig.lib.prod.json +0 -11
  43. 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,45 @@
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
+ const formSignalObj = (() => snapshot$());
42
+ Object.setPrototypeOf(formSignalObj, formSignals);
43
+ return formSignalObj;
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybS1zaWduYWwvc3JjL2xpYi9mb3JtLXNpZ25hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0osd0JBQXdCLEVBQ3hCLFFBQVEsRUFFUixNQUFNLEdBQ1IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUNKLDZCQUE2QixHQUUvQixNQUFNLDZCQUE2QixDQUFDO0FBSXJDLE1BQU0sVUFBVSxVQUFVLENBQ3ZCLElBQStELEVBQy9ELFVBQTZCLDZCQUE2QixFQUFLO0lBRS9ELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyQix3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsd0JBQXdCLEVBQUUsR0FDbEQsb0JBQW9CLENBQUksWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELE1BQU0sRUFDSCxPQUFPLEVBQ1AsTUFBTSxFQUNOLFFBQVEsRUFDUixRQUFRLEVBQ1IsU0FBUyxFQUNULFFBQVEsRUFDUix5QkFBeUIsR0FDM0IsR0FBRyxxQkFBcUIsQ0FBSSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEQsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsMEJBQTBCLEVBQUUsR0FDdkQsc0JBQXNCLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixFQUFFLEdBQUcsb0JBQW9CLENBQ3pFLFlBQVksRUFDWixPQUFPLENBQ1QsQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTdFLE1BQU0sV0FBVyxHQUF1QjtRQUNyQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRTtRQUM1QixLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUMxQixRQUFRLEVBQUUsU0FBUyxDQUFDLFVBQVUsRUFBRTtRQUNoQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRTtRQUM5QixTQUFTLEVBQUUsVUFBVTtRQUNyQixLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUMxQixRQUFRLEVBQUUsU0FBUztRQUNuQixLQUFLLEVBQUUsTUFBTTtRQUNiLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLFFBQVEsRUFBRSxTQUFTO1FBQ25CLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLE1BQU0sRUFBRSxPQUFPO1FBQ2YsYUFBYSxFQUFFO1lBQ1osdUJBQXVCLEVBQUUsd0JBQXdCLENBQUMsVUFBVSxFQUFFO1lBQzlELHdCQUF3QixFQUFFLHlCQUF5QixDQUFDLFVBQVUsRUFBRTtZQUNoRSx5QkFBeUIsRUFBRSwwQkFBMEIsQ0FBQyxVQUFVLEVBQUU7WUFDbEUsdUJBQXVCLEVBQUUsd0JBQXdCLENBQUMsVUFBVSxFQUFFO1NBQ2hFO0tBQ0gsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQWtCLENBQUM7SUFFM0QsTUFBTSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFbEQsT0FBTyxhQUFhLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgIGFzc2VydEluSW5qZWN0aW9uQ29udGV4dCxcclxuICAgaXNTaWduYWwsXHJcbiAgIFNpZ25hbCxcclxuICAgc2lnbmFsLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBidWlsZEZvcm1EaXJ0eVNpZ25hbCB9IGZyb20gJy4vaGVscGVycy9mb3JtLWRpcnR5LXNpZ25hbCc7XHJcbmltcG9ydCB7IGJ1aWxkRm9ybUVycm9yU2lnbmFsIH0gZnJvbSAnLi9oZWxwZXJzL2Zvcm0tZXJyb3Itc2lnbmFsJztcclxuaW1wb3J0IHsgYnVpbGRGb3JtU25hcHNob3RTaWduYWwgfSBmcm9tICcuL2hlbHBlcnMvZm9ybS1zbmFwc2hvdC1zaWduYWwnO1xyXG5pbXBvcnQgeyBidWlsZEZvcm1TdGF0dXNTaWduYWwgfSBmcm9tICcuL2hlbHBlcnMvZm9ybS1zdGF0dXMtc2lnbmFsJztcclxuaW1wb3J0IHsgYnVpbGRGb3JtVG91Y2hlZFNpZ25hbCB9IGZyb20gJy4vaGVscGVycy9mb3JtLXRvdWNoZWQtc2lnbmFsJztcclxuaW1wb3J0IHsgYnVpbGRGb3JtVmFsdWVTaWduYWwgfSBmcm9tICcuL2hlbHBlcnMvZm9ybS12YWx1ZS1zaWduYWwnO1xyXG5pbXBvcnQge1xyXG4gICBidWlsZERlZmF1bHRGb3JtU2lnbmFsT3B0aW9ucyxcclxuICAgRm9ybVNpZ25hbE9wdGlvbnMsXHJcbn0gZnJvbSAnLi90eXBlcy9mb3JtLXNpZ25hbC1vcHRpb25zJztcclxuaW1wb3J0IHsgRm9ybVNpZ25hbCwgRm9ybVNpZ25hbFN0YXRlIH0gZnJvbSAnLi90eXBlcy9mb3JtLXNpZ25hbC10eXBlJztcclxuaW1wb3J0IHsgT3B0aW9uYWxGb3JtRnJvbVR5cGUgfSBmcm9tICcuL3R5cGVzL2Zvcm0tdHlwZSc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybVNpZ25hbDxUID0gYW55PihcclxuICAgZm9ybTogU2lnbmFsPE9wdGlvbmFsRm9ybUZyb21UeXBlPFQ+PiB8IE9wdGlvbmFsRm9ybUZyb21UeXBlPFQ+LFxyXG4gICBvcHRpb25zOiBGb3JtU2lnbmFsT3B0aW9ucyA9IGJ1aWxkRGVmYXVsdEZvcm1TaWduYWxPcHRpb25zPFQ+KClcclxuKTogRm9ybVNpZ25hbDxUPiB7XHJcbiAgIGNvbnN0IGZvcm1Bc1NpZ25hbCA9IGlzU2lnbmFsKGZvcm0pID8gZm9ybSA6IHNpZ25hbChmb3JtKTtcclxuICAgaWYgKCFvcHRpb25zLmluamVjdG9yKSB7XHJcbiAgICAgIGFzc2VydEluSW5qZWN0aW9uQ29udGV4dCgoKSA9PiB7fSk7XHJcbiAgIH1cclxuICAgY29uc3QgeyB2YWx1ZSQsIHJhd1ZhbHVlJCwgdmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24kIH0gPVxyXG4gICAgICBidWlsZEZvcm1WYWx1ZVNpZ25hbDxUPihmb3JtQXNTaWduYWwsIG9wdGlvbnMpO1xyXG4gICBjb25zdCB7XHJcbiAgICAgIHN0YXR1cyQsXHJcbiAgICAgIHZhbGlkJCxcclxuICAgICAgaW52YWxpZCQsXHJcbiAgICAgIHBlbmRpbmckLFxyXG4gICAgICBkaXNhYmxlZCQsXHJcbiAgICAgIGVuYWJsZWQkLFxyXG4gICAgICBzdGF0dXNDaGFuZ2VTdWJzY3JpcHRpb24kLFxyXG4gICB9ID0gYnVpbGRGb3JtU3RhdHVzU2lnbmFsPFQ+KGZvcm1Bc1NpZ25hbCwgb3B0aW9ucyk7XHJcbiAgIGNvbnN0IHsgdG91Y2hlZCQsIHVudG91Y2hlZCQsIHRvdWNoZWRDaGFuZ2VTdWJzY3JpcHRpb24kIH0gPVxyXG4gICAgICBidWlsZEZvcm1Ub3VjaGVkU2lnbmFsKGZvcm1Bc1NpZ25hbCwgb3B0aW9ucyk7XHJcbiAgIGNvbnN0IHsgZGlydHkkLCBwcmlzdGluZSQsIGRpcnR5Q2hhbmdlU3Vic2NyaXB0aW9uJCB9ID0gYnVpbGRGb3JtRGlydHlTaWduYWwoXHJcbiAgICAgIGZvcm1Bc1NpZ25hbCxcclxuICAgICAgb3B0aW9uc1xyXG4gICApO1xyXG4gICBjb25zdCBlcnJvcnMkID0gYnVpbGRGb3JtRXJyb3JTaWduYWwoZm9ybUFzU2lnbmFsLCB2YWx1ZSQsIHN0YXR1cyQsIG9wdGlvbnMpO1xyXG5cclxuICAgY29uc3QgZm9ybVNpZ25hbHM6IEZvcm1TaWduYWxTdGF0ZTxUPiA9IHtcclxuICAgICAgc3RhdHVzOiBzdGF0dXMkLmFzUmVhZG9ubHkoKSxcclxuICAgICAgdmFsdWU6IHZhbHVlJC5hc1JlYWRvbmx5KCksXHJcbiAgICAgIHJhd1ZhbHVlOiByYXdWYWx1ZSQuYXNSZWFkb25seSgpLFxyXG4gICAgICB0b3VjaGVkOiB0b3VjaGVkJC5hc1JlYWRvbmx5KCksXHJcbiAgICAgIHVudG91Y2hlZDogdW50b3VjaGVkJCxcclxuICAgICAgZGlydHk6IGRpcnR5JC5hc1JlYWRvbmx5KCksXHJcbiAgICAgIHByaXN0aW5lOiBwcmlzdGluZSQsXHJcbiAgICAgIHZhbGlkOiB2YWxpZCQsXHJcbiAgICAgIGludmFsaWQ6IGludmFsaWQkLFxyXG4gICAgICBwZW5kaW5nOiBwZW5kaW5nJCxcclxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkJCxcclxuICAgICAgZW5hYmxlZDogZW5hYmxlZCQsXHJcbiAgICAgIGVycm9yczogZXJyb3JzJCxcclxuICAgICAgc3Vic2NyaXB0aW9uczoge1xyXG4gICAgICAgICB2YWx1ZUNoYW5nZVN1YnNjcmlwdGlvbjogdmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24kLmFzUmVhZG9ubHkoKSxcclxuICAgICAgICAgc3RhdHVzQ2hhbmdlU3Vic2NyaXB0aW9uOiBzdGF0dXNDaGFuZ2VTdWJzY3JpcHRpb24kLmFzUmVhZG9ubHkoKSxcclxuICAgICAgICAgdG91Y2hlZENoYW5nZVN1YnNjcmlwdGlvbjogdG91Y2hlZENoYW5nZVN1YnNjcmlwdGlvbiQuYXNSZWFkb25seSgpLFxyXG4gICAgICAgICBkaXJ0eUNoYW5nZVN1YnNjcmlwdGlvbjogZGlydHlDaGFuZ2VTdWJzY3JpcHRpb24kLmFzUmVhZG9ubHkoKSxcclxuICAgICAgfSxcclxuICAgfTtcclxuXHJcbiAgIGNvbnN0IHNuYXBzaG90JCA9IGJ1aWxkRm9ybVNuYXBzaG90U2lnbmFsKGZvcm1TaWduYWxzKTtcclxuICAgY29uc3QgZm9ybVNpZ25hbE9iaiA9ICgoKSA9PiBzbmFwc2hvdCQoKSkgYXMgRm9ybVNpZ25hbDxUPjtcclxuXHJcbiAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihmb3JtU2lnbmFsT2JqLCBmb3JtU2lnbmFscyk7XHJcblxyXG4gICByZXR1cm4gZm9ybVNpZ25hbE9iajtcclxufVxyXG4iXX0=
@@ -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,5 @@
1
+ export const defaultFormSignalOptions = {};
2
+ export function buildDefaultFormSignalOptions() {
3
+ return structuredClone(defaultFormSignalOptions);
4
+ }
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zaWduYWwtb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1mb3JtLXNpZ25hbC9zcmMvbGliL3R5cGVzL2Zvcm0tc2lnbmFsLW9wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0JBLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFzQixFQUFFLENBQUM7QUFDOUQsTUFBTSxVQUFVLDZCQUE2QjtJQUMxQyxPQUFPLGVBQWUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciwgVmFsdWVFcXVhbGl0eUZuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sU3RhdHVzLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGb3JtRnJvbVR5cGUgfSBmcm9tICcuL2Zvcm0tdHlwZSc7XHJcblxyXG5leHBvcnQgdHlwZSBGb3JtU2lnbmFsRXF1YWxpdHlPcHRpb25zPFQgPSBhbnk+ID0ge1xyXG4gICBkaXJ0eUVxdWFsaXR5OiBWYWx1ZUVxdWFsaXR5Rm48Ym9vbGVhbj47XHJcbiAgIHRvdWNoZWRFcXVhbGl0eTogVmFsdWVFcXVhbGl0eUZuPGJvb2xlYW4+O1xyXG4gICB2YWx1ZUVxdWFsaXR5OiBWYWx1ZUVxdWFsaXR5Rm48Rm9ybUZyb21UeXBlPFQ+Wyd2YWx1ZSddIHwgbnVsbD47XHJcbiAgIHN0YXR1c0VxdWFsaXR5OiBWYWx1ZUVxdWFsaXR5Rm48Rm9ybUNvbnRyb2xTdGF0dXMgfCBudWxsPjtcclxuICAgZXJyb3JzRXF1YWxpdHk6IFZhbHVlRXF1YWxpdHlGbjxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD47XHJcbn07XHJcbmV4cG9ydCB0eXBlIEZvcm1TaWduYWxPcHRpb25zPFQgPSBhbnk+ID0ge1xyXG4gICBpbmplY3Rvcj86IEluamVjdG9yO1xyXG4gICBlcXVhbGl0eUZucz86IFBhcnRpYWw8Rm9ybVNpZ25hbEVxdWFsaXR5T3B0aW9uczxUPj47XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdEZvcm1TaWduYWxPcHRpb25zOiBGb3JtU2lnbmFsT3B0aW9ucyA9IHt9O1xyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREZWZhdWx0Rm9ybVNpZ25hbE9wdGlvbnM8VCA9IGFueT4oKTogRm9ybVNpZ25hbE9wdGlvbnM8VD4ge1xyXG4gICByZXR1cm4gc3RydWN0dXJlZENsb25lKGRlZmF1bHRGb3JtU2lnbmFsT3B0aW9ucyk7XHJcbn1cclxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zaWduYWwtdHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1mb3JtLXNpZ25hbC9zcmMvbGliL3R5cGVzL2Zvcm0tc2lnbmFsLXR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJ1aWxkRm9ybURpcnR5U2lnbmFsIH0gZnJvbSAnLi4vaGVscGVycy9mb3JtLWRpcnR5LXNpZ25hbCc7XHJcbmltcG9ydCB7IGJ1aWxkRm9ybUVycm9yU2lnbmFsIH0gZnJvbSAnLi4vaGVscGVycy9mb3JtLWVycm9yLXNpZ25hbCc7XHJcbmltcG9ydCB7IGJ1aWxkRm9ybVN0YXR1c1NpZ25hbCB9IGZyb20gJy4uL2hlbHBlcnMvZm9ybS1zdGF0dXMtc2lnbmFsJztcclxuaW1wb3J0IHsgYnVpbGRGb3JtVG91Y2hlZFNpZ25hbCB9IGZyb20gJy4uL2hlbHBlcnMvZm9ybS10b3VjaGVkLXNpZ25hbCc7XHJcbmltcG9ydCB7IGJ1aWxkRm9ybVZhbHVlU2lnbmFsIH0gZnJvbSAnLi4vaGVscGVycy9mb3JtLXZhbHVlLXNpZ25hbCc7XHJcblxyXG5leHBvcnQgdHlwZSBGb3JtU2lnbmFsU3Vic2NyaXB0aW9uc1N0YXRlPFQgPSBhbnk+ID0ge1xyXG4gICB2YWx1ZUNoYW5nZVN1YnNjcmlwdGlvbjogUmV0dXJuVHlwZTxcclxuICAgICAgUmV0dXJuVHlwZTxcclxuICAgICAgICAgdHlwZW9mIGJ1aWxkRm9ybVZhbHVlU2lnbmFsPFQ+XHJcbiAgICAgID5bJ3ZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uJCddWydhc1JlYWRvbmx5J11cclxuICAgPjtcclxuICAgc3RhdHVzQ2hhbmdlU3Vic2NyaXB0aW9uOiBSZXR1cm5UeXBlPFxyXG4gICAgICBSZXR1cm5UeXBlPFxyXG4gICAgICAgICB0eXBlb2YgYnVpbGRGb3JtU3RhdHVzU2lnbmFsXHJcbiAgICAgID5bJ3N0YXR1c0NoYW5nZVN1YnNjcmlwdGlvbiQnXVsnYXNSZWFkb25seSddXHJcbiAgID47XHJcbiAgIHRvdWNoZWRDaGFuZ2VTdWJzY3JpcHRpb246IFJldHVyblR5cGU8XHJcbiAgICAgIFJldHVyblR5cGU8XHJcbiAgICAgICAgIHR5cGVvZiBidWlsZEZvcm1Ub3VjaGVkU2lnbmFsXHJcbiAgICAgID5bJ3RvdWNoZWRDaGFuZ2VTdWJzY3JpcHRpb24kJ11bJ2FzUmVhZG9ubHknXVxyXG4gICA+O1xyXG4gICBkaXJ0eUNoYW5nZVN1YnNjcmlwdGlvbjogUmV0dXJuVHlwZTxcclxuICAgICAgUmV0dXJuVHlwZTxcclxuICAgICAgICAgdHlwZW9mIGJ1aWxkRm9ybURpcnR5U2lnbmFsXHJcbiAgICAgID5bJ2RpcnR5Q2hhbmdlU3Vic2NyaXB0aW9uJCddWydhc1JlYWRvbmx5J11cclxuICAgPjtcclxufTtcclxuZXhwb3J0IHR5cGUgRm9ybVNpZ25hbFN0YXRlPFQgPSBhbnk+ID0ge1xyXG4gICBzdGF0dXM6IFJldHVyblR5cGU8XHJcbiAgICAgIFJldHVyblR5cGU8dHlwZW9mIGJ1aWxkRm9ybVN0YXR1c1NpZ25hbD5bJ3N0YXR1cyQnXVsnYXNSZWFkb25seSddXHJcbiAgID47XHJcbiAgIHZhbHVlOiBSZXR1cm5UeXBlPFxyXG4gICAgICBSZXR1cm5UeXBlPHR5cGVvZiBidWlsZEZvcm1WYWx1ZVNpZ25hbDxUPj5bJ3ZhbHVlJCddWydhc1JlYWRvbmx5J11cclxuICAgPjtcclxuICAgcmF3VmFsdWU6IFJldHVyblR5cGU8XHJcbiAgICAgIFJldHVyblR5cGU8dHlwZW9mIGJ1aWxkRm9ybVZhbHVlU2lnbmFsPFQ+PlsncmF3VmFsdWUkJ11bJ2FzUmVhZG9ubHknXVxyXG4gICA+O1xyXG4gICB0b3VjaGVkOiBSZXR1cm5UeXBlPFxyXG4gICAgICBSZXR1cm5UeXBlPHR5cGVvZiBidWlsZEZvcm1Ub3VjaGVkU2lnbmFsPlsndG91Y2hlZCQnXVsnYXNSZWFkb25seSddXHJcbiAgID47XHJcbiAgIHVudG91Y2hlZDogUmV0dXJuVHlwZTx0eXBlb2YgYnVpbGRGb3JtVG91Y2hlZFNpZ25hbD5bJ3VudG91Y2hlZCQnXTtcclxuICAgZGlydHk6IFJldHVyblR5cGU8XHJcbiAgICAgIFJldHVyblR5cGU8dHlwZW9mIGJ1aWxkRm9ybURpcnR5U2lnbmFsPlsnZGlydHkkJ11bJ2FzUmVhZG9ubHknXVxyXG4gICA+O1xyXG4gICBwcmlzdGluZTogUmV0dXJuVHlwZTx0eXBlb2YgYnVpbGRGb3JtRGlydHlTaWduYWw+WydwcmlzdGluZSQnXTtcclxuICAgdmFsaWQ6IFJldHVyblR5cGU8dHlwZW9mIGJ1aWxkRm9ybVN0YXR1c1NpZ25hbD5bJ3ZhbGlkJCddO1xyXG4gICBpbnZhbGlkOiBSZXR1cm5UeXBlPHR5cGVvZiBidWlsZEZvcm1TdGF0dXNTaWduYWw+WydpbnZhbGlkJCddO1xyXG4gICBwZW5kaW5nOiBSZXR1cm5UeXBlPHR5cGVvZiBidWlsZEZvcm1TdGF0dXNTaWduYWw+WydwZW5kaW5nJCddO1xyXG4gICBkaXNhYmxlZDogUmV0dXJuVHlwZTx0eXBlb2YgYnVpbGRGb3JtU3RhdHVzU2lnbmFsPlsnZGlzYWJsZWQkJ107XHJcbiAgIGVuYWJsZWQ6IFJldHVyblR5cGU8dHlwZW9mIGJ1aWxkRm9ybVN0YXR1c1NpZ25hbD5bJ2VuYWJsZWQkJ107XHJcbiAgIGVycm9yczogUmV0dXJuVHlwZTx0eXBlb2YgYnVpbGRGb3JtRXJyb3JTaWduYWw+O1xyXG4gICBzdWJzY3JpcHRpb25zOiBGb3JtU2lnbmFsU3Vic2NyaXB0aW9uc1N0YXRlPFQ+O1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgRm9ybVNuYXBzaG90U2lnbmFsU3Vic2NyaXB0aW9uc1N0YXRlPFQgPSBhbnk+ID0ge1xyXG4gICBbeCBpbiBrZXlvZiBGb3JtU2lnbmFsU3Vic2NyaXB0aW9uc1N0YXRlPFQ+XTogUmV0dXJuVHlwZTxcclxuICAgICAgRm9ybVNpZ25hbFN1YnNjcmlwdGlvbnNTdGF0ZTxUPlt4XVxyXG4gICA+O1xyXG59O1xyXG5leHBvcnQgdHlwZSBGb3JtU25hcHNob3RTaWduYWxTdGF0ZTxUID0gYW55PiA9IHtcclxuICAgW3ggaW4ga2V5b2YgT21pdDxGb3JtU2lnbmFsU3RhdGU8VD4sICdzdWJzY3JpcHRpb25zJz5dOiBSZXR1cm5UeXBlPFxyXG4gICAgICBGb3JtU2lnbmFsU3RhdGU8VD5beF1cclxuICAgPjtcclxufSAmIHsgc3Vic2NyaXB0aW9uczogRm9ybVNuYXBzaG90U2lnbmFsU3Vic2NyaXB0aW9uc1N0YXRlPFQ+IH07XHJcblxyXG5leHBvcnQgdHlwZSBGb3JtU2lnbmFsPFQgPSBhbnk+ID0gRm9ybVNpZ25hbFN0YXRlPFQ+ICZcclxuICAgKCgpID0+IEZvcm1TbmFwc2hvdFNpZ25hbFN0YXRlPFQ+KTtcclxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWZvcm0tc2lnbmFsL3NyYy9saWIvdHlwZXMvZm9ybS10eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgIEZvcm1BcnJheSxcclxuICAgRm9ybUNvbnRyb2wsXHJcbiAgIEZvcm1Hcm91cCxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5leHBvcnQgdHlwZSBGb3JtRnJvbVR5cGU8VD4gPSBUIGV4dGVuZHMgeyBbSyBpbiBrZXlvZiBUXTogQWJzdHJhY3RDb250cm9sPGFueT4gfVxyXG4gICA/IEZvcm1Hcm91cDxUPlxyXG4gICA6IFQgZXh0ZW5kcyBBYnN0cmFjdENvbnRyb2w8YW55PlxyXG4gICAgID8gRm9ybUFycmF5PFQ+XHJcbiAgICAgOiBGb3JtQ29udHJvbDxUPjtcclxuXHJcbmV4cG9ydCB0eXBlIE9wdGlvbmFsRm9ybUZyb21UeXBlPFQgPSBhbnk+ID1cclxuICAgfCAoVCBleHRlbmRzIHsgW0sgaW4ga2V5b2YgVF06IEFic3RyYWN0Q29udHJvbDxhbnk+IH0gPyBGb3JtR3JvdXA8VD4gOiBuZXZlcilcclxuICAgfCBGb3JtQ29udHJvbDxUPlxyXG4gICB8IChUIGV4dGVuZHMgQWJzdHJhY3RDb250cm9sPGFueT4gPyBGb3JtQXJyYXk8VD4gOiBuZXZlcilcclxuICAgfCBudWxsO1xyXG4iXX0=
@@ -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,8 @@
1
+ /*
2
+ * Public API Surface of ngx-form-signal
3
+ */
4
+ export * from './lib/form-signal';
5
+ export * from './lib/types/form-signal-options';
6
+ export * from './lib/types/form-signal-type';
7
+ export * from './lib/types/form-type';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1mb3JtLXNpZ25hbC9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2Ygbmd4LWZvcm0tc2lnbmFsXHJcbiAqL1xyXG5cclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZm9ybS1zaWduYWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi90eXBlcy9mb3JtLXNpZ25hbC1vcHRpb25zJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvdHlwZXMvZm9ybS1zaWduYWwtdHlwZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3R5cGVzL2Zvcm0tdHlwZSc7XHJcbiJdfQ==
@@ -0,0 +1,209 @@
1
+ import { signal, effect, untracked, computed, isSignal, assertInInjectionContext } from '@angular/core';
2
+ import { PristineChangeEvent, TouchedChangeEvent } 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
+ const defaultFormSignalOptions = {};
159
+ function buildDefaultFormSignalOptions() {
160
+ return structuredClone(defaultFormSignalOptions);
161
+ }
162
+
163
+ function formSignal(form, options = buildDefaultFormSignalOptions()) {
164
+ const formAsSignal = isSignal(form) ? form : signal(form);
165
+ if (!options.injector) {
166
+ assertInInjectionContext(() => { });
167
+ }
168
+ const { value$, rawValue$, valueChangeSubscription$ } = buildFormValueSignal(formAsSignal, options);
169
+ const { status$, valid$, invalid$, pending$, disabled$, enabled$, statusChangeSubscription$, } = buildFormStatusSignal(formAsSignal, options);
170
+ const { touched$, untouched$, touchedChangeSubscription$ } = buildFormTouchedSignal(formAsSignal, options);
171
+ const { dirty$, pristine$, dirtyChangeSubscription$ } = buildFormDirtySignal(formAsSignal, options);
172
+ const errors$ = buildFormErrorSignal(formAsSignal, value$, status$, options);
173
+ const formSignals = {
174
+ status: status$.asReadonly(),
175
+ value: value$.asReadonly(),
176
+ rawValue: rawValue$.asReadonly(),
177
+ touched: touched$.asReadonly(),
178
+ untouched: untouched$,
179
+ dirty: dirty$.asReadonly(),
180
+ pristine: pristine$,
181
+ valid: valid$,
182
+ invalid: invalid$,
183
+ pending: pending$,
184
+ disabled: disabled$,
185
+ enabled: enabled$,
186
+ errors: errors$,
187
+ subscriptions: {
188
+ valueChangeSubscription: valueChangeSubscription$.asReadonly(),
189
+ statusChangeSubscription: statusChangeSubscription$.asReadonly(),
190
+ touchedChangeSubscription: touchedChangeSubscription$.asReadonly(),
191
+ dirtyChangeSubscription: dirtyChangeSubscription$.asReadonly(),
192
+ },
193
+ };
194
+ const snapshot$ = buildFormSnapshotSignal(formSignals);
195
+ const formSignalObj = (() => snapshot$());
196
+ Object.setPrototypeOf(formSignalObj, formSignals);
197
+ return formSignalObj;
198
+ }
199
+
200
+ /*
201
+ * Public API Surface of ngx-form-signal
202
+ */
203
+
204
+ /**
205
+ * Generated bundle index. Do not edit.
206
+ */
207
+
208
+ export { buildDefaultFormSignalOptions, defaultFormSignalOptions, formSignal };
209
+ //# sourceMappingURL=ngx-form-signal.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-form-signal.mjs","sources":["../../../projects/ngx-form-signal/src/lib/helpers/form-dirty-signal.ts","../../../projects/ngx-form-signal/src/lib/helpers/form-error-signal.ts","../../../projects/ngx-form-signal/src/lib/helpers/form-snapshot-signal.ts","../../../projects/ngx-form-signal/src/lib/helpers/form-status-signal.ts","../../../projects/ngx-form-signal/src/lib/helpers/form-touched-signal.ts","../../../projects/ngx-form-signal/src/lib/helpers/form-value-signal.ts","../../../projects/ngx-form-signal/src/lib/types/form-signal-options.ts","../../../projects/ngx-form-signal/src/lib/form-signal.ts","../../../projects/ngx-form-signal/src/public-api.ts","../../../projects/ngx-form-signal/src/ngx-form-signal.ts"],"sourcesContent":["import { computed, effect, Signal, signal, untracked } from '@angular/core';\r\nimport { PristineChangeEvent } from '@angular/forms';\r\nimport { filter, Subscription } from 'rxjs';\r\nimport { FormSignalOptions } from '../types/form-signal-options';\r\nimport { OptionalFormFromType } from '../types/form-type';\r\n\r\nexport function buildFormDirtySignal(\r\n formAsSignal: Signal<OptionalFormFromType<any>>,\r\n options: FormSignalOptions\r\n) {\r\n const dirty$ = signal<boolean>(!!formAsSignal()?.dirty, {\r\n equal: options.equalityFns?.dirtyEquality,\r\n });\r\n const dirtyChangeSubscription$ = signal<Subscription | null>(null);\r\n\r\n const formDirtyChangeEffect = effect(\r\n (onCleanup: Function) => {\r\n const form = formAsSignal();\r\n untracked(() => {\r\n const setDirty = () => {\r\n untracked(() => {\r\n dirty$.set(!!form?.dirty);\r\n });\r\n };\r\n\r\n dirtyChangeSubscription$()?.unsubscribe();\r\n dirtyChangeSubscription$.set(\r\n form?.events\r\n .pipe(filter((e) => e instanceof PristineChangeEvent))\r\n .subscribe((e) => {\r\n setDirty();\r\n }) ?? null\r\n );\r\n setDirty();\r\n });\r\n onCleanup(\r\n () => untracked(() => dirtyChangeSubscription$())?.unsubscribe()\r\n );\r\n },\r\n { injector: options.injector }\r\n );\r\n\r\n const pristine$ = computed(() => !dirty$());\r\n\r\n return { dirty$, pristine$, dirtyChangeSubscription$ };\r\n}\r\n","import {\r\n Signal,\r\n WritableSignal,\r\n computed,\r\n isSignal,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormControlStatus } from '@angular/forms';\r\nimport { FormSignalOptions } from '../types/form-signal-options';\r\nimport { FormFromType, OptionalFormFromType } from '../types/form-type';\r\n\r\nexport function buildFormErrorSignal<T = any>(\r\n form: Signal<OptionalFormFromType<T>> | OptionalFormFromType<T>,\r\n valueSignal: WritableSignal<FormFromType<T>['value'] | null>,\r\n statusSignal: WritableSignal<FormControlStatus | null>,\r\n options: FormSignalOptions<T>\r\n) {\r\n const formAsSignal = isSignal(form) ? form : signal(form);\r\n\r\n return computed(\r\n () => {\r\n const v = valueSignal();\r\n const s = statusSignal();\r\n return formAsSignal()?.errors ?? null;\r\n },\r\n { equal: options.equalityFns?.errorsEquality }\r\n );\r\n}\r\n","import { computed } from '@angular/core';\r\nimport {\r\n FormSignalState,\r\n FormSnapshotSignalState,\r\n} from '../types/form-signal-type';\r\n\r\nexport function buildFormSnapshotSignal<T = any>(\r\n formSignalState: FormSignalState<T>\r\n) {\r\n return computed<FormSnapshotSignalState<T>>(() => {\r\n return {\r\n status: formSignalState.status(),\r\n value: formSignalState.value(),\r\n rawValue: formSignalState.rawValue(),\r\n touched: formSignalState.touched(),\r\n untouched: formSignalState.untouched(),\r\n dirty: formSignalState.dirty(),\r\n pristine: formSignalState.pristine(),\r\n valid: formSignalState.valid(),\r\n invalid: formSignalState.invalid(),\r\n pending: formSignalState.pending(),\r\n disabled: formSignalState.disabled(),\r\n enabled: formSignalState.enabled(),\r\n errors: formSignalState.errors(),\r\n subscriptions: {\r\n valueChangeSubscription:\r\n formSignalState.subscriptions.valueChangeSubscription(),\r\n statusChangeSubscription:\r\n formSignalState.subscriptions.statusChangeSubscription(),\r\n touchedChangeSubscription:\r\n formSignalState.subscriptions.touchedChangeSubscription(),\r\n dirtyChangeSubscription:\r\n formSignalState.subscriptions.dirtyChangeSubscription(),\r\n },\r\n };\r\n });\r\n}\r\n","import { computed, effect, Signal, signal, untracked } from '@angular/core';\r\nimport { FormControlStatus } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { FormSignalOptions } from '../types/form-signal-options';\r\nimport { OptionalFormFromType } from '../types/form-type';\r\n\r\nexport function buildFormStatusSignal<T = any>(\r\n formAsSignal: Signal<OptionalFormFromType<T>>,\r\n options: FormSignalOptions<T>\r\n) {\r\n const equal = options.equalityFns?.statusEquality ?? (() => false);\r\n const status$ = signal<FormControlStatus | null>(\r\n formAsSignal()?.status ?? null,\r\n { equal }\r\n );\r\n const statusChangeSubscription$ = signal<Subscription | null>(null);\r\n const formStatusChangeEffect = effect(\r\n (onCleanup: Function) => {\r\n const form = formAsSignal();\r\n untracked(() => {\r\n const setStatus = () => {\r\n untracked(() => {\r\n status$.set(form?.status ?? null);\r\n });\r\n };\r\n\r\n statusChangeSubscription$()?.unsubscribe();\r\n statusChangeSubscription$.set(\r\n form?.statusChanges.subscribe(() => {\r\n setStatus();\r\n }) ?? null\r\n );\r\n setStatus();\r\n });\r\n onCleanup(\r\n () => untracked(() => statusChangeSubscription$())?.unsubscribe()\r\n );\r\n },\r\n { injector: options.injector }\r\n );\r\n\r\n const valid$ = computed(() => status$() === 'VALID');\r\n const invalid$ = computed(() => status$() === 'INVALID');\r\n const pending$ = computed(() => status$() == 'PENDING');\r\n const disabled$ = computed(() => status$() === 'DISABLED');\r\n const enabled$ = computed(() => status$() !== 'DISABLED');\r\n\r\n return {\r\n status$,\r\n valid$,\r\n invalid$,\r\n pending$,\r\n disabled$,\r\n enabled$,\r\n statusChangeSubscription$,\r\n };\r\n}\r\n","import { computed, effect, Signal, signal, untracked } from '@angular/core';\r\nimport { TouchedChangeEvent } from '@angular/forms';\r\nimport { filter, Subscription } from 'rxjs';\r\nimport { FormSignalOptions } from '../types/form-signal-options';\r\nimport { OptionalFormFromType } from '../types/form-type';\r\n\r\nexport function buildFormTouchedSignal(\r\n formAsSignal: Signal<OptionalFormFromType<any>>,\r\n options: FormSignalOptions\r\n) {\r\n const touched$ = signal<boolean>(!!formAsSignal()?.touched, {\r\n equal: options.equalityFns?.touchedEquality,\r\n });\r\n const touchedChangeSubscription$ = signal<Subscription | null>(null);\r\n\r\n const formTouchedChangeEffect = effect(\r\n (onCleanup: Function) => {\r\n const form = formAsSignal();\r\n untracked(() => {\r\n const setTouched = () => {\r\n untracked(() => {\r\n touched$.set(!!form?.touched);\r\n });\r\n };\r\n\r\n touchedChangeSubscription$()?.unsubscribe();\r\n touchedChangeSubscription$.set(\r\n form?.events\r\n .pipe(filter((e) => e instanceof TouchedChangeEvent))\r\n .subscribe((e) => {\r\n setTouched();\r\n }) ?? null\r\n );\r\n setTouched();\r\n });\r\n onCleanup(\r\n () => untracked(() => touchedChangeSubscription$())?.unsubscribe()\r\n );\r\n },\r\n { injector: options.injector }\r\n );\r\n\r\n const untouched$ = computed(() => !touched$(), {\r\n equal: options.equalityFns?.touchedEquality,\r\n });\r\n\r\n return { touched$, untouched$, touchedChangeSubscription$ };\r\n}\r\n","import { effect, Signal, signal, untracked } from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { FormSignalOptions } from '../types/form-signal-options';\r\nimport { FormFromType, OptionalFormFromType } from '../types/form-type';\r\n\r\nexport function buildFormValueSignal<T = any>(\r\n formAsSignal: Signal<OptionalFormFromType<T>>,\r\n options: FormSignalOptions<T>\r\n) {\r\n const value$ = signal<FormFromType<T>['value'] | null>(\r\n formAsSignal()?.value ?? null,\r\n { equal: options.equalityFns?.valueEquality ?? (() => false) }\r\n );\r\n const rawValue$ = signal<FormFromType<T>['value'] | null>(\r\n formAsSignal()?.getRawValue() ?? null,\r\n {\r\n equal: options.equalityFns?.valueEquality ?? (() => false),\r\n }\r\n );\r\n const valueChangeSubscription$ = signal<Subscription | null>(null);\r\n const formValueChangeEffect = effect(\r\n (onCleanup: Function) => {\r\n const form = formAsSignal() as AbstractControl<T> | null;\r\n untracked(() => {\r\n const setValue = () => {\r\n untracked(() => {\r\n value$.set(form?.value ?? null);\r\n rawValue$.set(form?.getRawValue() ?? null);\r\n });\r\n };\r\n\r\n valueChangeSubscription$()?.unsubscribe();\r\n valueChangeSubscription$.set(\r\n form?.valueChanges.subscribe(() => {\r\n setValue();\r\n }) ?? null\r\n );\r\n setValue();\r\n });\r\n onCleanup(\r\n () => untracked(() => valueChangeSubscription$())?.unsubscribe()\r\n );\r\n },\r\n { injector: options.injector }\r\n );\r\n return { value$, rawValue$, valueChangeSubscription$ };\r\n}\r\n","import { Injector, ValueEqualityFn } from '@angular/core';\r\nimport { FormControlStatus, ValidationErrors } from '@angular/forms';\r\nimport { FormFromType } from './form-type';\r\n\r\nexport type FormSignalEqualityOptions<T = any> = {\r\n dirtyEquality: ValueEqualityFn<boolean>;\r\n touchedEquality: ValueEqualityFn<boolean>;\r\n valueEquality: ValueEqualityFn<FormFromType<T>['value'] | null>;\r\n statusEquality: ValueEqualityFn<FormControlStatus | null>;\r\n errorsEquality: ValueEqualityFn<ValidationErrors | null>;\r\n};\r\nexport type FormSignalOptions<T = any> = {\r\n injector?: Injector;\r\n equalityFns?: Partial<FormSignalEqualityOptions<T>>;\r\n};\r\n\r\nexport const defaultFormSignalOptions: FormSignalOptions = {};\r\nexport function buildDefaultFormSignalOptions<T = any>(): FormSignalOptions<T> {\r\n return structuredClone(defaultFormSignalOptions);\r\n}\r\n","import {\r\n assertInInjectionContext,\r\n isSignal,\r\n Signal,\r\n signal,\r\n} from '@angular/core';\r\nimport { buildFormDirtySignal } from './helpers/form-dirty-signal';\r\nimport { buildFormErrorSignal } from './helpers/form-error-signal';\r\nimport { buildFormSnapshotSignal } from './helpers/form-snapshot-signal';\r\nimport { buildFormStatusSignal } from './helpers/form-status-signal';\r\nimport { buildFormTouchedSignal } from './helpers/form-touched-signal';\r\nimport { buildFormValueSignal } from './helpers/form-value-signal';\r\nimport {\r\n buildDefaultFormSignalOptions,\r\n FormSignalOptions,\r\n} from './types/form-signal-options';\r\nimport { FormSignal, FormSignalState } from './types/form-signal-type';\r\nimport { OptionalFormFromType } from './types/form-type';\r\n\r\nexport function formSignal<T = any>(\r\n form: Signal<OptionalFormFromType<T>> | OptionalFormFromType<T>,\r\n options: FormSignalOptions = buildDefaultFormSignalOptions<T>()\r\n): FormSignal<T> {\r\n const formAsSignal = isSignal(form) ? form : signal(form);\r\n if (!options.injector) {\r\n assertInInjectionContext(() => {});\r\n }\r\n const { value$, rawValue$, valueChangeSubscription$ } =\r\n buildFormValueSignal<T>(formAsSignal, options);\r\n const {\r\n status$,\r\n valid$,\r\n invalid$,\r\n pending$,\r\n disabled$,\r\n enabled$,\r\n statusChangeSubscription$,\r\n } = buildFormStatusSignal<T>(formAsSignal, options);\r\n const { touched$, untouched$, touchedChangeSubscription$ } =\r\n buildFormTouchedSignal(formAsSignal, options);\r\n const { dirty$, pristine$, dirtyChangeSubscription$ } = buildFormDirtySignal(\r\n formAsSignal,\r\n options\r\n );\r\n const errors$ = buildFormErrorSignal(formAsSignal, value$, status$, options);\r\n\r\n const formSignals: FormSignalState<T> = {\r\n status: status$.asReadonly(),\r\n value: value$.asReadonly(),\r\n rawValue: rawValue$.asReadonly(),\r\n touched: touched$.asReadonly(),\r\n untouched: untouched$,\r\n dirty: dirty$.asReadonly(),\r\n pristine: pristine$,\r\n valid: valid$,\r\n invalid: invalid$,\r\n pending: pending$,\r\n disabled: disabled$,\r\n enabled: enabled$,\r\n errors: errors$,\r\n subscriptions: {\r\n valueChangeSubscription: valueChangeSubscription$.asReadonly(),\r\n statusChangeSubscription: statusChangeSubscription$.asReadonly(),\r\n touchedChangeSubscription: touchedChangeSubscription$.asReadonly(),\r\n dirtyChangeSubscription: dirtyChangeSubscription$.asReadonly(),\r\n },\r\n };\r\n\r\n const snapshot$ = buildFormSnapshotSignal(formSignals);\r\n const formSignalObj = (() => snapshot$()) as FormSignal<T>;\r\n\r\n Object.setPrototypeOf(formSignalObj, formSignals);\r\n\r\n return formSignalObj;\r\n}\r\n","/*\r\n * Public API Surface of ngx-form-signal\r\n */\r\n\r\nexport * from './lib/form-signal';\r\nexport * from './lib/types/form-signal-options';\r\nexport * from './lib/types/form-signal-type';\r\nexport * from './lib/types/form-type';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="ngx-form-signal" />
5
+ export * from './public-api';
@@ -0,0 +1,5 @@
1
+ import { Signal } from '@angular/core';
2
+ import { FormSignalOptions } from './types/form-signal-options';
3
+ import { FormSignal } from './types/form-signal-type';
4
+ import { OptionalFormFromType } from './types/form-type';
5
+ export declare function formSignal<T = any>(form: Signal<OptionalFormFromType<T>> | OptionalFormFromType<T>, options?: FormSignalOptions): FormSignal<T>;