@madojs/mado 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/AGENTS.md +26 -0
  2. package/CHANGELOG.md +265 -0
  3. package/MADO_V1_PLAN.md +179 -0
  4. package/README.md +31 -13
  5. package/ROADMAP.md +28 -7
  6. package/TODO.md +72 -0
  7. package/dist/src/forms.d.ts +37 -4
  8. package/dist/src/forms.js +331 -57
  9. package/dist/src/forms.js.map +1 -1
  10. package/dist/src/html/bindings.d.ts +41 -0
  11. package/dist/src/html/bindings.js +163 -6
  12. package/dist/src/html/bindings.js.map +1 -1
  13. package/dist/src/html.d.ts +2 -0
  14. package/dist/src/html.js +1 -0
  15. package/dist/src/html.js.map +1 -1
  16. package/dist/src/index.d.ts +6 -6
  17. package/dist/src/index.js +2 -2
  18. package/dist/src/index.js.map +1 -1
  19. package/dist/src/page.d.ts +56 -0
  20. package/dist/src/page.js +17 -0
  21. package/dist/src/page.js.map +1 -1
  22. package/dist/src/resource.js +11 -0
  23. package/dist/src/resource.js.map +1 -1
  24. package/dist/src/router/manifest.d.ts +16 -1
  25. package/dist/src/router/manifest.js +210 -40
  26. package/dist/src/router/manifest.js.map +1 -1
  27. package/dist/src/router/match.d.ts +7 -2
  28. package/dist/src/router/match.js +14 -4
  29. package/dist/src/router/match.js.map +1 -1
  30. package/dist/src/router/navigation.d.ts +10 -0
  31. package/dist/src/router/navigation.js +71 -3
  32. package/dist/src/router/navigation.js.map +1 -1
  33. package/dist/src/signal.d.ts +15 -1
  34. package/dist/src/signal.js +112 -16
  35. package/dist/src/signal.js.map +1 -1
  36. package/docs/en/02-project-layout.md +99 -40
  37. package/docs/en/10-app-architecture.md +141 -0
  38. package/docs/en/11-layouts.md +115 -0
  39. package/docs/en/12-auth-and-api.md +217 -0
  40. package/docs/en/13-deployment.md +192 -0
  41. package/docs/en/14-testing.md +82 -0
  42. package/docs/en/15-error-handling.md +100 -0
  43. package/docs/en/16-bake-cookbook.md +93 -0
  44. package/docs/en/README.md +7 -0
  45. package/docs/fr/10-app-architecture.md +61 -0
  46. package/docs/fr/11-layouts.md +35 -0
  47. package/docs/fr/12-auth-and-api.md +35 -0
  48. package/docs/fr/13-deployment.md +39 -0
  49. package/docs/fr/14-testing.md +41 -0
  50. package/docs/fr/15-error-handling.md +50 -0
  51. package/docs/fr/16-bake-cookbook.md +35 -0
  52. package/docs/fr/README.md +7 -0
  53. package/docs/ru/10-app-architecture.md +100 -0
  54. package/docs/ru/11-layouts.md +47 -0
  55. package/docs/ru/12-auth-and-api.md +53 -0
  56. package/docs/ru/13-deployment.md +60 -0
  57. package/docs/ru/14-testing.md +50 -0
  58. package/docs/ru/15-error-handling.md +56 -0
  59. package/docs/ru/16-bake-cookbook.md +55 -0
  60. package/docs/ru/README.md +7 -0
  61. package/docs/uk/10-app-architecture.md +56 -0
  62. package/docs/uk/11-layouts.md +34 -0
  63. package/docs/uk/12-auth-and-api.md +34 -0
  64. package/docs/uk/13-deployment.md +39 -0
  65. package/docs/uk/14-testing.md +34 -0
  66. package/docs/uk/15-error-handling.md +32 -0
  67. package/docs/uk/16-bake-cookbook.md +36 -0
  68. package/docs/uk/README.md +7 -0
  69. package/llms.txt +9 -1
  70. package/package.json +3 -1
  71. package/scripts/_config.mjs +224 -0
  72. package/scripts/bake.mjs +266 -121
  73. package/scripts/bundle.mjs +133 -67
  74. package/scripts/cli.mjs +195 -27
  75. package/scripts/preview.mjs +125 -21
  76. package/server/serve.mjs +161 -10
  77. package/starters/admin/README.md +63 -0
  78. package/starters/admin/index.html +28 -0
  79. package/starters/admin/mado.config.json +22 -0
  80. package/starters/admin/package.json +24 -0
  81. package/starters/admin/public/favicon.svg +4 -0
  82. package/starters/admin/src/components/x-button.ts +55 -0
  83. package/starters/admin/src/components/x-input.ts +74 -0
  84. package/starters/admin/src/layouts/app.ts +101 -0
  85. package/starters/admin/src/layouts/auth.ts +41 -0
  86. package/starters/admin/src/lib/api.ts +133 -0
  87. package/starters/admin/src/lib/auth.ts +83 -0
  88. package/starters/admin/src/main.ts +15 -0
  89. package/starters/admin/src/pages/admin/dashboard.ts +48 -0
  90. package/starters/admin/src/pages/admin/order-detail.ts +80 -0
  91. package/starters/admin/src/pages/admin/orders.ts +117 -0
  92. package/starters/admin/src/pages/home.ts +34 -0
  93. package/starters/admin/src/pages/login.ts +70 -0
  94. package/starters/admin/src/pages/not-found.ts +12 -0
  95. package/starters/admin/src/routes.ts +40 -0
  96. package/starters/admin/src/styles/global.ts +86 -0
  97. package/starters/admin/tsconfig.json +15 -0
  98. package/starters/crud/index.html +12 -4
  99. package/starters/crud/mado.config.json +20 -0
  100. package/starters/crud/package.json +9 -3
  101. package/starters/crud/src/pages/home.ts +16 -0
  102. package/starters/crud/src/routes.ts +4 -2
  103. package/starters/minimal/index.html +12 -4
  104. package/starters/minimal/mado.config.json +20 -0
  105. package/starters/minimal/package.json +9 -3
  106. package/starters/minimal/src/pages/home.ts +17 -0
  107. package/starters/minimal/src/routes.ts +4 -2
