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.
Files changed (339) hide show
  1. package/AGENTS.md +71 -71
  2. package/CHANGELOG.md +1 -1
  3. package/README.md +14 -9
  4. package/dist/AGENTS.md +71 -71
  5. package/dist/README.md +14 -9
  6. package/dist/microui.css +1 -1
  7. package/dist/microui.esm.js.map +1 -1
  8. package/dist/microui.min.js.map +1 -1
  9. package/docs/getting-started.md +3 -3
  10. package/package.json +39 -11
  11. package/src/components/mu-schema-form.js +1 -1
  12. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -40
  13. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -33
  14. package/.github/PULL_REQUEST_TEMPLATE.md +0 -28
  15. package/.github/workflows/ci.yml +0 -42
  16. package/.github/workflows/deploy-pages.yml +0 -112
  17. package/CODE_OF_CONDUCT.md +0 -59
  18. package/CONTRIBUTING.md +0 -156
  19. package/SECURITY.md +0 -58
  20. package/app/.generated/routes/alerts.js +0 -8
  21. package/app/.generated/routes/avatars.js +0 -8
  22. package/app/.generated/routes/badges.js +0 -8
  23. package/app/.generated/routes/buttons.js +0 -10
  24. package/app/.generated/routes/cards.js +0 -10
  25. package/app/.generated/routes/checkboxes.js +0 -9
  26. package/app/.generated/routes/chips.js +0 -8
  27. package/app/.generated/routes/dropdowns.js +0 -9
  28. package/app/.generated/routes/home.js +0 -7
  29. package/app/.generated/routes/icons.js +0 -9
  30. package/app/.generated/routes/inputs.js +0 -10
  31. package/app/.generated/routes/installation.js +0 -7
  32. package/app/.generated/routes/layout.js +0 -9
  33. package/app/.generated/routes/modals.js +0 -9
  34. package/app/.generated/routes/navbar.js +0 -7
  35. package/app/.generated/routes/progress.js +0 -9
  36. package/app/.generated/routes/radios.js +0 -9
  37. package/app/.generated/routes/switches.js +0 -9
  38. package/app/.generated/routes/tabs.js +0 -8
  39. package/app/.generated/routes/toasts.js +0 -9
  40. package/app/index.html +0 -67
  41. package/app/pages/alerts.html +0 -23
  42. package/app/pages/avatars.html +0 -22
  43. package/app/pages/badges.html +0 -22
  44. package/app/pages/buttons.html +0 -71
  45. package/app/pages/cards.html +0 -54
  46. package/app/pages/checkboxes.html +0 -39
  47. package/app/pages/chips.html +0 -23
  48. package/app/pages/dropdowns.html +0 -41
  49. package/app/pages/home.html +0 -59
  50. package/app/pages/icons.html +0 -29
  51. package/app/pages/inputs.html +0 -66
  52. package/app/pages/installation.html +0 -34
  53. package/app/pages/layout.html +0 -30
  54. package/app/pages/modals.html +0 -21
  55. package/app/pages/navbar.html +0 -22
  56. package/app/pages/progress.html +0 -35
  57. package/app/pages/radios.html +0 -40
  58. package/app/pages/switches.html +0 -39
  59. package/app/pages/tabs.html +0 -30
  60. package/app/pages/toasts.html +0 -22
  61. package/app-dist/index.html +0 -67
  62. package/app-dist/pages/alerts.html +0 -23
  63. package/app-dist/pages/avatars.html +0 -22
  64. package/app-dist/pages/badges.html +0 -22
  65. package/app-dist/pages/buttons.html +0 -71
  66. package/app-dist/pages/cards.html +0 -54
  67. package/app-dist/pages/checkboxes.html +0 -39
  68. package/app-dist/pages/chips.html +0 -23
  69. package/app-dist/pages/dropdowns.html +0 -41
  70. package/app-dist/pages/home.html +0 -59
  71. package/app-dist/pages/icons.html +0 -29
  72. package/app-dist/pages/inputs.html +0 -66
  73. package/app-dist/pages/installation.html +0 -34
  74. package/app-dist/pages/layout.html +0 -30
  75. package/app-dist/pages/modals.html +0 -21
  76. package/app-dist/pages/navbar.html +0 -22
  77. package/app-dist/pages/progress.html +0 -35
  78. package/app-dist/pages/radios.html +0 -40
  79. package/app-dist/pages/switches.html +0 -39
  80. package/app-dist/pages/tabs.html +0 -30
  81. package/app-dist/pages/toasts.html +0 -22
  82. package/app-dist/pages.json +0 -217
  83. package/app-dist/routes/alerts.js +0 -5
  84. package/app-dist/routes/avatars.js +0 -1
  85. package/app-dist/routes/badges.js +0 -1
  86. package/app-dist/routes/buttons.js +0 -1
  87. package/app-dist/routes/cards.js +0 -1
  88. package/app-dist/routes/checkboxes.js +0 -9
  89. package/app-dist/routes/chips.js +0 -4
  90. package/app-dist/routes/chunk-019e5e2f.js +0 -5
  91. package/app-dist/routes/chunk-0m4j19yd.js +0 -2
  92. package/app-dist/routes/chunk-0tmmp5q0.js +0 -1
  93. package/app-dist/routes/chunk-10xn709r.js +0 -1
  94. package/app-dist/routes/chunk-15m2qcda.js +0 -2
  95. package/app-dist/routes/chunk-1bh8g23n.js +0 -1
  96. package/app-dist/routes/chunk-1vg0v937.js +0 -1
  97. package/app-dist/routes/chunk-1zvcgy3j.js +0 -1
  98. package/app-dist/routes/chunk-2afb0861.js +0 -1
  99. package/app-dist/routes/chunk-2c6ttpzt.js +0 -5
  100. package/app-dist/routes/chunk-3dy30fhs.js +0 -1
  101. package/app-dist/routes/chunk-426dnces.js +0 -13
  102. package/app-dist/routes/chunk-44kgxery.js +0 -1
  103. package/app-dist/routes/chunk-47fdnejd.js +0 -33
  104. package/app-dist/routes/chunk-49a6t2vq.js +0 -1
  105. package/app-dist/routes/chunk-4fe1rm5b.js +0 -1
  106. package/app-dist/routes/chunk-4ggmvkta.js +0 -33
  107. package/app-dist/routes/chunk-4vkz81q7.js +0 -33
  108. package/app-dist/routes/chunk-4w4tmj8f.js +0 -31
  109. package/app-dist/routes/chunk-532s62kr.js +0 -31
  110. package/app-dist/routes/chunk-5hm3bssy.js +0 -33
  111. package/app-dist/routes/chunk-5vrh24hc.js +0 -1
  112. package/app-dist/routes/chunk-61pcg25a.js +0 -1
  113. package/app-dist/routes/chunk-6nfhygvf.js +0 -1
  114. package/app-dist/routes/chunk-700e7je6.js +0 -33
  115. package/app-dist/routes/chunk-7fsn17kg.js +0 -1
  116. package/app-dist/routes/chunk-7k789b32.js +0 -1
  117. package/app-dist/routes/chunk-7r46q0ys.js +0 -36
  118. package/app-dist/routes/chunk-86fmc1fr.js +0 -5
  119. package/app-dist/routes/chunk-8qth37vw.js +0 -1
  120. package/app-dist/routes/chunk-924wv8n0.js +0 -1
  121. package/app-dist/routes/chunk-9mbhgxk9.js +0 -1
  122. package/app-dist/routes/chunk-a216hyd9.js +0 -1
  123. package/app-dist/routes/chunk-akzxykh9.js +0 -33
  124. package/app-dist/routes/chunk-b3dcvy8c.js +0 -1
  125. package/app-dist/routes/chunk-b74zahz5.js +0 -31
  126. package/app-dist/routes/chunk-bftj53p2.js +0 -5
  127. package/app-dist/routes/chunk-c01hnz3e.js +0 -1
  128. package/app-dist/routes/chunk-d8pvv5km.js +0 -1
  129. package/app-dist/routes/chunk-dev0aezr.js +0 -2
  130. package/app-dist/routes/chunk-dh6vnv0e.js +0 -1
  131. package/app-dist/routes/chunk-dn2cbpva.js +0 -36
  132. package/app-dist/routes/chunk-dvn0my90.js +0 -1
  133. package/app-dist/routes/chunk-dvq8mnve.js +0 -36
  134. package/app-dist/routes/chunk-e8c2gc4d.js +0 -5
  135. package/app-dist/routes/chunk-ejf9ak2x.js +0 -1
  136. package/app-dist/routes/chunk-f083m55s.js +0 -1
  137. package/app-dist/routes/chunk-fnrj28s1.js +0 -31
  138. package/app-dist/routes/chunk-fvg3yjdp.js +0 -31
  139. package/app-dist/routes/chunk-g7k381n1.js +0 -1
  140. package/app-dist/routes/chunk-h01kq2ae.js +0 -13
  141. package/app-dist/routes/chunk-h4dk761v.js +0 -5
  142. package/app-dist/routes/chunk-hmx91z2x.js +0 -5
  143. package/app-dist/routes/chunk-hxbg4m42.js +0 -36
  144. package/app-dist/routes/chunk-jbjnfp2b.js +0 -2
  145. package/app-dist/routes/chunk-jxtz5vv6.js +0 -36
  146. package/app-dist/routes/chunk-jxzcs0ey.js +0 -36
  147. package/app-dist/routes/chunk-kt7wwhcx.js +0 -1
  148. package/app-dist/routes/chunk-kzptszyc.js +0 -33
  149. package/app-dist/routes/chunk-mhgca4w4.js +0 -2
  150. package/app-dist/routes/chunk-mhswxa20.js +0 -1
  151. package/app-dist/routes/chunk-n8zfeex6.js +0 -1
  152. package/app-dist/routes/chunk-pee47b2r.js +0 -1
  153. package/app-dist/routes/chunk-pesmw829.js +0 -1
  154. package/app-dist/routes/chunk-pgc4c6f3.js +0 -36
  155. package/app-dist/routes/chunk-q8egegm1.js +0 -1
  156. package/app-dist/routes/chunk-q9mn2qyq.js +0 -36
  157. package/app-dist/routes/chunk-qh0rtaf3.js +0 -5
  158. package/app-dist/routes/chunk-qqhmk6ye.js +0 -2
  159. package/app-dist/routes/chunk-qrxygmf7.js +0 -33
  160. package/app-dist/routes/chunk-r46yzksx.js +0 -36
  161. package/app-dist/routes/chunk-rgpbw2w0.js +0 -5
  162. package/app-dist/routes/chunk-rnpzv3d8.js +0 -2
  163. package/app-dist/routes/chunk-s5v8cv05.js +0 -2
  164. package/app-dist/routes/chunk-sbwn5bpc.js +0 -1
  165. package/app-dist/routes/chunk-sqbg8jbt.js +0 -33
  166. package/app-dist/routes/chunk-sv8dqnf7.js +0 -1
  167. package/app-dist/routes/chunk-t67sw3za.js +0 -1
  168. package/app-dist/routes/chunk-tjdpqwdf.js +0 -31
  169. package/app-dist/routes/chunk-tq2mfghg.js +0 -1
  170. package/app-dist/routes/chunk-ttn10vt6.js +0 -1
  171. package/app-dist/routes/chunk-v2hzpjxr.js +0 -1
  172. package/app-dist/routes/chunk-wfjjkw9y.js +0 -1
  173. package/app-dist/routes/chunk-wt8cxzmf.js +0 -31
  174. package/app-dist/routes/chunk-x45d372k.js +0 -5
  175. package/app-dist/routes/chunk-y3wsazkt.js +0 -1
  176. package/app-dist/routes/chunk-y7pmgc7t.js +0 -33
  177. package/app-dist/routes/chunk-zefdt2q3.js +0 -31
  178. package/app-dist/routes/dropdowns.js +0 -6
  179. package/app-dist/routes/home.js +0 -1
  180. package/app-dist/routes/icons.js +0 -1
  181. package/app-dist/routes/inputs.js +0 -12
  182. package/app-dist/routes/installation.js +0 -1
  183. package/app-dist/routes/layout.js +0 -1
  184. package/app-dist/routes/modals.js +0 -7
  185. package/app-dist/routes/navbar.js +0 -1
  186. package/app-dist/routes/progress.js +0 -1
  187. package/app-dist/routes/radios.js +0 -6
  188. package/app-dist/routes/switches.js +0 -6
  189. package/app-dist/routes/tabs.js +0 -1
  190. package/app-dist/routes/toasts.js +0 -16
  191. package/assets/fonts/material-symbols-mini.woff2 +0 -0
  192. package/assets/fonts/material-symbols.woff2 +0 -0
  193. package/assets/fonts/roboto-400.woff2 +0 -0
  194. package/assets/fonts/roboto-500.woff2 +0 -0
  195. package/assets/fonts/roboto-700.woff2 +0 -0
  196. package/assets/logo-banner-400.jpg +0 -0
  197. package/assets/logo-banner-400.webp +0 -0
  198. package/assets/logo-banner-800.webp +0 -0
  199. package/assets/logo-banner.jpg +0 -0
  200. package/assets/logo-icon-64.jpg +0 -0
  201. package/assets/logo-icon-64.webp +0 -0
  202. package/assets/logo-icon.jpg +0 -0
  203. package/assets/logo-square.jpg +0 -0
  204. package/bun.lock +0 -312
  205. package/bunfig.toml +0 -4
  206. package/custom-elements.json +0 -1916
  207. package/demo/api/sample-data.json +0 -38
  208. package/demo/content/alerts.html +0 -115
  209. package/demo/content/avatars.html +0 -70
  210. package/demo/content/badges.html +0 -65
  211. package/demo/content/buttons.html +0 -188
  212. package/demo/content/callouts.html +0 -91
  213. package/demo/content/cards.html +0 -121
  214. package/demo/content/checkboxes.html +0 -178
  215. package/demo/content/chips.html +0 -67
  216. package/demo/content/codeblocks.html +0 -101
  217. package/demo/content/confirms.html +0 -115
  218. package/demo/content/datatables.html +0 -149
  219. package/demo/content/dividers.html +0 -119
  220. package/demo/content/dropdowns.html +0 -89
  221. package/demo/content/enterprise.html +0 -252
  222. package/demo/content/home.html +0 -149
  223. package/demo/content/icons.html +0 -89
  224. package/demo/content/inputs.html +0 -135
  225. package/demo/content/installation.html +0 -16
  226. package/demo/content/layout.html +0 -136
  227. package/demo/content/modals.html +0 -141
  228. package/demo/content/navbar.html +0 -70
  229. package/demo/content/progress.html +0 -119
  230. package/demo/content/radios.html +0 -88
  231. package/demo/content/skeletons.html +0 -109
  232. package/demo/content/spinners.html +0 -96
  233. package/demo/content/switches.html +0 -84
  234. package/demo/content/tables.html +0 -124
  235. package/demo/content/tabs.html +0 -85
  236. package/demo/content/toasts.html +0 -116
  237. package/demo/content/tooltips.html +0 -107
  238. package/demo/content/virtual-lists.html +0 -233
  239. package/demo/favicon.ico +0 -0
  240. package/demo/favicon.png +0 -0
  241. package/demo/full.html +0 -52
  242. package/demo/iife.html +0 -46
  243. package/demo/manifest.json +0 -34
  244. package/demo/pages/datatable-demo.html +0 -237
  245. package/demo/pages/prompt-ui-demo.html +0 -218
  246. package/demo/pages/responsive-demo.html +0 -122
  247. package/demo/pages/schema-form-demo.html +0 -270
  248. package/demo/robots.txt +0 -6
  249. package/demo/shell.html +0 -712
  250. package/demo/sw.js +0 -387
  251. package/lighthouse-audit.mjs +0 -113
  252. package/scripts/analyze-components.js +0 -105
  253. package/scripts/build-app.js +0 -193
  254. package/scripts/build-framework.js +0 -444
  255. package/scripts/build-utils.js +0 -101
  256. package/scripts/test-isolated.js +0 -151
  257. package/server.js +0 -256
  258. package/tests/agents/agent-integration.test.js +0 -76
  259. package/tests/benchmark.html +0 -296
  260. package/tests/build/scan-components.test.js +0 -173
  261. package/tests/components/all-components.test.js +0 -245
  262. package/tests/components/all-missing-components.test.js +0 -574
  263. package/tests/components/mu-alert.test.js +0 -113
  264. package/tests/components/mu-avatar.test.js +0 -148
  265. package/tests/components/mu-badge.test.js +0 -92
  266. package/tests/components/mu-button.test.js +0 -112
  267. package/tests/components/mu-card.test.js +0 -89
  268. package/tests/components/mu-checkbox.test.js +0 -158
  269. package/tests/components/mu-chip.test.js +0 -118
  270. package/tests/components/mu-container.test.js +0 -120
  271. package/tests/components/mu-divider.test.js +0 -98
  272. package/tests/components/mu-drawer-item.test.js +0 -199
  273. package/tests/components/mu-drawer.test.js +0 -96
  274. package/tests/components/mu-dropdown.test.js +0 -125
  275. package/tests/components/mu-form.test.js +0 -138
  276. package/tests/components/mu-grid.test.js +0 -135
  277. package/tests/components/mu-icon.test.js +0 -110
  278. package/tests/components/mu-input.test.js +0 -131
  279. package/tests/components/mu-lazy.test.js +0 -103
  280. package/tests/components/mu-modal.test.js +0 -275
  281. package/tests/components/mu-navbar.test.js +0 -101
  282. package/tests/components/mu-progress.test.js +0 -115
  283. package/tests/components/mu-radio.test.js +0 -114
  284. package/tests/components/mu-repeat.test.js +0 -106
  285. package/tests/components/mu-sidebar.test.js +0 -126
  286. package/tests/components/mu-skeleton.test.js +0 -162
  287. package/tests/components/mu-stack.test.js +0 -143
  288. package/tests/components/mu-switch.test.js +0 -292
  289. package/tests/components/mu-table.test.js +0 -124
  290. package/tests/components/mu-tabs.test.js +0 -104
  291. package/tests/components/mu-textarea.test.js +0 -115
  292. package/tests/components/mu-toast.test.js +0 -321
  293. package/tests/components/mu-tooltip.test.js +0 -133
  294. package/tests/components/mu-virtual-list.test.js +0 -109
  295. package/tests/core/MuElement.test.js +0 -120
  296. package/tests/core/agent-api.test.js +0 -125
  297. package/tests/core/all-core-modules.test.js +0 -442
  298. package/tests/core/bus.test.js +0 -364
  299. package/tests/core/component-schema.test.js +0 -160
  300. package/tests/core/feature-registry.test.js +0 -198
  301. package/tests/core/form-state.test.js +0 -167
  302. package/tests/core/http.test.js +0 -119
  303. package/tests/core/keyboard.test.js +0 -319
  304. package/tests/core/layers.test.js +0 -129
  305. package/tests/core/namespaced-stores.test.js +0 -114
  306. package/tests/core/render.test.js +0 -121
  307. package/tests/core/ripple.test.js +0 -131
  308. package/tests/core/router.test.js +0 -89
  309. package/tests/core/scheduler.test.js +0 -121
  310. package/tests/core/signals.test.js +0 -128
  311. package/tests/core/store.test.js +0 -171
  312. package/tests/core/transitions.test.js +0 -82
  313. package/tests/e2e/accessibility-harness.html +0 -58
  314. package/tests/e2e/accessibility.test.js +0 -401
  315. package/tests/e2e/agent-features.test.js +0 -372
  316. package/tests/e2e/card-spacing.test.js +0 -287
  317. package/tests/e2e/components.test.js +0 -439
  318. package/tests/e2e/demo-routes.test.js +0 -478
  319. package/tests/e2e/layout-css-fallback.test.js +0 -334
  320. package/tests/e2e/mu-alert.e2e.test.js +0 -111
  321. package/tests/e2e/mu-checkbox.test.js +0 -489
  322. package/tests/e2e/mu-chip.test.js +0 -347
  323. package/tests/e2e/mu-form.test.js +0 -499
  324. package/tests/e2e/mu-icon.test.js +0 -114
  325. package/tests/e2e/mu-radio.test.js +0 -113
  326. package/tests/e2e/mu-skeleton.test.js +0 -140
  327. package/tests/e2e/mu-switch.test.js +0 -415
  328. package/tests/e2e/mu-tabs.test.js +0 -494
  329. package/tests/e2e/mu-textarea.test.js +0 -242
  330. package/tests/e2e/mu-virtual-list.test.js +0 -427
  331. package/tests/e2e/perf-memory.test.js +0 -161
  332. package/tests/e2e/puppeteer-helper.js +0 -137
  333. package/tests/e2e/puppeteer.test.js +0 -226
  334. package/tests/e2e/pwa.test.js +0 -261
  335. package/tests/e2e/test-harness.html +0 -319
  336. package/tests/manual/test-components.html +0 -120
  337. package/tests/memory-test.html +0 -309
  338. package/tests/setup-dom.js +0 -93
  339. package/tests/visual-test.html +0 -301
@@ -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
- });