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/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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",
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\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(\n (b.getAttribute(ctx.preserve) ?? a.getAttribute(ctx.preserve) ?? '').split(/\\s+/).filter(Boolean),\n );\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')) {\n a.value = b.getAttribute('value') ?? '';\n changed = true;\n }\n if (attrDiffers('checked')) {\n a.checked = b.hasAttribute('checked');\n changed = true;\n }\n } else if (a instanceof HTMLTextAreaElement && b instanceof HTMLTextAreaElement) {\n if (!keep.has('value') && a.defaultValue !== b.defaultValue) {\n a.value = b.defaultValue;\n changed = true;\n }\n } else if (a instanceof HTMLOptionElement && b instanceof HTMLOptionElement) {\n if (attrDiffers('selected')) {\n a.selected = b.hasAttribute('selected');\n changed = true;\n }\n }\n for (const { name, value } of b.attributes)\n 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)\n (a instanceof HTMLOptionElement ? a.closest('select') : a)?.dispatchEvent(\n new Event('sigmx-prop-change', { bubbles: true }),\n );\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 {\n keep,\n pantry: document.createDocumentFragment(),\n ignore: o.ignoreAttr ?? 'data-ignore-morph',\n preserve: o.preserveAttr ?? 'data-preserve-attr',\n };\n};\n\nexport const morph = (target: Element, next: Element, o: MorphOptions = {}): void => {\n const ctx = context(target, next, o);\n morphNode(target, next, ctx);\n};\n\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
6
  "names": []
7
7
  }
@@ -1,3 +1,2 @@
1
1
  import type { Plugin } from '../kernel/contracts.js';
2
- /** Every plugin. */
3
2
  export declare const all: Plugin[];
