@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,265 @@
1
+ import * as Fx from "@typed/fx";
2
+ import * as Effect from "effect/Effect";
3
+ import { identity } from "effect/Function";
4
+ import { convertCharacterEntities } from "../character-entities.js";
5
+ import { AttributePartImpl, BooleanPartImpl, ClassNamePartImpl, CommentPartImpl, DataPartImpl, NodePartImpl, PropertyPartImpl, splitClassNames, TextPartImpl } from "./sync-parts.js";
6
+ import { diffable, isComment } from "@typed/wire";
7
+ import udomdiff from "udomdiff";
8
+ import { isDirective } from "../../Directive.js";
9
+ import { isRenderEvent } from "../../RenderEvent.js";
10
+ import { isCommentWithValue } from "../utils.js";
11
+ import { syncPartToPart } from "./parts.js";
12
+ export function makeAttributePart(index, element, attr) {
13
+ const setValue = makeAttributeValueSetter(element, attr);
14
+ return new AttributePartImpl(attr.name, index, ({ value }) => setValue(value), attr.value);
15
+ }
16
+ export function makeAttributeValueSetter(element, attr) {
17
+ let isSet = false;
18
+ const setValue = (value) => {
19
+ if (isNullOrUndefined(value)) {
20
+ element.removeAttribute(attr.name);
21
+ isSet = false;
22
+ }
23
+ else {
24
+ attr.value = value;
25
+ if (isSet === false) {
26
+ element.setAttributeNode(attr);
27
+ isSet = true;
28
+ }
29
+ }
30
+ };
31
+ return setValue;
32
+ }
33
+ export function makeBooleanAttributePart(name, index, element) {
34
+ return new BooleanPartImpl(name, index, ({ value }) => element.toggleAttribute(name, value === true), element.hasAttribute(name));
35
+ }
36
+ export function makeClassNamePart(index, element, initial = Array.from(element.classList)) {
37
+ return new ClassNamePartImpl(index, ({ previous, value }) => {
38
+ const { added, removed } = diffStrings(previous, value);
39
+ element.classList.add(...added);
40
+ element.classList.remove(...removed);
41
+ }, initial);
42
+ }
43
+ export function makeDataPart(index, element) {
44
+ return new DataPartImpl(index, ({ previous, value }) => {
45
+ const diff = diffDataSet(previous, value);
46
+ if (diff) {
47
+ const { added, removed } = diff;
48
+ removed.forEach((k) => delete element.dataset[k]);
49
+ added.forEach(([k, v]) => element.dataset[k] = v);
50
+ }
51
+ }, element.dataset);
52
+ }
53
+ export function makePropertyPart(name, index, element) {
54
+ return new PropertyPartImpl(name, index, ({ value }) => {
55
+ ;
56
+ element[name] = value;
57
+ }, element[name]);
58
+ }
59
+ export function makeTextPart(index, text) {
60
+ return new TextPartImpl(index, ({ value }) => {
61
+ if (value) {
62
+ text.nodeValue = convertCharacterEntities(value);
63
+ }
64
+ else {
65
+ text.nodeValue = null;
66
+ }
67
+ }, text.nodeValue);
68
+ }
69
+ function isNullOrUndefined(value) {
70
+ return value === null || value === undefined;
71
+ }
72
+ function diffStrings(previous, current) {
73
+ if (previous == null || previous.length === 0) {
74
+ return {
75
+ added: current || [],
76
+ removed: [],
77
+ unchanged: []
78
+ };
79
+ }
80
+ else if (current == null || current.length === 0) {
81
+ return {
82
+ added: [],
83
+ removed: previous,
84
+ unchanged: []
85
+ };
86
+ }
87
+ else {
88
+ const added = current.filter((c) => !previous.includes(c));
89
+ const removed = [];
90
+ const unchanged = [];
91
+ for (let i = 0; i < previous.length; ++i) {
92
+ if (current.includes(previous[i])) {
93
+ unchanged.push(previous[i]);
94
+ }
95
+ else {
96
+ removed.push(previous[i]);
97
+ }
98
+ }
99
+ return {
100
+ added,
101
+ removed,
102
+ unchanged
103
+ };
104
+ }
105
+ }
106
+ function diffDataSet(a, b) {
107
+ if (!a)
108
+ return b ? { added: Object.entries(b), removed: [] } : null;
109
+ if (!b)
110
+ return { added: [], removed: Object.keys(a) };
111
+ const { added, removed, unchanged } = diffStrings(Object.keys(a), Object.keys(b));
112
+ return {
113
+ added: added.concat(unchanged).map((k) => [k, b[k]]),
114
+ removed
115
+ };
116
+ }
117
+ export function makeSparsePartHandler(parts, renderables, makePart, handleText, join, setValue) {
118
+ return Fx.mapEffect(Fx.withEmitter((sink) => Effect.zipRight(Effect.gen(function* () {
119
+ const values = new Map();
120
+ const expected = parts.length;
121
+ const setValueIfReady = () => {
122
+ if (values.size === expected) {
123
+ return sink.succeed(join(Array.from({ length: expected }, (_, i) => values.get(i))));
124
+ }
125
+ };
126
+ for (let i = 0; i < parts.length; ++i) {
127
+ const index = i;
128
+ const part = parts[i];
129
+ if (part._tag === "text") {
130
+ values.set(i, handleText(part.value));
131
+ }
132
+ else {
133
+ const child = makePart(part.index, (value) => {
134
+ values.set(index, value);
135
+ setValueIfReady();
136
+ });
137
+ const value = renderables[part.index];
138
+ yield* Effect.forkScoped(matchRenderable(value, {
139
+ Fx: (fx) => fx.run(Fx.Sink.make((cause) => Effect.promise(() => sink.failCause(cause)), (value) => Effect.sync(() => child.update(value)))),
140
+ Effect: (effect) => Effect.tap(effect, (value) => child.update(value)),
141
+ Directive: (directive) => directive(syncPartToPart(child, ({ value }) => Effect.sync(() => child.update(value)))),
142
+ Otherwise: (value) => Effect.sync(() => child.update(value))
143
+ }));
144
+ }
145
+ }
146
+ setValueIfReady();
147
+ }), Effect.never)), setValue);
148
+ }
149
+ export function handleSparseAttribute(element, attr, parts, values, schedule) {
150
+ const set = makeAttributeValueSetter(element, attr);
151
+ return Fx.drain(makeSparsePartHandler(parts, values, (index, setValue) => new AttributePartImpl(attr.name, index, ({ value }) => setValue(value), attr.value), (text) => text, (values) => values.flatMap((v) => isNullOrUndefined(v) ? [] : [v]).join(""), (value) => schedule(() => set(value))));
152
+ }
153
+ export function handleSparseClassName(element, parts, values, schedule) {
154
+ let previous = Array.from(element.classList);
155
+ return Fx.drain(makeSparsePartHandler(parts, values, (index, setValue) => new ClassNamePartImpl(index, ({ value }) => setValue(value), previous), splitClassNames, (values) => values.flat(1), (values) => schedule(() => {
156
+ const { added, removed } = diffStrings(previous, values);
157
+ element.classList.add(...added);
158
+ element.classList.remove(...removed);
159
+ previous = values;
160
+ })));
161
+ }
162
+ export function handleSparseComment(comment, parts, values, schedule) {
163
+ return Fx.drain(makeSparsePartHandler(parts, values, (index, setValue) => new CommentPartImpl(index, ({ value }) => setValue(value), comment.textContent), identity, (values) => values.flatMap((v) => isNullOrUndefined(v) ? [] : [v]).join(""), (value) => schedule(() => (comment.textContent = value))));
164
+ }
165
+ export function makeNodePart(index, comment, document, text, nodes) {
166
+ return new NodePartImpl(index, ({ value }) => {
167
+ matchNodeValue(value, (content) => {
168
+ if (text === null) {
169
+ text = document.createTextNode("");
170
+ }
171
+ text.textContent = convertCharacterEntities(content);
172
+ nodes = diffChildren(comment, nodes, [text], document);
173
+ }, (updatedNodes) => {
174
+ nodes = diffChildren(comment, nodes, updatedNodes, document);
175
+ });
176
+ }, nodes);
177
+ }
178
+ export function getPreviousTextSibling(node) {
179
+ if (!node)
180
+ return null;
181
+ if (node && node.nodeType === node.TEXT_NODE) {
182
+ // During hydration there should be a comment to separate these values
183
+ if (node.previousSibling &&
184
+ isCommentWithValue(node.previousSibling, "text")) {
185
+ return node;
186
+ }
187
+ }
188
+ return null;
189
+ }
190
+ export function findPreviousNodes(comment, index, hash) {
191
+ const previousComments = new Set([`hole${index - 1}`, `typed-${hash}`]);
192
+ const nodes = [];
193
+ let node = comment.previousSibling;
194
+ while (node) {
195
+ if (isComment(node) && previousComments.has(node.data)) {
196
+ break;
197
+ }
198
+ nodes.unshift(node);
199
+ node = node.previousSibling;
200
+ }
201
+ return nodes;
202
+ }
203
+ function diffChildren(comment, currentNodes, nextNodes, document) {
204
+ return udomdiff(comment.parentNode, currentNodes, nextNodes, diffable(document), comment);
205
+ }
206
+ function matchNodeValue(value, onText, onNodes) {
207
+ switch (typeof value) {
208
+ // primitives are handled as text content
209
+ case "string":
210
+ case "symbol":
211
+ case "number":
212
+ case "bigint":
213
+ case "boolean":
214
+ return onText(String(value));
215
+ case "undefined":
216
+ case "object": {
217
+ if (!value) {
218
+ return onNodes([]);
219
+ }
220
+ else if (Array.isArray(value)) {
221
+ // arrays can be used to cleanup, if empty
222
+ if (value.length === 0)
223
+ return onNodes([]);
224
+ // or diffed, if these contains nodes or "wires"
225
+ else if (value.some((x) => typeof x === "object")) {
226
+ return onNodes(value.flatMap(renderEventToArray));
227
+ } // in all other cases the content is stringified as is
228
+ else
229
+ return onText(String(value));
230
+ }
231
+ else {
232
+ return onNodes(renderEventToArray(value));
233
+ }
234
+ }
235
+ case "function":
236
+ return onNodes([]);
237
+ }
238
+ }
239
+ function renderEventToArray(x) {
240
+ if (x === null || x === undefined)
241
+ return [];
242
+ if (isRenderEvent(x)) {
243
+ const value = x.valueOf();
244
+ return Array.isArray(value) ? value : [value];
245
+ }
246
+ return [x];
247
+ }
248
+ export function makeCommentPart(index, comment) {
249
+ return new CommentPartImpl(index, ({ value }) => (comment.nodeValue = value ?? null), comment.textContent);
250
+ }
251
+ function matchRenderable(renderable, matches) {
252
+ if (Fx.isFx(renderable)) {
253
+ return matches.Fx(renderable);
254
+ }
255
+ else if (Effect.isEffect(renderable)) {
256
+ return matches.Effect(renderable);
257
+ }
258
+ else if (isDirective(renderable)) {
259
+ return matches.Directive(renderable);
260
+ }
261
+ else {
262
+ return matches.Otherwise(renderable);
263
+ }
264
+ }
265
+ //# sourceMappingURL=render-sync-parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-sync-parts.js","sourceRoot":"","sources":["../../../../src/internal/v2/render-sync-parts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,353 @@
1
+ import * as Context from "@typed/context";
2
+ import * as Fx from "@typed/fx";
3
+ import { persistent } from "@typed/wire";
4
+ import * as Effect from "effect/Effect";
5
+ import * as ExecutionStrategy from "effect/ExecutionStrategy";
6
+ import { flow } from "effect/Function";
7
+ import * as Scope from "effect/Scope";
8
+ import { isDirective } from "../../Directive.js";
9
+ import * as ElementRef from "../../ElementRef.js";
10
+ import * as ElementSource from "../../ElementSource.js";
11
+ import * as EventHandler from "../../EventHandler.js";
12
+ import { DomRenderEvent } from "../../RenderEvent.js";
13
+ import { DEFAULT_PRIORITY, RenderQueue } from "../../RenderQueue.js";
14
+ import { makeEventSource } from "../EventSource.js";
15
+ import { makeRefCounter } from "../indexRefCounter.js";
16
+ import { findHoleComment, findPath, keyToPartType } from "../utils.js";
17
+ import { isNullOrUndefined } from "./helpers.js";
18
+ import { EventPartImpl, RefPartImpl, syncPartToPart } from "./parts.js";
19
+ import { getBrowserEntry } from "./render-entry.js";
20
+ import * as SyncPartsInternal from "./render-sync-parts.js";
21
+ export const renderTemplate = (document, renderContext) => (templateStrings, values) => {
22
+ const entry = getBrowserEntry(document, renderContext, templateStrings);
23
+ if (entry.template.parts.length === 0) {
24
+ return Fx.succeed(DomRenderEvent(persistent(document, document.importNode(entry.content, true))));
25
+ }
26
+ return Fx.make((sink) => Effect.catchAllCause(Effect.gen(function* () {
27
+ // Create a context for rendering our template
28
+ const ctx = yield* makeTemplateContext(entry.content, document, renderContext, values, sink.onFailure);
29
+ // Setup all parts
30
+ const effects = setupParts(entry.template.parts, ctx);
31
+ if (effects.length > 0) {
32
+ yield* Effect.forEach(effects, flow(Effect.catchAllCause(ctx.onCause), Effect.forkIn(ctx.scope)));
33
+ }
34
+ // If there's anything to wait on and it's not already done, wait for an initial value
35
+ // for all asynchronous sources.
36
+ if (ctx.expected > 0 && (yield* ctx.refCounter.expect(ctx.expected))) {
37
+ yield* ctx.refCounter.wait;
38
+ }
39
+ // Create a persistent wire from our content
40
+ const wire = persistent(document, ctx.content);
41
+ // Setup our event listeners for our wire.
42
+ // We use the parentScope to allow event listeners to exist
43
+ // beyond the lifetime of the current Fiber, but no further than its parent template.
44
+ yield* ctx.eventSource.setup(wire, ctx.parentScope);
45
+ // Emit our DomRenderEvent
46
+ yield* sink.onSuccess(DomRenderEvent(wire)).pipe(
47
+ // Ensure our templates last forever in the DOM environment
48
+ // so event listeners are kept attached to the current Scope.
49
+ Effect.zipRight(Effect.never),
50
+ // Close our scope whenever the current Fiber is interrupted
51
+ Effect.onExit((exit) => Scope.close(ctx.scope, exit)));
52
+ }), sink.onFailure));
53
+ };
54
+ export function makeTemplateContext(entry, document, renderContext, values, onCause) {
55
+ return Effect.gen(function* () {
56
+ const refCounter = yield* makeRefCounter;
57
+ const context = yield* Effect.context();
58
+ const queue = Context.get(context, RenderQueue);
59
+ const parentScope = Context.get(context, Scope.Scope);
60
+ const eventSource = makeEventSource();
61
+ const content = document.importNode(entry, true);
62
+ const scope = yield* Scope.fork(parentScope, ExecutionStrategy.sequential);
63
+ const templateContext = {
64
+ context: Context.add(context, Scope.Scope, scope),
65
+ expected: 0,
66
+ content,
67
+ document,
68
+ eventSource,
69
+ parentScope,
70
+ queue,
71
+ refCounter,
72
+ renderContext,
73
+ scope,
74
+ values,
75
+ spreadIndex: values.length,
76
+ onCause
77
+ };
78
+ return templateContext;
79
+ });
80
+ }
81
+ function setupParts(parts, ctx) {
82
+ const effects = [];
83
+ for (const [part, path] of parts) {
84
+ const effect = setupPart(part, path, ctx);
85
+ if (effect) {
86
+ effects.push(effect);
87
+ }
88
+ }
89
+ return effects;
90
+ }
91
+ function setupPart(part, path, ctx) {
92
+ switch (part._tag) {
93
+ case "attr":
94
+ return setupAttrPart(part, findPath(ctx.content, path), ctx, ctx.values[part.index]);
95
+ case "boolean-part":
96
+ return setupBooleanPart(part, findPath(ctx.content, path), ctx, ctx.values[part.index]);
97
+ case "className-part":
98
+ return setupClassNamePart(part, findPath(ctx.content, path), ctx, ctx.values[part.index]);
99
+ case "comment-part":
100
+ return setupCommentPart(part, findPath(ctx.content, path), ctx);
101
+ case "data":
102
+ return setupDataPart(part, findPath(ctx.content, path), ctx, ctx.values[part.index]);
103
+ case "event":
104
+ return setupEventPart(part, findPath(ctx.content, path), ctx, ctx.values[part.index]);
105
+ case "node": {
106
+ const parent = findPath(ctx.content, path);
107
+ const comment = findHoleComment(parent, part.index);
108
+ return setupNodePart(part, comment, ctx, null, []);
109
+ }
110
+ case "properties":
111
+ return setupPropertiesPart(part, findPath(ctx.content, path), ctx);
112
+ case "property":
113
+ return setupPropertyPart(part, findPath(ctx.content, path), ctx, ctx.values[part.index]);
114
+ case "ref":
115
+ return setupRefPart(part, findPath(ctx.content, path), ctx);
116
+ case "sparse-attr":
117
+ return setupSparseAttrPart(part, findPath(ctx.content, path), ctx);
118
+ case "sparse-class-name":
119
+ return setupSparseClassNamePart(part, findPath(ctx.content, path), ctx);
120
+ case "sparse-comment":
121
+ return setupSparseCommentPart(part, findPath(ctx.content, path), ctx);
122
+ case "text-part": {
123
+ const parent = findPath(ctx.content, path);
124
+ const comment = findHoleComment(parent, part.index);
125
+ return setupTextPart(part, comment, ctx);
126
+ }
127
+ }
128
+ }
129
+ export function setupAttrPart({ index, name }, element, ctx, renderable) {
130
+ const attr = element.getAttributeNode(name) ?? ctx.document.createAttribute(name);
131
+ const part = SyncPartsInternal.makeAttributePart(index, element, attr);
132
+ return matchSyncPart(renderable, ctx, part);
133
+ }
134
+ export function setupBooleanPart({ index, name }, element, ctx, renderable) {
135
+ const part = SyncPartsInternal.makeBooleanAttributePart(name, index, element);
136
+ return matchSyncPart(renderable, ctx, part);
137
+ }
138
+ export function setupClassNamePart({ index }, element, ctx, renderable) {
139
+ const part = SyncPartsInternal.makeClassNamePart(index, element);
140
+ return matchSyncPart(renderable, ctx, part);
141
+ }
142
+ export function setupCommentPart({ index }, comment, ctx) {
143
+ const part = SyncPartsInternal.makeCommentPart(index, comment);
144
+ const renderable = ctx.values[index];
145
+ return matchSyncPart(renderable, ctx, part);
146
+ }
147
+ export function setupDataPart({ index }, element, ctx, renderable) {
148
+ const part = SyncPartsInternal.makeDataPart(index, element);
149
+ return matchSyncPart(renderable, ctx, part);
150
+ }
151
+ export function setupEventPart({ index, name }, element, ctx, renderable) {
152
+ if (isNullOrUndefined(renderable))
153
+ return null;
154
+ if (isDirective(renderable)) {
155
+ return renderable(new EventPartImpl(name, index, ElementSource.fromElement(element), ctx.onCause, (handler) => ctx.eventSource.addEventListener(element, name, handler)));
156
+ }
157
+ else {
158
+ const handler = getEventHandler(renderable, ctx.context, ctx.onCause);
159
+ if (handler === null)
160
+ return null;
161
+ ctx.eventSource.addEventListener(element, name, handler);
162
+ return null;
163
+ }
164
+ }
165
+ export function getEventHandler(renderable, ctx, onCause) {
166
+ if (renderable && typeof renderable === "object") {
167
+ if (EventHandler.EventHandlerTypeId in renderable) {
168
+ return EventHandler.make((ev) => Effect.provide(Effect.catchAllCause(renderable.handler(ev), onCause), ctx), renderable.options);
169
+ }
170
+ else if (Effect.EffectTypeId in renderable) {
171
+ return EventHandler.make(() => Effect.provide(Effect.catchAllCause(renderable, onCause), ctx));
172
+ }
173
+ }
174
+ return null;
175
+ }
176
+ export function setupNodePart({ index }, comment, ctx, text, nodes) {
177
+ const part = SyncPartsInternal.makeNodePart(index, comment, ctx.document, text, nodes);
178
+ const renderable = ctx.values[index];
179
+ return matchSyncPart(renderable, ctx, part);
180
+ }
181
+ export function setupPropertyPart({ index, name }, element, ctx, renderable) {
182
+ const part = SyncPartsInternal.makePropertyPart(name, index, element);
183
+ return matchSyncPart(renderable, ctx, part);
184
+ }
185
+ export function setupRefPart({ index }, element, ctx) {
186
+ const renderable = ctx.values[index];
187
+ if (isNullOrUndefined(renderable))
188
+ return null;
189
+ else if (isDirective(renderable)) {
190
+ return renderable(new RefPartImpl(ElementSource.fromElement(element), index));
191
+ }
192
+ else if (ElementRef.isElementRef(renderable)) {
193
+ // TODO: We need to enable only setting these values once the Template has been rendered into the DOM
194
+ return ElementRef.set(renderable, element);
195
+ }
196
+ else {
197
+ return null;
198
+ }
199
+ }
200
+ export function setupPropertiesPart({ index }, element, ctx) {
201
+ const renderable = ctx.values[index];
202
+ if (renderable && typeof renderable === "object") {
203
+ const effects = [];
204
+ const addEffect = (effect) => {
205
+ if (isNullOrUndefined(effect))
206
+ return;
207
+ effects.push(effect);
208
+ };
209
+ for (const [key, value] of Object.entries(renderable)) {
210
+ const [type, name] = keyToPartType(key);
211
+ const index = ++ctx.spreadIndex;
212
+ switch (type) {
213
+ case "attr":
214
+ addEffect(setupAttrPart({ index, name }, element, ctx, value));
215
+ break;
216
+ case "boolean":
217
+ addEffect(setupBooleanPart({ index, name }, element, ctx, value));
218
+ break;
219
+ case "class":
220
+ addEffect(setupClassNamePart({ index }, element, ctx, value));
221
+ break;
222
+ case "data":
223
+ addEffect(setupDataPart({ index }, element, ctx, value));
224
+ break;
225
+ case "event":
226
+ addEffect(setupEventPart({ index, name }, element, ctx, value));
227
+ break;
228
+ case "property":
229
+ addEffect(setupPropertyPart({ index, name }, element, ctx, value));
230
+ break;
231
+ }
232
+ }
233
+ return Effect.all(effects, { concurrency: "unbounded" });
234
+ }
235
+ return null;
236
+ }
237
+ export function setupSparseAttrPart({ name, nodes }, element, ctx) {
238
+ ctx.expected++;
239
+ const attr = element.getAttributeNode(name) ?? ctx.document.createAttribute(name);
240
+ const index = nodes.find((n) => n._tag === "attr").index;
241
+ return SyncPartsInternal.handleSparseAttribute(element, attr, nodes, ctx.values, (f) => Effect.zipRight(ctx.queue.add(attr, f, DEFAULT_PRIORITY), ctx.refCounter.release(index)));
242
+ }
243
+ export function setupSparseClassNamePart({ nodes }, element, ctx) {
244
+ ctx.expected++;
245
+ const index = nodes.find((n) => n._tag === "className-part").index;
246
+ return SyncPartsInternal.handleSparseClassName(element, nodes, ctx.values, (f) => Effect.zipRight(ctx.queue.add(element.classList, f, DEFAULT_PRIORITY), ctx.refCounter.release(index)));
247
+ }
248
+ export function setupSparseCommentPart({ nodes }, comment, ctx) {
249
+ ctx.expected++;
250
+ const index = nodes.find((n) => n._tag === "comment-part").index;
251
+ return SyncPartsInternal.handleSparseComment(comment, nodes, ctx.values, (f) => Effect.zipRight(ctx.queue.add(comment, f, DEFAULT_PRIORITY), ctx.refCounter.release(index)));
252
+ }
253
+ export function setupTextPart({ index }, comment, ctx) {
254
+ const text = comment.previousSibling
255
+ ? SyncPartsInternal.getPreviousTextSibling(comment.previousSibling) ?? createText(ctx.document, comment)
256
+ : createText(ctx.document, comment);
257
+ const part = SyncPartsInternal.makeTextPart(index, text);
258
+ const renderable = ctx.values[index];
259
+ return matchSyncPart(renderable, ctx, part);
260
+ }
261
+ function createText(document, comment) {
262
+ const text = document.createTextNode("");
263
+ comment.parentNode.insertBefore(text, comment);
264
+ return text;
265
+ }
266
+ export function matchSyncPart(renderable, ctx, syncPart) {
267
+ return matchRenderable(renderable, ctx, {
268
+ Fx: (fx) => fx.run(Fx.Sink.make(ctx.onCause, (value) => runSyncUpdate(syncPart, value, ctx))),
269
+ Effect: (effect) => Effect.flatMap(effect, (value) => runSyncUpdate(syncPart, value, ctx)),
270
+ Directive: (directive) => directive(syncPartToPart(syncPart, ({ value }) => runSyncUpdate(syncPart, value, ctx))),
271
+ Otherwise: (value) => {
272
+ syncPart.update(value);
273
+ return null;
274
+ }
275
+ });
276
+ }
277
+ function unwrapRenderable(renderable) {
278
+ switch (typeof renderable) {
279
+ case "undefined":
280
+ case "object": {
281
+ if (renderable === null || renderable === undefined)
282
+ return Fx.succeed(null);
283
+ else if (Array.isArray(renderable)) {
284
+ return renderable.length === 0
285
+ ? Fx.succeed(null)
286
+ // TODO: We need to ensure the ordering of these values in server environments
287
+ : Fx.map(Fx.tuple(renderable.map(unwrapRenderable)), (xs) => xs.flat());
288
+ }
289
+ else if (Fx.TypeId in renderable) {
290
+ return renderable;
291
+ }
292
+ else if (Effect.EffectTypeId in renderable) {
293
+ return Fx.fromFxEffect(Effect.map(renderable, (unwrapRenderable)));
294
+ }
295
+ else
296
+ return Fx.succeed(renderable);
297
+ }
298
+ default:
299
+ return Fx.succeed(renderable);
300
+ }
301
+ }
302
+ export function runSyncUpdate(syncPart, value, ctx) {
303
+ return Effect.zipRight(ctx.queue.add(syncPart, () => syncPart.update(value), DEFAULT_PRIORITY), ctx.refCounter.release(syncPart.index));
304
+ }
305
+ export function matchRenderable(renderable, ctx, matches) {
306
+ if (Fx.isFx(renderable)) {
307
+ ctx.expected++;
308
+ return matches.Fx(renderable);
309
+ }
310
+ else if (Effect.isEffect(renderable)) {
311
+ ctx.expected++;
312
+ return matches.Effect(renderable);
313
+ }
314
+ else if (isDirective(renderable)) {
315
+ ctx.expected++;
316
+ return matches.Directive(renderable);
317
+ }
318
+ else if (Array.isArray(renderable)) {
319
+ return matches.Fx(unwrapRenderable(renderable));
320
+ }
321
+ else {
322
+ return matches.Otherwise(renderable);
323
+ }
324
+ }
325
+ export function attachRoot(cache, where, what // TODO: Should we support HTML RenderEvents here too?,
326
+ ) {
327
+ return Effect.sync(() => {
328
+ const wire = what?.valueOf();
329
+ const previous = cache.get(where);
330
+ if (wire !== previous) {
331
+ if (previous && !wire)
332
+ removeChildren(where, previous);
333
+ cache.set(where, wire || null);
334
+ if (wire)
335
+ replaceChildren(where, wire);
336
+ return wire;
337
+ }
338
+ return previous;
339
+ });
340
+ }
341
+ export function removeChildren(where, previous) {
342
+ for (const node of getNodes(previous)) {
343
+ where.removeChild(node);
344
+ }
345
+ }
346
+ export function replaceChildren(where, wire) {
347
+ where.replaceChildren(...getNodes(wire));
348
+ }
349
+ export function getNodes(rendered) {
350
+ const value = rendered.valueOf();
351
+ return Array.isArray(value) ? value : [value];
352
+ }
353
+ //# sourceMappingURL=render.js.map