package/TODO.md ADDED
@@ -0,0 +1,72 @@
1
+ # TODO
2
+
3
+ > The v0.6 product-surface push is complete. The closed tracker is archived in
4
+ > [`MADO_V1_PLAN.md`](./MADO_V1_PLAN.md). The items below are ideas for later
5
+ > releases and are not part of the v0.6 contract.
6
+
7
+ Ideas that are not commitments. Roadmap milestones live in `ROADMAP.md`.
8
+
9
+ ## DX
10
+
11
+ - [ ] `npx mado create my-app` scaffold.
12
+ - [ ] `mado page <name>` / `mado component <name>` wrappers around templates.
13
+ - [ ] Split `scripts/cli.mjs` into small internal modules (`cli/init`,
14
+ `cli/run`, `cli/dev`, `cli/static-server`) before it becomes hard to read.
15
+ - [ ] Make `mado preview` and `mado bundle` work naturally inside generated
16
+ apps, not only inside the framework repository.
17
+ - [ ] Typed navigation inferred from route patterns.
18
+ - [ ] Optional VS Code extension for `html`` / `css`` highlighting.
19
+
20
+ ## Runtime
21
+
22
+ - [ ] Optimistic mutation hook with rollback.
23
+ - [ ] `<x-async>` helper for resource loading/error shells.
24
+ - [ ] `liveResource()` over SSE / WebSocket.
25
+ - [ ] i18n helper once browser-native message formatting is realistic.
26
+ - [ ] Accessibility helpers: focus trap, live region, click outside.
27
+
28
+ ## Styling
29
+
30
+ - [ ] Docs for `::part`, `::slotted()` and `:host-context()`.
31
+ - [ ] Optional tiny utilities stylesheet.
32
+
33
+ ## Operations
34
+
35
+ - [ ] Benchmark against Lit / Solid / Preact.
36
+ - [ ] Decide package exports policy before v1: remove the wildcard export or
37
+ keep it documented as unstable internal deep imports.
38
+ - [ ] Add first-class size reporting for runtime budget (ESM graph,
39
+ bundled/minified, gzip, brotli) without counting docs/starters/package files.
40
+ - [ ] `eslint-plugin-mado` rules for common mistakes.
41
+ - [ ] CSP-friendly style mode.
42
+ - [ ] PWA scaffold.
43
+ - [ ] Schema validation hook for resources.
44
+ - [ ] Timeout / retry options for resource fetchers.
45
+ - [ ] Source-map notes and a minimal dev error overlay.
46
+
47
+ ## Bake / Smart Static
48
+
49
+ - [ ] Webhook re-bake endpoint.
50
+ - [ ] Incremental bake cache.
51
+ - [ ] RSS / Atom feed generator.
52
+ - [ ] Nested-route bake support.
53
+
54
+ ## Community
55
+
56
+ - [ ] Minimal landing site built with Mado.
57
+ - [ ] Case study: real React page → Mado + bake.
58
+ - [ ] Public live demo: CRUD starter and showcase hosted from Mado itself.
59
+ - [ ] Convert contribution-ready TODO items into GitHub issues with labels
60
+ (`good first issue`, `help wanted`, `docs`, `cli`, `ci`) after the first
61
+ public feedback round.
62
+
63
+ ## Release / GitHub
64
+
65
+ - [ ] Configure npm Trusted Publishing for GitHub Actions after verifying the
66
+ first manual publishes.
67
+ - [ ] Decide the release flow: continue manual npm publish for patch releases or
68
+ publish from signed `v*` tags through `.github/workflows/release.yml`.
69
+ - [ ] Improve generated release notes: include PR links/authors when releases
70
+ start going through pull requests.
71
+ - [ ] Add a short maintainer-only release checklist outside public docs if the
72
+ manual flow stays in use.
@@ -32,9 +32,14 @@
32
32
  * No Yup/Zod/Formik dependencies. If you really want them —
