@saolabs/client 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -195
- package/dist/index.d.ts +20 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/plugins.d.ts +2 -2
- package/dist/plugins.js +2 -2
- package/dist/src/core/app/Application.d.ts +25 -15
- package/dist/src/core/app/Application.d.ts.map +1 -1
- package/dist/src/core/app/Application.js +55 -18
- package/dist/src/core/app/Application.js.map +1 -1
- package/dist/src/core/bootstrap/app.d.ts +1 -1
- package/dist/src/core/bootstrap/app.d.ts.map +1 -1
- package/dist/src/core/bootstrap/app.js +77 -4
- package/dist/src/core/bootstrap/app.js.map +1 -1
- package/dist/src/core/bootstrap/bundle.d.ts +41 -0
- package/dist/src/core/bootstrap/bundle.d.ts.map +1 -0
- package/dist/src/core/bootstrap/bundle.js +98 -0
- package/dist/src/core/bootstrap/bundle.js.map +1 -0
- package/dist/src/core/bootstrap/providers/ApiServiceProvider.d.ts +1 -1
- package/dist/src/core/bootstrap/providers/ApiServiceProvider.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/ApiServiceProvider.js +3 -3
- package/dist/src/core/bootstrap/providers/ApiServiceProvider.js.map +1 -1
- package/dist/src/core/bootstrap/providers/CoreServiceProvider.d.ts +1 -1
- package/dist/src/core/bootstrap/providers/CoreServiceProvider.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/CoreServiceProvider.js +11 -8
- package/dist/src/core/bootstrap/providers/CoreServiceProvider.js.map +1 -1
- package/dist/src/core/bootstrap/providers/HelperServiceProvider.d.ts +3 -1
- package/dist/src/core/bootstrap/providers/HelperServiceProvider.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/HelperServiceProvider.js +8 -3
- package/dist/src/core/bootstrap/providers/HelperServiceProvider.js.map +1 -1
- package/dist/src/core/bootstrap/providers/RouteServiceProvider.d.ts +2 -1
- package/dist/src/core/bootstrap/providers/RouteServiceProvider.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/RouteServiceProvider.js +14 -4
- package/dist/src/core/bootstrap/providers/RouteServiceProvider.js.map +1 -1
- package/dist/src/core/bootstrap/providers/ServiceProvider.d.ts +4 -4
- package/dist/src/core/bootstrap/providers/ServiceProvider.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/ServiceProvider.js +5 -5
- package/dist/src/core/bootstrap/providers/ServiceProvider.js.map +1 -1
- package/dist/src/core/bootstrap/providers/ViewServiceProvider.d.ts +1 -1
- package/dist/src/core/bootstrap/providers/ViewServiceProvider.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/ViewServiceProvider.js +3 -3
- package/dist/src/core/bootstrap/providers/ViewServiceProvider.js.map +1 -1
- package/dist/src/core/bootstrap/providers/default-providers.d.ts +1 -1
- package/dist/src/core/bootstrap/providers/default-providers.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/default-providers.js +44 -11
- package/dist/src/core/bootstrap/providers/default-providers.js.map +1 -1
- package/dist/src/core/bootstrap/providers/index.d.ts +9 -9
- package/dist/src/core/bootstrap/providers/index.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/index.js +8 -8
- package/dist/src/core/bootstrap/providers/index.js.map +1 -1
- package/dist/src/core/bootstrap/providers/provider-order.d.ts +1 -1
- package/dist/src/core/bootstrap/providers/provider-order.d.ts.map +1 -1
- package/dist/src/core/bootstrap/ssr.d.ts +47 -0
- package/dist/src/core/bootstrap/ssr.d.ts.map +1 -0
- package/dist/src/core/bootstrap/ssr.js +129 -0
- package/dist/src/core/bootstrap/ssr.js.map +1 -0
- package/dist/src/core/cache/ViewCache.d.ts +1 -1
- package/dist/src/core/cache/ViewCache.d.ts.map +1 -1
- package/dist/src/core/cache/index.d.ts +1 -1
- package/dist/src/core/cache/index.d.ts.map +1 -1
- package/dist/src/core/cache/index.js +1 -1
- package/dist/src/core/cache/index.js.map +1 -1
- package/dist/src/core/contracts/ApplicationInterface.d.ts +15 -11
- package/dist/src/core/contracts/ApplicationInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/BlockInterface.d.ts +10 -10
- package/dist/src/core/contracts/BlockInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/BundleInterface.d.ts +38 -0
- package/dist/src/core/contracts/BundleInterface.d.ts.map +1 -0
- package/dist/src/core/contracts/BundleInterface.js +2 -0
- package/dist/src/core/contracts/BundleInterface.js.map +1 -0
- package/dist/src/core/contracts/ComponentInterface.d.ts +7 -6
- package/dist/src/core/contracts/ComponentInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/ElementInterface.d.ts +91 -27
- package/dist/src/core/contracts/ElementInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/HeadServiceInterface.d.ts +37 -0
- package/dist/src/core/contracts/HeadServiceInterface.d.ts.map +1 -0
- package/dist/src/core/contracts/HeadServiceInterface.js +3 -0
- package/dist/src/core/contracts/HeadServiceInterface.js.map +1 -0
- package/dist/src/core/contracts/HelperInterface.d.ts +9 -1
- package/dist/src/core/contracts/HelperInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/HttpServiceInterface.d.ts +3 -0
- package/dist/src/core/contracts/HttpServiceInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/MarkerInterface.d.ts +29 -44
- package/dist/src/core/contracts/MarkerInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/ReactiveInterface.d.ts +9 -9
- package/dist/src/core/contracts/ReactiveInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/RouterInterface.d.ts +5 -2
- package/dist/src/core/contracts/RouterInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/SectionInterface.d.ts +48 -0
- package/dist/src/core/contracts/SectionInterface.d.ts.map +1 -0
- package/dist/src/core/contracts/SectionInterface.js +2 -0
- package/dist/src/core/contracts/SectionInterface.js.map +1 -0
- package/dist/src/core/contracts/ServiceProviderInterface.d.ts +3 -3
- package/dist/src/core/contracts/ServiceProviderInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/ViewControllerInterface.d.ts +116 -15
- package/dist/src/core/contracts/ViewControllerInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/ViewInterface.d.ts +31 -5
- package/dist/src/core/contracts/ViewInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/ViewManagerInterface.d.ts +47 -5
- package/dist/src/core/contracts/ViewManagerInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/ViewStateInterface.d.ts +39 -2
- package/dist/src/core/contracts/ViewStateInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/common.d.ts +3 -3
- package/dist/src/core/contracts/common.js +3 -3
- package/dist/src/core/contracts/utils.d.ts +19 -19
- package/dist/src/core/contracts/utils.d.ts.map +1 -1
- package/dist/src/core/contracts/views.d.ts +1 -22
- package/dist/src/core/contracts/views.d.ts.map +1 -1
- package/dist/src/core/devtools/hook.d.ts +66 -0
- package/dist/src/core/devtools/hook.d.ts.map +1 -0
- package/dist/src/core/devtools/hook.js +114 -0
- package/dist/src/core/devtools/hook.js.map +1 -0
- package/dist/src/core/devtools/index.d.ts +34 -0
- package/dist/src/core/devtools/index.d.ts.map +1 -0
- package/dist/src/core/devtools/index.js +33 -0
- package/dist/src/core/devtools/index.js.map +1 -0
- package/dist/src/core/devtools/inspector.d.ts +31 -0
- package/dist/src/core/devtools/inspector.d.ts.map +1 -0
- package/dist/src/core/devtools/inspector.js +249 -0
- package/dist/src/core/devtools/inspector.js.map +1 -0
- package/dist/src/core/elements/Block.d.ts +9 -7
- package/dist/src/core/elements/Block.d.ts.map +1 -1
- package/dist/src/core/elements/Block.js +33 -9
- package/dist/src/core/elements/Block.js.map +1 -1
- package/dist/src/core/elements/BlockOutlet.d.ts +19 -8
- package/dist/src/core/elements/BlockOutlet.d.ts.map +1 -1
- package/dist/src/core/elements/BlockOutlet.js +57 -13
- package/dist/src/core/elements/BlockOutlet.js.map +1 -1
- package/dist/src/core/elements/Component.d.ts +83 -11
- package/dist/src/core/elements/Component.d.ts.map +1 -1
- package/dist/src/core/elements/Component.js +334 -13
- package/dist/src/core/elements/Component.js.map +1 -1
- package/dist/src/core/elements/ForeachSlotCache.d.ts +95 -0
- package/dist/src/core/elements/ForeachSlotCache.d.ts.map +1 -0
- package/dist/src/core/elements/ForeachSlotCache.js +149 -0
- package/dist/src/core/elements/ForeachSlotCache.js.map +1 -0
- package/dist/src/core/elements/Fragment.d.ts +19 -13
- package/dist/src/core/elements/Fragment.d.ts.map +1 -1
- package/dist/src/core/elements/Fragment.js +43 -20
- package/dist/src/core/elements/Fragment.js.map +1 -1
- package/dist/src/core/elements/Html.d.ts +89 -12
- package/dist/src/core/elements/Html.d.ts.map +1 -1
- package/dist/src/core/elements/Html.js +707 -106
- package/dist/src/core/elements/Html.js.map +1 -1
- package/dist/src/core/elements/Output.d.ts +34 -10
- package/dist/src/core/elements/Output.d.ts.map +1 -1
- package/dist/src/core/elements/Output.js +141 -26
- package/dist/src/core/elements/Output.js.map +1 -1
- package/dist/src/core/elements/Reactive.d.ts +85 -14
- package/dist/src/core/elements/Reactive.d.ts.map +1 -1
- package/dist/src/core/elements/Reactive.js +315 -41
- package/dist/src/core/elements/Reactive.js.map +1 -1
- package/dist/src/core/elements/TextElement.d.ts +11 -7
- package/dist/src/core/elements/TextElement.d.ts.map +1 -1
- package/dist/src/core/elements/TextElement.js +18 -11
- package/dist/src/core/elements/TextElement.js.map +1 -1
- package/dist/src/core/elements/Wrapper.d.ts +24 -13
- package/dist/src/core/elements/Wrapper.d.ts.map +1 -1
- package/dist/src/core/elements/Wrapper.js +65 -8
- package/dist/src/core/elements/Wrapper.js.map +1 -1
- package/dist/src/core/elements/Yield.d.ts +10 -9
- package/dist/src/core/elements/Yield.d.ts.map +1 -1
- package/dist/src/core/elements/Yield.js +31 -19
- package/dist/src/core/elements/Yield.js.map +1 -1
- package/dist/src/core/elements/helpers.d.ts +7 -7
- package/dist/src/core/elements/helpers.d.ts.map +1 -1
- package/dist/src/core/elements/helpers.js +4 -4
- package/dist/src/core/elements/index.d.ts +12 -11
- package/dist/src/core/elements/index.d.ts.map +1 -1
- package/dist/src/core/elements/index.js +12 -11
- package/dist/src/core/elements/index.js.map +1 -1
- package/dist/src/core/elements/reconcileChildren.d.ts +7 -0
- package/dist/src/core/elements/reconcileChildren.d.ts.map +1 -0
- package/dist/src/core/elements/reconcileChildren.js +74 -0
- package/dist/src/core/elements/reconcileChildren.js.map +1 -0
- package/dist/src/core/helpers/ApiClient.d.ts.map +1 -0
- package/dist/src/core/{hellpers → helpers}/ApiClient.js +10 -1
- package/dist/src/core/helpers/ApiClient.js.map +1 -0
- package/dist/src/core/helpers/app.d.ts +3 -0
- package/dist/src/core/helpers/app.d.ts.map +1 -0
- package/dist/src/core/{hellpers → helpers}/app.js +11 -1
- package/dist/src/core/helpers/app.js.map +1 -0
- package/dist/src/core/helpers/transition.d.ts +34 -0
- package/dist/src/core/helpers/transition.d.ts.map +1 -0
- package/dist/src/core/helpers/transition.js +118 -0
- package/dist/src/core/helpers/transition.js.map +1 -0
- package/dist/src/core/{hellpers → helpers}/utils.d.ts +2 -2
- package/dist/src/core/helpers/utils.d.ts.map +1 -0
- package/dist/src/core/{hellpers → helpers}/utils.js +4 -4
- package/dist/src/core/helpers/utils.js.map +1 -0
- package/dist/src/core/helpers/view.d.ts +39 -0
- package/dist/src/core/helpers/view.d.ts.map +1 -0
- package/dist/src/core/helpers/view.js +286 -0
- package/dist/src/core/helpers/view.js.map +1 -0
- package/dist/src/core/routers/Router.d.ts +108 -7
- package/dist/src/core/routers/Router.d.ts.map +1 -1
- package/dist/src/core/routers/Router.js +444 -68
- package/dist/src/core/routers/Router.js.map +1 -1
- package/dist/src/core/routers/index.d.ts +2 -2
- package/dist/src/core/routers/index.d.ts.map +1 -1
- package/dist/src/core/routers/index.js +1 -1
- package/dist/src/core/routers/index.js.map +1 -1
- package/dist/src/core/services/AssetManager.d.ts +112 -0
- package/dist/src/core/services/AssetManager.d.ts.map +1 -0
- package/dist/src/core/services/AssetManager.js +361 -0
- package/dist/src/core/services/AssetManager.js.map +1 -0
- package/dist/src/core/services/BlockManager.d.ts +73 -2
- package/dist/src/core/services/BlockManager.d.ts.map +1 -1
- package/dist/src/core/services/BlockManager.js +270 -48
- package/dist/src/core/services/BlockManager.js.map +1 -1
- package/dist/src/core/services/DomService.js +3 -3
- package/dist/src/core/services/DomService.js.map +1 -1
- package/dist/src/core/services/HeadService.d.ts +24 -0
- package/dist/src/core/services/HeadService.d.ts.map +1 -0
- package/dist/src/core/services/HeadService.js +120 -0
- package/dist/src/core/services/HeadService.js.map +1 -0
- package/dist/src/core/services/HelperService.d.ts +14 -3
- package/dist/src/core/services/HelperService.d.ts.map +1 -1
- package/dist/src/core/services/HelperService.js +32 -2
- package/dist/src/core/services/HelperService.js.map +1 -1
- package/dist/src/core/services/HttpService.d.ts +8 -0
- package/dist/src/core/services/HttpService.d.ts.map +1 -1
- package/dist/src/core/services/HttpService.js +121 -47
- package/dist/src/core/services/HttpService.js.map +1 -1
- package/dist/src/core/services/MarkerRegistry.d.ts +51 -8
- package/dist/src/core/services/MarkerRegistry.d.ts.map +1 -1
- package/dist/src/core/services/MarkerRegistry.js +135 -14
- package/dist/src/core/services/MarkerRegistry.js.map +1 -1
- package/dist/src/core/services/PageCache.d.ts +101 -0
- package/dist/src/core/services/PageCache.d.ts.map +1 -0
- package/dist/src/core/services/PageCache.js +184 -0
- package/dist/src/core/services/PageCache.js.map +1 -0
- package/dist/src/core/services/SectionManager.d.ts +100 -0
- package/dist/src/core/services/SectionManager.d.ts.map +1 -0
- package/dist/src/core/services/SectionManager.js +408 -0
- package/dist/src/core/services/SectionManager.js.map +1 -0
- package/dist/src/core/services/StorageService.js +1 -1
- package/dist/src/core/services/TranslationService.d.ts +21 -0
- package/dist/src/core/services/TranslationService.d.ts.map +1 -0
- package/dist/src/core/services/TranslationService.js +95 -0
- package/dist/src/core/services/TranslationService.js.map +1 -0
- package/dist/src/core/services/index.d.ts +11 -8
- package/dist/src/core/services/index.d.ts.map +1 -1
- package/dist/src/core/services/index.js +11 -8
- package/dist/src/core/services/index.js.map +1 -1
- package/dist/src/core/types/utils.d.ts +8 -8
- package/dist/src/core/types/utils.d.ts.map +1 -1
- package/dist/src/core/view/LoopContext.d.ts +21 -1
- package/dist/src/core/view/LoopContext.d.ts.map +1 -1
- package/dist/src/core/view/LoopContext.js +36 -0
- package/dist/src/core/view/LoopContext.js.map +1 -1
- package/dist/src/core/view/ResourceScope.d.ts +38 -0
- package/dist/src/core/view/ResourceScope.d.ts.map +1 -0
- package/dist/src/core/view/ResourceScope.js +167 -0
- package/dist/src/core/view/ResourceScope.js.map +1 -0
- package/dist/src/core/view/Section.d.ts +17 -32
- package/dist/src/core/view/Section.d.ts.map +1 -1
- package/dist/src/core/view/Section.js +14 -55
- package/dist/src/core/view/Section.js.map +1 -1
- package/dist/src/core/view/View.d.ts +43 -7
- package/dist/src/core/view/View.d.ts.map +1 -1
- package/dist/src/core/view/View.js +22 -4
- package/dist/src/core/view/View.js.map +1 -1
- package/dist/src/core/view/ViewController.d.ts +313 -40
- package/dist/src/core/view/ViewController.d.ts.map +1 -1
- package/dist/src/core/view/ViewController.js +1002 -147
- package/dist/src/core/view/ViewController.js.map +1 -1
- package/dist/src/core/view/ViewManager.d.ts +318 -27
- package/dist/src/core/view/ViewManager.d.ts.map +1 -1
- package/dist/src/core/view/ViewManager.js +1199 -258
- package/dist/src/core/view/ViewManager.js.map +1 -1
- package/dist/src/core/view/ViewState.d.ts +185 -6
- package/dist/src/core/view/ViewState.d.ts.map +1 -1
- package/dist/src/core/view/ViewState.js +851 -123
- package/dist/src/core/view/ViewState.js.map +1 -1
- package/dist/src/core/view/index.d.ts +5 -5
- package/dist/src/core/view/index.d.ts.map +1 -1
- package/dist/src/core/view/index.js +5 -5
- package/dist/src/core/view/index.js.map +1 -1
- package/dist/src/testing/index.d.ts +69 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +140 -0
- package/dist/src/testing/index.js.map +1 -0
- package/index.ts +29 -5
- package/package.json +30 -21
- package/plugins.ts +2 -2
- package/src/core/app/Application.ts +72 -31
- package/src/core/bootstrap/app.ts +84 -6
- package/src/core/bootstrap/bundle.ts +101 -0
- package/src/core/bootstrap/providers/ApiServiceProvider.ts +4 -4
- package/src/core/bootstrap/providers/CoreServiceProvider.ts +14 -8
- package/src/core/bootstrap/providers/HelperServiceProvider.ts +8 -3
- package/src/core/bootstrap/providers/RouteServiceProvider.ts +15 -4
- package/src/core/bootstrap/providers/ServiceProvider.ts +8 -8
- package/src/core/bootstrap/providers/ViewServiceProvider.ts +3 -3
- package/src/core/bootstrap/providers/default-providers.ts +51 -16
- package/src/core/bootstrap/providers/index.ts +9 -9
- package/src/core/bootstrap/providers/provider-order.test.ts +16 -27
- package/src/core/bootstrap/providers/provider-order.ts +1 -1
- package/src/core/bootstrap/ssr.ts +141 -0
- package/src/core/cache/ViewCache.ts +1 -1
- package/src/core/cache/index.ts +1 -1
- package/src/core/contracts/ApplicationInterface.ts +15 -11
- package/src/core/contracts/BlockInterface.ts +18 -18
- package/src/core/contracts/BundleInterface.ts +40 -0
- package/src/core/contracts/ComponentInterface.ts +7 -6
- package/src/core/contracts/ElementInterface.ts +95 -27
- package/src/core/contracts/HeadServiceInterface.ts +41 -0
- package/src/core/contracts/HelperInterface.ts +9 -1
- package/src/core/contracts/HttpServiceInterface.ts +3 -0
- package/src/core/contracts/MarkerInterface.ts +22 -49
- package/src/core/contracts/ReactiveInterface.ts +9 -9
- package/src/core/contracts/RouterInterface.ts +5 -2
- package/src/core/contracts/SectionInterface.ts +49 -0
- package/src/core/contracts/ServiceProviderInterface.ts +3 -3
- package/src/core/contracts/ViewControllerInterface.ts +124 -16
- package/src/core/contracts/ViewInterface.ts +34 -5
- package/src/core/contracts/ViewManagerInterface.ts +40 -5
- package/src/core/contracts/ViewStateInterface.ts +39 -2
- package/src/core/contracts/common.ts +3 -3
- package/src/core/contracts/utils.ts +19 -19
- package/src/core/contracts/views.ts +2 -22
- package/src/core/devtools/hook.ts +142 -0
- package/src/core/devtools/index.ts +38 -0
- package/src/core/devtools/inspector.ts +270 -0
- package/src/core/elements/Block.ts +43 -21
- package/src/core/elements/BlockOutlet.ts +61 -21
- package/src/core/elements/Component.ts +352 -18
- package/src/core/elements/ElementManager.ts +9 -9
- package/src/core/elements/ForeachSlotCache.ts +170 -0
- package/src/core/elements/Fragment.ts +50 -32
- package/src/core/elements/Html.ts +696 -117
- package/src/core/elements/Output.ts +147 -30
- package/src/core/elements/Reactive.ts +329 -52
- package/src/core/elements/TextElement.ts +25 -16
- package/src/core/elements/Wrapper.ts +84 -18
- package/src/core/elements/Yield.ts +35 -24
- package/src/core/elements/helpers.ts +12 -12
- package/src/core/elements/index.ts +25 -24
- package/src/core/elements/reconcileChildren.ts +70 -0
- package/src/core/{hellpers → helpers}/ApiClient.ts +8 -1
- package/src/core/{hellpers → helpers}/app.ts +13 -2
- package/src/core/helpers/transition.ts +127 -0
- package/src/core/{hellpers → helpers}/utils.ts +4 -4
- package/src/core/helpers/view.ts +283 -0
- package/src/core/routers/Router.ts +458 -64
- package/src/core/routers/index.ts +2 -2
- package/src/core/services/AssetManager.ts +387 -0
- package/src/core/services/BlockManager.ts +272 -50
- package/src/core/services/DomService.ts +3 -3
- package/src/core/services/HeadService.ts +124 -0
- package/src/core/services/HelperService.ts +34 -4
- package/src/core/services/HttpService.ts +116 -55
- package/src/core/services/MarkerRegistry.ts +142 -16
- package/src/core/services/PageCache.ts +239 -0
- package/src/core/services/SectionManager.ts +387 -0
- package/src/core/services/StorageService.ts +1 -1
- package/src/core/services/TranslationService.ts +91 -0
- package/src/core/services/index.ts +11 -8
- package/src/core/types/utils.ts +8 -8
- package/src/core/view/LoopContext.ts +38 -1
- package/src/core/view/ResourceScope.ts +174 -0
- package/src/core/view/Section.ts +21 -68
- package/src/core/view/View.ts +57 -8
- package/src/core/view/ViewController.ts +1070 -186
- package/src/core/view/ViewManager.ts +1346 -272
- package/src/core/view/ViewState.ts +834 -116
- package/src/core/view/index.ts +5 -5
- package/src/testing/index.ts +184 -0
- package/dist/src/core/hellpers/ApiClient.d.ts.map +0 -1
- package/dist/src/core/hellpers/ApiClient.js.map +0 -1
- package/dist/src/core/hellpers/app.d.ts +0 -3
- package/dist/src/core/hellpers/app.d.ts.map +0 -1
- package/dist/src/core/hellpers/app.js.map +0 -1
- package/dist/src/core/hellpers/utils.d.ts.map +0 -1
- package/dist/src/core/hellpers/utils.js.map +0 -1
- package/dist/src/core/services/MarkerService.d.ts +0 -299
- package/dist/src/core/services/MarkerService.d.ts.map +0 -1
- package/dist/src/core/services/MarkerService.js +0 -723
- package/dist/src/core/services/MarkerService.js.map +0 -1
- package/src/core/services/MarkerService.ts +0 -923
- /package/dist/src/core/{hellpers → helpers}/ApiClient.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ForeachSlotCache.js","sourceRoot":"","sources":["../../../../src/core/elements/ForeachSlotCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { InitMode } from "../contracts/common";
|
|
2
|
-
import type { FragmentInterface, HtmlInterface,
|
|
3
|
-
import type { ViewControllerInterface } from "../contracts/ViewControllerInterface";
|
|
4
|
-
import type {
|
|
1
|
+
import { InitMode } from "../contracts/common.js";
|
|
2
|
+
import type { FragmentInterface, HtmlInterface, SaoChildrenFactory, SaoElementChildren } from "../contracts/ElementInterface.js";
|
|
3
|
+
import type { ViewControllerInterface } from "../contracts/ViewControllerInterface.js";
|
|
4
|
+
import type { SaoObjectType } from "../types/utils.js";
|
|
5
5
|
/**
|
|
6
6
|
* Fragment — 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 Fragment implements FragmentInterface {
|
|
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;
|
|
@@ -29,11 +29,17 @@ export declare class Fragment implements FragmentInterface {
|
|
|
29
29
|
id?: string | null;
|
|
30
30
|
initMode?: InitMode;
|
|
31
31
|
parentElement?: HtmlInterface | null;
|
|
32
|
-
childrenFactory:
|
|
32
|
+
childrenFactory: SaoChildrenFactory;
|
|
33
33
|
});
|
|
34
34
|
setParentElement(parent: HtmlInterface | null): void;
|
|
35
|
+
/** Registry guard — element đã destroy không được reuse */
|
|
36
|
+
__destroyed__: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Render — idempotent + position-aware (RUNTIME_CONTRACT.md §2),
|
|
39
|
+
* cùng pattern với Reactive.render().
|
|
40
|
+
*/
|
|
35
41
|
render(): void;
|
|
36
|
-
setChildrenFactory(factory:
|
|
42
|
+
setChildrenFactory(factory: SaoChildrenFactory): void;
|
|
37
43
|
/** Hydrate lifecycle — reattach event listeners or perform other setup */
|
|
38
44
|
hydrate(): void;
|
|
39
45
|
/** Start lifecycle — recursively activate children's reactive subscriptions */
|
|
@@ -41,11 +47,11 @@ export declare class Fragment implements FragmentInterface {
|
|
|
41
47
|
/** Stop lifecycle — recursively deactivate children's reactive subscriptions */
|
|
42
48
|
stop(): void;
|
|
43
49
|
/** Remove all nodes between markers from the DOM */
|
|
44
|
-
clear(): void;
|
|
50
|
+
clear(_destroyChildren?: boolean): void;
|
|
45
51
|
destroy(): void;
|
|
46
|
-
get
|
|
47
|
-
set
|
|
48
|
-
get
|
|
49
|
-
set
|
|
52
|
+
get isSaoElement(): boolean;
|
|
53
|
+
set isSaoElement(value: boolean);
|
|
54
|
+
get isSaoFragment(): boolean;
|
|
55
|
+
set isSaoFragment(value: boolean);
|
|
50
56
|
}
|
|
51
57
|
//# sourceMappingURL=Fragment.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Fragment.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/Fragment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,
|
|
1
|
+
{"version":3,"file":"Fragment.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/Fragment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,kBAAkB,EAA4B,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAC3J,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAEvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;;;GAQG;AACH,qBAAa,QAAS,YAAW,iBAAiB;IAC9C,OAAO,EAAE,aAAa,CAAc;IAC7B,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,EAAS,EACT,QAA2B,EAC3B,aAAoB,EACpB,eAAe,EAClB,EAAE;QACC,GAAG,EAAE,uBAAuB,CAAC;QAC7B,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;QACrC,eAAe,EAAE,kBAAkB,CAAA;KACtC;IASD,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI;IAGpD,2DAA2D;IACpD,aAAa,EAAE,OAAO,CAAS;IAEtC;;;OAGG;IACH,MAAM,IAAI,IAAI;IAkDd,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,CAAC,gBAAgB,GAAE,OAAc,GAAG,IAAI;IAmB7C,OAAO,IAAI,IAAI;IASf,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,5 +1,5 @@
|
|
|
1
|
-
import { InitModes } from "../contracts/common";
|
|
2
|
-
import { generateUUID } from "../
|
|
1
|
+
import { InitModes } from "../contracts/common.js";
|
|
2
|
+
import { generateUUID } from "../helpers/utils.js";
|
|
3
3
|
/**
|
|
4
4
|
* Fragment — renders multiple root nodes into a parent without a wrapping tag.
|
|
5
5
|
*
|
|
@@ -11,12 +11,14 @@ import { generateUUID } from "../hellpers/utils";
|
|
|
11
11
|
*/
|
|
12
12
|
export class Fragment {
|
|
13
13
|
constructor({ ctx, id = null, initMode = InitModes.CREATE, parentElement = null, childrenFactory }) {
|
|
14
|
-
this.
|
|
14
|
+
this.saoType = 'Fragment';
|
|
15
15
|
this.nodes = [];
|
|
16
16
|
/** Tracked child element wrappers (Html, Output, Reactive, TextElement, etc.) */
|
|
17
17
|
this.children = [];
|
|
18
18
|
this.initMode = InitModes.CREATE;
|
|
19
19
|
this.domChildren = []; // For compatibility with HtmlInterface; Fragment itself doesn't have a single root element
|
|
20
|
+
/** Registry guard — element đã destroy không được reuse */
|
|
21
|
+
this.__destroyed__ = false;
|
|
20
22
|
this.ctx = ctx;
|
|
21
23
|
this.parent = parentElement;
|
|
22
24
|
this.childrenFactory = childrenFactory;
|
|
@@ -28,43 +30,62 @@ export class Fragment {
|
|
|
28
30
|
setParentElement(parent) {
|
|
29
31
|
this.parent = parent;
|
|
30
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Render — idempotent + position-aware (RUNTIME_CONTRACT.md §2),
|
|
35
|
+
* cùng pattern với Reactive.render().
|
|
36
|
+
*/
|
|
31
37
|
render() {
|
|
32
|
-
if (
|
|
38
|
+
if (this.__destroyed__)
|
|
33
39
|
return;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
if (!this.openTag.parentNode) {
|
|
41
|
+
if (!this.parent || !this.parent.element)
|
|
42
|
+
return;
|
|
43
|
+
const parentEl = this.parent.element;
|
|
44
|
+
parentEl.appendChild(this.openTag);
|
|
45
|
+
parentEl.appendChild(this.closeTag);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
this.clear(false);
|
|
49
|
+
}
|
|
37
50
|
// Build children — compiled output uses (parentElement) => [...] signature
|
|
38
51
|
const output = this.childrenFactory(this.parent);
|
|
52
|
+
const insertBeforeClose = (node) => {
|
|
53
|
+
this.closeTag.parentNode?.insertBefore(node, this.closeTag);
|
|
54
|
+
};
|
|
39
55
|
for (const child of output) {
|
|
56
|
+
if (child === null || child === undefined)
|
|
57
|
+
continue;
|
|
40
58
|
if (typeof child === 'string' || typeof child === 'number') {
|
|
41
59
|
const textNode = document.createTextNode(String(child));
|
|
42
|
-
|
|
60
|
+
insertBeforeClose(textNode);
|
|
43
61
|
this.nodes.push(textNode);
|
|
44
62
|
}
|
|
45
|
-
else if (child
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
63
|
+
else if (child instanceof Node) {
|
|
64
|
+
insertBeforeClose(child);
|
|
65
|
+
this.nodes.push(child);
|
|
66
|
+
}
|
|
67
|
+
else if (typeof child === 'object') {
|
|
68
|
+
if ('element' in child && child.element) {
|
|
69
|
+
insertBeforeClose(child.element);
|
|
49
70
|
this.nodes.push(child.element);
|
|
50
71
|
this.children.push(child);
|
|
51
72
|
child.render();
|
|
52
73
|
}
|
|
53
74
|
else if ('openTag' in child) {
|
|
54
|
-
//
|
|
75
|
+
// Marker-based: đặt markers đúng vị trí trước, render sau
|
|
55
76
|
if ('parent' in child) {
|
|
56
77
|
child.parent = this.parent;
|
|
57
78
|
}
|
|
58
79
|
if ('parentElement' in child) {
|
|
59
80
|
child.parentElement = this.parent;
|
|
60
81
|
}
|
|
82
|
+
insertBeforeClose(child.openTag);
|
|
83
|
+
insertBeforeClose(child.closeTag);
|
|
61
84
|
this.children.push(child);
|
|
62
85
|
child.render();
|
|
63
86
|
}
|
|
64
87
|
}
|
|
65
88
|
}
|
|
66
|
-
// Place end marker
|
|
67
|
-
parentEl.appendChild(this.closeTag);
|
|
68
89
|
}
|
|
69
90
|
setChildrenFactory(factory) {
|
|
70
91
|
this.childrenFactory = factory;
|
|
@@ -94,7 +115,7 @@ export class Fragment {
|
|
|
94
115
|
}
|
|
95
116
|
}
|
|
96
117
|
/** Remove all nodes between markers from the DOM */
|
|
97
|
-
clear() {
|
|
118
|
+
clear(_destroyChildren = true) {
|
|
98
119
|
// Destroy managed children first
|
|
99
120
|
for (const child of this.children) {
|
|
100
121
|
if ('destroy' in child && typeof child.destroy === 'function') {
|
|
@@ -112,21 +133,23 @@ export class Fragment {
|
|
|
112
133
|
this.nodes = [];
|
|
113
134
|
}
|
|
114
135
|
destroy() {
|
|
136
|
+
this.__destroyed__ = true;
|
|
137
|
+
this.ctx.releaseElement?.(this);
|
|
115
138
|
this.clear();
|
|
116
139
|
this.openTag.remove();
|
|
117
140
|
this.closeTag.remove();
|
|
118
141
|
this.parent = null;
|
|
119
142
|
}
|
|
120
|
-
get
|
|
143
|
+
get isSaoElement() {
|
|
121
144
|
return true;
|
|
122
145
|
}
|
|
123
|
-
set
|
|
146
|
+
set isSaoElement(value) {
|
|
124
147
|
// No-op setter to satisfy the Interface; this property is always true for Fragment elements
|
|
125
148
|
}
|
|
126
|
-
get
|
|
149
|
+
get isSaoFragment() {
|
|
127
150
|
return true;
|
|
128
151
|
}
|
|
129
|
-
set
|
|
152
|
+
set isSaoFragment(value) {
|
|
130
153
|
// No-op setter to satisfy the Interface; this property is always true for Fragment elements
|
|
131
154
|
}
|
|
132
155
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Fragment.js","sourceRoot":"","sources":["../../../../src/core/elements/Fragment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"Fragment.js","sourceRoot":"","sources":["../../../../src/core/elements/Fragment.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { InitMode } from "../contracts/common";
|
|
2
|
-
import type { HtmlInterface,
|
|
3
|
-
import type { ViewControllerInterface } from "../contracts/ViewControllerInterface";
|
|
4
|
-
import type { ViewManagerInterface } from "../contracts/ViewManagerInterface";
|
|
5
|
-
import type {
|
|
1
|
+
import { InitMode } from "../contracts/common.js";
|
|
2
|
+
import type { HtmlInterface, SaoChildrenFactory, SaoElementChildren, SaoElementConfig } from "../contracts/ElementInterface.js";
|
|
3
|
+
import type { ViewControllerInterface } from "../contracts/ViewControllerInterface.js";
|
|
4
|
+
import type { ViewManagerInterface } from "../contracts/ViewManagerInterface.js";
|
|
5
|
+
import type { SaoObjectType } from "../types/utils.js";
|
|
6
6
|
export declare class Html implements HtmlInterface {
|
|
7
|
-
|
|
7
|
+
saoType: SaoObjectType;
|
|
8
8
|
element: HTMLElement;
|
|
9
9
|
parent: HtmlInterface | null;
|
|
10
10
|
private tagName;
|
|
@@ -16,36 +16,113 @@ export declare class Html implements HtmlInterface {
|
|
|
16
16
|
private abortController;
|
|
17
17
|
/** All state subscriptions for reactive bindings — cleanup on destroy */
|
|
18
18
|
private bindingUnsubscribes;
|
|
19
|
+
/** Invalidates deferred/stale binding callbacks after a config reconciliation. */
|
|
20
|
+
private bindingGeneration;
|
|
21
|
+
private contentUnsubscribe;
|
|
22
|
+
/** DOM state owned by this Html config, used for exact cleanup before reuse. */
|
|
23
|
+
private managedAttributeNames;
|
|
24
|
+
private managedClassNames;
|
|
25
|
+
private managedStyleNames;
|
|
26
|
+
private managedPropertyNames;
|
|
27
|
+
/** Events actually registered through ViewController, independent of current config. */
|
|
28
|
+
private registeredEventNames;
|
|
19
29
|
initMode: InitMode;
|
|
30
|
+
private adoptedSSR;
|
|
20
31
|
constructor({ ctx, id, parentElement, tagName, element, config, childrenFactory, initMode, }: {
|
|
21
32
|
ctx: ViewControllerInterface | ViewManagerInterface;
|
|
22
33
|
id?: string | null;
|
|
23
34
|
parentElement?: HtmlInterface | null;
|
|
24
35
|
tagName?: string;
|
|
25
36
|
element?: HTMLElement | null;
|
|
26
|
-
config?:
|
|
27
|
-
childrenFactory?:
|
|
37
|
+
config?: SaoElementConfig;
|
|
38
|
+
childrenFactory?: SaoChildrenFactory | null;
|
|
28
39
|
initMode?: InitMode;
|
|
29
40
|
});
|
|
30
|
-
updateConfig(newConfig: Partial<
|
|
41
|
+
updateConfig(newConfig: Partial<SaoElementConfig>): void;
|
|
31
42
|
private initialize;
|
|
43
|
+
private isBindingCurrent;
|
|
44
|
+
private cleanupBindingResources;
|
|
45
|
+
private clearManagedDomState;
|
|
46
|
+
/**
|
|
47
|
+
* Chuẩn hóa tên attr từ camelCase → kebab-case cho data-* và aria-* attrs.
|
|
48
|
+
*
|
|
49
|
+
* Compiler emit camelCase: "dataCount" → client phải set "data-count" trên DOM.
|
|
50
|
+
* Tham chiếu: COMPILER_CONTRACT.md §3 — camelCase attrs.
|
|
51
|
+
*
|
|
52
|
+
* @example normalizeAttrName('dataCount') === 'data-count'
|
|
53
|
+
* @example normalizeAttrName('ariaLabel') === 'aria-label'
|
|
54
|
+
* @example normalizeAttrName('id') === 'id' (không đổi)
|
|
55
|
+
*/
|
|
56
|
+
private normalizeAttrName;
|
|
57
|
+
/**
|
|
58
|
+
* Thiết lập two-way data binding (v-model-like) theo compiler pattern:
|
|
59
|
+
*
|
|
60
|
+
* config.bind = { key: "<stateKey>" } — own bucket, sibling of attrs/props/events.
|
|
61
|
+
*
|
|
62
|
+
* Hành vi:
|
|
63
|
+
* 1. Khởi tạo: set element.value = state hiện tại
|
|
64
|
+
* 2. input event → update state
|
|
65
|
+
* 3. state change → update element.value
|
|
66
|
+
*
|
|
67
|
+
* Tham chiếu: COMPILER_CONTRACT.md §5 — @bind directive.
|
|
68
|
+
*/
|
|
69
|
+
private setupTwoWayBinding;
|
|
32
70
|
private initializeAttributes;
|
|
71
|
+
/**
|
|
72
|
+
* Apply một attr vào element, bao gồm:
|
|
73
|
+
* - Chuẩn hóa tên (camelCase → kebab-case cho data-* / aria-*)
|
|
74
|
+
* - Xử lý reactive binding
|
|
75
|
+
*/
|
|
76
|
+
private _applyAttr;
|
|
33
77
|
private initializeClasses;
|
|
78
|
+
private addClass;
|
|
79
|
+
private removeClass;
|
|
80
|
+
private toggleClass;
|
|
81
|
+
private applyStyle;
|
|
34
82
|
private initializeStyles;
|
|
35
83
|
private initializeEvents;
|
|
84
|
+
addEventListeners(): void;
|
|
85
|
+
removeEventListeners(): void;
|
|
36
86
|
setParentElement(parent: HtmlInterface | null): void;
|
|
37
87
|
setParent(parent: HtmlInterface | null): void;
|
|
38
|
-
setChildrenFactory(factory:
|
|
88
|
+
setChildrenFactory(factory: SaoChildrenFactory): void;
|
|
39
89
|
isSingleElement(): boolean;
|
|
90
|
+
getElement(): HTMLElement;
|
|
91
|
+
renderChildren(): SaoElementChildren;
|
|
92
|
+
private contentRendered;
|
|
93
|
+
private bindingInitialized;
|
|
94
|
+
private composing;
|
|
95
|
+
private isStarted;
|
|
40
96
|
render(): HTMLElement;
|
|
97
|
+
private renderTextContent;
|
|
98
|
+
/** Đã chạy enter rồi — re-render không được chạy lại. */
|
|
99
|
+
private _entered;
|
|
100
|
+
/**
|
|
101
|
+
* Enter chạy MỘT lần, khi element vừa được tạo và đã nằm trong DOM.
|
|
102
|
+
* Bỏ qua ở HYDRATE: DOM đó do server render, animate lại là nháy vô cớ
|
|
103
|
+
* (tương đương `appear = false` mặc định của Vue).
|
|
104
|
+
*/
|
|
105
|
+
private maybeRunEnter;
|
|
106
|
+
appendElement(element: HTMLElement | Comment | Text): void;
|
|
41
107
|
/** Start reactive bindings + children (Phase 2 lifecycle) */
|
|
42
108
|
start(): void;
|
|
43
109
|
/** Stop reactive bindings + children */
|
|
44
110
|
stop(): void;
|
|
111
|
+
clearHTML(): void;
|
|
45
112
|
remove(): void;
|
|
113
|
+
/** Registry guard — element đã destroy không được reuse (xem RUNTIME_CONTRACT.md §2) */
|
|
114
|
+
__destroyed__: boolean;
|
|
46
115
|
destroy(): void;
|
|
47
|
-
|
|
48
|
-
|
|
116
|
+
/**
|
|
117
|
+
* Nhả id của element này và toàn bộ cây con khỏi `ctx.elements`, KHÔNG
|
|
118
|
+
* destroy. Dùng khi leave transition giữ DOM lại: registry phải sạch ngay
|
|
119
|
+
* để pass sau tạo element mới thay vì tái dùng xác sắp chết.
|
|
120
|
+
*/
|
|
121
|
+
private releaseSubtreeFromRegistry;
|
|
122
|
+
/** Destroy children + dọn nội dung. Tách riêng để leave hoãn được. */
|
|
123
|
+
private teardownSubtree;
|
|
124
|
+
get isSaoElement(): boolean;
|
|
125
|
+
set isSaoElement(value: boolean);
|
|
49
126
|
get isOneHtml(): boolean;
|
|
50
127
|
set isOneHtml(value: boolean);
|
|
51
128
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Html.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/Html.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Html.d.ts","sourceRoot":"","sources":["../../../../src/core/elements/Html.ts"],"names":[],"mappings":"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"}
|