@typed/template 0.13.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 -223
  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 -383
  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 -242
  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 -66
  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 -341
  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 -77
  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 -240
  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 -43
  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 -336
  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 -126
  420. package/src/ElementSource.ts +0 -432
  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 -71
  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
@@ -1,813 +0,0 @@
1
- import * as Context from "@typed/context"
2
- import * as Fx from "@typed/fx"
3
- import type { Rendered } from "@typed/wire"
4
- import { isText, persistent } from "@typed/wire"
5
- import { Option } from "effect"
6
- import * as Cause from "effect/Cause"
7
- import * as Chunk from "effect/Chunk"
8
- import * as Effect from "effect/Effect"
9
- import * as ExecutionStrategy from "effect/ExecutionStrategy"
10
- import { flow } from "effect/Function"
11
- import * as Scope from "effect/Scope"
12
- import { type Directive, isDirective } from "../../Directive.js"
13
- import * as ElementRef from "../../ElementRef.js"
14
- import * as ElementSource from "../../ElementSource.js"
15
- import * as EventHandler from "../../EventHandler.js"
16
- import type { Placeholder } from "../../Placeholder.js"
17
- import type { ToRendered } from "../../Render.js"
18
- import type { Renderable } from "../../Renderable.js"
19
- import type { RenderContext } from "../../RenderContext.js"
20
- import { DomRenderEvent, type RenderEvent } from "../../RenderEvent.js"
21
- import { DEFAULT_PRIORITY, RenderQueue } from "../../RenderQueue.js"
22
- import type { RenderTemplate } from "../../RenderTemplate.js"
23
- import type * as Template from "../../Template.js"
24
- import { CouldNotFindCommentError, isHydrationError } from "../errors.js"
25
- import type { EventSource } from "../EventSource.js"
26
- import { makeEventSource } from "../EventSource.js"
27
- import { HydrateContext } from "../HydrateContext.js"
28
- import type { IndexRefCounter } from "../indexRefCounter.js"
29
- import { makeRefCounter } from "../indexRefCounter.js"
30
- import type { ParentChildNodes } from "../utils.js"
31
- import { findHoleComment, findHydratePath, findPath, isCommentWithValue, keyToPartType } from "../utils.js"
32
- import { isNullOrUndefined } from "./helpers.js"
33
- import type { HydrationHole, HydrationNode, HydrationTemplate } from "./hydration-template.js"
34
- import {
35
- findHydrationHole,
36
- findHydrationMany,
37
- findHydrationTemplate,
38
- getChildNodes,
39
- getNodes,
40
- getPreviousNodes
41
- } from "./hydration-template.js"
42
- import { EventPartImpl, RefPartImpl, syncPartToPart } from "./parts.js"
43
- import { getBrowserEntry } from "./render-entry.js"
44
- import * as SyncPartsInternal from "./render-sync-parts.js"
45
- import type { SyncPart } from "./SyncPart.js"
46
-
47
- export type TemplateContext = {
48
- /**
49
- * @internal
50
- */
51
- expected: number
52
- /**
53
- * @internal
54
- */
55
- spreadIndex: number
56
-
57
- readonly context: Context.Context<Scope.Scope>
58
- readonly document: Document
59
- readonly eventSource: EventSource
60
- readonly parentScope: Scope.Scope
61
- readonly queue: RenderQueue
62
- readonly refCounter: IndexRefCounter
63
- readonly renderContext: RenderContext
64
- readonly scope: Scope.CloseableScope
65
- readonly values: ReadonlyArray<Renderable<any, any>>
66
- readonly onCause: (cause: Cause.Cause<any>) => Effect.Effect<unknown>
67
- readonly manyKey: string | undefined
68
-
69
- readonly hydrateContext: Option.Option<HydrateContext>
70
- }
71
-
72
- export const renderTemplate: (
73
- document: Document,
74
- renderContext: RenderContext
75
- ) => RenderTemplate = (document, renderContext) =>
76
- <Values extends ReadonlyArray<Renderable<any, any>>>(
77
- templateStrings: TemplateStringsArray,
78
- values: Values
79
- ) => {
80
- const entry = getBrowserEntry(document, renderContext, templateStrings)
81
-
82
- return Fx.make<
83
- RenderEvent,
84
- Placeholder.Error<Values[number]>,
85
- Scope.Scope | RenderQueue | Placeholder.Context<Values[number]>
86
- >(function render(
87
- sink
88
- ): Effect.Effect<unknown, never, Scope.Scope | RenderQueue | Placeholder.Context<Values[number]>> {
89
- return Effect.catchAllCause(
90
- Effect.gen(function*() {
91
- // Create a context for rendering our template
92
- const ctx = yield* makeTemplateContext<Values>(
93
- document,
94
- renderContext,
95
- values,
96
- sink.onFailure
97
- )
98
-
99
- const hydration = attemptHydration(ctx, entry.template.hash)
100
-
101
- let effects: Array<Effect.Effect<void, any, any>>
102
- let content: DocumentFragment
103
- let wire: Rendered | undefined
104
-
105
- if (Option.isSome(hydration)) {
106
- const { hydrateCtx, where } = hydration.value
107
- effects = setupHydrateParts(entry.template.parts, {
108
- ...ctx,
109
- where,
110
- manyKey: hydrateCtx.manyKey,
111
- makeHydrateContext: (where: HydrationNode): HydrateContext => ({
112
- where,
113
- hydrate: true
114
- })
115
- })
116
-
117
- wire = getWire(where)
118
- } else {
119
- content = ctx.document.importNode(entry.content, true)
120
- effects = setupRenderParts(entry.template.parts, content, ctx)
121
- }
122
-
123
- if (effects.length > 0) {
124
- yield* Effect.forEach(effects, flow(Effect.catchAllCause(ctx.onCause), Effect.forkIn(ctx.scope)))
125
- }
126
-
127
- // If there's anything to wait on and it's not already done, wait for an initial value
128
- // for all asynchronous sources.
129
- if (ctx.expected > 0 && (yield* ctx.refCounter.expect(ctx.expected))) {
130
- yield* ctx.refCounter.wait
131
- }
132
-
133
- // If we're not hydrating, we need to create our wire from our content
134
- if (wire === undefined) {
135
- wire = persistent(ctx.document, content!)
136
- }
137
-
138
- // Setup our event listeners for our wire.
139
- // We use the parentScope to allow event listeners to exist
140
- // beyond the lifetime of the current Fiber, but no further than its parent template.
141
- yield* ctx.eventSource.setup(wire, ctx.parentScope)
142
-
143
- // If we're hydrating, we need to mark this part of the stack as hydrated
144
- if (Option.isSome(hydration)) {
145
- hydration.value.hydrateCtx.hydrate = false
146
- }
147
-
148
- // Emit our DomRenderEvent
149
- yield* sink.onSuccess(DomRenderEvent(wire)).pipe(
150
- // Ensure our templates last forever in the DOM environment
151
- // so event listeners are kept attached to the current Scope.
152
- Effect.zipRight(Effect.never),
153
- // Close our scope whenever the current Fiber is interrupted
154
- Effect.onExit((exit) => Scope.close(ctx.scope, exit))
155
- )
156
- }),
157
- (cause) => {
158
- const hydrationFailure = Chunk.findFirst(Cause.defects(cause), isHydrationError)
159
- if (Option.isSome(hydrationFailure)) {
160
- return HydrateContext.pipe(
161
- Effect.tap((ctx) => ctx.hydrate = false),
162
- Effect.flatMap(() => render(sink))
163
- )
164
- }
165
-
166
- return sink.onFailure(cause)
167
- }
168
- )
169
- })
170
- }
171
-
172
- export function makeTemplateContext<Values extends ReadonlyArray<Renderable<any, any>>>(
173
- document: Document,
174
- renderContext: RenderContext,
175
- values: ReadonlyArray<Renderable<any, any>>,
176
- onCause: (cause: Cause.Cause<Placeholder.Error<Values[number]>>) => Effect.Effect<unknown>
177
- ): Effect.Effect<TemplateContext, never, Scope.Scope | RenderQueue | Placeholder.Context<Values[number]>> {
178
- return Effect.gen(function*() {
179
- const refCounter = yield* makeRefCounter
180
- const context = yield* Effect.context<Placeholder.Context<Values[number]> | Scope.Scope | RenderQueue>()
181
- const queue = Context.get(context, RenderQueue)
182
- const parentScope = Context.get(context, Scope.Scope)
183
- const eventSource = makeEventSource()
184
- const scope = yield* Scope.fork(parentScope, ExecutionStrategy.sequential)
185
- const hydrateContext = Context.getOption(context, HydrateContext)
186
- const templateContext: TemplateContext = {
187
- context: Context.add(context, Scope.Scope, scope),
188
- expected: 0,
189
- document,
190
- eventSource,
191
- hydrateContext,
192
- parentScope,
193
- manyKey: undefined,
194
- queue,
195
- refCounter,
196
- renderContext,
197
- scope,
198
- values,
199
- spreadIndex: values.length,
200
- onCause
201
- }
202
-
203
- return templateContext
204
- })
205
- }
206
-
207
- export function attemptHydration(
208
- ctx: TemplateContext,
209
- hash: string
210
- ): Option.Option<{ readonly where: HydrationTemplate; readonly hydrateCtx: HydrateContext }> {
211
- if (Option.isSome(ctx.hydrateContext) && ctx.hydrateContext.value.hydrate) {
212
- const hydrateCtx = ctx.hydrateContext.value
213
- const where = findHydrationTemplateByHash(hydrateCtx, hash)
214
- if (where === null) {
215
- hydrateCtx.hydrate = false
216
- return Option.none()
217
- } else {
218
- return Option.some({ where, hydrateCtx })
219
- }
220
- }
221
-
222
- return Option.none()
223
- }
224
-
225
- function setupRenderParts(
226
- parts: Template.Template["parts"],
227
- content: ParentChildNodes,
228
- ctx: TemplateContext
229
- ) {
230
- const effects: Array<Effect.Effect<void, any, any>> = []
231
-
232
- for (const [part, path] of parts) {
233
- const effect = setupRenderPart(part, content, path, ctx)
234
- if (effect) {
235
- effects.push(effect)
236
- }
237
- }
238
-
239
- return effects
240
- }
241
-
242
- function setupRenderPart(
243
- part: Template.PartNode | Template.SparsePartNode,
244
- content: ParentChildNodes,
245
- path: Chunk.Chunk<number>,
246
- ctx: TemplateContext
247
- ) {
248
- switch (part._tag) {
249
- case "attr":
250
- return setupAttrPart(part, findPath(content, path) as HTMLElement | SVGElement, ctx, ctx.values[part.index])
251
- case "boolean-part":
252
- return setupBooleanPart(
253
- part,
254
- findPath(content, path) as HTMLElement | SVGElement,
255
- ctx,
256
- ctx.values[part.index]
257
- )
258
- case "className-part":
259
- return setupClassNamePart(
260
- part,
261
- findPath(content, path) as HTMLElement | SVGElement,
262
- ctx,
263
- ctx.values[part.index]
264
- )
265
- case "comment-part":
266
- return setupCommentPart(part, findPath(content, path) as Comment, ctx, ctx.values[part.index])
267
- case "data":
268
- return setupDataPart(part, findPath(content, path) as HTMLElement | SVGElement, ctx, ctx.values[part.index])
269
- case "event":
270
- return setupEventPart(part, findPath(content, path) as HTMLElement | SVGElement, ctx, ctx.values[part.index])
271
- case "node": {
272
- const parent = findPath(content, path) as Element
273
- const comment = findHoleComment(parent, part.index)
274
- return setupNodePart(part, comment, ctx, null, [])
275
- }
276
- case "properties":
277
- return setupPropertiesPart(findPath(content, path) as HTMLElement | SVGElement, ctx, ctx.values[part.index])
278
- case "property":
279
- return setupPropertyPart(
280
- part,
281
- findPath(content, path) as HTMLElement | SVGElement,
282
- ctx,
283
- ctx.values[part.index]
284
- )
285
- case "ref":
286
- return setupRefPart(part, findPath(content, path) as HTMLElement | SVGElement, ctx)
287
- case "sparse-attr":
288
- return setupSparseAttrPart(part, findPath(content, path) as HTMLElement | SVGElement, ctx)
289
- case "sparse-class-name":
290
- return setupSparseClassNamePart(part, findPath(content, path) as HTMLElement | SVGElement, ctx)
291
- case "sparse-comment":
292
- return setupSparseCommentPart(part, findPath(content, path) as Comment, ctx)
293
- case "text-part": {
294
- const parent = findPath(content, path) as Element
295
- const comment = findHoleComment(parent, part.index)
296
- return setupTextPart(part, comment, ctx)
297
- }
298
- }
299
- }
300
-
301
- export function setupAttrPart(
302
- { index, name }: Pick<Template.AttrPartNode, "index" | "name">,
303
- element: HTMLElement | SVGElement,
304
- ctx: TemplateContext,
305
- renderable: Renderable<any, any>
306
- ) {
307
- const attr = element.getAttributeNode(name) ?? ctx.document.createAttribute(name)
308
- const part = SyncPartsInternal.makeAttributePart(index, element, attr)
309
- return matchSyncPart(renderable, ctx, part)
310
- }
311
-
312
- export function setupBooleanPart(
313
- { index, name }: Pick<Template.BooleanPartNode, "index" | "name">,
314
- element: HTMLElement | SVGElement,
315
- ctx: TemplateContext,
316
- renderable: Renderable<any, any>
317
- ) {
318
- const part = SyncPartsInternal.makeBooleanAttributePart(name, index, element)
319
- return matchSyncPart(renderable, ctx, part)
320
- }
321
-
322
- export function setupClassNamePart(
323
- { index }: Pick<Template.ClassNamePartNode, "index">,
324
- element: HTMLElement | SVGElement,
325
- ctx: TemplateContext,
326
- renderable: Renderable<any, any>
327
- ) {
328
- const part = SyncPartsInternal.makeClassNamePart(index, element)
329
- return matchSyncPart(renderable, ctx, part)
330
- }
331
-
332
- export function setupCommentPart(
333
- { index }: Pick<Template.CommentPartNode, "index">,
334
- comment: Comment,
335
- ctx: TemplateContext,
336
- renderable: Renderable<any, any>
337
- ) {
338
- const part = SyncPartsInternal.makeCommentPart(index, comment)
339
- return matchSyncPart(renderable, ctx, part)
340
- }
341
-
342
- export function setupDataPart(
343
- { index }: Pick<Template.DataPartNode, "index">,
344
- element: HTMLElement | SVGElement,
345
- ctx: TemplateContext,
346
- renderable: Renderable<any, any>
347
- ) {
348
- const part = SyncPartsInternal.makeDataPart(index, element)
349
- return matchSyncPart(renderable, ctx, part)
350
- }
351
-
352
- export function setupEventPart(
353
- { index, name }: Pick<Template.EventPartNode, "index" | "name">,
354
- element: HTMLElement | SVGElement,
355
- ctx: TemplateContext,
356
- renderable: Renderable<any, any>
357
- ) {
358
- if (isNullOrUndefined(renderable)) return null
359
-
360
- if (isDirective(renderable)) {
361
- return renderable(
362
- new EventPartImpl(
363
- name,
364
- index,
365
- ElementSource.fromElement(element),
366
- ctx.onCause,
367
- (handler) => ctx.eventSource.addEventListener(element, name, handler)
368
- )
369
- )
370
- } else {
371
- const handler = getEventHandler(renderable, ctx.context, ctx.onCause)
372
- if (handler === null) return null
373
- ctx.eventSource.addEventListener(element, name, handler)
374
- return null
375
- }
376
- }
377
-
378
- export function getEventHandler<E, R>(
379
- renderable: any,
380
- ctx: Context.Context<any> | Context.Context<never>,
381
- onCause: (cause: Cause.Cause<E>) => Effect.Effect<unknown>
382
- ): EventHandler.EventHandler<never, never> | null {
383
- if (renderable && typeof renderable === "object") {
384
- if (EventHandler.EventHandlerTypeId in renderable) {
385
- return EventHandler.make(
386
- (ev) =>
387
- Effect.provide(
388
- Effect.catchAllCause((renderable as EventHandler.EventHandler<Event, E, R>).handler(ev), onCause),
389
- ctx as any
390
- ),
391
- (renderable as EventHandler.EventHandler<Event, E, R>).options
392
- )
393
- } else if (Effect.EffectTypeId in renderable) {
394
- return EventHandler.make(() => Effect.provide(Effect.catchAllCause(renderable, onCause), ctx))
395
- }
396
- }
397
-
398
- return null
399
- }
400
-
401
- export function setupNodePart(
402
- { index }: Template.NodePart,
403
- comment: Comment,
404
- ctx: TemplateContext,
405
- text: Text | null,
406
- nodes: Array<Node>
407
- ) {
408
- const part = SyncPartsInternal.makeNodePart(index, comment, ctx.document, text, nodes)
409
- const renderable = ctx.values[index]
410
- return matchSyncPart(renderable, ctx, part)
411
- }
412
-
413
- export function setupPropertyPart(
414
- { index, name }: Pick<Template.PropertyPartNode, "index" | "name">,
415
- element: HTMLElement | SVGElement,
416
- ctx: TemplateContext,
417
- renderable: Renderable<any, any>
418
- ) {
419
- const part = SyncPartsInternal.makePropertyPart(name, index, element)
420
- return matchSyncPart(renderable, ctx, part)
421
- }
422
-
423
- export function setupRefPart(
424
- { index }: Pick<Template.RefPartNode, "index">,
425
- element: HTMLElement | SVGElement,
426
- renderable: Renderable<any, any>
427
- ) {
428
- if (isNullOrUndefined(renderable)) return null
429
- else if (isDirective(renderable)) {
430
- return renderable(
431
- new RefPartImpl(ElementSource.fromElement(element), index)
432
- )
433
- } else if (ElementRef.isElementRef(renderable)) {
434
- // TODO: We need to enable only setting these values once the Template has been rendered into the DOM
435
- return ElementRef.set(renderable, element)
436
- } else {
437
- return null
438
- }
439
- }
440
-
441
- export function setupPropertiesPart(
442
- element: HTMLElement | SVGElement,
443
- ctx: TemplateContext,
444
- renderable: Renderable<any, any>
445
- ) {
446
- if (renderable && typeof renderable === "object") {
447
- const effects: Array<Effect.Effect<void, any, any>> = []
448
- const addEffect = (effect: Effect.Effect<void, any, any> | null | undefined) => {
449
- if (isNullOrUndefined(effect)) return
450
- effects.push(effect)
451
- }
452
-
453
- for (const [key, value] of Object.entries(renderable as Record<string, any>)) {
454
- const [type, name] = keyToPartType(key)
455
- const index = ++ctx.spreadIndex
456
- switch (type) {
457
- case "attr":
458
- addEffect(setupAttrPart({ index, name }, element, ctx, value))
459
- break
460
- case "boolean":
461
- addEffect(setupBooleanPart({ index, name }, element, ctx, value))
462
- break
463
- case "class":
464
- addEffect(setupClassNamePart({ index }, element, ctx, value))
465
- break
466
- case "data":
467
- addEffect(setupDataPart({ index }, element, ctx, value))
468
- break
469
- case "event":
470
- addEffect(setupEventPart({ index, name }, element, ctx, value))
471
- break
472
- case "property":
473
- addEffect(setupPropertyPart({ index, name }, element, ctx, value))
474
- break
475
- }
476
- }
477
-
478
- return Effect.all(effects, { concurrency: "unbounded" })
479
- }
480
-
481
- return null
482
- }
483
-
484
- export function setupSparseAttrPart(
485
- { name, nodes }: Pick<Template.SparseAttrNode, "name" | "nodes">,
486
- element: HTMLElement | SVGElement,
487
- ctx: TemplateContext
488
- ) {
489
- ctx.expected++
490
- const attr = element.getAttributeNode(name) ?? ctx.document.createAttribute(name)
491
- const index = nodes.find((n): n is Template.AttrPartNode => n._tag === "attr")!.index
492
- return SyncPartsInternal.handleSparseAttribute(
493
- element,
494
- attr,
495
- nodes,
496
- ctx.values,
497
- (f) => Effect.zipRight(ctx.queue.add(attr, f, DEFAULT_PRIORITY), ctx.refCounter.release(index))
498
- )
499
- }
500
-
501
- export function setupSparseClassNamePart(
502
- { nodes }: Pick<Template.SparseClassNameNode, "nodes">,
503
- element: HTMLElement | SVGElement,
504
- ctx: TemplateContext
505
- ) {
506
- ctx.expected++
507
- const index = nodes.find((n): n is Template.ClassNamePartNode => n._tag === "className-part")!.index
508
- return SyncPartsInternal.handleSparseClassName(
509
- element,
510
- nodes,
511
- ctx.values,
512
- (f) => Effect.zipRight(ctx.queue.add(element.classList, f, DEFAULT_PRIORITY), ctx.refCounter.release(index))
513
- )
514
- }
515
-
516
- export function setupSparseCommentPart(
517
- { nodes }: Pick<Template.SparseCommentNode, "nodes">,
518
- comment: Comment,
519
- ctx: TemplateContext
520
- ) {
521
- ctx.expected++
522
- const index = nodes.find((n): n is Template.CommentPartNode => n._tag === "comment-part")!.index
523
- return SyncPartsInternal.handleSparseComment(
524
- comment,
525
- nodes,
526
- ctx.values,
527
- (f) => Effect.zipRight(ctx.queue.add(comment, f, DEFAULT_PRIORITY), ctx.refCounter.release(index))
528
- )
529
- }
530
-
531
- export function setupTextPart({ index }: Template.TextPartNode, comment: Comment, ctx: TemplateContext) {
532
- const text = comment.previousSibling
533
- ? SyncPartsInternal.getPreviousTextSibling(comment.previousSibling) ?? createText(ctx.document, comment)
534
- : createText(ctx.document, comment)
535
- const part = SyncPartsInternal.makeTextPart(index, text)
536
- const renderable = ctx.values[index]
537
- return matchSyncPart(renderable, ctx, part)
538
- }
539
-
540
- function createText(document: Document, comment: Comment) {
541
- const text = document.createTextNode("")
542
- comment.parentNode!.insertBefore(text, comment)
543
- return text
544
- }
545
-
546
- export function matchSyncPart(
547
- renderable: Renderable<any, any>,
548
- ctx: TemplateContext,
549
- syncPart: SyncPart
550
- ) {
551
- return matchRenderable(renderable, ctx, {
552
- Fx: (fx) =>
553
- fx.run(Fx.Sink.make(
554
- ctx.onCause,
555
- (value) => runSyncUpdate(syncPart, value, ctx)
556
- )),
557
- Effect: (effect) => Effect.flatMap(effect, (value) => runSyncUpdate(syncPart, value, ctx)),
558
- Directive: (directive) => directive(syncPartToPart(syncPart, ({ value }) => runSyncUpdate(syncPart, value, ctx))),
559
- Otherwise: (value) => {
560
- syncPart.update(value as never)
561
- return null
562
- }
563
- })
564
- }
565
-
566
- function unwrapRenderable<E, R>(renderable: unknown): Fx.Fx<any, E, R> {
567
- switch (typeof renderable) {
568
- case "undefined":
569
- case "object": {
570
- if (renderable === null || renderable === undefined) return Fx.succeed(null)
571
- else if (Array.isArray(renderable)) {
572
- return renderable.length === 0
573
- ? Fx.succeed(null)
574
- : Fx.map(Fx.tuple(renderable.map(unwrapRenderable)), (xs) => xs.flat()) as any
575
- } else if (Fx.FxTypeId in renderable) {
576
- return renderable as any
577
- } else if (Effect.EffectTypeId in renderable) {
578
- return Fx.fromFxEffect(Effect.map(renderable as any, unwrapRenderable<E, R>))
579
- } else return Fx.succeed(renderable as any)
580
- }
581
- default:
582
- return Fx.succeed(renderable)
583
- }
584
- }
585
-
586
- export function runSyncUpdate(
587
- syncPart: SyncPart,
588
- value: any,
589
- ctx: TemplateContext
590
- ) {
591
- return Effect.zipRight(
592
- ctx.queue.add(syncPart, () => syncPart.update(value as never), DEFAULT_PRIORITY),
593
- ctx.refCounter.release(syncPart.index)
594
- )
595
- }
596
-
597
- export function matchRenderable(
598
- renderable: Renderable<any, any>,
599
- ctx: TemplateContext,
600
- matches: {
601
- Fx: (fx: Fx.Fx<any, any, any>) => Effect.Effect<void, any, any>
602
- Effect: (effect: Effect.Effect<any, any, any>) => Effect.Effect<void, any, any>
603
- Directive: (directive: Directive<any, any>) => Effect.Effect<void, any, any>
604
- Otherwise: (_: any) => Effect.Effect<void, any, any> | null
605
- }
606
- ): Effect.Effect<void, any, any> | null {
607
- if (Fx.isFx(renderable)) {
608
- ctx.expected++
609
- return matches.Fx(renderable)
610
- } else if (Effect.isEffect(renderable)) {
611
- ctx.expected++
612
- return matches.Effect(renderable)
613
- } else if (isDirective<any, any>(renderable)) {
614
- ctx.expected++
615
- return matches.Directive(renderable)
616
- } else if (Array.isArray(renderable)) {
617
- return matches.Fx(unwrapRenderable(renderable))
618
- } else {
619
- return matches.Otherwise(renderable)
620
- }
621
- }
622
-
623
- export function attachRoot<T extends RenderEvent | null>(
624
- cache: RenderContext["renderCache"],
625
- where: HTMLElement,
626
- what: RenderEvent | null // TODO: Should we support HTML RenderEvents here too?,
627
- ): Effect.Effect<ToRendered<T>> {
628
- return Effect.sync(() => {
629
- const wire = what?.valueOf() as ToRendered<T>
630
- const previous = cache.get(where)
631
-
632
- if (wire !== previous) {
633
- if (previous && !wire) removeChildren(where, previous)
634
-
635
- cache.set(where, wire || null)
636
-
637
- if (wire) replaceChildren(where, wire)
638
-
639
- return wire as ToRendered<T>
640
- }
641
-
642
- return previous as ToRendered<T>
643
- })
644
- }
645
-
646
- export function removeChildren(where: HTMLElement, previous: Rendered) {
647
- for (const node of getNodesFromRendered(previous)) {
648
- where.removeChild(node)
649
- }
650
- }
651
-
652
- export function replaceChildren(where: HTMLElement, wire: Rendered) {
653
- where.replaceChildren(...getNodesFromRendered(wire))
654
- }
655
-
656
- export function getNodesFromRendered(rendered: Rendered): Array<globalThis.Node> {
657
- const value = rendered.valueOf() as globalThis.Node | Array<globalThis.Node>
658
- return Array.isArray(value) ? value : [value]
659
- }
660
-
661
- export type HydrateTemplateContext = TemplateContext & {
662
- readonly where: HydrationNode
663
- readonly makeHydrateContext: (where: HydrationNode, index: number) => HydrateContext
664
- }
665
-
666
- export function findHydrationTemplateByHash(hydrateCtx: HydrateContext, hash: string): HydrationTemplate | null {
667
- // If there is not a manyKey, we can just find the template by its hash
668
- if (hydrateCtx.manyKey === undefined) {
669
- return findHydrationTemplate(getChildNodes(hydrateCtx.where), hash)
670
- }
671
-
672
- // If there is a manyKey, we need to find the many node first
673
- const many = findHydrationMany(getChildNodes(hydrateCtx.where), hydrateCtx.manyKey)
674
-
675
- if (many === null) return null
676
-
677
- // Then we can find the template by its hash
678
- return findHydrationTemplate(getChildNodes(many), hash)
679
- }
680
-
681
- export function setupHydrateParts(parts: Template.Template["parts"], ctx: HydrateTemplateContext) {
682
- const effects: Array<Effect.Effect<void, any, any>> = []
683
-
684
- for (const [part, path] of parts) {
685
- const effect = setupHydratePart(part, path, ctx)
686
- if (effect) {
687
- effects.push(effect)
688
- }
689
- }
690
-
691
- return effects
692
- }
693
-
694
- export function setupHydratePart(
695
- part: Template.PartNode | Template.SparsePartNode,
696
- path: Chunk.Chunk<number>,
697
- ctx: HydrateTemplateContext
698
- ) {
699
- switch (part._tag) {
700
- case "attr":
701
- return setupAttrPart(part, findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
702
- case "boolean-part":
703
- return setupBooleanPart(part, findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
704
- case "className-part":
705
- return setupClassNamePart(part, findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
706
- case "comment-part":
707
- return setupCommentPart(part, findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
708
- case "data":
709
- return setupDataPart(part, findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
710
- case "event":
711
- return setupEventPart(part, findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
712
- case "node": {
713
- const hole = findHydrationHole(getChildNodes(ctx.where), part.index)
714
- if (hole === null) {
715
- throw new CouldNotFindCommentError(part.index)
716
- }
717
- return setupHydratedNodePart(part, hole, ctx)
718
- }
719
- case "properties":
720
- return setupPropertiesPart(findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
721
- case "property":
722
- return setupPropertyPart(part, findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
723
- case "ref":
724
- return setupRefPart(part, findHydratePath(ctx.where, path) as any, ctx.values[part.index])
725
- case "sparse-attr":
726
- return setupSparseAttrPart(part, findHydratePath(ctx.where, path) as any, ctx)
727
- case "sparse-class-name":
728
- return setupSparseClassNamePart(part, findHydratePath(ctx.where, path) as any, ctx)
729
- case "sparse-comment":
730
- return setupSparseCommentPart(part, findHydratePath(ctx.where, path) as any, ctx)
731
- case "text-part": {
732
- const hole = findHydrationHole(getChildNodes(ctx.where), part.index)
733
- if (hole === null) throw new CouldNotFindCommentError(part.index)
734
- return setupTextPart(part, hole.endComment, ctx)
735
- }
736
- }
737
- }
738
-
739
- export function setupHydratedNodePart(
740
- part: Template.NodePart,
741
- hole: HydrationHole,
742
- ctx: HydrateTemplateContext
743
- ) {
744
- const nestedCtx = ctx.makeHydrateContext(hole, part.index)
745
- const previousNodes = getPreviousNodes(hole)
746
- const text = previousNodes.length === 2 && isCommentWithValue(previousNodes[0], "text") && isText(previousNodes[1])
747
- ? previousNodes[1]
748
- : null
749
- const effect = setupNodePart(part, hole.endComment, ctx, text, text === null ? previousNodes : [text])
750
- if (effect === null) return null
751
- return Effect.provideService(effect, HydrateContext, nestedCtx)
752
- }
753
-
754
- export function findRootParentChildNodes(where: HTMLElement): ParentChildNodes {
755
- const childNodes = findRootChildNodes(where)
756
-
757
- return {
758
- parentNode: where,
759
- childNodes
760
- }
761
- }
762
-
763
- const START = "typed-start"
764
- const END = "typed-end"
765
-
766
- // Finds all of the childNodes between the "typed-start" and "typed-end" comments
767
- export function findRootChildNodes(where: HTMLElement): Array<Node> {
768
- let start = -1
769
- let end = -1
770
-
771
- const { childNodes } = where
772
- const length = childNodes.length
773
-
774
- for (let i = 0; i < length; i++) {
775
- const node = childNodes[i]
776
-
777
- if (node.nodeType === node.COMMENT_NODE && node.nodeValue === START) {
778
- start = i
779
- break
780
- }
781
- }
782
-
783
- for (let i = length - 1; i >= Math.max(start, 0); i--) {
784
- const node = childNodes[i]
785
-
786
- if (node.nodeType === node.COMMENT_NODE && node.nodeValue === END) {
787
- end = i
788
- break
789
- }
790
- }
791
-
792
- // If we can't find the start and end comments, just return all childNodes
793
- if (start === -1 && end === -1) {
794
- return Array.from(childNodes)
795
- }
796
-
797
- start = start === -1 ? 0 : start
798
- end = end === -1 ? length - 1 : end
799
-
800
- const rootChildNodes: Array<Node> = Array(end - start)
801
-
802
- for (let i = start + 1, j = 0; i <= end; i++) {
803
- rootChildNodes[j++] = childNodes[i]
804
- }
805
-
806
- return rootChildNodes
807
- }
808
-
809
- export function getWire(where: HydrationNode) {
810
- const nodes = getNodes(where)
811
- if (nodes.length === 1) return nodes[0]
812
- return nodes
813
- }