@madojs/mado 0.10.0 → 0.11.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 +24 -26
- package/CHANGELOG.md +98 -0
- package/README.md +18 -45
- package/TODO.md +52 -48
- package/dist/src/component.d.ts +2 -1
- package/dist/src/component.js +5 -2
- package/dist/src/component.js.map +1 -1
- package/dist/src/each.d.ts +1 -1
- package/dist/src/each.js +1 -1
- package/dist/src/each.js.map +1 -1
- package/dist/src/html/template.js +10 -0
- package/dist/src/html/template.js.map +1 -1
- package/dist/src/index.d.ts +11 -6
- package/dist/src/index.js +5 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/lazy.d.ts +1 -1
- package/dist/src/lazy.js +1 -1
- package/dist/src/lazy.js.map +1 -1
- package/dist/src/page.d.ts +17 -21
- package/dist/src/page.js +7 -12
- package/dist/src/page.js.map +1 -1
- package/dist/src/router/manifest.d.ts +1 -1
- package/dist/src/router/manifest.js +21 -13
- package/dist/src/router/manifest.js.map +1 -1
- package/dist/src/router/match.d.ts +2 -2
- package/dist/src/router/match.js +3 -3
- package/dist/src/router/match.js.map +1 -1
- package/dist/src/router/navigation.js +1 -1
- package/dist/src/router/navigation.js.map +1 -1
- package/dist/src/vite/index.d.ts +10 -0
- package/dist/src/vite/index.js +33 -0
- package/dist/src/vite/index.js.map +1 -0
- package/docs/en/00-the-mado-way.md +25 -12
- package/docs/en/01-routing.md +90 -142
- package/docs/en/02-project-layout.md +59 -52
- package/docs/en/03-static-bake.md +5 -6
- package/docs/en/05-why-mado.md +6 -6
- package/docs/en/06-for-backenders.md +18 -22
- package/docs/en/08-llm-zero-history-test.md +9 -14
- package/docs/en/09-shadow-vs-light-dom.md +28 -36
- package/docs/en/10-app-architecture.md +158 -96
- package/docs/en/11-layouts.md +22 -24
- package/docs/en/12-auth-and-api.md +89 -182
- package/docs/en/13-deployment.md +25 -26
- package/docs/en/14-testing.md +4 -4
- package/docs/en/16-bake-cookbook.md +17 -10
- package/docs/en/18-api-freeze-map.md +6 -4
- package/docs/en/20-v1-stability.md +1 -1
- package/docs/fr/00-the-mado-way.md +55 -90
- package/docs/fr/01-routing.md +70 -152
- package/docs/fr/02-project-layout.md +74 -48
- package/docs/fr/03-static-bake.md +1 -1
- package/docs/fr/05-why-mado.md +6 -6
- package/docs/fr/06-for-backenders.md +7 -7
- package/docs/fr/08-llm-zero-history-test.md +21 -48
- package/docs/fr/09-shadow-vs-light-dom.md +43 -162
- package/docs/fr/10-app-architecture.md +110 -33
- package/docs/fr/11-layouts.md +24 -12
- package/docs/fr/12-auth-and-api.md +63 -22
- package/docs/fr/13-deployment.md +30 -12
- package/docs/fr/14-testing.md +1 -1
- package/docs/fr/16-bake-cookbook.md +57 -4
- package/docs/fr/18-api-freeze-map.md +1 -1
- package/docs/fr/20-v1-stability.md +1 -1
- package/docs/recipes/nginx/README.md +13 -0
- package/docs/ru/00-the-mado-way.md +53 -75
- package/docs/ru/01-routing.md +68 -143
- package/docs/ru/02-project-layout.md +75 -48
- package/docs/ru/03-static-bake.md +2 -2
- package/docs/ru/05-why-mado.md +6 -6
- package/docs/ru/06-for-backenders.md +7 -7
- package/docs/ru/08-llm-zero-history-test.md +9 -14
- package/docs/ru/09-shadow-vs-light-dom.md +43 -178
- package/docs/ru/10-app-architecture.md +115 -63
- package/docs/ru/11-layouts.md +24 -24
- package/docs/ru/12-auth-and-api.md +57 -35
- package/docs/ru/13-deployment.md +19 -13
- package/docs/ru/14-testing.md +1 -1
- package/docs/ru/16-bake-cookbook.md +48 -8
- package/docs/ru/18-api-freeze-map.md +5 -3
- package/docs/ru/20-v1-stability.md +1 -1
- package/docs/uk/00-the-mado-way.md +70 -44
- package/docs/uk/01-routing.md +41 -47
- package/docs/uk/02-project-layout.md +68 -41
- package/docs/uk/03-static-bake.md +1 -2
- package/docs/uk/06-for-backenders.md +3 -3
- package/docs/uk/08-llm-zero-history-test.md +22 -24
- package/docs/uk/09-shadow-vs-light-dom.md +37 -86
- package/docs/uk/10-app-architecture.md +72 -31
- package/docs/uk/11-layouts.md +25 -12
- package/docs/uk/12-auth-and-api.md +58 -22
- package/docs/uk/13-deployment.md +4 -3
- package/docs/uk/14-testing.md +1 -1
- package/docs/uk/18-api-freeze-map.md +1 -1
- package/docs/uk/20-v1-stability.md +1 -1
- package/llms.txt +14 -15
- package/package.json +18 -11
- package/scripts/_config.mjs +15 -161
- package/scripts/bake.mjs +71 -58
- package/scripts/cli/generate.mjs +348 -0
- package/scripts/cli/help.mjs +27 -0
- package/scripts/cli/index.mjs +79 -0
- package/scripts/cli/init.mjs +153 -0
- package/scripts/cli/release.mjs +152 -0
- package/scripts/cli/run.mjs +96 -0
- package/scripts/cli.mjs +2 -560
- package/scripts/package-smoke.mjs +4 -1
- package/scripts/preview.mjs +17 -61
- package/scripts/size-budget.mjs +5 -2
- package/scripts/vite.default.mjs +11 -0
- package/starters/default/.editorconfig +12 -0
- package/starters/default/README.md +74 -0
- package/starters/default/eslint.config.mjs +256 -0
- package/starters/default/index.html +13 -0
- package/starters/default/package.json +30 -0
- package/starters/default/public/favicon.svg +4 -0
- package/starters/default/src/app.routes.ts +39 -0
- package/starters/default/src/layouts/app-shell.layout.ts +35 -0
- package/starters/default/src/layouts/auth-shell.layout.ts +17 -0
- package/starters/default/src/main.ts +16 -0
- package/starters/default/src/modules/auth/_contracts/auth-api.types.ts +17 -0
- package/starters/default/src/modules/auth/auth.connector.ts +45 -0
- package/starters/default/src/modules/auth/auth.guard.ts +22 -0
- package/starters/default/src/modules/auth/auth.public.ts +9 -0
- package/starters/default/src/modules/auth/auth.routes.ts +8 -0
- package/starters/default/src/modules/auth/auth.service.ts +71 -0
- package/starters/default/src/modules/auth/auth.types.ts +15 -0
- package/starters/default/src/modules/auth/login.page.ts +62 -0
- package/starters/default/src/modules/billing/_contracts/stripe.types.ts +17 -0
- package/starters/default/src/modules/billing/api/stripe.connector.ts +71 -0
- package/starters/default/src/modules/billing/billing.public.ts +5 -0
- package/starters/default/src/modules/billing/billing.routes.ts +9 -0
- package/starters/default/src/modules/billing/billing.types.ts +15 -0
- package/starters/default/src/modules/billing/components/invoice-status-badge.component.ts +43 -0
- package/starters/default/src/modules/billing/data/invoices.resource.ts +35 -0
- package/starters/default/src/modules/billing/pages/invoice-detail.page.ts +70 -0
- package/starters/default/src/modules/billing/pages/invoices-list.page.ts +73 -0
- package/starters/default/src/modules/home/home.page.ts +34 -0
- package/starters/default/src/modules/home/not-found.page.ts +11 -0
- package/starters/default/src/shared/http/http-client.ts +86 -0
- package/starters/default/src/shared/http/http-error.ts +37 -0
- package/starters/default/src/shared/http/interceptors.ts +59 -0
- package/starters/default/src/shared/lib/format-date.ts +19 -0
- package/starters/default/src/shared/styles/content.css +70 -0
- package/starters/default/src/shared/styles/reset.css +32 -0
- package/starters/default/src/shared/styles/shell.css +57 -0
- package/starters/default/src/shared/styles/tokens.css +44 -0
- package/starters/default/src/shared/ui/x-button.component.ts +49 -0
- package/starters/default/src/shared/ui/x-spinner.component.ts +22 -0
- package/starters/default/src/styles.d.ts +1 -0
- package/starters/default/src/vite-env.d.ts +1 -0
- package/starters/default/tsconfig.json +24 -0
- package/starters/default/vite.config.ts +9 -0
- package/MADO_V1_PLAN.md +0 -179
- package/ROADMAP.md +0 -178
- package/dist/src/html.d.ts +0 -18
- package/dist/src/html.js +0 -17
- package/dist/src/html.js.map +0 -1
- package/dist/src/router.d.ts +0 -13
- package/dist/src/router.js +0 -13
- package/dist/src/router.js.map +0 -1
- package/scripts/bundle.mjs +0 -212
- package/scripts/llm-zero-history-smoke.mjs +0 -93
- package/scripts/new.mjs +0 -80
- package/scripts/showcase-regression.mjs +0 -392
- package/server/serve.mjs +0 -455
- package/starters/admin/README.md +0 -63
- package/starters/admin/index.html +0 -28
- package/starters/admin/mado.config.json +0 -22
- package/starters/admin/package.json +0 -24
- package/starters/admin/public/favicon.svg +0 -4
- package/starters/admin/src/components/x-button.ts +0 -82
- package/starters/admin/src/components/x-input.ts +0 -105
- package/starters/admin/src/layouts/app.ts +0 -101
- package/starters/admin/src/layouts/auth.ts +0 -41
- package/starters/admin/src/lib/api.ts +0 -184
- package/starters/admin/src/lib/auth.ts +0 -83
- package/starters/admin/src/main.ts +0 -15
- package/starters/admin/src/pages/admin/dashboard.ts +0 -48
- package/starters/admin/src/pages/admin/order-detail.ts +0 -80
- package/starters/admin/src/pages/admin/orders.ts +0 -117
- package/starters/admin/src/pages/home.ts +0 -34
- package/starters/admin/src/pages/login.ts +0 -70
- package/starters/admin/src/pages/not-found.ts +0 -12
- package/starters/admin/src/routes.ts +0 -40
- package/starters/admin/src/styles/global.ts +0 -86
- package/starters/admin/tsconfig.json +0 -15
- package/starters/crud/README.md +0 -33
- package/starters/crud/index.html +0 -28
- package/starters/crud/mado.config.json +0 -20
- package/starters/crud/package.json +0 -24
- package/starters/crud/src/components/app-shell.ts +0 -56
- package/starters/crud/src/components/ticket-detail.ts +0 -33
- package/starters/crud/src/components/ticket-form.ts +0 -69
- package/starters/crud/src/components/ticket-list.ts +0 -66
- package/starters/crud/src/lib/api.ts +0 -76
- package/starters/crud/src/main.ts +0 -9
- package/starters/crud/src/pages/home.ts +0 -34
- package/starters/crud/src/pages/not-found.ts +0 -12
- package/starters/crud/src/pages/ticket-detail.ts +0 -7
- package/starters/crud/src/pages/ticket-new.ts +0 -7
- package/starters/crud/src/pages/tickets.ts +0 -7
- package/starters/crud/src/routes.ts +0 -11
- package/starters/crud/src/styles/global.ts +0 -155
- package/starters/crud/tsconfig.json +0 -15
- package/starters/minimal/README.md +0 -21
- package/starters/minimal/index.html +0 -28
- package/starters/minimal/mado.config.json +0 -20
- package/starters/minimal/package.json +0 -24
- package/starters/minimal/src/components/app-counter.ts +0 -31
- package/starters/minimal/src/main.ts +0 -9
- package/starters/minimal/src/pages/home.ts +0 -35
- package/starters/minimal/src/pages/not-found.ts +0 -14
- package/starters/minimal/src/routes.ts +0 -8
- package/starters/minimal/src/styles/global.ts +0 -60
- package/starters/minimal/tsconfig.json +0 -15
- package/templates/page-detail.ts +0 -63
- package/templates/page-form.ts +0 -94
- package/templates/page-list.ts +0 -79
package/templates/page-detail.ts
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Template: detail page by :id (loads one entity).
|
|
3
|
-
*
|
|
4
|
-
* Add to routes.ts:
|
|
5
|
-
* '/__name__/:id': () => import('./pages/__name__-detail.js'),
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
page,
|
|
10
|
-
component,
|
|
11
|
-
html,
|
|
12
|
-
css,
|
|
13
|
-
resource,
|
|
14
|
-
jsonFetcher,
|
|
15
|
-
} from "@madojs/mado";
|
|
16
|
-
|
|
17
|
-
interface Entity {
|
|
18
|
-
id: number;
|
|
19
|
-
name: string;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
component(
|
|
23
|
-
"x-__name__-detail",
|
|
24
|
-
({ host }) => {
|
|
25
|
-
// id comes from data-id; page() sets it from params.
|
|
26
|
-
const idAttr = () => host.dataset.id ?? "";
|
|
27
|
-
|
|
28
|
-
const item = resource<Entity>(
|
|
29
|
-
() => `/api/__name__/${idAttr()}`,
|
|
30
|
-
jsonFetcher(),
|
|
31
|
-
{ staleTime: 60_000 },
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
return () => html`
|
|
35
|
-
<section>
|
|
36
|
-
${() =>
|
|
37
|
-
item.loading()
|
|
38
|
-
? html`<p><i>loading…</i></p>`
|
|
39
|
-
: item.error()
|
|
40
|
-
? html`<p class="err">${item.error()!.message}</p>`
|
|
41
|
-
: item.data()
|
|
42
|
-
? html`
|
|
43
|
-
<h1>${item.data()!.name}</h1>
|
|
44
|
-
<p>id: ${item.data()!.id}</p>
|
|
45
|
-
`
|
|
46
|
-
: null}
|
|
47
|
-
<a href="/__name__" data-link>← back to list</a>
|
|
48
|
-
</section>
|
|
49
|
-
`;
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
styles: css`
|
|
53
|
-
:host { display: block; }
|
|
54
|
-
.err { color: #c00; }
|
|
55
|
-
`,
|
|
56
|
-
},
|
|
57
|
-
);
|
|
58
|
-
|
|
59
|
-
export default page<{ id: string }>({
|
|
60
|
-
title: ({ id }) => `__Name__ #${id}`,
|
|
61
|
-
view: ({ params }) =>
|
|
62
|
-
html`<x-__name__-detail data-id=${params.id}></x-__name__-detail>`,
|
|
63
|
-
});
|
package/templates/page-form.ts
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Template: create/edit form page.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
page,
|
|
7
|
-
component,
|
|
8
|
-
html,
|
|
9
|
-
css,
|
|
10
|
-
signal,
|
|
11
|
-
useForm,
|
|
12
|
-
mutation,
|
|
13
|
-
} from "@madojs/mado";
|
|
14
|
-
|
|
15
|
-
interface Values {
|
|
16
|
-
name: string;
|
|
17
|
-
email: string;
|
|
18
|
-
[k: string]: string | number | boolean | undefined;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
component(
|
|
22
|
-
"x-__name__-page",
|
|
23
|
-
() => {
|
|
24
|
-
const f = useForm<Values>({
|
|
25
|
-
name: { required: true, minLength: 2, default: "" },
|
|
26
|
-
email: { required: true, type: "email", default: "" },
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
const save = mutation<Values, Values>(async (v) => {
|
|
30
|
-
const r = await fetch("/api/__name__", {
|
|
31
|
-
method: "POST",
|
|
32
|
-
headers: { "content-type": "application/json" },
|
|
33
|
-
body: JSON.stringify(v),
|
|
34
|
-
});
|
|
35
|
-
if (!r.ok) throw new Error(`HTTP ${r.status}`);
|
|
36
|
-
return (await r.json()) as Values;
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
const done = signal(false);
|
|
40
|
-
|
|
41
|
-
const submit = f.onSubmit(async (v) => {
|
|
42
|
-
await save.run(v);
|
|
43
|
-
done.set(true);
|
|
44
|
-
f.reset();
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
const err = (name: keyof Values) => () =>
|
|
48
|
-
f.touched()[name as string] && f.errors()[name as string]
|
|
49
|
-
? html`<small class="err">${f.errors()[name as string]}</small>`
|
|
50
|
-
: null;
|
|
51
|
-
|
|
52
|
-
return () => html`
|
|
53
|
-
<section>
|
|
54
|
-
<h1>__Name__</h1>
|
|
55
|
-
<form @submit=${submit} novalidate>
|
|
56
|
-
<label>
|
|
57
|
-
Name
|
|
58
|
-
<input name="name" .value=${() => f.values().name ?? ""}
|
|
59
|
-
@input=${f.onInput} @blur=${f.onBlur} />
|
|
60
|
-
${err("name")}
|
|
61
|
-
</label>
|
|
62
|
-
<label>
|
|
63
|
-
Email
|
|
64
|
-
<input name="email" type="email" .value=${() => f.values().email ?? ""}
|
|
65
|
-
@input=${f.onInput} @blur=${f.onBlur} />
|
|
66
|
-
${err("email")}
|
|
67
|
-
</label>
|
|
68
|
-
<button type="submit"
|
|
69
|
-
?disabled=${() => !f.isValid() || f.submitting() || save.loading()}>
|
|
70
|
-
${() => (save.loading() || f.submitting() ? "saving…" : "save")}
|
|
71
|
-
</button>
|
|
72
|
-
${() => (save.error() ? html`<p class="err">${save.error()!.message}</p>` : null)}
|
|
73
|
-
${() => (done() ? html`<p class="ok">saved</p>` : null)}
|
|
74
|
-
</form>
|
|
75
|
-
</section>
|
|
76
|
-
`;
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
styles: css`
|
|
80
|
-
:host { display: block; }
|
|
81
|
-
label { display: block; margin: .5rem 0; }
|
|
82
|
-
input { display: block; margin-top: .25rem; padding: .25rem .5rem;
|
|
83
|
-
border: 1px solid #999; border-radius: 4px; min-width: 14rem; }
|
|
84
|
-
.err { color: #c00; }
|
|
85
|
-
.ok { color: #060; }
|
|
86
|
-
button:disabled { opacity: .5; }
|
|
87
|
-
`,
|
|
88
|
-
},
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
export default page({
|
|
92
|
-
title: "__Name__",
|
|
93
|
-
view: () => html`<x-__name__-page></x-__name__-page>`,
|
|
94
|
-
});
|
package/templates/page-list.ts
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Template: list page with URL filter and pagination.
|
|
3
|
-
* Copy into src/pages/ and rename.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
page,
|
|
8
|
-
component,
|
|
9
|
-
html,
|
|
10
|
-
css,
|
|
11
|
-
each,
|
|
12
|
-
resource,
|
|
13
|
-
queryParam,
|
|
14
|
-
jsonFetcher,
|
|
15
|
-
} from "@madojs/mado";
|
|
16
|
-
|
|
17
|
-
interface Item {
|
|
18
|
-
id: number;
|
|
19
|
-
name: string;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
component(
|
|
23
|
-
"x-__name__-page",
|
|
24
|
-
() => {
|
|
25
|
-
const search = queryParam("q", "");
|
|
26
|
-
const pageQ = queryParam("page", "1");
|
|
27
|
-
const limit = 20;
|
|
28
|
-
|
|
29
|
-
const items = resource<Item[]>(
|
|
30
|
-
() =>
|
|
31
|
-
`/api/__name__?q=${encodeURIComponent(search())}&page=${pageQ()}&limit=${limit}`,
|
|
32
|
-
jsonFetcher(),
|
|
33
|
-
{ staleTime: 30_000 },
|
|
34
|
-
);
|
|
35
|
-
|
|
36
|
-
return () => html`
|
|
37
|
-
<section>
|
|
38
|
-
<h1>__Name__</h1>
|
|
39
|
-
<input
|
|
40
|
-
placeholder="search..."
|
|
41
|
-
.value=${search}
|
|
42
|
-
@input=${(e: Event) =>
|
|
43
|
-
search.set((e.target as HTMLInputElement).value)}
|
|
44
|
-
/>
|
|
45
|
-
${() => (items.loading() ? html`<p><i>loading…</i></p>` : null)}
|
|
46
|
-
${() =>
|
|
47
|
-
items.error()
|
|
48
|
-
? html`<p class="err">${items.error()!.message}</p>`
|
|
49
|
-
: null}
|
|
50
|
-
<ul>
|
|
51
|
-
${() =>
|
|
52
|
-
each(
|
|
53
|
-
items.data() ?? [],
|
|
54
|
-
(it) => it.id,
|
|
55
|
-
(it) => html`<li>${it.name}</li>`,
|
|
56
|
-
)}
|
|
57
|
-
</ul>
|
|
58
|
-
<nav>
|
|
59
|
-
<button @click=${() =>
|
|
60
|
-
pageQ.set(String(Math.max(1, +pageQ() - 1)))}>‹</button>
|
|
61
|
-
<span>${pageQ}</span>
|
|
62
|
-
<button @click=${() => pageQ.set(String(+pageQ() + 1))}>›</button>
|
|
63
|
-
</nav>
|
|
64
|
-
</section>
|
|
65
|
-
`;
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
styles: css`
|
|
69
|
-
:host { display: block; }
|
|
70
|
-
.err { color: #c00; }
|
|
71
|
-
ul { padding-left: 1.2rem; }
|
|
72
|
-
`,
|
|
73
|
-
},
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
export default page({
|
|
77
|
-
title: "__Name__",
|
|
78
|
-
view: () => html`<x-__name__-page></x-__name__-page>`,
|
|
79
|
-
});
|