@madojs/mado 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/AGENTS.md +49 -1
  2. package/CHANGELOG.md +188 -0
  3. package/MADO_V1_PLAN.md +179 -0
  4. package/README.md +53 -14
  5. package/ROADMAP.md +36 -5
  6. package/TODO.md +72 -0
  7. package/dist/src/forms.d.ts +41 -7
  8. package/dist/src/forms.js +334 -59
  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/router/manifest.d.ts +16 -1
  23. package/dist/src/router/manifest.js +181 -38
  24. package/dist/src/router/manifest.js.map +1 -1
  25. package/dist/src/router/match.d.ts +7 -2
  26. package/dist/src/router/match.js +14 -4
  27. package/dist/src/router/match.js.map +1 -1
  28. package/dist/src/router/navigation.d.ts +10 -0
  29. package/dist/src/router/navigation.js +73 -12
  30. package/dist/src/router/navigation.js.map +1 -1
  31. package/dist/src/signal.d.ts +15 -1
  32. package/dist/src/signal.js +112 -16
  33. package/dist/src/signal.js.map +1 -1
  34. package/docs/en/02-project-layout.md +99 -40
  35. package/docs/en/05-why-mado.md +1 -1
  36. package/docs/en/06-for-backenders.md +1 -1
  37. package/docs/en/07-llm-pitfalls.md +1 -1
  38. package/docs/en/09-shadow-vs-light-dom.md +60 -0
  39. package/docs/en/10-app-architecture.md +141 -0
  40. package/docs/en/11-layouts.md +115 -0
  41. package/docs/en/12-auth-and-api.md +217 -0
  42. package/docs/en/13-deployment.md +192 -0
  43. package/docs/en/14-testing.md +82 -0
  44. package/docs/en/15-error-handling.md +100 -0
  45. package/docs/en/16-bake-cookbook.md +93 -0
  46. package/docs/en/README.md +7 -0
  47. package/docs/fr/05-why-mado.md +1 -1
  48. package/docs/fr/06-for-backenders.md +1 -1
  49. package/docs/fr/07-llm-pitfalls.md +1 -1
  50. package/docs/fr/09-shadow-vs-light-dom.md +63 -0
  51. package/docs/fr/10-app-architecture.md +61 -0
  52. package/docs/fr/11-layouts.md +35 -0
  53. package/docs/fr/12-auth-and-api.md +35 -0
  54. package/docs/fr/13-deployment.md +39 -0
  55. package/docs/fr/14-testing.md +41 -0
  56. package/docs/fr/15-error-handling.md +50 -0
  57. package/docs/fr/16-bake-cookbook.md +35 -0
  58. package/docs/fr/README.md +7 -0
  59. package/docs/ru/05-why-mado.md +2 -2
  60. package/docs/ru/06-for-backenders.md +1 -1
  61. package/docs/ru/09-shadow-vs-light-dom.md +60 -0
  62. package/docs/ru/10-app-architecture.md +100 -0
  63. package/docs/ru/11-layouts.md +47 -0
  64. package/docs/ru/12-auth-and-api.md +53 -0
  65. package/docs/ru/13-deployment.md +60 -0
  66. package/docs/ru/14-testing.md +50 -0
  67. package/docs/ru/15-error-handling.md +56 -0
  68. package/docs/ru/16-bake-cookbook.md +55 -0
  69. package/docs/ru/README.md +7 -0
  70. package/docs/uk/06-for-backenders.md +2 -2
  71. package/docs/uk/09-shadow-vs-light-dom.md +91 -24
  72. package/docs/uk/10-app-architecture.md +56 -0
  73. package/docs/uk/11-layouts.md +34 -0
  74. package/docs/uk/12-auth-and-api.md +34 -0
  75. package/docs/uk/13-deployment.md +39 -0
  76. package/docs/uk/14-testing.md +34 -0
  77. package/docs/uk/15-error-handling.md +32 -0
  78. package/docs/uk/16-bake-cookbook.md +36 -0
  79. package/docs/uk/README.md +7 -0
  80. package/llms.txt +24 -1
  81. package/package.json +3 -1
  82. package/scripts/_config.mjs +224 -0
  83. package/scripts/bake.mjs +217 -120
  84. package/scripts/bundle.mjs +110 -67
  85. package/scripts/cli.mjs +127 -16
  86. package/scripts/preview.mjs +22 -12
  87. package/server/serve.mjs +101 -11
  88. package/starters/admin/README.md +63 -0
  89. package/starters/admin/index.html +21 -0
  90. package/starters/admin/mado.config.json +22 -0
  91. package/starters/admin/package.json +22 -0
  92. package/starters/admin/public/favicon.svg +4 -0
  93. package/starters/admin/src/components/x-button.ts +55 -0
  94. package/starters/admin/src/components/x-input.ts +74 -0
  95. package/starters/admin/src/layouts/app.ts +101 -0
  96. package/starters/admin/src/layouts/auth.ts +41 -0
  97. package/starters/admin/src/lib/api.ts +133 -0
  98. package/starters/admin/src/lib/auth.ts +83 -0
  99. package/starters/admin/src/main.ts +15 -0
  100. package/starters/admin/src/pages/admin/dashboard.ts +48 -0
  101. package/starters/admin/src/pages/admin/order-detail.ts +78 -0
  102. package/starters/admin/src/pages/admin/orders.ts +117 -0
  103. package/starters/admin/src/pages/home.ts +25 -0
  104. package/starters/admin/src/pages/login.ts +70 -0
  105. package/starters/admin/src/pages/not-found.ts +12 -0
  106. package/starters/admin/src/routes.ts +40 -0
  107. package/starters/admin/src/styles/global.ts +86 -0
  108. package/starters/admin/tsconfig.json +15 -0
  109. package/starters/crud/README.md +14 -2
  110. package/starters/crud/mado.config.json +20 -0
  111. package/starters/crud/package.json +9 -4
  112. package/starters/crud/src/components/app-shell.ts +13 -8
  113. package/starters/crud/src/main.ts +1 -4
  114. package/starters/crud/src/pages/ticket-detail.ts +1 -0
  115. package/starters/crud/src/pages/ticket-new.ts +1 -0
  116. package/starters/crud/src/pages/tickets.ts +1 -0
  117. package/starters/crud/src/routes.ts +4 -2
  118. package/starters/minimal/README.md +4 -2
  119. package/starters/minimal/mado.config.json +20 -0
  120. package/starters/minimal/package.json +8 -3
  121. package/starters/minimal/src/components/app-counter.ts +1 -1
  122. 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.
