@typed/template 0.1.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 (285) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/cjs/Directive.js +76 -0
  4. package/dist/cjs/Directive.js.map +1 -0
  5. package/dist/cjs/ElementRef.js +83 -0
  6. package/dist/cjs/ElementRef.js.map +1 -0
  7. package/dist/cjs/ElementSource.js +244 -0
  8. package/dist/cjs/ElementSource.js.map +1 -0
  9. package/dist/cjs/Entry.js +6 -0
  10. package/dist/cjs/Entry.js.map +1 -0
  11. package/dist/cjs/EventHandler.js +65 -0
  12. package/dist/cjs/EventHandler.js.map +1 -0
  13. package/dist/cjs/Html.js +169 -0
  14. package/dist/cjs/Html.js.map +1 -0
  15. package/dist/cjs/HtmlChunk.js +257 -0
  16. package/dist/cjs/HtmlChunk.js.map +1 -0
  17. package/dist/cjs/Hydrate.js +49 -0
  18. package/dist/cjs/Hydrate.js.map +1 -0
  19. package/dist/cjs/Many.js +45 -0
  20. package/dist/cjs/Many.js.map +1 -0
  21. package/dist/cjs/Meta.js +37 -0
  22. package/dist/cjs/Meta.js.map +1 -0
  23. package/dist/cjs/Parser.js +331 -0
  24. package/dist/cjs/Parser.js.map +1 -0
  25. package/dist/cjs/Part.js +6 -0
  26. package/dist/cjs/Part.js.map +1 -0
  27. package/dist/cjs/Placeholder.js +38 -0
  28. package/dist/cjs/Placeholder.js.map +1 -0
  29. package/dist/cjs/Platform.js +64 -0
  30. package/dist/cjs/Platform.js.map +1 -0
  31. package/dist/cjs/Render.js +39 -0
  32. package/dist/cjs/Render.js.map +1 -0
  33. package/dist/cjs/RenderContext.js +130 -0
  34. package/dist/cjs/RenderContext.js.map +1 -0
  35. package/dist/cjs/RenderEvent.js +44 -0
  36. package/dist/cjs/RenderEvent.js.map +1 -0
  37. package/dist/cjs/RenderTemplate.js +41 -0
  38. package/dist/cjs/RenderTemplate.js.map +1 -0
  39. package/dist/cjs/Renderable.js +6 -0
  40. package/dist/cjs/Renderable.js.map +1 -0
  41. package/dist/cjs/Template.js +266 -0
  42. package/dist/cjs/Template.js.map +1 -0
  43. package/dist/cjs/TemplateInstance.js +51 -0
  44. package/dist/cjs/TemplateInstance.js.map +1 -0
  45. package/dist/cjs/Test.js +90 -0
  46. package/dist/cjs/Test.js.map +1 -0
  47. package/dist/cjs/Token.js +270 -0
  48. package/dist/cjs/Token.js.map +1 -0
  49. package/dist/cjs/Tokenizer.js +18 -0
  50. package/dist/cjs/Tokenizer.js.map +1 -0
  51. package/dist/cjs/Vitest.js +44 -0
  52. package/dist/cjs/Vitest.js.map +1 -0
  53. package/dist/cjs/index.js +147 -0
  54. package/dist/cjs/index.js.map +1 -0
  55. package/dist/cjs/internal/HydrateContext.js +13 -0
  56. package/dist/cjs/internal/HydrateContext.js.map +1 -0
  57. package/dist/cjs/internal/browser.js +109 -0
  58. package/dist/cjs/internal/browser.js.map +1 -0
  59. package/dist/cjs/internal/chunks.js +54 -0
  60. package/dist/cjs/internal/chunks.js.map +1 -0
  61. package/dist/cjs/internal/errors.js +23 -0
  62. package/dist/cjs/internal/errors.js.map +1 -0
  63. package/dist/cjs/internal/hydrate.js +197 -0
  64. package/dist/cjs/internal/hydrate.js.map +1 -0
  65. package/dist/cjs/internal/indexRefCounter.js +32 -0
  66. package/dist/cjs/internal/indexRefCounter.js.map +1 -0
  67. package/dist/cjs/internal/module-augmentation.js +6 -0
  68. package/dist/cjs/internal/module-augmentation.js.map +1 -0
  69. package/dist/cjs/internal/parser.js +492 -0
  70. package/dist/cjs/internal/parser.js.map +1 -0
  71. package/dist/cjs/internal/parts.js +350 -0
  72. package/dist/cjs/internal/parts.js.map +1 -0
  73. package/dist/cjs/internal/readAttribute.js +34 -0
  74. package/dist/cjs/internal/readAttribute.js.map +1 -0
  75. package/dist/cjs/internal/render.js +332 -0
  76. package/dist/cjs/internal/render.js.map +1 -0
  77. package/dist/cjs/internal/server.js +219 -0
  78. package/dist/cjs/internal/server.js.map +1 -0
  79. package/dist/cjs/internal/tokenizer.js +264 -0
  80. package/dist/cjs/internal/tokenizer.js.map +1 -0
  81. package/dist/cjs/internal/utils.js +68 -0
  82. package/dist/cjs/internal/utils.js.map +1 -0
  83. package/dist/dts/Directive.d.ts +70 -0
  84. package/dist/dts/Directive.d.ts.map +1 -0
  85. package/dist/dts/ElementRef.d.ts +40 -0
  86. package/dist/dts/ElementRef.d.ts.map +1 -0
  87. package/dist/dts/ElementSource.d.ts +72 -0
  88. package/dist/dts/ElementSource.d.ts.map +1 -0
  89. package/dist/dts/Entry.d.ts +26 -0
  90. package/dist/dts/Entry.d.ts.map +1 -0
  91. package/dist/dts/EventHandler.d.ts +61 -0
  92. package/dist/dts/EventHandler.d.ts.map +1 -0
  93. package/dist/dts/Html.d.ts +17 -0
  94. package/dist/dts/Html.d.ts.map +1 -0
  95. package/dist/dts/HtmlChunk.d.ts +56 -0
  96. package/dist/dts/HtmlChunk.d.ts.map +1 -0
  97. package/dist/dts/Hydrate.d.ts +20 -0
  98. package/dist/dts/Hydrate.d.ts.map +1 -0
  99. package/dist/dts/Many.d.ts +32 -0
  100. package/dist/dts/Many.d.ts.map +1 -0
  101. package/dist/dts/Meta.d.ts +24 -0
  102. package/dist/dts/Meta.d.ts.map +1 -0
  103. package/dist/dts/Parser.d.ts +16 -0
  104. package/dist/dts/Parser.d.ts.map +1 -0
  105. package/dist/dts/Part.d.ts +147 -0
  106. package/dist/dts/Part.d.ts.map +1 -0
  107. package/dist/dts/Placeholder.d.ts +51 -0
  108. package/dist/dts/Placeholder.d.ts.map +1 -0
  109. package/dist/dts/Platform.d.ts +23 -0
  110. package/dist/dts/Platform.d.ts.map +1 -0
  111. package/dist/dts/Render.d.ts +23 -0
  112. package/dist/dts/Render.d.ts.map +1 -0
  113. package/dist/dts/RenderContext.d.ts +88 -0
  114. package/dist/dts/RenderContext.d.ts.map +1 -0
  115. package/dist/dts/RenderEvent.d.ts +37 -0
  116. package/dist/dts/RenderEvent.d.ts.map +1 -0
  117. package/dist/dts/RenderTemplate.d.ts +38 -0
  118. package/dist/dts/RenderTemplate.d.ts.map +1 -0
  119. package/dist/dts/Renderable.d.ts +28 -0
  120. package/dist/dts/Renderable.d.ts.map +1 -0
  121. package/dist/dts/Template.d.ts +218 -0
  122. package/dist/dts/Template.d.ts.map +1 -0
  123. package/dist/dts/TemplateInstance.d.ts +32 -0
  124. package/dist/dts/TemplateInstance.d.ts.map +1 -0
  125. package/dist/dts/Test.d.ts +58 -0
  126. package/dist/dts/Test.d.ts.map +1 -0
  127. package/dist/dts/Token.d.ts +202 -0
  128. package/dist/dts/Token.d.ts.map +1 -0
  129. package/dist/dts/Tokenizer.d.ts +6 -0
  130. package/dist/dts/Tokenizer.d.ts.map +1 -0
  131. package/dist/dts/Vitest.d.ts +28 -0
  132. package/dist/dts/Vitest.d.ts.map +1 -0
  133. package/dist/dts/index.d.ts +65 -0
  134. package/dist/dts/index.d.ts.map +1 -0
  135. package/dist/dts/internal/HydrateContext.d.ts +2 -0
  136. package/dist/dts/internal/HydrateContext.d.ts.map +1 -0
  137. package/dist/dts/internal/browser.d.ts +8 -0
  138. package/dist/dts/internal/browser.d.ts.map +1 -0
  139. package/dist/dts/internal/chunks.d.ts +22 -0
  140. package/dist/dts/internal/chunks.d.ts.map +1 -0
  141. package/dist/dts/internal/errors.d.ts +9 -0
  142. package/dist/dts/internal/errors.d.ts.map +1 -0
  143. package/dist/dts/internal/hydrate.d.ts +37 -0
  144. package/dist/dts/internal/hydrate.d.ts.map +1 -0
  145. package/dist/dts/internal/indexRefCounter.d.ts +6 -0
  146. package/dist/dts/internal/indexRefCounter.d.ts.map +1 -0
  147. package/dist/dts/internal/module-augmentation.d.ts +36 -0
  148. package/dist/dts/internal/module-augmentation.d.ts.map +1 -0
  149. package/dist/dts/internal/parser.d.ts +12 -0
  150. package/dist/dts/internal/parser.d.ts.map +1 -0
  151. package/dist/dts/internal/parts.d.ts +304 -0
  152. package/dist/dts/internal/parts.d.ts.map +1 -0
  153. package/dist/dts/internal/readAttribute.d.ts +9 -0
  154. package/dist/dts/internal/readAttribute.d.ts.map +1 -0
  155. package/dist/dts/internal/render.d.ts +30 -0
  156. package/dist/dts/internal/render.d.ts.map +1 -0
  157. package/dist/dts/internal/server.d.ts +31 -0
  158. package/dist/dts/internal/server.d.ts.map +1 -0
  159. package/dist/dts/internal/tokenizer.d.ts +3 -0
  160. package/dist/dts/internal/tokenizer.d.ts.map +1 -0
  161. package/dist/dts/internal/utils.d.ts +15 -0
  162. package/dist/dts/internal/utils.d.ts.map +1 -0
  163. package/dist/esm/Directive.js +64 -0
  164. package/dist/esm/Directive.js.map +1 -0
  165. package/dist/esm/ElementRef.js +72 -0
  166. package/dist/esm/ElementRef.js.map +1 -0
  167. package/dist/esm/ElementSource.js +237 -0
  168. package/dist/esm/ElementSource.js.map +1 -0
  169. package/dist/esm/Entry.js +2 -0
  170. package/dist/esm/Entry.js.map +1 -0
  171. package/dist/esm/EventHandler.js +52 -0
  172. package/dist/esm/EventHandler.js.map +1 -0
  173. package/dist/esm/Html.js +167 -0
  174. package/dist/esm/Html.js.map +1 -0
  175. package/dist/esm/HtmlChunk.js +274 -0
  176. package/dist/esm/HtmlChunk.js.map +1 -0
  177. package/dist/esm/Hydrate.js +37 -0
  178. package/dist/esm/Hydrate.js.map +1 -0
  179. package/dist/esm/Many.js +33 -0
  180. package/dist/esm/Many.js.map +1 -0
  181. package/dist/esm/Meta.js +29 -0
  182. package/dist/esm/Meta.js.map +1 -0
  183. package/dist/esm/Parser.js +342 -0
  184. package/dist/esm/Parser.js.map +1 -0
  185. package/dist/esm/Part.js +5 -0
  186. package/dist/esm/Part.js.map +1 -0
  187. package/dist/esm/Placeholder.js +30 -0
  188. package/dist/esm/Placeholder.js.map +1 -0
  189. package/dist/esm/Platform.js +41 -0
  190. package/dist/esm/Platform.js.map +1 -0
  191. package/dist/esm/Render.js +27 -0
  192. package/dist/esm/Render.js.map +1 -0
  193. package/dist/esm/RenderContext.js +113 -0
  194. package/dist/esm/RenderContext.js.map +1 -0
  195. package/dist/esm/RenderEvent.js +36 -0
  196. package/dist/esm/RenderEvent.js.map +1 -0
  197. package/dist/esm/RenderTemplate.js +26 -0
  198. package/dist/esm/RenderTemplate.js.map +1 -0
  199. package/dist/esm/Renderable.js +2 -0
  200. package/dist/esm/Renderable.js.map +1 -0
  201. package/dist/esm/Template.js +239 -0
  202. package/dist/esm/Template.js.map +1 -0
  203. package/dist/esm/TemplateInstance.js +43 -0
  204. package/dist/esm/TemplateInstance.js.map +1 -0
  205. package/dist/esm/Test.js +68 -0
  206. package/dist/esm/Test.js.map +1 -0
  207. package/dist/esm/Token.js +264 -0
  208. package/dist/esm/Token.js.map +1 -0
  209. package/dist/esm/Tokenizer.js +9 -0
  210. package/dist/esm/Tokenizer.js.map +1 -0
  211. package/dist/esm/Vitest.js +29 -0
  212. package/dist/esm/Vitest.js.map +1 -0
  213. package/dist/esm/index.js +65 -0
  214. package/dist/esm/index.js.map +1 -0
  215. package/dist/esm/internal/HydrateContext.js +7 -0
  216. package/dist/esm/internal/HydrateContext.js.map +1 -0
  217. package/dist/esm/internal/browser.js +102 -0
  218. package/dist/esm/internal/browser.js.map +1 -0
  219. package/dist/esm/internal/chunks.js +47 -0
  220. package/dist/esm/internal/chunks.js.map +1 -0
  221. package/dist/esm/internal/errors.js +15 -0
  222. package/dist/esm/internal/errors.js.map +1 -0
  223. package/dist/esm/internal/hydrate.js +165 -0
  224. package/dist/esm/internal/hydrate.js.map +1 -0
  225. package/dist/esm/internal/indexRefCounter.js +24 -0
  226. package/dist/esm/internal/indexRefCounter.js.map +1 -0
  227. package/dist/esm/internal/module-augmentation.js +2 -0
  228. package/dist/esm/internal/module-augmentation.js.map +1 -0
  229. package/dist/esm/internal/parser.js +493 -0
  230. package/dist/esm/internal/parser.js.map +1 -0
  231. package/dist/esm/internal/parts.js +291 -0
  232. package/dist/esm/internal/parts.js.map +1 -0
  233. package/dist/esm/internal/readAttribute.js +24 -0
  234. package/dist/esm/internal/readAttribute.js.map +1 -0
  235. package/dist/esm/internal/render.js +329 -0
  236. package/dist/esm/internal/render.js.map +1 -0
  237. package/dist/esm/internal/server.js +174 -0
  238. package/dist/esm/internal/server.js.map +1 -0
  239. package/dist/esm/internal/tokenizer.js +296 -0
  240. package/dist/esm/internal/tokenizer.js.map +1 -0
  241. package/dist/esm/internal/utils.js +52 -0
  242. package/dist/esm/internal/utils.js.map +1 -0
  243. package/dist/esm/package.json +4 -0
  244. package/package.json +242 -0
  245. package/src/Directive.ts +114 -0
  246. package/src/ElementRef.ts +123 -0
  247. package/src/ElementSource.ts +417 -0
  248. package/src/Entry.ts +28 -0
  249. package/src/EventHandler.ts +104 -0
  250. package/src/Html.ts +258 -0
  251. package/src/HtmlChunk.ts +346 -0
  252. package/src/Hydrate.ts +53 -0
  253. package/src/Many.ts +128 -0
  254. package/src/Meta.ts +32 -0
  255. package/src/Parser.ts +457 -0
  256. package/src/Part.ts +186 -0
  257. package/src/Placeholder.ts +70 -0
  258. package/src/Platform.ts +71 -0
  259. package/src/Render.ts +45 -0
  260. package/src/RenderContext.ts +221 -0
  261. package/src/RenderEvent.ts +67 -0
  262. package/src/RenderTemplate.ts +88 -0
  263. package/src/Renderable.ts +34 -0
  264. package/src/Template.ts +284 -0
  265. package/src/TemplateInstance.ts +83 -0
  266. package/src/Test.ts +151 -0
  267. package/src/Token.ts +269 -0
  268. package/src/Tokenizer.ts +10 -0
  269. package/src/Vitest.ts +61 -0
  270. package/src/index.ts +66 -0
  271. package/src/internal/HydrateContext.ts +23 -0
  272. package/src/internal/browser.ts +132 -0
  273. package/src/internal/chunks.ts +73 -0
  274. package/src/internal/errors.ts +11 -0
  275. package/src/internal/external.d.ts +11 -0
  276. package/src/internal/hydrate.ts +262 -0
  277. package/src/internal/indexRefCounter.ts +33 -0
  278. package/src/internal/module-augmentation.ts +48 -0
  279. package/src/internal/parser.ts +637 -0
  280. package/src/internal/parts.ts +527 -0
  281. package/src/internal/readAttribute.ts +28 -0
  282. package/src/internal/render.ts +529 -0
  283. package/src/internal/server.ts +293 -0
  284. package/src/internal/tokenizer.ts +338 -0
  285. package/src/internal/utils.ts +73 -0
