sigmx 0.1.0 → 0.1.1

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 (251) hide show
  1. package/README.md +52 -41
  2. package/dist/cli.js +3 -1
  3. package/dist/cli.js.map +2 -2
  4. package/dist/kernel/compile.js.map +2 -2
  5. package/dist/kernel/contracts.d.ts +1 -8
  6. package/dist/kernel/index.d.ts +10 -11
  7. package/dist/kernel/index.js +10 -7
  8. package/dist/kernel/index.js.map +3 -3
  9. package/dist/kernel/precompile.d.ts +0 -2
  10. package/dist/kernel/precompile.js +11 -4
  11. package/dist/kernel/precompile.js.map +2 -2
  12. package/dist/kernel/precompiled.js.map +2 -2
  13. package/dist/kernel/reactive.d.ts +6 -10
  14. package/dist/kernel/reactive.js +4 -8
  15. package/dist/kernel/reactive.js.map +2 -2
  16. package/dist/kernel/runtime.js +19 -7
  17. package/dist/kernel/runtime.js.map +2 -2
  18. package/dist/kernel/scan.d.ts +1 -10
  19. package/dist/kernel/scan.js +24 -7
  20. package/dist/kernel/scan.js.map +2 -2
  21. package/dist/kernel/state.d.ts +1 -5
  22. package/dist/kernel/state.js +49 -22
  23. package/dist/kernel/state.js.map +2 -2
  24. package/dist/kernel/strict-csp.js.map +1 -1
  25. package/dist/lib/casing.js.map +2 -2
  26. package/dist/lib/objects.d.ts +0 -1
  27. package/dist/lib/objects.js +4 -1
  28. package/dist/lib/objects.js.map +2 -2
  29. package/dist/lib/schedule.d.ts +0 -2
  30. package/dist/lib/schedule.js.map +2 -2
  31. package/dist/lib/sse.d.ts +0 -1
  32. package/dist/lib/sse.js +3 -2
  33. package/dist/lib/sse.js.map +2 -2
  34. package/dist/plugins/directives/attribute-sync.js.map +1 -1
  35. package/dist/plugins/directives/boost.js +2 -1
  36. package/dist/plugins/directives/boost.js.map +2 -2
  37. package/dist/plugins/directives/busy-flag.js.map +1 -1
  38. package/dist/plugins/directives/class-toggle.js.map +1 -1
  39. package/dist/plugins/directives/cloak.js.map +1 -1
  40. package/dist/plugins/directives/collapse.js.map +1 -1
  41. package/dist/plugins/directives/declare.js.map +1 -1
  42. package/dist/plugins/directives/derive.js +4 -1
  43. package/dist/plugins/directives/derive.js.map +2 -2
  44. package/dist/plugins/directives/element-ref.js.map +1 -1
  45. package/dist/plugins/directives/event-listener.js +4 -1
  46. package/dist/plugins/directives/event-listener.js.map +2 -2
  47. package/dist/plugins/directives/frame-loop.js.map +1 -1
  48. package/dist/plugins/directives/html.js.map +1 -1
  49. package/dist/plugins/directives/inline-style.js +1 -1
  50. package/dist/plugins/directives/inline-style.js.map +2 -2
  51. package/dist/plugins/directives/mask.js.map +1 -1
  52. package/dist/plugins/directives/media-query.js +2 -1
  53. package/dist/plugins/directives/media-query.js.map +2 -2
  54. package/dist/plugins/directives/on-mount.js +4 -1
  55. package/dist/plugins/directives/on-mount.js.map +2 -2
  56. package/dist/plugins/directives/patch-listener.js.map +1 -1
  57. package/dist/plugins/directives/remove-me.js.map +1 -1
  58. package/dist/plugins/directives/scroll-to.js.map +1 -1
  59. package/dist/plugins/directives/size-watch.js.map +1 -1
  60. package/dist/plugins/directives/state-dump.js.map +1 -1
  61. package/dist/plugins/directives/storage-sync.js.map +1 -1
  62. package/dist/plugins/directives/teleport.js.map +1 -1
  63. package/dist/plugins/directives/text-content.js.map +1 -1
  64. package/dist/plugins/directives/timer.js.map +1 -1
  65. package/dist/plugins/directives/transition-name.js.map +1 -1
  66. package/dist/plugins/directives/transition.js.map +1 -1
  67. package/dist/plugins/directives/trap.js +8 -2
  68. package/dist/plugins/directives/trap.js.map +2 -2
  69. package/dist/plugins/directives/tween.js.map +2 -2
  70. package/dist/plugins/directives/two-way-bind.js +37 -7
  71. package/dist/plugins/directives/two-way-bind.js.map +2 -2
  72. package/dist/plugins/directives/url-params.js +2 -1
  73. package/dist/plugins/directives/url-params.js.map +2 -2
  74. package/dist/plugins/directives/url-replace.js.map +1 -1
  75. package/dist/plugins/directives/validity.js.map +1 -1
  76. package/dist/plugins/directives/viewport.js +4 -1
  77. package/dist/plugins/directives/viewport.js.map +2 -2
  78. package/dist/plugins/directives/visibility.js.map +1 -1
  79. package/dist/plugins/directives/watch.d.ts +0 -1
  80. package/dist/plugins/directives/watch.js.map +2 -2
  81. package/dist/plugins/functions/bulk-set.js +5 -3
  82. package/dist/plugins/functions/bulk-set.js.map +2 -2
  83. package/dist/plugins/functions/bulk-toggle.js +5 -3
  84. package/dist/plugins/functions/bulk-toggle.js.map +2 -2
  85. package/dist/plugins/functions/confirm.js.map +1 -1
  86. package/dist/plugins/functions/copy-text.js.map +1 -1
  87. package/dist/plugins/functions/dispatch.js.map +2 -2
  88. package/dist/plugins/functions/locale-format.js.map +1 -1
  89. package/dist/plugins/functions/range-map.js.map +1 -1
  90. package/dist/plugins/functions/request.js +19 -5
  91. package/dist/plugins/functions/request.js.map +2 -2
  92. package/dist/plugins/functions/untracked-read.js.map +1 -1
  93. package/dist/plugins/functions/websocket.js +5 -1
  94. package/dist/plugins/functions/websocket.js.map +2 -2
  95. package/dist/plugins/index.d.ts +36 -36
  96. package/dist/plugins/index.js +33 -33
  97. package/dist/plugins/index.js.map +2 -2
  98. package/dist/plugins/server-events/apply-elements.js +4 -1
  99. package/dist/plugins/server-events/apply-elements.js.map +2 -2
  100. package/dist/plugins/server-events/apply-state.js.map +1 -1
  101. package/dist/plugins/server-events/morph.d.ts +0 -2
  102. package/dist/plugins/server-events/morph.js +31 -8
  103. package/dist/plugins/server-events/morph.js.map +2 -2
  104. package/dist/presets/all.d.ts +0 -1
  105. package/dist/presets/all.js +23 -23
  106. package/dist/presets/all.js.map +2 -2
  107. package/dist/presets/essentials.d.ts +0 -1
  108. package/dist/presets/essentials.js +27 -9
  109. package/dist/presets/essentials.js.map +2 -2
  110. package/dist/presets/minimal.d.ts +0 -1
  111. package/dist/presets/minimal.js +2 -2
  112. package/dist/presets/minimal.js.map +2 -2
  113. package/dist/server.d.ts +102 -0
  114. package/dist/server.js +190 -0
  115. package/dist/server.js.map +7 -0
  116. package/dist/sigmx.standalone.js +1 -1
  117. package/dist/standalone.js.map +2 -2
  118. package/dist/vite.d.ts +2 -2
  119. package/dist/vite.js +31 -8
  120. package/dist/vite.js.map +2 -2
  121. package/package.json +19 -2
  122. package/dist/auto.d.ts +0 -1
  123. package/dist/auto.js +0 -7
  124. package/dist/auto.js.map +0 -7
  125. package/dist/core/csp.d.ts +0 -7
  126. package/dist/core/csp.js +0 -20
  127. package/dist/core/csp.js.map +0 -7
  128. package/dist/core/engine.d.ts +0 -10
  129. package/dist/core/engine.js +0 -200
  130. package/dist/core/engine.js.map +0 -7
  131. package/dist/core/expr.d.ts +0 -12
  132. package/dist/core/expr.js +0 -94
  133. package/dist/core/expr.js.map +0 -7
  134. package/dist/core/index.d.ts +0 -16
  135. package/dist/core/index.js +0 -46
  136. package/dist/core/index.js.map +0 -7
  137. package/dist/core/signals.d.ts +0 -42
  138. package/dist/core/signals.js +0 -195
  139. package/dist/core/signals.js.map +0 -7
  140. package/dist/core/store.d.ts +0 -32
  141. package/dist/core/store.js +0 -185
  142. package/dist/core/store.js.map +0 -7
  143. package/dist/core/types.d.ts +0 -101
  144. package/dist/core/types.js +0 -1
  145. package/dist/core/types.js.map +0 -7
  146. package/dist/plugins/actions/clipboard.d.ts +0 -2
  147. package/dist/plugins/actions/clipboard.js +0 -11
  148. package/dist/plugins/actions/clipboard.js.map +0 -7
  149. package/dist/plugins/actions/fit.d.ts +0 -2
  150. package/dist/plugins/actions/fit.js +0 -14
  151. package/dist/plugins/actions/fit.js.map +0 -7
  152. package/dist/plugins/actions/intl.d.ts +0 -2
  153. package/dist/plugins/actions/intl.js +0 -21
  154. package/dist/plugins/actions/intl.js.map +0 -7
  155. package/dist/plugins/actions/peek.d.ts +0 -2
  156. package/dist/plugins/actions/peek.js +0 -6
  157. package/dist/plugins/actions/peek.js.map +0 -7
  158. package/dist/plugins/actions/setAll.d.ts +0 -2
  159. package/dist/plugins/actions/setAll.js +0 -11
  160. package/dist/plugins/actions/setAll.js.map +0 -7
  161. package/dist/plugins/actions/toggleAll.d.ts +0 -2
  162. package/dist/plugins/actions/toggleAll.js +0 -11
  163. package/dist/plugins/actions/toggleAll.js.map +0 -7
  164. package/dist/plugins/attributes/attr.d.ts +0 -2
  165. package/dist/plugins/attributes/attr.js +0 -20
  166. package/dist/plugins/attributes/attr.js.map +0 -7
  167. package/dist/plugins/attributes/bind.d.ts +0 -6
  168. package/dist/plugins/attributes/bind.js +0 -81
  169. package/dist/plugins/attributes/bind.js.map +0 -7
  170. package/dist/plugins/attributes/class.d.ts +0 -2
  171. package/dist/plugins/attributes/class.js +0 -22
  172. package/dist/plugins/attributes/class.js.map +0 -7
  173. package/dist/plugins/attributes/computed.d.ts +0 -2
  174. package/dist/plugins/attributes/computed.js +0 -20
  175. package/dist/plugins/attributes/computed.js.map +0 -7
  176. package/dist/plugins/attributes/customValidity.d.ts +0 -2
  177. package/dist/plugins/attributes/customValidity.js +0 -14
  178. package/dist/plugins/attributes/customValidity.js.map +0 -7
  179. package/dist/plugins/attributes/effect.d.ts +0 -2
  180. package/dist/plugins/attributes/effect.js +0 -12
  181. package/dist/plugins/attributes/effect.js.map +0 -7
  182. package/dist/plugins/attributes/indicator.d.ts +0 -2
  183. package/dist/plugins/attributes/indicator.js +0 -20
  184. package/dist/plugins/attributes/indicator.js.map +0 -7
  185. package/dist/plugins/attributes/init.d.ts +0 -2
  186. package/dist/plugins/attributes/init.js +0 -14
  187. package/dist/plugins/attributes/init.js.map +0 -7
  188. package/dist/plugins/attributes/jsonSignals.d.ts +0 -2
  189. package/dist/plugins/attributes/jsonSignals.js +0 -15
  190. package/dist/plugins/attributes/jsonSignals.js.map +0 -7
  191. package/dist/plugins/attributes/matchMedia.d.ts +0 -2
  192. package/dist/plugins/attributes/matchMedia.js +0 -19
  193. package/dist/plugins/attributes/matchMedia.js.map +0 -7
  194. package/dist/plugins/attributes/on.d.ts +0 -5
  195. package/dist/plugins/attributes/on.js +0 -28
  196. package/dist/plugins/attributes/on.js.map +0 -7
  197. package/dist/plugins/attributes/onIntersect.d.ts +0 -2
  198. package/dist/plugins/attributes/onIntersect.js +0 -28
  199. package/dist/plugins/attributes/onIntersect.js.map +0 -7
  200. package/dist/plugins/attributes/onInterval.d.ts +0 -2
  201. package/dist/plugins/attributes/onInterval.js +0 -18
  202. package/dist/plugins/attributes/onInterval.js.map +0 -7
  203. package/dist/plugins/attributes/onRaf.d.ts +0 -1
  204. package/dist/plugins/attributes/onRaf.js +0 -19
  205. package/dist/plugins/attributes/onRaf.js.map +0 -7
  206. package/dist/plugins/attributes/onResize.d.ts +0 -1
  207. package/dist/plugins/attributes/onResize.js +0 -17
  208. package/dist/plugins/attributes/onResize.js.map +0 -7
  209. package/dist/plugins/attributes/onSignalPatch.d.ts +0 -5
  210. package/dist/plugins/attributes/onSignalPatch.js +0 -35
  211. package/dist/plugins/attributes/onSignalPatch.js.map +0 -7
  212. package/dist/plugins/attributes/persist.d.ts +0 -6
  213. package/dist/plugins/attributes/persist.js +0 -16
  214. package/dist/plugins/attributes/persist.js.map +0 -7
  215. package/dist/plugins/attributes/queryString.d.ts +0 -5
  216. package/dist/plugins/attributes/queryString.js +0 -54
  217. package/dist/plugins/attributes/queryString.js.map +0 -7
  218. package/dist/plugins/attributes/ref.d.ts +0 -2
  219. package/dist/plugins/attributes/ref.js +0 -13
  220. package/dist/plugins/attributes/ref.js.map +0 -7
  221. package/dist/plugins/attributes/replaceUrl.d.ts +0 -1
  222. package/dist/plugins/attributes/replaceUrl.js +0 -11
  223. package/dist/plugins/attributes/replaceUrl.js.map +0 -7
  224. package/dist/plugins/attributes/scrollIntoView.d.ts +0 -2
  225. package/dist/plugins/attributes/scrollIntoView.js +0 -19
  226. package/dist/plugins/attributes/scrollIntoView.js.map +0 -7
  227. package/dist/plugins/attributes/show.d.ts +0 -2
  228. package/dist/plugins/attributes/show.js +0 -19
  229. package/dist/plugins/attributes/show.js.map +0 -7
  230. package/dist/plugins/attributes/signals.d.ts +0 -2
  231. package/dist/plugins/attributes/signals.js +0 -13
  232. package/dist/plugins/attributes/signals.js.map +0 -7
  233. package/dist/plugins/attributes/style.d.ts +0 -2
  234. package/dist/plugins/attributes/style.js +0 -25
  235. package/dist/plugins/attributes/style.js.map +0 -7
  236. package/dist/plugins/attributes/text.d.ts +0 -1
  237. package/dist/plugins/attributes/text.js +0 -13
  238. package/dist/plugins/attributes/text.js.map +0 -7
  239. package/dist/plugins/attributes/viewTransition.d.ts +0 -1
  240. package/dist/plugins/attributes/viewTransition.js +0 -11
  241. package/dist/plugins/attributes/viewTransition.js.map +0 -7
  242. package/dist/sigmx.auto.js +0 -5
  243. package/dist/utils/object.d.ts +0 -9
  244. package/dist/utils/object.js +0 -26
  245. package/dist/utils/object.js.map +0 -7
  246. package/dist/utils/text.d.ts +0 -7
  247. package/dist/utils/text.js +0 -15
  248. package/dist/utils/text.js.map +0 -7
  249. package/dist/utils/timing.d.ts +0 -14
  250. package/dist/utils/timing.js +0 -58
  251. package/dist/utils/timing.js.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/plugins/functions/dispatch.ts"],
