sigmx 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (344) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +173 -0
  3. package/dist/auto.d.ts +1 -0
  4. package/dist/auto.js +7 -0
  5. package/dist/auto.js.map +7 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.js +26 -0
  8. package/dist/cli.js.map +7 -0
  9. package/dist/core/csp.d.ts +7 -0
  10. package/dist/core/csp.js +20 -0
  11. package/dist/core/csp.js.map +7 -0
  12. package/dist/core/engine.d.ts +10 -0
  13. package/dist/core/engine.js +200 -0
  14. package/dist/core/engine.js.map +7 -0
  15. package/dist/core/expr.d.ts +12 -0
  16. package/dist/core/expr.js +94 -0
  17. package/dist/core/expr.js.map +7 -0
  18. package/dist/core/index.d.ts +16 -0
  19. package/dist/core/index.js +46 -0
  20. package/dist/core/index.js.map +7 -0
  21. package/dist/core/signals.d.ts +42 -0
  22. package/dist/core/signals.js +195 -0
  23. package/dist/core/signals.js.map +7 -0
  24. package/dist/core/store.d.ts +32 -0
  25. package/dist/core/store.js +185 -0
  26. package/dist/core/store.js.map +7 -0
  27. package/dist/core/types.d.ts +101 -0
  28. package/dist/core/types.js +1 -0
  29. package/dist/core/types.js.map +7 -0
  30. package/dist/kernel/compile.d.ts +16 -0
  31. package/dist/kernel/compile.js +96 -0
  32. package/dist/kernel/compile.js.map +7 -0
  33. package/dist/kernel/contracts.d.ts +121 -0
  34. package/dist/kernel/contracts.js +1 -0
  35. package/dist/kernel/contracts.js.map +7 -0
  36. package/dist/kernel/index.d.ts +20 -0
  37. package/dist/kernel/index.js +54 -0
  38. package/dist/kernel/index.js.map +7 -0
  39. package/dist/kernel/precompile.d.ts +25 -0
  40. package/dist/kernel/precompile.js +111 -0
  41. package/dist/kernel/precompile.js.map +7 -0
  42. package/dist/kernel/precompiled.d.ts +11 -0
  43. package/dist/kernel/precompiled.js +13 -0
  44. package/dist/kernel/precompiled.js.map +7 -0
  45. package/dist/kernel/reactive.d.ts +42 -0
  46. package/dist/kernel/reactive.js +201 -0
  47. package/dist/kernel/reactive.js.map +7 -0
  48. package/dist/kernel/runtime.d.ts +11 -0
  49. package/dist/kernel/runtime.js +210 -0
  50. package/dist/kernel/runtime.js.map +7 -0
  51. package/dist/kernel/scan.d.ts +42 -0
  52. package/dist/kernel/scan.js +68 -0
  53. package/dist/kernel/scan.js.map +7 -0
  54. package/dist/kernel/state.d.ts +32 -0
  55. package/dist/kernel/state.js +186 -0
  56. package/dist/kernel/state.js.map +7 -0
  57. package/dist/kernel/strict-csp.d.ts +7 -0
  58. package/dist/kernel/strict-csp.js +20 -0
  59. package/dist/kernel/strict-csp.js.map +7 -0
  60. package/dist/lib/casing.d.ts +7 -0
  61. package/dist/lib/casing.js +16 -0
  62. package/dist/lib/casing.js.map +7 -0
  63. package/dist/lib/objects.d.ts +9 -0
  64. package/dist/lib/objects.js +26 -0
  65. package/dist/lib/objects.js.map +7 -0
  66. package/dist/lib/schedule.d.ts +14 -0
  67. package/dist/lib/schedule.js +51 -0
  68. package/dist/lib/schedule.js.map +7 -0
  69. package/dist/lib/sse.d.ts +10 -0
  70. package/dist/lib/sse.js +55 -0
  71. package/dist/lib/sse.js.map +7 -0
  72. package/dist/plugins/actions/clipboard.d.ts +2 -0
  73. package/dist/plugins/actions/clipboard.js +11 -0
  74. package/dist/plugins/actions/clipboard.js.map +7 -0
  75. package/dist/plugins/actions/fit.d.ts +2 -0
  76. package/dist/plugins/actions/fit.js +14 -0
  77. package/dist/plugins/actions/fit.js.map +7 -0
  78. package/dist/plugins/actions/intl.d.ts +2 -0
  79. package/dist/plugins/actions/intl.js +21 -0
  80. package/dist/plugins/actions/intl.js.map +7 -0
  81. package/dist/plugins/actions/peek.d.ts +2 -0
  82. package/dist/plugins/actions/peek.js +6 -0
  83. package/dist/plugins/actions/peek.js.map +7 -0
  84. package/dist/plugins/actions/setAll.d.ts +2 -0
  85. package/dist/plugins/actions/setAll.js +11 -0
  86. package/dist/plugins/actions/setAll.js.map +7 -0
  87. package/dist/plugins/actions/toggleAll.d.ts +2 -0
  88. package/dist/plugins/actions/toggleAll.js +11 -0
  89. package/dist/plugins/actions/toggleAll.js.map +7 -0
  90. package/dist/plugins/attributes/attr.d.ts +2 -0
  91. package/dist/plugins/attributes/attr.js +20 -0
  92. package/dist/plugins/attributes/attr.js.map +7 -0
  93. package/dist/plugins/attributes/bind.d.ts +6 -0
  94. package/dist/plugins/attributes/bind.js +81 -0
  95. package/dist/plugins/attributes/bind.js.map +7 -0
  96. package/dist/plugins/attributes/class.d.ts +2 -0
  97. package/dist/plugins/attributes/class.js +22 -0
  98. package/dist/plugins/attributes/class.js.map +7 -0
  99. package/dist/plugins/attributes/computed.d.ts +2 -0
  100. package/dist/plugins/attributes/computed.js +20 -0
  101. package/dist/plugins/attributes/computed.js.map +7 -0
  102. package/dist/plugins/attributes/customValidity.d.ts +2 -0
  103. package/dist/plugins/attributes/customValidity.js +14 -0
  104. package/dist/plugins/attributes/customValidity.js.map +7 -0
  105. package/dist/plugins/attributes/effect.d.ts +2 -0
  106. package/dist/plugins/attributes/effect.js +12 -0
  107. package/dist/plugins/attributes/effect.js.map +7 -0
  108. package/dist/plugins/attributes/indicator.d.ts +2 -0
  109. package/dist/plugins/attributes/indicator.js +20 -0
  110. package/dist/plugins/attributes/indicator.js.map +7 -0
  111. package/dist/plugins/attributes/init.d.ts +2 -0
  112. package/dist/plugins/attributes/init.js +14 -0
  113. package/dist/plugins/attributes/init.js.map +7 -0
  114. package/dist/plugins/attributes/jsonSignals.d.ts +2 -0
  115. package/dist/plugins/attributes/jsonSignals.js +15 -0
  116. package/dist/plugins/attributes/jsonSignals.js.map +7 -0
  117. package/dist/plugins/attributes/matchMedia.d.ts +2 -0
  118. package/dist/plugins/attributes/matchMedia.js +19 -0
  119. package/dist/plugins/attributes/matchMedia.js.map +7 -0
  120. package/dist/plugins/attributes/on.d.ts +5 -0
  121. package/dist/plugins/attributes/on.js +28 -0
  122. package/dist/plugins/attributes/on.js.map +7 -0
  123. package/dist/plugins/attributes/onIntersect.d.ts +2 -0
  124. package/dist/plugins/attributes/onIntersect.js +28 -0
  125. package/dist/plugins/attributes/onIntersect.js.map +7 -0
  126. package/dist/plugins/attributes/onInterval.d.ts +2 -0
  127. package/dist/plugins/attributes/onInterval.js +18 -0
  128. package/dist/plugins/attributes/onInterval.js.map +7 -0
  129. package/dist/plugins/attributes/onRaf.d.ts +1 -0
  130. package/dist/plugins/attributes/onRaf.js +19 -0
  131. package/dist/plugins/attributes/onRaf.js.map +7 -0
  132. package/dist/plugins/attributes/onResize.d.ts +1 -0
  133. package/dist/plugins/attributes/onResize.js +17 -0
  134. package/dist/plugins/attributes/onResize.js.map +7 -0
  135. package/dist/plugins/attributes/onSignalPatch.d.ts +5 -0
  136. package/dist/plugins/attributes/onSignalPatch.js +35 -0
  137. package/dist/plugins/attributes/onSignalPatch.js.map +7 -0
  138. package/dist/plugins/attributes/persist.d.ts +6 -0
  139. package/dist/plugins/attributes/persist.js +16 -0
  140. package/dist/plugins/attributes/persist.js.map +7 -0
  141. package/dist/plugins/attributes/queryString.d.ts +5 -0
  142. package/dist/plugins/attributes/queryString.js +54 -0
  143. package/dist/plugins/attributes/queryString.js.map +7 -0
  144. package/dist/plugins/attributes/ref.d.ts +2 -0
  145. package/dist/plugins/attributes/ref.js +13 -0
  146. package/dist/plugins/attributes/ref.js.map +7 -0
  147. package/dist/plugins/attributes/replaceUrl.d.ts +1 -0
  148. package/dist/plugins/attributes/replaceUrl.js +11 -0
  149. package/dist/plugins/attributes/replaceUrl.js.map +7 -0
  150. package/dist/plugins/attributes/scrollIntoView.d.ts +2 -0
  151. package/dist/plugins/attributes/scrollIntoView.js +19 -0
  152. package/dist/plugins/attributes/scrollIntoView.js.map +7 -0
  153. package/dist/plugins/attributes/show.d.ts +2 -0
  154. package/dist/plugins/attributes/show.js +19 -0
  155. package/dist/plugins/attributes/show.js.map +7 -0
  156. package/dist/plugins/attributes/signals.d.ts +2 -0
  157. package/dist/plugins/attributes/signals.js +13 -0
  158. package/dist/plugins/attributes/signals.js.map +7 -0
  159. package/dist/plugins/attributes/style.d.ts +2 -0
  160. package/dist/plugins/attributes/style.js +25 -0
  161. package/dist/plugins/attributes/style.js.map +7 -0
  162. package/dist/plugins/attributes/text.d.ts +1 -0
  163. package/dist/plugins/attributes/text.js +13 -0
  164. package/dist/plugins/attributes/text.js.map +7 -0
  165. package/dist/plugins/attributes/viewTransition.d.ts +1 -0
  166. package/dist/plugins/attributes/viewTransition.js +11 -0
  167. package/dist/plugins/attributes/viewTransition.js.map +7 -0
  168. package/dist/plugins/directives/attribute-sync.d.ts +2 -0
  169. package/dist/plugins/directives/attribute-sync.js +20 -0
  170. package/dist/plugins/directives/attribute-sync.js.map +7 -0
  171. package/dist/plugins/directives/boost.d.ts +6 -0
  172. package/dist/plugins/directives/boost.js +35 -0
  173. package/dist/plugins/directives/boost.js.map +7 -0
  174. package/dist/plugins/directives/busy-flag.d.ts +2 -0
  175. package/dist/plugins/directives/busy-flag.js +21 -0
  176. package/dist/plugins/directives/busy-flag.js.map +7 -0
  177. package/dist/plugins/directives/class-toggle.d.ts +2 -0
  178. package/dist/plugins/directives/class-toggle.js +22 -0
  179. package/dist/plugins/directives/class-toggle.js.map +7 -0
  180. package/dist/plugins/directives/cloak.d.ts +5 -0
  181. package/dist/plugins/directives/cloak.js +11 -0
  182. package/dist/plugins/directives/cloak.js.map +7 -0
  183. package/dist/plugins/directives/collapse.d.ts +5 -0
  184. package/dist/plugins/directives/collapse.js +42 -0
  185. package/dist/plugins/directives/collapse.js.map +7 -0
  186. package/dist/plugins/directives/declare.d.ts +2 -0
  187. package/dist/plugins/directives/declare.js +13 -0
  188. package/dist/plugins/directives/declare.js.map +7 -0
  189. package/dist/plugins/directives/derive.d.ts +2 -0
  190. package/dist/plugins/directives/derive.js +20 -0
  191. package/dist/plugins/directives/derive.js.map +7 -0
  192. package/dist/plugins/directives/element-ref.d.ts +2 -0
  193. package/dist/plugins/directives/element-ref.js +13 -0
  194. package/dist/plugins/directives/element-ref.js.map +7 -0
  195. package/dist/plugins/directives/event-listener.d.ts +5 -0
  196. package/dist/plugins/directives/event-listener.js +28 -0
  197. package/dist/plugins/directives/event-listener.js.map +7 -0
  198. package/dist/plugins/directives/frame-loop.d.ts +1 -0
  199. package/dist/plugins/directives/frame-loop.js +19 -0
  200. package/dist/plugins/directives/frame-loop.js.map +7 -0
  201. package/dist/plugins/directives/html.d.ts +2 -0
  202. package/dist/plugins/directives/html.js +13 -0
  203. package/dist/plugins/directives/html.js.map +7 -0
  204. package/dist/plugins/directives/inline-style.d.ts +2 -0
  205. package/dist/plugins/directives/inline-style.js +25 -0
  206. package/dist/plugins/directives/inline-style.js.map +7 -0
  207. package/dist/plugins/directives/mask.d.ts +7 -0
  208. package/dist/plugins/directives/mask.js +47 -0
  209. package/dist/plugins/directives/mask.js.map +7 -0
  210. package/dist/plugins/directives/media-query.d.ts +2 -0
  211. package/dist/plugins/directives/media-query.js +19 -0
  212. package/dist/plugins/directives/media-query.js.map +7 -0
  213. package/dist/plugins/directives/on-mount.d.ts +2 -0
  214. package/dist/plugins/directives/on-mount.js +14 -0
  215. package/dist/plugins/directives/on-mount.js.map +7 -0
  216. package/dist/plugins/directives/patch-listener.d.ts +5 -0
  217. package/dist/plugins/directives/patch-listener.js +35 -0
  218. package/dist/plugins/directives/patch-listener.js.map +7 -0
  219. package/dist/plugins/directives/remove-me.d.ts +2 -0
  220. package/dist/plugins/directives/remove-me.js +13 -0
  221. package/dist/plugins/directives/remove-me.js.map +7 -0
  222. package/dist/plugins/directives/scroll-to.d.ts +2 -0
  223. package/dist/plugins/directives/scroll-to.js +19 -0
  224. package/dist/plugins/directives/scroll-to.js.map +7 -0
  225. package/dist/plugins/directives/size-watch.d.ts +1 -0
  226. package/dist/plugins/directives/size-watch.js +17 -0
  227. package/dist/plugins/directives/size-watch.js.map +7 -0
  228. package/dist/plugins/directives/state-dump.d.ts +2 -0
  229. package/dist/plugins/directives/state-dump.js +15 -0
  230. package/dist/plugins/directives/state-dump.js.map +7 -0
  231. package/dist/plugins/directives/storage-sync.d.ts +6 -0
  232. package/dist/plugins/directives/storage-sync.js +16 -0
  233. package/dist/plugins/directives/storage-sync.js.map +7 -0
  234. package/dist/plugins/directives/teleport.d.ts +5 -0
  235. package/dist/plugins/directives/teleport.js +19 -0
  236. package/dist/plugins/directives/teleport.js.map +7 -0
  237. package/dist/plugins/directives/text-content.d.ts +1 -0
  238. package/dist/plugins/directives/text-content.js +13 -0
  239. package/dist/plugins/directives/text-content.js.map +7 -0
  240. package/dist/plugins/directives/timer.d.ts +2 -0
  241. package/dist/plugins/directives/timer.js +18 -0
  242. package/dist/plugins/directives/timer.js.map +7 -0
  243. package/dist/plugins/directives/transition-name.d.ts +1 -0
  244. package/dist/plugins/directives/transition-name.js +11 -0
  245. package/dist/plugins/directives/transition-name.js.map +7 -0
  246. package/dist/plugins/directives/transition.d.ts +5 -0
  247. package/dist/plugins/directives/transition.js +40 -0
  248. package/dist/plugins/directives/transition.js.map +7 -0
  249. package/dist/plugins/directives/trap.d.ts +5 -0
  250. package/dist/plugins/directives/trap.js +48 -0
  251. package/dist/plugins/directives/trap.js.map +7 -0
  252. package/dist/plugins/directives/tween.d.ts +6 -0
  253. package/dist/plugins/directives/tween.js +58 -0
  254. package/dist/plugins/directives/tween.js.map +7 -0
  255. package/dist/plugins/directives/two-way-bind.d.ts +6 -0
  256. package/dist/plugins/directives/two-way-bind.js +82 -0
  257. package/dist/plugins/directives/two-way-bind.js.map +7 -0
  258. package/dist/plugins/directives/url-params.d.ts +13 -0
  259. package/dist/plugins/directives/url-params.js +76 -0
  260. package/dist/plugins/directives/url-params.js.map +7 -0
  261. package/dist/plugins/directives/url-replace.d.ts +1 -0
  262. package/dist/plugins/directives/url-replace.js +11 -0
  263. package/dist/plugins/directives/url-replace.js.map +7 -0
  264. package/dist/plugins/directives/validity.d.ts +2 -0
  265. package/dist/plugins/directives/validity.js +14 -0
  266. package/dist/plugins/directives/validity.js.map +7 -0
  267. package/dist/plugins/directives/viewport.d.ts +2 -0
  268. package/dist/plugins/directives/viewport.js +28 -0
  269. package/dist/plugins/directives/viewport.js.map +7 -0
  270. package/dist/plugins/directives/visibility.d.ts +2 -0
  271. package/dist/plugins/directives/visibility.js +19 -0
  272. package/dist/plugins/directives/visibility.js.map +7 -0
  273. package/dist/plugins/directives/watch.d.ts +2 -0
  274. package/dist/plugins/directives/watch.js +12 -0
  275. package/dist/plugins/directives/watch.js.map +7 -0
  276. package/dist/plugins/functions/bulk-set.d.ts +2 -0
  277. package/dist/plugins/functions/bulk-set.js +11 -0
  278. package/dist/plugins/functions/bulk-set.js.map +7 -0
  279. package/dist/plugins/functions/bulk-toggle.d.ts +2 -0
  280. package/dist/plugins/functions/bulk-toggle.js +11 -0
  281. package/dist/plugins/functions/bulk-toggle.js.map +7 -0
  282. package/dist/plugins/functions/confirm.d.ts +2 -0
  283. package/dist/plugins/functions/confirm.js +6 -0
  284. package/dist/plugins/functions/confirm.js.map +7 -0
  285. package/dist/plugins/functions/copy-text.d.ts +2 -0
  286. package/dist/plugins/functions/copy-text.js +11 -0
  287. package/dist/plugins/functions/copy-text.js.map +7 -0
  288. package/dist/plugins/functions/dispatch.d.ts +2 -0
  289. package/dist/plugins/functions/dispatch.js +9 -0
  290. package/dist/plugins/functions/dispatch.js.map +7 -0
  291. package/dist/plugins/functions/locale-format.d.ts +2 -0
  292. package/dist/plugins/functions/locale-format.js +21 -0
  293. package/dist/plugins/functions/locale-format.js.map +7 -0
  294. package/dist/plugins/functions/range-map.d.ts +2 -0
  295. package/dist/plugins/functions/range-map.js +14 -0
  296. package/dist/plugins/functions/range-map.js.map +7 -0
  297. package/dist/plugins/functions/request.d.ts +30 -0
  298. package/dist/plugins/functions/request.js +152 -0
  299. package/dist/plugins/functions/request.js.map +7 -0
  300. package/dist/plugins/functions/untracked-read.d.ts +2 -0
  301. package/dist/plugins/functions/untracked-read.js +6 -0
  302. package/dist/plugins/functions/untracked-read.js.map +7 -0
  303. package/dist/plugins/functions/websocket.d.ts +11 -0
  304. package/dist/plugins/functions/websocket.js +35 -0
  305. package/dist/plugins/functions/websocket.js.map +7 -0
  306. package/dist/plugins/index.d.ts +52 -0
  307. package/dist/plugins/index.js +108 -0
  308. package/dist/plugins/index.js.map +7 -0
  309. package/dist/plugins/server-events/apply-elements.d.ts +2 -0
  310. package/dist/plugins/server-events/apply-elements.js +62 -0
  311. package/dist/plugins/server-events/apply-elements.js.map +7 -0
  312. package/dist/plugins/server-events/apply-state.d.ts +2 -0
  313. package/dist/plugins/server-events/apply-state.js +18 -0
  314. package/dist/plugins/server-events/apply-state.js.map +7 -0
  315. package/dist/plugins/server-events/morph.d.ts +12 -0
  316. package/dist/plugins/server-events/morph.js +124 -0
  317. package/dist/plugins/server-events/morph.js.map +7 -0
  318. package/dist/presets/all.d.ts +3 -0
  319. package/dist/presets/all.js +112 -0
  320. package/dist/presets/all.js.map +7 -0
  321. package/dist/presets/essentials.d.ts +3 -0
  322. package/dist/presets/essentials.js +18 -0
  323. package/dist/presets/essentials.js.map +7 -0
  324. package/dist/presets/minimal.d.ts +3 -0
  325. package/dist/presets/minimal.js +9 -0
  326. package/dist/presets/minimal.js.map +7 -0
  327. package/dist/sigmx.auto.js +5 -0
  328. package/dist/sigmx.standalone.js +1 -0
  329. package/dist/standalone.d.ts +1 -0
  330. package/dist/standalone.js +8 -0
  331. package/dist/standalone.js.map +7 -0
  332. package/dist/utils/object.d.ts +9 -0
  333. package/dist/utils/object.js +26 -0
  334. package/dist/utils/object.js.map +7 -0
  335. package/dist/utils/text.d.ts +7 -0
  336. package/dist/utils/text.js +15 -0
  337. package/dist/utils/text.js.map +7 -0
  338. package/dist/utils/timing.d.ts +14 -0
  339. package/dist/utils/timing.js +58 -0
  340. package/dist/utils/timing.js.map +7 -0
  341. package/dist/vite.d.ts +42 -0
  342. package/dist/vite.js +79 -0
  343. package/dist/vite.js.map +7 -0
  344. package/package.json +111 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/kernel/precompiled.ts"],
