@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/src/Html.ts CHANGED
@@ -1,390 +1,349 @@
1
- /**
2
- * @since 1.0.0
3
- */
4
-
5
- import type { CurrentEnvironment } from "@typed/environment"
6
- import * as Fx from "@typed/fx/Fx"
7
- import * as Sink from "@typed/fx/Sink"
8
- import { FxTypeId } from "@typed/fx/TypeId"
9
- import { join } from "effect/Array"
10
- import * as Effect from "effect/Effect"
11
- import * as Layer from "effect/Layer"
12
- import * as Option from "effect/Option"
13
- import type * as Record from "effect/Record"
14
- import type * as Scope from "effect/Scope"
15
- import { isDirective } from "./Directive.js"
16
- import type { ServerEntry } from "./Entry.js"
17
- import type { HtmlChunk, PartChunk, SparsePartChunk, TextChunk } from "./HtmlChunk.js"
18
- import { templateToHtmlChunks } from "./HtmlChunk.js"
19
- import { parse } from "./internal/parser2.js"
20
- import { partNodeToPart } from "./internal/server.js"
21
- import { isNullOrUndefined } from "./internal/v2/helpers.js"
22
- import { TEXT_START, TYPED_HOLE_END, TYPED_HOLE_START } from "./Meta.js"
23
- import type { Placeholder } from "./Placeholder.js"
24
- import type { Renderable } from "./Renderable.js"
25
- import * as RenderContext from "./RenderContext.js"
26
- import { HtmlRenderEvent, isHtmlRenderEvent } from "./RenderEvent.js"
27
- import type { RenderEvent } from "./RenderEvent.js"
28
- import * as RenderQueue from "./RenderQueue.js"
29
- import { RenderTemplate } from "./RenderTemplate.js"
30
-
31
- const toHtml = (r: RenderEvent | null) => r === null ? "" : (r as HtmlRenderEvent).html
32
-
33
- /**
34
- * @since 1.0.0
35
- */
36
- export const serverLayer: Layer.Layer<
37
- | RenderContext.RenderContext
38
- | RenderQueue.RenderQueue
39
- | RenderTemplate
40
- | CurrentEnvironment
41
- > = Layer.provideMerge(
42
- RenderTemplate.layer(RenderContext.RenderContext.with(renderHtmlTemplate)),
43
- RenderContext.server
44
- ).pipe(Layer.provideMerge(RenderQueue.sync))
45
-
46
- /**
47
- * @since 1.0.0
48
- */
49
- export const staticLayer: Layer.Layer<
50
- | RenderContext.RenderContext
51
- | RenderQueue.RenderQueue
52
- | RenderTemplate
53
- | CurrentEnvironment
54
- > = Layer.provideMerge(
55
- RenderTemplate.layer(RenderContext.RenderContext.with(renderHtmlTemplate)),
56
- RenderContext.static
57
- ).pipe(Layer.provideMerge(RenderQueue.sync))
1
+ import * as Effect from "effect/Effect";
2
+ import * as Layer from "effect/Layer";
3
+ import { none, type Option, some } from "effect/Option";
4
+ import { isNullish, isObject } from "effect/Predicate";
5
+ import { map as mapRecord } from "effect/Record";
6
+ import type { Scope } from "effect/Scope";
7
+ import * as ServiceMap from "effect/ServiceMap";
8
+ import { Fx, RefSubject } from "@typed/fx";
9
+ import {
10
+ addTemplateHash,
11
+ type HtmlChunk,
12
+ type HtmlPartChunk,
13
+ type HtmlSparsePartChunk,
14
+ templateToHtmlChunks,
15
+ } from "./HtmlChunk.js";
16
+ import { renderToString } from "./internal/encoding.js";
17
+ import { TEXT_START, TYPED_NODE_END, TYPED_NODE_START } from "./internal/meta.js";
18
+ import { takeOneIfNotRenderEvent } from "./internal/takeOneIfNotRenderEvent.js";
19
+ import { parse } from "./Parser.js";
20
+ import type { Renderable } from "./Renderable.js";
21
+ import { HtmlRenderEvent, isHtmlRenderEvent, type RenderEvent } from "./RenderEvent.js";
22
+ import { RenderTemplate } from "./RenderTemplate.js";
23
+
24
+ const toHtmlString = (event: RenderEvent | null | undefined): Option<string> => {
25
+ if (event === null || event === undefined) return none();
26
+ const s = event.toString();
27
+ if (s === "") return none();
28
+ return some(s);
29
+ };
58
30
 
