@typed/template 0.14.0 → 1.0.0-beta.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 (453) hide show
  1. package/README.md +108 -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 +297 -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 +22 -224
  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 +409 -0
  94. package/src/Parser.test.ts +924 -0
  95. package/src/Parser.ts +598 -10
  96. package/src/Render.test.ts +338 -0
  97. package/src/Render.ts +878 -63
  98. package/src/RenderEvent.ts +169 -40
  99. package/src/RenderQueue.ts +290 -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/tsconfig.json +6 -0
  120. package/Directive/package.json +0 -6
  121. package/ElementRef/package.json +0 -6
  122. package/ElementSource/package.json +0 -6
  123. package/Entry/package.json +0 -6
  124. package/EventHandler/package.json +0 -6
  125. package/Html/package.json +0 -6
  126. package/HtmlChunk/package.json +0 -6
  127. package/Hydrate/package.json +0 -6
  128. package/LICENSE +0 -21
  129. package/Many/package.json +0 -6
  130. package/Meta/package.json +0 -6
  131. package/Parser/package.json +0 -6
  132. package/Part/package.json +0 -6
  133. package/Placeholder/package.json +0 -6
  134. package/Platform/package.json +0 -6
  135. package/Render/package.json +0 -6
  136. package/RenderContext/package.json +0 -6
  137. package/RenderEvent/package.json +0 -6
  138. package/RenderQueue/package.json +0 -6
  139. package/RenderTemplate/package.json +0 -6
  140. package/Renderable/package.json +0 -6
  141. package/Template/package.json +0 -6
  142. package/Test/package.json +0 -6
  143. package/Vitest/package.json +0 -6
  144. package/compiler-tools/package.json +0 -6
  145. package/dist/cjs/Directive.js +0 -76
  146. package/dist/cjs/Directive.js.map +0 -1
  147. package/dist/cjs/ElementRef.js +0 -92
  148. package/dist/cjs/ElementRef.js.map +0 -1
  149. package/dist/cjs/ElementSource.js +0 -246
  150. package/dist/cjs/ElementSource.js.map +0 -1
  151. package/dist/cjs/Entry.js +0 -6
  152. package/dist/cjs/Entry.js.map +0 -1
  153. package/dist/cjs/EventHandler.js +0 -76
  154. package/dist/cjs/EventHandler.js.map +0 -1
  155. package/dist/cjs/Html.js +0 -224
  156. package/dist/cjs/Html.js.map +0 -1
  157. package/dist/cjs/HtmlChunk.js +0 -306
  158. package/dist/cjs/HtmlChunk.js.map +0 -1
  159. package/dist/cjs/Hydrate.js +0 -43
  160. package/dist/cjs/Hydrate.js.map +0 -1
  161. package/dist/cjs/Many.js +0 -66
  162. package/dist/cjs/Many.js.map +0 -1
  163. package/dist/cjs/Meta.js +0 -50
  164. package/dist/cjs/Meta.js.map +0 -1
  165. package/dist/cjs/Parser.js +0 -19
  166. package/dist/cjs/Parser.js.map +0 -1
  167. package/dist/cjs/Part.js +0 -6
  168. package/dist/cjs/Part.js.map +0 -1
  169. package/dist/cjs/Placeholder.js +0 -34
  170. package/dist/cjs/Placeholder.js.map +0 -1
  171. package/dist/cjs/Platform.js +0 -65
  172. package/dist/cjs/Platform.js.map +0 -1
  173. package/dist/cjs/Render.js +0 -50
  174. package/dist/cjs/Render.js.map +0 -1
  175. package/dist/cjs/RenderContext.js +0 -67
  176. package/dist/cjs/RenderContext.js.map +0 -1
  177. package/dist/cjs/RenderEvent.js +0 -52
  178. package/dist/cjs/RenderEvent.js.map +0 -1
  179. package/dist/cjs/RenderQueue.js +0 -343
  180. package/dist/cjs/RenderQueue.js.map +0 -1
  181. package/dist/cjs/RenderTemplate.js +0 -26
  182. package/dist/cjs/RenderTemplate.js.map +0 -1
  183. package/dist/cjs/Renderable.js +0 -6
  184. package/dist/cjs/Renderable.js.map +0 -1
  185. package/dist/cjs/Template.js +0 -305
  186. package/dist/cjs/Template.js.map +0 -1
  187. package/dist/cjs/Test.js +0 -184
  188. package/dist/cjs/Test.js.map +0 -1
  189. package/dist/cjs/Vitest.js +0 -52
  190. package/dist/cjs/Vitest.js.map +0 -1
  191. package/dist/cjs/compiler-tools.js +0 -100
  192. package/dist/cjs/compiler-tools.js.map +0 -1
  193. package/dist/cjs/index.js +0 -138
  194. package/dist/cjs/index.js.map +0 -1
  195. package/dist/cjs/internal/EventSource.js +0 -129
  196. package/dist/cjs/internal/EventSource.js.map +0 -1
  197. package/dist/cjs/internal/HydrateContext.js +0 -13
  198. package/dist/cjs/internal/HydrateContext.js.map +0 -1
  199. package/dist/cjs/internal/browser.js +0 -110
  200. package/dist/cjs/internal/browser.js.map +0 -1
  201. package/dist/cjs/internal/character-entities.js +0 -2141
  202. package/dist/cjs/internal/character-entities.js.map +0 -1
  203. package/dist/cjs/internal/chunks.js +0 -68
  204. package/dist/cjs/internal/chunks.js.map +0 -1
  205. package/dist/cjs/internal/errors.js +0 -52
  206. package/dist/cjs/internal/errors.js.map +0 -1
  207. package/dist/cjs/internal/indexRefCounter.js +0 -52
  208. package/dist/cjs/internal/indexRefCounter.js.map +0 -1
  209. package/dist/cjs/internal/module-augmentation.js +0 -6
  210. package/dist/cjs/internal/module-augmentation.js.map +0 -1
  211. package/dist/cjs/internal/parser.js +0 -568
  212. package/dist/cjs/internal/parser.js.map +0 -1
  213. package/dist/cjs/internal/parser2.js +0 -382
  214. package/dist/cjs/internal/parser2.js.map +0 -1
  215. package/dist/cjs/internal/server-parts.js +0 -124
  216. package/dist/cjs/internal/server-parts.js.map +0 -1
  217. package/dist/cjs/internal/server.js +0 -48
  218. package/dist/cjs/internal/server.js.map +0 -1
  219. package/dist/cjs/internal/utils.js +0 -136
  220. package/dist/cjs/internal/utils.js.map +0 -1
  221. package/dist/cjs/internal/v2/SyncPart.js +0 -6
  222. package/dist/cjs/internal/v2/SyncPart.js.map +0 -1
  223. package/dist/cjs/internal/v2/helpers.js +0 -15
  224. package/dist/cjs/internal/v2/helpers.js.map +0 -1
  225. package/dist/cjs/internal/v2/hydration-template.js +0 -269
  226. package/dist/cjs/internal/v2/hydration-template.js.map +0 -1
  227. package/dist/cjs/internal/v2/parts.js +0 -169
  228. package/dist/cjs/internal/v2/parts.js.map +0 -1
  229. package/dist/cjs/internal/v2/render-entry.js +0 -110
  230. package/dist/cjs/internal/v2/render-entry.js.map +0 -1
  231. package/dist/cjs/internal/v2/render-sync-parts.js +0 -318
  232. package/dist/cjs/internal/v2/render-sync-parts.js.map +0 -1
  233. package/dist/cjs/internal/v2/render.js +0 -592
  234. package/dist/cjs/internal/v2/render.js.map +0 -1
  235. package/dist/cjs/internal/v2/sync-parts.js +0 -115
  236. package/dist/cjs/internal/v2/sync-parts.js.map +0 -1
  237. package/dist/dts/Directive.d.ts +0 -70
  238. package/dist/dts/Directive.d.ts.map +0 -1
  239. package/dist/dts/ElementRef.d.ts +0 -42
  240. package/dist/dts/ElementRef.d.ts.map +0 -1
  241. package/dist/dts/ElementSource.d.ts +0 -79
  242. package/dist/dts/ElementSource.d.ts.map +0 -1
  243. package/dist/dts/Entry.d.ts +0 -26
  244. package/dist/dts/Entry.d.ts.map +0 -1
  245. package/dist/dts/EventHandler.d.ts +0 -73
  246. package/dist/dts/EventHandler.d.ts.map +0 -1
  247. package/dist/dts/Html.d.ts +0 -35
  248. package/dist/dts/Html.d.ts.map +0 -1
  249. package/dist/dts/HtmlChunk.d.ts +0 -56
  250. package/dist/dts/HtmlChunk.d.ts.map +0 -1
  251. package/dist/dts/Hydrate.d.ts +0 -19
  252. package/dist/dts/Hydrate.d.ts.map +0 -1
  253. package/dist/dts/Many.d.ts +0 -32
  254. package/dist/dts/Many.d.ts.map +0 -1
  255. package/dist/dts/Meta.d.ts +0 -33
  256. package/dist/dts/Meta.d.ts.map +0 -1
  257. package/dist/dts/Parser.d.ts +0 -13
  258. package/dist/dts/Parser.d.ts.map +0 -1
  259. package/dist/dts/Part.d.ts +0 -121
  260. package/dist/dts/Part.d.ts.map +0 -1
  261. package/dist/dts/Placeholder.d.ts +0 -48
  262. package/dist/dts/Placeholder.d.ts.map +0 -1
  263. package/dist/dts/Platform.d.ts +0 -21
  264. package/dist/dts/Platform.d.ts.map +0 -1
  265. package/dist/dts/Render.d.ts +0 -31
  266. package/dist/dts/Render.d.ts.map +0 -1
  267. package/dist/dts/RenderContext.d.ts +0 -70
  268. package/dist/dts/RenderContext.d.ts.map +0 -1
  269. package/dist/dts/RenderEvent.d.ts +0 -42
  270. package/dist/dts/RenderEvent.d.ts.map +0 -1
  271. package/dist/dts/RenderQueue.d.ts +0 -103
  272. package/dist/dts/RenderQueue.d.ts.map +0 -1
  273. package/dist/dts/RenderTemplate.d.ts +0 -25
  274. package/dist/dts/RenderTemplate.d.ts.map +0 -1
  275. package/dist/dts/Renderable.d.ts +0 -28
  276. package/dist/dts/Renderable.d.ts.map +0 -1
  277. package/dist/dts/Template.d.ts.map +0 -1
  278. package/dist/dts/Test.d.ts +0 -85
  279. package/dist/dts/Test.d.ts.map +0 -1
  280. package/dist/dts/Vitest.d.ts +0 -43
  281. package/dist/dts/Vitest.d.ts.map +0 -1
  282. package/dist/dts/compiler-tools.d.ts +0 -143
  283. package/dist/dts/compiler-tools.d.ts.map +0 -1
  284. package/dist/dts/index.d.ts +0 -65
  285. package/dist/dts/index.d.ts.map +0 -1
  286. package/dist/dts/internal/EventSource.d.ts +0 -13
  287. package/dist/dts/internal/EventSource.d.ts.map +0 -1
  288. package/dist/dts/internal/HydrateContext.d.ts +0 -2
  289. package/dist/dts/internal/HydrateContext.d.ts.map +0 -1
  290. package/dist/dts/internal/browser.d.ts +0 -8
  291. package/dist/dts/internal/browser.d.ts.map +0 -1
  292. package/dist/dts/internal/character-entities.d.ts +0 -2133
  293. package/dist/dts/internal/character-entities.d.ts.map +0 -1
  294. package/dist/dts/internal/chunks.d.ts +0 -23
  295. package/dist/dts/internal/chunks.d.ts.map +0 -1
  296. package/dist/dts/internal/errors.d.ts +0 -22
  297. package/dist/dts/internal/errors.d.ts.map +0 -1
  298. package/dist/dts/internal/indexRefCounter.d.ts +0 -7
  299. package/dist/dts/internal/indexRefCounter.d.ts.map +0 -1
  300. package/dist/dts/internal/module-augmentation.d.ts +0 -32
  301. package/dist/dts/internal/module-augmentation.d.ts.map +0 -1
  302. package/dist/dts/internal/parser.d.ts +0 -33
  303. package/dist/dts/internal/parser.d.ts.map +0 -1
  304. package/dist/dts/internal/parser2.d.ts +0 -12
  305. package/dist/dts/internal/parser2.d.ts.map +0 -1
  306. package/dist/dts/internal/server-parts.d.ts +0 -223
  307. package/dist/dts/internal/server-parts.d.ts.map +0 -1
  308. package/dist/dts/internal/server.d.ts +0 -5
  309. package/dist/dts/internal/server.d.ts.map +0 -1
  310. package/dist/dts/internal/utils.d.ts +0 -19
  311. package/dist/dts/internal/utils.d.ts.map +0 -1
  312. package/dist/dts/internal/v2/SyncPart.d.ts +0 -87
  313. package/dist/dts/internal/v2/SyncPart.d.ts.map +0 -1
  314. package/dist/dts/internal/v2/helpers.d.ts +0 -3
  315. package/dist/dts/internal/v2/helpers.d.ts.map +0 -1
  316. package/dist/dts/internal/v2/hydration-template.d.ts.map +0 -1
  317. package/dist/dts/internal/v2/parts.d.ts +0 -245
  318. package/dist/dts/internal/v2/parts.d.ts.map +0 -1
  319. package/dist/dts/internal/v2/render-entry.d.ts +0 -6
  320. package/dist/dts/internal/v2/render-entry.d.ts.map +0 -1
  321. package/dist/dts/internal/v2/render-sync-parts.d.ts +0 -22
  322. package/dist/dts/internal/v2/render-sync-parts.d.ts.map +0 -1
  323. package/dist/dts/internal/v2/render.d.ts +0 -83
  324. package/dist/dts/internal/v2/render.d.ts.map +0 -1
  325. package/dist/dts/internal/v2/sync-parts.d.ts +0 -129
  326. package/dist/dts/internal/v2/sync-parts.d.ts.map +0 -1
  327. package/dist/esm/Directive.js +0 -64
  328. package/dist/esm/Directive.js.map +0 -1
  329. package/dist/esm/ElementRef.js +0 -76
  330. package/dist/esm/ElementRef.js.map +0 -1
  331. package/dist/esm/ElementSource.js +0 -246
  332. package/dist/esm/ElementSource.js.map +0 -1
  333. package/dist/esm/Entry.js +0 -2
  334. package/dist/esm/Entry.js.map +0 -1
  335. package/dist/esm/EventHandler.js +0 -68
  336. package/dist/esm/EventHandler.js.map +0 -1
  337. package/dist/esm/Html.js +0 -230
  338. package/dist/esm/Html.js.map +0 -1
  339. package/dist/esm/HtmlChunk.js +0 -330
  340. package/dist/esm/HtmlChunk.js.map +0 -1
  341. package/dist/esm/Hydrate.js +0 -31
  342. package/dist/esm/Hydrate.js.map +0 -1
  343. package/dist/esm/Many.js +0 -54
  344. package/dist/esm/Many.js.map +0 -1
  345. package/dist/esm/Meta.js +0 -40
  346. package/dist/esm/Meta.js.map +0 -1
  347. package/dist/esm/Parser.js +0 -13
  348. package/dist/esm/Parser.js.map +0 -1
  349. package/dist/esm/Part.js +0 -5
  350. package/dist/esm/Part.js.map +0 -1
  351. package/dist/esm/Placeholder.js +0 -26
  352. package/dist/esm/Placeholder.js.map +0 -1
  353. package/dist/esm/Platform.js +0 -42
  354. package/dist/esm/Platform.js.map +0 -1
  355. package/dist/esm/Render.js +0 -36
  356. package/dist/esm/Render.js.map +0 -1
  357. package/dist/esm/RenderContext.js +0 -54
  358. package/dist/esm/RenderContext.js.map +0 -1
  359. package/dist/esm/RenderEvent.js +0 -43
  360. package/dist/esm/RenderEvent.js.map +0 -1
  361. package/dist/esm/RenderQueue.js +0 -338
  362. package/dist/esm/RenderQueue.js.map +0 -1
  363. package/dist/esm/RenderTemplate.js +0 -16
  364. package/dist/esm/RenderTemplate.js.map +0 -1
  365. package/dist/esm/Renderable.js +0 -2
  366. package/dist/esm/Renderable.js.map +0 -1
  367. package/dist/esm/Template.js.map +0 -1
  368. package/dist/esm/Test.js +0 -167
  369. package/dist/esm/Test.js.map +0 -1
  370. package/dist/esm/Vitest.js +0 -44
  371. package/dist/esm/Vitest.js.map +0 -1
  372. package/dist/esm/compiler-tools.js +0 -91
  373. package/dist/esm/compiler-tools.js.map +0 -1
  374. package/dist/esm/index.js +0 -65
  375. package/dist/esm/index.js.map +0 -1
  376. package/dist/esm/internal/EventSource.js +0 -126
  377. package/dist/esm/internal/EventSource.js.map +0 -1
  378. package/dist/esm/internal/HydrateContext.js +0 -7
  379. package/dist/esm/internal/HydrateContext.js.map +0 -1
  380. package/dist/esm/internal/browser.js +0 -103
  381. package/dist/esm/internal/browser.js.map +0 -1
  382. package/dist/esm/internal/character-entities.js +0 -2134
  383. package/dist/esm/internal/character-entities.js.map +0 -1
  384. package/dist/esm/internal/chunks.js +0 -60
  385. package/dist/esm/internal/chunks.js.map +0 -1
  386. package/dist/esm/internal/errors.js +0 -46
  387. package/dist/esm/internal/errors.js.map +0 -1
  388. package/dist/esm/internal/indexRefCounter.js +0 -47
  389. package/dist/esm/internal/indexRefCounter.js.map +0 -1
  390. package/dist/esm/internal/module-augmentation.js +0 -2
  391. package/dist/esm/internal/module-augmentation.js.map +0 -1
  392. package/dist/esm/internal/parser.js +0 -596
  393. package/dist/esm/internal/parser.js.map +0 -1
  394. package/dist/esm/internal/parser2.js +0 -393
  395. package/dist/esm/internal/parser2.js.map +0 -1
  396. package/dist/esm/internal/server-parts.js +0 -109
  397. package/dist/esm/internal/server-parts.js.map +0 -1
  398. package/dist/esm/internal/server.js +0 -22
  399. package/dist/esm/internal/server.js.map +0 -1
  400. package/dist/esm/internal/utils.js +0 -119
  401. package/dist/esm/internal/utils.js.map +0 -1
  402. package/dist/esm/internal/v2/SyncPart.js +0 -5
  403. package/dist/esm/internal/v2/SyncPart.js.map +0 -1
  404. package/dist/esm/internal/v2/helpers.js +0 -12
  405. package/dist/esm/internal/v2/helpers.js.map +0 -1
  406. package/dist/esm/internal/v2/hydration-template.js.map +0 -1
  407. package/dist/esm/internal/v2/parts.js +0 -150
  408. package/dist/esm/internal/v2/parts.js.map +0 -1
  409. package/dist/esm/internal/v2/render-entry.js +0 -102
  410. package/dist/esm/internal/v2/render-entry.js.map +0 -1
  411. package/dist/esm/internal/v2/render-sync-parts.js +0 -265
  412. package/dist/esm/internal/v2/render-sync-parts.js.map +0 -1
  413. package/dist/esm/internal/v2/render.js +0 -521
  414. package/dist/esm/internal/v2/render.js.map +0 -1
  415. package/dist/esm/internal/v2/sync-parts.js +0 -102
  416. package/dist/esm/internal/v2/sync-parts.js.map +0 -1
  417. package/dist/esm/package.json +0 -4
  418. package/src/Directive.ts +0 -114
  419. package/src/ElementRef.ts +0 -148
  420. package/src/ElementSource.ts +0 -510
  421. package/src/Entry.ts +0 -28
  422. package/src/Hydrate.ts +0 -51
  423. package/src/Many.ts +0 -161
  424. package/src/Meta.ts +0 -45
  425. package/src/Part.ts +0 -154
  426. package/src/Placeholder.ts +0 -78
  427. package/src/Platform.ts +0 -70
  428. package/src/RenderContext.ts +0 -121
  429. package/src/Test.ts +0 -354
  430. package/src/Vitest.ts +0 -141
  431. package/src/compiler-tools.ts +0 -250
  432. package/src/internal/EventSource.ts +0 -188
  433. package/src/internal/HydrateContext.ts +0 -22
  434. package/src/internal/browser.ts +0 -138
  435. package/src/internal/character-entities.ts +0 -2136
  436. package/src/internal/chunks.ts +0 -89
  437. package/src/internal/errors.ts +0 -49
  438. package/src/internal/external.d.ts +0 -11
  439. package/src/internal/indexRefCounter.ts +0 -54
  440. package/src/internal/module-augmentation.ts +0 -44
  441. package/src/internal/parser.ts +0 -757
  442. package/src/internal/parser2.ts +0 -468
  443. package/src/internal/server-parts.ts +0 -161
  444. package/src/internal/server.ts +0 -37
  445. package/src/internal/utils.ts +0 -153
  446. package/src/internal/v2/SyncPart.ts +0 -112
  447. package/src/internal/v2/helpers.ts +0 -13
  448. package/src/internal/v2/hydration-template.ts +0 -308
  449. package/src/internal/v2/parts.ts +0 -254
  450. package/src/internal/v2/render-entry.ts +0 -131
  451. package/src/internal/v2/render-sync-parts.ts +0 -440
  452. package/src/internal/v2/render.ts +0 -813
  453. package/src/internal/v2/sync-parts.ts +0 -133
