@vielzeug/forge 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +70 -0
  2. package/dist/_dev.cjs +2 -0
  3. package/dist/_dev.cjs.map +1 -0
  4. package/dist/_dev.d.ts +2 -0
  5. package/dist/_dev.d.ts.map +1 -0
  6. package/dist/_dev.js +9 -0
  7. package/dist/_dev.js.map +1 -0
  8. package/dist/_utils.cjs +2 -0
  9. package/dist/_utils.cjs.map +1 -0
  10. package/dist/_utils.d.ts +12 -0
  11. package/dist/_utils.d.ts.map +1 -0
  12. package/dist/_utils.js +25 -0
  13. package/dist/_utils.js.map +1 -0
  14. package/dist/adapters/form-data.cjs +2 -0
  15. package/dist/adapters/form-data.cjs.map +1 -0
  16. package/dist/adapters/form-data.d.ts +8 -0
  17. package/dist/adapters/form-data.d.ts.map +1 -0
  18. package/dist/adapters/form-data.js +14 -0
  19. package/dist/adapters/form-data.js.map +1 -0
  20. package/dist/adapters/validators.cjs +2 -0
  21. package/dist/adapters/validators.cjs.map +1 -0
  22. package/dist/adapters/validators.d.ts +44 -0
  23. package/dist/adapters/validators.d.ts.map +1 -0
  24. package/dist/adapters/validators.js +20 -0
  25. package/dist/adapters/validators.js.map +1 -0
  26. package/dist/core/array.cjs +2 -0
  27. package/dist/core/array.cjs.map +1 -0
  28. package/dist/core/array.d.ts +10 -0
  29. package/dist/core/array.d.ts.map +1 -0
  30. package/dist/core/array.js +46 -0
  31. package/dist/core/array.js.map +1 -0
  32. package/dist/core/asyncQueue.cjs +2 -0
  33. package/dist/core/asyncQueue.cjs.map +1 -0
  34. package/dist/core/asyncQueue.d.ts +22 -0
  35. package/dist/core/asyncQueue.d.ts.map +1 -0
  36. package/dist/core/asyncQueue.js +67 -0
  37. package/dist/core/asyncQueue.js.map +1 -0
  38. package/dist/core/context.cjs +2 -0
  39. package/dist/core/context.cjs.map +1 -0
  40. package/dist/core/context.d.ts +10 -0
  41. package/dist/core/context.d.ts.map +1 -0
  42. package/dist/core/context.js +176 -0
  43. package/dist/core/context.js.map +1 -0
  44. package/dist/core/lifecycle.cjs +2 -0
  45. package/dist/core/lifecycle.cjs.map +1 -0
  46. package/dist/core/lifecycle.d.ts +13 -0
  47. package/dist/core/lifecycle.d.ts.map +1 -0
  48. package/dist/core/lifecycle.js +42 -0
  49. package/dist/core/lifecycle.js.map +1 -0
  50. package/dist/core/observe.cjs +2 -0
  51. package/dist/core/observe.cjs.map +1 -0
  52. package/dist/core/observe.d.ts +18 -0
  53. package/dist/core/observe.d.ts.map +1 -0
  54. package/dist/core/observe.js +90 -0
  55. package/dist/core/observe.js.map +1 -0
  56. package/dist/core/scope.cjs +2 -0
  57. package/dist/core/scope.cjs.map +1 -0
  58. package/dist/core/scope.d.ts +8 -0
  59. package/dist/core/scope.d.ts.map +1 -0
  60. package/dist/core/scope.js +239 -0
  61. package/dist/core/scope.js.map +1 -0
  62. package/dist/core/validation.cjs +2 -0
  63. package/dist/core/validation.cjs.map +1 -0
  64. package/dist/core/validation.d.ts +23 -0
  65. package/dist/core/validation.d.ts.map +1 -0
  66. package/dist/core/validation.js +173 -0
  67. package/dist/core/validation.js.map +1 -0
  68. package/dist/core/values.cjs +2 -0
  69. package/dist/core/values.cjs.map +1 -0
  70. package/dist/core/values.d.ts +31 -0
  71. package/dist/core/values.d.ts.map +1 -0
  72. package/dist/core/values.js +149 -0
  73. package/dist/core/values.js.map +1 -0
  74. package/dist/devtools.cjs +2 -0
  75. package/dist/devtools.cjs.map +1 -0
  76. package/dist/devtools.d.ts +40 -0
  77. package/dist/devtools.d.ts.map +1 -0
  78. package/dist/devtools.js +29 -0
  79. package/dist/devtools.js.map +1 -0
  80. package/dist/errors.cjs +2 -0
  81. package/dist/errors.cjs.map +1 -0
  82. package/dist/errors.d.ts +21 -0
  83. package/dist/errors.d.ts.map +1 -0
  84. package/dist/errors.js +22 -0
  85. package/dist/errors.js.map +1 -0
  86. package/dist/forge.cjs +2 -0
  87. package/dist/forge.cjs.map +1 -0
  88. package/dist/forge.iife.js +2 -0
  89. package/dist/forge.iife.js.map +1 -0
  90. package/dist/forge.js +2 -0
  91. package/dist/forge.js.map +1 -0
  92. package/dist/form.cjs +2 -0
  93. package/dist/form.cjs.map +1 -0
  94. package/dist/form.d.ts +6 -0
  95. package/dist/form.d.ts.map +1 -0
  96. package/dist/form.js +89 -0
  97. package/dist/form.js.map +1 -0
  98. package/dist/index.cjs +1 -0
  99. package/dist/index.d.ts +5 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +5 -0
  102. package/dist/types.cjs +2 -0
  103. package/dist/types.cjs.map +1 -0
  104. package/dist/types.d.ts +391 -0
  105. package/dist/types.d.ts.map +1 -0
  106. package/dist/types.js +21 -0
  107. package/dist/types.js.map +1 -0
  108. package/package.json +56 -0
