@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
package/dist/form.cjs ADDED
@@ -0,0 +1,498 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/engines/form/index.ts
21
+ var form_exports = {};
22
+ __export(form_exports, {
23
+ createForm: () => createForm
24
+ });
25
+ module.exports = __toCommonJS(form_exports);
26
+
27
+ // src/engines/namespaces.ts
28
+ var reserved = /* @__PURE__ */ new Map();
29
+ function reservePrefix(engine, prefix) {
30
+ if (!prefix.startsWith("$") || !prefix.endsWith(".")) {
31
+ throw new Error(
32
+ `[skygraph] engine "${engine}" tried to reserve invalid prefix "${prefix}". Engine prefixes must start with "$" and end with ".".`
33
+ );
34
+ }
35
+ const existing = reserved.get(prefix);
36
+ if (existing !== void 0 && existing !== engine) {
37
+ throw new Error(
38
+ `[skygraph] prefix "${prefix}" is already owned by engine "${existing}", cannot reserve it for "${engine}". Pick a different prefix or update the registry.`
39
+ );
40
+ }
41
+ reserved.set(prefix, engine);
42
+ return prefix;
43
+ }
44
+ var FORM_META_PREFIX = reservePrefix("form", "$meta.");
45
+ var TABLE_PREFIX = reservePrefix("table", "$table.");
46
+ var TREE_PREFIX = reservePrefix("tree", "$tree.");
47
+ var GRAPH_PREFIX = reservePrefix("graph", "$graph.");
48
+ var CALENDAR_PREFIX = reservePrefix("calendar", "$calendar.");
49
+
50
+ // src/engines/form/FormEngine.ts
51
+ function metaPath(name, field) {
52
+ return `${FORM_META_PREFIX}${name}.${field}`;
53
+ }
54
+ function interpolateMessage(template, vars) {
55
+ return template.replace(/\$\{(\w+)\}/g, (_, key) => {
56
+ return vars[key] != null ? String(vars[key]) : "";
57
+ });
58
+ }
59
+ function compileRule(rule, templates, fieldLabel) {
60
+ if (typeof rule === "function") return rule;
61
+ const obj = rule;
62
+ const vars = { label: fieldLabel ?? "Field" };
63
+ return (value, getFieldValue) => {
64
+ if (obj.required) {
65
+ if (value === void 0 || value === null || value === "") {
66
+ const tpl = templates?.required ?? obj.message;
67
+ return tpl ? interpolateMessage(tpl, vars) : obj.message ?? "This field is required";
68
+ }
69
+ }
70
+ if (value === void 0 || value === null || value === "") return null;
71
+ if (obj.type) {
72
+ switch (obj.type) {
73
+ case "string":
74
+ if (typeof value !== "string") return obj.message ?? "Must be a string";
75
+ break;
76
+ case "number":
77
+ if (typeof value !== "number" || isNaN(value)) return obj.message ?? "Must be a number";
78
+ break;
79
+ case "email":
80
+ if (typeof value !== "string" || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value))
81
+ return obj.message ?? "Invalid email";
82
+ break;
83
+ case "url":
84
+ try {
85
+ new URL(value);
86
+ } catch {
87
+ return obj.message ?? "Invalid URL";
88
+ }
89
+ break;
90
+ case "boolean":
91
+ if (typeof value !== "boolean") return obj.message ?? "Must be a boolean";
92
+ break;
93
+ }
94
+ }
95
+ if (obj.min !== void 0) {
96
+ vars.min = obj.min;
97
+ if (typeof value === "string" && value.length < obj.min) {
98
+ const tpl = templates?.min ?? obj.message;
99
+ return tpl ? interpolateMessage(tpl, vars) : obj.message ?? `Minimum ${obj.min} characters`;
100
+ }
101
+ if (typeof value === "number" && value < obj.min)
102
+ return obj.message ?? `Minimum value is ${obj.min}`;
103
+ }
104
+ if (obj.max !== void 0) {
105
+ vars.max = obj.max;
106
+ if (typeof value === "string" && value.length > obj.max) {
107
+ const tpl = templates?.max ?? obj.message;
108
+ return tpl ? interpolateMessage(tpl, vars) : obj.message ?? `Maximum ${obj.max} characters`;
109
+ }
110
+ if (typeof value === "number" && value > obj.max)
111
+ return obj.message ?? `Maximum value is ${obj.max}`;
112
+ }
113
+ if (obj.pattern) {
114
+ if (typeof value === "string" && !obj.pattern.test(value))
115
+ return obj.message ?? "Invalid format";
116
+ }
117
+ if (obj.validator) {
118
+ return obj.validator(value, getFieldValue);
119
+ }
120
+ return null;
121
+ };
122
+ }
123
+ function computeStatus(meta) {
124
+ if (meta.validating) return "validating";
125
+ if (meta.errors.length > 0) return "error";
126
+ if (meta.warnings.length > 0) return "warning";
127
+ return void 0;
128
+ }
129
+ function createForm(core, options) {
130
+ const fields = /* @__PURE__ */ new Map();
131
+ const depMap = /* @__PURE__ */ new Map();
132
+ const debounceTimers = /* @__PURE__ */ new Map();
133
+ const preservedValues = /* @__PURE__ */ new Map();
134
+ let isSubmitting = false;
135
+ if (options?.defaultValues) {
136
+ for (const [key, value] of Object.entries(options.defaultValues)) {
137
+ core.set(key, value);
138
+ }
139
+ }
140
+ function setMeta(name, meta) {
141
+ for (const [key, value] of Object.entries(meta)) {
142
+ core.set(metaPath(name, key), value);
143
+ }
144
+ }
145
+ function getMeta(name) {
146
+ const errors = core.get(metaPath(name, "errors")) ?? [];
147
+ const warnings = core.get(metaPath(name, "warnings")) ?? [];
148
+ const validating = core.get(metaPath(name, "validating")) ?? false;
149
+ const touched = core.get(metaPath(name, "touched")) ?? false;
150
+ const dirty = core.get(metaPath(name, "dirty")) ?? false;
151
+ return {
152
+ touched,
153
+ dirty,
154
+ errors,
155
+ warnings,
156
+ validating,
157
+ status: computeStatus({ errors, warnings, validating }),
158
+ error: errors[0] ?? null
159
+ };
160
+ }
161
+ function initMeta(name) {
162
+ setMeta(name, {
163
+ touched: false,
164
+ dirty: false,
165
+ errors: [],
166
+ warnings: [],
167
+ validating: false
168
+ });
169
+ }
170
+ const getFieldValue = (fieldName) => core.get(fieldName);
171
+ function fireValuesChange(changedName) {
172
+ if (!options?.onValuesChange) return;
173
+ const changed = { [changedName]: core.get(changedName) };
174
+ const all = {};
175
+ for (const n of fields.keys()) all[n] = core.get(n);
176
+ options.onValuesChange(changed, all);
177
+ }
178
+ function fireFieldsChange(changedName) {
179
+ if (!options?.onFieldsChange) return;
180
+ const meta = getMeta(changedName);
181
+ options.onFieldsChange([{
182
+ name: changedName,
183
+ value: core.get(changedName),
184
+ errors: meta.errors
185
+ }]);
186
+ }
187
+ async function runValidation(name) {
188
+ const record = fields.get(name);
189
+ if (!record) return [];
190
+ const value = core.get(name);
191
+ const validateFirst = record.options.validateFirst ?? options?.validateFirst ?? false;
192
+ record.abortController?.abort();
193
+ const controller = new AbortController();
194
+ record.abortController = controller;
195
+ const errors = [];
196
+ for (const rule of record.rules) {
197
+ if (controller.signal.aborted) return [];
198
+ const result = rule.fn(value, getFieldValue);
199
+ if (result instanceof Promise) {
200
+ setMeta(name, { validating: true });
201
+ try {
202
+ const asyncResult = await result;
203
+ if (controller.signal.aborted) return [];
204
+ if (asyncResult) {
205
+ errors.push(asyncResult);
206
+ if (validateFirst) break;
207
+ }
208
+ } catch {
209
+ if (controller.signal.aborted) return [];
210
+ errors.push("Validation failed");
211
+ if (validateFirst) break;
212
+ }
213
+ } else if (result) {
214
+ errors.push(result);
215
+ if (validateFirst) break;
216
+ }
217
+ }
218
+ const warnings = [];
219
+ for (const rule of record.warningRules) {
220
+ if (controller.signal.aborted) return [];
221
+ const result = rule.fn(value, getFieldValue);
222
+ if (result instanceof Promise) {
223
+ try {
224
+ const asyncResult = await result;
225
+ if (controller.signal.aborted) return [];
226
+ if (asyncResult) warnings.push(asyncResult);
227
+ } catch {
228
+ }
229
+ } else if (result) {
230
+ warnings.push(result);
231
+ }
232
+ }
233
+ if (!controller.signal.aborted) {
234
+ setMeta(name, { errors, warnings, validating: false });
235
+ fireFieldsChange(name);
236
+ }
237
+ return errors;
238
+ }
239
+ async function validateDependents(name) {
240
+ for (const [target, deps] of depMap) {
241
+ if (deps.includes(name)) {
242
+ await runValidation(target);
243
+ }
244
+ }
245
+ }
246
+ const form = {
247
+ register(name, fieldOptions) {
248
+ const opts = fieldOptions ?? {};
249
+ const templates = options?.validateMessages;
250
+ const label = opts.label;
251
+ fields.set(name, {
252
+ rules: opts.rules ? opts.rules.map((r) => ({ original: r, fn: compileRule(r, templates, label) })) : [],
253
+ warningRules: opts.warningRules ? opts.warningRules.map((r) => ({ original: r, fn: compileRule(r, templates, label) })) : [],
254
+ options: opts,
255
+ abortController: null
256
+ });
257
+ if (preservedValues.has(name)) {
258
+ core.set(name, preservedValues.get(name));
259
+ preservedValues.delete(name);
260
+ } else if (opts.defaultValue !== void 0 && core.get(name) === void 0) {
261
+ core.set(name, opts.defaultValue);
262
+ }
263
+ if (opts.dependencies) {
264
+ depMap.set(name, [...opts.dependencies]);
265
+ }
266
+ core.batch(() => {
267
+ initMeta(name);
268
+ });
269
+ },
270
+ unregister(name) {
271
+ const record = fields.get(name);
272
+ if (!record) return;
273
+ record.abortController?.abort();
274
+ const timer = debounceTimers.get(name);
275
+ if (timer) {
276
+ clearTimeout(timer);
277
+ debounceTimers.delete(name);
278
+ }
279
+ if (record.options.preserve) {
280
+ preservedValues.set(name, core.get(name));
281
+ }
282
+ fields.delete(name);
283
+ depMap.delete(name);
284
+ },
285
+ setValue(name, value) {
286
+ core.transaction(() => {
287
+ core.set(name, value);
288
+ setMeta(name, { dirty: true, touched: true });
289
+ });
290
+ fireValuesChange(name);
291
+ const mode = fields.get(name)?.options.validateOn ?? options?.validateOn ?? "change";
292
+ if (mode === "change") {
293
+ const debounceMs = options?.asyncDebounceMs;
294
+ if (debounceMs && debounceMs > 0) {
295
+ const existing = debounceTimers.get(name);
296
+ if (existing) clearTimeout(existing);
297
+ debounceTimers.set(
298
+ name,
299
+ setTimeout(() => {
300
+ debounceTimers.delete(name);
301
+ runValidation(name).then(() => validateDependents(name));
302
+ }, debounceMs)
303
+ );
304
+ } else {
305
+ runValidation(name).then(() => validateDependents(name));
306
+ }
307
+ }
308
+ },
309
+ getValue(name) {
310
+ return core.get(name);
311
+ },
312
+ onFieldBlur(name) {
313
+ setMeta(name, { touched: true });
314
+ const mode = fields.get(name)?.options.validateOn ?? options?.validateOn ?? "change";
315
+ if (mode === "blur") {
316
+ runValidation(name).then(() => validateDependents(name));
317
+ }
318
+ },
319
+ setFieldsValue(values) {
320
+ core.batch(() => {
321
+ for (const [name, value] of Object.entries(values)) {
322
+ core.set(name, value);
323
+ if (fields.has(name)) {
324
+ setMeta(name, { dirty: true, touched: true });
325
+ }
326
+ }
327
+ });
328
+ for (const name of Object.keys(values)) {
329
+ fireValuesChange(name);
330
+ }
331
+ },
332
+ getFieldsValue() {
333
+ const values = {};
334
+ for (const name of fields.keys()) {
335
+ values[name] = core.get(name);
336
+ }
337
+ return values;
338
+ },
339
+ getFieldState(name) {
340
+ return getMeta(name);
341
+ },
342
+ getFormState() {
343
+ let isDirty = false;
344
+ let isValid = true;
345
+ let isValidating = false;
346
+ for (const name of fields.keys()) {
347
+ const meta = getMeta(name);
348
+ if (meta.dirty) isDirty = true;
349
+ if (meta.errors.length > 0) isValid = false;
350
+ if (meta.validating) isValidating = true;
351
+ }
352
+ return { isDirty, isValid, isSubmitting, isValidating };
353
+ },
354
+ addRule(name, rule) {
355
+ const record = fields.get(name);
356
+ if (!record) return;
357
+ record.rules.push({
358
+ original: rule,
359
+ fn: compileRule(rule, options?.validateMessages, record.options.label)
360
+ });
361
+ },
362
+ removeRule(name, rule) {
363
+ const record = fields.get(name);
364
+ if (!record) return;
365
+ const idx = record.rules.findIndex((r) => r.original === rule);
366
+ if (idx !== -1) record.rules.splice(idx, 1);
367
+ },
368
+ depends(target, deps) {
369
+ depMap.set(target, [...deps]);
370
+ },
371
+ async validate(name) {
372
+ const errors = {};
373
+ const warnings = {};
374
+ if (name) {
375
+ const errs = await runValidation(name);
376
+ if (errs.length > 0) errors[name] = errs;
377
+ const meta = getMeta(name);
378
+ if (meta.warnings.length > 0) warnings[name] = meta.warnings;
379
+ } else {
380
+ const promises = [];
381
+ for (const fieldName of fields.keys()) {
382
+ promises.push(
383
+ runValidation(fieldName).then((errs) => {
384
+ if (errs.length > 0) errors[fieldName] = errs;
385
+ const meta = getMeta(fieldName);
386
+ if (meta.warnings.length > 0) warnings[fieldName] = meta.warnings;
387
+ })
388
+ );
389
+ }
390
+ await Promise.all(promises);
391
+ }
392
+ return { valid: Object.keys(errors).length === 0, errors, warnings };
393
+ },
394
+ async submit(handler) {
395
+ isSubmitting = true;
396
+ core.batch(() => {
397
+ for (const name of fields.keys()) {
398
+ setMeta(name, { touched: true });
399
+ }
400
+ });
401
+ const result = await form.validate();
402
+ if (!result.valid) {
403
+ isSubmitting = false;
404
+ return;
405
+ }
406
+ const values = {};
407
+ for (const name of fields.keys()) {
408
+ values[name] = core.get(name);
409
+ }
410
+ try {
411
+ await handler(values);
412
+ } finally {
413
+ isSubmitting = false;
414
+ }
415
+ },
416
+ reset(values) {
417
+ core.batch(() => {
418
+ for (const [name, record] of fields) {
419
+ record.abortController?.abort();
420
+ record.abortController = null;
421
+ const resetValue = values?.[name] ?? options?.defaultValues?.[name] ?? record.options.defaultValue ?? void 0;
422
+ core.set(name, resetValue);
423
+ initMeta(name);
424
+ }
425
+ });
426
+ preservedValues.clear();
427
+ },
428
+ getFieldNames() {
429
+ return [...fields.keys()];
430
+ },
431
+ // Manual error/warning control
432
+ setFieldError(name, errs) {
433
+ const arr = typeof errs === "string" ? [errs] : errs;
434
+ setMeta(name, { errors: arr });
435
+ fireFieldsChange(name);
436
+ },
437
+ setFieldWarning(name, warns) {
438
+ const arr = typeof warns === "string" ? [warns] : warns;
439
+ setMeta(name, { warnings: arr });
440
+ },
441
+ clearFieldErrors(name) {
442
+ setMeta(name, { errors: [], warnings: [] });
443
+ fireFieldsChange(name);
444
+ },
445
+ getFieldErrors(name) {
446
+ return getMeta(name).errors;
447
+ },
448
+ getFieldWarnings(name) {
449
+ return getMeta(name).warnings;
450
+ },
451
+ isFieldTouched(name) {
452
+ return getMeta(name).touched;
453
+ },
454
+ isFieldValidating(name) {
455
+ return getMeta(name).validating;
456
+ },
457
+ // List operations
458
+ getListValue(name) {
459
+ const val = core.get(name);
460
+ return Array.isArray(val) ? val : [];
461
+ },
462
+ listAdd(name, defaultValue, insertIndex) {
463
+ const current = form.getListValue(name);
464
+ if (insertIndex !== void 0 && insertIndex >= 0 && insertIndex <= current.length) {
465
+ const next = [...current];
466
+ next.splice(insertIndex, 0, defaultValue ?? null);
467
+ core.set(name, next);
468
+ } else {
469
+ core.set(name, [...current, defaultValue ?? null]);
470
+ }
471
+ },
472
+ listRemove(name, index) {
473
+ const current = form.getListValue(name);
474
+ if (Array.isArray(index)) {
475
+ const indices = new Set(index);
476
+ core.set(name, current.filter((_, i) => !indices.has(i)));
477
+ } else {
478
+ core.set(name, current.filter((_, i) => i !== index));
479
+ }
480
+ },
481
+ listMove(name, from, to) {
482
+ const current = [...form.getListValue(name)];
483
+ if (from < 0 || from >= current.length || to < 0 || to >= current.length) return;
484
+ const [item] = current.splice(from, 1);
485
+ current.splice(to, 0, item);
486
+ core.set(name, current);
487
+ },
488
+ listReplace(name, values) {
489
+ core.set(name, [...values]);
490
+ }
491
+ };
492
+ return form;
493
+ }
494
+ // Annotate the CommonJS export names for ESM import in node:
495
+ 0 && (module.exports = {
496
+ createForm
497
+ });
498
+ //# sourceMappingURL=form.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engines/form/index.ts","../src/engines/namespaces.ts","../src/engines/form/FormEngine.ts"],"sourcesContent":["export { createForm } from './FormEngine'\nexport type {\n FormEngine,\n FieldMeta,\n FieldMetaExtensions,\n FieldStatus,\n FormState,\n GetFieldValue,\n Rule,\n RuleFn,\n RuleObject,\n ValidationResult,\n FieldOptions,\n FormOptions,\n ValidationMode,\n FormListOperation,\n} from './types'\n","/**\n * Engine path namespace registry\n *\n * Every engine that stores state in the Core store under a `$`-prefixed\n * namespace MUST register its prefix here. This prevents two engines from\n * silently colliding on the same root path (e.g. two engines both writing\n * under `$meta.`).\n *\n * Rules:\n * 1. Prefixes MUST start with `$` and end with `.`.\n * 2. Prefixes MUST be unique across all engines.\n * 3. An engine MUST use `reservedPrefix(name)` at module load so\n * collisions surface at import time during dev/test.\n * 4. User data MUST NOT live under `$` prefixes — reserve them for engines.\n */\n\nconst reserved = new Map<string, string>()\n\n/**\n * Reserve (or look up) a prefix for an engine. Throws synchronously if the\n * same prefix is already owned by a different engine.\n */\nexport function reservePrefix(engine: string, prefix: string): string {\n if (!prefix.startsWith('$') || !prefix.endsWith('.')) {\n throw new Error(\n `[skygraph] engine \"${engine}\" tried to reserve invalid prefix \"${prefix}\". ` +\n `Engine prefixes must start with \"$\" and end with \".\".`,\n )\n }\n\n const existing = reserved.get(prefix)\n if (existing !== undefined && existing !== engine) {\n throw new Error(\n `[skygraph] prefix \"${prefix}\" is already owned by engine \"${existing}\", ` +\n `cannot reserve it for \"${engine}\". ` +\n `Pick a different prefix or update the registry.`,\n )\n }\n\n reserved.set(prefix, engine)\n return prefix\n}\n\n/** Snapshot of registered engine prefixes (debug / introspection). */\nexport function listReservedPrefixes(): ReadonlyMap<string, string> {\n return new Map(reserved)\n}\n\n/** Test-only helper. DO NOT call from engine code. */\nexport function __resetPrefixes(): void {\n reserved.clear()\n}\n\n// ── Canonical in-tree reservations ─────────────────────────────────────────\n//\n// Listed here so they are reserved even if the engine module is not loaded.\n// New engines must add their entry here and reference it from their\n// implementation via `reservePrefix(...)`.\n\nexport const FORM_META_PREFIX = reservePrefix('form', '$meta.')\nexport const TABLE_PREFIX = reservePrefix('table', '$table.')\nexport const TREE_PREFIX = reservePrefix('tree', '$tree.')\nexport const GRAPH_PREFIX = reservePrefix('graph', '$graph.')\nexport const CALENDAR_PREFIX = reservePrefix('calendar', '$calendar.')\n","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":[]}