@@ -1,5 +1,6 @@
1
1
  /**
2
- * Forms without pain. Built on top of native `<form>` + Constraint Validation API.
2
+ * Forms without pain. Built on native `<form>` submit/input events plus a
3
+ * small schema validator whose rules mirror common HTML constraints.
3
4
  *
4
5
  * const f = useForm({
5
6
  * email: { required: true, type: 'email' },
@@ -20,7 +21,7 @@
20
21
  * `;
21
22
  *
22
23
  * What's inside:
23
- * - validation is performed via standard browser attributes
24
+ * - validation rules mirror common HTML constraints
24
25
  * (required, min, max, pattern, type=email/url/number, etc.);
25
26
  * - custom rules via a validate(values) function returning
26
27
  * { field: 'msg' } or null;
@@ -31,10 +32,15 @@
31
32
  * No Yup/Zod/Formik dependencies. If you really want them —
32
33
  * pass your own validate(values) and wire it to anything.
33
34
  */
34
- import { type Signal } from "./signal.js";
35
- 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>;
36
40
  export type FormErrors = Record<string, string | undefined>;
37
- /** Field declaration. Attributes match HTML5. */
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>;
43
+ /** Field declaration. Rules intentionally match common HTML constraints. */
38
44
  export interface FieldSchema {
39
45
  required?: boolean;
40
46
  type?: "text" | "email" | "url" | "number" | "tel" | "password";
@@ -44,18 +50,39 @@ export interface FieldSchema {
44
50
  maxLength?: number;
45
51
  pattern?: string;
46
52
  /** Default value */
47
- 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;
48
58
  }
49
59
  export type Schema = Record<string, FieldSchema>;
50
60
  export interface UseFormOptions<V extends FormValues> {
51
61
  /** Custom validator: returns errors or null. */
52
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;
53
78
  }
54
79
  export interface FormApi<V extends FormValues> {
55
80
  values: Signal<V>;
56
81
  errors: () => FormErrors;
57
82
  touched: Signal<Record<string, boolean>>;
58
83
  submitting: Signal<boolean>;
84
+ validating: Computed<boolean>;
85
+ validatingFields: Signal<Record<string, boolean>>;
59
86
  isValid: () => boolean;
60
87
  /** Binding for @input/@change: automatically picks up name+value+type. */
61
88
  onInput: (e: Event) => void;
@@ -64,7 +91,14 @@ export interface FormApi<V extends FormValues> {
64
91
  /** Submit wrapper: calls handler only if the form is valid. */
65
92
  onSubmit: (handler: (values: V) => void | Promise<void>) => (e: Event) => void;
66
93
  /** Set a field value programmatically. */
67
- 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>;
68
102
  /** Reset to defaults. */
69
103
  reset(): void;
70
104
  }
package/dist/src/forms.js CHANGED
@@ -1,5 +1,6 @@
1
1
  /**
2
- * Forms without pain. Built on top of native `<form>` + Constraint Validation API.
2
+ * Forms without pain. Built on native `<form>` submit/input events plus a
3
+ * small schema validator whose rules mirror common HTML constraints.
3
4
  *
4
5
  * const f = useForm({
5
6
  * email: { required: true, type: 'email' },
@@ -20,7 +21,7 @@
20
21
  * `;
21
22
  *
22
23
  * What's inside:
23
- * - validation is performed via standard browser attributes
24
+ * - validation rules mirror common HTML constraints
24
25
  * (required, min, max, pattern, type=email/url/number, etc.);
25
26
  * - custom rules via a validate(values) function returning
26
27
  * { field: 'msg' } or null;
@@ -38,60 +39,27 @@ export function useForm(schema, options = {}) {
38
39
  for (const k in schema) {
39
40
  const s = schema[k];
40
41
  if (s.default !== undefined)
41
- out[k] = s.default;
42
+ out[k] = cloneFormValue(s.default);
42
43
  }
43
44
  return out;
44
45
  };
45
46
  const values = signal(defaults());
46
47
  const touched = signal({});
47
48
  const submitting = signal(false);
48
- 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(() => {
49
56
  const v = values();
50
57
  const out = {};
51
- for (const name in schema) {
52
- const s = schema[name];
53
- const raw = v[name];
54
- const isEmpty = raw === undefined || raw === "" || raw === null;
55
- if (s.required && isEmpty) {
56
- out[name] = "required field";
57
- continue;
58
- }
59
- if (isEmpty)
60
- continue;
61
- if (s.type === "email" && typeof raw === "string") {
62
- if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(raw))
63
- out[name] = "invalid email";
64
- }
65
- else if (s.type === "url" && typeof raw === "string") {
66
- try {
67
- new URL(raw);
68
- }
69
- catch {
70
- out[name] = "invalid URL";
71
- }
72
- }
73
- else if (s.type === "number") {
74
- const n = Number(raw);
75
- if (Number.isNaN(n))
76
- out[name] = "must be a number";
77
- else {
78
- if (s.min !== undefined && n < s.min)
79
- out[name] = `minimum ${s.min}`;
80
- if (s.max !== undefined && n > s.max)
81
- out[name] = `maximum ${s.max}`;
82
- }
83
- }
84
- if (typeof raw === "string") {
85
- if (s.minLength !== undefined && raw.length < s.minLength) {
86
- out[name] = `minimum ${s.minLength} characters`;
87
- }
88
- if (s.maxLength !== undefined && raw.length > s.maxLength) {
89
- out[name] = `maximum ${s.maxLength} characters`;
90
- }
91
- if (s.pattern && !new RegExp(s.pattern).test(raw)) {
92
- out[name] = "invalid format";
93
- }
94
- }
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);
95
63
  }
96
64
  if (options.validate) {
97
65
  const custom = options.validate(v);
@@ -100,7 +68,150 @@ export function useForm(schema, options = {}) {
100
68
  }
101
69
  return out;
102
70
  });
71
+ const errors = computed(() => ({
72
+ ...syncErrors(),
73
+ ...asyncErrors(),
74
+ }));
103
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
+ };
104
215
  const readField = (el) => {
105
216
  if (el instanceof HTMLInputElement) {
106
217
  if (el.type === "checkbox")
@@ -115,12 +226,15 @@ export function useForm(schema, options = {}) {
115
226
  errors,
116
227
  touched,
117
228
  submitting,
229
+ validating,
230
+ validatingFields,
118
231
  isValid,
119
232
  onInput(e) {
120
233
  const t = e.target;
121
234
  if (!t.name)
122
235
  return;
123
- values.update((v) => ({ ...v, [t.name]: readField(t) }));
236
+ api.setField(t.name, readField(t));
237
+ void validateField(t.name);
124
238
  },
125
239
  onBlur(e) {
126
240
  const t = e.target;
@@ -135,27 +249,188 @@ export function useForm(schema, options = {}) {
135
249
  const all = {};
136
250
  for (const k in schema)
137
251
  all[k] = true;
252
+ for (const k of concreteSchemaPaths(values.peek(), schema))
253
+ all[k] = true;
138
254
  touched.set(all);
139
- if (!isValid())
140
- return;
141
- submitting.set(true);
142
- Promise.resolve(handler(values.peek()))
143
- .catch((err) => {
144
- // eslint-disable-next-line no-console
145
- console.error("[mado] form submit threw:", err);
146
- })
147
- .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
+ })();
148
270
  };
149
271
  },
150
272
  setField(name, value) {
151
- 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
+ };
152
332
  },
153
333
  reset() {
154
334
  values.set(defaults());
155
335
  touched.set({});
336
+ asyncErrors.set({});
337
+ validatingFields.set({});
338
+ formAsyncPaths = [];
156
339
  submitting.set(false);
157
340
  },
158
341
  };
159
342
  return api;
160
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
+ }
161
436
  //# sourceMappingURL=forms.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/forms.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAe,MAAM,aAAa,CAAC;AA+C5D,MAAM,UAAU,OAAO,CACrB,MAAc,EACd,UAA6B,EAAE;IAE/B,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,MAAM,GAAG,GAAe,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;YACrB,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS;gBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;QAClD,CAAC;QACD,OAAO,GAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,CAAI,QAAQ,EAAE,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,CAA0B,EAAE,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjC,MAAM,MAAM,GAAG,QAAQ,CAAa,GAAG,EAAE;QACvC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;QACnB,MAAM,GAAG,GAAe,EAAE,CAAC;QAE3B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAE,CAAC;YACxB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YACpB,MAAM,OAAO,GAAG,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,IAAI,CAAC;YAEhE,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO,EAAE,CAAC;gBAC1B,GAAG,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC;gBAC7B,SAAS;YACX,CAAC;YACD,IAAI,OAAO;gBAAE,SAAS;YAEtB,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAClD,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC;YAC3E,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACvD,IAAI,CAAC;oBACH,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;gBACf,CAAC;gBAAC,MAAM,CAAC;oBACP,GAAG,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC;gBAC5B,CAAC;YACH,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBACtB,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC;qBAC/C,CAAC;oBACJ,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG;wBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,CAAC;oBACrE,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG;wBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,CAAC;gBACvE,CAAC;YACH,CAAC;YAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;oBAC1D,GAAG,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,SAAS,aAAa,CAAC;gBAClD,CAAC;gBACD,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;oBAC1D,GAAG,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,SAAS,aAAa,CAAC;gBAClD,CAAC;gBACD,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClD,GAAG,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,MAAM;gBAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;IAEnE,MAAM,SAAS,GAAG,CAAC,EAA8D,EAAE,EAAE;QACnF,IAAI,EAAE,YAAY,gBAAgB,EAAE,CAAC;YACnC,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU;gBAAE,OAAO,EAAE,CAAC,OAAO,CAAC;YAC9C,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,GAAG,GAAe;QACtB,MAAM;QACN,MAAM;QACN,OAAO;QACP,UAAU;QACV,OAAO;QAEP,OAAO,CAAC,CAAC;YACP,MAAM,CAAC,GAAG,CAAC,CAAC,MAA0B,CAAC;YACvC,IAAI,CAAC,CAAC,CAAC,IAAI;gBAAE,OAAO;YACpB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,CAAC,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,CAAC,MAA0B,CAAC;YACvC,IAAI,CAAC,CAAC,CAAC,IAAI;gBAAE,OAAO;YACpB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,QAAQ,CAAC,OAAO;YACd,OAAO,CAAC,CAAQ,EAAE,EAAE;gBAClB,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,gDAAgD;gBAChD,MAAM,GAAG,GAA4B,EAAE,CAAC;gBACxC,KAAK,MAAM,CAAC,IAAI,MAAM;oBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAEjB,IAAI,CAAC,OAAO,EAAE;oBAAE,OAAO;gBAEvB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACrB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;qBACpC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACb,sCAAsC;oBACtC,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;gBAClD,CAAC,CAAC;qBACD,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1C,CAAC,CAAC;QACJ,CAAC;QAED,QAAQ,CAAC,IAAI,EAAE,KAAK;YAClB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,KAAK;YACH,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;KACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/forms.ts"],"names":[],"mappings":"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"}