@@ -0,0 +1,31 @@
1
+ import type { FormContext } from './context';
2
+ import { type ArrayField, type ErrorKeyOf, type FieldState, type FieldValidator, type FlatKeyOf, type RegisterFieldOptions, type SetOptions, type TypeAtPath, type Unsubscribe } from '../types';
3
+ /**
4
+ * Value/field-mutation operations: get/set/values, dirty tracking, errors, dynamic field
5
+ * registration, touch, and reset/replace/patch/array. Moved verbatim from `createForm()`'s
6
+ * "Value access" through "Lifecycle: field operations" sections.
7
+ */
8
+ export declare function createValueOps<TValues extends Record<string, unknown>>(ctx: FormContext<TValues>): {
9
+ array: (name: FlatKeyOf<TValues>) => ArrayField;
10
+ clearError: (name: ErrorKeyOf<TValues>) => void;
11
+ field: <K extends FlatKeyOf<TValues>>(name: K) => FieldState<TypeAtPath<TValues, K>>;
12
+ get: <K extends FlatKeyOf<TValues>>(name: K) => TypeAtPath<TValues, K>;
13
+ listFields: () => readonly string[];
14
+ patch: (partial: Record<string, unknown>) => void;
15
+ registerField: <K extends FlatKeyOf<TValues>>(name: K, options?: RegisterFieldOptions<TypeAtPath<TValues, K>>) => Unsubscribe;
16
+ removeField: (name: FlatKeyOf<TValues>) => void;
17
+ replace: (newValues: TValues) => void;
18
+ reset: () => void;
19
+ resetErrors: (nextErrors?: Partial<Record<ErrorKeyOf<TValues>, string | undefined>>) => void;
20
+ resetField: (name: FlatKeyOf<TValues>) => void;
21
+ set: <K extends FlatKeyOf<TValues>>(name: K, value: TypeAtPath<TValues, K>, options?: SetOptions) => void;
22
+ setError: (name: ErrorKeyOf<TValues>, message: string) => void;
23
+ setValidator: (name: FlatKeyOf<TValues>, validator?: FieldValidator<unknown>) => void;
24
+ touch: (name: FlatKeyOf<TValues>) => void;
25
+ touchAll: () => void;
26
+ untouch: (name: FlatKeyOf<TValues>) => void;
27
+ untouchAll: () => void;
28
+ values: () => TValues;
29
+ };
30
+ export type ValueOps<TValues extends Record<string, unknown>> = ReturnType<typeof createValueOps<TValues>>;
31
+ //# sourceMappingURL=values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../src/core/values.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAI7C,OAAO,EACL,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,oBAAoB,EACzB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,UAAU,CAAC;AAGlB;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC;kBA4S1E,SAAS,CAAC,OAAO,CAAC,KAAG,UAAU;uBArP1B,UAAU,CAAC,OAAO,CAAC,KAAG,IAAI;YAnBrC,CAAC,SAAS,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAG,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;UAnC5E,CAAC,SAAS,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAG,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;sBAqJpD,SAAS,MAAM,EAAE;qBAsIhB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,IAAI;oBAhK/B,CAAC,SAAS,SAAS,CAAC,OAAO,CAAC,QAC3C,CAAC,YACE,oBAAoB,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KACpD,WAAW;wBAwFa,SAAS,CAAC,OAAO,CAAC,KAAG,IAAI;yBAyCxB,OAAO,KAAG,IAAI;iBArBxB,IAAI;+BAvKW,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,KAAQ,IAAI;uBAkI3E,SAAS,CAAC,OAAO,CAAC,KAAG,IAAI;UAhLtC,CAAC,SAAS,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,YAAW,UAAU,KAAQ,IAAI;qBAsB1F,UAAU,CAAC,OAAO,CAAC,WAAW,MAAM,KAAG,IAAI;yBAuDvC,SAAS,CAAC,OAAO,CAAC,cAAc,cAAc,CAAC,OAAO,CAAC,KAAG,IAAI;kBA8DrE,SAAS,CAAC,OAAO,CAAC,KAAG,IAAI;oBAoBzB,IAAI;oBAVF,SAAS,CAAC,OAAO,CAAC,KAAG,IAAI;sBAmBzB,IAAI;kBArLR,OAAO;EA2U3B;AAED,MAAM,MAAM,QAAQ,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,UAAU,CAAC,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC"}
@@ -0,0 +1,149 @@
1
+ import { assertSafeKey as e, flattenValues as t, sanitizeForLog as n, unflattenValues as r } from "../_utils.js";
2
+ import { warn as i } from "../_dev.js";
3
+ import { createArrayField as a } from "./array.js";
4
+ //#region src/core/values.ts
5
+ function o(o) {
6
+ function s(t) {
7
+ let n = t;
8
+ return e(n), o.store.get(n);
9
+ }
10
+ function c() {
11
+ return o.cachedValues ??= r(Object.fromEntries(o.store));
12
+ }
13
+ function l(e, t) {
14
+ o.baseline.get(e) === t ? o.dirty.delete(e) : o.dirty.add(e);
15
+ }
16
+ function u(t, n, r = {}) {
17
+ o.ensureNotDisposed();
18
+ let i = t;
19
+ e(i), o.store.set(i, n), l(i, n), r.touched && o.touched.add(i), o.requestNotify(i);
20
+ }
21
+ function d(t) {
22
+ let n = t;
23
+ return e(n), o.getFieldSnapshot(n);
24
+ }
25
+ function f(t, n) {
26
+ o.ensureNotDisposed();
27
+ let r = t;
28
+ e(r), o.fieldErrors.set(r, n), o.invalidateErrors(), o.requestNotify(r);
29
+ }
30
+ function p(t) {
31
+ o.ensureNotDisposed();
32
+ let n = t;
33
+ e(n), o.fieldErrors.delete(n) && (o.invalidateErrors(), o.requestNotify(n));
34
+ }
35
+ function m(t = {}) {
36
+ o.ensureNotDisposed(), o.fieldErrors.clear();
37
+ for (let [n, r] of Object.entries(t)) e(n), typeof r == "string" && o.fieldErrors.set(n, r);
38
+ o.invalidateErrors(), o.requestNotify();
39
+ }
40
+ function h(e, t) {
41
+ /\.\d+(\.|$)/.test(e) && !o.store.has(e) && i(`${t}('${n(e, 80)}'): path looks like an array item key. Array items are stored as whole arrays — register on the parent key instead.`);
42
+ }
43
+ function g(t, n) {
44
+ o.ensureNotDisposed();
45
+ let r = t;
46
+ e(r), h(r, "setValidator"), o.fieldCtrls.get(r)?.abort(), o.fieldCtrls.delete(r), n ? o.validators.set(r, n) : (o.validators.delete(r), o.fieldErrors.delete(r) && (o.invalidateErrors(), o.requestNotify(r)));
47
+ }
48
+ function _(t, n = {}) {
49
+ o.ensureNotDisposed();
50
+ let r = t;
51
+ return e(r), h(r, "fields.register"), n.validator !== void 0 && g(t, n.validator), n.defaultValue !== void 0 && !o.store.has(r) && (o.store.set(r, n.defaultValue), o.baseline.set(r, n.defaultValue), o.requestNotify(r)), () => {
52
+ o.disposed || w(t);
53
+ };
54
+ }
55
+ function v() {
56
+ let e = /* @__PURE__ */ new Set();
57
+ for (let t of o.store.keys()) e.add(t);
58
+ for (let t of o.validators.keys()) e.add(t);
59
+ return Object.freeze([...e]);
60
+ }
61
+ function y(t) {
62
+ o.ensureNotDisposed();
63
+ let n = t;
64
+ e(n), o.touched.add(n), o.requestNotify(n);
65
+ }
66
+ function b(t) {
67
+ o.ensureNotDisposed();
68
+ let n = t;
69
+ e(n), o.touched.delete(n) && o.requestNotify(n);
70
+ }
71
+ function x() {
72
+ o.ensureNotDisposed();
73
+ for (let e of o.store.keys()) o.touched.add(e);
74
+ for (let e of o.validators.keys()) o.touched.add(e);
75
+ o.requestNotify();
76
+ }
77
+ function S() {
78
+ o.ensureNotDisposed(), o.touched.clear(), o.requestNotify();
79
+ }
80
+ function C(t) {
81
+ o.ensureNotDisposed();
82
+ let n = t;
83
+ e(n), o.fieldCtrls.get(n)?.abort(), o.fieldCtrls.delete(n), o.store.set(n, o.baseline.get(n)), o.dirty.delete(n), o.touched.delete(n), o.fieldErrors.delete(n) && o.invalidateErrors(), o.requestNotify(n);
84
+ }
85
+ function w(t) {
86
+ o.ensureNotDisposed();
87
+ let n = t;
88
+ e(n), o.store.delete(n), o.baseline.delete(n), o.dirty.delete(n), o.touched.delete(n), o.validators.delete(n), o.arrayCache.delete(n), o.fieldCtrls.get(n)?.abort(), o.fieldCtrls.delete(n), o.fieldErrors.delete(n) && o.invalidateErrors(), o.requestNotify(n);
89
+ }
90
+ function T() {
91
+ o.ensureNotDisposed();
92
+ for (let e of o.runCtrls) e.abort();
93
+ for (let e of o.fieldCtrls.values()) e.abort();
94
+ o.runCtrls.clear(), o.fieldCtrls.clear(), o.validatingRuns.clear(), o.store.clear(), o.fieldErrors.clear(), o.touched.clear(), o.dirty.clear(), o.submitCount = 0, o.invalidateErrors();
95
+ for (let [e, t] of o.baseline) o.store.set(e, t);
96
+ o.requestNotify();
97
+ }
98
+ function E(e) {
99
+ o.ensureNotDisposed();
100
+ for (let e of o.runCtrls) e.abort();
101
+ for (let e of o.fieldCtrls.values()) e.abort();
102
+ o.runCtrls.clear(), o.fieldCtrls.clear(), o.validatingRuns.clear();
103
+ let n = t(e);
104
+ o.store.clear(), o.baseline.clear(), o.fieldErrors.clear(), o.touched.clear(), o.dirty.clear(), o.submitCount = 0, o.invalidateErrors();
105
+ for (let [e, t] of Object.entries(n)) o.store.set(e, t), o.baseline.set(e, t);
106
+ o.requestNotify();
107
+ }
108
+ function D(e) {
109
+ o.ensureNotDisposed();
110
+ let n = t(e);
111
+ for (let [e, t] of Object.entries(n)) o.baseline.set(e, t), o.store.set(e, t), o.dirty.delete(e);
112
+ o.requestNotify(Object.keys(n));
113
+ }
114
+ function O(t) {
115
+ o.ensureNotDisposed();
116
+ let n = t;
117
+ e(n);
118
+ let r = o.arrayCache.get(n);
119
+ if (r) return r;
120
+ let i = a(t, o.store, u);
121
+ return o.arrayCache.set(n, i), i;
122
+ }
123
+ return {
124
+ array: O,
125
+ clearError: p,
126
+ field: d,
127
+ get: s,
128
+ listFields: v,
129
+ patch: D,
130
+ registerField: _,
131
+ removeField: w,
132
+ replace: E,
133
+ reset: T,
134
+ resetErrors: m,
135
+ resetField: C,
136
+ set: u,
137
+ setError: f,
138
+ setValidator: g,
139
+ touch: y,
140
+ touchAll: x,
141
+ untouch: b,
142
+ untouchAll: S,
143
+ values: c
144
+ };
145
+ }
146
+ //#endregion
147
+ export { o as createValueOps };
148
+
149
+ //# sourceMappingURL=values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"values.js","names":[],"sources":["../../src/core/values.ts"],"sourcesContent":["import type { FormContext } from './context';\n\nimport { warn } from '../_dev';\nimport { assertSafeKey, flattenValues, sanitizeForLog, unflattenValues } from '../_utils';\nimport {\n type ArrayField,\n type ErrorKeyOf,\n type FieldState,\n type FieldValidator,\n type FlatKeyOf,\n type RegisterFieldOptions,\n type SetOptions,\n type TypeAtPath,\n type Unsubscribe,\n} from '../types';\nimport { createArrayField } from './array';\n\n/**\n * Value/field-mutation operations: get/set/values, dirty tracking, errors, dynamic field\n * registration, touch, and reset/replace/patch/array. Moved verbatim from `createForm()`'s\n * \"Value access\" through \"Lifecycle: field operations\" sections.\n */\nexport function createValueOps<TValues extends Record<string, unknown>>(ctx: FormContext<TValues>) {\n function get<K extends FlatKeyOf<TValues>>(name: K): TypeAtPath<TValues, K> {\n const key = name as string;\n\n assertSafeKey(key);\n\n return ctx.store.get(key) as TypeAtPath<TValues, K>;\n }\n\n function values(): TValues {\n return (ctx.cachedValues ??= unflattenValues(Object.fromEntries(ctx.store)) as TValues);\n }\n\n /* ======== Dirty tracking ======== */\n\n function trackDirty(name: string, value: unknown): void {\n if (ctx.baseline.get(name) === value) ctx.dirty.delete(name);\n else ctx.dirty.add(name);\n }\n\n /* ======== Field mutation ======== */\n\n function set<K extends FlatKeyOf<TValues>>(name: K, value: TypeAtPath<TValues, K>, options: SetOptions = {}): void {\n ctx.ensureNotDisposed();\n\n const key = name as string;\n\n assertSafeKey(key);\n ctx.store.set(key, value);\n trackDirty(key, value);\n\n if (options.touched) ctx.touched.add(key);\n\n ctx.requestNotify(key);\n }\n\n function field<K extends FlatKeyOf<TValues>>(name: K): FieldState<TypeAtPath<TValues, K>> {\n const key = name as string;\n\n assertSafeKey(key);\n\n return ctx.getFieldSnapshot(key) as FieldState<TypeAtPath<TValues, K>>;\n }\n\n function setError(name: ErrorKeyOf<TValues>, message: string): void {\n ctx.ensureNotDisposed();\n\n const key = name as string;\n\n assertSafeKey(key);\n ctx.fieldErrors.set(key, message);\n ctx.invalidateErrors();\n ctx.requestNotify(key);\n }\n\n function clearError(name: ErrorKeyOf<TValues>): void {\n ctx.ensureNotDisposed();\n\n const key = name as string;\n\n assertSafeKey(key);\n\n if (ctx.fieldErrors.delete(key)) {\n ctx.invalidateErrors();\n ctx.requestNotify(key);\n }\n }\n\n function resetErrors(nextErrors: Partial<Record<ErrorKeyOf<TValues>, string | undefined>> = {}): void {\n ctx.ensureNotDisposed();\n\n ctx.fieldErrors.clear();\n\n for (const [key, message] of Object.entries(nextErrors)) {\n assertSafeKey(key);\n\n if (typeof message === 'string') ctx.fieldErrors.set(key, message);\n }\n\n ctx.invalidateErrors();\n ctx.requestNotify();\n }\n\n /**\n * Warns when `key` looks like a dot-notation array item path (e.g. \"tags.0\") that isn't\n * already a real store entry — array items are stored as whole arrays, not individual keys.\n * Shared by `setValidator()` and `registerField()`.\n */\n function warnIfArrayItemKey(key: string, apiLabel: string): void {\n if (/\\.\\d+(\\.|$)/.test(key) && !ctx.store.has(key)) {\n const displayKey = sanitizeForLog(key, 80);\n\n warn(\n `${apiLabel}('${displayKey}'): path looks like an array item key. ` +\n `Array items are stored as whole arrays — register on the parent key instead.`,\n );\n }\n }\n\n function setValidator(name: FlatKeyOf<TValues>, validator?: FieldValidator<unknown>): void {\n ctx.ensureNotDisposed();\n\n const key = name as string;\n\n assertSafeKey(key);\n warnIfArrayItemKey(key, 'setValidator');\n\n ctx.fieldCtrls.get(key)?.abort();\n ctx.fieldCtrls.delete(key);\n\n if (validator) {\n ctx.validators.set(key, validator);\n } else {\n ctx.validators.delete(key);\n\n if (ctx.fieldErrors.delete(key)) {\n ctx.invalidateErrors();\n ctx.requestNotify(key);\n }\n }\n }\n\n /* ======== Dynamic field registration ======== */\n\n function registerField<K extends FlatKeyOf<TValues>>(\n name: K,\n options: RegisterFieldOptions<TypeAtPath<TValues, K>> = {},\n ): Unsubscribe {\n ctx.ensureNotDisposed();\n\n const key = name as string;\n\n assertSafeKey(key);\n warnIfArrayItemKey(key, 'fields.register');\n\n if (options.validator !== undefined) setValidator(name, options.validator as FieldValidator<unknown>);\n\n if (options.defaultValue !== undefined && !ctx.store.has(key)) {\n ctx.store.set(key, options.defaultValue);\n ctx.baseline.set(key, options.defaultValue);\n ctx.requestNotify(key);\n }\n\n return () => {\n if (!ctx.disposed) removeField(name);\n };\n }\n\n /* ======== Field enumeration ======== */\n\n function listFields(): readonly string[] {\n const known = new Set<string>();\n\n for (const name of ctx.store.keys()) known.add(name);\n for (const name of ctx.validators.keys()) known.add(name);\n\n return Object.freeze([...known]);\n }\n\n /* ======== Touch ======== */\n\n function touch(name: FlatKeyOf<TValues>): void {\n ctx.ensureNotDisposed();\n\n const key = name as string;\n\n assertSafeKey(key);\n ctx.touched.add(key);\n ctx.requestNotify(key);\n }\n\n function untouch(name: FlatKeyOf<TValues>): void {\n ctx.ensureNotDisposed();\n\n const key = name as string;\n\n assertSafeKey(key);\n\n if (ctx.touched.delete(key)) ctx.requestNotify(key);\n }\n\n function touchAll(): void {\n ctx.ensureNotDisposed();\n\n for (const name of ctx.store.keys()) ctx.touched.add(name);\n for (const name of ctx.validators.keys()) ctx.touched.add(name);\n\n ctx.requestNotify();\n }\n\n function untouchAll(): void {\n ctx.ensureNotDisposed();\n ctx.touched.clear();\n ctx.requestNotify();\n }\n\n /* ======== Lifecycle: field operations ======== */\n\n function resetField(name: FlatKeyOf<TValues>): void {\n ctx.ensureNotDisposed();\n\n const key = name as string;\n\n assertSafeKey(key);\n ctx.fieldCtrls.get(key)?.abort();\n ctx.fieldCtrls.delete(key);\n ctx.store.set(key, ctx.baseline.get(key));\n ctx.dirty.delete(key);\n ctx.touched.delete(key);\n\n if (ctx.fieldErrors.delete(key)) ctx.invalidateErrors();\n\n ctx.requestNotify(key);\n }\n\n function removeField(name: FlatKeyOf<TValues>): void {\n ctx.ensureNotDisposed();\n\n const key = name as string;\n\n assertSafeKey(key);\n ctx.store.delete(key);\n ctx.baseline.delete(key);\n ctx.dirty.delete(key);\n ctx.touched.delete(key);\n ctx.validators.delete(key);\n ctx.arrayCache.delete(key);\n ctx.fieldCtrls.get(key)?.abort();\n ctx.fieldCtrls.delete(key);\n\n if (ctx.fieldErrors.delete(key)) ctx.invalidateErrors();\n\n ctx.requestNotify(key);\n }\n\n function reset(): void {\n ctx.ensureNotDisposed();\n\n for (const ctrl of ctx.runCtrls) ctrl.abort();\n for (const ctrl of ctx.fieldCtrls.values()) ctrl.abort();\n\n ctx.runCtrls.clear();\n ctx.fieldCtrls.clear();\n ctx.validatingRuns.clear();\n ctx.store.clear();\n ctx.fieldErrors.clear();\n ctx.touched.clear();\n ctx.dirty.clear();\n ctx.submitCount = 0;\n ctx.invalidateErrors();\n\n for (const [name, value] of ctx.baseline) ctx.store.set(name, value);\n\n ctx.requestNotify();\n }\n\n function replace(newValues: TValues): void {\n ctx.ensureNotDisposed();\n\n for (const ctrl of ctx.runCtrls) ctrl.abort();\n for (const ctrl of ctx.fieldCtrls.values()) ctrl.abort();\n\n ctx.runCtrls.clear();\n ctx.fieldCtrls.clear();\n ctx.validatingRuns.clear();\n\n const flat = flattenValues(newValues as Record<string, unknown>);\n\n ctx.store.clear();\n ctx.baseline.clear();\n ctx.fieldErrors.clear();\n ctx.touched.clear();\n ctx.dirty.clear();\n ctx.submitCount = 0;\n ctx.invalidateErrors();\n\n for (const [name, value] of Object.entries(flat)) {\n ctx.store.set(name, value);\n ctx.baseline.set(name, value);\n }\n\n ctx.requestNotify();\n }\n\n function patch(partial: Record<string, unknown>): void {\n ctx.ensureNotDisposed();\n\n const flat = flattenValues(partial);\n\n for (const [key, value] of Object.entries(flat)) {\n ctx.baseline.set(key, value);\n ctx.store.set(key, value);\n ctx.dirty.delete(key);\n }\n\n ctx.requestNotify(Object.keys(flat));\n }\n\n /* ======== Array helpers ======== */\n\n function array(name: FlatKeyOf<TValues>): ArrayField {\n ctx.ensureNotDisposed();\n\n const key = name as string;\n\n assertSafeKey(key);\n\n const cached = ctx.arrayCache.get(key);\n\n if (cached) return cached;\n\n const helpers = createArrayField(name, ctx.store, set as (name: string, value: unknown) => void);\n\n ctx.arrayCache.set(key, helpers);\n\n return helpers;\n }\n\n return {\n array,\n clearError,\n field,\n get,\n listFields,\n patch,\n registerField,\n removeField,\n replace,\n reset,\n resetErrors,\n resetField,\n set,\n setError,\n setValidator,\n touch,\n touchAll,\n untouch,\n untouchAll,\n values,\n };\n}\n\nexport type ValueOps<TValues extends Record<string, unknown>> = ReturnType<typeof createValueOps<TValues>>;\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./_utils.cjs");let t=require("@vielzeug/arsenal");var n=!globalThis.__FORGE_PROD__;function r(r,i={}){if(!n)return()=>{};let a=`[forge:devtools:${i.label??`form`}]`,o=new Map,s=r.state.isSubmitting,c=r.state.isLoading;function l(e){let n=new Set(o.keys());for(let e of Object.keys((0,t.flattenPaths)(r.values())))n.add(e);for(let t of Object.keys(e.errors))n.add(t);for(let t of e.touchedFields)n.add(t);return n}function u(t){for(let n of l(t)){let t=r.field(n),i=o.get(n);if(o.set(n,t),!i)continue;let s=e.sanitizeForLog(n,80);i.value!==t.value&&console.debug(`${a} field "${s}" value:`,i.value,`→`,t.value),i.error!==t.error&&console.debug(`${a} field "${s}" error:`,i.error,`→`,t.error),i.touched!==t.touched&&console.debug(`${a} field "${s}" touched:`,t.touched),i.dirty!==t.dirty&&console.debug(`${a} field "${s}" dirty:`,t.dirty)}}return r.subscribe(e=>{u(e),e.isSubmitting!==s&&(s=e.isSubmitting,console.debug(`${a} submit ${e.isSubmitting?`started`:`ended`} (submitCount=${e.submitCount})`)),e.isLoading!==c&&(c=e.isLoading,console.debug(`${a} isLoading:`,e.isLoading))},{sync:!0})}exports.attachForgeDevtools=r;
2
+ //# sourceMappingURL=devtools.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools.cjs","names":[],"sources":["../src/devtools.ts"],"sourcesContent":["/**\n * @vielzeug/forge — debug utilities for form state visualisation.\n *\n * Import from the dedicated sub-path so it is tree-shaken from production bundles:\n * ```ts\n * import { attachForgeDevtools } from '@vielzeug/forge/devtools';\n * ```\n */\n\nimport type { FieldState, FlatKeyOf, Form, FormState, Unsubscribe } from './types';\n\nimport { flattenValues, sanitizeForLog } from './_utils';\n\nconst isDev = !(globalThis as { __FORGE_PROD__?: boolean }).__FORGE_PROD__;\n\n/** Options for {@link attachForgeDevtools}. */\nexport type ForgeDevtoolsOptions = {\n /** Label included in every log line, useful when debugging multiple forms at once. Default: `\"form\"`. */\n label?: string;\n};\n\n/**\n * Attaches a `console.debug`-based observer to `form` that logs a distinct line per observable\n * state transition: per-field value/error/touched/dirty changes, submit start/end (via the\n * `isSubmitting` edge), and `isLoading` edge (async `defaultValues` resolving).\n *\n * **Development only** by default — logging is a no-op when `__FORGE_PROD__` is set (the same\n * convention `_dev.ts` uses internally). Import from the dedicated `/devtools` sub-path so the\n * logging code is tree-shaken from production bundles entirely.\n *\n * Works identically on scoped sub-forms (`form.scope('address')`) — field paths logged are\n * relative to whatever `form` object is passed in, matching that form's own `state` convention.\n *\n * @example\n * ```ts\n * import { createForm } from '@vielzeug/forge';\n * import { attachForgeDevtools } from '@vielzeug/forge/devtools';\n *\n * const form = createForm({ defaultValues: { email: '' } });\n * const detach = attachForgeDevtools(form, { label: 'signup' });\n * // [forge:devtools:signup] field \"email\" value: \"\" → \"a@b.com\"\n *\n * detach(); // stop logging\n * ```\n */\nexport function attachForgeDevtools<TValues extends Record<string, unknown>>(\n form: Form<TValues>,\n options: ForgeDevtoolsOptions = {},\n): Unsubscribe {\n if (!isDev) return () => {};\n\n const prefix = `[forge:devtools:${options.label ?? 'form'}]`;\n const fieldSnapshots = new Map<string, FieldState<unknown>>();\n\n let prevIsSubmitting = form.state.isSubmitting;\n let prevIsLoading = form.state.isLoading;\n\n function knownFieldKeys(state: FormState): Set<string> {\n const keys = new Set<string>(fieldSnapshots.keys());\n\n for (const key of Object.keys(flattenValues(form.values() as Record<string, unknown>))) keys.add(key);\n for (const key of Object.keys(state.errors)) keys.add(key);\n for (const key of state.touchedFields) keys.add(key);\n\n return keys;\n }\n\n function logFieldDiffs(state: FormState): void {\n for (const key of knownFieldKeys(state)) {\n const next = form.field(key as FlatKeyOf<TValues>);\n const prev = fieldSnapshots.get(key);\n\n fieldSnapshots.set(key, next);\n\n // First observation of this field establishes a baseline — logging it would just be\n // noise (every field would \"change\" from undefined on attach).\n if (!prev) continue;\n\n // Security: `key` is a caller-chosen field path (assertSafeKey only rejects reserved\n // segments, not control characters) — sanitize before interpolating into console output\n // to prevent terminal-escape-sequence injection, mirroring the sanitization `warn()`\n // call sites already apply (see `_utils.ts` sanitizeForLog).\n const safeKey = sanitizeForLog(key, 80);\n\n if (prev.value !== next.value) console.debug(`${prefix} field \"${safeKey}\" value:`, prev.value, '→', next.value);\n\n if (prev.error !== next.error) console.debug(`${prefix} field \"${safeKey}\" error:`, prev.error, '→', next.error);\n\n if (prev.touched !== next.touched) console.debug(`${prefix} field \"${safeKey}\" touched:`, next.touched);\n\n if (prev.dirty !== next.dirty) console.debug(`${prefix} field \"${safeKey}\" dirty:`, next.dirty);\n }\n }\n\n return form.subscribe(\n (state) => {\n logFieldDiffs(state);\n\n if (state.isSubmitting !== prevIsSubmitting) {\n prevIsSubmitting = state.isSubmitting;\n console.debug(\n `${prefix} submit ${state.isSubmitting ? 'started' : 'ended'} (submitCount=${state.submitCount})`,\n );\n }\n\n if (state.isLoading !== prevIsLoading) {\n prevIsLoading = state.isLoading;\n console.debug(`${prefix} isLoading:`, state.isLoading);\n }\n },\n { sync: true },\n );\n}\n"],"mappings":"sIAaA,IAAM,EAAQ,CAAE,WAA4C,eAgC5D,SAAgB,EACd,EACA,EAAgC,CAAC,EACpB,CACb,GAAI,CAAC,EAAO,UAAa,CAAC,EAE1B,IAAM,EAAS,mBAAmB,EAAQ,OAAS,OAAO,GACpD,EAAiB,IAAI,IAEvB,EAAmB,EAAK,MAAM,aAC9B,EAAgB,EAAK,MAAM,UAE/B,SAAS,EAAe,EAA+B,CACrD,IAAM,EAAO,IAAI,IAAY,EAAe,KAAK,CAAC,EAElD,IAAK,IAAM,KAAO,OAAO,MAAA,EAAA,EAAA,aAAA,CAAmB,EAAK,OAAO,CAA4B,CAAC,EAAG,EAAK,IAAI,CAAG,EACpG,IAAK,IAAM,KAAO,OAAO,KAAK,EAAM,MAAM,EAAG,EAAK,IAAI,CAAG,EACzD,IAAK,IAAM,KAAO,EAAM,cAAe,EAAK,IAAI,CAAG,EAEnD,OAAO,CACT,CAEA,SAAS,EAAc,EAAwB,CAC7C,IAAK,IAAM,KAAO,EAAe,CAAK,EAAG,CACvC,IAAM,EAAO,EAAK,MAAM,CAAyB,EAC3C,EAAO,EAAe,IAAI,CAAG,EAMnC,GAJA,EAAe,IAAI,EAAK,CAAI,EAIxB,CAAC,EAAM,SAMX,IAAM,EAAU,EAAA,eAAe,EAAK,EAAE,EAElC,EAAK,QAAU,EAAK,OAAO,QAAQ,MAAM,GAAG,EAAO,UAAU,EAAQ,UAAW,EAAK,MAAO,IAAK,EAAK,KAAK,EAE3G,EAAK,QAAU,EAAK,OAAO,QAAQ,MAAM,GAAG,EAAO,UAAU,EAAQ,UAAW,EAAK,MAAO,IAAK,EAAK,KAAK,EAE3G,EAAK,UAAY,EAAK,SAAS,QAAQ,MAAM,GAAG,EAAO,UAAU,EAAQ,YAAa,EAAK,OAAO,EAElG,EAAK,QAAU,EAAK,OAAO,QAAQ,MAAM,GAAG,EAAO,UAAU,EAAQ,UAAW,EAAK,KAAK,CAChG,CACF,CAEA,OAAO,EAAK,UACT,GAAU,CACT,EAAc,CAAK,EAEf,EAAM,eAAiB,IACzB,EAAmB,EAAM,aACzB,QAAQ,MACN,GAAG,EAAO,UAAU,EAAM,aAAe,UAAY,QAAQ,gBAAgB,EAAM,YAAY,EACjG,GAGE,EAAM,YAAc,IACtB,EAAgB,EAAM,UACtB,QAAQ,MAAM,GAAG,EAAO,aAAc,EAAM,SAAS,EAEzD,EACA,CAAE,KAAM,EAAK,CACf,CACF"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @vielzeug/forge — debug utilities for form state visualisation.
3
+ *
4
+ * Import from the dedicated sub-path so it is tree-shaken from production bundles:
5
+ * ```ts
6
+ * import { attachForgeDevtools } from '@vielzeug/forge/devtools';
7
+ * ```
8
+ */
9
+ import type { Form, Unsubscribe } from './types';
10
+ /** Options for {@link attachForgeDevtools}. */
11
+ export type ForgeDevtoolsOptions = {
12
+ /** Label included in every log line, useful when debugging multiple forms at once. Default: `"form"`. */
13
+ label?: string;
14
+ };
15
+ /**
16
+ * Attaches a `console.debug`-based observer to `form` that logs a distinct line per observable
17
+ * state transition: per-field value/error/touched/dirty changes, submit start/end (via the
18
+ * `isSubmitting` edge), and `isLoading` edge (async `defaultValues` resolving).
19
+ *
20
+ * **Development only** by default — logging is a no-op when `__FORGE_PROD__` is set (the same
21
+ * convention `_dev.ts` uses internally). Import from the dedicated `/devtools` sub-path so the
22
+ * logging code is tree-shaken from production bundles entirely.
23
+ *
24
+ * Works identically on scoped sub-forms (`form.scope('address')`) — field paths logged are
25
+ * relative to whatever `form` object is passed in, matching that form's own `state` convention.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * import { createForm } from '@vielzeug/forge';
30
+ * import { attachForgeDevtools } from '@vielzeug/forge/devtools';
31
+ *
32
+ * const form = createForm({ defaultValues: { email: '' } });
33
+ * const detach = attachForgeDevtools(form, { label: 'signup' });
34
+ * // [forge:devtools:signup] field "email" value: "" → "a@b.com"
35
+ *
36
+ * detach(); // stop logging
37
+ * ```
38
+ */
39
+ export declare function attachForgeDevtools<TValues extends Record<string, unknown>>(form: Form<TValues>, options?: ForgeDevtoolsOptions): Unsubscribe;
40
+ //# sourceMappingURL=devtools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools.d.ts","sourceRoot":"","sources":["../src/devtools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAyB,IAAI,EAAa,WAAW,EAAE,MAAM,SAAS,CAAC;AAMnF,+CAA+C;AAC/C,MAAM,MAAM,oBAAoB,GAAG;IACjC,yGAAyG;IACzG,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,EACnB,OAAO,GAAE,oBAAyB,GACjC,WAAW,CAgEb"}
@@ -0,0 +1,29 @@
1
+ import { flattenValues as e, sanitizeForLog as t } from "./_utils.js";
2
+ //#region src/devtools.ts
3
+ var n = !globalThis.__FORGE_PROD__;
4
+ function r(r, i = {}) {
5
+ if (!n) return () => {};
6
+ let a = `[forge:devtools:${i.label ?? "form"}]`, o = /* @__PURE__ */ new Map(), s = r.state.isSubmitting, c = r.state.isLoading;
7
+ function l(t) {
8
+ let n = new Set(o.keys());
9
+ for (let t of Object.keys(e(r.values()))) n.add(t);
10
+ for (let e of Object.keys(t.errors)) n.add(e);
11
+ for (let e of t.touchedFields) n.add(e);
12
+ return n;
13
+ }
14
+ function u(e) {
15
+ for (let n of l(e)) {
16
+ let e = r.field(n), i = o.get(n);
17
+ if (o.set(n, e), !i) continue;
18
+ let s = t(n, 80);
19
+ i.value !== e.value && console.debug(`${a} field "${s}" value:`, i.value, "→", e.value), i.error !== e.error && console.debug(`${a} field "${s}" error:`, i.error, "→", e.error), i.touched !== e.touched && console.debug(`${a} field "${s}" touched:`, e.touched), i.dirty !== e.dirty && console.debug(`${a} field "${s}" dirty:`, e.dirty);
20
+ }
21
+ }
22
+ return r.subscribe((e) => {
23
+ u(e), e.isSubmitting !== s && (s = e.isSubmitting, console.debug(`${a} submit ${e.isSubmitting ? "started" : "ended"} (submitCount=${e.submitCount})`)), e.isLoading !== c && (c = e.isLoading, console.debug(`${a} isLoading:`, e.isLoading));
24
+ }, { sync: !0 });
25
+ }
26
+ //#endregion
27
+ export { r as attachForgeDevtools };
28
+
29
+ //# sourceMappingURL=devtools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools.js","names":[],"sources":["../src/devtools.ts"],"sourcesContent":["/**\n * @vielzeug/forge — debug utilities for form state visualisation.\n *\n * Import from the dedicated sub-path so it is tree-shaken from production bundles:\n * ```ts\n * import { attachForgeDevtools } from '@vielzeug/forge/devtools';\n * ```\n */\n\nimport type { FieldState, FlatKeyOf, Form, FormState, Unsubscribe } from './types';\n\nimport { flattenValues, sanitizeForLog } from './_utils';\n\nconst isDev = !(globalThis as { __FORGE_PROD__?: boolean }).__FORGE_PROD__;\n\n/** Options for {@link attachForgeDevtools}. */\nexport type ForgeDevtoolsOptions = {\n /** Label included in every log line, useful when debugging multiple forms at once. Default: `\"form\"`. */\n label?: string;\n};\n\n/**\n * Attaches a `console.debug`-based observer to `form` that logs a distinct line per observable\n * state transition: per-field value/error/touched/dirty changes, submit start/end (via the\n * `isSubmitting` edge), and `isLoading` edge (async `defaultValues` resolving).\n *\n * **Development only** by default — logging is a no-op when `__FORGE_PROD__` is set (the same\n * convention `_dev.ts` uses internally). Import from the dedicated `/devtools` sub-path so the\n * logging code is tree-shaken from production bundles entirely.\n *\n * Works identically on scoped sub-forms (`form.scope('address')`) — field paths logged are\n * relative to whatever `form` object is passed in, matching that form's own `state` convention.\n *\n * @example\n * ```ts\n * import { createForm } from '@vielzeug/forge';\n * import { attachForgeDevtools } from '@vielzeug/forge/devtools';\n *\n * const form = createForm({ defaultValues: { email: '' } });\n * const detach = attachForgeDevtools(form, { label: 'signup' });\n * // [forge:devtools:signup] field \"email\" value: \"\" → \"a@b.com\"\n *\n * detach(); // stop logging\n * ```\n */\nexport function attachForgeDevtools<TValues extends Record<string, unknown>>(\n form: Form<TValues>,\n options: ForgeDevtoolsOptions = {},\n): Unsubscribe {\n if (!isDev) return () => {};\n\n const prefix = `[forge:devtools:${options.label ?? 'form'}]`;\n const fieldSnapshots = new Map<string, FieldState<unknown>>();\n\n let prevIsSubmitting = form.state.isSubmitting;\n let prevIsLoading = form.state.isLoading;\n\n function knownFieldKeys(state: FormState): Set<string> {\n const keys = new Set<string>(fieldSnapshots.keys());\n\n for (const key of Object.keys(flattenValues(form.values() as Record<string, unknown>))) keys.add(key);\n for (const key of Object.keys(state.errors)) keys.add(key);\n for (const key of state.touchedFields) keys.add(key);\n\n return keys;\n }\n\n function logFieldDiffs(state: FormState): void {\n for (const key of knownFieldKeys(state)) {\n const next = form.field(key as FlatKeyOf<TValues>);\n const prev = fieldSnapshots.get(key);\n\n fieldSnapshots.set(key, next);\n\n // First observation of this field establishes a baseline — logging it would just be\n // noise (every field would \"change\" from undefined on attach).\n if (!prev) continue;\n\n // Security: `key` is a caller-chosen field path (assertSafeKey only rejects reserved\n // segments, not control characters) — sanitize before interpolating into console output\n // to prevent terminal-escape-sequence injection, mirroring the sanitization `warn()`\n // call sites already apply (see `_utils.ts` sanitizeForLog).\n const safeKey = sanitizeForLog(key, 80);\n\n if (prev.value !== next.value) console.debug(`${prefix} field \"${safeKey}\" value:`, prev.value, '→', next.value);\n\n if (prev.error !== next.error) console.debug(`${prefix} field \"${safeKey}\" error:`, prev.error, '→', next.error);\n\n if (prev.touched !== next.touched) console.debug(`${prefix} field \"${safeKey}\" touched:`, next.touched);\n\n if (prev.dirty !== next.dirty) console.debug(`${prefix} field \"${safeKey}\" dirty:`, next.dirty);\n }\n }\n\n return form.subscribe(\n (state) => {\n logFieldDiffs(state);\n\n if (state.isSubmitting !== prevIsSubmitting) {\n prevIsSubmitting = state.isSubmitting;\n console.debug(\n `${prefix} submit ${state.isSubmitting ? 'started' : 'ended'} (submitCount=${state.submitCount})`,\n );\n }\n\n if (state.isLoading !== prevIsLoading) {\n prevIsLoading = state.isLoading;\n console.debug(`${prefix} isLoading:`, state.isLoading);\n }\n },\n { sync: true },\n );\n}\n"],"mappings":";;AAaA,IAAM,IAAQ,CAAE,WAA4C;AAgC5D,SAAgB,EACd,GACA,IAAgC,CAAC,GACpB;CACb,IAAI,CAAC,GAAO,aAAa,CAAC;CAE1B,IAAM,IAAS,mBAAmB,EAAQ,SAAS,OAAO,IACpD,oBAAiB,IAAI,IAAiC,GAExD,IAAmB,EAAK,MAAM,cAC9B,IAAgB,EAAK,MAAM;CAE/B,SAAS,EAAe,GAA+B;EACrD,IAAM,IAAO,IAAI,IAAY,EAAe,KAAK,CAAC;EAElD,KAAK,IAAM,KAAO,OAAO,KAAK,EAAc,EAAK,OAAO,CAA4B,CAAC,GAAG,EAAK,IAAI,CAAG;EACpG,KAAK,IAAM,KAAO,OAAO,KAAK,EAAM,MAAM,GAAG,EAAK,IAAI,CAAG;EACzD,KAAK,IAAM,KAAO,EAAM,eAAe,EAAK,IAAI,CAAG;EAEnD,OAAO;CACT;CAEA,SAAS,EAAc,GAAwB;EAC7C,KAAK,IAAM,KAAO,EAAe,CAAK,GAAG;GACvC,IAAM,IAAO,EAAK,MAAM,CAAyB,GAC3C,IAAO,EAAe,IAAI,CAAG;GAMnC,IAJA,EAAe,IAAI,GAAK,CAAI,GAIxB,CAAC,GAAM;GAMX,IAAM,IAAU,EAAe,GAAK,EAAE;GAQtC,AANI,EAAK,UAAU,EAAK,SAAO,QAAQ,MAAM,GAAG,EAAO,UAAU,EAAQ,WAAW,EAAK,OAAO,KAAK,EAAK,KAAK,GAE3G,EAAK,UAAU,EAAK,SAAO,QAAQ,MAAM,GAAG,EAAO,UAAU,EAAQ,WAAW,EAAK,OAAO,KAAK,EAAK,KAAK,GAE3G,EAAK,YAAY,EAAK,WAAS,QAAQ,MAAM,GAAG,EAAO,UAAU,EAAQ,aAAa,EAAK,OAAO,GAElG,EAAK,UAAU,EAAK,SAAO,QAAQ,MAAM,GAAG,EAAO,UAAU,EAAQ,WAAW,EAAK,KAAK;EAChG;CACF;CAEA,OAAO,EAAK,WACT,MAAU;EAUT,AATA,EAAc,CAAK,GAEf,EAAM,iBAAiB,MACzB,IAAmB,EAAM,cACzB,QAAQ,MACN,GAAG,EAAO,UAAU,EAAM,eAAe,YAAY,QAAQ,gBAAgB,EAAM,YAAY,EACjG,IAGE,EAAM,cAAc,MACtB,IAAgB,EAAM,WACtB,QAAQ,MAAM,GAAG,EAAO,cAAc,EAAM,SAAS;CAEzD,GACA,EAAE,MAAM,GAAK,CACf;AACF"}
@@ -0,0 +1,2 @@
1
+ var e=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},t=class extends e{constructor(){super(`Cannot modify a disposed form`)}},n=class extends e{},r=class extends e{},i=class extends e{errors;constructor(e){super(`Form validation failed`),this.errors=e}};exports.ForgeConfigError=n,exports.ForgeDisposedError=t,exports.ForgeError=e,exports.ForgeSubmitError=r,exports.ForgeValidationError=i;
2
+ //# sourceMappingURL=errors.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all forge errors. Use `instanceof ForgeError` to catch any forge-originated error. */\nexport class ForgeError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n static is(err: unknown): err is ForgeError {\n return err instanceof ForgeError;\n }\n}\n\n/** Thrown when any method is called on a disposed form. */\nexport class ForgeDisposedError extends ForgeError {\n constructor() {\n super('Cannot modify a disposed form');\n }\n}\n\n/** Thrown when a form key contains reserved prototype-polluting segments. */\nexport class ForgeConfigError extends ForgeError {}\n\n/** Thrown when `submit()` is called while a submission is already in progress. */\nexport class ForgeSubmitError extends ForgeError {}\n\n/** Thrown by `submitOrThrow()` when validation fails. */\nexport class ForgeValidationError extends ForgeError {\n readonly errors: Record<string, string>;\n\n constructor(errors: Record<string, string>) {\n super('Form validation failed');\n this.errors = errors;\n }\n}\n"],"mappings":"AACA,IAAa,EAAb,MAAa,UAAmB,KAAM,CACpC,YAAY,EAAiB,EAAqB,CAChD,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,IAAI,OAAO,KACvB,OAAO,eAAe,KAAM,IAAI,OAAO,SAAS,CAClD,CAEA,OAAO,GAAG,EAAiC,CACzC,OAAO,aAAe,CACxB,CACF,EAGa,EAAb,cAAwC,CAAW,CACjD,aAAc,CACZ,MAAM,+BAA+B,CACvC,CACF,EAGa,EAAb,cAAsC,CAAW,CAAC,EAGrC,EAAb,cAAsC,CAAW,CAAC,EAGrC,EAAb,cAA0C,CAAW,CACnD,OAEA,YAAY,EAAgC,CAC1C,MAAM,wBAAwB,EAC9B,KAAK,OAAS,CAChB,CACF"}
@@ -0,0 +1,21 @@
1
+ /** Base class for all forge errors. Use `instanceof ForgeError` to catch any forge-originated error. */
2
+ export declare class ForgeError extends Error {
3
+ constructor(message: string, opts?: ErrorOptions);
4
+ static is(err: unknown): err is ForgeError;
5
+ }
6
+ /** Thrown when any method is called on a disposed form. */
7
+ export declare class ForgeDisposedError extends ForgeError {
8
+ constructor();
9
+ }
10
+ /** Thrown when a form key contains reserved prototype-polluting segments. */
11
+ export declare class ForgeConfigError extends ForgeError {
12
+ }
13
+ /** Thrown when `submit()` is called while a submission is already in progress. */
14
+ export declare class ForgeSubmitError extends ForgeError {
15
+ }
16
+ /** Thrown by `submitOrThrow()` when validation fails. */
17
+ export declare class ForgeValidationError extends ForgeError {
18
+ readonly errors: Record<string, string>;
19
+ constructor(errors: Record<string, string>);
20
+ }
21
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,wGAAwG;AACxG,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;IAMhD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,UAAU;CAG3C;AAED,2DAA2D;AAC3D,qBAAa,kBAAmB,SAAQ,UAAU;;CAIjD;AAED,6EAA6E;AAC7E,qBAAa,gBAAiB,SAAQ,UAAU;CAAG;AAEnD,kFAAkF;AAClF,qBAAa,gBAAiB,SAAQ,UAAU;CAAG;AAEnD,yDAAyD;AACzD,qBAAa,oBAAqB,SAAQ,UAAU;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAE5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAI3C"}
package/dist/errors.js ADDED
@@ -0,0 +1,22 @@
1
+ //#region src/errors.ts
2
+ var e = class e extends Error {
3
+ constructor(e, t) {
4
+ super(e, t), this.name = new.target.name, Object.setPrototypeOf(this, new.target.prototype);
5
+ }
6
+ static is(t) {
7
+ return t instanceof e;
8
+ }
9
+ }, t = class extends e {
10
+ constructor() {
11
+ super("Cannot modify a disposed form");
12
+ }
13
+ }, n = class extends e {}, r = class extends e {}, i = class extends e {
14
+ errors;
15
+ constructor(e) {
16
+ super("Form validation failed"), this.errors = e;
17
+ }
18
+ };
19
+ //#endregion
20
+ export { n as ForgeConfigError, t as ForgeDisposedError, e as ForgeError, r as ForgeSubmitError, i as ForgeValidationError };
21
+
22
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all forge errors. Use `instanceof ForgeError` to catch any forge-originated error. */\nexport class ForgeError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n static is(err: unknown): err is ForgeError {\n return err instanceof ForgeError;\n }\n}\n\n/** Thrown when any method is called on a disposed form. */\nexport class ForgeDisposedError extends ForgeError {\n constructor() {\n super('Cannot modify a disposed form');\n }\n}\n\n/** Thrown when a form key contains reserved prototype-polluting segments. */\nexport class ForgeConfigError extends ForgeError {}\n\n/** Thrown when `submit()` is called while a submission is already in progress. */\nexport class ForgeSubmitError extends ForgeError {}\n\n/** Thrown by `submitOrThrow()` when validation fails. */\nexport class ForgeValidationError extends ForgeError {\n readonly errors: Record<string, string>;\n\n constructor(errors: Record<string, string>) {\n super('Form validation failed');\n this.errors = errors;\n }\n}\n"],"mappings":";AACA,IAAa,IAAb,MAAa,UAAmB,MAAM;CACpC,YAAY,GAAiB,GAAqB;EAGhD,AAFA,MAAM,GAAS,CAAI,GACnB,KAAK,OAAO,IAAI,OAAO,MACvB,OAAO,eAAe,MAAM,IAAI,OAAO,SAAS;CAClD;CAEA,OAAO,GAAG,GAAiC;EACzC,OAAO,aAAe;CACxB;AACF,GAGa,IAAb,cAAwC,EAAW;CACjD,cAAc;EACZ,MAAM,+BAA+B;CACvC;AACF,GAGa,IAAb,cAAsC,EAAW,CAAC,GAGrC,IAAb,cAAsC,EAAW,CAAC,GAGrC,IAAb,cAA0C,EAAW;CACnD;CAEA,YAAY,GAAgC;EAE1C,AADA,MAAM,wBAAwB,GAC9B,KAAK,SAAS;CAChB;AACF"}
package/dist/forge.cjs ADDED
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@vielzeug/arsenal"),t=require("@vielzeug/ripple");var n=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},r=class extends n{constructor(){super(`Cannot modify a disposed form`)}},i=class extends n{},a=class extends n{},o=class extends n{errors;constructor(e){super(`Form validation failed`),this.errors=e}},s=`_form`,c={onBlur:{touchOnBlur:!0,validateOnBlur:!0},onChange:{touchOnBlur:!0,validateOnChange:!0},onSubmit:{},onTouched:{touchOnBlur:!0,validateOnBlur:!0,validateOnTouch:!0}},l=!globalThis.__FORGE_PROD__;function u(e){l&&console.warn(`[@vielzeug/forge] ${e}`)}var d=new Set([`__proto__`,`constructor`,`prototype`]);function f(e){return e.split(`.`).every(e=>!d.has(e))}function p(e){if(!f(e))throw new i(`Unsafe key '${e}': segments __proto__, constructor, and prototype are reserved.`)}function m(e,t=200){return e.replace(/\p{C}/gu,`?`).slice(0,t)}function h(...e){let t=e.filter(e=>e!=null);if(t.length!==0)return t.length===1?t[0]:AbortSignal.any(t)}function g(e){if(!e)return;if(typeof e==`function`)return e;let t=e;return(e,n)=>{if(n?.aborted)return;let r=t.safeParse(e);if(r.success)return;let i={};for(let e of r.error.issues){let t=e.path.join(`.`)||`_form`;f(t)&&(i[t]||(i[t]=e.message))}return i}}function _(n){let i=new Map;for(let[e,t]of Object.entries(n.validators??{}))p(e),i.set(e,t);let a=g(n.validator),o=n.connect??{},s=typeof n.defaultValues==`function`,c=typeof n.defaultValues==`function`?void 0:n.defaultValues,l=new Map(Object.entries((0,e.flattenPaths)(c??{}))),u=new Map(l),d=new Map,f=new Set,m=new Set,h=new Map,_=new Set,v=new Map,y=new AbortController,b=null,x=null,S=new Map,C=new Map,w=new Map,T=!1,E=0,D=!1,O=new Map,k=new Set;function A(e){return O.has(e)||O.set(e,(0,t.signal)(L(e),{equals:(e,t)=>e.value===t.value&&e.error===t.error&&e.hasError===t.hasError&&e.touched===t.touched&&e.dirty===t.dirty})),O.get(e)}function j(){b=null}function M(){x=null}function N(){return x??=Object.freeze(Object.fromEntries(d))}function P(){return Object.freeze({errors:N(),isDirty:m.size>0,isLoading:s,isSubmitting:T,isTouched:f.size>0,isValid:d.size===0,isValidating:h.size>0,submitCount:E,touchedFields:Object.freeze([...f]),validatingFields:Object.freeze([...h.keys()])})}let F=(0,t.signal)(P());function I(){return F.value}function L(e){let t=d.get(e);return{dirty:m.has(e),error:t,hasError:t!==void 0,touched:f.has(e),value:u.get(e)}}function R(e){let t=S.get(e);if(t)return t;let n=Object.freeze(L(e));return S.set(e,n),n}function z(e){if(!D)if(j(),x=null,e===void 0)S.clear(),(0,t.batch)(()=>{F.value=P();for(let[e,t]of O)t.value=L(e)});else if(typeof e==`string`)S.delete(e),(0,t.batch)(()=>{F.value=P();let t=O.get(e);t&&(t.value=L(e))});else{let n=[...e];for(let e of n)S.delete(e);(0,t.batch)(()=>{F.value=P();for(let e of n){let t=O.get(e);t&&(t.value=L(e))}})}}function B(){if(D)throw new r}function V(e){B();try{(0,t.batch)(e)}catch(e){throw z(),e}}return{arrayCache:C,baseline:l,batch:V,buildFieldState:L,get cachedErrors(){return x},set cachedErrors(e){x=e},get cachedValues(){return b},set cachedValues(e){b=e},computeErrors:N,computeState:P,connectDefaults:o,dirty:m,disposeController:y,get disposed(){return D},set disposed(e){D=e},ensureNotDisposed:B,fieldCtrls:v,fieldErrors:d,fieldSignals:O,fieldStateCache:S,formStateSignal:F,formValidator:a,getFieldSnapshot:R,getOrCreateFieldSignal:A,getStateSnapshot:I,invalidateErrors:M,invalidateValues:j,get isSubmittingState(){return T},set isSubmittingState(e){T=e},get loadingState(){return s},set loadingState(e){s=e},requestNotify:z,rippleSubs:k,runCtrls:_,scopeCache:w,store:u,get submitCount(){return E},set submitCount(e){E=e},touched:f,validatingRuns:h,validators:i}}function v(e){function t(){e.disposed=!0,e.disposeController.abort();for(let t of e.fieldCtrls.values())t.abort();e.fieldCtrls.clear(),e.runCtrls.clear(),e.arrayCache.clear(),e.scopeCache.clear();for(let t of e.rippleSubs)t.dispose();e.rippleSubs.clear(),e.fieldSignals.clear()}function n(){return e.ensureNotDisposed(),Object.freeze({baseline:Object.freeze(Object.fromEntries(e.baseline)),dirty:Object.freeze([...e.dirty]),errors:Object.freeze(Object.fromEntries(e.fieldErrors)),store:Object.freeze(Object.fromEntries(e.store)),submitCount:e.submitCount,touched:Object.freeze([...e.touched])})}function r(t){e.ensureNotDisposed();for(let t of e.runCtrls)t.abort();for(let t of e.fieldCtrls.values())t.abort();e.runCtrls.clear(),e.fieldCtrls.clear(),e.validatingRuns.clear(),e.store.clear(),e.baseline.clear(),e.fieldErrors.clear(),e.touched.clear(),e.dirty.clear();for(let[n,r]of Object.entries(t.store))f(n)&&e.store.set(n,r);for(let[n,r]of Object.entries(t.baseline))f(n)&&e.baseline.set(n,r);for(let[n,r]of Object.entries(t.errors))f(n)&&e.fieldErrors.set(n,r);for(let n of t.touched)f(n)&&e.touched.add(n);for(let n of t.dirty)f(n)&&e.dirty.add(n);e.submitCount=t.submitCount,e.invalidateErrors(),e.invalidateValues(),e.requestNotify()}return{dispose:t,restore:r,snapshot:n}}function y(e){let t=[],n=null,r=null,i=!1,a=null;function o(e){if(!i)if(n){let t=n;n=null,r=null,t({done:!1,value:e})}else t.push(e)}function s(e){if(!i)if(i=!0,r){let t=r;n=null,r=null,t(e)}else a={err:e}}function c(){if(!i&&(i=!0,n)){let e=n;n=null,r=null,e({done:!0,value:void 0})}}function l(){i||(t=[],c(),e?.())}return{fail:s,finish:c,iterator:{next(){if(a){let{err:e}=a;return a=null,Promise.reject(e)}return t.length>0?Promise.resolve({done:!1,value:t.shift()}):i?Promise.resolve({done:!0,value:void 0}):new Promise((e,t)=>{n=e,r=t})},return(){return l(),Promise.resolve({done:!0,value:void 0})},[Symbol.asyncIterator](){return this}},push:o,terminate:l}}function b(n,r){function i(e,r){if(n.disposed)return()=>{};let i=(0,t.watch)(n.formStateSignal,t=>{e(t)});return n.rippleSubs.add(i),r?.sync&&e(n.formStateSignal.value),()=>{i.dispose(),n.rippleSubs.delete(i)}}function a(e,r,i){if(n.disposed)return()=>{};let a=e;p(a);let o=n.getOrCreateFieldSignal(a),s=(0,t.watch)(o,e=>{r(e)});return n.rippleSubs.add(s),i?.sync&&r(o.value),()=>{s.dispose(),n.rippleSubs.delete(s)}}function o(t,i){n.ensureNotDisposed();let a=t;p(a);let o=i?.touchOnBlur??n.connectDefaults.touchOnBlur??!1,s=i?.validateOnBlur??n.connectDefaults.validateOnBlur??!1,c=i?.validateOnChange??n.connectDefaults.validateOnChange??!1,l=i?.validateOnTouch??n.connectDefaults.validateOnTouch??!1,u=i?.debounce??n.connectDefaults.debounce??0,d=null;function f(){u>0?(d!==null&&clearTimeout(d),d=setTimeout(()=>{d=null,!n.disposed&&r.validateFields([t]).catch(t=>{if(!(0,e.isAbortError)(t))throw t})},u)):r.validateFields([t]).catch(t=>{if(!(0,e.isAbortError)(t))throw t})}let m=!1;return{get dirty(){return n.dirty.has(a)},dispose(){m=!0,d!==null&&(clearTimeout(d),d=null)},get disposed(){return m},get error(){return n.fieldErrors.get(a)},onBlur:()=>{n.disposed||(o&&r.touch(t),s&&f())},onChange:e=>{n.disposed||(r.set(t,e),(c||l&&n.touched.has(a))&&f())},[Symbol.dispose](){this.dispose()},get touched(){return n.touched.has(a)},get value(){return n.store.get(a)}}}function s(){let e=y(()=>t());e.push(n.getStateSnapshot());let t=i(t=>{e.push(t)});return n.disposeController.signal.addEventListener(`abort`,()=>e.terminate(),{once:!0}),e.iterator}return{connect:o,subscribe:i,subscribeField:a,[Symbol.asyncIterator]:s}}function x(t,n){let r=`${n}.`;function i(e){return`${n}.${e}`}function s(e){return e===n||e.startsWith(r)}function c(e){return e.startsWith(r)?e.slice(r.length):e}function l(){let e=t.getStateSnapshot(),n=Object.fromEntries(Object.entries(e.errors).filter(([e])=>s(e)).map(([e,t])=>[c(e),t])),r=e.touchedFields.filter(s).map(c),i=e.validatingFields.filter(s).map(c),a=Object.keys(n).length===0,o=[...t.dirty].some(s),l=[...t.touched].some(s),u=i.length>0;return Object.freeze({errors:Object.freeze(n),isDirty:o,isLoading:e.isLoading,isSubmitting:e.isSubmitting,isTouched:l,isValid:a,isValidating:u,submitCount:e.submitCount,touchedFields:Object.freeze(r),validatingFields:Object.freeze(i)})}function u(){let n={};for(let[e,i]of t.store)e.startsWith(r)&&(n[e.slice(r.length)]=i);return(0,e.unflattenPaths)(n)}function d(){let e=new Set;for(let n of t.store.keys())s(n)&&e.add(c(n));for(let n of t.validators.keys())s(n)&&e.add(c(n));return Object.freeze([...e])}function f(){t.ensureNotDisposed();for(let e of t.store.keys())s(e)&&t.touched.add(e);for(let e of t.validators.keys())s(e)&&t.touched.add(e);t.requestNotify()}function p(){t.ensureNotDisposed();for(let e of[...t.touched])s(e)&&t.touched.delete(e);t.requestNotify()}function m(){t.ensureNotDisposed();for(let e of[...t.store.keys()])s(e)&&(t.fieldCtrls.get(e)?.abort(),t.fieldCtrls.delete(e),t.store.set(e,t.baseline.get(e)),t.dirty.delete(e),t.touched.delete(e),t.fieldErrors.delete(e)&&t.invalidateErrors());t.requestNotify()}function h(n){t.ensureNotDisposed();for(let e of[...t.fieldCtrls.keys()])s(e)&&(t.fieldCtrls.get(e)?.abort(),t.fieldCtrls.delete(e));let r=(0,e.flattenPaths)(n);for(let e of[...t.store.keys()])s(e)&&(t.store.delete(e),t.baseline.delete(e),t.dirty.delete(e),t.touched.delete(e),t.fieldErrors.delete(e));t.invalidateErrors();for(let[e,n]of Object.entries(r)){let r=i(e);t.store.set(r,n),t.baseline.set(r,n)}t.requestNotify()}function g(n){t.ensureNotDisposed();let r=(0,e.flattenPaths)(n),a=[];for(let[e,n]of Object.entries(r)){let r=i(e);t.baseline.set(r,n),t.store.set(r,n),t.dirty.delete(r),a.push(r)}t.requestNotify(a)}function _(e){t.ensureNotDisposed();for(let e of[...t.fieldErrors.keys()])s(e)&&t.fieldErrors.delete(e);if(e)for(let[n,r]of Object.entries(e))typeof r==`string`&&t.fieldErrors.set(i(n),r);t.invalidateErrors(),t.requestNotify()}async function v(e,n){if(t.ensureNotDisposed(),e!==void 0&&!Array.isArray(e)&&!(e instanceof AbortSignal)){let r=i(e);await t.runValidationCore([r],`partial`,n);let a=t.fieldErrors.get(r);return{errors:a===void 0?{}:{[e]:a},valid:a===void 0}}if(Array.isArray(e)){let r=e.map(e=>i(e));await t.runValidationCore(r,`partial`,n);let a={};for(let e of r){let n=t.fieldErrors.get(e);n!==void 0&&(a[c(e)]=n)}return{errors:a,valid:Object.keys(a).length===0}}let r=e,a=[...t.validators.keys()].filter(s);await t.runValidationCore(a,`partial`,r);let o={};for(let[e,n]of t.fieldErrors)s(e)&&(o[c(e)]=n);return{errors:o,valid:Object.keys(o).length===0}}async function y(e){if(t.ensureNotDisposed(),t.isSubmitting())throw new a(`submit() called while a submission is already in progress`);t.root.batch(()=>{t.incrementSubmitCount(),t.setSubmitting(!0),f()});try{let n=[...t.validators.keys()].filter(s);await t.runValidationCore(n,`partial`),t.ensureNotDisposed();let r={};for(let[e,n]of t.fieldErrors)s(e)&&(r[c(e)]=n);return Object.keys(r).length>0?{errors:r,ok:!1,type:`validation`}:{ok:!0,value:await e(u())}}finally{t.setSubmitting(!1),t.isDisposed()||t.requestNotify()}}function b(e,n){let r=null;return t.root.subscribe(()=>{let t=l();if(r){let e=r,n=Object.keys(t.errors),i=Object.keys(e.errors),a=n.length===i.length&&n.every(n=>t.errors[n]===e.errors[n]),o=t.touchedFields.length===e.touchedFields.length&&t.touchedFields.every((t,n)=>t===e.touchedFields[n]),s=t.validatingFields.length===e.validatingFields.length&&t.validatingFields.every((t,n)=>t===e.validatingFields[n]);if(t.isDirty===e.isDirty&&t.isLoading===e.isLoading&&t.isSubmitting===e.isSubmitting&&t.isTouched===e.isTouched&&t.isValid===e.isValid&&t.isValidating===e.isValidating&&t.submitCount===e.submitCount&&a&&o&&s)return}r=t,e(t)},n)}return{array:e=>t.root.array(i(e)),batch:e=>t.root.batch(e),clearError:e=>t.root.clearError(i(e)),connect:(e,n)=>t.root.connect(i(e),n),get disposalSignal(){return t.root.disposalSignal},dispose:()=>{},get disposed(){return t.isDisposed()},field:e=>t.root.field(i(e)),fields:{list:d,register:(e,n)=>t.root.fields.register(i(e),n),remove:e=>t.root.fields.remove(i(e)),setValidator:(e,n)=>t.root.fields.setValidator(i(e),n)},get:e=>t.root.get(i(e)),get isLoading(){return t.root.isLoading},get isSubmitting(){return t.root.isSubmitting},patch:g,replace:h,reset:m,resetErrors:_,resetField:e=>t.root.resetField(i(e)),restore:e=>t.root.restore(e),scope:e=>x(t,i(e)),set:(e,n,r)=>t.root.set(i(e),n,r),setError:(e,n)=>t.root.setError(i(e),n),snapshot:()=>t.root.snapshot(),get state(){return l()},submit:y,submitOrThrow:async e=>{let t=await y(e);if(!t.ok)throw new o(t.errors);return t.value},subscribe:(e,n)=>t.root.subscribe(e,n),subscribeField:(e,n,r)=>t.root.subscribeField(i(e),n,r),subscribeScoped:b,[Symbol.asyncIterator]:()=>t.root[Symbol.asyncIterator](),[Symbol.dispose](){this.dispose()},touch:e=>t.root.touch(i(e)),touchAll:f,untouch:e=>t.root.untouch(i(e)),untouchAll:p,validate:v,validateStream(e){let n=t.root.validateStream(e);return{async next(){for(;;){let e=await n.next();if(e.done)return e;if(s(e.value.field))return{done:!1,value:{error:e.value.error,field:c(e.value.field)}}}},return(){return n.return?n.return():Promise.resolve({done:!0,value:void 0})},[Symbol.asyncIterator](){return this}}},values:u}}function S(t,n){async function r(e,n){let r=t.validators.get(e);if(!r)return;if(n.aborted)throw n.reason;let i=await r(t.store.get(e),n);return typeof i==`string`?i:void 0}async function i(e){if(!t.formValidator)return{};if(e.aborted)throw e.reason;let r=await t.formValidator(n.values(),e),i={};if(r)for(let[e,t]of Object.entries(r))f(e)&&typeof t==`string`&&(i[e]=t);return i}function c(e,n,r,i){if(i===`full`){t.fieldErrors.clear();for(let[e,t]of Object.entries(r))n[e]===void 0&&(n[e]=t);for(let[e,r]of Object.entries(n))t.fieldErrors.set(e,r);t.invalidateErrors(),t.requestNotify()}else{let r=new Set;for(let i of e){let e=n[i],a=t.fieldErrors.get(i);e===void 0?t.fieldErrors.delete(i)&&r.add(i):(t.fieldErrors.set(i,e),a!==e&&r.add(i))}r.size>0&&t.invalidateErrors(),t.requestNotify(r)}}async function l(n,a,o){let s=new Set(n),l=new Map;for(let e of s){t.fieldCtrls.get(e)?.abort();let n=new AbortController;t.fieldCtrls.set(e,n),l.set(e,n)}let u=new AbortController,d=h(u.signal,o,t.disposeController.signal);t.runCtrls.add(u);let f=Symbol();for(let e of s){let n=t.validatingRuns.get(e);n||(n=new Set,t.validatingRuns.set(e,n)),n.add(f)}t.requestNotify();try{let e=await Promise.all([...s].map(async e=>[e,await r(e,a===`partial`?h(l.get(e).signal,d):d)]));if(d.aborted)return{aborted:!0,errors:Object.fromEntries(t.fieldErrors),valid:t.fieldErrors.size===0};let n={};for(let[t,r]of e)r!==void 0&&(n[t]=r);return c(s,n,a===`full`?await i(d):{},a),{aborted:!1,errors:Object.fromEntries(t.fieldErrors),valid:t.fieldErrors.size===0}}catch(n){if((0,e.isAbortError)(n))return{aborted:!0,errors:Object.fromEntries(t.fieldErrors),valid:t.fieldErrors.size===0};throw n}finally{t.runCtrls.delete(u);for(let e of s){let n=t.validatingRuns.get(e);n&&(n.delete(f),n.size===0&&t.validatingRuns.delete(e))}t.requestNotify();for(let[e,n]of l)t.fieldCtrls.get(e)===n&&t.fieldCtrls.delete(e)}}async function u(e,n){t.ensureNotDisposed();let r=await l(e,`partial`,n);return{errors:r.errors,valid:r.valid}}async function d(e,n){if(t.ensureNotDisposed(),e===void 0||e instanceof AbortSignal){let n=await l([...t.validators.keys()],`full`,e);return{errors:n.errors,valid:n.valid}}if(Array.isArray(e))return u(e,n);await u([e],n);let r=e,i=t.fieldErrors.get(r);return{errors:i===void 0?{}:{[r]:i},valid:i===void 0}}async function p(e){let t=await m(e);if(!t.ok)throw new o(t.errors);return t.value}async function m(e){if(t.ensureNotDisposed(),t.isSubmittingState)throw new a(`submit() called while a submission is already in progress`);t.batch(()=>{t.submitCount++,t.isSubmittingState=!0,n.touchAll()});try{let r=await l([...t.validators.keys()],`full`);return t.ensureNotDisposed(),r.valid?{ok:!0,value:await e(n.values())}:{errors:r.errors,ok:!1,type:`validation`}}finally{t.isSubmittingState=!1,t.disposed||t.requestNotify()}}function g(n){t.ensureNotDisposed();let a=[...t.validators.keys()],o=new AbortController,c=n?h(o.signal,n,t.disposeController.signal):h(o.signal,t.disposeController.signal),l=y(()=>o.abort());return Promise.all(a.map(async t=>{if(!c.aborted)try{let e=await r(t,c);c.aborted||l.push({error:e,field:t})}catch(t){if(!(0,e.isAbortError)(t))throw t}})).then(async()=>{if(t.formValidator&&!c.aborted)try{let e=await i(c);if(!c.aborted){let t=new Set([s,...Object.keys(e)]);for(let n of t)l.push({error:e[n],field:n})}}catch{}}).catch(t=>{(0,e.isAbortError)(t)||(o.abort(),l.fail(t))}).finally(()=>{o.abort(),l.finish()}),l.iterator}return{runValidationCore:l,submit:m,submitOrThrow:p,validate:d,validateFields:u,validateStream:g}}function C(e,t,n){let r=e;return{append(i){let a=t.get(r);a!==void 0&&!Array.isArray(a)||n(e,Array.isArray(a)?[...a,i]:[i])},insert(i,a){let o=t.get(r);if(!Array.isArray(o))return;let s=[...o];s.splice(i,0,a),n(e,s)},move(i,a){let o=t.get(r);if(!Array.isArray(o))return;let s=[...o];s.splice(a,0,s.splice(i,1)[0]),n(e,s)},prepend(i){let a=t.get(r);a!==void 0&&!Array.isArray(a)||n(e,Array.isArray(a)?[i,...a]:[i])},remove(i){let a=t.get(r);Array.isArray(a)&&n(e,a.filter((e,t)=>t!==i))},replace(i,a){let o=t.get(r);if(!Array.isArray(o))return;let s=[...o];s[i]=a,n(e,s)},swap(i,a){let o=t.get(r);if(!Array.isArray(o))return;let s=[...o];[s[i],s[a]]=[s[a],s[i]],n(e,s)}}}function w(t){function n(e){let n=e;return p(n),t.store.get(n)}function r(){return t.cachedValues??=(0,e.unflattenPaths)(Object.fromEntries(t.store))}function i(e,n){t.baseline.get(e)===n?t.dirty.delete(e):t.dirty.add(e)}function a(e,n,r={}){t.ensureNotDisposed();let a=e;p(a),t.store.set(a,n),i(a,n),r.touched&&t.touched.add(a),t.requestNotify(a)}function o(e){let n=e;return p(n),t.getFieldSnapshot(n)}function s(e,n){t.ensureNotDisposed();let r=e;p(r),t.fieldErrors.set(r,n),t.invalidateErrors(),t.requestNotify(r)}function c(e){t.ensureNotDisposed();let n=e;p(n),t.fieldErrors.delete(n)&&(t.invalidateErrors(),t.requestNotify(n))}function l(e={}){t.ensureNotDisposed(),t.fieldErrors.clear();for(let[n,r]of Object.entries(e))p(n),typeof r==`string`&&t.fieldErrors.set(n,r);t.invalidateErrors(),t.requestNotify()}function d(e,n){/\.\d+(\.|$)/.test(e)&&!t.store.has(e)&&u(`${n}('${m(e,80)}'): path looks like an array item key. Array items are stored as whole arrays — register on the parent key instead.`)}function f(e,n){t.ensureNotDisposed();let r=e;p(r),d(r,`setValidator`),t.fieldCtrls.get(r)?.abort(),t.fieldCtrls.delete(r),n?t.validators.set(r,n):(t.validators.delete(r),t.fieldErrors.delete(r)&&(t.invalidateErrors(),t.requestNotify(r)))}function h(e,n={}){t.ensureNotDisposed();let r=e;return p(r),d(r,`fields.register`),n.validator!==void 0&&f(e,n.validator),n.defaultValue!==void 0&&!t.store.has(r)&&(t.store.set(r,n.defaultValue),t.baseline.set(r,n.defaultValue),t.requestNotify(r)),()=>{t.disposed||S(e)}}function g(){let e=new Set;for(let n of t.store.keys())e.add(n);for(let n of t.validators.keys())e.add(n);return Object.freeze([...e])}function _(e){t.ensureNotDisposed();let n=e;p(n),t.touched.add(n),t.requestNotify(n)}function v(e){t.ensureNotDisposed();let n=e;p(n),t.touched.delete(n)&&t.requestNotify(n)}function y(){t.ensureNotDisposed();for(let e of t.store.keys())t.touched.add(e);for(let e of t.validators.keys())t.touched.add(e);t.requestNotify()}function b(){t.ensureNotDisposed(),t.touched.clear(),t.requestNotify()}function x(e){t.ensureNotDisposed();let n=e;p(n),t.fieldCtrls.get(n)?.abort(),t.fieldCtrls.delete(n),t.store.set(n,t.baseline.get(n)),t.dirty.delete(n),t.touched.delete(n),t.fieldErrors.delete(n)&&t.invalidateErrors(),t.requestNotify(n)}function S(e){t.ensureNotDisposed();let n=e;p(n),t.store.delete(n),t.baseline.delete(n),t.dirty.delete(n),t.touched.delete(n),t.validators.delete(n),t.arrayCache.delete(n),t.fieldCtrls.get(n)?.abort(),t.fieldCtrls.delete(n),t.fieldErrors.delete(n)&&t.invalidateErrors(),t.requestNotify(n)}function w(){t.ensureNotDisposed();for(let e of t.runCtrls)e.abort();for(let e of t.fieldCtrls.values())e.abort();t.runCtrls.clear(),t.fieldCtrls.clear(),t.validatingRuns.clear(),t.store.clear(),t.fieldErrors.clear(),t.touched.clear(),t.dirty.clear(),t.submitCount=0,t.invalidateErrors();for(let[e,n]of t.baseline)t.store.set(e,n);t.requestNotify()}function T(n){t.ensureNotDisposed();for(let e of t.runCtrls)e.abort();for(let e of t.fieldCtrls.values())e.abort();t.runCtrls.clear(),t.fieldCtrls.clear(),t.validatingRuns.clear();let r=(0,e.flattenPaths)(n);t.store.clear(),t.baseline.clear(),t.fieldErrors.clear(),t.touched.clear(),t.dirty.clear(),t.submitCount=0,t.invalidateErrors();for(let[e,n]of Object.entries(r))t.store.set(e,n),t.baseline.set(e,n);t.requestNotify()}function E(n){t.ensureNotDisposed();let r=(0,e.flattenPaths)(n);for(let[e,n]of Object.entries(r))t.baseline.set(e,n),t.store.set(e,n),t.dirty.delete(e);t.requestNotify(Object.keys(r))}function D(e){t.ensureNotDisposed();let n=e;p(n);let r=t.arrayCache.get(n);if(r)return r;let i=C(e,t.store,a);return t.arrayCache.set(n,i),i}return{array:D,clearError:c,field:o,get:n,listFields:g,patch:E,registerField:h,removeField:S,replace:T,reset:w,resetErrors:l,resetField:x,set:a,setError:s,setValidator:f,touch:_,touchAll:y,untouch:v,untouchAll:b,values:r}}function T(e={}){let t=_(e),n=w(t),r=S(t,{touchAll:n.touchAll,values:n.values}),i=b(t,{set:n.set,touch:n.touch,validateFields:r.validateFields}),a=v(t);typeof e.defaultValues==`function`&&e.defaultValues().then(e=>{t.loadingState=!1,!t.disposed&&n.replace(e)}).catch(n=>{t.loadingState=!1,!t.disposed&&(u(`defaultValues factory rejected. Form will be empty. Error: ${m(String(n))}`),e.onLoadError?.(n),t.requestNotify())});let{listFields:o,registerField:s,removeField:c,setValidator:l,...d}=n,{runValidationCore:f,...p}=r,h={...d,...p,...i,...a,batch:t.batch,get disposalSignal(){return t.disposeController.signal},get disposed(){return t.disposed},fields:{list:o,register:s,remove:c,setValidator:l},get isLoading(){return t.loadingState},get isSubmitting(){return t.isSubmittingState},scope(e){let n=e,r=t.scopeCache.get(n);if(r)return r;let i=x({baseline:t.baseline,dirty:t.dirty,ensureNotDisposed:t.ensureNotDisposed,fieldCtrls:t.fieldCtrls,fieldErrors:t.fieldErrors,getStateSnapshot:t.getStateSnapshot,incrementSubmitCount:()=>{t.submitCount++},invalidateErrors:t.invalidateErrors,isDisposed:()=>t.disposed,isSubmitting:()=>t.isSubmittingState,requestNotify:t.requestNotify,root:h,runValidationCore:f,setSubmitting:e=>{t.isSubmittingState=e},store:t.store,touched:t.touched,validators:t.validators},e);return t.scopeCache.set(n,i),i},get state(){return t.getStateSnapshot()},subscribeScoped:i.subscribe,[Symbol.dispose](){this.dispose()}};return h}function E(t){let n=new FormData;for(let[r,i]of Object.entries((0,e.flattenPaths)(t)))if(i!=null)if(i instanceof File||i instanceof Blob)n.append(r,i);else if(i instanceof FileList)for(let e=0;e<i.length;e++)n.append(r,i[e]);else if(Array.isArray(i))for(let e of i)n.append(r,e instanceof File||e instanceof Blob?e:String(e));else n.append(r,String(i));return n}exports.FORM_ERROR=s,exports.ForgeConfigError=i,exports.ForgeDisposedError=r,exports.ForgeError=n,exports.ForgeSubmitError=a,exports.ForgeValidationError=o,exports.ValidationModes=c,exports.createForm=T,exports.toFormData=E;
2
+ //# sourceMappingURL=forge.cjs.map