sigmx 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (344) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +173 -0
  3. package/dist/auto.d.ts +1 -0
  4. package/dist/auto.js +7 -0
  5. package/dist/auto.js.map +7 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.js +26 -0
  8. package/dist/cli.js.map +7 -0
  9. package/dist/core/csp.d.ts +7 -0
  10. package/dist/core/csp.js +20 -0
  11. package/dist/core/csp.js.map +7 -0
  12. package/dist/core/engine.d.ts +10 -0
  13. package/dist/core/engine.js +200 -0
  14. package/dist/core/engine.js.map +7 -0
  15. package/dist/core/expr.d.ts +12 -0
  16. package/dist/core/expr.js +94 -0
  17. package/dist/core/expr.js.map +7 -0
  18. package/dist/core/index.d.ts +16 -0
  19. package/dist/core/index.js +46 -0
  20. package/dist/core/index.js.map +7 -0
  21. package/dist/core/signals.d.ts +42 -0
  22. package/dist/core/signals.js +195 -0
  23. package/dist/core/signals.js.map +7 -0
  24. package/dist/core/store.d.ts +32 -0
  25. package/dist/core/store.js +185 -0
  26. package/dist/core/store.js.map +7 -0
  27. package/dist/core/types.d.ts +101 -0
  28. package/dist/core/types.js +1 -0
  29. package/dist/core/types.js.map +7 -0
  30. package/dist/kernel/compile.d.ts +16 -0
  31. package/dist/kernel/compile.js +96 -0
  32. package/dist/kernel/compile.js.map +7 -0
  33. package/dist/kernel/contracts.d.ts +121 -0
  34. package/dist/kernel/contracts.js +1 -0
  35. package/dist/kernel/contracts.js.map +7 -0
  36. package/dist/kernel/index.d.ts +20 -0
  37. package/dist/kernel/index.js +54 -0
  38. package/dist/kernel/index.js.map +7 -0
  39. package/dist/kernel/precompile.d.ts +25 -0
  40. package/dist/kernel/precompile.js +111 -0
  41. package/dist/kernel/precompile.js.map +7 -0
  42. package/dist/kernel/precompiled.d.ts +11 -0
  43. package/dist/kernel/precompiled.js +13 -0
  44. package/dist/kernel/precompiled.js.map +7 -0
  45. package/dist/kernel/reactive.d.ts +42 -0
  46. package/dist/kernel/reactive.js +201 -0
  47. package/dist/kernel/reactive.js.map +7 -0
  48. package/dist/kernel/runtime.d.ts +11 -0
  49. package/dist/kernel/runtime.js +210 -0
  50. package/dist/kernel/runtime.js.map +7 -0
  51. package/dist/kernel/scan.d.ts +42 -0
  52. package/dist/kernel/scan.js +68 -0
  53. package/dist/kernel/scan.js.map +7 -0
  54. package/dist/kernel/state.d.ts +32 -0
  55. package/dist/kernel/state.js +186 -0
  56. package/dist/kernel/state.js.map +7 -0
  57. package/dist/kernel/strict-csp.d.ts +7 -0
  58. package/dist/kernel/strict-csp.js +20 -0
  59. package/dist/kernel/strict-csp.js.map +7 -0
  60. package/dist/lib/casing.d.ts +7 -0
  61. package/dist/lib/casing.js +16 -0
  62. package/dist/lib/casing.js.map +7 -0
  63. package/dist/lib/objects.d.ts +9 -0
  64. package/dist/lib/objects.js +26 -0
  65. package/dist/lib/objects.js.map +7 -0
  66. package/dist/lib/schedule.d.ts +14 -0
  67. package/dist/lib/schedule.js +51 -0
  68. package/dist/lib/schedule.js.map +7 -0
  69. package/dist/lib/sse.d.ts +10 -0
  70. package/dist/lib/sse.js +55 -0
  71. package/dist/lib/sse.js.map +7 -0
  72. package/dist/plugins/actions/clipboard.d.ts +2 -0
  73. package/dist/plugins/actions/clipboard.js +11 -0
  74. package/dist/plugins/actions/clipboard.js.map +7 -0
  75. package/dist/plugins/actions/fit.d.ts +2 -0
  76. package/dist/plugins/actions/fit.js +14 -0
  77. package/dist/plugins/actions/fit.js.map +7 -0
  78. package/dist/plugins/actions/intl.d.ts +2 -0
  79. package/dist/plugins/actions/intl.js +21 -0
  80. package/dist/plugins/actions/intl.js.map +7 -0
  81. package/dist/plugins/actions/peek.d.ts +2 -0
  82. package/dist/plugins/actions/peek.js +6 -0
  83. package/dist/plugins/actions/peek.js.map +7 -0
  84. package/dist/plugins/actions/setAll.d.ts +2 -0
  85. package/dist/plugins/actions/setAll.js +11 -0
  86. package/dist/plugins/actions/setAll.js.map +7 -0
  87. package/dist/plugins/actions/toggleAll.d.ts +2 -0
  88. package/dist/plugins/actions/toggleAll.js +11 -0
  89. package/dist/plugins/actions/toggleAll.js.map +7 -0
  90. package/dist/plugins/attributes/attr.d.ts +2 -0
  91. package/dist/plugins/attributes/attr.js +20 -0
  92. package/dist/plugins/attributes/attr.js.map +7 -0
  93. package/dist/plugins/attributes/bind.d.ts +6 -0
  94. package/dist/plugins/attributes/bind.js +81 -0
  95. package/dist/plugins/attributes/bind.js.map +7 -0
  96. package/dist/plugins/attributes/class.d.ts +2 -0
  97. package/dist/plugins/attributes/class.js +22 -0
  98. package/dist/plugins/attributes/class.js.map +7 -0
  99. package/dist/plugins/attributes/computed.d.ts +2 -0
  100. package/dist/plugins/attributes/computed.js +20 -0
  101. package/dist/plugins/attributes/computed.js.map +7 -0
  102. package/dist/plugins/attributes/customValidity.d.ts +2 -0
  103. package/dist/plugins/attributes/customValidity.js +14 -0
  104. package/dist/plugins/attributes/customValidity.js.map +7 -0
  105. package/dist/plugins/attributes/effect.d.ts +2 -0
  106. package/dist/plugins/attributes/effect.js +12 -0
  107. package/dist/plugins/attributes/effect.js.map +7 -0
  108. package/dist/plugins/attributes/indicator.d.ts +2 -0
  109. package/dist/plugins/attributes/indicator.js +20 -0
  110. package/dist/plugins/attributes/indicator.js.map +7 -0
  111. package/dist/plugins/attributes/init.d.ts +2 -0
  112. package/dist/plugins/attributes/init.js +14 -0
  113. package/dist/plugins/attributes/init.js.map +7 -0
  114. package/dist/plugins/attributes/jsonSignals.d.ts +2 -0
  115. package/dist/plugins/attributes/jsonSignals.js +15 -0
  116. package/dist/plugins/attributes/jsonSignals.js.map +7 -0
  117. package/dist/plugins/attributes/matchMedia.d.ts +2 -0
  118. package/dist/plugins/attributes/matchMedia.js +19 -0
  119. package/dist/plugins/attributes/matchMedia.js.map +7 -0
  120. package/dist/plugins/attributes/on.d.ts +5 -0
  121. package/dist/plugins/attributes/on.js +28 -0
  122. package/dist/plugins/attributes/on.js.map +7 -0
  123. package/dist/plugins/attributes/onIntersect.d.ts +2 -0
  124. package/dist/plugins/attributes/onIntersect.js +28 -0
  125. package/dist/plugins/attributes/onIntersect.js.map +7 -0
  126. package/dist/plugins/attributes/onInterval.d.ts +2 -0
  127. package/dist/plugins/attributes/onInterval.js +18 -0
  128. package/dist/plugins/attributes/onInterval.js.map +7 -0
  129. package/dist/plugins/attributes/onRaf.d.ts +1 -0
  130. package/dist/plugins/attributes/onRaf.js +19 -0
  131. package/dist/plugins/attributes/onRaf.js.map +7 -0
  132. package/dist/plugins/attributes/onResize.d.ts +1 -0
  133. package/dist/plugins/attributes/onResize.js +17 -0
  134. package/dist/plugins/attributes/onResize.js.map +7 -0
  135. package/dist/plugins/attributes/onSignalPatch.d.ts +5 -0
  136. package/dist/plugins/attributes/onSignalPatch.js +35 -0
  137. package/dist/plugins/attributes/onSignalPatch.js.map +7 -0
  138. package/dist/plugins/attributes/persist.d.ts +6 -0
  139. package/dist/plugins/attributes/persist.js +16 -0
  140. package/dist/plugins/attributes/persist.js.map +7 -0
  141. package/dist/plugins/attributes/queryString.d.ts +5 -0
  142. package/dist/plugins/attributes/queryString.js +54 -0
  143. package/dist/plugins/attributes/queryString.js.map +7 -0
  144. package/dist/plugins/attributes/ref.d.ts +2 -0
  145. package/dist/plugins/attributes/ref.js +13 -0
  146. package/dist/plugins/attributes/ref.js.map +7 -0
  147. package/dist/plugins/attributes/replaceUrl.d.ts +1 -0
  148. package/dist/plugins/attributes/replaceUrl.js +11 -0
  149. package/dist/plugins/attributes/replaceUrl.js.map +7 -0
  150. package/dist/plugins/attributes/scrollIntoView.d.ts +2 -0
  151. package/dist/plugins/attributes/scrollIntoView.js +19 -0
  152. package/dist/plugins/attributes/scrollIntoView.js.map +7 -0
  153. package/dist/plugins/attributes/show.d.ts +2 -0
  154. package/dist/plugins/attributes/show.js +19 -0
  155. package/dist/plugins/attributes/show.js.map +7 -0
  156. package/dist/plugins/attributes/signals.d.ts +2 -0
  157. package/dist/plugins/attributes/signals.js +13 -0
  158. package/dist/plugins/attributes/signals.js.map +7 -0
  159. package/dist/plugins/attributes/style.d.ts +2 -0
  160. package/dist/plugins/attributes/style.js +25 -0
  161. package/dist/plugins/attributes/style.js.map +7 -0
  162. package/dist/plugins/attributes/text.d.ts +1 -0
  163. package/dist/plugins/attributes/text.js +13 -0
  164. package/dist/plugins/attributes/text.js.map +7 -0
  165. package/dist/plugins/attributes/viewTransition.d.ts +1 -0
  166. package/dist/plugins/attributes/viewTransition.js +11 -0
  167. package/dist/plugins/attributes/viewTransition.js.map +7 -0
  168. package/dist/plugins/directives/attribute-sync.d.ts +2 -0
  169. package/dist/plugins/directives/attribute-sync.js +20 -0
  170. package/dist/plugins/directives/attribute-sync.js.map +7 -0
  171. package/dist/plugins/directives/boost.d.ts +6 -0
  172. package/dist/plugins/directives/boost.js +35 -0
  173. package/dist/plugins/directives/boost.js.map +7 -0
  174. package/dist/plugins/directives/busy-flag.d.ts +2 -0
  175. package/dist/plugins/directives/busy-flag.js +21 -0
  176. package/dist/plugins/directives/busy-flag.js.map +7 -0
  177. package/dist/plugins/directives/class-toggle.d.ts +2 -0
  178. package/dist/plugins/directives/class-toggle.js +22 -0
  179. package/dist/plugins/directives/class-toggle.js.map +7 -0
  180. package/dist/plugins/directives/cloak.d.ts +5 -0
  181. package/dist/plugins/directives/cloak.js +11 -0
  182. package/dist/plugins/directives/cloak.js.map +7 -0
  183. package/dist/plugins/directives/collapse.d.ts +5 -0
  184. package/dist/plugins/directives/collapse.js +42 -0
  185. package/dist/plugins/directives/collapse.js.map +7 -0
  186. package/dist/plugins/directives/declare.d.ts +2 -0
  187. package/dist/plugins/directives/declare.js +13 -0
  188. package/dist/plugins/directives/declare.js.map +7 -0
  189. package/dist/plugins/directives/derive.d.ts +2 -0
  190. package/dist/plugins/directives/derive.js +20 -0
  191. package/dist/plugins/directives/derive.js.map +7 -0
  192. package/dist/plugins/directives/element-ref.d.ts +2 -0
  193. package/dist/plugins/directives/element-ref.js +13 -0
  194. package/dist/plugins/directives/element-ref.js.map +7 -0
  195. package/dist/plugins/directives/event-listener.d.ts +5 -0
  196. package/dist/plugins/directives/event-listener.js +28 -0
  197. package/dist/plugins/directives/event-listener.js.map +7 -0
  198. package/dist/plugins/directives/frame-loop.d.ts +1 -0
  199. package/dist/plugins/directives/frame-loop.js +19 -0
  200. package/dist/plugins/directives/frame-loop.js.map +7 -0
  201. package/dist/plugins/directives/html.d.ts +2 -0
  202. package/dist/plugins/directives/html.js +13 -0
  203. package/dist/plugins/directives/html.js.map +7 -0
  204. package/dist/plugins/directives/inline-style.d.ts +2 -0
  205. package/dist/plugins/directives/inline-style.js +25 -0
  206. package/dist/plugins/directives/inline-style.js.map +7 -0
  207. package/dist/plugins/directives/mask.d.ts +7 -0
  208. package/dist/plugins/directives/mask.js +47 -0
  209. package/dist/plugins/directives/mask.js.map +7 -0
  210. package/dist/plugins/directives/media-query.d.ts +2 -0
  211. package/dist/plugins/directives/media-query.js +19 -0
  212. package/dist/plugins/directives/media-query.js.map +7 -0
  213. package/dist/plugins/directives/on-mount.d.ts +2 -0
  214. package/dist/plugins/directives/on-mount.js +14 -0
  215. package/dist/plugins/directives/on-mount.js.map +7 -0
  216. package/dist/plugins/directives/patch-listener.d.ts +5 -0
  217. package/dist/plugins/directives/patch-listener.js +35 -0
  218. package/dist/plugins/directives/patch-listener.js.map +7 -0
  219. package/dist/plugins/directives/remove-me.d.ts +2 -0
  220. package/dist/plugins/directives/remove-me.js +13 -0
  221. package/dist/plugins/directives/remove-me.js.map +7 -0
  222. package/dist/plugins/directives/scroll-to.d.ts +2 -0
  223. package/dist/plugins/directives/scroll-to.js +19 -0
  224. package/dist/plugins/directives/scroll-to.js.map +7 -0
  225. package/dist/plugins/directives/size-watch.d.ts +1 -0
  226. package/dist/plugins/directives/size-watch.js +17 -0
  227. package/dist/plugins/directives/size-watch.js.map +7 -0
  228. package/dist/plugins/directives/state-dump.d.ts +2 -0
  229. package/dist/plugins/directives/state-dump.js +15 -0
  230. package/dist/plugins/directives/state-dump.js.map +7 -0
  231. package/dist/plugins/directives/storage-sync.d.ts +6 -0
  232. package/dist/plugins/directives/storage-sync.js +16 -0
  233. package/dist/plugins/directives/storage-sync.js.map +7 -0
  234. package/dist/plugins/directives/teleport.d.ts +5 -0
  235. package/dist/plugins/directives/teleport.js +19 -0
  236. package/dist/plugins/directives/teleport.js.map +7 -0
  237. package/dist/plugins/directives/text-content.d.ts +1 -0
  238. package/dist/plugins/directives/text-content.js +13 -0
  239. package/dist/plugins/directives/text-content.js.map +7 -0
  240. package/dist/plugins/directives/timer.d.ts +2 -0
  241. package/dist/plugins/directives/timer.js +18 -0
  242. package/dist/plugins/directives/timer.js.map +7 -0
  243. package/dist/plugins/directives/transition-name.d.ts +1 -0
  244. package/dist/plugins/directives/transition-name.js +11 -0
  245. package/dist/plugins/directives/transition-name.js.map +7 -0
  246. package/dist/plugins/directives/transition.d.ts +5 -0
  247. package/dist/plugins/directives/transition.js +40 -0
  248. package/dist/plugins/directives/transition.js.map +7 -0
  249. package/dist/plugins/directives/trap.d.ts +5 -0
  250. package/dist/plugins/directives/trap.js +48 -0
  251. package/dist/plugins/directives/trap.js.map +7 -0
  252. package/dist/plugins/directives/tween.d.ts +6 -0
  253. package/dist/plugins/directives/tween.js +58 -0
  254. package/dist/plugins/directives/tween.js.map +7 -0
  255. package/dist/plugins/directives/two-way-bind.d.ts +6 -0
  256. package/dist/plugins/directives/two-way-bind.js +82 -0
  257. package/dist/plugins/directives/two-way-bind.js.map +7 -0
  258. package/dist/plugins/directives/url-params.d.ts +13 -0
  259. package/dist/plugins/directives/url-params.js +76 -0
  260. package/dist/plugins/directives/url-params.js.map +7 -0
  261. package/dist/plugins/directives/url-replace.d.ts +1 -0
  262. package/dist/plugins/directives/url-replace.js +11 -0
  263. package/dist/plugins/directives/url-replace.js.map +7 -0
  264. package/dist/plugins/directives/validity.d.ts +2 -0
  265. package/dist/plugins/directives/validity.js +14 -0
  266. package/dist/plugins/directives/validity.js.map +7 -0
  267. package/dist/plugins/directives/viewport.d.ts +2 -0
  268. package/dist/plugins/directives/viewport.js +28 -0
  269. package/dist/plugins/directives/viewport.js.map +7 -0
  270. package/dist/plugins/directives/visibility.d.ts +2 -0
  271. package/dist/plugins/directives/visibility.js +19 -0
  272. package/dist/plugins/directives/visibility.js.map +7 -0
  273. package/dist/plugins/directives/watch.d.ts +2 -0
  274. package/dist/plugins/directives/watch.js +12 -0
  275. package/dist/plugins/directives/watch.js.map +7 -0
  276. package/dist/plugins/functions/bulk-set.d.ts +2 -0
  277. package/dist/plugins/functions/bulk-set.js +11 -0
  278. package/dist/plugins/functions/bulk-set.js.map +7 -0
  279. package/dist/plugins/functions/bulk-toggle.d.ts +2 -0
  280. package/dist/plugins/functions/bulk-toggle.js +11 -0
  281. package/dist/plugins/functions/bulk-toggle.js.map +7 -0
  282. package/dist/plugins/functions/confirm.d.ts +2 -0
  283. package/dist/plugins/functions/confirm.js +6 -0
  284. package/dist/plugins/functions/confirm.js.map +7 -0
  285. package/dist/plugins/functions/copy-text.d.ts +2 -0
  286. package/dist/plugins/functions/copy-text.js +11 -0
  287. package/dist/plugins/functions/copy-text.js.map +7 -0
  288. package/dist/plugins/functions/dispatch.d.ts +2 -0
  289. package/dist/plugins/functions/dispatch.js +9 -0
  290. package/dist/plugins/functions/dispatch.js.map +7 -0
  291. package/dist/plugins/functions/locale-format.d.ts +2 -0
  292. package/dist/plugins/functions/locale-format.js +21 -0
  293. package/dist/plugins/functions/locale-format.js.map +7 -0
  294. package/dist/plugins/functions/range-map.d.ts +2 -0
  295. package/dist/plugins/functions/range-map.js +14 -0
  296. package/dist/plugins/functions/range-map.js.map +7 -0
  297. package/dist/plugins/functions/request.d.ts +30 -0
  298. package/dist/plugins/functions/request.js +152 -0
  299. package/dist/plugins/functions/request.js.map +7 -0
  300. package/dist/plugins/functions/untracked-read.d.ts +2 -0
  301. package/dist/plugins/functions/untracked-read.js +6 -0
  302. package/dist/plugins/functions/untracked-read.js.map +7 -0
  303. package/dist/plugins/functions/websocket.d.ts +11 -0
  304. package/dist/plugins/functions/websocket.js +35 -0
  305. package/dist/plugins/functions/websocket.js.map +7 -0
  306. package/dist/plugins/index.d.ts +52 -0
  307. package/dist/plugins/index.js +108 -0
  308. package/dist/plugins/index.js.map +7 -0
  309. package/dist/plugins/server-events/apply-elements.d.ts +2 -0
  310. package/dist/plugins/server-events/apply-elements.js +62 -0
  311. package/dist/plugins/server-events/apply-elements.js.map +7 -0
  312. package/dist/plugins/server-events/apply-state.d.ts +2 -0
  313. package/dist/plugins/server-events/apply-state.js +18 -0
  314. package/dist/plugins/server-events/apply-state.js.map +7 -0
  315. package/dist/plugins/server-events/morph.d.ts +12 -0
  316. package/dist/plugins/server-events/morph.js +124 -0
  317. package/dist/plugins/server-events/morph.js.map +7 -0
  318. package/dist/presets/all.d.ts +3 -0
  319. package/dist/presets/all.js +112 -0
  320. package/dist/presets/all.js.map +7 -0
  321. package/dist/presets/essentials.d.ts +3 -0
  322. package/dist/presets/essentials.js +18 -0
  323. package/dist/presets/essentials.js.map +7 -0
  324. package/dist/presets/minimal.d.ts +3 -0
  325. package/dist/presets/minimal.js +9 -0
  326. package/dist/presets/minimal.js.map +7 -0
  327. package/dist/sigmx.auto.js +5 -0
  328. package/dist/sigmx.standalone.js +1 -0
  329. package/dist/standalone.d.ts +1 -0
  330. package/dist/standalone.js +8 -0
  331. package/dist/standalone.js.map +7 -0
  332. package/dist/utils/object.d.ts +9 -0
  333. package/dist/utils/object.js +26 -0
  334. package/dist/utils/object.js.map +7 -0
  335. package/dist/utils/text.d.ts +7 -0
  336. package/dist/utils/text.js +15 -0
  337. package/dist/utils/text.js.map +7 -0
  338. package/dist/utils/timing.d.ts +14 -0
  339. package/dist/utils/timing.js +58 -0
  340. package/dist/utils/timing.js.map +7 -0
  341. package/dist/vite.d.ts +42 -0
  342. package/dist/vite.js +79 -0
  343. package/dist/vite.js.map +7 -0
  344. package/package.json +111 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/plugins/functions/request.ts"],
