@typed/template 0.9.6 → 0.10.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 (300) hide show
  1. package/RenderQueue/package.json +6 -0
  2. package/dist/cjs/Directive.js +1 -1
  3. package/dist/cjs/Directive.js.map +1 -1
  4. package/dist/cjs/ElementRef.js +1 -1
  5. package/dist/cjs/ElementRef.js.map +1 -1
  6. package/dist/cjs/ElementSource.js +1 -1
  7. package/dist/cjs/ElementSource.js.map +1 -1
  8. package/dist/cjs/EventHandler.js +11 -4
  9. package/dist/cjs/EventHandler.js.map +1 -1
  10. package/dist/cjs/Html.js +84 -44
  11. package/dist/cjs/Html.js.map +1 -1
  12. package/dist/cjs/HtmlChunk.js +67 -21
  13. package/dist/cjs/HtmlChunk.js.map +1 -1
  14. package/dist/cjs/Hydrate.js +6 -6
  15. package/dist/cjs/Hydrate.js.map +1 -1
  16. package/dist/cjs/Many.js +4 -4
  17. package/dist/cjs/Many.js.map +1 -1
  18. package/dist/cjs/Meta.js +10 -3
  19. package/dist/cjs/Meta.js.map +1 -1
  20. package/dist/cjs/Parser.js +1 -1
  21. package/dist/cjs/Placeholder.js +5 -9
  22. package/dist/cjs/Placeholder.js.map +1 -1
  23. package/dist/cjs/Platform.js +7 -5
  24. package/dist/cjs/Platform.js.map +1 -1
  25. package/dist/cjs/Render.js +8 -7
  26. package/dist/cjs/Render.js.map +1 -1
  27. package/dist/cjs/RenderContext.js +8 -92
  28. package/dist/cjs/RenderContext.js.map +1 -1
  29. package/dist/cjs/RenderEvent.js +9 -1
  30. package/dist/cjs/RenderEvent.js.map +1 -1
  31. package/dist/cjs/RenderQueue.js +341 -0
  32. package/dist/cjs/RenderQueue.js.map +1 -0
  33. package/dist/cjs/RenderTemplate.js +1 -1
  34. package/dist/cjs/RenderTemplate.js.map +1 -1
  35. package/dist/cjs/Template.js +12 -0
  36. package/dist/cjs/Template.js.map +1 -1
  37. package/dist/cjs/Test.js +64 -33
  38. package/dist/cjs/Test.js.map +1 -1
  39. package/dist/cjs/Vitest.js +12 -20
  40. package/dist/cjs/Vitest.js.map +1 -1
  41. package/dist/cjs/index.js +6 -3
  42. package/dist/cjs/index.js.map +1 -1
  43. package/dist/cjs/internal/EventSource.js +16 -9
  44. package/dist/cjs/internal/EventSource.js.map +1 -1
  45. package/dist/cjs/internal/HydrateContext.js.map +1 -1
  46. package/dist/cjs/internal/browser.js +11 -10
  47. package/dist/cjs/internal/browser.js.map +1 -1
  48. package/dist/cjs/internal/character-entities.js +2141 -0
  49. package/dist/cjs/internal/character-entities.js.map +1 -0
  50. package/dist/cjs/internal/errors.js +19 -2
  51. package/dist/cjs/internal/errors.js.map +1 -1
  52. package/dist/cjs/internal/indexRefCounter.js +36 -63
  53. package/dist/cjs/internal/indexRefCounter.js.map +1 -1
  54. package/dist/cjs/internal/parser.js +18 -17
  55. package/dist/cjs/internal/parser.js.map +1 -1
  56. package/dist/cjs/internal/parser2.js +382 -0
  57. package/dist/cjs/internal/parser2.js.map +1 -0
  58. package/dist/cjs/internal/server-parts.js +124 -0
  59. package/dist/cjs/internal/server-parts.js.map +1 -0
  60. package/dist/cjs/internal/server.js +15 -185
  61. package/dist/cjs/internal/server.js.map +1 -1
  62. package/dist/cjs/internal/utils.js +73 -9
  63. package/dist/cjs/internal/utils.js.map +1 -1
  64. package/dist/cjs/internal/v2/SyncPart.js +6 -0
  65. package/dist/cjs/internal/v2/SyncPart.js.map +1 -0
  66. package/dist/cjs/internal/v2/helpers.js +15 -0
  67. package/dist/cjs/internal/v2/helpers.js.map +1 -0
  68. package/dist/cjs/internal/v2/hydrate.js +202 -0
  69. package/dist/cjs/internal/v2/hydrate.js.map +1 -0
  70. package/dist/cjs/internal/v2/hydration-template.js +269 -0
  71. package/dist/cjs/internal/v2/hydration-template.js.map +1 -0
  72. package/dist/cjs/internal/v2/parts.js +169 -0
  73. package/dist/cjs/internal/v2/parts.js.map +1 -0
  74. package/dist/cjs/internal/v2/render-entry.js +110 -0
  75. package/dist/cjs/internal/v2/render-entry.js.map +1 -0
  76. package/dist/cjs/internal/v2/render-sync-parts.js +318 -0
  77. package/dist/cjs/internal/v2/render-sync-parts.js.map +1 -0
  78. package/dist/cjs/internal/v2/render.js +417 -0
  79. package/dist/cjs/internal/v2/render.js.map +1 -0
  80. package/dist/cjs/internal/v2/sync-parts.js +115 -0
  81. package/dist/cjs/internal/v2/sync-parts.js.map +1 -0
  82. package/dist/dts/ElementRef.d.ts +1 -1
  83. package/dist/dts/ElementRef.d.ts.map +1 -1
  84. package/dist/dts/ElementSource.d.ts +1 -1
  85. package/dist/dts/ElementSource.d.ts.map +1 -1
  86. package/dist/dts/EventHandler.d.ts +12 -8
  87. package/dist/dts/EventHandler.d.ts.map +1 -1
  88. package/dist/dts/Html.d.ts +6 -5
  89. package/dist/dts/Html.d.ts.map +1 -1
  90. package/dist/dts/HtmlChunk.d.ts.map +1 -1
  91. package/dist/dts/Hydrate.d.ts +1 -3
  92. package/dist/dts/Hydrate.d.ts.map +1 -1
  93. package/dist/dts/Many.d.ts +9 -11
  94. package/dist/dts/Many.d.ts.map +1 -1
  95. package/dist/dts/Meta.d.ts +5 -1
  96. package/dist/dts/Meta.d.ts.map +1 -1
  97. package/dist/dts/Parser.d.ts +1 -1
  98. package/dist/dts/Parser.d.ts.map +1 -1
  99. package/dist/dts/Part.d.ts +20 -56
  100. package/dist/dts/Part.d.ts.map +1 -1
  101. package/dist/dts/Placeholder.d.ts +6 -10
  102. package/dist/dts/Placeholder.d.ts.map +1 -1
  103. package/dist/dts/Platform.d.ts +2 -4
  104. package/dist/dts/Platform.d.ts.map +1 -1
  105. package/dist/dts/Render.d.ts +4 -8
  106. package/dist/dts/Render.d.ts.map +1 -1
  107. package/dist/dts/RenderContext.d.ts +3 -22
  108. package/dist/dts/RenderContext.d.ts.map +1 -1
  109. package/dist/dts/RenderEvent.d.ts +6 -1
  110. package/dist/dts/RenderEvent.d.ts.map +1 -1
  111. package/dist/dts/RenderQueue.d.ts +103 -0
  112. package/dist/dts/RenderQueue.d.ts.map +1 -0
  113. package/dist/dts/RenderTemplate.d.ts +3 -2
  114. package/dist/dts/RenderTemplate.d.ts.map +1 -1
  115. package/dist/dts/Renderable.d.ts +1 -1
  116. package/dist/dts/Template.d.ts +14 -1
  117. package/dist/dts/Template.d.ts.map +1 -1
  118. package/dist/dts/Test.d.ts +14 -1
  119. package/dist/dts/Test.d.ts.map +1 -1
  120. package/dist/dts/Vitest.d.ts +11 -8
  121. package/dist/dts/Vitest.d.ts.map +1 -1
  122. package/dist/dts/index.d.ts +4 -0
  123. package/dist/dts/index.d.ts.map +1 -1
  124. package/dist/dts/internal/EventSource.d.ts +2 -1
  125. package/dist/dts/internal/EventSource.d.ts.map +1 -1
  126. package/dist/dts/internal/browser.d.ts +3 -3
  127. package/dist/dts/internal/browser.d.ts.map +1 -1
  128. package/dist/dts/internal/character-entities.d.ts +2133 -0
  129. package/dist/dts/internal/character-entities.d.ts.map +1 -0
  130. package/dist/dts/internal/errors.d.ts +9 -1
  131. package/dist/dts/internal/errors.d.ts.map +1 -1
  132. package/dist/dts/internal/indexRefCounter.d.ts +0 -4
  133. package/dist/dts/internal/indexRefCounter.d.ts.map +1 -1
  134. package/dist/dts/internal/parser.d.ts +13 -0
  135. package/dist/dts/internal/parser.d.ts.map +1 -1
  136. package/dist/dts/internal/parser2.d.ts +12 -0
  137. package/dist/dts/internal/parser2.d.ts.map +1 -0
  138. package/dist/dts/internal/server-parts.d.ts +223 -0
  139. package/dist/dts/internal/server-parts.d.ts.map +1 -0
  140. package/dist/dts/internal/server.d.ts +2 -28
  141. package/dist/dts/internal/server.d.ts.map +1 -1
  142. package/dist/dts/internal/utils.d.ts +4 -1
  143. package/dist/dts/internal/utils.d.ts.map +1 -1
  144. package/dist/dts/internal/v2/SyncPart.d.ts +87 -0
  145. package/dist/dts/internal/v2/SyncPart.d.ts.map +1 -0
  146. package/dist/dts/internal/v2/helpers.d.ts +3 -0
  147. package/dist/dts/internal/v2/helpers.d.ts.map +1 -0
  148. package/dist/dts/internal/v2/hydrate.d.ts +7 -0
  149. package/dist/dts/internal/v2/hydrate.d.ts.map +1 -0
  150. package/dist/dts/internal/v2/hydration-template.d.ts +54 -0
  151. package/dist/dts/internal/v2/hydration-template.d.ts.map +1 -0
  152. package/dist/dts/internal/v2/parts.d.ts +245 -0
  153. package/dist/dts/internal/v2/parts.d.ts.map +1 -0
  154. package/dist/dts/internal/v2/render-entry.d.ts +6 -0
  155. package/dist/dts/internal/v2/render-entry.d.ts.map +1 -0
  156. package/dist/dts/internal/v2/render-sync-parts.d.ts +22 -0
  157. package/dist/dts/internal/v2/render-sync-parts.d.ts.map +1 -0
  158. package/dist/dts/internal/v2/render.d.ts +62 -0
  159. package/dist/dts/internal/v2/render.d.ts.map +1 -0
  160. package/dist/dts/internal/v2/sync-parts.d.ts +129 -0
  161. package/dist/dts/internal/v2/sync-parts.d.ts.map +1 -0
  162. package/dist/esm/ElementRef.js.map +1 -1
  163. package/dist/esm/EventHandler.js +14 -4
  164. package/dist/esm/EventHandler.js.map +1 -1
  165. package/dist/esm/Html.js +91 -50
  166. package/dist/esm/Html.js.map +1 -1
  167. package/dist/esm/HtmlChunk.js +75 -24
  168. package/dist/esm/HtmlChunk.js.map +1 -1
  169. package/dist/esm/Hydrate.js +5 -5
  170. package/dist/esm/Hydrate.js.map +1 -1
  171. package/dist/esm/Many.js +3 -3
  172. package/dist/esm/Many.js.map +1 -1
  173. package/dist/esm/Meta.js +7 -1
  174. package/dist/esm/Meta.js.map +1 -1
  175. package/dist/esm/Parser.js +1 -1
  176. package/dist/esm/Parser.js.map +1 -1
  177. package/dist/esm/Placeholder.js +4 -8
  178. package/dist/esm/Placeholder.js.map +1 -1
  179. package/dist/esm/Platform.js +3 -1
  180. package/dist/esm/Platform.js.map +1 -1
  181. package/dist/esm/Render.js +6 -5
  182. package/dist/esm/Render.js.map +1 -1
  183. package/dist/esm/RenderContext.js +5 -85
  184. package/dist/esm/RenderContext.js.map +1 -1
  185. package/dist/esm/RenderEvent.js +8 -1
  186. package/dist/esm/RenderEvent.js.map +1 -1
  187. package/dist/esm/RenderQueue.js +336 -0
  188. package/dist/esm/RenderQueue.js.map +1 -0
  189. package/dist/esm/RenderTemplate.js.map +1 -1
  190. package/dist/esm/Template.js +12 -0
  191. package/dist/esm/Template.js.map +1 -1
  192. package/dist/esm/Test.js +71 -30
  193. package/dist/esm/Test.js.map +1 -1
  194. package/dist/esm/Vitest.js +11 -8
  195. package/dist/esm/Vitest.js.map +1 -1
  196. package/dist/esm/index.js +4 -0
  197. package/dist/esm/index.js.map +1 -1
  198. package/dist/esm/internal/EventSource.js +12 -7
  199. package/dist/esm/internal/EventSource.js.map +1 -1
  200. package/dist/esm/internal/HydrateContext.js.map +1 -1
  201. package/dist/esm/internal/browser.js +10 -9
  202. package/dist/esm/internal/browser.js.map +1 -1
  203. package/dist/esm/internal/character-entities.js +2134 -0
  204. package/dist/esm/internal/character-entities.js.map +1 -0
  205. package/dist/esm/internal/errors.js +22 -2
  206. package/dist/esm/internal/errors.js.map +1 -1
  207. package/dist/esm/internal/indexRefCounter.js +36 -61
  208. package/dist/esm/internal/indexRefCounter.js.map +1 -1
  209. package/dist/esm/internal/parser.js +18 -18
  210. package/dist/esm/internal/parser.js.map +1 -1
  211. package/dist/esm/internal/parser2.js +393 -0
  212. package/dist/esm/internal/parser2.js.map +1 -0
  213. package/dist/esm/internal/server-parts.js +109 -0
  214. package/dist/esm/internal/server-parts.js.map +1 -0
  215. package/dist/esm/internal/server.js +12 -161
  216. package/dist/esm/internal/server.js.map +1 -1
  217. package/dist/esm/internal/utils.js +71 -7
  218. package/dist/esm/internal/utils.js.map +1 -1
  219. package/dist/esm/internal/v2/SyncPart.js +5 -0
  220. package/dist/esm/internal/v2/SyncPart.js.map +1 -0
  221. package/dist/esm/internal/v2/helpers.js +12 -0
  222. package/dist/esm/internal/v2/helpers.js.map +1 -0
  223. package/dist/esm/internal/v2/hydrate.js +195 -0
  224. package/dist/esm/internal/v2/hydrate.js.map +1 -0
  225. package/dist/esm/internal/v2/hydration-template.js +265 -0
  226. package/dist/esm/internal/v2/hydration-template.js.map +1 -0
  227. package/dist/esm/internal/v2/parts.js +150 -0
  228. package/dist/esm/internal/v2/parts.js.map +1 -0
  229. package/dist/esm/internal/v2/render-entry.js +102 -0
  230. package/dist/esm/internal/v2/render-entry.js.map +1 -0
  231. package/dist/esm/internal/v2/render-sync-parts.js +265 -0
  232. package/dist/esm/internal/v2/render-sync-parts.js.map +1 -0
  233. package/dist/esm/internal/v2/render.js +353 -0
  234. package/dist/esm/internal/v2/render.js.map +1 -0
  235. package/dist/esm/internal/v2/sync-parts.js +102 -0
  236. package/dist/esm/internal/v2/sync-parts.js.map +1 -0
  237. package/package.json +20 -13
  238. package/src/ElementRef.ts +1 -1
  239. package/src/ElementSource.ts +1 -1
  240. package/src/EventHandler.ts +29 -11
  241. package/src/Html.ts +199 -90
  242. package/src/HtmlChunk.ts +77 -30
  243. package/src/Hydrate.ts +20 -14
  244. package/src/Many.ts +17 -14
  245. package/src/Meta.ts +8 -1
  246. package/src/Parser.ts +1 -1
  247. package/src/Part.ts +22 -66
  248. package/src/Placeholder.ts +17 -15
  249. package/src/Platform.ts +5 -5
  250. package/src/Render.ts +23 -26
  251. package/src/RenderContext.ts +14 -142
  252. package/src/RenderEvent.ts +10 -1
  253. package/src/RenderQueue.ts +445 -0
  254. package/src/RenderTemplate.ts +7 -2
  255. package/src/Renderable.ts +1 -1
  256. package/src/Template.ts +15 -1
  257. package/src/Test.ts +122 -38
  258. package/src/Vitest.ts +20 -10
  259. package/src/index.ts +4 -0
  260. package/src/internal/EventSource.ts +14 -8
  261. package/src/internal/HydrateContext.ts +3 -4
  262. package/src/internal/browser.ts +26 -21
  263. package/src/internal/character-entities.ts +2136 -0
  264. package/src/internal/errors.ts +30 -3
  265. package/src/internal/indexRefCounter.ts +38 -70
  266. package/src/internal/parser.ts +19 -19
  267. package/src/internal/parser2.ts +468 -0
  268. package/src/internal/server-parts.ts +161 -0
  269. package/src/internal/server.ts +16 -272
  270. package/src/internal/utils.ts +83 -7
  271. package/src/internal/v2/SyncPart.ts +112 -0
  272. package/src/internal/v2/helpers.ts +13 -0
  273. package/src/internal/v2/hydrate.ts +289 -0
  274. package/src/internal/v2/hydration-template.ts +308 -0
  275. package/src/internal/v2/parts.ts +254 -0
  276. package/src/internal/v2/render-entry.ts +131 -0
  277. package/src/internal/v2/render-sync-parts.ts +440 -0
  278. package/src/internal/v2/render.ts +588 -0
  279. package/src/internal/v2/sync-parts.ts +133 -0
  280. package/dist/cjs/internal/hydrate.js +0 -274
  281. package/dist/cjs/internal/hydrate.js.map +0 -1
  282. package/dist/cjs/internal/parts.js +0 -451
  283. package/dist/cjs/internal/parts.js.map +0 -1
  284. package/dist/cjs/internal/render.js +0 -704
  285. package/dist/cjs/internal/render.js.map +0 -1
  286. package/dist/dts/internal/hydrate.d.ts +0 -33
  287. package/dist/dts/internal/hydrate.d.ts.map +0 -1
  288. package/dist/dts/internal/parts.d.ts +0 -314
  289. package/dist/dts/internal/parts.d.ts.map +0 -1
  290. package/dist/dts/internal/render.d.ts +0 -16
  291. package/dist/dts/internal/render.d.ts.map +0 -1
  292. package/dist/esm/internal/hydrate.js +0 -239
  293. package/dist/esm/internal/hydrate.js.map +0 -1
  294. package/dist/esm/internal/parts.js +0 -373
  295. package/dist/esm/internal/parts.js.map +0 -1
  296. package/dist/esm/internal/render.js +0 -689
  297. package/dist/esm/internal/render.js.map +0 -1
  298. package/src/internal/hydrate.ts +0 -366
  299. package/src/internal/parts.ts +0 -609
  300. package/src/internal/render.ts +0 -971