59
31
  /**
32
+ * Renders a stream of `RenderEvent`s into a stream of HTML strings.
33
+ *
34
+ * This function transforms the output of a template rendering process (which produces `RenderEvent`s)
35
+ * into a stream of strings suitable for HTML output (e.g., for Server-Side Rendering).
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * import { Effect } from "effect"
40
+ * import { html } from "@typed/template"
41
+ * import { renderToHtml, HtmlRenderTemplate } from "@typed/template/Html"
42
+ * import { Fx } from "@typed/fx"
43
+ * import { Layer } from "effect"
44
+ *
45
+ * const program = Effect.gen(function* () {
46
+ * const template = html`<div>Hello, ${"world"}!</div>`
47
+ *
48
+ * // Render to HTML string stream
49
+ * const htmlStream = renderToHtml(template).pipe(
50
+ * Fx.provide(HtmlRenderTemplate)
51
+ * )
52
+ *
53
+ * // Collect all HTML chunks
54
+ * const chunks = yield* Fx.collectAll(htmlStream)
55
+ * console.log(chunks.join("")) // "<div>Hello, world!</div>"
56
+ * })
57
+ * ```
58
+ *
59
+ * @param fx - The `Fx` stream of `RenderEvent`s to render.
60
+ * @returns An `Fx` stream of HTML strings.
60
61
  * @since 1.0.0
62
+ * @category rendering
61
63
  */
62
64
  export function renderToHtml<E, R>(
63
- fx: Fx.Fx<RenderEvent | null, E, R>
65
+ fx: Fx.Fx<RenderEvent | null | undefined, E, R>,
64
66
  ): Fx.Fx<string, E, R> {
65
- return Fx.map(fx, toHtml)
67
+ return Fx.filterMap(fx, toHtmlString);
66
68
  }
67
69
 
68
70
  /**
71
+ * Renders a stream of `RenderEvent`s into a single HTML string.
72
+ *
73
+ * This is a convenience function that collects all events from `renderToHtml` and joins them
74
+ * into a single string. It is an Effect that resolves when the stream completes.
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * import { Effect } from "effect"
79
+ * import { html } from "@typed/template"
80
+ * import { renderToHtmlString, HtmlRenderTemplate } from "@typed/template/Html"
81
+ * import { Fx } from "@typed/fx"
82
+ * import { Layer } from "effect"
83
+ *
84
+ * const program = Effect.gen(function* () {
85
+ * const template = html`<div>
86
+ * <h1>Hello</h1>
87
+ * <p>World</p>
88
+ * </div>`
89
+ *
90
+ * // Render to single HTML string
91
+ * const htmlString = yield* renderToHtmlString(template).pipe(
92
+ * Fx.provide(HtmlRenderTemplate)
93
+ * )
94
+ *
95
+ * console.log(htmlString)
96
+ * // "<div><h1>Hello</h1><p>World</p></div>"
97
+ * })
98
+ * ```
99
+ *
100
+ * @param fx - The `Fx` stream of `RenderEvent`s to render.
101
+ * @returns An `Effect` that resolves to the full HTML string.
69
102
  * @since 1.0.0
103
+ * @category rendering
70
104
  */
71
105
  export function renderToHtmlString<E, R>(
72
- fx: Fx.Fx<RenderEvent | null, E, R>
106
+ fx: Fx.Fx<RenderEvent | null | undefined, E, R>,
73
107
  ): Effect.Effect<string, E, R> {
74
- return Effect.map(Fx.toReadonlyArray(renderToHtml(fx)), join(""))
108
+ return fx.pipe(
109
+ renderToHtml,
110
+ Fx.collectAll,
111
+ Effect.map((events) => events.join("")),
112
+ );
75
113
  }
76
114
 