4
- "sourcesContent": ["import { action } from '../../kernel/index.js'\n\n/** `@dispatch('name', detail)` fires a bubbling CustomEvent from the element. */\nexport const dispatch = action({\n name: 'dispatch',\n call: ({ el }, name: string, detail?: unknown) => el.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true })),\n})\n"],
5
- "mappings": "AAAA,SAAS,cAAc;AAGhB,MAAM,WAAW,OAAO;AAAA,EAC7B,MAAM;AAAA,EACN,MAAM,CAAC,EAAE,GAAG,GAAG,MAAc,WAAqB,GAAG,cAAc,IAAI,YAAY,MAAM,EAAE,QAAQ,SAAS,MAAM,UAAU,KAAK,CAAC,CAAC;AACrI,CAAC;",
4
+ "sourcesContent": ["import { action } from '../../kernel/index.js';\n\n/** `@dispatch('name', detail)` fires a bubbling CustomEvent from the element. */\nexport const dispatch = action({\n name: 'dispatch',\n call: ({ el }, name: string, detail?: unknown) =>\n el.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true })),\n});\n"],
5
+ "mappings": "AAAA,SAAS,cAAc;AAGhB,MAAM,WAAW,OAAO;AAAA,EAC7B,MAAM;AAAA,EACN,MAAM,CAAC,EAAE,GAAG,GAAG,MAAc,WAC3B,GAAG,cAAc,IAAI,YAAY,MAAM,EAAE,QAAQ,SAAS,MAAM,UAAU,KAAK,CAAC,CAAC;AACrF,CAAC;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/plugins/functions/locale-format.ts"],
4
- "sourcesContent": ["import { action } from '../../kernel/index.js'\n\ntype Fmt = (locale: string | string[] | undefined, value: any, options: any) => string\nconst formats: Record<string, Fmt> = {\n number: (l, v, o) => new Intl.NumberFormat(l, o).format(v),\n datetime: (l, v, o) => new Intl.DateTimeFormat(l, o).format(v),\n pluralRules: (l, v, o) => new Intl.PluralRules(l, o).select(v),\n relativeTime: (l, v, o) => new Intl.RelativeTimeFormat(l, o).format(v[0], v[1]),\n list: (l, v, o) => new Intl.ListFormat(l, o).format(v),\n displayNames: (l, v, o) => new Intl.DisplayNames(l, o).of(v) ?? '',\n}\n\n/** `@intl('number', 1234.5, { style: 'currency', currency: 'USD' }, 'en-US')`. */\nexport const intl = action({\n name: 'intl',\n call: ({ error }, type: string, value: unknown, options?: Record<string, unknown>, locale?: string | string[]) => {\n const f = formats[type]\n if (!f) throw error(`unknown @intl type \"${type}\"`)\n return f(locale, value, options)\n },\n})\n"],
4
+ "sourcesContent": ["import { action } from '../../kernel/index.js';\n\ntype Fmt = (locale: string | string[] | undefined, value: any, options: any) => string;\nconst formats: Record<string, Fmt> = {\n number: (l, v, o) => new Intl.NumberFormat(l, o).format(v),\n datetime: (l, v, o) => new Intl.DateTimeFormat(l, o).format(v),\n pluralRules: (l, v, o) => new Intl.PluralRules(l, o).select(v),\n relativeTime: (l, v, o) => new Intl.RelativeTimeFormat(l, o).format(v[0], v[1]),\n list: (l, v, o) => new Intl.ListFormat(l, o).format(v),\n displayNames: (l, v, o) => new Intl.DisplayNames(l, o).of(v) ?? '',\n};\n\n/** `@intl('number', 1234.5, { style: 'currency', currency: 'USD' }, 'en-US')`. */\nexport const intl = action({\n name: 'intl',\n call: ({ error }, type: string, value: unknown, options?: Record<string, unknown>, locale?: string | string[]) => {\n const f = formats[type];\n if (!f) throw error(`unknown @intl type \"${type}\"`);\n return f(locale, value, options);\n },\n});\n"],
5
5
  "mappings": "AAAA,SAAS,cAAc;AAGvB,MAAM,UAA+B;AAAA,EACnC,QAAQ,CAAC,GAAG,GAAG,MAAM,IAAI,KAAK,aAAa,GAAG,CAAC,EAAE,OAAO,CAAC;AAAA,EACzD,UAAU,CAAC,GAAG,GAAG,MAAM,IAAI,KAAK,eAAe,GAAG,CAAC,EAAE,OAAO,CAAC;AAAA,EAC7D,aAAa,CAAC,GAAG,GAAG,MAAM,IAAI,KAAK,YAAY,GAAG,CAAC,EAAE,OAAO,CAAC;AAAA,EAC7D,cAAc,CAAC,GAAG,GAAG,MAAM,IAAI,KAAK,mBAAmB,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,EAC9E,MAAM,CAAC,GAAG,GAAG,MAAM,IAAI,KAAK,WAAW,GAAG,CAAC,EAAE,OAAO,CAAC;AAAA,EACrD,cAAc,CAAC,GAAG,GAAG,MAAM,IAAI,KAAK,aAAa,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK;AAClE;AAGO,MAAM,OAAO,OAAO;AAAA,EACzB,MAAM;AAAA,EACN,MAAM,CAAC,EAAE,MAAM,GAAG,MAAc,OAAgB,SAAmC,WAA+B;AAChH,UAAM,IAAI,QAAQ,IAAI;AACtB,QAAI,CAAC,EAAG,OAAM,MAAM,uBAAuB,IAAI,GAAG;AAClD,WAAO,EAAE,QAAQ,OAAO,OAAO;AAAA,EACjC;AACF,CAAC;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/plugins/functions/range-map.ts"],
