@madojs/mado 0.5.1 → 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.
- package/AGENTS.md +26 -0
- package/CHANGELOG.md +153 -0
- package/MADO_V1_PLAN.md +179 -0
- package/README.md +31 -13
- package/ROADMAP.md +28 -7
- package/TODO.md +72 -0
- package/dist/src/forms.d.ts +37 -4
- package/dist/src/forms.js +331 -57
- package/dist/src/forms.js.map +1 -1
- package/dist/src/html/bindings.d.ts +41 -0
- package/dist/src/html/bindings.js +163 -6
- package/dist/src/html/bindings.js.map +1 -1
- package/dist/src/html.d.ts +2 -0
- package/dist/src/html.js +1 -0
- package/dist/src/html.js.map +1 -1
- package/dist/src/index.d.ts +6 -6
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/page.d.ts +56 -0
- package/dist/src/page.js +17 -0
- package/dist/src/page.js.map +1 -1
- package/dist/src/router/manifest.d.ts +16 -1
- package/dist/src/router/manifest.js +181 -38
- package/dist/src/router/manifest.js.map +1 -1
- package/dist/src/router/match.d.ts +7 -2
- package/dist/src/router/match.js +14 -4
- package/dist/src/router/match.js.map +1 -1
- package/dist/src/router/navigation.d.ts +10 -0
- package/dist/src/router/navigation.js +71 -3
- package/dist/src/router/navigation.js.map +1 -1
- package/dist/src/signal.d.ts +15 -1
- package/dist/src/signal.js +112 -16
- package/dist/src/signal.js.map +1 -1
- package/docs/en/02-project-layout.md +99 -40
- package/docs/en/10-app-architecture.md +141 -0
- package/docs/en/11-layouts.md +115 -0
- package/docs/en/12-auth-and-api.md +217 -0
- package/docs/en/13-deployment.md +192 -0
- package/docs/en/14-testing.md +82 -0
- package/docs/en/15-error-handling.md +100 -0
- package/docs/en/16-bake-cookbook.md +93 -0
- package/docs/en/README.md +7 -0
- package/docs/fr/10-app-architecture.md +61 -0
- package/docs/fr/11-layouts.md +35 -0
- package/docs/fr/12-auth-and-api.md +35 -0
- package/docs/fr/13-deployment.md +39 -0
- package/docs/fr/14-testing.md +41 -0
- package/docs/fr/15-error-handling.md +50 -0
- package/docs/fr/16-bake-cookbook.md +35 -0
- package/docs/fr/README.md +7 -0
- package/docs/ru/10-app-architecture.md +100 -0
- package/docs/ru/11-layouts.md +47 -0
- package/docs/ru/12-auth-and-api.md +53 -0
- package/docs/ru/13-deployment.md +60 -0
- package/docs/ru/14-testing.md +50 -0
- package/docs/ru/15-error-handling.md +56 -0
- package/docs/ru/16-bake-cookbook.md +55 -0
- package/docs/ru/README.md +7 -0
- package/docs/uk/10-app-architecture.md +56 -0
- package/docs/uk/11-layouts.md +34 -0
- package/docs/uk/12-auth-and-api.md +34 -0
- package/docs/uk/13-deployment.md +39 -0
- package/docs/uk/14-testing.md +34 -0
- package/docs/uk/15-error-handling.md +32 -0
- package/docs/uk/16-bake-cookbook.md +36 -0
- package/docs/uk/README.md +7 -0
- package/llms.txt +9 -1
- package/package.json +3 -1
- package/scripts/_config.mjs +224 -0
- package/scripts/bake.mjs +217 -120
- package/scripts/bundle.mjs +110 -67
- package/scripts/cli.mjs +119 -15
- package/scripts/preview.mjs +22 -12
- package/server/serve.mjs +82 -4
- package/starters/admin/README.md +63 -0
- package/starters/admin/index.html +21 -0
- package/starters/admin/mado.config.json +22 -0
- package/starters/admin/package.json +22 -0
- package/starters/admin/public/favicon.svg +4 -0
- package/starters/admin/src/components/x-button.ts +55 -0
- package/starters/admin/src/components/x-input.ts +74 -0
- package/starters/admin/src/layouts/app.ts +101 -0
- package/starters/admin/src/layouts/auth.ts +41 -0
- package/starters/admin/src/lib/api.ts +133 -0
- package/starters/admin/src/lib/auth.ts +83 -0
- package/starters/admin/src/main.ts +15 -0
- package/starters/admin/src/pages/admin/dashboard.ts +48 -0
- package/starters/admin/src/pages/admin/order-detail.ts +78 -0
- package/starters/admin/src/pages/admin/orders.ts +117 -0
- package/starters/admin/src/pages/home.ts +25 -0
- package/starters/admin/src/pages/login.ts +70 -0
- package/starters/admin/src/pages/not-found.ts +12 -0
- package/starters/admin/src/routes.ts +40 -0
- package/starters/admin/src/styles/global.ts +86 -0
- package/starters/admin/tsconfig.json +15 -0
- package/starters/crud/mado.config.json +20 -0
- package/starters/crud/package.json +8 -4
- package/starters/crud/src/routes.ts +4 -2
- package/starters/minimal/mado.config.json +20 -0
- package/starters/minimal/package.json +7 -3
- package/starters/minimal/src/routes.ts +4 -2
package/dist/src/forms.d.ts
CHANGED
|
@@ -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
|
|
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?:
|
|
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
|
|
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
|
|
53
|
-
const s = schema[
|
|
54
|
-
const
|
|
55
|
-
const
|
|
56
|
-
|
|
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
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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) => (
|
|
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
|
package/dist/src/forms.js.map
CHANGED
|
@@ -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
|