@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
@@ -16,7 +16,34 @@ export class CouldNotFindManyCommentError extends Error {
16
16
  }
17
17
  }
18
18
 
19
- export function isHydrationError(e: unknown): e is CouldNotFindCommentError | CouldNotFindRootElement {
20
- return e instanceof CouldNotFindCommentError || e instanceof CouldNotFindRootElement ||
21
- e instanceof CouldNotFindManyCommentError
19
+ export class CouldNotFindTemplateHashError extends Error {
20
+ constructor(readonly hash: string) {
21
+ super(`Could not find template hash ${hash}`)
22
+ }
23
+ }
24
+
25
+ export class CouldNotFindTemplateEndError extends Error {
26
+ constructor(readonly hash: string) {
27
+ super(`Could not find end of template for hash ${hash}`)
28
+ }
29
+ }
30
+
31
+ const constructors: Array<Function> = [
32
+ CouldNotFindCommentError,
33
+ CouldNotFindRootElement,
34
+ CouldNotFindManyCommentError,
35
+ CouldNotFindTemplateHashError,
36
+ CouldNotFindTemplateEndError
37
+ ]
38
+
39
+ export function isHydrationError(
40
+ e: unknown
41
+ ): e is
42
+ | CouldNotFindCommentError
43
+ | CouldNotFindRootElement
44
+ | CouldNotFindManyCommentError
45
+ | CouldNotFindTemplateHashError
46
+ | CouldNotFindTemplateEndError
47
+ {
48
+ return constructors.some((c) => e instanceof c)
22
49
  }
@@ -3,36 +3,6 @@ import * as Effect from "effect/Effect"
3
3
  import * as Option from "effect/Option"
4
4
 
5
5
  export type IndexRefCounter = {
6
- release: (index: number) => Effect.Effect<void>
7
- wait: Effect.Effect<void>
8
- }
9
-
10
- /**
11
- * @internal
12
- */
13
- export function indexRefCounter(expected: number): Effect.Effect<IndexRefCounter> {
14
- return Effect.map(Deferred.make<void>(), (deferred) => {
15
- const done = Deferred.succeed(deferred, undefined)
16
- const indexes = new Set<number>(Array.from({ length: expected }, (_, i) => i))
17
-
18
- function release(index: number) {
19
- return Effect.suspend(() => {
20
- if (indexes.delete(index) && indexes.size === 0) {
21
- return done
22
- } else {
23
- return Effect.unit
24
- }
25
- })
26
- }
27
-
28
- return {
29
- release,
30
- wait: Deferred.await(deferred)
31
- }
32
- })
33
- }
34
-
35
- export type IndexRefCounter2 = {
36
6
  release: (index: number) => Effect.Effect<void>
37
7
  expect: (count: number) => Effect.Effect<boolean>
38
8
  wait: Effect.Effect<void>
@@ -41,46 +11,44 @@ export type IndexRefCounter2 = {
41
11
  /**
42
12
  * @internal
43
13
  */
44
- export function indexRefCounter2(): Effect.Effect<IndexRefCounter2> {
45
- return Effect.map(Deferred.make<void>(), (deferred) => {
46
- let expected: Option.Option<number> = Option.none<number>()
47
- const done = Deferred.succeed(deferred, undefined)
48
- const indexes = new Set<number>()
14
+ export const makeRefCounter: Effect.Effect<IndexRefCounter> = Effect.map(Deferred.make<void>(), (deferred) => {
15
+ let expected: Option.Option<number> = Option.none<number>()
16
+ const done = Deferred.succeed(deferred, undefined)
17
+ const indexes = new Set<number>()
18
+
19
+ function isDone() {
20
+ if (Option.isSome(expected)) {
21
+ return indexes.size === expected.value
22
+ } else {
23
+ return false
24
+ }
25
+ }
49
26
 
50
- function isDone() {
51
- if (Option.isSome(expected)) {
52
- return indexes.size === expected.value
27
+ function release(index: number) {
28
+ return Effect.suspend(() => {
29
+ indexes.add(index)
30
+ if (isDone()) {
31
+ return done
53
32
  } else {
54
- return false
33
+ return Effect.succeed(false)
55
34
  }
56
- }
57
-
58
- function release(index: number) {
59
- return Effect.suspend(() => {
60
- indexes.add(index)
61
- if (isDone()) {
62
- return done
63
- } else {
64
- return Effect.succeed(false)
65
- }
66
- })
67
- }
68
-
69
- function expect(count: number) {
70
- return Effect.suspend(() => {
71
- expected = Option.some(count)
72
- if (isDone()) {
73
- return Effect.as(done, false)
74
- } else {
75
- return Effect.succeed(true)
76
- }
77
- })
78
- }
79
-
80
- return {
81
- release,
82
- expect,
83
- wait: Deferred.await(deferred)
84
- }
85
- })
86
- }
35
+ })
36
+ }
37
+
38
+ function expect(count: number) {
39
+ return Effect.suspend(() => {
40
+ expected = Option.some(count)
41
+ if (isDone()) {
42
+ return Effect.as(done, false)
43
+ } else {
44
+ return Effect.succeed(true)
45
+ }
46
+ })
47
+ }
48
+
49
+ return {
50
+ release,
51
+ expect,
52
+ wait: Deferred.await(deferred)
53
+ }
54
+ })
@@ -2,6 +2,7 @@ import * as Chunk from "effect/Chunk"
2
2
  import { globalValue } from "effect/GlobalValue"
3
3
  import * as Option from "effect/Option"
4
4
  import * as Template from "../Template.js"
5
+ import { convertCharacterEntities } from "./character-entities.js"
5
6
  import type { TextChunk } from "./chunks.js"
6
7
  import {
7
8
  getClosingTagName,
@@ -132,7 +133,6 @@ const tagNameMatches = {
132
133
  const attributeMatches = {
133
134
  whitespace: isWhitespaceToken,
134
135
  equals: isEqualsToken,
135
- closingTag: isElementCloseToken,
136
136
  openTagEnd: isOpenTagEndToken,
137
137
  selfClosingTagEnd: isSelfClosingTagEndToken
138
138
  } satisfies Predicates
@@ -149,7 +149,7 @@ const textChildMatches = {
149
149
  elementClose: isElementCloseToken
150
150
  }
151
151
 
152
- class PathStack {
152
+ export class PathStack {
153
153
  chunk: Chunk.Chunk<number> = Chunk.empty()
154
154
  count = 0
155
155
 
@@ -168,6 +168,10 @@ class PathStack {
168
168
  }
169
169
 
170
170
  toChunk(): Chunk.Chunk<number> {
171
+ if (Chunk.isEmpty(this.chunk)) {
172
+ return Chunk.of(this.count)
173
+ }
174
+
171
175
  return Chunk.append(this.chunk, this.count)
172
176
  }
173
177
 
@@ -287,12 +291,14 @@ class ParserImpl implements Parser {
287
291
  this._skipWhitespace = false
288
292
  return [this.addPartWithPrevious(new Template.NodePart(parseInt(next.match[2], 10)))]
289
293
  } else if ((next = this.chunk(getWhitespace))) { // Whitespace
290
- return this._skipWhitespace ? [] : (this.path.inc(), [new Template.TextNode(next.match[1])])
294
+ return this._skipWhitespace
295
+ ? []
296
+ : (this.path.inc(), [new Template.TextNode(convertCharacterEntities(next.match[1]))])
291
297
  } else if ((next = this.chunk(getTextUntilCloseBrace))) { // Text and parts
292
298
  return parseTextAndParts(next.match[1], (i) => this.addPartWithPrevious(new Template.NodePart(i)))
293
299
  } else {
294
300
  this.path.inc()
295
- return [new Template.TextNode(this.nextChar())]
301
+ return [new Template.TextNode(convertCharacterEntities(this.nextChar()))]
296
302
  }
297
303
  }
298
304
 
@@ -410,12 +416,6 @@ class ParserImpl implements Parser {
410
416
  this.consumeAmount(2)
411
417
  this.context = "unknown"
412
418
 
413
- return BREAK_ATTR
414
- }
415
- case "closingTag": {
416
- this.consumeAmount(name.length)
417
- this.context = "unknown"
418
-
419
419
  return BREAK_ATTR
420
420
  }
421
421
  }
@@ -532,17 +532,17 @@ class ParserImpl implements Parser {
532
532
  this.consumeAmount(8)
533
533
  const part = this.parsePartToken((i) => this.addPartWithPrevious(new Template.TextPartNode(i)))
534
534
 
535
- return text === "" ? Continue([part]) : Continue([new Template.TextNode(text), part])
535
+ return text === "" ? Continue([part]) : Continue([new Template.TextNode(convertCharacterEntities(text)), part])
536
536
  }
537
537
  case "elementClose": {
538
538
  this.consumeClosingTag(tagName)
539
539
  return Break(
540
- text ? [new Template.TextNode(text)] : undefined
540
+ text ? [new Template.TextNode(convertCharacterEntities(text))] : undefined
541
541
  )
542
542
  }
543
543
  case "elementOpen": // In this case we make the assumption that you forgot to close this element
544
544
  return Break(
545
- text ? [new Template.TextNode(text)] : undefined
545
+ text ? [new Template.TextNode(convertCharacterEntities(text))] : undefined
546
546
  )
547
547
  }
548
548
  }
@@ -670,7 +670,7 @@ class ParserImpl implements Parser {
670
670
  }
671
671
  }
672
672
 
673
- function templateWithParts(template: ReadonlyArray<string>): string {
673
+ export function templateWithParts(template: ReadonlyArray<string>): string {
674
674
  const length = template.length
675
675
  const lastIndex = length - 1
676
676
 
@@ -689,7 +689,7 @@ function templateWithParts(template: ReadonlyArray<string>): string {
689
689
  return output
690
690
  }
691
691
 
692
- function unsafeParsePartIndex(text: string): number {
692
+ export function unsafeParsePartIndex(text: string): number {
693
693
  const next = getStrictPart(text, 0)
694
694
 
695
695
  if (!next) {
@@ -699,13 +699,13 @@ function unsafeParsePartIndex(text: string): number {
699
699
  return parseInt(next.match[2], 10)
700
700
  }
701
701
 
702
- function parseTextAndParts<T>(s: string, f: (index: number) => T): Array<Template.TextNode | T> {
702
+ export function parseTextAndParts<T>(s: string, f: (index: number) => T): Array<Template.TextNode | T> {
703
703
  let next: TextChunk | undefined
704
704
  let pos: number = 0
705
705
  const out: Array<Template.TextNode | T> = []
706
706
 
707
707
  if (!PART_REGEX.test(s)) {
708
- return [new Template.TextNode(s)]
708
+ return [new Template.TextNode(convertCharacterEntities(s))]
709
709
  }
710
710
 
711
711
  while (pos < s.length) {
@@ -713,7 +713,7 @@ function parseTextAndParts<T>(s: string, f: (index: number) => T): Array<Templat
713
713
  out.push(f(parseInt(next.match[2], 10)))
714
714
  pos += next.length
715
715
  } else if ((next = getTextUntilPart(s, pos))) {
716
- out.push(new Template.TextNode(next.match[1]))
716
+ out.push(new Template.TextNode(convertCharacterEntities(next.match[1])))
717
717
 
718
718
  pos += next.length
719
719
  } else {
@@ -722,7 +722,7 @@ function parseTextAndParts<T>(s: string, f: (index: number) => T): Array<Templat
722
722
  }
723
723
 
724
724
  if (pos < s.length) {
725
- out.push(new Template.TextNode(s.slice(pos)))
725
+ out.push(new Template.TextNode(convertCharacterEntities(s.slice(pos))))
726
726
  }
727
727
 
728
728
  return out