@typed/template 0.14.0 → 1.0.0-beta.1

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 (452) hide show
  1. package/README.md +121 -2
  2. package/dist/EventHandler.d.ts +273 -0
  3. package/dist/EventHandler.d.ts.map +1 -0
  4. package/dist/EventHandler.js +261 -0
  5. package/dist/EventSource.d.ts +82 -0
  6. package/dist/EventSource.d.ts.map +1 -0
  7. package/dist/EventSource.js +127 -0
  8. package/dist/Html.d.ts +122 -0
  9. package/dist/Html.d.ts.map +1 -0
  10. package/dist/Html.js +250 -0
  11. package/dist/HtmlChunk.d.ts +118 -0
  12. package/dist/HtmlChunk.d.ts.map +1 -0
  13. package/dist/HtmlChunk.js +211 -0
  14. package/dist/HydrateContext.d.ts +28 -0
  15. package/dist/HydrateContext.d.ts.map +1 -0
  16. package/dist/HydrateContext.js +25 -0
  17. package/dist/Parser.d.ts +35 -0
  18. package/dist/Parser.d.ts.map +1 -0
  19. package/dist/Parser.js +437 -0
  20. package/dist/Render.d.ts +195 -0
  21. package/dist/Render.d.ts.map +1 -0
  22. package/dist/Render.js +609 -0
  23. package/dist/RenderEvent.d.ts +179 -0
  24. package/dist/RenderEvent.d.ts.map +1 -0
  25. package/dist/RenderEvent.js +102 -0
  26. package/dist/RenderQueue.d.ts +167 -0
  27. package/dist/RenderQueue.d.ts.map +1 -0
  28. package/dist/RenderQueue.js +298 -0
  29. package/dist/RenderTemplate.d.ts +90 -0
  30. package/dist/RenderTemplate.d.ts.map +1 -0
  31. package/dist/RenderTemplate.js +87 -0
  32. package/dist/Renderable.d.ts +88 -0
  33. package/dist/Renderable.d.ts.map +1 -0
  34. package/dist/Renderable.js +3 -0
  35. package/dist/{dts/Template.d.ts → Template.d.ts} +109 -74
  36. package/dist/Template.d.ts.map +1 -0
  37. package/dist/{esm/Template.js → Template.js} +96 -56
  38. package/dist/Wire.d.ts +169 -0
  39. package/dist/Wire.d.ts.map +1 -0
  40. package/dist/Wire.js +217 -0
  41. package/dist/errors.d.ts +145 -0
  42. package/dist/errors.d.ts.map +1 -0
  43. package/dist/errors.js +159 -0
  44. package/dist/index.d.ts +15 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +14 -0
  47. package/dist/internal/IndexRefCounter.d.ts +11 -0
  48. package/dist/internal/IndexRefCounter.d.ts.map +1 -0
  49. package/dist/internal/IndexRefCounter.js +42 -0
  50. package/dist/internal/ParentChildNodes.d.ts +6 -0
  51. package/dist/internal/ParentChildNodes.d.ts.map +1 -0
  52. package/dist/internal/ParentChildNodes.js +1 -0
  53. package/dist/internal/PathStack.d.ts +9 -0
  54. package/dist/internal/PathStack.d.ts.map +1 -0
  55. package/dist/internal/PathStack.js +18 -0
  56. package/dist/internal/buildTemplateFragement.d.ts +3 -0
  57. package/dist/internal/buildTemplateFragement.d.ts.map +1 -0
  58. package/dist/internal/buildTemplateFragement.js +61 -0
  59. package/dist/internal/diff.d.ts +2 -0
  60. package/dist/internal/diff.d.ts.map +1 -0
  61. package/dist/internal/diff.js +119 -0
  62. package/dist/internal/dom.d.ts +45 -0
  63. package/dist/internal/dom.d.ts.map +1 -0
  64. package/dist/internal/dom.js +304 -0
  65. package/dist/internal/encoding.d.ts +7 -0
  66. package/dist/internal/encoding.d.ts.map +1 -0
  67. package/dist/internal/encoding.js +134 -0
  68. package/dist/{dts/internal/v2/hydration-template.d.ts → internal/hydration.d.ts} +10 -7
  69. package/dist/internal/hydration.d.ts.map +1 -0
  70. package/dist/{esm/internal/v2/hydration-template.js → internal/hydration.js} +80 -26
  71. package/dist/internal/keyToPartType.d.ts +2 -0
  72. package/dist/internal/keyToPartType.d.ts.map +1 -0
  73. package/dist/internal/keyToPartType.js +110 -0
  74. package/dist/internal/meta.d.ts +17 -0
  75. package/dist/internal/meta.d.ts.map +1 -0
  76. package/dist/internal/meta.js +14 -0
  77. package/dist/internal/takeOneIfNotRenderEvent.d.ts +4 -0
  78. package/dist/internal/takeOneIfNotRenderEvent.d.ts.map +1 -0
  79. package/dist/internal/takeOneIfNotRenderEvent.js +10 -0
  80. package/dist/internal/templateHash.d.ts +2 -0
  81. package/dist/internal/templateHash.d.ts.map +1 -0
  82. package/dist/internal/templateHash.js +14 -0
  83. package/dist/many.d.ts +68 -0
  84. package/dist/many.d.ts.map +1 -0
  85. package/dist/many.js +107 -0
  86. package/package.json +29 -227
  87. package/src/EventHandler.ts +318 -86
  88. package/src/EventSource.ts +202 -0
  89. package/src/Html.test.ts +490 -0
  90. package/src/Html.ts +292 -333
  91. package/src/HtmlChunk.ts +290 -332
  92. package/src/HydrateContext.ts +40 -0
  93. package/src/Hydration.test.ts +408 -0
  94. package/src/Parser.test.ts +923 -0
  95. package/src/Parser.ts +598 -10
  96. package/src/Render.test.ts +337 -0
  97. package/src/Render.ts +878 -63
  98. package/src/RenderEvent.ts +169 -40
  99. package/src/RenderQueue.ts +291 -385
  100. package/src/RenderTemplate.ts +98 -31
  101. package/src/Renderable.ts +122 -24
  102. package/src/Template.ts +246 -145
  103. package/src/Wire.ts +309 -0
  104. package/src/errors.ts +173 -0
  105. package/src/index.ts +14 -66
  106. package/src/internal/IndexRefCounter.ts +53 -0
  107. package/src/internal/ParentChildNodes.ts +7 -0
  108. package/src/internal/PathStack.ts +23 -0
  109. package/src/internal/buildTemplateFragement.ts +82 -0
  110. package/src/internal/diff.ts +127 -0
  111. package/src/internal/dom.ts +357 -0
  112. package/src/internal/encoding.ts +147 -0
  113. package/src/internal/hydration.ts +406 -0
  114. package/src/internal/keyToPartType.ts +113 -0
  115. package/src/internal/meta.ts +25 -0
  116. package/src/internal/takeOneIfNotRenderEvent.ts +19 -0
  117. package/src/internal/templateHash.ts +18 -0
  118. package/src/many.ts +148 -0
  119. package/Directive/package.json +0 -6
  120. package/ElementRef/package.json +0 -6
  121. package/ElementSource/package.json +0 -6
  122. package/Entry/package.json +0 -6
  123. package/EventHandler/package.json +0 -6
  124. package/Html/package.json +0 -6
  125. package/HtmlChunk/package.json +0 -6
  126. package/Hydrate/package.json +0 -6
  127. package/LICENSE +0 -21
  128. package/Many/package.json +0 -6
  129. package/Meta/package.json +0 -6
  130. package/Parser/package.json +0 -6
  131. package/Part/package.json +0 -6
  132. package/Placeholder/package.json +0 -6
  133. package/Platform/package.json +0 -6
  134. package/Render/package.json +0 -6
  135. package/RenderContext/package.json +0 -6
  136. package/RenderEvent/package.json +0 -6
  137. package/RenderQueue/package.json +0 -6
  138. package/RenderTemplate/package.json +0 -6
  139. package/Renderable/package.json +0 -6
  140. package/Template/package.json +0 -6
  141. package/Test/package.json +0 -6
  142. package/Vitest/package.json +0 -6
  143. package/compiler-tools/package.json +0 -6
  144. package/dist/cjs/Directive.js +0 -76
  145. package/dist/cjs/Directive.js.map +0 -1
  146. package/dist/cjs/ElementRef.js +0 -92
  147. package/dist/cjs/ElementRef.js.map +0 -1
  148. package/dist/cjs/ElementSource.js +0 -246
  149. package/dist/cjs/ElementSource.js.map +0 -1
  150. package/dist/cjs/Entry.js +0 -6
  151. package/dist/cjs/Entry.js.map +0 -1
  152. package/dist/cjs/EventHandler.js +0 -76
  153. package/dist/cjs/EventHandler.js.map +0 -1
  154. package/dist/cjs/Html.js +0 -224
  155. package/dist/cjs/Html.js.map +0 -1
  156. package/dist/cjs/HtmlChunk.js +0 -306
  157. package/dist/cjs/HtmlChunk.js.map +0 -1
  158. package/dist/cjs/Hydrate.js +0 -43
  159. package/dist/cjs/Hydrate.js.map +0 -1
  160. package/dist/cjs/Many.js +0 -66
  161. package/dist/cjs/Many.js.map +0 -1
  162. package/dist/cjs/Meta.js +0 -50
  163. package/dist/cjs/Meta.js.map +0 -1
  164. package/dist/cjs/Parser.js +0 -19
  165. package/dist/cjs/Parser.js.map +0 -1
  166. package/dist/cjs/Part.js +0 -6
  167. package/dist/cjs/Part.js.map +0 -1
  168. package/dist/cjs/Placeholder.js +0 -34
  169. package/dist/cjs/Placeholder.js.map +0 -1
  170. package/dist/cjs/Platform.js +0 -65
  171. package/dist/cjs/Platform.js.map +0 -1
  172. package/dist/cjs/Render.js +0 -50
  173. package/dist/cjs/Render.js.map +0 -1
  174. package/dist/cjs/RenderContext.js +0 -67
  175. package/dist/cjs/RenderContext.js.map +0 -1
  176. package/dist/cjs/RenderEvent.js +0 -52
  177. package/dist/cjs/RenderEvent.js.map +0 -1
  178. package/dist/cjs/RenderQueue.js +0 -343
  179. package/dist/cjs/RenderQueue.js.map +0 -1
  180. package/dist/cjs/RenderTemplate.js +0 -26
  181. package/dist/cjs/RenderTemplate.js.map +0 -1
  182. package/dist/cjs/Renderable.js +0 -6
  183. package/dist/cjs/Renderable.js.map +0 -1
  184. package/dist/cjs/Template.js +0 -305
  185. package/dist/cjs/Template.js.map +0 -1
  186. package/dist/cjs/Test.js +0 -184
  187. package/dist/cjs/Test.js.map +0 -1
  188. package/dist/cjs/Vitest.js +0 -52
  189. package/dist/cjs/Vitest.js.map +0 -1
  190. package/dist/cjs/compiler-tools.js +0 -100
  191. package/dist/cjs/compiler-tools.js.map +0 -1
  192. package/dist/cjs/index.js +0 -138
  193. package/dist/cjs/index.js.map +0 -1
  194. package/dist/cjs/internal/EventSource.js +0 -129
  195. package/dist/cjs/internal/EventSource.js.map +0 -1
  196. package/dist/cjs/internal/HydrateContext.js +0 -13
  197. package/dist/cjs/internal/HydrateContext.js.map +0 -1
  198. package/dist/cjs/internal/browser.js +0 -110
  199. package/dist/cjs/internal/browser.js.map +0 -1
  200. package/dist/cjs/internal/character-entities.js +0 -2141
  201. package/dist/cjs/internal/character-entities.js.map +0 -1
  202. package/dist/cjs/internal/chunks.js +0 -68
  203. package/dist/cjs/internal/chunks.js.map +0 -1
  204. package/dist/cjs/internal/errors.js +0 -52
  205. package/dist/cjs/internal/errors.js.map +0 -1
  206. package/dist/cjs/internal/indexRefCounter.js +0 -52
  207. package/dist/cjs/internal/indexRefCounter.js.map +0 -1
  208. package/dist/cjs/internal/module-augmentation.js +0 -6
  209. package/dist/cjs/internal/module-augmentation.js.map +0 -1
  210. package/dist/cjs/internal/parser.js +0 -568
  211. package/dist/cjs/internal/parser.js.map +0 -1
  212. package/dist/cjs/internal/parser2.js +0 -382
  213. package/dist/cjs/internal/parser2.js.map +0 -1
  214. package/dist/cjs/internal/server-parts.js +0 -124
  215. package/dist/cjs/internal/server-parts.js.map +0 -1
  216. package/dist/cjs/internal/server.js +0 -48
  217. package/dist/cjs/internal/server.js.map +0 -1
  218. package/dist/cjs/internal/utils.js +0 -136
  219. package/dist/cjs/internal/utils.js.map +0 -1
  220. package/dist/cjs/internal/v2/SyncPart.js +0 -6
  221. package/dist/cjs/internal/v2/SyncPart.js.map +0 -1
  222. package/dist/cjs/internal/v2/helpers.js +0 -15
  223. package/dist/cjs/internal/v2/helpers.js.map +0 -1
  224. package/dist/cjs/internal/v2/hydration-template.js +0 -269
  225. package/dist/cjs/internal/v2/hydration-template.js.map +0 -1
  226. package/dist/cjs/internal/v2/parts.js +0 -169
  227. package/dist/cjs/internal/v2/parts.js.map +0 -1
  228. package/dist/cjs/internal/v2/render-entry.js +0 -110
  229. package/dist/cjs/internal/v2/render-entry.js.map +0 -1
  230. package/dist/cjs/internal/v2/render-sync-parts.js +0 -318
  231. package/dist/cjs/internal/v2/render-sync-parts.js.map +0 -1
  232. package/dist/cjs/internal/v2/render.js +0 -592
  233. package/dist/cjs/internal/v2/render.js.map +0 -1
  234. package/dist/cjs/internal/v2/sync-parts.js +0 -115
  235. package/dist/cjs/internal/v2/sync-parts.js.map +0 -1
  236. package/dist/dts/Directive.d.ts +0 -70
  237. package/dist/dts/Directive.d.ts.map +0 -1
  238. package/dist/dts/ElementRef.d.ts +0 -42
  239. package/dist/dts/ElementRef.d.ts.map +0 -1
  240. package/dist/dts/ElementSource.d.ts +0 -79
  241. package/dist/dts/ElementSource.d.ts.map +0 -1
  242. package/dist/dts/Entry.d.ts +0 -26
  243. package/dist/dts/Entry.d.ts.map +0 -1
  244. package/dist/dts/EventHandler.d.ts +0 -73
  245. package/dist/dts/EventHandler.d.ts.map +0 -1
  246. package/dist/dts/Html.d.ts +0 -35
  247. package/dist/dts/Html.d.ts.map +0 -1
  248. package/dist/dts/HtmlChunk.d.ts +0 -56
  249. package/dist/dts/HtmlChunk.d.ts.map +0 -1
  250. package/dist/dts/Hydrate.d.ts +0 -19
  251. package/dist/dts/Hydrate.d.ts.map +0 -1
  252. package/dist/dts/Many.d.ts +0 -32
  253. package/dist/dts/Many.d.ts.map +0 -1
  254. package/dist/dts/Meta.d.ts +0 -33
  255. package/dist/dts/Meta.d.ts.map +0 -1
  256. package/dist/dts/Parser.d.ts +0 -13
  257. package/dist/dts/Parser.d.ts.map +0 -1
  258. package/dist/dts/Part.d.ts +0 -121
  259. package/dist/dts/Part.d.ts.map +0 -1
  260. package/dist/dts/Placeholder.d.ts +0 -48
  261. package/dist/dts/Placeholder.d.ts.map +0 -1
  262. package/dist/dts/Platform.d.ts +0 -21
  263. package/dist/dts/Platform.d.ts.map +0 -1
  264. package/dist/dts/Render.d.ts +0 -31
  265. package/dist/dts/Render.d.ts.map +0 -1
  266. package/dist/dts/RenderContext.d.ts +0 -70
  267. package/dist/dts/RenderContext.d.ts.map +0 -1
  268. package/dist/dts/RenderEvent.d.ts +0 -42
  269. package/dist/dts/RenderEvent.d.ts.map +0 -1
  270. package/dist/dts/RenderQueue.d.ts +0 -103
  271. package/dist/dts/RenderQueue.d.ts.map +0 -1
  272. package/dist/dts/RenderTemplate.d.ts +0 -25
  273. package/dist/dts/RenderTemplate.d.ts.map +0 -1
  274. package/dist/dts/Renderable.d.ts +0 -28
  275. package/dist/dts/Renderable.d.ts.map +0 -1
  276. package/dist/dts/Template.d.ts.map +0 -1
  277. package/dist/dts/Test.d.ts +0 -85
  278. package/dist/dts/Test.d.ts.map +0 -1
  279. package/dist/dts/Vitest.d.ts +0 -43
  280. package/dist/dts/Vitest.d.ts.map +0 -1
  281. package/dist/dts/compiler-tools.d.ts +0 -143
  282. package/dist/dts/compiler-tools.d.ts.map +0 -1
  283. package/dist/dts/index.d.ts +0 -65
  284. package/dist/dts/index.d.ts.map +0 -1
  285. package/dist/dts/internal/EventSource.d.ts +0 -13
  286. package/dist/dts/internal/EventSource.d.ts.map +0 -1
  287. package/dist/dts/internal/HydrateContext.d.ts +0 -2
  288. package/dist/dts/internal/HydrateContext.d.ts.map +0 -1
  289. package/dist/dts/internal/browser.d.ts +0 -8
  290. package/dist/dts/internal/browser.d.ts.map +0 -1
  291. package/dist/dts/internal/character-entities.d.ts +0 -2133
  292. package/dist/dts/internal/character-entities.d.ts.map +0 -1
  293. package/dist/dts/internal/chunks.d.ts +0 -23
  294. package/dist/dts/internal/chunks.d.ts.map +0 -1
  295. package/dist/dts/internal/errors.d.ts +0 -22
  296. package/dist/dts/internal/errors.d.ts.map +0 -1
  297. package/dist/dts/internal/indexRefCounter.d.ts +0 -7
  298. package/dist/dts/internal/indexRefCounter.d.ts.map +0 -1
  299. package/dist/dts/internal/module-augmentation.d.ts +0 -32
  300. package/dist/dts/internal/module-augmentation.d.ts.map +0 -1
  301. package/dist/dts/internal/parser.d.ts +0 -33
  302. package/dist/dts/internal/parser.d.ts.map +0 -1
  303. package/dist/dts/internal/parser2.d.ts +0 -12
  304. package/dist/dts/internal/parser2.d.ts.map +0 -1
  305. package/dist/dts/internal/server-parts.d.ts +0 -223
  306. package/dist/dts/internal/server-parts.d.ts.map +0 -1
  307. package/dist/dts/internal/server.d.ts +0 -5
  308. package/dist/dts/internal/server.d.ts.map +0 -1
  309. package/dist/dts/internal/utils.d.ts +0 -19
  310. package/dist/dts/internal/utils.d.ts.map +0 -1
  311. package/dist/dts/internal/v2/SyncPart.d.ts +0 -87
  312. package/dist/dts/internal/v2/SyncPart.d.ts.map +0 -1
  313. package/dist/dts/internal/v2/helpers.d.ts +0 -3
  314. package/dist/dts/internal/v2/helpers.d.ts.map +0 -1
  315. package/dist/dts/internal/v2/hydration-template.d.ts.map +0 -1
  316. package/dist/dts/internal/v2/parts.d.ts +0 -245
  317. package/dist/dts/internal/v2/parts.d.ts.map +0 -1
  318. package/dist/dts/internal/v2/render-entry.d.ts +0 -6
  319. package/dist/dts/internal/v2/render-entry.d.ts.map +0 -1
  320. package/dist/dts/internal/v2/render-sync-parts.d.ts +0 -22
  321. package/dist/dts/internal/v2/render-sync-parts.d.ts.map +0 -1
  322. package/dist/dts/internal/v2/render.d.ts +0 -83
  323. package/dist/dts/internal/v2/render.d.ts.map +0 -1
  324. package/dist/dts/internal/v2/sync-parts.d.ts +0 -129
  325. package/dist/dts/internal/v2/sync-parts.d.ts.map +0 -1
  326. package/dist/esm/Directive.js +0 -64
  327. package/dist/esm/Directive.js.map +0 -1
  328. package/dist/esm/ElementRef.js +0 -76
  329. package/dist/esm/ElementRef.js.map +0 -1
  330. package/dist/esm/ElementSource.js +0 -246
  331. package/dist/esm/ElementSource.js.map +0 -1
  332. package/dist/esm/Entry.js +0 -2
  333. package/dist/esm/Entry.js.map +0 -1
  334. package/dist/esm/EventHandler.js +0 -68
  335. package/dist/esm/EventHandler.js.map +0 -1
  336. package/dist/esm/Html.js +0 -230
  337. package/dist/esm/Html.js.map +0 -1
  338. package/dist/esm/HtmlChunk.js +0 -330
  339. package/dist/esm/HtmlChunk.js.map +0 -1
  340. package/dist/esm/Hydrate.js +0 -31
  341. package/dist/esm/Hydrate.js.map +0 -1
  342. package/dist/esm/Many.js +0 -54
  343. package/dist/esm/Many.js.map +0 -1
  344. package/dist/esm/Meta.js +0 -40
  345. package/dist/esm/Meta.js.map +0 -1
  346. package/dist/esm/Parser.js +0 -13
  347. package/dist/esm/Parser.js.map +0 -1
  348. package/dist/esm/Part.js +0 -5
  349. package/dist/esm/Part.js.map +0 -1
  350. package/dist/esm/Placeholder.js +0 -26
  351. package/dist/esm/Placeholder.js.map +0 -1
  352. package/dist/esm/Platform.js +0 -42
  353. package/dist/esm/Platform.js.map +0 -1
  354. package/dist/esm/Render.js +0 -36
  355. package/dist/esm/Render.js.map +0 -1
  356. package/dist/esm/RenderContext.js +0 -54
  357. package/dist/esm/RenderContext.js.map +0 -1
  358. package/dist/esm/RenderEvent.js +0 -43
  359. package/dist/esm/RenderEvent.js.map +0 -1
  360. package/dist/esm/RenderQueue.js +0 -338
  361. package/dist/esm/RenderQueue.js.map +0 -1
  362. package/dist/esm/RenderTemplate.js +0 -16
  363. package/dist/esm/RenderTemplate.js.map +0 -1
  364. package/dist/esm/Renderable.js +0 -2
  365. package/dist/esm/Renderable.js.map +0 -1
  366. package/dist/esm/Template.js.map +0 -1
  367. package/dist/esm/Test.js +0 -167
  368. package/dist/esm/Test.js.map +0 -1
  369. package/dist/esm/Vitest.js +0 -44
  370. package/dist/esm/Vitest.js.map +0 -1
  371. package/dist/esm/compiler-tools.js +0 -91
  372. package/dist/esm/compiler-tools.js.map +0 -1
  373. package/dist/esm/index.js +0 -65
  374. package/dist/esm/index.js.map +0 -1
  375. package/dist/esm/internal/EventSource.js +0 -126
  376. package/dist/esm/internal/EventSource.js.map +0 -1
  377. package/dist/esm/internal/HydrateContext.js +0 -7
  378. package/dist/esm/internal/HydrateContext.js.map +0 -1
  379. package/dist/esm/internal/browser.js +0 -103
  380. package/dist/esm/internal/browser.js.map +0 -1
  381. package/dist/esm/internal/character-entities.js +0 -2134
  382. package/dist/esm/internal/character-entities.js.map +0 -1
  383. package/dist/esm/internal/chunks.js +0 -60
  384. package/dist/esm/internal/chunks.js.map +0 -1
  385. package/dist/esm/internal/errors.js +0 -46
  386. package/dist/esm/internal/errors.js.map +0 -1
  387. package/dist/esm/internal/indexRefCounter.js +0 -47
  388. package/dist/esm/internal/indexRefCounter.js.map +0 -1
  389. package/dist/esm/internal/module-augmentation.js +0 -2
  390. package/dist/esm/internal/module-augmentation.js.map +0 -1
  391. package/dist/esm/internal/parser.js +0 -596
  392. package/dist/esm/internal/parser.js.map +0 -1
  393. package/dist/esm/internal/parser2.js +0 -393
  394. package/dist/esm/internal/parser2.js.map +0 -1
  395. package/dist/esm/internal/server-parts.js +0 -109
  396. package/dist/esm/internal/server-parts.js.map +0 -1
  397. package/dist/esm/internal/server.js +0 -22
  398. package/dist/esm/internal/server.js.map +0 -1
  399. package/dist/esm/internal/utils.js +0 -119
  400. package/dist/esm/internal/utils.js.map +0 -1
  401. package/dist/esm/internal/v2/SyncPart.js +0 -5
  402. package/dist/esm/internal/v2/SyncPart.js.map +0 -1
  403. package/dist/esm/internal/v2/helpers.js +0 -12
  404. package/dist/esm/internal/v2/helpers.js.map +0 -1
  405. package/dist/esm/internal/v2/hydration-template.js.map +0 -1
  406. package/dist/esm/internal/v2/parts.js +0 -150
  407. package/dist/esm/internal/v2/parts.js.map +0 -1
  408. package/dist/esm/internal/v2/render-entry.js +0 -102
  409. package/dist/esm/internal/v2/render-entry.js.map +0 -1
  410. package/dist/esm/internal/v2/render-sync-parts.js +0 -265
  411. package/dist/esm/internal/v2/render-sync-parts.js.map +0 -1
  412. package/dist/esm/internal/v2/render.js +0 -521
  413. package/dist/esm/internal/v2/render.js.map +0 -1
  414. package/dist/esm/internal/v2/sync-parts.js +0 -102
  415. package/dist/esm/internal/v2/sync-parts.js.map +0 -1
  416. package/dist/esm/package.json +0 -4
  417. package/src/Directive.ts +0 -114
  418. package/src/ElementRef.ts +0 -148
  419. package/src/ElementSource.ts +0 -510
  420. package/src/Entry.ts +0 -28
  421. package/src/Hydrate.ts +0 -51
  422. package/src/Many.ts +0 -161
  423. package/src/Meta.ts +0 -45
  424. package/src/Part.ts +0 -154
  425. package/src/Placeholder.ts +0 -78
  426. package/src/Platform.ts +0 -70
  427. package/src/RenderContext.ts +0 -121
  428. package/src/Test.ts +0 -354
  429. package/src/Vitest.ts +0 -141
  430. package/src/compiler-tools.ts +0 -250
  431. package/src/internal/EventSource.ts +0 -188
  432. package/src/internal/HydrateContext.ts +0 -22
  433. package/src/internal/browser.ts +0 -138
  434. package/src/internal/character-entities.ts +0 -2136
  435. package/src/internal/chunks.ts +0 -89
  436. package/src/internal/errors.ts +0 -49
  437. package/src/internal/external.d.ts +0 -11
  438. package/src/internal/indexRefCounter.ts +0 -54
  439. package/src/internal/module-augmentation.ts +0 -44
  440. package/src/internal/parser.ts +0 -757
  441. package/src/internal/parser2.ts +0 -468
  442. package/src/internal/server-parts.ts +0 -161
  443. package/src/internal/server.ts +0 -37
  444. package/src/internal/utils.ts +0 -153
  445. package/src/internal/v2/SyncPart.ts +0 -112
  446. package/src/internal/v2/helpers.ts +0 -13
  447. package/src/internal/v2/hydration-template.ts +0 -308
  448. package/src/internal/v2/parts.ts +0 -254
  449. package/src/internal/v2/render-entry.ts +0 -131
  450. package/src/internal/v2/render-sync-parts.ts +0 -440
  451. package/src/internal/v2/render.ts +0 -813
  452. package/src/internal/v2/sync-parts.ts +0 -133
