@lehnihon/bit-form 1.0.0

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 (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/angular/index.cjs +2 -0
  4. package/dist/angular/index.cjs.map +1 -0
  5. package/dist/angular/index.d.cts +115 -0
  6. package/dist/angular/index.d.ts +115 -0
  7. package/dist/angular/index.js +2 -0
  8. package/dist/angular/index.js.map +1 -0
  9. package/dist/bus-DAwKIiMY.d.cts +233 -0
  10. package/dist/bus-DAwKIiMY.d.ts +233 -0
  11. package/dist/chunk-32ZEDTLP.js +2 -0
  12. package/dist/chunk-32ZEDTLP.js.map +1 -0
  13. package/dist/chunk-FOPOA6NB.cjs +133 -0
  14. package/dist/chunk-FOPOA6NB.cjs.map +1 -0
  15. package/dist/chunk-XIDR3J47.cjs +2 -0
  16. package/dist/chunk-XIDR3J47.cjs.map +1 -0
  17. package/dist/chunk-ZI3XHI4I.js +133 -0
  18. package/dist/chunk-ZI3XHI4I.js.map +1 -0
  19. package/dist/cli/index.cjs +105 -0
  20. package/dist/devtools/bridge.cjs +2 -0
  21. package/dist/devtools/bridge.cjs.map +1 -0
  22. package/dist/devtools/bridge.d.cts +3 -0
  23. package/dist/devtools/bridge.d.ts +3 -0
  24. package/dist/devtools/bridge.js +2 -0
  25. package/dist/devtools/bridge.js.map +1 -0
  26. package/dist/devtools/index.cjs +2 -0
  27. package/dist/devtools/index.cjs.map +1 -0
  28. package/dist/devtools/index.d.cts +14 -0
  29. package/dist/devtools/index.d.ts +14 -0
  30. package/dist/devtools/index.js +2 -0
  31. package/dist/devtools/index.js.map +1 -0
  32. package/dist/index-CmwQH2V1.d.cts +108 -0
  33. package/dist/index-DRvn8318.d.ts +108 -0
  34. package/dist/index.cjs +2 -0
  35. package/dist/index.cjs.map +1 -0
  36. package/dist/index.d.cts +119 -0
  37. package/dist/index.d.ts +119 -0
  38. package/dist/index.js +2 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/react/index.cjs +2 -0
  41. package/dist/react/index.cjs.map +1 -0
  42. package/dist/react/index.d.cts +34 -0
  43. package/dist/react/index.d.ts +34 -0
  44. package/dist/react/index.js +2 -0
  45. package/dist/react/index.js.map +1 -0
  46. package/dist/react-native/index.cjs +2 -0
  47. package/dist/react-native/index.cjs.map +1 -0
  48. package/dist/react-native/index.d.cts +27 -0
  49. package/dist/react-native/index.d.ts +27 -0
  50. package/dist/react-native/index.js +2 -0
  51. package/dist/react-native/index.js.map +1 -0
  52. package/dist/resolvers/joi.cjs +2 -0
  53. package/dist/resolvers/joi.cjs.map +1 -0
  54. package/dist/resolvers/joi.d.cts +8 -0
  55. package/dist/resolvers/joi.d.ts +8 -0
  56. package/dist/resolvers/joi.js +2 -0
  57. package/dist/resolvers/joi.js.map +1 -0
  58. package/dist/resolvers/yup.cjs +2 -0
  59. package/dist/resolvers/yup.cjs.map +1 -0
  60. package/dist/resolvers/yup.d.cts +8 -0
  61. package/dist/resolvers/yup.d.ts +8 -0
  62. package/dist/resolvers/yup.js +2 -0
  63. package/dist/resolvers/yup.js.map +1 -0
  64. package/dist/resolvers/zod.cjs +2 -0
  65. package/dist/resolvers/zod.cjs.map +1 -0
  66. package/dist/resolvers/zod.d.cts +8 -0
  67. package/dist/resolvers/zod.d.ts +8 -0
  68. package/dist/resolvers/zod.js +2 -0
  69. package/dist/resolvers/zod.js.map +1 -0
  70. package/dist/use-bit-watch-BMCwKIYx.d.cts +99 -0
  71. package/dist/use-bit-watch-BujTdIMc.d.ts +99 -0
  72. package/dist/vue/index.cjs +2 -0
  73. package/dist/vue/index.cjs.map +1 -0
  74. package/dist/vue/index.d.cts +122 -0
  75. package/dist/vue/index.d.ts +122 -0
  76. package/dist/vue/index.js +2 -0
  77. package/dist/vue/index.js.map +1 -0
  78. package/package.json +160 -0
@@ -0,0 +1,233 @@
1
+ interface BitMask {
2
+ format: (value: any) => string;
3
+ parse: (value: string) => any;
4
+ }
5
+ interface PatternMaskOptions {
6
+ allowChars?: string;
7
+ customParse?: (value: string) => any;
8
+ saveRaw?: boolean;
9
+ guide?: boolean;
10
+ placeholderChar?: string;
11
+ }
12
+ interface CurrencyMaskConfig {
13
+ prefix?: string;
14
+ suffix?: string;
15
+ thousand: string;
16
+ decimal: string;
17
+ precision?: number;
18
+ allowNegative?: boolean;
19
+ saveRaw?: boolean;
20
+ }
21
+ interface DateMaskConfig extends PatternMaskOptions {
22
+ format?: "DD/MM/YYYY" | "YYYY-MM-DD";
23
+ }
24
+
25
+ declare class BitDependencyManager<T extends object = any> {
26
+ fieldConfigs: Map<string, BitFieldDefinition<T>>;
27
+ dependencies: Map<string, Set<string>>;
28
+ hiddenFields: Set<string>;
29
+ register(path: string, config: BitFieldDefinition<T>, currentValues: T): void;
30
+ isHidden(path: string): boolean;
31
+ isRequired(path: string, values: T): boolean;
32
+ getRequiredErrors(values: T, defaultMessage?: string): Record<string, string>;
33
+ evaluateAll(values: T): void;
34
+ updateDependencies(changedPath: string, newValues: T): string[];
35
+ unregister(path: string): void;
36
+ unregisterPrefix(prefix: string): void;
37
+ private evaluateFieldCondition;
38
+ private isEmpty;
39
+ }
40
+
41
+ declare class BitHistoryManager<T extends object = any> {
42
+ private enableHistory;
43
+ private maxHistory;
44
+ private history;
45
+ private historyIndex;
46
+ constructor(enableHistory: boolean, maxHistory?: number);
47
+ saveSnapshot(values: T): void;
48
+ get canUndo(): boolean;
49
+ get canRedo(): boolean;
50
+ undo(): T | null;
51
+ redo(): T | null;
52
+ reset(initialValues: T): void;
53
+ }
54
+
55
+ declare class BitValidationManager<T extends object> {
56
+ private store;
57
+ private validationTimeout?;
58
+ private currentValidationId;
59
+ private asyncTimers;
60
+ private asyncRequests;
61
+ asyncErrors: Record<string, string>;
62
+ constructor(store: BitValidationAdapter<T>);
63
+ handleAsync(path: string, value: any): void;
64
+ trigger(scopeFields?: string[]): void;
65
+ validate(options?: {
66
+ scope?: string;
67
+ scopeFields?: string[];
68
+ }): Promise<boolean>;
69
+ clear(path: string): void;
70
+ cancelAll(): void;
71
+ }
72
+
73
+ type BitErrors<T> = {
74
+ [key: string]: string | undefined;
75
+ };
76
+ type BitTouched<T> = {
77
+ [key: string]: boolean | undefined;
78
+ };
79
+ type BitComputedFn<T> = (values: T) => any;
80
+ type BitTransformFn<T> = (value: any, allValues: T) => any;
81
+ interface BitState<T> {
82
+ values: T;
83
+ errors: BitErrors<T>;
84
+ touched: BitTouched<T>;
85
+ isValidating: Record<string, boolean>;
86
+ isValid: boolean;
87
+ isSubmitting: boolean;
88
+ isDirty: boolean;
89
+ }
90
+ type ValidatorFn<T> = (values: T, options?: {
91
+ scopeFields?: string[];
92
+ }) => Promise<BitErrors<T>> | BitErrors<T>;
93
+ /** Conditional logic: visibility and dynamic required. */
94
+ interface BitFieldConditional<T extends object = any> {
95
+ dependsOn?: string[];
96
+ showIf?: (values: T) => boolean;
97
+ requiredIf?: (values: T) => boolean;
98
+ }
99
+ /** Field-level validation: async and required message. */
100
+ interface BitFieldValidation<T extends object = any> {
101
+ /** Custom message when field is required but empty. Falls back to defaultRequiredMessage or "Este campo é obrigatório". */
102
+ requiredMessage?: string;
103
+ asyncValidate?: (value: any, values: T) => Promise<string | null | undefined>;
104
+ asyncValidateDelay?: number;
105
+ }
106
+ /** Full field definition: conditional, validation, transform, computed, mask, scope. */
107
+ interface BitFieldDefinition<T extends object = any> {
108
+ conditional?: BitFieldConditional<T>;
109
+ validation?: BitFieldValidation<T>;
110
+ transform?: BitTransformFn<T>;
111
+ computed?: BitComputedFn<T>;
112
+ /** Mask name (from registry) or BitMask instance. */
113
+ mask?: BitMask | string;
114
+ /** Scope name (e.g. wizard step). */
115
+ scope?: string;
116
+ }
117
+ interface DevToolsOptions {
118
+ enabled?: boolean;
119
+ mode?: "local" | "remote";
120
+ url?: string;
121
+ }
122
+ /** Validation config. */
123
+ interface BitValidationConfig<T> {
124
+ resolver?: ValidatorFn<T>;
125
+ delay?: number;
126
+ defaultRequiredMessage?: string;
127
+ }
128
+ /** History config. */
129
+ interface BitHistoryConfig {
130
+ enabled?: boolean;
131
+ limit?: number;
132
+ }
133
+ /**
134
+ * BitConfig - store configuration.
135
+ * @see CHANGELOG for migration from features to fields in 2.0.
136
+ */
137
+ interface BitConfig<T extends object = any> {
138
+ /** Core */
139
+ name?: string;
140
+ initialValues?: T;
141
+ /** Central field config: conditional, validation, transform, computed, mask, scope. */
142
+ fields?: Record<string, BitFieldDefinition<T>>;
143
+ /** Schema-level validation */
144
+ validation?: BitValidationConfig<T>;
145
+ /** History (undo/redo) */
146
+ history?: BitHistoryConfig;
147
+ /** DevTools */
148
+ devTools?: boolean | DevToolsOptions;
149
+ }
150
+ /** Internal config produced by normalizeConfig from BitConfig. */
151
+ interface BitResolvedConfig<T extends object> {
152
+ name?: string;
153
+ initialValues: T;
154
+ resolver?: ValidatorFn<T>;
155
+ validationDelay: number;
156
+ defaultRequiredMessage?: string;
157
+ enableHistory: boolean;
158
+ historyLimit: number;
159
+ /** Derived from fields where field.computed exists. */
160
+ computed?: Record<string, BitComputedFn<T>>;
161
+ /** Derived from fields where field.transform exists. */
162
+ transform?: Partial<Record<string, BitTransformFn<T>>>;
163
+ /** Derived from fields where field.scope exists. */
164
+ scopes?: Record<string, string[]>;
165
+ masks?: Record<string, BitMask>;
166
+ fields?: Record<string, BitFieldDefinition<T>>;
167
+ devTools?: boolean | DevToolsOptions;
168
+ }
169
+ interface BitFieldOptions {
170
+ mask?: BitMask | string;
171
+ }
172
+ /** Return type of BitStore.getStepStatus, used by useBitScope/injectBitScope. */
173
+ interface ScopeStatus {
174
+ hasErrors: boolean;
175
+ isDirty: boolean;
176
+ errors: Record<string, string>;
177
+ }
178
+ /** Return type of validateStep, used by useBitScope/injectBitScope. */
179
+ interface ValidateScopeResult {
180
+ valid: boolean;
181
+ errors: Record<string, string>;
182
+ }
183
+ interface BitLifecycleAdapter<T extends object> {
184
+ getState: () => BitState<T>;
185
+ internalUpdateState: (partial: Partial<BitState<T>>) => void;
186
+ internalSaveSnapshot: () => void;
187
+ config: BitResolvedConfig<T>;
188
+ depsMg: BitDependencyManager<T>;
189
+ validatorMg: BitValidationManager<T>;
190
+ historyMg: BitHistoryManager<T>;
191
+ }
192
+ interface BitStoreAdapter<T extends object = any> {
193
+ getState: () => BitState<T>;
194
+ getConfig(): BitResolvedConfig<T>;
195
+ setField(path: string, value: any): void;
196
+ internalUpdateState(partialState: any): void;
197
+ internalSaveSnapshot(): void;
198
+ unregisterPrefix?: (prefix: string) => void;
199
+ validate?: () => Promise<boolean>;
200
+ }
201
+ interface BitValidationAdapter<T extends object> {
202
+ getState: () => BitState<T>;
203
+ internalUpdateState: (partial: Partial<BitState<T>>) => void;
204
+ setError: (path: string, message: string | undefined) => void;
205
+ config: BitResolvedConfig<T>;
206
+ depsMg: BitDependencyManager<T>;
207
+ }
208
+ /**
209
+ * Type-safe path utilities
210
+ *
211
+ * These are used to strengthen typing for field paths (e.g. "user.email", "items.0.name").
212
+ */
213
+ type Primitive = string | number | boolean | bigint | symbol | null | undefined;
214
+ type BitPath<T, Prefix extends string = ""> = T extends Primitive ? never : T extends readonly (infer U)[] ? Prefix extends "" ? `${number}` | `${number}.${BitPath<U>}` : `${Prefix}.${number}` | `${Prefix}.${number}.${BitPath<U>}` : {
215
+ [K in keyof T & (string | number)]: T[K] extends Primitive ? Prefix extends "" ? `${K & (string | number)}` : `${Prefix}.${K & (string | number)}` : Prefix extends "" ? `${K & (string | number)}` | `${K & (string | number)}.${BitPath<T[K]>}` : `${Prefix}.${K & (string | number)}` | `${Prefix}.${K & (string | number)}.${BitPath<T[K]>}`;
216
+ }[keyof T & (string | number)];
217
+ type BitPathValue<T, P extends string> = P extends `${infer K}.${infer Rest}` ? K extends `${number}` ? T extends readonly (infer U)[] ? BitPathValue<U, Rest> : never : K extends keyof T ? BitPathValue<T[K], Rest> : never : P extends `${number}` ? T extends readonly (infer U)[] ? U : never : P extends keyof T ? T[P] : never;
218
+ type BitArrayPath<T> = BitPath<T> extends infer P ? P extends string ? BitPathValue<T, P> extends readonly any[] ? P : never : never : never;
219
+ type BitArrayItem<A> = A extends readonly (infer U)[] ? U : A extends (infer U)[] ? U : never;
220
+
221
+ type BitBusListener = (storeId: string, newState: any) => void;
222
+ interface BitFormGlobal {
223
+ stores: Record<string, any>;
224
+ listeners: Set<BitBusListener>;
225
+ dispatch: (storeId: string, state: any) => void;
226
+ subscribe: (fn: BitBusListener) => () => void;
227
+ }
228
+ declare global {
229
+ var __BIT_FORM__: BitFormGlobal | undefined;
230
+ }
231
+ declare const bitBus: BitFormGlobal;
232
+
233
+ export { type BitMask as B, type CurrencyMaskConfig as C, type DateMaskConfig as D, type PatternMaskOptions as P, type ScopeStatus as S, type ValidateScopeResult as V, type BitArrayItem as a, type BitArrayPath as b, type BitComputedFn as c, type BitConfig as d, type BitErrors as e, type BitFieldConditional as f, type BitFieldDefinition as g, type BitFieldOptions as h, type BitFieldValidation as i, type BitHistoryConfig as j, type BitPath as k, type BitPathValue as l, type BitState as m, type BitTouched as n, type BitTransformFn as o, type BitValidationConfig as p, type ValidatorFn as q, bitBus as r, type BitStoreAdapter as s, type BitResolvedConfig as t, type BitLifecycleAdapter as u, type BitValidationAdapter as v, BitDependencyManager as w, BitHistoryManager as x, BitValidationManager as y };
@@ -0,0 +1,233 @@
1
+ interface BitMask {
2
+ format: (value: any) => string;
3
+ parse: (value: string) => any;
4
+ }
5
+ interface PatternMaskOptions {
6
+ allowChars?: string;
7
+ customParse?: (value: string) => any;
8
+ saveRaw?: boolean;
9
+ guide?: boolean;
10
+ placeholderChar?: string;
11
+ }
12
+ interface CurrencyMaskConfig {
13
+ prefix?: string;
14
+ suffix?: string;
15
+ thousand: string;
16
+ decimal: string;
17
+ precision?: number;
18
+ allowNegative?: boolean;
19
+ saveRaw?: boolean;
20
+ }
21
+ interface DateMaskConfig extends PatternMaskOptions {
22
+ format?: "DD/MM/YYYY" | "YYYY-MM-DD";
23
+ }
24
+
25
+ declare class BitDependencyManager<T extends object = any> {
26
+ fieldConfigs: Map<string, BitFieldDefinition<T>>;
27
+ dependencies: Map<string, Set<string>>;
28
+ hiddenFields: Set<string>;
29
+ register(path: string, config: BitFieldDefinition<T>, currentValues: T): void;
30
+ isHidden(path: string): boolean;
31
+ isRequired(path: string, values: T): boolean;
32
+ getRequiredErrors(values: T, defaultMessage?: string): Record<string, string>;
33
+ evaluateAll(values: T): void;
34
+ updateDependencies(changedPath: string, newValues: T): string[];
35
+ unregister(path: string): void;
36
+ unregisterPrefix(prefix: string): void;
37
+ private evaluateFieldCondition;
38
+ private isEmpty;
39
+ }
40
+
41
+ declare class BitHistoryManager<T extends object = any> {
42
+ private enableHistory;
43
+ private maxHistory;
44
+ private history;
45
+ private historyIndex;
46
+ constructor(enableHistory: boolean, maxHistory?: number);
47
+ saveSnapshot(values: T): void;
48
+ get canUndo(): boolean;
49
+ get canRedo(): boolean;
50
+ undo(): T | null;
51
+ redo(): T | null;
52
+ reset(initialValues: T): void;
53
+ }
54
+
55
+ declare class BitValidationManager<T extends object> {
56
+ private store;
57
+ private validationTimeout?;
58
+ private currentValidationId;
59
+ private asyncTimers;
60
+ private asyncRequests;
61
+ asyncErrors: Record<string, string>;
62
+ constructor(store: BitValidationAdapter<T>);
63
+ handleAsync(path: string, value: any): void;
64
+ trigger(scopeFields?: string[]): void;
65
+ validate(options?: {
66
+ scope?: string;
67
+ scopeFields?: string[];
68
+ }): Promise<boolean>;
69
+ clear(path: string): void;
70
+ cancelAll(): void;
71
+ }
72
+
73
+ type BitErrors<T> = {
74
+ [key: string]: string | undefined;
75
+ };
76
+ type BitTouched<T> = {
77
+ [key: string]: boolean | undefined;
78
+ };
79
+ type BitComputedFn<T> = (values: T) => any;
80
+ type BitTransformFn<T> = (value: any, allValues: T) => any;
81
+ interface BitState<T> {
82
+ values: T;
83
+ errors: BitErrors<T>;
84
+ touched: BitTouched<T>;
85
+ isValidating: Record<string, boolean>;
86
+ isValid: boolean;
87
+ isSubmitting: boolean;
88
+ isDirty: boolean;
89
+ }
90
+ type ValidatorFn<T> = (values: T, options?: {
91
+ scopeFields?: string[];
92
+ }) => Promise<BitErrors<T>> | BitErrors<T>;
93
+ /** Conditional logic: visibility and dynamic required. */
94
+ interface BitFieldConditional<T extends object = any> {
95
+ dependsOn?: string[];
96
+ showIf?: (values: T) => boolean;
97
+ requiredIf?: (values: T) => boolean;
98
+ }
99
+ /** Field-level validation: async and required message. */
100
+ interface BitFieldValidation<T extends object = any> {
101
+ /** Custom message when field is required but empty. Falls back to defaultRequiredMessage or "Este campo é obrigatório". */
102
+ requiredMessage?: string;
103
+ asyncValidate?: (value: any, values: T) => Promise<string | null | undefined>;
104
+ asyncValidateDelay?: number;
105
+ }
106
+ /** Full field definition: conditional, validation, transform, computed, mask, scope. */
107
+ interface BitFieldDefinition<T extends object = any> {
108
+ conditional?: BitFieldConditional<T>;
109
+ validation?: BitFieldValidation<T>;
110
+ transform?: BitTransformFn<T>;
111
+ computed?: BitComputedFn<T>;
112
+ /** Mask name (from registry) or BitMask instance. */
113
+ mask?: BitMask | string;
114
+ /** Scope name (e.g. wizard step). */
115
+ scope?: string;
116
+ }
117
+ interface DevToolsOptions {
118
+ enabled?: boolean;
119
+ mode?: "local" | "remote";
120
+ url?: string;
121
+ }
122
+ /** Validation config. */
123
+ interface BitValidationConfig<T> {
124
+ resolver?: ValidatorFn<T>;
125
+ delay?: number;
126
+ defaultRequiredMessage?: string;
127
+ }
128
+ /** History config. */
129
+ interface BitHistoryConfig {
130
+ enabled?: boolean;
131
+ limit?: number;
132
+ }
133
+ /**
134
+ * BitConfig - store configuration.
135
+ * @see CHANGELOG for migration from features to fields in 2.0.
136
+ */
137
+ interface BitConfig<T extends object = any> {
138
+ /** Core */
139
+ name?: string;
140
+ initialValues?: T;
141
+ /** Central field config: conditional, validation, transform, computed, mask, scope. */
142
+ fields?: Record<string, BitFieldDefinition<T>>;
143
+ /** Schema-level validation */
144
+ validation?: BitValidationConfig<T>;
145
+ /** History (undo/redo) */
146
+ history?: BitHistoryConfig;
147
+ /** DevTools */
148
+ devTools?: boolean | DevToolsOptions;
149
+ }
150
+ /** Internal config produced by normalizeConfig from BitConfig. */
151
+ interface BitResolvedConfig<T extends object> {
152
+ name?: string;
153
+ initialValues: T;
154
+ resolver?: ValidatorFn<T>;
155
+ validationDelay: number;
156
+ defaultRequiredMessage?: string;
157
+ enableHistory: boolean;
158
+ historyLimit: number;
159
+ /** Derived from fields where field.computed exists. */
160
+ computed?: Record<string, BitComputedFn<T>>;
161
+ /** Derived from fields where field.transform exists. */
162
+ transform?: Partial<Record<string, BitTransformFn<T>>>;
163
+ /** Derived from fields where field.scope exists. */
164
+ scopes?: Record<string, string[]>;
165
+ masks?: Record<string, BitMask>;
166
+ fields?: Record<string, BitFieldDefinition<T>>;
167
+ devTools?: boolean | DevToolsOptions;
168
+ }
169
+ interface BitFieldOptions {
170
+ mask?: BitMask | string;
171
+ }
172
+ /** Return type of BitStore.getStepStatus, used by useBitScope/injectBitScope. */
173
+ interface ScopeStatus {
174
+ hasErrors: boolean;
175
+ isDirty: boolean;
176
+ errors: Record<string, string>;
177
+ }
178
+ /** Return type of validateStep, used by useBitScope/injectBitScope. */
179
+ interface ValidateScopeResult {
180
+ valid: boolean;
181
+ errors: Record<string, string>;
182
+ }
183
+ interface BitLifecycleAdapter<T extends object> {
184
+ getState: () => BitState<T>;
185
+ internalUpdateState: (partial: Partial<BitState<T>>) => void;
186
+ internalSaveSnapshot: () => void;
187
+ config: BitResolvedConfig<T>;
188
+ depsMg: BitDependencyManager<T>;
189
+ validatorMg: BitValidationManager<T>;
190
+ historyMg: BitHistoryManager<T>;
191
+ }
192
+ interface BitStoreAdapter<T extends object = any> {
193
+ getState: () => BitState<T>;
194
+ getConfig(): BitResolvedConfig<T>;
195
+ setField(path: string, value: any): void;
196
+ internalUpdateState(partialState: any): void;
197
+ internalSaveSnapshot(): void;
198
+ unregisterPrefix?: (prefix: string) => void;
199
+ validate?: () => Promise<boolean>;
200
+ }
201
+ interface BitValidationAdapter<T extends object> {
202
+ getState: () => BitState<T>;
203
+ internalUpdateState: (partial: Partial<BitState<T>>) => void;
204
+ setError: (path: string, message: string | undefined) => void;
205
+ config: BitResolvedConfig<T>;
206
+ depsMg: BitDependencyManager<T>;
207
+ }
208
+ /**
209
+ * Type-safe path utilities
210
+ *
211
+ * These are used to strengthen typing for field paths (e.g. "user.email", "items.0.name").
212
+ */
213
+ type Primitive = string | number | boolean | bigint | symbol | null | undefined;
214
+ type BitPath<T, Prefix extends string = ""> = T extends Primitive ? never : T extends readonly (infer U)[] ? Prefix extends "" ? `${number}` | `${number}.${BitPath<U>}` : `${Prefix}.${number}` | `${Prefix}.${number}.${BitPath<U>}` : {
215
+ [K in keyof T & (string | number)]: T[K] extends Primitive ? Prefix extends "" ? `${K & (string | number)}` : `${Prefix}.${K & (string | number)}` : Prefix extends "" ? `${K & (string | number)}` | `${K & (string | number)}.${BitPath<T[K]>}` : `${Prefix}.${K & (string | number)}` | `${Prefix}.${K & (string | number)}.${BitPath<T[K]>}`;
216
+ }[keyof T & (string | number)];
217
+ type BitPathValue<T, P extends string> = P extends `${infer K}.${infer Rest}` ? K extends `${number}` ? T extends readonly (infer U)[] ? BitPathValue<U, Rest> : never : K extends keyof T ? BitPathValue<T[K], Rest> : never : P extends `${number}` ? T extends readonly (infer U)[] ? U : never : P extends keyof T ? T[P] : never;
218
+ type BitArrayPath<T> = BitPath<T> extends infer P ? P extends string ? BitPathValue<T, P> extends readonly any[] ? P : never : never : never;
219
+ type BitArrayItem<A> = A extends readonly (infer U)[] ? U : A extends (infer U)[] ? U : never;
220
+
221
+ type BitBusListener = (storeId: string, newState: any) => void;
222
+ interface BitFormGlobal {
223
+ stores: Record<string, any>;
224
+ listeners: Set<BitBusListener>;
225
+ dispatch: (storeId: string, state: any) => void;
226
+ subscribe: (fn: BitBusListener) => () => void;
227
+ }
228
+ declare global {
229
+ var __BIT_FORM__: BitFormGlobal | undefined;
230
+ }
231
+ declare const bitBus: BitFormGlobal;
232
+
233
+ export { type BitMask as B, type CurrencyMaskConfig as C, type DateMaskConfig as D, type PatternMaskOptions as P, type ScopeStatus as S, type ValidateScopeResult as V, type BitArrayItem as a, type BitArrayPath as b, type BitComputedFn as c, type BitConfig as d, type BitErrors as e, type BitFieldConditional as f, type BitFieldDefinition as g, type BitFieldOptions as h, type BitFieldValidation as i, type BitHistoryConfig as j, type BitPath as k, type BitPathValue as l, type BitState as m, type BitTouched as n, type BitTransformFn as o, type BitValidationConfig as p, type ValidatorFn as q, bitBus as r, type BitStoreAdapter as s, type BitResolvedConfig as t, type BitLifecycleAdapter as u, type BitValidationAdapter as v, BitDependencyManager as w, BitHistoryManager as x, BitValidationManager as y };
@@ -0,0 +1,2 @@
1
+ import{d as R,e as h,h as D,i as w}from"./chunk-ZI3XHI4I.js";import{createContext as A,useContext as O}from"react";import{jsx as U}from"react/jsx-runtime";var k=A(null),nt=({store:t,children:e})=>U(k.Provider,{value:t,children:e}),b=()=>{let t=O(k);if(!t)throw new Error("BitForm hooks devem ser usados dentro de um BitFormProvider");return t};import{useCallback as y,useSyncExternalStore as q,useMemo as H,useRef as L,useState as M}from"react";function ct(){let t=b(),[e,r]=M(null),[i,a]=M(null),o=L(null),S=y(()=>{let u=t.getState(),{isValid:m,isDirty:p,isSubmitting:g}=u,I=t.canUndo,T=t.canRedo;if(o.current&&o.current.isValid===m&&o.current.isDirty===p&&o.current.isSubmitting===g&&o.current.canUndo===I&&o.current.canRedo===T)return o.current;let x={isValid:m,isDirty:p,isSubmitting:g,canUndo:I,canRedo:T};return o.current=x,x},[t]),c=q(t.subscribe.bind(t),S,S),s=y(u=>m=>(m?.preventDefault?.(),t.submit(u)),[t]),n=y(u=>m=>(m?.preventDefault?.(),r(null),t.submit(async p=>{try{let g=await u(p);a(g),r(null)}catch(g){D(g)?t.setServerErrors(w(g)):r(g instanceof Error?g:new Error(String(g)))}})),[t]),d=y(()=>{t.reset(),r(null),a(null)},[t]),l=y(()=>t.getState().values,[t]),f=y(()=>t.getState().errors,[t]),v=y(()=>t.getState().touched,[t]),B=H(()=>({setField:t.setField.bind(t),blurField:t.blurField.bind(t),setValues:t.setValues.bind(t),setError:t.setError.bind(t),setErrors:t.setErrors.bind(t),setServerErrors:t.setServerErrors.bind(t),reset:d,validate:t.validate.bind(t),registerMask:t.registerMask.bind(t),pushItem:t.pushItem.bind(t),removeItem:t.removeItem.bind(t),prependItem:t.prependItem.bind(t),insertItem:t.insertItem.bind(t),moveItem:t.moveItem.bind(t),swapItems:t.swapItems.bind(t),undo:t.undo.bind(t),redo:t.redo.bind(t)}),[t,d]);return{...c,getValues:l,getErrors:f,getTouched:v,submit:s,onSubmit:n,submitError:e,lastResponse:i,...B,reset:d,store:t}}import{useCallback as W,useSyncExternalStore as _,useState as $,useMemo as j,useEffect as z}from"react";var P=()=>Math.random().toString(36).substring(2,9);function vt(t){let e=b(),r=W(()=>{let s=e.getState(),n=h(s.values,t);return Array.isArray(n)?n:[]},[e,t]),i=_(e.subscribe.bind(e),r,r),[a,o]=$(()=>i.map(P));z(()=>{i.length!==a.length&&o(s=>{if(i.length>s.length){let n=i.length-s.length;return[...s,...Array(n).fill(null).map(P)]}return s.slice(0,i.length)})},[i.length]);let S=j(()=>({append:s=>{o(n=>[...n,P()]),e.pushItem(t,s)},prepend:s=>{o(n=>[P(),...n]),e.prependItem(t,s)},insert:(s,n)=>{o(d=>{let l=[...d];return l.splice(s,0,P()),l}),e.insertItem(t,s,n)},remove:s=>{o(n=>n.filter((d,l)=>l!==s)),e.removeItem(t,s)},move:(s,n)=>{o(d=>{let l=[...d],[f]=l.splice(s,1);return l.splice(n,0,f),l}),e.moveItem(t,s,n)},swap:(s,n)=>{o(d=>{let l=[...d];return[l[s],l[n]]=[l[n],l[s]],l}),e.swapItems(t,s,n)},replace:s=>{o(s.map(P)),e.setField(t,s)},clear:()=>{o([]),e.setField(t,[])}}),[e,t]);return{fields:j(()=>i.map((s,n)=>({key:a[n]||`temp-${n}`,value:s,index:n})),[i,a]),length:i.length,...S}}import{useCallback as V,useSyncExternalStore as G,useRef as J}from"react";function Ft(t){let e=b(),r=J(null),i=V(()=>{let c=e.getStepStatus(t);return r.current&&r.current.hasErrors===c.hasErrors&&r.current.isDirty===c.isDirty&&Object.keys(r.current.errors).length===Object.keys(c.errors).length&&Object.entries(c.errors).every(([s,n])=>r.current.errors[s]===n)?r.current:(r.current=c,c)},[e,t]),a=G(e.subscribe.bind(e),i,i),o=V(async()=>{let c=await e.validate({scope:t}),s=e.getStepErrors(t);return{valid:c,errors:s}},[e,t]),S=V(()=>e.getStepErrors(t),[e,t]);return{scopeName:t,status:a,errors:a.errors,validate:o,getErrors:S,isValid:!a.hasErrors,isDirty:a.isDirty}}import{useCallback as F,useSyncExternalStore as K,useRef as Q,useState as X}from"react";function Tt(t){let e=b(),[r,i]=X(0),a=t[r]??"",o=Q(null),S=F(()=>{let u=e.getStepStatus(a);return o.current&&o.current.hasErrors===u.hasErrors&&o.current.isDirty===u.isDirty&&Object.keys(o.current.errors).length===Object.keys(u.errors).length&&Object.entries(u.errors).every(([m,p])=>o.current.errors[m]===p)?o.current:(o.current=u,u)},[e,a]),c=K(e.subscribe.bind(e),S,S),s=F(async()=>{let u=await e.validate({scope:a}),m=e.getStepErrors(a);return{valid:u,errors:m}},[e,a]),n=F(()=>e.getStepErrors(a),[e,a]),d=F(async()=>{let u=await e.validate({scope:a});return u&&i(m=>Math.min(m+1,t.length-1)),u},[e,a,t.length]),l=F(()=>{i(u=>Math.max(u-1,0))},[]),f=F(u=>{i(Math.max(0,Math.min(u-1,t.length-1)))},[t.length]),v=r===0,B=r>=t.length-1;return{step:r+1,stepIndex:r,scope:a,next:d,prev:l,goTo:f,isFirst:v,isLast:B,status:c,errors:c.errors,isValid:!c.hasErrors,isDirty:c.isDirty,validate:s,getErrors:n}}import{useCallback as C,useSyncExternalStore as Y,useRef as Z}from"react";function jt(t){let e=b(),r=Z(null),i=C(()=>{let o=h(e.getState().values,t);return r.current!==null&&R(r.current,o)?r.current:(r.current=o,o)},[e,t]),a=C(o=>e.subscribe(o),[e]);return Y(a,i,i)}import{useCallback as E,useSyncExternalStore as N,useRef as tt,useEffect as et}from"react";function Wt(t,e){let r=b(),i=tt(null);et(()=>(e&&r.registerField(t,e),()=>{r.unregisterField&&r.unregisterField(t)}),[r,t,e]);let a=E(()=>{let n=r.getState(),d=h(n.values,t),l=n.errors[t],f=!!n.touched[t],v=r.isHidden(t),B=r.isRequired(t),u=r.isFieldDirty(t),m=r.isFieldValidating(t);if(i.current&&i.current.value===d&&i.current.error===l&&i.current.touched===f&&i.current.isHidden===v&&i.current.isRequired===B&&i.current.isDirty===u&&i.current.isValidating===m)return i.current;let p={value:d,error:l,touched:f,isHidden:v,isRequired:B,isDirty:u,isValidating:m};return i.current=p,p},[r,t]),o=E(n=>r.subscribe(n),[r]),S=N(o,a,a),c=E(n=>r.setField(t,n),[r,t]),s=E(()=>r.blurField(t),[r,t]);return{fieldState:S,setValue:c,setBlur:s,store:r}}export{nt as a,b,ct as c,Wt as d,vt as e,Ft as f,Tt as g,jt as h};
2
+ //# sourceMappingURL=chunk-32ZEDTLP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/context.tsx","../src/react/use-bit-form.ts","../src/react/use-bit-array.ts","../src/react/use-bit-scope.ts","../src/react/use-bit-steps.ts","../src/react/use-bit-watch.ts","../src/react/use-bit-field-base.ts"],"sourcesContent":["import React, { createContext, useContext } from \"react\";\nimport { BitStore } from \"../core\";\n\nconst BitContext = createContext<BitStore<any> | null>(null);\n\nexport const BitFormProvider = ({\n store,\n children,\n}: {\n store: BitStore<any>;\n children: React.ReactNode;\n}) => <BitContext.Provider value={store}>{children}</BitContext.Provider>;\n\nexport const useBitStore = <T extends object>() => {\n const store = useContext(BitContext);\n if (!store)\n throw new Error(\n \"BitForm hooks devem ser usados dentro de um BitFormProvider\",\n );\n return store as BitStore<T>;\n};\n","import { useCallback, useSyncExternalStore, useMemo, useRef, useState } from \"react\";\nimport { useBitStore } from \"./context\";\nimport { isValidationErrorShape, extractServerErrors } from \"../core/utils\";\n\nexport function useBitForm<T extends object>() {\n const store = useBitStore<T>();\n\n const [submitError, setSubmitError] = useState<Error | null>(null);\n const [lastResponse, setLastResponse] = useState<unknown>(null);\n\n const lastMeta = useRef<{\n isValid: boolean;\n isDirty: boolean;\n isSubmitting: boolean;\n canUndo: boolean;\n canRedo: boolean;\n } | null>(null);\n\n const getMetaSnapshot = useCallback(() => {\n const state = store.getState();\n const { isValid, isDirty, isSubmitting } = state;\n const canUndo = store.canUndo;\n const canRedo = store.canRedo;\n\n if (\n lastMeta.current &&\n lastMeta.current.isValid === isValid &&\n lastMeta.current.isDirty === isDirty &&\n lastMeta.current.isSubmitting === isSubmitting &&\n lastMeta.current.canUndo === canUndo &&\n lastMeta.current.canRedo === canRedo\n ) {\n return lastMeta.current;\n }\n\n const nextMeta = { isValid, isDirty, isSubmitting, canUndo, canRedo };\n lastMeta.current = nextMeta;\n return nextMeta;\n }, [store]);\n\n const metaState = useSyncExternalStore(\n store.subscribe.bind(store),\n getMetaSnapshot,\n getMetaSnapshot,\n );\n\n const submit = useCallback(\n (onSuccess: (values: T) => void | Promise<void>) => {\n return (e?: { preventDefault: () => void }) => {\n e?.preventDefault?.();\n return store.submit(onSuccess);\n };\n },\n [store],\n );\n\n const onSubmit = useCallback(\n (handler: (values: T) => Promise<unknown>) => {\n return (e?: { preventDefault: () => void }) => {\n e?.preventDefault?.();\n setSubmitError(null);\n\n return store.submit(async (values) => {\n try {\n const result = await handler(values);\n setLastResponse(result);\n setSubmitError(null);\n } catch (err) {\n if (isValidationErrorShape(err)) {\n store.setServerErrors(extractServerErrors(err));\n } else {\n setSubmitError(\n err instanceof Error ? err : new Error(String(err)),\n );\n }\n }\n });\n };\n },\n [store],\n );\n\n const reset = useCallback(() => {\n store.reset();\n setSubmitError(null);\n setLastResponse(null);\n }, [store]);\n\n const getValues = useCallback(() => store.getState().values, [store]);\n const getErrors = useCallback(() => store.getState().errors, [store]);\n const getTouched = useCallback(() => store.getState().touched, [store]);\n\n const actions = useMemo(\n () => ({\n setField: store.setField.bind(store),\n blurField: store.blurField.bind(store),\n setValues: store.setValues.bind(store),\n setError: store.setError.bind(store),\n setErrors: store.setErrors.bind(store),\n setServerErrors: store.setServerErrors.bind(store),\n reset,\n validate: store.validate.bind(store),\n registerMask: store.registerMask.bind(store),\n pushItem: store.pushItem.bind(store),\n removeItem: store.removeItem.bind(store),\n prependItem: store.prependItem.bind(store),\n insertItem: store.insertItem.bind(store),\n moveItem: store.moveItem.bind(store),\n swapItems: store.swapItems.bind(store),\n undo: store.undo.bind(store),\n redo: store.redo.bind(store),\n }),\n [store, reset],\n );\n\n return {\n ...metaState,\n getValues,\n getErrors,\n getTouched,\n submit,\n onSubmit,\n submitError,\n lastResponse,\n ...actions,\n reset,\n store,\n };\n}\n","import {\n useCallback,\n useSyncExternalStore,\n useState,\n useMemo,\n useEffect,\n} from \"react\";\nimport { useBitStore } from \"./context\";\nimport {\n getDeepValue,\n BitArrayPath,\n BitPathValue,\n BitArrayItem,\n BitPath,\n} from \"../core\";\n\nconst generateId = () => Math.random().toString(36).substring(2, 9);\n\nexport function useBitArray<\n TForm extends object = any,\n P extends BitArrayPath<TForm> = BitArrayPath<TForm>,\n>(path: P) {\n const store = useBitStore<TForm>();\n\n type Item = BitArrayItem<BitPathValue<TForm, P>>;\n\n const getSnapshot = useCallback(() => {\n const state = store.getState();\n const value = getDeepValue(state.values, path as string) as\n | BitPathValue<TForm, P>\n | undefined;\n return Array.isArray(value) ? (value as Item[]) : [];\n }, [store, path]);\n\n const data = useSyncExternalStore(\n store.subscribe.bind(store),\n getSnapshot,\n getSnapshot,\n );\n\n const [ids, setIds] = useState<string[]>(() =>\n (data as Item[]).map(generateId),\n );\n\n useEffect(() => {\n if (data.length !== ids.length) {\n setIds((prevIds) => {\n if (data.length > prevIds.length) {\n const diff = data.length - prevIds.length;\n return [...prevIds, ...Array(diff).fill(null).map(generateId)];\n }\n return prevIds.slice(0, data.length);\n });\n }\n }, [data.length]);\n\n const methods = useMemo(\n () => ({\n append: (value: Item) => {\n setIds((prev) => [...prev, generateId()]);\n store.pushItem(path, value);\n },\n prepend: (value: Item) => {\n setIds((prev) => [generateId(), ...prev]);\n store.prependItem(path, value);\n },\n insert: (index: number, value: Item) => {\n setIds((prev) => {\n const newIds = [...prev];\n newIds.splice(index, 0, generateId());\n return newIds;\n });\n store.insertItem(path, index, value);\n },\n remove: (index: number) => {\n setIds((prev) => prev.filter((_, i) => i !== index));\n store.removeItem(path, index);\n },\n move: (from: number, to: number) => {\n setIds((prev) => {\n const newIds = [...prev];\n const [item] = newIds.splice(from, 1);\n newIds.splice(to, 0, item);\n return newIds;\n });\n store.moveItem(path, from, to);\n },\n swap: (indexA: number, indexB: number) => {\n setIds((prev) => {\n const newIds = [...prev];\n [newIds[indexA], newIds[indexB]] = [newIds[indexB], newIds[indexA]];\n return newIds;\n });\n store.swapItems(path, indexA, indexB);\n },\n replace: (items: Item[]) => {\n setIds(items.map(generateId));\n store.setField(path as unknown as BitPath<TForm>, items as any);\n },\n clear: () => {\n setIds([]);\n store.setField(path as unknown as BitPath<TForm>, [] as any);\n },\n }),\n [store, path],\n );\n\n const fields = useMemo(\n () =>\n (data as Item[]).map((item: Item, index: number) => ({\n key: ids[index] || `temp-${index}`,\n value: item,\n index,\n })),\n [data, ids],\n );\n\n return {\n fields,\n length: data.length,\n ...methods,\n };\n}\n","import { useCallback, useSyncExternalStore, useRef } from \"react\";\nimport type { ScopeStatus, ValidateScopeResult } from \"../core\";\nimport { useBitStore } from \"./context\";\n\nexport type { ScopeStatus, ValidateScopeResult };\n\nexport function useBitScope(scopeName: string) {\n const store = useBitStore();\n\n const lastStatus = useRef<ScopeStatus | null>(null);\n\n const getStatusSnapshot = useCallback(() => {\n const nextStatus = store.getStepStatus(scopeName);\n\n if (\n lastStatus.current &&\n lastStatus.current.hasErrors === nextStatus.hasErrors &&\n lastStatus.current.isDirty === nextStatus.isDirty &&\n Object.keys(lastStatus.current.errors).length ===\n Object.keys(nextStatus.errors).length &&\n Object.entries(nextStatus.errors).every(\n ([k, v]) => lastStatus.current!.errors[k] === v,\n )\n ) {\n return lastStatus.current;\n }\n\n lastStatus.current = nextStatus;\n return nextStatus;\n }, [store, scopeName]);\n\n const status = useSyncExternalStore(\n store.subscribe.bind(store),\n getStatusSnapshot,\n getStatusSnapshot,\n );\n\n const validate = useCallback(async (): Promise<ValidateScopeResult> => {\n const valid = await store.validate({ scope: scopeName });\n const errors = store.getStepErrors(scopeName);\n return { valid, errors };\n }, [store, scopeName]);\n\n const getErrors = useCallback(() => {\n return store.getStepErrors(scopeName);\n }, [store, scopeName]);\n\n return {\n scopeName,\n status,\n errors: status.errors,\n validate,\n getErrors,\n isValid: !status.hasErrors,\n isDirty: status.isDirty,\n };\n}\n","import { useCallback, useSyncExternalStore, useRef, useState } from \"react\";\nimport type { ScopeStatus, ValidateScopeResult } from \"../core\";\nimport { useBitStore } from \"./context\";\n\nexport interface UseBitStepsResult {\n step: number;\n stepIndex: number;\n scope: string;\n next: () => Promise<boolean>;\n prev: () => void;\n goTo: (step: number) => void;\n isFirst: boolean;\n isLast: boolean;\n status: ScopeStatus;\n errors: Record<string, string>;\n isValid: boolean;\n isDirty: boolean;\n validate: () => Promise<ValidateScopeResult>;\n getErrors: () => Record<string, string>;\n}\n\nexport function useBitSteps(scopeNames: string[]): UseBitStepsResult {\n const store = useBitStore();\n const [stepIndex, setStepIndex] = useState(0);\n\n const scope = scopeNames[stepIndex] ?? \"\";\n const lastStatus = useRef<ScopeStatus | null>(null);\n\n const getStatusSnapshot = useCallback(() => {\n const nextStatus = store.getStepStatus(scope);\n\n if (\n lastStatus.current &&\n lastStatus.current.hasErrors === nextStatus.hasErrors &&\n lastStatus.current.isDirty === nextStatus.isDirty &&\n Object.keys(lastStatus.current.errors).length ===\n Object.keys(nextStatus.errors).length &&\n Object.entries(nextStatus.errors).every(\n ([k, v]) => lastStatus.current!.errors[k] === v,\n )\n ) {\n return lastStatus.current;\n }\n\n lastStatus.current = nextStatus;\n return nextStatus;\n }, [store, scope]);\n\n const status = useSyncExternalStore(\n store.subscribe.bind(store),\n getStatusSnapshot,\n getStatusSnapshot,\n );\n\n const validate = useCallback(async (): Promise<ValidateScopeResult> => {\n const valid = await store.validate({ scope });\n const errors = store.getStepErrors(scope);\n return { valid, errors };\n }, [store, scope]);\n\n const getErrors = useCallback(() => {\n return store.getStepErrors(scope);\n }, [store, scope]);\n\n const next = useCallback(async (): Promise<boolean> => {\n const valid = await store.validate({ scope });\n if (valid) {\n setStepIndex((s) => Math.min(s + 1, scopeNames.length - 1));\n }\n return valid;\n }, [store, scope, scopeNames.length]);\n\n const prev = useCallback(() => {\n setStepIndex((s) => Math.max(s - 1, 0));\n }, []);\n\n const goTo = useCallback((targetStep: number) => {\n setStepIndex(\n Math.max(0, Math.min(targetStep - 1, scopeNames.length - 1)),\n );\n }, [scopeNames.length]);\n\n const isFirst = stepIndex === 0;\n const isLast = stepIndex >= scopeNames.length - 1;\n\n return {\n step: stepIndex + 1,\n stepIndex,\n scope,\n next,\n prev,\n goTo,\n isFirst,\n isLast,\n status,\n errors: status.errors,\n isValid: !status.hasErrors,\n isDirty: status.isDirty,\n validate,\n getErrors,\n };\n}\n","import { useCallback, useSyncExternalStore, useRef } from \"react\";\nimport { useBitStore } from \"./context\";\nimport { getDeepValue, deepEqual, BitPath, BitPathValue } from \"../core\";\n\nexport function useBitWatch<\n TForm extends object = any,\n P extends BitPath<TForm> = BitPath<TForm>,\n>(path: P): BitPathValue<TForm, P> {\n const store = useBitStore<TForm>();\n const lastValue = useRef<BitPathValue<TForm, P> | null>(null);\n\n const getSnapshot = useCallback(() => {\n const value = getDeepValue(\n store.getState().values,\n path as string,\n ) as BitPathValue<TForm, P>;\n\n if (\n lastValue.current !== null &&\n deepEqual(lastValue.current, value)\n ) {\n return lastValue.current;\n }\n\n lastValue.current = value;\n return value;\n }, [store, path]);\n\n const subscribe = useCallback(\n (cb: () => void) => store.subscribe(cb),\n [store],\n );\n\n return useSyncExternalStore(\n subscribe,\n getSnapshot,\n getSnapshot,\n ) as BitPathValue<TForm, P>;\n}\n","import { useCallback, useSyncExternalStore, useRef, useEffect } from \"react\";\nimport { useBitStore } from \"./context\";\nimport { getDeepValue, BitFieldDefinition, BitPath, BitPathValue } from \"../core\";\n\nexport function useBitFieldBase<\n TValue = any,\n TForm extends object = any,\n P extends BitPath<TForm> = BitPath<TForm>,\n>(path: P, config?: BitFieldDefinition<TForm>) {\n const store = useBitStore<TForm>();\n const lastState = useRef<{\n value: BitPathValue<TForm, P>;\n error: any;\n touched: boolean;\n isHidden: boolean;\n isRequired: boolean;\n isDirty: boolean;\n isValidating: boolean;\n } | null>(null);\n\n useEffect(() => {\n if (config) {\n store.registerField(path, config as any);\n }\n\n return () => {\n if (store.unregisterField) {\n store.unregisterField(path);\n }\n };\n }, [store, path, config]);\n\n const getSnapshot = useCallback(() => {\n const state = store.getState();\n const value = getDeepValue(\n state.values,\n path as string,\n ) as BitPathValue<TForm, P>;\n const error = state.errors[path];\n const touched = !!state.touched[path];\n\n const isHidden = store.isHidden(path);\n const isRequired = store.isRequired(path);\n const isDirty = store.isFieldDirty(path);\n const isValidating = store.isFieldValidating(path);\n\n if (\n lastState.current &&\n lastState.current.value === value &&\n lastState.current.error === error &&\n lastState.current.touched === touched &&\n lastState.current.isHidden === isHidden &&\n lastState.current.isRequired === isRequired &&\n lastState.current.isDirty === isDirty &&\n lastState.current.isValidating === isValidating\n ) {\n return lastState.current;\n }\n\n const newState = {\n value,\n error,\n touched,\n isHidden,\n isRequired,\n isDirty,\n isValidating,\n };\n lastState.current = newState;\n return newState;\n }, [store, path]);\n\n const subscribe = useCallback(\n (cb: () => void) => store.subscribe(cb),\n [store],\n );\n\n const fieldState = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const setValue = useCallback(\n (val: BitPathValue<TForm, P>) => store.setField(path, val),\n [store, path],\n );\n\n const setBlur = useCallback(() => store.blurField(path), [store, path]);\n\n return { fieldState, setValue, setBlur, store };\n}\n"],"mappings":"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","names":["createContext","useContext","jsx","BitContext","BitFormProvider","store","children","useBitStore","useCallback","useSyncExternalStore","useMemo","useRef","useState","useBitForm","store","useBitStore","submitError","setSubmitError","useState","lastResponse","setLastResponse","lastMeta","useRef","getMetaSnapshot","useCallback","state","isValid","isDirty","isSubmitting","canUndo","canRedo","nextMeta","metaState","useSyncExternalStore","submit","onSuccess","e","onSubmit","handler","values","result","err","isValidationErrorShape","extractServerErrors","reset","getValues","getErrors","getTouched","actions","useMemo","useCallback","useSyncExternalStore","useState","useMemo","useEffect","generateId","useBitArray","path","store","useBitStore","getSnapshot","useCallback","state","value","getDeepValue","data","useSyncExternalStore","ids","setIds","useState","useEffect","prevIds","diff","methods","useMemo","prev","index","newIds","_","i","from","to","item","indexA","indexB","items","useCallback","useSyncExternalStore","useRef","useBitScope","scopeName","store","useBitStore","lastStatus","useRef","getStatusSnapshot","useCallback","nextStatus","k","v","status","useSyncExternalStore","validate","valid","errors","getErrors","useCallback","useSyncExternalStore","useRef","useState","useBitSteps","scopeNames","store","useBitStore","stepIndex","setStepIndex","useState","scope","lastStatus","useRef","getStatusSnapshot","useCallback","nextStatus","k","v","status","useSyncExternalStore","validate","valid","errors","getErrors","next","s","prev","goTo","targetStep","isFirst","isLast","useCallback","useSyncExternalStore","useRef","useBitWatch","path","store","useBitStore","lastValue","useRef","getSnapshot","useCallback","value","getDeepValue","deepEqual","subscribe","cb","useSyncExternalStore","useCallback","useSyncExternalStore","useRef","useEffect","useBitFieldBase","path","config","store","useBitStore","lastState","useRef","useEffect","getSnapshot","useCallback","state","value","getDeepValue","error","touched","isHidden","isRequired","isDirty","isValidating","newState","subscribe","cb","fieldState","useSyncExternalStore","setValue","val","setBlur"]}