@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,9 +1,14 @@
1
- import { Application } from "../app/Application";
1
+ import { Application } from "../app/Application.js";
2
2
  /**
3
3
  * Container instance để quản lý services
4
4
  * Tương tự Laravel's app container
5
5
  */
6
6
  const AppInstance = new Application();
7
+ // Tự đăng ký container dưới key 'App' — compiled view luôn gọi `app("App")`
8
+ // để lấy Application (App.View, App.Helper, App.Router...). Thiếu dòng này thì
9
+ // mọi view compiled ném "Cannot resolve: App". (Unit test cũ dùng `new View()`
10
+ // trực tiếp nên không lộ; chỉ lộ khi chạy view compiled thật trên trình duyệt.)
11
+ AppInstance.instance('App', AppInstance);
7
12
  /**
8
13
  * Helper function để lấy/đăng ký services
9
14
  * Cách dùng:
@@ -31,6 +36,11 @@ const appFactory = (key, value) => {
31
36
  // Không truyền gì → trả về container
32
37
  return AppInstance;
33
38
  }
39
+ // Compiler contract: mọi generated view dùng app("App"). Alias này phải
40
+ // tồn tại cả sau flush()/test teardown, không phụ thuộc singleton map.
41
+ if (key === 'App' && value === undefined) {
42
+ return AppInstance;
43
+ }
34
44
  if (value !== undefined) {
35
45
  // Truyền 2 tham số → đăng ký instance
36
46
  AppInstance.instance(key, value);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../src/core/helpers/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD;;;GAGG;AACH,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC,4EAA4E;AAC5E,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,GAAG,CAAI,GAAgB,EAAE,KAAW,EAAgC,EAAE;IAClF,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACpC,qCAAqC;QACrC,OAAO,WAAW,CAAC;IACvB,CAAC;IACD,wEAAwE;IACxE,uEAAuE;IACvE,IAAI,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,WAAW,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACtB,sCAAsC;QACtC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjC,OAAO;IACX,CAAC;IACD,iCAAiC;IACjC,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,+DAA+D;AAC/D,UAAU,CAAC,IAAI,GAAG,CAAI,IAAgB,EAAK,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrE,UAAU,CAAC,QAAQ,GAAG,CAAI,IAAgB,EAAE,KAAQ,EAAe,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACxG,UAAU,CAAC,OAAO,GAAG,CAAI,IAAgB,EAAE,YAAgB,EAAK,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AAC3G,UAAU,CAAC,QAAQ,GAAG,CAAI,IAAgB,EAAE,OAAgB,EAAe,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC9G,UAAU,CAAC,IAAI,GAAG,CAAI,IAAgB,EAAE,OAAgB,EAAe,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC1G,UAAU,CAAC,SAAS,GAAG,CAAI,IAAgB,EAAE,OAAgB,EAAe,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACpH,UAAU,CAAC,GAAG,GAAG,CAAC,IAAgB,EAAW,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACtE,UAAU,CAAC,KAAK,GAAG,GAAS,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACxD,UAAU,CAAC,OAAO,GAAG,GAAS,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,GAAG,GAAG,UAAwB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Transition enter/leave cho element — `@transition('fade')`.
3
+ *
4
+ * # Quy ước class (giống Vue, để người dùng không phải học lại)
5
+ * enter: `{n}-enter-from` `{n}-enter-active` → frame sau → `{n}-enter-to`
6
+ * leave: `{n}-leave-from` `{n}-leave-active` → frame sau → `{n}-leave-to`
7
+ * `-active` có mặt suốt quá trình (chỗ đặt `transition:`), `-from`/`-to` là
8
+ * hai đầu giá trị.
9
+ *
10
+ * # Vì sao dùng `getAnimations()` chứ không nghe `transitionend`
11
+ * `transitionend` bắn MỘT lần cho MỖI property, không bắn nếu giá trị không
12
+ * đổi, và không phân biệt transition của element với của con nó — nên cách
13
+ * làm kinh điển phải parse `transition-duration` + hẹn giờ dự phòng.
14
+ * `element.getAnimations()` trả thẳng mọi animation/transition đang chạy trên
15
+ * element kèm promise `.finished`, xử lý đúng cả trường hợp nhiều property và
16
+ * bị huỷ giữa chừng. Không có animation nào → resolve ngay → hành vi y hệt
17
+ * lúc chưa có transition (đây cũng là đường chạy trong jsdom).
18
+ *
19
+ * # Vì sao cần `isLeaving()`
20
+ * Element rời đi phải NẰM LẠI DOM tới khi animation xong, trong khi
21
+ * `Reactive.clearContent()`/`_cleanOrphanNodes()` quét sạch mọi node giữa cặp
22
+ * marker. Hai vòng quét đó phải bỏ qua node đang leave, nếu không node bị giật
23
+ * đi ngay và animation không bao giờ thấy được.
24
+ */
25
+ /** True khi node đang chạy leave và chưa được gỡ. */
26
+ export declare function isLeaving(node: Node): boolean;
27
+ /** Chạy enter. Bị enter/leave khác chen ngang → thoát, không đụng DOM nữa. */
28
+ export declare function runEnter(el: Element, name: string): Promise<void>;
29
+ /**
30
+ * Chạy leave rồi GỠ node. Trả promise resolve sau khi node đã rời DOM.
31
+ * Element được đánh dấu leaving ngay lập tức để không ai giật mất giữa chừng.
32
+ */
33
+ export declare function runLeave(el: Element, name: string): Promise<void>;
34
+ //# sourceMappingURL=transition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transition.d.ts","sourceRoot":"","sources":["../../../../src/core/helpers/transition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAQH,qDAAqD;AACrD,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAE7C;AAgDD,8EAA8E;AAC9E,wBAAsB,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvE;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBvE"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Transition enter/leave cho element — `@transition('fade')`.
3
+ *
4
+ * # Quy ước class (giống Vue, để người dùng không phải học lại)
5
+ * enter: `{n}-enter-from` `{n}-enter-active` → frame sau → `{n}-enter-to`
6
+ * leave: `{n}-leave-from` `{n}-leave-active` → frame sau → `{n}-leave-to`
7
+ * `-active` có mặt suốt quá trình (chỗ đặt `transition:`), `-from`/`-to` là
8
+ * hai đầu giá trị.
9
+ *
10
+ * # Vì sao dùng `getAnimations()` chứ không nghe `transitionend`
11
+ * `transitionend` bắn MỘT lần cho MỖI property, không bắn nếu giá trị không
12
+ * đổi, và không phân biệt transition của element với của con nó — nên cách
13
+ * làm kinh điển phải parse `transition-duration` + hẹn giờ dự phòng.
14
+ * `element.getAnimations()` trả thẳng mọi animation/transition đang chạy trên
15
+ * element kèm promise `.finished`, xử lý đúng cả trường hợp nhiều property và
16
+ * bị huỷ giữa chừng. Không có animation nào → resolve ngay → hành vi y hệt
17
+ * lúc chưa có transition (đây cũng là đường chạy trong jsdom).
18
+ *
19
+ * # Vì sao cần `isLeaving()`
20
+ * Element rời đi phải NẰM LẠI DOM tới khi animation xong, trong khi
21
+ * `Reactive.clearContent()`/`_cleanOrphanNodes()` quét sạch mọi node giữa cặp
22
+ * marker. Hai vòng quét đó phải bỏ qua node đang leave, nếu không node bị giật
23
+ * đi ngay và animation không bao giờ thấy được.
24
+ */
25
+ /** Node đang chạy leave — vòng quét DOM giữa marker phải BỎ QUA. */
26
+ const leavingNodes = new WeakSet();
27
+ /** Sequence hiện tại của mỗi element — chống enter/leave chồng nhau (reorder). */
28
+ const generation = new WeakMap();
29
+ /** True khi node đang chạy leave và chưa được gỡ. */
30
+ export function isLeaving(node) {
31
+ return leavingNodes.has(node);
32
+ }
33
+ function bump(el) {
34
+ const next = (generation.get(el) ?? 0) + 1;
35
+ generation.set(el, next);
36
+ return next;
37
+ }
38
+ const isCurrent = (el, token) => generation.get(el) === token;
39
+ /** Đợi sang frame kế — để trình duyệt kịp áp `-from` trước khi đổi sang `-to`. */
40
+ function nextFrame() {
41
+ return new Promise(resolve => {
42
+ if (typeof requestAnimationFrame !== 'function')
43
+ return resolve();
44
+ requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
45
+ });
46
+ }
47
+ /**
48
+ * Đợi mọi animation/transition trên element kết thúc.
49
+ * `allSettled` vì `.finished` REJECT khi animation bị huỷ — với ta thì huỷ
50
+ * cũng là xong, không phải lỗi.
51
+ *
52
+ * ponytail: animation vô hạn (`animation-iteration-count: infinite`) trên
53
+ * element đang leave sẽ giữ node lại mãi. Thêm timeout trần nếu gặp thật.
54
+ */
55
+ async function whenAnimationsDone(el) {
56
+ const getAnimations = el.getAnimations;
57
+ if (typeof getAnimations !== 'function')
58
+ return; // jsdom / browser cũ
59
+ const running = getAnimations.call(el);
60
+ if (!running || running.length === 0)
61
+ return;
62
+ await Promise.allSettled(running.map(a => a.finished));
63
+ }
64
+ const classesOf = (name, phase) => ({
65
+ from: `${name}-${phase}-from`,
66
+ active: `${name}-${phase}-active`,
67
+ to: `${name}-${phase}-to`,
68
+ });
69
+ /** Gỡ mọi class transition của cả 2 phase — dùng khi bị huỷ giữa chừng. */
70
+ function clearClasses(el, name) {
71
+ for (const phase of ['enter', 'leave']) {
72
+ const c = classesOf(name, phase);
73
+ el.classList.remove(c.from, c.active, c.to);
74
+ }
75
+ }
76
+ /** Chạy enter. Bị enter/leave khác chen ngang → thoát, không đụng DOM nữa. */
77
+ export async function runEnter(el, name) {
78
+ const token = bump(el);
79
+ const c = classesOf(name, 'enter');
80
+ clearClasses(el, name);
81
+ el.classList.add(c.from, c.active);
82
+ await nextFrame();
83
+ if (!isCurrent(el, token))
84
+ return;
85
+ el.classList.remove(c.from);
86
+ el.classList.add(c.to);
87
+ await whenAnimationsDone(el);
88
+ if (!isCurrent(el, token))
89
+ return;
90
+ el.classList.remove(c.active, c.to);
91
+ }
92
+ /**
93
+ * Chạy leave rồi GỠ node. Trả promise resolve sau khi node đã rời DOM.
94
+ * Element được đánh dấu leaving ngay lập tức để không ai giật mất giữa chừng.
95
+ */
96
+ export async function runLeave(el, name) {
97
+ const token = bump(el);
98
+ const c = classesOf(name, 'leave');
99
+ leavingNodes.add(el);
100
+ clearClasses(el, name);
101
+ el.classList.add(c.from, c.active);
102
+ await nextFrame();
103
+ if (!isCurrent(el, token)) {
104
+ leavingNodes.delete(el);
105
+ return;
106
+ }
107
+ el.classList.remove(c.from);
108
+ el.classList.add(c.to);
109
+ await whenAnimationsDone(el);
110
+ if (!isCurrent(el, token)) {
111
+ leavingNodes.delete(el);
112
+ return;
113
+ }
114
+ leavingNodes.delete(el);
115
+ el.classList.remove(c.active, c.to);
116
+ el.remove();
117
+ }
118
+ //# sourceMappingURL=transition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transition.js","sourceRoot":"","sources":["../../../../src/core/helpers/transition.ts"],"names":[],"mappings":"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"}
@@ -16,11 +16,11 @@ export declare function isHTMLElement(value: any): boolean;
16
16
  export declare function isNode(value: any): boolean;
