@skygraph/core 0.0.0-placeholder.0 → 0.5.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 (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -6
  3. package/dist/calendar.cjs +404 -0
  4. package/dist/calendar.cjs.map +1 -0
  5. package/dist/calendar.d.cts +209 -0
  6. package/dist/calendar.d.ts +209 -0
  7. package/dist/calendar.js +12 -0
  8. package/dist/calendar.js.map +1 -0
  9. package/dist/chunk-5CCD5Q4B.js +36 -0
  10. package/dist/chunk-5CCD5Q4B.js.map +1 -0
  11. package/dist/chunk-7FA2TBSZ.js +1211 -0
  12. package/dist/chunk-7FA2TBSZ.js.map +1 -0
  13. package/dist/chunk-AB3RLBLW.js +357 -0
  14. package/dist/chunk-AB3RLBLW.js.map +1 -0
  15. package/dist/chunk-GEMALROQ.js +258 -0
  16. package/dist/chunk-GEMALROQ.js.map +1 -0
  17. package/dist/chunk-IY6LJU3L.js +256 -0
  18. package/dist/chunk-IY6LJU3L.js.map +1 -0
  19. package/dist/chunk-KMGRNPLG.js +453 -0
  20. package/dist/chunk-KMGRNPLG.js.map +1 -0
  21. package/dist/chunk-Y7FTBBYX.js +397 -0
  22. package/dist/chunk-Y7FTBBYX.js.map +1 -0
  23. package/dist/chunk-ZWB7JGAJ.js +488 -0
  24. package/dist/chunk-ZWB7JGAJ.js.map +1 -0
  25. package/dist/form.cjs +498 -0
  26. package/dist/form.cjs.map +1 -0
  27. package/dist/form.d.cts +130 -0
  28. package/dist/form.d.ts +130 -0
  29. package/dist/form.js +8 -0
  30. package/dist/form.js.map +1 -0
  31. package/dist/graph.cjs +1269 -0
  32. package/dist/graph.cjs.map +1 -0
  33. package/dist/graph.d.cts +671 -0
  34. package/dist/graph.d.ts +671 -0
  35. package/dist/graph.js +34 -0
  36. package/dist/graph.js.map +1 -0
  37. package/dist/index.cjs +3860 -0
  38. package/dist/index.cjs.map +1 -0
  39. package/dist/index.d.cts +144 -0
  40. package/dist/index.d.ts +144 -0
  41. package/dist/index.js +477 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/runtime-internal.cjs +339 -0
  44. package/dist/runtime-internal.cjs.map +1 -0
  45. package/dist/runtime-internal.d.cts +130 -0
  46. package/dist/runtime-internal.d.ts +130 -0
  47. package/dist/runtime-internal.js +67 -0
  48. package/dist/runtime-internal.js.map +1 -0
  49. package/dist/table.cjs +537 -0
  50. package/dist/table.cjs.map +1 -0
  51. package/dist/table.d.cts +215 -0
  52. package/dist/table.d.ts +215 -0
  53. package/dist/table.js +16 -0
  54. package/dist/table.js.map +1 -0
  55. package/dist/tree.cjs +442 -0
  56. package/dist/tree.cjs.map +1 -0
  57. package/dist/tree.d.cts +76 -0
  58. package/dist/tree.d.ts +76 -0
  59. package/dist/tree.js +8 -0
  60. package/dist/tree.js.map +1 -0
  61. package/dist/types-B-rKQJ4R.d.cts +35 -0
  62. package/dist/types-B-rKQJ4R.d.ts +35 -0
  63. package/dist/virtual.cjs +283 -0
  64. package/dist/virtual.cjs.map +1 -0
  65. package/dist/virtual.d.cts +96 -0
  66. package/dist/virtual.d.ts +96 -0
  67. package/dist/virtual.js +9 -0
  68. package/dist/virtual.js.map +1 -0
  69. package/package.json +98 -18
  70. package/index.js +0 -3
@@ -0,0 +1,453 @@
1
+ import {
2
+ FORM_META_PREFIX
3
+ } from "./chunk-5CCD5Q4B.js";
4
+
5
+ // src/engines/form/FormEngine.ts
6
+ function metaPath(name, field) {
7
+ return `${FORM_META_PREFIX}${name}.${field}`;
8
+ }
9
+ function interpolateMessage(template, vars) {
10
+ return template.replace(/\$\{(\w+)\}/g, (_, key) => {
11
+ return vars[key] != null ? String(vars[key]) : "";
12
+ });
13
+ }
14
+ function compileRule(rule, templates, fieldLabel) {
15
+ if (typeof rule === "function") return rule;
16
+ const obj = rule;
17
+ const vars = { label: fieldLabel ?? "Field" };
18
+ return (value, getFieldValue) => {
19
+ if (obj.required) {
20
+ if (value === void 0 || value === null || value === "") {
21
+ const tpl = templates?.required ?? obj.message;
22
+ return tpl ? interpolateMessage(tpl, vars) : obj.message ?? "This field is required";
23
+ }
24
+ }
25
+ if (value === void 0 || value === null || value === "") return null;
26
+ if (obj.type) {
27
+ switch (obj.type) {
28
+ case "string":
29
+ if (typeof value !== "string") return obj.message ?? "Must be a string";
30
+ break;
31
+ case "number":
32
+ if (typeof value !== "number" || isNaN(value)) return obj.message ?? "Must be a number";
33
+ break;
34
+ case "email":
35
+ if (typeof value !== "string" || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value))
36
+ return obj.message ?? "Invalid email";
37
+ break;
38
+ case "url":
39
+ try {
40
+ new URL(value);
41
+ } catch {
42
+ return obj.message ?? "Invalid URL";
43
+ }
44
+ break;
45
+ case "boolean":
46
+ if (typeof value !== "boolean") return obj.message ?? "Must be a boolean";
47
+ break;
48
+ }
49
+ }
50
+ if (obj.min !== void 0) {
51
+ vars.min = obj.min;
52
+ if (typeof value === "string" && value.length < obj.min) {
53
+ const tpl = templates?.min ?? obj.message;
54
+ return tpl ? interpolateMessage(tpl, vars) : obj.message ?? `Minimum ${obj.min} characters`;
55
+ }
56
+ if (typeof value === "number" && value < obj.min)
57
+ return obj.message ?? `Minimum value is ${obj.min}`;
58
+ }
59
+ if (obj.max !== void 0) {
60
+ vars.max = obj.max;
61
+ if (typeof value === "string" && value.length > obj.max) {
62
+ const tpl = templates?.max ?? obj.message;
63
+ return tpl ? interpolateMessage(tpl, vars) : obj.message ?? `Maximum ${obj.max} characters`;
64
+ }
65
+ if (typeof value === "number" && value > obj.max)
66
+ return obj.message ?? `Maximum value is ${obj.max}`;
67
+ }
68
+ if (obj.pattern) {
69
+ if (typeof value === "string" && !obj.pattern.test(value))
70
+ return obj.message ?? "Invalid format";
71
+ }
72
+ if (obj.validator) {
73
+ return obj.validator(value, getFieldValue);
74
+ }
75
+ return null;
76
+ };
77
+ }
78
+ function computeStatus(meta) {
79
+ if (meta.validating) return "validating";
80
+ if (meta.errors.length > 0) return "error";
81
+ if (meta.warnings.length > 0) return "warning";
82
+ return void 0;
83
+ }
84
+ function createForm(core, options) {
85
+ const fields = /* @__PURE__ */ new Map();
86
+ const depMap = /* @__PURE__ */ new Map();
87
+ const debounceTimers = /* @__PURE__ */ new Map();
88
+ const preservedValues = /* @__PURE__ */ new Map();
89
+ let isSubmitting = false;
90
+ if (options?.defaultValues) {
91
+ for (const [key, value] of Object.entries(options.defaultValues)) {
92
+ core.set(key, value);
93
+ }
94
+ }
95
+ function setMeta(name, meta) {
96
+ for (const [key, value] of Object.entries(meta)) {
97
+ core.set(metaPath(name, key), value);
98
+ }
99
+ }
100
+ function getMeta(name) {
101
+ const errors = core.get(metaPath(name, "errors")) ?? [];
102
+ const warnings = core.get(metaPath(name, "warnings")) ?? [];
103
+ const validating = core.get(metaPath(name, "validating")) ?? false;
104
+ const touched = core.get(metaPath(name, "touched")) ?? false;
105
+ const dirty = core.get(metaPath(name, "dirty")) ?? false;
106
+ return {
107
+ touched,
108
+ dirty,
109
+ errors,
110
+ warnings,
111
+ validating,
112
+ status: computeStatus({ errors, warnings, validating }),
113
+ error: errors[0] ?? null
114
+ };
115
+ }
116
+ function initMeta(name) {
117
+ setMeta(name, {
118
+ touched: false,
119
+ dirty: false,
120
+ errors: [],
121
+ warnings: [],
122
+ validating: false
123
+ });
124
+ }
125
+ const getFieldValue = (fieldName) => core.get(fieldName);
126
+ function fireValuesChange(changedName) {
127
+ if (!options?.onValuesChange) return;
128
+ const changed = { [changedName]: core.get(changedName) };
129
+ const all = {};
130
+ for (const n of fields.keys()) all[n] = core.get(n);
131
+ options.onValuesChange(changed, all);
132
+ }
133
+ function fireFieldsChange(changedName) {
134
+ if (!options?.onFieldsChange) return;
135
+ const meta = getMeta(changedName);
136
+ options.onFieldsChange([{
137
+ name: changedName,
138
+ value: core.get(changedName),
139
+ errors: meta.errors
140
+ }]);
141
+ }
142
+ async function runValidation(name) {
143
+ const record = fields.get(name);
144
+ if (!record) return [];
145
+ const value = core.get(name);
146
+ const validateFirst = record.options.validateFirst ?? options?.validateFirst ?? false;
147
+ record.abortController?.abort();
148
+ const controller = new AbortController();
149
+ record.abortController = controller;
150
+ const errors = [];
151
+ for (const rule of record.rules) {
152
+ if (controller.signal.aborted) return [];
153
+ const result = rule.fn(value, getFieldValue);
154
+ if (result instanceof Promise) {
155
+ setMeta(name, { validating: true });
156
+ try {
157
+ const asyncResult = await result;
158
+ if (controller.signal.aborted) return [];
159
+ if (asyncResult) {
160
+ errors.push(asyncResult);
161
+ if (validateFirst) break;
162
+ }
163
+ } catch {
164
+ if (controller.signal.aborted) return [];
165
+ errors.push("Validation failed");
166
+ if (validateFirst) break;
167
+ }
168
+ } else if (result) {
169
+ errors.push(result);
170
+ if (validateFirst) break;
171
+ }
172
+ }
173
+ const warnings = [];
174
+ for (const rule of record.warningRules) {
175
+ if (controller.signal.aborted) return [];
176
+ const result = rule.fn(value, getFieldValue);
177
+ if (result instanceof Promise) {
178
+ try {
179
+ const asyncResult = await result;
180
+ if (controller.signal.aborted) return [];
181
+ if (asyncResult) warnings.push(asyncResult);
182
+ } catch {
183
+ }
184
+ } else if (result) {
185
+ warnings.push(result);
186
+ }
187
+ }
188
+ if (!controller.signal.aborted) {
189
+ setMeta(name, { errors, warnings, validating: false });
190
+ fireFieldsChange(name);
191
+ }
192
+ return errors;
193
+ }
194
+ async function validateDependents(name) {
195
+ for (const [target, deps] of depMap) {
196
+ if (deps.includes(name)) {
197
+ await runValidation(target);
198
+ }
199
+ }
200
+ }
201
+ const form = {
202
+ register(name, fieldOptions) {
203
+ const opts = fieldOptions ?? {};
204
+ const templates = options?.validateMessages;
205
+ const label = opts.label;
206
+ fields.set(name, {
207
+ rules: opts.rules ? opts.rules.map((r) => ({ original: r, fn: compileRule(r, templates, label) })) : [],
208
+ warningRules: opts.warningRules ? opts.warningRules.map((r) => ({ original: r, fn: compileRule(r, templates, label) })) : [],
209
+ options: opts,
210
+ abortController: null
211
+ });
212
+ if (preservedValues.has(name)) {
213
+ core.set(name, preservedValues.get(name));
214
+ preservedValues.delete(name);
215
+ } else if (opts.defaultValue !== void 0 && core.get(name) === void 0) {
216
+ core.set(name, opts.defaultValue);
217
+ }
218
+ if (opts.dependencies) {
219
+ depMap.set(name, [...opts.dependencies]);
220
+ }
221
+ core.batch(() => {
222
+ initMeta(name);
223
+ });
224
+ },
225
+ unregister(name) {
226
+ const record = fields.get(name);
227
+ if (!record) return;
228
+ record.abortController?.abort();
229
+ const timer = debounceTimers.get(name);
230
+ if (timer) {
231
+ clearTimeout(timer);
232
+ debounceTimers.delete(name);
233
+ }
234
+ if (record.options.preserve) {
235
+ preservedValues.set(name, core.get(name));
236
+ }
237
+ fields.delete(name);
238
+ depMap.delete(name);
239
+ },
240
+ setValue(name, value) {
241
+ core.transaction(() => {
242
+ core.set(name, value);
243
+ setMeta(name, { dirty: true, touched: true });
244
+ });
245
+ fireValuesChange(name);
246
+ const mode = fields.get(name)?.options.validateOn ?? options?.validateOn ?? "change";
247
+ if (mode === "change") {
248
+ const debounceMs = options?.asyncDebounceMs;
249
+ if (debounceMs && debounceMs > 0) {
250
+ const existing = debounceTimers.get(name);
251
+ if (existing) clearTimeout(existing);
252
+ debounceTimers.set(
253
+ name,
254
+ setTimeout(() => {
255
+ debounceTimers.delete(name);
256
+ runValidation(name).then(() => validateDependents(name));
257
+ }, debounceMs)
258
+ );
259
+ } else {
260
+ runValidation(name).then(() => validateDependents(name));
261
+ }
262
+ }
263
+ },
264
+ getValue(name) {
265
+ return core.get(name);
266
+ },
267
+ onFieldBlur(name) {
268
+ setMeta(name, { touched: true });
269
+ const mode = fields.get(name)?.options.validateOn ?? options?.validateOn ?? "change";
270
+ if (mode === "blur") {
271
+ runValidation(name).then(() => validateDependents(name));
272
+ }
273
+ },
274
+ setFieldsValue(values) {
275
+ core.batch(() => {
276
+ for (const [name, value] of Object.entries(values)) {
277
+ core.set(name, value);
278
+ if (fields.has(name)) {
279
+ setMeta(name, { dirty: true, touched: true });
280
+ }
281
+ }
282
+ });
283
+ for (const name of Object.keys(values)) {
284
+ fireValuesChange(name);
285
+ }
286
+ },
287
+ getFieldsValue() {
288
+ const values = {};
289
+ for (const name of fields.keys()) {
290
+ values[name] = core.get(name);
291
+ }
292
+ return values;
293
+ },
294
+ getFieldState(name) {
295
+ return getMeta(name);
296
+ },
297
+ getFormState() {
298
+ let isDirty = false;
299
+ let isValid = true;
300
+ let isValidating = false;
301
+ for (const name of fields.keys()) {
302
+ const meta = getMeta(name);
303
+ if (meta.dirty) isDirty = true;
304
+ if (meta.errors.length > 0) isValid = false;
305
+ if (meta.validating) isValidating = true;
306
+ }
307
+ return { isDirty, isValid, isSubmitting, isValidating };
308
+ },
309
+ addRule(name, rule) {
310
+ const record = fields.get(name);
311
+ if (!record) return;
312
+ record.rules.push({
313
+ original: rule,
314
+ fn: compileRule(rule, options?.validateMessages, record.options.label)
315
+ });
316
+ },
317
+ removeRule(name, rule) {
318
+ const record = fields.get(name);
319
+ if (!record) return;
320
+ const idx = record.rules.findIndex((r) => r.original === rule);
321
+ if (idx !== -1) record.rules.splice(idx, 1);
322
+ },
323
+ depends(target, deps) {
324
+ depMap.set(target, [...deps]);
325
+ },
326
+ async validate(name) {
327
+ const errors = {};
328
+ const warnings = {};
329
+ if (name) {
330
+ const errs = await runValidation(name);
331
+ if (errs.length > 0) errors[name] = errs;
332
+ const meta = getMeta(name);
333
+ if (meta.warnings.length > 0) warnings[name] = meta.warnings;
334
+ } else {
335
+ const promises = [];
336
+ for (const fieldName of fields.keys()) {
337
+ promises.push(
338
+ runValidation(fieldName).then((errs) => {
339
+ if (errs.length > 0) errors[fieldName] = errs;
340
+ const meta = getMeta(fieldName);
341
+ if (meta.warnings.length > 0) warnings[fieldName] = meta.warnings;
342
+ })
343
+ );
344
+ }
345
+ await Promise.all(promises);
346
+ }
347
+ return { valid: Object.keys(errors).length === 0, errors, warnings };
348
+ },
349
+ async submit(handler) {
350
+ isSubmitting = true;
351
+ core.batch(() => {
352
+ for (const name of fields.keys()) {
353
+ setMeta(name, { touched: true });
354
+ }
355
+ });
356
+ const result = await form.validate();
357
+ if (!result.valid) {
358
+ isSubmitting = false;
359
+ return;
360
+ }
361
+ const values = {};
362
+ for (const name of fields.keys()) {
363
+ values[name] = core.get(name);
364
+ }
365
+ try {
366
+ await handler(values);
367
+ } finally {
368
+ isSubmitting = false;
369
+ }
370
+ },
371
+ reset(values) {
372
+ core.batch(() => {
373
+ for (const [name, record] of fields) {
374
+ record.abortController?.abort();
375
+ record.abortController = null;
376
+ const resetValue = values?.[name] ?? options?.defaultValues?.[name] ?? record.options.defaultValue ?? void 0;
377
+ core.set(name, resetValue);
378
+ initMeta(name);
379
+ }
380
+ });
381
+ preservedValues.clear();
382
+ },
383
+ getFieldNames() {
384
+ return [...fields.keys()];
385
+ },
386
+ // Manual error/warning control
387
+ setFieldError(name, errs) {
388
+ const arr = typeof errs === "string" ? [errs] : errs;
389
+ setMeta(name, { errors: arr });
390
+ fireFieldsChange(name);
391
+ },
392
+ setFieldWarning(name, warns) {
393
+ const arr = typeof warns === "string" ? [warns] : warns;
394
+ setMeta(name, { warnings: arr });
395
+ },
396
+ clearFieldErrors(name) {
397
+ setMeta(name, { errors: [], warnings: [] });
398
+ fireFieldsChange(name);
399
+ },
400
+ getFieldErrors(name) {
401
+ return getMeta(name).errors;
402
+ },
403
+ getFieldWarnings(name) {
404
+ return getMeta(name).warnings;
405
+ },
406
+ isFieldTouched(name) {
407
+ return getMeta(name).touched;
408
+ },
409
+ isFieldValidating(name) {
410
+ return getMeta(name).validating;
411
+ },
412
+ // List operations
413
+ getListValue(name) {
414
+ const val = core.get(name);
415
+ return Array.isArray(val) ? val : [];
416
+ },
417
+ listAdd(name, defaultValue, insertIndex) {
418
+ const current = form.getListValue(name);
419
+ if (insertIndex !== void 0 && insertIndex >= 0 && insertIndex <= current.length) {
420
+ const next = [...current];
421
+ next.splice(insertIndex, 0, defaultValue ?? null);
422
+ core.set(name, next);
423
+ } else {
424
+ core.set(name, [...current, defaultValue ?? null]);
425
+ }
426
+ },
427
+ listRemove(name, index) {
428
+ const current = form.getListValue(name);
429
+ if (Array.isArray(index)) {
430
+ const indices = new Set(index);
431
+ core.set(name, current.filter((_, i) => !indices.has(i)));
432
+ } else {
433
+ core.set(name, current.filter((_, i) => i !== index));
434
+ }
435
+ },
436
+ listMove(name, from, to) {
437
+ const current = [...form.getListValue(name)];
438
+ if (from < 0 || from >= current.length || to < 0 || to >= current.length) return;
439
+ const [item] = current.splice(from, 1);
440
+ current.splice(to, 0, item);
441
+ core.set(name, current);
442
+ },
443
+ listReplace(name, values) {
444
+ core.set(name, [...values]);
445
+ }
446
+ };
447
+ return form;
448
+ }
449
+
450
+ export {
451
+ createForm
452
+ };
453
+ //# sourceMappingURL=chunk-KMGRNPLG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engines/form/FormEngine.ts"],"sourcesContent":["import type { Core } from '../../types'\r\nimport type {\r\n FieldMeta,\r\n FieldOptions,\r\n FieldStatus,\r\n FormEngine,\r\n FormOptions,\r\n FormState,\r\n GetFieldValue,\r\n Rule,\r\n RuleFn,\r\n RuleObject,\r\n ValidationResult,\r\n} from './types'\r\n\r\nimport { FORM_META_PREFIX as META_PREFIX } from '../namespaces'\r\n\r\nfunction metaPath(name: string, field: string): string {\r\n return `${META_PREFIX}${name}.${field}`\r\n}\r\n\r\nfunction interpolateMessage(template: string, vars: Record<string, unknown>): string {\r\n return template.replace(/\\$\\{(\\w+)\\}/g, (_, key) => {\r\n return vars[key] != null ? String(vars[key]) : ''\r\n })\r\n}\r\n\r\nfunction compileRule(rule: Rule, templates?: Record<string, string>, fieldLabel?: string): RuleFn {\r\n if (typeof rule === 'function') return rule\r\n\r\n const obj = rule as RuleObject\r\n const vars: Record<string, unknown> = { label: fieldLabel ?? 'Field' }\r\n\r\n return (value: unknown, getFieldValue: GetFieldValue): string | null | Promise<string | null> => {\r\n if (obj.required) {\r\n if (value === undefined || value === null || value === '') {\r\n const tpl = templates?.required ?? obj.message\r\n return tpl ? interpolateMessage(tpl, vars) : (obj.message ?? 'This field is required')\r\n }\r\n }\r\n\r\n if (value === undefined || value === null || value === '') return null\r\n\r\n if (obj.type) {\r\n switch (obj.type) {\r\n case 'string':\r\n if (typeof value !== 'string') return obj.message ?? 'Must be a string'\r\n break\r\n case 'number':\r\n if (typeof value !== 'number' || isNaN(value)) return obj.message ?? 'Must be a number'\r\n break\r\n case 'email':\r\n if (typeof value !== 'string' || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value))\r\n return obj.message ?? 'Invalid email'\r\n break\r\n case 'url':\r\n try {\r\n new URL(value as string)\r\n } catch {\r\n return obj.message ?? 'Invalid URL'\r\n }\r\n break\r\n case 'boolean':\r\n if (typeof value !== 'boolean') return obj.message ?? 'Must be a boolean'\r\n break\r\n }\r\n }\r\n\r\n if (obj.min !== undefined) {\r\n vars.min = obj.min\r\n if (typeof value === 'string' && value.length < obj.min) {\r\n const tpl = templates?.min ?? obj.message\r\n return tpl ? interpolateMessage(tpl, vars) : (obj.message ?? `Minimum ${obj.min} characters`)\r\n }\r\n if (typeof value === 'number' && value < obj.min)\r\n return obj.message ?? `Minimum value is ${obj.min}`\r\n }\r\n\r\n if (obj.max !== undefined) {\r\n vars.max = obj.max\r\n if (typeof value === 'string' && value.length > obj.max) {\r\n const tpl = templates?.max ?? obj.message\r\n return tpl ? interpolateMessage(tpl, vars) : (obj.message ?? `Maximum ${obj.max} characters`)\r\n }\r\n if (typeof value === 'number' && value > obj.max)\r\n return obj.message ?? `Maximum value is ${obj.max}`\r\n }\r\n\r\n if (obj.pattern) {\r\n if (typeof value === 'string' && !obj.pattern.test(value))\r\n return obj.message ?? 'Invalid format'\r\n }\r\n\r\n if (obj.validator) {\r\n return obj.validator(value, getFieldValue)\r\n }\r\n\r\n return null\r\n }\r\n}\r\n\r\nfunction computeStatus(meta: { errors: string[]; warnings: string[]; validating: boolean }): FieldStatus {\r\n if (meta.validating) return 'validating'\r\n if (meta.errors.length > 0) return 'error'\r\n if (meta.warnings.length > 0) return 'warning'\r\n return undefined\r\n}\r\n\r\ninterface CompiledRule {\r\n original: Rule\r\n fn: RuleFn\r\n}\r\n\r\ninterface FieldRecord {\r\n rules: CompiledRule[]\r\n warningRules: CompiledRule[]\r\n options: FieldOptions\r\n abortController: AbortController | null\r\n}\r\n\r\nexport function createForm(core: Core, options?: FormOptions): FormEngine {\r\n const fields = new Map<string, FieldRecord>()\r\n const depMap = new Map<string, string[]>()\r\n const debounceTimers = new Map<string, ReturnType<typeof setTimeout>>()\r\n const preservedValues = new Map<string, unknown>()\r\n let isSubmitting = false\r\n\r\n if (options?.defaultValues) {\r\n for (const [key, value] of Object.entries(options.defaultValues)) {\r\n core.set(key, value)\r\n }\r\n }\r\n\r\n function setMeta(name: string, meta: Partial<Record<string, unknown>>): void {\r\n for (const [key, value] of Object.entries(meta)) {\r\n core.set(metaPath(name, key), value)\r\n }\r\n }\r\n\r\n function getMeta(name: string): FieldMeta {\r\n const errors = (core.get(metaPath(name, 'errors')) as string[]) ?? []\r\n const warnings = (core.get(metaPath(name, 'warnings')) as string[]) ?? []\r\n const validating = (core.get(metaPath(name, 'validating')) as boolean) ?? false\r\n const touched = (core.get(metaPath(name, 'touched')) as boolean) ?? false\r\n const dirty = (core.get(metaPath(name, 'dirty')) as boolean) ?? false\r\n\r\n return {\r\n touched,\r\n dirty,\r\n errors,\r\n warnings,\r\n validating,\r\n status: computeStatus({ errors, warnings, validating }),\r\n error: errors[0] ?? null,\r\n }\r\n }\r\n\r\n function initMeta(name: string): void {\r\n setMeta(name, {\r\n touched: false,\r\n dirty: false,\r\n errors: [],\r\n warnings: [],\r\n validating: false,\r\n })\r\n }\r\n\r\n const getFieldValue: GetFieldValue = (fieldName: string) => core.get(fieldName)\r\n\r\n function fireValuesChange(changedName: string): void {\r\n if (!options?.onValuesChange) return\r\n const changed: Record<string, unknown> = { [changedName]: core.get(changedName) }\r\n const all: Record<string, unknown> = {}\r\n for (const n of fields.keys()) all[n] = core.get(n)\r\n options.onValuesChange(changed, all)\r\n }\r\n\r\n function fireFieldsChange(changedName: string): void {\r\n if (!options?.onFieldsChange) return\r\n const meta = getMeta(changedName)\r\n options.onFieldsChange([{\r\n name: changedName,\r\n value: core.get(changedName),\r\n errors: meta.errors,\r\n }])\r\n }\r\n\r\n async function runValidation(name: string): Promise<string[]> {\r\n const record = fields.get(name)\r\n if (!record) return []\r\n\r\n const value = core.get(name)\r\n const validateFirst = record.options.validateFirst ?? options?.validateFirst ?? false\r\n\r\n record.abortController?.abort()\r\n const controller = new AbortController()\r\n record.abortController = controller\r\n\r\n const errors: string[] = []\r\n\r\n for (const rule of record.rules) {\r\n if (controller.signal.aborted) return []\r\n\r\n const result = rule.fn(value, getFieldValue)\r\n\r\n if (result instanceof Promise) {\r\n setMeta(name, { validating: true })\r\n try {\r\n const asyncResult = await result\r\n if (controller.signal.aborted) return []\r\n if (asyncResult) {\r\n errors.push(asyncResult)\r\n if (validateFirst) break\r\n }\r\n } catch {\r\n if (controller.signal.aborted) return []\r\n errors.push('Validation failed')\r\n if (validateFirst) break\r\n }\r\n } else if (result) {\r\n errors.push(result)\r\n if (validateFirst) break\r\n }\r\n }\r\n\r\n const warnings: string[] = []\r\n for (const rule of record.warningRules) {\r\n if (controller.signal.aborted) return []\r\n const result = rule.fn(value, getFieldValue)\r\n if (result instanceof Promise) {\r\n try {\r\n const asyncResult = await result\r\n if (controller.signal.aborted) return []\r\n if (asyncResult) warnings.push(asyncResult)\r\n } catch {\r\n // skip\r\n }\r\n } else if (result) {\r\n warnings.push(result)\r\n }\r\n }\r\n\r\n if (!controller.signal.aborted) {\r\n setMeta(name, { errors, warnings, validating: false })\r\n fireFieldsChange(name)\r\n }\r\n\r\n return errors\r\n }\r\n\r\n async function validateDependents(name: string): Promise<void> {\r\n for (const [target, deps] of depMap) {\r\n if (deps.includes(name)) {\r\n await runValidation(target)\r\n }\r\n }\r\n }\r\n\r\n const form: FormEngine = {\r\n register(name: string, fieldOptions?: FieldOptions): void {\r\n const opts = fieldOptions ?? {}\r\n const templates = options?.validateMessages\r\n const label = opts.label\r\n\r\n fields.set(name, {\r\n rules: opts.rules\r\n ? opts.rules.map((r) => ({ original: r, fn: compileRule(r, templates, label) }))\r\n : [],\r\n warningRules: opts.warningRules\r\n ? opts.warningRules.map((r) => ({ original: r, fn: compileRule(r, templates, label) }))\r\n : [],\r\n options: opts,\r\n abortController: null,\r\n })\r\n\r\n if (preservedValues.has(name)) {\r\n core.set(name, preservedValues.get(name))\r\n preservedValues.delete(name)\r\n } else if (opts.defaultValue !== undefined && core.get(name) === undefined) {\r\n core.set(name, opts.defaultValue)\r\n }\r\n\r\n if (opts.dependencies) {\r\n depMap.set(name, [...opts.dependencies])\r\n }\r\n\r\n core.batch(() => {\r\n initMeta(name)\r\n })\r\n },\r\n\r\n unregister(name: string): void {\r\n const record = fields.get(name)\r\n if (!record) return\r\n record.abortController?.abort()\r\n\r\n const timer = debounceTimers.get(name)\r\n if (timer) {\r\n clearTimeout(timer)\r\n debounceTimers.delete(name)\r\n }\r\n\r\n if (record.options.preserve) {\r\n preservedValues.set(name, core.get(name))\r\n }\r\n\r\n fields.delete(name)\r\n depMap.delete(name)\r\n },\r\n\r\n setValue(name: string, value: unknown): void {\r\n core.transaction(() => {\r\n core.set(name, value)\r\n setMeta(name, { dirty: true, touched: true })\r\n })\r\n\r\n fireValuesChange(name)\r\n\r\n const mode = fields.get(name)?.options.validateOn ?? options?.validateOn ?? 'change'\r\n if (mode === 'change') {\r\n const debounceMs = options?.asyncDebounceMs\r\n if (debounceMs && debounceMs > 0) {\r\n const existing = debounceTimers.get(name)\r\n if (existing) clearTimeout(existing)\r\n debounceTimers.set(\r\n name,\r\n setTimeout(() => {\r\n debounceTimers.delete(name)\r\n runValidation(name).then(() => validateDependents(name))\r\n }, debounceMs),\r\n )\r\n } else {\r\n runValidation(name).then(() => validateDependents(name))\r\n }\r\n }\r\n },\r\n\r\n getValue(name: string): unknown {\r\n return core.get(name)\r\n },\r\n\r\n onFieldBlur(name: string): void {\r\n setMeta(name, { touched: true })\r\n const mode = fields.get(name)?.options.validateOn ?? options?.validateOn ?? 'change'\r\n if (mode === 'blur') {\r\n runValidation(name).then(() => validateDependents(name))\r\n }\r\n },\r\n\r\n setFieldsValue(values: Record<string, unknown>): void {\r\n core.batch(() => {\r\n for (const [name, value] of Object.entries(values)) {\r\n core.set(name, value)\r\n if (fields.has(name)) {\r\n setMeta(name, { dirty: true, touched: true })\r\n }\r\n }\r\n })\r\n\r\n for (const name of Object.keys(values)) {\r\n fireValuesChange(name)\r\n }\r\n },\r\n\r\n getFieldsValue(): Record<string, unknown> {\r\n const values: Record<string, unknown> = {}\r\n for (const name of fields.keys()) {\r\n values[name] = core.get(name)\r\n }\r\n return values\r\n },\r\n\r\n getFieldState(name: string): FieldMeta {\r\n return getMeta(name)\r\n },\r\n\r\n getFormState(): FormState {\r\n let isDirty = false\r\n let isValid = true\r\n let isValidating = false\r\n\r\n for (const name of fields.keys()) {\r\n const meta = getMeta(name)\r\n if (meta.dirty) isDirty = true\r\n if (meta.errors.length > 0) isValid = false\r\n if (meta.validating) isValidating = true\r\n }\r\n\r\n return { isDirty, isValid, isSubmitting, isValidating }\r\n },\r\n\r\n addRule(name: string, rule: Rule): void {\r\n const record = fields.get(name)\r\n if (!record) return\r\n record.rules.push({\r\n original: rule,\r\n fn: compileRule(rule, options?.validateMessages, record.options.label),\r\n })\r\n },\r\n\r\n removeRule(name: string, rule: Rule): void {\r\n const record = fields.get(name)\r\n if (!record) return\r\n const idx = record.rules.findIndex((r) => r.original === rule)\r\n if (idx !== -1) record.rules.splice(idx, 1)\r\n },\r\n\r\n depends(target: string, deps: string[]): void {\r\n depMap.set(target, [...deps])\r\n },\r\n\r\n async validate(name?: string): Promise<ValidationResult> {\r\n const errors: Record<string, string[]> = {}\r\n const warnings: Record<string, string[]> = {}\r\n\r\n if (name) {\r\n const errs = await runValidation(name)\r\n if (errs.length > 0) errors[name] = errs\r\n const meta = getMeta(name)\r\n if (meta.warnings.length > 0) warnings[name] = meta.warnings\r\n } else {\r\n const promises: Promise<void>[] = []\r\n for (const fieldName of fields.keys()) {\r\n promises.push(\r\n runValidation(fieldName).then((errs) => {\r\n if (errs.length > 0) errors[fieldName] = errs\r\n const meta = getMeta(fieldName)\r\n if (meta.warnings.length > 0) warnings[fieldName] = meta.warnings\r\n }),\r\n )\r\n }\r\n await Promise.all(promises)\r\n }\r\n\r\n return { valid: Object.keys(errors).length === 0, errors, warnings }\r\n },\r\n\r\n async submit(handler: (values: Record<string, unknown>) => Promise<void>): Promise<void> {\r\n isSubmitting = true\r\n\r\n core.batch(() => {\r\n for (const name of fields.keys()) {\r\n setMeta(name, { touched: true })\r\n }\r\n })\r\n\r\n const result = await form.validate()\r\n\r\n if (!result.valid) {\r\n isSubmitting = false\r\n return\r\n }\r\n\r\n const values: Record<string, unknown> = {}\r\n for (const name of fields.keys()) {\r\n values[name] = core.get(name)\r\n }\r\n\r\n try {\r\n await handler(values)\r\n } finally {\r\n isSubmitting = false\r\n }\r\n },\r\n\r\n reset(values?: Record<string, unknown>): void {\r\n core.batch(() => {\r\n for (const [name, record] of fields) {\r\n record.abortController?.abort()\r\n record.abortController = null\r\n\r\n const resetValue =\r\n values?.[name] ??\r\n options?.defaultValues?.[name] ??\r\n record.options.defaultValue ??\r\n undefined\r\n core.set(name, resetValue)\r\n initMeta(name)\r\n }\r\n })\r\n preservedValues.clear()\r\n },\r\n\r\n getFieldNames(): string[] {\r\n return [...fields.keys()]\r\n },\r\n\r\n // Manual error/warning control\r\n setFieldError(name: string, errs: string | string[]): void {\r\n const arr = typeof errs === 'string' ? [errs] : errs\r\n setMeta(name, { errors: arr })\r\n fireFieldsChange(name)\r\n },\r\n\r\n setFieldWarning(name: string, warns: string | string[]): void {\r\n const arr = typeof warns === 'string' ? [warns] : warns\r\n setMeta(name, { warnings: arr })\r\n },\r\n\r\n clearFieldErrors(name: string): void {\r\n setMeta(name, { errors: [], warnings: [] })\r\n fireFieldsChange(name)\r\n },\r\n\r\n getFieldErrors(name: string): string[] {\r\n return getMeta(name).errors\r\n },\r\n\r\n getFieldWarnings(name: string): string[] {\r\n return getMeta(name).warnings\r\n },\r\n\r\n isFieldTouched(name: string): boolean {\r\n return getMeta(name).touched\r\n },\r\n\r\n isFieldValidating(name: string): boolean {\r\n return getMeta(name).validating\r\n },\r\n\r\n // List operations\r\n getListValue(name: string): unknown[] {\r\n const val = core.get(name)\r\n return Array.isArray(val) ? val : []\r\n },\r\n\r\n listAdd(name: string, defaultValue?: unknown, insertIndex?: number): void {\r\n const current = form.getListValue(name)\r\n if (insertIndex !== undefined && insertIndex >= 0 && insertIndex <= current.length) {\r\n const next = [...current]\r\n next.splice(insertIndex, 0, defaultValue ?? null)\r\n core.set(name, next)\r\n } else {\r\n core.set(name, [...current, defaultValue ?? null])\r\n }\r\n },\r\n\r\n listRemove(name: string, index: number | number[]): void {\r\n const current = form.getListValue(name)\r\n if (Array.isArray(index)) {\r\n const indices = new Set(index)\r\n core.set(name, current.filter((_, i) => !indices.has(i)))\r\n } else {\r\n core.set(name, current.filter((_, i) => i !== index))\r\n }\r\n },\r\n\r\n listMove(name: string, from: number, to: number): void {\r\n const current = [...form.getListValue(name)]\r\n if (from < 0 || from >= current.length || to < 0 || to >= current.length) return\r\n const [item] = current.splice(from, 1)\r\n current.splice(to, 0, item)\r\n core.set(name, current)\r\n },\r\n\r\n listReplace(name: string, values: unknown[]): void {\r\n core.set(name, [...values])\r\n },\r\n }\r\n\r\n return form\r\n}\r\n"],"mappings":"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","names":[]}