77
115
  /**
116
+ * A boolean service that indicates whether the current rendering context is static.
117
+ *
118
+ * If `true`, the HTML renderer will optimize for static output, potentially skipping
119
+ * dynamic placeholder generation or other interactive features not needed for static HTML.
120
+ */
121
+ export const StaticRendering = ServiceMap.Reference<boolean>(
122
+ "@typed/template/Html/StaticRendering",
123
+ {
124
+ defaultValue: () => false,
125
+ },
126
+ );
127
+
128
+ type HtmlEntry = ReadonlyArray<HtmlChunk>;
129
+
130
+ /**
131
+ * A Layer that provides the `RenderTemplate` service implemented for HTML string generation.
132
+ *
133
+ * Using this layer enables templates to be rendered as HTML strings (e.g., for SSR)
134
+ * rather than DOM nodes. It sets the `RefSubject.CurrentComputedBehavior` to `"one"`, indicating
135
+ * a single-pass render approach typical for HTML generation.
136
+ *
137
+ * @example
138
+ * ```ts
139
+ * import { Effect } from "effect"
140
+ * import { html } from "@typed/template"
141
+ * import { renderToHtmlString, HtmlRenderTemplate } from "@typed/template/Html"
142
+ * import { Fx } from "@typed/fx"
143
+ * import { Layer } from "effect"
144
+ *
145
+ * const program = Effect.gen(function* () {
146
+ * const template = html`<div>Hello, ${"world"}!</div>`
147
+ *
148
+ * const htmlString = yield* renderToHtmlString(template).pipe(
149
+ * Fx.provide(HtmlRenderTemplate)
150
+ * )
151
+ *
152
+ * // Use for SSR
153
+ * return htmlString
154
+ * })
155
+ * ```
156
+ *
78
157
  * @since 1.0.0
158
+ * @category layers
79
159
  */
80
- export function renderHtmlTemplate(ctx: RenderContext.RenderContext) {
81
- return <Values extends ReadonlyArray<Renderable<any, any>>>(
82
- templateStrings: TemplateStringsArray,
83
- values: Values
84
- ): Fx.Fx<
85
- RenderEvent,
86
- Placeholder.Error<Values[number]>,
87
- | Scope.Scope
88
- | Placeholder.Context<Values[number]>
89
- > => {
90
- const isStatic = ctx.environment === "static" || ctx.environment === "test:static"
91
- const entry = getServerEntry(templateStrings, ctx.templateCache, isStatic)
160
+ export const HtmlRenderTemplate = Layer.effect(
161
+ RenderTemplate,
162
+ Effect.gen(function* () {
163
+ const isStatic = yield* StaticRendering;
164
+ const entries = new WeakMap<TemplateStringsArray, HtmlEntry>();
165
+ const getChunks = (templateStrings: TemplateStringsArray) => {
166
+ let entry = entries.get(templateStrings);
167
+ if (entry === undefined) {
168
+ const template = parse(templateStrings);
169
+ const chunks = templateToHtmlChunks(template);
170
+ entry = isStatic ? chunks : addTemplateHash(chunks, template);
171
+ entries.set(templateStrings, entry);
172
+ }
173
+ return entry;
174
+ };
175
+
176
+ return <const Values extends ArrayLike<Renderable.Any>>(
177
+ template: TemplateStringsArray,
178
+ values: Values,
179
+ ) =>
180
+ Fx.mergeOrdered(
181
+ ...getChunks(template).map((chunk, i, chunks) =>
182
+ renderChunk<Renderable.Error<Values[number]>, Renderable.Services<Values[number]>>(
183
+ chunk,
184
+ values,
185
+ isStatic,
186
+ i === chunks.length - 1,
187
+ ),
188
+ ),
189
+ );
190
+ }),
191
+ ).pipe(Layer.provideMerge(Layer.succeed(RefSubject.CurrentComputedBehavior, "one")));
92
192
 
93
- if (values.length === 0) {
94
- return Fx.succeed(
95
- HtmlRenderEvent((entry.chunks[0] as TextChunk).value, true)
96
- )
97
- } else {
98
- const lastIndex = entry.chunks.length - 1
99
- return Fx.mergeOrdered(
100
- entry.chunks.map((chunk, i) =>
101
- renderChunk<
102
- Placeholder.Error<Values[number]>,
103
- Placeholder.Context<Values[number]>
104
- >(chunk, values, isStatic, i === lastIndex)
105
- )
106
- ).pipe(
107
- Fx.filter((x) => x.html.length > 0),
108
- Fx.dropAfter((x) => x.done)
109
- )
110
- }
111
- }
112
- }
193
+ /**
194
+ * A variant of `HtmlRenderTemplate` that enables static rendering optimizations.
195
+ *
196
+ * This layer provides the `RenderTemplate` service for HTML generation but also
197
+ * sets `StaticRendering` to `true`, enabling optimizations for static content.
198
+ */
199
+ export const StaticHtmlRenderTemplate = HtmlRenderTemplate.pipe(
200
+ Layer.provideMerge(Layer.succeed(StaticRendering, true)),
201
+ );
113
202
 
