@signaltree/ng-forms 3.0.2 → 4.0.2

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.
package/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
- import { WritableSignal, Signal, OnInit, EventEmitter } from '@angular/core';
3
- import { ControlValueAccessor } from '@angular/forms';
2
+ import { WritableSignal, DestroyRef, Signal, OnInit, EventEmitter } from '@angular/core';
3
+ import { FormGroup, AbstractControl, FormArray, ControlValueAccessor } from '@angular/forms';
4
4
  import { Observable } from 'rxjs';
5
- import { TreeNode, SignalTree, TreeConfig, Middleware } from '@signaltree/core';
5
+ import { TreeConfig, TreeNode, SignalTree } from '@signaltree/core';
6
6
 
7
- type AsyncValidatorFn<T> = (value: T) => Observable<string | null> | Promise<string | null>;
7
+ type FormTreeAsyncValidatorFn<T> = (value: T) => Observable<string | null> | Promise<string | null>;
8
8
  type EnhancedArraySignal<T> = WritableSignal<T[]> & {
9
9
  push: (item: T) => void;
10
10
  removeAt: (index: number) => void;
@@ -13,9 +13,31 @@ type EnhancedArraySignal<T> = WritableSignal<T[]> & {
13
13
  move: (from: number, to: number) => void;
14
14
  clear: () => void;
15
15
  };
16
- type FormTree<T extends Record<string, unknown>> = {
16
+ type FieldValidator = (value: unknown) => string | null;
17
+ interface FieldConfig {
18
+ debounceMs?: number;
19
+ validators?: Record<string, FieldValidator> | FieldValidator[];
20
+ asyncValidators?: Record<string, FormTreeAsyncValidatorFn<unknown>> | Array<FormTreeAsyncValidatorFn<unknown>>;
21
+ }
22
+ interface ConditionalField<T> {
23
+ when: (values: T) => boolean;
24
+ fields: string[];
25
+ }
26
+ interface FormTreeOptions<T extends Record<string, unknown>> extends TreeConfig {
27
+ validators?: SyncValidatorMap;
28
+ asyncValidators?: AsyncValidatorMap;
29
+ destroyRef?: DestroyRef;
30
+ fieldConfigs?: Record<string, FieldConfig>;
31
+ conditionals?: Array<ConditionalField<T>>;
32
+ persistKey?: string;
33
+ storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;
34
+ persistDebounceMs?: number;
35
+ validationBatchMs?: number;
36
+ }
37
+ type FormTree$1<T extends Record<string, unknown>> = {
17
38
  state: TreeNode<T>;
18
39
  $: TreeNode<T>;
40
+ form: FormGroup;
19
41
  errors: WritableSignal<Record<string, string>>;
20
42
  asyncErrors: WritableSignal<Record<string, string>>;
21
43
  touched: WritableSignal<Record<string, boolean>>;
@@ -37,11 +59,20 @@ type FormTree<T extends Record<string, unknown>> = {
37
59
  fieldErrors: Record<string, Signal<string | undefined>>;
38
60
  fieldAsyncErrors: Record<string, Signal<string | undefined>>;
39
61
  values: SignalTree<T>;
62
+ destroy(): void;
40
63
  };
41
- declare function createFormTree<T extends Record<string, unknown>>(initialValues: T, config?: {
42
- validators?: Record<string, (value: unknown) => string | null>;
43
- asyncValidators?: Record<string, AsyncValidatorFn<unknown>>;
44
- } & TreeConfig): FormTree<T>;
64
+ declare class FormValidationError extends Error {
65
+ readonly errors: Record<string, string>;
66
+ readonly asyncErrors: Record<string, string>;
67
+ constructor(errors: Record<string, string>, asyncErrors: Record<string, string>);
68
+ }
69
+ type SyncValidatorMap = Record<string, (value: unknown) => string | null>;
70
+ type AsyncValidatorMap = Record<string, FormTreeAsyncValidatorFn<unknown>>;
71
+ declare function createFormTree<T extends Record<string, unknown>>(initialValues: T, config?: FormTreeOptions<T>): FormTree$1<T>;
72
+ declare function createVirtualFormArray<T>(items: T[], visibleRange: {
73
+ start: number;
74
+ end: number;
75
+ }, controlFactory?: (value: T, index: number) => AbstractControl): FormArray;
45
76
  declare class SignalValueDirective implements ControlValueAccessor, OnInit {
46
77
  signalTreeSignalValue: WritableSignal<unknown>;
47
78
  signalTreeSignalValueChange: EventEmitter<unknown>;
@@ -59,27 +90,39 @@ declare class SignalValueDirective implements ControlValueAccessor, OnInit {
59
90
  static ɵfac: i0.ɵɵFactoryDeclaration<SignalValueDirective, never>;
60
91
  static ɵdir: i0.ɵɵDirectiveDeclaration<SignalValueDirective, "[signalTreeSignalValue]", never, { "signalTreeSignalValue": { "alias": "signalTreeSignalValue"; "required": false; }; }, { "signalTreeSignalValueChange": "signalTreeSignalValueChange"; }, never, never, true, never>;
61
92
  }
62
- declare const validators: {
63
- required: (message?: string) => (value: unknown) => string | null;
64
- email: (message?: string) => (value: unknown) => string | null;
65
- minLength: (min: number) => (value: unknown) => string | null;
66
- pattern: (regex: RegExp, message?: string) => (value: unknown) => string | null;
67
- };
68
- declare const asyncValidators: {
69
- unique: (checkFn: (value: unknown) => Promise<boolean>, message?: string) => (value: unknown) => Promise<string | null>;
70
- };
71
- declare function toObservable<T>(signal: Signal<T>): Observable<T>;
72
- interface AuditEntry<T = unknown> {
73
- timestamp: number;
74
- changes: Partial<T>;
75
- metadata?: {
76
- userId?: string;
77
- source?: string;
78
- description?: string;
79
- };
80
- }
81
- declare function createAuditMiddleware<T>(auditLog: AuditEntry<T>[], getMetadata?: () => AuditEntry<T>['metadata']): Middleware<T>;
82
93
  declare const SIGNAL_FORM_DIRECTIVES: (typeof SignalValueDirective)[];
83
94
 
84
- export { SIGNAL_FORM_DIRECTIVES, SignalValueDirective, asyncValidators, createAuditMiddleware, createFormTree, toObservable, validators };
85
- export type { AsyncValidatorFn, AuditEntry, EnhancedArraySignal, FormTree };
95
+ declare function required(message?: string): FieldValidator;
96
+ declare function email(message?: string): FieldValidator;
97
+ declare function minLength(min: number, message?: string): FieldValidator;
98
+ declare function maxLength(max: number, message?: string): FieldValidator;
99
+ declare function pattern(regex: RegExp, message?: string): FieldValidator;
100
+ declare function min(min: number, message?: string): FieldValidator;
101
+ declare function max(max: number, message?: string): FieldValidator;
102
+ declare function compose(validators: FieldValidator[]): FieldValidator;
103
+
104
+ declare function unique(checkFn: (value: unknown) => Promise<boolean>, message?: string): FormTreeAsyncValidatorFn<unknown>;
105
+ declare function debounce(validator: FormTreeAsyncValidatorFn<unknown>, delayMs: number): FormTreeAsyncValidatorFn<unknown>;
106
+
107
+ interface FormTree<T extends Record<string, unknown>> {
108
+ form: any;
109
+ unwrap(): T;
110
+ destroy(): void;
111
+ setValues(values: Partial<T>): void;
112
+ }
113
+ interface FormHistory<T> {
114
+ past: T[];
115
+ present: T;
116
+ future: T[];
117
+ }
118
+ declare function withFormHistory<T extends Record<string, unknown>>(formTree: FormTree<T>, options?: {
119
+ capacity?: number;
120
+ }): FormTree<T> & {
121
+ undo: () => void;
122
+ redo: () => void;
123
+ clearHistory: () => void;
124
+ history: Signal<FormHistory<T>>;
125
+ };
126
+
127
+ export { FormValidationError, SIGNAL_FORM_DIRECTIVES, SignalValueDirective, compose, createFormTree, createVirtualFormArray, debounce, email, max, maxLength, min, minLength, pattern, required, unique, withFormHistory };
128
+ export type { ConditionalField, EnhancedArraySignal, FieldConfig, FieldValidator, FormHistory, FormTree$1 as FormTree, FormTreeAsyncValidatorFn, FormTreeOptions };
package/package.json CHANGED
@@ -1,13 +1,17 @@
1
1
  {
2
2
  "name": "@signaltree/ng-forms",
3
- "version": "3.0.2",
3
+ "version": "4.0.2",
4
4
  "description": "Complete Angular forms integration for SignalTree. FormTree creation, custom directives, validators, form state tracking, and RxJS bridge.",
5
5
  "peerDependencies": {
6
- "@angular/core": "^20.1.0",
7
- "@angular/forms": "^20.1.0",
8
- "@signaltree/core": "^3.0.0",
6
+ "@angular/core": "^20.3.0",
7
+ "@angular/forms": "^20.3.0",
8
+ "@signaltree/core": "^4.0.0",
9
9
  "rxjs": "^7.0.0"
10
10
  },
11
+ "dependencies": {
12
+ "@signaltree/shared": "workspace:*",
13
+ "tslib": "^2.3.0"
14
+ },
11
15
  "sideEffects": false,
12
16
  "module": "fesm2022/signaltree-ng-forms.mjs",
13
17
  "typings": "index.d.ts",
@@ -18,9 +22,18 @@
18
22
  ".": {
19
23
  "types": "./index.d.ts",
20
24
  "default": "./fesm2022/signaltree-ng-forms.mjs"
25
+ },
26
+ "./src/audit": {
27
+ "types": "./src/audit/index.d.ts",
28
+ "default": "./fesm2022/signaltree-ng-forms-src-audit.mjs"
29
+ },
30
+ "./src/rxjs": {
31
+ "types": "./src/rxjs/index.d.ts",
32
+ "default": "./fesm2022/signaltree-ng-forms-src-rxjs.mjs"
33
+ },
34
+ "./src/history": {
35
+ "types": "./src/history/index.d.ts",
36
+ "default": "./fesm2022/signaltree-ng-forms-src-history.mjs"
21
37
  }
22
- },
23
- "dependencies": {
24
- "tslib": "^2.3.0"
25
38
  }
26
39
  }
@@ -0,0 +1,15 @@
1
+ import { Middleware } from '@signaltree/core';
2
+
3
+ interface AuditEntry<T = unknown> {
4
+ timestamp: number;
5
+ changes: Partial<T>;
6
+ metadata?: {
7
+ userId?: string;
8
+ source?: string;
9
+ description?: string;
10
+ };
11
+ }
12
+ declare function createAuditMiddleware<T>(auditLog: AuditEntry<T>[], getMetadata?: () => AuditEntry<T>['metadata']): Middleware<T>;
13
+
14
+ export { createAuditMiddleware };
15
+ export type { AuditEntry };
@@ -0,0 +1,24 @@
1
+ import { Signal } from '@angular/core';
2
+
3
+ interface FormTree<T extends Record<string, unknown>> {
4
+ form: any;
5
+ unwrap(): T;
6
+ destroy(): void;
7
+ setValues(values: Partial<T>): void;
8
+ }
9
+ interface FormHistory<T> {
10
+ past: T[];
11
+ present: T;
12
+ future: T[];
13
+ }
14
+ declare function withFormHistory<T extends Record<string, unknown>>(formTree: FormTree<T>, options?: {
15
+ capacity?: number;
16
+ }): FormTree<T> & {
17
+ undo: () => void;
18
+ redo: () => void;
19
+ clearHistory: () => void;
20
+ history: Signal<FormHistory<T>>;
21
+ };
22
+
23
+ export { withFormHistory };
24
+ export type { FormHistory };
@@ -0,0 +1,6 @@
1
+ import { Signal } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+
4
+ declare function toObservable<T>(signal: Signal<T>): Observable<T>;
5
+
6
+ export { toObservable };