@saolabs/client 1.0.0 → 1.0.2

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 (378) hide show
  1. package/README.md +52 -195
  2. package/dist/index.d.ts +20 -5
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +14 -3
  5. package/dist/index.js.map +1 -1
  6. package/dist/plugins.d.ts +2 -2
  7. package/dist/plugins.js +2 -2
  8. package/dist/src/core/app/Application.d.ts +17 -15
  9. package/dist/src/core/app/Application.d.ts.map +1 -1
  10. package/dist/src/core/app/Application.js +41 -18
  11. package/dist/src/core/app/Application.js.map +1 -1
  12. package/dist/src/core/bootstrap/app.d.ts +1 -1
  13. package/dist/src/core/bootstrap/app.d.ts.map +1 -1
  14. package/dist/src/core/bootstrap/app.js +74 -4
  15. package/dist/src/core/bootstrap/app.js.map +1 -1
  16. package/dist/src/core/bootstrap/bundle.d.ts +41 -0
  17. package/dist/src/core/bootstrap/bundle.d.ts.map +1 -0
  18. package/dist/src/core/bootstrap/bundle.js +98 -0
  19. package/dist/src/core/bootstrap/bundle.js.map +1 -0
  20. package/dist/src/core/bootstrap/providers/ApiServiceProvider.d.ts +1 -1
  21. package/dist/src/core/bootstrap/providers/ApiServiceProvider.d.ts.map +1 -1
  22. package/dist/src/core/bootstrap/providers/ApiServiceProvider.js +3 -3
  23. package/dist/src/core/bootstrap/providers/ApiServiceProvider.js.map +1 -1
  24. package/dist/src/core/bootstrap/providers/CoreServiceProvider.d.ts +1 -1
  25. package/dist/src/core/bootstrap/providers/CoreServiceProvider.d.ts.map +1 -1
  26. package/dist/src/core/bootstrap/providers/CoreServiceProvider.js +11 -8
  27. package/dist/src/core/bootstrap/providers/CoreServiceProvider.js.map +1 -1
  28. package/dist/src/core/bootstrap/providers/HelperServiceProvider.d.ts +3 -1
  29. package/dist/src/core/bootstrap/providers/HelperServiceProvider.d.ts.map +1 -1
  30. package/dist/src/core/bootstrap/providers/HelperServiceProvider.js +8 -3
  31. package/dist/src/core/bootstrap/providers/HelperServiceProvider.js.map +1 -1
  32. package/dist/src/core/bootstrap/providers/RouteServiceProvider.d.ts +2 -1
  33. package/dist/src/core/bootstrap/providers/RouteServiceProvider.d.ts.map +1 -1
  34. package/dist/src/core/bootstrap/providers/RouteServiceProvider.js +14 -4
  35. package/dist/src/core/bootstrap/providers/RouteServiceProvider.js.map +1 -1
  36. package/dist/src/core/bootstrap/providers/ServiceProvider.d.ts +4 -4
  37. package/dist/src/core/bootstrap/providers/ServiceProvider.d.ts.map +1 -1
  38. package/dist/src/core/bootstrap/providers/ServiceProvider.js +5 -5
  39. package/dist/src/core/bootstrap/providers/ServiceProvider.js.map +1 -1
  40. package/dist/src/core/bootstrap/providers/ViewServiceProvider.d.ts +1 -1
  41. package/dist/src/core/bootstrap/providers/ViewServiceProvider.d.ts.map +1 -1
  42. package/dist/src/core/bootstrap/providers/ViewServiceProvider.js +3 -3
  43. package/dist/src/core/bootstrap/providers/ViewServiceProvider.js.map +1 -1
  44. package/dist/src/core/bootstrap/providers/default-providers.d.ts +1 -1
  45. package/dist/src/core/bootstrap/providers/default-providers.d.ts.map +1 -1
  46. package/dist/src/core/bootstrap/providers/default-providers.js +44 -11
  47. package/dist/src/core/bootstrap/providers/default-providers.js.map +1 -1
  48. package/dist/src/core/bootstrap/providers/index.d.ts +9 -9
  49. package/dist/src/core/bootstrap/providers/index.d.ts.map +1 -1
  50. package/dist/src/core/bootstrap/providers/index.js +8 -8
  51. package/dist/src/core/bootstrap/providers/index.js.map +1 -1
  52. package/dist/src/core/bootstrap/providers/provider-order.d.ts +1 -1
  53. package/dist/src/core/bootstrap/providers/provider-order.d.ts.map +1 -1
  54. package/dist/src/core/bootstrap/ssr.d.ts +47 -0
  55. package/dist/src/core/bootstrap/ssr.d.ts.map +1 -0
  56. package/dist/src/core/bootstrap/ssr.js +125 -0
  57. package/dist/src/core/bootstrap/ssr.js.map +1 -0
  58. package/dist/src/core/cache/ViewCache.d.ts +1 -1
  59. package/dist/src/core/cache/ViewCache.d.ts.map +1 -1
  60. package/dist/src/core/cache/index.d.ts +1 -1
  61. package/dist/src/core/cache/index.d.ts.map +1 -1
  62. package/dist/src/core/cache/index.js +1 -1
  63. package/dist/src/core/cache/index.js.map +1 -1
  64. package/dist/src/core/contracts/ApplicationInterface.d.ts +13 -11
  65. package/dist/src/core/contracts/ApplicationInterface.d.ts.map +1 -1
  66. package/dist/src/core/contracts/BlockInterface.d.ts +10 -10
  67. package/dist/src/core/contracts/BlockInterface.d.ts.map +1 -1
  68. package/dist/src/core/contracts/BundleInterface.d.ts +38 -0
  69. package/dist/src/core/contracts/BundleInterface.d.ts.map +1 -0
  70. package/dist/src/core/contracts/BundleInterface.js +2 -0
  71. package/dist/src/core/contracts/BundleInterface.js.map +1 -0
  72. package/dist/src/core/contracts/ComponentInterface.d.ts +7 -6
  73. package/dist/src/core/contracts/ComponentInterface.d.ts.map +1 -1
  74. package/dist/src/core/contracts/ElementInterface.d.ts +91 -27
  75. package/dist/src/core/contracts/ElementInterface.d.ts.map +1 -1
  76. package/dist/src/core/contracts/HeadServiceInterface.d.ts +37 -0
  77. package/dist/src/core/contracts/HeadServiceInterface.d.ts.map +1 -0
  78. package/dist/src/core/contracts/HeadServiceInterface.js +3 -0
  79. package/dist/src/core/contracts/HeadServiceInterface.js.map +1 -0
  80. package/dist/src/core/contracts/HelperInterface.d.ts +9 -1
  81. package/dist/src/core/contracts/HelperInterface.d.ts.map +1 -1
  82. package/dist/src/core/contracts/HttpServiceInterface.d.ts +3 -0
  83. package/dist/src/core/contracts/HttpServiceInterface.d.ts.map +1 -1
  84. package/dist/src/core/contracts/MarkerInterface.d.ts +29 -44
  85. package/dist/src/core/contracts/MarkerInterface.d.ts.map +1 -1
  86. package/dist/src/core/contracts/ReactiveInterface.d.ts +9 -9
  87. package/dist/src/core/contracts/ReactiveInterface.d.ts.map +1 -1
  88. package/dist/src/core/contracts/RouterInterface.d.ts +5 -2
  89. package/dist/src/core/contracts/RouterInterface.d.ts.map +1 -1
  90. package/dist/src/core/contracts/SectionInterface.d.ts +48 -0
  91. package/dist/src/core/contracts/SectionInterface.d.ts.map +1 -0
  92. package/dist/src/core/contracts/SectionInterface.js +2 -0
  93. package/dist/src/core/contracts/SectionInterface.js.map +1 -0
  94. package/dist/src/core/contracts/ServiceProviderInterface.d.ts +3 -3
  95. package/dist/src/core/contracts/ServiceProviderInterface.d.ts.map +1 -1
  96. package/dist/src/core/contracts/ViewControllerInterface.d.ts +116 -15
  97. package/dist/src/core/contracts/ViewControllerInterface.d.ts.map +1 -1
  98. package/dist/src/core/contracts/ViewInterface.d.ts +31 -5
  99. package/dist/src/core/contracts/ViewInterface.d.ts.map +1 -1
  100. package/dist/src/core/contracts/ViewManagerInterface.d.ts +47 -5
  101. package/dist/src/core/contracts/ViewManagerInterface.d.ts.map +1 -1
  102. package/dist/src/core/contracts/ViewStateInterface.d.ts +39 -2
  103. package/dist/src/core/contracts/ViewStateInterface.d.ts.map +1 -1
  104. package/dist/src/core/contracts/common.d.ts +3 -3
  105. package/dist/src/core/contracts/common.js +3 -3
  106. package/dist/src/core/contracts/utils.d.ts +19 -19
  107. package/dist/src/core/contracts/utils.d.ts.map +1 -1
  108. package/dist/src/core/contracts/views.d.ts +1 -22
  109. package/dist/src/core/contracts/views.d.ts.map +1 -1
  110. package/dist/src/core/devtools/hook.d.ts +66 -0
  111. package/dist/src/core/devtools/hook.d.ts.map +1 -0
  112. package/dist/src/core/devtools/hook.js +114 -0
  113. package/dist/src/core/devtools/hook.js.map +1 -0
  114. package/dist/src/core/devtools/index.d.ts +34 -0
  115. package/dist/src/core/devtools/index.d.ts.map +1 -0
  116. package/dist/src/core/devtools/index.js +33 -0
  117. package/dist/src/core/devtools/index.js.map +1 -0
  118. package/dist/src/core/devtools/inspector.d.ts +31 -0
  119. package/dist/src/core/devtools/inspector.d.ts.map +1 -0
  120. package/dist/src/core/devtools/inspector.js +249 -0
  121. package/dist/src/core/devtools/inspector.js.map +1 -0
  122. package/dist/src/core/elements/Block.d.ts +9 -7
  123. package/dist/src/core/elements/Block.d.ts.map +1 -1
  124. package/dist/src/core/elements/Block.js +33 -9
  125. package/dist/src/core/elements/Block.js.map +1 -1
  126. package/dist/src/core/elements/BlockOutlet.d.ts +19 -8
  127. package/dist/src/core/elements/BlockOutlet.d.ts.map +1 -1
  128. package/dist/src/core/elements/BlockOutlet.js +57 -13
  129. package/dist/src/core/elements/BlockOutlet.js.map +1 -1
  130. package/dist/src/core/elements/Component.d.ts +83 -11
  131. package/dist/src/core/elements/Component.d.ts.map +1 -1
  132. package/dist/src/core/elements/Component.js +334 -13
  133. package/dist/src/core/elements/Component.js.map +1 -1
  134. package/dist/src/core/elements/ForeachSlotCache.d.ts +95 -0
  135. package/dist/src/core/elements/ForeachSlotCache.d.ts.map +1 -0
  136. package/dist/src/core/elements/ForeachSlotCache.js +149 -0
  137. package/dist/src/core/elements/ForeachSlotCache.js.map +1 -0
  138. package/dist/src/core/elements/Fragment.d.ts +19 -13
  139. package/dist/src/core/elements/Fragment.d.ts.map +1 -1
  140. package/dist/src/core/elements/Fragment.js +43 -20
  141. package/dist/src/core/elements/Fragment.js.map +1 -1
  142. package/dist/src/core/elements/Html.d.ts +89 -12
  143. package/dist/src/core/elements/Html.d.ts.map +1 -1
  144. package/dist/src/core/elements/Html.js +707 -106
  145. package/dist/src/core/elements/Html.js.map +1 -1
  146. package/dist/src/core/elements/Output.d.ts +34 -10
  147. package/dist/src/core/elements/Output.d.ts.map +1 -1
  148. package/dist/src/core/elements/Output.js +141 -26
  149. package/dist/src/core/elements/Output.js.map +1 -1
  150. package/dist/src/core/elements/Reactive.d.ts +85 -14
  151. package/dist/src/core/elements/Reactive.d.ts.map +1 -1
  152. package/dist/src/core/elements/Reactive.js +315 -41
  153. package/dist/src/core/elements/Reactive.js.map +1 -1
  154. package/dist/src/core/elements/TextElement.d.ts +11 -7
  155. package/dist/src/core/elements/TextElement.d.ts.map +1 -1
  156. package/dist/src/core/elements/TextElement.js +18 -11
  157. package/dist/src/core/elements/TextElement.js.map +1 -1
  158. package/dist/src/core/elements/Wrapper.d.ts +24 -13
  159. package/dist/src/core/elements/Wrapper.d.ts.map +1 -1
  160. package/dist/src/core/elements/Wrapper.js +65 -8
  161. package/dist/src/core/elements/Wrapper.js.map +1 -1
  162. package/dist/src/core/elements/Yield.d.ts +10 -9
  163. package/dist/src/core/elements/Yield.d.ts.map +1 -1
  164. package/dist/src/core/elements/Yield.js +31 -19
  165. package/dist/src/core/elements/Yield.js.map +1 -1
  166. package/dist/src/core/elements/helpers.d.ts +7 -7
  167. package/dist/src/core/elements/helpers.d.ts.map +1 -1
  168. package/dist/src/core/elements/helpers.js +4 -4
  169. package/dist/src/core/elements/index.d.ts +12 -11
  170. package/dist/src/core/elements/index.d.ts.map +1 -1
  171. package/dist/src/core/elements/index.js +12 -11
  172. package/dist/src/core/elements/index.js.map +1 -1
  173. package/dist/src/core/elements/reconcileChildren.d.ts +7 -0
  174. package/dist/src/core/elements/reconcileChildren.d.ts.map +1 -0
  175. package/dist/src/core/elements/reconcileChildren.js +74 -0
  176. package/dist/src/core/elements/reconcileChildren.js.map +1 -0
  177. package/dist/src/core/hellpers/utils.d.ts +2 -2
  178. package/dist/src/core/hellpers/utils.js +4 -4
  179. package/dist/src/core/helpers/ApiClient.d.ts +58 -0
  180. package/dist/src/core/helpers/ApiClient.d.ts.map +1 -0
  181. package/dist/src/core/helpers/ApiClient.js +131 -0
  182. package/dist/src/core/helpers/ApiClient.js.map +1 -0
  183. package/dist/src/core/helpers/app.d.ts +3 -0
  184. package/dist/src/core/helpers/app.d.ts.map +1 -0
  185. package/dist/src/core/helpers/app.js +63 -0
  186. package/dist/src/core/helpers/app.js.map +1 -0
  187. package/dist/src/core/helpers/transition.d.ts +34 -0
  188. package/dist/src/core/helpers/transition.d.ts.map +1 -0
  189. package/dist/src/core/helpers/transition.js +118 -0
  190. package/dist/src/core/helpers/transition.js.map +1 -0
  191. package/dist/src/core/helpers/utils.d.ts +26 -0
  192. package/dist/src/core/helpers/utils.d.ts.map +1 -0
  193. package/dist/src/core/helpers/utils.js +96 -0
  194. package/dist/src/core/helpers/utils.js.map +1 -0
  195. package/dist/src/core/helpers/view.d.ts +39 -0
  196. package/dist/src/core/helpers/view.d.ts.map +1 -0
  197. package/dist/src/core/helpers/view.js +286 -0
  198. package/dist/src/core/helpers/view.js.map +1 -0
  199. package/dist/src/core/routers/Router.d.ts +108 -7
  200. package/dist/src/core/routers/Router.d.ts.map +1 -1
  201. package/dist/src/core/routers/Router.js +444 -68
  202. package/dist/src/core/routers/Router.js.map +1 -1
  203. package/dist/src/core/routers/index.d.ts +2 -2
  204. package/dist/src/core/routers/index.d.ts.map +1 -1
  205. package/dist/src/core/routers/index.js +1 -1
  206. package/dist/src/core/routers/index.js.map +1 -1
  207. package/dist/src/core/services/AssetManager.d.ts +112 -0
  208. package/dist/src/core/services/AssetManager.d.ts.map +1 -0
  209. package/dist/src/core/services/AssetManager.js +361 -0
  210. package/dist/src/core/services/AssetManager.js.map +1 -0
  211. package/dist/src/core/services/BlockManager.d.ts +73 -2
  212. package/dist/src/core/services/BlockManager.d.ts.map +1 -1
  213. package/dist/src/core/services/BlockManager.js +270 -48
  214. package/dist/src/core/services/BlockManager.js.map +1 -1
  215. package/dist/src/core/services/DomService.js +3 -3
  216. package/dist/src/core/services/DomService.js.map +1 -1
  217. package/dist/src/core/services/HeadService.d.ts +24 -0
  218. package/dist/src/core/services/HeadService.d.ts.map +1 -0
  219. package/dist/src/core/services/HeadService.js +120 -0
  220. package/dist/src/core/services/HeadService.js.map +1 -0
  221. package/dist/src/core/services/HelperService.d.ts +14 -3
  222. package/dist/src/core/services/HelperService.d.ts.map +1 -1
  223. package/dist/src/core/services/HelperService.js +32 -2
  224. package/dist/src/core/services/HelperService.js.map +1 -1
  225. package/dist/src/core/services/HttpService.d.ts +8 -0
  226. package/dist/src/core/services/HttpService.d.ts.map +1 -1
  227. package/dist/src/core/services/HttpService.js +121 -47
  228. package/dist/src/core/services/HttpService.js.map +1 -1
  229. package/dist/src/core/services/MarkerRegistry.d.ts +51 -8
  230. package/dist/src/core/services/MarkerRegistry.d.ts.map +1 -1
  231. package/dist/src/core/services/MarkerRegistry.js +135 -14
  232. package/dist/src/core/services/MarkerRegistry.js.map +1 -1
  233. package/dist/src/core/services/PageCache.d.ts +101 -0
  234. package/dist/src/core/services/PageCache.d.ts.map +1 -0
  235. package/dist/src/core/services/PageCache.js +184 -0
  236. package/dist/src/core/services/PageCache.js.map +1 -0
  237. package/dist/src/core/services/SectionManager.d.ts +100 -0
  238. package/dist/src/core/services/SectionManager.d.ts.map +1 -0
  239. package/dist/src/core/services/SectionManager.js +408 -0
  240. package/dist/src/core/services/SectionManager.js.map +1 -0
  241. package/dist/src/core/services/StorageService.js +1 -1
  242. package/dist/src/core/services/TranslationService.d.ts +21 -0
  243. package/dist/src/core/services/TranslationService.d.ts.map +1 -0
  244. package/dist/src/core/services/TranslationService.js +95 -0
  245. package/dist/src/core/services/TranslationService.js.map +1 -0
  246. package/dist/src/core/services/index.d.ts +11 -8
  247. package/dist/src/core/services/index.d.ts.map +1 -1
  248. package/dist/src/core/services/index.js +11 -8
  249. package/dist/src/core/services/index.js.map +1 -1
  250. package/dist/src/core/types/utils.d.ts +8 -8
  251. package/dist/src/core/types/utils.d.ts.map +1 -1
  252. package/dist/src/core/view/LoopContext.d.ts +21 -1
  253. package/dist/src/core/view/LoopContext.d.ts.map +1 -1
  254. package/dist/src/core/view/LoopContext.js +36 -0
  255. package/dist/src/core/view/LoopContext.js.map +1 -1
  256. package/dist/src/core/view/ResourceScope.d.ts +38 -0
  257. package/dist/src/core/view/ResourceScope.d.ts.map +1 -0
  258. package/dist/src/core/view/ResourceScope.js +167 -0
  259. package/dist/src/core/view/ResourceScope.js.map +1 -0
  260. package/dist/src/core/view/Section.d.ts +17 -32
  261. package/dist/src/core/view/Section.d.ts.map +1 -1
  262. package/dist/src/core/view/Section.js +14 -55
  263. package/dist/src/core/view/Section.js.map +1 -1
  264. package/dist/src/core/view/View.d.ts +43 -7
  265. package/dist/src/core/view/View.d.ts.map +1 -1
  266. package/dist/src/core/view/View.js +22 -4
  267. package/dist/src/core/view/View.js.map +1 -1
  268. package/dist/src/core/view/ViewController.d.ts +313 -40
  269. package/dist/src/core/view/ViewController.d.ts.map +1 -1
  270. package/dist/src/core/view/ViewController.js +1002 -147
  271. package/dist/src/core/view/ViewController.js.map +1 -1
  272. package/dist/src/core/view/ViewManager.d.ts +318 -27
  273. package/dist/src/core/view/ViewManager.d.ts.map +1 -1
  274. package/dist/src/core/view/ViewManager.js +1199 -258
  275. package/dist/src/core/view/ViewManager.js.map +1 -1
  276. package/dist/src/core/view/ViewState.d.ts +185 -6
  277. package/dist/src/core/view/ViewState.d.ts.map +1 -1
  278. package/dist/src/core/view/ViewState.js +851 -123
  279. package/dist/src/core/view/ViewState.js.map +1 -1
  280. package/dist/src/core/view/index.d.ts +5 -5
  281. package/dist/src/core/view/index.d.ts.map +1 -1
  282. package/dist/src/core/view/index.js +5 -5
  283. package/dist/src/core/view/index.js.map +1 -1
  284. package/dist/src/testing/index.d.ts +69 -0
  285. package/dist/src/testing/index.d.ts.map +1 -0
  286. package/dist/src/testing/index.js +140 -0
  287. package/dist/src/testing/index.js.map +1 -0
  288. package/index.ts +29 -5
  289. package/package.json +30 -21
  290. package/plugins.ts +2 -2
  291. package/src/core/app/Application.ts +58 -31
  292. package/src/core/bootstrap/app.ts +80 -6
  293. package/src/core/bootstrap/bundle.ts +101 -0
  294. package/src/core/bootstrap/providers/ApiServiceProvider.ts +4 -4
  295. package/src/core/bootstrap/providers/CoreServiceProvider.ts +14 -8
  296. package/src/core/bootstrap/providers/HelperServiceProvider.ts +8 -3
  297. package/src/core/bootstrap/providers/RouteServiceProvider.ts +15 -4
  298. package/src/core/bootstrap/providers/ServiceProvider.ts +8 -8
  299. package/src/core/bootstrap/providers/ViewServiceProvider.ts +3 -3
  300. package/src/core/bootstrap/providers/default-providers.ts +51 -16
  301. package/src/core/bootstrap/providers/index.ts +9 -9
  302. package/src/core/bootstrap/providers/provider-order.test.ts +16 -27
  303. package/src/core/bootstrap/providers/provider-order.ts +1 -1
  304. package/src/core/bootstrap/ssr.ts +136 -0
  305. package/src/core/cache/ViewCache.ts +1 -1
  306. package/src/core/cache/index.ts +1 -1
  307. package/src/core/contracts/ApplicationInterface.ts +13 -11
  308. package/src/core/contracts/BlockInterface.ts +18 -18
  309. package/src/core/contracts/BundleInterface.ts +40 -0
  310. package/src/core/contracts/ComponentInterface.ts +7 -6
  311. package/src/core/contracts/ElementInterface.ts +95 -27
  312. package/src/core/contracts/HeadServiceInterface.ts +41 -0
  313. package/src/core/contracts/HelperInterface.ts +9 -1
  314. package/src/core/contracts/HttpServiceInterface.ts +3 -0
  315. package/src/core/contracts/MarkerInterface.ts +22 -49
  316. package/src/core/contracts/ReactiveInterface.ts +9 -9
  317. package/src/core/contracts/RouterInterface.ts +5 -2
  318. package/src/core/contracts/SectionInterface.ts +49 -0
  319. package/src/core/contracts/ServiceProviderInterface.ts +3 -3
  320. package/src/core/contracts/ViewControllerInterface.ts +124 -16
  321. package/src/core/contracts/ViewInterface.ts +34 -5
  322. package/src/core/contracts/ViewManagerInterface.ts +40 -5
  323. package/src/core/contracts/ViewStateInterface.ts +39 -2
  324. package/src/core/contracts/common.ts +3 -3
  325. package/src/core/contracts/utils.ts +19 -19
  326. package/src/core/contracts/views.ts +2 -22
  327. package/src/core/devtools/hook.ts +142 -0
  328. package/src/core/devtools/index.ts +38 -0
  329. package/src/core/devtools/inspector.ts +270 -0
  330. package/src/core/elements/Block.ts +43 -21
  331. package/src/core/elements/BlockOutlet.ts +61 -21
  332. package/src/core/elements/Component.ts +352 -18
  333. package/src/core/elements/ElementManager.ts +9 -9
  334. package/src/core/elements/ForeachSlotCache.ts +170 -0
  335. package/src/core/elements/Fragment.ts +50 -32
  336. package/src/core/elements/Html.ts +696 -117
  337. package/src/core/elements/Output.ts +147 -30
  338. package/src/core/elements/Reactive.ts +329 -52
  339. package/src/core/elements/TextElement.ts +25 -16
  340. package/src/core/elements/Wrapper.ts +84 -18
  341. package/src/core/elements/Yield.ts +35 -24
  342. package/src/core/elements/helpers.ts +12 -12
  343. package/src/core/elements/index.ts +25 -24
  344. package/src/core/elements/reconcileChildren.ts +70 -0
  345. package/src/core/{hellpers → helpers}/ApiClient.ts +8 -1
  346. package/src/core/{hellpers → helpers}/app.ts +13 -2
  347. package/src/core/helpers/transition.ts +127 -0
  348. package/src/core/{hellpers → helpers}/utils.ts +4 -4
  349. package/src/core/helpers/view.ts +283 -0
  350. package/src/core/routers/Router.ts +458 -64
  351. package/src/core/routers/index.ts +2 -2
  352. package/src/core/services/AssetManager.ts +387 -0
  353. package/src/core/services/BlockManager.ts +272 -50
  354. package/src/core/services/DomService.ts +3 -3
  355. package/src/core/services/HeadService.ts +124 -0
  356. package/src/core/services/HelperService.ts +34 -4
  357. package/src/core/services/HttpService.ts +116 -55
  358. package/src/core/services/MarkerRegistry.ts +142 -16
  359. package/src/core/services/PageCache.ts +239 -0
  360. package/src/core/services/SectionManager.ts +387 -0
  361. package/src/core/services/StorageService.ts +1 -1
  362. package/src/core/services/TranslationService.ts +91 -0
  363. package/src/core/services/index.ts +11 -8
  364. package/src/core/types/utils.ts +8 -8
  365. package/src/core/view/LoopContext.ts +38 -1
  366. package/src/core/view/ResourceScope.ts +174 -0
  367. package/src/core/view/Section.ts +21 -68
  368. package/src/core/view/View.ts +57 -8
  369. package/src/core/view/ViewController.ts +1070 -186
  370. package/src/core/view/ViewManager.ts +1346 -272
  371. package/src/core/view/ViewState.ts +834 -116
  372. package/src/core/view/index.ts +5 -5
  373. package/src/testing/index.ts +184 -0
  374. package/dist/src/core/services/MarkerService.d.ts +0 -299
  375. package/dist/src/core/services/MarkerService.d.ts.map +0 -1
  376. package/dist/src/core/services/MarkerService.js +0 -723
  377. package/dist/src/core/services/MarkerService.js.map +0 -1
  378. package/src/core/services/MarkerService.ts +0 -923