@@ -0,0 +1,291 @@
1
+ import * as Fx from "@typed/fx/Fx";
2
+ import { WithContext } from "@typed/fx/Sink";
3
+ import { isText } from "@typed/wire";
4
+ import * as Effect from "effect/Effect";
5
+ import { equals } from "effect/Equal";
6
+ import { strict } from "effect/Equivalence";
7
+ import * as Fiber from "effect/Fiber";
8
+ import * as ReadonlyArray from "effect/ReadonlyArray";
9
+ import * as SynchronizedRef from "effect/SynchronizedRef";
10
+ import { unescape } from "../HtmlChunk";
11
+ import { findHoleComment } from "./utils";
12
+ const strictEq = strict();
13
+ const base = (tag) => class Base {
14
+ index;
15
+ commit;
16
+ value;
17
+ eq;
18
+ _tag = tag;
19
+ constructor(index, commit, value, eq = equals) {
20
+ this.index = index;
21
+ this.commit = commit;
22
+ this.value = value;
23
+ this.eq = eq;
24
+ this.update = this.update.bind(this);
25
+ }
26
+ update(input) {
27
+ const previous = this.value;
28
+ const value = this.getValue(input);
29
+ if (this.eq(previous, value)) {
30
+ return Effect.unit;
31
+ }
32
+ return Effect.tap(this.commit.call(this, {
33
+ previous,
34
+ value,
35
+ part: this
36
+ }), () => Effect.sync(() => this.value = value));
37
+ }
38
+ getValue(value) {
39
+ return value;
40
+ }
41
+ };
42
+ export class AttributePartImpl extends base("attribute") {
43
+ name;
44
+ constructor(name, index, commit, value) {
45
+ super(index, commit, value, strictEq);
46
+ this.name = name;
47
+ }
48
+ static browser(index, element, name, context) {
49
+ return new AttributePartImpl(name, index, ({ part, value }) => context.queue.add(part, () => value == null ? element.removeAttribute(name) : element.setAttribute(name, value)), element.getAttribute(name));
50
+ }
51
+ static server(name, index, commit) {
52
+ return new AttributePartImpl(name, index, commit, null);
53
+ }
54
+ }
55
+ export class BooleanPartImpl extends base("boolean") {
56
+ name;
57
+ constructor(name, index, commit, value) {
58
+ super(index, commit, value, strictEq);
59
+ this.name = name;
60
+ }
61
+ static browser(index, element, name, context) {
62
+ return new BooleanPartImpl(name, index, ({ part, value }) => context.queue.add(part, () => element.toggleAttribute(name, value === true)), element.hasAttribute(name));
63
+ }
64
+ static server(name, index, commit) {
65
+ return new BooleanPartImpl(name, index, commit, null);
66
+ }
67
+ }
68
+ const isString = (x) => typeof x === "string";
69
+ export class ClassNamePartImpl extends base("className") {
70
+ constructor(index, commit, value) {
71
+ super(index, commit, value, strictEq);
72
+ }
73
+ getValue(value) {
74
+ if (isString(value)) {
75
+ return value.split(" ").filter((x) => isString(x) && x.trim() !== "");
76
+ }
77
+ if (Array.isArray(value)) {
78
+ return value.filter((x) => isString(x) && x.trim() !== "");
79
+ }
80
+ return [];
81
+ }
82
+ static browser(index, element, context) {
83
+ return new ClassNamePartImpl(index, ({ part, previous, value }) => context.queue.add(part, () => {
84
+ const { added, removed } = diffStrings(previous, value);
85
+ element.classList.add(...added);
86
+ element.classList.remove(...removed);
87
+ }), Array.from(element.classList));
88
+ }
89
+ static server(index, commit) {
90
+ return new ClassNamePartImpl(index, commit, null);
91
+ }
92
+ }
93
+ function diffStrings(previous, current) {
94
+ if (previous == null || previous.length === 0) {
95
+ return {
96
+ added: current || [],
97
+ removed: [],
98
+ unchanged: []
99
+ };
100
+ }
101
+ else if (current == null || current.length === 0) {
102
+ return {
103
+ added: [],
104
+ removed: previous,
105
+ unchanged: []
106
+ };
107
+ }
108
+ else {
109
+ const added = current.filter((c) => !previous.includes(c));
110
+ const removed = [];
111
+ const unchanged = [];
112
+ for (let i = 0; i < previous.length; ++i) {
113
+ if (current.includes(previous[i])) {
114
+ unchanged.push(previous[i]);
115
+ }
116
+ else {
117
+ removed.push(previous[i]);
118
+ }
119
+ }
120
+ return {
121
+ added,
122
+ removed,
123
+ unchanged
124
+ };
125
+ }
126
+ }
127
+ export class CommentPartImpl extends base("comment") {
128
+ static browser(index, comment, ctx) {
129
+ return new CommentPartImpl(index, ({ part, value }) => ctx.queue.add(part, () => comment.data = value || ""), comment.data, strictEq);
130
+ }
131
+ static server(index, commit) {
132
+ return new CommentPartImpl(index, commit, null);
133
+ }
134
+ }
135
+ export class DataPartImpl extends base("data") {
136
+ static browser(index, element, ctx) {
137
+ return new DataPartImpl(index, ({ part, previous, value }) => ctx.queue.add(part, () => {
138
+ const diff = diffDataSet(previous, value);
139
+ if (diff) {
140
+ const { added, removed } = diff;
141
+ removed.forEach((k) => delete element.dataset[k]);
142
+ added.forEach(([k, v]) => element.dataset[k] = v);
143
+ }
144
+ }), element.dataset);
145
+ }
146
+ static server(index, commit) {
147
+ return new DataPartImpl(index, commit, null);
148
+ }
149
+ }
150
+ function diffDataSet(a, b) {
151
+ if (!a)
152
+ return b ? { added: Object.entries(b), removed: [] } : null;
153
+ if (!b)
154
+ return { added: [], removed: Object.keys(a) };
155
+ const { added, removed, unchanged } = diffStrings(Object.keys(a), Object.keys(b));
156
+ return {
157
+ added: added.concat(unchanged).map((k) => [k, b[k]]),
158
+ removed
159
+ };
160
+ }
161
+ export class EventPartImpl extends base("event") {
162
+ name;
163
+ onCause;
164
+ constructor(name, onCause, index, commit, value) {
165
+ super(index, commit, value, strictEq);
166
+ this.name = name;
167
+ this.onCause = onCause;
168
+ }
169
+ static browser(name, index, ref, element, onCause) {
170
+ return withSwitchFork((fork, ctx) => {
171
+ const source = ref.query(element);
172
+ return Effect.succeed(new EventPartImpl(name, onCause, index, ({ value }) => {
173
+ return value
174
+ ? Fx.run(source.events(name, value.options), WithContext(onCause, value.handler)).pipe(Effect.provide(ctx), fork)
175
+ : fork(Effect.unit);
176
+ }, null));
177
+ });
178
+ }
179
+ }
180
+ function withScopedFork(f) {
181
+ return Effect.scopeWith((scope) => f(Effect.forkIn(scope)));
182
+ }
183
+ // Ensures only a single fiber is executing
184
+ function withSwitchFork(f) {
185
+ return Effect.contextWithEffect((ctx) => withScopedFork((fork) => Effect.flatMap(SynchronizedRef.make(Fiber.unit), (ref) => f((effect) => SynchronizedRef.updateAndGetEffect(ref, (fiber) => Effect.flatMap(Fiber.interrupt(fiber), () => fork(effect))), ctx))));
186
+ }
187
+ export class NodePartImpl extends base("node") {
188
+ }
189
+ export class PropertyPartImpl extends base("property") {
190
+ name;
191
+ constructor(name, index, commit, value) {
192
+ super(index, commit, value, strictEq);
193
+ this.name = name;
194
+ }
195
+ static browser(index, node, name, ctx) {
196
+ const existing = node.getAttribute(name);
197
+ return new PropertyPartImpl(name, index, ({ part, value }) => ctx.queue.add(part, () => node[name] = value), existing ? unescape(existing) : null);
198
+ }
199
+ }
200
+ export class RefPartImpl {
201
+ value;
202
+ index;
203
+ _tag = "ref";
204
+ constructor(value, index) {
205
+ this.value = value;
206
+ this.index = index;
207
+ }
208
+ }
209
+ export class TextPartImpl extends base("text") {
210
+ // TODO: Make this properly
211
+ static browser(document, index, element, ctx) {
212
+ const comment = findHoleComment(element, index);
213
+ const text = comment.previousSibling && isText(comment.previousSibling)
214
+ ? comment.previousSibling
215
+ : document.createTextNode("");
216
+ return new TextPartImpl(index, ({ part, value }) => ctx.queue.add(part, () => text.nodeValue = value ?? null), text.nodeValue, strictEq);
217
+ }
218
+ }
219
+ const sparse = (tag) => class Base {
220
+ commit;
221
+ value;
222
+ eq;
223
+ _tag = tag;
224
+ constructor(commit, value, eq = equals) {
225
+ this.commit = commit;
226
+ this.value = value;
227
+ this.eq = eq;
228
+ }
229
+ update = (value) => {
230
+ if (this.eq(this.value, value)) {
231
+ return Effect.unit;
232
+ }
233
+ return this.commit({
234
+ previous: this.value,
235
+ value: this.value = value,
236
+ part: this
237
+ });
238
+ };
239
+ };
240
+ export class SparseAttributePartImpl extends sparse("sparse/attribute") {
241
+ name;
242
+ parts;
243
+ constructor(name, parts, commit) {
244
+ super(commit, [], ReadonlyArray.getEquivalence(strictEq));
245
+ this.name = name;
246
+ this.parts = parts;
247
+ }
248
+ static browser(name, parts, element, ctx) {
249
+ return new SparseAttributePartImpl(name, parts, ({ part, value }) => ctx.queue.add(part, () => element.setAttribute(name, value.flatMap((s) => isNonEmptyString(s, true)).join(""))));
250
+ }
251
+ }
252
+ export class SparseClassNamePartImpl extends sparse("sparse/className") {
253
+ parts;
254
+ constructor(parts, commit, values) {
255
+ super(commit, values, ReadonlyArray.getEquivalence(strictEq));
256
+ this.parts = parts;
257
+ }
258
+ static browser(parts, element, ctx, values = []) {
259
+ return new SparseClassNamePartImpl(parts, ({ part, value }) => ctx.queue.add(part, () => {
260
+ return element.setAttribute("class", value.flatMap((s) => isNonEmptyString(s, true)).join(" "));
261
+ }), values);
262
+ }
263
+ }
264
+ export class SparseCommentPartImpl extends sparse("sparse/comment") {
265
+ parts;
266
+ constructor(parts, commit, value) {
267
+ super(commit, value, ReadonlyArray.getEquivalence(strictEq));
268
+ this.parts = parts;
269
+ }
270
+ static browser(comment, parts, ctx) {
271
+ return new SparseCommentPartImpl(parts, ({ part, value }) => ctx.queue.add(part, () => comment.nodeValue = value.flatMap((s) => isNonEmptyString(s, false)).join("")), []);
272
+ }
273
+ }
274
+ export class StaticTextImpl {
275
+ value;
276
+ _tag = "static/text";
277
+ constructor(value) {
278
+ this.value = value;
279
+ }
280
+ }
281
+ function isNonEmptyString(s, trim) {
282
+ if (s == null)
283
+ return [];
284
+ if (Array.isArray(s))
285
+ return s.flatMap((s) => isNonEmptyString(s, trim));
286
+ const trimmed = trim ? s.trim() : s;
287
+ if (trimmed.length === 0)
288
+ return [];
289
+ return [trimmed];
290
+ }
291
+ //# sourceMappingURL=parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.js","sourceRoot":"","sources":["../../../src/internal/parts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ const PATTERN = /(\s*([^>\s]*))/g;
2
+ const QUOTES = new Set(`"'`);
3
+ /**
4
+ * Extract an attribute from a chunk of text.
5
+ */
6
+ export default function readAttribute(text, pos) {
7
+ const quote = text.charAt(pos);
8
+ const pos1 = pos + 1;
9
+ if (QUOTES.has(quote)) {
10
+ const nextQuote = text.indexOf(quote, pos1);
11
+ if (nextQuote === -1) {
12
+ return null;
13
+ }
14
+ else {
15
+ return { length: nextQuote - pos + 1, value: text.substring(pos1, nextQuote) };
16
+ }
17
+ }
18
+ else {
19
+ PATTERN.lastIndex = pos;
20
+ const match = PATTERN.exec(text) || [];
21
+ return { length: match[1].length, value: match[2] };
22
+ }
23
+ }
24
+ //# sourceMappingURL=readAttribute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readAttribute.js","sourceRoot":"","sources":["../../../src/internal/readAttribute.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,iBAAiB,CAAA;AACjC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;AAO5B;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,IAAY,EAAE,GAAW;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC9B,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAA;IAEpB,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAC3C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAA;QACb,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAA;QAChF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,SAAS,GAAG,GAAG,CAAA;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QACtC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IACrD,CAAC;AACH,CAAC"}
@@ -0,0 +1,329 @@
1
+ import * as Fx from "@typed/fx/Fx";
2
+ import { makeSubject } from "@typed/fx/internal/core-subject";
3
+ import { TypeId } from "@typed/fx/TypeId";
4
+ import { persistent } from "@typed/wire";
5
+ import { Effect } from "effect";
6
+ import { replace } from "effect/ReadonlyArray";
7
+ import { isDirective } from "../Directive";
8
+ import * as ElementRef from "../ElementRef";
9
+ import * as EventHandler from "../EventHandler";
10
+ import { DomRenderEvent } from "../RenderEvent";
11
+ import { TemplateInstance } from "../TemplateInstance";
12
+ import { makeRenderNodePart } from "./browser";
13
+ import { HydrateContext } from "./HydrateContext";
14
+ import { indexRefCounter } from "./indexRefCounter";
15
+ import { parse } from "./parser";
16
+ import { AttributePartImpl, BooleanPartImpl, ClassNamePartImpl, CommentPartImpl, DataPartImpl, EventPartImpl, PropertyPartImpl, RefPartImpl, SparseAttributePartImpl, SparseClassNamePartImpl, SparseCommentPartImpl, StaticTextImpl, TextPartImpl } from "./parts";
17
+ import { findPath } from "./utils";
18
+ /**
19
+ * Here for "standard" browser rendering, a TemplateInstance is effectively a live
20
+ * view into the contents rendered by the Template.
21
+ */
22
+ export const renderTemplate = (document, ctx) => (templateStrings, values, providedRef) => Effect.gen(function* (_) {
23
+ const elementRef = providedRef || (yield* _(ElementRef.make()));
24
+ const events = Fx.map(elementRef, DomRenderEvent);
25
+ const errors = makeSubject();
26
+ const entry = getBrowserEntry(document, ctx, templateStrings);
27
+ const content = document.importNode(entry.content, true); // Clone our template
28
+ const parts = yield* _(buildParts(document, ctx, entry.template, content, elementRef, errors.onFailure, false)); // Build runtime-variant of parts with our content.
29
+ // If there are parts we need to render them before constructing our Wire
30
+ if (parts.length > 0) {
31
+ const refCounter = yield* _(indexRefCounter(parts.length));
32
+ // Do the work
33
+ yield* _(renderValues(values, parts, refCounter, errors.onFailure));
34
+ // Wait for initial work to be completed
35
+ yield* _(refCounter.wait);
36
+ }
37
+ // Set the element when it is ready
38
+ yield* _(ElementRef.set(elementRef, persistent(content)));
39
+ // Return the Template instance
40
+ return TemplateInstance(Fx.merge([events, errors]), elementRef);
41
+ });
42
+ export function renderValues(values, parts, refCounter, onCause, makeHydrateContext) {
43
+ return Effect.all(parts.map((part, index) => {
44
+ switch (part._tag) {
45
+ case "sparse/attribute":
46
+ case "sparse/className":
47
+ case "sparse/comment": {
48
+ return renderSparsePart(values, part, refCounter);
49
+ }
50
+ default:
51
+ return renderPart(values, part, refCounter, onCause, makeHydrateContext ? () => makeHydrateContext(index) : undefined);
52
+ }
53
+ }));
54
+ }
55
+ export function renderSparsePart(values, part, refCounter) {
56
+ const indexes = part.parts.flatMap((p) => p._tag === "static/text" ? [] : [p.index]);
57
+ return Effect.forkScoped(Fx.observe(unwrapSparsePartRenderables(part.parts.map((p) => p._tag === "static/text" ? Fx.succeed(p.value) : values[p.index]), part), (value) => Effect.tap(part.update(value), () => Effect.forEach(indexes, (a) => refCounter.release(a)))));
58
+ }
59
+ export function renderPart(values, part, refCounter, onCause, hydrateCtx) {
60
+ const partIndex = part.index;
61
+ const renderable = values[partIndex];
62
+ if (isDirective(renderable)) {
63
+ return renderable(part).pipe(Effect.tap(() => refCounter.release(partIndex)), Effect.forkScoped);
64
+ }
65
+ else if (part._tag === "ref") {
66
+ return refCounter.release(partIndex);
67
+ }
68
+ else if (part._tag === "event") {
69
+ return Effect.tap(part.update(getEventHandler(values[partIndex], onCause)), () => refCounter.release(partIndex));
70
+ }
71
+ else if (part._tag === "node" && hydrateCtx) {
72
+ if (renderable === null || renderable === undefined)
73
+ return refCounter.release(partIndex);
74
+ return handlePart(values[partIndex], (value) => Effect.tap(part.update(value), () => refCounter.release(partIndex))).pipe(HydrateContext.provide(hydrateCtx()), Effect.forkScoped);
75
+ }
76
+ else {
77
+ const renderable = values[partIndex];
78
+ if (renderable === null || renderable === undefined)
79
+ return refCounter.release(partIndex);
80
+ return handlePart(values[partIndex], (value) => Effect.tap(part.update(value), () => refCounter.release(partIndex)));
81
+ }
82
+ }
83
+ function getEventHandler(renderable, onCause) {
84
+ if (renderable && typeof renderable === "object") {
85
+ if (EventHandler.EventHandlerTypeId in renderable) {
86
+ return EventHandler.make((ev) => Effect.catchAllCause(renderable.handler(ev), onCause), renderable.options);
87
+ }
88
+ else if (Effect.EffectTypeId in renderable) {
89
+ return EventHandler.make(() => Effect.catchAllCause(renderable, onCause));
90
+ }
91
+ }
92
+ return null;
93
+ }
94
+ function handlePart(renderable, update) {
95
+ switch (typeof renderable) {
96
+ case "undefined":
97
+ case "object": {
98
+ if (renderable === null || renderable === undefined)
99
+ return update(null);
100
+ else if (Array.isArray(renderable)) {
101
+ return renderable.length === 0
102
+ ? update(null)
103
+ : Effect.forkScoped(Fx.observe(Fx.combine(renderable.map(unwrapRenderable)), update));
104
+ }
105
+ else if (TypeId in renderable) {
106
+ return Effect.forkScoped(Fx.observe(renderable, update));
107
+ }
108
+ else if (Effect.EffectTypeId in renderable) {
109
+ return Effect.flatMap(renderable, update);
110
+ }
111
+ else
112
+ return update(renderable);
113
+ }
114
+ default:
115
+ return update(renderable);
116
+ }
117
+ }
118
+ function unwrapRenderable(renderable) {
119
+ switch (typeof renderable) {
120
+ case "undefined":
121
+ case "object": {
122
+ if (renderable === null || renderable === undefined)
123
+ return Fx.succeed(null);
124
+ else if (Array.isArray(renderable)) {
125
+ return renderable.length === 0 ? Fx.succeed(null) : Fx.combine(renderable.map(unwrapRenderable));
126
+ }
127
+ else if (TypeId in renderable) {
128
+ return renderable;
129
+ }
130
+ else if (Effect.EffectTypeId in renderable) {
131
+ return Fx.fromFxEffect(Effect.map(renderable, (unwrapRenderable)));
132
+ }
133
+ else
134
+ return Fx.succeed(renderable);
135
+ }
136
+ default:
137
+ return Fx.succeed(renderable);
138
+ }
139
+ }
140
+ function unwrapSparsePartRenderables(renderables, part) {
141
+ return Fx.combine(
142
+ // @ts-ignore type too deep
143
+ renderables.map((renderable, i) => {
144
+ const p = part.parts[i];
145
+ if (p._tag === "static/text") {
146
+ return Fx.succeed(p.value);
147
+ }
148
+ if (isDirective(renderable)) {
149
+ return Fx.fromEffect(Effect.map(renderable(p), () => p.value));
150
+ }
151
+ return Fx.mapEffect(unwrapRenderable(renderable), (u) => Effect.map(p.update(u), () => p.value));
152
+ }));
153
+ }
154
+ export function attachRoot(cache, where, what // TODO: Should we support HTML RenderEvents here too?
155
+ ) {
156
+ return Effect.sync(() => {
157
+ const wire = what?.valueOf();
158
+ const previous = cache.get(where);
159
+ if (wire !== previous) {
160
+ if (previous && !wire)
161
+ removeChildren(where, previous);
162
+ cache.set(where, wire || null);
163
+ if (wire)
164
+ replaceChildren(where, wire);
165
+ return wire;
166
+ }
167
+ return previous;
168
+ });
169
+ }
170
+ function removeChildren(where, previous) {
171
+ for (const node of getNodes(previous)) {
172
+ where.removeChild(node);
173
+ }
174
+ }
175
+ function replaceChildren(where, wire) {
176
+ where.replaceChildren(...getNodes(wire));
177
+ }
178
+ function getNodes(rendered) {
179
+ const value = rendered.valueOf();
180
+ return Array.isArray(value) ? value : [value];
181
+ }
182
+ export function getBrowserEntry(document, ctx, templateStrings) {
183
+ const cached = ctx.templateCache.get(templateStrings);
184
+ if (cached === undefined || cached._tag === "Server") {
185
+ const template = parse(templateStrings);
186
+ const content = buildTemplate(document, template);
187
+ const entry = {
188
+ _tag: "Browser",
189
+ template,
190
+ content
191
+ };
192
+ ctx.templateCache.set(templateStrings, entry);
193
+ return entry;
194
+ }
195
+ else {
196
+ return cached;
197
+ }
198
+ }
199
+ export function buildParts(document, ctx, template, content, ref, onCause, isHydrating) {
200
+ return Effect.all(template.parts.map(([part, path]) => buildPartWithNode(document, ctx, part, findPath(content, path), ref, onCause, isHydrating)));
201
+ }
202
+ function buildPartWithNode(document, ctx, part, node, ref, onCause, isHydrating) {
203
+ switch (part._tag) {
204
+ case "attr":
205
+ return Effect.succeed(AttributePartImpl.browser(part.index, node, part.name, ctx));
206
+ case "boolean-part":
207
+ return Effect.succeed(BooleanPartImpl.browser(part.index, node, part.name, ctx));
208
+ case "className-part":
209
+ return Effect.succeed(ClassNamePartImpl.browser(part.index, node, ctx));
210
+ case "comment-part":
211
+ return Effect.succeed(CommentPartImpl.browser(part.index, node, ctx));
212
+ case "data":
213
+ return Effect.succeed(DataPartImpl.browser(part.index, node, ctx));
214
+ case "event":
215
+ return EventPartImpl.browser(part.name, part.index, ref, node, onCause);
216
+ case "node":
217
+ return Effect.succeed(makeRenderNodePart(part.index, node, ctx, document, isHydrating));
218
+ case "property":
219
+ return Effect.succeed(PropertyPartImpl.browser(part.index, node, part.name, ctx));
220
+ case "ref":
221
+ return Effect.succeed(new RefPartImpl(ref.query(node), part.index));
222
+ case "sparse-attr": {
223
+ const parts = Array(part.nodes.length);
224
+ const sparse = SparseAttributePartImpl.browser(part.name, parts, node, ctx);
225
+ for (let i = 0; i < part.nodes.length; ++i) {
226
+ const node = part.nodes[i];
227
+ if (node._tag === "text") {
228
+ parts.push(new StaticTextImpl(node.value));
229
+ sparse.value[i] = node.value;
230
+ }
231
+ else {
232
+ parts.push(new AttributePartImpl(node.name, node.index, ({ value }) => sparse.update(replace(sparse.value, i, value || "")), sparse.value[i]));
233
+ }
234
+ }
235
+ return Effect.succeed(sparse);
236
+ }
237
+ case "sparse-class-name": {
238
+ const parts = [];
239
+ const values = []; // TODO: Do this for all other sparse attrs
240
+ const sparse = SparseClassNamePartImpl.browser(parts, node, ctx, values);
241
+ for (let i = 0; i < part.nodes.length; ++i) {
242
+ const node = part.nodes[i];
243
+ if (node._tag === "text") {
244
+ parts.push(new StaticTextImpl(node.value));
245
+ values.push(node.value);
246
+ }
247
+ else {
248
+ values.push([]);
249
+ parts.push(new ClassNamePartImpl(node.index, ({ value }) => sparse.update(replace(sparse.value, i, value || "")), []));
250
+ }
251
+ }
252
+ return Effect.succeed(sparse);
253
+ }
254
+ case "sparse-comment": {
255
+ const parts = Array(part.nodes.length);
256
+ const sparse = SparseCommentPartImpl.browser(node, parts, ctx);
257
+ for (let i = 0; i < part.nodes.length; ++i) {
258
+ const node = part.nodes[i];
259
+ if (node._tag === "text") {
260
+ parts.push(new StaticTextImpl(node.value));
261
+ sparse.value[i] = node.value;
262
+ }
263
+ else {
264
+ parts.push(new CommentPartImpl(node.index, ({ value }) => sparse.update(replace(sparse.value, i, value || "")), sparse.value[i]));
265
+ }
266
+ }
267
+ return Effect.succeed(sparse);
268
+ }
269
+ case "text-part":
270
+ return Effect.succeed(TextPartImpl.browser(document, part.index, node, ctx));
271
+ }
272
+ }
273
+ export function buildTemplate(document, { nodes }) {
274
+ const fragment = document.createDocumentFragment();
275
+ for (let i = 0; i < nodes.length; ++i) {
276
+ fragment.append(buildNode(document, nodes[i], false));
277
+ }
278
+ return fragment;
279
+ }
280
+ function buildNode(document, node, isSvgContext) {
281
+ switch (node._tag) {
282
+ case "element":
283
+ case "self-closing-element":
284
+ case "text-only-element":
285
+ return buildElement(document, node, isSvgContext);
286
+ case "text":
287
+ return document.createTextNode(node.value);
288
+ case "comment":
289
+ return document.createComment(node.value);
290
+ case "sparse-comment":
291
+ return document.createComment("");
292
+ // Create placeholders for these elements
293
+ case "comment-part":
294
+ case "node":
295
+ return document.createComment(`hole${node.index}`);
296
+ }
297
+ }
298
+ const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
299
+ function buildElement(document, node, isSvgContext) {
300
+ const { _tag, attributes, tagName } = node;
301
+ const isSvg = isSvgContext ? tagName !== "foreignObject" : tagName === "svg";
302
+ const element = isSvg
303
+ ? document.createElementNS(SVG_NAMESPACE, tagName)
304
+ : document.createElement(tagName);
305
+ for (let i = 0; i < attributes.length; ++i) {
306
+ const attr = attributes[i];
307
+ // We only handle static attributes here, parts are handled elsewhere
308
+ if (attr._tag === "attribute") {
309
+ element.setAttribute(attr.name, attr.value);
310
+ }
311
+ else if (attr._tag === "boolean") {
312
+ element.toggleAttribute(attr.name, true);
313
+ }
314
+ }
315
+ if (_tag === "element") {
316
+ element.append(...node.children.map((child) => buildNode(document, child, isSvg)));
317
+ }
318
+ else if (_tag === "text-only-element") {
319
+ element.append(...node.children.map((child) => buildTextChild(document, child)));
320
+ }
321
+ return element;
322
+ }
323
+ function buildTextChild(document, node) {
324
+ if (node._tag === "text") {
325
+ return document.createTextNode(node.value);
326
+ }
327
+ return document.createComment(`hole${node.index}`);
328
+ }
329
+ //# sourceMappingURL=render.js.map