4
+ "sourcesContent": ["import { action, untracked, type ActionCtx, type Filter } from '../../kernel/index.js'\nimport { camel } from '../../lib/casing.js'\nimport { parseFields, readEvents } from '../../lib/sse.js'\n\nexport type RequestOptions = {\n headers?: Record<string, string>\n /** 'json' (default) sends filtered signals; 'form' serialises the closest (or `selector`) form. */\n contentType?: 'json' | 'form'\n selector?: string\n /** Which signals to send. Default: everything except paths starting with `_`. */\n filter?: Filter\n /** Explicit body instead of signals. */\n payload?: unknown\n /** 'replace' (default) aborts an earlier request with the same method and URL; 'none' lets them overlap. */\n abort?: 'replace' | 'none' | AbortController\n /** Keep the connection open while the tab is hidden. Default: true except for GET streams. */\n openWhenHidden?: boolean\n /** Reconnect after a stream closes normally (long-lived event streams). */\n reconnect?: boolean\n retry?: { attempts?: number; interval?: number; factor?: number; max?: number; onStatusError?: boolean }\n}\n\nconst inflight = new Map<string, AbortController>()\nlet seq = 0\nconst sleep = (ms: number, signal: AbortSignal) =>\n new Promise<void>((resolve) => {\n const t = setTimeout(resolve, ms)\n signal.addEventListener('abort', () => (clearTimeout(t), resolve()), { once: true })\n })\nconst untilVisible = () =>\n new Promise<void>((resolve) => document.addEventListener('visibilitychange', () => !document.hidden && resolve(), { once: true }))\n\nconst headerArgs = (res: Response, names: string[], data: Record<string, string>) => {\n for (const n of names) {\n const v = res.headers.get(`sigmx-${n}`)\n if (v) data[camel(n)] = v\n }\n return data\n}\n\nconst runScript = (text: string) => {\n const s = document.createElement('script')\n s.text = text\n document.head.append(s)\n s.remove()\n}\n\nconst send = async (method: string, ctx: ActionCtx, url: string, o: RequestOptions = {}): Promise<void> => {\n const { el, evt, store, runtime, error } = ctx\n if (!url) throw error(`@${method.toLowerCase()} needs a URL`)\n const key = `${method} ${url}`\n const ac = o.abort instanceof AbortController ? o.abort : new AbortController()\n if (o.abort !== 'none') {\n inflight.get(key)?.abort()\n inflight.set(key, ac)\n }\n ctx.cleanup(() => ac.abort())\n const rid = ++seq\n const emit = (type: string, extra: Record<string, unknown> = {}) => runtime.emit('fetch', { el, type, method, url, rid, ...extra })\n const retry = { attempts: 5, interval: 1000, factor: 2, max: 30_000, onStatusError: false, ...o.retry }\n const pauseWhenHidden = !(o.openWhenHidden ?? method !== 'GET')\n const bodyAllowed = method !== 'GET' && method !== 'DELETE'\n\n const build = (): { url: string; init: RequestInit } | undefined => {\n const u = new URL(url, location.href)\n const headers: Record<string, string> = {\n Accept: 'text/event-stream, text/html, application/json',\n 'Sigmx-Request': 'true',\n ...o.headers,\n }\n let body: BodyInit | undefined\n if ((o.contentType ?? 'json') === 'json') {\n const payload = o.payload ?? untracked(() => store.snapshot(o.filter ?? { exclude: /(^|\\.)_/ }))\n const json = JSON.stringify(payload)\n if (bodyAllowed) {\n body = json\n headers['Content-Type'] ??= 'application/json'\n } else u.searchParams.set('sigmx', json)\n } else {\n const form = (o.selector ? document.querySelector(o.selector) : el.closest('form')) as HTMLFormElement | null\n if (!form) throw error('no form found', { selector: o.selector })\n if (!form.noValidate && !form.checkValidity()) {\n form.reportValidity()\n return\n }\n const submitter = evt instanceof SubmitEvent ? evt.submitter : el instanceof HTMLButtonElement ? el : null\n const fd = new FormData(form, submitter)\n const multipart = form.enctype === 'multipart/form-data'\n if (bodyAllowed) {\n body = multipart ? fd : new URLSearchParams(fd as unknown as Record<string, string>)\n if (!multipart) headers['Content-Type'] = 'application/x-www-form-urlencoded'\n } else {\n for (const [k, v] of new URLSearchParams(fd as unknown as Record<string, string>)) u.searchParams.append(k, v)\n }\n }\n return { url: u.toString(), init: { method, headers, body } }\n }\n\n const route = (event: string, data: string) => {\n const fields = parseFields(data)\n runtime.emit('server-event', { el, event, data: fields })\n runtime.handle(event, fields)\n }\n\n let attempt = 0\n let wait = retry.interval\n let lastId: string | undefined\n const backoff = async () => {\n if (attempt++ >= retry.attempts) throw new Error('retries exhausted')\n emit('retrying', { attempt })\n await sleep(wait, ac.signal)\n wait = Math.min(wait * retry.factor, retry.max)\n }\n\n emit('started')\n try {\n while (!ac.signal.aborted) {\n const req = build()\n if (!req) return\n if (lastId) (req.init.headers as Record<string, string>)['Last-Event-ID'] = lastId\n const hide = new AbortController()\n const onHide = () => document.hidden && hide.abort()\n if (pauseWhenHidden) document.addEventListener('visibilitychange', onHide)\n try {\n const res = await fetch(req.url, { ...req.init, signal: AbortSignal.any([ac.signal, hide.signal]) })\n const ct = res.headers.get('content-type') ?? ''\n if (res.status >= 400) {\n emit('error', { status: res.status })\n if (!retry.onStatusError) return\n await backoff()\n continue\n }\n if (res.status === 204 || res.status === 304 || !res.body) return\n if (ct.includes('text/event-stream')) {\n attempt = 0\n wait = retry.interval\n await readEvents(res.body, (e) => {\n if (e.id !== undefined) lastId = e.id\n if (e.retry) wait = retry.interval = e.retry\n route(e.event, e.data)\n })\n if (!o.reconnect) return\n await backoff()\n continue\n }\n const text = await res.text()\n if (ct.includes('text/html')) runtime.handle('patch-elements', headerArgs(res, ['selector', 'mode', 'use-view-transition'], { elements: text }))\n else if (ct.includes('application/json')) runtime.handle('patch-signals', headerArgs(res, ['only-if-missing'], { signals: text }))\n else if (ct.includes('javascript')) runScript(text)\n return\n } catch {\n if (ac.signal.aborted) return\n if (hide.signal.aborted) await untilVisible()\n else await backoff()\n } finally {\n document.removeEventListener('visibilitychange', onHide)\n }\n }\n } catch (e: any) {\n emit('error', { message: e?.message })\n throw error(`${method} ${url}: ${e?.message ?? e}`)\n } finally {\n emit('finished')\n if (inflight.get(key) === ac) inflight.delete(key)\n }\n}\n\nconst make = (name: string, method: string) => action({ name, call: (ctx, url: string, o?: RequestOptions) => send(method, ctx, url, o) })\n\n/** `@get(url, options)`: signals travel in the `sigmx` query parameter. */\nexport const httpGet = make('get', 'GET')\nexport const httpPost = make('post', 'POST')\nexport const httpPut = make('put', 'PUT')\nexport const httpPatch = make('patch', 'PATCH')\nexport const httpDelete = make('delete', 'DELETE')\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ /** `@peek(() => $x)` reads signals without subscribing the surrounding effect. */
2
+ export declare const peek: import("../../kernel/contracts.js").ActionPlugin;
@@ -0,0 +1,6 @@
1
+ import { action, untracked } from "../../kernel/index.js";
2
+ const peek = action({ name: "peek", call: (_, fn) => untracked(fn) });
3
+ export {
4
+ peek
5
+ };
6
+ //# sourceMappingURL=untracked-read.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/plugins/functions/untracked-read.ts"],
4
+ "sourcesContent": ["import { action, untracked } from '../../kernel/index.js'\n\n/** `@peek(() => $x)` reads signals without subscribing the surrounding effect. */\nexport const peek = action({ name: 'peek', call: (_, fn: () => unknown) => untracked(fn) })\n"],
5
+ "mappings": "AAAA,SAAS,QAAQ,iBAAiB;AAG3B,MAAM,OAAO,OAAO,EAAE,MAAM,QAAQ,MAAM,CAAC,GAAG,OAAsB,UAAU,EAAE,EAAE,CAAC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,11 @@
1
+ export type Socket = {
2
+ send(data: unknown): void;
3
+ close(): void;
4
+ readonly socket: WebSocket;
5
+ };
6
+ /**
7
+ * `@ws('/live')` opens a WebSocket and routes incoming messages like a server event stream: text
8
+ * blocks of `event: name` and `data: key value` lines, separated by blank lines. Returns
9
+ * `{ send, close, socket }`; `send` JSON-encodes objects. The socket closes when the element unmounts.
10
+ */
11
+ export declare const websocket: import("../../kernel/contracts.js").ActionPlugin;
@@ -0,0 +1,35 @@
1
+ import { action } from "../../kernel/index.js";
2
+ const websocket = action({
3
+ name: "ws",
4
+ call({ el, runtime, cleanup }, url, o = {}) {
5
+ const socket = new WebSocket(new URL(url, location.href.replace(/^http/, "ws")), o.protocols);
6
+ socket.onmessage = (m) => {
7
+ for (const block of String(m.data).split(/\n\n+/)) {
8
+ let event = "message";
9
+ const data = {};
10
+ for (const line of block.split("\n")) {
11
+ const i = line.indexOf(":");
12
+ if (i < 0) continue;
13
+ const field = line.slice(0, i);
14
+ const v = line.slice(i + 1).trimStart();
15
+ if (field === "event") event = v;
16
+ else if (field === "data") {
17
+ const j = v.indexOf(" ");
18
+ const k = j < 0 ? v : v.slice(0, j);
19
+ const val = j < 0 ? "" : v.slice(j + 1);
20
+ data[k] = k in data ? `${data[k]}
21
+ ${val}` : val;
22
+ }
23
+ }
24
+ runtime.emit("server-event", { el, event, data });
25
+ runtime.handle(event, data);
26
+ }
27
+ };
28
+ cleanup(() => socket.close());
29
+ return { send: (d) => socket.send(typeof d === "string" ? d : JSON.stringify(d)), close: () => socket.close(), socket };
30
+ }
31
+ });
32
+ export {
33
+ websocket
34
+ };
35
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/plugins/functions/websocket.ts"],
4
+ "sourcesContent": ["import { action } from '../../kernel/index.js'\n\nexport type Socket = { send(data: unknown): void; close(): void; readonly socket: WebSocket }\n\n/**\n * `@ws('/live')` opens a WebSocket and routes incoming messages like a server event stream: text\n * blocks of `event: name` and `data: key value` lines, separated by blank lines. Returns\n * `{ send, close, socket }`; `send` JSON-encodes objects. The socket closes when the element unmounts.\n */\nexport const websocket = action({\n name: 'ws',\n call({ el, runtime, cleanup }, url: string, o: { protocols?: string | string[] } = {}): Socket {\n const socket = new WebSocket(new URL(url, location.href.replace(/^http/, 'ws')), o.protocols)\n socket.onmessage = (m) => {\n for (const block of String(m.data).split(/\\n\\n+/)) {\n let event = 'message'\n const data: Record<string, string> = {}\n for (const line of block.split('\\n')) {\n const i = line.indexOf(':')\n if (i < 0) continue\n const field = line.slice(0, i)\n const v = line.slice(i + 1).trimStart()\n if (field === 'event') event = v\n else if (field === 'data') {\n const j = v.indexOf(' ')\n const k = j < 0 ? v : v.slice(0, j)\n const val = j < 0 ? '' : v.slice(j + 1)\n data[k] = k in data ? `${data[k]}\\n${val}` : val\n }\n }\n runtime.emit('server-event', { el, event, data })\n runtime.handle(event, data)\n }\n }\n cleanup(() => socket.close())\n return { send: (d) => socket.send(typeof d === 'string' ? d : JSON.stringify(d)), close: () => socket.close(), socket }\n },\n})\n"],
5
+ "mappings": "AAAA,SAAS,cAAc;AAShB,MAAM,YAAY,OAAO;AAAA,EAC9B,MAAM;AAAA,EACN,KAAK,EAAE,IAAI,SAAS,QAAQ,GAAG,KAAa,IAAuC,CAAC,GAAW;AAC7F,UAAM,SAAS,IAAI,UAAU,IAAI,IAAI,KAAK,SAAS,KAAK,QAAQ,SAAS,IAAI,CAAC,GAAG,EAAE,SAAS;AAC5F,WAAO,YAAY,CAAC,MAAM;AACxB,iBAAW,SAAS,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,GAAG;AACjD,YAAI,QAAQ;AACZ,cAAM,OAA+B,CAAC;AACtC,mBAAW,QAAQ,MAAM,MAAM,IAAI,GAAG;AACpC,gBAAM,IAAI,KAAK,QAAQ,GAAG;AAC1B,cAAI,IAAI,EAAG;AACX,gBAAM,QAAQ,KAAK,MAAM,GAAG,CAAC;AAC7B,gBAAM,IAAI,KAAK,MAAM,IAAI,CAAC,EAAE,UAAU;AACtC,cAAI,UAAU,QAAS,SAAQ;AAAA,mBACtB,UAAU,QAAQ;AACzB,kBAAM,IAAI,EAAE,QAAQ,GAAG;AACvB,kBAAM,IAAI,IAAI,IAAI,IAAI,EAAE,MAAM,GAAG,CAAC;AAClC,kBAAM,MAAM,IAAI,IAAI,KAAK,EAAE,MAAM,IAAI,CAAC;AACtC,iBAAK,CAAC,IAAI,KAAK,OAAO,GAAG,KAAK,CAAC,CAAC;AAAA,EAAK,GAAG,KAAK;AAAA,UAC/C;AAAA,QACF;AACA,gBAAQ,KAAK,gBAAgB,EAAE,IAAI,OAAO,KAAK,CAAC;AAChD,gBAAQ,OAAO,OAAO,IAAI;AAAA,MAC5B;AAAA,IACF;AACA,YAAQ,MAAM,OAAO,MAAM,CAAC;AAC5B,WAAO,EAAE,MAAM,CAAC,MAAM,OAAO,KAAK,OAAO,MAAM,WAAW,IAAI,KAAK,UAAU,CAAC,CAAC,GAAG,OAAO,MAAM,OAAO,MAAM,GAAG,OAAO;AAAA,EACxH;AACF,CAAC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,52 @@
1
+ export { attr } from './directives/attribute-sync.js';
2
+ export { bind } from './directives/two-way-bind.js';
3
+ export { className } from './directives/class-toggle.js';
4
+ export { computed } from './directives/derive.js';
5
+ export { customValidity } from './directives/validity.js';
6
+ export { effect } from './directives/watch.js';
7
+ export { indicator } from './directives/busy-flag.js';
8
+ export { init } from './directives/on-mount.js';
9
+ export { jsonSignals } from './directives/state-dump.js';
10
+ export { matchMedia } from './directives/media-query.js';
11
+ export { on } from './directives/event-listener.js';
12
+ export { onIntersect } from './directives/viewport.js';
13
+ export { onInterval } from './directives/timer.js';
14
+ export { onRaf } from './directives/frame-loop.js';
15
+ export { onResize } from './directives/size-watch.js';
16
+ export { onSignalPatch } from './directives/patch-listener.js';
17
+ export { persist } from './directives/storage-sync.js';
18
+ export { queryString } from './directives/url-params.js';
19
+ export { ref } from './directives/element-ref.js';
20
+ export { replaceUrl } from './directives/url-replace.js';
21
+ export { scrollIntoView } from './directives/scroll-to.js';
22
+ export { show } from './directives/visibility.js';
23
+ export { signals } from './directives/declare.js';
24
+ export { style } from './directives/inline-style.js';
25
+ export { text } from './directives/text-content.js';
26
+ export { viewTransition } from './directives/transition-name.js';
27
+ export { clipboard } from './functions/copy-text.js';
28
+ export { fit } from './functions/range-map.js';
29
+ export { intl } from './functions/locale-format.js';
30
+ export { peek } from './functions/untracked-read.js';
31
+ export { setAll } from './functions/bulk-set.js';
32
+ export { toggleAll } from './functions/bulk-toggle.js';
33
+ export { animate } from './directives/tween.js';
34
+ export { httpDelete, httpGet, httpPatch, httpPost, httpPut } from './functions/request.js';
35
+ export type { RequestOptions } from './functions/request.js';
36
+ export { applyElements } from './server-events/apply-elements.js';
37
+ export { applyState } from './server-events/apply-state.js';
38
+ export { activateScripts, morph, morphInner } from './server-events/morph.js';
39
+ export type { MorphOptions } from './server-events/morph.js';
40
+ export { boost } from './directives/boost.js';
41
+ export { cloak } from './directives/cloak.js';
42
+ export { collapse } from './directives/collapse.js';
43
+ export { html } from './directives/html.js';
44
+ export { applyMask, mask } from './directives/mask.js';
45
+ export { removeMe } from './directives/remove-me.js';
46
+ export { teleport } from './directives/teleport.js';
47
+ export { transition } from './directives/transition.js';
48
+ export { trap } from './directives/trap.js';
49
+ export { confirm } from './functions/confirm.js';
50
+ export { dispatch } from './functions/dispatch.js';
51
+ export { websocket } from './functions/websocket.js';
52
+ export type { Socket } from './functions/websocket.js';
@@ -0,0 +1,108 @@
1
+ import { attr } from "./directives/attribute-sync.js";
2
+ import { bind } from "./directives/two-way-bind.js";
3
+ import { className } from "./directives/class-toggle.js";
4
+ import { computed } from "./directives/derive.js";
5
+ import { customValidity } from "./directives/validity.js";
6
+ import { effect } from "./directives/watch.js";
7
+ import { indicator } from "./directives/busy-flag.js";
8
+ import { init } from "./directives/on-mount.js";
9
+ import { jsonSignals } from "./directives/state-dump.js";
10
+ import { matchMedia } from "./directives/media-query.js";
11
+ import { on } from "./directives/event-listener.js";
12
+ import { onIntersect } from "./directives/viewport.js";
13
+ import { onInterval } from "./directives/timer.js";
14
+ import { onRaf } from "./directives/frame-loop.js";
15
+ import { onResize } from "./directives/size-watch.js";
16
+ import { onSignalPatch } from "./directives/patch-listener.js";
17
+ import { persist } from "./directives/storage-sync.js";
18
+ import { queryString } from "./directives/url-params.js";
19
+ import { ref } from "./directives/element-ref.js";
20
+ import { replaceUrl } from "./directives/url-replace.js";
21
+ import { scrollIntoView } from "./directives/scroll-to.js";
22
+ import { show } from "./directives/visibility.js";
23
+ import { signals } from "./directives/declare.js";
24
+ import { style } from "./directives/inline-style.js";
25
+ import { text } from "./directives/text-content.js";
26
+ import { viewTransition } from "./directives/transition-name.js";
27
+ import { clipboard } from "./functions/copy-text.js";
28
+ import { fit } from "./functions/range-map.js";
29
+ import { intl } from "./functions/locale-format.js";
30
+ import { peek } from "./functions/untracked-read.js";
31
+ import { setAll } from "./functions/bulk-set.js";
32
+ import { toggleAll } from "./functions/bulk-toggle.js";
33
+ import { animate } from "./directives/tween.js";
34
+ import { httpDelete, httpGet, httpPatch, httpPost, httpPut } from "./functions/request.js";
35
+ import { applyElements } from "./server-events/apply-elements.js";
36
+ import { applyState } from "./server-events/apply-state.js";
37
+ import { activateScripts, morph, morphInner } from "./server-events/morph.js";
38
+ import { boost } from "./directives/boost.js";
39
+ import { cloak } from "./directives/cloak.js";
40
+ import { collapse } from "./directives/collapse.js";
41
+ import { html } from "./directives/html.js";
42
+ import { applyMask, mask } from "./directives/mask.js";
43
+ import { removeMe } from "./directives/remove-me.js";
44
+ import { teleport } from "./directives/teleport.js";
45
+ import { transition } from "./directives/transition.js";
46
+ import { trap } from "./directives/trap.js";
47
+ import { confirm } from "./functions/confirm.js";
48
+ import { dispatch } from "./functions/dispatch.js";
49
+ import { websocket } from "./functions/websocket.js";
50
+ export {
51
+ activateScripts,
52
+ animate,
53
+ applyElements,
54
+ applyMask,
55
+ applyState,
56
+ attr,
57
+ bind,
58
+ boost,
59
+ className,
60
+ clipboard,
61
+ cloak,
62
+ collapse,
63
+ computed,
64
+ confirm,
65
+ customValidity,
66
+ dispatch,
67
+ effect,
68
+ fit,
69
+ html,
70
+ httpDelete,
71
+ httpGet,
72
+ httpPatch,
73
+ httpPost,
74
+ httpPut,
75
+ indicator,
76
+ init,
77
+ intl,
78
+ jsonSignals,
79
+ mask,
80
+ matchMedia,
81
+ morph,
82
+ morphInner,
83
+ on,
84
+ onIntersect,
85
+ onInterval,
86
+ onRaf,
87
+ onResize,
88
+ onSignalPatch,
89
+ peek,
90
+ persist,
91
+ queryString,
92
+ ref,
93
+ removeMe,
94
+ replaceUrl,
95
+ scrollIntoView,
96
+ setAll,
97
+ show,
98
+ signals,
99
+ style,
100
+ teleport,
101
+ text,
102
+ toggleAll,
103
+ transition,
104
+ trap,
105
+ viewTransition,
106
+ websocket
107
+ };
108
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/plugins/index.ts"],
4
+ "sourcesContent": ["// Pure re-exports: nothing registers on import, so bundlers keep only what you use.\nexport { attr } from './directives/attribute-sync.js'\nexport { bind } from './directives/two-way-bind.js'\nexport { className } from './directives/class-toggle.js'\nexport { computed } from './directives/derive.js'\nexport { customValidity } from './directives/validity.js'\nexport { effect } from './directives/watch.js'\nexport { indicator } from './directives/busy-flag.js'\nexport { init } from './directives/on-mount.js'\nexport { jsonSignals } from './directives/state-dump.js'\nexport { matchMedia } from './directives/media-query.js'\nexport { on } from './directives/event-listener.js'\nexport { onIntersect } from './directives/viewport.js'\nexport { onInterval } from './directives/timer.js'\nexport { onRaf } from './directives/frame-loop.js'\nexport { onResize } from './directives/size-watch.js'\nexport { onSignalPatch } from './directives/patch-listener.js'\nexport { persist } from './directives/storage-sync.js'\nexport { queryString } from './directives/url-params.js'\nexport { ref } from './directives/element-ref.js'\nexport { replaceUrl } from './directives/url-replace.js'\nexport { scrollIntoView } from './directives/scroll-to.js'\nexport { show } from './directives/visibility.js'\nexport { signals } from './directives/declare.js'\nexport { style } from './directives/inline-style.js'\nexport { text } from './directives/text-content.js'\nexport { viewTransition } from './directives/transition-name.js'\nexport { clipboard } from './functions/copy-text.js'\nexport { fit } from './functions/range-map.js'\nexport { intl } from './functions/locale-format.js'\nexport { peek } from './functions/untracked-read.js'\nexport { setAll } from './functions/bulk-set.js'\nexport { toggleAll } from './functions/bulk-toggle.js'\nexport { animate } from './directives/tween.js'\nexport { httpDelete, httpGet, httpPatch, httpPost, httpPut } from './functions/request.js'\nexport type { RequestOptions } from './functions/request.js'\nexport { applyElements } from './server-events/apply-elements.js'\nexport { applyState } from './server-events/apply-state.js'\nexport { activateScripts, morph, morphInner } from './server-events/morph.js'\nexport type { MorphOptions } from './server-events/morph.js'\n// ecosystem plugins (Alpine, htmx equivalents)\nexport { boost } from './directives/boost.js'\nexport { cloak } from './directives/cloak.js'\nexport { collapse } from './directives/collapse.js'\nexport { html } from './directives/html.js'\nexport { applyMask, mask } from './directives/mask.js'\nexport { removeMe } from './directives/remove-me.js'\nexport { teleport } from './directives/teleport.js'\nexport { transition } from './directives/transition.js'\nexport { trap } from './directives/trap.js'\nexport { confirm } from './functions/confirm.js'\nexport { dispatch } from './functions/dispatch.js'\nexport { websocket } from './functions/websocket.js'\nexport type { Socket } from './functions/websocket.js'\n"],
5
+ "mappings": "AACA,SAAS,YAAY;AACrB,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,SAAS,YAAY;AACrB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,UAAU;AACnB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAC9B,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAC5B,SAAS,WAAW;AACpB,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,YAAY;AACrB,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AAC1B,SAAS,WAAW;AACpB,SAAS,YAAY;AACrB,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AACxB,SAAS,YAAY,SAAS,WAAW,UAAU,eAAe;AAElE,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB;AAC3B,SAAS,iBAAiB,OAAO,kBAAkB;AAGnD,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,WAAW,YAAY;AAChC,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ /** Server event `patch-elements`: `elements <html>`, `selector`, `mode`, `useViewTransition true`. */
2
+ export declare const applyElements: import("../../kernel/contracts.js").HandlerPlugin;
@@ -0,0 +1,62 @@
1
+ import { handler } from "../../kernel/index.js";
2
+ import { activateScripts, morph, morphInner } from "./morph.js";
3
+ const MODES = ["outer", "inner", "replace", "prepend", "append", "before", "after", "remove"];
4
+ const parse = (html) => {
5
+ if (/<\/(html|head|body)>/i.test(html)) return new DOMParser().parseFromString(html, "text/html");
6
+ const t = document.createElement("template");
7
+ t.innerHTML = html;
8
+ return t.content;
9
+ };
10
+ const apply = (runtime, html, selector, mode) => {
11
+ const o = { ignoreAttr: runtime.attr("ignore-morph"), preserveAttr: runtime.attr("preserve-attr") };
12
+ const parsed = parse(html);
13
+ if (parsed instanceof Document) {
14
+ if (parsed.head.childNodes.length) morphInner(document.head, parsed.head, o);
15
+ morph(document.body, parsed.body, o);
16
+ return;
17
+ }
18
+ const frag = parsed;
19
+ if (mode === "remove") {
20
+ for (const t of document.querySelectorAll(selector)) t.remove();
21
+ return;
22
+ }
23
+ if (!selector) {
24
+ if (mode !== "outer" && mode !== "replace") throw new Error(`patch-elements mode "${mode}" needs a selector`);
25
+ for (const child of [...frag.children]) {
26
+ const target = child.id && document.getElementById(child.id);
27
+ if (!target) {
28
+ console.warn("patch-elements: no element with id", child.id);
29
+ continue;
30
+ }
31
+ if (mode === "outer") morph(target, child, o);
32
+ else target.replaceWith(child), activateScripts(child);
33
+ }
34
+ return;
35
+ }
36
+ const targets = [...document.querySelectorAll(selector)];
37
+ if (!targets.length) console.warn("patch-elements: no elements match", selector);
38
+ targets.forEach((t, i) => {
39
+ const content = i === targets.length - 1 ? frag : frag.cloneNode(true);
40
+ const nodes = [...content.childNodes];
41
+ if (mode === "outer" && nodes.length === 1 && isElement(nodes[0])) morph(t, nodes[0], o);
42
+ else if (mode === "inner") morphInner(t, content, o);
43
+ else {
44
+ if (mode === "outer" || mode === "replace") t.replaceWith(content);
45
+ else t[mode](content);
46
+ for (const n of nodes) activateScripts(n);
47
+ }
48
+ });
49
+ };
50
+ const isElement = (n) => n.nodeType === 1;
51
+ const applyElements = handler({
52
+ name: "patch-elements",
53
+ handle(runtime, { elements = "", selector = "", mode = "outer", useViewTransition }) {
54
+ if (!MODES.includes(mode)) throw new Error(`patch-elements: unknown mode "${mode}"`);
55
+ const run = () => apply(runtime, elements, selector, mode);
56
+ useViewTransition === "true" && "startViewTransition" in document ? document.startViewTransition(run) : run();
57
+ }
58
+ });
59
+ export {
60
+ applyElements
61
+ };
62
+ //# sourceMappingURL=apply-elements.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/plugins/server-events/apply-elements.ts"],
4
+ "sourcesContent": ["import { handler, type Runtime } from '../../kernel/index.js'\nimport { activateScripts, morph, morphInner } from './morph.js'\n\nconst MODES = ['outer', 'inner', 'replace', 'prepend', 'append', 'before', 'after', 'remove'] as const\ntype Mode = (typeof MODES)[number]\n\nconst parse = (html: string): DocumentFragment | Document => {\n if (/<\\/(html|head|body)>/i.test(html)) return new DOMParser().parseFromString(html, 'text/html')\n const t = document.createElement('template')\n t.innerHTML = html\n return t.content\n}\n\nconst apply = (runtime: Runtime, html: string, selector: string, mode: Mode): void => {\n const o = { ignoreAttr: runtime.attr('ignore-morph'), preserveAttr: runtime.attr('preserve-attr') }\n const parsed = parse(html)\n if (parsed instanceof Document) {\n if (parsed.head.childNodes.length) morphInner(document.head, parsed.head, o)\n morph(document.body, parsed.body, o)\n return\n }\n const frag = parsed\n if (mode === 'remove') {\n for (const t of document.querySelectorAll(selector)) t.remove()\n return\n }\n if (!selector) {\n if (mode !== 'outer' && mode !== 'replace') throw new Error(`patch-elements mode \"${mode}\" needs a selector`)\n for (const child of [...frag.children]) {\n const target = child.id && document.getElementById(child.id)\n if (!target) {\n console.warn('patch-elements: no element with id', child.id)\n continue\n }\n if (mode === 'outer') morph(target, child, o)\n else (target.replaceWith(child), activateScripts(child))\n }\n return\n }\n const targets = [...document.querySelectorAll(selector)]\n if (!targets.length) console.warn('patch-elements: no elements match', selector)\n targets.forEach((t, i) => {\n const content = i === targets.length - 1 ? frag : (frag.cloneNode(true) as DocumentFragment)\n const nodes = [...content.childNodes]\n if (mode === 'outer' && nodes.length === 1 && isElement(nodes[0])) morph(t, nodes[0], o)\n else if (mode === 'inner') morphInner(t, content, o)\n else {\n if (mode === 'outer' || mode === 'replace') t.replaceWith(content)\n else t[mode](content)\n for (const n of nodes) activateScripts(n)\n }\n })\n}\n\nconst isElement = (n: Node): n is Element => n.nodeType === 1\n\n/** Server event `patch-elements`: `elements <html>`, `selector`, `mode`, `useViewTransition true`. */\nexport const applyElements = handler({\n name: 'patch-elements',\n handle(runtime, { elements = '', selector = '', mode = 'outer', useViewTransition }) {\n if (!MODES.includes(mode as Mode)) throw new Error(`patch-elements: unknown mode \"${mode}\"`)\n const run = () => apply(runtime, elements, selector, mode as Mode)\n useViewTransition === 'true' && 'startViewTransition' in document ? document.startViewTransition(run) : run()\n },\n})\n"],
5
+ "mappings": "AAAA,SAAS,eAA6B;AACtC,SAAS,iBAAiB,OAAO,kBAAkB;AAEnD,MAAM,QAAQ,CAAC,SAAS,SAAS,WAAW,WAAW,UAAU,UAAU,SAAS,QAAQ;AAG5F,MAAM,QAAQ,CAAC,SAA8C;AAC3D,MAAI,wBAAwB,KAAK,IAAI,EAAG,QAAO,IAAI,UAAU,EAAE,gBAAgB,MAAM,WAAW;AAChG,QAAM,IAAI,SAAS,cAAc,UAAU;AAC3C,IAAE,YAAY;AACd,SAAO,EAAE;AACX;AAEA,MAAM,QAAQ,CAAC,SAAkB,MAAc,UAAkB,SAAqB;AACpF,QAAM,IAAI,EAAE,YAAY,QAAQ,KAAK,cAAc,GAAG,cAAc,QAAQ,KAAK,eAAe,EAAE;AAClG,QAAM,SAAS,MAAM,IAAI;AACzB,MAAI,kBAAkB,UAAU;AAC9B,QAAI,OAAO,KAAK,WAAW,OAAQ,YAAW,SAAS,MAAM,OAAO,MAAM,CAAC;AAC3E,UAAM,SAAS,MAAM,OAAO,MAAM,CAAC;AACnC;AAAA,EACF;AACA,QAAM,OAAO;AACb,MAAI,SAAS,UAAU;AACrB,eAAW,KAAK,SAAS,iBAAiB,QAAQ,EAAG,GAAE,OAAO;AAC9D;AAAA,EACF;AACA,MAAI,CAAC,UAAU;AACb,QAAI,SAAS,WAAW,SAAS,UAAW,OAAM,IAAI,MAAM,wBAAwB,IAAI,oBAAoB;AAC5G,eAAW,SAAS,CAAC,GAAG,KAAK,QAAQ,GAAG;AACtC,YAAM,SAAS,MAAM,MAAM,SAAS,eAAe,MAAM,EAAE;AAC3D,UAAI,CAAC,QAAQ;AACX,gBAAQ,KAAK,sCAAsC,MAAM,EAAE;AAC3D;AAAA,MACF;AACA,UAAI,SAAS,QAAS,OAAM,QAAQ,OAAO,CAAC;AAAA,UACvC,CAAC,OAAO,YAAY,KAAK,GAAG,gBAAgB,KAAK;AAAA,IACxD;AACA;AAAA,EACF;AACA,QAAM,UAAU,CAAC,GAAG,SAAS,iBAAiB,QAAQ,CAAC;AACvD,MAAI,CAAC,QAAQ,OAAQ,SAAQ,KAAK,qCAAqC,QAAQ;AAC/E,UAAQ,QAAQ,CAAC,GAAG,MAAM;AACxB,UAAM,UAAU,MAAM,QAAQ,SAAS,IAAI,OAAQ,KAAK,UAAU,IAAI;AACtE,UAAM,QAAQ,CAAC,GAAG,QAAQ,UAAU;AACpC,QAAI,SAAS,WAAW,MAAM,WAAW,KAAK,UAAU,MAAM,CAAC,CAAC,EAAG,OAAM,GAAG,MAAM,CAAC,GAAG,CAAC;AAAA,aAC9E,SAAS,QAAS,YAAW,GAAG,SAAS,CAAC;AAAA,SAC9C;AACH,UAAI,SAAS,WAAW,SAAS,UAAW,GAAE,YAAY,OAAO;AAAA,UAC5D,GAAE,IAAI,EAAE,OAAO;AACpB,iBAAW,KAAK,MAAO,iBAAgB,CAAC;AAAA,IAC1C;AAAA,EACF,CAAC;AACH;AAEA,MAAM,YAAY,CAAC,MAA0B,EAAE,aAAa;AAGrD,MAAM,gBAAgB,QAAQ;AAAA,EACnC,MAAM;AAAA,EACN,OAAO,SAAS,EAAE,WAAW,IAAI,WAAW,IAAI,OAAO,SAAS,kBAAkB,GAAG;AACnF,QAAI,CAAC,MAAM,SAAS,IAAY,EAAG,OAAM,IAAI,MAAM,iCAAiC,IAAI,GAAG;AAC3F,UAAM,MAAM,MAAM,MAAM,SAAS,UAAU,UAAU,IAAY;AACjE,0BAAsB,UAAU,yBAAyB,WAAW,SAAS,oBAAoB,GAAG,IAAI,IAAI;AAAA,EAC9G;AACF,CAAC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ /** Server event `patch-signals`: `signals {json}` merged into the store; `onlyIfMissing true` keeps existing values. */
2
+ export declare const applyState: import("../../kernel/contracts.js").HandlerPlugin;
@@ -0,0 +1,18 @@
1
+ import { handler } from "../../kernel/index.js";
2
+ const applyState = handler({
3
+ name: "patch-signals",
4
+ handle(runtime, { signals, onlyIfMissing }) {
5
+ if (!signals) return;
6
+ let patch;
7
+ try {
8
+ patch = JSON.parse(signals);
9
+ } catch {
10
+ patch = runtime.compiler([], `return (${signals})`)();
11
+ }
12
+ runtime.store.merge(patch, { ifMissing: onlyIfMissing === "true" });
13
+ }
14
+ });
15
+ export {
16
+ applyState
17
+ };
18
+ //# sourceMappingURL=apply-state.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/plugins/server-events/apply-state.ts"],
4
+ "sourcesContent": ["import { handler } from '../../kernel/index.js'\n\n/** Server event `patch-signals`: `signals {json}` merged into the store; `onlyIfMissing true` keeps existing values. */\nexport const applyState = handler({\n name: 'patch-signals',\n handle(runtime, { signals, onlyIfMissing }) {\n if (!signals) return\n let patch: Record<string, unknown>\n try {\n patch = JSON.parse(signals)\n } catch {\n patch = runtime.compiler([], `return (${signals})`)()\n }\n runtime.store.merge(patch, { ifMissing: onlyIfMissing === 'true' })\n },\n})\n"],
5
+ "mappings": "AAAA,SAAS,eAAe;AAGjB,MAAM,aAAa,QAAQ;AAAA,EAChC,MAAM;AAAA,EACN,OAAO,SAAS,EAAE,SAAS,cAAc,GAAG;AAC1C,QAAI,CAAC,QAAS;AACd,QAAI;AACJ,QAAI;AACF,cAAQ,KAAK,MAAM,OAAO;AAAA,IAC5B,QAAQ;AACN,cAAQ,QAAQ,SAAS,CAAC,GAAG,WAAW,OAAO,GAAG,EAAE;AAAA,IACtD;AACA,YAAQ,MAAM,MAAM,OAAO,EAAE,WAAW,kBAAkB,OAAO,CAAC;AAAA,EACpE;AACF,CAAC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,12 @@
1
+ export type MorphOptions = {
2
+ /** Attribute that marks a subtree to leave alone when present on both sides. */
3
+ ignoreAttr?: string;
4
+ /** Attribute listing space-separated attribute names to keep from the old element. */
5
+ preserveAttr?: string;
6
+ };
7
+ /** Scripts inserted through the DOM do not execute; replace them with fresh copies that do. */
8
+ export declare const activateScripts: (root: Node) => void;
9
+ /** Morph `target` into `next` (outer). */
10
+ export declare const morph: (target: Element, next: Element, o?: MorphOptions) => void;
11
+ /** Morph the children of `target` into the children of `next` (inner). */
12
+ export declare const morphInner: (target: Element, next: ParentNode, o?: MorphOptions) => void;
@@ -0,0 +1,124 @@
1
+ const ran = /* @__PURE__ */ new WeakSet();
2
+ const isEl = (n) => !!n && n.nodeType === 1;
3
+ const activateScripts = (root) => {
4
+ if (!isEl(root)) return;
5
+ for (const old of root.matches("script") ? [root] : [...root.querySelectorAll("script")]) {
6
+ if (ran.has(old)) continue;
7
+ const s = document.createElement("script");
8
+ for (const { name, value } of old.attributes) s.setAttribute(name, value);
9
+ s.text = old.text;
10
+ ran.add(s);
11
+ old.replaceWith(s);
12
+ }
13
+ };
14
+ const idsIn = (n) => [...isEl(n) && n.id ? [n] : [], ...n.querySelectorAll("[id]")];
15
+ const containsKept = (n, ctx) => isEl(n) && idsIn(n).some((e) => ctx.keep.has(e.id));
16
+ const discard = (n, ctx) => {
17
+ containsKept(n, ctx) ? ctx.pantry.append(n) : n.remove();
18
+ };
19
+ const place = (parent, node, before) => {
20
+ const p = parent;
21
+ try {
22
+ p.moveBefore ? p.moveBefore(node, before) : parent.insertBefore(node, before);
23
+ } catch {
24
+ parent.insertBefore(node, before);
25
+ }
26
+ };
27
+ const findKept = (id, from, ctx) => {
28
+ for (let n = from; n; n = n.nextSibling) if (isEl(n) && n.id === id) return n;
29
+ return ctx.pantry.querySelector(`#${CSS.escape(id)}`) ?? document.getElementById(id);
30
+ };
31
+ const compatible = (old, next, ctx) => old.nodeType === next.nodeType && old.nodeName === next.nodeName && (!isEl(old) || !old.id || old.id === next.id) && !(isEl(old) && ctx.keep.has(old.id) && old.id !== next.id);
32
+ const syncAttributes = (a, b, ctx) => {
33
+ const keep = new Set((b.getAttribute(ctx.preserve) ?? a.getAttribute(ctx.preserve) ?? "").split(/\s+/).filter(Boolean));
34
+ let changed = false;
35
+ const attrDiffers = (name) => !keep.has(name) && a.getAttribute(name) !== b.getAttribute(name);
36
+ if (a instanceof HTMLInputElement && b instanceof HTMLInputElement && a.type !== "file") {
37
+ if (attrDiffers("value")) a.value = b.getAttribute("value") ?? "", changed = true;
38
+ if (attrDiffers("checked")) a.checked = b.hasAttribute("checked"), changed = true;
39
+ } else if (a instanceof HTMLTextAreaElement && b instanceof HTMLTextAreaElement) {
40
+ if (!keep.has("value") && a.defaultValue !== b.defaultValue) a.value = b.defaultValue, changed = true;
41
+ } else if (a instanceof HTMLOptionElement && b instanceof HTMLOptionElement) {
42
+ if (attrDiffers("selected")) a.selected = b.hasAttribute("selected"), changed = true;
43
+ }
44
+ for (const { name, value } of b.attributes) if (!keep.has(name) && a.getAttribute(name) !== value) a.setAttribute(name, value);
45
+ for (const { name } of [...a.attributes]) if (!keep.has(name) && !b.hasAttribute(name)) a.removeAttribute(name);
46
+ if (changed) (a instanceof HTMLOptionElement ? a.closest("select") : a)?.dispatchEvent(new Event("sigmx-prop-change", { bubbles: true }));
47
+ };
48
+ const morphNode = (a, b, ctx) => {
49
+ if (a.nodeType !== b.nodeType || a.nodeName !== b.nodeName) {
50
+ const fresh = document.importNode(b, true);
51
+ a.replaceWith(fresh);
52
+ activateScripts(fresh);
53
+ return;
54
+ }
55
+ if (!isEl(a) || !isEl(b)) {
56
+ if (a.nodeValue !== b.nodeValue) a.nodeValue = b.nodeValue;
57
+ return;
58
+ }
59
+ if (a.hasAttribute(ctx.ignore) && b.hasAttribute(ctx.ignore)) return;
60
+ syncAttributes(a, b, ctx);
61
+ if (a instanceof HTMLTemplateElement && b instanceof HTMLTemplateElement) {
62
+ a.innerHTML = b.innerHTML;
63
+ } else if (!a.isEqualNode(b)) {
64
+ morphChildren(a, b, ctx);
65
+ }
66
+ };
67
+ const morphChildren = (parent, next, ctx) => {
68
+ let cur = parent.firstChild;
69
+ const dropUntil = (stop) => {
70
+ while (cur && cur !== stop) {
71
+ const n = cur;
72
+ cur = cur.nextSibling;
73
+ discard(n, ctx);
74
+ }
75
+ return cur === stop;
76
+ };
77
+ for (const nb of [...next.childNodes]) {
78
+ if (isEl(nb) && nb.id && ctx.keep.has(nb.id)) {
79
+ const match = findKept(nb.id, cur, ctx);
80
+ if (match) {
81
+ if (dropUntil(match) && cur) cur = match.nextSibling;
82
+ else place(parent, match, cur);
83
+ morphNode(match, nb, ctx);
84
+ continue;
85
+ }
86
+ }
87
+ let m = cur;
88
+ while (m && !compatible(m, nb, ctx)) m = m.nextSibling;
89
+ if (m) {
90
+ dropUntil(m);
91
+ cur = m.nextSibling;
92
+ morphNode(m, nb, ctx);
93
+ } else if (isEl(nb) && containsKept(nb, ctx)) {
94
+ const shell = document.createElementNS(nb.namespaceURI ?? "http://www.w3.org/1999/xhtml", nb.tagName);
95
+ parent.insertBefore(shell, cur);
96
+ morphNode(shell, nb, ctx);
97
+ } else {
98
+ const fresh = document.importNode(nb, true);
99
+ parent.insertBefore(fresh, cur);
100
+ activateScripts(fresh);
101
+ }
102
+ }
103
+ dropUntil(null);
104
+ };
105
+ const context = (target, next, o) => {
106
+ const keep = /* @__PURE__ */ new Set();
107
+ const wanted = new Map(idsIn(next).map((e) => [e.id, e.tagName]));
108
+ for (const e of idsIn(target)) if (wanted.get(e.id) === e.tagName) keep.add(e.id);
109
+ return { keep, pantry: document.createDocumentFragment(), ignore: o.ignoreAttr ?? "data-ignore-morph", preserve: o.preserveAttr ?? "data-preserve-attr" };
110
+ };
111
+ const morph = (target, next, o = {}) => {
112
+ const ctx = context(target, next, o);
113
+ morphNode(target, next, ctx);
114
+ };
115
+ const morphInner = (target, next, o = {}) => {
116
+ const ctx = context(target, next, o);
117
+ morphChildren(target, next, ctx);
118
+ };
119
+ export {
120
+ activateScripts,
121
+ morph,
122
+ morphInner
123
+ };
124
+ //# sourceMappingURL=morph.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/plugins/server-events/morph.ts"],
4
+ "sourcesContent": ["// Id-aware DOM morphing: update `target` in place to match `next`, keeping elements whose ids\n// appear in both trees (and their state: focus, input values, scroll) instead of recreating them.\n\nexport type MorphOptions = {\n /** Attribute that marks a subtree to leave alone when present on both sides. */\n ignoreAttr?: string\n /** Attribute listing space-separated attribute names to keep from the old element. */\n preserveAttr?: string\n}\n\ntype Ctx = { keep: Set<string>; pantry: DocumentFragment; ignore: string; preserve: string }\n\nconst ran = new WeakSet<Node>()\nconst isEl = (n: Node | null): n is Element => !!n && n.nodeType === 1\n\n/** Scripts inserted through the DOM do not execute; replace them with fresh copies that do. */\nexport const activateScripts = (root: Node): void => {\n if (!isEl(root)) return\n for (const old of (root.matches('script') ? [root] : [...root.querySelectorAll('script')]) as HTMLScriptElement[]) {\n if (ran.has(old)) continue\n const s = document.createElement('script')\n for (const { name, value } of old.attributes) s.setAttribute(name, value)\n s.text = old.text\n ran.add(s)\n old.replaceWith(s)\n }\n}\n\n/** Every element with an id in and under `n`. */\nconst idsIn = (n: Node): Element[] => [...(isEl(n) && n.id ? [n] : []), ...(n as ParentNode).querySelectorAll('[id]')]\nconst containsKept = (n: Node, ctx: Ctx): boolean => isEl(n) && idsIn(n).some((e) => ctx.keep.has(e.id))\n\n/** Remove a node, or park it if it (or a descendant) is wanted elsewhere in the new tree. */\nconst discard = (n: Node, ctx: Ctx): void => {\n containsKept(n, ctx) ? ctx.pantry.append(n) : (n as ChildNode).remove()\n}\n\nconst place = (parent: Node, node: Node, before: Node | null): void => {\n const p = parent as Node & { moveBefore?: (n: Node, b: Node | null) => void }\n try {\n p.moveBefore ? p.moveBefore(node, before) : parent.insertBefore(node, before)\n } catch {\n parent.insertBefore(node, before)\n }\n}\n\nconst findKept = (id: string, from: Node | null, ctx: Ctx): Element | null => {\n for (let n = from; n; n = n.nextSibling) if (isEl(n) && n.id === id) return n\n return ctx.pantry.querySelector(`#${CSS.escape(id)}`) ?? document.getElementById(id)\n}\n\nconst compatible = (old: Node, next: Node, ctx: Ctx): boolean =>\n old.nodeType === next.nodeType &&\n old.nodeName === next.nodeName &&\n (!isEl(old) || !old.id || old.id === (next as Element).id) &&\n !(isEl(old) && ctx.keep.has(old.id) && old.id !== (next as Element).id)\n\nconst syncAttributes = (a: Element, b: Element, ctx: Ctx): void => {\n const keep = new Set((b.getAttribute(ctx.preserve) ?? a.getAttribute(ctx.preserve) ?? '').split(/\\s+/).filter(Boolean))\n // Live form state (what the user typed or ticked) is only overwritten when the server's\n // default actually changed, i.e. the *attribute* differs between old and new markup.\n let changed = false\n const attrDiffers = (name: string) => !keep.has(name) && a.getAttribute(name) !== b.getAttribute(name)\n if (a instanceof HTMLInputElement && b instanceof HTMLInputElement && a.type !== 'file') {\n if (attrDiffers('value')) (a.value = b.getAttribute('value') ?? ''), (changed = true)\n if (attrDiffers('checked')) (a.checked = b.hasAttribute('checked')), (changed = true)\n } else if (a instanceof HTMLTextAreaElement && b instanceof HTMLTextAreaElement) {\n if (!keep.has('value') && a.defaultValue !== b.defaultValue) (a.value = b.defaultValue), (changed = true)\n } else if (a instanceof HTMLOptionElement && b instanceof HTMLOptionElement) {\n if (attrDiffers('selected')) (a.selected = b.hasAttribute('selected')), (changed = true)\n }\n for (const { name, value } of b.attributes) if (!keep.has(name) && a.getAttribute(name) !== value) a.setAttribute(name, value)\n for (const { name } of [...a.attributes]) if (!keep.has(name) && !b.hasAttribute(name)) a.removeAttribute(name)\n\n if (changed) (a instanceof HTMLOptionElement ? a.closest('select') : a)?.dispatchEvent(new Event('sigmx-prop-change', { bubbles: true }))\n}\n\nconst morphNode = (a: Node, b: Node, ctx: Ctx): void => {\n if (a.nodeType !== b.nodeType || a.nodeName !== b.nodeName) {\n const fresh = document.importNode(b, true)\n ;(a as ChildNode).replaceWith(fresh)\n activateScripts(fresh)\n return\n }\n if (!isEl(a) || !isEl(b)) {\n if (a.nodeValue !== b.nodeValue) a.nodeValue = b.nodeValue\n return\n }\n if (a.hasAttribute(ctx.ignore) && b.hasAttribute(ctx.ignore)) return\n syncAttributes(a, b, ctx)\n if (a instanceof HTMLTemplateElement && b instanceof HTMLTemplateElement) {\n a.innerHTML = b.innerHTML\n } else if (!a.isEqualNode(b)) {\n morphChildren(a, b, ctx)\n }\n}\n\nconst morphChildren = (parent: Node, next: Node, ctx: Ctx): void => {\n let cur: Node | null = parent.firstChild\n /** Discard old siblings from `cur` up to (not including) `stop`; returns whether `stop` was reached. */\n const dropUntil = (stop: Node | null): boolean => {\n while (cur && cur !== stop) {\n const n = cur\n cur = cur.nextSibling\n discard(n, ctx)\n }\n return cur === stop\n }\n for (const nb of [...next.childNodes]) {\n if (isEl(nb) && nb.id && ctx.keep.has(nb.id)) {\n const match = findKept(nb.id, cur, ctx)\n if (match) {\n if (dropUntil(match) && cur) cur = match.nextSibling\n else place(parent, match, cur)\n morphNode(match, nb, ctx)\n continue\n }\n }\n let m: Node | null = cur\n while (m && !compatible(m, nb, ctx)) m = m.nextSibling\n if (m) {\n dropUntil(m)\n cur = m.nextSibling\n morphNode(m, nb, ctx)\n } else if (isEl(nb) && containsKept(nb, ctx)) {\n // Build a shell so the wanted descendants can be pulled in rather than recreated.\n const shell = document.createElementNS(nb.namespaceURI ?? 'http://www.w3.org/1999/xhtml', nb.tagName)\n parent.insertBefore(shell, cur)\n morphNode(shell, nb, ctx)\n } else {\n const fresh = document.importNode(nb, true)\n parent.insertBefore(fresh, cur)\n activateScripts(fresh)\n }\n }\n dropUntil(null)\n}\n\nconst context = (target: Node, next: Node, o: MorphOptions): Ctx => {\n const keep = new Set<string>()\n const wanted = new Map(idsIn(next).map((e) => [e.id, e.tagName]))\n for (const e of idsIn(target)) if (wanted.get(e.id) === e.tagName) keep.add(e.id)\n return { keep, pantry: document.createDocumentFragment(), ignore: o.ignoreAttr ?? 'data-ignore-morph', preserve: o.preserveAttr ?? 'data-preserve-attr' }\n}\n\n/** Morph `target` into `next` (outer). */\nexport const morph = (target: Element, next: Element, o: MorphOptions = {}): void => {\n const ctx = context(target, next, o)\n morphNode(target, next, ctx)\n}\n\n/** Morph the children of `target` into the children of `next` (inner). */\nexport const morphInner = (target: Element, next: ParentNode, o: MorphOptions = {}): void => {\n const ctx = context(target, next, o)\n morphChildren(target, next, ctx)\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,3 @@
1
+ import type { Plugin } from '../kernel/contracts.js';
2
+ /** Every plugin. */
3
+ export declare const all: Plugin[];