33
33
  * pass your own validate(values) and wire it to anything.
34
34
  */
35
- import { type Signal } from "./signal.js";
36
- export type FormValues = Record<string, string | number | boolean | undefined>;
35
+ import { type Signal, type Computed } from "./signal.js";
36
+ export type FormValue = string | number | boolean | null | undefined | FormValue[] | {
37
+ [key: string]: FormValue;
38
+ };
39
+ export type FormValues = Record<string, FormValue>;
37
40
  export type FormErrors = Record<string, string | undefined>;
41
+ export type FieldValidator<V extends FormValues = FormValues> = (value: FormValue, values: V, path: string) => string | null | undefined;
42
+ export type AsyncFieldValidator<V extends FormValues = FormValues> = (value: FormValue, values: V, path: string) => Promise<string | null | undefined>;
38
43
  /** Field declaration. Rules intentionally match common HTML constraints. */
39
44
  export interface FieldSchema {
40
45
  required?: boolean;
@@ -45,18 +50,39 @@ export interface FieldSchema {
45
50
  maxLength?: number;
46
51
  pattern?: string;
47
52
  /** Default value */
48
- default?: string | number | boolean;
53
+ default?: FormValue;
54
+ /** Synchronous custom validator for this field. */
55
+ validate?: FieldValidator;
56
+ /** Asynchronous custom validator for this field. */
57
+ validateAsync?: AsyncFieldValidator;
49
58
  }
50
59
  export type Schema = Record<string, FieldSchema>;
51
60
  export interface UseFormOptions<V extends FormValues> {
52
61
  /** Custom validator: returns errors or null. */
53
62
  validate?: (values: V) => FormErrors | null;
63
+ /** Async custom validator, usually for server-backed uniqueness checks. */
64
+ validateAsync?: (values: V) => Promise<FormErrors | null>;
65
+ }
66
+ export interface FieldArrayApi<T extends FormValue = FormValue> {
67
+ /** Current array value. */
68
+ items: () => T[];
69
+ /** Field name helper: `items.0.title`. */
70
+ path(index: number, field?: string): string;
71
+ append(value: T): void;
72
+ prepend(value: T): void;
73
+ insert(index: number, value: T): void;
74
+ remove(index: number): void;
75
+ move(from: number, to: number): void;
76
+ replace(items: readonly T[]): void;
77
+ set(index: number, value: T): void;
54
78
  }
55
79
  export interface FormApi<V extends FormValues> {
56
80
  values: Signal<V>;
57
81
  errors: () => FormErrors;
58
82
  touched: Signal<Record<string, boolean>>;
59
83
  submitting: Signal<boolean>;
84
+ validating: Computed<boolean>;
85
+ validatingFields: Signal<Record<string, boolean>>;
60
86
  isValid: () => boolean;
61
87
  /** Binding for @input/@change: automatically picks up name+value+type. */
62
88
  onInput: (e: Event) => void;
@@ -65,7 +91,14 @@ export interface FormApi<V extends FormValues> {
65
91
  /** Submit wrapper: calls handler only if the form is valid. */
66
92
  onSubmit: (handler: (values: V) => void | Promise<void>) => (e: Event) => void;
67
93
  /** Set a field value programmatically. */
68
- setField<K extends keyof V>(name: K, value: V[K]): void;
94
+ setField<K extends keyof V & string>(name: K, value: V[K]): void;
95
+ setField(name: string, value: FormValue): void;
96
+ /** Run async validators for a single field path. */
97
+ validateField(name: string): Promise<boolean>;
98
+ /** Run all sync + async validators and update errors. */
99
+ validate(): Promise<boolean>;
100
+ /** Helper for dynamic arrays stored under one form field. */
101
+ array<T extends FormValue = FormValue>(name: keyof V & string): FieldArrayApi<T>;
69
102
  /** Reset to defaults. */
70
103
  reset(): void;
71
104
  }
package/dist/src/forms.js CHANGED
@@ -39,60 +39,27 @@ export function useForm(schema, options = {}) {
39
39
  for (const k in schema) {
40
40
  const s = schema[k];
41
41
  if (s.default !== undefined)
42
- out[k] = s.default;
42
+ out[k] = cloneFormValue(s.default);
43
43
  }
44
44
  return out;
45
45
  };
46
46
  const values = signal(defaults());
47
47
  const touched = signal({});
48
48
  const submitting = signal(false);
49
- const errors = computed(() => {
49
+ const asyncErrors = signal({});
50
+ const validatingFields = signal({});
51
+ const validating = computed(() => Object.keys(validatingFields()).length > 0);
52
+ const fieldRuns = new Map();
53
+ let formRun = 0;
54
+ let formAsyncPaths = [];
55
+ const syncErrors = computed(() => {
50
56
  const v = values();
51
57
  const out = {};
52
- for (const name in schema) {
53
- const s = schema[name];
54
- const raw = v[name];
55
- const isEmpty = raw === undefined || raw === "" || raw === null;
56
- if (s.required && isEmpty) {
57
- out[name] = "required field";
58
- continue;
59
- }
60
- if (isEmpty)
61
- continue;
62
- if (s.type === "email" && typeof raw === "string") {
63
- if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(raw))
64
- out[name] = "invalid email";
65
- }
66
- else if (s.type === "url" && typeof raw === "string") {
67
- try {
68
- new URL(raw);
69
- }
70
- catch {
71
- out[name] = "invalid URL";
72
- }
73
- }
74
- else if (s.type === "number") {
75
- const n = Number(raw);
76
- if (Number.isNaN(n))
77
- out[name] = "must be a number";
78
- else {
79
- if (s.min !== undefined && n < s.min)
80
- out[name] = `minimum ${s.min}`;
81
- if (s.max !== undefined && n > s.max)
82
- out[name] = `maximum ${s.max}`;
83
- }
84
- }
85
- if (typeof raw === "string") {
86
- if (s.minLength !== undefined && raw.length < s.minLength) {
87
- out[name] = `minimum ${s.minLength} characters`;
88
- }
89
- if (s.maxLength !== undefined && raw.length > s.maxLength) {
90
- out[name] = `maximum ${s.maxLength} characters`;
91
- }
92
- if (s.pattern && !new RegExp(s.pattern).test(raw)) {
93
- out[name] = "invalid format";
94
- }
95
- }
58
+ for (const pattern in schema) {
59
+ const s = schema[pattern];
60
+ const paths = expandSchemaPath(v, pattern);
61
+ for (const name of paths)
62
+ validateSyncField(out, s, v, name);
96
63
  }
97
64
  if (options.validate) {
98
65
  const custom = options.validate(v);
@@ -101,7 +68,150 @@ export function useForm(schema, options = {}) {
101
68
  }
102
69
  return out;
103
70
  });
71
+ const errors = computed(() => ({
72
+ ...syncErrors(),
73
+ ...asyncErrors(),
74
+ }));
104
75
  const isValid = computed(() => Object.keys(errors()).length === 0);
76
+ function validateSyncField(out, s, v, name) {
77
+ const raw = getPath(v, name);
78
+ const isEmpty = raw === undefined || raw === "" || raw === null;
79
+ if (s.required && isEmpty) {
80
+ out[name] = "required field";
81
+ return;
82
+ }
83
+ if (isEmpty)
84
+ return;
85
+ if (s.type === "email" && typeof raw === "string") {
86
+ if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(raw))
87
+ out[name] = "invalid email";
88
+ }
89
+ else if (s.type === "url" && typeof raw === "string") {
90
+ try {
91
+ new URL(raw);
92
+ }
93
+ catch {
94
+ out[name] = "invalid URL";
95
+ }
96
+ }
97
+ else if (s.type === "number") {
98
+ const n = Number(raw);
99
+ if (Number.isNaN(n))
100
+ out[name] = "must be a number";
101
+ else {
102
+ if (s.min !== undefined && n < s.min)
103
+ out[name] = `minimum ${s.min}`;
104
+ if (s.max !== undefined && n > s.max)
105
+ out[name] = `maximum ${s.max}`;
106
+ }
107
+ }
108
+ if (typeof raw === "string") {
109
+ if (s.minLength !== undefined && raw.length < s.minLength) {
110
+ out[name] = `minimum ${s.minLength} characters`;
111
+ }
112
+ if (s.maxLength !== undefined && raw.length > s.maxLength) {
113
+ out[name] = `maximum ${s.maxLength} characters`;
114
+ }
115
+ if (s.pattern && !new RegExp(s.pattern).test(raw)) {
116
+ out[name] = "invalid format";
117
+ }
118
+ }
119
+ if (s.validate) {
120
+ const custom = s.validate(raw, v, name);
121
+ if (custom)
122
+ out[name] = custom;
123
+ }
124
+ }
125
+ const setFieldValidating = (name, enabled) => {
126
+ validatingFields.update((m) => {
127
+ if (enabled)
128
+ return { ...m, [name]: true };
129
+ const next = { ...m };
130
+ delete next[name];
131
+ return next;
132
+ });
133
+ };
134
+ const setAsyncErrors = (clearPaths, nextErrors) => {
135
+ asyncErrors.update((prev) => {
136
+ const next = { ...prev };
137
+ for (const path of clearPaths)
138
+ delete next[path];
139
+ for (const [path, message] of Object.entries(nextErrors)) {
140
+ if (message)
141
+ next[path] = message;
142
+ else
143
+ delete next[path];
144
+ }
145
+ return next;
146
+ });
147
+ };
148
+ const clearAsyncPrefix = (prefix) => {
149
+ asyncErrors.update((prev) => clearRecordPrefix(prev, prefix));
150
+ };
151
+ const validateField = async (name) => {
152
+ const matching = Object.entries(schema).filter(([pattern, s]) => s.validateAsync && schemaPathMatches(pattern, name));
153
+ const run = (fieldRuns.get(name) ?? 0) + 1;
154
+ fieldRuns.set(name, run);
155
+ setAsyncErrors([name], {});
156
+ if (matching.length === 0)
157
+ return !errors.peek()[name];
158
+ setFieldValidating(name, true);
159
+ const snapshot = values.peek();
160
+ const next = {};
161
+ try {
162
+ for (const [, s] of matching) {
163
+ const message = await s.validateAsync(getPath(snapshot, name), snapshot, name);
164
+ if (message) {
165
+ next[name] = message;
166
+ break;
167
+ }
168
+ }
169
+ }
170
+ catch (err) {
171
+ next[name] = "validation failed";
172
+ // eslint-disable-next-line no-console
173
+ console.error("[mado] field validator threw:", err);
174
+ }
175
+ finally {
176
+ if (fieldRuns.get(name) === run) {
177
+ setAsyncErrors([name], next);
178
+ setFieldValidating(name, false);
179
+ }
180
+ }
181
+ return !errors.peek()[name];
182
+ };
183
+ const validateAll = async () => {
184
+ const run = ++formRun;
185
+ if (Object.keys(syncErrors.peek()).length > 0)
186
+ return false;
187
+ if (options.validateAsync)
188
+ setFieldValidating("$form", true);
189
+ const snapshot = values.peek();
190
+ const paths = concreteSchemaPaths(snapshot, schema);
191
+ await Promise.all(paths.map((path) => validateField(path)));
192
+ if (options.validateAsync) {
193
+ try {
194
+ const custom = await options.validateAsync(values.peek());
195
+ if (formRun === run) {
196
+ setAsyncErrors(formAsyncPaths, custom ?? {});
197
+ formAsyncPaths = Object.keys(custom ?? {});
198
+ }
199
+ }
200
+ catch (err) {
201
+ if (formRun === run) {
202
+ setAsyncErrors(formAsyncPaths, { $form: "validation failed" });
203
+ formAsyncPaths = ["$form"];
204
+ }
205
+ // eslint-disable-next-line no-console
206
+ console.error("[mado] form validator threw:", err);
207
+ }
208
+ finally {
209
+ if (formRun === run)
210
+ setFieldValidating("$form", false);
211
+ }
212
+ }
213
+ return Object.keys(errors.peek()).length === 0;
214
+ };
105
215
  const readField = (el) => {
106
216
  if (el instanceof HTMLInputElement) {
107
217
  if (el.type === "checkbox")
@@ -116,12 +226,15 @@ export function useForm(schema, options = {}) {
116
226
  errors,
117
227
  touched,
118
228
  submitting,
229
+ validating,
230
+ validatingFields,
119
231
  isValid,
120
232
  onInput(e) {
121
233
  const t = e.target;
122
234
  if (!t.name)
123
235
  return;
124
- values.update((v) => ({ ...v, [t.name]: readField(t) }));
236
+ api.setField(t.name, readField(t));
237
+ void validateField(t.name);
125
238
  },
126
239
  onBlur(e) {
127
240
  const t = e.target;
@@ -136,27 +249,188 @@ export function useForm(schema, options = {}) {
136
249
  const all = {};
137
250
  for (const k in schema)
138
251
  all[k] = true;
252
+ for (const k of concreteSchemaPaths(values.peek(), schema))
253
+ all[k] = true;
139
254
  touched.set(all);
140
- if (!isValid())
141
- return;
142
- submitting.set(true);
143
- Promise.resolve(handler(values.peek()))
144
- .catch((err) => {
145
- // eslint-disable-next-line no-console
146
- console.error("[mado] form submit threw:", err);
147
- })
148
- .finally(() => submitting.set(false));
255
+ void (async () => {
256
+ if (!(await validateAll()))
257
+ return;
258
+ submitting.set(true);
259
+ try {
260
+ await handler(values.peek());
261
+ }
262
+ catch (err) {
263
+ // eslint-disable-next-line no-console
264
+ console.error("[mado] form submit threw:", err);
265
+ }
266
+ finally {
267
+ submitting.set(false);
268
+ }
269
+ })();
149
270
  };
150
271
  },
151
272
  setField(name, value) {
152
- values.update((v) => ({ ...v, [name]: value }));
273
+ values.update((v) => setPath(v, name, value));
274
+ setAsyncErrors([name], {});
275
+ },
276
+ validateField,
277
+ validate: validateAll,
278
+ array(name) {
279
+ const read = () => {
280
+ const value = getPath(values.peek(), name);
281
+ return Array.isArray(value) ? value : [];
282
+ };
283
+ const write = (items) => {
284
+ values.update((v) => setPath(v, name, [...items]));
285
+ touched.update((m) => clearRecordPrefix(m, name));
286
+ clearAsyncPrefix(name);
287
+ };
288
+ const clamp = (index, length) => Math.max(0, Math.min(index, length));
289
+ return {
290
+ items: read,
291
+ path(index, field) {
292
+ return field ? `${name}.${index}.${field}` : `${name}.${index}`;
293
+ },
294
+ append(value) {
295
+ write([...read(), value]);
296
+ },
297
+ prepend(value) {
298
+ write([value, ...read()]);
299
+ },
300
+ insert(index, value) {
301
+ const items = read();
302
+ const at = clamp(index, items.length);
303
+ write([...items.slice(0, at), value, ...items.slice(at)]);
304
+ },
305
+ remove(index) {
306
+ const items = read();
307
+ if (index < 0 || index >= items.length)
308
+ return;
309
+ write(items.filter((_, i) => i !== index));
310
+ },
311
+ move(from, to) {
312
+ const items = read();
313
+ if (from < 0 || from >= items.length)
314
+ return;
315
+ const next = [...items];
316
+ const [item] = next.splice(from, 1);
317
+ next.splice(clamp(to, next.length), 0, item);
318
+ write(next);
319
+ },
320
+ replace(items) {
321
+ write(items);
322
+ },
323
+ set(index, value) {
324
+ const items = read();
325
+ if (index < 0 || index >= items.length)
326
+ return;
327
+ const next = [...items];
328
+ next[index] = value;
329
+ write(next);
330
+ },
331
+ };
153
332
  },
154
333
  reset() {
155
334
  values.set(defaults());
156
335
  touched.set({});
336
+ asyncErrors.set({});
337
+ validatingFields.set({});
338
+ formAsyncPaths = [];
157
339
  submitting.set(false);
158
340
  },
159
341
  };
160
342
  return api;
161
343
  }
344
+ function cloneFormValue(value) {
345
+ if (Array.isArray(value))
346
+ return value.map(cloneFormValue);
347
+ if (value && typeof value === "object") {
348
+ const out = {};
349
+ for (const [k, v] of Object.entries(value))
350
+ out[k] = cloneFormValue(v);
351
+ return out;
352
+ }
353
+ return value;
354
+ }
355
+ function getPath(value, path) {
356
+ let current = value;
357
+ for (const part of splitPath(path)) {
358
+ if (current == null || typeof current !== "object")
359
+ return undefined;
360
+ current = current[part];
361
+ }
362
+ return current;
363
+ }
364
+ function setPath(root, path, value) {
365
+ return setPathParts(root, splitPath(path), value);
366
+ }
367
+ function setPathParts(current, parts, value) {
368
+ if (parts.length === 0)
369
+ return value;
370
+ const key = parts[0];
371
+ const rest = parts.slice(1);
372
+ const container = Array.isArray(current)
373
+ ? [...current]
374
+ : current && typeof current === "object"
375
+ ? { ...current }
376
+ : isArrayIndex(key)
377
+ ? []
378
+ : {};
379
+ container[key] = setPathParts(container[key], rest, value);
380
+ return container;
381
+ }
382
+ function splitPath(path) {
383
+ return path.split(".").filter(Boolean);
384
+ }
385
+ function isArrayIndex(value) {
386
+ return /^(0|[1-9]\d*)$/.test(value);
387
+ }
388
+ function expandSchemaPath(values, pattern) {
389
+ if (!pattern.includes("*"))
390
+ return [pattern];
391
+ return expandParts(values, splitPath(pattern), []);
392
+ }
393
+ function expandParts(current, parts, prefix) {
394
+ if (parts.length === 0)
395
+ return [prefix.join(".")];
396
+ const [part, ...rest] = parts;
397
+ if (part === "*") {
398
+ if (!Array.isArray(current))
399
+ return [];
400
+ return current.flatMap((item, index) => expandParts(item, rest, [...prefix, String(index)]));
401
+ }
402
+ const next = current && typeof current === "object"
403
+ ? current[part]
404
+ : undefined;
405
+ return expandParts(next, rest, [...prefix, part]);
406
+ }
407
+ function concreteSchemaPaths(values, schema) {
408
+ const paths = new Set();
409
+ for (const pattern in schema) {
410
+ for (const path of expandSchemaPath(values, pattern))
411
+ paths.add(path);
412
+ }
413
+ return [...paths];
414
+ }
415
+ function schemaPathMatches(pattern, path) {
416
+ const patternParts = splitPath(pattern);
417
+ const pathParts = splitPath(path);
418
+ if (patternParts.length !== pathParts.length)
419
+ return false;
420
+ for (let i = 0; i < patternParts.length; i++) {
421
+ const expected = patternParts[i];
422
+ if (expected !== "*" && expected !== pathParts[i])
423
+ return false;
424
+ }
425
+ return true;
426
+ }
427
+ function clearRecordPrefix(record, prefix) {
428
+ const next = { ...record };
429
+ const dotted = `${prefix}.`;
430
+ for (const key of Object.keys(next)) {
431
+ if (key === prefix || key.startsWith(dotted))
432
+ delete next[key];
433
+ }
434
+ return next;
435
+ }
162
436
  //# sourceMappingURL=forms.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/forms.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/forms.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,47 @@ import { type Disposer } from "../signal.js";
15
15
  import { type EachKey } from "../each.js";
16
16
  import type { AttrBindingSpec } from "./parser.js";
17
17
  import { type TemplateResult, type InstantiatedTemplate } from "./template-types.js";
18
+ type DirectiveKind = "unsafeHTML" | "ref" | "classMap" | "styleMap";
19
+ interface DirectiveBase {
20
+ readonly _madoDirective: DirectiveKind;
21
+ }
22
+ export interface UnsafeHTMLDirective extends DirectiveBase {
23
+ readonly _madoDirective: "unsafeHTML";
24
+ readonly value: string;
25
+ }
26
+ export type RefCallback<T extends Element = Element> = (el: T | null) => void | Disposer;
27
+ export interface RefDirective<T extends Element = Element> extends DirectiveBase {
28
+ readonly _madoDirective: "ref";
29
+ readonly callback: RefCallback<T>;
30
+ }
31
+ export type ClassMap = Record<string, unknown>;
32
+ export interface ClassMapDirective extends DirectiveBase {
33
+ readonly _madoDirective: "classMap";
34
+ readonly value: ClassMap;
35
+ }
36
+ export type StyleMap = Record<string, string | number | null | undefined | false>;
37
+ export interface StyleMapDirective extends DirectiveBase {
38
+ readonly _madoDirective: "styleMap";
39
+ readonly value: StyleMap;
40
+ }
41
+ export type HtmlDirective = UnsafeHTMLDirective | RefDirective | ClassMapDirective | StyleMapDirective;
42
+ /**
43
+ * Render a trusted HTML string as DOM nodes in child position.
44
+ *
45
+ * This intentionally does not sanitize. Only pass strings you own or have
46
+ * sanitized elsewhere.
47
+ */
48
+ export declare function unsafeHTML(value: string): UnsafeHTMLDirective;
49
+ /**
50
+ * Call `callback(element)` when the element is bound, and clean it up on
51
+ * disposal. Use as `ref=${ref((el) => { ... })}`.
52
+ */
53
+ export declare function ref<T extends Element = Element>(callback: RefCallback<T>): RefDirective<T>;
54
+ /** Toggle CSS classes by object keys. Truthy values add, falsy values remove. */
55
+ export declare function classMap(value: ClassMap): ClassMapDirective;
56
+ /** Apply inline styles from an object and remove stale keys on updates. */
57
+ export declare function styleMap(value: StyleMap): StyleMapDirective;
58
+ export declare function isHtmlDirective(v: unknown): v is HtmlDirective;
18
59
  /**
19
60
  * Entry for a node in keyed-each: reference to the template instance
20
61
  * and its top-level DOM nodes. Stored in ChildState.eachEntries