@typed/template 0.14.0 → 1.0.0-beta.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 (453) hide show
  1. package/README.md +108 -2
  2. package/dist/EventHandler.d.ts +273 -0
  3. package/dist/EventHandler.d.ts.map +1 -0
  4. package/dist/EventHandler.js +261 -0
  5. package/dist/EventSource.d.ts +82 -0
  6. package/dist/EventSource.d.ts.map +1 -0
  7. package/dist/EventSource.js +127 -0
  8. package/dist/Html.d.ts +122 -0
  9. package/dist/Html.d.ts.map +1 -0
  10. package/dist/Html.js +250 -0
  11. package/dist/HtmlChunk.d.ts +118 -0
  12. package/dist/HtmlChunk.d.ts.map +1 -0
  13. package/dist/HtmlChunk.js +211 -0
  14. package/dist/HydrateContext.d.ts +28 -0
  15. package/dist/HydrateContext.d.ts.map +1 -0
  16. package/dist/HydrateContext.js +25 -0
  17. package/dist/Parser.d.ts +35 -0
  18. package/dist/Parser.d.ts.map +1 -0
  19. package/dist/Parser.js +437 -0
  20. package/dist/Render.d.ts +195 -0
  21. package/dist/Render.d.ts.map +1 -0
  22. package/dist/Render.js +609 -0
  23. package/dist/RenderEvent.d.ts +179 -0
  24. package/dist/RenderEvent.d.ts.map +1 -0
  25. package/dist/RenderEvent.js +102 -0
  26. package/dist/RenderQueue.d.ts +167 -0
  27. package/dist/RenderQueue.d.ts.map +1 -0
  28. package/dist/RenderQueue.js +297 -0
  29. package/dist/RenderTemplate.d.ts +90 -0
  30. package/dist/RenderTemplate.d.ts.map +1 -0
  31. package/dist/RenderTemplate.js +87 -0
  32. package/dist/Renderable.d.ts +88 -0
  33. package/dist/Renderable.d.ts.map +1 -0
  34. package/dist/Renderable.js +3 -0
  35. package/dist/{dts/Template.d.ts → Template.d.ts} +109 -74
  36. package/dist/Template.d.ts.map +1 -0
  37. package/dist/{esm/Template.js → Template.js} +96 -56
  38. package/dist/Wire.d.ts +169 -0
  39. package/dist/Wire.d.ts.map +1 -0
  40. package/dist/Wire.js +217 -0
  41. package/dist/errors.d.ts +145 -0
  42. package/dist/errors.d.ts.map +1 -0
  43. package/dist/errors.js +159 -0
  44. package/dist/index.d.ts +15 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +14 -0
  47. package/dist/internal/IndexRefCounter.d.ts +11 -0
  48. package/dist/internal/IndexRefCounter.d.ts.map +1 -0
  49. package/dist/internal/IndexRefCounter.js +42 -0
  50. package/dist/internal/ParentChildNodes.d.ts +6 -0
  51. package/dist/internal/ParentChildNodes.d.ts.map +1 -0
  52. package/dist/internal/ParentChildNodes.js +1 -0
  53. package/dist/internal/PathStack.d.ts +9 -0
  54. package/dist/internal/PathStack.d.ts.map +1 -0
  55. package/dist/internal/PathStack.js +18 -0
  56. package/dist/internal/buildTemplateFragement.d.ts +3 -0
  57. package/dist/internal/buildTemplateFragement.d.ts.map +1 -0
  58. package/dist/internal/buildTemplateFragement.js +61 -0
  59. package/dist/internal/diff.d.ts +2 -0
  60. package/dist/internal/diff.d.ts.map +1 -0
  61. package/dist/internal/diff.js +119 -0
  62. package/dist/internal/dom.d.ts +45 -0
  63. package/dist/internal/dom.d.ts.map +1 -0
  64. package/dist/internal/dom.js +304 -0
  65. package/dist/internal/encoding.d.ts +7 -0
  66. package/dist/internal/encoding.d.ts.map +1 -0
  67. package/dist/internal/encoding.js +134 -0
  68. package/dist/{dts/internal/v2/hydration-template.d.ts → internal/hydration.d.ts} +10 -7
  69. package/dist/internal/hydration.d.ts.map +1 -0
  70. package/dist/{esm/internal/v2/hydration-template.js → internal/hydration.js} +80 -26
  71. package/dist/internal/keyToPartType.d.ts +2 -0
  72. package/dist/internal/keyToPartType.d.ts.map +1 -0
  73. package/dist/internal/keyToPartType.js +110 -0
  74. package/dist/internal/meta.d.ts +17 -0
  75. package/dist/internal/meta.d.ts.map +1 -0
  76. package/dist/internal/meta.js +14 -0
  77. package/dist/internal/takeOneIfNotRenderEvent.d.ts +4 -0
  78. package/dist/internal/takeOneIfNotRenderEvent.d.ts.map +1 -0
  79. package/dist/internal/takeOneIfNotRenderEvent.js +10 -0
  80. package/dist/internal/templateHash.d.ts +2 -0
  81. package/dist/internal/templateHash.d.ts.map +1 -0
  82. package/dist/internal/templateHash.js +14 -0
  83. package/dist/many.d.ts +68 -0
  84. package/dist/many.d.ts.map +1 -0
  85. package/dist/many.js +107 -0
  86. package/package.json +22 -224
  87. package/src/EventHandler.ts +318 -86
  88. package/src/EventSource.ts +202 -0
  89. package/src/Html.test.ts +490 -0
  90. package/src/Html.ts +292 -333
  91. package/src/HtmlChunk.ts +290 -332
  92. package/src/HydrateContext.ts +40 -0
  93. package/src/Hydration.test.ts +409 -0
  94. package/src/Parser.test.ts +924 -0
  95. package/src/Parser.ts +598 -10
  96. package/src/Render.test.ts +338 -0
  97. package/src/Render.ts +878 -63
  98. package/src/RenderEvent.ts +169 -40
  99. package/src/RenderQueue.ts +290 -385
  100. package/src/RenderTemplate.ts +98 -31
  101. package/src/Renderable.ts +122 -24
  102. package/src/Template.ts +246 -145
  103. package/src/Wire.ts +309 -0
  104. package/src/errors.ts +173 -0
  105. package/src/index.ts +14 -66
  106. package/src/internal/IndexRefCounter.ts +53 -0
  107. package/src/internal/ParentChildNodes.ts +7 -0
  108. package/src/internal/PathStack.ts +23 -0
  109. package/src/internal/buildTemplateFragement.ts +82 -0
  110. package/src/internal/diff.ts +127 -0
  111. package/src/internal/dom.ts +357 -0
  112. package/src/internal/encoding.ts +147 -0
  113. package/src/internal/hydration.ts +406 -0
  114. package/src/internal/keyToPartType.ts +113 -0
  115. package/src/internal/meta.ts +25 -0
  116. package/src/internal/takeOneIfNotRenderEvent.ts +19 -0
  117. package/src/internal/templateHash.ts +18 -0
  118. package/src/many.ts +148 -0
  119. package/tsconfig.json +6 -0
  120. package/Directive/package.json +0 -6
  121. package/ElementRef/package.json +0 -6
  122. package/ElementSource/package.json +0 -6
  123. package/Entry/package.json +0 -6
  124. package/EventHandler/package.json +0 -6
  125. package/Html/package.json +0 -6
  126. package/HtmlChunk/package.json +0 -6
  127. package/Hydrate/package.json +0 -6
  128. package/LICENSE +0 -21
  129. package/Many/package.json +0 -6
  130. package/Meta/package.json +0 -6
  131. package/Parser/package.json +0 -6
  132. package/Part/package.json +0 -6
  133. package/Placeholder/package.json +0 -6
  134. package/Platform/package.json +0 -6
  135. package/Render/package.json +0 -6
  136. package/RenderContext/package.json +0 -6
  137. package/RenderEvent/package.json +0 -6
  138. package/RenderQueue/package.json +0 -6
  139. package/RenderTemplate/package.json +0 -6
  140. package/Renderable/package.json +0 -6
  141. package/Template/package.json +0 -6
  142. package/Test/package.json +0 -6
  143. package/Vitest/package.json +0 -6
  144. package/compiler-tools/package.json +0 -6
  145. package/dist/cjs/Directive.js +0 -76
  146. package/dist/cjs/Directive.js.map +0 -1
  147. package/dist/cjs/ElementRef.js +0 -92
  148. package/dist/cjs/ElementRef.js.map +0 -1
  149. package/dist/cjs/ElementSource.js +0 -246
  150. package/dist/cjs/ElementSource.js.map +0 -1
  151. package/dist/cjs/Entry.js +0 -6
  152. package/dist/cjs/Entry.js.map +0 -1
  153. package/dist/cjs/EventHandler.js +0 -76
  154. package/dist/cjs/EventHandler.js.map +0 -1
  155. package/dist/cjs/Html.js +0 -224
  156. package/dist/cjs/Html.js.map +0 -1
  157. package/dist/cjs/HtmlChunk.js +0 -306
  158. package/dist/cjs/HtmlChunk.js.map +0 -1
  159. package/dist/cjs/Hydrate.js +0 -43
  160. package/dist/cjs/Hydrate.js.map +0 -1
  161. package/dist/cjs/Many.js +0 -66
  162. package/dist/cjs/Many.js.map +0 -1
  163. package/dist/cjs/Meta.js +0 -50
  164. package/dist/cjs/Meta.js.map +0 -1
  165. package/dist/cjs/Parser.js +0 -19
  166. package/dist/cjs/Parser.js.map +0 -1
  167. package/dist/cjs/Part.js +0 -6
  168. package/dist/cjs/Part.js.map +0 -1
  169. package/dist/cjs/Placeholder.js +0 -34
  170. package/dist/cjs/Placeholder.js.map +0 -1
  171. package/dist/cjs/Platform.js +0 -65
  172. package/dist/cjs/Platform.js.map +0 -1
  173. package/dist/cjs/Render.js +0 -50
  174. package/dist/cjs/Render.js.map +0 -1
  175. package/dist/cjs/RenderContext.js +0 -67
  176. package/dist/cjs/RenderContext.js.map +0 -1
  177. package/dist/cjs/RenderEvent.js +0 -52
  178. package/dist/cjs/RenderEvent.js.map +0 -1
  179. package/dist/cjs/RenderQueue.js +0 -343
  180. package/dist/cjs/RenderQueue.js.map +0 -1
  181. package/dist/cjs/RenderTemplate.js +0 -26
  182. package/dist/cjs/RenderTemplate.js.map +0 -1
  183. package/dist/cjs/Renderable.js +0 -6
  184. package/dist/cjs/Renderable.js.map +0 -1
  185. package/dist/cjs/Template.js +0 -305
  186. package/dist/cjs/Template.js.map +0 -1
  187. package/dist/cjs/Test.js +0 -184
  188. package/dist/cjs/Test.js.map +0 -1
  189. package/dist/cjs/Vitest.js +0 -52
  190. package/dist/cjs/Vitest.js.map +0 -1
  191. package/dist/cjs/compiler-tools.js +0 -100
  192. package/dist/cjs/compiler-tools.js.map +0 -1
  193. package/dist/cjs/index.js +0 -138
  194. package/dist/cjs/index.js.map +0 -1
  195. package/dist/cjs/internal/EventSource.js +0 -129
  196. package/dist/cjs/internal/EventSource.js.map +0 -1
  197. package/dist/cjs/internal/HydrateContext.js +0 -13
  198. package/dist/cjs/internal/HydrateContext.js.map +0 -1
  199. package/dist/cjs/internal/browser.js +0 -110
  200. package/dist/cjs/internal/browser.js.map +0 -1
  201. package/dist/cjs/internal/character-entities.js +0 -2141
  202. package/dist/cjs/internal/character-entities.js.map +0 -1
  203. package/dist/cjs/internal/chunks.js +0 -68
  204. package/dist/cjs/internal/chunks.js.map +0 -1
  205. package/dist/cjs/internal/errors.js +0 -52
  206. package/dist/cjs/internal/errors.js.map +0 -1
  207. package/dist/cjs/internal/indexRefCounter.js +0 -52
  208. package/dist/cjs/internal/indexRefCounter.js.map +0 -1
  209. package/dist/cjs/internal/module-augmentation.js +0 -6
  210. package/dist/cjs/internal/module-augmentation.js.map +0 -1
  211. package/dist/cjs/internal/parser.js +0 -568
  212. package/dist/cjs/internal/parser.js.map +0 -1
  213. package/dist/cjs/internal/parser2.js +0 -382
  214. package/dist/cjs/internal/parser2.js.map +0 -1
  215. package/dist/cjs/internal/server-parts.js +0 -124
  216. package/dist/cjs/internal/server-parts.js.map +0 -1
  217. package/dist/cjs/internal/server.js +0 -48
  218. package/dist/cjs/internal/server.js.map +0 -1
  219. package/dist/cjs/internal/utils.js +0 -136
  220. package/dist/cjs/internal/utils.js.map +0 -1
  221. package/dist/cjs/internal/v2/SyncPart.js +0 -6
  222. package/dist/cjs/internal/v2/SyncPart.js.map +0 -1
  223. package/dist/cjs/internal/v2/helpers.js +0 -15
  224. package/dist/cjs/internal/v2/helpers.js.map +0 -1
  225. package/dist/cjs/internal/v2/hydration-template.js +0 -269
  226. package/dist/cjs/internal/v2/hydration-template.js.map +0 -1
  227. package/dist/cjs/internal/v2/parts.js +0 -169
  228. package/dist/cjs/internal/v2/parts.js.map +0 -1
  229. package/dist/cjs/internal/v2/render-entry.js +0 -110
  230. package/dist/cjs/internal/v2/render-entry.js.map +0 -1
  231. package/dist/cjs/internal/v2/render-sync-parts.js +0 -318
  232. package/dist/cjs/internal/v2/render-sync-parts.js.map +0 -1
  233. package/dist/cjs/internal/v2/render.js +0 -592
  234. package/dist/cjs/internal/v2/render.js.map +0 -1
  235. package/dist/cjs/internal/v2/sync-parts.js +0 -115
  236. package/dist/cjs/internal/v2/sync-parts.js.map +0 -1
  237. package/dist/dts/Directive.d.ts +0 -70
  238. package/dist/dts/Directive.d.ts.map +0 -1
  239. package/dist/dts/ElementRef.d.ts +0 -42
  240. package/dist/dts/ElementRef.d.ts.map +0 -1
  241. package/dist/dts/ElementSource.d.ts +0 -79
  242. package/dist/dts/ElementSource.d.ts.map +0 -1
  243. package/dist/dts/Entry.d.ts +0 -26
  244. package/dist/dts/Entry.d.ts.map +0 -1
  245. package/dist/dts/EventHandler.d.ts +0 -73
  246. package/dist/dts/EventHandler.d.ts.map +0 -1
  247. package/dist/dts/Html.d.ts +0 -35
  248. package/dist/dts/Html.d.ts.map +0 -1
  249. package/dist/dts/HtmlChunk.d.ts +0 -56
  250. package/dist/dts/HtmlChunk.d.ts.map +0 -1
  251. package/dist/dts/Hydrate.d.ts +0 -19
  252. package/dist/dts/Hydrate.d.ts.map +0 -1
  253. package/dist/dts/Many.d.ts +0 -32
  254. package/dist/dts/Many.d.ts.map +0 -1
  255. package/dist/dts/Meta.d.ts +0 -33
  256. package/dist/dts/Meta.d.ts.map +0 -1
  257. package/dist/dts/Parser.d.ts +0 -13
  258. package/dist/dts/Parser.d.ts.map +0 -1
  259. package/dist/dts/Part.d.ts +0 -121
  260. package/dist/dts/Part.d.ts.map +0 -1
  261. package/dist/dts/Placeholder.d.ts +0 -48
  262. package/dist/dts/Placeholder.d.ts.map +0 -1
  263. package/dist/dts/Platform.d.ts +0 -21
  264. package/dist/dts/Platform.d.ts.map +0 -1
  265. package/dist/dts/Render.d.ts +0 -31
  266. package/dist/dts/Render.d.ts.map +0 -1
  267. package/dist/dts/RenderContext.d.ts +0 -70
  268. package/dist/dts/RenderContext.d.ts.map +0 -1
  269. package/dist/dts/RenderEvent.d.ts +0 -42
  270. package/dist/dts/RenderEvent.d.ts.map +0 -1
  271. package/dist/dts/RenderQueue.d.ts +0 -103
  272. package/dist/dts/RenderQueue.d.ts.map +0 -1
  273. package/dist/dts/RenderTemplate.d.ts +0 -25
  274. package/dist/dts/RenderTemplate.d.ts.map +0 -1
  275. package/dist/dts/Renderable.d.ts +0 -28
  276. package/dist/dts/Renderable.d.ts.map +0 -1
  277. package/dist/dts/Template.d.ts.map +0 -1
  278. package/dist/dts/Test.d.ts +0 -85
  279. package/dist/dts/Test.d.ts.map +0 -1
  280. package/dist/dts/Vitest.d.ts +0 -43
  281. package/dist/dts/Vitest.d.ts.map +0 -1
  282. package/dist/dts/compiler-tools.d.ts +0 -143
  283. package/dist/dts/compiler-tools.d.ts.map +0 -1
  284. package/dist/dts/index.d.ts +0 -65
  285. package/dist/dts/index.d.ts.map +0 -1
  286. package/dist/dts/internal/EventSource.d.ts +0 -13
  287. package/dist/dts/internal/EventSource.d.ts.map +0 -1
  288. package/dist/dts/internal/HydrateContext.d.ts +0 -2
  289. package/dist/dts/internal/HydrateContext.d.ts.map +0 -1
  290. package/dist/dts/internal/browser.d.ts +0 -8
  291. package/dist/dts/internal/browser.d.ts.map +0 -1
  292. package/dist/dts/internal/character-entities.d.ts +0 -2133
  293. package/dist/dts/internal/character-entities.d.ts.map +0 -1
  294. package/dist/dts/internal/chunks.d.ts +0 -23
  295. package/dist/dts/internal/chunks.d.ts.map +0 -1
  296. package/dist/dts/internal/errors.d.ts +0 -22
  297. package/dist/dts/internal/errors.d.ts.map +0 -1
  298. package/dist/dts/internal/indexRefCounter.d.ts +0 -7
  299. package/dist/dts/internal/indexRefCounter.d.ts.map +0 -1
  300. package/dist/dts/internal/module-augmentation.d.ts +0 -32
  301. package/dist/dts/internal/module-augmentation.d.ts.map +0 -1
  302. package/dist/dts/internal/parser.d.ts +0 -33
  303. package/dist/dts/internal/parser.d.ts.map +0 -1
  304. package/dist/dts/internal/parser2.d.ts +0 -12
  305. package/dist/dts/internal/parser2.d.ts.map +0 -1
  306. package/dist/dts/internal/server-parts.d.ts +0 -223
  307. package/dist/dts/internal/server-parts.d.ts.map +0 -1
  308. package/dist/dts/internal/server.d.ts +0 -5
  309. package/dist/dts/internal/server.d.ts.map +0 -1
  310. package/dist/dts/internal/utils.d.ts +0 -19
  311. package/dist/dts/internal/utils.d.ts.map +0 -1
  312. package/dist/dts/internal/v2/SyncPart.d.ts +0 -87
  313. package/dist/dts/internal/v2/SyncPart.d.ts.map +0 -1
  314. package/dist/dts/internal/v2/helpers.d.ts +0 -3
  315. package/dist/dts/internal/v2/helpers.d.ts.map +0 -1
  316. package/dist/dts/internal/v2/hydration-template.d.ts.map +0 -1
  317. package/dist/dts/internal/v2/parts.d.ts +0 -245
  318. package/dist/dts/internal/v2/parts.d.ts.map +0 -1
  319. package/dist/dts/internal/v2/render-entry.d.ts +0 -6
  320. package/dist/dts/internal/v2/render-entry.d.ts.map +0 -1
  321. package/dist/dts/internal/v2/render-sync-parts.d.ts +0 -22
  322. package/dist/dts/internal/v2/render-sync-parts.d.ts.map +0 -1
  323. package/dist/dts/internal/v2/render.d.ts +0 -83
  324. package/dist/dts/internal/v2/render.d.ts.map +0 -1
  325. package/dist/dts/internal/v2/sync-parts.d.ts +0 -129
  326. package/dist/dts/internal/v2/sync-parts.d.ts.map +0 -1
  327. package/dist/esm/Directive.js +0 -64
  328. package/dist/esm/Directive.js.map +0 -1
  329. package/dist/esm/ElementRef.js +0 -76
  330. package/dist/esm/ElementRef.js.map +0 -1
  331. package/dist/esm/ElementSource.js +0 -246
  332. package/dist/esm/ElementSource.js.map +0 -1
  333. package/dist/esm/Entry.js +0 -2
  334. package/dist/esm/Entry.js.map +0 -1
  335. package/dist/esm/EventHandler.js +0 -68
  336. package/dist/esm/EventHandler.js.map +0 -1
  337. package/dist/esm/Html.js +0 -230
  338. package/dist/esm/Html.js.map +0 -1
  339. package/dist/esm/HtmlChunk.js +0 -330
  340. package/dist/esm/HtmlChunk.js.map +0 -1
  341. package/dist/esm/Hydrate.js +0 -31
  342. package/dist/esm/Hydrate.js.map +0 -1
  343. package/dist/esm/Many.js +0 -54
  344. package/dist/esm/Many.js.map +0 -1
  345. package/dist/esm/Meta.js +0 -40
  346. package/dist/esm/Meta.js.map +0 -1
  347. package/dist/esm/Parser.js +0 -13
  348. package/dist/esm/Parser.js.map +0 -1
  349. package/dist/esm/Part.js +0 -5
  350. package/dist/esm/Part.js.map +0 -1
  351. package/dist/esm/Placeholder.js +0 -26
  352. package/dist/esm/Placeholder.js.map +0 -1
  353. package/dist/esm/Platform.js +0 -42
  354. package/dist/esm/Platform.js.map +0 -1
  355. package/dist/esm/Render.js +0 -36
  356. package/dist/esm/Render.js.map +0 -1
  357. package/dist/esm/RenderContext.js +0 -54
  358. package/dist/esm/RenderContext.js.map +0 -1
  359. package/dist/esm/RenderEvent.js +0 -43
  360. package/dist/esm/RenderEvent.js.map +0 -1
  361. package/dist/esm/RenderQueue.js +0 -338
  362. package/dist/esm/RenderQueue.js.map +0 -1
  363. package/dist/esm/RenderTemplate.js +0 -16
  364. package/dist/esm/RenderTemplate.js.map +0 -1
  365. package/dist/esm/Renderable.js +0 -2
  366. package/dist/esm/Renderable.js.map +0 -1
  367. package/dist/esm/Template.js.map +0 -1
  368. package/dist/esm/Test.js +0 -167
  369. package/dist/esm/Test.js.map +0 -1
  370. package/dist/esm/Vitest.js +0 -44
  371. package/dist/esm/Vitest.js.map +0 -1
  372. package/dist/esm/compiler-tools.js +0 -91
  373. package/dist/esm/compiler-tools.js.map +0 -1
  374. package/dist/esm/index.js +0 -65
  375. package/dist/esm/index.js.map +0 -1
  376. package/dist/esm/internal/EventSource.js +0 -126
  377. package/dist/esm/internal/EventSource.js.map +0 -1
  378. package/dist/esm/internal/HydrateContext.js +0 -7
  379. package/dist/esm/internal/HydrateContext.js.map +0 -1
  380. package/dist/esm/internal/browser.js +0 -103
  381. package/dist/esm/internal/browser.js.map +0 -1
  382. package/dist/esm/internal/character-entities.js +0 -2134
  383. package/dist/esm/internal/character-entities.js.map +0 -1
  384. package/dist/esm/internal/chunks.js +0 -60
  385. package/dist/esm/internal/chunks.js.map +0 -1
  386. package/dist/esm/internal/errors.js +0 -46
  387. package/dist/esm/internal/errors.js.map +0 -1
  388. package/dist/esm/internal/indexRefCounter.js +0 -47
  389. package/dist/esm/internal/indexRefCounter.js.map +0 -1
  390. package/dist/esm/internal/module-augmentation.js +0 -2
  391. package/dist/esm/internal/module-augmentation.js.map +0 -1
  392. package/dist/esm/internal/parser.js +0 -596
  393. package/dist/esm/internal/parser.js.map +0 -1
  394. package/dist/esm/internal/parser2.js +0 -393
  395. package/dist/esm/internal/parser2.js.map +0 -1
  396. package/dist/esm/internal/server-parts.js +0 -109
  397. package/dist/esm/internal/server-parts.js.map +0 -1
  398. package/dist/esm/internal/server.js +0 -22
  399. package/dist/esm/internal/server.js.map +0 -1
  400. package/dist/esm/internal/utils.js +0 -119
  401. package/dist/esm/internal/utils.js.map +0 -1
  402. package/dist/esm/internal/v2/SyncPart.js +0 -5
  403. package/dist/esm/internal/v2/SyncPart.js.map +0 -1
  404. package/dist/esm/internal/v2/helpers.js +0 -12
  405. package/dist/esm/internal/v2/helpers.js.map +0 -1
  406. package/dist/esm/internal/v2/hydration-template.js.map +0 -1
  407. package/dist/esm/internal/v2/parts.js +0 -150
  408. package/dist/esm/internal/v2/parts.js.map +0 -1
  409. package/dist/esm/internal/v2/render-entry.js +0 -102
  410. package/dist/esm/internal/v2/render-entry.js.map +0 -1
  411. package/dist/esm/internal/v2/render-sync-parts.js +0 -265
  412. package/dist/esm/internal/v2/render-sync-parts.js.map +0 -1
  413. package/dist/esm/internal/v2/render.js +0 -521
  414. package/dist/esm/internal/v2/render.js.map +0 -1
  415. package/dist/esm/internal/v2/sync-parts.js +0 -102
  416. package/dist/esm/internal/v2/sync-parts.js.map +0 -1
  417. package/dist/esm/package.json +0 -4
  418. package/src/Directive.ts +0 -114
  419. package/src/ElementRef.ts +0 -148
  420. package/src/ElementSource.ts +0 -510
  421. package/src/Entry.ts +0 -28
  422. package/src/Hydrate.ts +0 -51
  423. package/src/Many.ts +0 -161
  424. package/src/Meta.ts +0 -45
  425. package/src/Part.ts +0 -154
  426. package/src/Placeholder.ts +0 -78
  427. package/src/Platform.ts +0 -70
  428. package/src/RenderContext.ts +0 -121
  429. package/src/Test.ts +0 -354
  430. package/src/Vitest.ts +0 -141
  431. package/src/compiler-tools.ts +0 -250
  432. package/src/internal/EventSource.ts +0 -188
  433. package/src/internal/HydrateContext.ts +0 -22
  434. package/src/internal/browser.ts +0 -138
  435. package/src/internal/character-entities.ts +0 -2136
  436. package/src/internal/chunks.ts +0 -89
  437. package/src/internal/errors.ts +0 -49
  438. package/src/internal/external.d.ts +0 -11
  439. package/src/internal/indexRefCounter.ts +0 -54
  440. package/src/internal/module-augmentation.ts +0 -44
  441. package/src/internal/parser.ts +0 -757
  442. package/src/internal/parser2.ts +0 -468
  443. package/src/internal/server-parts.ts +0 -161
  444. package/src/internal/server.ts +0 -37
  445. package/src/internal/utils.ts +0 -153
  446. package/src/internal/v2/SyncPart.ts +0 -112
  447. package/src/internal/v2/helpers.ts +0 -13
  448. package/src/internal/v2/hydration-template.ts +0 -308
  449. package/src/internal/v2/parts.ts +0 -254
  450. package/src/internal/v2/render-entry.ts +0 -131
  451. package/src/internal/v2/render-sync-parts.ts +0 -440
  452. package/src/internal/v2/render.ts +0 -813
  453. package/src/internal/v2/sync-parts.ts +0 -133
