@pyreon/form 0.0.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.
- package/LICENSE +21 -0
- package/README.md +259 -0
- package/lib/analysis/devtools.js.html +5406 -0
- package/lib/analysis/index.js.html +5406 -0
- package/lib/devtools.js +74 -0
- package/lib/devtools.js.map +1 -0
- package/lib/index.js +451 -0
- package/lib/index.js.map +1 -0
- package/lib/types/devtools.d.ts +67 -0
- package/lib/types/devtools.d.ts.map +1 -0
- package/lib/types/devtools2.d.ts +31 -0
- package/lib/types/devtools2.d.ts.map +1 -0
- package/lib/types/index.d.ts +457 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index2.d.ts +291 -0
- package/lib/types/index2.d.ts.map +1 -0
- package/package.json +57 -0
- package/src/context.ts +67 -0
- package/src/devtools.ts +100 -0
- package/src/index.ts +26 -0
- package/src/tests/devtools.test.ts +206 -0
- package/src/tests/form.test.ts +1860 -0
- package/src/types.ts +116 -0
- package/src/use-field-array.ts +117 -0
- package/src/use-field.ts +69 -0
- package/src/use-form-state.ts +74 -0
- package/src/use-form.ts +436 -0
- package/src/use-watch.ts +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devtools.d.ts","names":[],"sources":["../../src/devtools.ts"],"mappings":"AAQA,SAAS,OAAA,CAAA,EAAgB;EACvB,KAAK,MAAM,QAAA,IAAY,UAAA,EAAY,QAAA,CAAA,CAAU;;;;;;;;;AAU/C,SAAgB,YAAA,CAAa,IAAA,EAAc,IAAA,EAAoB;EAC7D,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC;EACzC,OAAA,CAAA,CAAS;;;AAIX,SAAgB,cAAA,CAAe,IAAA,EAAoB;EACjD,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK;EACzB,OAAA,CAAA,CAAS;;;AAIX,SAAgB,cAAA,CAAA,EAA2B;EACzC,KAAK,MAAM,CAAC,IAAA,EAAM,GAAA,CAAA,IAAQ,YAAA,EACxB,IAAI,GAAA,CAAI,KAAA,CAAA,CAAO,KAAK,KAAA,CAAA,EAAW,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK;EAE1D,OAAO,CAAC,GAAG,YAAA,CAAa,IAAA,CAAA,CAAM,CAAC;;;AAIjC,SAAgB,eAAA,CAAgB,IAAA,EAAkC;EAChE,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK;EAClC,IAAI,CAAC,GAAA,EAAK,OAAO,KAAA,CAAA;EACjB,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAA,CAAO;EAC5B,IAAI,CAAC,QAAA,EAAU;IACb,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK;IACzB;;EAEF,OAAO,QAAA;;;;;;AAOT,SAAgB,eAAA,CACd,IAAA,EACqC;EACrC,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,CAAK;EAClC,IAAI,CAAC,IAAA,EAAM,OAAO,KAAA,CAAA;EAClB,OAAO;IACL,MAAA,EACE,OAAO,IAAA,CAAK,MAAA,KAAW,UAAA,GAClB,IAAA,CAAK,MAAA,CAAA,CAA0B,GAChC,KAAA,CAAA;IACN,MAAA,EACE,OAAO,IAAA,CAAK,MAAA,KAAW,UAAA,GAClB,IAAA,CAAK,MAAA,CAAA,CAA0B,GAChC,KAAA,CAAA;IACN,YAAA,EACE,OAAO,IAAA,CAAK,YAAA,KAAiB,UAAA,GACxB,IAAA,CAAK,YAAA,CAAA,CAAgC,GACtC,KAAA,CAAA;IACN,OAAA,EACE,OAAO,IAAA,CAAK,OAAA,KAAY,UAAA,GACnB,IAAA,CAAK,OAAA,CAAA,CAA2B,GACjC,KAAA,CAAA;IACN,OAAA,EACE,OAAO,IAAA,CAAK,OAAA,KAAY,UAAA,GACnB,IAAA,CAAK,OAAA,CAAA,CAA2B,GACjC,KAAA,CAAA;IACN,WAAA,EACE,OAAO,IAAA,CAAK,WAAA,KAAgB,UAAA,GACvB,IAAA,CAAK,WAAA,CAAA,CAA+B,GACrC,KAAA;GACP;;;AAIH,SAAgB,YAAA,CAAa,QAAA,EAAkC;EAC7D,UAAA,CAAW,GAAA,CAAI,QAAA,CAAS;EACxB,OAAA,MAAa;IACX,UAAA,CAAW,MAAA,CAAO,QAAA,CAAS;;;;AAK/B,SAAgB,cAAA,CAAA,EAAuB;EACrC,YAAA,CAAa,KAAA,CAAA,CAAO;EACpB,UAAA,CAAW,KAAA,CAAA,CAAO"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//#region src/devtools.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* @pyreon/form devtools introspection API.
|
|
4
|
+
* Import: `import { ... } from "@pyreon/form/devtools"`
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Register a form instance for devtools inspection.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* const form = useForm({ ... })
|
|
11
|
+
* registerForm("login-form", form)
|
|
12
|
+
*/
|
|
13
|
+
declare function registerForm(name: string, form: object): void;
|
|
14
|
+
/** Unregister a form instance. */
|
|
15
|
+
declare function unregisterForm(name: string): void;
|
|
16
|
+
/** Get all registered form names. Cleans up garbage-collected instances. */
|
|
17
|
+
declare function getActiveForms(): string[];
|
|
18
|
+
/** Get a form instance by name (or undefined if GC'd or not registered). */
|
|
19
|
+
declare function getFormInstance(name: string): object | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Get a snapshot of a registered form's current state.
|
|
22
|
+
* Returns values, errors, and form-level status signals.
|
|
23
|
+
*/
|
|
24
|
+
declare function getFormSnapshot(name: string): Record<string, unknown> | undefined;
|
|
25
|
+
/** Subscribe to form registry changes. Returns unsubscribe function. */
|
|
26
|
+
declare function onFormChange(listener: () => void): () => void;
|
|
27
|
+
/** @internal — reset devtools registry (for tests). */
|
|
28
|
+
declare function _resetDevtools(): void;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { _resetDevtools, getActiveForms, getFormInstance, getFormSnapshot, onFormChange, registerForm, unregisterForm };
|
|
31
|
+
//# sourceMappingURL=devtools2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devtools2.d.ts","names":[],"sources":["../../src/devtools.ts"],"mappings":";;AAmBA;;;;;AAMA;;;;;iBANgB,YAAA,CAAa,IAAA,UAAc,IAAA;;iBAM3B,cAAA,CAAe,IAAA;;iBAMf,cAAA,CAAA;AAQhB;AAAA,iBAAgB,eAAA,CAAgB,IAAA;;;;AAehC;iBAAgB,eAAA,CACd,IAAA,WACC,MAAA;;iBAgCa,YAAA,CAAa,QAAA;;iBAQb,cAAA,CAAA"}
|
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
import { createContext, onUnmount, popContext, pushContext, useContext } from "@pyreon/core";
|
|
2
|
+
import { computed, effect, signal } from "@pyreon/reactivity";
|
|
3
|
+
|
|
4
|
+
//#region src/use-form.ts
|
|
5
|
+
/**
|
|
6
|
+
* Create a signal-based form. Returns reactive field states, form-level
|
|
7
|
+
* signals, and handlers for submit/reset/validate.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* const form = useForm({
|
|
11
|
+
* initialValues: { email: '', password: '', remember: false },
|
|
12
|
+
* validators: {
|
|
13
|
+
* email: (v) => (!v ? 'Required' : undefined),
|
|
14
|
+
* password: (v, all) => (v.length < 8 ? 'Too short' : undefined),
|
|
15
|
+
* },
|
|
16
|
+
* onSubmit: async (values) => { await login(values) },
|
|
17
|
+
* })
|
|
18
|
+
*
|
|
19
|
+
* // Bind with register():
|
|
20
|
+
* // h('input', form.register('email'))
|
|
21
|
+
* // h('input', { type: 'checkbox', ...form.register('remember', { type: 'checkbox' }) })
|
|
22
|
+
*/
|
|
23
|
+
function useForm(options) {
|
|
24
|
+
const {
|
|
25
|
+
initialValues,
|
|
26
|
+
onSubmit,
|
|
27
|
+
validators,
|
|
28
|
+
schema,
|
|
29
|
+
validateOn = "blur",
|
|
30
|
+
debounceMs
|
|
31
|
+
} = options;
|
|
32
|
+
const fieldEntries = Object.entries(initialValues);
|
|
33
|
+
const fields = {};
|
|
34
|
+
const debounceTimers = {};
|
|
35
|
+
const validationVersions = {};
|
|
36
|
+
const getValues = () => {
|
|
37
|
+
const values = {};
|
|
38
|
+
for (const [name] of fieldEntries) values[name] = fields[name]?.value.peek() ?? initialValues[name];
|
|
39
|
+
return values;
|
|
40
|
+
};
|
|
41
|
+
const clearAllTimers = () => {
|
|
42
|
+
for (const key of Object.keys(debounceTimers)) {
|
|
43
|
+
clearTimeout(debounceTimers[key]);
|
|
44
|
+
delete debounceTimers[key];
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const isValidating = signal(false);
|
|
48
|
+
const submitError = signal(void 0);
|
|
49
|
+
let disposed = false;
|
|
50
|
+
for (const [name, initial] of fieldEntries) {
|
|
51
|
+
const valueSig = signal(initial);
|
|
52
|
+
const errorSig = signal(void 0);
|
|
53
|
+
const touchedSig = signal(false);
|
|
54
|
+
const dirtySig = signal(false);
|
|
55
|
+
validationVersions[name] = 0;
|
|
56
|
+
const runValidation = async value => {
|
|
57
|
+
const fieldValidator = validators?.[name];
|
|
58
|
+
if (fieldValidator) {
|
|
59
|
+
validationVersions[name] = (validationVersions[name] ?? 0) + 1;
|
|
60
|
+
const currentVersion = validationVersions[name];
|
|
61
|
+
try {
|
|
62
|
+
const result = await fieldValidator(value, getValues());
|
|
63
|
+
if (!disposed && validationVersions[name] === currentVersion) errorSig.set(result);
|
|
64
|
+
return result;
|
|
65
|
+
} catch (err) {
|
|
66
|
+
if (!disposed && validationVersions[name] === currentVersion) {
|
|
67
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
68
|
+
errorSig.set(message);
|
|
69
|
+
}
|
|
70
|
+
return err instanceof Error ? err.message : String(err);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
errorSig.set(void 0);
|
|
74
|
+
};
|
|
75
|
+
const validateField = debounceMs ? value => {
|
|
76
|
+
clearTimeout(debounceTimers[name]);
|
|
77
|
+
return new Promise(resolve => {
|
|
78
|
+
debounceTimers[name] = setTimeout(async () => {
|
|
79
|
+
resolve(await runValidation(value));
|
|
80
|
+
}, debounceMs);
|
|
81
|
+
});
|
|
82
|
+
} : runValidation;
|
|
83
|
+
if (validateOn === "change") effect(() => {
|
|
84
|
+
validateField(valueSig());
|
|
85
|
+
});
|
|
86
|
+
fields[name] = {
|
|
87
|
+
value: valueSig,
|
|
88
|
+
error: errorSig,
|
|
89
|
+
touched: touchedSig,
|
|
90
|
+
dirty: dirtySig,
|
|
91
|
+
setValue: value => {
|
|
92
|
+
valueSig.set(value);
|
|
93
|
+
dirtySig.set(!structuredEqual(value, initial));
|
|
94
|
+
},
|
|
95
|
+
setTouched: () => {
|
|
96
|
+
touchedSig.set(true);
|
|
97
|
+
if (validateOn === "blur") validateField(valueSig.peek());
|
|
98
|
+
},
|
|
99
|
+
reset: () => {
|
|
100
|
+
valueSig.set(initial);
|
|
101
|
+
errorSig.set(void 0);
|
|
102
|
+
touchedSig.set(false);
|
|
103
|
+
dirtySig.set(false);
|
|
104
|
+
clearTimeout(debounceTimers[name]);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
onUnmount(() => {
|
|
109
|
+
disposed = true;
|
|
110
|
+
clearAllTimers();
|
|
111
|
+
});
|
|
112
|
+
const isSubmitting = signal(false);
|
|
113
|
+
const submitCount = signal(0);
|
|
114
|
+
const isValid = computed(() => {
|
|
115
|
+
for (const name of fieldEntries.map(([n]) => n)) if (fields[name].error() !== void 0) return false;
|
|
116
|
+
return true;
|
|
117
|
+
});
|
|
118
|
+
const isDirty = computed(() => {
|
|
119
|
+
for (const name of fieldEntries.map(([n]) => n)) if (fields[name].dirty()) return true;
|
|
120
|
+
return false;
|
|
121
|
+
});
|
|
122
|
+
const getErrors = () => {
|
|
123
|
+
const errors = {};
|
|
124
|
+
for (const [name] of fieldEntries) {
|
|
125
|
+
const err = fields[name].error.peek();
|
|
126
|
+
if (err !== void 0) errors[name] = err;
|
|
127
|
+
}
|
|
128
|
+
return errors;
|
|
129
|
+
};
|
|
130
|
+
const validate = async () => {
|
|
131
|
+
clearAllTimers();
|
|
132
|
+
isValidating.set(true);
|
|
133
|
+
try {
|
|
134
|
+
const allValues = getValues();
|
|
135
|
+
for (const [name] of fieldEntries) fields[name].error.set(void 0);
|
|
136
|
+
await Promise.all(fieldEntries.map(async ([name]) => {
|
|
137
|
+
const fieldValidator = validators?.[name];
|
|
138
|
+
if (fieldValidator) {
|
|
139
|
+
validationVersions[name] = (validationVersions[name] ?? 0) + 1;
|
|
140
|
+
const currentVersion = validationVersions[name];
|
|
141
|
+
try {
|
|
142
|
+
const error = await fieldValidator(fields[name].value.peek(), allValues);
|
|
143
|
+
if (validationVersions[name] === currentVersion) fields[name].error.set(error);
|
|
144
|
+
} catch (err) {
|
|
145
|
+
if (validationVersions[name] === currentVersion) fields[name].error.set(err instanceof Error ? err.message : String(err));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}));
|
|
149
|
+
if (schema) try {
|
|
150
|
+
const schemaErrors = await schema(allValues);
|
|
151
|
+
for (const [name] of fieldEntries) {
|
|
152
|
+
const schemaError = schemaErrors[name];
|
|
153
|
+
if (schemaError !== void 0 && fields[name].error.peek() === void 0) fields[name].error.set(schemaError);
|
|
154
|
+
}
|
|
155
|
+
} catch (err) {
|
|
156
|
+
submitError.set(err);
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
for (const [name] of fieldEntries) if (fields[name].error.peek() !== void 0) return false;
|
|
160
|
+
return true;
|
|
161
|
+
} finally {
|
|
162
|
+
isValidating.set(false);
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
const handleSubmit = async e => {
|
|
166
|
+
if (e && typeof e.preventDefault === "function") e.preventDefault();
|
|
167
|
+
submitError.set(void 0);
|
|
168
|
+
submitCount.update(n => n + 1);
|
|
169
|
+
for (const [name] of fieldEntries) fields[name].touched.set(true);
|
|
170
|
+
if (!(await validate())) return;
|
|
171
|
+
isSubmitting.set(true);
|
|
172
|
+
try {
|
|
173
|
+
await onSubmit(getValues());
|
|
174
|
+
} catch (err) {
|
|
175
|
+
submitError.set(err);
|
|
176
|
+
throw err;
|
|
177
|
+
} finally {
|
|
178
|
+
isSubmitting.set(false);
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
const reset = () => {
|
|
182
|
+
clearAllTimers();
|
|
183
|
+
for (const [name] of fieldEntries) fields[name].reset();
|
|
184
|
+
submitCount.set(0);
|
|
185
|
+
submitError.set(void 0);
|
|
186
|
+
};
|
|
187
|
+
const setFieldValue = (field, value) => {
|
|
188
|
+
if (!fields[field]) throw new Error(`[@pyreon/form] Field "${String(field)}" does not exist. Available fields: ${fieldEntries.map(([n]) => n).join(", ")}`);
|
|
189
|
+
fields[field].setValue(value);
|
|
190
|
+
};
|
|
191
|
+
const setFieldError = (field, error) => {
|
|
192
|
+
if (!fields[field]) throw new Error(`[@pyreon/form] Field "${String(field)}" does not exist. Available fields: ${fieldEntries.map(([n]) => n).join(", ")}`);
|
|
193
|
+
fields[field].error.set(error);
|
|
194
|
+
};
|
|
195
|
+
const setErrors = errors => {
|
|
196
|
+
for (const [name, error] of Object.entries(errors)) setFieldError(name, error);
|
|
197
|
+
};
|
|
198
|
+
const clearErrors = () => {
|
|
199
|
+
for (const [name] of fieldEntries) fields[name].error.set(void 0);
|
|
200
|
+
};
|
|
201
|
+
const resetField = field => {
|
|
202
|
+
if (fields[field]) fields[field].reset();
|
|
203
|
+
};
|
|
204
|
+
const registerCache = /* @__PURE__ */new Map();
|
|
205
|
+
const register = (field, opts) => {
|
|
206
|
+
const cacheKey = `${field}:${opts?.type ?? "text"}`;
|
|
207
|
+
const cached = registerCache.get(cacheKey);
|
|
208
|
+
if (cached) return cached;
|
|
209
|
+
const fieldState = fields[field];
|
|
210
|
+
const props = {
|
|
211
|
+
value: fieldState.value,
|
|
212
|
+
onInput: e => {
|
|
213
|
+
const target = e.target;
|
|
214
|
+
if (opts?.type === "checkbox") fieldState.setValue(target.checked);else if (opts?.type === "number") {
|
|
215
|
+
const num = target.valueAsNumber;
|
|
216
|
+
fieldState.setValue(Number.isNaN(num) ? target.value : num);
|
|
217
|
+
} else fieldState.setValue(target.value);
|
|
218
|
+
},
|
|
219
|
+
onBlur: () => {
|
|
220
|
+
fieldState.setTouched();
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
if (opts?.type === "checkbox") props.checked = computed(() => Boolean(fieldState.value()));
|
|
224
|
+
registerCache.set(cacheKey, props);
|
|
225
|
+
return props;
|
|
226
|
+
};
|
|
227
|
+
return {
|
|
228
|
+
fields,
|
|
229
|
+
isSubmitting,
|
|
230
|
+
isValidating,
|
|
231
|
+
isValid,
|
|
232
|
+
isDirty,
|
|
233
|
+
submitCount,
|
|
234
|
+
submitError,
|
|
235
|
+
values: getValues,
|
|
236
|
+
errors: getErrors,
|
|
237
|
+
setFieldValue,
|
|
238
|
+
setFieldError,
|
|
239
|
+
setErrors,
|
|
240
|
+
clearErrors,
|
|
241
|
+
resetField,
|
|
242
|
+
register,
|
|
243
|
+
handleSubmit,
|
|
244
|
+
reset,
|
|
245
|
+
validate
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
/** Deep structural equality with depth limit to guard against circular references. */
|
|
249
|
+
function structuredEqual(a, b, depth = 0) {
|
|
250
|
+
if (Object.is(a, b)) return true;
|
|
251
|
+
if (a == null || b == null) return false;
|
|
252
|
+
if (typeof a !== typeof b) return false;
|
|
253
|
+
if (depth > 10) return false;
|
|
254
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
255
|
+
if (a.length !== b.length) return false;
|
|
256
|
+
for (let i = 0; i < a.length; i++) if (!structuredEqual(a[i], b[i], depth + 1)) return false;
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
if (typeof a === "object" && typeof b === "object") {
|
|
260
|
+
const aObj = a;
|
|
261
|
+
const bObj = b;
|
|
262
|
+
const aKeys = Object.keys(aObj);
|
|
263
|
+
const bKeys = Object.keys(bObj);
|
|
264
|
+
if (aKeys.length !== bKeys.length) return false;
|
|
265
|
+
for (const key of aKeys) if (!structuredEqual(aObj[key], bObj[key], depth + 1)) return false;
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
//#endregion
|
|
272
|
+
//#region src/use-field-array.ts
|
|
273
|
+
/**
|
|
274
|
+
* Manage a dynamic array of form fields with stable keys.
|
|
275
|
+
*
|
|
276
|
+
* @example
|
|
277
|
+
* const tags = useFieldArray<string>([])
|
|
278
|
+
* tags.append('typescript')
|
|
279
|
+
* tags.append('pyreon')
|
|
280
|
+
* // tags.items() — array of { key, value } for keyed rendering
|
|
281
|
+
*/
|
|
282
|
+
function useFieldArray(initial = []) {
|
|
283
|
+
let nextKey = 0;
|
|
284
|
+
const makeItem = value => ({
|
|
285
|
+
key: nextKey++,
|
|
286
|
+
value: signal(value)
|
|
287
|
+
});
|
|
288
|
+
const items = signal(initial.map(makeItem));
|
|
289
|
+
return {
|
|
290
|
+
items,
|
|
291
|
+
length: computed(() => items().length),
|
|
292
|
+
append(value) {
|
|
293
|
+
items.update(arr => [...arr, makeItem(value)]);
|
|
294
|
+
},
|
|
295
|
+
prepend(value) {
|
|
296
|
+
items.update(arr => [makeItem(value), ...arr]);
|
|
297
|
+
},
|
|
298
|
+
insert(index, value) {
|
|
299
|
+
items.update(arr => {
|
|
300
|
+
const next = [...arr];
|
|
301
|
+
next.splice(index, 0, makeItem(value));
|
|
302
|
+
return next;
|
|
303
|
+
});
|
|
304
|
+
},
|
|
305
|
+
remove(index) {
|
|
306
|
+
items.update(arr => arr.filter((_, i) => i !== index));
|
|
307
|
+
},
|
|
308
|
+
update(index, value) {
|
|
309
|
+
const item = items.peek()[index];
|
|
310
|
+
if (item) item.value.set(value);
|
|
311
|
+
},
|
|
312
|
+
move(from, to) {
|
|
313
|
+
items.update(arr => {
|
|
314
|
+
const next = [...arr];
|
|
315
|
+
const [item] = next.splice(from, 1);
|
|
316
|
+
if (item) next.splice(to, 0, item);
|
|
317
|
+
return next;
|
|
318
|
+
});
|
|
319
|
+
},
|
|
320
|
+
swap(indexA, indexB) {
|
|
321
|
+
items.update(arr => {
|
|
322
|
+
const next = [...arr];
|
|
323
|
+
const a = next[indexA];
|
|
324
|
+
const b = next[indexB];
|
|
325
|
+
if (a && b) {
|
|
326
|
+
next[indexA] = b;
|
|
327
|
+
next[indexB] = a;
|
|
328
|
+
}
|
|
329
|
+
return next;
|
|
330
|
+
});
|
|
331
|
+
},
|
|
332
|
+
replace(values) {
|
|
333
|
+
items.set(values.map(makeItem));
|
|
334
|
+
},
|
|
335
|
+
values() {
|
|
336
|
+
return items.peek().map(item => item.value.peek());
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
//#endregion
|
|
342
|
+
//#region src/use-field.ts
|
|
343
|
+
/**
|
|
344
|
+
* Extract a single field's state and helpers from a form instance.
|
|
345
|
+
* Useful for building isolated field components.
|
|
346
|
+
*
|
|
347
|
+
* @example
|
|
348
|
+
* function EmailField({ form }: { form: FormState<{ email: string }> }) {
|
|
349
|
+
* const field = useField(form, 'email')
|
|
350
|
+
* return (
|
|
351
|
+
* <>
|
|
352
|
+
* <input {...field.register()} />
|
|
353
|
+
* {field.showError() && <span>{field.error()}</span>}
|
|
354
|
+
* </>
|
|
355
|
+
* )
|
|
356
|
+
* }
|
|
357
|
+
*/
|
|
358
|
+
function useField(form, name) {
|
|
359
|
+
const fieldState = form.fields[name];
|
|
360
|
+
const hasError = computed(() => fieldState.error() !== void 0);
|
|
361
|
+
const showError = computed(() => fieldState.touched() && hasError());
|
|
362
|
+
return {
|
|
363
|
+
value: fieldState.value,
|
|
364
|
+
error: fieldState.error,
|
|
365
|
+
touched: fieldState.touched,
|
|
366
|
+
dirty: fieldState.dirty,
|
|
367
|
+
setValue: fieldState.setValue,
|
|
368
|
+
setTouched: fieldState.setTouched,
|
|
369
|
+
reset: fieldState.reset,
|
|
370
|
+
register: opts => form.register(name, opts),
|
|
371
|
+
hasError,
|
|
372
|
+
showError
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
//#endregion
|
|
377
|
+
//#region src/use-watch.ts
|
|
378
|
+
function useWatch(form, nameOrNames) {
|
|
379
|
+
if (nameOrNames === void 0) return computed(() => {
|
|
380
|
+
const result = {};
|
|
381
|
+
for (const key of Object.keys(form.fields)) result[key] = form.fields[key].value();
|
|
382
|
+
return result;
|
|
383
|
+
});
|
|
384
|
+
if (Array.isArray(nameOrNames)) return nameOrNames.map(name => form.fields[name].value);
|
|
385
|
+
return form.fields[nameOrNames].value;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
//#endregion
|
|
389
|
+
//#region src/use-form-state.ts
|
|
390
|
+
function useFormState(form, selector) {
|
|
391
|
+
const buildSummary = () => {
|
|
392
|
+
const touchedFields = {};
|
|
393
|
+
const dirtyFields = {};
|
|
394
|
+
const errors = {};
|
|
395
|
+
for (const key of Object.keys(form.fields)) {
|
|
396
|
+
const field = form.fields[key];
|
|
397
|
+
if (field.touched()) touchedFields[key] = true;
|
|
398
|
+
if (field.dirty()) dirtyFields[key] = true;
|
|
399
|
+
const err = field.error();
|
|
400
|
+
if (err !== void 0) errors[key] = err;
|
|
401
|
+
}
|
|
402
|
+
return {
|
|
403
|
+
isSubmitting: form.isSubmitting(),
|
|
404
|
+
isValidating: form.isValidating(),
|
|
405
|
+
isValid: form.isValid(),
|
|
406
|
+
isDirty: form.isDirty(),
|
|
407
|
+
submitCount: form.submitCount(),
|
|
408
|
+
submitError: form.submitError(),
|
|
409
|
+
touchedFields,
|
|
410
|
+
dirtyFields,
|
|
411
|
+
errors
|
|
412
|
+
};
|
|
413
|
+
};
|
|
414
|
+
if (selector) return computed(() => selector(buildSummary()));
|
|
415
|
+
return computed(buildSummary);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
//#endregion
|
|
419
|
+
//#region src/context.ts
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* Provide a form instance to the component tree so nested components
|
|
423
|
+
* can access it via `useFormContext()`.
|
|
424
|
+
*
|
|
425
|
+
* @example
|
|
426
|
+
* const form = useForm({ initialValues: { email: '' }, onSubmit: ... })
|
|
427
|
+
*
|
|
428
|
+
* <FormProvider form={form}>
|
|
429
|
+
* <EmailField />
|
|
430
|
+
* <SubmitButton />
|
|
431
|
+
* </FormProvider>
|
|
432
|
+
*/
|
|
433
|
+
function FormProvider(props) {
|
|
434
|
+
pushContext(new Map([[FormContext.id, props.form]]));
|
|
435
|
+
onUnmount(() => popContext());
|
|
436
|
+
const ch = props.children;
|
|
437
|
+
return typeof ch === "function" ? ch() : ch;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Access the form instance from the nearest `FormProvider`.
|
|
441
|
+
* Must be called within a component tree wrapped by `FormProvider`.
|
|
442
|
+
*
|
|
443
|
+
* @example
|
|
444
|
+
* function EmailField() {
|
|
445
|
+
* const form = useFormContext<{ email: string }>()
|
|
446
|
+
* return <input {...form.register('email')} />
|
|
447
|
+
* }
|
|
448
|
+
*/
|
|
449
|
+
function useFormContext() {
|
|
450
|
+
const form = useContext(FormContext);
|
|
451
|
+
if (!form) throw new Error("[@pyreon/form] useFormContext() must be used within a <FormProvider>.");
|
|
452
|
+
return form;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
//#endregion
|
|
456
|
+
export { FormProvider, useField, useFieldArray, useForm, useFormContext, useFormState, useWatch };
|
|
457
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/use-form.ts","../../src/use-field-array.ts","../../src/use-field.ts","../../src/use-watch.ts","../../src/use-form-state.ts","../../src/context.ts"],"mappings":"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"}
|