snice 1.13.2 → 1.13.4

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 (295) hide show
  1. package/bin/templates/base/README.md +1 -1
  2. package/dist/components/accordion/snice-accordion-item.d.ts +25 -0
  3. package/dist/components/accordion/snice-accordion-item.js +260 -0
  4. package/dist/components/accordion/snice-accordion-item.js.map +1 -0
  5. package/dist/components/accordion/snice-accordion.d.ts +28 -0
  6. package/dist/components/accordion/snice-accordion.js +221 -0
  7. package/dist/components/accordion/snice-accordion.js.map +1 -0
  8. package/dist/components/accordion/snice-accordion.types.d.ts +29 -0
  9. package/dist/components/accordion/snice-accordion.types.js +2 -0
  10. package/dist/components/accordion/snice-accordion.types.js.map +1 -0
  11. package/dist/components/alert/snice-alert.d.ts +26 -0
  12. package/dist/components/alert/snice-alert.js +191 -0
  13. package/dist/components/alert/snice-alert.js.map +1 -0
  14. package/dist/components/alert/snice-alert.types.d.ts +11 -0
  15. package/dist/components/alert/snice-alert.types.js +2 -0
  16. package/dist/components/alert/snice-alert.types.js.map +1 -0
  17. package/dist/components/avatar/snice-avatar.d.ts +24 -0
  18. package/dist/components/avatar/snice-avatar.js +177 -0
  19. package/dist/components/avatar/snice-avatar.js.map +1 -0
  20. package/dist/components/avatar/snice-avatar.types.d.ts +12 -0
  21. package/dist/components/avatar/snice-avatar.types.js +2 -0
  22. package/dist/components/avatar/snice-avatar.types.js.map +1 -0
  23. package/dist/components/badge/snice-badge.d.ts +25 -0
  24. package/dist/components/badge/snice-badge.js +157 -0
  25. package/dist/components/badge/snice-badge.js.map +1 -0
  26. package/dist/components/badge/snice-badge.types.d.ts +15 -0
  27. package/dist/components/badge/snice-badge.types.js +2 -0
  28. package/dist/components/badge/snice-badge.types.js.map +1 -0
  29. package/dist/components/breadcrumbs/snice-breadcrumbs.d.ts +27 -0
  30. package/dist/components/breadcrumbs/snice-breadcrumbs.js +212 -0
  31. package/dist/components/breadcrumbs/snice-breadcrumbs.js.map +1 -0
  32. package/dist/components/breadcrumbs/snice-breadcrumbs.types.d.ts +23 -0
  33. package/dist/components/breadcrumbs/snice-breadcrumbs.types.js +2 -0
  34. package/dist/components/breadcrumbs/snice-breadcrumbs.types.js.map +1 -0
  35. package/dist/components/breadcrumbs/snice-crumb.d.ts +9 -0
  36. package/dist/components/breadcrumbs/snice-crumb.js +50 -0
  37. package/dist/components/breadcrumbs/snice-crumb.js.map +1 -0
  38. package/dist/components/button/snice-button.d.ts +32 -0
  39. package/dist/components/button/snice-button.js +212 -0
  40. package/dist/components/button/snice-button.js.map +1 -0
  41. package/dist/components/button/snice-button.types.d.ts +23 -0
  42. package/dist/components/button/snice-button.types.js +2 -0
  43. package/dist/components/button/snice-button.types.js.map +1 -0
  44. package/dist/components/card/snice-card.d.ts +19 -0
  45. package/dist/components/card/snice-card.js +132 -0
  46. package/dist/components/card/snice-card.js.map +1 -0
  47. package/dist/components/card/snice-card.types.d.ts +9 -0
  48. package/dist/components/card/snice-card.types.js +2 -0
  49. package/dist/components/card/snice-card.types.js.map +1 -0
  50. package/dist/components/checkbox/snice-checkbox.d.ts +34 -0
  51. package/dist/components/checkbox/snice-checkbox.js +289 -0
  52. package/dist/components/checkbox/snice-checkbox.js.map +1 -0
  53. package/dist/components/checkbox/snice-checkbox.types.d.ts +20 -0
  54. package/dist/components/checkbox/snice-checkbox.types.js +2 -0
  55. package/dist/components/checkbox/snice-checkbox.types.js.map +1 -0
  56. package/dist/components/chip/snice-chip.d.ts +28 -0
  57. package/dist/components/chip/snice-chip.js +203 -0
  58. package/dist/components/chip/snice-chip.js.map +1 -0
  59. package/dist/components/chip/snice-chip.types.d.ts +14 -0
  60. package/dist/components/chip/snice-chip.types.js +2 -0
  61. package/dist/components/chip/snice-chip.types.js.map +1 -0
  62. package/dist/components/date-picker/snice-date-picker.d.ts +82 -0
  63. package/dist/components/date-picker/snice-date-picker.js +880 -0
  64. package/dist/components/date-picker/snice-date-picker.js.map +1 -0
  65. package/dist/components/date-picker/snice-date-picker.types.d.ts +71 -0
  66. package/dist/components/date-picker/snice-date-picker.types.js +2 -0
  67. package/dist/components/date-picker/snice-date-picker.types.js.map +1 -0
  68. package/dist/components/divider/snice-divider.d.ts +17 -0
  69. package/dist/components/divider/snice-divider.js +111 -0
  70. package/dist/components/divider/snice-divider.js.map +1 -0
  71. package/dist/components/divider/snice-divider.types.d.ts +14 -0
  72. package/dist/components/divider/snice-divider.types.js +2 -0
  73. package/dist/components/divider/snice-divider.types.js.map +1 -0
  74. package/dist/components/drawer/snice-drawer.d.ts +37 -0
  75. package/dist/components/drawer/snice-drawer.js +335 -0
  76. package/dist/components/drawer/snice-drawer.js.map +1 -0
  77. package/dist/components/drawer/snice-drawer.types.d.ts +16 -0
  78. package/dist/components/drawer/snice-drawer.types.js +2 -0
  79. package/dist/components/drawer/snice-drawer.types.js.map +1 -0
  80. package/dist/components/input/snice-input.d.ts +65 -0
  81. package/dist/components/input/snice-input.js +603 -0
  82. package/dist/components/input/snice-input.js.map +1 -0
  83. package/dist/components/input/snice-input.types.d.ts +53 -0
  84. package/dist/components/input/snice-input.types.js +2 -0
  85. package/dist/components/input/snice-input.types.js.map +1 -0
  86. package/dist/components/layout/snice-layout-blog.d.ts +4 -0
  87. package/dist/components/layout/snice-layout-blog.js +56 -0
  88. package/dist/components/layout/snice-layout-blog.js.map +1 -0
  89. package/dist/components/layout/snice-layout-card.d.ts +6 -0
  90. package/dist/components/layout/snice-layout-card.js +53 -0
  91. package/dist/components/layout/snice-layout-card.js.map +1 -0
  92. package/dist/components/layout/snice-layout-centered.d.ts +5 -0
  93. package/dist/components/layout/snice-layout-centered.js +38 -0
  94. package/dist/components/layout/snice-layout-centered.js.map +1 -0
  95. package/dist/components/layout/snice-layout-dashboard.d.ts +4 -0
  96. package/dist/components/layout/snice-layout-dashboard.js +53 -0
  97. package/dist/components/layout/snice-layout-dashboard.js.map +1 -0
  98. package/dist/components/layout/snice-layout-fullscreen.d.ts +5 -0
  99. package/dist/components/layout/snice-layout-fullscreen.js +50 -0
  100. package/dist/components/layout/snice-layout-fullscreen.js.map +1 -0
  101. package/dist/components/layout/snice-layout-landing.d.ts +4 -0
  102. package/dist/components/layout/snice-layout-landing.js +55 -0
  103. package/dist/components/layout/snice-layout-landing.js.map +1 -0
  104. package/dist/components/layout/snice-layout-minimal.d.ts +4 -0
  105. package/dist/components/layout/snice-layout-minimal.js +27 -0
  106. package/dist/components/layout/snice-layout-minimal.js.map +1 -0
  107. package/dist/components/layout/snice-layout-sidebar.d.ts +5 -0
  108. package/dist/components/layout/snice-layout-sidebar.js +64 -0
  109. package/dist/components/layout/snice-layout-sidebar.js.map +1 -0
  110. package/dist/components/layout/snice-layout-split.d.ts +6 -0
  111. package/dist/components/layout/snice-layout-split.js +47 -0
  112. package/dist/components/layout/snice-layout-split.js.map +1 -0
  113. package/dist/components/layout/snice-layout.d.ts +4 -0
  114. package/dist/components/layout/snice-layout.js +43 -0
  115. package/dist/components/layout/snice-layout.js.map +1 -0
  116. package/dist/components/layout/snice-layout.types.d.ts +3 -0
  117. package/dist/components/layout/snice-layout.types.js +2 -0
  118. package/dist/components/layout/snice-layout.types.js.map +1 -0
  119. package/dist/components/login/snice-login.d.ts +45 -0
  120. package/dist/components/login/snice-login.js +385 -0
  121. package/dist/components/login/snice-login.js.map +1 -0
  122. package/dist/components/login/snice-login.types.d.ts +31 -0
  123. package/dist/components/login/snice-login.types.js +2 -0
  124. package/dist/components/login/snice-login.types.js.map +1 -0
  125. package/dist/components/modal/snice-modal.d.ts +32 -0
  126. package/dist/components/modal/snice-modal.js +288 -0
  127. package/dist/components/modal/snice-modal.js.map +1 -0
  128. package/dist/components/modal/snice-modal.types.d.ts +18 -0
  129. package/dist/components/modal/snice-modal.types.js +2 -0
  130. package/dist/components/modal/snice-modal.types.js.map +1 -0
  131. package/dist/components/pagination/snice-pagination.d.ts +26 -0
  132. package/dist/components/pagination/snice-pagination.js +373 -0
  133. package/dist/components/pagination/snice-pagination.js.map +1 -0
  134. package/dist/components/pagination/snice-pagination.types.d.ts +18 -0
  135. package/dist/components/pagination/snice-pagination.types.js +2 -0
  136. package/dist/components/pagination/snice-pagination.types.js.map +1 -0
  137. package/dist/components/progress/snice-progress.d.ts +35 -0
  138. package/dist/components/progress/snice-progress.js +295 -0
  139. package/dist/components/progress/snice-progress.js.map +1 -0
  140. package/dist/components/progress/snice-progress.types.d.ts +18 -0
  141. package/dist/components/progress/snice-progress.types.js +2 -0
  142. package/dist/components/progress/snice-progress.types.js.map +1 -0
  143. package/dist/components/radio/snice-radio.d.ts +33 -0
  144. package/dist/components/radio/snice-radio.js +286 -0
  145. package/dist/components/radio/snice-radio.js.map +1 -0
  146. package/dist/components/radio/snice-radio.types.d.ts +19 -0
  147. package/dist/components/radio/snice-radio.types.js +2 -0
  148. package/dist/components/radio/snice-radio.types.js.map +1 -0
  149. package/dist/components/select/snice-option.d.ts +17 -0
  150. package/dist/components/select/snice-option.js +77 -0
  151. package/dist/components/select/snice-option.js.map +1 -0
  152. package/dist/components/select/snice-option.types.d.ts +14 -0
  153. package/dist/components/select/snice-option.types.js +2 -0
  154. package/dist/components/select/snice-option.types.js.map +1 -0
  155. package/dist/components/select/snice-select.d.ts +89 -0
  156. package/dist/components/select/snice-select.js +900 -0
  157. package/dist/components/select/snice-select.js.map +1 -0
  158. package/dist/components/select/snice-select.types.d.ts +49 -0
  159. package/dist/components/select/snice-select.types.js +2 -0
  160. package/dist/components/select/snice-select.types.js.map +1 -0
  161. package/dist/components/skeleton/snice-skeleton.d.ts +16 -0
  162. package/dist/components/skeleton/snice-skeleton.js +159 -0
  163. package/dist/components/skeleton/snice-skeleton.js.map +1 -0
  164. package/dist/components/skeleton/snice-skeleton.types.d.ts +10 -0
  165. package/dist/components/skeleton/snice-skeleton.types.js +2 -0
  166. package/dist/components/skeleton/snice-skeleton.types.js.map +1 -0
  167. package/dist/components/switch/snice-switch.d.ts +38 -0
  168. package/dist/components/switch/snice-switch.js +309 -0
  169. package/dist/components/switch/snice-switch.js.map +1 -0
  170. package/dist/components/switch/snice-switch.types.d.ts +21 -0
  171. package/dist/components/switch/snice-switch.types.js +2 -0
  172. package/dist/components/switch/snice-switch.types.js.map +1 -0
  173. package/dist/components/symbols.d.ts +1 -0
  174. package/dist/components/symbols.js +20 -0
  175. package/dist/components/symbols.js.map +1 -0
  176. package/dist/components/table/snice-cell-boolean.d.ts +21 -0
  177. package/dist/components/table/snice-cell-boolean.js +152 -0
  178. package/dist/components/table/snice-cell-boolean.js.map +1 -0
  179. package/dist/components/table/snice-cell-date.d.ts +24 -0
  180. package/dist/components/table/snice-cell-date.js +240 -0
  181. package/dist/components/table/snice-cell-date.js.map +1 -0
  182. package/dist/components/table/snice-cell-duration.d.ts +16 -0
  183. package/dist/components/table/snice-cell-duration.js +123 -0
  184. package/dist/components/table/snice-cell-duration.js.map +1 -0
  185. package/dist/components/table/snice-cell-filesize.d.ts +16 -0
  186. package/dist/components/table/snice-cell-filesize.js +119 -0
  187. package/dist/components/table/snice-cell-filesize.js.map +1 -0
  188. package/dist/components/table/snice-cell-number.d.ts +23 -0
  189. package/dist/components/table/snice-cell-number.js +202 -0
  190. package/dist/components/table/snice-cell-number.js.map +1 -0
  191. package/dist/components/table/snice-cell-progress.d.ts +17 -0
  192. package/dist/components/table/snice-cell-progress.js +114 -0
  193. package/dist/components/table/snice-cell-progress.js.map +1 -0
  194. package/dist/components/table/snice-cell-rating.d.ts +17 -0
  195. package/dist/components/table/snice-cell-rating.js +113 -0
  196. package/dist/components/table/snice-cell-rating.js.map +1 -0
  197. package/dist/components/table/snice-cell-sparkline.d.ts +29 -0
  198. package/dist/components/table/snice-cell-sparkline.js +290 -0
  199. package/dist/components/table/snice-cell-sparkline.js.map +1 -0
  200. package/dist/components/table/snice-cell-text.d.ts +19 -0
  201. package/dist/components/table/snice-cell-text.js +153 -0
  202. package/dist/components/table/snice-cell-text.js.map +1 -0
  203. package/dist/components/table/snice-cell.d.ts +32 -0
  204. package/dist/components/table/snice-cell.js +451 -0
  205. package/dist/components/table/snice-cell.js.map +1 -0
  206. package/dist/components/table/snice-column.d.ts +62 -0
  207. package/dist/components/table/snice-column.js +440 -0
  208. package/dist/components/table/snice-column.js.map +1 -0
  209. package/dist/components/table/snice-header.d.ts +33 -0
  210. package/dist/components/table/snice-header.js +303 -0
  211. package/dist/components/table/snice-header.js.map +1 -0
  212. package/dist/components/table/snice-progress.d.ts +10 -0
  213. package/dist/components/table/snice-progress.js +91 -0
  214. package/dist/components/table/snice-progress.js.map +1 -0
  215. package/dist/components/table/snice-rating.d.ts +9 -0
  216. package/dist/components/table/snice-rating.js +68 -0
  217. package/dist/components/table/snice-rating.js.map +1 -0
  218. package/dist/components/table/snice-row.d.ts +43 -0
  219. package/dist/components/table/snice-row.js +365 -0
  220. package/dist/components/table/snice-row.js.map +1 -0
  221. package/dist/components/table/snice-table.d.ts +69 -0
  222. package/dist/components/table/snice-table.js +814 -0
  223. package/dist/components/table/snice-table.js.map +1 -0
  224. package/dist/components/table/snice-table.types.d.ts +137 -0
  225. package/dist/components/table/snice-table.types.js +2 -0
  226. package/dist/components/table/snice-table.types.js.map +1 -0
  227. package/dist/components/tabs/snice-tab-panel.d.ts +12 -0
  228. package/dist/components/tabs/snice-tab-panel.js +78 -0
  229. package/dist/components/tabs/snice-tab-panel.js.map +1 -0
  230. package/dist/components/tabs/snice-tab.d.ts +13 -0
  231. package/dist/components/tabs/snice-tab.js +90 -0
  232. package/dist/components/tabs/snice-tab.js.map +1 -0
  233. package/dist/components/tabs/snice-tabs.d.ts +34 -0
  234. package/dist/components/tabs/snice-tabs.js +367 -0
  235. package/dist/components/tabs/snice-tabs.js.map +1 -0
  236. package/dist/components/tabs/snice-tabs.types.d.ts +23 -0
  237. package/dist/components/tabs/snice-tabs.types.js +2 -0
  238. package/dist/components/tabs/snice-tabs.types.js.map +1 -0
  239. package/dist/components/toast/snice-toast-container.d.ts +25 -0
  240. package/dist/components/toast/snice-toast-container.js +251 -0
  241. package/dist/components/toast/snice-toast-container.js.map +1 -0
  242. package/dist/components/toast/snice-toast.d.ts +23 -0
  243. package/dist/components/toast/snice-toast.js +316 -0
  244. package/dist/components/toast/snice-toast.js.map +1 -0
  245. package/dist/components/toast/snice-toast.types.d.ts +30 -0
  246. package/dist/components/toast/snice-toast.types.js +2 -0
  247. package/dist/components/toast/snice-toast.types.js.map +1 -0
  248. package/dist/components/tooltip/snice-tooltip.d.ts +50 -0
  249. package/dist/components/tooltip/snice-tooltip.js +656 -0
  250. package/dist/components/tooltip/snice-tooltip.js.map +1 -0
  251. package/dist/components/tooltip/snice-tooltip.types.d.ts +18 -0
  252. package/dist/components/tooltip/snice-tooltip.types.js +2 -0
  253. package/dist/components/tooltip/snice-tooltip.types.js.map +1 -0
  254. package/dist/components/transitions.d.ts +11 -0
  255. package/dist/components/transitions.js +69 -0
  256. package/dist/components/transitions.js.map +1 -0
  257. package/dist/src/controller.d.ts +61 -0
  258. package/dist/src/controller.js +297 -0
  259. package/dist/src/controller.js.map +1 -0
  260. package/dist/src/element.d.ts +77 -0
  261. package/dist/src/element.js +805 -0
  262. package/dist/src/element.js.map +1 -0
  263. package/dist/src/events.d.ts +37 -0
  264. package/dist/src/events.js +289 -0
  265. package/dist/src/events.js.map +1 -0
  266. package/dist/src/global.d.ts +7 -0
  267. package/dist/src/global.js +23 -0
  268. package/dist/src/global.js.map +1 -0
  269. package/{src/index.ts → dist/src/index.d.ts} +1 -1
  270. package/dist/src/index.js +8 -0
  271. package/dist/src/index.js.map +1 -0
  272. package/dist/src/observe.d.ts +26 -0
  273. package/dist/src/observe.js +329 -0
  274. package/dist/src/observe.js.map +1 -0
  275. package/dist/src/request-response.d.ts +46 -0
  276. package/dist/src/request-response.js +267 -0
  277. package/dist/src/request-response.js.map +1 -0
  278. package/dist/src/router.d.ts +87 -0
  279. package/dist/src/router.js +375 -0
  280. package/dist/src/router.js.map +1 -0
  281. package/dist/src/symbols.d.ts +29 -0
  282. package/{src/symbols.ts → dist/src/symbols.js} +2 -12
  283. package/dist/src/symbols.js.map +1 -0
  284. package/dist/src/transitions.d.ts +50 -0
  285. package/dist/src/transitions.js +199 -0
  286. package/dist/src/transitions.js.map +1 -0
  287. package/package.json +6 -8
  288. package/src/controller.ts +0 -347
  289. package/src/element.ts +0 -897
  290. package/src/events.ts +0 -349
  291. package/src/global.ts +0 -31
  292. package/src/observe.ts +0 -414
  293. package/src/request-response.ts +0 -336
  294. package/src/router.ts +0 -552
  295. package/src/transitions.ts +0 -264