@@ -1,723 +0,0 @@
1
- import { app } from "../hellpers/app";
2
- import { generateUUID } from "../hellpers/utils";
3
- import { MarkerRegistry } from "./MarkerRegistry";
4
- /**
5
- * OneMarker Model - Represents a custom marker element
6
- * Supports both:
7
- * - Generic markup: <tag>...</tag> or <!--tag-->...<!--/tag-->
8
- * - Registry tags: <!--o:r:id-->...<!--/o:r:id-->
9
- */
10
- export class MarkerModel {
11
- constructor(data) {
12
- this.__fullName = data.name;
13
- this.__tagName = data.name.split(':')[1] || data.name;
14
- this.__registryID = data.registryID;
15
- this.__openTag = data.openTag;
16
- this.__closeTag = data.closeTag;
17
- this.__attributes = data.attributes;
18
- this.__nodes = data.children || [];
19
- this.__definedAttributes = [];
20
- this.__defineAttributes(Object.keys(data.attributes));
21
- }
22
- /**
23
- * Update model data
24
- */
25
- __update(data) {
26
- this.__fullName = data.name;
27
- this.__tagName = data.name.split(':')[1] || data.name;
28
- this.__registryID = data.registryID;
29
- this.__openTag = data.openTag;
30
- this.__closeTag = data.closeTag;
31
- this.__attributes = data.attributes;
32
- this.__nodes = data.children || [];
33
- this.__defineAttributes(Object.keys(data.attributes));
34
- return this;
35
- }
36
- /**
37
- * Define dynamic property accessors for attributes
38
- * @private
39
- */
40
- __defineAttributes(attributeKeys) {
41
- attributeKeys.forEach(key => this.__defineAttribute(key));
42
- return this;
43
- }
44
- /**
45
- * Define single attribute accessor
46
- * @private
47
- */
48
- __defineAttribute(name) {
49
- if (this.__definedAttributes.includes(name)) {
50
- return this;
51
- }
52
- this.__definedAttributes.push(name);
53
- Object.defineProperty(this, name, {
54
- get: () => this.__attributes[name],
55
- set: (value) => {
56
- this.__attributes[name] = value;
57
- },
58
- enumerable: true,
59
- configurable: true,
60
- });
61
- return this;
62
- }
63
- /**
64
- * Get tag name (without namespace)
65
- */
66
- get tagName() {
67
- return this.__tagName;
68
- }
69
- /**
70
- * Get full name (with namespace)
71
- */
72
- get fullName() {
73
- return this.__fullName;
74
- }
75
- get registryID() {
76
- return this.__registryID;
77
- }
78
- /**
79
- * Get open tag node
80
- */
81
- get openTag() {
82
- return this.__openTag;
83
- }
84
- /**
85
- * Get close tag node
86
- */
87
- get closeTag() {
88
- return this.__closeTag;
89
- }
90
- /**
91
- * Get all attributes
92
- */
93
- get attributes() {
94
- return this.__attributes;
95
- }
96
- /**
97
- * Get nodes between open and close tags
98
- */
99
- get nodes() {
100
- return this.__nodes;
101
- }
102
- /**
103
- * Get system prefix (registry tags only)
104
- */
105
- get systemPrefix() {
106
- return this.__systemPrefix;
107
- }
108
- /**
109
- * Get tag (registry tags only)
110
- */
111
- get tag() {
112
- return this.__tag;
113
- }
114
- /**
115
- * Get ID (registry tags only)
116
- */
117
- get id() {
118
- return this.__id;
119
- }
120
- /**
121
- * Get full key (registry tags only)
122
- */
123
- get key() {
124
- return this.__key;
125
- }
126
- /**
127
- * Get full data (registry tags only)
128
- */
129
- get data() {
130
- if (!this.__systemPrefix)
131
- return undefined;
132
- return {
133
- systemPrefix: this.__systemPrefix,
134
- tag: this.__tag,
135
- id: this.__id,
136
- key: this.__key,
137
- attributes: this.__attributes,
138
- nodes: this.__nodes
139
- };
140
- }
141
- /**
142
- * Get outer HTML including open/close tags and content
143
- */
144
- get outerHTML() {
145
- let html = '';
146
- html += this.__getNodeHTML(this.__openTag);
147
- let currentNode = this.__openTag.nextSibling;
148
- while (currentNode && currentNode !== this.__closeTag) {
149
- html += this.__getNodeHTML(currentNode);
150
- currentNode = currentNode.nextSibling;
151
- }
152
- html += this.__getNodeHTML(this.__closeTag);
153
- return html;
154
- }
155
- /**
156
- * Get inner HTML (content only, without open/close tags)
157
- */
158
- get innerHTML() {
159
- let html = '';
160
- let currentNode = this.__openTag.nextSibling;
161
- while (currentNode && currentNode !== this.__closeTag) {
162
- html += this.__getNodeHTML(currentNode);
163
- currentNode = currentNode.nextSibling;
164
- }
165
- return html;
166
- }
167
- /**
168
- * Get HTML representation of a node
169
- * @private
170
- */
171
- __getNodeHTML(node) {
172
- if (!node)
173
- return '';
174
- switch (node.nodeType) {
175
- case Node.COMMENT_NODE:
176
- return `<!--${node.nodeValue}-->`;
177
- case Node.TEXT_NODE:
178
- return node.textContent || '';
179
- case Node.ELEMENT_NODE:
180
- return node.outerHTML || '';
181
- default:
182
- return node.textContent || '';
183
- }
184
- }
185
- /**
186
- * Get attribute value
187
- */
188
- getAttribute(name) {
189
- return this.__attributes[name];
190
- }
191
- /**
192
- * Set attribute value
193
- */
194
- setAttribute(name, value) {
195
- this.__defineAttribute(name);
196
- this.__attributes[name] = value;
197
- return this;
198
- }
199
- /**
200
- * Check if model matches query attributes
201
- * @private
202
- */
203
- __match(attributes) {
204
- for (const [key, value] of Object.entries(attributes)) {
205
- if (key === 'tagName') {
206
- if (this.__tagName !== value)
207
- return false;
208
- }
209
- else if (key === 'openTag') {
210
- if (this.__openTag !== value)
211
- return false;
212
- }
213
- else if (key === 'closeTag') {
214
- if (this.__closeTag !== value)
215
- return false;
216
- }
217
- else if (key === 'attributes' || key === 'nodes') {
218
- continue;
219
- }
220
- else if (this.__attributes[key] !== value) {
221
- return false;
222
- }
223
- }
224
- return true;
225
- }
226
- /**
227
- * Check if model matches given attributes (for registry tag filtering)
228
- */
229
- matchesAttributes(attributes) {
230
- if (!attributes || Object.keys(attributes).length === 0) {
231
- return true;
232
- }
233
- for (const [key, value] of Object.entries(attributes)) {
234
- if (this.__attributes?.[key] !== value) {
235
- return false;
236
- }
237
- }
238
- return true;
239
- }
240
- /**
241
- * Set attributes from registry
242
- */
243
- setAttributes(attributes) {
244
- Object.assign(this.__attributes, attributes);
245
- this.__defineAttributes(Object.keys(attributes));
246
- return this;
247
- }
248
- /**
249
- * Scan and update nodes between open/close tags
250
- */
251
- __scan() {
252
- const nodes = [];
253
- let currentNode = this.__openTag.nextSibling;
254
- while (currentNode && currentNode !== this.__closeTag) {
255
- nodes.push(currentNode);
256
- currentNode = currentNode.nextSibling;
257
- }
258
- this.__nodes = nodes;
259
- return this.__nodes;
260
- }
261
- /**
262
- * Sync with DOM (re-query and update)
263
- */
264
- __sync() {
265
- // Placeholder for sync logic
266
- // In V1, this uses oms.find() which requires OneMarkerService
267
- return false;
268
- }
269
- /**
270
- * Update nodes array
271
- */
272
- updateNodes(nodes) {
273
- this.__nodes = nodes;
274
- return this;
275
- }
276
- /**
277
- * Replace content between open and close tags
278
- */
279
- replaceContent(content) {
280
- // Remove existing nodes
281
- this.__nodes.forEach(node => {
282
- if (node.parentNode) {
283
- node.parentNode.removeChild(node);
284
- }
285
- });
286
- this.__nodes = [];
287
- // Insert new content
288
- const closeTag = this.__closeTag;
289
- if (typeof content === 'string') {
290
- const temp = document.createElement('div');
291
- temp.innerHTML = content;
292
- const fragment = document.createDocumentFragment();
293
- Array.from(temp.childNodes).forEach(node => fragment.appendChild(node));
294
- if (closeTag.parentNode) {
295
- closeTag.parentNode.insertBefore(fragment, closeTag);
296
- }
297
- }
298
- else if (content instanceof Node) {
299
- if (closeTag.parentNode) {
300
- closeTag.parentNode.insertBefore(content, closeTag);
301
- }
302
- }
303
- else if (Array.isArray(content)) {
304
- const fragment = document.createDocumentFragment();
305
- content.forEach(node => fragment.appendChild(node));
306
- if (closeTag.parentNode) {
307
- closeTag.parentNode.insertBefore(fragment, closeTag);
308
- }
309
- }
310
- // Rescan nodes
311
- this.__scan();
312
- return this;
313
- }
314
- /**
315
- * Remove element and its content from DOM
316
- */
317
- remove() {
318
- // Remove all nodes
319
- this.__nodes.forEach(node => {
320
- if (node.parentNode) {
321
- node.parentNode.removeChild(node);
322
- }
323
- });
324
- // Remove open and close tags
325
- if (this.__openTag.parentNode) {
326
- this.__openTag.parentNode.removeChild(this.__openTag);
327
- }
328
- if (this.__closeTag.parentNode) {
329
- this.__closeTag.parentNode.removeChild(this.__closeTag);
330
- }
331
- this.__nodes = [];
332
- }
333
- }
334
- /**
335
- * OneMarkerCollection - Collection of OneMarkerModel instances
336
- * Provides array-like operations with type safety
337
- */
338
- export class MarkerCollection {
339
- constructor(elements = []) {
340
- this.__models = elements.map(element => (element instanceof MarkerModel) ? element : new MarkerModel(element));
341
- }
342
- get models() {
343
- return this.__models;
344
- }
345
- get length() {
346
- return this.__models.length;
347
- }
348
- /**
349
- * Get the first model in the collection
350
- */
351
- get first() {
352
- return this.__models[0];
353
- }
354
- /**
355
- * Get the last model in the collection
356
- */
357
- get last() {
358
- return this.__models[this.__models.length - 1];
359
- }
360
- /**
361
- * Get the model at the given index
362
- */
363
- get(index) {
364
- return this.__models[index];
365
- }
366
- /**
367
- * Set the model at the given index
368
- */
369
- set(index, model) {
370
- this.__models[index] = model;
371
- return this;
372
- }
373
- push(model) {
374
- if (!(model instanceof MarkerModel)) {
375
- model = new MarkerModel(model);
376
- }
377
- this.__models.push(model);
378
- return this;
379
- }
380
- pop() {
381
- return this.__models.pop();
382
- }
383
- shift() {
384
- return this.__models.shift();
385
- }
386
- unshift(model) {
387
- if (!(model instanceof MarkerModel)) {
388
- model = new MarkerModel(model);
389
- }
390
- this.__models.unshift(model);
391
- return this;
392
- }
393
- splice(start, deleteCount, ...items) {
394
- return this.__models.splice(start, deleteCount, ...items);
395
- }
396
- slice(start, end) {
397
- return this.__models.slice(start, end);
398
- }
399
- concat(models) {
400
- const otherModels = (models instanceof MarkerCollection) ? models.__models : models;
401
- return new MarkerCollection(this.__models.concat(otherModels));
402
- }
403
- reverse() {
404
- return new MarkerCollection([...this.__models].reverse());
405
- }
406
- map(callback) {
407
- return this.__models.map(callback);
408
- }
409
- filter(callback) {
410
- return this.__models.filter(callback);
411
- }
412
- reduce(callback, initialValue) {
413
- return this.__models.reduce(callback, initialValue);
414
- }
415
- forEach(callback) {
416
- this.__models.forEach(callback);
417
- }
418
- some(callback) {
419
- return this.__models.some(callback);
420
- }
421
- every(callback) {
422
- return this.__models.every(callback);
423
- }
424
- /**
425
- * Query the collection by attributes
426
- */
427
- query(attributes = {}) {
428
- return this.__models.filter(model => model.__match(attributes));
429
- }
430
- /**
431
- * Find first model matching attributes
432
- */
433
- find(attributes = {}) {
434
- return this.query(attributes)[0] || null;
435
- }
436
- }
437
- /**
438
- * Marker Service - Manages custom markup elements
439
- * Supports both HydrationMarker (comments)
440
- */
441
- export class MarkerService {
442
- constructor(rootElement) {
443
- this.prefix = 'o';
444
- this.delimiter = ':';
445
- this.closeTagSuffix = '/';
446
- this.markerRegistry = MarkerRegistry;
447
- this.rootElement = (rootElement instanceof Element) ? rootElement : document.body;
448
- this.walker = document.createTreeWalker(this.rootElement, NodeFilter.SHOW_COMMENT, null);
449
- }
450
- refreshWalker() {
451
- this.walker = document.createTreeWalker(this.rootElement, NodeFilter.SHOW_COMMENT, null);
452
- return this;
453
- }
454
- addRegistry(tag, id, attributes = {}) {
455
- return this.markerRegistry.register(tag, id, attributes);
456
- }
457
- resolveTagName(tagShortcut) {
458
- return this.markerRegistry.fullTag(tagShortcut);
459
- }
460
- getShortcut(tagName) {
461
- return this.markerRegistry.shortcut(tagName);
462
- }
463
- /**
464
- * Check if registryIDOrAttributes is a registryID (string) or attributes (object)
465
- */
466
- parseRegistryIDOrAttributes(value) {
467
- if (typeof value === 'string') {
468
- return { registryID: value };
469
- }
470
- if (typeof value === 'object' && value !== null) {
471
- const registryID = typeof value['registryID'] === 'string' ? value['registryID'] : undefined;
472
- if (registryID) {
473
- delete value['registryID'];
474
- }
475
- return { registryID, attributes: value };
476
- }
477
- return {};
478
- }
479
- /**
480
- * Get attributes from MarkerRegistry if registryID provided
481
- */
482
- getAttributesFromRegistry(tagName, registryID) {
483
- const record = this.markerRegistry.getByTagAndId(tagName, registryID);
484
- return record?.attributes || {};
485
- }
486
- /**
487
- * Check if attributes match filter
488
- */
489
- attributesMatch(tagAttributes, filter) {
490
- if (!filter)
491
- return true;
492
- for (const [key, value] of Object.entries(filter)) {
493
- if (value !== undefined && tagAttributes[key] !== value) {
494
- return false;
495
- }
496
- }
497
- return true;
498
- }
499
- createMarker(tag, id, attributes = {}) {
500
- const name = this.markerRegistry.fullTag(tag);
501
- const registryID = id ?? generateUUID();
502
- const key = this.markerRegistry.register(tag, registryID, attributes);
503
- const openTag = this.markerRegistry.createMarkerStart(tag, registryID);
504
- const closeTag = this.markerRegistry.createMarkerEnd(tag, registryID);
505
- // Register in MarkerRegistry
506
- return new MarkerModel({
507
- name,
508
- tagName: (this.prefix ? this.prefix + this.delimiter : '') + tag,
509
- registryID,
510
- openTag,
511
- closeTag,
512
- attributes,
513
- children: []
514
- });
515
- }
516
- createOpenMarker(tag, id) {
517
- return this.markerRegistry.createMarkerStart(tag, id);
518
- }
519
- createCloseMarker(tag, id) {
520
- return this.markerRegistry.createMarkerEnd(tag, id);
521
- }
522
- /**
523
- * Query hydration markers in HTML comments
524
- * Works with format: <!--prefix:shortcutTag:registryID-->
525
- *
526
- * @param tagOrShortcut - Tag name or shortcut (r, v, c, etc.)
527
- * @param where - Registry ID (string) or attributes filter (object)
528
- * @returns Array of matched markers
529
- *
530
- * @example
531
- * query("r", "1234") // Find o:r:1234
532
- * query("reactive", "1234") // Find o:r:1234 (resolved from shortcut)
533
- * query("r", { userId: "123" }) // Find o:r:* with userId="123"
534
- */
535
- query(tagOrShortcut, where, useCache = true) {
536
- const { registryID, attributes: attributeFilter } = this.parseRegistryIDOrAttributes(where);
537
- const results = [];
538
- if (!(useCache === true)) {
539
- this.refreshWalker();
540
- }
541
- const walker = this.walker;
542
- const commentNodes = [];
543
- let comment;
544
- while ((comment = walker.nextNode())) {
545
- commentNodes.push(comment);
546
- }
547
- const tagShortcut = this.markerRegistry.shortcut(tagOrShortcut);
548
- const stack = [];
549
- // Process comments with stack-based matching
550
- for (let i = 0; i < commentNodes.length; i++) {
551
- const commentText = commentNodes[i].nodeValue?.trim() || '';
552
- // Check if open tag: prefix:shortcut:registryID
553
- const openMatch = commentText.match(new RegExp(`^${this.prefix}${this.delimiter}([^${this.delimiter}/]+)${this.delimiter}(.+)$`));
554
- if (openMatch) {
555
- const shortcut = openMatch[1];
556
- const id = openMatch[2];
557
- // Check if matches requested tag and registryID
558
- if (shortcut === tagShortcut) {
559
- if (registryID && id !== registryID) {
560
- continue; // Skip if specific registryID requested
561
- }
562
- const attrs = this.getAttributesFromRegistry(tagOrShortcut, id);
563
- if (!this.attributesMatch(attrs, attributeFilter)) {
564
- continue; // Skip if attributes don't match
565
- }
566
- stack.push({
567
- index: i,
568
- shortcut,
569
- registryID: id,
570
- attributes: attrs
571
- });
572
- }
573
- continue;
574
- }
575
- // Check if close tag: /prefix:shortcut:registryID
576
- const closeMatch = commentText.match(new RegExp(`^${this.closeTagSuffix}${this.prefix}${this.delimiter}([^${this.delimiter}/]+)${this.delimiter}(.+)$`));
577
- if (closeMatch) {
578
- const shortcut = closeMatch[1];
579
- const id = closeMatch[2];
580
- // Find matching open tag in stack (LIFO)
581
- let foundIndex = -1;
582
- for (let s = stack.length - 1; s >= 0; s--) {
583
- if (stack[s].shortcut === shortcut && stack[s].registryID === id) {
584
- foundIndex = s;
585
- break;
586
- }
587
- }
588
- if (foundIndex !== -1) {
589
- const openTag = stack[foundIndex];
590
- // Get children between open and close
591
- let currentNode = commentNodes[openTag.index].nextSibling;
592
- const children = [];
593
- while (currentNode && currentNode !== commentNodes[i]) {
594
- children.push(currentNode);
595
- currentNode = currentNode.nextSibling;
596
- }
597
- const fullTagName = this.resolveTagName(openTag.shortcut);
598
- results.push({
599
- name: fullTagName,
600
- tagName: openTag.shortcut,
601
- registryID: openTag.registryID,
602
- attributes: openTag.attributes,
603
- openTag: commentNodes[openTag.index],
604
- closeTag: commentNodes[i],
605
- children
606
- });
607
- stack.splice(foundIndex, 1);
608
- }
609
- }
610
- }
611
- return results;
612
- }
613
- /**
614
- * Find multiple hydration markers by tag and optional ID/attributes
615
- * Flexible API supporting multiple query styles
616
- *
617
- * @param tagOrShortcut - Tag name or shortcut (r, v, c, etc.)
618
- * @param registryIDOrAttributes - Optional registry ID (string) or attributes filter (object)
619
- * @returns Array of all matched markers
620
- *
621
- * @example
622
- * find("r") // All o:r:*
623
- * find("reactive") // All o:r:* (resolved from shortcut)
624
- * find("r", "1234") // All o:r:1234 (usually one)
625
- * find("r", { userId: "123" }) // All o:r:* with userId="123"
626
- */
627
- find(tagOrShortcut, where, useCache = true) {
628
- return this.collect(this.query(tagOrShortcut, where, useCache));
629
- }
630
- getResults(tagOrShortcut, where, index, length, useCache = true) {
631
- const startIndex = (typeof index === 'number' && index !== null) ? index : 0;
632
- const takeLength = (typeof length === 'number' && length !== null && length > 0) ? length : 0;
633
- const allResults = this.query(tagOrShortcut, where, useCache);
634
- // Handle positive index
635
- if (startIndex >= 0) {
636
- const sliced = allResults.slice(startIndex);
637
- if (takeLength > 0) {
638
- return sliced.slice(0, takeLength);
639
- }
640
- return sliced;
641
- }
642
- // Handle negative index
643
- const sliced = allResults.slice(startIndex);
644
- if (takeLength > 0) {
645
- return sliced.slice(0, takeLength);
646
- }
647
- return sliced;
648
- }
649
- /**
650
- * Get hydration markers with index and length support
651
- *
652
- * @param tagOrShortcut - Tag name or shortcut
653
- * @param where - Registry ID or attributes filter
654
- * @param index - Start position (default 0): >= 0 positive, < 0 negative from end
655
- * @param length - Number to return (default 0 = all): > 0 returns exactly that many
656
- * @returns Array of matched markers
657
- *
658
- * @example
659
- * get("r", "1234") // All o:r:1234
660
- * get("r", "1234", 1) // From index 1
661
- * get("r", "1234", 0, 2) // First 2 items
662
- * get("r", {}, -1) // Last item
663
- */
664
- get(tagOrShortcut, where, index, length, useCache = true) {
665
- const results = this.getResults(tagOrShortcut, where, index, length, useCache);
666
- return this.collect(results);
667
- }
668
- /**
669
- * Get first matching hydration marker
670
- *
671
- * @param tagOrShortcut - Tag name or shortcut
672
- * @param where - Registry ID or attributes filter
673
- * @returns First matched marker or null
674
- */
675
- first(tagOrShortcut, where, useCache = true) {
676
- const results = this.getResults(tagOrShortcut, where, 0, 1, useCache);
677
- return results.length > 0 ? this.toModel(results[0]) : null;
678
- }
679
- /**
680
- * Get last matching hydration marker
681
- *
682
- * @param tagOrShortcut - Tag name or shortcut
683
- * @param where - Registry ID or attributes filter
684
- * @returns Last matched marker or null
685
- */
686
- last(tagOrShortcut, where, useCache = true) {
687
- const results = this.getResults(tagOrShortcut, where, -1, 1, useCache);
688
- return results.length > 0 ? this.toModel(results[0]) : null;
689
- }
690
- /**
691
- * Get exactly one matching hydration marker
692
- * Throws error if not found or multiple matches found
693
- *
694
- * @param tagOrShortcut - Tag name or shortcut
695
- * @param where - Registry ID or attributes filter
696
- * @param index - Start position (default 0)
697
- * @returns Exactly one matched marker
698
- * @throws Error if no match or multiple matches
699
- */
700
- once(tagOrShortcut, where, index, useCache = true) {
701
- const startIndex = (typeof index === 'number' && index !== null) ? index : 0;
702
- const results = this.getResults(tagOrShortcut, where, startIndex, 1, useCache);
703
- if (!results || results.length === 0) {
704
- return null; // Or throw new Error(`HydrationMarker: No marker found for "${tagOrShortcut}" with specified criteria`);
705
- }
706
- return this.toModel(results[0]);
707
- }
708
- /**
709
- * Create MarkerCollection from query results
710
- */
711
- collect(models) {
712
- return new MarkerCollection(models);
713
- }
714
- /**
715
- * Convert raw tag to MarkerModel
716
- */
717
- toModel(tag) {
718
- return new MarkerModel(tag);
719
- }
720
- }
721
- MarkerService.class = 'HydrationMarker';
722
- export const OneMarker = app(MarkerService);
723
- //# sourceMappingURL=MarkerService.js.map