@saolabs/client 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) 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 +25 -15
  9. package/dist/src/core/app/Application.d.ts.map +1 -1
  10. package/dist/src/core/app/Application.js +55 -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 +77 -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 +129 -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 +15 -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/helpers/ApiClient.d.ts.map +1 -0
  178. package/dist/src/core/{hellpers → helpers}/ApiClient.js +10 -1
  179. package/dist/src/core/helpers/ApiClient.js.map +1 -0
  180. package/dist/src/core/helpers/app.d.ts +3 -0
  181. package/dist/src/core/helpers/app.d.ts.map +1 -0
  182. package/dist/src/core/{hellpers → helpers}/app.js +11 -1
  183. package/dist/src/core/helpers/app.js.map +1 -0
  184. package/dist/src/core/helpers/transition.d.ts +34 -0
  185. package/dist/src/core/helpers/transition.d.ts.map +1 -0
  186. package/dist/src/core/helpers/transition.js +118 -0
  187. package/dist/src/core/helpers/transition.js.map +1 -0
  188. package/dist/src/core/{hellpers → helpers}/utils.d.ts +2 -2
  189. package/dist/src/core/helpers/utils.d.ts.map +1 -0
  190. package/dist/src/core/{hellpers → helpers}/utils.js +4 -4
  191. package/dist/src/core/helpers/utils.js.map +1 -0
  192. package/dist/src/core/helpers/view.d.ts +39 -0
  193. package/dist/src/core/helpers/view.d.ts.map +1 -0
  194. package/dist/src/core/helpers/view.js +286 -0
  195. package/dist/src/core/helpers/view.js.map +1 -0
  196. package/dist/src/core/routers/Router.d.ts +108 -7
  197. package/dist/src/core/routers/Router.d.ts.map +1 -1
  198. package/dist/src/core/routers/Router.js +444 -68
  199. package/dist/src/core/routers/Router.js.map +1 -1
  200. package/dist/src/core/routers/index.d.ts +2 -2
  201. package/dist/src/core/routers/index.d.ts.map +1 -1
  202. package/dist/src/core/routers/index.js +1 -1
  203. package/dist/src/core/routers/index.js.map +1 -1
  204. package/dist/src/core/services/AssetManager.d.ts +112 -0
  205. package/dist/src/core/services/AssetManager.d.ts.map +1 -0
  206. package/dist/src/core/services/AssetManager.js +361 -0
  207. package/dist/src/core/services/AssetManager.js.map +1 -0
  208. package/dist/src/core/services/BlockManager.d.ts +73 -2
  209. package/dist/src/core/services/BlockManager.d.ts.map +1 -1
  210. package/dist/src/core/services/BlockManager.js +270 -48
  211. package/dist/src/core/services/BlockManager.js.map +1 -1
  212. package/dist/src/core/services/DomService.js +3 -3
  213. package/dist/src/core/services/DomService.js.map +1 -1
  214. package/dist/src/core/services/HeadService.d.ts +24 -0
  215. package/dist/src/core/services/HeadService.d.ts.map +1 -0
  216. package/dist/src/core/services/HeadService.js +120 -0
  217. package/dist/src/core/services/HeadService.js.map +1 -0
  218. package/dist/src/core/services/HelperService.d.ts +14 -3
  219. package/dist/src/core/services/HelperService.d.ts.map +1 -1
  220. package/dist/src/core/services/HelperService.js +32 -2
  221. package/dist/src/core/services/HelperService.js.map +1 -1
  222. package/dist/src/core/services/HttpService.d.ts +8 -0
  223. package/dist/src/core/services/HttpService.d.ts.map +1 -1
  224. package/dist/src/core/services/HttpService.js +121 -47
  225. package/dist/src/core/services/HttpService.js.map +1 -1
  226. package/dist/src/core/services/MarkerRegistry.d.ts +51 -8
  227. package/dist/src/core/services/MarkerRegistry.d.ts.map +1 -1
  228. package/dist/src/core/services/MarkerRegistry.js +135 -14
  229. package/dist/src/core/services/MarkerRegistry.js.map +1 -1
  230. package/dist/src/core/services/PageCache.d.ts +101 -0
  231. package/dist/src/core/services/PageCache.d.ts.map +1 -0
  232. package/dist/src/core/services/PageCache.js +184 -0
  233. package/dist/src/core/services/PageCache.js.map +1 -0
  234. package/dist/src/core/services/SectionManager.d.ts +100 -0
  235. package/dist/src/core/services/SectionManager.d.ts.map +1 -0
  236. package/dist/src/core/services/SectionManager.js +408 -0
  237. package/dist/src/core/services/SectionManager.js.map +1 -0
  238. package/dist/src/core/services/StorageService.js +1 -1
  239. package/dist/src/core/services/TranslationService.d.ts +21 -0
  240. package/dist/src/core/services/TranslationService.d.ts.map +1 -0
  241. package/dist/src/core/services/TranslationService.js +95 -0
  242. package/dist/src/core/services/TranslationService.js.map +1 -0
  243. package/dist/src/core/services/index.d.ts +11 -8
  244. package/dist/src/core/services/index.d.ts.map +1 -1
  245. package/dist/src/core/services/index.js +11 -8
  246. package/dist/src/core/services/index.js.map +1 -1
  247. package/dist/src/core/types/utils.d.ts +8 -8
  248. package/dist/src/core/types/utils.d.ts.map +1 -1
  249. package/dist/src/core/view/LoopContext.d.ts +21 -1
  250. package/dist/src/core/view/LoopContext.d.ts.map +1 -1
  251. package/dist/src/core/view/LoopContext.js +36 -0
  252. package/dist/src/core/view/LoopContext.js.map +1 -1
  253. package/dist/src/core/view/ResourceScope.d.ts +38 -0
  254. package/dist/src/core/view/ResourceScope.d.ts.map +1 -0
  255. package/dist/src/core/view/ResourceScope.js +167 -0
  256. package/dist/src/core/view/ResourceScope.js.map +1 -0
  257. package/dist/src/core/view/Section.d.ts +17 -32
  258. package/dist/src/core/view/Section.d.ts.map +1 -1
  259. package/dist/src/core/view/Section.js +14 -55
  260. package/dist/src/core/view/Section.js.map +1 -1
  261. package/dist/src/core/view/View.d.ts +43 -7
  262. package/dist/src/core/view/View.d.ts.map +1 -1
  263. package/dist/src/core/view/View.js +22 -4
  264. package/dist/src/core/view/View.js.map +1 -1
  265. package/dist/src/core/view/ViewController.d.ts +313 -40
  266. package/dist/src/core/view/ViewController.d.ts.map +1 -1
  267. package/dist/src/core/view/ViewController.js +1002 -147
  268. package/dist/src/core/view/ViewController.js.map +1 -1
  269. package/dist/src/core/view/ViewManager.d.ts +318 -27
  270. package/dist/src/core/view/ViewManager.d.ts.map +1 -1
  271. package/dist/src/core/view/ViewManager.js +1199 -258
  272. package/dist/src/core/view/ViewManager.js.map +1 -1
  273. package/dist/src/core/view/ViewState.d.ts +185 -6
  274. package/dist/src/core/view/ViewState.d.ts.map +1 -1
  275. package/dist/src/core/view/ViewState.js +851 -123
  276. package/dist/src/core/view/ViewState.js.map +1 -1
  277. package/dist/src/core/view/index.d.ts +5 -5
  278. package/dist/src/core/view/index.d.ts.map +1 -1
  279. package/dist/src/core/view/index.js +5 -5
  280. package/dist/src/core/view/index.js.map +1 -1
  281. package/dist/src/testing/index.d.ts +69 -0
  282. package/dist/src/testing/index.d.ts.map +1 -0
  283. package/dist/src/testing/index.js +140 -0
  284. package/dist/src/testing/index.js.map +1 -0
  285. package/index.ts +29 -5
  286. package/package.json +30 -21
  287. package/plugins.ts +2 -2
  288. package/src/core/app/Application.ts +72 -31
  289. package/src/core/bootstrap/app.ts +84 -6
  290. package/src/core/bootstrap/bundle.ts +101 -0
  291. package/src/core/bootstrap/providers/ApiServiceProvider.ts +4 -4
  292. package/src/core/bootstrap/providers/CoreServiceProvider.ts +14 -8
  293. package/src/core/bootstrap/providers/HelperServiceProvider.ts +8 -3
  294. package/src/core/bootstrap/providers/RouteServiceProvider.ts +15 -4
  295. package/src/core/bootstrap/providers/ServiceProvider.ts +8 -8
  296. package/src/core/bootstrap/providers/ViewServiceProvider.ts +3 -3
  297. package/src/core/bootstrap/providers/default-providers.ts +51 -16
  298. package/src/core/bootstrap/providers/index.ts +9 -9
  299. package/src/core/bootstrap/providers/provider-order.test.ts +16 -27
  300. package/src/core/bootstrap/providers/provider-order.ts +1 -1
  301. package/src/core/bootstrap/ssr.ts +141 -0
  302. package/src/core/cache/ViewCache.ts +1 -1
  303. package/src/core/cache/index.ts +1 -1
  304. package/src/core/contracts/ApplicationInterface.ts +15 -11
  305. package/src/core/contracts/BlockInterface.ts +18 -18
  306. package/src/core/contracts/BundleInterface.ts +40 -0
  307. package/src/core/contracts/ComponentInterface.ts +7 -6
  308. package/src/core/contracts/ElementInterface.ts +95 -27
  309. package/src/core/contracts/HeadServiceInterface.ts +41 -0
  310. package/src/core/contracts/HelperInterface.ts +9 -1
  311. package/src/core/contracts/HttpServiceInterface.ts +3 -0
  312. package/src/core/contracts/MarkerInterface.ts +22 -49
  313. package/src/core/contracts/ReactiveInterface.ts +9 -9
  314. package/src/core/contracts/RouterInterface.ts +5 -2
  315. package/src/core/contracts/SectionInterface.ts +49 -0
  316. package/src/core/contracts/ServiceProviderInterface.ts +3 -3
  317. package/src/core/contracts/ViewControllerInterface.ts +124 -16
  318. package/src/core/contracts/ViewInterface.ts +34 -5
  319. package/src/core/contracts/ViewManagerInterface.ts +40 -5
  320. package/src/core/contracts/ViewStateInterface.ts +39 -2
  321. package/src/core/contracts/common.ts +3 -3
  322. package/src/core/contracts/utils.ts +19 -19
  323. package/src/core/contracts/views.ts +2 -22
  324. package/src/core/devtools/hook.ts +142 -0
  325. package/src/core/devtools/index.ts +38 -0
  326. package/src/core/devtools/inspector.ts +270 -0
  327. package/src/core/elements/Block.ts +43 -21
  328. package/src/core/elements/BlockOutlet.ts +61 -21
  329. package/src/core/elements/Component.ts +352 -18
  330. package/src/core/elements/ElementManager.ts +9 -9
  331. package/src/core/elements/ForeachSlotCache.ts +170 -0
  332. package/src/core/elements/Fragment.ts +50 -32
  333. package/src/core/elements/Html.ts +696 -117
  334. package/src/core/elements/Output.ts +147 -30
  335. package/src/core/elements/Reactive.ts +329 -52
  336. package/src/core/elements/TextElement.ts +25 -16
  337. package/src/core/elements/Wrapper.ts +84 -18
  338. package/src/core/elements/Yield.ts +35 -24
  339. package/src/core/elements/helpers.ts +12 -12
  340. package/src/core/elements/index.ts +25 -24
  341. package/src/core/elements/reconcileChildren.ts +70 -0
  342. package/src/core/{hellpers → helpers}/ApiClient.ts +8 -1
  343. package/src/core/{hellpers → helpers}/app.ts +13 -2
  344. package/src/core/helpers/transition.ts +127 -0
  345. package/src/core/{hellpers → helpers}/utils.ts +4 -4
  346. package/src/core/helpers/view.ts +283 -0
  347. package/src/core/routers/Router.ts +458 -64
  348. package/src/core/routers/index.ts +2 -2
  349. package/src/core/services/AssetManager.ts +387 -0
  350. package/src/core/services/BlockManager.ts +272 -50
  351. package/src/core/services/DomService.ts +3 -3
  352. package/src/core/services/HeadService.ts +124 -0
  353. package/src/core/services/HelperService.ts +34 -4
  354. package/src/core/services/HttpService.ts +116 -55
  355. package/src/core/services/MarkerRegistry.ts +142 -16
  356. package/src/core/services/PageCache.ts +239 -0
  357. package/src/core/services/SectionManager.ts +387 -0
  358. package/src/core/services/StorageService.ts +1 -1
  359. package/src/core/services/TranslationService.ts +91 -0
  360. package/src/core/services/index.ts +11 -8
  361. package/src/core/types/utils.ts +8 -8
  362. package/src/core/view/LoopContext.ts +38 -1
  363. package/src/core/view/ResourceScope.ts +174 -0
  364. package/src/core/view/Section.ts +21 -68
  365. package/src/core/view/View.ts +57 -8
  366. package/src/core/view/ViewController.ts +1070 -186
  367. package/src/core/view/ViewManager.ts +1346 -272
  368. package/src/core/view/ViewState.ts +834 -116
  369. package/src/core/view/index.ts +5 -5
  370. package/src/testing/index.ts +184 -0
  371. package/dist/src/core/hellpers/ApiClient.d.ts.map +0 -1
  372. package/dist/src/core/hellpers/ApiClient.js.map +0 -1
  373. package/dist/src/core/hellpers/app.d.ts +0 -3
  374. package/dist/src/core/hellpers/app.d.ts.map +0 -1
  375. package/dist/src/core/hellpers/app.js.map +0 -1
  376. package/dist/src/core/hellpers/utils.d.ts.map +0 -1
  377. package/dist/src/core/hellpers/utils.js.map +0 -1
  378. package/dist/src/core/services/MarkerService.d.ts +0 -299
  379. package/dist/src/core/services/MarkerService.d.ts.map +0 -1
  380. package/dist/src/core/services/MarkerService.js +0 -723
  381. package/dist/src/core/services/MarkerService.js.map +0 -1
  382. package/src/core/services/MarkerService.ts +0 -923
  383. /package/dist/src/core/{hellpers → helpers}/ApiClient.d.ts +0 -0
