@saolabs/client 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +17 -15
- package/dist/src/core/app/Application.d.ts.map +1 -1
- package/dist/src/core/app/Application.js +41 -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 +74 -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 +125 -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 +13 -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/hellpers/utils.d.ts +2 -2
- package/dist/src/core/hellpers/utils.js +4 -4
- package/dist/src/core/helpers/ApiClient.d.ts +58 -0
- package/dist/src/core/helpers/ApiClient.d.ts.map +1 -0
- package/dist/src/core/helpers/ApiClient.js +131 -0
- 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/helpers/app.js +63 -0
- 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/helpers/utils.d.ts +26 -0
- package/dist/src/core/helpers/utils.d.ts.map +1 -0
- package/dist/src/core/helpers/utils.js +96 -0
- 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 +58 -31
- package/src/core/bootstrap/app.ts +80 -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 +136 -0
- package/src/core/cache/ViewCache.ts +1 -1
- package/src/core/cache/index.ts +1 -1
- package/src/core/contracts/ApplicationInterface.ts +13 -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/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
|
@@ -1,23 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import { ViewControllerInterface } from "./utils";
|
|
3
|
-
export type SectionItemType = 'static' | 'dynamic' | 'async' | 'reactive';
|
|
4
|
-
export type SectionContentType = 'text' | 'html';
|
|
5
|
-
export type SectionContentRenderer = (parentElement?: HtmlInterface | null | undefined) => string | OneElementChildren;
|
|
6
|
-
export type SectionConstruvtorArgs = {
|
|
7
|
-
ctx?: ViewControllerInterface | null;
|
|
8
|
-
name: string;
|
|
9
|
-
type: SectionItemType;
|
|
10
|
-
contentType?: SectionContentType;
|
|
11
|
-
stateKeys?: string[];
|
|
12
|
-
renderFactory: SectionContentRenderer;
|
|
13
|
-
[key: string]: any;
|
|
14
|
-
};
|
|
15
|
-
export interface SectionInterface {
|
|
16
|
-
ctx?: ViewControllerInterface | null;
|
|
17
|
-
name: string;
|
|
18
|
-
type: SectionItemType;
|
|
19
|
-
contentType?: SectionContentType;
|
|
20
|
-
stateKeys?: string[];
|
|
21
|
-
renderFactory?: SectionContentRenderer;
|
|
22
|
-
}
|
|
1
|
+
export {};
|
|
23
2
|
//# sourceMappingURL=views.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../../../src/core/contracts/views.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../../../src/core/contracts/views.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevTools runtime hook (GAP-05).
|
|
3
|
+
*
|
|
4
|
+
* Nền tảng cho MỌI UI devtools (overlay in-page, browser extension sau này):
|
|
5
|
+
* runtime chỉ phát sự kiện + cho phép đọc snapshot, KHÔNG biết gì về UI.
|
|
6
|
+
*
|
|
7
|
+
* Thiết kế:
|
|
8
|
+
* - **Tắt mặc định, zero-cost.** `emit()` thoát ngay ở dòng đầu khi chưa bật.
|
|
9
|
+
* Không tạo object, không serialize — không được làm chậm production.
|
|
10
|
+
* - Bật bằng `App.devtools.enable()` hoặc đặt sẵn `window.__SAOLA_DEVTOOLS_HOOK__`
|
|
11
|
+
* TRƯỚC khi app boot (cách extension sẽ dùng: content script inject sớm).
|
|
12
|
+
* - Snapshot đọc từ ViewManager/ViewController, không giữ state riêng →
|
|
13
|
+
* không có nguồn sự thật thứ hai để lệch.
|
|
14
|
+
*/
|
|
15
|
+
export type DevtoolsEventType = 'view:mounted' | 'view:destroyed' | 'state:changed' | 'error';
|
|
16
|
+
export interface DevtoolsEvent {
|
|
17
|
+
type: DevtoolsEventType;
|
|
18
|
+
/** ms từ lúc trang load — đủ để xếp thứ tự trên timeline */
|
|
19
|
+
at: number;
|
|
20
|
+
viewId?: string;
|
|
21
|
+
path?: string;
|
|
22
|
+
/** state:changed → key nào đổi; error → phase */
|
|
23
|
+
detail?: any;
|
|
24
|
+
}
|
|
25
|
+
export interface DevtoolsViewNode {
|
|
26
|
+
viewId: string;
|
|
27
|
+
path: string;
|
|
28
|
+
viewType: string;
|
|
29
|
+
lifecycleState: string;
|
|
30
|
+
/** Ảnh chụp state hiện tại (đã lọc giá trị không serialize được) */
|
|
31
|
+
state: Record<string, any>;
|
|
32
|
+
/** Số element đang giữ trong registry — dò rò rỉ */
|
|
33
|
+
elementCount: number;
|
|
34
|
+
children: DevtoolsViewNode[];
|
|
35
|
+
}
|
|
36
|
+
type Listener = (e: DevtoolsEvent) => void;
|
|
37
|
+
declare class DevtoolsHook {
|
|
38
|
+
private enabled;
|
|
39
|
+
private listeners;
|
|
40
|
+
/** Vòng đệm — devtools mở muộn vẫn xem được lịch sử gần đây */
|
|
41
|
+
private log;
|
|
42
|
+
/** ViewManager, gán lúc boot; dùng any để tránh vòng import */
|
|
43
|
+
private viewManager;
|
|
44
|
+
isEnabled(): boolean;
|
|
45
|
+
enable(): void;
|
|
46
|
+
disable(): void;
|
|
47
|
+
/** ViewManager tự đăng ký lúc init — hook không đi tìm global. */
|
|
48
|
+
attach(viewManager: any): void;
|
|
49
|
+
subscribe(fn: Listener): () => void;
|
|
50
|
+
/** Hot path — phải rẻ khi tắt. */
|
|
51
|
+
emit(type: DevtoolsEventType, data?: Omit<DevtoolsEvent, 'type' | 'at'>): void;
|
|
52
|
+
getLog(): DevtoolsEvent[];
|
|
53
|
+
clearLog(): void;
|
|
54
|
+
/** Cây view đang mount: layout chain (ngoài → trong) rồi tới page. */
|
|
55
|
+
getViewTree(): DevtoolsViewNode[];
|
|
56
|
+
private toNode;
|
|
57
|
+
/**
|
|
58
|
+
* Ảnh chụp state — mọi giá trị đi qua JSON round-trip để cắt tham chiếu
|
|
59
|
+
* DOM/hàm/vòng lặp: devtools không được giữ sống object của app, và
|
|
60
|
+
* không được nổ khi state chứa cấu trúc vòng.
|
|
61
|
+
*/
|
|
62
|
+
private snapshotState;
|
|
63
|
+
}
|
|
64
|
+
export declare const devtools: DevtoolsHook;
|
|
65
|
+
export default devtools;
|
|
66
|
+
//# sourceMappingURL=hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../../../src/core/devtools/hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,iBAAiB,GACvB,cAAc,GAAG,gBAAgB,GACjC,eAAe,GACf,OAAO,CAAC;AAEd,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,iBAAiB,CAAC;IACxB,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,MAAM,CAAC,EAAE,GAAG,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAChC;AAED,KAAK,QAAQ,GAAG,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;AAI3C,cAAM,YAAY;IACd,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAkB;IACnC,+DAA+D;IAC/D,OAAO,CAAC,GAAG,CAAuB;IAClC,+DAA+D;IAC/D,OAAO,CAAC,WAAW,CAAa;IAEhC,SAAS,IAAI,OAAO;IAEpB,MAAM,IAAI,IAAI;IACd,OAAO,IAAI,IAAI;IAEf,kEAAkE;IAClE,MAAM,CAAC,WAAW,EAAE,GAAG,GAAG,IAAI;IAE9B,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,IAAI;IAKnC,kCAAkC;IAClC,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI;IAU9E,MAAM,IAAI,aAAa,EAAE;IACzB,QAAQ,IAAI,IAAI;IAEhB,sEAAsE;IACtE,WAAW,IAAI,gBAAgB,EAAE;IAUjC,OAAO,CAAC,MAAM;IAYd;;;;OAIG;IACH,OAAO,CAAC,aAAa;CAaxB;AAED,eAAO,MAAM,QAAQ,cAAqB,CAAC;AAiB3C,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevTools runtime hook (GAP-05).
|
|
3
|
+
*
|
|
4
|
+
* Nền tảng cho MỌI UI devtools (overlay in-page, browser extension sau này):
|
|
5
|
+
* runtime chỉ phát sự kiện + cho phép đọc snapshot, KHÔNG biết gì về UI.
|
|
6
|
+
*
|
|
7
|
+
* Thiết kế:
|
|
8
|
+
* - **Tắt mặc định, zero-cost.** `emit()` thoát ngay ở dòng đầu khi chưa bật.
|
|
9
|
+
* Không tạo object, không serialize — không được làm chậm production.
|
|
10
|
+
* - Bật bằng `App.devtools.enable()` hoặc đặt sẵn `window.__SAOLA_DEVTOOLS_HOOK__`
|
|
11
|
+
* TRƯỚC khi app boot (cách extension sẽ dùng: content script inject sớm).
|
|
12
|
+
* - Snapshot đọc từ ViewManager/ViewController, không giữ state riêng →
|
|
13
|
+
* không có nguồn sự thật thứ hai để lệch.
|
|
14
|
+
*/
|
|
15
|
+
const MAX_LOG = 200;
|
|
16
|
+
class DevtoolsHook {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.enabled = false;
|
|
19
|
+
this.listeners = [];
|
|
20
|
+
/** Vòng đệm — devtools mở muộn vẫn xem được lịch sử gần đây */
|
|
21
|
+
this.log = [];
|
|
22
|
+
/** ViewManager, gán lúc boot; dùng any để tránh vòng import */
|
|
23
|
+
this.viewManager = null;
|
|
24
|
+
}
|
|
25
|
+
isEnabled() { return this.enabled; }
|
|
26
|
+
enable() { this.enabled = true; }
|
|
27
|
+
disable() { this.enabled = false; this.log = []; }
|
|
28
|
+
/** ViewManager tự đăng ký lúc init — hook không đi tìm global. */
|
|
29
|
+
attach(viewManager) { this.viewManager = viewManager; }
|
|
30
|
+
subscribe(fn) {
|
|
31
|
+
this.listeners.push(fn);
|
|
32
|
+
return () => { this.listeners = this.listeners.filter(l => l !== fn); };
|
|
33
|
+
}
|
|
34
|
+
/** Hot path — phải rẻ khi tắt. */
|
|
35
|
+
emit(type, data) {
|
|
36
|
+
if (!this.enabled)
|
|
37
|
+
return;
|
|
38
|
+
const event = { type, at: Math.round(performance.now()), ...data };
|
|
39
|
+
this.log.push(event);
|
|
40
|
+
if (this.log.length > MAX_LOG)
|
|
41
|
+
this.log.shift();
|
|
42
|
+
for (const fn of this.listeners) {
|
|
43
|
+
try {
|
|
44
|
+
fn(event);
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
console.error('[Devtools] listener error:', e);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
getLog() { return [...this.log]; }
|
|
52
|
+
clearLog() { this.log = []; }
|
|
53
|
+
/** Cây view đang mount: layout chain (ngoài → trong) rồi tới page. */
|
|
54
|
+
getViewTree() {
|
|
55
|
+
const vm = this.viewManager;
|
|
56
|
+
if (!vm)
|
|
57
|
+
return [];
|
|
58
|
+
const roots = [...(vm.getLayoutChain?.() ?? []), vm.getCurrentView?.()].filter(Boolean);
|
|
59
|
+
// Layout chain và page nối nhau theo thứ tự mount, không phải quan hệ
|
|
60
|
+
// parent/children (quan hệ đó chỉ dùng cho @include) → dựng phẳng ở
|
|
61
|
+
// gốc, rồi mỗi node mở rộng theo ctrl.children thật.
|
|
62
|
+
return roots.map(v => this.toNode(v.__ctrl__));
|
|
63
|
+
}
|
|
64
|
+
toNode(ctrl) {
|
|
65
|
+
return {
|
|
66
|
+
viewId: ctrl.viewId,
|
|
67
|
+
path: ctrl.path,
|
|
68
|
+
viewType: ctrl.viewType,
|
|
69
|
+
lifecycleState: ctrl.lifecycleState,
|
|
70
|
+
state: this.snapshotState(ctrl),
|
|
71
|
+
elementCount: ctrl.elements?.size ?? 0,
|
|
72
|
+
children: (ctrl.children ?? []).map((c) => this.toNode(c)),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Ảnh chụp state — mọi giá trị đi qua JSON round-trip để cắt tham chiếu
|
|
77
|
+
* DOM/hàm/vòng lặp: devtools không được giữ sống object của app, và
|
|
78
|
+
* không được nổ khi state chứa cấu trúc vòng.
|
|
79
|
+
*/
|
|
80
|
+
snapshotState(ctrl) {
|
|
81
|
+
const out = {};
|
|
82
|
+
const states = ctrl.states?.__?.states ?? {};
|
|
83
|
+
for (const key of Object.keys(states)) {
|
|
84
|
+
try {
|
|
85
|
+
const value = states[key]?.value; // computed: getter → tính lại ở đây
|
|
86
|
+
out[key] = value === undefined ? undefined : JSON.parse(JSON.stringify(value));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
out[key] = '[không serialize được]';
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return out;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export const devtools = new DevtoolsHook();
|
|
96
|
+
/**
|
|
97
|
+
* Nếu môi trường đã cắm sẵn `window.__SAOLA_DEVTOOLS_HOOK__` trước khi app boot
|
|
98
|
+
* (browser extension làm vậy), tự bật và nối sự kiện sang đó.
|
|
99
|
+
*/
|
|
100
|
+
if (typeof window !== 'undefined') {
|
|
101
|
+
const external = window.__SAOLA_DEVTOOLS_HOOK__;
|
|
102
|
+
if (external) {
|
|
103
|
+
devtools.enable();
|
|
104
|
+
devtools.subscribe((e) => { try {
|
|
105
|
+
external.onEvent?.(e);
|
|
106
|
+
}
|
|
107
|
+
catch { /* của bên thứ 3 */ } });
|
|
108
|
+
external.getViewTree = () => devtools.getViewTree();
|
|
109
|
+
external.getLog = () => devtools.getLog();
|
|
110
|
+
}
|
|
111
|
+
window.__SAOLA_DEVTOOLS__ = devtools;
|
|
112
|
+
}
|
|
113
|
+
export default devtools;
|
|
114
|
+
//# sourceMappingURL=hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../../src/core/devtools/hook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevTools — API công khai, gắn vào DI container dưới tên `Devtools`
|
|
3
|
+
* (dùng `app('Devtools')` hoặc `App.devtools`).
|
|
4
|
+
*
|
|
5
|
+
* Tắt hoàn toàn mặc định: `emit()` thoát ngay ở dòng đầu khi chưa bật, nên
|
|
6
|
+
* production không trả phí gì ngoài vài hàm không bao giờ chạy.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* App.devtools.open(); // bật + mở panel
|
|
10
|
+
* App.devtools.enableShortcut(); // Ctrl+Shift+D bật/tắt panel
|
|
11
|
+
* App.devtools.getViewTree(); // đọc cây view bằng code
|
|
12
|
+
*/
|
|
13
|
+
import devtools from './hook.js';
|
|
14
|
+
import inspector from './inspector.js';
|
|
15
|
+
export declare const Devtools: {
|
|
16
|
+
/** Bật thu thập sự kiện (chưa mở UI) — dùng khi chỉ cần đọc bằng code. */
|
|
17
|
+
enable: () => void;
|
|
18
|
+
disable: () => void;
|
|
19
|
+
isEnabled: () => boolean;
|
|
20
|
+
/** Bật + mở panel in-page. */
|
|
21
|
+
open: () => void;
|
|
22
|
+
close: () => void;
|
|
23
|
+
toggle: () => void;
|
|
24
|
+
isOpen: () => boolean;
|
|
25
|
+
enableShortcut: () => void;
|
|
26
|
+
getViewTree: () => import("./hook.js").DevtoolsViewNode[];
|
|
27
|
+
getLog: () => import("./hook.js").DevtoolsEvent[];
|
|
28
|
+
clearLog: () => void;
|
|
29
|
+
subscribe: (fn: Parameters<typeof devtools.subscribe>[0]) => () => void;
|
|
30
|
+
};
|
|
31
|
+
export { devtools, inspector };
|
|
32
|
+
export type { DevtoolsEvent, DevtoolsEventType, DevtoolsViewNode } from './hook.js';
|
|
33
|
+
export default Devtools;
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/devtools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,SAAmC,MAAM,gBAAgB,CAAC;AAEjE,eAAO,MAAM,QAAQ;IACjB,0EAA0E;;;;IAK1E,8BAA8B;;;;;;;;;oBAWd,UAAU,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;CAC3D,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC/B,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACpF,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevTools — API công khai, gắn vào DI container dưới tên `Devtools`
|
|
3
|
+
* (dùng `app('Devtools')` hoặc `App.devtools`).
|
|
4
|
+
*
|
|
5
|
+
* Tắt hoàn toàn mặc định: `emit()` thoát ngay ở dòng đầu khi chưa bật, nên
|
|
6
|
+
* production không trả phí gì ngoài vài hàm không bao giờ chạy.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* App.devtools.open(); // bật + mở panel
|
|
10
|
+
* App.devtools.enableShortcut(); // Ctrl+Shift+D bật/tắt panel
|
|
11
|
+
* App.devtools.getViewTree(); // đọc cây view bằng code
|
|
12
|
+
*/
|
|
13
|
+
import devtools from './hook.js';
|
|
14
|
+
import inspector, { bindDevtoolsShortcut } from './inspector.js';
|
|
15
|
+
export const Devtools = {
|
|
16
|
+
/** Bật thu thập sự kiện (chưa mở UI) — dùng khi chỉ cần đọc bằng code. */
|
|
17
|
+
enable: () => devtools.enable(),
|
|
18
|
+
disable: () => { inspector.close(); devtools.disable(); },
|
|
19
|
+
isEnabled: () => devtools.isEnabled(),
|
|
20
|
+
/** Bật + mở panel in-page. */
|
|
21
|
+
open: () => inspector.open(),
|
|
22
|
+
close: () => inspector.close(),
|
|
23
|
+
toggle: () => inspector.toggle(),
|
|
24
|
+
isOpen: () => inspector.isOpen(),
|
|
25
|
+
enableShortcut: () => bindDevtoolsShortcut(),
|
|
26
|
+
getViewTree: () => devtools.getViewTree(),
|
|
27
|
+
getLog: () => devtools.getLog(),
|
|
28
|
+
clearLog: () => devtools.clearLog(),
|
|
29
|
+
subscribe: (fn) => devtools.subscribe(fn),
|
|
30
|
+
};
|
|
31
|
+
export { devtools, inspector };
|
|
32
|
+
export default Devtools;
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/devtools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,SAAS,EAAE,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEjE,MAAM,CAAC,MAAM,QAAQ,GAAG;IACpB,0EAA0E;IAC1E,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE;IAC/B,OAAO,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACzD,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE;IAErC,8BAA8B;IAC9B,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE;IAC5B,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE;IAC9B,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE;IAChC,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE;IAEhC,cAAc,EAAE,GAAG,EAAE,CAAC,oBAAoB,EAAE;IAE5C,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE;IACzC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE;IAC/B,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE;IACnC,SAAS,EAAE,CAAC,EAA4C,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;CACtF,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAE/B,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
declare class Inspector {
|
|
2
|
+
private panel;
|
|
3
|
+
private unsubscribe;
|
|
4
|
+
private refreshQueued;
|
|
5
|
+
private selectedViewId;
|
|
6
|
+
isOpen(): boolean;
|
|
7
|
+
open(): void;
|
|
8
|
+
close(): void;
|
|
9
|
+
toggle(): void;
|
|
10
|
+
private queueRefresh;
|
|
11
|
+
private buildPanel;
|
|
12
|
+
private button;
|
|
13
|
+
private section;
|
|
14
|
+
private refresh;
|
|
15
|
+
private muted;
|
|
16
|
+
private renderNode;
|
|
17
|
+
private renderEvent;
|
|
18
|
+
private describe;
|
|
19
|
+
/**
|
|
20
|
+
* View không có 1 element bọc ngoài (kiến trúc marker, no-VDOM) → lấy
|
|
21
|
+
* bounding box của TẤT CẢ node giữa cặp marker `<!--s:v:{viewId}-s/-e-->`.
|
|
22
|
+
*/
|
|
23
|
+
private highlight;
|
|
24
|
+
private rangeOfView;
|
|
25
|
+
private clearHighlight;
|
|
26
|
+
}
|
|
27
|
+
export declare const inspector: Inspector;
|
|
28
|
+
/** Ctrl+Shift+D bật/tắt panel — chỉ gắn khi devtools đã enable. */
|
|
29
|
+
export declare function bindDevtoolsShortcut(): void;
|
|
30
|
+
export default inspector;
|
|
31
|
+
//# sourceMappingURL=inspector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../../../../src/core/devtools/inspector.ts"],"names":[],"mappings":"AAoBA,cAAM,SAAS;IACX,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAuB;IAE7C,MAAM,IAAI,OAAO;IAEjB,IAAI,IAAI,IAAI;IAaZ,KAAK,IAAI,IAAI;IAQb,MAAM,IAAI,IAAI;IAEd,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,OAAO;IAmBf,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,UAAU;IAkDlB,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,QAAQ;IAQhB;;;OAGG;IACH,OAAO,CAAC,SAAS;IAkBjB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,cAAc;CAGzB;AAED,eAAO,MAAM,SAAS,WAAkB,CAAC;AAEzC,mEAAmE;AACnE,wBAAgB,oBAAoB,IAAI,IAAI,CAQ3C;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevTools inspector — panel in-page, không cần cài extension.
|
|
3
|
+
*
|
|
4
|
+
* Vì sao overlay chứ không phải browser extension: extension cần scaffolding
|
|
5
|
+
* riêng (manifest, content script, bridge, publish store) mà vẫn hiển thị đúng
|
|
6
|
+
* dữ liệu này. Overlay chạy ngay ở mọi môi trường (kể cả máy khác, mobile
|
|
7
|
+
* webview) với chi phí nhỏ hơn nhiều. Hook (`devtools/hook.ts`) đã tách riêng
|
|
8
|
+
* nên extension vẫn dựng được sau này trên CÙNG nguồn dữ liệu.
|
|
9
|
+
*
|
|
10
|
+
* Bật: App.devtools.open() — hoặc Ctrl+Shift+D sau khi App.devtools.enable()
|
|
11
|
+
*
|
|
12
|
+
* Toàn bộ DOM của panel dựng bằng createElement + textContent — panel hiển thị
|
|
13
|
+
* state/đường dẫn/thông báo lỗi do người dùng kiểm soát, nội suy chuỗi vào
|
|
14
|
+
* innerHTML ở đây là đường tiêm HTML (đúng lỗi đã vá ở GAP-07).
|
|
15
|
+
*/
|
|
16
|
+
import devtools from './hook.js';
|
|
17
|
+
const PANEL_ID = '__saola_devtools_panel__';
|
|
18
|
+
const HIGHLIGHT_ID = '__saola_devtools_highlight__';
|
|
19
|
+
class Inspector {
|
|
20
|
+
constructor() {
|
|
21
|
+
this.panel = null;
|
|
22
|
+
this.unsubscribe = null;
|
|
23
|
+
this.refreshQueued = false;
|
|
24
|
+
this.selectedViewId = null;
|
|
25
|
+
}
|
|
26
|
+
isOpen() { return this.panel !== null; }
|
|
27
|
+
open() {
|
|
28
|
+
if (this.panel || typeof document === 'undefined')
|
|
29
|
+
return;
|
|
30
|
+
devtools.enable();
|
|
31
|
+
this.panel = this.buildPanel();
|
|
32
|
+
document.body.appendChild(this.panel);
|
|
33
|
+
// Gom nhiều sự kiện trong cùng frame thành 1 lần vẽ — state đổi có thể
|
|
34
|
+
// bắn hàng loạt, vẽ lại từng cái sẽ tự làm chậm chính app đang debug.
|
|
35
|
+
this.unsubscribe = devtools.subscribe(() => this.queueRefresh());
|
|
36
|
+
this.refresh();
|
|
37
|
+
}
|
|
38
|
+
close() {
|
|
39
|
+
this.unsubscribe?.();
|
|
40
|
+
this.unsubscribe = null;
|
|
41
|
+
this.panel?.remove();
|
|
42
|
+
this.panel = null;
|
|
43
|
+
this.clearHighlight();
|
|
44
|
+
}
|
|
45
|
+
toggle() { this.isOpen() ? this.close() : this.open(); }
|
|
46
|
+
queueRefresh() {
|
|
47
|
+
if (this.refreshQueued)
|
|
48
|
+
return;
|
|
49
|
+
this.refreshQueued = true;
|
|
50
|
+
requestAnimationFrame(() => { this.refreshQueued = false; this.refresh(); });
|
|
51
|
+
}
|
|
52
|
+
// ── Dựng khung ────────────────────────────────────────────────
|
|
53
|
+
buildPanel() {
|
|
54
|
+
const panel = document.createElement('div');
|
|
55
|
+
panel.id = PANEL_ID;
|
|
56
|
+
panel.style.cssText = [
|
|
57
|
+
'position:fixed', 'right:12px', 'bottom:12px', 'width:380px', 'max-height:70vh',
|
|
58
|
+
'z-index:2147483647', 'display:flex', 'flex-direction:column',
|
|
59
|
+
'background:#1e1e2e', 'color:#cdd6f4', 'border:1px solid #45475a', 'border-radius:8px',
|
|
60
|
+
'font:12px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace',
|
|
61
|
+
'box-shadow:0 8px 32px rgba(0,0,0,.4)', 'overflow:hidden',
|
|
62
|
+
].join(';');
|
|
63
|
+
const header = document.createElement('div');
|
|
64
|
+
header.style.cssText = 'display:flex;align-items:center;gap:8px;padding:8px 10px;background:#181825;border-bottom:1px solid #45475a';
|
|
65
|
+
const title = document.createElement('strong');
|
|
66
|
+
title.textContent = 'Saola DevTools';
|
|
67
|
+
title.style.cssText = 'flex:1;color:#89b4fa';
|
|
68
|
+
const btnClear = this.button('Xoá log', () => { devtools.clearLog(); this.refresh(); });
|
|
69
|
+
const btnClose = this.button('✕', () => this.close());
|
|
70
|
+
header.append(title, btnClear, btnClose);
|
|
71
|
+
const body = document.createElement('div');
|
|
72
|
+
body.setAttribute('data-role', 'body');
|
|
73
|
+
body.style.cssText = 'overflow:auto;padding:8px 10px';
|
|
74
|
+
panel.append(header, body);
|
|
75
|
+
return panel;
|
|
76
|
+
}
|
|
77
|
+
button(label, onClick) {
|
|
78
|
+
const b = document.createElement('button');
|
|
79
|
+
b.textContent = label;
|
|
80
|
+
b.style.cssText = 'background:#313244;color:#cdd6f4;border:1px solid #45475a;border-radius:4px;padding:2px 8px;cursor:pointer;font:inherit';
|
|
81
|
+
b.addEventListener('click', onClick);
|
|
82
|
+
return b;
|
|
83
|
+
}
|
|
84
|
+
section(label) {
|
|
85
|
+
const h = document.createElement('div');
|
|
86
|
+
h.textContent = label;
|
|
87
|
+
h.style.cssText = 'margin:10px 0 4px;color:#a6adc8;text-transform:uppercase;font-size:10px;letter-spacing:.08em';
|
|
88
|
+
return h;
|
|
89
|
+
}
|
|
90
|
+
// ── Vẽ nội dung ───────────────────────────────────────────────
|
|
91
|
+
refresh() {
|
|
92
|
+
const body = this.panel?.querySelector('[data-role="body"]');
|
|
93
|
+
if (!body)
|
|
94
|
+
return;
|
|
95
|
+
body.replaceChildren();
|
|
96
|
+
const tree = devtools.getViewTree();
|
|
97
|
+
body.append(this.section(`Cây view (${tree.length} gốc)`));
|
|
98
|
+
if (tree.length === 0) {
|
|
99
|
+
body.append(this.muted('Chưa có view nào mount.'));
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
for (const node of tree)
|
|
103
|
+
body.append(this.renderNode(node, 0));
|
|
104
|
+
}
|
|
105
|
+
const log = devtools.getLog().slice(-25).reverse();
|
|
106
|
+
body.append(this.section(`Sự kiện gần đây (${log.length})`));
|
|
107
|
+
if (log.length === 0)
|
|
108
|
+
body.append(this.muted('Chưa có sự kiện.'));
|
|
109
|
+
else
|
|
110
|
+
for (const e of log)
|
|
111
|
+
body.append(this.renderEvent(e));
|
|
112
|
+
}
|
|
113
|
+
muted(text) {
|
|
114
|
+
const d = document.createElement('div');
|
|
115
|
+
d.textContent = text;
|
|
116
|
+
d.style.cssText = 'color:#6c7086;padding:2px 0';
|
|
117
|
+
return d;
|
|
118
|
+
}
|
|
119
|
+
renderNode(node, depth) {
|
|
120
|
+
const wrap = document.createElement('div');
|
|
121
|
+
wrap.style.cssText = `margin-left:${depth * 12}px`;
|
|
122
|
+
const row = document.createElement('div');
|
|
123
|
+
row.style.cssText = 'display:flex;gap:6px;align-items:baseline;padding:2px 4px;border-radius:4px;cursor:pointer';
|
|
124
|
+
row.addEventListener('mouseenter', () => this.highlight(node.viewId));
|
|
125
|
+
row.addEventListener('mouseleave', () => this.clearHighlight());
|
|
126
|
+
row.addEventListener('click', () => {
|
|
127
|
+
this.selectedViewId = this.selectedViewId === node.viewId ? null : node.viewId;
|
|
128
|
+
this.refresh();
|
|
129
|
+
});
|
|
130
|
+
const path = document.createElement('span');
|
|
131
|
+
path.textContent = node.path || '(không tên)';
|
|
132
|
+
path.style.cssText = 'color:#a6e3a1;flex:1';
|
|
133
|
+
const meta = document.createElement('span');
|
|
134
|
+
meta.textContent = `${node.viewType} · ${node.lifecycleState} · ${node.elementCount}el`;
|
|
135
|
+
meta.style.cssText = `color:${node.lifecycleState === 'active' ? '#6c7086' : '#f9e2af'};font-size:10px`;
|
|
136
|
+
row.append(path, meta);
|
|
137
|
+
wrap.append(row);
|
|
138
|
+
// Bấm để mở/đóng state — mặc định đóng cho gọn khi cây lớn
|
|
139
|
+
if (this.selectedViewId === node.viewId) {
|
|
140
|
+
const keys = Object.keys(node.state);
|
|
141
|
+
if (keys.length === 0) {
|
|
142
|
+
wrap.append(this.muted(' (không có state)'));
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
for (const key of keys) {
|
|
146
|
+
const line = document.createElement('div');
|
|
147
|
+
line.style.cssText = 'display:flex;gap:6px;padding-left:10px';
|
|
148
|
+
const k = document.createElement('span');
|
|
149
|
+
k.textContent = key + ':';
|
|
150
|
+
k.style.cssText = 'color:#f5c2e7';
|
|
151
|
+
const v = document.createElement('span');
|
|
152
|
+
// textContent — state có thể chứa chuỗi do người dùng nhập
|
|
153
|
+
v.textContent = JSON.stringify(node.state[key]) ?? 'undefined';
|
|
154
|
+
v.style.cssText = 'color:#cdd6f4;word-break:break-all';
|
|
155
|
+
line.append(k, v);
|
|
156
|
+
wrap.append(line);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
for (const child of node.children)
|
|
161
|
+
wrap.append(this.renderNode(child, depth + 1));
|
|
162
|
+
return wrap;
|
|
163
|
+
}
|
|
164
|
+
renderEvent(e) {
|
|
165
|
+
const colors = {
|
|
166
|
+
'view:mounted': '#a6e3a1', 'view:destroyed': '#f38ba8',
|
|
167
|
+
'state:changed': '#89b4fa', 'error': '#fab387',
|
|
168
|
+
};
|
|
169
|
+
const row = document.createElement('div');
|
|
170
|
+
row.style.cssText = 'display:flex;gap:6px;padding:1px 0';
|
|
171
|
+
const t = document.createElement('span');
|
|
172
|
+
t.textContent = String(e.at).padStart(6, ' ');
|
|
173
|
+
t.style.cssText = 'color:#6c7086;flex-shrink:0';
|
|
174
|
+
const type = document.createElement('span');
|
|
175
|
+
type.textContent = e.type;
|
|
176
|
+
type.style.cssText = `color:${colors[e.type] ?? '#cdd6f4'};flex-shrink:0`;
|
|
177
|
+
const detail = document.createElement('span');
|
|
178
|
+
detail.textContent = this.describe(e);
|
|
179
|
+
detail.style.cssText = 'color:#a6adc8;word-break:break-all';
|
|
180
|
+
row.append(t, type, detail);
|
|
181
|
+
return row;
|
|
182
|
+
}
|
|
183
|
+
describe(e) {
|
|
184
|
+
if (e.type === 'state:changed')
|
|
185
|
+
return `${e.path ?? ''} [${(e.detail?.keys ?? []).join(', ')}]`;
|
|
186
|
+
if (e.type === 'error')
|
|
187
|
+
return `${e.detail?.phase ?? ''} ${e.path ?? ''}: ${e.detail?.message ?? ''}`;
|
|
188
|
+
return e.path ?? '';
|
|
189
|
+
}
|
|
190
|
+
// ── Highlight vùng DOM của view theo marker ───────────────────
|
|
191
|
+
/**
|
|
192
|
+
* View không có 1 element bọc ngoài (kiến trúc marker, no-VDOM) → lấy
|
|
193
|
+
* bounding box của TẤT CẢ node giữa cặp marker `<!--s:v:{viewId}-s/-e-->`.
|
|
194
|
+
*/
|
|
195
|
+
highlight(viewId) {
|
|
196
|
+
this.clearHighlight();
|
|
197
|
+
const range = this.rangeOfView(viewId);
|
|
198
|
+
if (!range)
|
|
199
|
+
return;
|
|
200
|
+
const rect = range.getBoundingClientRect();
|
|
201
|
+
if (rect.width === 0 && rect.height === 0)
|
|
202
|
+
return;
|
|
203
|
+
const box = document.createElement('div');
|
|
204
|
+
box.id = HIGHLIGHT_ID;
|
|
205
|
+
box.style.cssText = [
|
|
206
|
+
'position:fixed', `left:${rect.left}px`, `top:${rect.top}px`,
|
|
207
|
+
`width:${rect.width}px`, `height:${rect.height}px`,
|
|
208
|
+
'background:rgba(137,180,250,.25)', 'border:1px solid #89b4fa',
|
|
209
|
+
'pointer-events:none', 'z-index:2147483646',
|
|
210
|
+
].join(';');
|
|
211
|
+
document.body.appendChild(box);
|
|
212
|
+
}
|
|
213
|
+
rangeOfView(viewId) {
|
|
214
|
+
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_COMMENT);
|
|
215
|
+
let open = null;
|
|
216
|
+
let node;
|
|
217
|
+
while ((node = walker.nextNode())) {
|
|
218
|
+
const v = node.nodeValue?.trim() ?? '';
|
|
219
|
+
if (v === `s:v:${viewId}-s`) {
|
|
220
|
+
open = node;
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (open && v === `s:v:${viewId}-e`) {
|
|
224
|
+
const range = document.createRange();
|
|
225
|
+
range.setStartAfter(open);
|
|
226
|
+
range.setEndBefore(node);
|
|
227
|
+
return range;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
clearHighlight() {
|
|
233
|
+
document.getElementById(HIGHLIGHT_ID)?.remove();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
export const inspector = new Inspector();
|
|
237
|
+
/** Ctrl+Shift+D bật/tắt panel — chỉ gắn khi devtools đã enable. */
|
|
238
|
+
export function bindDevtoolsShortcut() {
|
|
239
|
+
if (typeof window === 'undefined')
|
|
240
|
+
return;
|
|
241
|
+
window.addEventListener('keydown', (e) => {
|
|
242
|
+
if (e.ctrlKey && e.shiftKey && (e.key === 'D' || e.key === 'd')) {
|
|
243
|
+
e.preventDefault();
|
|
244
|
+
inspector.toggle();
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
export default inspector;
|
|
249
|
+
//# sourceMappingURL=inspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspector.js","sourceRoot":"","sources":["../../../../src/core/devtools/inspector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,QAA6C,MAAM,WAAW,CAAC;AAEtE,MAAM,QAAQ,GAAG,0BAA0B,CAAC;AAC5C,MAAM,YAAY,GAAG,8BAA8B,CAAC;AAEpD,MAAM,SAAS;IAAf;QACY,UAAK,GAAuB,IAAI,CAAC;QACjC,gBAAW,GAAwB,IAAI,CAAC;QACxC,kBAAa,GAAG,KAAK,CAAC;QACtB,mBAAc,GAAkB,IAAI,CAAC;IAsOjD,CAAC;IApOG,MAAM,KAAc,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC;IAEjD,IAAI;QACA,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,OAAO;QAC1D,QAAQ,CAAC,MAAM,EAAE,CAAC;QAElB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtC,uEAAuE;QACvE,sEAAsE;QACtE,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;IAED,KAAK;QACD,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,KAAW,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAEtD,YAAY;QAChB,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAC/B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,qBAAqB,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,iEAAiE;IAEzD,UAAU;QACd,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5C,KAAK,CAAC,EAAE,GAAG,QAAQ,CAAC;QACpB,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG;YAClB,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB;YAC/E,oBAAoB,EAAE,cAAc,EAAE,uBAAuB;YAC7D,oBAAoB,EAAE,eAAe,EAAE,0BAA0B,EAAE,mBAAmB;YACtF,2DAA2D;YAC3D,sCAAsC,EAAE,iBAAiB;SAC5D,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEZ,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,6GAA6G,CAAC;QACrI,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC/C,KAAK,CAAC,WAAW,GAAG,gBAAgB,CAAC;QACrC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,sBAAsB,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEzC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,gCAAgC,CAAC;QAEtD,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,MAAM,CAAC,KAAa,EAAE,OAAmB;QAC7C,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,yHAAyH,CAAC;QAC5I,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,CAAC,CAAC;IACb,CAAC;IAEO,OAAO,CAAC,KAAa;QACzB,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,8FAA8F,CAAC;QACjH,OAAO,CAAC,CAAC;IACb,CAAC;IAED,iEAAiE;IAEzD,OAAO;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,oBAAoB,CAAuB,CAAC;QACnF,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACJ,KAAK,MAAM,IAAI,IAAI,IAAI;gBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;;YAC7D,KAAK,MAAM,CAAC,IAAI,GAAG;gBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEO,KAAK,CAAC,IAAY;QACtB,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,6BAA6B,CAAC;QAChD,OAAO,CAAC,CAAC;IACb,CAAC;IAEO,UAAU,CAAC,IAAsB,EAAE,KAAa;QACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,eAAe,KAAK,GAAG,EAAE,IAAI,CAAC;QAEnD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,4FAA4F,CAAC;QACjH,GAAG,CAAC,gBAAgB,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,GAAG,CAAC,gBAAgB,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAChE,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YAC/B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YAC/E,IAAI,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,IAAI,aAAa,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,sBAAsB,CAAC;QAE5C,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,GAAG,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC,cAAc,MAAM,IAAI,CAAC,YAAY,IAAI,CAAC;QACxF,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,IAAI,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,iBAAiB,CAAC;QAExG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEjB,2DAA2D;QAC3D,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACJ,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACrB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;oBAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,wCAAwC,CAAC;oBAC9D,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBACzC,CAAC,CAAC,WAAW,GAAG,GAAG,GAAG,GAAG,CAAC;oBAC1B,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,eAAe,CAAC;oBAClC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBACzC,2DAA2D;oBAC3D,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,WAAW,CAAC;oBAC/D,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,oCAAoC,CAAC;oBACvD,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACtB,CAAC;YACL,CAAC;QACL,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,WAAW,CAAC,CAAgB;QAChC,MAAM,MAAM,GAA2B;YACnC,cAAc,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS;YACtD,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS;SACjD,CAAC;QACF,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,oCAAoC,CAAC;QAEzD,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,6BAA6B,CAAC;QAEhD,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,SAAS,gBAAgB,CAAC;QAE1E,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,oCAAoC,CAAC;QAE5D,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5B,OAAO,GAAG,CAAC;IACf,CAAC;IAEO,QAAQ,CAAC,CAAgB;QAC7B,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe;YAAE,OAAO,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAChG,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;QACtG,OAAO,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,iEAAiE;IAEjE;;;OAGG;IACK,SAAS,CAAC,MAAc;QAC5B,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAElD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,GAAG,CAAC,EAAE,GAAG,YAAY,CAAC;QACtB,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG;YAChB,gBAAgB,EAAE,QAAQ,IAAI,CAAC,IAAI,IAAI,EAAE,OAAO,IAAI,CAAC,GAAG,IAAI;YAC5D,SAAS,IAAI,CAAC,KAAK,IAAI,EAAE,UAAU,IAAI,CAAC,MAAM,IAAI;YAClD,kCAAkC,EAAE,0BAA0B;YAC9D,qBAAqB,EAAE,oBAAoB;SAC9C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAEO,WAAW,CAAC,MAAc;QAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;QACjF,IAAI,IAAI,GAAmB,IAAI,CAAC;QAChC,IAAI,IAAoB,CAAC;QACzB,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAoB,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,OAAO,MAAM,IAAI,EAAE,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC;gBAAC,SAAS;YAAC,CAAC;YACvD,IAAI,IAAI,IAAI,CAAC,KAAK,OAAO,MAAM,IAAI,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;gBACrC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC1B,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACzB,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,cAAc;QAClB,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACpD,CAAC;CACJ;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAEzC,mEAAmE;AACnE,MAAM,UAAU,oBAAoB;IAChC,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1C,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;QACrC,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;YAC9D,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,SAAS,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { BlockInterface, BlockRenderFactory } from "../contracts/BlockInterface";
|
|
2
|
-
import { InitMode } from "../contracts/common";
|
|
3
|
-
import type { FragmentInterface, HtmlInterface } from "../contracts/ElementInterface";
|
|
4
|
-
import type { ViewControllerInterface } from "../contracts/ViewControllerInterface";
|
|
5
|
-
import type {
|
|
1
|
+
import type { BlockInterface, BlockRenderFactory } from "../contracts/BlockInterface.js";
|
|
2
|
+
import { InitMode } from "../contracts/common.js";
|
|
3
|
+
import type { FragmentInterface, HtmlInterface } from "../contracts/ElementInterface.js";
|
|
4
|
+
import type { ViewControllerInterface } from "../contracts/ViewControllerInterface.js";
|
|
5
|
+
import type { SaoObjectType } from "../types/utils.js";
|
|
6
6
|
/**
|
|
7
7
|
* Block — a named mounting slot used in layout views.
|
|
8
8
|
*
|
|
@@ -22,11 +22,13 @@ import type { OneObjectType } from "../types/utils";
|
|
|
22
22
|
* 4. Browser back → BlockManager restores cached content without re-render
|
|
23
23
|
*/
|
|
24
24
|
export declare class Block implements BlockInterface {
|
|
25
|
-
|
|
25
|
+
saoType: SaoObjectType;
|
|
26
26
|
id: string;
|
|
27
27
|
name: string;
|
|
28
28
|
ctx: ViewControllerInterface;
|
|
29
29
|
viewId: string | null;
|
|
30
|
+
/** Key trả về bởi markerRegistry.register — destroy() dùng để gỡ lại */
|
|
31
|
+
private markerKey;
|
|
30
32
|
fragment: FragmentInterface | null;
|
|
31
33
|
contentRenderFactory: BlockRenderFactory | null;
|
|
32
34
|
openTag: Comment;
|
|
@@ -35,7 +37,7 @@ export declare class Block implements BlockInterface {
|
|
|
35
37
|
initMode?: InitMode | undefined;
|
|
36
38
|
parentElement: HtmlInterface | null;
|
|
37
39
|
readonly isOneBlock = true;
|
|
38
|
-
readonly
|
|
40
|
+
readonly isSaoElement = false;
|
|
39
41
|
constructor({ ctx, name, viewId, contentRenderFactory, id, initMode }: {
|
|
40
42
|
ctx: ViewControllerInterface;
|
|
41
43
|
name: string;
|