@@ -1,757 +0,0 @@
1
- import * as Chunk from "effect/Chunk"
2
- import { globalValue } from "effect/GlobalValue"
3
- import * as Option from "effect/Option"
4
- import * as Template from "../Template.js"
5
- import { convertCharacterEntities } from "./character-entities.js"
6
- import type { TextChunk } from "./chunks.js"
7
- import {
8
- getClosingTagName,
9
- getPart,
10
- getStrictPart,
11
- getTextUntilCloseBrace,
12
- getTextUntilPart,
13
- getWhitespace,
14
- PART_REGEX,
15
- PART_STRING
16
- } from "./chunks.js"
17
-
18
- // TODO: Consider ways to surface useful errors and warnings.
19
- // TODO: Profile for performance optimization
20
-
21
- /**
22
- * @since 1.0.0
23
- */
24
- export const TEXT_ONLY_NODES_REGEX = new Set([
25
- "textarea",
26
- "script",
27
- "style",
28
- "title",
29
- "plaintext",
30
- "xmp"
31
- ])
32
-
33
- /**
34
- * @since 1.0.0
35
- */
36
- export const SELF_CLOSING_TAGS = new Set([
37
- "area",
38
- "base",
39
- "br",
40
- "col",
41
- "command",
42
- "embed",
43
- "hr",
44
- "img",
45
- "input",
46
- "keygen",
47
- "link",
48
- "meta",
49
- "param",
50
- "source",
51
- "track",
52
- "wbr"
53
- ])
54
-
55
- const VALID_PROPS_NAMES = new Set([
56
- "props",
57
- "properties",
58
- // First "." will already be matched
59
- ".."
60
- ])
61
-
62
- export interface Parser {
63
- parse(templateStrings: ReadonlyArray<string>): Template.Template
64
- }
65
-
66
- export function parse(templateStrings: ReadonlyArray<string>): Template.Template {
67
- return parser.parse(templateStrings)
68
- }
69
-
70
- const SPACE_REGEX = /\s/
71
- const PART_START = "{{__PART"
72
- const PART_END = "__}}"
73
- const chars = {
74
- openBracket: "{",
75
- closeBracket: "}",
76
- underscore: "_",
77
- equals: "=",
78
- quote: `"`,
79
- singleQuote: "'",
80
- slash: "/",
81
- greaterThan: ">",
82
- lessThan: "<",
83
- hypen: "-",
84
- dot: "."
85
- } as const
86
-
87
- const isPartToken: TextPredicate = (input, pos) =>
88
- input[pos] === chars.openBracket && input.slice(pos, pos + 8) === PART_START
89
- const isPartEndToken: TextPredicate = (input, pos) =>
90
- input[pos] === chars.underscore && input.slice(pos, pos + 4) === PART_END
91
- const isElementOpenToken: TextPredicate = (input, pos) =>
92
- input[pos] === chars.lessThan && input[pos + 1] !== chars.slash
93
- const isElementCloseToken: TextPredicate = (input, pos) =>
94
- input[pos] === chars.lessThan && input[pos + 1] === chars.slash
95
- const isEqualsToken: TextPredicate = (input, pos) => input[pos] === chars.equals
96
- const isQuoteToken: TextPredicate = (input, pos) => input[pos] === chars.quote
97
- const isSingleQuoteToken: TextPredicate = (input, pos) => input[pos] === chars.singleQuote
98
- const isWhitespaceToken: TextPredicate = (input, pos) => SPACE_REGEX.test(input[pos])
99
- const isOpenTagEndToken: TextPredicate = (input, pos) => input[pos] === chars.greaterThan
100
- const isSelfClosingTagEndToken: TextPredicate = (input, pos) =>
101
- input[pos] === chars.slash && input[pos + 1] === chars.greaterThan
102
- const isCommentEndToken: TextPredicate = (input, pos) =>
103
- input[pos] === chars.hypen && input[pos + 1] === chars.hypen && input[pos + 2] === chars.greaterThan
104
- const isGreaterThanToken: TextPredicate = (input, pos) => input[pos] === chars.greaterThan
105
-
106
- type Context = "unknown" | "element"
107
-
108
- type TextPredicate = (input: string, pos: number) => boolean
109
-
110
- type LoopDecision<A> = Continue<A> | Break<A> | Skip
111
-
112
- type Continue<A> = ["continue", A]
113
- const Continue = <A>(a: A): Continue<A> => ["continue", a]
114
-
115
- type Break<A> = ["break", Option.Option<A>]
116
- const Break = <A>(a?: A): Break<A> => ["break", Option.fromNullable(a)]
117
-
118
- type Skip = ["skip"]
119
- const Skip: Skip = ["skip"]
120
-
121
- type Predicates = {
122
- [key: string]: (char: string, pos: number) => boolean
123
- }
124
-
125
- const BREAK_ATTR = Break<Array<Template.Attribute>>()
126
-
127
- const tagNameMatches = {
128
- whitespace: isWhitespaceToken,
129
- openTagEnd: isOpenTagEndToken,
130
- selfClosingTagEnd: isSelfClosingTagEndToken
131
- }
132
-
133
- const attributeMatches = {
134
- whitespace: isWhitespaceToken,
135
- equals: isEqualsToken,
136
- openTagEnd: isOpenTagEndToken,
137
- selfClosingTagEnd: isSelfClosingTagEndToken
138
- } satisfies Predicates
139
-
140
- const attributeValueMatches = {
141
- base: isWhitespaceToken,
142
- openTagEnd: isOpenTagEndToken,
143
- selfClosingTagEnd: isSelfClosingTagEndToken
144
- } satisfies Predicates
145
-
146
- const textChildMatches = {
147
- part: isPartToken,
148
- elementOpen: isElementOpenToken,
149
- elementClose: isElementCloseToken
150
- }
151
-
152
- export class PathStack {
153
- chunk: Chunk.Chunk<number> = Chunk.empty()
154
- count = 0
155
-
156
- inc() {
157
- this.count++
158
- }
159
-
160
- push(): void {
161
- this.chunk = this.toChunk()
162
- this.count = 0
163
- }
164
-
165
- pop(): void {
166
- this.count = Chunk.unsafeLast(this.chunk)
167
- this.chunk = Chunk.dropRight(this.chunk, 1)
168
- }
169
-
170
- toChunk(): Chunk.Chunk<number> {
171
- if (Chunk.isEmpty(this.chunk)) {
172
- return Chunk.of(this.count)
173
- }
174
-
175
- return Chunk.append(this.chunk, this.count)
176
- }
177
-
178
- previousChunk() {
179
- return this.chunk
180
- }
181
- }
182
-
183
- const predicatesCache = new WeakMap<Predicates, readonly [ReadonlyArray<string>, number]>()
184
-
185
- function getPredicatesCache(predicates: Predicates) {
186
- const cached = predicatesCache.get(predicates)
187
-
188
- if (cached === undefined) {
189
- const keys = Object.keys(predicates)
190
- const length = keys.length
191
- const toCache = [keys, length] as const
192
-
193
- predicatesCache.set(predicates, toCache)
194
-
195
- return toCache
196
- } else {
197
- return cached
198
- }
199
- }
200
-
201
- class ParserImpl implements Parser {
202
- context!: Context
203
- input!: string
204
- length!: number
205
- parts!: Array<[Template.PartNode | Template.SparsePartNode, Chunk.Chunk<number>]>
206
- pos!: number
207
- path!: PathStack
208
- _skipWhitespace!: boolean
209
-
210
- parse(templateStrings: ReadonlyArray<string>): Template.Template {
211
- this.init(templateStrings)
212
-
213
- return this.parseTemplate(templateHash(templateStrings))
214
- }
215
-
216
- private parseTemplate(hash: string) {
217
- return new Template.Template(this.parseTemplateChildren(), hash, this.parts)
218
- }
219
-
220
- private parseTemplateChildren() {
221
- const nodes: Array<Template.Node> = []
222
-
223
- while (this.pos < this.length) {
224
- const node = this.parseNodeFromContext(this.context)
225
-
226
- if (node === undefined) {
227
- return nodes
228
- } else {
229
- nodes.push(...node)
230
- }
231
- }
232
-
233
- return nodes
234
- }
235
-
236
- protected parseNodeFromContext(ctx: Context): Array<Template.Node> | undefined {
237
- if (ctx === "element") {
238
- return [this.parseElement()]
239
- } else {
240
- return this.parseUnknown()
241
- }
242
- }
243
-
244
- private parseUnknown(): Array<Template.Node> | undefined {
245
- if (this.nextChar() === "<") { // Open tag / comment / self-closing tag
246
- return this.openBracket()
247
- } else {
248
- return this.unknownChunk()
249
- }
250
- }
251
-
252
- private openBracket() {
253
- this.consumeAmount(1)
254
- this.skipWhitespace()
255
-
256
- const nextChar = this.nextChar()
257
-
258
- if (nextChar === "!") { // Comment
259
- this.consumeAmount(1)
260
-
261
- const nextChar = this.nextChar()
262
-
263
- if (nextChar == "-") {
264
- this.consumeAmount(2)
265
- return [this.parseComment()]
266
- } else if (nextChar.toLowerCase() === "d") {
267
- return [this.parseDocType()]
268
- } else {
269
- throw new SyntaxError(`Unknown comment type ${nextChar}`)
270
- }
271
- } else if (nextChar === "/") { // Self-closing tag
272
- return this.selfClosingTagEnd()
273
- } else { // Elements
274
- return [this.parseElement()]
275
- }
276
- }
277
-
278
- private selfClosingTagEnd() {
279
- this.consumeAmount(1)
280
- this.parseTagName()
281
- this.skipWhitespace()
282
- this.consumeAmount(1)
283
- this.context = "unknown"
284
- return undefined
285
- }
286
-
287
- private unknownChunk() {
288
- let next: TextChunk | undefined
289
-
290
- if ((next = this.chunk(getPart))) { // Parts
291
- this._skipWhitespace = false
292
- return [this.addPartWithPrevious(new Template.NodePart(parseInt(next.match[2], 10)))]
293
- } else if ((next = this.chunk(getWhitespace))) { // Whitespace
294
- return this._skipWhitespace
295
- ? []
296
- : (this.path.inc(), [new Template.TextNode(convertCharacterEntities(next.match[1]))])
297
- } else if ((next = this.chunk(getTextUntilCloseBrace))) { // Text and parts
298
- return parseTextAndParts(next.match[1], (i) => this.addPartWithPrevious(new Template.NodePart(i)))
299
- } else {
300
- this.path.inc()
301
- return [new Template.TextNode(convertCharacterEntities(this.nextChar()))]
302
- }
303
- }
304
-
305
- private parseElement(): Template.ParentNode {
306
- const node = this.parseElementKind()
307
- this.path.inc()
308
-
309
- this.context = "unknown"
310
- this._skipWhitespace = true
311
-
312
- return node
313
- }
314
-
315
- private parseElementKind() {
316
- this.context = "element"
317
-
318
- const [tagName, matched] = this.parseTagName()
319
-
320
- if (matched === "whitespace") {
321
- this.skipWhitespace()
322
- }
323
-
324
- if (SELF_CLOSING_TAGS.has(tagName)) {
325
- return this.parseSelfClosingElement(tagName)
326
- } else if (TEXT_ONLY_NODES_REGEX.has(tagName)) {
327
- return this.parseTextOnlyElement(tagName)
328
- } else {
329
- const attributes = this.parseAttributes()
330
- this.path.push()
331
- const children = this.parseTemplateChildren()
332
- this.path.pop()
333
- const element = new Template.ElementNode(tagName, attributes, children)
334
-
335
- this.skipWhitespace()
336
- this.consumeClosingTag(tagName)
337
-
338
- return element
339
- }
340
- }
341
-
342
- private consumeClosingTag(tagName: string) {
343
- this.chunk(getClosingTagName(tagName))
344
- }
345
-
346
- private parseSelfClosingElement(tagName: string): Template.SelfClosingElementNode {
347
- const attributes = this.parseAttributes()
348
-
349
- return new Template.SelfClosingElementNode(tagName, attributes)
350
- }
351
-
352
- private parseTextOnlyElement(tagName: string): Template.TextOnlyElement {
353
- const attributes = this.parseAttributes()
354
-
355
- this.path.push()
356
- const children = this.parseTextChildren(tagName)
357
- this.path.pop()
358
-
359
- return new Template.TextOnlyElement(tagName, attributes, children || [])
360
- }
361
-
362
- private parseComment(): Template.Comment {
363
- const text = this.parseTextUntil(isCommentEndToken)
364
- this.consumeAmount(3)
365
-
366
- const textAndParts = parseTextAndParts(text, (i) => new Template.CommentPartNode(i))
367
-
368
- if (textAndParts.length === 1) {
369
- const part = textAndParts[0]
370
-
371
- if (part._tag === "text") {
372
- return new Template.CommentNode(part.value)
373
- } else {
374
- return this.addPart(new Template.CommentPartNode(part.index))
375
- }
376
- }
377
-
378
- return this.addPart(new Template.SparseCommentNode(textAndParts))
379
- }
380
-
381
- private parseDocType(): Template.DocType {
382
- this.parseTextUntil(isGreaterThanToken)
383
- this.consumeAmount(1)
384
- this.skipWhitespace()
385
-
386
- return new Template.DocType("html")
387
- }
388
-
389
- private parseTagName() {
390
- return this.parseTextUntilMany(tagNameMatches)
391
- }
392
-
393
- private parseAttributes(): Array<Template.Attribute> {
394
- return this.parseArray<Template.Attribute>(() => this.parseAttribute()) || []
395
- }
396
-
397
- private parseAttribute(): LoopDecision<Array<Template.Attribute>> {
398
- const [name, matched] = this.parseTextUntilMany(attributeMatches)
399
-
400
- switch (matched) {
401
- case null:
402
- return Skip
403
- case "whitespace":
404
- this.skipWhitespace()
405
- return Continue([this.parseBooleanNode(name)])
406
- case "equals": {
407
- this.consumeAmount(1)
408
- return Continue([this.parseAttributeValue(name)])
409
- }
410
- case "openTagEnd": {
411
- this.consumeAmount(1)
412
- this.context = "unknown"
413
- return Break<Array<Template.Attribute>>(name ? [this.parseBooleanNode(name)] : undefined)
414
- }
415
- case "selfClosingTagEnd": {
416
- this.consumeAmount(2)
417
- this.context = "unknown"
418
-
419
- return BREAK_ATTR
420
- }
421
- }
422
- }
423
-
424
- private parseAttributeValue(name: string): Template.Attribute {
425
- this.skipWhitespace()
426
-
427
- const nextChar = this.nextChar()
428
-
429
- const isDoubleQuoted = nextChar === `"`
430
- const isSingleQuoted = nextChar === "'"
431
- const isQuoted = isDoubleQuoted || isSingleQuoted
432
-
433
- if (isQuoted) {
434
- attributeValueMatches.base = isDoubleQuoted
435
- ? isQuoteToken
436
- : isSingleQuoteToken
437
- this.consumeAmount(1)
438
- } else {
439
- attributeValueMatches.base = isWhitespaceToken
440
- }
441
-
442
- const matched = this.parseTextUntilMany(attributeValueMatches)
443
- const text = matched[0]
444
-
445
- if (isQuoted) {
446
- this.consumeAmount(1)
447
- }
448
-
449
- this.skipWhitespace()
450
-
451
- if (text === "") {
452
- return this.parseBooleanNode(name)
453
- }
454
-
455
- switch (name[0]) {
456
- case "?":
457
- return this.addPart(new Template.BooleanPartNode(name.slice(1), unsafeParsePartIndex(text)))
458
- case ".": {
459
- const property = name.slice(1)
460
-
461
- if (property === "data") {
462
- return this.addPart(new Template.DataPartNode(unsafeParsePartIndex(text)))
463
- } else if (VALID_PROPS_NAMES.has(property)) {
464
- return this.addPart(new Template.PropertiesPartNode(unsafeParsePartIndex(text)))
465
- } else {
466
- return this.addPart(new Template.PropertyPartNode(property, unsafeParsePartIndex(text)))
467
- }
468
- }
469
- case "@":
470
- return this.addPart(new Template.EventPartNode(name.slice(1), unsafeParsePartIndex(text)))
471
- case "o": {
472
- if (name[1] === "n") {
473
- return this.addPart(new Template.EventPartNode(name.slice(2), unsafeParsePartIndex(text)))
474
- }
475
- }
476
- }
477
-
478
- const lowerCaseName = name.toLowerCase()
479
-
480
- if (lowerCaseName === "ref") {
481
- return this.addPart(new Template.RefPartNode(unsafeParsePartIndex(text)))
482
- }
483
-
484
- const isClass = lowerCaseName === "class" || lowerCaseName === "classname"
485
- const textAndParts = parseTextAndParts(
486
- text,
487
- (i) => isClass ? new Template.ClassNamePartNode(i) : new Template.AttrPartNode(name, i)
488
- )
489
-
490
- if (textAndParts.length === 1) {
491
- const part = textAndParts[0]
492
-
493
- if (part._tag === "text") {
494
- return new Template.AttributeNode(name, part.value)
495
- } else {
496
- return this.addPart(
497
- isClass ? new Template.ClassNamePartNode(part.index) : new Template.AttrPartNode(name, part.index)
498
- )
499
- }
500
- }
501
-
502
- return this.addPart(
503
- isClass
504
- ? new Template.SparseClassNameNode(
505
- // We don't need empty text spaces to generate the correct class namesq
506
- textAndParts.filter((t) => t._tag === "text" ? t.value.trim().length > 0 : true) as any
507
- )
508
- : new Template.SparseAttrNode(name, textAndParts as any)
509
- )
510
- }
511
-
512
- private parseBooleanNode(name: string) {
513
- if (isSpread(name)) {
514
- return this.addPart(new Template.PropertiesPartNode(unsafeParsePartIndex(name.slice(3))))
515
- } else {
516
- return new Template.BooleanNode(name)
517
- }
518
- }
519
-
520
- private parseTextChildren(tagName: string): Array<Template.Text> | null {
521
- return this.parseArray(() => this.parseTextChild(tagName))
522
- }
523
-
524
- private parseTextChild(tagName: string): LoopDecision<Array<Template.Text>> {
525
- const [parsed, matched] = this.parseTextUntilMany(textChildMatches)
526
- const text = parsed.trim()
527
-
528
- switch (matched) {
529
- case null:
530
- return Skip
531
- case "part": {
532
- this.consumeAmount(8)
533
- const part = this.parsePartToken((i) => this.addPartWithPrevious(new Template.TextPartNode(i)))
534
-
535
- return text === "" ? Continue([part]) : Continue([new Template.TextNode(convertCharacterEntities(text)), part])
536
- }
537
- case "elementClose": {
538
- this.consumeClosingTag(tagName)
539
- return Break(
540
- text ? [new Template.TextNode(convertCharacterEntities(text))] : undefined
541
- )
542
- }
543
- case "elementOpen": // In this case we make the assumption that you forgot to close this element
544
- return Break(
545
- text ? [new Template.TextNode(convertCharacterEntities(text))] : undefined
546
- )
547
- }
548
- }
549
-
550
- private parsePartToken<T extends Template.PartNode>(f: (index: number) => T): T {
551
- const text = this.parseTextUntil(isPartEndToken)
552
- const index = Number(text)
553
-
554
- this.consumeAmount(4)
555
-
556
- return f(index)
557
- }
558
-
559
- private parseTextUntil(predicate: (char: string, pos: number) => boolean) {
560
- const start = this.pos
561
- let i = 0
562
- while (this.pos < this.length) {
563
- if (predicate(this.input, this.pos)) {
564
- break
565
- }
566
-
567
- i++
568
- this.consumeAmount(1)
569
- }
570
-
571
- return this.input.slice(start, start + i)
572
- }
573
-
574
- private parseTextUntilMany<const T extends Predicates>(
575
- predicates: T
576
- ): readonly [string, keyof T] | readonly [string, null] {
577
- const [keys, length] = getPredicatesCache(predicates)
578
-
579
- let text = ""
580
- let i = 0
581
-
582
- while (this.pos < this.length) {
583
- const char = this.nextChar()
584
-
585
- for (; i < length; i++) {
586
- if (predicates[keys[i]](this.input, this.pos)) {
587
- return [text, keys[i]] as const
588
- }
589
- }
590
- i = 0
591
-
592
- text += char
593
- this.consumeAmount(1)
594
- }
595
-
596
- return [text, null] as const
597
- }
598
-
599
- private parseArray<T>(parser: () => LoopDecision<Array<T>>): Array<T> | null {
600
- const children: Array<T> = []
601
-
602
- while (this.pos < this.length) {
603
- const [decision, value] = parser()
604
-
605
- if (decision === "continue") {
606
- children.push(...value)
607
- } else if (decision === "break") {
608
- if (Option.isSome(value)) {
609
- children.push(...value.value)
610
- }
611
-
612
- return children
613
- } else {
614
- return null
615
- }
616
- }
617
-
618
- return children
619
- }
620
-
621
- private skipWhitespace() {
622
- while (this.pos < this.length) {
623
- const char = this.nextChar()
624
-
625
- if (SPACE_REGEX.test(char)) {
626
- this.consumeAmount(1)
627
- } else {
628
- break
629
- }
630
- }
631
- }
632
-
633
- private nextChar() {
634
- return this.input[this.pos]
635
- }
636
-
637
- private consumeAmount(amount: number) {
638
- this.pos += amount
639
- }
640
-
641
- private chunk(f: (str: string, pos: number) => TextChunk | undefined): TextChunk | undefined {
642
- const chunk = f(this.input, this.pos)
643
-
644
- if (chunk) {
645
- this.pos += chunk.length
646
- }
647
-
648
- return chunk
649
- }
650
-
651
- private addPart<T extends Template.PartNode | Template.SparsePartNode>(part: T): T {
652
- this.parts.push([part, this.path.toChunk()])
653
- return part
654
- }
655
-
656
- private addPartWithPrevious<T extends Template.PartNode | Template.SparsePartNode>(part: T): T {
657
- this.parts.push([part, this.path.previousChunk()])
658
- this.path.inc() // Nodes will be inserted as a comment
659
- return part
660
- }
661
-
662
- private init(templateStrings: ReadonlyArray<string>): void {
663
- this.context = "unknown"
664
- this.input = templateWithParts(templateStrings)
665
- this.length = this.input.length
666
- this.parts = []
667
- this.pos = 0
668
- this.path = new PathStack()
669
- this._skipWhitespace = true
670
- }
671
- }
672
-
673
- export function templateWithParts(template: ReadonlyArray<string>): string {
674
- const length = template.length
675
- const lastIndex = length - 1
676
-
677
- let output = ""
678
-
679
- for (let i = 0; i < length; i++) {
680
- const str = template[i]
681
-
682
- if (i === lastIndex) {
683
- output += str
684
- } else {
685
- output += str + PART_STRING(i)
686
- }
687
- }
688
-
689
- return output
690
- }
691
-
692
- export function unsafeParsePartIndex(text: string): number {
693
- const next = getStrictPart(text, 0)
694
-
695
- if (!next) {
696
- throw new SyntaxError(`Could not parse part index from ${text}`)
697
- }
698
-
699
- return parseInt(next.match[2], 10)
700
- }
701
-
702
- export function parseTextAndParts<T>(s: string, f: (index: number) => T): Array<Template.TextNode | T> {
703
- let next: TextChunk | undefined
704
- let pos: number = 0
705
- const out: Array<Template.TextNode | T> = []
706
-
707
- if (!PART_REGEX.test(s)) {
708
- return [new Template.TextNode(convertCharacterEntities(s))]
709
- }
710
-
711
- while (pos < s.length) {
712
- if ((next = getPart(s, pos))) {
713
- out.push(f(parseInt(next.match[2], 10)))
714
- pos += next.length
715
- } else if ((next = getTextUntilPart(s, pos))) {
716
- out.push(new Template.TextNode(convertCharacterEntities(next.match[1])))
717
-
718
- pos += next.length
719
- } else {
720
- break
721
- }
722
- }
723
-
724
- if (pos < s.length) {
725
- out.push(new Template.TextNode(convertCharacterEntities(s.slice(pos))))
726
- }
727
-
728
- return out
729
- }
730
-
731
- export const parser: Parser = globalValue(Symbol.for("@typed/template/Parser"), () => new ParserImpl())
732
-
733
- const digestSize = 2
734
- const multiplier = 33
735
- const fill = 5381
736
-
737
- /**
738
- * Generates a hash for an ordered list of strings. Intended for the purposes
739
- * of server-side rendering with hydration.
740
- */
741
- export function templateHash(strings: ReadonlyArray<string>) {
742
- const hashes = new Uint32Array(digestSize).fill(fill)
743
-
744
- for (let i = 0; i < strings.length; i++) {
745
- const string = strings[i]
746
-
747
- for (let j = 0; j < string.length; j++) {
748
- const key = j % digestSize
749
- hashes[key] = hashes[key] * multiplier + string.charCodeAt(j)
750
- }
751
- }
752
-
753
- return btoa(String.fromCharCode(...new Uint8Array(hashes.buffer)))
754
- }
755
- function isSpread(str: string) {
756
- return str[0] === chars.dot && str[1] === chars.dot && str[2] === chars.dot
757
- }