microui-wc 0.1.1 ā 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +71 -71
- package/CHANGELOG.md +1 -1
- package/README.md +14 -9
- package/dist/AGENTS.md +71 -71
- package/dist/README.md +14 -9
- package/dist/microui.css +1 -1
- package/dist/microui.esm.js.map +1 -1
- package/dist/microui.min.js.map +1 -1
- package/docs/getting-started.md +3 -3
- package/package.json +39 -11
- package/src/components/mu-schema-form.js +1 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -40
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -33
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -28
- package/.github/workflows/ci.yml +0 -42
- package/.github/workflows/deploy-pages.yml +0 -112
- package/CODE_OF_CONDUCT.md +0 -59
- package/CONTRIBUTING.md +0 -156
- package/SECURITY.md +0 -58
- package/app/.generated/routes/alerts.js +0 -8
- package/app/.generated/routes/avatars.js +0 -8
- package/app/.generated/routes/badges.js +0 -8
- package/app/.generated/routes/buttons.js +0 -10
- package/app/.generated/routes/cards.js +0 -10
- package/app/.generated/routes/checkboxes.js +0 -9
- package/app/.generated/routes/chips.js +0 -8
- package/app/.generated/routes/dropdowns.js +0 -9
- package/app/.generated/routes/home.js +0 -7
- package/app/.generated/routes/icons.js +0 -9
- package/app/.generated/routes/inputs.js +0 -10
- package/app/.generated/routes/installation.js +0 -7
- package/app/.generated/routes/layout.js +0 -9
- package/app/.generated/routes/modals.js +0 -9
- package/app/.generated/routes/navbar.js +0 -7
- package/app/.generated/routes/progress.js +0 -9
- package/app/.generated/routes/radios.js +0 -9
- package/app/.generated/routes/switches.js +0 -9
- package/app/.generated/routes/tabs.js +0 -8
- package/app/.generated/routes/toasts.js +0 -9
- package/app/index.html +0 -67
- package/app/pages/alerts.html +0 -23
- package/app/pages/avatars.html +0 -22
- package/app/pages/badges.html +0 -22
- package/app/pages/buttons.html +0 -71
- package/app/pages/cards.html +0 -54
- package/app/pages/checkboxes.html +0 -39
- package/app/pages/chips.html +0 -23
- package/app/pages/dropdowns.html +0 -41
- package/app/pages/home.html +0 -59
- package/app/pages/icons.html +0 -29
- package/app/pages/inputs.html +0 -66
- package/app/pages/installation.html +0 -34
- package/app/pages/layout.html +0 -30
- package/app/pages/modals.html +0 -21
- package/app/pages/navbar.html +0 -22
- package/app/pages/progress.html +0 -35
- package/app/pages/radios.html +0 -40
- package/app/pages/switches.html +0 -39
- package/app/pages/tabs.html +0 -30
- package/app/pages/toasts.html +0 -22
- package/app-dist/index.html +0 -67
- package/app-dist/pages/alerts.html +0 -23
- package/app-dist/pages/avatars.html +0 -22
- package/app-dist/pages/badges.html +0 -22
- package/app-dist/pages/buttons.html +0 -71
- package/app-dist/pages/cards.html +0 -54
- package/app-dist/pages/checkboxes.html +0 -39
- package/app-dist/pages/chips.html +0 -23
- package/app-dist/pages/dropdowns.html +0 -41
- package/app-dist/pages/home.html +0 -59
- package/app-dist/pages/icons.html +0 -29
- package/app-dist/pages/inputs.html +0 -66
- package/app-dist/pages/installation.html +0 -34
- package/app-dist/pages/layout.html +0 -30
- package/app-dist/pages/modals.html +0 -21
- package/app-dist/pages/navbar.html +0 -22
- package/app-dist/pages/progress.html +0 -35
- package/app-dist/pages/radios.html +0 -40
- package/app-dist/pages/switches.html +0 -39
- package/app-dist/pages/tabs.html +0 -30
- package/app-dist/pages/toasts.html +0 -22
- package/app-dist/pages.json +0 -217
- package/app-dist/routes/alerts.js +0 -5
- package/app-dist/routes/avatars.js +0 -1
- package/app-dist/routes/badges.js +0 -1
- package/app-dist/routes/buttons.js +0 -1
- package/app-dist/routes/cards.js +0 -1
- package/app-dist/routes/checkboxes.js +0 -9
- package/app-dist/routes/chips.js +0 -4
- package/app-dist/routes/chunk-019e5e2f.js +0 -5
- package/app-dist/routes/chunk-0m4j19yd.js +0 -2
- package/app-dist/routes/chunk-0tmmp5q0.js +0 -1
- package/app-dist/routes/chunk-10xn709r.js +0 -1
- package/app-dist/routes/chunk-15m2qcda.js +0 -2
- package/app-dist/routes/chunk-1bh8g23n.js +0 -1
- package/app-dist/routes/chunk-1vg0v937.js +0 -1
- package/app-dist/routes/chunk-1zvcgy3j.js +0 -1
- package/app-dist/routes/chunk-2afb0861.js +0 -1
- package/app-dist/routes/chunk-2c6ttpzt.js +0 -5
- package/app-dist/routes/chunk-3dy30fhs.js +0 -1
- package/app-dist/routes/chunk-426dnces.js +0 -13
- package/app-dist/routes/chunk-44kgxery.js +0 -1
- package/app-dist/routes/chunk-47fdnejd.js +0 -33
- package/app-dist/routes/chunk-49a6t2vq.js +0 -1
- package/app-dist/routes/chunk-4fe1rm5b.js +0 -1
- package/app-dist/routes/chunk-4ggmvkta.js +0 -33
- package/app-dist/routes/chunk-4vkz81q7.js +0 -33
- package/app-dist/routes/chunk-4w4tmj8f.js +0 -31
- package/app-dist/routes/chunk-532s62kr.js +0 -31
- package/app-dist/routes/chunk-5hm3bssy.js +0 -33
- package/app-dist/routes/chunk-5vrh24hc.js +0 -1
- package/app-dist/routes/chunk-61pcg25a.js +0 -1
- package/app-dist/routes/chunk-6nfhygvf.js +0 -1
- package/app-dist/routes/chunk-700e7je6.js +0 -33
- package/app-dist/routes/chunk-7fsn17kg.js +0 -1
- package/app-dist/routes/chunk-7k789b32.js +0 -1
- package/app-dist/routes/chunk-7r46q0ys.js +0 -36
- package/app-dist/routes/chunk-86fmc1fr.js +0 -5
- package/app-dist/routes/chunk-8qth37vw.js +0 -1
- package/app-dist/routes/chunk-924wv8n0.js +0 -1
- package/app-dist/routes/chunk-9mbhgxk9.js +0 -1
- package/app-dist/routes/chunk-a216hyd9.js +0 -1
- package/app-dist/routes/chunk-akzxykh9.js +0 -33
- package/app-dist/routes/chunk-b3dcvy8c.js +0 -1
- package/app-dist/routes/chunk-b74zahz5.js +0 -31
- package/app-dist/routes/chunk-bftj53p2.js +0 -5
- package/app-dist/routes/chunk-c01hnz3e.js +0 -1
- package/app-dist/routes/chunk-d8pvv5km.js +0 -1
- package/app-dist/routes/chunk-dev0aezr.js +0 -2
- package/app-dist/routes/chunk-dh6vnv0e.js +0 -1
- package/app-dist/routes/chunk-dn2cbpva.js +0 -36
- package/app-dist/routes/chunk-dvn0my90.js +0 -1
- package/app-dist/routes/chunk-dvq8mnve.js +0 -36
- package/app-dist/routes/chunk-e8c2gc4d.js +0 -5
- package/app-dist/routes/chunk-ejf9ak2x.js +0 -1
- package/app-dist/routes/chunk-f083m55s.js +0 -1
- package/app-dist/routes/chunk-fnrj28s1.js +0 -31
- package/app-dist/routes/chunk-fvg3yjdp.js +0 -31
- package/app-dist/routes/chunk-g7k381n1.js +0 -1
- package/app-dist/routes/chunk-h01kq2ae.js +0 -13
- package/app-dist/routes/chunk-h4dk761v.js +0 -5
- package/app-dist/routes/chunk-hmx91z2x.js +0 -5
- package/app-dist/routes/chunk-hxbg4m42.js +0 -36
- package/app-dist/routes/chunk-jbjnfp2b.js +0 -2
- package/app-dist/routes/chunk-jxtz5vv6.js +0 -36
- package/app-dist/routes/chunk-jxzcs0ey.js +0 -36
- package/app-dist/routes/chunk-kt7wwhcx.js +0 -1
- package/app-dist/routes/chunk-kzptszyc.js +0 -33
- package/app-dist/routes/chunk-mhgca4w4.js +0 -2
- package/app-dist/routes/chunk-mhswxa20.js +0 -1
- package/app-dist/routes/chunk-n8zfeex6.js +0 -1
- package/app-dist/routes/chunk-pee47b2r.js +0 -1
- package/app-dist/routes/chunk-pesmw829.js +0 -1
- package/app-dist/routes/chunk-pgc4c6f3.js +0 -36
- package/app-dist/routes/chunk-q8egegm1.js +0 -1
- package/app-dist/routes/chunk-q9mn2qyq.js +0 -36
- package/app-dist/routes/chunk-qh0rtaf3.js +0 -5
- package/app-dist/routes/chunk-qqhmk6ye.js +0 -2
- package/app-dist/routes/chunk-qrxygmf7.js +0 -33
- package/app-dist/routes/chunk-r46yzksx.js +0 -36
- package/app-dist/routes/chunk-rgpbw2w0.js +0 -5
- package/app-dist/routes/chunk-rnpzv3d8.js +0 -2
- package/app-dist/routes/chunk-s5v8cv05.js +0 -2
- package/app-dist/routes/chunk-sbwn5bpc.js +0 -1
- package/app-dist/routes/chunk-sqbg8jbt.js +0 -33
- package/app-dist/routes/chunk-sv8dqnf7.js +0 -1
- package/app-dist/routes/chunk-t67sw3za.js +0 -1
- package/app-dist/routes/chunk-tjdpqwdf.js +0 -31
- package/app-dist/routes/chunk-tq2mfghg.js +0 -1
- package/app-dist/routes/chunk-ttn10vt6.js +0 -1
- package/app-dist/routes/chunk-v2hzpjxr.js +0 -1
- package/app-dist/routes/chunk-wfjjkw9y.js +0 -1
- package/app-dist/routes/chunk-wt8cxzmf.js +0 -31
- package/app-dist/routes/chunk-x45d372k.js +0 -5
- package/app-dist/routes/chunk-y3wsazkt.js +0 -1
- package/app-dist/routes/chunk-y7pmgc7t.js +0 -33
- package/app-dist/routes/chunk-zefdt2q3.js +0 -31
- package/app-dist/routes/dropdowns.js +0 -6
- package/app-dist/routes/home.js +0 -1
- package/app-dist/routes/icons.js +0 -1
- package/app-dist/routes/inputs.js +0 -12
- package/app-dist/routes/installation.js +0 -1
- package/app-dist/routes/layout.js +0 -1
- package/app-dist/routes/modals.js +0 -7
- package/app-dist/routes/navbar.js +0 -1
- package/app-dist/routes/progress.js +0 -1
- package/app-dist/routes/radios.js +0 -6
- package/app-dist/routes/switches.js +0 -6
- package/app-dist/routes/tabs.js +0 -1
- package/app-dist/routes/toasts.js +0 -16
- package/assets/fonts/material-symbols-mini.woff2 +0 -0
- package/assets/fonts/material-symbols.woff2 +0 -0
- package/assets/fonts/roboto-400.woff2 +0 -0
- package/assets/fonts/roboto-500.woff2 +0 -0
- package/assets/fonts/roboto-700.woff2 +0 -0
- package/assets/logo-banner-400.jpg +0 -0
- package/assets/logo-banner-400.webp +0 -0
- package/assets/logo-banner-800.webp +0 -0
- package/assets/logo-banner.jpg +0 -0
- package/assets/logo-icon-64.jpg +0 -0
- package/assets/logo-icon-64.webp +0 -0
- package/assets/logo-icon.jpg +0 -0
- package/assets/logo-square.jpg +0 -0
- package/bun.lock +0 -312
- package/bunfig.toml +0 -4
- package/custom-elements.json +0 -1916
- package/demo/api/sample-data.json +0 -38
- package/demo/content/alerts.html +0 -115
- package/demo/content/avatars.html +0 -70
- package/demo/content/badges.html +0 -65
- package/demo/content/buttons.html +0 -188
- package/demo/content/callouts.html +0 -91
- package/demo/content/cards.html +0 -121
- package/demo/content/checkboxes.html +0 -178
- package/demo/content/chips.html +0 -67
- package/demo/content/codeblocks.html +0 -101
- package/demo/content/confirms.html +0 -115
- package/demo/content/datatables.html +0 -149
- package/demo/content/dividers.html +0 -119
- package/demo/content/dropdowns.html +0 -89
- package/demo/content/enterprise.html +0 -252
- package/demo/content/home.html +0 -149
- package/demo/content/icons.html +0 -89
- package/demo/content/inputs.html +0 -135
- package/demo/content/installation.html +0 -16
- package/demo/content/layout.html +0 -136
- package/demo/content/modals.html +0 -141
- package/demo/content/navbar.html +0 -70
- package/demo/content/progress.html +0 -119
- package/demo/content/radios.html +0 -88
- package/demo/content/skeletons.html +0 -109
- package/demo/content/spinners.html +0 -96
- package/demo/content/switches.html +0 -84
- package/demo/content/tables.html +0 -124
- package/demo/content/tabs.html +0 -85
- package/demo/content/toasts.html +0 -116
- package/demo/content/tooltips.html +0 -107
- package/demo/content/virtual-lists.html +0 -233
- package/demo/favicon.ico +0 -0
- package/demo/favicon.png +0 -0
- package/demo/full.html +0 -52
- package/demo/iife.html +0 -46
- package/demo/manifest.json +0 -34
- package/demo/pages/datatable-demo.html +0 -237
- package/demo/pages/prompt-ui-demo.html +0 -218
- package/demo/pages/responsive-demo.html +0 -122
- package/demo/pages/schema-form-demo.html +0 -270
- package/demo/robots.txt +0 -6
- package/demo/shell.html +0 -712
- package/demo/sw.js +0 -387
- package/lighthouse-audit.mjs +0 -113
- package/scripts/analyze-components.js +0 -105
- package/scripts/build-app.js +0 -193
- package/scripts/build-framework.js +0 -444
- package/scripts/build-utils.js +0 -101
- package/scripts/test-isolated.js +0 -151
- package/server.js +0 -256
- package/tests/agents/agent-integration.test.js +0 -76
- package/tests/benchmark.html +0 -296
- package/tests/build/scan-components.test.js +0 -173
- package/tests/components/all-components.test.js +0 -245
- package/tests/components/all-missing-components.test.js +0 -574
- package/tests/components/mu-alert.test.js +0 -113
- package/tests/components/mu-avatar.test.js +0 -148
- package/tests/components/mu-badge.test.js +0 -92
- package/tests/components/mu-button.test.js +0 -112
- package/tests/components/mu-card.test.js +0 -89
- package/tests/components/mu-checkbox.test.js +0 -158
- package/tests/components/mu-chip.test.js +0 -118
- package/tests/components/mu-container.test.js +0 -120
- package/tests/components/mu-divider.test.js +0 -98
- package/tests/components/mu-drawer-item.test.js +0 -199
- package/tests/components/mu-drawer.test.js +0 -96
- package/tests/components/mu-dropdown.test.js +0 -125
- package/tests/components/mu-form.test.js +0 -138
- package/tests/components/mu-grid.test.js +0 -135
- package/tests/components/mu-icon.test.js +0 -110
- package/tests/components/mu-input.test.js +0 -131
- package/tests/components/mu-lazy.test.js +0 -103
- package/tests/components/mu-modal.test.js +0 -275
- package/tests/components/mu-navbar.test.js +0 -101
- package/tests/components/mu-progress.test.js +0 -115
- package/tests/components/mu-radio.test.js +0 -114
- package/tests/components/mu-repeat.test.js +0 -106
- package/tests/components/mu-sidebar.test.js +0 -126
- package/tests/components/mu-skeleton.test.js +0 -162
- package/tests/components/mu-stack.test.js +0 -143
- package/tests/components/mu-switch.test.js +0 -292
- package/tests/components/mu-table.test.js +0 -124
- package/tests/components/mu-tabs.test.js +0 -104
- package/tests/components/mu-textarea.test.js +0 -115
- package/tests/components/mu-toast.test.js +0 -321
- package/tests/components/mu-tooltip.test.js +0 -133
- package/tests/components/mu-virtual-list.test.js +0 -109
- package/tests/core/MuElement.test.js +0 -120
- package/tests/core/agent-api.test.js +0 -125
- package/tests/core/all-core-modules.test.js +0 -442
- package/tests/core/bus.test.js +0 -364
- package/tests/core/component-schema.test.js +0 -160
- package/tests/core/feature-registry.test.js +0 -198
- package/tests/core/form-state.test.js +0 -167
- package/tests/core/http.test.js +0 -119
- package/tests/core/keyboard.test.js +0 -319
- package/tests/core/layers.test.js +0 -129
- package/tests/core/namespaced-stores.test.js +0 -114
- package/tests/core/render.test.js +0 -121
- package/tests/core/ripple.test.js +0 -131
- package/tests/core/router.test.js +0 -89
- package/tests/core/scheduler.test.js +0 -121
- package/tests/core/signals.test.js +0 -128
- package/tests/core/store.test.js +0 -171
- package/tests/core/transitions.test.js +0 -82
- package/tests/e2e/accessibility-harness.html +0 -58
- package/tests/e2e/accessibility.test.js +0 -401
- package/tests/e2e/agent-features.test.js +0 -372
- package/tests/e2e/card-spacing.test.js +0 -287
- package/tests/e2e/components.test.js +0 -439
- package/tests/e2e/demo-routes.test.js +0 -478
- package/tests/e2e/layout-css-fallback.test.js +0 -334
- package/tests/e2e/mu-alert.e2e.test.js +0 -111
- package/tests/e2e/mu-checkbox.test.js +0 -489
- package/tests/e2e/mu-chip.test.js +0 -347
- package/tests/e2e/mu-form.test.js +0 -499
- package/tests/e2e/mu-icon.test.js +0 -114
- package/tests/e2e/mu-radio.test.js +0 -113
- package/tests/e2e/mu-skeleton.test.js +0 -140
- package/tests/e2e/mu-switch.test.js +0 -415
- package/tests/e2e/mu-tabs.test.js +0 -494
- package/tests/e2e/mu-textarea.test.js +0 -242
- package/tests/e2e/mu-virtual-list.test.js +0 -427
- package/tests/e2e/perf-memory.test.js +0 -161
- package/tests/e2e/puppeteer-helper.js +0 -137
- package/tests/e2e/puppeteer.test.js +0 -226
- package/tests/e2e/pwa.test.js +0 -261
- package/tests/e2e/test-harness.html +0 -319
- package/tests/manual/test-components.html +0 -120
- package/tests/memory-test.html +0 -309
- package/tests/setup-dom.js +0 -93
- package/tests/visual-test.html +0 -301
package/scripts/build-app.js
DELETED
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview App Build - Demo Site & Page-Based Apps
|
|
3
|
-
*
|
|
4
|
-
* Builds apps that use the mu-page component system:
|
|
5
|
-
* - Scans app/pages/*.html for page components
|
|
6
|
-
* - Extracts dependencies from <script type="x-dependencies">
|
|
7
|
-
* - Generates route bundles automatically
|
|
8
|
-
* - Outputs to app-dist/
|
|
9
|
-
*
|
|
10
|
-
* Run with: bun run build:app
|
|
11
|
-
*
|
|
12
|
-
* @agent-pattern
|
|
13
|
-
* This is the build agents should use when creating apps with microUI.
|
|
14
|
-
* Just add pages to app/pages/ and run this build.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { build } from 'bun';
|
|
18
|
-
import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, statSync, copyFileSync, unlinkSync, rmdirSync } from 'fs';
|
|
19
|
-
import { join, basename } from 'path';
|
|
20
|
-
|
|
21
|
-
const appDir = './app';
|
|
22
|
-
const pagesDir = join(appDir, 'pages');
|
|
23
|
-
const outdir = './app-dist';
|
|
24
|
-
const routesDir = join(outdir, 'routes');
|
|
25
|
-
|
|
26
|
-
console.log('š Building App...\n');
|
|
27
|
-
|
|
28
|
-
// Ensure directories exist
|
|
29
|
-
mkdirSync(outdir, { recursive: true });
|
|
30
|
-
mkdirSync(routesDir, { recursive: true });
|
|
31
|
-
|
|
32
|
-
// ============================================
|
|
33
|
-
// 1. Discover Pages & Extract Dependencies
|
|
34
|
-
// ============================================
|
|
35
|
-
console.log('š Scanning pages...');
|
|
36
|
-
|
|
37
|
-
const pages = [];
|
|
38
|
-
|
|
39
|
-
if (existsSync(pagesDir)) {
|
|
40
|
-
const pageFiles = readdirSync(pagesDir).filter(f => f.endsWith('.html'));
|
|
41
|
-
|
|
42
|
-
for (const file of pageFiles) {
|
|
43
|
-
const filePath = join(pagesDir, file);
|
|
44
|
-
const content = readFileSync(filePath, 'utf-8');
|
|
45
|
-
const routeName = basename(file, '.html');
|
|
46
|
-
|
|
47
|
-
// Extract dependencies from <script type="x-dependencies">
|
|
48
|
-
const depsMatch = content.match(/<script type="x-dependencies">([\s\S]*?)<\/script>/);
|
|
49
|
-
const deps = depsMatch
|
|
50
|
-
? depsMatch[1].split(/[\n,]/).map(d => d.trim()).filter(d => d && d.startsWith('mu-'))
|
|
51
|
-
: [];
|
|
52
|
-
|
|
53
|
-
// Extract title from <mu-page title="...">
|
|
54
|
-
const titleMatch = content.match(/<mu-page[^>]*title="([^"]+)"/);
|
|
55
|
-
const title = titleMatch ? titleMatch[1] : routeName;
|
|
56
|
-
|
|
57
|
-
pages.push({ name: routeName, file, deps, title });
|
|
58
|
-
console.log(` š ${file} ā ${deps.length} dependencies`);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
console.log(` Found ${pages.length} pages\n`);
|
|
63
|
-
|
|
64
|
-
// ============================================
|
|
65
|
-
// 2. Generate Route Entry Files
|
|
66
|
-
// ============================================
|
|
67
|
-
console.log('š¦ Generating route bundles...');
|
|
68
|
-
const generatedRoutesDir = './app/.generated/routes';
|
|
69
|
-
mkdirSync(generatedRoutesDir, { recursive: true });
|
|
70
|
-
|
|
71
|
-
for (const page of pages) {
|
|
72
|
-
// Generate import statements for dependencies (relative from app/.generated/routes/)
|
|
73
|
-
const imports = page.deps.map(dep =>
|
|
74
|
-
`import '../../../dist/components/${dep}.js';`
|
|
75
|
-
).join('\n');
|
|
76
|
-
|
|
77
|
-
const routeContent = `/**
|
|
78
|
-
* Auto-generated route for: ${page.name}
|
|
79
|
-
* Dependencies: ${page.deps.join(', ')}
|
|
80
|
-
*/
|
|
81
|
-
${imports}
|
|
82
|
-
`;
|
|
83
|
-
|
|
84
|
-
writeFileSync(join(generatedRoutesDir, `${page.name}.js`), routeContent);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Build route bundles
|
|
88
|
-
const routeEntryFiles = pages.map(p => join(generatedRoutesDir, `${p.name}.js`));
|
|
89
|
-
|
|
90
|
-
if (routeEntryFiles.length > 0) {
|
|
91
|
-
const routeResult = await build({
|
|
92
|
-
entrypoints: routeEntryFiles,
|
|
93
|
-
outdir: routesDir,
|
|
94
|
-
target: 'browser',
|
|
95
|
-
format: 'esm',
|
|
96
|
-
minify: true,
|
|
97
|
-
splitting: true,
|
|
98
|
-
sourcemap: 'none'
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
if (!routeResult.success) {
|
|
102
|
-
console.error('ā Route build failed:', routeResult.logs);
|
|
103
|
-
} else {
|
|
104
|
-
// Flatten nested structure if present
|
|
105
|
-
const nestedDir = join(routesDir, 'app', '.generated', 'routes');
|
|
106
|
-
if (existsSync(nestedDir)) {
|
|
107
|
-
const files = readdirSync(nestedDir).filter(f => f.endsWith('.js'));
|
|
108
|
-
for (const file of files) {
|
|
109
|
-
let content = readFileSync(join(nestedDir, file), 'utf-8');
|
|
110
|
-
content = content.replace(/from"\.\.\/\.\.\/\.\.\/\.\.\/dist\/components\//g, 'from"/dist/components/');
|
|
111
|
-
content = content.replace(/from"\.\.\/\.\.\/\.\.\/chunk-/g, 'from"./chunk-');
|
|
112
|
-
content = content.replace(/import"\.\.\/\.\.\/\.\.\/chunk-/g, 'import"./chunk-');
|
|
113
|
-
writeFileSync(join(routesDir, file), content);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Cleanup
|
|
117
|
-
try {
|
|
118
|
-
const allFiles = readdirSync(nestedDir);
|
|
119
|
-
for (const f of allFiles) unlinkSync(join(nestedDir, f));
|
|
120
|
-
rmdirSync(nestedDir);
|
|
121
|
-
rmdirSync(join(routesDir, 'app', '.generated'));
|
|
122
|
-
rmdirSync(join(routesDir, 'app'));
|
|
123
|
-
} catch (e) { }
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Count files
|
|
127
|
-
const routeFiles = readdirSync(routesDir).filter(f => !f.startsWith('chunk-') && f.endsWith('.js'));
|
|
128
|
-
const chunkFiles = readdirSync(routesDir).filter(f => f.startsWith('chunk-'));
|
|
129
|
-
|
|
130
|
-
let routeSize = 0, chunkSize = 0;
|
|
131
|
-
for (const f of routeFiles) routeSize += statSync(join(routesDir, f)).size;
|
|
132
|
-
for (const f of chunkFiles) chunkSize += statSync(join(routesDir, f)).size;
|
|
133
|
-
|
|
134
|
-
console.log(` ā
${routeFiles.length} routes (${(routeSize / 1024).toFixed(2)} KB)`);
|
|
135
|
-
console.log(` ā
${chunkFiles.length} shared chunks (${(chunkSize / 1024).toFixed(2)} KB)`);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// ============================================
|
|
140
|
-
// 3. Copy Pages (for runtime loading)
|
|
141
|
-
// ============================================
|
|
142
|
-
console.log('\nš Copying pages...');
|
|
143
|
-
const appPagesDir = join(outdir, 'pages');
|
|
144
|
-
mkdirSync(appPagesDir, { recursive: true });
|
|
145
|
-
|
|
146
|
-
for (const page of pages) {
|
|
147
|
-
copyFileSync(join(pagesDir, page.file), join(appPagesDir, page.file));
|
|
148
|
-
}
|
|
149
|
-
console.log(` ā
${pages.length} pages copied`);
|
|
150
|
-
|
|
151
|
-
// ============================================
|
|
152
|
-
// 4. Copy App Shell
|
|
153
|
-
// ============================================
|
|
154
|
-
console.log('\nš Building app shell...');
|
|
155
|
-
if (existsSync(join(appDir, 'index.html'))) {
|
|
156
|
-
copyFileSync(join(appDir, 'index.html'), join(outdir, 'index.html'));
|
|
157
|
-
console.log(' ā
index.html');
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// Copy assets
|
|
161
|
-
const assetsDir = join(appDir, 'assets');
|
|
162
|
-
const outAssetsDir = join(outdir, 'assets');
|
|
163
|
-
if (existsSync(assetsDir)) {
|
|
164
|
-
mkdirSync(outAssetsDir, { recursive: true });
|
|
165
|
-
const assets = readdirSync(assetsDir);
|
|
166
|
-
for (const asset of assets) {
|
|
167
|
-
copyFileSync(join(assetsDir, asset), join(outAssetsDir, asset));
|
|
168
|
-
}
|
|
169
|
-
console.log(` ā
${assets.length} assets`);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// ============================================
|
|
173
|
-
// 5. Generate Page Manifest
|
|
174
|
-
// ============================================
|
|
175
|
-
console.log('\nš Generating manifest...');
|
|
176
|
-
const manifest = {
|
|
177
|
-
pages: pages.map(p => ({
|
|
178
|
-
route: p.name,
|
|
179
|
-
title: p.title,
|
|
180
|
-
dependencies: p.deps
|
|
181
|
-
})),
|
|
182
|
-
generated: new Date().toISOString()
|
|
183
|
-
};
|
|
184
|
-
writeFileSync(join(outdir, 'pages.json'), JSON.stringify(manifest, null, 2));
|
|
185
|
-
console.log(' ā
pages.json');
|
|
186
|
-
|
|
187
|
-
// ============================================
|
|
188
|
-
// Summary
|
|
189
|
-
// ============================================
|
|
190
|
-
console.log('\n⨠App build complete!');
|
|
191
|
-
console.log(` Output: ${outdir}/`);
|
|
192
|
-
console.log(` Pages: ${pages.length}`);
|
|
193
|
-
console.log(` Serve: npx serve ${outdir}`);
|
|
@@ -1,444 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Framework Build - microUI Library
|
|
3
|
-
*
|
|
4
|
-
* Builds the microUI component library:
|
|
5
|
-
* - ESM bundle (microui.esm.js)
|
|
6
|
-
* - IIFE bundle (microui.min.js)
|
|
7
|
-
* - CSS (tokens, components, combined)
|
|
8
|
-
* - TypeScript types
|
|
9
|
-
* - Per-component bundles
|
|
10
|
-
*
|
|
11
|
-
* Run with: bun run build:framework
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { build } from 'bun';
|
|
15
|
-
import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, statSync, unlinkSync, rmdirSync, copyFileSync } from 'fs';
|
|
16
|
-
import { join } from 'path';
|
|
17
|
-
import { scanPageComponents, componentsToRoutes } from './build-utils.js';
|
|
18
|
-
|
|
19
|
-
const outdir = './dist';
|
|
20
|
-
|
|
21
|
-
// Ensure dist exists
|
|
22
|
-
if (!existsSync(outdir)) {
|
|
23
|
-
mkdirSync(outdir, { recursive: true });
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
console.log('šØ Building microUI Framework...\\n');
|
|
27
|
-
|
|
28
|
-
// ============================================
|
|
29
|
-
// 1. ESM Bundle
|
|
30
|
-
// ============================================
|
|
31
|
-
const esmResult = await build({
|
|
32
|
-
entrypoints: ['./src/index.js'],
|
|
33
|
-
outdir,
|
|
34
|
-
target: 'browser',
|
|
35
|
-
format: 'esm',
|
|
36
|
-
minify: true,
|
|
37
|
-
sourcemap: 'external',
|
|
38
|
-
naming: { entry: 'microui.esm.js' }
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
if (!esmResult.success) {
|
|
42
|
-
console.error('ā ESM build failed:', esmResult.logs);
|
|
43
|
-
process.exit(1);
|
|
44
|
-
}
|
|
45
|
-
console.log('ā
ESM bundle: dist/microui.esm.js');
|
|
46
|
-
|
|
47
|
-
// ============================================
|
|
48
|
-
// 2. IIFE Bundle
|
|
49
|
-
// ============================================
|
|
50
|
-
const iifeResult = await build({
|
|
51
|
-
entrypoints: ['./src/index.js'],
|
|
52
|
-
outdir,
|
|
53
|
-
target: 'browser',
|
|
54
|
-
format: 'iife',
|
|
55
|
-
minify: true,
|
|
56
|
-
sourcemap: 'external',
|
|
57
|
-
naming: { entry: 'microui.min.js' }
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
if (!iifeResult.success) {
|
|
61
|
-
console.error('ā IIFE build failed:', iifeResult.logs);
|
|
62
|
-
process.exit(1);
|
|
63
|
-
}
|
|
64
|
-
console.log('ā
IIFE bundle: dist/microui.min.js');
|
|
65
|
-
|
|
66
|
-
// ============================================
|
|
67
|
-
// 3. Chunked Builds (code splitting)
|
|
68
|
-
// ============================================
|
|
69
|
-
console.log('\\nš§© Building chunked bundles...');
|
|
70
|
-
const chunksDir = join(outdir, 'chunks');
|
|
71
|
-
mkdirSync(chunksDir, { recursive: true });
|
|
72
|
-
|
|
73
|
-
const chunkedResult = await build({
|
|
74
|
-
entrypoints: [
|
|
75
|
-
'./src/chunks/core.js',
|
|
76
|
-
'./src/chunks/forms.js',
|
|
77
|
-
'./src/chunks/layout.js',
|
|
78
|
-
'./src/chunks/display.js',
|
|
79
|
-
'./src/chunks/feedback.js',
|
|
80
|
-
'./src/chunks/advanced.js'
|
|
81
|
-
],
|
|
82
|
-
outdir: chunksDir,
|
|
83
|
-
target: 'browser',
|
|
84
|
-
format: 'esm',
|
|
85
|
-
minify: true,
|
|
86
|
-
splitting: true,
|
|
87
|
-
sourcemap: 'none'
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
if (chunkedResult.success) {
|
|
91
|
-
const files = readdirSync(chunksDir).filter(f => f.endsWith('.js')).sort();
|
|
92
|
-
let totalSize = 0;
|
|
93
|
-
for (const file of files) {
|
|
94
|
-
totalSize += statSync(join(chunksDir, file)).size;
|
|
95
|
-
}
|
|
96
|
-
console.log(` ā
${files.length} chunks (${(totalSize / 1024).toFixed(2)} KB)`);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// ============================================
|
|
100
|
-
// 4. Per-Component Bundles
|
|
101
|
-
// ============================================
|
|
102
|
-
console.log('\\nš§ Building per-component bundles...');
|
|
103
|
-
const componentsDir = join(outdir, 'components');
|
|
104
|
-
mkdirSync(componentsDir, { recursive: true });
|
|
105
|
-
|
|
106
|
-
const componentFiles = readdirSync('./src/components')
|
|
107
|
-
.filter(f => f.endsWith('.js'))
|
|
108
|
-
.map(f => `./src/components/${f}`);
|
|
109
|
-
|
|
110
|
-
const componentResult = await build({
|
|
111
|
-
entrypoints: componentFiles,
|
|
112
|
-
outdir: componentsDir,
|
|
113
|
-
target: 'browser',
|
|
114
|
-
format: 'esm',
|
|
115
|
-
minify: true,
|
|
116
|
-
splitting: true,
|
|
117
|
-
sourcemap: 'none'
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
if (componentResult.success) {
|
|
121
|
-
const nestedDir = join(componentsDir, 'src', 'components');
|
|
122
|
-
let totalSize = 0;
|
|
123
|
-
let count = 0;
|
|
124
|
-
|
|
125
|
-
if (existsSync(nestedDir)) {
|
|
126
|
-
const files = readdirSync(nestedDir).filter(f => f.startsWith('mu-') && f.endsWith('.js'));
|
|
127
|
-
count = files.length;
|
|
128
|
-
|
|
129
|
-
// Flatten and fix paths
|
|
130
|
-
for (const file of files) {
|
|
131
|
-
let content = readFileSync(join(nestedDir, file), 'utf-8');
|
|
132
|
-
content = content.replace(/from"\.\.\/\.\.\/chunk-/g, 'from"./chunk-');
|
|
133
|
-
writeFileSync(join(componentsDir, file), content);
|
|
134
|
-
totalSize += content.length;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Cleanup nested structure
|
|
138
|
-
try {
|
|
139
|
-
const allFiles = readdirSync(nestedDir);
|
|
140
|
-
for (const f of allFiles) unlinkSync(join(nestedDir, f));
|
|
141
|
-
rmdirSync(nestedDir);
|
|
142
|
-
rmdirSync(join(componentsDir, 'src'));
|
|
143
|
-
} catch (e) { }
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
const sharedChunks = readdirSync(componentsDir).filter(f => f.startsWith('chunk-'));
|
|
147
|
-
let sharedSize = 0;
|
|
148
|
-
for (const f of sharedChunks) {
|
|
149
|
-
sharedSize += statSync(join(componentsDir, f)).size;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
console.log(` ā
${count} components (${(totalSize / 1024).toFixed(2)} KB + ${(sharedSize / 1024).toFixed(2)} KB shared)`);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// ============================================
|
|
156
|
-
// 5. CSS
|
|
157
|
-
// ============================================
|
|
158
|
-
console.log('\\nšØ Building CSS...');
|
|
159
|
-
const tokensCss = readFileSync('./src/styles/tokens.css', 'utf-8');
|
|
160
|
-
const componentsCss = readFileSync('./src/styles/components.css', 'utf-8');
|
|
161
|
-
const animationsCss = existsSync('./src/styles/animations.css')
|
|
162
|
-
? readFileSync('./src/styles/animations.css', 'utf-8')
|
|
163
|
-
: '';
|
|
164
|
-
const commonCss = existsSync('./src/styles/common.css')
|
|
165
|
-
? readFileSync('./src/styles/common.css', 'utf-8')
|
|
166
|
-
: '';
|
|
167
|
-
|
|
168
|
-
// Minify CSS (basic)
|
|
169
|
-
function minifyCSS(css) {
|
|
170
|
-
return css
|
|
171
|
-
.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
172
|
-
.replace(/\s+/g, ' ')
|
|
173
|
-
.replace(/\s*([{}:;,>~+])\s*/g, '$1')
|
|
174
|
-
.replace(/;}/g, '}')
|
|
175
|
-
.trim();
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
const combinedCss = `${tokensCss}\n${componentsCss}\n${animationsCss}`;
|
|
179
|
-
writeFileSync(join(outdir, 'microui.css'), minifyCSS(combinedCss));
|
|
180
|
-
writeFileSync(join(outdir, 'tokens.css'), minifyCSS(tokensCss));
|
|
181
|
-
writeFileSync(join(outdir, 'components.css'), minifyCSS(componentsCss));
|
|
182
|
-
|
|
183
|
-
console.log(' ā
dist/microui.css (combined, minified)');
|
|
184
|
-
console.log(' ā
dist/tokens.css');
|
|
185
|
-
console.log(' ā
dist/components.css');
|
|
186
|
-
|
|
187
|
-
// 5b. Modular CSS (lazy loading support)
|
|
188
|
-
const cssComponentsDir = join(outdir, 'styles', 'components');
|
|
189
|
-
mkdirSync(cssComponentsDir, { recursive: true });
|
|
190
|
-
|
|
191
|
-
// Copy common.css
|
|
192
|
-
if (commonCss) {
|
|
193
|
-
writeFileSync(join(outdir, 'styles', 'common.css'), minifyCSS(commonCss));
|
|
194
|
-
console.log(' ā
dist/styles/common.css');
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// Copy individual component CSS files
|
|
198
|
-
const srcCssComponentsDir = './src/styles/components';
|
|
199
|
-
if (existsSync(srcCssComponentsDir)) {
|
|
200
|
-
const cssFiles = readdirSync(srcCssComponentsDir).filter(f => f.endsWith('.css'));
|
|
201
|
-
for (const file of cssFiles) {
|
|
202
|
-
const content = readFileSync(join(srcCssComponentsDir, file), 'utf-8');
|
|
203
|
-
writeFileSync(join(cssComponentsDir, file), minifyCSS(content));
|
|
204
|
-
}
|
|
205
|
-
console.log(` ā
dist/styles/components/ (${cssFiles.length} modular CSS files)`);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
// ============================================
|
|
209
|
-
// 6. TypeScript Types
|
|
210
|
-
// ============================================
|
|
211
|
-
console.log('\\nš Building TypeScript types...');
|
|
212
|
-
if (existsSync('./src/index.d.ts')) {
|
|
213
|
-
const types = readFileSync('./src/index.d.ts', 'utf-8');
|
|
214
|
-
writeFileSync(join(outdir, 'microui.d.ts'), types);
|
|
215
|
-
console.log(' ā
dist/microui.d.ts');
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// ============================================
|
|
219
|
-
// 7. Route Bundles (for index-ultra.html)
|
|
220
|
-
// ============================================
|
|
221
|
-
console.log('\\nš¤ļø Building route bundles...');
|
|
222
|
-
const routesDir = join(outdir, 'routes');
|
|
223
|
-
mkdirSync(routesDir, { recursive: true });
|
|
224
|
-
|
|
225
|
-
// Define page -> component mappings
|
|
226
|
-
// shell-critical: ONLY what's needed for first paint (layout structure)
|
|
227
|
-
// shell-deferred: Everything else (can load after FCP)
|
|
228
|
-
const pageRoutes = {
|
|
229
|
-
'shell-critical': ['mu-layout', 'mu-drawer', 'mu-drawer-item'],
|
|
230
|
-
'shell-deferred': ['mu-theme-toggle', 'mu-navbar', 'mu-toast', 'mu-icon', 'mu-stack', 'mu-bottom-nav'],
|
|
231
|
-
shell: ['mu-theme-toggle', 'mu-navbar', 'mu-toast', 'mu-icon', 'mu-stack', 'mu-layout', 'mu-drawer', 'mu-drawer-item', 'mu-bottom-nav'],
|
|
232
|
-
home: ['mu-stack', 'mu-card', 'mu-icon'],
|
|
233
|
-
installation: ['mu-stack', 'mu-card', 'mu-code'],
|
|
234
|
-
buttons: ['mu-button', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-api-table'],
|
|
235
|
-
inputs: ['mu-input', 'mu-textarea', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-api-table'],
|
|
236
|
-
checkboxes: ['mu-checkbox', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code'],
|
|
237
|
-
switches: ['mu-switch', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code'],
|
|
238
|
-
radios: ['mu-radio', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code'],
|
|
239
|
-
dropdowns: ['mu-dropdown', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code'],
|
|
240
|
-
cards: ['mu-card', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-api-table'],
|
|
241
|
-
layout: ['mu-stack', 'mu-grid', 'mu-card', 'mu-tabs', 'mu-example', 'mu-code'],
|
|
242
|
-
tabs: ['mu-tabs', 'mu-stack', 'mu-example', 'mu-code'],
|
|
243
|
-
navbar: ['mu-navbar', 'mu-tabs', 'mu-example', 'mu-code'],
|
|
244
|
-
alerts: ['mu-alert', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-icon', 'mu-card'],
|
|
245
|
-
toasts: ['mu-toast', 'mu-button', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-alert', 'mu-icon', 'mu-card'],
|
|
246
|
-
modals: ['mu-modal', 'mu-button', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-alert', 'mu-icon', 'mu-card'],
|
|
247
|
-
progress: ['mu-progress', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-api-table', 'mu-alert', 'mu-icon', 'mu-card'],
|
|
248
|
-
avatars: ['mu-avatar', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code'],
|
|
249
|
-
badges: ['mu-badge', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code'],
|
|
250
|
-
chips: ['mu-chip', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code'],
|
|
251
|
-
icons: ['mu-icon', 'mu-grid', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code'],
|
|
252
|
-
dividers: ['mu-divider', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-api-table', 'mu-card', 'mu-button', 'mu-icon'],
|
|
253
|
-
callouts: ['mu-callout', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-api-table'],
|
|
254
|
-
skeletons: ['mu-skeleton', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-api-table', 'mu-card'],
|
|
255
|
-
tooltips: ['mu-tooltip', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-api-table', 'mu-button', 'mu-icon', 'mu-card'],
|
|
256
|
-
spinners: ['mu-spinner', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-api-table', 'mu-button'],
|
|
257
|
-
confirms: ['mu-confirm', 'mu-button', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-api-table'],
|
|
258
|
-
tables: ['mu-table', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-api-table'],
|
|
259
|
-
datatables: ['mu-datatable', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-api-table'],
|
|
260
|
-
codeblocks: ['mu-code', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-api-table'],
|
|
261
|
-
'virtual-lists': ['mu-virtual-list', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-api-table', 'mu-alert', 'mu-icon', 'mu-card', 'mu-avatar'],
|
|
262
|
-
enterprise: ['mu-router', 'mu-page', 'mu-error-boundary', 'mu-fetch', 'mu-lazy', 'mu-stack', 'mu-tabs', 'mu-example', 'mu-code', 'mu-api-table']
|
|
263
|
-
};
|
|
264
|
-
|
|
265
|
-
// Generate route entry files
|
|
266
|
-
const tmpRoutesDir = './dist/.tmp-routes';
|
|
267
|
-
mkdirSync(tmpRoutesDir, { recursive: true });
|
|
268
|
-
|
|
269
|
-
for (const [route, deps] of Object.entries(pageRoutes)) {
|
|
270
|
-
const imports = deps.map(d => `import '../components/${d}.js';`).join('\n');
|
|
271
|
-
// Shell route needs core.js to register toast listener
|
|
272
|
-
const coreImport = route === 'shell' ? `import '../chunks/core.js';\n` : '';
|
|
273
|
-
writeFileSync(join(tmpRoutesDir, `${route}.js`), coreImport + imports);
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
// Build routes with splitting - INCLUDE core.js to ensure shared state (bus, theme) is deduplicated
|
|
277
|
-
const routeEntries = Object.keys(pageRoutes).map(r => join(tmpRoutesDir, `${r}.js`));
|
|
278
|
-
routeEntries.push('./src/chunks/core.js'); // Add core as entrypoint
|
|
279
|
-
|
|
280
|
-
const routeResult = await build({
|
|
281
|
-
entrypoints: routeEntries,
|
|
282
|
-
outdir: routesDir,
|
|
283
|
-
target: 'browser',
|
|
284
|
-
format: 'esm',
|
|
285
|
-
minify: true,
|
|
286
|
-
splitting: true,
|
|
287
|
-
sourcemap: 'none'
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
if (routeResult.success) {
|
|
291
|
-
// Flatten nested structure if present
|
|
292
|
-
const nestedDir = join(routesDir, 'dist', '.tmp-routes');
|
|
293
|
-
if (existsSync(nestedDir)) {
|
|
294
|
-
const files = readdirSync(nestedDir).filter(f => f.endsWith('.js'));
|
|
295
|
-
for (const file of files) {
|
|
296
|
-
let content = readFileSync(join(nestedDir, file), 'utf-8');
|
|
297
|
-
// Fix import paths
|
|
298
|
-
content = content.replace(/from"\.\.\/\.\.\/chunk-/g, 'from"./chunk-');
|
|
299
|
-
content = content.replace(/from"\.\.\/\.\.\/\.\.\/components\//g, 'from"../components/');
|
|
300
|
-
content = content.replace(/import"\.\.\/\.\.\/chunk-/g, 'import"./chunk-');
|
|
301
|
-
writeFileSync(join(routesDir, file), content);
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
// Cleanup
|
|
305
|
-
try {
|
|
306
|
-
for (const f of readdirSync(nestedDir)) unlinkSync(join(nestedDir, f));
|
|
307
|
-
rmdirSync(nestedDir);
|
|
308
|
-
rmdirSync(join(routesDir, 'dist'));
|
|
309
|
-
} catch (e) { }
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
// Cleanup tmp
|
|
313
|
-
try {
|
|
314
|
-
for (const f of readdirSync(tmpRoutesDir)) unlinkSync(join(tmpRoutesDir, f));
|
|
315
|
-
rmdirSync(tmpRoutesDir);
|
|
316
|
-
} catch (e) { }
|
|
317
|
-
|
|
318
|
-
const routeFiles = readdirSync(routesDir).filter(f => !f.startsWith('chunk-') && f.endsWith('.js'));
|
|
319
|
-
const chunkFiles = readdirSync(routesDir).filter(f => f.startsWith('chunk-'));
|
|
320
|
-
let routeSize = 0, chunkSize = 0;
|
|
321
|
-
for (const f of routeFiles) routeSize += statSync(join(routesDir, f)).size;
|
|
322
|
-
for (const f of chunkFiles) chunkSize += statSync(join(routesDir, f)).size;
|
|
323
|
-
|
|
324
|
-
console.log(` ā
${routeFiles.length} routes (${(routeSize / 1024).toFixed(2)} KB + ${(chunkSize / 1024).toFixed(2)} KB shared)`);
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
// ============================================
|
|
328
|
-
// 8. Auto-Generate Route Dependencies (from HTML analysis)
|
|
329
|
-
// ============================================
|
|
330
|
-
console.log('\\nš Generating route dependencies from HTML...');
|
|
331
|
-
// Scan content fragments from demo/content/*.html
|
|
332
|
-
|
|
333
|
-
const contentDir = './demo/content';
|
|
334
|
-
const pageComponents = {};
|
|
335
|
-
|
|
336
|
-
if (existsSync(contentDir)) {
|
|
337
|
-
const contentFiles = readdirSync(contentDir).filter(f => f.endsWith('.html'));
|
|
338
|
-
|
|
339
|
-
for (const file of contentFiles) {
|
|
340
|
-
const pageId = file.replace('.html', '');
|
|
341
|
-
const content = readFileSync(join(contentDir, file), 'utf-8');
|
|
342
|
-
|
|
343
|
-
// Extract mu-* components from this content fragment
|
|
344
|
-
const componentMatches = content.match(/<mu-[a-z-]+/g) || [];
|
|
345
|
-
const components = [...new Set(componentMatches.map(m => m.slice(1)))];
|
|
346
|
-
|
|
347
|
-
if (components.length > 0) {
|
|
348
|
-
pageComponents[pageId] = components;
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
// Convert components to route dependencies
|
|
354
|
-
const routeDeps = {};
|
|
355
|
-
for (const [pageId, components] of Object.entries(pageComponents)) {
|
|
356
|
-
const routes = componentsToRoutes(components);
|
|
357
|
-
// Filter out shell routes (always loaded) and self-reference
|
|
358
|
-
const filteredRoutes = routes.filter(r =>
|
|
359
|
-
!r.startsWith('shell') && r !== pageId
|
|
360
|
-
);
|
|
361
|
-
if (filteredRoutes.length > 0) {
|
|
362
|
-
routeDeps[pageId] = filteredRoutes;
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
// Write route-deps.json
|
|
367
|
-
writeFileSync(
|
|
368
|
-
join(routesDir, 'route-deps.json'),
|
|
369
|
-
JSON.stringify(routeDeps, null, 2)
|
|
370
|
-
);
|
|
371
|
-
|
|
372
|
-
console.log(` ā
route-deps.json (${Object.keys(routeDeps).length} pages with dependencies)`);
|
|
373
|
-
|
|
374
|
-
// Also write full component mapping for debugging
|
|
375
|
-
writeFileSync(
|
|
376
|
-
join(routesDir, 'page-components.json'),
|
|
377
|
-
JSON.stringify(pageComponents, null, 2)
|
|
378
|
-
);
|
|
379
|
-
console.log(` ā
page-components.json (${Object.keys(pageComponents).length} pages scanned)`);
|
|
380
|
-
|
|
381
|
-
// ============================================
|
|
382
|
-
// Summary
|
|
383
|
-
// ============================================
|
|
384
|
-
console.log('\\nš¦ Framework bundle sizes:');
|
|
385
|
-
const sizes = {
|
|
386
|
-
esm: statSync(join(outdir, 'microui.esm.js')).size,
|
|
387
|
-
iife: statSync(join(outdir, 'microui.min.js')).size,
|
|
388
|
-
css: statSync(join(outdir, 'microui.css')).size
|
|
389
|
-
};
|
|
390
|
-
console.log(` ESM: ${(sizes.esm / 1024).toFixed(2)} KB`);
|
|
391
|
-
console.log(` IIFE: ${(sizes.iife / 1024).toFixed(2)} KB`);
|
|
392
|
-
console.log(` CSS: ${(sizes.css / 1024).toFixed(2)} KB`);
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
// ============================================
|
|
396
|
-
// 9. Auto-Version Update (Cache Busting)
|
|
397
|
-
// ============================================
|
|
398
|
-
console.log('\nš Updating version cache buster...');
|
|
399
|
-
|
|
400
|
-
// Update version in shell.html
|
|
401
|
-
const demoFiles = ['./demo/shell.html'];
|
|
402
|
-
let newVersion;
|
|
403
|
-
|
|
404
|
-
for (const demoPath of demoFiles) {
|
|
405
|
-
if (!existsSync(demoPath)) continue;
|
|
406
|
-
|
|
407
|
-
let content = readFileSync(demoPath, 'utf-8');
|
|
408
|
-
|
|
409
|
-
// Extract current version or generate new one (do this once from first file)
|
|
410
|
-
if (!newVersion) {
|
|
411
|
-
const versionMatch = content.match(/\?v=(\d+\.\d+\.\d+)/);
|
|
412
|
-
|
|
413
|
-
if (versionMatch) {
|
|
414
|
-
// Increment patch version
|
|
415
|
-
const parts = versionMatch[1].split('.');
|
|
416
|
-
parts[2] = String(parseInt(parts[2], 10) + 1);
|
|
417
|
-
newVersion = parts.join('.');
|
|
418
|
-
} else {
|
|
419
|
-
// Fallback: use date-based version
|
|
420
|
-
const now = new Date();
|
|
421
|
-
newVersion = `${now.getFullYear() % 100}.${now.getMonth() + 1}.${now.getDate()}${now.getHours()}`;
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
// Replace all version strings
|
|
426
|
-
const oldVersionPattern = /\?v=\d+\.\d+\.\d+/g;
|
|
427
|
-
content = content.replace(oldVersionPattern, `?v=${newVersion}`);
|
|
428
|
-
writeFileSync(demoPath, content);
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
if (newVersion) {
|
|
432
|
-
console.log(` ā
Version updated to ${newVersion}`);
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
console.log('\nš Copying documentation...');
|
|
436
|
-
const docsToCopy = ['AGENTS.md', 'README.md'];
|
|
437
|
-
for (const doc of docsToCopy) {
|
|
438
|
-
if (existsSync(doc)) {
|
|
439
|
-
copyFileSync(doc, join(outdir, doc));
|
|
440
|
-
console.log(` ā
${doc}`);
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
console.log('\n⨠Framework build complete!');
|