@@ -1,336 +0,0 @@
1
- import { CHANNEL_HANDLERS, CLEANUP, IS_CONTROLLER_INSTANCE } from './symbols';
2
-
3
- // Pragmatic type for @request decorated methods
4
- // - Eliminates TypeScript implicit 'any' warnings
5
- // - Allows property access on returned values (result.data works)
6
- // - Documents the expected return type T
7
- // - The @request decorator transforms async generators to return Promise<T> at runtime
8
- export type Response<T = any> = T | any;
9
-
10
- export interface RequestOptions extends EventInit {
11
- /**
12
- * Timeout for waiting for responses (in ms) - defaults to 5000ms
13
- */
14
- timeout?: number;
15
- /**
16
- * Timeout for finding a handler (in ms) - defaults to 50ms
17
- */
18
- discoveryTimeout?: number;
19
- /**
20
- * Debounce the request by specified milliseconds
21
- */
22
- debounce?: number;
23
- /**
24
- * Throttle the request by specified milliseconds
25
- */
26
- throttle?: number;
27
- }
28
-
29
- /**
30
- * Decorator for making requests from elements or controllers.
31
- * Uses async generator pattern for bidirectional communication.
32
- *
33
- * @param requestName The name of the request
34
- * @param options Optional configuration
35
- */
36
- export function request(requestName: string, options?: RequestOptions) {
37
- return function (_target: any, _propertyKey: string, descriptor: PropertyDescriptor) {
38
- const originalMethod = descriptor.value;
39
-
40
- // Create timing variables for debounce/throttle
41
- let debounceTimeout: any;
42
- let throttleLastCall = 0;
43
- let throttleTimeout: any;
44
-
45
- descriptor.value = async function (this: any, ...args: any[]) {
46
- const actualRequest = async () => {
47
- // @request always acts as requester (client side)
48
- const responseTimeout = options?.timeout ?? 120000; // Default 2 minute timeout
49
- const discoveryTimeout = options?.discoveryTimeout ?? 50; // Default 50ms discovery timeout
50
-
51
- // Create the generator
52
- const generator = originalMethod.apply(this, args);
53
-
54
- // Get the first yield (the request payload)
55
- const { value: payload, done } = await generator.next();
56
-
57
- if (done) {
58
- // Generator returned without yielding
59
- return payload;
60
- }
61
-
62
- // Create data promise and expose resolve/reject
63
- let dataResolve: (value: any) => void;
64
- let dataReject: (reason?: any) => void;
65
- const dataPromise = new Promise((resolve, reject) => {
66
- dataResolve = resolve;
67
- dataReject = reject;
68
- });
69
-
70
- // Create discovery timeout promise and expose resolve/reject
71
- let discoveryResolve: () => void;
72
- let discoveryReject: (reason?: any) => void;
73
- let discoveryTimeoutId: NodeJS.Timeout;
74
- const discoveryPromise = new Promise<void>((resolve, reject) => {
75
- discoveryResolve = resolve;
76
- discoveryReject = reject;
77
- discoveryTimeoutId = setTimeout(() => {
78
- reject(new Error(`Request "${requestName}" timed out after ${discoveryTimeout}ms - no handler found`));
79
- }, discoveryTimeout);
80
- });
81
-
82
- // Dispatch event with promises
83
- const eventName = `@request/${requestName}`;
84
- const event = new CustomEvent(eventName, {
85
- bubbles: options?.bubbles !== undefined ? options.bubbles : true,
86
- cancelable: options?.cancelable || false,
87
- composed: true, // Allow crossing shadow DOM boundaries
88
- detail: {
89
- payload,
90
- discovery: {
91
- resolve: () => {
92
- clearTimeout(discoveryTimeoutId);
93
- discoveryResolve();
94
- },
95
- reject: discoveryReject!
96
- },
97
- data: {
98
- resolve: dataResolve!,
99
- reject: dataReject!
100
- }
101
- }
102
- });
103
-
104
- // Check if this is a controller instance using the symbol
105
- const isController = this[IS_CONTROLLER_INSTANCE] === true;
106
- const dispatcher = isController && this.element ? this.element : this;
107
- dispatcher.dispatchEvent(event);
108
-
109
- try {
110
- // Wait for discovery timeout to be cleared (handler found) or discovery timeout to reject (no handler)
111
- await discoveryPromise;
112
-
113
- // If we get here, a handler was found and discovery timeout was cleared
114
- // Now wait for the actual data response with the full response timeout
115
- const responseTimeoutId = setTimeout(() => {
116
- dataReject!(new Error(`Request "${requestName}" timed out after ${responseTimeout}ms`));
117
- }, responseTimeout);
118
-
119
- const response = await dataPromise;
120
- clearTimeout(responseTimeoutId);
121
-
122
- // Send response back to generator and get final return value
123
- const { value: finalValue } = await generator.next(response);
124
- return finalValue;
125
- } catch (error) {
126
- // Send error to generator
127
- try {
128
- await generator.throw(error);
129
- } catch (generatorError) {
130
- throw generatorError;
131
- }
132
- }
133
- }; // Close actualRequest function
134
-
135
- // Apply debounce or throttle if specified
136
- if (options?.debounce) {
137
- return new Promise((resolve, reject) => {
138
- clearTimeout(debounceTimeout);
139
- debounceTimeout = setTimeout(async () => {
140
- try {
141
- const result = await actualRequest();
142
- resolve(result);
143
- } catch (error) {
144
- reject(error);
145
- }
146
- }, options.debounce);
147
- });
148
- }
149
-
150
- if (options?.throttle) {
151
- const now = Date.now();
152
- const remaining = options.throttle - (now - throttleLastCall);
153
-
154
- if (remaining <= 0) {
155
- clearTimeout(throttleTimeout);
156
- throttleLastCall = now;
157
- return actualRequest();
158
- } else if (!throttleTimeout) {
159
- return new Promise((resolve, reject) => {
160
- throttleTimeout = setTimeout(async () => {
161
- throttleLastCall = Date.now();
162
- throttleTimeout = null;
163
- try {
164
- const result = await actualRequest();
165
- resolve(result);
166
- } catch (error) {
167
- reject(error);
168
- }
169
- }, remaining);
170
- });
171
- }
172
-
173
- // If throttled and timeout already exists, return empty promise
174
- return Promise.resolve();
175
- }
176
-
177
- // No timing applied, execute immediately
178
- return actualRequest();
179
- };
180
-
181
- return descriptor;
182
- };
183
- }
184
-
185
- export interface RespondOptions {
186
- /**
187
- * Debounce the response by specified milliseconds
188
- */
189
- debounce?: number;
190
- /**
191
- * Throttle the response by specified milliseconds
192
- */
193
- throttle?: number;
194
- }
195
-
196
- /**
197
- * Decorator for responding to requests in elements or controllers.
198
- *
199
- * @param requestName The name of the request to respond to
200
- * @param options Optional configuration
201
- */
202
- export function respond(requestName: string, options?: RespondOptions) {
203
- return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
204
- const originalMethod = descriptor.value;
205
-
206
- // Store response metadata on the prototype
207
- // This will be picked up by setupResponseHandlers
208
- if (!target[CHANNEL_HANDLERS]) {
209
- target[CHANNEL_HANDLERS] = [];
210
- }
211
-
212
- target[CHANNEL_HANDLERS].push({
213
- channelName: requestName,
214
- methodName: propertyKey,
215
- method: originalMethod,
216
- options: options
217
- });
218
-
219
- return descriptor;
220
- };
221
- }
222
-
223
- // Helper to setup response handlers for elements and controllers
224
- export function setupResponseHandlers(instance: any, element: HTMLElement) {
225
- const handlers = instance.constructor.prototype[CHANNEL_HANDLERS];
226
- if (!handlers) return;
227
-
228
- // Store cleanup functions
229
- // Initialize cleanup object if needed
230
- if (!instance[CLEANUP]) {
231
- instance[CLEANUP] = { events: [], channels: [] };
232
- }
233
-
234
- for (const handler of handlers) {
235
- const boundMethod = handler.method.bind(instance);
236
- const eventName = `@request/${handler.channelName}`;
237
-
238
- // Create timing variables for debounce/throttle per handler
239
- let debounceTimeout: any;
240
- let throttleLastCall = 0;
241
- let throttleTimeout: any;
242
-
243
- // Create wrapped method with timing if needed
244
- const createTimedMethod = (originalMethod: Function) => {
245
- if (handler.options?.debounce) {
246
- return (...args: any[]) => {
247
- return new Promise((resolve, reject) => {
248
- clearTimeout(debounceTimeout);
249
- debounceTimeout = setTimeout(async () => {
250
- try {
251
- const result = await originalMethod(...args);
252
- resolve(result);
253
- } catch (error) {
254
- reject(error);
255
- }
256
- }, handler.options.debounce);
257
- });
258
- };
259
- }
260
-
261
- if (handler.options?.throttle) {
262
- return (...args: any[]) => {
263
- const now = Date.now();
264
- const remaining = handler.options.throttle! - (now - throttleLastCall);
265
-
266
- if (remaining <= 0) {
267
- clearTimeout(throttleTimeout);
268
- throttleLastCall = now;
269
- return originalMethod(...args);
270
- } else if (!throttleTimeout) {
271
- return new Promise((resolve, reject) => {
272
- throttleTimeout = setTimeout(async () => {
273
- throttleLastCall = Date.now();
274
- throttleTimeout = null;
275
- try {
276
- const result = await originalMethod(...args);
277
- resolve(result);
278
- } catch (error) {
279
- reject(error);
280
- }
281
- }, remaining);
282
- });
283
- }
284
-
285
- // If throttled and timeout already exists, return cached/empty response
286
- return Promise.resolve(undefined);
287
- };
288
- }
289
-
290
- return originalMethod;
291
- };
292
-
293
- const timedMethod = createTimedMethod(boundMethod);
294
-
295
- // Setup response handler
296
- const responseHandler = (event: CustomEvent) => {
297
- // Extract promises and payload
298
- const { data, discovery, payload } = event.detail;
299
-
300
- // Prevent other responders from responding
301
- event.preventDefault();
302
- event.stopImmediatePropagation();
303
- event.stopPropagation();
304
-
305
- // Clear the discovery timeout immediately - we found a handler
306
- discovery.resolve();
307
-
308
- // Call the timed responder method and handle the result
309
- Promise.resolve(timedMethod(payload))
310
- .then(result => {
311
- data.resolve(result);
312
- })
313
- .catch(error => {
314
- data.reject(error);
315
- console.error(`Error in response handler ${handler.methodName}:`, error);
316
- });
317
- };
318
-
319
- element.addEventListener(eventName, responseHandler as EventListener);
320
-
321
- instance[CLEANUP].channels.push(() => {
322
- element.removeEventListener(eventName, responseHandler as EventListener);
323
- });
324
- }
325
- }
326
-
327
- // Helper to cleanup response handlers
328
- export function cleanupResponseHandlers(instance: any) {
329
- if (instance[CLEANUP]?.channels) {
330
- for (const cleanup of instance[CLEANUP].channels) {
331
- cleanup();
332
- }
333
- instance[CLEANUP].channels = [];
334
- }
335
- }
336
-