@@ -1,13 +1,31 @@
1
1
  import {
2
+ animate,
3
+ applyElements,
4
+ applyState,
2
5
  attr,
3
6
  bind,
7
+ boost,
4
8
  className,
9
+ clipboard,
10
+ cloak,
11
+ collapse,
5
12
  computed,
13
+ confirm,
6
14
  customValidity,
15
+ dispatch,
7
16
  effect,
17
+ fit,
18
+ html,
19
+ httpDelete,
20
+ httpGet,
21
+ httpPatch,
22
+ httpPost,
23
+ httpPut,
8
24
  indicator,
9
25
  init,
26
+ intl,
10
27
  jsonSignals,
28
+ mask,
11
29
  matchMedia,
12
30
  on,
13
31
  onIntersect,
@@ -15,41 +33,23 @@ import {
15
33
  onRaf,
16
34
  onResize,
17
35
  onSignalPatch,
36
+ peek,
18
37
  persist,
19
38
  queryString,
20
39
  ref,
40
+ removeMe,
21
41
  replaceUrl,
22
42
  scrollIntoView,
43
+ setAll,
23
44
  show,
24
45
  signals,
25
46
  style,
47
+ teleport,
26
48
  text,
27
- viewTransition,
28
- clipboard,
29
- fit,
30
- intl,
31
- peek,
32
- setAll,
33
49
  toggleAll,
34
- animate,
35
- httpDelete,
36
- httpGet,
37
- httpPatch,
38
- httpPost,
39
- httpPut,
40
- applyElements,
41
- applyState,
42
- boost,
43
- cloak,
44
- collapse,
45
- html,
46
- mask,
47
- removeMe,
48
- teleport,
49
50
  transition,
50
51
  trap,
51
- confirm,
52
- dispatch,
52
+ viewTransition,
53
53
  websocket
54
54
  } from "../plugins/index.js";
55
55
  const all = [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/presets/all.ts"],
4
- "sourcesContent": ["import type { Plugin } from '../kernel/contracts.js'\nimport {\n attr,\n bind,\n className,\n computed,\n customValidity,\n effect,\n indicator,\n init,\n jsonSignals,\n matchMedia,\n on,\n onIntersect,\n onInterval,\n onRaf,\n onResize,\n onSignalPatch,\n persist,\n queryString,\n ref,\n replaceUrl,\n scrollIntoView,\n show,\n signals,\n style,\n text,\n viewTransition,\n clipboard,\n fit,\n intl,\n peek,\n setAll,\n toggleAll,\n animate,\n httpDelete,\n httpGet,\n httpPatch,\n httpPost,\n httpPut,\n applyElements,\n applyState,\n boost,\n cloak,\n collapse,\n html,\n mask,\n removeMe,\n teleport,\n transition,\n trap,\n confirm,\n dispatch,\n websocket,\n} from '../plugins/index.js'\n\n/** Every plugin. */\nexport const all: Plugin[] = [\n attr,\n bind,\n className,\n computed,\n customValidity,\n effect,\n indicator,\n init,\n jsonSignals,\n matchMedia,\n on,\n onIntersect,\n onInterval,\n onRaf,\n onResize,\n onSignalPatch,\n persist,\n queryString,\n ref,\n replaceUrl,\n scrollIntoView,\n show,\n signals,\n style,\n text,\n viewTransition,\n clipboard,\n fit,\n intl,\n peek,\n setAll,\n toggleAll,\n animate,\n httpDelete,\n httpGet,\n httpPatch,\n httpPost,\n httpPut,\n applyElements,\n applyState,\n boost,\n cloak,\n collapse,\n html,\n mask,\n removeMe,\n teleport,\n transition,\n trap,\n confirm,\n dispatch,\n websocket,\n]\n"],
5
- "mappings": "AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGA,MAAM,MAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
4
+ "sourcesContent": ["import type { Plugin } from '../kernel/contracts.js';\nimport {\n animate,\n applyElements,\n applyState,\n attr,\n bind,\n boost,\n className,\n clipboard,\n cloak,\n collapse,\n computed,\n confirm,\n customValidity,\n dispatch,\n effect,\n fit,\n html,\n httpDelete,\n httpGet,\n httpPatch,\n httpPost,\n httpPut,\n indicator,\n init,\n intl,\n jsonSignals,\n mask,\n matchMedia,\n on,\n onIntersect,\n onInterval,\n onRaf,\n onResize,\n onSignalPatch,\n peek,\n persist,\n queryString,\n ref,\n removeMe,\n replaceUrl,\n scrollIntoView,\n setAll,\n show,\n signals,\n style,\n teleport,\n text,\n toggleAll,\n transition,\n trap,\n viewTransition,\n websocket,\n} from '../plugins/index.js';\n\nexport const all: Plugin[] = [\n attr,\n bind,\n className,\n computed,\n customValidity,\n effect,\n indicator,\n init,\n jsonSignals,\n matchMedia,\n on,\n onIntersect,\n onInterval,\n onRaf,\n onResize,\n onSignalPatch,\n persist,\n queryString,\n ref,\n replaceUrl,\n scrollIntoView,\n show,\n signals,\n style,\n text,\n viewTransition,\n clipboard,\n fit,\n intl,\n peek,\n setAll,\n toggleAll,\n animate,\n httpDelete,\n httpGet,\n httpPatch,\n httpPost,\n httpPut,\n applyElements,\n applyState,\n boost,\n cloak,\n collapse,\n html,\n mask,\n removeMe,\n teleport,\n transition,\n trap,\n confirm,\n dispatch,\n websocket,\n];\n"],
5
+ "mappings": "AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,MAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,3 +1,2 @@
1
1
  import type { Plugin } from '../kernel/contracts.js';
2
- /** What a typical server-driven app needs: state, rendering, events, forms and the request client with morphing. */
3
2
  export declare const essentials: Plugin[];
@@ -1,17 +1,35 @@
1
- import { applyElements } from "../plugins/server-events/apply-elements.js";
2
- import { applyState } from "../plugins/server-events/apply-state.js";
3
1
  import { attr } from "../plugins/directives/attribute-sync.js";
4
- import { bind } from "../plugins/directives/two-way-bind.js";
2
+ import { indicator } from "../plugins/directives/busy-flag.js";
5
3
  import { className } from "../plugins/directives/class-toggle.js";
4
+ import { signals } from "../plugins/directives/declare.js";
6
5
  import { computed } from "../plugins/directives/derive.js";
7
- import { httpDelete, httpGet, httpPatch, httpPost, httpPut } from "../plugins/functions/request.js";
8
- import { indicator } from "../plugins/directives/busy-flag.js";
9
- import { init } from "../plugins/directives/on-mount.js";
10
6
  import { on } from "../plugins/directives/event-listener.js";
11
- import { show } from "../plugins/directives/visibility.js";
12
- import { signals } from "../plugins/directives/declare.js";
7
+ import { init } from "../plugins/directives/on-mount.js";
13
8
  import { text } from "../plugins/directives/text-content.js";
14
- const essentials = [signals, computed, text, show, className, attr, bind, on, init, indicator, httpGet, httpPost, httpPut, httpPatch, httpDelete, applyElements, applyState];
9
+ import { bind } from "../plugins/directives/two-way-bind.js";
10
+ import { show } from "../plugins/directives/visibility.js";
11
+ import { httpDelete, httpGet, httpPatch, httpPost, httpPut } from "../plugins/functions/request.js";
12
+ import { applyElements } from "../plugins/server-events/apply-elements.js";
13
+ import { applyState } from "../plugins/server-events/apply-state.js";
14
+ const essentials = [
15
+ signals,
16
+ computed,
17
+ text,
18
+ show,
19
+ className,
20
+ attr,
21
+ bind,
22
+ on,
23
+ init,
24
+ indicator,
25
+ httpGet,
26
+ httpPost,
27
+ httpPut,
28
+ httpPatch,
29
+ httpDelete,
30
+ applyElements,
31
+ applyState
32
+ ];
15
33
  export {
16
34
  essentials
17
35
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/presets/essentials.ts"],
4
- "sourcesContent": ["import type { Plugin } from '../kernel/contracts.js'\nimport { applyElements } from '../plugins/server-events/apply-elements.js'\nimport { applyState } from '../plugins/server-events/apply-state.js'\nimport { attr } from '../plugins/directives/attribute-sync.js'\nimport { bind } from '../plugins/directives/two-way-bind.js'\nimport { className } from '../plugins/directives/class-toggle.js'\nimport { computed } from '../plugins/directives/derive.js'\nimport { httpDelete, httpGet, httpPatch, httpPost, httpPut } from '../plugins/functions/request.js'\nimport { indicator } from '../plugins/directives/busy-flag.js'\nimport { init } from '../plugins/directives/on-mount.js'\nimport { on } from '../plugins/directives/event-listener.js'\nimport { show } from '../plugins/directives/visibility.js'\nimport { signals } from '../plugins/directives/declare.js'\nimport { text } from '../plugins/directives/text-content.js'\n\n/** What a typical server-driven app needs: state, rendering, events, forms and the request client with morphing. */\nexport const essentials: Plugin[] = [signals, computed, text, show, className, attr, bind, on, init, indicator, httpGet, httpPost, httpPut, httpPatch, httpDelete, applyElements, applyState]\n"],
5
- "mappings": "AACA,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AACrB,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AACzB,SAAS,YAAY,SAAS,WAAW,UAAU,eAAe;AAClE,SAAS,iBAAiB;AAC1B,SAAS,YAAY;AACrB,SAAS,UAAU;AACnB,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,YAAY;AAGd,MAAM,aAAuB,CAAC,SAAS,UAAU,MAAM,MAAM,WAAW,MAAM,MAAM,IAAI,MAAM,WAAW,SAAS,UAAU,SAAS,WAAW,YAAY,eAAe,UAAU;",
4
+ "sourcesContent": ["import type { Plugin } from '../kernel/contracts.js';\nimport { attr } from '../plugins/directives/attribute-sync.js';\nimport { indicator } from '../plugins/directives/busy-flag.js';\nimport { className } from '../plugins/directives/class-toggle.js';\nimport { signals } from '../plugins/directives/declare.js';\nimport { computed } from '../plugins/directives/derive.js';\nimport { on } from '../plugins/directives/event-listener.js';\nimport { init } from '../plugins/directives/on-mount.js';\nimport { text } from '../plugins/directives/text-content.js';\nimport { bind } from '../plugins/directives/two-way-bind.js';\nimport { show } from '../plugins/directives/visibility.js';\nimport { httpDelete, httpGet, httpPatch, httpPost, httpPut } from '../plugins/functions/request.js';\nimport { applyElements } from '../plugins/server-events/apply-elements.js';\nimport { applyState } from '../plugins/server-events/apply-state.js';\n\nexport const essentials: Plugin[] = [\n signals,\n computed,\n text,\n show,\n className,\n attr,\n bind,\n on,\n init,\n indicator,\n httpGet,\n httpPost,\n httpPut,\n httpPatch,\n httpDelete,\n applyElements,\n applyState,\n];\n"],
5
+ "mappings": "AACA,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,UAAU;AACnB,SAAS,YAAY;AACrB,SAAS,YAAY;AACrB,SAAS,YAAY;AACrB,SAAS,YAAY;AACrB,SAAS,YAAY,SAAS,WAAW,UAAU,eAAe;AAClE,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB;AAEpB,MAAM,aAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,3 +1,2 @@
1
1
  import type { Plugin } from '../kernel/contracts.js';
2
- /** The smallest useful set: declare, read, toggle. */
3
2
  export declare const minimal: Plugin[];
@@ -1,7 +1,7 @@
1
- import { on } from "../plugins/directives/event-listener.js";
2
- import { show } from "../plugins/directives/visibility.js";
3
1
  import { signals } from "../plugins/directives/declare.js";
2
+ import { on } from "../plugins/directives/event-listener.js";
4
3
  import { text } from "../plugins/directives/text-content.js";
4
+ import { show } from "../plugins/directives/visibility.js";
5
5
  const minimal = [signals, text, show, on];
6
6
  export {
7
7
  minimal
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/presets/minimal.ts"],
4
- "sourcesContent": ["import type { Plugin } from '../kernel/contracts.js'\nimport { on } from '../plugins/directives/event-listener.js'\nimport { show } from '../plugins/directives/visibility.js'\nimport { signals } from '../plugins/directives/declare.js'\nimport { text } from '../plugins/directives/text-content.js'\n\n/** The smallest useful set: declare, read, toggle. */\nexport const minimal: Plugin[] = [signals, text, show, on]\n"],
5
- "mappings": "AACA,SAAS,UAAU;AACnB,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,YAAY;AAGd,MAAM,UAAoB,CAAC,SAAS,MAAM,MAAM,EAAE;",
4
+ "sourcesContent": ["import type { Plugin } from '../kernel/contracts.js';\nimport { signals } from '../plugins/directives/declare.js';\nimport { on } from '../plugins/directives/event-listener.js';\nimport { text } from '../plugins/directives/text-content.js';\nimport { show } from '../plugins/directives/visibility.js';\n\nexport const minimal: Plugin[] = [signals, text, show, on];\n"],
5
+ "mappings": "AACA,SAAS,eAAe;AACxB,SAAS,UAAU;AACnB,SAAS,YAAY;AACrB,SAAS,YAAY;AAEd,MAAM,UAAoB,CAAC,SAAS,MAAM,MAAM,EAAE;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,102 @@
1
+ export declare const SIGNALS_KEY = "sigmx";
2
+ export declare const EVENT_PATCH_ELEMENTS = "sigmx-patch-elements";
3
+ export declare const EVENT_PATCH_SIGNALS = "sigmx-patch-signals";
4
+ export declare const SSE_HEADERS: {
5
+ readonly 'content-type': "text/event-stream";
6
+ readonly 'cache-control': "no-cache";
7
+ readonly connection: "keep-alive";
8
+ };
9
+ /** HTML as a string, or anything that renders to one such as a JSX node or an `html` template. */
10
+ export type Markup = string | {
11
+ toString(): string;
12
+ };
13
+ export type PatchMode = 'outer' | 'inner' | 'replace' | 'prepend' | 'append' | 'before' | 'after' | 'remove';
14
+ export interface ServerEvent {
15
+ event: string;
16
+ /** Data lines, each `key value`. */
17
+ lines: string[];
18
+ id?: string;
19
+ retry?: number;
20
+ }
21
+ export interface EventOptions {
22
+ id?: string;
23
+ retry?: number;
24
+ }
25
+ export interface PatchElementsOptions extends EventOptions {
26
+ selector?: string;
27
+ mode?: PatchMode;
28
+ useViewTransition?: boolean;
29
+ }
30
+ export interface PatchSignalsOptions extends EventOptions {
31
+ onlyIfMissing?: boolean;
32
+ }
33
+ export interface ExecuteScriptOptions extends EventOptions {
34
+ /** Remove the script element after it runs (default true). */
35
+ autoRemove?: boolean;
36
+ attributes?: Record<string, string>;
37
+ }
38
+ /** Patch HTML into the page. Without a selector, top-level elements are morphed by id. */
39
+ export declare const patchElements: (html: Markup, o?: PatchElementsOptions) => ServerEvent;
40
+ export declare const removeElements: (selector: string, o?: EventOptions) => ServerEvent;
41
+ /** Merge signals (JSON merge-patch: null removes). Accepts an object or pre-serialised JSON. */
42
+ export declare const patchSignals: (signals: Record<string, unknown> | string, o?: PatchSignalsOptions) => ServerEvent;
43
+ export declare const removeSignals: (paths: string[], o?: EventOptions) => ServerEvent;
44
+ export declare const executeScript: (script: string, o?: ExecuteScriptOptions) => ServerEvent;
45
+ export declare const formatEvent: (e: ServerEvent) => string;
46
+ export declare class SigmxStream {
47
+ readonly response: Response;
48
+ private controller;
49
+ private readonly encoder;
50
+ private open;
51
+ constructor(init?: ResponseInit);
52
+ get closed(): boolean;
53
+ send(event: ServerEvent): this;
54
+ patchElements(html: Markup, o?: PatchElementsOptions): this;
55
+ removeElements(selector: string, o?: EventOptions): this;
56
+ patchSignals(signals: Record<string, unknown> | string, o?: PatchSignalsOptions): this;
57
+ removeSignals(paths: string[], o?: EventOptions): this;
58
+ executeScript(script: string, o?: ExecuteScriptOptions): this;
59
+ close(): void;
60
+ }
61
+ export declare const sse: (...events: ServerEvent[]) => Response;
62
+ /** Stream events while `fn` runs; the response closes when it resolves. */
63
+ export declare const sseStream: (fn: (stream: SigmxStream) => Promise<void> | void, init?: ResponseInit) => Response;
64
+ /** A plain HTML response; the client morphs it by id, or honours the selector and mode headers. */
65
+ export declare const html: (body: Markup, o?: PatchElementsOptions & {
66
+ status?: number;
67
+ }) => Response;
68
+ export declare const json: (signals: Record<string, unknown>, o?: PatchSignalsOptions & {
69
+ status?: number;
70
+ }) => Response;
71
+ /** Minimal Standard Schema (standardschema.dev) so any compliant validator works without a dependency. */
72
+ export interface StandardSchema<Output = unknown> {
73
+ readonly '~standard': {
74
+ readonly validate: (value: unknown) => SchemaResult<Output> | Promise<SchemaResult<Output>>;
75
+ };
76
+ }
77
+ export type SchemaIssue = {
78
+ readonly message: string;
79
+ readonly path?: ReadonlyArray<PropertyKey | {
80
+ readonly key: PropertyKey;
81
+ }>;
82
+ };
83
+ export type SchemaResult<T> = {
84
+ readonly value: T;
85
+ readonly issues?: undefined;
86
+ } | {
87
+ readonly issues: ReadonlyArray<SchemaIssue>;
88
+ };
89
+ export declare class SignalsError extends Error {
90
+ readonly issues: ReadonlyArray<SchemaIssue>;
91
+ readonly status: 400 | 422;
92
+ constructor(message: string, issues?: ReadonlyArray<SchemaIssue>, status?: 400 | 422);
93
+ response(): Response;
94
+ }
95
+ /**
96
+ * Read the signals a sigmx request carries: the `sigmx` query parameter on GET/DELETE, a JSON
97
+ * body otherwise, or form fields for `contentType: 'form'` requests. Validates with `schema` if given.
98
+ */
99
+ export declare function readSignals(request: Request): Promise<Record<string, any>>;
100
+ export declare function readSignals<T>(request: Request, schema: StandardSchema<T>): Promise<T>;
101
+ export declare function validateSignals(raw: unknown, schema?: StandardSchema<any>): Promise<any>;
102
+ export declare const isSigmxRequest: (request: Request) => boolean;
package/dist/server.js ADDED
@@ -0,0 +1,190 @@
1
+ const SIGNALS_KEY = "sigmx";
2
+ const EVENT_PATCH_ELEMENTS = "sigmx-patch-elements";
3
+ const EVENT_PATCH_SIGNALS = "sigmx-patch-signals";
4
+ const SSE_HEADERS = {
5
+ "content-type": "text/event-stream",
6
+ "cache-control": "no-cache",
7
+ connection: "keep-alive"
8
+ };
9
+ const patchElements = (html2, o = {}) => {
10
+ const lines = [];
11
+ if (o.selector) lines.push(`selector ${o.selector}`);
12
+ if (o.mode && o.mode !== "outer") lines.push(`mode ${o.mode}`);
13
+ if (o.useViewTransition) lines.push("useViewTransition true");
14
+ for (const l of String(html2).trim().split("\n")) lines.push(`elements ${l}`);
15
+ return { event: EVENT_PATCH_ELEMENTS, lines, id: o.id, retry: o.retry };
16
+ };
17
+ const removeElements = (selector, o = {}) => ({
18
+ event: EVENT_PATCH_ELEMENTS,
19
+ lines: [`selector ${selector}`, "mode remove"],
20
+ ...o
21
+ });
22
+ const patchSignals = (signals, o = {}) => ({
23
+ event: EVENT_PATCH_SIGNALS,
24
+ lines: [
25
+ ...o.onlyIfMissing ? ["onlyIfMissing true"] : [],
26
+ `signals ${typeof signals === "string" ? signals : JSON.stringify(signals)}`
27
+ ],
28
+ id: o.id,
29
+ retry: o.retry
30
+ });
31
+ const removeSignals = (paths, o = {}) => {
32
+ const patch = {};
33
+ for (const p of paths) {
34
+ const keys = p.split(".");
35
+ const last = keys.pop();
36
+ let cur = patch;
37
+ for (const k of keys) cur = cur[k] ??= {};
38
+ cur[last] = null;
39
+ }
40
+ return patchSignals(patch, o);
41
+ };
42
+ const executeScript = (script, o = {}) => {
43
+ const attrs = { ...o.autoRemove ?? true ? { "data-init": "el.remove()" } : {}, ...o.attributes };
44
+ const attrText = Object.entries(attrs).map(([k, v]) => ` ${k}="${v.replace(/"/g, "&quot;")}"`).join("");
45
+ return patchElements(`<script${attrText}>${script}<\/script>`, {
46
+ selector: "body",
47
+ mode: "append",
48
+ id: o.id,
49
+ retry: o.retry
50
+ });
51
+ };
52
+ const formatEvent = (e) => `${[
53
+ e.id !== void 0 && `id: ${e.id}`,
54
+ e.retry !== void 0 && `retry: ${e.retry}`,
55
+ `event: ${e.event}`,
56
+ ...e.lines.map((l) => `data: ${l}`)
57
+ ].filter(Boolean).join("\n")}
58
+
59
+ `;
60
+ class SigmxStream {
61
+ response;
62
+ controller;
63
+ encoder = new TextEncoder();
64
+ open = true;
65
+ constructor(init = {}) {
66
+ const body = new ReadableStream({
67
+ start: (c) => {
68
+ this.controller = c;
69
+ },
70
+ cancel: () => {
71
+ this.open = false;
72
+ }
73
+ });
74
+ this.response = new Response(body, {
75
+ ...init,
76
+ headers: { ...SSE_HEADERS, ...init.headers }
77
+ });
78
+ }
79
+ get closed() {
80
+ return !this.open;
81
+ }
82
+ send(event) {
83
+ if (this.open) this.controller.enqueue(this.encoder.encode(formatEvent(event)));
84
+ return this;
85
+ }
86
+ patchElements(html2, o) {
87
+ return this.send(patchElements(html2, o));
88
+ }
89
+ removeElements(selector, o) {
90
+ return this.send(removeElements(selector, o));
91
+ }
92
+ patchSignals(signals, o) {
93
+ return this.send(patchSignals(signals, o));
94
+ }
95
+ removeSignals(paths, o) {
96
+ return this.send(removeSignals(paths, o));
97
+ }
98
+ executeScript(script, o) {
99
+ return this.send(executeScript(script, o));
100
+ }
101
+ close() {
102
+ if (this.open) {
103
+ this.open = false;
104
+ this.controller.close();
105
+ }
106
+ }
107
+ }
108
+ const sse = (...events) => new Response(events.map(formatEvent).join(""), { headers: SSE_HEADERS });
109
+ const sseStream = (fn, init) => {
110
+ const stream = new SigmxStream(init);
111
+ Promise.resolve().then(() => fn(stream)).catch((e) => console.error("sigmx sseStream:", e)).finally(() => stream.close());
112
+ return stream.response;
113
+ };
114
+ const html = (body, o = {}) => new Response(String(body), {
115
+ status: o.status ?? 200,
116
+ headers: {
117
+ "content-type": "text/html; charset=utf-8",
118
+ ...o.selector ? { "sigmx-selector": o.selector } : {},
119
+ ...o.mode ? { "sigmx-mode": o.mode } : {},
120
+ ...o.useViewTransition ? { "sigmx-use-view-transition": "true" } : {}
121
+ }
122
+ });
123
+ const json = (signals, o = {}) => new Response(JSON.stringify(signals), {
124
+ status: o.status ?? 200,
125
+ headers: { "content-type": "application/json", ...o.onlyIfMissing ? { "sigmx-only-if-missing": "true" } : {} }
126
+ });
127
+ class SignalsError extends Error {
128
+ constructor(message, issues = [], status = 422) {
129
+ super(message);
130
+ this.issues = issues;
131
+ this.status = status;
132
+ this.name = "SignalsError";
133
+ }
134
+ issues;
135
+ status;
136
+ response() {
137
+ return Response.json({ error: this.message, issues: this.issues }, { status: this.status });
138
+ }
139
+ }
140
+ async function readSignals(request, schema) {
141
+ let raw;
142
+ const method = request.method.toUpperCase();
143
+ const type = request.headers.get("content-type") ?? "";
144
+ try {
145
+ if (method === "GET" || method === "DELETE") {
146
+ const q = new URL(request.url).searchParams.get(SIGNALS_KEY);
147
+ raw = q ? JSON.parse(q) : {};
148
+ } else if (type.includes("application/json")) {
149
+ const text = await request.text();
150
+ raw = text ? JSON.parse(text) : {};
151
+ } else if (type.includes("form")) {
152
+ raw = Object.fromEntries((await request.formData()).entries());
153
+ } else {
154
+ raw = {};
155
+ }
156
+ } catch (e) {
157
+ throw new SignalsError(`could not parse signals: ${e.message}`, [], 400);
158
+ }
159
+ return validateSignals(raw, schema);
160
+ }
161
+ async function validateSignals(raw, schema) {
162
+ if (!schema) return raw;
163
+ const result = await schema["~standard"].validate(raw);
164
+ if (result.issues)
165
+ throw new SignalsError(`invalid signals: ${result.issues.map((i) => i.message).join("; ")}`, result.issues);
166
+ return result.value;
167
+ }
168
+ const isSigmxRequest = (request) => request.headers.get("sigmx-request") === "true";
169
+ export {
170
+ EVENT_PATCH_ELEMENTS,
171
+ EVENT_PATCH_SIGNALS,
172
+ SIGNALS_KEY,
173
+ SSE_HEADERS,
174
+ SigmxStream,
175
+ SignalsError,
176
+ executeScript,
177
+ formatEvent,
178
+ html,
179
+ isSigmxRequest,
180
+ json,
181
+ patchElements,
182
+ patchSignals,
183
+ readSignals,
184
+ removeElements,
185
+ removeSignals,
186
+ sse,
187
+ sseStream,
188
+ validateSignals
189
+ };
190
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/server.ts"],
4
+ "sourcesContent": ["export const SIGNALS_KEY = 'sigmx';\nexport const EVENT_PATCH_ELEMENTS = 'sigmx-patch-elements';\nexport const EVENT_PATCH_SIGNALS = 'sigmx-patch-signals';\nexport const SSE_HEADERS = {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache',\n connection: 'keep-alive',\n} as const;\n\n/** HTML as a string, or anything that renders to one such as a JSX node or an `html` template. */\nexport type Markup = string | { toString(): string };\n\nexport type PatchMode = 'outer' | 'inner' | 'replace' | 'prepend' | 'append' | 'before' | 'after' | 'remove';\n\nexport interface ServerEvent {\n event: string;\n /** Data lines, each `key value`. */\n lines: string[];\n id?: string;\n retry?: number;\n}\nexport interface EventOptions {\n id?: string;\n retry?: number;\n}\nexport interface PatchElementsOptions extends EventOptions {\n selector?: string;\n mode?: PatchMode;\n useViewTransition?: boolean;\n}\nexport interface PatchSignalsOptions extends EventOptions {\n onlyIfMissing?: boolean;\n}\nexport interface ExecuteScriptOptions extends EventOptions {\n /** Remove the script element after it runs (default true). */\n autoRemove?: boolean;\n attributes?: Record<string, string>;\n}\n\n/** Patch HTML into the page. Without a selector, top-level elements are morphed by id. */\nexport const patchElements = (html: Markup, o: PatchElementsOptions = {}): ServerEvent => {\n const lines: string[] = [];\n if (o.selector) lines.push(`selector ${o.selector}`);\n if (o.mode && o.mode !== 'outer') lines.push(`mode ${o.mode}`);\n if (o.useViewTransition) lines.push('useViewTransition true');\n for (const l of String(html).trim().split('\\n')) lines.push(`elements ${l}`);\n return { event: EVENT_PATCH_ELEMENTS, lines, id: o.id, retry: o.retry };\n};\n\nexport const removeElements = (selector: string, o: EventOptions = {}): ServerEvent => ({\n event: EVENT_PATCH_ELEMENTS,\n lines: [`selector ${selector}`, 'mode remove'],\n ...o,\n});\n\n/** Merge signals (JSON merge-patch: null removes). Accepts an object or pre-serialised JSON. */\nexport const patchSignals = (signals: Record<string, unknown> | string, o: PatchSignalsOptions = {}): ServerEvent => ({\n event: EVENT_PATCH_SIGNALS,\n lines: [\n ...(o.onlyIfMissing ? ['onlyIfMissing true'] : []),\n `signals ${typeof signals === 'string' ? signals : JSON.stringify(signals)}`,\n ],\n id: o.id,\n retry: o.retry,\n});\n\nexport const removeSignals = (paths: string[], o: EventOptions = {}): ServerEvent => {\n const patch: Record<string, any> = {};\n for (const p of paths) {\n const keys = p.split('.');\n const last = keys.pop() as string;\n let cur = patch;\n for (const k of keys) cur = cur[k] ??= {};\n cur[last] = null;\n }\n return patchSignals(patch, o);\n};\n\nexport const executeScript = (script: string, o: ExecuteScriptOptions = {}): ServerEvent => {\n const attrs = { ...((o.autoRemove ?? true) ? { 'data-init': 'el.remove()' } : {}), ...o.attributes };\n const attrText = Object.entries(attrs)\n .map(([k, v]) => ` ${k}=\"${v.replace(/\"/g, '&quot;')}\"`)\n .join('');\n return patchElements(`<script${attrText}>${script}</script>`, {\n selector: 'body',\n mode: 'append',\n id: o.id,\n retry: o.retry,\n });\n};\n\nexport const formatEvent = (e: ServerEvent): string =>\n `${[\n e.id !== undefined && `id: ${e.id}`,\n e.retry !== undefined && `retry: ${e.retry}`,\n `event: ${e.event}`,\n ...e.lines.map((l) => `data: ${l}`),\n ]\n .filter(Boolean)\n .join('\\n')}\\n\\n`;\n\nexport class SigmxStream {\n readonly response: Response;\n private controller!: ReadableStreamDefaultController<Uint8Array>;\n private readonly encoder = new TextEncoder();\n private open = true;\n\n constructor(init: ResponseInit = {}) {\n const body = new ReadableStream<Uint8Array>({\n start: (c) => {\n this.controller = c;\n },\n cancel: () => {\n this.open = false;\n },\n });\n this.response = new Response(body, {\n ...init,\n headers: { ...SSE_HEADERS, ...(init.headers as Record<string, string>) },\n });\n }\n get closed(): boolean {\n return !this.open;\n }\n send(event: ServerEvent): this {\n if (this.open) this.controller.enqueue(this.encoder.encode(formatEvent(event)));\n return this;\n }\n patchElements(html: Markup, o?: PatchElementsOptions): this {\n return this.send(patchElements(html, o));\n }\n removeElements(selector: string, o?: EventOptions): this {\n return this.send(removeElements(selector, o));\n }\n patchSignals(signals: Record<string, unknown> | string, o?: PatchSignalsOptions): this {\n return this.send(patchSignals(signals, o));\n }\n removeSignals(paths: string[], o?: EventOptions): this {\n return this.send(removeSignals(paths, o));\n }\n executeScript(script: string, o?: ExecuteScriptOptions): this {\n return this.send(executeScript(script, o));\n }\n close(): void {\n if (this.open) {\n this.open = false;\n this.controller.close();\n }\n }\n}\n\nexport const sse = (...events: ServerEvent[]): Response =>\n new Response(events.map(formatEvent).join(''), { headers: SSE_HEADERS });\n\n/** Stream events while `fn` runs; the response closes when it resolves. */\nexport const sseStream = (fn: (stream: SigmxStream) => Promise<void> | void, init?: ResponseInit): Response => {\n const stream = new SigmxStream(init);\n Promise.resolve()\n .then(() => fn(stream))\n .catch((e) => console.error('sigmx sseStream:', e))\n .finally(() => stream.close());\n return stream.response;\n};\n\n/** A plain HTML response; the client morphs it by id, or honours the selector and mode headers. */\nexport const html = (body: Markup, o: PatchElementsOptions & { status?: number } = {}): Response =>\n new Response(String(body), {\n status: o.status ?? 200,\n headers: {\n 'content-type': 'text/html; charset=utf-8',\n ...(o.selector ? { 'sigmx-selector': o.selector } : {}),\n ...(o.mode ? { 'sigmx-mode': o.mode } : {}),\n ...(o.useViewTransition ? { 'sigmx-use-view-transition': 'true' } : {}),\n },\n });\n\nexport const json = (signals: Record<string, unknown>, o: PatchSignalsOptions & { status?: number } = {}): Response =>\n new Response(JSON.stringify(signals), {\n status: o.status ?? 200,\n headers: { 'content-type': 'application/json', ...(o.onlyIfMissing ? { 'sigmx-only-if-missing': 'true' } : {}) },\n });\n\n/** Minimal Standard Schema (standardschema.dev) so any compliant validator works without a dependency. */\nexport interface StandardSchema<Output = unknown> {\n readonly '~standard': {\n readonly validate: (value: unknown) => SchemaResult<Output> | Promise<SchemaResult<Output>>;\n };\n}\nexport type SchemaIssue = {\n readonly message: string;\n readonly path?: ReadonlyArray<PropertyKey | { readonly key: PropertyKey }>;\n};\nexport type SchemaResult<T> =\n | { readonly value: T; readonly issues?: undefined }\n | { readonly issues: ReadonlyArray<SchemaIssue> };\n\nexport class SignalsError extends Error {\n constructor(\n message: string,\n readonly issues: ReadonlyArray<SchemaIssue> = [],\n readonly status: 400 | 422 = 422,\n ) {\n super(message);\n this.name = 'SignalsError';\n }\n response(): Response {\n return Response.json({ error: this.message, issues: this.issues }, { status: this.status });\n }\n}\n\n/**\n * Read the signals a sigmx request carries: the `sigmx` query parameter on GET/DELETE, a JSON\n * body otherwise, or form fields for `contentType: 'form'` requests. Validates with `schema` if given.\n */\nexport async function readSignals(request: Request): Promise<Record<string, any>>;\nexport async function readSignals<T>(request: Request, schema: StandardSchema<T>): Promise<T>;\nexport async function readSignals(request: Request, schema?: StandardSchema<any>): Promise<any> {\n let raw: unknown;\n const method = request.method.toUpperCase();\n const type = request.headers.get('content-type') ?? '';\n try {\n if (method === 'GET' || method === 'DELETE') {\n const q = new URL(request.url).searchParams.get(SIGNALS_KEY);\n raw = q ? JSON.parse(q) : {};\n } else if (type.includes('application/json')) {\n const text = await request.text();\n raw = text ? JSON.parse(text) : {};\n } else if (type.includes('form')) {\n raw = Object.fromEntries((await request.formData()).entries());\n } else {\n raw = {};\n }\n } catch (e) {\n throw new SignalsError(`could not parse signals: ${(e as Error).message}`, [], 400);\n }\n return validateSignals(raw, schema);\n}\n\nexport async function validateSignals(raw: unknown, schema?: StandardSchema<any>): Promise<any> {\n if (!schema) return raw;\n const result = await schema['~standard'].validate(raw);\n if (result.issues)\n throw new SignalsError(`invalid signals: ${result.issues.map((i) => i.message).join('; ')}`, result.issues);\n return result.value;\n}\n\nexport const isSigmxRequest = (request: Request): boolean => request.headers.get('sigmx-request') === 'true';\n"],
5
+ "mappings": "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",
6
+ "names": ["html"]
7
+ }