@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 +1 @@
1
- {"version":3,"file":"Block.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/Block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEtF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAGpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,KAAM,YAAW,cAAc;IACxC,OAAO,EAAE,aAAa,CAAW;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,uBAAuB,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC7B,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAC1C,oBAAoB,EAAE,kBAAkB,GAAG,IAAI,CAAQ;IACvD,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAElB,WAAW,EAAE,IAAI,EAAE,CAAM;IACzB,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,aAAa,EAAE,aAAa,GAAG,IAAI,CAAQ;IAE3C,SAAgB,UAAU,QAAQ;IAClC,SAAgB,YAAY,SAAS;gBAEzB,EACR,GAAG,EACH,IAAI,EACJ,MAAa,EACb,oBAA2D,EAC3D,EAAS,EACT,QAAmB,EACtB,EAAE;QACC,GAAG,EAAE,uBAAuB,CAAC;QAC7B,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;QAC1C,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;KACvB;IAaD,2BAA2B;IAC3B,IAAI,IAAI,IAAI;IAQZ,yDAAyD;IACzD,MAAM,IAAI,IAAI;IASd,KAAK,CAAC,QAAQ,EAAE,uBAAuB,EAAE,aAAa,EAAE,aAAa,GAAG,GAAG;IAM3E,OAAO,IAAI,IAAI;IAGf,OAAO,IAAI,IAAI;IAGf,MAAM,IAAI,IAAI;IAIb,yDAAyD;IACzD,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI;CAI/D"}
1
+ {"version":3,"file":"Block.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/Block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAa,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEzF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAGvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,KAAM,YAAW,cAAc;IACxC,OAAO,EAAE,aAAa,CAAW;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,uBAAuB,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC7B,wEAAwE;IACxE,OAAO,CAAC,SAAS,CAAuB;IACxC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAC1C,oBAAoB,EAAE,kBAAkB,GAAG,IAAI,CAAQ;IACvD,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,IAAI,EAAE,CAAM;IACzB,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,aAAa,EAAE,aAAa,GAAG,IAAI,CAAQ;IAE3C,SAAgB,UAAU,QAAQ;IAClC,SAAgB,YAAY,SAAS;gBAEzB,EACR,GAAG,EACH,IAAI,EACJ,MAAa,EACb,oBAA2D,EAC3D,EAAS,EACT,QAAmB,EACtB,EAAE;QACC,GAAG,EAAE,uBAAuB,CAAC;QAC7B,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;QAC1C,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;KACvB;IAyBD,2BAA2B;IAC3B,IAAI,IAAI,IAAI;IAQZ,yDAAyD;IACzD,MAAM,IAAI,IAAI;IASd,KAAK,CAAC,QAAQ,EAAE,uBAAuB,EAAE,aAAa,EAAE,aAAa,GAAG,GAAG;IAM3E,OAAO,IAAI,IAAI;IAGf,OAAO,IAAI,IAAI;IAYf,MAAM,IAAI,IAAI;IAId,yDAAyD;IACzD,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI;CAI9D"}
@@ -1,5 +1,6 @@
1
- import { generateUUID } from "../hellpers/utils";
2
- import markerRegistry from "../services/MarkerRegistry";
1
+ import { InitModes } from "../contracts/common.js";
2
+ import { generateUUID } from "../helpers/utils.js";
3
+ import markerRegistry from "../services/MarkerRegistry.js";
3
4
  /**
4
5
  * Block — a named mounting slot used in layout views.
5
6
  *
@@ -20,23 +21,37 @@ import markerRegistry from "../services/MarkerRegistry";
20
21
  */