4
- "sourcesContent": ["import { action } from '../../kernel/index.js'\n\n/** Map `v` from [inMin, inMax] onto [outMin, outMax]; optionally clamp and round. */\nexport const fit = action({\n name: 'fit',\n call: (_, v: number, inMin: number, inMax: number, outMin: number, outMax: number, clamp = false, round = false) => {\n let t = (v - inMin) / (inMax - inMin)\n if (clamp) t = Math.min(1, Math.max(0, t))\n const out = outMin + t * (outMax - outMin)\n return round ? Math.round(out) : out\n },\n})\n"],
4
+ "sourcesContent": ["import { action } from '../../kernel/index.js';\n\n/** Map `v` from [inMin, inMax] onto [outMin, outMax]; optionally clamp and round. */\nexport const fit = action({\n name: 'fit',\n call: (_, v: number, inMin: number, inMax: number, outMin: number, outMax: number, clamp = false, round = false) => {\n let t = (v - inMin) / (inMax - inMin);\n if (clamp) t = Math.min(1, Math.max(0, t));\n const out = outMin + t * (outMax - outMin);\n return round ? Math.round(out) : out;\n },\n});\n"],
5
5
  "mappings": "AAAA,SAAS,cAAc;AAGhB,MAAM,MAAM,OAAO;AAAA,EACxB,MAAM;AAAA,EACN,MAAM,CAAC,GAAG,GAAW,OAAe,OAAe,QAAgB,QAAgB,QAAQ,OAAO,QAAQ,UAAU;AAClH,QAAI,KAAK,IAAI,UAAU,QAAQ;AAC/B,QAAI,MAAO,KAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;AACzC,UAAM,MAAM,SAAS,KAAK,SAAS;AACnC,WAAO,QAAQ,KAAK,MAAM,GAAG,IAAI;AAAA,EACnC;AACF,CAAC;",
