@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,7 +1,7 @@
|
|
|
1
|
-
import { InitMode } from "../contracts/common";
|
|
2
|
-
import type { HtmlInterface,
|
|
3
|
-
import type { ViewControllerInterface } from "../contracts/ViewControllerInterface";
|
|
4
|
-
import type {
|
|
1
|
+
import { InitMode } from "../contracts/common.js";
|
|
2
|
+
import type { HtmlInterface, SaoChildrenFactory, SaoElementChildren, WrapperInterface } from "../contracts/ElementInterface.js";
|
|
3
|
+
import type { ViewControllerInterface } from "../contracts/ViewControllerInterface.js";
|
|
4
|
+
import type { SaoObjectType } from "../types/utils.js";
|
|
5
5
|
/**
|
|
6
6
|
* Wrapper — renders multiple root nodes into a parent without a wrapping tag.
|
|
7
7
|
*
|
|
@@ -12,11 +12,11 @@ import type { OneObjectType } from "../types/utils";
|
|
|
12
12
|
* similar to Reactive but without the reactivity overhead.
|
|
13
13
|
*/
|
|
14
14
|
export declare class Wrapper implements WrapperInterface {
|
|
15
|
-
|
|
15
|
+
saoType: SaoObjectType;
|
|
16
16
|
parent: HtmlInterface | null;
|
|
17
17
|
nodes: Node[];
|
|
18
18
|
/** Tracked child element wrappers (Html, Output, Reactive, TextElement, etc.) */
|
|
19
|
-
children:
|
|
19
|
+
children: SaoElementChildren;
|
|
20
20
|
private ctx;
|
|
21
21
|
private childrenFactory;
|
|
22
22
|
openTag: Comment;
|
|
@@ -28,11 +28,20 @@ export declare class Wrapper implements WrapperInterface {
|
|
|
28
28
|
ctx: ViewControllerInterface;
|
|
29
29
|
initMode?: InitMode;
|
|
30
30
|
parentElement?: HtmlInterface | null;
|
|
31
|
-
childrenFactory:
|
|
31
|
+
childrenFactory: SaoChildrenFactory;
|
|
32
32
|
});
|
|
33
|
+
/**
|
|
34
|
+
* Tìm cặp view markers từ server-rendered HTML.
|
|
35
|
+
* Format MarkerRegistry: open = `v:id`, close = `/v:id`.
|
|
36
|
+
* Quét comment nodes trong parent element (fallback document.body).
|
|
37
|
+
*/
|
|
38
|
+
private claimSSRMarkers;
|
|
39
|
+
init(): void;
|
|
33
40
|
setParentElement(parent: HtmlInterface | null): void;
|
|
34
|
-
render():
|
|
35
|
-
|
|
41
|
+
render(): SaoElementChildren;
|
|
42
|
+
appendTo(parent: HtmlInterface): void;
|
|
43
|
+
mountTo(parent: HtmlInterface): void;
|
|
44
|
+
setChildrenFactory(factory: SaoChildrenFactory): void;
|
|
36
45
|
/** Hydrate lifecycle — reattach event listeners or perform other setup */
|
|
37
46
|
hydrate(): void;
|
|
38
47
|
/** Start lifecycle — recursively activate children's reactive subscriptions */
|
|
@@ -41,10 +50,12 @@ export declare class Wrapper implements WrapperInterface {
|
|
|
41
50
|
stop(): void;
|
|
42
51
|
/** Remove all nodes between markers from the DOM */
|
|
43
52
|
clear(): void;
|
|
53
|
+
/** Registry guard — wrapper đã destroy không được reuse (ViewController.wrapper) */
|
|
54
|
+
__destroyed__: boolean;
|
|
44
55
|
destroy(): void;
|
|
45
|
-
get
|
|
46
|
-
set
|
|
47
|
-
get
|
|
48
|
-
set
|
|
56
|
+
get isSaoElement(): boolean;
|
|
57
|
+
set isSaoElement(value: boolean);
|
|
58
|
+
get isSaoFragment(): boolean;
|
|
59
|
+
set isSaoFragment(value: boolean);
|
|
49
60
|
}
|
|
50
61
|
//# sourceMappingURL=Wrapper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Wrapper.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/Wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,
|
|
1
|
+
{"version":3,"file":"Wrapper.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/Wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAiC,aAAa,EAAE,kBAAkB,EAAwC,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACrM,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAKvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvD;;;;;;;;GAQG;AACH,qBAAa,OAAQ,YAAW,gBAAgB;IAC5C,OAAO,EAAE,aAAa,CAAa;IAC5B,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,IAAI,EAAE,CAAM;IAC1B,iFAAiF;IAC1E,QAAQ,EAAE,kBAAkB,CAAM;IACzC,OAAO,CAAC,GAAG,CAA0B;IACrC,OAAO,CAAC,eAAe,CAAqB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,QAAQ,CAAoB;IAE7C,WAAW,EAAE,IAAI,EAAE,CAAM;gBAEb,EACR,GAAG,EACH,QAA2B,EAC3B,aAAoB,EACpB,eAAe,EAClB,EAAE;QACC,GAAG,EAAE,uBAAuB,CAAC;QAC7B,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;QACrC,eAAe,EAAE,kBAAkB,CAAA;KACtC;IA+BD;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAMvB,IAAI;IAKJ,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI;IAGpD,MAAM,IAAI,kBAAkB;IAa5B,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAOrC,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAKpC,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAIrD,0EAA0E;IAE1E,OAAO,IAAI,IAAI;IAQf,+EAA+E;IAC/E,KAAK,IAAI,IAAI;IAQb,gFAAgF;IAChF,IAAI,IAAI,IAAI;IAQZ,oDAAoD;IACpD,KAAK,IAAI,IAAI;IAmBb,oFAAoF;IAC7E,aAAa,EAAE,OAAO,CAAS;IAEtC,OAAO,IAAI,IAAI;IAQf,IAAI,YAAY,IAAI,OAAO,CAE1B;IACD,IAAI,YAAY,CAAC,KAAK,EAAE,OAAO,EAE9B;IAED,IAAI,aAAa,IAAI,OAAO,CAE3B;IACD,IAAI,aAAa,CAAC,KAAK,EAAE,OAAO,EAE/B;CACJ"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import { InitModes } from "../contracts/common";
|
|
1
|
+
import { InitModes } from "../contracts/common.js";
|
|
2
|
+
import { app } from "../helpers/app.js";
|
|
3
|
+
import { mountElementList } from "../helpers/view.js";
|
|
4
|
+
import { TextElement } from "./TextElement.js";
|
|
2
5
|
/**
|
|
3
6
|
* Wrapper — renders multiple root nodes into a parent without a wrapping tag.
|
|
4
7
|
*
|
|
@@ -10,24 +13,77 @@ import { InitModes } from "../contracts/common";
|
|
|
10
13
|
*/
|
|
11
14
|
export class Wrapper {
|
|
12
15
|
constructor({ ctx, initMode = InitModes.CREATE, parentElement = null, childrenFactory }) {
|
|
13
|
-
this.
|
|
16
|
+
this.saoType = 'Wrapper';
|
|
14
17
|
this.nodes = [];
|
|
15
18
|
/** Tracked child element wrappers (Html, Output, Reactive, TextElement, etc.) */
|
|
16
19
|
this.children = [];
|
|
17
20
|
this.initMode = InitModes.CREATE;
|
|
18
21
|
this.domChildren = []; // For compatibility with HtmlInterface; Wrapper itself doesn't have a single root element
|
|
22
|
+
/** Registry guard — wrapper đã destroy không được reuse (ViewController.wrapper) */
|
|
23
|
+
this.__destroyed__ = false;
|
|
19
24
|
this.ctx = ctx;
|
|
20
25
|
this.parent = parentElement;
|
|
21
26
|
this.childrenFactory = childrenFactory;
|
|
22
27
|
this.id = ctx.viewId;
|
|
23
28
|
this.initMode = initMode;
|
|
24
|
-
this.
|
|
25
|
-
|
|
29
|
+
this.init();
|
|
30
|
+
const registry = app("Registry");
|
|
31
|
+
if (this.initMode === InitModes.HYDRATE) {
|
|
32
|
+
// ── Hydrate: tìm view markers SSR trong DOM ─────────────────
|
|
33
|
+
// Format MarkerRegistry: open = `v:id`, close = `/v:id`
|
|
34
|
+
// (v = shortcut cho 'view'). Nếu không có (vd partial hydration
|
|
35
|
+
// khi root element CHÍNH là boundary của view) → tạo markers mới,
|
|
36
|
+
// không cảnh báo vì đây là trường hợp hợp lệ.
|
|
37
|
+
const claimed = this.claimSSRMarkers(registry);
|
|
38
|
+
if (claimed) {
|
|
39
|
+
this.openTag = claimed.open;
|
|
40
|
+
this.closeTag = claimed.close;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
this.openTag = registry.createMarkerStart('view', this.id);
|
|
44
|
+
this.closeTag = registry.createMarkerEnd('view', this.id);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
this.openTag = registry.createMarkerStart('view', this.id);
|
|
49
|
+
this.closeTag = registry.createMarkerEnd('view', this.id);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Tìm cặp view markers từ server-rendered HTML.
|
|
54
|
+
* Format MarkerRegistry: open = `v:id`, close = `/v:id`.
|
|
55
|
+
* Quét comment nodes trong parent element (fallback document.body).
|
|
56
|
+
*/
|
|
57
|
+
claimSSRMarkers(registry) {
|
|
58
|
+
return registry.claim('view', this.id, this.parent?.element ?? null);
|
|
59
|
+
}
|
|
60
|
+
init() {
|
|
26
61
|
}
|
|
27
62
|
setParentElement(parent) {
|
|
28
63
|
this.parent = parent;
|
|
29
64
|
}
|
|
30
65
|
render() {
|
|
66
|
+
this.children = [];
|
|
67
|
+
const children = this.childrenFactory(this.parent);
|
|
68
|
+
this.children = children
|
|
69
|
+
.filter((child) => child !== null && child !== undefined)
|
|
70
|
+
.map((child) => {
|
|
71
|
+
if (typeof child === 'string' || typeof child === 'number') {
|
|
72
|
+
return new TextElement({ ctx: this.ctx, parent: this.parent, stateKeys: [], generateText: () => String(child) });
|
|
73
|
+
}
|
|
74
|
+
return child;
|
|
75
|
+
});
|
|
76
|
+
return this.children;
|
|
77
|
+
}
|
|
78
|
+
appendTo(parent) {
|
|
79
|
+
this.parent = parent;
|
|
80
|
+
this.parent.appendElement(this.openTag);
|
|
81
|
+
mountElementList(this.parent, this.render());
|
|
82
|
+
this.parent.appendElement(this.closeTag);
|
|
83
|
+
}
|
|
84
|
+
mountTo(parent) {
|
|
85
|
+
parent.clearHTML();
|
|
86
|
+
this.appendTo(parent);
|
|
31
87
|
}
|
|
32
88
|
setChildrenFactory(factory) {
|
|
33
89
|
this.childrenFactory = factory;
|
|
@@ -75,21 +131,22 @@ export class Wrapper {
|
|
|
75
131
|
this.nodes = [];
|
|
76
132
|
}
|
|
77
133
|
destroy() {
|
|
134
|
+
this.__destroyed__ = true;
|
|
78
135
|
this.clear();
|
|
79
136
|
this.openTag.remove();
|
|
80
137
|
this.closeTag.remove();
|
|
81
138
|
this.parent = null;
|
|
82
139
|
}
|
|
83
|
-
get
|
|
140
|
+
get isSaoElement() {
|
|
84
141
|
return true;
|
|
85
142
|
}
|
|
86
|
-
set
|
|
143
|
+
set isSaoElement(value) {
|
|
87
144
|
// No-op setter to satisfy the Interface; this property is always true for Fragment elements
|
|
88
145
|
}
|
|
89
|
-
get
|
|
146
|
+
get isSaoFragment() {
|
|
90
147
|
return true;
|
|
91
148
|
}
|
|
92
|
-
set
|
|
149
|
+
set isSaoFragment(value) {
|
|
93
150
|
// No-op setter to satisfy the Interface; this property is always true for Fragment elements
|
|
94
151
|
}
|
|
95
152
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Wrapper.js","sourceRoot":"","sources":["../../../../src/core/elements/Wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"Wrapper.js","sourceRoot":"","sources":["../../../../src/core/elements/Wrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import { InitMode } from "../contracts/common";
|
|
2
|
-
import { HtmlInterface,
|
|
3
|
-
import { ViewControllerInterface } from "../contracts/ViewControllerInterface";
|
|
4
|
-
import {
|
|
1
|
+
import { InitMode } from "../contracts/common.js";
|
|
2
|
+
import { HtmlInterface, YieldInterface } from "../contracts/ElementInterface.js";
|
|
3
|
+
import { ViewControllerInterface } from "../contracts/ViewControllerInterface.js";
|
|
4
|
+
import { SaoObjectType } from "../types/utils.js";
|
|
5
5
|
export declare class YieldElement implements YieldInterface {
|
|
6
|
-
|
|
6
|
+
saoType: SaoObjectType;
|
|
7
7
|
ctx: ViewControllerInterface;
|
|
8
8
|
name: string;
|
|
9
9
|
id: string;
|
|
10
|
-
contentFactory: () => OneChildrenFactoryOutput;
|
|
11
10
|
openTag: Comment;
|
|
12
11
|
closeTag: Comment;
|
|
13
12
|
initMode: InitMode;
|
|
14
13
|
domChildren: Node[];
|
|
15
14
|
parent: HtmlInterface | null;
|
|
16
15
|
defaultValue: string;
|
|
16
|
+
/** Registry guard — thiếu field này thì aliveFromRegistry tái dùng Yield đã destroy */
|
|
17
|
+
__destroyed__: boolean;
|
|
17
18
|
constructor({ ctx, name, initMode, id, defaultValue }: {
|
|
18
19
|
ctx: ViewControllerInterface;
|
|
19
20
|
name: string;
|
|
@@ -23,11 +24,11 @@ export declare class YieldElement implements YieldInterface {
|
|
|
23
24
|
});
|
|
24
25
|
private createMarkers;
|
|
25
26
|
setParentElement(parent: HtmlInterface | null): void;
|
|
26
|
-
|
|
27
|
+
/** Idempotent: markers already in DOM (hydrate claim, or same-layout reuse) → keep as-is. */
|
|
27
28
|
render(): void;
|
|
28
29
|
destroy(): void;
|
|
29
|
-
get
|
|
30
|
-
set
|
|
30
|
+
get isSaoElement(): boolean;
|
|
31
|
+
set isSaoElement(_: boolean);
|
|
31
32
|
get isOneYield(): boolean;
|
|
32
33
|
set isOneYield(_: boolean);
|
|
33
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Yield.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/Yield.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,
|
|
1
|
+
{"version":3,"file":"Yield.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/Yield.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAGlF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,qBAAa,YAAa,YAAW,cAAc;IAC/C,OAAO,EAAE,aAAa,CAAW;IACjC,GAAG,EAAE,uBAAuB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAG,OAAO,CAAC;IAClB,QAAQ,EAAG,OAAO,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAmB;IACrC,WAAW,EAAE,IAAI,EAAE,CAAM;IACzB,MAAM,EAAE,aAAa,GAAG,IAAI,CAAQ;IACpC,YAAY,EAAE,MAAM,CAAM;IAC1B,uFAAuF;IAChF,aAAa,EAAE,OAAO,CAAS;gBAC1B,EAAC,GAAG,EAAE,IAAS,EAAE,QAA2B,EAAE,EAAS,EAAE,YAAiB,EAAC,EAAG;QAAC,GAAG,EAAE,uBAAuB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAC;IA2BtM,OAAO,CAAC,aAAa;IAMrB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI;IAIpD,6FAA6F;IAC7F,MAAM,IAAI,IAAI;IASd,OAAO,IAAI,IAAI;IASf,IAAI,YAAY,IAAI,OAAO,CAAiB;IAC5C,IAAI,YAAY,CAAC,CAAC,EAAE,OAAO,EAAI;IAC/B,IAAI,UAAU,IAAI,OAAO,CAAiB;IAC1C,IAAI,UAAU,CAAC,CAAC,EAAE,OAAO,EAAI;CAChC"}
|
|
@@ -1,41 +1,51 @@
|
|
|
1
|
-
import { InitModes } from "../contracts/common";
|
|
2
|
-
import { generateUUID } from "../
|
|
3
|
-
import
|
|
1
|
+
import { InitModes } from "../contracts/common.js";
|
|
2
|
+
import { generateUUID } from "../helpers/utils.js";
|
|
3
|
+
import markerRegistry from "../services/MarkerRegistry.js";
|
|
4
4
|
export class YieldElement {
|
|
5
5
|
constructor({ ctx, name = '', initMode = InitModes.CREATE, id = null, defaultValue = '' }) {
|
|
6
|
-
this.
|
|
7
|
-
this.contentFactory = () => [];
|
|
6
|
+
this.saoType = "Yield";
|
|
8
7
|
this.initMode = InitModes.CREATE;
|
|
9
8
|
this.domChildren = [];
|
|
10
9
|
this.parent = null;
|
|
11
10
|
this.defaultValue = '';
|
|
11
|
+
/** Registry guard — thiếu field này thì aliveFromRegistry tái dùng Yield đã destroy */
|
|
12
|
+
this.__destroyed__ = false;
|
|
12
13
|
this.ctx = ctx;
|
|
13
14
|
this.name = name;
|
|
14
15
|
this.initMode = initMode;
|
|
15
|
-
|
|
16
|
+
// Marker id đầy đủ = {viewId}-{hash} — khớp quy ước server (HYDRATION.md §5.1),
|
|
17
|
+
// giống Component.ts. Trước đây thiếu prefix viewId → hydrate không tìm đúng marker.
|
|
18
|
+
const rawId = id && id.length > 0 ? id : generateUUID();
|
|
19
|
+
this.id = `${ctx.viewId}-${rawId}`;
|
|
16
20
|
this.defaultValue = defaultValue;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
// Claim marker server qua index O(1) của MarkerRegistry — giống Reactive/
|
|
22
|
+
// Output/Component. Bản cũ duyệt TOÀN BỘ comment của tài liệu cho mỗi @yield.
|
|
23
|
+
const claimed = (this.initMode === InitModes.HYDRATE)
|
|
24
|
+
? markerRegistry.claim('yield', this.id)
|
|
25
|
+
: null;
|
|
26
|
+
if (claimed) {
|
|
27
|
+
this.openTag = claimed.open;
|
|
28
|
+
this.closeTag = claimed.close;
|
|
29
|
+
for (let node = claimed.open.nextSibling; node && node !== claimed.close; node = node.nextSibling) {
|
|
30
|
+
this.domChildren.push(node);
|
|
31
|
+
}
|
|
22
32
|
}
|
|
23
33
|
else {
|
|
24
34
|
this.createMarkers();
|
|
25
35
|
}
|
|
26
36
|
}
|
|
27
37
|
createMarkers() {
|
|
28
|
-
|
|
29
|
-
this.openTag =
|
|
30
|
-
this.closeTag =
|
|
38
|
+
markerRegistry.register('yield', this.id, { name: this.name });
|
|
39
|
+
this.openTag = markerRegistry.createMarkerStart('yield', this.id);
|
|
40
|
+
this.closeTag = markerRegistry.createMarkerEnd('yield', this.id);
|
|
31
41
|
}
|
|
32
42
|
setParentElement(parent) {
|
|
33
43
|
this.parent = parent;
|
|
34
44
|
}
|
|
35
|
-
|
|
36
|
-
this.contentFactory = factory;
|
|
37
|
-
}
|
|
45
|
+
/** Idempotent: markers already in DOM (hydrate claim, or same-layout reuse) → keep as-is. */
|
|
38
46
|
render() {
|
|
47
|
+
if (this.openTag.parentNode)
|
|
48
|
+
return;
|
|
39
49
|
if (!this.parent?.element)
|
|
40
50
|
return;
|
|
41
51
|
const parentEl = this.parent.element;
|
|
@@ -43,13 +53,15 @@ export class YieldElement {
|
|
|
43
53
|
parentEl.appendChild(this.closeTag);
|
|
44
54
|
}
|
|
45
55
|
destroy() {
|
|
56
|
+
this.__destroyed__ = true;
|
|
57
|
+
this.ctx.releaseElement?.(this);
|
|
46
58
|
this.openTag?.remove();
|
|
47
59
|
this.closeTag?.remove();
|
|
48
60
|
this.domChildren = [];
|
|
49
61
|
this.parent = null;
|
|
50
62
|
}
|
|
51
|
-
get
|
|
52
|
-
set
|
|
63
|
+
get isSaoElement() { return true; }
|
|
64
|
+
set isSaoElement(_) { }
|
|
53
65
|
get isOneYield() { return true; }
|
|
54
66
|
set isOneYield(_) { }
|
|
55
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Yield.js","sourceRoot":"","sources":["../../../../src/core/elements/Yield.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"Yield.js","sourceRoot":"","sources":["../../../../src/core/elements/Yield.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { BlockOutletInterface } from "../contracts/BlockInterface";
|
|
2
|
-
import { FragmentInterface, HtmlInterface, OutputInterface,
|
|
3
|
-
import { ReactiveInterface } from "../contracts/ReactiveInterface";
|
|
4
|
-
import { ViewControllerInterface } from "../contracts/ViewControllerInterface";
|
|
5
|
-
import {
|
|
6
|
-
export declare function
|
|
7
|
-
export declare function parseElementChildren(oneElement: HtmlInterface | ReactiveInterface | BlockOutletInterface | OutputInterface | FragmentInterface | ViewControllerInterface, parentElement: HTMLElement, children:
|
|
1
|
+
import { BlockOutletInterface } from "../contracts/BlockInterface.js";
|
|
2
|
+
import { FragmentInterface, HtmlInterface, OutputInterface, SaoChildrenFactoryOutput, SaoElementChildren } from "../contracts/ElementInterface.js";
|
|
3
|
+
import { ReactiveInterface } from "../contracts/ReactiveInterface.js";
|
|
4
|
+
import { ViewControllerInterface } from "../contracts/ViewControllerInterface.js";
|
|
5
|
+
import { SaoObjectType } from "../types/utils.js";
|
|
6
|
+
export declare function getSaoObjectType(instance: any): SaoObjectType | null;
|
|
7
|
+
export declare function parseElementChildren(oneElement: HtmlInterface | ReactiveInterface | BlockOutletInterface | OutputInterface | FragmentInterface | ViewControllerInterface, parentElement: HTMLElement, children: SaoChildrenFactoryOutput): SaoElementChildren;
|
|
8
8
|
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,oBAAoB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACnJ,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,GAAG,aAAa,GAAG,IAAI,CAKpE;AAED,wBAAgB,oBAAoB,CAChC,UAAU,EAAE,aAAa,GAAG,iBAAiB,GAAG,oBAAoB,GAAG,eAAe,GAAG,iBAAiB,GAAG,uBAAuB,EACpI,aAAa,EAAE,WAAW,EAC1B,QAAQ,EAAE,wBAAwB,GACnC,kBAAkB,CAsCpB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export function
|
|
2
|
-
if (instance && typeof instance === 'object' && '
|
|
3
|
-
return instance.
|
|
1
|
+
export function getSaoObjectType(instance) {
|
|
2
|
+
if (instance && typeof instance === 'object' && 'saoType' in instance) {
|
|
3
|
+
return instance.saoType;
|
|
4
4
|
}
|
|
5
5
|
return null;
|
|
6
6
|
}
|
|
@@ -26,7 +26,7 @@ export function parseElementChildren(oneElement, parentElement, children) {
|
|
|
26
26
|
console.warn('Skipping invalid child:', child);
|
|
27
27
|
return;
|
|
28
28
|
}
|
|
29
|
-
let childType =
|
|
29
|
+
let childType = getSaoObjectType(child);
|
|
30
30
|
if (!childType) {
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
export * from "./Block";
|
|
2
|
-
export * from "./BlockOutlet";
|
|
3
|
-
export * from './Component';
|
|
4
|
-
export * from "./ElementManager";
|
|
5
|
-
export * from "./Fragment";
|
|
6
|
-
export * from "./helpers";
|
|
7
|
-
export * from "./Html";
|
|
8
|
-
export * from "./Output";
|
|
9
|
-
export * from './Reactive';
|
|
10
|
-
export * from
|
|
11
|
-
export * from "./
|
|
1
|
+
export * from "./Block.js";
|
|
2
|
+
export * from "./BlockOutlet.js";
|
|
3
|
+
export * from './Component.js';
|
|
4
|
+
export * from "./ElementManager.js";
|
|
5
|
+
export * from "./Fragment.js";
|
|
6
|
+
export * from "./helpers.js";
|
|
7
|
+
export * from "./Html.js";
|
|
8
|
+
export * from "./Output.js";
|
|
9
|
+
export * from './Reactive.js';
|
|
10
|
+
export * from './ForeachSlotCache.js';
|
|
11
|
+
export * from "./TextElement.js";
|
|
12
|
+
export * from "./Yield.js";
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/index.ts"],"names":[],"mappings":"AAeA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/index.ts"],"names":[],"mappings":"AAeA,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
export * from "./Block";
|
|
2
|
-
export * from "./BlockOutlet";
|
|
3
|
-
export * from './Component';
|
|
4
|
-
export * from "./ElementManager";
|
|
5
|
-
export * from "./Fragment";
|
|
6
|
-
export * from "./helpers";
|
|
7
|
-
export * from "./Html";
|
|
8
|
-
export * from "./Output";
|
|
9
|
-
export * from './Reactive';
|
|
10
|
-
export * from
|
|
11
|
-
export * from "./
|
|
1
|
+
export * from "./Block.js";
|
|
2
|
+
export * from "./BlockOutlet.js";
|
|
3
|
+
export * from './Component.js';
|
|
4
|
+
export * from "./ElementManager.js";
|
|
5
|
+
export * from "./Fragment.js";
|
|
6
|
+
export * from "./helpers.js";
|
|
7
|
+
export * from "./Html.js";
|
|
8
|
+
export * from "./Output.js";
|
|
9
|
+
export * from './Reactive.js';
|
|
10
|
+
export * from './ForeachSlotCache.js';
|
|
11
|
+
export * from "./TextElement.js";
|
|
12
|
+
export * from "./Yield.js";
|
|
12
13
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/elements/index.ts"],"names":[],"mappings":"AAeA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/elements/index.ts"],"names":[],"mappings":"AAeA,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Static compiler text has no lifecycle state; retain its existing Text node. */
|
|
2
|
+
export declare function reuseStaticText(previous: readonly any[], next: any[]): any[];
|
|
3
|
+
/** Place an element or marker range without touching nodes already in order. */
|
|
4
|
+
export declare function placeChild(parent: Node, child: any, before: Node | null): Node | null;
|
|
5
|
+
/** Reconcile Saola children by wrapper identity; factories refresh their config. */
|
|
6
|
+
export declare function reconcileChildren(parent: Node, previous: readonly any[], next: readonly any[], anchor?: Node | null, refresh?: (child: any) => boolean): void;
|
|
7
|
+
//# sourceMappingURL=reconcileChildren.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcileChildren.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/reconcileChildren.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,SAAS,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,CAW5E;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAsBrF;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAC7B,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,EAAE,EAC5D,MAAM,GAAE,IAAI,GAAG,IAAW,EAAE,OAAO,GAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAoB,GAC1E,IAAI,CAwBN"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { TextElement } from './TextElement.js';
|
|
2
|
+
/** Static compiler text has no lifecycle state; retain its existing Text node. */
|
|
3
|
+
export function reuseStaticText(previous, next) {
|
|
4
|
+
return next.map((child, index) => {
|
|
5
|
+
const old = previous[index];
|
|
6
|
+
if (old instanceof TextElement && child instanceof TextElement && old !== child
|
|
7
|
+
&& old.isStatic && child.isStatic && !old.__destroyed__) {
|
|
8
|
+
old.replaceStaticText(child.text);
|
|
9
|
+
child.destroy();
|
|
10
|
+
return old;
|
|
11
|
+
}
|
|
12
|
+
return child;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/** Place an element or marker range without touching nodes already in order. */
|
|
16
|
+
export function placeChild(parent, child, before) {
|
|
17
|
+
const first = child instanceof Node ? child : child.element ?? child.openTag;
|
|
18
|
+
const last = child instanceof Node ? child : child.element ?? child.closeTag;
|
|
19
|
+
if (!first || !last)
|
|
20
|
+
return before;
|
|
21
|
+
if (first.parentNode === parent && last.parentNode === parent && last.nextSibling === before)
|
|
22
|
+
return first;
|
|
23
|
+
const nodes = [first];
|
|
24
|
+
if (first !== last) {
|
|
25
|
+
let current = first.nextSibling;
|
|
26
|
+
while (current && current !== last) {
|
|
27
|
+
nodes.push(current);
|
|
28
|
+
current = current.nextSibling;
|
|
29
|
+
}
|
|
30
|
+
nodes.push(last);
|
|
31
|
+
}
|
|
32
|
+
for (const node of nodes) {
|
|
33
|
+
// State-preserving native moves where available; detached/new nodes use
|
|
34
|
+
// normal insertion. Older browsers use the focus restoration below.
|
|
35
|
+
const moveBefore = parent.moveBefore;
|
|
36
|
+
if (typeof moveBefore === 'function' && node.isConnected && parent.isConnected)
|
|
37
|
+
moveBefore.call(parent, node, before);
|
|
38
|
+
else
|
|
39
|
+
parent.insertBefore(node, before);
|
|
40
|
+
}
|
|
41
|
+
return first;
|
|
42
|
+
}
|
|
43
|
+
/** Reconcile Saola children by wrapper identity; factories refresh their config. */
|
|
44
|
+
export function reconcileChildren(parent, previous, next, anchor = null, refresh = () => true) {
|
|
45
|
+
const focused = parent.ownerDocument?.activeElement;
|
|
46
|
+
const containsFocus = focused && parent.contains(focused);
|
|
47
|
+
const selection = containsFocus && 'selectionStart' in focused
|
|
48
|
+
? { start: focused.selectionStart, end: focused.selectionEnd,
|
|
49
|
+
direction: focused.selectionDirection } : null;
|
|
50
|
+
const nextSet = new Set(next);
|
|
51
|
+
const oldSet = new Set(previous);
|
|
52
|
+
for (const child of previous) {
|
|
53
|
+
if (nextSet.has(child))
|
|
54
|
+
continue;
|
|
55
|
+
if (typeof child.destroy === 'function')
|
|
56
|
+
child.destroy();
|
|
57
|
+
else if (child instanceof Node)
|
|
58
|
+
child.parentNode?.removeChild(child);
|
|
59
|
+
}
|
|
60
|
+
let before = anchor;
|
|
61
|
+
for (let i = next.length - 1; i >= 0; i--)
|
|
62
|
+
before = placeChild(parent, next[i], before);
|
|
63
|
+
for (const child of next) {
|
|
64
|
+
if (!oldSet.has(child) || refresh(child))
|
|
65
|
+
child.render?.();
|
|
66
|
+
}
|
|
67
|
+
if (containsFocus && focused.isConnected && parent.ownerDocument?.activeElement !== focused) {
|
|
68
|
+
focused.focus({ preventScroll: true });
|
|
69
|
+
if (selection?.start != null && selection.end != null) {
|
|
70
|
+
focused.setSelectionRange(selection.start, selection.end, selection.direction ?? undefined);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=reconcileChildren.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcileChildren.js","sourceRoot":"","sources":["../../../../src/core/elements/reconcileChildren.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,11 +16,11 @@ export declare function isHTMLElement(value: any): boolean;
|
|
|
16
16
|
export declare function isNode(value: any): boolean;
|
|
17
17
|
export declare function isCommentNode(value: any): boolean;
|
|
18
18
|
export declare function isTextNode(value: any): boolean;
|
|
19
|
-
export declare function
|
|
19
|
+
export declare function isSaoElement(value: any): boolean;
|
|
20
20
|
export declare function isOneHtml(value: any): boolean;
|
|
21
21
|
export declare function isOneText(value: any): boolean;
|
|
22
22
|
export declare function isOneNativeElement(value: any): boolean;
|
|
23
23
|
export declare function isOneReactive(value: any): boolean;
|
|
24
|
-
export declare function
|
|
24
|
+
export declare function isSaoFragment(value: any): boolean;
|
|
25
25
|
export declare function isOneBlock(value: any): boolean;
|
|
26
26
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -72,8 +72,8 @@ export function isCommentNode(value) {
|
|
|
72
72
|
export function isTextNode(value) {
|
|
73
73
|
return value instanceof Text;
|
|
74
74
|
}
|
|
75
|
-
export function
|
|
76
|
-
return value && typeof value === 'object' && '
|
|
75
|
+
export function isSaoElement(value) {
|
|
76
|
+
return value && typeof value === 'object' && 'isSaoElement' in value && value.isSaoElement === true;
|
|
77
77
|
}
|
|
78
78
|
export function isOneHtml(value) {
|
|
79
79
|
return value && typeof value === 'object' && 'isOneHtml' in value && value.isOneHtml === true;
|
|
@@ -87,8 +87,8 @@ export function isOneNativeElement(value) {
|
|
|
87
87
|
export function isOneReactive(value) {
|
|
88
88
|
return value && typeof value === 'object' && 'isOneReactive' in value && value.isOneReactive === true;
|
|
89
89
|
}
|
|
90
|
-
export function
|
|
91
|
-
return value && typeof value === 'object' && '
|
|
90
|
+
export function isSaoFragment(value) {
|
|
91
|
+
return value && typeof value === 'object' && 'isSaoFragment' in value && value.isSaoFragment === true;
|
|
92
92
|
}
|
|
93
93
|
export function isOneBlock(value) {
|
|
94
94
|
return value && typeof value === 'object' && 'isOneBlock' in value && value.isOneBlock === true;
|