package/src/Hydrate.ts CHANGED
@@ -11,9 +11,10 @@ import type { CurrentEnvironment } from "@typed/environment"
11
11
  import * as Fx from "@typed/fx/Fx"
12
12
  import * as Effect from "effect/Effect"
13
13
  import * as Layer from "effect/Layer"
14
- import { findRootParentChildNodes, hydrateTemplate } from "./internal/hydrate.js"
15
14
  import { HydrateContext } from "./internal/HydrateContext.js"
16
- import { attachRoot } from "./internal/render.js"
15
+ import { hydrateTemplate } from "./internal/v2/hydrate.js"
16
+ import { getHydrationRoot } from "./internal/v2/hydration-template.js"
17
+ import { attachRoot } from "./internal/v2/render.js"
17
18
  import type { ToRendered } from "./Render.js"
18
19
  import * as RenderContext from "./RenderContext.js"
19
20
  import { type RenderEvent } from "./RenderEvent.js"
@@ -24,7 +25,7 @@ import { RenderTemplate } from "./RenderTemplate.js"
24
25
  */
25
26
  export const hydrateLayer = (
26
27
  window: Window & GlobalThis,
27
- options?: DomServicesElementParams & { readonly skipRenderScheduling?: boolean }
28
+ options?: DomServicesElementParams
28
29
  ): Layer.Layer<
