@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
@@ -0,0 +1,254 @@
1
+ import type * as Cause from "effect/Cause"
2
+ import * as Effect from "effect/Effect"
3
+ import type { Scope } from "effect/Scope"
4
+ import type { ElementSource } from "../../ElementSource.js"
5
+ import type { EventHandler } from "../../EventHandler.js"
6
+ import type * as Part from "../../Part.js"
7
+ import { DEFAULT_PRIORITY } from "../../RenderQueue.js"
8
+ import type * as SyncPart from "./SyncPart.js"
9
+
10
+ const base = <T extends SyncPart.SyncPart["_tag"]>(tag: T) => (class Base {
11
+ readonly _tag: T = tag
12
+
13
+ constructor(
14
+ readonly sync: Extract<SyncPart.SyncPart, { readonly _tag: T }>,
15
+ readonly commit: (
16
+ params: {
17
+ previous: Extract<SyncPart.SyncPart, { readonly _tag: T }>["value"]
18
+ value: Extract<SyncPart.SyncPart, { readonly _tag: T }>["value"]
19
+ part: Extract<Part.Part, { readonly _tag: T }>
20
+ },
21
+ priority: number
22
+ ) => Effect.Effect<void, never, Scope>
23
+ ) {
24
+ this.update = this.update.bind(this)
25
+ }
26
+
27
+ update(input: any, priority: number = DEFAULT_PRIORITY) {
28
+ const current = this.sync.value
29
+ if (this.sync.update(input)) {
30
+ return this.commit(
31
+ {
32
+ previous: current,
33
+ value: input,
34
+ part: this as any
35
+ } as any,
36
+ priority
37
+ )
38
+ }
39
+ return Effect.void
40
+ }
41
+
42
+ get value() {
43
+ return this.sync.value as Extract<Part.Part, { readonly _tag: T }>["value"]
44
+ }
45
+ })
46
+
47
+ export class AttributePartImpl extends base("attribute") implements Part.AttributePart {
48
+ readonly name: string
49
+ readonly index: number
50
+
51
+ constructor(
52
+ readonly sync: SyncPart.AttributeSyncPart,
53
+ commit: (
54
+ params: {
55
+ previous: SyncPart.AttributeSyncPart["value"]
56
+ value: SyncPart.AttributeSyncPart["value"]
57
+ part: Part.AttributePart
58
+ },
59
+ priority: number
60
+ ) => Effect.Effect<void, never, Scope>
61
+ ) {
62
+ super(sync, commit)
63
+ this.name = sync.name
64
+ this.index = sync.index
65
+ }
66
+ }
67
+
68
+ export class BooleanPartImpl extends base("boolean") implements Part.BooleanPart {
69
+ readonly name: string
70
+ readonly index: number
71
+
72
+ constructor(
73
+ readonly sync: SyncPart.BooleanSyncPart,
74
+ commit: (
75
+ params: {
76
+ previous: SyncPart.BooleanSyncPart["value"]
77
+ value: SyncPart.BooleanSyncPart["value"]
78
+ part: Part.BooleanPart
79
+ },
80
+ priority: number
81
+ ) => Effect.Effect<void, never, Scope>
82
+ ) {
83
+ super(sync, commit)
84
+ this.name = sync.name
85
+ this.index = sync.index
86
+ }
87
+ }
88
+
89
+ export class ClassNamePartImpl extends base("className") implements Part.ClassNamePart {
90
+ readonly index: number
91
+
92
+ constructor(
93
+ readonly sync: SyncPart.ClassNameSyncPart,
94
+ commit: (
95
+ params: {
96
+ previous: SyncPart.ClassNameSyncPart["value"]
97
+ value: SyncPart.ClassNameSyncPart["value"]
98
+ part: Part.ClassNamePart
99
+ },
100
+ priority: number
101
+ ) => Effect.Effect<void, never, Scope>
102
+ ) {
103
+ super(sync, commit)
104
+ this.index = sync.index
105
+ }
106
+ }
107
+
108
+ export class CommentPartImpl extends base("comment") implements Part.CommentPart {
109
+ readonly index: number
110
+
111
+ constructor(
112
+ readonly sync: SyncPart.CommentSyncPart,
113
+ commit: (
114
+ params: {
115
+ previous: SyncPart.CommentSyncPart["value"]
116
+ value: SyncPart.CommentSyncPart["value"]
117
+ part: Part.CommentPart
118
+ },
119
+ priority: number
120
+ ) => Effect.Effect<void, never, Scope>
121
+ ) {
122
+ super(sync, commit)
123
+ this.index = sync.index
124
+ }
125
+ }
126
+
127
+ export class DataPartImpl extends base("data") implements Part.DataPart {
128
+ readonly index: number
129
+
130
+ constructor(
131
+ readonly sync: SyncPart.DataSyncPart,
132
+ commit: (
133
+ params: {
134
+ previous: SyncPart.DataSyncPart["value"]
135
+ value: SyncPart.DataSyncPart["value"]
136
+ part: Part.DataPart
137
+ },
138
+ priority: number
139
+ ) => Effect.Effect<void, never, Scope>
140
+ ) {
141
+ super(sync, commit)
142
+ this.index = sync.index
143
+ }
144
+ }
145
+
146
+ export class EventPartImpl implements Part.EventPart {
147
+ readonly _tag = "event"
148
+ readonly value: Part.EventPart["value"] = null
149
+
150
+ constructor(
151
+ readonly name: string,
152
+ readonly index: number,
153
+ readonly source: ElementSource<any>,
154
+ readonly onCause: <E>(cause: Cause.Cause<E>) => Effect.Effect<unknown>,
155
+ readonly addEventListener: <Ev extends Event>(handler: EventHandler<Ev>) => void
156
+ ) {
157
+ }
158
+ }
159
+
160
+ export class NodePartImpl extends base("node") implements Part.NodePart {
161
+ readonly index: number
162
+
163
+ constructor(
164
+ readonly sync: SyncPart.NodeSyncPart,
165
+ commit: (
166
+ params: {
167
+ previous: SyncPart.NodeSyncPart["value"]
168
+ value: SyncPart.NodeSyncPart["value"]
169
+ part: Part.NodePart
170
+ },
171
+ priority: number
172
+ ) => Effect.Effect<void, never, Scope>
173
+ ) {
174
+ super(sync, commit)
175
+ this.index = sync.index
176
+ }
177
+ }
178
+
179
+ export class PropertyPartImpl extends base("property") implements Part.PropertyPart {
180
+ readonly name: string
181
+ readonly index: number
182
+
183
+ constructor(
184
+ readonly sync: SyncPart.PropertySyncPart,
185
+ commit: (
186
+ params: {
187
+ previous: SyncPart.PropertySyncPart["value"]
188
+ value: SyncPart.PropertySyncPart["value"]
189
+ part: Part.PropertyPart
190
+ },
191
+ priority: number
192
+ ) => Effect.Effect<void, never, Scope>
193
+ ) {
194
+ super(sync, commit)
195
+ this.name = sync.name
196
+ this.index = sync.index
197
+ }
198
+ }
199
+
200
+ export class RefPartImpl implements Part.RefPart {
201
+ readonly _tag = "ref"
202
+
203
+ constructor(readonly value: ElementSource<any>, readonly index: number) {}
204
+ }
205
+
206
+ export class TextPartImpl extends base("text") implements Part.TextPart {
207
+ readonly index: number
208
+
209
+ constructor(
210
+ readonly sync: SyncPart.TextSyncPart,
211
+ commit: (
212
+ params: {
213
+ previous: SyncPart.TextSyncPart["value"]
214
+ value: SyncPart.TextSyncPart["value"]
215
+ part: Part.TextPart
216
+ },
217
+ priority: number
218
+ ) => Effect.Effect<void, never, Scope>
219
+ ) {
220
+ super(sync, commit)
221
+ this.index = sync.index
222
+ }
223
+ }
224
+
225
+ export function syncPartToPart<T extends SyncPart.SyncPart>(
226
+ part: SyncPart.SyncPart,
227
+ commit: (
228
+ params: {
229
+ previous: SyncPart.TextSyncPart["value"]
230
+ value: SyncPart.TextSyncPart["value"]
231
+ part: Extract<Part.Part, { readonly _tag: T["_tag"] }>
232
+ },
233
+ priority: number
234
+ ) => Effect.Effect<void, never, Scope>
235
+ ): Extract<Part.Part, { readonly _tag: T["_tag"] }> {
236
+ switch (part._tag) {
237
+ case "attribute":
238
+ return new AttributePartImpl(part, commit as any) as any
239
+ case "boolean":
240
+ return new BooleanPartImpl(part, commit as any) as any
241
+ case "className":
242
+ return new ClassNamePartImpl(part, commit as any) as any
243
+ case "comment":
244
+ return new CommentPartImpl(part, commit as any) as any
245
+ case "data":
246
+ return new DataPartImpl(part, commit as any) as any
247
+ case "node":
248
+ return new NodePartImpl(part, commit as any) as any
249
+ case "property":
250
+ return new PropertyPartImpl(part, commit as any) as any
251
+ case "text":
252
+ return new TextPartImpl(part, commit as any) as any
253
+ }
254
+ }
@@ -0,0 +1,131 @@
1
+ import type { BrowserEntry } from "../../Entry.js"
2
+ import type { RenderContext } from "../../RenderContext.js"
3
+ import type * as Template from "../../Template.js"
4
+ import { parse } from "../parser2.js"
5
+
6
+ export function getBrowserEntry(
7
+ document: Document,
8
+ ctx: RenderContext,
9
+ templateStrings: TemplateStringsArray
10
+ ): BrowserEntry {
11
+ const cached = ctx.templateCache.get(templateStrings)
12
+
13
+ if (cached === undefined || cached._tag === "Server") {
14
+ const template = parse(templateStrings)
15
+ const content = buildTemplate(document, template)
16
+ const entry: BrowserEntry = {
17
+ _tag: "Browser",
18
+ template,
19
+ content
20
+ }
21
+
22
+ ctx.templateCache.set(templateStrings, entry)
23
+
24
+ return entry
25
+ } else {
26
+ return cached
27
+ }
28
+ }
29
+
30
+ export function buildTemplate(document: Document, { nodes }: Template.Template): DocumentFragment {
31
+ const fragment = document.createDocumentFragment()
32
+
33
+ for (let i = 0; i < nodes.length; ++i) {
34
+ fragment.append(buildNode(document, nodes[i], false))
35
+ }
36
+
37
+ return fragment
38
+ }
39
+
40
+ function buildNode(document: Document, node: Template.Node, isSvgContext: boolean): globalThis.Node {
41
+ switch (node._tag) {
42
+ case "element":
43
+ case "self-closing-element":
44
+ case "text-only-element":
45
+ return buildElement(document, node, isSvgContext)
46
+ case "text":
47
+ return document.createTextNode(node.value)
48
+ case "comment":
49
+ return document.createComment(node.value)
50
+ case "sparse-comment":
51
+ return document.createComment(`hole${node.nodes.map((n) => n._tag === "text" ? "" : n.index).join("")}`)
52
+ // Create placeholders for these elements
53
+ case "comment-part":
54
+ case "node":
55
+ return document.createComment(`hole${node.index}`)
56
+ case "doctype":
57
+ return document.implementation.createDocumentType(
58
+ node.name,
59
+ docTypeNameToPublicId(node.name),
60
+ docTypeNameToSystemId(node.name)
61
+ )
62
+ }
63
+ }
64
+
65
+ function docTypeNameToPublicId(name: string): string {
66
+ switch (name) {
67
+ case "html":
68
+ return "-//W3C//DTD HTML 4.01//EN"
69
+ case "svg":
70
+ return "-//W3C//DTD SVG 1.1//EN"
71
+ case "math":
72
+ return "-//W3C//DTD MathML 2.0//EN"
73
+ default:
74
+ return ""
75
+ }
76
+ }
77
+
78
+ function docTypeNameToSystemId(name: string): string {
79
+ switch (name) {
80
+ // HTML5
81
+ case "html":
82
+ return "http://www.w3.org/TR/html4/strict.dtd"
83
+ case "svg":
84
+ return "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"
85
+ case "math":
86
+ return "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd"
87
+ default:
88
+ return ""
89
+ }
90
+ }
91
+
92
+ const SVG_NAMESPACE = "http://www.w3.org/2000/svg"
93
+
94
+ function buildElement(
95
+ document: Document,
96
+ node: Template.ElementNode | Template.SelfClosingElementNode | Template.TextOnlyElement,
97
+ isSvgContext: boolean
98
+ ): Element {
99
+ const { _tag, attributes, tagName } = node
100
+ const isSvg = isSvgContext ? tagName !== "foreignObject" : tagName === "svg"
101
+ const element = isSvg
102
+ ? document.createElementNS(SVG_NAMESPACE, tagName)
103
+ : document.createElement(tagName)
104
+
105
+ for (let i = 0; i < attributes.length; ++i) {
106
+ const attr = attributes[i]
107
+
108
+ // We only handle static attributes here, parts are handled elsewhere
109
+ if (attr._tag === "attribute") {
110
+ element.setAttribute(attr.name, attr.value)
111
+ } else if (attr._tag === "boolean") {
112
+ element.toggleAttribute(attr.name, true)
113
+ }
114
+ }
115
+
116
+ if (_tag === "element") {
117
+ element.append(...node.children.map((child) => buildNode(document, child, isSvg)))
118
+ } else if (_tag === "text-only-element") {
119
+ element.append(...node.children.map((child) => buildTextChild(document, child)))
120
+ }
121
+
122
+ return element
123
+ }
124
+
125
+ function buildTextChild(document: Document, node: Template.Text): globalThis.Node {
126
+ if (node._tag === "text") {
127
+ return document.createTextNode(node.value)
128
+ }
129
+
130
+ return document.createComment(`hole${node.index}`)
131
+ }