package/README.md CHANGED
@@ -1,5 +1,111 @@
1
1
  # @typed/template
2
2
 
3
- > WIP
3
+ > **Beta:** This package is in beta; APIs may change.
4
+
5
+ `@typed/template` provides **declarative UI over Effect**: HTML literals (`html`), a stream of **RenderEvent**s, DOM and HTML rendering, hydration, and event handling. Templates are Fx streams; you provide **RenderTemplate** (e.g. **DomRenderTemplate** for the browser or **HtmlRenderTemplate** for SSR). Use it for type-safe, reactive UIs that integrate with Effect and RefSubject.
6
+
7
+ ## Dependencies
8
+
9
+ - `effect`
10
+ - `@typed/fx`
11
+ - `html5parser`
12
+ - `happy-dom` (dev)
13
+
14
+ ## API overview
15
+
16
+ - **Templates:** `html` tag; **Renderable**; **Template** module.
17
+ - **Rendering:** `render(template, container)` — renders an Fx of RenderEvent into a DOM node; **RenderTemplate** (service); **DomRenderTemplate**, **HtmlRenderTemplate** (layers); **RenderEvent**, **DomRenderEvent**, **HtmlRenderEvent**.
18
+ - **Services (Render):** **CurrentRenderDocument**, **CurrentRenderQueue**, **CurrentRenderPriority**.
19
+ - **Events:** **EventHandler**; **EventSource**; **RenderEvent**.
20
+ - **Hydration:** **HydrateContext**, **makeHydrateContext**.
21
+ - **Other:** **Parser**, **Wire**; **HtmlChunk**, **RenderQueue**; subpaths `@typed/template/Render`, `@typed/template/Html`, `@typed/template/HtmlChunk`, etc.
22
+
23
+ ## Example
24
+
25
+ ```ts
26
+ import { Layer } from "effect";
27
+ import { Fx, RefSubject } from "@typed/fx";
28
+ import { DomRenderTemplate, html, render } from "@typed/template";
29
+
30
+ const Counter = Fx.gen(function* () {
31
+ const count = yield* RefSubject.make(0);
32
+ return html`<div>
33
+ <button onclick=${RefSubject.increment(count)}>Increment</button>
34
+ <button onclick=${RefSubject.decrement(count)}>Decrement</button>
35
+ <p>Count: ${count}</p>
36
+ </div>`;
37
+ });
38
+
39
+ // Inside Effect.gen(function* () { ... })
40
+ yield* render(Counter, document.body).pipe(
41
+ Fx.drainLayer,
42
+ Layer.provide(DomRenderTemplate),
43
+ Layer.launch,
44
+ );
45
+ ```
46
+
47
+ See the [counter example](https://github.com/typed-smol/typed-smol/tree/main/examples/counter) for a full app.
48
+
49
+ ## API Reference
50
+
51
+ ### Main entry (`@typed/template`)
52
+
53
+ | Export | Description |
54
+ |--------|-------------|
55
+ | **Templates** | |
56
+ | `html` | Tag function for HTML template literals; returns an `Fx<RenderEvent, E, R>`. Requires `RenderTemplate` in context. |
57
+ | `many(values, getKey, render)` | Renders a reactive list with keyed diffing; `values` is an `Fx<ReadonlyArray<A>>`, `getKey` maps items to keys, `render(ref, key)` returns an Fx of RenderEvents. |
58
+ | **RenderEvent** | |
59
+ | `RenderEvent` | Union of `DomRenderEvent` and `HtmlRenderEvent`. |
60
+ | `DomRenderEvent(content)` | Constructor for a DOM render result; `content` is `Rendered` (from `Wire`). |
61
+ | `HtmlRenderEvent(html, last)` | Constructor for an HTML-string render result; `last` indicates final chunk. |
62
+ | `isRenderEvent`, `isDomRenderEvent`, `isHtmlRenderEvent` | Type guards for `RenderEvent` variants. |
63
+ | **Renderable** | |
64
+ | `Renderable<A, E, R>` | Type of values that can be interpolated: primitives, arrays, `Effect`, `Fx`/`Stream`, objects. `Renderable.Any`, `Renderable.Services`, `Renderable.Error`, `Renderable.Success` for type-level helpers. |
65
+ | **EventHandler** (`EventHandler` namespace) | |
66
+ | `EventHandler.make(handler, options?)` | Creates an event handler; `handler` can return `void` or `Effect`; `options` can include `preventDefault`, `stopPropagation`, `once`, `passive`, etc. |
67
+ | `EventHandler.provide`, `EventHandler.catchCause` | Provide services or recover from errors. |
68
+ | `EventHandler.preventDefault`, `stopPropagation`, `stopImmediatePropagation`, `once`, `passive` | Combinators that add listener options. |
69
+ | `EventHandler.fromEffectOrEventHandler`, `EventHandler.isEventHandler` | Coerce from Effect or check type. |
70
+ | **EventSource** | |
71
+ | `makeEventSource()` | Creates an `EventSource` with `addEventListener` and `setup(rendered, scope)`. |
72
+ | **Hydration** | |
73
+ | `HydrateContext` | Service tag for hydration context (internal shape). |
74
+ | `makeHydrateContext(rootElement)` | Builds a service map with hydration context for the given root element. |
75
+ | **Parser** | |
76
+ | `parse(template)` | Parses a `TemplateStringsArray` (or readonly string array) into a `Template.Template`. |
77
+ | **RenderTemplate** | |
78
+ | `RenderTemplate` | Service that implements template rendering; callable as `(templateStrings, values) => Fx<RenderEvent, E, R>`. |
79
+ | **Template** | |
80
+ | `Template` (namespace) | `Template` class (nodes, hash, parts), part/element node types (`NodePart`, `AttrPartNode`, `EventPartNode`, etc.), and AST node types. |
81
+ | **HtmlChunk** | |
82
+ | `HtmlChunk`, `HtmlTextChunk`, `HtmlPartChunk`, `HtmlSparsePartChunk` | Types for pre-compiled HTML chunks. |
83
+ | `templateToHtmlChunks(template)`, `addTemplateHash(chunks, template)` | Build chunks from a parsed template; add hash comments for hydration. |
84
+ | **Wire** | |
85
+ | `Wire`, `Rendered` | Wire is a persistent fragment-like type; `Rendered` is the DOM output type. `persistent(document, templateHash, fragment)`, `toHtml(rendered)`, and internal helpers. |
86
+ | **RenderQueue** | |
87
+ | `RenderQueue` (abstract), `MixedRenderQueue`, `RenderPriority` | Queue for batched DOM updates; priorities like `RenderPriority.Sync`, `RenderPriority.Raf(n)`, `RenderPriority.Idle(n)`. |
88
+
89
+ ### `@typed/template/Render`
90
+
91
+ | Export | Description |
92
+ |--------|-------------|
93
+ | `render(fx, where)` / `render(where)(fx)` | Mounts an Fx of `RenderEvent`s into the DOM element `where`; provides `HydrateContext` from `where`. Returns Fx of rendered DOM. |
94
+ | `DomRenderTemplate` | Layer providing DOM-based `RenderTemplate`. `DomRenderTemplate.using(document)` for a custom document. |
95
+ | `CurrentRenderDocument` | Service reference for the `Document` used when rendering (default: global `document`). |
96
+ | `CurrentRenderQueue` | Service reference for the render queue (default: `MixedRenderQueue`). |
97
+ | `CurrentRenderPriority` | Service reference for default task priority (default: `RenderPriority.Raf(10)`). |
98
+ | `ToRendered<T>` | Type: rendered DOM for `RenderEvent` or `null`. |
99
+ | `attemptHydration(ctx, hash)` | Internal helper for hydration. |
100
+ | `TemplateContext` | Internal render context type. |
101
+
102
+ ### `@typed/template/Html`
103
+
104
+ | Export | Description |
105
+ |--------|-------------|
106
+ | `renderToHtml(fx)` | Converts an Fx of `RenderEvent`s into an Fx of HTML strings (for SSR). |
107
+ | `renderToHtmlString(fx)` | Effect that collects `renderToHtml` output and joins into a single string. |
108
+ | `HtmlRenderTemplate` | Layer providing HTML-string `RenderTemplate` (for SSR). |
109
+ | `StaticHtmlRenderTemplate` | Like `HtmlRenderTemplate` with static rendering optimizations. |
110
+ | `StaticRendering` | Service reference (boolean) for static rendering mode. |
4
111
 
5
- Docs: https://tylors.github.io/typed/docs/template
@@ -0,0 +1,273 @@
1
+ import type * as Cause from "effect/Cause";
2
+ import * as Effect from "effect/Effect";
3
+ import { type Pipeable } from "effect/Pipeable";
4
+ import type * as ServiceMap from "effect/ServiceMap";
5
+ export declare const EventHandlerTypeId: unique symbol;
6
+ export type EventHandlerTypeId = typeof EventHandlerTypeId;
7
+ /**
8
+ * Represents a DOM event handler that returns an Effect.
9
+ *
10
+ * It encapsulates the event handler logic and any options (like `preventDefault`, `once`, etc.)
11
+ * that should be applied when the event is triggered.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { Effect } from "effect"
16
+ * import * as EventHandler from "@typed/template/EventHandler"
17
+ * import { html } from "@typed/template"
18
+ *
19
+ * // Simple event handler
20
+ * const handleClick = EventHandler.make((event: MouseEvent) => {
21
+ * console.log("Clicked!", event)
22
+ * })
23
+ *
24
+ * // Event handler with Effect
25
+ * const handleSubmit = EventHandler.make((event: SubmitEvent) =>
26
+ * Effect.gen(function* () {
27
+ * event.preventDefault()
28
+ * yield* Effect.sync(() => console.log("Form submitted"))
29
+ * })
30
+ * )
31
+ *
32
+ * // Use in template
33
+ * const template = html`<button onclick=${handleClick}>Click me</button>`
34
+ * ```
35
+ *
36
+ * @since 1.0.0
37
+ * @category models
38
+ */
39
+ export interface EventHandler<Ev extends Event = Event, E = never, R = never> extends Pipeable {
40
+ readonly [EventHandlerTypeId]: EventHandlerTypeId;
41
+ readonly handler: (event: Ev) => Effect.Effect<unknown, E, R>;
42
+ readonly options: (AddEventListenerOptions & EventOptions) | undefined;
43
+ }
44
+ export type Context<T> = T extends EventHandler<infer _Ev, infer _E, infer R> ? R : never;
45
+ export type Error<T> = T extends EventHandler<infer _Ev, infer E, infer _R> ? E : never;
46
+ export type EventOf<T> = T extends EventHandler<infer Ev, infer _E, infer _R> ? Ev : never;
47
+ /**
48
+ * Options for configuring event handling behavior.
49
+ */
50
+ export type EventOptions = {
51
+ readonly preventDefault?: boolean;
52
+ readonly stopPropagation?: boolean;
53
+ readonly stopImmediatePropagation?: boolean;
54
+ };
55
+ /**
56
+ * Creates a new `EventHandler`.
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * import { Effect } from "effect"
61
+ * import * as EventHandler from "@typed/template/EventHandler"
62
+ * import { html } from "@typed/template"
63
+ *
64
+ * // Simple handler
65
+ * const clickHandler = EventHandler.make((event) => {
66
+ * console.log("Button clicked")
67
+ * })
68
+ *
69
+ * // Handler with Effect
70
+ * const submitHandler = EventHandler.make((event) =>
71
+ * Effect.gen(function* () {
72
+ * const form = event.target as HTMLFormElement
73
+ * const data = new FormData(form)
74
+ * yield* Effect.sync(() => console.log("Submitting:", data))
75
+ * })
76
+ * )
77
+ *
78
+ * // Handler with options
79
+ * const preventDefaultHandler = EventHandler.make(
80
+ * (event) => console.log("Prevented default"),
81
+ * { preventDefault: true }
82
+ * )
83
+ *
84
+ * const template = html`<button onclick=${clickHandler}>Click</button>`
85
+ * ```
86
+ *
87
+ * @param handler - The function to execute when the event occurs. Can return void or an Effect.
88
+ * @param options - Optional configuration for the event listener.
89
+ * @since 1.0.0
90
+ * @category constructors
91
+ */
92
+ export declare function make<Ev extends Event, E = never, R = never>(handler: (event: Ev) => void | Effect.Effect<unknown, E, R>, options?: AddEventListenerOptions & EventOptions): EventHandler<Ev, E, R>;
93
+ /**
94
+ * Provides services to the `EventHandler`.
95
+ *
96
+ * This allows you to inject dependencies into the effect returned by the event handler.
97
+ *
98
+ * @example
99
+ * ```ts
100
+ * import { Effect, Context } from "effect"
101
+ * import * as EventHandler from "@typed/template/EventHandler"
102
+ *
103
+ * interface Database {
104
+ * readonly save: (data: string) => Effect.Effect<void>
105
+ * }
106
+ * const Database = Context.GenericTag<Database>("Database")
107
+ *
108
+ * const handler = EventHandler.make((event) =>
109
+ * Effect.flatMap(Database, (db) => db.save("data"))
110
+ * )
111
+ *
112
+ * // Provide services
113
+ * const provided = EventHandler.provide(handler, Database.of({ save: (d) => Effect.sync(() => console.log(d)) }))
114
+ * ```
115
+ *
116
+ * @since 1.0.0
117
+ * @category combinators
118
+ */
119
+ export declare const provide: {
120
+ <R2 = never>(services: ServiceMap.ServiceMap<R2>): <Ev extends Event, E = never, R = never>(handler: EventHandler<Ev, E, R>) => EventHandler<Ev, E, Exclude<R, R2>>;
121
+ <Ev extends Event, E = never, R = never, R2 = never>(handler: EventHandler<Ev, E, R>, services: ServiceMap.ServiceMap<R2>): EventHandler<Ev, E, Exclude<R, R2>>;
122
+ };
123
+ /**
124
+ * Recovers from errors in the `EventHandler`.
125
+ *
126
+ * @example
127
+ * ```ts
128
+ * import { Effect } from "effect"
129
+ * import * as EventHandler from "@typed/template/EventHandler"
130
+ *
131
+ * const handler = EventHandler.make((event) =>
132
+ * Effect.fail("Something went wrong")
133
+ * )
134
+ *
135
+ * // Recover from errors
136
+ * const recovered = EventHandler.catchCause(handler, (cause) =>
137
+ * Effect.sync(() => console.error("Error:", cause))
138
+ * )
139
+ * ```
140
+ *
141
+ * @since 1.0.0
142
+ * @category combinators
143
+ */
144
+ export declare const catchCause: {
145
+ <E, E2 = never, R2 = never>(f: (cause: Cause.Cause<E>) => Effect.Effect<unknown, E2, R2>): <Ev extends Event, R = never>(handler: EventHandler<Ev, E, R>) => EventHandler<Ev, E2, R | R2>;
146
+ <Ev extends Event, E = never, R = never, E2 = never, R2 = never>(handler: EventHandler<Ev, E, R>, f: (cause: Cause.Cause<E>) => Effect.Effect<unknown, E2, R2>): EventHandler<Ev, E2, R | R2>;
147
+ };
148
+ /**
149
+ * Helper to ensure a value is an `EventHandler`.
150
+ *
151
+ * If the input is already an `EventHandler`, it is returned as is.
152
+ * If it is an `Effect`, it is wrapped in an `EventHandler` that ignores the event argument.
153
+ */
154
+ export declare function fromEffectOrEventHandler<Ev extends Event, E = never, R = never>(handler: Effect.Effect<unknown, E, R> | EventHandler<Ev, E, R>): EventHandler<Ev, E, R>;
155
+ /**
156
+ * Checks if a value is an `EventHandler`.
157
+ *
158
+ * @example
159
+ * ```ts
160
+ * import * as EventHandler from "@typed/template/EventHandler"
161
+ *
162
+ * const handler = EventHandler.make((event) => console.log("Click"))
163
+ * const isHandler = EventHandler.isEventHandler(handler)
164
+ * console.log(isHandler) // true
165
+ *
166
+ * const notHandler = (event: Event) => console.log("Click")
167
+ * const isNotHandler = EventHandler.isEventHandler(notHandler)
168
+ * console.log(isNotHandler) // false
169
+ * ```
170
+ *
171
+ * @since 1.0.0
172
+ * @category guards
173
+ */
174
+ export declare function isEventHandler<Ev extends Event, E = never, R = never>(handler: unknown): handler is EventHandler<Ev, E, R>;
175
+ /**
176
+ * Applies event options to a native DOM event.
177
+ */
178
+ export declare function handleEventOptions<Ev extends Event>(eventOptions: EventOptions, ev: Ev): boolean;
179
+ /**
180
+ * Modifies an `EventHandler` to call `preventDefault()` on the event.
181
+ *
182
+ * @example
183
+ * ```ts
184
+ * import * as EventHandler from "@typed/template/EventHandler"
185
+ * import { html } from "@typed/template"
186
+ *
187
+ * const handler = EventHandler.make((event) => {
188
+ * console.log("Form submit prevented")
189
+ * })
190
+ *
191
+ * const preventDefaultHandler = EventHandler.preventDefault(handler)
192
+ *
193
+ * const template = html`<form onsubmit=${preventDefaultHandler}>...</form>`
194
+ * ```
195
+ *
196
+ * @since 1.0.0
197
+ * @category combinators
198
+ */
199
+ export declare function preventDefault<Ev extends Event, E = never, R = never>(handler: EventHandler<Ev, E, R>): EventHandler<Ev, E, R>;
200
+ /**
201
+ * Modifies an `EventHandler` to call `stopPropagation()` on the event.
202
+ *
203
+ * @example
204
+ * ```ts
205
+ * import * as EventHandler from "@typed/template/EventHandler"
206
+ *
207
+ * const handler = EventHandler.make((event) => {
208
+ * console.log("Event stopped")
209
+ * })
210
+ *
211
+ * const stopPropHandler = EventHandler.stopPropagation(handler)
212
+ * ```
213
+ *
214
+ * @since 1.0.0
215
+ * @category combinators
216
+ */
217
+ export declare function stopPropagation<Ev extends Event, E = never, R = never>(handler: EventHandler<Ev, E, R>): EventHandler<Ev, E, R>;
218
+ /**
219
+ * Modifies an `EventHandler` to call `stopImmediatePropagation()` on the event.
220
+ *
221
+ * @example
222
+ * ```ts
223
+ * import * as EventHandler from "@typed/template/EventHandler"
224
+ *
225
+ * const handler = EventHandler.make((event) => {
226
+ * console.log("Immediate propagation stopped")
227
+ * })
228
+ *
229
+ * const stopImmediateHandler = EventHandler.stopImmediatePropagation(handler)
230
+ * ```
231
+ *
232
+ * @since 1.0.0
233
+ * @category combinators
234
+ */
235
+ export declare function stopImmediatePropagation<Ev extends Event, E = never, R = never>(handler: EventHandler<Ev, E, R>): EventHandler<Ev, E, R>;
236
+ /**
237
+ * Modifies an `EventHandler` to run only once.
238
+ *
239
+ * @example
240
+ * ```ts
241
+ * import * as EventHandler from "@typed/template/EventHandler"
242
+ *
243
+ * const handler = EventHandler.make((event) => {
244
+ * console.log("This will only run once")
245
+ * })
246
+ *
247
+ * const onceHandler = EventHandler.once(handler)
248
+ * ```
249
+ *
250
+ * @since 1.0.0
251
+ * @category combinators
252
+ */
253
+ export declare function once<Ev extends Event, E = never, R = never>(handler: EventHandler<Ev, E, R>): EventHandler<Ev, E, R>;
254
+ /**
255
+ * Modifies an `EventHandler` to be passive (improves scrolling performance).
256
+ *
257
+ * @example
258
+ * ```ts
259
+ * import * as EventHandler from "@typed/template/EventHandler"
260
+ *
261
+ * const handler = EventHandler.make((event) => {
262
+ * // Passive handlers can't call preventDefault
263
+ * console.log("Scroll event")
264
+ * })
265
+ *
266
+ * const passiveHandler = EventHandler.passive(handler)
267
+ * ```
268
+ *
269
+ * @since 1.0.0
270
+ * @category combinators
271
+ */
272
+ export declare function passive<Ev extends Event, E = never, R = never>(handler: EventHandler<Ev, E, R>): EventHandler<Ev, E, R>;
273
+ //# sourceMappingURL=EventHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventHandler.d.ts","sourceRoot":"","sources":["../src/EventHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,iBAAiB,CAAC;AAE/D,OAAO,KAAK,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,kBAAkB,eAA6C,CAAC;AAC7E,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,WAAW,YAAY,CAAC,EAAE,SAAS,KAAK,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,CAAE,SAAQ,QAAQ;IAC5F,QAAQ,CAAC,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,QAAQ,CAAC,OAAO,EAAE,CAAC,uBAAuB,GAAG,YAAY,CAAC,GAAG,SAAS,CAAC;CACxE;AAED,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,MAAM,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAC1F,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AACxF,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AAE3F;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CAC7C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,IAAI,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EACzD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAC3D,OAAO,CAAC,EAAE,uBAAuB,GAAG,YAAY,GAC/C,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAcxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,OAAO,EAAE;IACpB,CAAC,EAAE,GAAG,KAAK,EACT,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,GAClC,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EACxC,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAC5B,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAEzC,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,EACjD,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAC/B,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,GAClC,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;CAYxC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,UAAU,EAAE;IACvB,CAAC,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,EACxB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,GAC3D,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IAElG,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,EAC7D,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAC/B,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,GAC3D,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;CASjC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAC7E,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAC7D,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAGxB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EACnE,OAAO,EAAE,OAAO,GACf,OAAO,IAAI,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAEnC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,SAAS,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAMhG;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EACnE,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAC9B,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAExB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EACpE,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAC9B,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAExB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAC7E,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAC9B,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAExB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,IAAI,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EACzD,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAC9B,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAExB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,OAAO,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAC5D,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAC9B,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAExB"}
@@ -0,0 +1,261 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { dual } from "effect/Function";
3
+ import { pipeArguments } from "effect/Pipeable";
4
+ import { hasProperty } from "effect/Predicate";
5
+ export const EventHandlerTypeId = Symbol.for("@typed/template/EventHandler");
6
+ /**
7
+ * Creates a new `EventHandler`.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { Effect } from "effect"
12
+ * import * as EventHandler from "@typed/template/EventHandler"
13
+ * import { html } from "@typed/template"
14
+ *
15
+ * // Simple handler
16
+ * const clickHandler = EventHandler.make((event) => {
17
+ * console.log("Button clicked")
18
+ * })
19
+ *
20
+ * // Handler with Effect
21
+ * const submitHandler = EventHandler.make((event) =>
22
+ * Effect.gen(function* () {
23
+ * const form = event.target as HTMLFormElement
24
+ * const data = new FormData(form)
25
+ * yield* Effect.sync(() => console.log("Submitting:", data))
26
+ * })
27
+ * )
28
+ *
29
+ * // Handler with options
30
+ * const preventDefaultHandler = EventHandler.make(
31
+ * (event) => console.log("Prevented default"),
32
+ * { preventDefault: true }
33
+ * )
34
+ *
35
+ * const template = html`<button onclick=${clickHandler}>Click</button>`
36
+ * ```
37
+ *
38
+ * @param handler - The function to execute when the event occurs. Can return void or an Effect.
39
+ * @param options - Optional configuration for the event listener.
40
+ * @since 1.0.0
41
+ * @category constructors
42
+ */
43
+ export function make(handler, options) {
44
+ return {
45
+ [EventHandlerTypeId]: EventHandlerTypeId,
46
+ handler: (ev) => {
47
+ if (options)
48
+ handleEventOptions(options, ev);
49
+ const result = handler(ev);
50
+ if (Effect.isEffect(result))
51
+ return result;
52
+ return Effect.void;
53
+ },
54
+ options,
55
+ pipe() {
56
+ return pipeArguments(this, arguments);
57
+ },
58
+ };
59
+ }
60
+ /**
61
+ * Provides services to the `EventHandler`.
62
+ *
63
+ * This allows you to inject dependencies into the effect returned by the event handler.
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * import { Effect, Context } from "effect"
68
+ * import * as EventHandler from "@typed/template/EventHandler"
69
+ *
70
+ * interface Database {
71
+ * readonly save: (data: string) => Effect.Effect<void>
72
+ * }
73
+ * const Database = Context.GenericTag<Database>("Database")
74
+ *
75
+ * const handler = EventHandler.make((event) =>
76
+ * Effect.flatMap(Database, (db) => db.save("data"))
77
+ * )
78
+ *
79
+ * // Provide services
80
+ * const provided = EventHandler.provide(handler, Database.of({ save: (d) => Effect.sync(() => console.log(d)) }))
81
+ * ```
82
+ *
83
+ * @since 1.0.0
84
+ * @category combinators
85
+ */
86
+ export const provide = dual(2, (handler, services) => {
87
+ return make((ev) => handler.handler(ev).pipe(Effect.provideServices(services)), handler.options);
88
+ });
89
+ /**
90
+ * Recovers from errors in the `EventHandler`.
91
+ *
92
+ * @example
93
+ * ```ts
94
+ * import { Effect } from "effect"
95
+ * import * as EventHandler from "@typed/template/EventHandler"
96
+ *
97
+ * const handler = EventHandler.make((event) =>
98
+ * Effect.fail("Something went wrong")
99
+ * )
100
+ *
101
+ * // Recover from errors
102
+ * const recovered = EventHandler.catchCause(handler, (cause) =>
103
+ * Effect.sync(() => console.error("Error:", cause))
104
+ * )
105
+ * ```
106
+ *
107
+ * @since 1.0.0
108
+ * @category combinators
109
+ */
110
+ export const catchCause = dual(2, (handler, f) => {
111
+ return make((ev) => handler.handler(ev).pipe(Effect.catchCause(f)), handler.options);
112
+ });
113
+ /**
114
+ * Helper to ensure a value is an `EventHandler`.
115
+ *
116
+ * If the input is already an `EventHandler`, it is returned as is.
117
+ * If it is an `Effect`, it is wrapped in an `EventHandler` that ignores the event argument.
118
+ */
119
+ export function fromEffectOrEventHandler(handler) {
120
+ if (isEventHandler(handler))
121
+ return handler;
122
+ return make(() => handler);
123
+ }
124
+ /**
125
+ * Checks if a value is an `EventHandler`.
126
+ *
127
+ * @example
128
+ * ```ts
129
+ * import * as EventHandler from "@typed/template/EventHandler"
130
+ *
131
+ * const handler = EventHandler.make((event) => console.log("Click"))
132
+ * const isHandler = EventHandler.isEventHandler(handler)
133
+ * console.log(isHandler) // true
134
+ *
135
+ * const notHandler = (event: Event) => console.log("Click")
136
+ * const isNotHandler = EventHandler.isEventHandler(notHandler)
137
+ * console.log(isNotHandler) // false
138
+ * ```
139
+ *
140
+ * @since 1.0.0
141
+ * @category guards
142
+ */
143
+ export function isEventHandler(handler) {
144
+ return hasProperty(handler, EventHandlerTypeId);
145
+ }
146
+ /**
147
+ * Applies event options to a native DOM event.
148
+ */
149
+ export function handleEventOptions(eventOptions, ev) {
150
+ if (eventOptions.preventDefault)
151
+ ev.preventDefault();
152
+ if (eventOptions.stopPropagation)
153
+ ev.stopPropagation();
154
+ if (eventOptions.stopImmediatePropagation)
155
+ ev.stopImmediatePropagation();
156
+ return true;
157
+ }
158
+ /**
159
+ * Modifies an `EventHandler` to call `preventDefault()` on the event.
160
+ *
161
+ * @example
162
+ * ```ts
163
+ * import * as EventHandler from "@typed/template/EventHandler"
164
+ * import { html } from "@typed/template"
165
+ *
166
+ * const handler = EventHandler.make((event) => {
167
+ * console.log("Form submit prevented")
168
+ * })
169
+ *
170
+ * const preventDefaultHandler = EventHandler.preventDefault(handler)
171
+ *
172
+ * const template = html`<form onsubmit=${preventDefaultHandler}>...</form>`
173
+ * ```
174
+ *
175
+ * @since 1.0.0
176
+ * @category combinators
177
+ */
178
+ export function preventDefault(handler) {
179
+ return make(handler.handler, { ...handler.options, preventDefault: true });
180
+ }
181
+ /**
182
+ * Modifies an `EventHandler` to call `stopPropagation()` on the event.
183
+ *
184
+ * @example
185
+ * ```ts
186
+ * import * as EventHandler from "@typed/template/EventHandler"
187
+ *
188
+ * const handler = EventHandler.make((event) => {
189
+ * console.log("Event stopped")
190
+ * })
191
+ *
192
+ * const stopPropHandler = EventHandler.stopPropagation(handler)
193
+ * ```
194
+ *
195
+ * @since 1.0.0
196
+ * @category combinators
197
+ */
198
+ export function stopPropagation(handler) {
199
+ return make(handler.handler, { ...handler.options, stopPropagation: true });
200
+ }
201
+ /**
202
+ * Modifies an `EventHandler` to call `stopImmediatePropagation()` on the event.
203
+ *
204
+ * @example
205
+ * ```ts
206
+ * import * as EventHandler from "@typed/template/EventHandler"
207
+ *
208
+ * const handler = EventHandler.make((event) => {
209
+ * console.log("Immediate propagation stopped")
210
+ * })
211
+ *
212
+ * const stopImmediateHandler = EventHandler.stopImmediatePropagation(handler)
213
+ * ```
214
+ *
215
+ * @since 1.0.0
216
+ * @category combinators
217
+ */
218
+ export function stopImmediatePropagation(handler) {
219
+ return make(handler.handler, { ...handler.options, stopImmediatePropagation: true });
220
+ }
221
+ /**
222
+ * Modifies an `EventHandler` to run only once.
223
+ *
224
+ * @example
225
+ * ```ts
226
+ * import * as EventHandler from "@typed/template/EventHandler"
227
+ *
228
+ * const handler = EventHandler.make((event) => {
229
+ * console.log("This will only run once")
230
+ * })
231
+ *
232
+ * const onceHandler = EventHandler.once(handler)
233
+ * ```
234
+ *
235
+ * @since 1.0.0
236
+ * @category combinators
237
+ */
238
+ export function once(handler) {
239
+ return make(handler.handler, { ...handler.options, once: true, passive: false });
240
+ }
241
+ /**
242
+ * Modifies an `EventHandler` to be passive (improves scrolling performance).
243
+ *
244
+ * @example
245
+ * ```ts
246
+ * import * as EventHandler from "@typed/template/EventHandler"
247
+ *
248
+ * const handler = EventHandler.make((event) => {
249
+ * // Passive handlers can't call preventDefault
250
+ * console.log("Scroll event")
251
+ * })
252
+ *
253
+ * const passiveHandler = EventHandler.passive(handler)
254
+ * ```
255
+ *
256
+ * @since 1.0.0
257
+ * @category combinators
258
+ */
259
+ export function passive(handler) {
260
+ return make(handler.handler, { ...handler.options, passive: true, once: false });
261
+ }