package/src/Parser.ts CHANGED
@@ -1,14 +1,602 @@
1
+ /* eslint-disable no-restricted-syntax */
2
+
3
+ import type { IToken } from "html5parser";
4
+ import { tokenize } from "html5parser";
5
+ import { keyToPartType } from "./internal/keyToPartType.js";
6
+ import { PART_STRING } from "./internal/meta.js";
7
+ import { PathStack } from "./internal/PathStack.js";
8
+ import { templateHash } from "./internal/templateHash.js";
9
+ import * as Template from "./Template.js";
10
+
11
+ let parser: Parser | undefined;
1
12
  /**
13
+ * Parses a template string array (from a tagged template literal) into a reusable `Template` object.
14
+ *
15
+ * This parser handles:
16
+ * - Standard HTML structure (elements, attributes, text, comments).
17
+ * - Custom part syntax for interpolation (e.g., `${value}`).
18
+ * - Special attributes like `.property`, `@event`, `?boolean`.
19
+ * - Self-closing tags and text-only elements (script, style).
20
+ *
21
+ * The result is a cached `Template` instance that contains the static AST and dynamic part locations.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * import { parse } from "@typed/template/Parser"
26
+ * import * as Template from "@typed/template/Template"
27
+ *
28
+ * // Parse a template
29
+ * const template = parse`<div id=${"my-id"} class="container">
30
+ * <p>Hello, ${"world"}!</p>
31
+ * </div>`
32
+ *
33
+ * // Access parsed structure
34
+ * console.log(template.nodes) // Array of parsed nodes
35
+ * console.log(template.parts) // Array of dynamic interpolation points
36
+ * console.log(template.hash) // Unique hash for the template
37
+ * ```
38
+ *
39
+ * @param template - The template strings array from a tagged template literal.
40
+ * @returns A `Template` object representing the parsed structure.
2
41
  * @since 1.0.0
42
+ * @category parsing
3
43
  */