@@ -1,8 +1,10 @@
1
- import { InitModes } from "../contracts/common";
2
- import { generateUUID } from "../hellpers/utils";
1
+ import { InitModes } from "../contracts/common.js";
2
+ import { generateUUID } from "../helpers/utils.js";
3
+ import { activateView, claimHydratedView, commitView, mountChildrenBeforeAnchor } from "../helpers/view.js";
4
+ import markerRegistry from "../services/MarkerRegistry.js";
3
5
  export class Component {
4
- constructor({ ctx, parent = null, id = null, stateKeys = [], data = {}, dataFactory = null, path = null, type = 'default', condition = null, initMode = InitModes.CREATE, }) {
5
- this.oneType = 'Component';
6
+ constructor({ ctx, parent = null, id = null, stateKeys = [], data = {}, dataFactory = null, path = null, type = 'default', condition = null, initMode = InitModes.CREATE, listeners = {}, }) {
7
+ this.saoType = 'Component';
6
8
  this.domChildren = []; // For compatibility with HtmlInterface; Component itself doesn't have a single root element
7
9
  this.viewRef = null;
8
10
  this.path = null; // For dynamic imports
@@ -11,19 +13,64 @@ export class Component {
11
13
  this.initMode = InitModes.CREATE; // Default initialization mode
12
14
  this.subscribeFn = () => { };
13
15
  this.unsubscribeFn = () => { };
16
+ /**
17
+ * Listener khai báo tại thẻ cha: `<mycomp @edit(openEditor(event))>`.
18
+ *
19
+ * Con gọi `emit('edit', payload)` → ViewController.emit tra Ở ĐÂY, không đi
20
+ * qua event bus: không rò sang instance khác, không phải gỡ đăng ký.
21
+ *
22
+ * Đọc lúc phát chứ không copy vào data con: mỗi lần cha render lại,
23
+ * `ViewController.include()` thay bảng này bằng closure mới, nên handler
24
+ * 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
25
+ * component không có prop reactive nào để kích hoạt updateData.
26
+ */
27
+ this.listeners = {};
14
28
  this.dataFactory = null;
29
+ /** Registry guard */
30
+ this.__destroyed__ = false;
31
+ this._isStarted = false;
32
+ this.unsubscribeData = null;
33
+ this.unsubscribeCondition = null;
34
+ /** 'when' type: trạng thái mounted hiện tại của child */
35
+ this._childMounted = false;
15
36
  this.ctx = ctx;
16
37
  this.parent = parent;
17
38
  this.stateKeys = stateKeys;
18
39
  this.data = data || {};
19
- this.openTag = document.createComment(`component-start`);
20
- this.closeTag = document.createComment(`component-end`);
21
- this.id = `${ctx.viewId}-${id ?? generateUUID(10)}`; // Unique ID for debugging
40
+ // id khớp server: Blade emit @startMarker('component', '{hash}') →
41
+ // <!--s:c:{parentViewId}-{hash}-s--> (MarkerRegistryDirectiveService)
42
+ this.id = `${ctx.viewId}-${id ?? generateUUID(10)}`;
22
43
  this.dataFactory = dataFactory;
23
44
  this.path = path;
24
45
  this.type = type;
25
46
  this.condition = condition;
47
+ this.listeners = listeners || {};
26
48
  this.initMode = initMode ?? InitModes.CREATE;
49
+ if (this.initMode === InitModes.HYDRATE) {
50
+ // ── Hydrate: claim cặp marker component server đã render ─────
51
+ const claimed = this.claimSSRMarkers();
52
+ if (claimed) {
53
+ this.openTag = claimed.open;
54
+ this.closeTag = claimed.close;
55
+ }
56
+ else {
57
+ // Partial hydration fallback (server không render vùng này)
58
+ this.openTag = markerRegistry.createMarkerStart('component', this.id);
59
+ this.closeTag = markerRegistry.createMarkerEnd('component', this.id);
60
+ }
61
+ }
62
+ else {
63
+ // Format chuẩn s:c:{id}-s/-e — PHẢI khớp server để SSR/CSR cùng kết quả
64
+ this.openTag = markerRegistry.createMarkerStart('component', this.id);
65
+ this.closeTag = markerRegistry.createMarkerEnd('component', this.id);
66
+ }
67
+ }
68
+ /**
69
+ * Tìm cặp marker component từ server-rendered HTML (format chuẩn §5.1):
70
+ * open: s:c:{id}-s close: s:c:{id}-e
71
+ */
72
+ claimSSRMarkers() {
73
+ return markerRegistry.claim('component', this.id, this.parent?.element ?? null);
27
74
  }
28
75
  mergeData(newData) {
29
76
  this.data = { ...this.data, ...newData };
@@ -37,6 +84,9 @@ export class Component {
37
84
  setStateKeys(stateKeys) {
38
85
  this.stateKeys = stateKeys;
39
86
  }
87
+ setListeners(listeners) {
88
+ this.listeners = listeners || {};
89
+ }
40
90
  setParentElement(parent) {
41
91
  this.parent = parent;
42
92
  }
@@ -46,20 +96,291 @@ export class Component {
46
96
  setParent(parent) {
47
97
  this.parent = parent;
48
98
  }
99
+ /**
100
+ * Render — @include (RUNTIME_CONTRACT.md §2):
101
+ * 1. Đặt component markers (idempotent — caller có thể đã đặt đúng vị trí)
102
+ * 2. Resolve child view từ registry (App.View)
103
+ * 3. Render child wrapper GIỮA markers, liên kết parent ↔ child
104
+ * 4. commitData cho child (start sẽ do lifecycle cascade gọi)
105
+ *
106
+ * Hydrate mode (markers claim được từ SSR): child view được tạo với đúng
107
+ * viewId server đã dùng (discover từ marker view bên trong) → toàn bộ cây
108
+ * con CLAIM DOM server thay vì tạo mới — SSR/CSR cho cùng kết quả.
109
+ */
110
+ render() {
111
+ if (this.__destroyed__)
112
+ return;
113
+ // ── Hydrate path: markers đã có trong SSR DOM ──────────────────
114
+ if (this.initMode === InitModes.HYDRATE) {
115
+ if (this.openTag.parentNode) {
116
+ // Điều kiện đánh giá với state ĐÃ commit (hydrateView commit trước
117
+ // render) → kết quả khớp server-rendered output.
118
+ if (this.type === 'when' && this.condition && !this.condition.checker()) {
119
+ this.initMode = InitModes.CREATE;
120
+ return; // server cũng không render child (điều kiện falsy)
121
+ }
122
+ if (this.type === 'if') {
123
+ const viewManager = this.ctx.App?.View;
124
+ if (!viewManager?.exists?.(this.path ?? '')) {
125
+ this.initMode = InitModes.CREATE;
126
+ return;
127
+ }
128
+ }
129
+ this.guardChildMount(() => this.hydrateChild());
130
+ this.initMode = InitModes.CREATE; // re-render sau này dùng CSR flow
131
+ return;
132
+ }
133
+ // Partial hydration fallback: server không render component này → CSR
134
+ this.initMode = InitModes.CREATE;
135
+ }
136
+ // 1. Markers
137
+ if (!this.openTag.parentNode) {
138
+ const parentEl = this.parent?.element;
139
+ if (!parentEl)
140
+ return;
141
+ parentEl.appendChild(this.openTag);
142
+ parentEl.appendChild(this.closeTag);
143
+ }
144
+ // 2. Điều kiện theo type
145
+ if (this.type === 'when' && this.condition) {
146
+ const shouldMount = !!this.condition.checker();
147
+ if (!shouldMount) {
148
+ this.unmountChild();
149
+ return;
150
+ }
151
+ }
152
+ if (this.type === 'if') {
153
+ const viewManager = this.ctx.App?.View;
154
+ if (!viewManager?.exists?.(this.path ?? '')) {
155
+ return; // @includeIf: view không tồn tại → bỏ qua, không lỗi
156
+ }
157
+ }
158
+ this.guardChildMount(() => this.mountChild());
159
+ }
160
+ /**
161
+ * Error boundary cho subtree con (@include). Boundary được tìm từ ctx —
162
+ * controller CHỨA @include này, không phải view con — nên onError của một
163
+ * view không bắt lỗi render của chính nó (giống React ErrorBoundary).
164
+ * Không boundary nào xử lý → rethrow, giữ nguyên hành vi cũ (bubble lên
165
+ * try/catch của renderPageView).
166
+ */
167
+ guardChildMount(mount) {
168
+ try {
169
+ mount();
170
+ }
171
+ catch (err) {
172
+ const result = this.ctx.handleError(err, { phase: 'render', path: this.path ?? '' });
173
+ if (!result.handled)
174
+ throw err;
175
+ this.mountFallback(result.fallback);
176
+ }
177
+ }
178
+ /** Dọn DOM dở dang của lần render lỗi rồi chèn fallback giữa cặp marker. */
179
+ mountFallback(fallback) {
180
+ let current = this.openTag.nextSibling;
181
+ while (current && current !== this.closeTag) {
182
+ const next = current.nextSibling;
183
+ current.parentNode?.removeChild(current);
184
+ current = next;
185
+ }
186
+ if (fallback === null || fallback === undefined)
187
+ return;
188
+ mountChildrenBeforeAnchor(this.closeTag, Array.isArray(fallback) ? fallback : [fallback], this.parent);
189
+ }
190
+ /**
191
+ * Discover viewId server đã dùng cho child view: quét comment giữa cặp
192
+ * marker component, tìm marker view mở đầu tiên <!--s:v:{id}-s-->.
193
+ */
194
+ discoverChildViewId() {
195
+ let current = this.openTag.nextSibling;
196
+ while (current && current !== this.closeTag) {
197
+ if (current.nodeType === Node.COMMENT_NODE) {
198
+ const parsed = markerRegistry.parseComment(current.nodeValue ?? '');
199
+ if (parsed && parsed.tag === 'view' && !parsed.isClose)
200
+ return parsed.id;
201
+ }
202
+ else if (current.nodeType === Node.ELEMENT_NODE) {
203
+ const walker = document.createTreeWalker(current, NodeFilter.SHOW_COMMENT);
204
+ let node;
205
+ while ((node = walker.nextNode())) {
206
+ const parsed = markerRegistry.parseComment(node.nodeValue ?? '');
207
+ if (parsed && parsed.tag === 'view' && !parsed.isClose)
208
+ return parsed.id;
209
+ }
210
+ }
211
+ current = current.nextSibling;
212
+ }
213
+ return null;
214
+ }
215
+ /**
216
+ * Hydrate child view — thứ tự chuẩn hydration (như ViewManager.hydrateView):
217
+ * discover viewId → tạo instance → commit state → flush discard →
218
+ * render claim DOM → mount() (hook + asset). KHÔNG chèn node mới.
219
+ */
220
+ hydrateChild() {
221
+ if (this._childMounted && this.viewRef)
222
+ return;
223
+ // Không có marker view của server giữa cặp marker component → server
224
+ // KHÔNG render view con ở đây. Hydrate tiếp thì child giữ viewId do
225
+ // client sinh ('c…'), rồi đi tìm class "{c…}-{id}" và marker
226
+ // "s:v:c…" không tồn tại → dựng cây mới CẠNH cây server, tức nhân đôi
227
+ // DOM. Dọn phần server bỏ lại rồi đi đường CSR — giống nhánh
228
+ // "partial hydration fallback" ở render() khi marker component vắng.
229
+ const ssrViewId = this.discoverChildViewId();
230
+ if (!ssrViewId) {
231
+ this.unmountChild();
232
+ this.mountChild();
233
+ return;
234
+ }
235
+ const childView = this.resolveChildView();
236
+ if (!childView)
237
+ return;
238
+ const childCtrl = childView.__ctrl__;
239
+ // Ghi đè viewId = viewId server (trước render — Wrapper/Html/Output của
240
+ // child claim theo marker/class prefix bằng viewId này)
241
+ childCtrl.viewId = ssrViewId;
242
+ // Commit state TRƯỚC render (factory @if/@foreach sinh đúng cây khớp SSR);
243
+ // flush ngay khi chưa subscribe → discard pending, không phá DOM claim.
244
+ childCtrl.initMode = InitModes.HYDRATE;
245
+ commitView(childCtrl, true);
246
+ const wrapper = childCtrl.render();
247
+ if (wrapper && typeof wrapper === 'object' && 'openTag' in wrapper && this.parent) {
248
+ claimHydratedView(childCtrl, this.parent, wrapper);
249
+ }
250
+ childCtrl.initMode = InitModes.CREATE;
251
+ this.finishChildMount(childCtrl);
252
+ }
253
+ /** Tạo + mount child view giữa markers (nếu chưa có) */
254
+ mountChild() {
255
+ if (this._childMounted && this.viewRef) {
256
+ if (this.dataFactory) {
257
+ const ctrl = this.viewRef.__ctrl__;
258
+ ctrl.updateData(this.dataFactory(this.parent));
259
+ ctrl.states.__.flushNow();
260
+ }
261
+ return;
262
+ }
263
+ const childView = this.resolveChildView();
264
+ if (!childView)
265
+ return;
266
+ const childCtrl = childView.__ctrl__;
267
+ // Render child tree giữa markers
268
+ const wrapper = childCtrl.render();
269
+ if (wrapper && typeof wrapper === 'object' && 'openTag' in wrapper) {
270
+ const insertBeforeClose = (node) => {
271
+ this.closeTag.parentNode?.insertBefore(node, this.closeTag);
272
+ };
273
+ insertBeforeClose(wrapper.openTag);
274
+ insertBeforeClose(wrapper.closeTag);
275
+ // Wrapper render idempotent qua mountChildrenBeforeAnchor
276
+ mountChildrenBeforeAnchor(wrapper.closeTag, wrapper.render(), this.parent);
277
+ }
278
+ // mount(): nội dung child đã nằm giữa markers → fire mounting/mounted + acquire asset
279
+ childCtrl.mount();
280
+ commitView(childCtrl);
281
+ this.markChildMounted(childCtrl);
282
+ }
283
+ /** Resolve one child instance and establish ownership before either DOM strategy. */
284
+ resolveChildView() {
285
+ const viewManager = this.ctx.App?.View;
286
+ if (!viewManager || !this.path) {
287
+ console.error(`[Component] Không resolve được view "${this.path}" — App.View chưa sẵn sàng.`);
288
+ return null;
289
+ }
290
+ const data = this.dataFactory ? this.dataFactory(this.parent) : this.data;
291
+ // Sync: render tree không await được (xem ViewManager.resolveViewSync).
292
+ const childView = viewManager.resolveViewSync(this.path, data ?? {}, false);
293
+ if (!childView) {
294
+ console.error(`[Component] View "${this.path}" không tồn tại trong registry.`);
295
+ return null;
296
+ }
297
+ this.viewRef = childView;
298
+ const childCtrl = childView.__ctrl__;
299
+ childCtrl.ownerComponent = this;
300
+ childCtrl.setParent(this.ctx);
301
+ this.ctx.addChild(childCtrl);
302
+ childCtrl.setParentElement(this.parent);
303
+ return childView;
304
+ }
305
+ /** Hydration mounts after commit/claim; CSR commits immediately after mount. */
306
+ finishChildMount(childCtrl) {
307
+ childCtrl.mount();
308
+ this.markChildMounted(childCtrl);
309
+ }
310
+ markChildMounted(childCtrl) {
311
+ this._childMounted = true;
312
+ if (this._isStarted)
313
+ activateView(childCtrl);
314
+ }
315
+ /** Gỡ child (when=false hoặc destroy) */
316
+ unmountChild() {
317
+ if (this.viewRef) {
318
+ this.viewRef.__ctrl__.destroy();
319
+ this.viewRef = null;
320
+ }
321
+ // Clear mọi node giữa markers
322
+ let current = this.openTag.nextSibling;
323
+ while (current && current !== this.closeTag) {
324
+ const next = current.nextSibling;
325
+ current.remove();
326
+ current = next;
327
+ }
328
+ this._childMounted = false;
329
+ }
330
+ /**
331
+ * Start — kích hoạt child + subscribe:
332
+ * - stateKeys: props reactive — đổi → dataFactory mới → child.updateData()
333
+ * - condition (type 'when'): đổi → mount/unmount child
334
+ */
49
335
  start() {
336
+ if (this._isStarted || this.__destroyed__)
337
+ return;
338
+ this._isStarted = true;
339
+ if (this.viewRef) {
340
+ activateView(this.viewRef.__ctrl__);
341
+ }
342
+ if (this.stateKeys.length > 0) {
343
+ this.unsubscribeData = this.ctx.states.__.subscribe(this.stateKeys, () => {
344
+ if (this.viewRef && this.dataFactory) {
345
+ this.viewRef.__ctrl__.updateData(this.dataFactory(this.parent));
346
+ }
347
+ });
348
+ }
349
+ if (this.type === 'when' && this.condition && this.condition.stateKeys.length > 0) {
350
+ this.unsubscribeCondition = this.ctx.states.__.subscribe(this.condition.stateKeys, () => {
351
+ this.render(); // re-evaluate checker → mount/unmount
352
+ });
353
+ }
50
354
  }
51
355
  stop() {
52
- }
53
- render() {
54
- // To be implemented by specific components
356
+ if (!this._isStarted)
357
+ return;
358
+ this._isStarted = false;
359
+ if (this.unsubscribeData) {
360
+ this.unsubscribeData();
361
+ this.unsubscribeData = null;
362
+ }
363
+ if (this.unsubscribeCondition) {
364
+ this.unsubscribeCondition();
365
+ this.unsubscribeCondition = null;
366
+ }
367
+ this.viewRef?.__ctrl__.stop();
55
368
  }
56
369
  destroy() {
57
- // To be implemented by specific components
370
+ if (this.__destroyed__)
371
+ return;
372
+ this.stop();
373
+ this.__destroyed__ = true;
374
+ this.ctx.releaseElement?.(this);
375
+ this.unmountChild();
376
+ this.openTag.remove();
377
+ this.closeTag.remove();
378
+ this.parent = null;
58
379
  }
59
- get isOneElement() {
380
+ get isSaoElement() {
60
381
  return true;
61
382
  }
62
- set isOneElement(value) {
383
+ set isSaoElement(value) {
63
384
  // No-op, just for type compatibility
64
385
  }
65
386
  get isOneComponent() {
@@ -1 +1 @@
1
- {"version":3,"file":"Component.js","sourceRoot":"","sources":["../../../../src/core/elements/Component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Component.js","sourceRoot":"","sources":["../../../../src/core/elements/Component.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * ForeachSlotCache — keyed slot manager cho @foreach reconciliation.
3
+ *
4
+ * # Cơ chế
5
+ * Mỗi item được identify bằng một cache key:
6
+ * - Có @key(expr) → key = giá trị expr (field keying, vd `item.id`)
7
+ * - Không có @key → key = object reference của item (identity keying)
8
+ * Duplicate keys (primitive lists `['a','b','a']`, refs lặp) được phân biệt
9
+ * bằng occurrence index trong pass — key thứ n trùng nhau map vào slot thứ n.
10
+ *
11
+ * # Reuse contract
12
+ * Slot chỉ được REUSE khi cache key khớp VÀ item ref không đổi
13
+ * (`slot.item === item`). Ref đổi → recreate, vì compiled output đóng gói
14
+ * `item` trực tiếp vào closure (`() => item.name`) — reuse với ref cũ sẽ
15
+ * hiển thị data cũ. Field key vì vậy chủ yếu mang lại: bookkeeping đúng cho
16
+ * duplicate/primitive items + ý định tường minh của developer.
17
+ *
18
+ * # Pass protocol (một chu kỳ render)
19
+ * 1. `beginPass()` — reset occurrence counters + tập slot touched
20
+ * 2. `claim(key, item)` mỗi item theo thứ tự list:
21
+ * hit (slot.item === item) → dùng lại, slot được mark touched
22
+ * miss → caller tạo elements rồi `store(key, occ, item, elements)`
23
+ * 3. `prunePass(onRemove)` — slot KHÔNG được touch trong pass = item đã rời
24
+ * list → callback destroy + gỡ khỏi cache. (Trước đây bước này là dead
25
+ * code — cache không bao giờ gỡ entry → element của item bị xoá leak.)
26
+ * Slot bị `store()` GHI ĐÈ (cùng key, ref mới) cũng đi qua đây: nó rơi khỏi
27
+ * `_map` ngay lúc ghi đè nên prunePass không còn thấy → phải giữ tạm trong
28
+ * `_evicted`. Thiếu bước này thì refresh list từ server (`@key` giữ nguyên,
29
+ * ref đổi) KHÔNG destroy elements cũ → view con của @include bị tái dùng
30
+ * trong DOM đã detach và biến mất khỏi trang.
31
+ *
32
+ * # Quan hệ với Reactive
33
+ * Reactive type 'foreach' giữ một instance; cửa sổ `_currentForeachCache`
34
+ * chỉ mở quanh CHÍNH childrenFactory call (không mở trong child.render() —
35
+ * tránh nested @foreach ghi nhầm vào cache của loop ngoài).
36
+ *
37
+ * @see Reactive.renderForeach()
38
+ * @see ViewController.__foreach()
39
+ */
40
+ /** Một slot tương ứng với một item trong foreach list. */
41
+ export interface ForeachSlot {
42
+ /** Reference tới item gốc — điều kiện reuse là ref không đổi */
43
+ item: any;
44
+ /** Saola elements sinh ra bởi item factory — Html, Output, Reactive, ... */
45
+ elements: any[];
46
+ /** Compiler opt-in: closures are refreshed within this occurrence's scope. */
47
+ registry?: Map<string, any>;
48
+ identity?: number;
49
+ }
50
+ /** Kết quả claim: slot khi reuse được, occ để store khi phải tạo mới. */
51
+ export interface ForeachClaim {
52
+ slot: ForeachSlot | null;
53
+ occ: number;
54
+ }
55
+ export declare class ForeachSlotCache {
56
+ readonly refreshedElements: Set<any>;
57
+ private nextIdentity;
58
+ /** Initial SSR indexes, then monotonically allocated identities for new rows. */
59
+ allocateIdentity(index: number): number;
60
+ /** Map key → danh sách slot theo occurrence (duplicate keys) */
61
+ private _map;
62
+ /** Occurrence counter của pass hiện tại */
63
+ private _passOcc;
64
+ /** Slots được claim-hit hoặc store trong pass hiện tại */
65
+ private _touched;
66
+ /** Slots bị store() ghi đè trong pass hiện tại — prunePass destroy rồi clear */
67
+ private _evicted;
68
+ /** Tổng số slot đang cache (mọi occurrence). */
69
+ get size(): number;
70
+ /** Bắt đầu một chu kỳ render — reset counters + touched set. */
71
+ beginPass(): void;
72
+ /**
73
+ * Claim slot cho (key, item) theo thứ tự list.
74
+ * Trả slot khi reuse được (key khớp + ref không đổi); ngược lại slot=null
75
+ * và caller phải store(key, occ, ...) sau khi tạo elements.
76
+ */
77
+ claim(key: any, item: any, reconcile?: boolean): ForeachClaim;
78
+ /**
79
+ * Lưu slot mới tại (key, occ) — ghi đè slot cũ nếu ref đã đổi.
80
+ * Slot bị ghi đè KHÔNG còn nằm trong `_map` nên prunePass duyệt `_map` sẽ
81
+ * không thấy nó nữa → phải chuyển sang `_evicted` để vẫn được destroy.
82
+ */
83
+ store(key: any, occ: number, item: any, elements: any[], registry?: Map<string, any>): ForeachSlot;
84
+ /**
85
+ * Kết thúc pass: mọi slot không được touch = item đã rời list (hoặc bị
86
+ * thay bằng ref mới) → gọi onRemove(slot) để destroy elements, gỡ khỏi cache.
87
+ */
88
+ prunePass(onRemove: (slot: ForeachSlot) => void): void;
89
+ /**
90
+ * Xoá toàn bộ cache — dùng khi Reactive bị destroy.
91
+ * KHÔNG tự gọi destroy() trên elements — caller phải làm trước.
92
+ */
93
+ clear(): void;
94
+ }
95
+ //# sourceMappingURL=ForeachSlotCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ForeachSlotCache.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/ForeachSlotCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,0DAA0D;AAC1D,MAAM,WAAW,WAAW;IACxB,gEAAgE;IAChE,IAAI,EAAE,GAAG,CAAC;IACV,4EAA4E;IAC5E,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,yEAAyE;AACzE,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,gBAAgB;IACzB,QAAQ,CAAC,iBAAiB,WAAkB;IAC5C,OAAO,CAAC,YAAY,CAAK;IAEzB,iFAAiF;IACjF,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAKvC,gEAAgE;IAChE,OAAO,CAAC,IAAI,CAAsC;IAClD,2CAA2C;IAC3C,OAAO,CAAC,QAAQ,CAA+B;IAC/C,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAA+B;IAC/C,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAqB;IAErC,gDAAgD;IAChD,IAAI,IAAI,IAAI,MAAM,CAIjB;IAED,gEAAgE;IAChE,SAAS,IAAI,IAAI;IAOjB;;;;OAIG;IACH,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,UAAQ,GAAG,YAAY;IAY3D;;;;OAIG;IACH,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,WAAW;IAgBlG;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI;IAwBtD;;;OAGG;IACH,KAAK,IAAI,IAAI;CAQhB"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * ForeachSlotCache — keyed slot manager cho @foreach reconciliation.
3
+ *
4
+ * # Cơ chế
5
+ * Mỗi item được identify bằng một cache key:
6
+ * - Có @key(expr) → key = giá trị expr (field keying, vd `item.id`)
7
+ * - Không có @key → key = object reference của item (identity keying)
8
+ * Duplicate keys (primitive lists `['a','b','a']`, refs lặp) được phân biệt
9
+ * bằng occurrence index trong pass — key thứ n trùng nhau map vào slot thứ n.
10
+ *
11
+ * # Reuse contract
12
+ * Slot chỉ được REUSE khi cache key khớp VÀ item ref không đổi
13
+ * (`slot.item === item`). Ref đổi → recreate, vì compiled output đóng gói
14
+ * `item` trực tiếp vào closure (`() => item.name`) — reuse với ref cũ sẽ
15
+ * hiển thị data cũ. Field key vì vậy chủ yếu mang lại: bookkeeping đúng cho
16
+ * duplicate/primitive items + ý định tường minh của developer.
17
+ *
18
+ * # Pass protocol (một chu kỳ render)
19
+ * 1. `beginPass()` — reset occurrence counters + tập slot touched
20
+ * 2. `claim(key, item)` mỗi item theo thứ tự list:
21
+ * hit (slot.item === item) → dùng lại, slot được mark touched
22
+ * miss → caller tạo elements rồi `store(key, occ, item, elements)`
23
+ * 3. `prunePass(onRemove)` — slot KHÔNG được touch trong pass = item đã rời
24
+ * list → callback destroy + gỡ khỏi cache. (Trước đây bước này là dead
25
+ * code — cache không bao giờ gỡ entry → element của item bị xoá leak.)
26
+ * Slot bị `store()` GHI ĐÈ (cùng key, ref mới) cũng đi qua đây: nó rơi khỏi
27
+ * `_map` ngay lúc ghi đè nên prunePass không còn thấy → phải giữ tạm trong
28
+ * `_evicted`. Thiếu bước này thì refresh list từ server (`@key` giữ nguyên,
29
+ * ref đổi) KHÔNG destroy elements cũ → view con của @include bị tái dùng
30
+ * trong DOM đã detach và biến mất khỏi trang.
31
+ *
32
+ * # Quan hệ với Reactive
33
+ * Reactive type 'foreach' giữ một instance; cửa sổ `_currentForeachCache`
34
+ * chỉ mở quanh CHÍNH childrenFactory call (không mở trong child.render() —
35
+ * tránh nested @foreach ghi nhầm vào cache của loop ngoài).
36
+ *
37
+ * @see Reactive.renderForeach()
38
+ * @see ViewController.__foreach()
39
+ */
40
+ export class ForeachSlotCache {
41
+ constructor() {
42
+ this.refreshedElements = new Set();
43
+ this.nextIdentity = 0;
44
+ /** Map key → danh sách slot theo occurrence (duplicate keys) */
45
+ this._map = new Map();
46
+ /** Occurrence counter của pass hiện tại */
47
+ this._passOcc = new Map();
48
+ /** Slots được claim-hit hoặc store trong pass hiện tại */
49
+ this._touched = new Set();
50
+ /** Slots bị store() ghi đè trong pass hiện tại — prunePass destroy rồi clear */
51
+ this._evicted = [];
52
+ }
53
+ /** Initial SSR indexes, then monotonically allocated identities for new rows. */
54
+ allocateIdentity(index) {
55
+ const identity = Math.max(index, this.nextIdentity);
56
+ this.nextIdentity = identity + 1;
57
+ return identity;
58
+ }
59
+ /** Tổng số slot đang cache (mọi occurrence). */
60
+ get size() {
61
+ let n = 0;
62
+ for (const slots of this._map.values())
63
+ n += slots.length;
64
+ return n;
65
+ }
66
+ /** Bắt đầu một chu kỳ render — reset counters + touched set. */
67
+ beginPass() {
68
+ this.refreshedElements.clear();
69
+ this._passOcc = new Map();
70
+ this._touched = new Set();
71
+ this._evicted = [];
72
+ }
73
+ /**
74
+ * Claim slot cho (key, item) theo thứ tự list.
75
+ * Trả slot khi reuse được (key khớp + ref không đổi); ngược lại slot=null
76
+ * và caller phải store(key, occ, ...) sau khi tạo elements.
77
+ */
78
+ claim(key, item, reconcile = false) {
79
+ const occ = this._passOcc.get(key) ?? 0;
80
+ this._passOcc.set(key, occ + 1);
81
+ const slot = this._map.get(key)?.[occ] ?? null;
82
+ if (slot && (slot.item === item || (reconcile && slot.registry))) {
83
+ this._touched.add(slot);
84
+ return { slot, occ };
85
+ }
86
+ return { slot: null, occ };
87
+ }
88
+ /**
89
+ * Lưu slot mới tại (key, occ) — ghi đè slot cũ nếu ref đã đổi.
90
+ * Slot bị ghi đè KHÔNG còn nằm trong `_map` nên prunePass duyệt `_map` sẽ
91
+ * không thấy nó nữa → phải chuyển sang `_evicted` để vẫn được destroy.
92
+ */
93
+ store(key, occ, item, elements, registry) {
94
+ const slot = { item, elements, registry };
95
+ let slots = this._map.get(key);
96
+ if (!slots) {
97
+ slots = [];
98
+ this._map.set(key, slots);
99
+ }
100
+ const evicted = slots[occ];
101
+ if (evicted && !this._touched.has(evicted)) {
102
+ this._evicted.push(evicted);
103
+ }
104
+ slots[occ] = slot;
105
+ this._touched.add(slot);
106
+ return slot;
107
+ }
108
+ /**
109
+ * Kết thúc pass: mọi slot không được touch = item đã rời list (hoặc bị
110
+ * thay bằng ref mới) → gọi onRemove(slot) để destroy elements, gỡ khỏi cache.
111
+ */
112
+ prunePass(onRemove) {
113
+ // Slot bị ghi đè: đã rời `_map` lúc store() nên chỉ cần destroy.
114
+ for (const slot of this._evicted)
115
+ onRemove(slot);
116
+ this._evicted = [];
117
+ for (const [key, slots] of this._map) {
118
+ let hasRemoval = false;
119
+ for (const slot of slots) {
120
+ if (slot && !this._touched.has(slot)) {
121
+ onRemove(slot);
122
+ hasRemoval = true;
123
+ }
124
+ }
125
+ if (hasRemoval) {
126
+ const kept = slots.filter(s => s && this._touched.has(s));
127
+ if (kept.length) {
128
+ this._map.set(key, kept);
129
+ }
130
+ else {
131
+ this._map.delete(key);
132
+ }
133
+ }
134
+ }
135
+ }
136
+ /**
137
+ * Xoá toàn bộ cache — dùng khi Reactive bị destroy.
138
+ * KHÔNG tự gọi destroy() trên elements — caller phải làm trước.
139
+ */
140
+ clear() {
141
+ this.nextIdentity = 0;
142
+ this.refreshedElements.clear();
143
+ this._map.clear();
144
+ this._passOcc = new Map();
145
+ this._touched = new Set();
146
+ this._evicted = [];
147
+ }
148
+ }
149
+ //# sourceMappingURL=ForeachSlotCache.js.map