4
+ "sourcesContent": ["import type { Evaluator, ExpressionCompiler } from './contracts.js'\n\nexport type ExpressionTable = Record<string, (root: any, actions: any, el: any, evt: any, ...args: any[]) => any>\n\n/** Key used by the build plugin and the lookup: returns flag, parameter names, trimmed source. */\nexport const expressionKey = (src: string, params: string[], returns: boolean): string => `${+returns}|${params.join()}|${src.trim()}`\n\n/**\n * Look expressions up in a table generated at build time (see `sigmx/precompile`). Precompiled functions\n * receive the root store proxy as `$` instead of a `with` scope. Pass a `fallback` (for example\n * `runtimeExpressions(functionCompiler)`) for markup assembled at runtime; omit it and the runtime\n * compiler is not bundled at all.\n */\nexport const precompiled =\n (table: ExpressionTable, fallback?: ExpressionCompiler, onMiss?: (src: string) => void): ExpressionCompiler =>\n (src, params, returns) => {\n const fn = table[expressionKey(src, params, returns)]\n if (fn) return ((store, actions, el, evt, ...args) => fn(store.$, actions, el, evt, ...args)) as Evaluator\n onMiss?.(src)\n if (!fallback) throw new Error(`expression not precompiled: ${src}`)\n return fallback(src, params, returns)\n }\n"],
5
+ "mappings": "AAKO,MAAM,gBAAgB,CAAC,KAAa,QAAkB,YAA6B,GAAG,CAAC,OAAO,IAAI,OAAO,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;AAQ7H,MAAM,cACX,CAAC,OAAwB,UAA+B,WACxD,CAAC,KAAK,QAAQ,YAAY;AACxB,QAAM,KAAK,MAAM,cAAc,KAAK,QAAQ,OAAO,CAAC;AACpD,MAAI,GAAI,SAAQ,CAAC,OAAO,SAAS,IAAI,QAAQ,SAAS,GAAG,MAAM,GAAG,SAAS,IAAI,KAAK,GAAG,IAAI;AAC3F,WAAS,GAAG;AACZ,MAAI,CAAC,SAAU,OAAM,IAAI,MAAM,+BAA+B,GAAG,EAAE;AACnE,SAAO,SAAS,KAAK,QAAQ,OAAO;AACtC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,42 @@
1
+ interface Tracker {
2
+ _deps: Map<Signal<any>, number>;
3
+ _invalidate(): void;
4
+ }
5
+ export declare class Signal<T> {
6
+ /** @internal */ _v: T;
7
+ /** @internal */ _ver: number;
8
+ /** @internal */ _subs: Set<Tracker>;
9
+ constructor(v: T);
10
+ get value(): T;
11
+ set value(x: T);
12
+ /** Read without subscribing. */
13
+ peek(): T;
14
+ /** Notify subscribers without replacing the value (after mutating an array or object in place). */
15
+ bump(): void;
16
+ }
17
+ export declare class Computed<T> extends Signal<T> implements Tracker {
18
+ _deps: Map<Signal<any>, number>;
19
+ /** @internal */ _dirty: boolean;
20
+ /** @internal */ _fn: () => T;
21
+ constructor(fn: () => T);
22
+ /** @internal */ _refresh(): void;
23
+ get value(): T;
24
+ set value(_: T);
25
+ peek(): T;
26
+ _invalidate(): void;
27
+ }
28
+ export declare const signal: <T>(value: T) => Signal<T>;
29
+ export declare const computed: <T>(fn: () => T) => Computed<T>;
30
+ /**
31
+ * Run `fn` now and again whenever a signal it read changes. Effects created inside another
32
+ * effect are disposed when the parent re-runs. Returns a disposer.
33
+ */
34
+ export declare const effect: (fn: () => void, onError?: (e: unknown) => void) => (() => void);
35
+ /** Coalesce many writes into one round of effect runs. */
36
+ export declare const batch: <R>(fn: () => R) => R;
37
+ /** Read signals inside `fn` without subscribing the current effect to them. */
38
+ export declare const untracked: <R>(fn: () => R) => R;
39
+ /** Called after each flush once every queued effect has run. */
40
+ export declare const onSettled: (fn: () => void) => (() => void);
41
+ export declare const flush: () => void;
42
+ export {};
@@ -0,0 +1,201 @@
1
+ let active;
2
+ let owner;
3
+ let depth = 0;
4
+ let flushing = false;
5
+ const queue = /* @__PURE__ */ new Set();
6
+ const settled = /* @__PURE__ */ new Set();
7
+ class Signal {
8
+ /** @internal */
9
+ a;
10
+ /** @internal */
11
+ e = 0;
12
+ /** @internal */
13
+ f = /* @__PURE__ */ new Set();
14
+ constructor(v) {
15
+ this.a = v;
16
+ }
17
+ get value() {
18
+ if (active) {
19
+ active.b.set(this, this.e);
20
+ this.f.add(active);
21
+ }
22
+ return this.a;
23
+ }
24
+ set value(x) {
25
+ if (!Object.is(x, this.a)) {
26
+ this.a = x;
27
+ this.bump();
28
+ }
29
+ }
30
+ /** Read without subscribing. */
31
+ peek() {
32
+ return this.a;
33
+ }
34
+ /** Notify subscribers without replacing the value (after mutating an array or object in place). */
35
+ bump() {
36
+ this.e++;
37
+ for (const s of this.f) s.h();
38
+ if (!depth) flush();
39
+ }
40
+ }
41
+ const release = (t) => {
42
+ for (const d of t.b.keys()) d.f.delete(t);
43
+ t.b.clear();
44
+ };
45
+ const stale = (t) => {
46
+ for (const [d, seen] of t.b) {
47
+ if (d instanceof Computed) d.i();
48
+ if (d.e !== seen) return true;
49
+ }
50
+ return false;
51
+ };
52
+ const capture = (t, fn) => {
53
+ release(t);
54
+ const prev = active;
55
+ active = t;
56
+ try {
57
+ return fn();
58
+ } finally {
59
+ active = prev;
60
+ }
61
+ };
62
+ class Computed extends Signal {
63
+ b = /* @__PURE__ */ new Map();
64
+ /** @internal */
65
+ g = true;
66
+ /** @internal */
67
+ c;
68
+ constructor(fn) {
69
+ super(void 0);
70
+ this.c = fn;
71
+ }
72
+ /** @internal */
73
+ i() {
74
+ if (!this.g) return;
75
+ this.g = false;
76
+ if (this.b.size && !stale(this)) return;
77
+ const x = capture(this, this.c);
78
+ if (!Object.is(x, this.a)) {
79
+ this.a = x;
80
+ this.e++;
81
+ }
82
+ }
83
+ get value() {
84
+ this.i();
85
+ return super.value;
86
+ }
87
+ set value(_) {
88
+ throw new Error("computed signals are read-only");
89
+ }
90
+ peek() {
91
+ this.i();
92
+ return this.a;
93
+ }
94
+ h() {
95
+ if (!this.g) {
96
+ this.g = true;
97
+ for (const s of this.f) s.h();
98
+ }
99
+ }
100
+ }
101
+ class Effect {
102
+ b = /* @__PURE__ */ new Map();
103
+ j = false;
104
+ k = false;
105
+ d = /* @__PURE__ */ new Set();
106
+ c;
107
+ l;
108
+ constructor(fn, onError) {
109
+ this.c = fn;
110
+ this.l = onError;
111
+ }
112
+ h() {
113
+ if (!this.k && !this.j) {
114
+ this.j = true;
115
+ queue.add(this);
116
+ }
117
+ }
118
+ n() {
119
+ this.j = false;
120
+ if (this.k || this.b.size && !stale(this)) return;
121
+ for (const c of this.d) c.m();
122
+ this.d.clear();
123
+ const prevOwner = owner;
124
+ owner = this;
125
+ depth++;
126
+ try {
127
+ capture(this, this.c);
128
+ } catch (e) {
129
+ if (!this.l) throw e;
130
+ this.l(e);
131
+ } finally {
132
+ depth--;
133
+ owner = prevOwner;
134
+ }
135
+ }
136
+ m() {
137
+ this.k = true;
138
+ release(this);
139
+ for (const c of this.d) c.m();
140
+ this.d.clear();
141
+ queue.delete(this);
142
+ }
143
+ }
144
+ const signal = (value) => new Signal(value);
145
+ const computed = (fn) => new Computed(fn);
146
+ const effect = (fn, onError) => {
147
+ const e = new Effect(fn, onError);
148
+ owner?.d.add(e);
149
+ e.n();
150
+ if (!depth) flush();
151
+ return () => e.m();
152
+ };
153
+ const batch = (fn) => {
154
+ depth++;
155
+ try {
156
+ return fn();
157
+ } finally {
158
+ if (!--depth) flush();
159
+ }
160
+ };
161
+ const untracked = (fn) => {
162
+ const prev = active;
163
+ active = void 0;
164
+ try {
165
+ return fn();
166
+ } finally {
167
+ active = prev;
168
+ }
169
+ };
170
+ const onSettled = (fn) => {
171
+ settled.add(fn);
172
+ return () => settled.delete(fn);
173
+ };
174
+ const flush = () => {
175
+ if (flushing || depth) return;
176
+ flushing = true;
177
+ try {
178
+ let guard = 0;
179
+ while (queue.size) {
180
+ if (++guard > 1e5) throw new Error("effect loop");
181
+ const e = queue.values().next().value;
182
+ queue.delete(e);
183
+ e.n();
184
+ }
185
+ } finally {
186
+ flushing = false;
187
+ }
188
+ for (const fn of settled) fn();
189
+ };
190
+ export {
191
+ Computed,
192
+ Signal,
193
+ batch,
194
+ computed,
195
+ effect,
196
+ flush,
197
+ onSettled,
198
+ signal,
199
+ untracked
200
+ };
201
+ //# sourceMappingURL=reactive.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/kernel/reactive.ts"],
4
+ "sourcesContent": ["// Reactive primitives: push invalidation, pull recomputation, version-checked effects.\n// No DOM dependency, so this module is unit-testable in plain Node.\n// Members prefixed with `_` are internal and get mangled by the build.\n\ninterface Tracker {\n _deps: Map<Signal<any>, number>\n _invalidate(): void\n}\n\nlet active: Tracker | undefined\nlet owner: Effect | undefined\nlet depth = 0\nlet flushing = false\nconst queue = new Set<Effect>()\nconst settled = new Set<() => void>()\n\nexport class Signal<T> {\n /** @internal */ _v: T\n /** @internal */ _ver = 0\n /** @internal */ _subs = new Set<Tracker>()\n constructor(v: T) {\n this._v = v\n }\n get value(): T {\n if (active) {\n active._deps.set(this, this._ver)\n this._subs.add(active)\n }\n return this._v\n }\n set value(x: T) {\n if (!Object.is(x, this._v)) {\n this._v = x\n this.bump()\n }\n }\n /** Read without subscribing. */\n peek(): T {\n return this._v\n }\n /** Notify subscribers without replacing the value (after mutating an array or object in place). */\n bump(): void {\n this._ver++\n for (const s of this._subs) s._invalidate()\n if (!depth) flush()\n }\n}\n\nconst release = (t: Tracker): void => {\n for (const d of t._deps.keys()) d._subs.delete(t)\n t._deps.clear()\n}\n\n/** True when any dependency's version moved since the tracker last ran. Refreshes computeds on the way. */\nconst stale = (t: Tracker): boolean => {\n for (const [d, seen] of t._deps) {\n if (d instanceof Computed) d._refresh()\n if (d._ver !== seen) return true\n }\n return false\n}\n\nconst capture = <R>(t: Tracker, fn: () => R): R => {\n release(t)\n const prev = active\n active = t\n try {\n return fn()\n } finally {\n active = prev\n }\n}\n\nexport class Computed<T> extends Signal<T> implements Tracker {\n _deps = new Map<Signal<any>, number>()\n /** @internal */ _dirty = true\n /** @internal */ _fn: () => T\n constructor(fn: () => T) {\n super(undefined as T)\n this._fn = fn\n }\n /** @internal */ _refresh(): void {\n if (!this._dirty) return\n this._dirty = false\n if (this._deps.size && !stale(this)) return\n const x = capture(this, this._fn)\n if (!Object.is(x, this._v)) {\n this._v = x\n this._ver++\n }\n }\n override get value(): T {\n this._refresh()\n return super.value\n }\n override set value(_: T) {\n throw new Error('computed signals are read-only')\n }\n override peek(): T {\n this._refresh()\n return this._v\n }\n _invalidate(): void {\n if (!this._dirty) {\n this._dirty = true\n for (const s of this._subs) s._invalidate()\n }\n }\n}\n\nclass Effect implements Tracker {\n _deps = new Map<Signal<any>, number>()\n _queued = false\n _dead = false\n _kids = new Set<Effect>()\n _fn: () => void\n _onError?: (e: unknown) => void\n constructor(fn: () => void, onError?: (e: unknown) => void) {\n this._fn = fn\n this._onError = onError\n }\n _invalidate(): void {\n if (!this._dead && !this._queued) {\n this._queued = true\n queue.add(this)\n }\n }\n _exec(): void {\n this._queued = false\n if (this._dead || (this._deps.size && !stale(this))) return\n for (const c of this._kids) c._dispose()\n this._kids.clear()\n const prevOwner = owner\n owner = this\n depth++\n try {\n capture(this, this._fn)\n } catch (e) {\n if (!this._onError) throw e\n this._onError(e)\n } finally {\n depth--\n owner = prevOwner\n }\n }\n _dispose(): void {\n this._dead = true\n release(this)\n for (const c of this._kids) c._dispose()\n this._kids.clear()\n queue.delete(this)\n }\n}\n\nexport const signal = <T>(value: T): Signal<T> => new Signal(value)\nexport const computed = <T>(fn: () => T): Computed<T> => new Computed(fn)\n\n/**\n * Run `fn` now and again whenever a signal it read changes. Effects created inside another\n * effect are disposed when the parent re-runs. Returns a disposer.\n */\nexport const effect = (fn: () => void, onError?: (e: unknown) => void): (() => void) => {\n const e = new Effect(fn, onError)\n owner?._kids.add(e)\n e._exec()\n if (!depth) flush()\n return () => e._dispose()\n}\n\n/** Coalesce many writes into one round of effect runs. */\nexport const batch = <R>(fn: () => R): R => {\n depth++\n try {\n return fn()\n } finally {\n if (!--depth) flush()\n }\n}\n\n/** Read signals inside `fn` without subscribing the current effect to them. */\nexport const untracked = <R>(fn: () => R): R => {\n const prev = active\n active = undefined\n try {\n return fn()\n } finally {\n active = prev\n }\n}\n\n/** Called after each flush once every queued effect has run. */\nexport const onSettled = (fn: () => void): (() => void) => {\n settled.add(fn)\n return () => settled.delete(fn)\n}\n\nexport const flush = (): void => {\n if (flushing || depth) return\n flushing = true\n try {\n let guard = 0\n while (queue.size) {\n if (++guard > 1e5) throw new Error('effect loop')\n const e: Effect = queue.values().next().value!\n queue.delete(e)\n e._exec()\n }\n } finally {\n flushing = false\n }\n for (const fn of settled) fn()\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["_v", "_ver", "_subs", "_deps", "_invalidate", "_refresh", "_dirty", "_fn", "_queued", "_dead", "_kids", "_onError", "_exec", "_dispose"]
7
+ }
@@ -0,0 +1,11 @@
1
+ import type { Mods, RuntimeOptions, Sigmx } from './contracts.js';
2
+ type Parsed = {
3
+ plugin: string;
4
+ key: string | undefined;
5
+ mods: Mods;
6
+ };
7
+ /** 'on:click__debounce.300ms__prevent' → { plugin: 'on', key: 'click', mods: {debounce: ['300ms'], prevent: []} } */
8
+ export declare const parseAttr: (raw: string) => Parsed;
9
+ /** Low-level constructor: you supply the expression pipeline. `createSigmx` wraps it with the runtime compiler. */
10
+ export declare const createRuntime: (options: RuntimeOptions) => Sigmx;
11
+ export {};
@@ -0,0 +1,210 @@
1
+ import { functionCompiler } from "./compile.js";
2
+ import { effect } from "./reactive.js";
3
+ import { createStore } from "./state.js";
4
+ import { recase } from "../lib/casing.js";
5
+ const isEl = (n) => n instanceof HTMLElement || n instanceof SVGElement || n instanceof MathMLElement;
6
+ const tree = (n) => isEl(n) ? [n, ...n.querySelectorAll("*")] : n instanceof ShadowRoot ? [...n.querySelectorAll("*")] : [];
7
+ const parsed = /* @__PURE__ */ new Map();
8
+ const parseAttr = (raw) => {
9
+ let p = parsed.get(raw);
10
+ if (!p) {
11
+ const [head, ...modParts] = raw.split("__");
12
+ const i = head.indexOf(":");
13
+ const mods = /* @__PURE__ */ new Map();
14
+ for (const m of modParts) {
15
+ const [name, ...args] = m.split(".");
16
+ mods.set(name, args);
17
+ }
18
+ p = { plugin: i < 0 ? head : head.slice(0, i), key: i < 0 ? void 0 : head.slice(i + 1), mods };
19
+ parsed.set(raw, p);
20
+ }
21
+ return p;
22
+ };
23
+ const fail = (message, info) => Object.assign(new Error(message), { info });
24
+ const createRuntime = (options) => {
25
+ const prefixes = [].concat(options.prefix ?? "data-");
26
+ const eventPrefixes = [].concat(options.eventPrefix ?? "sigmx-");
27
+ const store = options.store ?? createStore();
28
+ const compiler = options.compile ?? functionCompiler;
29
+ const { expressions } = options;
30
+ const onError = options.onError ?? ((e, info) => console.error(e, info));
31
+ const attributes = /* @__PURE__ */ Object.create(null);
32
+ const actions = /* @__PURE__ */ Object.create(null);
33
+ const handlers = /* @__PURE__ */ Object.create(null);
34
+ const runtime = {
35
+ prefixes,
36
+ attr: (name) => prefixes[0] + name,
37
+ store,
38
+ compiler,
39
+ emit: (type, detail) => document.dispatchEvent(new CustomEvent(`sigmx-${type}`, { detail })),
40
+ call: (name, ctx, args) => {
41
+ const a = actions[name];
42
+ if (!a) throw ctx.error(`unknown action @${name}`);
43
+ return a.call(ctx, ...args);
44
+ },
45
+ eventPrefixes,
46
+ handle: (event, data) => {
47
+ const p = eventPrefixes.find((p2) => event.startsWith(p2));
48
+ const h = handlers[p ? event.slice(p.length) : event];
49
+ h?.handle(runtime, data);
50
+ return !!h;
51
+ },
52
+ attributes,
53
+ actions,
54
+ handlers
55
+ };
56
+ const mounted = /* @__PURE__ */ new Map();
57
+ const roots = /* @__PURE__ */ new Set();
58
+ const ignoreSelf = prefixes.map((p) => `[${p}ignore__self]`).join();
59
+ const ignoreAny = prefixes.map((p) => `[${p}ignore]`).join();
60
+ const ignored = (el) => el.matches(ignoreSelf) || !!el.closest(ignoreAny);
61
+ const strip = (attr) => {
62
+ for (const p of prefixes) if (attr.startsWith(p)) return attr.slice(p.length);
63
+ };
64
+ const unmount = (els) => {
65
+ for (const el of els) {
66
+ const m = mounted.get(el);
67
+ if (m && mounted.delete(el)) for (const d of m.values()) d();
68
+ }
69
+ };
70
+ const unmountAttr = (el, attr) => {
71
+ const m = mounted.get(el);
72
+ m?.get(attr)?.();
73
+ m?.delete(attr);
74
+ };
75
+ const actionsFor = (el, evt, error, cleanup) => {
76
+ const ctx = { el, evt, store, runtime, error, cleanup };
77
+ return new Proxy({}, { get: (_, name) => (...args) => runtime.call(name, ctx, args) });
78
+ };
79
+ const mount = (el, attr, raw, value, only) => {
80
+ const { plugin: name, key, mods } = parseAttr(raw);
81
+ const plugin = attributes[name];
82
+ if (!plugin || only && !only.has(name)) return;
83
+ unmountAttr(el, attr);
84
+ const disposers = [];
85
+ const info = { plugin: name, el, attr };
86
+ const error = (message, extra) => fail(`${prefixes[0]}${name}: ${message}`, { ...info, ...extra });
87
+ const report = (e) => onError(e, info);
88
+ let fn;
89
+ const ctx = {
90
+ el,
91
+ plugin: name,
92
+ attr,
93
+ key,
94
+ value,
95
+ mods,
96
+ cased: (style = "camel") => recase(key ?? "", mods.get("case")?.[0] || style),
97
+ evaluate: (evt, ...args) => {
98
+ fn ??= expressions(value, ["el", "evt", ...plugin.args ?? []], plugin.returns ?? true);
99
+ return fn(store, actionsFor(el, evt, error, ctx.cleanup), el, evt, ...args);
100
+ },
101
+ effect: (f) => disposers.push(effect(f, report)),
102
+ listen: (target, type, f, opts) => {
103
+ const h = (e) => {
104
+ try {
105
+ f(e);
106
+ } catch (err) {
107
+ report(err);
108
+ }
109
+ };
110
+ target.addEventListener(type, h, opts);
111
+ disposers.push(() => target.removeEventListener(type, h, opts));
112
+ },
113
+ cleanup: (f) => disposers.push(f),
114
+ error,
115
+ store,
116
+ runtime
117
+ };
118
+ let m = mounted.get(el);
119
+ if (!m) mounted.set(el, m = /* @__PURE__ */ new Map());
120
+ m.set(attr, () => {
121
+ for (const d of disposers.splice(0)) d();
122
+ });
123
+ try {
124
+ if (plugin.key === "required" && !key) throw error("needs a key");
125
+ if (plugin.key === "forbidden" && key) throw error("takes no key");
126
+ if (plugin.value === "required" && !value) throw error("needs a value");
127
+ if (plugin.value === "forbidden" && value) throw error("takes no value");
128
+ const r = plugin.mount(ctx);
129
+ if (typeof r === "function") disposers.push(r);
130
+ } catch (e) {
131
+ report(e);
132
+ }
133
+ };
134
+ const mountEls = (els, only) => {
135
+ for (const el of els) {
136
+ if (ignored(el)) continue;
137
+ for (const { name, value } of [...el.attributes]) {
138
+ const raw = strip(name);
139
+ if (raw) mount(el, name, raw, value, only);
140
+ }
141
+ }
142
+ };
143
+ const observer = new MutationObserver((records) => {
144
+ for (const { type, target, attributeName, addedNodes, removedNodes } of records) {
145
+ if (type === "childList") {
146
+ for (const n of removedNodes) unmount(tree(n));
147
+ for (const n of addedNodes) mountEls(tree(n));
148
+ } else if (attributeName && isEl(target) && !ignored(target)) {
149
+ const raw = strip(attributeName);
150
+ if (!raw) continue;
151
+ const value = target.getAttribute(attributeName);
152
+ if (value === null) unmountAttr(target, attributeName);
153
+ else mount(target, attributeName, raw, value);
154
+ }
155
+ }
156
+ });
157
+ let ready = false;
158
+ const apply = (root = document.documentElement, observe = true, only) => {
159
+ mountEls(tree(root), only);
160
+ if (observe && !roots.has(root)) {
161
+ observer.observe(root, { subtree: true, childList: true, attributes: true });
162
+ roots.add(root);
163
+ }
164
+ if (!ready && roots.has(document.documentElement)) {
165
+ ready = true;
166
+ runtime.emit("ready");
167
+ }
168
+ };
169
+ const use = (...plugins) => {
170
+ const added = /* @__PURE__ */ new Set();
171
+ for (const p of plugins) {
172
+ if (p.type === "attribute") {
173
+ attributes[p.name] = p;
174
+ added.add(p.name);
175
+ } else if (p.type === "action") actions[p.name] = p;
176
+ else handlers[p.name] = p;
177
+ }
178
+ if (added.size) for (const r of roots) apply(r, false, added);
179
+ };
180
+ const stopPatches = store.onPatch((patch) => runtime.emit("signal-patch", patch));
181
+ use(...options.plugins ?? []);
182
+ const sigmx = {
183
+ runtime,
184
+ store,
185
+ get $() {
186
+ return store.$;
187
+ },
188
+ apply: (root, observe) => apply(root, observe),
189
+ use,
190
+ destroy: () => {
191
+ observer.disconnect();
192
+ stopPatches();
193
+ unmount([...mounted.keys()]);
194
+ roots.clear();
195
+ }
196
+ };
197
+ if (options.autoStart ?? true) {
198
+ if (document.readyState === "loading") {
199
+ document.addEventListener("DOMContentLoaded", () => sigmx.apply(), { once: true });
200
+ } else {
201
+ sigmx.apply();
202
+ }
203
+ }
204
+ return sigmx;
205
+ };
206
+ export {
207
+ createRuntime,
208
+ parseAttr
209
+ };
210
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/kernel/runtime.ts"],
4
+ "sourcesContent": ["import { functionCompiler } from './compile.js'\nimport { effect } from './reactive.js'\nimport { createStore } from './state.js'\nimport type { ActionCtx, AttributePlugin, Ctx, El, Evaluator, Mods, Plugin, Runtime, RuntimeOptions, Sigmx } from './contracts.js'\nimport { recase, type CaseStyle } from '../lib/casing.js'\n\nconst isEl = (n: Node): n is El => n instanceof HTMLElement || n instanceof SVGElement || n instanceof MathMLElement\n/** An element (or shadow root) followed by every element under it; nothing for text and comment nodes. */\nconst tree = (n: Node): El[] =>\n isEl(n) ? [n, ...n.querySelectorAll<El>('*')] : n instanceof ShadowRoot ? [...n.querySelectorAll<El>('*')] : []\n\ntype Parsed = { plugin: string; key: string | undefined; mods: Mods }\nconst parsed = new Map<string, Parsed>()\n\n/** 'on:click__debounce.300ms__prevent' \u2192 { plugin: 'on', key: 'click', mods: {debounce: ['300ms'], prevent: []} } */\nexport const parseAttr = (raw: string): Parsed => {\n let p = parsed.get(raw)\n if (!p) {\n const [head, ...modParts] = raw.split('__')\n const i = head.indexOf(':')\n const mods: Mods = new Map()\n for (const m of modParts) {\n const [name, ...args] = m.split('.')\n mods.set(name, args)\n }\n p = { plugin: i < 0 ? head : head.slice(0, i), key: i < 0 ? undefined : head.slice(i + 1), mods }\n parsed.set(raw, p)\n }\n return p\n}\n\nconst fail = (message: string, info: Record<string, unknown>): Error =>\n Object.assign(new Error(message), { info })\n\n/** Low-level constructor: you supply the expression pipeline. `createSigmx` wraps it with the runtime compiler. */\nexport const createRuntime = (options: RuntimeOptions): Sigmx => {\n const prefixes = ([] as string[]).concat(options.prefix ?? 'data-')\n const eventPrefixes = ([] as string[]).concat(options.eventPrefix ?? 'sigmx-')\n const store = options.store ?? createStore()\n const compiler = options.compile ?? functionCompiler\n const { expressions } = options\n const onError = options.onError ?? ((e, info) => console.error(e, info))\n const attributes: Record<string, AttributePlugin> = Object.create(null)\n const actions: Runtime['actions'] = Object.create(null)\n const handlers: Runtime['handlers'] = Object.create(null)\n\n const runtime: Runtime = {\n prefixes,\n attr: (name) => prefixes[0] + name,\n store,\n compiler,\n emit: (type, detail) => document.dispatchEvent(new CustomEvent(`sigmx-${type}`, { detail })),\n call: (name, ctx, args) => {\n const a = actions[name]\n if (!a) throw ctx.error(`unknown action @${name}`)\n return a.call(ctx, ...args)\n },\n eventPrefixes,\n handle: (event, data) => {\n const p = eventPrefixes.find((p) => event.startsWith(p))\n const h = handlers[p ? event.slice(p.length) : event]\n h?.handle(runtime, data)\n return !!h\n },\n attributes,\n actions,\n handlers,\n }\n\n // element \u2192 attribute name \u2192 dispose\n const mounted = new Map<El, Map<string, () => void>>()\n const roots = new Set<El | ShadowRoot>()\n const ignoreSelf = prefixes.map((p) => `[${p}ignore__self]`).join()\n const ignoreAny = prefixes.map((p) => `[${p}ignore]`).join()\n const ignored = (el: El) => el.matches(ignoreSelf) || !!el.closest(ignoreAny)\n\n const strip = (attr: string): string | undefined => {\n for (const p of prefixes) if (attr.startsWith(p)) return attr.slice(p.length)\n }\n\n const unmount = (els: Iterable<El>): void => {\n for (const el of els) {\n const m = mounted.get(el)\n if (m && mounted.delete(el)) for (const d of m.values()) d()\n }\n }\n\n const unmountAttr = (el: El, attr: string): void => {\n const m = mounted.get(el)\n m?.get(attr)?.()\n m?.delete(attr)\n }\n\n const actionsFor = (el: El, evt: Event | undefined, error: Ctx['error'], cleanup: (fn: () => void) => void) => {\n const ctx: ActionCtx = { el, evt, store, runtime, error, cleanup }\n return new Proxy({}, { get: (_, name: string) => (...args: any[]) => runtime.call(name, ctx, args) })\n }\n\n const mount = (el: El, attr: string, raw: string, value: string, only?: Set<string>): void => {\n const { plugin: name, key, mods } = parseAttr(raw)\n const plugin = attributes[name]\n if (!plugin || (only && !only.has(name))) return\n unmountAttr(el, attr)\n\n const disposers: (() => void)[] = []\n const info = { plugin: name, el, attr }\n const error: Ctx['error'] = (message, extra) => fail(`${prefixes[0]}${name}: ${message}`, { ...info, ...extra })\n const report = (e: unknown) => onError(e, info)\n let fn: Evaluator | undefined\n const ctx: Ctx = {\n el,\n plugin: name,\n attr,\n key,\n value,\n mods,\n cased: (style = 'camel') => recase(key ?? '', (mods.get('case')?.[0] as CaseStyle) || style),\n evaluate: (evt, ...args) => {\n fn ??= expressions(value, ['el', 'evt', ...(plugin.args ?? [])], plugin.returns ?? true)\n return fn(store, actionsFor(el, evt, error, ctx.cleanup), el, evt, ...args)\n },\n effect: (f) => disposers.push(effect(f, report)),\n listen: (target, type, f, opts) => {\n const h = (e: Event) => {\n try {\n f(e)\n } catch (err) {\n report(err)\n }\n }\n target.addEventListener(type, h, opts)\n disposers.push(() => target.removeEventListener(type, h, opts))\n },\n cleanup: (f) => disposers.push(f),\n error,\n store,\n runtime,\n }\n\n let m = mounted.get(el)\n if (!m) mounted.set(el, (m = new Map()))\n m.set(attr, () => {\n for (const d of disposers.splice(0)) d()\n })\n\n try {\n if (plugin.key === 'required' && !key) throw error('needs a key')\n if (plugin.key === 'forbidden' && key) throw error('takes no key')\n if (plugin.value === 'required' && !value) throw error('needs a value')\n if (plugin.value === 'forbidden' && value) throw error('takes no value')\n const r = plugin.mount(ctx)\n if (typeof r === 'function') disposers.push(r)\n } catch (e) {\n report(e)\n }\n }\n\n const mountEls = (els: Iterable<El>, only?: Set<string>): void => {\n for (const el of els) {\n if (ignored(el)) continue\n for (const { name, value } of [...el.attributes]) {\n const raw = strip(name)\n if (raw) mount(el, name, raw, value, only)\n }\n }\n }\n\n const observer = new MutationObserver((records) => {\n for (const { type, target, attributeName, addedNodes, removedNodes } of records) {\n if (type === 'childList') {\n for (const n of removedNodes) unmount(tree(n))\n for (const n of addedNodes) mountEls(tree(n))\n } else if (attributeName && isEl(target) && !ignored(target)) {\n const raw = strip(attributeName)\n if (!raw) continue\n const value = target.getAttribute(attributeName)\n if (value === null) unmountAttr(target, attributeName)\n else mount(target, attributeName, raw, value)\n }\n }\n })\n\n let ready = false\n const apply = (root: El | ShadowRoot = document.documentElement, observe = true, only?: Set<string>) => {\n mountEls(tree(root), only)\n if (observe && !roots.has(root)) {\n observer.observe(root, { subtree: true, childList: true, attributes: true })\n roots.add(root)\n }\n if (!ready && roots.has(document.documentElement)) {\n ready = true\n runtime.emit('ready')\n }\n }\n\n const use = (...plugins: Plugin[]): void => {\n const added = new Set<string>()\n for (const p of plugins) {\n if (p.type === 'attribute') {\n attributes[p.name] = p\n added.add(p.name)\n } else if (p.type === 'action') actions[p.name] = p\n else handlers[p.name] = p\n }\n if (added.size) for (const r of roots) apply(r, false, added)\n }\n\n const stopPatches = store.onPatch((patch) => runtime.emit('signal-patch', patch))\n use(...(options.plugins ?? []))\n\n const sigmx: Sigmx = {\n runtime,\n store,\n get $() {\n return store.$\n },\n apply: (root, observe) => apply(root, observe),\n use,\n destroy: () => {\n observer.disconnect()\n stopPatches()\n unmount([...mounted.keys()])\n roots.clear()\n },\n }\n\n if (options.autoStart ?? true) {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => sigmx.apply(), { once: true })\n } else {\n sigmx.apply()\n }\n }\n return sigmx\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["p"]
7
+ }
@@ -0,0 +1,42 @@
1
+ import type { Plugin } from './contracts.js';
2
+ export type PluginMeta = {
3
+ /** Export name, e.g. `httpGet`; what the generated module imports. */
4
+ export: string;
5
+ /** Registered name, e.g. `get`; what markup refers to. */
6
+ name: string;
7
+ type: Plugin['type'];
8
+ /** Module to import from; built-ins come from `sigmx/plugins`. */
9
+ from: string;
10
+ returns?: boolean;
11
+ args?: string[];
12
+ };
13
+ /** Plugins that only make sense together. */
14
+ export declare const implied: Record<string, string[]>;
15
+ /** Metadata for every built-in plugin. */
16
+ export declare const builtinPlugins: () => PluginMeta[];
17
+ /**
18
+ * Read a custom plugin's metadata from its source without executing it: finds
19
+ * `attribute({ name: 'x', ... })`, `action({...})` or `handler({...})` near `export const <exportName>`.
20
+ */
21
+ export declare const customPluginMeta: (exportName: string, source: string, from: string) => PluginMeta | undefined;
22
+ /** True if `source` refers to the plugin: `data-<name>` for directives, `@name(` for functions, the name as a string for handlers. */
23
+ export declare const mentions: (source: string, p: PluginMeta, prefixes: string[]) => boolean;
24
+ export type Selection = {
25
+ /** Selected plugins in a stable order. */
26
+ plugins: PluginMeta[];
27
+ /** Why each one is in: 'used', 'always', or the plugin that implied it. */
28
+ reasons: Record<string, string>;
29
+ /** Known plugins that were left out. */
30
+ unused: string[];
31
+ };
32
+ /**
33
+ * Decide which plugins to ship. `sources` are file contents; `custom` are extra plugins (from
34
+ * `customPluginMeta`); `always` are export names that ship regardless.
35
+ */
36
+ export declare const selectPlugins: (sources: string[], { prefixes, always, custom }?: {
37
+ prefixes?: string[];
38
+ always?: string[];
39
+ custom?: PluginMeta[];
40
+ }) => Selection;
41
+ /** JavaScript source for a module exporting `plugins` (and the selection report). */
42
+ export declare const generatePluginsModule: (sel: Selection) => string;
@@ -0,0 +1,68 @@
1
+ import * as builtins from "../plugins/index.js";
2
+ const NETWORK = ["httpGet", "httpPost", "httpPut", "httpPatch", "httpDelete", "websocket", "boost"];
3
+ const implied = {
4
+ ...Object.fromEntries(NETWORK.map((n) => [n, ["applyElements", "applyState"]])),
5
+ boost: ["httpGet", "httpPost", "applyElements", "applyState"]
6
+ };
7
+ const builtinPlugins = () => Object.entries(builtins).filter(([, v]) => v && typeof v === "object" && "type" in v).map(([key, v]) => {
8
+ const p = v;
9
+ return { export: key, name: p.name, type: p.type, from: "sigmx/plugins", returns: p.returns, args: p.args };
10
+ });
11
+ const customPluginMeta = (exportName, source, from) => {
12
+ const re = new RegExp(`export\\s+const\\s+${exportName}\\s*(?::[^=]+)?=\\s*(attribute|action|handler)\\s*\\(\\s*\\{([\\s\\S]*?)\\}\\s*\\)`, "m");
13
+ const m = re.exec(source);
14
+ if (!m) return;
15
+ const body = m[2];
16
+ const name = /\bname\s*:\s*['"`]([^'"`]+)['"`]/.exec(body)?.[1];
17
+ if (!name) return;
18
+ const returns = /\breturns\s*:\s*(true|false)/.exec(body)?.[1];
19
+ const args = /\bargs\s*:\s*\[([^\]]*)\]/.exec(body)?.[1];
20
+ return {
21
+ export: exportName,
22
+ name,
23
+ type: m[1],
24
+ from,
25
+ returns: returns === void 0 ? void 0 : returns === "true",
26
+ args: args?.split(",").map((s) => s.trim().replace(/^['"`]|['"`]$/g, "")).filter(Boolean)
27
+ };
28
+ };
29
+ const escape = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
30
+ const mentions = (source, p, prefixes) => {
31
+ const n = escape(p.name);
32
+ if (p.type === "attribute") return prefixes.some((pre) => new RegExp(`(^|[\\s"'\`<])${escape(pre)}${n}(?=[\\s=:_>"'\`/]|$)`, "m").test(source));
33
+ if (p.type === "action") return new RegExp(`@${n}\\s*\\(`).test(source);
34
+ return new RegExp(`['"\`](?:[\\w-]+-)?${n}['"\`]`).test(source);
35
+ };
36
+ const selectPlugins = (sources, { prefixes = ["data-"], always = [], custom = [] } = {}) => {
37
+ const known = [...builtinPlugins(), ...custom];
38
+ const byExport = new Map(known.map((p) => [p.export, p]));
39
+ const reasons = {};
40
+ const add = (exp, why) => {
41
+ if (!byExport.has(exp) || reasons[exp]) return;
42
+ reasons[exp] = why;
43
+ for (const dep of implied[exp] ?? []) add(dep, exp);
44
+ };
45
+ for (const exp of always) add(exp, "always");
46
+ const text = sources.join("\n");
47
+ for (const p of known) if (!reasons[p.export] && (p.type !== "handler" || custom.includes(p)) && mentions(text, p, prefixes)) add(p.export, "used");
48
+ const plugins = known.filter((p) => reasons[p.export]);
49
+ return { plugins, reasons, unused: known.filter((p) => !reasons[p.export]).map((p) => p.export) };
50
+ };
51
+ const generatePluginsModule = (sel) => {
52
+ const groups = /* @__PURE__ */ new Map();
53
+ for (const p of sel.plugins) groups.set(p.from, [...groups.get(p.from) ?? [], p.export]);
54
+ const imports = [...groups].map(([from, names]) => `import { ${names.join(", ")} } from ${JSON.stringify(from)}`).join("\n");
55
+ return `${imports}
56
+ export const plugins = [${sel.plugins.map((p) => p.export).join(", ")}]
57
+ export const report = ${JSON.stringify({ reasons: sel.reasons, unused: sel.unused }, null, 2)}
58
+ `;
59
+ };
60
+ export {
61
+ builtinPlugins,
62
+ customPluginMeta,
63
+ generatePluginsModule,
64
+ implied,
65
+ mentions,
66
+ selectPlugins
67
+ };
68
+ //# sourceMappingURL=scan.js.map