6
6
  "names": []
7
7
  }
@@ -5,9 +5,18 @@ const inflight = /* @__PURE__ */ new Map();
5
5
  let seq = 0;
6
6
  const sleep = (ms, signal) => new Promise((resolve) => {
7
7
  const t = setTimeout(resolve, ms);
8
- signal.addEventListener("abort", () => (clearTimeout(t), resolve()), { once: true });
8
+ signal.addEventListener(
9
+ "abort",
10
+ () => {
11
+ clearTimeout(t);
12
+ resolve();
13
+ },
14
+ { once: true }
15
+ );
9
16
  });
10
- const untilVisible = () => new Promise((resolve) => document.addEventListener("visibilitychange", () => !document.hidden && resolve(), { once: true }));
17
+ const untilVisible = () => new Promise(
18
+ (resolve) => document.addEventListener("visibilitychange", () => !document.hidden && resolve(), { once: true })
19
+ );
11
20
  const headerArgs = (res, names, data) => {
12
21
  for (const n of names) {
13
22
  const v = res.headers.get(`sigmx-${n}`);
@@ -58,7 +67,7 @@ const send = async (method, ctx, url, o = {}) => {
58
67
  form.reportValidity();
59
68
  return;
60
69
  }
61
- const submitter = evt instanceof SubmitEvent ? evt.submitter : el instanceof HTMLButtonElement ? el : null;
70
+ const submitter = evt instanceof SubmitEvent ? evt.submitter : el instanceof HTMLButtonElement && el.form === form ? el : null;
62
71
  const fd = new FormData(form, submitter);
63
72
  const multipart = form.enctype === "multipart/form-data";
64
73
  if (bodyAllowed) {
@@ -116,8 +125,13 @@ const send = async (method, ctx, url, o = {}) => {
116
125
  continue;
117
126
  }
118
127
  const text = await res.text();
119
- if (ct.includes("text/html")) runtime.handle("patch-elements", headerArgs(res, ["selector", "mode", "use-view-transition"], { elements: text }));
120
- else if (ct.includes("application/json")) runtime.handle("patch-signals", headerArgs(res, ["only-if-missing"], { signals: text }));
128
+ if (ct.includes("text/html"))
129
+ runtime.handle(
130
+ "patch-elements",
131
+ headerArgs(res, ["selector", "mode", "use-view-transition"], { elements: text })
132
+ );
133
+ else if (ct.includes("application/json"))
134
+ runtime.handle("patch-signals", headerArgs(res, ["only-if-missing"], { signals: text }));
121
135
  else if (ct.includes("javascript")) runScript(text);
122
136
  return;
123
137
  } catch {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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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",
4
+ "sourcesContent": ["import { type ActionCtx, action, type Filter, untracked } 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(\n 'abort',\n () => {\n clearTimeout(t);\n resolve();\n },\n { once: true },\n );\n });\nconst untilVisible = () =>\n new Promise<void>((resolve) =>\n document.addEventListener('visibilitychange', () => !document.hidden && resolve(), { once: true }),\n );\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> = {}) =>\n 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 =\n evt instanceof SubmitEvent ? evt.submitter : el instanceof HTMLButtonElement && el.form === form ? 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'))\n runtime.handle(\n 'patch-elements',\n headerArgs(res, ['selector', 'mode', 'use-view-transition'], { elements: text }),\n );\n else if (ct.includes('application/json'))\n 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) =>\n 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
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"],
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
5
  "mappings": "AAAA,SAAS,QAAQ,iBAAiB;AAG3B,MAAM,OAAO,OAAO,EAAE,MAAM,QAAQ,MAAM,CAAC,GAAG,OAAsB,UAAU,EAAE,EAAE,CAAC;",
6
6
  "names": []
7
7
  }
@@ -26,7 +26,11 @@ ${val}` : val;
26
26
  }
27
27
  };
28
28
  cleanup(() => socket.close());
29
- return { send: (d) => socket.send(typeof d === "string" ? d : JSON.stringify(d)), close: () => socket.close(), socket };
29
+ return {
30
+ send: (d) => socket.send(typeof d === "string" ? d : JSON.stringify(d)),
31
+ close: () => socket.close(),
32
+ socket
33
+ };
30
34
  }
31
35
  });
32
36
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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;",
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 {\n send: (d) => socket.send(typeof d === 'string' ? d : JSON.stringify(d)),\n close: () => socket.close(),\n socket,\n };\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;AAAA,MACL,MAAM,CAAC,MAAM,OAAO,KAAK,OAAO,MAAM,WAAW,IAAI,KAAK,UAAU,CAAC,CAAC;AAAA,MACtE,OAAO,MAAM,OAAO,MAAM;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF,CAAC;",
6
6
  "names": []
7
7
  }
@@ -1,52 +1,52 @@
1
1
  export { attr } from './directives/attribute-sync.js';
2
- export { bind } from './directives/two-way-bind.js';
2
+ export { boost } from './directives/boost.js';
3
+ export { indicator } from './directives/busy-flag.js';
3
4
  export { className } from './directives/class-toggle.js';
5
+ export { cloak } from './directives/cloak.js';
6
+ export { collapse } from './directives/collapse.js';
7
+ export { signals } from './directives/declare.js';
4
8
  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';
9
+ export { ref } from './directives/element-ref.js';
11
10
  export { on } from './directives/event-listener.js';
12
- export { onIntersect } from './directives/viewport.js';
13
- export { onInterval } from './directives/timer.js';
14
11
  export { onRaf } from './directives/frame-loop.js';
15
- export { onResize } from './directives/size-watch.js';
12
+ export { html } from './directives/html.js';
13
+ export { style } from './directives/inline-style.js';
14
+ export { applyMask, mask } from './directives/mask.js';
15
+ export { matchMedia } from './directives/media-query.js';
16
+ export { init } from './directives/on-mount.js';
16
17
  export { onSignalPatch } from './directives/patch-listener.js';
18
+ export { removeMe } from './directives/remove-me.js';
19
+ export { scrollIntoView } from './directives/scroll-to.js';
20
+ export { onResize } from './directives/size-watch.js';
21
+ export { jsonSignals } from './directives/state-dump.js';
17
22
  export { persist } from './directives/storage-sync.js';
23
+ export { teleport } from './directives/teleport.js';
24
+ export { text } from './directives/text-content.js';
25
+ export { onInterval } from './directives/timer.js';
26
+ export { transition } from './directives/transition.js';
27
+ export { viewTransition } from './directives/transition-name.js';
28
+ export { trap } from './directives/trap.js';
29
+ export { animate } from './directives/tween.js';
30
+ export { bind } from './directives/two-way-bind.js';
18
31
  export { queryString } from './directives/url-params.js';
19
- export { ref } from './directives/element-ref.js';
20
32
  export { replaceUrl } from './directives/url-replace.js';
21
- export { scrollIntoView } from './directives/scroll-to.js';
33
+ export { customValidity } from './directives/validity.js';
34
+ export { onIntersect } from './directives/viewport.js';
22
35
  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';
36
+ export { effect } from './directives/watch.js';
31
37
  export { setAll } from './functions/bulk-set.js';
32
38
  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';
39
+ export { confirm } from './functions/confirm.js';
40
+ export { clipboard } from './functions/copy-text.js';
41
+ export { dispatch } from './functions/dispatch.js';
42
+ export { intl } from './functions/locale-format.js';
43
+ export { fit } from './functions/range-map.js';
35
44
  export type { RequestOptions } from './functions/request.js';
45
+ export { httpDelete, httpGet, httpPatch, httpPost, httpPut } from './functions/request.js';
46
+ export { peek } from './functions/untracked-read.js';
47
+ export type { Socket } from './functions/websocket.js';
48
+ export { websocket } from './functions/websocket.js';
36
49
  export { applyElements } from './server-events/apply-elements.js';
37
50
  export { applyState } from './server-events/apply-state.js';
38
- export { activateScripts, morph, morphInner } from './server-events/morph.js';
39
51
  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';
52
+ export { activateScripts, morph, morphInner } from './server-events/morph.js';
@@ -1,52 +1,52 @@
1
1
  import { attr } from "./directives/attribute-sync.js";
2
- import { bind } from "./directives/two-way-bind.js";
2
+ import { boost } from "./directives/boost.js";
3
+ import { indicator } from "./directives/busy-flag.js";
3
4
  import { className } from "./directives/class-toggle.js";
5
+ import { cloak } from "./directives/cloak.js";
6
+ import { collapse } from "./directives/collapse.js";
7
+ import { signals } from "./directives/declare.js";
4
8
  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";
9
+ import { ref } from "./directives/element-ref.js";
11
10
  import { on } from "./directives/event-listener.js";
12
- import { onIntersect } from "./directives/viewport.js";
13
- import { onInterval } from "./directives/timer.js";
14
11
  import { onRaf } from "./directives/frame-loop.js";
15
- import { onResize } from "./directives/size-watch.js";
12
+ import { html } from "./directives/html.js";
13
+ import { style } from "./directives/inline-style.js";
14
+ import { applyMask, mask } from "./directives/mask.js";
15
+ import { matchMedia } from "./directives/media-query.js";
16
+ import { init } from "./directives/on-mount.js";
16
17
  import { onSignalPatch } from "./directives/patch-listener.js";
18
+ import { removeMe } from "./directives/remove-me.js";
19
+ import { scrollIntoView } from "./directives/scroll-to.js";
20
+ import { onResize } from "./directives/size-watch.js";
21
+ import { jsonSignals } from "./directives/state-dump.js";
17
22
  import { persist } from "./directives/storage-sync.js";
23
+ import { teleport } from "./directives/teleport.js";
24
+ import { text } from "./directives/text-content.js";
25
+ import { onInterval } from "./directives/timer.js";
26
+ import { transition } from "./directives/transition.js";
27
+ import { viewTransition } from "./directives/transition-name.js";
28
+ import { trap } from "./directives/trap.js";
29
+ import { animate } from "./directives/tween.js";
30
+ import { bind } from "./directives/two-way-bind.js";
18
31
  import { queryString } from "./directives/url-params.js";
19
- import { ref } from "./directives/element-ref.js";
20
32
  import { replaceUrl } from "./directives/url-replace.js";
21
- import { scrollIntoView } from "./directives/scroll-to.js";
33
+ import { customValidity } from "./directives/validity.js";
34
+ import { onIntersect } from "./directives/viewport.js";
22
35
  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";
36
+ import { effect } from "./directives/watch.js";
31
37
  import { setAll } from "./functions/bulk-set.js";
32
38
  import { toggleAll } from "./functions/bulk-toggle.js";
33
- import { animate } from "./directives/tween.js";
39
+ import { confirm } from "./functions/confirm.js";
40
+ import { clipboard } from "./functions/copy-text.js";
41
+ import { dispatch } from "./functions/dispatch.js";
42
+ import { intl } from "./functions/locale-format.js";
43
+ import { fit } from "./functions/range-map.js";
34
44
  import { httpDelete, httpGet, httpPatch, httpPost, httpPut } from "./functions/request.js";
45
+ import { peek } from "./functions/untracked-read.js";
46
+ import { websocket } from "./functions/websocket.js";
35
47
  import { applyElements } from "./server-events/apply-elements.js";
36
48
  import { applyState } from "./server-events/apply-state.js";
37
49
  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
50
  export {
51
51
  activateScripts,
52
52
  animate,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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;",
4
+ "sourcesContent": ["export { attr } from './directives/attribute-sync.js';\nexport { boost } from './directives/boost.js';\nexport { indicator } from './directives/busy-flag.js';\nexport { className } from './directives/class-toggle.js';\nexport { cloak } from './directives/cloak.js';\nexport { collapse } from './directives/collapse.js';\nexport { signals } from './directives/declare.js';\nexport { computed } from './directives/derive.js';\nexport { ref } from './directives/element-ref.js';\nexport { on } from './directives/event-listener.js';\nexport { onRaf } from './directives/frame-loop.js';\nexport { html } from './directives/html.js';\nexport { style } from './directives/inline-style.js';\nexport { applyMask, mask } from './directives/mask.js';\nexport { matchMedia } from './directives/media-query.js';\nexport { init } from './directives/on-mount.js';\nexport { onSignalPatch } from './directives/patch-listener.js';\nexport { removeMe } from './directives/remove-me.js';\nexport { scrollIntoView } from './directives/scroll-to.js';\nexport { onResize } from './directives/size-watch.js';\nexport { jsonSignals } from './directives/state-dump.js';\nexport { persist } from './directives/storage-sync.js';\nexport { teleport } from './directives/teleport.js';\nexport { text } from './directives/text-content.js';\nexport { onInterval } from './directives/timer.js';\nexport { transition } from './directives/transition.js';\nexport { viewTransition } from './directives/transition-name.js';\nexport { trap } from './directives/trap.js';\nexport { animate } from './directives/tween.js';\nexport { bind } from './directives/two-way-bind.js';\nexport { queryString } from './directives/url-params.js';\nexport { replaceUrl } from './directives/url-replace.js';\nexport { customValidity } from './directives/validity.js';\nexport { onIntersect } from './directives/viewport.js';\nexport { show } from './directives/visibility.js';\nexport { effect } from './directives/watch.js';\nexport { setAll } from './functions/bulk-set.js';\nexport { toggleAll } from './functions/bulk-toggle.js';\nexport { confirm } from './functions/confirm.js';\nexport { clipboard } from './functions/copy-text.js';\nexport { dispatch } from './functions/dispatch.js';\nexport { intl } from './functions/locale-format.js';\nexport { fit } from './functions/range-map.js';\nexport type { RequestOptions } from './functions/request.js';\nexport { httpDelete, httpGet, httpPatch, httpPost, httpPut } from './functions/request.js';\nexport { peek } from './functions/untracked-read.js';\nexport type { Socket } from './functions/websocket.js';\nexport { websocket } from './functions/websocket.js';\nexport { applyElements } from './server-events/apply-elements.js';\nexport { applyState } from './server-events/apply-state.js';\nexport type { MorphOptions } from './server-events/morph.js';\nexport { activateScripts, morph, morphInner } from './server-events/morph.js';\n"],
5
+ "mappings": "AAAA,SAAS,YAAY;AACrB,SAAS,aAAa;AACtB,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,WAAW;AACpB,SAAS,UAAU;AACnB,SAAS,aAAa;AACtB,SAAS,YAAY;AACrB,SAAS,aAAa;AACtB,SAAS,WAAW,YAAY;AAChC,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAC5B,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,WAAW;AAEpB,SAAS,YAAY,SAAS,WAAW,UAAU,eAAe;AAClE,SAAS,YAAY;AAErB,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB;AAE3B,SAAS,iBAAiB,OAAO,kBAAkB;",
6
6
  "names": []
7
7
  }
@@ -29,7 +29,10 @@ const apply = (runtime, html, selector, mode) => {
29
29
  continue;
30
30
  }
31
31
  if (mode === "outer") morph(target, child, o);
32
- else target.replaceWith(child), activateScripts(child);
32
+ else {
33
+ target.replaceWith(child);
34
+ activateScripts(child);
35
+ }
33
36
  }
34
37
  return;
35
38
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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;",
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 {\n target.replaceWith(child);\n activateScripts(child);\n }\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,WACvC;AACH,eAAO,YAAY,KAAK;AACxB,wBAAgB,KAAK;AAAA,MACvB;AAAA,IACF;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
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"],
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
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
6
  "names": []
7
7
  }
@@ -6,7 +6,5 @@ export type MorphOptions = {
6
6
  };
7
7
  /** Scripts inserted through the DOM do not execute; replace them with fresh copies that do. */
8
8
  export declare const activateScripts: (root: Node) => void;
9
- /** Morph `target` into `next` (outer). */
10
9
  export declare const morph: (target: Element, next: Element, o?: MorphOptions) => void;
11
- /** Morph the children of `target` into the children of `next` (inner). */
12
10
  export declare const morphInner: (target: Element, next: ParentNode, o?: MorphOptions) => void;
@@ -30,20 +30,38 @@ const findKept = (id, from, ctx) => {
30
30
  };
31
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
32
  const syncAttributes = (a, b, ctx) => {
33
- const keep = new Set((b.getAttribute(ctx.preserve) ?? a.getAttribute(ctx.preserve) ?? "").split(/\s+/).filter(Boolean));
33
+ const keep = new Set(
34
+ (b.getAttribute(ctx.preserve) ?? a.getAttribute(ctx.preserve) ?? "").split(/\s+/).filter(Boolean)
35
+ );
34
36
  let changed = false;
35
37
  const attrDiffers = (name) => !keep.has(name) && a.getAttribute(name) !== b.getAttribute(name);
36
38
  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
+ if (attrDiffers("value")) {
40
+ a.value = b.getAttribute("value") ?? "";
41
+ changed = true;
42
+ }
43
+ if (attrDiffers("checked")) {
44
+ a.checked = b.hasAttribute("checked");
45
+ changed = true;
46
+ }
39
47
  } else if (a instanceof HTMLTextAreaElement && b instanceof HTMLTextAreaElement) {
40
- if (!keep.has("value") && a.defaultValue !== b.defaultValue) a.value = b.defaultValue, changed = true;
48
+ if (!keep.has("value") && a.defaultValue !== b.defaultValue) {
49
+ a.value = b.defaultValue;
50
+ changed = true;
51
+ }
41
52
  } else if (a instanceof HTMLOptionElement && b instanceof HTMLOptionElement) {
42
- if (attrDiffers("selected")) a.selected = b.hasAttribute("selected"), changed = true;
53
+ if (attrDiffers("selected")) {
54
+ a.selected = b.hasAttribute("selected");
55
+ changed = true;
56
+ }
43
57
  }
44
- for (const { name, value } of b.attributes) if (!keep.has(name) && a.getAttribute(name) !== value) a.setAttribute(name, value);
58
+ for (const { name, value } of b.attributes)
59
+ if (!keep.has(name) && a.getAttribute(name) !== value) a.setAttribute(name, value);
45
60
  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 }));
61
+ if (changed)
62
+ (a instanceof HTMLOptionElement ? a.closest("select") : a)?.dispatchEvent(
63
+ new Event("sigmx-prop-change", { bubbles: true })
64
+ );
47
65
  };
48
66
  const morphNode = (a, b, ctx) => {
49
67
  if (a.nodeType !== b.nodeType || a.nodeName !== b.nodeName) {
@@ -106,7 +124,12 @@ const context = (target, next, o) => {
106
124
  const keep = /* @__PURE__ */ new Set();
107
125
  const wanted = new Map(idsIn(next).map((e) => [e.id, e.tagName]));
108
126
  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" };
127
+ return {
128
+ keep,
129
+ pantry: document.createDocumentFragment(),
130
+ ignore: o.ignoreAttr ?? "data-ignore-morph",
131
+ preserve: o.preserveAttr ?? "data-preserve-attr"
132
+ };
110
133
  };
111
134
  const morph = (target, next, o = {}) => {
112
135
  const ctx = context(target, next, o);