@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.
- package/README.md +52 -195
- package/dist/index.d.ts +20 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/plugins.d.ts +2 -2
- package/dist/plugins.js +2 -2
- package/dist/src/core/app/Application.d.ts +25 -15
- package/dist/src/core/app/Application.d.ts.map +1 -1
- package/dist/src/core/app/Application.js +55 -18
- package/dist/src/core/app/Application.js.map +1 -1
- package/dist/src/core/bootstrap/app.d.ts +1 -1
- package/dist/src/core/bootstrap/app.d.ts.map +1 -1
- package/dist/src/core/bootstrap/app.js +77 -4
- package/dist/src/core/bootstrap/app.js.map +1 -1
- package/dist/src/core/bootstrap/bundle.d.ts +41 -0
- package/dist/src/core/bootstrap/bundle.d.ts.map +1 -0
- package/dist/src/core/bootstrap/bundle.js +98 -0
- package/dist/src/core/bootstrap/bundle.js.map +1 -0
- package/dist/src/core/bootstrap/providers/ApiServiceProvider.d.ts +1 -1
- package/dist/src/core/bootstrap/providers/ApiServiceProvider.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/ApiServiceProvider.js +3 -3
- package/dist/src/core/bootstrap/providers/ApiServiceProvider.js.map +1 -1
- package/dist/src/core/bootstrap/providers/CoreServiceProvider.d.ts +1 -1
- package/dist/src/core/bootstrap/providers/CoreServiceProvider.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/CoreServiceProvider.js +11 -8
- package/dist/src/core/bootstrap/providers/CoreServiceProvider.js.map +1 -1
- package/dist/src/core/bootstrap/providers/HelperServiceProvider.d.ts +3 -1
- package/dist/src/core/bootstrap/providers/HelperServiceProvider.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/HelperServiceProvider.js +8 -3
- package/dist/src/core/bootstrap/providers/HelperServiceProvider.js.map +1 -1
- package/dist/src/core/bootstrap/providers/RouteServiceProvider.d.ts +2 -1
- package/dist/src/core/bootstrap/providers/RouteServiceProvider.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/RouteServiceProvider.js +14 -4
- package/dist/src/core/bootstrap/providers/RouteServiceProvider.js.map +1 -1
- package/dist/src/core/bootstrap/providers/ServiceProvider.d.ts +4 -4
- package/dist/src/core/bootstrap/providers/ServiceProvider.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/ServiceProvider.js +5 -5
- package/dist/src/core/bootstrap/providers/ServiceProvider.js.map +1 -1
- package/dist/src/core/bootstrap/providers/ViewServiceProvider.d.ts +1 -1
- package/dist/src/core/bootstrap/providers/ViewServiceProvider.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/ViewServiceProvider.js +3 -3
- package/dist/src/core/bootstrap/providers/ViewServiceProvider.js.map +1 -1
- package/dist/src/core/bootstrap/providers/default-providers.d.ts +1 -1
- package/dist/src/core/bootstrap/providers/default-providers.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/default-providers.js +44 -11
- package/dist/src/core/bootstrap/providers/default-providers.js.map +1 -1
- package/dist/src/core/bootstrap/providers/index.d.ts +9 -9
- package/dist/src/core/bootstrap/providers/index.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/index.js +8 -8
- package/dist/src/core/bootstrap/providers/index.js.map +1 -1
- package/dist/src/core/bootstrap/providers/provider-order.d.ts +1 -1
- package/dist/src/core/bootstrap/providers/provider-order.d.ts.map +1 -1
- package/dist/src/core/bootstrap/ssr.d.ts +47 -0
- package/dist/src/core/bootstrap/ssr.d.ts.map +1 -0
- package/dist/src/core/bootstrap/ssr.js +129 -0
- package/dist/src/core/bootstrap/ssr.js.map +1 -0
- package/dist/src/core/cache/ViewCache.d.ts +1 -1
- package/dist/src/core/cache/ViewCache.d.ts.map +1 -1
- package/dist/src/core/cache/index.d.ts +1 -1
- package/dist/src/core/cache/index.d.ts.map +1 -1
- package/dist/src/core/cache/index.js +1 -1
- package/dist/src/core/cache/index.js.map +1 -1
- package/dist/src/core/contracts/ApplicationInterface.d.ts +15 -11
- package/dist/src/core/contracts/ApplicationInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/BlockInterface.d.ts +10 -10
- package/dist/src/core/contracts/BlockInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/BundleInterface.d.ts +38 -0
- package/dist/src/core/contracts/BundleInterface.d.ts.map +1 -0
- package/dist/src/core/contracts/BundleInterface.js +2 -0
- package/dist/src/core/contracts/BundleInterface.js.map +1 -0
- package/dist/src/core/contracts/ComponentInterface.d.ts +7 -6
- package/dist/src/core/contracts/ComponentInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/ElementInterface.d.ts +91 -27
- package/dist/src/core/contracts/ElementInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/HeadServiceInterface.d.ts +37 -0
- package/dist/src/core/contracts/HeadServiceInterface.d.ts.map +1 -0
- package/dist/src/core/contracts/HeadServiceInterface.js +3 -0
- package/dist/src/core/contracts/HeadServiceInterface.js.map +1 -0
- package/dist/src/core/contracts/HelperInterface.d.ts +9 -1
- package/dist/src/core/contracts/HelperInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/HttpServiceInterface.d.ts +3 -0
- package/dist/src/core/contracts/HttpServiceInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/MarkerInterface.d.ts +29 -44
- package/dist/src/core/contracts/MarkerInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/ReactiveInterface.d.ts +9 -9
- package/dist/src/core/contracts/ReactiveInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/RouterInterface.d.ts +5 -2
- package/dist/src/core/contracts/RouterInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/SectionInterface.d.ts +48 -0
- package/dist/src/core/contracts/SectionInterface.d.ts.map +1 -0
- package/dist/src/core/contracts/SectionInterface.js +2 -0
- package/dist/src/core/contracts/SectionInterface.js.map +1 -0
- package/dist/src/core/contracts/ServiceProviderInterface.d.ts +3 -3
- package/dist/src/core/contracts/ServiceProviderInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/ViewControllerInterface.d.ts +116 -15
- package/dist/src/core/contracts/ViewControllerInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/ViewInterface.d.ts +31 -5
- package/dist/src/core/contracts/ViewInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/ViewManagerInterface.d.ts +47 -5
- package/dist/src/core/contracts/ViewManagerInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/ViewStateInterface.d.ts +39 -2
- package/dist/src/core/contracts/ViewStateInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/common.d.ts +3 -3
- package/dist/src/core/contracts/common.js +3 -3
- package/dist/src/core/contracts/utils.d.ts +19 -19
- package/dist/src/core/contracts/utils.d.ts.map +1 -1
- package/dist/src/core/contracts/views.d.ts +1 -22
- package/dist/src/core/contracts/views.d.ts.map +1 -1
- package/dist/src/core/devtools/hook.d.ts +66 -0
- package/dist/src/core/devtools/hook.d.ts.map +1 -0
- package/dist/src/core/devtools/hook.js +114 -0
- package/dist/src/core/devtools/hook.js.map +1 -0
- package/dist/src/core/devtools/index.d.ts +34 -0
- package/dist/src/core/devtools/index.d.ts.map +1 -0
- package/dist/src/core/devtools/index.js +33 -0
- package/dist/src/core/devtools/index.js.map +1 -0
- package/dist/src/core/devtools/inspector.d.ts +31 -0
- package/dist/src/core/devtools/inspector.d.ts.map +1 -0
- package/dist/src/core/devtools/inspector.js +249 -0
- package/dist/src/core/devtools/inspector.js.map +1 -0
- package/dist/src/core/elements/Block.d.ts +9 -7
- package/dist/src/core/elements/Block.d.ts.map +1 -1
- package/dist/src/core/elements/Block.js +33 -9
- package/dist/src/core/elements/Block.js.map +1 -1
- package/dist/src/core/elements/BlockOutlet.d.ts +19 -8
- package/dist/src/core/elements/BlockOutlet.d.ts.map +1 -1
- package/dist/src/core/elements/BlockOutlet.js +57 -13
- package/dist/src/core/elements/BlockOutlet.js.map +1 -1
- package/dist/src/core/elements/Component.d.ts +83 -11
- package/dist/src/core/elements/Component.d.ts.map +1 -1
- package/dist/src/core/elements/Component.js +334 -13
- package/dist/src/core/elements/Component.js.map +1 -1
- package/dist/src/core/elements/ForeachSlotCache.d.ts +95 -0
- package/dist/src/core/elements/ForeachSlotCache.d.ts.map +1 -0
- package/dist/src/core/elements/ForeachSlotCache.js +149 -0
- package/dist/src/core/elements/ForeachSlotCache.js.map +1 -0
- package/dist/src/core/elements/Fragment.d.ts +19 -13
- package/dist/src/core/elements/Fragment.d.ts.map +1 -1
- package/dist/src/core/elements/Fragment.js +43 -20
- package/dist/src/core/elements/Fragment.js.map +1 -1
- package/dist/src/core/elements/Html.d.ts +89 -12
- package/dist/src/core/elements/Html.d.ts.map +1 -1
- package/dist/src/core/elements/Html.js +707 -106
- package/dist/src/core/elements/Html.js.map +1 -1
- package/dist/src/core/elements/Output.d.ts +34 -10
- package/dist/src/core/elements/Output.d.ts.map +1 -1
- package/dist/src/core/elements/Output.js +141 -26
- package/dist/src/core/elements/Output.js.map +1 -1
- package/dist/src/core/elements/Reactive.d.ts +85 -14
- package/dist/src/core/elements/Reactive.d.ts.map +1 -1
- package/dist/src/core/elements/Reactive.js +315 -41
- package/dist/src/core/elements/Reactive.js.map +1 -1
- package/dist/src/core/elements/TextElement.d.ts +11 -7
- package/dist/src/core/elements/TextElement.d.ts.map +1 -1
- package/dist/src/core/elements/TextElement.js +18 -11
- package/dist/src/core/elements/TextElement.js.map +1 -1
- package/dist/src/core/elements/Wrapper.d.ts +24 -13
- package/dist/src/core/elements/Wrapper.d.ts.map +1 -1
- package/dist/src/core/elements/Wrapper.js +65 -8
- package/dist/src/core/elements/Wrapper.js.map +1 -1
- package/dist/src/core/elements/Yield.d.ts +10 -9
- package/dist/src/core/elements/Yield.d.ts.map +1 -1
- package/dist/src/core/elements/Yield.js +31 -19
- package/dist/src/core/elements/Yield.js.map +1 -1
- package/dist/src/core/elements/helpers.d.ts +7 -7
- package/dist/src/core/elements/helpers.d.ts.map +1 -1
- package/dist/src/core/elements/helpers.js +4 -4
- package/dist/src/core/elements/index.d.ts +12 -11
- package/dist/src/core/elements/index.d.ts.map +1 -1
- package/dist/src/core/elements/index.js +12 -11
- package/dist/src/core/elements/index.js.map +1 -1
- package/dist/src/core/elements/reconcileChildren.d.ts +7 -0
- package/dist/src/core/elements/reconcileChildren.d.ts.map +1 -0
- package/dist/src/core/elements/reconcileChildren.js +74 -0
- package/dist/src/core/elements/reconcileChildren.js.map +1 -0
- package/dist/src/core/helpers/ApiClient.d.ts.map +1 -0
- package/dist/src/core/{hellpers → helpers}/ApiClient.js +10 -1
- package/dist/src/core/helpers/ApiClient.js.map +1 -0
- package/dist/src/core/helpers/app.d.ts +3 -0
- package/dist/src/core/helpers/app.d.ts.map +1 -0
- package/dist/src/core/{hellpers → helpers}/app.js +11 -1
- package/dist/src/core/helpers/app.js.map +1 -0
- package/dist/src/core/helpers/transition.d.ts +34 -0
- package/dist/src/core/helpers/transition.d.ts.map +1 -0
- package/dist/src/core/helpers/transition.js +118 -0
- package/dist/src/core/helpers/transition.js.map +1 -0
- package/dist/src/core/{hellpers → helpers}/utils.d.ts +2 -2
- package/dist/src/core/helpers/utils.d.ts.map +1 -0
- package/dist/src/core/{hellpers → helpers}/utils.js +4 -4
- package/dist/src/core/helpers/utils.js.map +1 -0
- package/dist/src/core/helpers/view.d.ts +39 -0
- package/dist/src/core/helpers/view.d.ts.map +1 -0
- package/dist/src/core/helpers/view.js +286 -0
- package/dist/src/core/helpers/view.js.map +1 -0
- package/dist/src/core/routers/Router.d.ts +108 -7
- package/dist/src/core/routers/Router.d.ts.map +1 -1
- package/dist/src/core/routers/Router.js +444 -68
- package/dist/src/core/routers/Router.js.map +1 -1
- package/dist/src/core/routers/index.d.ts +2 -2
- package/dist/src/core/routers/index.d.ts.map +1 -1
- package/dist/src/core/routers/index.js +1 -1
- package/dist/src/core/routers/index.js.map +1 -1
- package/dist/src/core/services/AssetManager.d.ts +112 -0
- package/dist/src/core/services/AssetManager.d.ts.map +1 -0
- package/dist/src/core/services/AssetManager.js +361 -0
- package/dist/src/core/services/AssetManager.js.map +1 -0
- package/dist/src/core/services/BlockManager.d.ts +73 -2
- package/dist/src/core/services/BlockManager.d.ts.map +1 -1
- package/dist/src/core/services/BlockManager.js +270 -48
- package/dist/src/core/services/BlockManager.js.map +1 -1
- package/dist/src/core/services/DomService.js +3 -3
- package/dist/src/core/services/DomService.js.map +1 -1
- package/dist/src/core/services/HeadService.d.ts +24 -0
- package/dist/src/core/services/HeadService.d.ts.map +1 -0
- package/dist/src/core/services/HeadService.js +120 -0
- package/dist/src/core/services/HeadService.js.map +1 -0
- package/dist/src/core/services/HelperService.d.ts +14 -3
- package/dist/src/core/services/HelperService.d.ts.map +1 -1
- package/dist/src/core/services/HelperService.js +32 -2
- package/dist/src/core/services/HelperService.js.map +1 -1
- package/dist/src/core/services/HttpService.d.ts +8 -0
- package/dist/src/core/services/HttpService.d.ts.map +1 -1
- package/dist/src/core/services/HttpService.js +121 -47
- package/dist/src/core/services/HttpService.js.map +1 -1
- package/dist/src/core/services/MarkerRegistry.d.ts +51 -8
- package/dist/src/core/services/MarkerRegistry.d.ts.map +1 -1
- package/dist/src/core/services/MarkerRegistry.js +135 -14
- package/dist/src/core/services/MarkerRegistry.js.map +1 -1
- package/dist/src/core/services/PageCache.d.ts +101 -0
- package/dist/src/core/services/PageCache.d.ts.map +1 -0
- package/dist/src/core/services/PageCache.js +184 -0
- package/dist/src/core/services/PageCache.js.map +1 -0
- package/dist/src/core/services/SectionManager.d.ts +100 -0
- package/dist/src/core/services/SectionManager.d.ts.map +1 -0
- package/dist/src/core/services/SectionManager.js +408 -0
- package/dist/src/core/services/SectionManager.js.map +1 -0
- package/dist/src/core/services/StorageService.js +1 -1
- package/dist/src/core/services/TranslationService.d.ts +21 -0
- package/dist/src/core/services/TranslationService.d.ts.map +1 -0
- package/dist/src/core/services/TranslationService.js +95 -0
- package/dist/src/core/services/TranslationService.js.map +1 -0
- package/dist/src/core/services/index.d.ts +11 -8
- package/dist/src/core/services/index.d.ts.map +1 -1
- package/dist/src/core/services/index.js +11 -8
- package/dist/src/core/services/index.js.map +1 -1
- package/dist/src/core/types/utils.d.ts +8 -8
- package/dist/src/core/types/utils.d.ts.map +1 -1
- package/dist/src/core/view/LoopContext.d.ts +21 -1
- package/dist/src/core/view/LoopContext.d.ts.map +1 -1
- package/dist/src/core/view/LoopContext.js +36 -0
- package/dist/src/core/view/LoopContext.js.map +1 -1
- package/dist/src/core/view/ResourceScope.d.ts +38 -0
- package/dist/src/core/view/ResourceScope.d.ts.map +1 -0
- package/dist/src/core/view/ResourceScope.js +167 -0
- package/dist/src/core/view/ResourceScope.js.map +1 -0
- package/dist/src/core/view/Section.d.ts +17 -32
- package/dist/src/core/view/Section.d.ts.map +1 -1
- package/dist/src/core/view/Section.js +14 -55
- package/dist/src/core/view/Section.js.map +1 -1
- package/dist/src/core/view/View.d.ts +43 -7
- package/dist/src/core/view/View.d.ts.map +1 -1
- package/dist/src/core/view/View.js +22 -4
- package/dist/src/core/view/View.js.map +1 -1
- package/dist/src/core/view/ViewController.d.ts +313 -40
- package/dist/src/core/view/ViewController.d.ts.map +1 -1
- package/dist/src/core/view/ViewController.js +1002 -147
- package/dist/src/core/view/ViewController.js.map +1 -1
- package/dist/src/core/view/ViewManager.d.ts +318 -27
- package/dist/src/core/view/ViewManager.d.ts.map +1 -1
- package/dist/src/core/view/ViewManager.js +1199 -258
- package/dist/src/core/view/ViewManager.js.map +1 -1
- package/dist/src/core/view/ViewState.d.ts +185 -6
- package/dist/src/core/view/ViewState.d.ts.map +1 -1
- package/dist/src/core/view/ViewState.js +851 -123
- package/dist/src/core/view/ViewState.js.map +1 -1
- package/dist/src/core/view/index.d.ts +5 -5
- package/dist/src/core/view/index.d.ts.map +1 -1
- package/dist/src/core/view/index.js +5 -5
- package/dist/src/core/view/index.js.map +1 -1
- package/dist/src/testing/index.d.ts +69 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +140 -0
- package/dist/src/testing/index.js.map +1 -0
- package/index.ts +29 -5
- package/package.json +30 -21
- package/plugins.ts +2 -2
- package/src/core/app/Application.ts +72 -31
- package/src/core/bootstrap/app.ts +84 -6
- package/src/core/bootstrap/bundle.ts +101 -0
- package/src/core/bootstrap/providers/ApiServiceProvider.ts +4 -4
- package/src/core/bootstrap/providers/CoreServiceProvider.ts +14 -8
- package/src/core/bootstrap/providers/HelperServiceProvider.ts +8 -3
- package/src/core/bootstrap/providers/RouteServiceProvider.ts +15 -4
- package/src/core/bootstrap/providers/ServiceProvider.ts +8 -8
- package/src/core/bootstrap/providers/ViewServiceProvider.ts +3 -3
- package/src/core/bootstrap/providers/default-providers.ts +51 -16
- package/src/core/bootstrap/providers/index.ts +9 -9
- package/src/core/bootstrap/providers/provider-order.test.ts +16 -27
- package/src/core/bootstrap/providers/provider-order.ts +1 -1
- package/src/core/bootstrap/ssr.ts +141 -0
- package/src/core/cache/ViewCache.ts +1 -1
- package/src/core/cache/index.ts +1 -1
- package/src/core/contracts/ApplicationInterface.ts +15 -11
- package/src/core/contracts/BlockInterface.ts +18 -18
- package/src/core/contracts/BundleInterface.ts +40 -0
- package/src/core/contracts/ComponentInterface.ts +7 -6
- package/src/core/contracts/ElementInterface.ts +95 -27
- package/src/core/contracts/HeadServiceInterface.ts +41 -0
- package/src/core/contracts/HelperInterface.ts +9 -1
- package/src/core/contracts/HttpServiceInterface.ts +3 -0
- package/src/core/contracts/MarkerInterface.ts +22 -49
- package/src/core/contracts/ReactiveInterface.ts +9 -9
- package/src/core/contracts/RouterInterface.ts +5 -2
- package/src/core/contracts/SectionInterface.ts +49 -0
- package/src/core/contracts/ServiceProviderInterface.ts +3 -3
- package/src/core/contracts/ViewControllerInterface.ts +124 -16
- package/src/core/contracts/ViewInterface.ts +34 -5
- package/src/core/contracts/ViewManagerInterface.ts +40 -5
- package/src/core/contracts/ViewStateInterface.ts +39 -2
- package/src/core/contracts/common.ts +3 -3
- package/src/core/contracts/utils.ts +19 -19
- package/src/core/contracts/views.ts +2 -22
- package/src/core/devtools/hook.ts +142 -0
- package/src/core/devtools/index.ts +38 -0
- package/src/core/devtools/inspector.ts +270 -0
- package/src/core/elements/Block.ts +43 -21
- package/src/core/elements/BlockOutlet.ts +61 -21
- package/src/core/elements/Component.ts +352 -18
- package/src/core/elements/ElementManager.ts +9 -9
- package/src/core/elements/ForeachSlotCache.ts +170 -0
- package/src/core/elements/Fragment.ts +50 -32
- package/src/core/elements/Html.ts +696 -117
- package/src/core/elements/Output.ts +147 -30
- package/src/core/elements/Reactive.ts +329 -52
- package/src/core/elements/TextElement.ts +25 -16
- package/src/core/elements/Wrapper.ts +84 -18
- package/src/core/elements/Yield.ts +35 -24
- package/src/core/elements/helpers.ts +12 -12
- package/src/core/elements/index.ts +25 -24
- package/src/core/elements/reconcileChildren.ts +70 -0
- package/src/core/{hellpers → helpers}/ApiClient.ts +8 -1
- package/src/core/{hellpers → helpers}/app.ts +13 -2
- package/src/core/helpers/transition.ts +127 -0
- package/src/core/{hellpers → helpers}/utils.ts +4 -4
- package/src/core/helpers/view.ts +283 -0
- package/src/core/routers/Router.ts +458 -64
- package/src/core/routers/index.ts +2 -2
- package/src/core/services/AssetManager.ts +387 -0
- package/src/core/services/BlockManager.ts +272 -50
- package/src/core/services/DomService.ts +3 -3
- package/src/core/services/HeadService.ts +124 -0
- package/src/core/services/HelperService.ts +34 -4
- package/src/core/services/HttpService.ts +116 -55
- package/src/core/services/MarkerRegistry.ts +142 -16
- package/src/core/services/PageCache.ts +239 -0
- package/src/core/services/SectionManager.ts +387 -0
- package/src/core/services/StorageService.ts +1 -1
- package/src/core/services/TranslationService.ts +91 -0
- package/src/core/services/index.ts +11 -8
- package/src/core/types/utils.ts +8 -8
- package/src/core/view/LoopContext.ts +38 -1
- package/src/core/view/ResourceScope.ts +174 -0
- package/src/core/view/Section.ts +21 -68
- package/src/core/view/View.ts +57 -8
- package/src/core/view/ViewController.ts +1070 -186
- package/src/core/view/ViewManager.ts +1346 -272
- package/src/core/view/ViewState.ts +834 -116
- package/src/core/view/index.ts +5 -5
- package/src/testing/index.ts +184 -0
- package/dist/src/core/hellpers/ApiClient.d.ts.map +0 -1
- package/dist/src/core/hellpers/ApiClient.js.map +0 -1
- package/dist/src/core/hellpers/app.d.ts +0 -3
- package/dist/src/core/hellpers/app.d.ts.map +0 -1
- package/dist/src/core/hellpers/app.js.map +0 -1
- package/dist/src/core/hellpers/utils.d.ts.map +0 -1
- package/dist/src/core/hellpers/utils.js.map +0 -1
- package/dist/src/core/services/MarkerService.d.ts +0 -299
- package/dist/src/core/services/MarkerService.d.ts.map +0 -1
- package/dist/src/core/services/MarkerService.js +0 -723
- package/dist/src/core/services/MarkerService.js.map +0 -1
- package/src/core/services/MarkerService.ts +0 -923
- /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 "../
|
|
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.
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
this.id = `${ctx.viewId}-${id ?? generateUUID(10)}`;
|
|
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
|
-
|
|
54
|
-
|
|
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
|
-
|
|
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
|
|
380
|
+
get isSaoElement() {
|
|
60
381
|
return true;
|
|
61
382
|
}
|
|
62
|
-
set
|
|
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":"AAAA,OAAO,EAAY,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAK7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC5G,OAAO,cAAc,MAAM,+BAA+B,CAAC;AAG3D,MAAM,OAAO,SAAS;IA+BlB,YAAY,EACR,GAAG,EACH,MAAM,GAAG,IAAI,EACb,EAAE,GAAG,IAAI,EACT,SAAS,GAAG,EAAE,EACd,IAAI,GAAG,EAAE,EACT,WAAW,GAAG,IAAI,EAClB,IAAI,GAAG,IAAI,EACX,IAAI,GAAG,SAAS,EAChB,SAAS,GAAG,IAAI,EAChB,QAAQ,GAAG,SAAS,CAAC,MAAM,EAC3B,SAAS,GAAG,EAAE,GAajB;QAtDD,YAAO,GAAkB,WAAW,CAAC;QAGrC,gBAAW,GAAW,EAAE,CAAC,CAAC,4FAA4F;QAKtH,YAAO,GAAyB,IAAI,CAAC;QAErC,SAAI,GAAkB,IAAI,CAAC,CAAC,sBAAsB;QAClD,SAAI,GAA8B,SAAS,CAAC;QAC5C,cAAS,GAAqD,IAAI,CAAC,CAAC,6BAA6B;QACjG,aAAQ,GAAa,SAAS,CAAC,MAAM,CAAC,CAAC,8BAA8B;QACrE,gBAAW,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;QACnC,kBAAa,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;QACrC;;;;;;;;;;WAUG;QACH,cAAS,GAA4C,EAAE,CAAC;QACxD,gBAAW,GAA0E,IAAI,CAAC;QA8F1F,qBAAqB;QACd,kBAAa,GAAY,KAAK,CAAC;QAC9B,eAAU,GAAG,KAAK,CAAC;QACnB,oBAAe,GAAwB,IAAI,CAAC;QAC5C,yBAAoB,GAAwB,IAAI,CAAC;QACzD,yDAAyD;QACjD,kBAAa,GAAG,KAAK,CAAC;QAzE1B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,mEAAmE;QACnE,sEAAsE;QACtE,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,SAAS,CAAC,MAAM,CAAC;QAE7C,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;YACtC,gEAAgE;YAChE,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACvC,IAAI,OAAO,EAAE,CAAC;gBACV,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;gBAC5B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACJ,4DAA4D;gBAC5D,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;gBACtE,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YACzE,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,wEAAwE;YACxE,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,eAAe;QACnB,OAAO,cAAc,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC;IACpF,CAAC;IAED,SAAS,CAAC,OAA4B;QAClC,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;IAC7C,CAAC;IAED,cAAc,CAAC,OAAqE;QAChF,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;IAC/B,CAAC;IACD,YAAY,CAAC,SAAoD;QAC7D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IACD,YAAY,CAAC,SAAmB;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IACD,YAAY,CAAC,SAAkD;QAC3D,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,EAAE,CAAC;IACrC,CAAC;IACD,gBAAgB,CAAC,MAA4B;QACzC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,IAAmB;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACxB,CAAC;IACD,SAAS,CAAC,MAA4B;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAUD;;;;;;;;;;OAUG;IACH,MAAM;QACF,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAE/B,kEAAkE;QAClE,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;gBAC1B,mEAAmE;gBACnE,iDAAiD;gBACjD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;oBACtE,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC;oBACjC,OAAO,CAAC,mDAAmD;gBAC/D,CAAC;gBACD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBACrB,MAAM,WAAW,GAAI,IAAI,CAAC,GAAW,CAAC,GAAG,EAAE,IAAI,CAAC;oBAChD,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;wBAC1C,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC;wBACjC,OAAO;oBACX,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;gBAChD,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,kCAAkC;gBACpE,OAAO;YACX,CAAC;YACD,sEAAsE;YACtE,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC;QACrC,CAAC;QAED,aAAa;QACb,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;YACtC,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QAED,yBAAyB;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,OAAO;YACX,CAAC;QACL,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,WAAW,GAAI,IAAI,CAAC,GAAW,CAAC,GAAG,EAAE,IAAI,CAAC;YAChD,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC1C,OAAO,CAAC,qDAAqD;YACjE,CAAC;QACL,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;OAMG;IACK,eAAe,CAAC,KAAiB;QACrC,IAAI,CAAC;YACD,KAAK,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;YACrF,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,GAAG,CAAC;YAC/B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;IACL,CAAC;IAED,4EAA4E;IACpE,aAAa,CAAC,QAAa;QAC/B,IAAI,OAAO,GAAgB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACpD,OAAO,OAAO,IAAI,OAAO,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAgB,OAAO,CAAC,WAAW,CAAC;YAC9C,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;YACzC,OAAO,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO;QACxD,yBAAyB,CACrB,IAAI,CAAC,QAAQ,EACb,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAC/C,IAAI,CAAC,MAAM,CACd,CAAC;IACN,CAAC;IAED;;;OAGG;IACK,mBAAmB;QACvB,IAAI,OAAO,GAAgB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACpD,OAAO,OAAO,IAAI,OAAO,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;gBACpE,IAAI,MAAM,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO,MAAM,CAAC,EAAE,CAAC;YAC7E,CAAC;iBAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;gBAC3E,IAAI,IAAoB,CAAC;gBACzB,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAoB,CAAC,EAAE,CAAC;oBAClD,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;oBACjE,IAAI,MAAM,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO;wBAAE,OAAO,MAAM,CAAC,EAAE,CAAC;gBAC7E,CAAC;YACL,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACK,YAAY;QAChB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAE/C,qEAAqE;QACrE,oEAAoE;QACpE,6DAA6D;QAC7D,sEAAsE;QACtE,6DAA6D;QAC7D,qEAAqE;QACrE,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAO;QACX,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1C,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC;QAErC,wEAAwE;QACxE,wDAAwD;QACxD,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC;QAE7B,2EAA2E;QAC3E,wEAAwE;QACxE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC;QACvC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAE5B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,SAAS,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChF,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,OAAc,CAAC,CAAC;QAC9D,CAAC;QAED,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC;QACtC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,wDAAwD;IAChD,UAAU;QACd,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;gBACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC/C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC9B,CAAC;YACD,OAAO;QACX,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1C,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC;QAErC,iCAAiC;QACjC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;YACjE,MAAM,iBAAiB,GAAG,CAAC,IAAU,EAAE,EAAE;gBACrC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChE,CAAC,CAAC;YACF,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpC,0DAA0D;YAC1D,yBAAyB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/E,CAAC;QAED,sFAAsF;QACtF,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,UAAU,CAAC,SAAS,CAAC,CAAC;QACtB,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,qFAAqF;IAC7E,gBAAgB;QACpB,MAAM,WAAW,GAAI,IAAI,CAAC,GAAW,CAAC,GAAG,EAAE,IAAI,CAAC;QAChD,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,wCAAwC,IAAI,CAAC,IAAI,6BAA6B,CAAC,CAAC;YAC9F,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1E,wEAAwE;QACxE,MAAM,SAAS,GAAG,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5E,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,qBAAqB,IAAI,CAAC,IAAI,iCAAiC,CAAC,CAAC;YAC/E,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC;QACrC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC;QAChC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC7B,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,gFAAgF;IACxE,gBAAgB,CAAC,SAAkC;QACvD,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAEO,gBAAgB,CAAC,SAAkC;QACvD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,IAAI,CAAC,UAAU;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,yCAAyC;IACjC,YAAY;QAChB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,8BAA8B;QAC9B,IAAI,OAAO,GAAgB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACpD,OAAO,OAAO,IAAI,OAAO,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAgB,OAAO,CAAC,WAAW,CAAC;YAC7C,OAAqB,CAAC,MAAM,EAAE,CAAC;YAChC,OAAO,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,KAAK;QACD,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAClD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;gBACrE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACnC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBACpE,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChF,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE;gBACpF,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,sCAAsC;YACzD,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,IAAI;QACA,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAC7B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAExB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAAC,CAAC;QAClF,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QAAC,CAAC;QACjG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,OAAO;QACH,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACvB,CAAC;IACD,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,YAAY,CAAC,KAAc;QAC3B,qCAAqC;IACzC,CAAC;IACD,IAAI,cAAc;QACd,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,cAAc,CAAC,KAAc;QAC7B,qCAAqC;IACzC,CAAC;CACJ"}
|
|
@@ -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
|