44
+ export function parse(template: ReadonlyArray<string>): Template.Template {
45
+ parser ??= new Parser();
46
+ return parser.parse(template);
47
+ }
48
+
49
+ class Parser {
50
+ protected html!: string;
51
+ protected tokens!: Array<IToken>;
52
+ protected index!: number;
53
+ protected parts!: Array<
54
+ readonly [part: Template.PartNode | Template.SparsePartNode, path: Array<number>]
55
+ >;
56
+ protected path!: PathStack;
57
+
58
+ parse(templateStrings: ReadonlyArray<string>): Template.Template {
59
+ this.init(templateStrings);
60
+ return new Template.Template(this.parseNodes(), templateHash(templateStrings), this.parts);
61
+ }
62
+
63
+ private init(templateStrings: ReadonlyArray<string>) {
64
+ this.html = templateWithParts(templateStrings);
65
+ this.tokens = tokenize(this.html);
66
+ this.index = 0;
67
+ this.parts = [];
68
+ this.path = new PathStack();
69
+ }
70
+
71
+ private peek(): IToken | undefined {
72
+ return this.tokens[this.index];
73
+ }
74
+
75
+ // eslint-disable-next-line @typescript-eslint/consistent-type-imports
76
+ private consumeNextTokenOfKind(kind: import("html5parser").TokenKind) {
77
+ const token = this.tokens[this.index];
78
+ if (token.type !== kind) {
79
+ throw new Error(`Expected ${TokenKindToName[kind]} but got ${TokenKindToName[token.type]}`);
80
+ }
81
+ this.index++;
82
+ return token;
83
+ }
84
+
85
+ private consumeWhitespace() {
86
+ while (this.tokens[this.index]?.type === TokenKind.Whitespace) {
87
+ this.index++;
88
+ }
89
+ }
90
+
91
+ // eslint-disable-next-line @typescript-eslint/consistent-type-imports
92
+ private consumeNextTokenOfKinds(...kinds: Array<import("html5parser").TokenKind>) {
93
+ const token = this.tokens[this.index];
94
+ if (!kinds.includes(token.type)) {
95
+ throw new Error(
96
+ `Expected ${kinds.map((kind) => TokenKindToName[kind]).join(" or ")} but got ${TokenKindToName[token.type]}`,
97
+ );
98
+ }
99
+ this.index++;
100
+ return token;
101
+ }
102
+
103
+ private parseNodes(): Array<Template.Node> {
104
+ const nodes: Array<Template.Node> = [];
105
+
106
+ while (this.index < this.tokens.length) {
107
+ const token = this.consumeNextTokenOfKinds(
108
+ TokenKind.Literal,
109
+ TokenKind.OpenTag,
110
+ TokenKind.CloseTag,
111
+ TokenKind.Whitespace,
112
+ );
113
+
114
+ if (token.type === TokenKind.Literal) {
115
+ nodes.push(...this.parseNodeParts(token));
116
+ } else if (token.type === TokenKind.OpenTag) {
117
+ nodes.push(this.parseOpenTag(token));
118
+ this.path.inc();
119
+ } else if (token.type === TokenKind.CloseTag) {
120
+ this.consumeWhitespace();
121
+ break;
122
+ } else if (nodes.length > 0) {
123
+ nodes.push(new Template.TextNode(token.value));
124
+ this.path.inc();
125
+ }
126
+ }
127
+
128
+ return nodes;
129
+ }
130
+
131
+ private parseNodeParts(literal: IToken): Array<Template.Node> {
132
+ return parseTextAndParts(
133
+ literal.value,
134
+ (index) => this.addPartWithPrevious(new Template.NodePart(index)),
135
+ () => this.path.inc(),
136
+ );
137
+ }
138
+
139
+ private parseOpenTag({ value }: IToken): Template.Node {
140
+ if (value === "!--") return this.parseCommentNode();
141
+ if (value === "!doctype") return this.parseDocTypeNode();
142
+ if (SELF_CLOSING_TAGS.has(value)) return this.parseSelfClosingElementNode(value);
143
+ if (TEXT_ONLY_NODES_REGEX.has(value)) return this.parseTextOnlyElementNode(value);
144
+ // All other elements
145
+ const { attributes, wasSelfClosed } = this.parseAttributes();
146
+ const children = wasSelfClosed ? [] : this.parseChildren();
147
+ return new Template.ElementNode(value, attributes, children);
148
+ }
149
+
150
+ private parseChildren() {
151
+ this.path.push();
152
+ const children = this.parseNodes();
153
+ this.path.pop();
154
+ return children;
155
+ }
156
+
157
+ private parseCommentNode(): Template.Node {
158
+ const { value } = this.consumeNextTokenOfKind(TokenKind.Literal);
159
+ this.consumeNextTokenOfKind(TokenKind.OpenTagEnd);
160
+
161
+ return this.parseMultipleParts(
162
+ value,
163
+ (index) => new Template.CommentPartNode(index),
164
+ (text) => new Template.CommentNode(text.value),
165
+ (parts) => new Template.SparseCommentNode(parts),
166
+ );
167
+ }
168
+
169
+ private parseDocTypeNode(): Template.Node {
170
+ this.consumeWhitespace();
171
+
172
+ // Try to parse the name
173
+ const parsedName = this.parseLiteralLike();
174
+ if (parsedName.closed) return new Template.DocType("html");
175
+ const name = parsedName.value ?? "html";
176
+
177
+ const { closed, publicId, systemId } = this.parseDocTypeIds();
178
+
179
+ if (!closed) {
180
+ this.consumeWhitespace();
181
+ this.consumeNextTokenOfKind(TokenKind.OpenTagEnd);
182
+ }
183
+
184
+ return new Template.DocType(name, publicId, systemId);
185
+ }
186
+
187
+ private parseDocTypeIds(): {
188
+ closed: boolean;
189
+ publicId: string | undefined;
190
+ systemId: string | undefined;
191
+ } {
192
+ const firstIdType = this.parseDocTypeId();
193
+ if (firstIdType.closed) return firstIdType;
194
+ const secondIdType = this.parseDocTypeId();
195
+ return {
196
+ closed: secondIdType.closed,
197
+ publicId: secondIdType.publicId ?? firstIdType.publicId,
198
+ systemId: secondIdType.systemId ?? firstIdType.systemId,
199
+ };
200
+ }
201
+
202
+ private parseDocTypeId(): {
203
+ closed: boolean;
204
+ publicId: string | undefined;
205
+ systemId: string | undefined;
206
+ } {
207
+ const parsedIdType = this.parseLiteralLike();
208
+
209
+ if (parsedIdType.closed || parsedIdType.value === null) {
210
+ return { closed: parsedIdType.closed, publicId: undefined, systemId: undefined };
211
+ }
212
+
213
+ const value = parsedIdType.value.toLowerCase();
214
+ if (value === "public" || value === "system") {
215
+ const parsedLiteral = this.parseLiteralLike();
216
+ if (parsedLiteral.closed || parsedLiteral.value === null) {
217
+ return { closed: parsedLiteral.closed, publicId: undefined, systemId: undefined };
218
+ }
219
+ return {
220
+ closed: false,
221
+ publicId: value === "public" ? parsedLiteral.value : undefined,
222
+ systemId: value === "system" ? parsedLiteral.value : undefined,
223
+ };
224
+ }
225
+
226
+ return { closed: false, publicId: undefined, systemId: undefined };
227
+ }
228
+
229
+ private parseLiteralLike(): {
230
+ closed: boolean;
231
+ value: string | null;
232
+ } {
233
+ this.consumeWhitespace();
234
+
235
+ const { type, value } = this.consumeNextTokenOfKinds(
236
+ TokenKind.Literal,
237
+ TokenKind.AttrValueNq,
238
+ TokenKind.AttrValueDq,
239
+ TokenKind.AttrValueSq,
240
+ TokenKind.OpenTagEnd,
241
+ );
242
+
243
+ if (type === TokenKind.OpenTagEnd) return { closed: true, value: null };
244
+ if (type === TokenKind.Literal || type === TokenKind.AttrValueNq)
245
+ return { closed: false, value };
246
+ if (type === TokenKind.AttrValueDq || type === TokenKind.AttrValueSq) {
247
+ return { closed: false, value: value.slice(1, -1) };
248
+ }
249
+ throw new Error(`Unexpected token ${TokenKindToName[type]} in place of literal`);
250
+ }
251
+
252
+ private parseSelfClosingElementNode(name: string): Template.Node {
253
+ const { attributes } = this.parseAttributes();
254
+ return new Template.SelfClosingElementNode(name, attributes);
255
+ }
256
+
257
+ private parseTextOnlyElementNode(name: string): Template.Node {
258
+ const { attributes, wasSelfClosed } = this.parseAttributes();
259
+ const textContent = wasSelfClosed ? null : this.parseTextOnlyChildren();
260
+ return new Template.TextOnlyElement(name, attributes, textContent);
261
+ }
262
+
263
+ private parseAttributes(): {
264
+ attributes: Array<Template.Attribute>;
265
+ wasSelfClosed: boolean;
266
+ } {
267
+ let wasSelfClosed = false;
268
+ const attributes: Array<Template.Attribute> = [];
269
+
270
+ this.consumeWhitespace();
271
+
272
+ while (this.index < this.tokens.length) {
273
+ const token = this.peek()!;
274
+
275
+ if (token.type === TokenKind.OpenTagEnd) {
276
+ this.index++;
277
+ wasSelfClosed = token.value === "/";
278
+ this.consumeWhitespace();
279
+ break;
280
+ }
281
+
282
+ if (token.type === TokenKind.Whitespace) {
283
+ this.index++;
284
+ continue;
285
+ }
286
+
287
+ const { attribute, isSelfClosed, shouldContinue } = this.parseAttribute();
288
+ attributes.push(attribute);
289
+ wasSelfClosed ||= isSelfClosed;
290
+ if (!shouldContinue) {
291
+ this.consumeWhitespace();
292
+ break;
293
+ }
294
+ }
295
+
296
+ return {
297
+ attributes,
298
+ wasSelfClosed,
299
+ };
300
+ }
301
+
302
+ private parseAttribute(): {
303
+ shouldContinue: boolean;
304
+ isSelfClosed: boolean;
305
+ attribute: Template.Attribute;
306
+ } {
307
+ const { value: name } = this.consumeNextTokenOfKind(TokenKind.AttrValueNq);
308
+
309
+ if (isSpreadAttribute(name)) {
310
+ return {
311
+ shouldContinue: true,
312
+ isSelfClosed: false,
313
+ attribute: this.parsePropertiesAttribute(name.slice(3)),
314
+ };
315
+ }
316
+
317
+ const next = this.consumeNextTokenOfKinds(
318
+ TokenKind.AttrValueEq,
319
+ TokenKind.Whitespace,
320
+ TokenKind.OpenTagEnd,
321
+ );
322
+
323
+ if (next.type === TokenKind.AttrValueEq) {
324
+ const { type, value } = this.consumeNextTokenOfKinds(
325
+ TokenKind.AttrValueDq,
326
+ TokenKind.AttrValueSq,
327
+ TokenKind.AttrValueNq,
328
+ );
329
+ return {
330
+ shouldContinue: true,
331
+ isSelfClosed: false,
332
+ attribute: this.parseAttributeWithValue(
333
+ name,
334
+ type === TokenKind.AttrValueNq ? value : value.slice(1, -1),
335
+ ),
336
+ };
337
+ } else if (next.type === TokenKind.Whitespace) {
338
+ return {
339
+ shouldContinue: true,
340
+ isSelfClosed: false,
341
+ attribute: new Template.BooleanNode(name),
342
+ };
343
+ } else if (next.type === TokenKind.OpenTagEnd) {
344
+ this.consumeWhitespace();
345
+ return {
346
+ shouldContinue: false,
347
+ isSelfClosed: next.value === "/",
348
+ attribute: new Template.BooleanNode(name),
349
+ };
350
+ } else {
351
+ throw new Error(`Unexpected token ${TokenKindToName[next.type]} in place of attribute`);
352
+ }
353
+ }
354
+
355
+ private parseAttributeWithValue(
356
+ rawName: string,
357
+ value: string,
358
+ ): Template.Attribute | Template.SparseAttrNode {
359
+ const [match, name] = keyToPartType(rawName);
360
+ switch (match) {
361
+ case "attr":
362
+ return this.parseAttributePart(value, name);
363
+ case "boolean":
364
+ return this.parseBooleanAttribute(value, name);
365
+ case "class":
366
+ return this.parseClassNameAttribute(value);
367
+ case "data":
368
+ return this.parseDataAttribute(value);
369
+ case "event":
370
+ return this.parseEventAttribute(value, name);
371
+ case "properties":
372
+ return this.parsePropertiesAttribute(value);
373
+ case "property":
374
+ return this.parsePropertyAttribute(value, name);
375
+ case "ref":
376
+ return this.parseRefAttribute(value);
377
+ }
378
+ }
379
+
380
+ private parseAttributePart(
381
+ value: string,
382
+ name: string,
383
+ ): Template.Attribute | Template.SparseAttrNode {
384
+ return this.parseMultipleParts(
385
+ value,
386
+ (index) => new Template.AttrPartNode(name, index),
387
+ (text) => new Template.AttributeNode(name, text.value),
388
+ (parts) => new Template.SparseAttrNode(name, parts),
389
+ );
390
+ }
391
+
392
+ private parseBooleanAttribute(
393
+ value: string,
394
+ name: string,
395
+ ): Template.BooleanNode | Template.BooleanPartNode {
396
+ return this.parseMultipleParts(
397
+ value,
398
+ (index) => new Template.BooleanPartNode(name, index),
399
+ () => new Template.BooleanNode(name),
400
+ () => {
401
+ throw new Error("Boolean attributes cannot have multiple parts");
402
+ },
403
+ );
404
+ }
405
+
406
+ private parseClassNameAttribute(
407
+ value: string,
408
+ ): Template.AttributeNode | Template.ClassNamePartNode | Template.SparseClassNameNode {
409
+ return this.parseMultipleParts(
410
+ value,
411
+ (index) => new Template.ClassNamePartNode(index),
412
+ (text) => new Template.AttributeNode("class", text.value.trim()),
413
+ (parts) => new Template.SparseClassNameNode(parts),
414
+ );
415
+ }
416
+
417
+ private parseDataAttribute(value: string): Template.AttributeNode | Template.DataPartNode {
418
+ return this.addPart(new Template.DataPartNode(unsafeParsePartIndex(value)));
419
+ }
420
+
421
+ private parseEventAttribute(
422
+ value: string,
423
+ name: string,
424
+ ): Template.AttributeNode | Template.EventPartNode {
425
+ return this.addPart(new Template.EventPartNode(name, unsafeParsePartIndex(value)));
426
+ }
427
+
428
+ private parsePropertyAttribute(
429
+ value: string,
430
+ name: string,
431
+ ): Template.AttributeNode | Template.PropertyPartNode {
432
+ return this.addPart(new Template.PropertyPartNode(name, unsafeParsePartIndex(value)));
433
+ }
434
+
435
+ private parsePropertiesAttribute(
436
+ value: string,
437
+ ): Template.AttributeNode | Template.PropertiesPartNode {
438
+ return this.addPart(new Template.PropertiesPartNode(unsafeParsePartIndex(value)));
439
+ }
440
+
441
+ private parseRefAttribute(value: string): Template.AttributeNode | Template.RefPartNode {
442
+ return this.addPart(new Template.RefPartNode(unsafeParsePartIndex(value)));
443
+ }
444
+
445
+ private parseTextOnlyChildren(): Template.Text | null {
446
+ const { type, value } = this.consumeNextTokenOfKinds(TokenKind.Literal, TokenKind.CloseTag);
447
+
448
+ if (type === TokenKind.Literal) {
449
+ this.consumeNextTokenOfKind(TokenKind.CloseTag);
450
+ return this.parseMultipleParts(
451
+ value,
452
+ (index) => new Template.TextPartNode(index),
453
+ (text) => text,
454
+ (parts) => new Template.SparseTextNode(parts),
455
+ );
456
+ }
457
+ this.consumeWhitespace();
458
+ return null;
459
+ }
460
+
461
+ private parseMultipleParts<
462
+ T extends Template.PartNode,
463
+ T2 extends Template.Attribute | Template.Node,
464
+ U extends Template.SparsePartNode,
465
+ >(
466
+ value: string,
467
+ createPart: (index: number) => T,
468
+ onSingleTextNode: (text: Template.TextNode) => T2,
469
+ onMultiParts: (parts: Array<T | Template.TextNode>) => U,
470
+ ): T | T2 | U {
471
+ const parts = parseTextAndParts(value, createPart);
472
+ if (parts.length === 1) {
473
+ if (parts[0]._tag === "text") return onSingleTextNode(parts[0]);
474
+ return this.addPart(parts[0]);
475
+ }
476
+ return this.addPart(onMultiParts(parts));
477
+ }
478
+
479
+ private addPart<T extends Template.PartNode | Template.SparsePartNode>(part: T): T {
480
+ this.parts.push([part, this.path.toChunk()]);
481
+ return part;
482
+ }
483
+
484
+ private addPartWithPrevious<T extends Template.PartNode | Template.SparsePartNode>(part: T): T {
485
+ this.parts.push([part, this.path.previousChunk()]);
486
+ this.path.inc(); // Nodes will be inserted as a comment
487
+ return part;
488
+ }
489
+ }
490
+
491
+ const TEXT_ONLY_NODES_REGEX = new Set(["textarea", "script", "style", "title", "plaintext", "xmp"]);
492
+
493
+ const SELF_CLOSING_TAGS = new Set([
494
+ "area",
495
+ "base",
496
+ "br",
497
+ "col",
498
+ "command",
499
+ "embed",
500
+ "hr",
501
+ "img",
502
+ "input",
503
+ "keygen",
504
+ "link",
505
+ "meta",
506
+ "param",
507
+ "source",
508
+ "track",
509
+ "wbr",
510
+ ]);
511
+
512
+ const TokenKind = {
513
+ /* eslint-disable @typescript-eslint/consistent-type-imports */
514
+ Literal: 0 as import("html5parser").TokenKind.Literal,
515
+ OpenTag: 1 as import("html5parser").TokenKind.OpenTag,
516
+ OpenTagEnd: 2 as import("html5parser").TokenKind.OpenTagEnd,
517
+ CloseTag: 3 as import("html5parser").TokenKind.CloseTag,
518
+ Whitespace: 4 as import("html5parser").TokenKind.Whitespace,
519
+ AttrValueEq: 5 as import("html5parser").TokenKind.AttrValueEq,
520
+ AttrValueNq: 6 as import("html5parser").TokenKind.AttrValueNq,
521
+ AttrValueSq: 7 as import("html5parser").TokenKind.AttrValueSq,
522
+ AttrValueDq: 8 as import("html5parser").TokenKind.AttrValueDq,
523
+ /* eslint-enable @typescript-eslint/consistent-type-imports */
524
+ } as const;
525
+
526
+ const TokenKindToName = {
527
+ [TokenKind.Literal]: "Literal",
528
+ [TokenKind.OpenTag]: "OpenTag",
529
+ [TokenKind.OpenTagEnd]: "OpenTagEnd",
530
+ [TokenKind.CloseTag]: "CloseTag",
531
+ [TokenKind.Whitespace]: "Whitespace",
532
+ [TokenKind.AttrValueEq]: "AttrValueEq",
533
+ [TokenKind.AttrValueNq]: "AttrValueNq",
534
+ [TokenKind.AttrValueSq]: "AttrValueSq",
535
+ [TokenKind.AttrValueDq]: "AttrValueDq",
536
+ } as const;
537
+
538
+ function templateWithParts(template: ReadonlyArray<string>): string {
539
+ const length = template.length;
540
+ if (length === 0) return "";
541
+
542
+ // oxlint-disable-next-line no-new-array
543
+ const parts: Array<string> = new Array(length + length - 1);
544
+
545
+ let j = 0;
546
+ for (let i = 0; i < length; i++) {
547
+ parts[j++] = template[i];
548
+ if (i !== length - 1) {
549
+ parts[j++] = PART_STRING(i);
550
+ }
551
+ }
552
+
553
+ return parts.join("");
554
+ }
555
+
556
+ function parseTextAndParts<T>(
557
+ s: string,
558
+ createPartFromIndex: (index: number) => T,
559
+ onTextNodeInserted?: () => void,
560
+ ): Array<Template.TextNode | T> {
561
+ const out: Array<Template.TextNode | T> = [];
562
+ let pos = 0;
563
+ let foundAny = false;
564
+
565
+ while (true) {
566
+ const start = s.indexOf("{{", pos);
567
+ if (start === -1) break;
568
+
569
+ const end = s.indexOf("}}", start + 2);
570
+ if (end === -1) break;
571
+
572
+ const before = s.slice(pos, start);
573
+ pos = end + 2;
574
+
575
+ // Before first part: skip whitespace-only. Between parts: only skip empty.
576
+ if (before !== "" && (foundAny || /\S/.test(before))) {
577
+ out.push(new Template.TextNode(before));
578
+ onTextNodeInserted?.();
579
+ }
580
+
581
+ foundAny = true;
582
+ out.push(createPartFromIndex(+s.slice(start + 2, end)));
583
+ }
584
+
585
+ const after = s.slice(pos);
586
+ // After last part (or entire string if no parts): skip whitespace-only
587
+ if (after !== "" && /\S/.test(after)) {
588
+ out.push(new Template.TextNode(after));
589
+ onTextNodeInserted?.();
590
+ }
591
+
592
+ return out;
593
+ }
594
+
595
+ // Only to be utilized when parsing positions which MUST be a single part.
596
+ function unsafeParsePartIndex(text: string): number {
597
+ return parseInt(text.slice(2, -2), 10);
598
+ }
4
599
 
5
- export {
6
- /**
7
- * @since 1.0.0
8
- */
9
- parse,
10
- /**
11
- * @since 1.0.0
12
- */
13
- templateHash
14
- } from "./internal/parser2.js"
600
+ function isSpreadAttribute(rawName: string): boolean {
601
+ return rawName[0] === "." && rawName[1] === "." && rawName[2] === ".";
602
+ }