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/tests/core/bus.test.js
DELETED
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Unit Tests for bus.js Module
|
|
3
|
-
* Target: 57% → 90% coverage
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { describe, test, expect, beforeAll, beforeEach } from 'bun:test';
|
|
7
|
-
import {
|
|
8
|
-
bus,
|
|
9
|
-
UIEvents,
|
|
10
|
-
showToast,
|
|
11
|
-
MICROUI_VERSION,
|
|
12
|
-
isDebugEnabled,
|
|
13
|
-
enableDebug,
|
|
14
|
-
disableDebug,
|
|
15
|
-
getHealth,
|
|
16
|
-
getCapabilities,
|
|
17
|
-
addInboundHook,
|
|
18
|
-
addOutboundHook,
|
|
19
|
-
registerComponent,
|
|
20
|
-
unregisterComponent,
|
|
21
|
-
getComponentCapabilities,
|
|
22
|
-
getRegisteredComponents,
|
|
23
|
-
getComponentsForSignal
|
|
24
|
-
} from '../../src/core/bus.js';
|
|
25
|
-
|
|
26
|
-
describe('bus Module Unit Tests', () => {
|
|
27
|
-
|
|
28
|
-
// BUS OBJECT
|
|
29
|
-
test('bus should exist', () => {
|
|
30
|
-
expect(bus).toBeDefined();
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
// METHODS
|
|
34
|
-
test('bus.on should be a function', () => {
|
|
35
|
-
expect(typeof bus.on).toBe('function');
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
test('bus.once should be a function', () => {
|
|
39
|
-
expect(typeof bus.once).toBe('function');
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
test('bus.off should be a function', () => {
|
|
43
|
-
expect(typeof bus.off).toBe('function');
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
test('bus.emit should be a function', () => {
|
|
47
|
-
expect(typeof bus.emit).toBe('function');
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
test('bus.emitAsync should be a function', () => {
|
|
51
|
-
expect(typeof bus.emitAsync).toBe('function');
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
test('bus.signal should be a function', () => {
|
|
55
|
-
expect(typeof bus.signal).toBe('function');
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
test('bus.request should be a function', () => {
|
|
59
|
-
expect(typeof bus.request).toBe('function');
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
test('bus.broadcastRequest should be a function', () => {
|
|
63
|
-
expect(typeof bus.broadcastRequest).toBe('function');
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
test('bus.handle should be a function', () => {
|
|
67
|
-
expect(typeof bus.handle).toBe('function');
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
test('bus.unhandle should be a function', () => {
|
|
71
|
-
expect(typeof bus.unhandle).toBe('function');
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
test('bus.destroy should be a function', () => {
|
|
75
|
-
expect(typeof bus.destroy).toBe('function');
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
test('bus.setMaxListeners should be a function', () => {
|
|
79
|
-
expect(typeof bus.setMaxListeners).toBe('function');
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
test('bus.hasListeners should be a function', () => {
|
|
83
|
-
expect(typeof bus.hasListeners).toBe('function');
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
// PROPERTIES
|
|
87
|
-
test('bus.peerId should be microui', () => {
|
|
88
|
-
expect(bus.peerId).toBe('microui');
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
test('bus.raw should return CrossBus instance', () => {
|
|
92
|
-
expect(bus.raw).toBeDefined();
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
test('bus.peers should be defined', () => {
|
|
96
|
-
expect(bus.peers).toBeDefined();
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
test('bus.peerCount should be a number', () => {
|
|
100
|
-
expect(typeof bus.peerCount).toBe('number');
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
// SUBSCRIPTION
|
|
104
|
-
test('on should return unsubscribe function', () => {
|
|
105
|
-
const unsub = bus.on('test-event', () => { });
|
|
106
|
-
expect(typeof unsub).toBe('function');
|
|
107
|
-
unsub();
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
test('emit should work', () => {
|
|
111
|
-
let received = null;
|
|
112
|
-
const unsub = bus.on('test-emit', (data) => { received = data; });
|
|
113
|
-
bus.emit('test-emit', { value: 42 });
|
|
114
|
-
unsub();
|
|
115
|
-
expect(received).toEqual({ value: 42 });
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
test('once should only trigger once', () => {
|
|
119
|
-
let count = 0;
|
|
120
|
-
bus.once('test-once', () => { count++; });
|
|
121
|
-
bus.emit('test-once', {});
|
|
122
|
-
bus.emit('test-once', {});
|
|
123
|
-
expect(count).toBe(1);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
test('hasListeners should return boolean', () => {
|
|
127
|
-
const unsub = bus.on('test-has-listeners', () => { });
|
|
128
|
-
expect(bus.hasListeners('test-has-listeners')).toBe(true);
|
|
129
|
-
unsub();
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
test('off should work', () => {
|
|
133
|
-
const callback = () => { };
|
|
134
|
-
bus.on('test-off', callback);
|
|
135
|
-
bus.off('test-off', callback);
|
|
136
|
-
expect(true).toBe(true);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
test('signal should work', () => {
|
|
140
|
-
bus.signal('test-signal', { data: 'test' });
|
|
141
|
-
expect(true).toBe(true);
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
test('handle should register handler', () => {
|
|
145
|
-
const handler = bus.handle('test-handler', () => ({ result: 'ok' }));
|
|
146
|
-
expect(handler).toBeDefined();
|
|
147
|
-
bus.unhandle('test-handler');
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
test('unhandle should work', () => {
|
|
151
|
-
bus.handle('test-unhandle', () => { });
|
|
152
|
-
bus.unhandle('test-unhandle');
|
|
153
|
-
expect(true).toBe(true);
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
test('setMaxListeners should work', () => {
|
|
157
|
-
bus.setMaxListeners(200);
|
|
158
|
-
expect(true).toBe(true);
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
// UI EVENTS
|
|
162
|
-
test('UIEvents should have TOAST_SHOW', () => {
|
|
163
|
-
expect(UIEvents.TOAST_SHOW).toBe('ui:toast:show');
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
test('UIEvents should have TOAST_DISMISS', () => {
|
|
167
|
-
expect(UIEvents.TOAST_DISMISS).toBe('ui:toast:dismiss');
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
test('UIEvents should have MODAL_OPEN', () => {
|
|
171
|
-
expect(UIEvents.MODAL_OPEN).toBe('ui:modal:open');
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
test('UIEvents should have MODAL_CLOSE', () => {
|
|
175
|
-
expect(UIEvents.MODAL_CLOSE).toBe('ui:modal:close');
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
test('UIEvents should have THEME_CHANGE', () => {
|
|
179
|
-
expect(UIEvents.THEME_CHANGE).toBe('ui:theme:change');
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
test('UIEvents should have TAB_CHANGE', () => {
|
|
183
|
-
expect(UIEvents.TAB_CHANGE).toBe('ui:tab:change');
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
test('UIEvents should have DROPDOWN_SELECT', () => {
|
|
187
|
-
expect(UIEvents.DROPDOWN_SELECT).toBe('ui:dropdown:select');
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
test('UIEvents should have FORM_SUBMIT', () => {
|
|
191
|
-
expect(UIEvents.FORM_SUBMIT).toBe('ui:form:submit');
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
test('UIEvents should have FORM_VALIDATE', () => {
|
|
195
|
-
expect(UIEvents.FORM_VALIDATE).toBe('ui:form:validate');
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
// SHOW TOAST HELPER
|
|
199
|
-
test('showToast should be a function', () => {
|
|
200
|
-
expect(typeof showToast).toBe('function');
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
test('showToast should emit toast event', () => {
|
|
204
|
-
let toastData = null;
|
|
205
|
-
const unsub = bus.on(UIEvents.TOAST_SHOW, (data) => { toastData = data; });
|
|
206
|
-
showToast('Hello World', { type: 'success' });
|
|
207
|
-
unsub();
|
|
208
|
-
expect(toastData.message).toBe('Hello World');
|
|
209
|
-
expect(toastData.type).toBe('success');
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
// ========================================================================
|
|
213
|
-
// AI AGENT FEATURES (CrossBus)
|
|
214
|
-
// ========================================================================
|
|
215
|
-
|
|
216
|
-
test('MICROUI_VERSION should be defined', () => {
|
|
217
|
-
expect(MICROUI_VERSION).toBeDefined();
|
|
218
|
-
expect(typeof MICROUI_VERSION).toBe('string');
|
|
219
|
-
expect(MICROUI_VERSION).toMatch(/^\d+\.\d+\.\d+$/);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
test('enableDebug should be a function', () => {
|
|
223
|
-
expect(typeof enableDebug).toBe('function');
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
test('disableDebug should be a function', () => {
|
|
227
|
-
expect(typeof disableDebug).toBe('function');
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
test('isDebugEnabled should be a function', () => {
|
|
231
|
-
expect(typeof isDebugEnabled).toBe('function');
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
test('isDebugEnabled should return boolean', () => {
|
|
235
|
-
const result = isDebugEnabled();
|
|
236
|
-
expect(typeof result).toBe('boolean');
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
test('enableDebug should return boolean (deprecated)', () => {
|
|
240
|
-
// enableDebug now returns the current state and logs a warning
|
|
241
|
-
const result = enableDebug();
|
|
242
|
-
expect(typeof result).toBe('boolean');
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
test('getHealth should be a function', () => {
|
|
246
|
-
expect(typeof getHealth).toBe('function');
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
test('getHealth should return health object', () => {
|
|
250
|
-
const health = getHealth();
|
|
251
|
-
expect(health).toBeDefined();
|
|
252
|
-
expect(typeof health).toBe('object');
|
|
253
|
-
// Should have at least peerId
|
|
254
|
-
expect(health.peerId || health.note).toBeDefined();
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
test('getCapabilities should be a function', () => {
|
|
258
|
-
expect(typeof getCapabilities).toBe('function');
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
test('getCapabilities should return capabilities object', () => {
|
|
262
|
-
const caps = getCapabilities();
|
|
263
|
-
expect(caps.peerId).toBe('microui');
|
|
264
|
-
expect(Array.isArray(caps.capabilities)).toBe(true);
|
|
265
|
-
expect(caps.capabilities.length).toBeGreaterThan(0);
|
|
266
|
-
expect(caps.capabilities).toContain('ui:toast');
|
|
267
|
-
expect(caps.meta).toBeDefined();
|
|
268
|
-
expect(caps.meta.type).toBe('ui-framework');
|
|
269
|
-
expect(caps.version).toBe(MICROUI_VERSION);
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
test('addInboundHook should be a function', () => {
|
|
273
|
-
expect(typeof addInboundHook).toBe('function');
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
test('addOutboundHook should be a function', () => {
|
|
277
|
-
expect(typeof addOutboundHook).toBe('function');
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
test('addInboundHook should return unsubscribe function', () => {
|
|
281
|
-
const removeHook = addInboundHook((payload) => payload);
|
|
282
|
-
expect(typeof removeHook).toBe('function');
|
|
283
|
-
removeHook();
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
test('addOutboundHook should return unsubscribe function', () => {
|
|
287
|
-
const removeHook = addOutboundHook((payload) => payload);
|
|
288
|
-
expect(typeof removeHook).toBe('function');
|
|
289
|
-
removeHook();
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
// ========================================================================
|
|
293
|
-
// COMPONENT CAPABILITY REGISTRATION (Phase 2)
|
|
294
|
-
// ========================================================================
|
|
295
|
-
|
|
296
|
-
test('registerComponent should be a function', () => {
|
|
297
|
-
expect(typeof registerComponent).toBe('function');
|
|
298
|
-
});
|
|
299
|
-
|
|
300
|
-
test('unregisterComponent should be a function', () => {
|
|
301
|
-
expect(typeof unregisterComponent).toBe('function');
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
test('getComponentCapabilities should be a function', () => {
|
|
305
|
-
expect(typeof getComponentCapabilities).toBe('function');
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
test('getRegisteredComponents should be a function', () => {
|
|
309
|
-
expect(typeof getRegisteredComponents).toBe('function');
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
test('getComponentsForSignal should be a function', () => {
|
|
313
|
-
expect(typeof getComponentsForSignal).toBe('function');
|
|
314
|
-
});
|
|
315
|
-
|
|
316
|
-
test('registerComponent should register a component', () => {
|
|
317
|
-
registerComponent('mu-test-component', {
|
|
318
|
-
signals: ['ui:test:signal'],
|
|
319
|
-
options: { foo: 'bar' }
|
|
320
|
-
});
|
|
321
|
-
const caps = getComponentCapabilities('mu-test-component');
|
|
322
|
-
expect(caps).not.toBeNull();
|
|
323
|
-
expect(caps.signals).toContain('ui:test:signal');
|
|
324
|
-
expect(caps.options.foo).toBe('bar');
|
|
325
|
-
expect(caps.registeredAt).toBeDefined();
|
|
326
|
-
unregisterComponent('mu-test-component');
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
test('unregisterComponent should remove a component', () => {
|
|
330
|
-
registerComponent('mu-temp-component', { signals: [] });
|
|
331
|
-
unregisterComponent('mu-temp-component');
|
|
332
|
-
expect(getComponentCapabilities('mu-temp-component')).toBeNull();
|
|
333
|
-
});
|
|
334
|
-
|
|
335
|
-
test('getRegisteredComponents should return all registered components', () => {
|
|
336
|
-
registerComponent('mu-comp-a', { signals: ['sig:a'] });
|
|
337
|
-
registerComponent('mu-comp-b', { signals: ['sig:b'] });
|
|
338
|
-
const all = getRegisteredComponents();
|
|
339
|
-
expect(all['mu-comp-a']).toBeDefined();
|
|
340
|
-
expect(all['mu-comp-b']).toBeDefined();
|
|
341
|
-
unregisterComponent('mu-comp-a');
|
|
342
|
-
unregisterComponent('mu-comp-b');
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
test('getComponentsForSignal should find handlers', () => {
|
|
346
|
-
registerComponent('mu-handler-1', { signals: ['ui:shared:signal'] });
|
|
347
|
-
registerComponent('mu-handler-2', { signals: ['ui:shared:signal', 'ui:other'] });
|
|
348
|
-
registerComponent('mu-unrelated', { signals: ['ui:different'] });
|
|
349
|
-
|
|
350
|
-
const handlers = getComponentsForSignal('ui:shared:signal');
|
|
351
|
-
expect(handlers).toContain('mu-handler-1');
|
|
352
|
-
expect(handlers).toContain('mu-handler-2');
|
|
353
|
-
expect(handlers).not.toContain('mu-unrelated');
|
|
354
|
-
|
|
355
|
-
unregisterComponent('mu-handler-1');
|
|
356
|
-
unregisterComponent('mu-handler-2');
|
|
357
|
-
unregisterComponent('mu-unrelated');
|
|
358
|
-
});
|
|
359
|
-
|
|
360
|
-
test('getComponentCapabilities should return null for unknown component', () => {
|
|
361
|
-
expect(getComponentCapabilities('mu-nonexistent')).toBeNull();
|
|
362
|
-
});
|
|
363
|
-
});
|
|
364
|
-
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Tests for Component Schema API (2026 Features)
|
|
3
|
-
* Tests getComponentSchema, getAllSchemas, getSchemaComponents, getSchemaQuickRef
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { describe, test, expect } from 'bun:test';
|
|
7
|
-
|
|
8
|
-
describe('Component Schema API', () => {
|
|
9
|
-
describe('getComponentSchema', () => {
|
|
10
|
-
test('should export getComponentSchema function', async () => {
|
|
11
|
-
const module = await import('../../src/core/component-schema.js');
|
|
12
|
-
expect(typeof module.getComponentSchema).toBe('function');
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
test('should return schema for mu-button', async () => {
|
|
16
|
-
const { getComponentSchema } = await import('../../src/core/component-schema.js');
|
|
17
|
-
const schema = getComponentSchema('mu-button');
|
|
18
|
-
|
|
19
|
-
expect(schema).not.toBeNull();
|
|
20
|
-
expect(schema.title).toBe('mu-button');
|
|
21
|
-
expect(schema.type).toBe('object');
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
test('should include properties with types', async () => {
|
|
25
|
-
const { getComponentSchema } = await import('../../src/core/component-schema.js');
|
|
26
|
-
const schema = getComponentSchema('mu-button');
|
|
27
|
-
|
|
28
|
-
expect(schema.properties).toBeDefined();
|
|
29
|
-
expect(schema.properties.variant).toBeDefined();
|
|
30
|
-
expect(schema.properties.variant.type).toBe('string');
|
|
31
|
-
expect(Array.isArray(schema.properties.variant.enum)).toBe(true);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
test('should include actions array', async () => {
|
|
35
|
-
const { getComponentSchema } = await import('../../src/core/component-schema.js');
|
|
36
|
-
const schema = getComponentSchema('mu-button');
|
|
37
|
-
|
|
38
|
-
expect(Array.isArray(schema.actions)).toBe(true);
|
|
39
|
-
expect(schema.actions).toContain('click');
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
test('should return null for unknown component', async () => {
|
|
43
|
-
const { getComponentSchema } = await import('../../src/core/component-schema.js');
|
|
44
|
-
const schema = getComponentSchema('mu-nonexistent');
|
|
45
|
-
|
|
46
|
-
expect(schema).toBeNull();
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
describe('getAllSchemas', () => {
|
|
51
|
-
test('should export getAllSchemas function', async () => {
|
|
52
|
-
const module = await import('../../src/core/component-schema.js');
|
|
53
|
-
expect(typeof module.getAllSchemas).toBe('function');
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
test('should return a Map', async () => {
|
|
57
|
-
const { getAllSchemas } = await import('../../src/core/component-schema.js');
|
|
58
|
-
const schemas = getAllSchemas();
|
|
59
|
-
|
|
60
|
-
expect(schemas instanceof Map).toBe(true);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
test('should contain multiple components', async () => {
|
|
64
|
-
const { getAllSchemas } = await import('../../src/core/component-schema.js');
|
|
65
|
-
const schemas = getAllSchemas();
|
|
66
|
-
|
|
67
|
-
expect(schemas.size).toBeGreaterThan(5);
|
|
68
|
-
expect(schemas.has('mu-button')).toBe(true);
|
|
69
|
-
expect(schemas.has('mu-input')).toBe(true);
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
describe('getSchemaComponents', () => {
|
|
74
|
-
test('should export getSchemaComponents function', async () => {
|
|
75
|
-
const module = await import('../../src/core/component-schema.js');
|
|
76
|
-
expect(typeof module.getSchemaComponents).toBe('function');
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
test('should return array of tag names', async () => {
|
|
80
|
-
const { getSchemaComponents } = await import('../../src/core/component-schema.js');
|
|
81
|
-
const components = getSchemaComponents();
|
|
82
|
-
|
|
83
|
-
expect(Array.isArray(components)).toBe(true);
|
|
84
|
-
expect(components).toContain('mu-button');
|
|
85
|
-
expect(components).toContain('mu-input');
|
|
86
|
-
expect(components).toContain('mu-checkbox');
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
describe('getSchemaQuickRef', () => {
|
|
91
|
-
test('should export getSchemaQuickRef function', async () => {
|
|
92
|
-
const module = await import('../../src/core/component-schema.js');
|
|
93
|
-
expect(typeof module.getSchemaQuickRef).toBe('function');
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
test('should return minimal summary', async () => {
|
|
97
|
-
const { getSchemaQuickRef } = await import('../../src/core/component-schema.js');
|
|
98
|
-
const ref = getSchemaQuickRef('mu-button');
|
|
99
|
-
|
|
100
|
-
expect(ref).not.toBeNull();
|
|
101
|
-
expect(ref.tag).toBe('mu-button');
|
|
102
|
-
expect(ref.description).toBeDefined();
|
|
103
|
-
expect(Array.isArray(ref.properties)).toBe(true);
|
|
104
|
-
expect(Array.isArray(ref.actions)).toBe(true);
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
test('should return null for unknown component', async () => {
|
|
108
|
-
const { getSchemaQuickRef } = await import('../../src/core/component-schema.js');
|
|
109
|
-
const ref = getSchemaQuickRef('mu-fake');
|
|
110
|
-
|
|
111
|
-
expect(ref).toBeNull();
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
describe('getSchemas (batch)', () => {
|
|
116
|
-
test('should export getSchemas function', async () => {
|
|
117
|
-
const module = await import('../../src/core/component-schema.js');
|
|
118
|
-
expect(typeof module.getSchemas).toBe('function');
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
test('should return multiple schemas at once', async () => {
|
|
122
|
-
const { getSchemas } = await import('../../src/core/component-schema.js');
|
|
123
|
-
const schemas = getSchemas(['mu-button', 'mu-input', 'mu-checkbox']);
|
|
124
|
-
|
|
125
|
-
expect(Object.keys(schemas).length).toBe(3);
|
|
126
|
-
expect(schemas['mu-button']).toBeDefined();
|
|
127
|
-
expect(schemas['mu-input']).toBeDefined();
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
describe('exportSchemasAsJSON', () => {
|
|
132
|
-
test('should export exportSchemasAsJSON function', async () => {
|
|
133
|
-
const module = await import('../../src/core/component-schema.js');
|
|
134
|
-
expect(typeof module.exportSchemasAsJSON).toBe('function');
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
test('should return valid JSON string', async () => {
|
|
138
|
-
const { exportSchemasAsJSON } = await import('../../src/core/component-schema.js');
|
|
139
|
-
const json = exportSchemasAsJSON();
|
|
140
|
-
|
|
141
|
-
expect(typeof json).toBe('string');
|
|
142
|
-
expect(() => JSON.parse(json)).not.toThrow();
|
|
143
|
-
|
|
144
|
-
const parsed = JSON.parse(json);
|
|
145
|
-
expect(parsed['mu-button']).toBeDefined();
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
describe('ComponentSchema namespace', () => {
|
|
150
|
-
test('should export ComponentSchema object with all methods', async () => {
|
|
151
|
-
const { ComponentSchema } = await import('../../src/core/component-schema.js');
|
|
152
|
-
|
|
153
|
-
expect(typeof ComponentSchema.getComponentSchema).toBe('function');
|
|
154
|
-
expect(typeof ComponentSchema.getAllSchemas).toBe('function');
|
|
155
|
-
expect(typeof ComponentSchema.getSchemaComponents).toBe('function');
|
|
156
|
-
expect(typeof ComponentSchema.getSchemaQuickRef).toBe('function');
|
|
157
|
-
expect(typeof ComponentSchema.exportSchemasAsJSON).toBe('function');
|
|
158
|
-
});
|
|
159
|
-
});
|
|
160
|
-
});
|