29
30
  | RenderTemplate
30
31
  | RenderContext.RenderContext
@@ -32,15 +33,19 @@ export const hydrateLayer = (
32
33
  | DomServices
33
34
  > =>
34
35
  Layer.provideMerge(
35
- RenderTemplate.layer(Effect.contextWith((context: Context.Context<Document | RenderContext.RenderContext>) => {
36
- const [document, ctx] = Context.getMany(
37
- context,
38
- Document,
39
- RenderContext.RenderContext
40
- )
36
+ RenderTemplate.layer(
37
+ Effect.contextWith(
38
+ (context: Context.Context<Document | RenderContext.RenderContext>) => {
39
+ const [document, ctx] = Context.getMany(
40
+ context,
41
+ Document,
42
+ RenderContext.RenderContext
43
+ )
41
44
 
42
- return hydrateTemplate(document, ctx)
43
- })),
45
+ return hydrateTemplate(document, ctx)
46
+ }
47
+ )
48
+ ),
44
49
  RenderContext.dom(window, options)
45
50
  )
46
51
 
@@ -57,8 +62,7 @@ export function hydrate<R, E, T extends RenderEvent | null>(
57
62
  RootElement
58
63
  )
59
64
  const ctx: HydrateContext = {
60
- where: findRootParentChildNodes(rootElement),
61
- rootIndex: -1,
65
+ where: getHydrationRoot(rootElement),
62
66
  parentTemplate: null,
63
67
  hydrate: true
64
68
  }
@@ -76,5 +80,7 @@ export function hydrate<R, E, T extends RenderEvent | null>(
76
80
  export function hydrateToLayer<R, E, T extends RenderEvent | null>(
77
81
  rendered: Fx.Fx<T, E, R>
78
82
  ): Layer.Layer<never, never, R | RenderTemplate | RenderContext.RenderContext | RootElement> {
79
- return Fx.drainLayer(Fx.switchMapCause(hydrate(rendered), (cause) => Fx.fromEffect(Effect.logError(cause))))
83
+ return Fx.drainLayer(
84
+ Fx.switchMapCause(hydrate(rendered), (cause) => Fx.fromEffect(Effect.logError(`Hydration Failure`, cause)))
85
+ )
80
86
  }
package/src/Many.ts CHANGED
@@ -6,12 +6,11 @@ import type { Progress } from "@typed/async-data/Progress"
6
6
  import * as RefAsyncData from "@typed/fx/AsyncData"
7
7
  import * as Fx from "@typed/fx/Fx"
8
8
  import * as RefSubject from "@typed/fx/RefSubject"
9
- import type { Scope } from "effect"
10
9
  import { get, getOption } from "effect/Context"
11
10
  import * as Effect from "effect/Effect"
12
11
  import { dual } from "effect/Function"
13
12
  import { isSome } from "effect/Option"
14
- import type { NoInfer } from "effect/Types"
13
+ import type * as Scope from "effect/Scope"
15
14
  import { HydrateContext } from "./internal/HydrateContext.js"
16
15
  import { MANY_HOLE } from "./Meta.js"
17
16
  import { RenderContext } from "./RenderContext.js"
@@ -23,7 +22,7 @@ import { HtmlRenderEvent, type RenderEvent } from "./RenderEvent.js"
23
22
  export function many<A, E, R, B extends PropertyKey, R2, E2>(
24
23
  values: Fx.Fx<ReadonlyArray<A>, E, R>,
25
24
  getKey: (a: NoInfer<A>) => B,
26
- f: (a: RefSubject.RefSubject<NoInfer<A>>, key: B) => Fx.Fx<RenderEvent, E2, R2>
25
+ f: (a: RefSubject.RefSubject<A>, key: B) => Fx.Fx<RenderEvent, E2, R2>
27
26
  ): Fx.Fx<RenderEvent | ReadonlyArray<RenderEvent>, E | E2, R | R2 | Scope.Scope | RenderContext> {
28
27
  return Fx.fromFxEffect(
29
28
  Effect.contextWith(
@@ -37,7 +36,7 @@ export function many<A, E, R, B extends PropertyKey, R2, E2>(
37
36
  return Fx.keyed(values, {
38
37
  getKey,
39
38
  onValue: (ref, key) =>
40
- Fx.provideService(f(ref, key), HydrateContext, { ...hydrateContext.value, manyIndex: key.toString() })
39
+ Fx.provideService(f(ref, key), HydrateContext, { ...hydrateContext.value, manyKey: key.toString() })
41
40
  })
42
41
  }
43
42
 
@@ -55,10 +54,16 @@ export function many<A, E, R, B extends PropertyKey, R2, E2>(
55
54
  return Fx.fromFxEffect(
56
55
  Effect.map(Fx.first(values), (values) =>
57
56
  Fx.mergeOrdered(
58
- values.map((value) =>
57
+ values.map((value, i) =>
59
58
  Fx.fromFxEffect(Effect.map(RefSubject.of(value), (ref) => {
60
59
  const key = getKey(value)
61
- return Fx.append(f(RefSubject.take(ref, 1), key), HtmlRenderEvent(MANY_HOLE(key)))
60
+ return Fx.append(
61
+ Fx.map(
62
+ f(RefSubject.take(ref, 1), key),
63
+ (r) => HtmlRenderEvent((r as HtmlRenderEvent).html, false)
64
+ ),
65
+ HtmlRenderEvent(MANY_HOLE(key), i === values.length - 1)
66
+ )
62
67
  }))
63
68
  )
64
69
  ))
@@ -68,8 +73,6 @@ export function many<A, E, R, B extends PropertyKey, R2, E2>(
68
73
  )
69
74
  }
70
75
 
71
- type TODO = any
72
-
73
76
  /**
74
77
  * @since 1.0.0
75
78
  */
@@ -86,9 +89,9 @@ export const manyAsyncData: {
86
89
  getKey: (a: A) => B,
87
90
  matchers: {
88
91
  NoData: () => NoData
89
- Loading: (todo: TODO) => Loading
90
- Failure: (data: RefSubject.Computed<E1>, computed: TODO) => Failure
91
- Success: (value: RefSubject.Computed<A>, computed: TODO) => Success
92
+ Loading: (data: RefSubject.Filtered<Progress>) => Loading
93
+ Failure: (data: RefSubject.Computed<E1>) => Failure
94
+ Success: (value: RefSubject.Computed<A>) => Success
92
95
  }
93
96
  ): <E, R>(
94
97
  fx: Fx.Fx<AsyncData.AsyncData<ReadonlyArray<A>, E1>, E, R>
@@ -113,9 +116,9 @@ export const manyAsyncData: {
113
116
  getKey: (a: A) => B,
114
117
  matchers: {
115
118
  NoData: () => NoData
116
- Loading: (data: TODO) => Loading
117
- Failure: (data: RefSubject.Computed<E1>, computed: TODO) => Failure
118
- Success: (value: RefSubject.Computed<A>, computed: TODO) => Success
119
+ Loading: (data: RefSubject.Filtered<Progress>) => Loading
120
+ Failure: (data: RefSubject.Computed<E1>) => Failure
121
+ Success: (value: RefSubject.Computed<A>) => Success
119
122
  }
120
123
  ): Fx.Fx<
121
124
  Fx.Fx.Success<NoData | Loading | Failure | Success>,
package/src/Meta.ts CHANGED
@@ -29,7 +29,14 @@ export const TEXT_START = "<!--text-->"
29
29
  /**
30
30
  * @since 1.0.0
31
31
  */
32
- export const TYPED_HOLE = (index: number) => `<!--hole${index}-->`
32
+ export const TYPED_HOLE_START = (index: number) => `<!--hole${index}-->`
33
+
34
+ // Used to mark where a NodePart is in the DOM. It can be found directly after the
35
+ // elements or text nodes it is managing.
36
+ /**
37
+ * @since 1.0.0
38
+ */
39
+ export const TYPED_HOLE_END = (index: number) => `<!--/hole${index}-->`
33
40
 
34
41
  /**
35
42
  * Used to mark separation between the start and end of a template.
package/src/Parser.ts CHANGED
@@ -11,4 +11,4 @@ export {
11
11
  * @since 1.0.0
12
12
  */
13
13
  templateHash
14
- } from "./internal/parser.js"
14
+ } from "./internal/parser2.js"
package/src/Part.ts CHANGED
@@ -20,9 +20,9 @@ export type Part =
20
20
  | EventPart
21
21
  | NodePart
22
22
  | PropertyPart
23
+ | PropertiesPart
23
24
  | RefPart
24
25
  | TextPart
25
- | PropertiesPart
26
26
 
27
27
  /**
28
28
  * @since 1.0.0
@@ -33,7 +33,7 @@ export interface AttributePart {
33
33
  readonly value: string | null | undefined
34
34
  readonly index: number
35
35
 
36
- readonly update: (value: this["value"]) => Effect<void, never, Scope>
36
+ readonly update: (value: this["value"], priority?: number) => Effect<void, never, Scope>
37
37
  }
38
38
 
39
39
  /**
@@ -45,7 +45,7 @@ export interface BooleanPart {
45
45
  readonly value: boolean | null | undefined
46
46
  readonly index: number
47
47
 
48
- readonly update: (value: this["value"]) => Effect<void, never, Scope>
48
+ readonly update: (value: this["value"], priority?: number) => Effect<void, never, Scope>
49
49
  }
50
50
 
51
51
  /**
@@ -53,10 +53,10 @@ export interface BooleanPart {
53
53
  */
54
54
  export interface ClassNamePart {
55
55
  readonly _tag: "className"
56
- readonly value: ReadonlyArray<string> | null | undefined
56
+ readonly value: ReadonlyArray<string>
57
57
  readonly index: number
58
58
 
59
- readonly update: (value: this["value"]) => Effect<void, never, Scope>
59
+ readonly update: (value: this["value"], priority?: number) => Effect<void, never, Scope>
60
60
  }
61
61
 
62
62
  /**
@@ -67,7 +67,7 @@ export interface DataPart {
67
67
  readonly value: Readonly<Record<string, string | undefined>> | null | undefined
68
68
  readonly index: number
69
69
 
70
- readonly update: (value: this["value"]) => Effect<void, never, Scope>
70
+ readonly update: (value: this["value"], priority?: number) => Effect<void, never, Scope>
71
71
  }
72
72
 
73
73
  /**
@@ -92,7 +92,18 @@ export interface PropertyPart {
92
92
  readonly value: unknown
93
93
  readonly index: number
94
94
 
95
- readonly update: (value: this["value"]) => Effect<void, never, Scope>
95
+ readonly update: (value: this["value"], priority?: number) => Effect<void, never, Scope>
96
+ }
97
+
98
+ /**
99
+ * @since 1.0.0
100
+ */
101
+ export interface PropertiesPart {
102
+ readonly _tag: "properties"
103
+ readonly value: Record<string, any> | null | undefined
104
+ readonly index: number
105
+
106
+ readonly update: (value: this["value"], priority?: number) => Effect<void, never, Scope>
96
107
  }
97
108
 
98
109
  /**
@@ -112,7 +123,7 @@ export interface CommentPart {
112
123
  readonly value: string | null | undefined
113
124
  readonly index: number
114
125
 
115
- readonly update: (value: this["value"]) => Effect<void, never, Scope>
126
+ readonly update: (value: this["value"], priority?: number) => Effect<void, never, Scope>
116
127
  }
117
128
 
118
129
  /**
@@ -123,7 +134,7 @@ export interface TextPart {
123
134
  readonly value: string | null | undefined
124
135
  readonly index: number
125
136
 
126
- readonly update: (value: this["value"]) => Effect<void, never, Scope>
137
+ readonly update: (value: this["value"], priority?: number) => Effect<void, never, Scope>
127
138
  }
128
139
 
129
140
  /**
@@ -134,65 +145,10 @@ export interface NodePart {
134
145
  readonly value: unknown
135
146
  readonly index: number
136
147
 
137
- readonly update: (value: this["value"]) => Effect<void, never, Scope>
138
- }
139
-
140
- /**
141
- * @since 1.0.0
142
- */
143
- export interface PropertiesPart {
144
- readonly _tag: "properties"
145
- readonly value: Readonly<Record<string, any>> | null | undefined
146
- readonly index: number
147
-
148
- readonly update: (value: this["value"]) => Effect<void, never, Scope>
149
- }
150
-
151
- /**
152
- * @since 1.0.0
153
- */
154
- export type SparsePart = SparseAttributePart | SparseClassNamePart | SparseCommentPart
155
-
156
- /**
157
- * @since 1.0.0
158
- */
159
- export interface SparseAttributePart {
160
- readonly _tag: "sparse/attribute"
161
- readonly name: string
162
- readonly parts: ReadonlyArray<AttributePart | StaticText>
163
-
164
- readonly update: (value: ReadonlyArray<string>) => Effect<void, never, Scope>
165
- }
166
-
167
- /**
168
- * @since 1.0.0
169
- */
170
- export interface SparseClassNamePart {
171
- readonly _tag: "sparse/className"
172
- readonly parts: ReadonlyArray<ClassNamePart | StaticText>
173
-
174
- readonly update: (value: ReadonlyArray<string>) => Effect<void, never, Scope>
175
- }
176
-
177
- /**
178
- * @since 1.0.0
179
- */
180
- export interface SparseCommentPart {
181
- readonly _tag: "sparse/comment"
182
- readonly parts: ReadonlyArray<CommentPart | StaticText>
183
-
184
- readonly update: (value: ReadonlyArray<string>) => Effect<void, never, Scope>
185
- }
186
-
187
- /**
188
- * @since 1.0.0
189
- */
190
- export interface StaticText {
191
- readonly _tag: "static/text"
192
- readonly value: string
148
+ readonly update: (value: this["value"], priority?: number) => Effect<void, never, Scope>
193
149
  }
194
150
 
195
151
  /**
196
152
  * @since 1.0.0
197
153
  */
198
- export type Parts = ReadonlyArray<Part | SparsePart>
154
+ export type Parts = ReadonlyArray<Part>
@@ -2,10 +2,8 @@
2
2
  * @since 1.0.0
3
3
  */
4
4
 
5
+ import * as Fx from "@typed/fx"
5
6
  import "./internal/module-augmentation.js"
6
- import type { Fx } from "@typed/fx/Fx"
7
- import { isFx } from "@typed/fx/Fx"
8
- import * as RefSubject from "@typed/fx/RefSubject"
9
7
  import * as Effect from "effect/Effect"
10
8
  import type * as Scope from "effect/Scope"
11
9
 
@@ -41,36 +39,40 @@ export namespace Placeholder {
41
39
  | Placeholder<A, never, any>
42
40
  | Placeholder<A>
43
41
  | Placeholder<A, any>
42
+ | Effect.Effect<A, any, any>
43
+ // Null/Undefined cannot be modified globally to make them placeholders
44
+ | ([A] extends [null] ? null : never)
45
+ | ([A] extends [undefined] ? undefined : never)
44
46
 
45
47
  /**
46
48
  * @since 1.0.0
47
49
  */
48
50
  export type Context<T> = [T] extends [never] ? never
49
- : [T] extends [Placeholder<infer _A, infer _E, infer R>] ? R
51
+ : T extends Effect.Effect<infer _A, infer _E, infer R> ? R
52
+ : T extends Placeholder<infer _A, infer _E, infer R> ? R
50
53
  : never
51
54
  /**
52
55
  * @since 1.0.0
53
56
  */
54
57
  export type Error<T> = [T] extends [never] ? never
55
- : [T] extends [Placeholder<infer _A, infer E, infer _R>] ? E
58
+ : T extends Effect.Effect<infer _A, infer E, infer _R> ? E
59
+ : T extends Placeholder<infer _A, infer E, infer _R> ? E
56
60
  : never
57
61
  /**
58
62
  * @since 1.0.0
59
63
  */
60
64
  export type Success<T> = [T] extends [never] ? never
61
- : [T] extends [Placeholder<infer A, infer _E, infer _R>] ? A
65
+ : T extends Effect.Effect<infer A, infer _E, infer _R> ? A
66
+ : T extends Placeholder<infer A, infer _E, infer _R> ? A
62
67
  : never
63
68
 
64
- /**
65
- * @since 1.0.0
66
- */
67
- export function asRef<A = never, E = never, R = never>(
68
- placeholder: Placeholder<A, E, R> | Fx<A, E, R> | Effect.Effect<A, E, R> | A
69
- ): Effect.Effect<RefSubject.RefSubject<A, E>, never, R | Scope.Scope> {
70
- if (isFx<A, E, R>(placeholder) || Effect.isEffect(placeholder)) {
71
- return RefSubject.make(placeholder as Fx<A, E, R>)
69
+ export function asRef<A, E = never, R = never>(
70
+ placeholder: Fx.Fx<A, E, R> | Effect.Effect<A, E, R> | Placeholder<A, E, R> | A
71
+ ): Effect.Effect<Fx.RefSubject.RefSubject<A, E, never>, never, Scope.Scope | R> {
72
+ if (Fx.isFx(placeholder) || Effect.isEffect(placeholder)) {
73
+ return Fx.RefSubject.make(placeholder)
72
74
  } else {
73
- return RefSubject.of<A, E>(placeholder as A)
75
+ return Fx.RefSubject.of(placeholder as A)
74
76
  }
75
77
  }
76
78
  }
package/src/Platform.ts CHANGED
@@ -7,11 +7,11 @@ import type { ServerRequest } from "@effect/platform/Http/ServerRequest"
7
7
  import * as HttpServer from "@effect/platform/HttpServer"
8
8
  import type * as Fx from "@typed/fx/Fx"
9
9
  import { toStream } from "@typed/fx/Stream"
10
- import { Effect, Option, Stream } from "effect"
10
+ import * as Effect from "effect/Effect"
11
+ import * as Option from "effect/Option"
12
+ import * as Stream from "effect/Stream"
11
13
  import { renderToHtml } from "./Html.js"
12
- import type * as RenderContext from "./RenderContext.js"
13
14
  import type { RenderEvent } from "./RenderEvent.js"
14
- import type { RenderTemplate } from "./RenderTemplate.js"
15
15
 
16
16
  const HTML_CONTENT_TYPE = "text/html"
17
17
  const CAMEL_CASE_CONTENT_TYPE = { contentType: HTML_CONTENT_TYPE }
@@ -21,9 +21,9 @@ const HYPHENATED_CONTENT_TYPE = { "content-type": HTML_CONTENT_TYPE }
21
21
  * @since 1.0.0
22
22
  */
23
23
  export function htmlResponse<E, R>(
24
- fx: Fx.Fx<RenderEvent, E, R>,
24
+ fx: Fx.Fx<RenderEvent | null, E, R>,
25
25
  options?: HttpServer.response.Options
26
- ): Effect.Effect<HttpServer.response.ServerResponse, E, R | RenderTemplate | RenderContext.RenderContext> {
26
+ ): Effect.Effect<HttpServer.response.ServerResponse, E, R> {
27
27
  return Effect.contextWithEffect((ctx) =>
28
28
  HttpServer.response.stream(
29
29
  Stream.provideContext(Stream.encodeText(toStream(renderToHtml(fx))), ctx),
package/src/Render.ts CHANGED
@@ -10,10 +10,11 @@ import { RootElement } from "@typed/dom/RootElement"
10
10
  import type { CurrentEnvironment } from "@typed/environment"
11
11
  import * as Fx from "@typed/fx/Fx"
12
12
  import { type Rendered } from "@typed/wire"
13
- import type { Scope } from "effect"
14
- import { Layer } from "effect"
15
13
  import * as Effect from "effect/Effect"
16
- import { attachRoot, renderTemplate } from "./internal/render.js"
14
+ import { pipe } from "effect/Function"
15
+ import * as Layer from "effect/Layer"
16
+ import type * as Scope from "effect/Scope"
17
+ import { attachRoot, renderTemplate } from "./internal/v2/render.js"
17
18
  import * as RenderContext from "./RenderContext.js"
18
19
  import { type RenderEvent } from "./RenderEvent.js"
19
20
  import { RenderTemplate } from "./RenderTemplate.js"
@@ -28,7 +29,7 @@ export type ToRendered<T extends RenderEvent | null> = T extends null ? Rendered
28
29
  */
29
30
  export const renderLayer = (
30
31
  window: Window & GlobalThis,
31
- options?: DomServicesElementParams & { readonly skipRenderScheduling?: boolean }
32
+ options?: DomServicesElementParams
32
33
  ): Layer.Layer<
33
34
  | RenderTemplate
34
35
  | RenderContext.RenderContext
@@ -36,15 +37,21 @@ export const renderLayer = (
36
37
  | DomServices
37
38
  > =>
38
39
  Layer.provideMerge(
39
- RenderTemplate.layer(Effect.contextWith((context: Context.Context<Document | RenderContext.RenderContext>) => {
40
- const [document, ctx] = Context.getMany(
41
- context,
42
- Document,
43
- RenderContext.RenderContext
44
- )
40
+ RenderTemplate.layer(
41
+ Effect.contextWith(
42
+ (context: Context.Context<Document | RenderContext.RenderContext>) => {
43
+ const [document, ctx] = pipe(
44
+ context,
45
+ Context.getMany(
46
+ Document,
47
+ RenderContext.RenderContext
48
+ )
49
+ )
45
50
 
46
- return renderTemplate(document, ctx)
47
- })),
51
+ return renderTemplate(document, ctx)
52
+ }
53
+ )
54
+ ),
48
55
  RenderContext.dom(window, options)
49
56
  )
50
57
 
@@ -69,19 +76,9 @@ export function render<R, E, T extends RenderEvent | null>(
69
76
  * @since 1.0.0
70
77
  */
71
78
  export function renderToLayer<R, E, T extends RenderEvent | null>(
72
- rendered: Fx.Fx<T, E, R>,
73
- window: Window & GlobalThis = globalThis.window,
74
- options?: DomServicesElementParams & { readonly skipRenderScheduling?: boolean }
75
- ): Layer.Layer<
76
- RenderTemplate | RenderContext.RenderContext | CurrentEnvironment | DomServices,
77
- never,
78
- Exclude<
79
- Exclude<R, Scope.Scope>,
80
- RenderTemplate | RenderContext.RenderContext | CurrentEnvironment | DomServices
81
- >
82
- > {
83
- return Layer.provideMerge(
84
- Fx.drainLayer(Fx.switchMapCause(render(rendered), (e) => Fx.fromEffect(Effect.logError(e)))),
85
- renderLayer(window, options)
79
+ rendered: Fx.Fx<T, E, R>
80
+ ): Layer.Layer<never, never, RenderContext.RenderContext | RenderTemplate | RootElement | Exclude<R, Scope.Scope>> {
81
+ return Fx.drainLayer(
82
+ Fx.switchMapCause(render(rendered), (e) => Fx.fromEffect(Effect.logError(`Rendering Failure`, e)))
86
83
  )
87
84
  }