114
203
  function renderChunk<E, R>(
115
204
  chunk: HtmlChunk,
116
- values: ReadonlyArray<Renderable<any, any>>,
205
+ values: ArrayLike<Renderable.Any>,
117
206
  isStatic: boolean,
118
- done: boolean
119
- ): Fx.Fx<HtmlRenderEvent, E, R | Scope.Scope> {
207
+ last: boolean,
208
+ ): Fx.Fx<HtmlRenderEvent, E, R | Scope> {
120
209
  if (chunk._tag === "text") {
121
- return Fx.succeed(HtmlRenderEvent(chunk.value, done))
122
- } else if (chunk._tag === "part") {
123
- return renderPart<E, R>(chunk, values, isStatic, done)
124
- } else {
125
- return renderSparsePart<E, R>(chunk, values, done) as Fx.Fx<
126
- HtmlRenderEvent,
127
- E,
128
- R
129
- >
210
+ return Fx.succeed(HtmlRenderEvent(chunk.text, last));
130
211
  }
131
- }
132
212
 
133
- function renderNode<E, R>(
134
- renderable: Renderable<any, any>,
135
- isStatic: boolean,
136
- done: boolean
137
- ): Fx.Fx<HtmlRenderEvent, E, R | Scope.Scope> {
138
- switch (typeof renderable) {
139
- case "string":
140
- case "number":
141
- case "boolean":
142
- case "bigint":
143
- return Fx.succeed(
144
- HtmlRenderEvent(
145
- (isStatic ? "" : TEXT_START) + renderable.toString(),
146
- done
147
- )
148
- )
149
- case "undefined":
150
- case "object":
151
- return renderObject(renderable, isStatic, done)
152
- default:
153
- return Fx.empty
213
+ if (chunk._tag === "part") {
214
+ return renderPart<E, R>(chunk, values, isStatic, last);
154
215
  }
155
- }
156
216
 
157
- function renderObject<E, R>(
158
- renderable: object | null | undefined,
159
- isStatic: boolean,
160
- done: boolean
161
- ): Fx.Fx<HtmlRenderEvent, E, R | Scope.Scope> {
162
- if (isNullOrUndefined(renderable)) {
163
- return isStatic ? Fx.empty : Fx.succeed(HtmlRenderEvent(TEXT_START, done))
164
- } else if (Array.isArray(renderable)) {
165
- const lastIndex = renderable.length - 1
166
- return Fx.mergeOrdered(
167
- renderable.map((r, i) => renderNode(r, isStatic, done && i === lastIndex))
168
- ) as any
169
- } else if (Effect.isEffect(renderable)) {
170
- return Fx.fromFxEffect(
171
- Effect.map(renderable as Effect.Effect<Renderable, E, R>, (r) => renderNode<E, R>(r, isStatic, done))
172
- )
173
- } else if (Fx.isFx<RenderEvent, E, R>(renderable)) {
174
- return takeOneIfNotRenderEvent(renderable, isStatic, done)
175
- } else if (isHtmlRenderEvent(renderable)) {
176
- if (done) {
177
- return Fx.succeed(renderable)
178
- } else {
179
- return Fx.succeed(HtmlRenderEvent(renderable.html, done))
180
- }
181
- } else {
182
- return Fx.empty
183
- }
217
+ return renderSparsePart(chunk, values, isStatic, last);
184
218
  }
185
219
 
186
220
  function renderPart<E, R>(
187
- chunk: PartChunk,
188
- values: ReadonlyArray<Renderable<any, any>>,
221
+ chunk: HtmlPartChunk,
222
+ values: ArrayLike<Renderable.Any>,
189
223
  isStatic: boolean,
190
- done: boolean
191
- ): Fx.Fx<HtmlRenderEvent, E, R | Scope.Scope> {
192
- const { node, render } = chunk
193
- const renderable: Renderable<any, any> = values[node.index]
224
+ last: boolean,
225
+ ): Fx.Fx<HtmlRenderEvent, E, R | Scope> {
226
+ const { node, render } = chunk;
227
+ const renderable = values[node.index];
194
228
 
195
- // Refs and events are not rendered into HTML
196
- if (isDirective<E, R>(renderable)) {
197
- return Fx.make<HtmlRenderEvent, E, R>(
198
- (sink: Sink.Sink<HtmlRenderEvent, E>) => {
199
- const part = partNodeToPart(node, (value) => sink.onSuccess(HtmlRenderEvent(render(value), done)))
200
-
201
- return Effect.catchAllCause(renderable(part), sink.onFailure)
202
- }
203
- )
204
- } else if (node._tag === "node") {
205
- if (isStatic) return renderNode<E, R>(renderable, isStatic, done)
206
- let first = true
207
- return Fx.continueWith(
208
- Fx.map(renderNode<E, R>(renderable, isStatic, true), (x) => {
209
- if (x.done) {
210
- const y = HtmlRenderEvent(
211
- (first ? TYPED_HOLE_START(node.index) : "") +
212
- x.html +
213
- TYPED_HOLE_END(node.index),
214
- done
215
- )
216
- first = false
217
- return y
218
- } else {
219
- if (first) {
220
- first = false
221
- return HtmlRenderEvent(
222
- TYPED_HOLE_START(node.index) + x.html,
223
- false
224
- )
225
- }
226
- return x
227
- }
228
- }),
229
- () =>
230
- first
231
- ? Fx.succeed(
232
- HtmlRenderEvent(
233
- TYPED_HOLE_START(node.index) + TYPED_HOLE_END(node.index),
234
- done
235
- )
236
- )
237
- : Fx.empty
238
- )
239
- } else if (node._tag === "properties") {
240
- if (renderable == null) return Fx.empty
229
+ // We don't render ref and event nodes via HTML
230
+ if (node._tag === "ref" || node._tag === "event") return Fx.empty;
241
231
 
242
- return Fx.mergeAll(
243
- Object.entries(renderable as Record<string, Renderable<any, any>>).map(
244
- ([key, renderable]) => {
245
- return Fx.filterMap(
246
- Fx.take(unwrapRenderable<E, R>(renderable), 1),
247
- (value) => {
248
- const s = render({ [key]: value })
232
+ // Node need to handle all possible value types including arrays
233
+ if (node._tag === "node") {
234
+ return renderNode(renderable, node.index, isStatic, last);
235
+ }
249
236
 
250
- return s ? Option.some(HtmlRenderEvent(s, done)) : Option.none()
251
- }
252
- )
253
- }
254
- )
255
- )
256
- } else {
257
- if (renderable === null) {
258
- return Fx.succeed(HtmlRenderEvent(render(renderable), done))
259
- }
237
+ // Properties is entirely recursive
238
+ if (node._tag === "properties") {
239
+ const setup = (props: unknown) =>
240
+ setupProperties<E, R>(props as Record<string, Renderable<any, E, R>>, isStatic, last, render);
241
+ if (isObject(renderable)) return setup(renderable);
242
+ return Fx.switchMap(liftRenderableToFx<E, R>(renderable, isStatic), (props) => {
243
+ if (isObject(props)) return setup(props);
244
+ return Fx.empty;
245
+ });
246
+ }
260
247
 
261
- const html = Fx.filterMap(
262
- Fx.take(unwrapRenderable<E, R>(renderable), 1),
263
- (value) => {
264
- const s = render(value)
248
+ // Otherwise we're going to coerce to a string
249
+ return Fx.filterMap(liftRenderableToFx<E, R>(renderable, isStatic), (value) => {
250
+ const s = render(value);
251
+ return s ? some(HtmlRenderEvent(s, last)) : none();
252
+ });
253
+ }
265
254
 
266
- return s ? Option.some(HtmlRenderEvent(s, done)) : Option.none()
267
- }
268
- )
255
+ function setupProperties<E, R>(
256
+ renderable: Record<string, Renderable<any, E, R>>,
257
+ isStatic: boolean,
258
+ last: boolean,
259
+ render: (u: Record<string, unknown>) => string,
260
+ ) {
261
+ const entries = Object.entries(renderable);
262
+ const length = entries.length;
263
+ const lastIndex = length - 1;
264
+
265
+ // Order here doesn't matter ??
266
+ return Fx.mergeAll(
267
+ ...entries.map(([key, renderable], i) => {
268
+ return Fx.filterMap(liftRenderableToFx<E, R>(renderable, isStatic), (value) => {
269
+ const s = render({ [key]: value });
270
+ return s ? some(HtmlRenderEvent(s, last && i === lastIndex)) : none();
271
+ });
272
+ }),
273
+ );
274
+ }
269
275
 
270
- return html
276
+ function renderNode<E, R>(
277
+ renderable: Renderable<any, E, R>,
278
+ index: number,
279
+ isStatic: boolean,
280
+ last: boolean,
281
+ ) {
282
+ let node = liftRenderableToFx<E, R>(renderable, isStatic).pipe(
283
+ Fx.map((x) => (isHtmlRenderEvent(x) ? x : HtmlRenderEvent(renderToString(x, ""), last))),
284
+ );
285
+ if (!isStatic) {
286
+ node = addNodePlaceholders<E, R>(node, index);
271
287
  }
288
+ return node.pipe(Fx.map((x) => HtmlRenderEvent(x.html, x.last && last)));
272
289
  }
273
290
 
274
- function renderSparsePart<E, R>(
275
- chunk: SparsePartChunk,
276
- values: ReadonlyArray<Renderable<any, any>>,
277
- done: boolean
278
- ): Fx.Fx<RenderEvent, E, R> {
279
- const { node, render } = chunk
280
-
281
- return Fx.map(
282
- Fx.take(
283
- Fx.tuple(
284
- node.nodes.map((node) => {
285
- if (node._tag === "text") return Fx.succeed(node.value)
286
-
287
- const renderable: Renderable<any, any> = (values as any)[node.index]
288
-
289
- if (isDirective<E, R>(renderable)) {
290
- return Fx.make<unknown, E, R>((sink: Sink.Sink<unknown, E>) =>
291
- Effect.catchAllCause(
292
- renderable(
293
- partNodeToPart(node, (value) => sink.onSuccess(value))
294
- ),
295
- sink.onFailure
296
- )
297
- )
298
- }
299
-
300
- return unwrapRenderable<E, R>(renderable)
301
- })
302
- ),
303
- 1
291
+ function addNodePlaceholders<E, R>(
292
+ fx: Fx.Fx<HtmlRenderEvent, E, R>,
293
+ index: number,
294
+ ): Fx.Fx<HtmlRenderEvent, E, R> {
295
+ return fx.pipe(
296
+ Fx.map((event) => (isHtmlRenderEvent(event) ? HtmlRenderEvent(event.html, false) : event)),
297
+ Fx.delimit(
298
+ HtmlRenderEvent(TYPED_NODE_START(index), false),
299
+ HtmlRenderEvent(TYPED_NODE_END(index), true),
304
300
  ),
305
- (value) => HtmlRenderEvent(render(value), done)
306
- )
301
+ );
307
302
  }
308
303
 
309
- function takeOneIfNotRenderEvent<A, E, R>(
310
- fx: Fx.Fx<A, E, R>,
304
+ function renderSparsePart<E, R>(
305
+ chunk: HtmlSparsePartChunk,
306
+ values: ArrayLike<Renderable.Any>,
311
307
  isStatic: boolean,
312
- done: boolean
308
+ last: boolean,
313
309
  ): Fx.Fx<HtmlRenderEvent, E, R> {
314
- return Fx.make<HtmlRenderEvent, E, R>((sink) =>
315
- Effect.uninterruptible(Sink.withEarlyExit(sink, (sink) =>
316
- fx.run(
317
- Sink.make(sink.onFailure, (event) => {
318
- if (isHtmlRenderEvent(event)) {
319
- if (done) {
320
- return sink.onSuccess(event)
321
- } else {
322
- return sink.onSuccess(HtmlRenderEvent(event.html, false))
323
- }
324
- }
325
-
326
- if (isNullOrUndefined(event)) {
327
- return sink.earlyExit
328
- }
329
-
330
- return Effect.zipRight(
331
- sink.onSuccess(
332
- HtmlRenderEvent(
333
- (isStatic ? "" : TEXT_START) + String(event),
334
- done
335
- )
336
- ),
337
- sink.earlyExit
338
- )
339
- })
340
- )))
341
- )
310
+ const { node, render } = chunk;
311
+ return Fx.tuple(
312
+ ...node.nodes.map((node) => {
313
+ if (node._tag === "text") return Fx.succeed(node.value);
314
+ return liftRenderableToFx<E, R>(values[node.index], isStatic);
315
+ }),
316
+ ).pipe(
317
+ Fx.take(1),
318
+ Fx.map((value) => HtmlRenderEvent(render(value), last)),
319
+ );
342
320
  }
343
321
 
344
- function getServerEntry(
345
- templateStrings: TemplateStringsArray,
346
- templateCache: RenderContext.RenderContext["templateCache"],
347
- isStatic: boolean
348
- ): ServerEntry {
349
- const cached = templateCache.get(templateStrings)
350
-
351
- if (cached === undefined || cached._tag === "Browser") {
352
- const template = parse(templateStrings)
353
- const entry: ServerEntry = {
354
- _tag: "Server",
355
- template,
356
- chunks: templateToHtmlChunks(template, isStatic)
357
- }
358
-
359
- templateCache.set(templateStrings, entry)
360
-
361
- return entry
362
- } else {
363
- return cached
364
- }
365
- }
366
-
367
- function unwrapRenderable<E, R>(
368
- renderable: Renderable<any, any>
322
+ function liftRenderableToFx<E, R>(
323
+ renderable: Renderable<unknown, E, R>,
324
+ isStatic: boolean,
369
325
  ): Fx.Fx<any, E, R> {
370
326
  switch (typeof renderable) {
371
327
  case "undefined":
328
+ case "function":
372
329
  case "object": {
373
- if (isNullOrUndefined(renderable)) {
374
- return Fx.null
330
+ if (isNullish(renderable)) {
331
+ return isStatic ? Fx.empty : Fx.succeed(HtmlRenderEvent(TEXT_START, true));
375
332
  } else if (Array.isArray(renderable)) {
376
- return Fx.mergeOrdered(
377
- renderable.map((r) => takeOneIfNotRenderEvent(unwrapRenderable(r), true, false))
378
- ) as any
379
- } else if (Effect.EffectTypeId in renderable) {
380
- return Fx.fromFxEffect(
381
- Effect.map(renderable as any, unwrapRenderable<any, any>)
382
- )
383
- } else if (FxTypeId in renderable) {
384
- return renderable as any
385
- } else return Fx.succeed(renderable as any)
333
+ return Fx.mergeOrdered(...renderable.map((r) => liftRenderableToFx<E, R>(r, isStatic)));
334
+ } else if (Fx.isFx(renderable)) {
335
+ return takeOneIfNotRenderEvent(renderable);
336
+ } else if (Effect.isEffect(renderable)) {
337
+ return Fx.unwrap(Effect.map(renderable, (r) => liftRenderableToFx<E, R>(r, isStatic)));
338
+ } else if (isHtmlRenderEvent(renderable)) {
339
+ return Fx.succeed(renderable);
340
+ } else
341
+ return Fx.take(
342
+ Fx.struct(mapRecord(renderable, (_) => liftRenderableToFx<E, R>(_, isStatic))),
343
+ 1,
344
+ );
386
345
  }
387
346
  default:
388
- return Fx.succeed(renderable)
347
+ return Fx.succeed(renderable);
389
348
  }
390
349
  }