21
22
  export class Block {
22
23
  constructor({ ctx, name, viewId = null, contentRenderFactory = (parentElement) => [], id = null, initMode = 'create' }) {
23
- this.oneType = 'Block';
24
+ this.saoType = 'Block';
24
25
  this.viewId = null;
26
+ /** Key trả về bởi markerRegistry.register — destroy() dùng để gỡ lại */
27
+ this.markerKey = null;
25
28
  this.fragment = null;
26
29
  this.contentRenderFactory = null;
27
30
  this.domChildren = [];
28
31
  this.parentElement = null;
29
32
  this.isOneBlock = true;
30
- this.isOneElement = false;
31
- this.id = `${this.viewId}-${id ?? generateUUID(10)}`; // Unique ID for debugging
33
+ this.isSaoElement = false;
34
+ this.id = id ?? generateUUID(10); // Unique ID for debugging
32
35
  this.ctx = ctx;
33
36
  this.name = name;
34
37
  this.viewId = viewId ?? ctx.viewId; // Associate block with current viewId
35
38
  this.initMode = initMode;
36
39
  this.contentRenderFactory = contentRenderFactory || ((parentElement) => []);
37
- markerRegistry.register('block', this.id, { name, viewId }); // Register block in marker registry
38
- this.openTag = markerRegistry.createMarkerStart('block', this.id);
39
- this.closeTag = markerRegistry.createMarkerEnd('block', this.id);
40
+ // Hydrate: claim cặp marker server qua index O(1) của MarkerRegistry.
41
+ // (Bản cũ dùng chung một TreeWalker không reset nên chỉ block ĐẦU TIÊN
42
+ // claim được, các block sau lặng lẽ tạo marker mới.)
43
+ const claimed = (this.initMode === InitModes.HYDRATE)
44
+ ? markerRegistry.claim('block', this.id)
45
+ : null;
46
+ if (claimed) {
47
+ this.openTag = claimed.open;
48
+ this.closeTag = claimed.close;
49
+ }
50
+ else {
51
+ this.openTag = markerRegistry.createMarkerStart('block', this.id);
52
+ this.closeTag = markerRegistry.createMarkerEnd('block', this.id);
53
+ this.markerKey = markerRegistry.register('block', this.id, { name, viewId }); // Register block in marker registry
54
+ }
40
55
  }
41
56
  /** Initialize the block */
42
57
  init() {
@@ -64,7 +79,16 @@ export class Block {
64
79
  // Unmount logic (e.g. hide or remove DOM nodes, stop reactions)
65
80
  }
66
81
  destroy() {
67
- // Cleanup logic (e.g. remove DOM nodes, clear caches)
82
+ // MarkerRegistry là singleton toàn cục — không gỡ thì record sống qua navigate.
83
+ if (this.markerKey) {
84
+ markerRegistry.remove(this.markerKey);
85
+ this.markerKey = null;
86
+ }
87
+ // openTag/closeTag nay NẰM TRONG DOM (BlockManager.mountBlockIntoOutlet chèn
88
+ // chúng quanh content). Bỏ lại comment mồ côi thì lần hydrate sau
89
+ // markerRegistry.claim('block', id) có thể bắt trúng cặp cũ và claim nhầm vùng.
90
+ this.openTag.remove();
91
+ this.closeTag.remove();
68
92
  }
69
93
  update() {
70
94
  // Update logic (e.g. re-render content on state change)
@@ -1 +1 @@
1
- {"version":3,"file":"Block.js","sourceRoot":"","sources":["../../../../src/core/elements/Block.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,cAAc,MAAM,4BAA4B,CAAC;AAGxD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,KAAK;IAkBd,YAAY,EACR,GAAG,EACH,IAAI,EACJ,MAAM,GAAG,IAAI,EACb,oBAAoB,GAAG,CAAC,aAA4B,EAAE,EAAE,CAAC,EAAE,EAC3D,EAAE,GAAG,IAAI,EACT,QAAQ,GAAG,QAAQ,EAQtB;QA/BD,YAAO,GAAkB,OAAO,CAAC;QAIjC,WAAM,GAAkB,IAAI,CAAC;QAC7B,aAAQ,GAA6B,IAAI,CAAC;QAC1C,yBAAoB,GAA8B,IAAI,CAAC;QAIvD,gBAAW,GAAW,EAAE,CAAC;QAEzB,kBAAa,GAAyB,IAAI,CAAC;QAE3B,eAAU,GAAG,IAAI,CAAC;QAClB,iBAAY,GAAG,KAAK,CAAC;QAiBjC,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,0BAA0B;QAChF,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,sCAAsC;QAC1E,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,IAAI,CAAC,CAAC,aAA4B,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3F,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,oCAAoC;QACjG,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAErE,CAAC;IAED,2BAA2B;IAC3B,IAAI;QACA,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC9B,uBAAuB;QAC3B,CAAC;aAAM,CAAC;YACJ,sBAAsB;QAC1B,CAAC;IACL,CAAC;IAED,yDAAyD;IACzD,MAAM;QAEF,IAAI,CAAC,IAAI,CAAC,oBAAoB;YAAE,OAAO;QAEvC,qCAAqC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAc,CAAC,CAAC;IAEnE,CAAC;IAED,KAAK,CAAC,QAAiC,EAAE,aAA4B;QACjE,IAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,aAAa,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3B,CAAC;IACL,CAAC;IACD,OAAO;QACH,gEAAgE;IACpE,CAAC;IACD,OAAO;QACH,sDAAsD;IAC1D,CAAC;IACD,MAAM;QACF,wDAAwD;IAC5D,CAAC;IAEA,yDAAyD;IACzD,gBAAgB,CAAC,aAAmC;QACjD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;CAEJ"}
1
+ {"version":3,"file":"Block.js","sourceRoot":"","sources":["../../../../src/core/elements/Block.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import type { BlockOutletInterface } from "../contracts/BlockInterface";
2
- import { InitMode } from "../contracts/common";
3
- import type { HtmlInterface } from "../contracts/ElementInterface";
4
- import type { ViewControllerInterface } from "../contracts/ViewControllerInterface";
5
- import type { OneObjectType } from "../types/utils";
1
+ import type { BlockOutletInterface } from "../contracts/BlockInterface.js";
2
+ import { InitMode } from "../contracts/common.js";
3
+ import type { HtmlInterface } from "../contracts/ElementInterface.js";
4
+ import type { ViewControllerInterface } from "../contracts/ViewControllerInterface.js";
5
+ import type { SaoObjectType } from "../types/utils.js";
6
6
  export declare class BlockOutlet implements BlockOutletInterface {
7
- oneType: OneObjectType;
7
+ saoType: SaoObjectType;
8
8
  id: string;
9
9
  name: string;
10
10
  openTag: Comment;
@@ -20,14 +20,25 @@ export declare class BlockOutlet implements BlockOutletInterface {
20
20
  id?: string | null;
21
21
  initMode?: InitMode;
22
22
  });
23
+ /**
24
+ * Tìm cặp marker outlet từ server-rendered HTML (format chuẩn §5.1):
25
+ * open: s:bo:{id}-s close: s:bo:{id}-e
26
+ * Tra index của MarkerRegistry, chặn trong parentElement nếu có.
27
+ */
28
+ private claimSSRMarkers;
23
29
  hydrate(): void;
30
+ /** Registry guard */
31
+ __destroyed__: boolean;
32
+ /** Key trả về bởi markerRegistry.register — destroy() dùng để gỡ lại */
33
+ private markerKey;
34
+ /** Render — idempotent: markers đã trong DOM thì giữ nguyên (same-layout reuse) */
24
35
  render(): void;
25
36
  destroy(): void;
26
37
  start(): void;
27
38
  stop(): void;
28
39
  setParentElement(parentElement: HtmlInterface | null): void;
29
- get isOneElement(): boolean;
30
- set isOneElement(value: boolean);
40
+ get isSaoElement(): boolean;
41
+ set isSaoElement(value: boolean);
31
42
  get isOneBlockOutlet(): boolean;
32
43
  set isOneBlockOutlet(value: boolean);
33
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BlockOutlet.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/BlockOutlet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAGpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,qBAAa,WAAY,YAAW,oBAAoB;IACpD,OAAO,EAAE,aAAa,CAAiB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,aAAa,GAAG,IAAI,CAAQ;IACpC,aAAa,EAAE,aAAa,GAAG,IAAI,CAAQ;IAC3C,GAAG,EAAE,uBAAuB,CAAC;IAC7B,QAAQ,EAAE,QAAQ,CAAY;gBAClB,EAAE,GAAG,EAAE,aAAoB,EAAE,IAAI,EAAE,EAAS,EAAE,QAAmB,EAAE,EAAE;QAAE,GAAG,EAAE,uBAAuB,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;KAAE;IAc9M,OAAO,IAAI,IAAI;IAIf,MAAM,IAAI,IAAI;IAYd,OAAO,IAAI,IAAI;IAMf,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;IAIZ,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI;IAK3D,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,IAAI,YAAY,CAAC,KAAK,EAAE,OAAO,EAE9B;IAED,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED,IAAI,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAElC;CACJ"}
1
+ {"version":3,"file":"BlockOutlet.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/BlockOutlet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAa,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAGvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,qBAAa,WAAY,YAAW,oBAAoB;IACpD,OAAO,EAAE,aAAa,CAAiB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,aAAa,GAAG,IAAI,CAAQ;IACpC,aAAa,EAAE,aAAa,GAAG,IAAI,CAAQ;IAC3C,GAAG,EAAE,uBAAuB,CAAC;IAC7B,QAAQ,EAAE,QAAQ,CAAoB;gBAC1B,EAAE,GAAG,EAAE,aAAoB,EAAE,IAAI,EAAE,EAAS,EAAE,QAA2B,EAAE,EAAE;QAAE,GAAG,EAAE,uBAAuB,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;KAAE;IA4BtN;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAIvB,OAAO,IAAI,IAAI;IAIf,qBAAqB;IACd,aAAa,EAAE,OAAO,CAAS;IACtC,wEAAwE;IACxE,OAAO,CAAC,SAAS,CAAuB;IAExC,mFAAmF;IACnF,MAAM,IAAI,IAAI;IAUd,OAAO,IAAI,IAAI;IAmBf,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;IAIZ,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI;IAK3D,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,IAAI,YAAY,CAAC,KAAK,EAAE,OAAO,EAE9B;IAED,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED,IAAI,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAElC;CACJ"}
@@ -1,34 +1,78 @@
1
- import { generateUUID } from "../hellpers/utils";
2
- import markerRegistry from "../services/MarkerRegistry";
1
+ import { InitModes } from "../contracts/common.js";
2
+ import { generateUUID } from "../helpers/utils.js";
3
+ import markerRegistry from "../services/MarkerRegistry.js";
3
4
  export class BlockOutlet {
4
- constructor({ ctx, parentElement = null, name, id = null, initMode = 'create' }) {
5
- this.oneType = 'BlockOutlet';
5
+ constructor({ ctx, parentElement = null, name, id = null, initMode = InitModes.CREATE }) {
6
+ this.saoType = 'BlockOutlet';
6
7
  this.parent = null;
7
8
  this.parentElement = null;
8
- this.initMode = 'create';
9
- this.id = `${ctx.viewId}-${id ?? generateUUID(10)}`; // Unique ID for debugging
9
+ this.initMode = InitModes.CREATE;
10
+ /** Registry guard */
11
+ this.__destroyed__ = false;
12
+ /** Key trả về bởi markerRegistry.register — destroy() dùng để gỡ lại */
13
+ this.markerKey = null;
14
+ this.id = id ?? generateUUID(10); // Unique ID for debugging
10
15
  this.ctx = ctx;
11
16
  this.name = name;
12
17
  this.parent = parentElement;
13
18
  this.parentElement = parentElement;
14
19
  this.initMode = initMode;
15
- markerRegistry.register('blockoutlet', this.id, { name, viewId: ctx.viewId }); // Register this outlet in the MarkerRegistry
16
- this.openTag = markerRegistry.createMarkerStart('blockoutlet', this.id);
17
- this.closeTag = markerRegistry.createMarkerEnd('blockoutlet', this.id);
20
+ if (this.initMode === InitModes.HYDRATE) {
21
+ // Claim cặp marker server <!--s:bo:{id}-s--> ... <!--s:bo:{id}-e-->
22
+ const claimed = this.claimSSRMarkers();
23
+ if (claimed) {
24
+ this.openTag = claimed.open;
25
+ this.closeTag = claimed.close;
26
+ }
27
+ else {
28
+ this.openTag = markerRegistry.createMarkerStart('blockoutlet', this.id);
29
+ this.closeTag = markerRegistry.createMarkerEnd('blockoutlet', this.id);
30
+ this.markerKey = markerRegistry.register('blockoutlet', this.id, { name, viewId: ctx.viewId });
31
+ }
32
+ }
33
+ else {
34
+ this.openTag = markerRegistry.createMarkerStart('blockoutlet', this.id);
35
+ this.closeTag = markerRegistry.createMarkerEnd('blockoutlet', this.id);
36
+ this.markerKey = markerRegistry.register('blockoutlet', this.id, { name, viewId: ctx.viewId }); // Register this outlet in the MarkerRegistry
37
+ }
38
+ }
39
+ /**
40
+ * Tìm cặp marker outlet từ server-rendered HTML (format chuẩn §5.1):
41
+ * open: s:bo:{id}-s close: s:bo:{id}-e
42
+ * Tra index của MarkerRegistry, chặn trong parentElement nếu có.
43
+ */
44
+ claimSSRMarkers() {
45
+ return markerRegistry.claim('blockoutlet', this.id, this.parentElement?.element ?? null);
18
46
  }
19
47
  hydrate() {
20
48
  // Hydration logic if needed (e.g. reattach event listeners)
21
49
  }
50
+ /** Render — idempotent: markers đã trong DOM thì giữ nguyên (same-layout reuse) */
22
51
  render() {
52
+ if (this.__destroyed__)
53
+ return;
54
+ if (this.openTag.parentNode)
55
+ return; // đã đặt — không đặt lại
23
56
  if (!this.parentElement || !this.parentElement.element)
24
57
  return;
25
58
  const parentEl = this.parentElement.element;
26
- // Place markers
27
59
  parentEl.appendChild(this.openTag);
28
- // Register this outlet in the MarkerRegistry for block mounting
29
60
  parentEl.appendChild(this.closeTag);
30
61
  }
31
62
  destroy() {
63
+ this.__destroyed__ = true;
64
+ this.ctx.releaseElement?.(this);
65
+ if (this.markerKey) {
66
+ markerRegistry.remove(this.markerKey);
67
+ this.markerKey = null;
68
+ }
69
+ // Clear nội dung giữa markers (block content nếu còn)
70
+ let current = this.openTag.nextSibling;
71
+ while (current && current !== this.closeTag) {
72
+ const next = current.nextSibling;
73
+ current.remove();
74
+ current = next;
75
+ }
32
76
  // Remove markers from DOM
33
77
  this.openTag.remove();
34
78
  this.closeTag.remove();
@@ -43,10 +87,10 @@ export class BlockOutlet {
43
87
  this.parent = parentElement;
44
88
  this.parentElement = parentElement;
45
89
  }
46
- get isOneElement() {
90
+ get isSaoElement() {
47
91
  return true;
48
92
  }
49
- set isOneElement(value) {
93
+ set isSaoElement(value) {
50
94
  // No-op setter to satisfy OneElement interface
51
95
  }
52
96
  get isOneBlockOutlet() {
@@ -1 +1 @@
1
- {"version":3,"file":"BlockOutlet.js","sourceRoot":"","sources":["../../../../src/core/elements/BlockOutlet.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,cAAc,MAAO,4BAA4B,CAAC;AAGzD,MAAM,OAAO,WAAW;IAUpB,YAAY,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAiI;QAT9M,YAAO,GAAkB,aAAa,CAAC;QAKvC,WAAM,GAAyB,IAAI,CAAC;QACpC,kBAAa,GAAyB,IAAI,CAAC;QAE3C,aAAQ,GAAa,QAAQ,CAAC;QAE1B,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,0BAA0B;QAC/E,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,cAAc,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,6CAA6C;QAE5H,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,iBAAiB,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO;QACH,4DAA4D;IAChE,CAAC;IAED,MAAM;QACF,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO;YAAE,OAAO;QAE/D,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;QAE5C,gBAAgB;QAChB,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,gEAAgE;QAChE,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAExC,CAAC;IAED,OAAO;QACH,0BAA0B;QAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK;QACD,kEAAkE;IACtE,CAAC;IAED,IAAI;QACA,sEAAsE;IAC1E,CAAC;IAED,gBAAgB,CAAC,aAAmC;QAChD,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;IAED,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,YAAY,CAAC,KAAc;QAC3B,+CAA+C;IACnD,CAAC;IAED,IAAI,gBAAgB;QAChB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,gBAAgB,CAAC,KAAc;QAC/B,+FAA+F;IACnG,CAAC;CACJ"}
1
+ {"version":3,"file":"BlockOutlet.js","sourceRoot":"","sources":["../../../../src/core/elements/BlockOutlet.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- import { InitMode } from "../contracts/common";
2
- import { ComponentInterface } from "../contracts/ComponentInterface";
3
- import { HtmlInterface } from "../contracts/ElementInterface";
4
- import { ViewControllerInterface } from "../contracts/ViewControllerInterface";
5
- import { ViewInterface } from "../contracts/ViewInterface";
6
- import { OneObjectType } from "../types/utils";
1
+ import { InitMode } from "../contracts/common.js";
2
+ import { ComponentInterface } from "../contracts/ComponentInterface.js";
3
+ import { HtmlInterface } from "../contracts/ElementInterface.js";
4
+ import { ViewControllerInterface } from "../contracts/ViewControllerInterface.js";
5
+ import { ViewInterface } from "../contracts/ViewInterface.js";
6
+ import { SaoObjectType } from "../types/utils.js";
7
7
  export declare class Component implements ComponentInterface {
8
- oneType: OneObjectType;
8
+ saoType: SaoObjectType;
9
9
  ctx: ViewControllerInterface;
10
10
  parent: HtmlInterface | null;
11
11
  domChildren: Node[];
@@ -24,8 +24,20 @@ export declare class Component implements ComponentInterface {
24
24
  initMode: InitMode;
25
25
  subscribeFn: () => void;
26
26
  unsubscribeFn: () => void;
27
+ /**
28
+ * Listener khai báo tại thẻ cha: `<mycomp @edit(openEditor(event))>`.
29
+ *
30
+ * Con gọi `emit('edit', payload)` → ViewController.emit tra Ở ĐÂY, không đi
31
+ * qua event bus: không rò sang instance khác, không phải gỡ đăng ký.
32
+ *
33
+ * Đọc lúc phát chứ không copy vào data con: mỗi lần cha render lại,
34
+ * `ViewController.include()` thay bảng này bằng closure mới, nên handler
35
+ * luôn nhìn thấy biến vòng lặp / prop của LƯỢT RENDER hiện tại — kể cả khi
36
+ * component không có prop reactive nào để kích hoạt updateData.
37
+ */
38
+ listeners: Record<string, (...args: any[]) => any>;
27
39
  dataFactory: ((parentElement: HtmlInterface | null) => Record<string, any>) | null;
28
- constructor({ ctx, parent, id, stateKeys, data, dataFactory, path, type, condition, initMode, }: {
40
+ constructor({ ctx, parent, id, stateKeys, data, dataFactory, path, type, condition, initMode, listeners, }: {
29
41
  ctx: ViewControllerInterface;
30
42
  parent?: HtmlInterface | null;
31
43
  id?: string | null;
@@ -39,7 +51,13 @@ export declare class Component implements ComponentInterface {
39
51
  checker: () => any;
40
52
  } | null;
41
53
  initMode?: InitMode;
54
+ listeners?: Record<string, (...args: any[]) => any>;
42
55
  });
56
+ /**
57
+ * Tìm cặp marker component từ server-rendered HTML (format chuẩn §5.1):
58
+ * open: s:c:{id}-s close: s:c:{id}-e
59
+ */
60
+ private claimSSRMarkers;
43
61
  mergeData(newData: Record<string, any>): void;
44
62
  setDataFactory(factory: (parentElement: HtmlInterface | null) => Record<string, any>): void;
45
63
  setCondition(condition: {
@@ -47,15 +65,69 @@ export declare class Component implements ComponentInterface {
47
65
  checker: () => any;
48
66
  }): void;
49
67
  setStateKeys(stateKeys: string[]): void;
68
+ setListeners(listeners: Record<string, (...args: any[]) => any>): void;
50
69
  setParentElement(parent: HtmlInterface | null): void;
51
70
  setView(view: ViewInterface): void;
52
71
  setParent(parent: HtmlInterface | null): void;
72
+ /** Registry guard */
73
+ __destroyed__: boolean;
74
+ private _isStarted;
75
+ private unsubscribeData;
76
+ private unsubscribeCondition;
77
+ /** 'when' type: trạng thái mounted hiện tại của child */
78
+ private _childMounted;
79
+ /**
80
+ * Render — @include (RUNTIME_CONTRACT.md §2):
81
+ * 1. Đặt component markers (idempotent — caller có thể đã đặt đúng vị trí)
82
+ * 2. Resolve child view từ registry (App.View)
83
+ * 3. Render child wrapper GIỮA markers, liên kết parent ↔ child
84
+ * 4. commitData cho child (start sẽ do lifecycle cascade gọi)
85
+ *
86
+ * Hydrate mode (markers claim được từ SSR): child view được tạo với đúng
87
+ * viewId server đã dùng (discover từ marker view bên trong) → toàn bộ cây
88
+ * con CLAIM DOM server thay vì tạo mới — SSR/CSR cho cùng kết quả.
89
+ */
90
+ render(): void;
91
+ /**
92
+ * Error boundary cho subtree con (@include). Boundary được tìm từ ctx —
93
+ * controller CHỨA @include này, không phải view con — nên onError của một
94
+ * view không bắt lỗi render của chính nó (giống React ErrorBoundary).
95
+ * Không boundary nào xử lý → rethrow, giữ nguyên hành vi cũ (bubble lên
96
+ * try/catch của renderPageView).
97
+ */
98
+ private guardChildMount;
99
+ /** Dọn DOM dở dang của lần render lỗi rồi chèn fallback giữa cặp marker. */
100
+ private mountFallback;
101
+ /**
102
+ * Discover viewId server đã dùng cho child view: quét comment giữa cặp
103
+ * marker component, tìm marker view mở đầu tiên <!--s:v:{id}-s-->.
104
+ */
105
+ private discoverChildViewId;
106
+ /**
107
+ * Hydrate child view — thứ tự chuẩn hydration (như ViewManager.hydrateView):
108
+ * discover viewId → tạo instance → commit state → flush discard →
109
+ * render claim DOM → mount() (hook + asset). KHÔNG chèn node mới.
110
+ */
111
+ private hydrateChild;
112
+ /** Tạo + mount child view giữa markers (nếu chưa có) */
113
+ private mountChild;
114
+ /** Resolve one child instance and establish ownership before either DOM strategy. */
115
+ private resolveChildView;
116
+ /** Hydration mounts after commit/claim; CSR commits immediately after mount. */
117
+ private finishChildMount;
118
+ private markChildMounted;
119
+ /** Gỡ child (when=false hoặc destroy) */
120
+ private unmountChild;
121
+ /**
122
+ * Start — kích hoạt child + subscribe:
123
+ * - stateKeys: props reactive — đổi → dataFactory mới → child.updateData()
124
+ * - condition (type 'when'): đổi → mount/unmount child
125
+ */
53
126
  start(): void;
54
127
  stop(): void;
55
- render(): void;
56
128
  destroy(): void;
57
- get isOneElement(): boolean;
58
- set isOneElement(value: boolean);
129
+ get isSaoElement(): boolean;
130
+ set isSaoElement(value: boolean);
59
131
  get isOneComponent(): boolean;
60
132
  set isOneComponent(value: boolean);
61
133
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Component.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/Component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Component.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/Component.ts"],"names":[],"mappings":"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"}