17
17
  export declare function isCommentNode(value: any): boolean;
18
18
  export declare function isTextNode(value: any): boolean;
19
- export declare function isOneElement(value: any): boolean;
19
+ export declare function isSaoElement(value: any): boolean;
20
20
  export declare function isOneHtml(value: any): boolean;
21
21
  export declare function isOneText(value: any): boolean;
22
22
  export declare function isOneNativeElement(value: any): boolean;
23
23
  export declare function isOneReactive(value: any): boolean;
24
- export declare function isOneFragment(value: any): boolean;
24
+ export declare function isSaoFragment(value: any): boolean;
25
25
  export declare function isOneBlock(value: any): boolean;
26
26
  //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/core/helpers/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAMxD;AAUD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AACD,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAM3C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE5C;AACD,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AACD,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAE3D;AACD,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAEjE;AACD,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE3C;AACD,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE3C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE5C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE5C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE7C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE9C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE7C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAEjD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE1C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAEjD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE9C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAEhD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE7C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE7C;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAEtD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAEjD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAEjD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE9C"}
@@ -72,8 +72,8 @@ export function isCommentNode(value) {
72
72
  export function isTextNode(value) {
73
73
  return value instanceof Text;
74
74
  }
75
- export function isOneElement(value) {
76
- return value && typeof value === 'object' && 'isOneElement' in value && value.isOneElement === true;
75
+ export function isSaoElement(value) {
76
+ return value && typeof value === 'object' && 'isSaoElement' in value && value.isSaoElement === true;
77
77
  }
78
78
  export function isOneHtml(value) {
79
79
  return value && typeof value === 'object' && 'isOneHtml' in value && value.isOneHtml === true;
@@ -87,8 +87,8 @@ export function isOneNativeElement(value) {
87
87
  export function isOneReactive(value) {
88
88
  return value && typeof value === 'object' && 'isOneReactive' in value && value.isOneReactive === true;
89
89
  }
90
- export function isOneFragment(value) {
91
- return value && typeof value === 'object' && 'isOneFragment' in value && value.isOneFragment === true;
90
+ export function isSaoFragment(value) {
91
+ return value && typeof value === 'object' && 'isSaoFragment' in value && value.isSaoFragment === true;
92
92
  }
93
93
  export function isOneBlock(value) {
94
94
  return value && typeof value === 'object' && 'isOneBlock' in value && value.isOneBlock === true;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/core/helpers/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { HtmlInterface, SaoNodeInterface, SaoElementChildren, DOMElement, WrapperInterface, SaoChildrenFactoryOutput } from "../contracts/ElementInterface.js";
2
+ import type { ViewControllerInterface } from "../contracts/ViewControllerInterface.js";
3
+ /** Commit initial data; hydration discards pending notifications before subscribe. */
4
+ export declare function commitView(ctrl: ViewControllerInterface, discardPending?: boolean): void;
5
+ /** Flush state + reactive queues after a lifecycle transition. */
6
+ export declare function flushView(ctrl: ViewControllerInterface): void;
7
+ /** Start a view through its controller, then make the initial DOM snapshot current. */
8
+ export declare function activateView(ctrl: ViewControllerInterface): void;
9
+ /**
10
+ * Claim an already-rendered Wrapper tree without inserting or clearing DOM.
11
+ * Used by both route hydration and nested @include hydration.
12
+ */
13
+ export declare function claimHydratedView(ctrl: ViewControllerInterface, root: HtmlInterface, wrapper?: WrapperInterface | null): void;
14
+ /**
15
+ * Mount danh sách children vào TRƯỚC một anchor node (RUNTIME_CONTRACT.md §2 —
16
+ * insertion point tường minh). Dùng cho Component (@include), và mọi chỗ cần
17
+ * mount content vào giữa cặp markers có sẵn.
18
+ */
19
+ export declare function mountChildrenBeforeAnchor(anchor: Node, children: SaoChildrenFactoryOutput | SaoElementChildren, parentForSao: HtmlInterface | null): void;
20
+ /**
21
+ * Hydrate mode: gọi render() đệ quy trên children để tạo JS objects
22
+ * và claim DOM nodes, nhưng KHÔNG appendChild/insertBefore vào DOM
23
+ * (vì DOM đã có từ server-rendered HTML).
24
+ *
25
+ * Khác mountElementList ở chỗ: bỏ mọi thao tác DOM mutation,
26
+ * chỉ giữ lại phần tạo element tree + gán parent.
27
+ */
28
+ export declare function hydrateElementList(root: HtmlInterface, elements: SaoElementChildren): void;
29
+ /**
30
+ * Mounts a list of SaoNodeInterface elements into a given root HtmlInterface.
31
+ * This function is responsible for appending the DOM nodes of each element
32
+ * to the root's DOM element and returning the list of mounted DOM nodes.
33
+ * @param root - The HtmlInterface to mount the elements into.
34
+ * @param elements - An array of SaoNodeInterface elements to be mounted.
35
+ * @returns An array of the mounted DOM nodes.
36
+ */
37
+ export declare function mountElementList(root: HtmlInterface, elements: SaoNodeInterface[] | DOMElement[] | SaoElementChildren): Element[];
38
+ export declare function mountElementListBefore(root: HtmlInterface, elements: SaoNodeInterface[] | DOMElement[] | SaoElementChildren): Element[];
39
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../../src/core/helpers/view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAc,UAAU,EAAE,gBAAgB,EAAiB,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC/L,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAEvF,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,IAAI,EAAE,uBAAuB,EAAE,cAAc,GAAE,OAAe,GAAG,IAAI,CAG/F;AAED,kEAAkE;AAClE,wBAAgB,SAAS,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAG7D;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAGhE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,uBAAuB,EAC7B,IAAI,EAAE,aAAa,EACnB,OAAO,GAAE,gBAAgB,GAAG,IAAuB,GACpD,IAAI,CAMN;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACrC,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,wBAAwB,GAAG,kBAAkB,EACvD,YAAY,EAAE,aAAa,GAAG,IAAI,GACnC,IAAI,CAwBN;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAsC1F;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,UAAU,EAAE,GAAG,kBAAkB,GAAG,OAAO,EAAE,CA4EjI;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,UAAU,EAAE,GAAG,kBAAkB,GAAG,OAAO,EAAE,CA4EvI"}
@@ -0,0 +1,286 @@
1
+ /** Commit initial data; hydration discards pending notifications before subscribe. */
2
+ export function commitView(ctrl, discardPending = false) {
3
+ ctrl.commitData();
4
+ if (discardPending)
5
+ ctrl.states.__.flushNow();
6
+ }
7
+ /** Flush state + reactive queues after a lifecycle transition. */
8
+ export function flushView(ctrl) {
9
+ ctrl.states.__.flushNow();
10
+ ctrl.flushReactiveUpdatesNow();
11
+ }
12
+ /** Start a view through its controller, then make the initial DOM snapshot current. */
13
+ export function activateView(ctrl) {
14
+ ctrl.start();
15
+ flushView(ctrl);
16
+ }
17
+ /**
18
+ * Claim an already-rendered Wrapper tree without inserting or clearing DOM.
19
+ * Used by both route hydration and nested @include hydration.
20
+ */
21
+ export function claimHydratedView(ctrl, root, wrapper = ctrl.mainElement) {
22
+ ctrl.setParentElement(root);
23
+ if (!wrapper)
24
+ return;
25
+ wrapper.setParentElement(root);
26
+ const children = wrapper.render();
27
+ if (children && children.length > 0)
28
+ hydrateElementList(root, children);
29
+ }
30
+ /**
31
+ * Mount danh sách children vào TRƯỚC một anchor node (RUNTIME_CONTRACT.md §2 —
32
+ * insertion point tường minh). Dùng cho Component (@include), và mọi chỗ cần
33
+ * mount content vào giữa cặp markers có sẵn.
34
+ */
35
+ export function mountChildrenBeforeAnchor(anchor, children, parentForSao) {
36
+ const container = anchor.parentNode;
37
+ if (!container || !Array.isArray(children))
38
+ return;
39
+ const insert = (node) => container.insertBefore(node, anchor);
40
+ for (const child of children) {
41
+ if (child === null || child === undefined)
42
+ continue;
43
+ if (typeof child === 'string' || typeof child === 'number') {
44
+ insert(document.createTextNode(String(child)));
45
+ }
46
+ else if (child instanceof Node) {
47
+ insert(child);
48
+ }
49
+ else if (typeof child === 'object') {
50
+ if ('element' in child && child.element) {
51
+ insert(child.element);
52
+ child.render?.();
53
+ }
54
+ else if ('openTag' in child) {
55
+ if ('parent' in child)
56
+ child.parent = parentForSao;
57
+ if ('parentElement' in child)
58
+ child.parentElement = parentForSao;
59
+ insert(child.openTag);
60
+ insert(child.closeTag);
61
+ child.render?.();
62
+ }
63
+ }
64
+ }
65
+ }
66
+ /**
67
+ * Hydrate mode: gọi render() đệ quy trên children để tạo JS objects
68
+ * và claim DOM nodes, nhưng KHÔNG appendChild/insertBefore vào DOM
69
+ * (vì DOM đã có từ server-rendered HTML).
70
+ *
71
+ * Khác mountElementList ở chỗ: bỏ mọi thao tác DOM mutation,
72
+ * chỉ giữ lại phần tạo element tree + gán parent.
73
+ */
74
+ export function hydrateElementList(root, elements) {
75
+ if (!Array.isArray(elements))
76
+ return;
77
+ for (const element of elements) {
78
+ if (element === null || element === undefined)
79
+ continue;
80
+ if (typeof element === 'string' || typeof element === 'number')
81
+ continue;
82
+ if (element instanceof Node)
83
+ continue;
84
+ if (typeof element === 'object' && 'saoType' in element) {
85
+ const saoEl = element;
86
+ switch (saoEl.saoType) {
87
+ case 'Html': {
88
+ const html = saoEl;
89
+ html.render();
90
+ break;
91
+ }
92
+ case 'TextElement':
93
+ break;
94
+ case 'Output':
95
+ case 'Reactive':
96
+ case 'Fragment':
97
+ case 'BlockOutlet':
98
+ case 'Block':
99
+ case 'Component':
100
+ case 'Yield': {
101
+ const saoNode = saoEl;
102
+ if (typeof saoNode.setParentElement === 'function') {
103
+ saoNode.setParentElement(root);
104
+ }
105
+ else {
106
+ if ('parent' in saoNode)
107
+ saoNode.parent = root;
108
+ if ('parentElement' in saoNode)
109
+ saoNode.parentElement = root;
110
+ }
111
+ saoNode.render();
112
+ break;
113
+ }
114
+ }
115
+ }
116
+ }
117
+ }
118
+ /**
119
+ * Mounts a list of SaoNodeInterface elements into a given root HtmlInterface.
120
+ * This function is responsible for appending the DOM nodes of each element
121
+ * to the root's DOM element and returning the list of mounted DOM nodes.
122
+ * @param root - The HtmlInterface to mount the elements into.
123
+ * @param elements - An array of SaoNodeInterface elements to be mounted.
124
+ * @returns An array of the mounted DOM nodes.
125
+ */
126
+ export function mountElementList(root, elements) {
127
+ const mountedNodes = [];
128
+ if (Array.isArray(elements)) {
129
+ const rootElement = root.getElement();
130
+ elements.forEach((element) => {
131
+ if (typeof element === 'string' || typeof element === 'number') {
132
+ const el = document.createTextNode(element.toString());
133
+ rootElement.appendChild(el);
134
+ mountedNodes.push(el);
135
+ }
136
+ else if (element instanceof Node) {
137
+ // FIX(baseline#2): raw DOM node — append trực tiếp, trước đây bị drop
138
+ rootElement.appendChild(element);
139
+ mountedNodes.push(element);
140
+ }
141
+ else if (typeof element === 'object' && element !== null && 'saoType' in element) {
142
+ const saoEl = element;
143
+ switch (saoEl.saoType) {
144
+ case 'Wrapper':
145
+ const wrapper = saoEl;
146
+ wrapper.appendTo(root);
147
+ mountedNodes.push(wrapper.openTag);
148
+ wrapper.domChildren.forEach((node) => {
149
+ mountedNodes.push(node);
150
+ });
151
+ mountedNodes.push(wrapper.closeTag);
152
+ break;
153
+ case 'Html':
154
+ const html = saoEl;
155
+ const htmlNode = html.render();
156
+ rootElement.appendChild(htmlNode);
157
+ mountedNodes.push(htmlNode);
158
+ break;
159
+ case 'TextElement':
160
+ const textElement = saoEl;
161
+ const textNode = textElement.render();
162
+ rootElement.appendChild(textNode);
163
+ mountedNodes.push(textNode);
164
+ break;
165
+ case 'Reactive':
166
+ case 'Output':
167
+ case 'Fragment':
168
+ case 'BlockOutlet':
169
+ case 'Block':
170
+ case 'Component':
171
+ case 'Yield':
172
+ const saoNode = saoEl;
173
+ if (typeof saoNode.setParentElement === 'function') {
174
+ saoNode.setParentElement(root);
175
+ }
176
+ else {
177
+ if ('parent' in saoNode) {
178
+ saoNode.parent = root;
179
+ }
180
+ if ('parentElement' in saoNode) {
181
+ saoNode.parentElement = root;
182
+ }
183
+ }
184
+ saoNode.render();
185
+ if (saoNode.openTag) {
186
+ mountedNodes.push(saoNode.openTag);
187
+ }
188
+ if (saoEl.saoType === 'Fragment' && Array.isArray(saoNode.nodes)) {
189
+ saoNode.nodes.forEach((node) => {
190
+ mountedNodes.push(node);
191
+ });
192
+ }
193
+ if (saoNode.closeTag) {
194
+ mountedNodes.push(saoNode.closeTag);
195
+ }
196
+ break;
197
+ default:
198
+ //
199
+ break;
200
+ }
201
+ }
202
+ });
203
+ }
204
+ return mountedNodes;
205
+ }
206
+ export function mountElementListBefore(root, elements) {
207
+ const mountedNodes = [];
208
+ if (Array.isArray(elements)) {
209
+ const rootElement = root.getElement();
210
+ elements.forEach((element) => {
211
+ if (typeof element === 'string' || typeof element === 'number') {
212
+ const el = document.createTextNode(element.toString());
213
+ rootElement.appendChild(el);
214
+ mountedNodes.push(el);
215
+ }
216
+ else if (element instanceof Node) {
217
+ // FIX(baseline#2): raw DOM node — append trực tiếp, trước đây bị drop
218
+ rootElement.appendChild(element);
219
+ mountedNodes.push(element);
220
+ }
221
+ else if (typeof element === 'object' && element !== null && 'saoType' in element) {
222
+ const saoEl = element;
223
+ switch (saoEl.saoType) {
224
+ case 'Wrapper':
225
+ const wrapper = saoEl;
226
+ wrapper.appendTo(root);
227
+ mountedNodes.push(wrapper.openTag);
228
+ wrapper.domChildren.forEach((node) => {
229
+ mountedNodes.push(node);
230
+ });
231
+ mountedNodes.push(wrapper.closeTag);
232
+ break;
233
+ case 'Html':
234
+ const html = saoEl;
235
+ const htmlNode = html.render();
236
+ rootElement.appendChild(htmlNode);
237
+ mountedNodes.push(htmlNode);
238
+ break;
239
+ case 'TextElement':
240
+ const textElement = saoEl;
241
+ const textNode = textElement.render();
242
+ rootElement.appendChild(textNode);
243
+ mountedNodes.push(textNode);
244
+ break;
245
+ case 'Reactive':
246
+ case 'Output':
247
+ case 'Fragment':
248
+ case 'BlockOutlet':
249
+ case 'Block':
250
+ case 'Component':
251
+ case 'Yield':
252
+ const saoNode = saoEl;
253
+ if (typeof saoNode.setParentElement === 'function') {
254
+ saoNode.setParentElement(root);
255
+ }
256
+ else {
257
+ if ('parent' in saoNode) {
258
+ saoNode.parent = root;
259
+ }
260
+ if ('parentElement' in saoNode) {
261
+ saoNode.parentElement = root;
262
+ }
263
+ }
264
+ saoNode.render();
265
+ if (saoNode.openTag) {
266
+ mountedNodes.push(saoNode.openTag);
267
+ }
268
+ if (saoEl.saoType === 'Fragment' && Array.isArray(saoNode.nodes)) {
269
+ saoNode.nodes.forEach((node) => {
270
+ mountedNodes.push(node);
271
+ });
272
+ }
273
+ if (saoNode.closeTag) {
274
+ mountedNodes.push(saoNode.closeTag);
275
+ }
276
+ break;
277
+ default:
278
+ //
279
+ break;
280
+ }
281
+ }
282
+ });
283
+ }
284
+ return mountedNodes;
285
+ }
286
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../../../src/core/helpers/view.ts"],"names":[],"mappings":"AAGA,sFAAsF;AACtF,MAAM,UAAU,UAAU,CAAC,IAA6B,EAAE,iBAA0B,KAAK;IACrF,IAAI,CAAC,UAAU,EAAE,CAAC;IAClB,IAAI,cAAc;QAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,SAAS,CAAC,IAA6B;IACnD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC1B,IAAI,CAAC,uBAAuB,EAAE,CAAC;AACnC,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,YAAY,CAAC,IAA6B;IACtD,IAAI,CAAC,KAAK,EAAE,CAAC;IACb,SAAS,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC7B,IAA6B,EAC7B,IAAmB,EACnB,UAAmC,IAAI,CAAC,WAAW;IAEnD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAClC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC5E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACrC,MAAY,EACZ,QAAuD,EACvD,YAAkC;IAElC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;IACpC,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO;IACnD,MAAM,MAAM,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAEpE,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACzD,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,IAAI,SAAS,IAAI,KAAK,IAAK,KAAa,CAAC,OAAO,EAAE,CAAC;gBAC/C,MAAM,CAAE,KAAa,CAAC,OAAO,CAAC,CAAC;gBAC9B,KAAa,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9B,CAAC;iBAAM,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;gBAC5B,IAAI,QAAQ,IAAI,KAAK;oBAAG,KAAa,CAAC,MAAM,GAAG,YAAY,CAAC;gBAC5D,IAAI,eAAe,IAAI,KAAK;oBAAG,KAAa,CAAC,aAAa,GAAG,YAAY,CAAC;gBAC1E,MAAM,CAAE,KAAa,CAAC,OAAO,CAAC,CAAC;gBAC/B,MAAM,CAAE,KAAa,CAAC,QAAQ,CAAC,CAAC;gBAC/B,KAAa,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9B,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAmB,EAAE,QAA4B;IAChF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO;IAErC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS;YAAE,SAAS;QACxD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,SAAS;QACzE,IAAI,OAAO,YAAY,IAAI;YAAE,SAAS;QAEtC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;YACtD,MAAM,KAAK,GAAG,OAAqB,CAAC;YACpC,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC;gBACpB,KAAK,MAAM,CAAC,CAAC,CAAC;oBACV,MAAM,IAAI,GAAG,KAAsB,CAAC;oBACpC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACd,MAAM;gBACV,CAAC;gBACD,KAAK,aAAa;oBACd,MAAM;gBACV,KAAK,QAAQ,CAAC;gBACd,KAAK,UAAU,CAAC;gBAChB,KAAK,UAAU,CAAC;gBAChB,KAAK,aAAa,CAAC;gBACnB,KAAK,OAAO,CAAC;gBACb,KAAK,WAAW,CAAC;gBACjB,KAAK,OAAO,CAAC,CAAC,CAAC;oBACX,MAAM,OAAO,GAAG,KAAY,CAAC;oBAC7B,IAAI,OAAO,OAAO,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;wBACjD,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;oBACnC,CAAC;yBAAM,CAAC;wBACJ,IAAI,QAAQ,IAAI,OAAO;4BAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;wBAC/C,IAAI,eAAe,IAAI,OAAO;4BAAE,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;oBACjE,CAAC;oBACD,OAAO,CAAC,MAAM,EAAE,CAAC;oBACjB,MAAM;gBACV,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAmB,EAAE,QAAgE;IAClH,MAAM,YAAY,GAA2C,EAAE,CAAC;IAChE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACtC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAwD,EAAE,EAAE;YAC1E,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC7D,MAAM,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACvD,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBAC5B,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;iBAAM,IAAI,OAAO,YAAY,IAAI,EAAE,CAAC;gBACjC,sEAAsE;gBACtE,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBACjC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;iBAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;gBACjF,MAAM,KAAK,GAAG,OAAqB,CAAC;gBACpC,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC;oBACpB,KAAK,SAAS;wBACV,MAAM,OAAO,GAAG,KAAyB,CAAC;wBAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBACvB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBACnC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAU,EAAE,EAAE;4BACvC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC5B,CAAC,CAAC,CAAC;wBACH,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;wBACpC,MAAM;oBACV,KAAK,MAAM;wBACP,MAAM,IAAI,GAAG,KAAsB,CAAC;wBACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;wBAC/B,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;wBAClC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAC5B,MAAM;oBACV,KAAK,aAAa;wBACd,MAAM,WAAW,GAAG,KAAsB,CAAC;wBAC3C,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;wBACtC,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;wBAClC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAC5B,MAAM;oBACV,KAAK,UAAU,CAAC;oBAChB,KAAK,QAAQ,CAAC;oBACd,KAAK,UAAU,CAAC;oBAChB,KAAK,aAAa,CAAC;oBACnB,KAAK,OAAO,CAAC;oBACb,KAAK,WAAW,CAAC;oBACjB,KAAK,OAAO;wBACR,MAAM,OAAO,GAAG,KAAY,CAAC;wBAC7B,IAAI,OAAO,OAAO,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;4BACjD,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;wBACnC,CAAC;6BAAM,CAAC;4BACJ,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;gCACtB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;4BAC1B,CAAC;4BACD,IAAI,eAAe,IAAI,OAAO,EAAE,CAAC;gCAC7B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;4BACjC,CAAC;wBACL,CAAC;wBACD,OAAO,CAAC,MAAM,EAAE,CAAC;wBACjB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;4BAClB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBACvC,CAAC;wBACD,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC/D,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAU,EAAE,EAAE;gCACjC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BAC5B,CAAC,CAAC,CAAC;wBACP,CAAC;wBACD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;4BACnB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;wBACxC,CAAC;wBACD,MAAM;oBACV;wBACI,EAAE;wBACF,MAAM;gBACd,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IACD,OAAO,YAAmB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAmB,EAAE,QAAgE;IACxH,MAAM,YAAY,GAA2C,EAAE,CAAC;IAChE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACtC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAwD,EAAE,EAAE;YAC1E,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC7D,MAAM,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACvD,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBAC5B,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;iBAAM,IAAI,OAAO,YAAY,IAAI,EAAE,CAAC;gBACjC,sEAAsE;gBACtE,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBACjC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;iBAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;gBACjF,MAAM,KAAK,GAAG,OAAqB,CAAC;gBACpC,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC;oBACpB,KAAK,SAAS;wBACV,MAAM,OAAO,GAAG,KAAyB,CAAC;wBAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBACvB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBACnC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAU,EAAE,EAAE;4BACvC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC5B,CAAC,CAAC,CAAC;wBACH,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;wBACpC,MAAM;oBACV,KAAK,MAAM;wBACP,MAAM,IAAI,GAAG,KAAsB,CAAC;wBACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;wBAC/B,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;wBAClC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAC5B,MAAM;oBACV,KAAK,aAAa;wBACd,MAAM,WAAW,GAAG,KAAsB,CAAC;wBAC3C,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;wBACtC,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;wBAClC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAC5B,MAAM;oBACV,KAAK,UAAU,CAAC;oBAChB,KAAK,QAAQ,CAAC;oBACd,KAAK,UAAU,CAAC;oBAChB,KAAK,aAAa,CAAC;oBACnB,KAAK,OAAO,CAAC;oBACb,KAAK,WAAW,CAAC;oBACjB,KAAK,OAAO;wBACR,MAAM,OAAO,GAAG,KAAY,CAAC;wBAC7B,IAAI,OAAO,OAAO,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;4BACjD,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;wBACnC,CAAC;6BAAM,CAAC;4BACJ,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;gCACtB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;4BAC1B,CAAC;4BACD,IAAI,eAAe,IAAI,OAAO,EAAE,CAAC;gCAC7B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;4BACjC,CAAC;wBACL,CAAC;wBACD,OAAO,CAAC,MAAM,EAAE,CAAC;wBACjB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;4BAClB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBACvC,CAAC;wBACD,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC/D,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAU,EAAE,EAAE;gCACjC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BAC5B,CAAC,CAAC,CAAC;wBACP,CAAC;wBACD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;4BACnB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;wBACxC,CAAC;wBACD,MAAM;oBACV;wBACI,EAAE;wBACF,MAAM;gBACd,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IACD,OAAO,YAAmB,CAAC;AAC/B,CAAC"}