@askrjs/askr 0.0.48 → 0.0.49
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/dist/benchmark.js +6 -6
- package/dist/benchmark.js.map +1 -1
- package/dist/boot/hydration.js +140 -0
- package/dist/boot/hydration.js.map +1 -0
- package/dist/boot/index.d.ts +3 -56
- package/dist/boot/index.d.ts.map +1 -1
- package/dist/boot/index.js +62 -410
- package/dist/boot/index.js.map +1 -1
- package/dist/boot/root-lifecycle.d.ts +15 -0
- package/dist/boot/root-lifecycle.d.ts.map +1 -0
- package/dist/boot/root-lifecycle.js +205 -0
- package/dist/boot/root-lifecycle.js.map +1 -0
- package/dist/boot/route-startup.js +45 -0
- package/dist/boot/route-startup.js.map +1 -0
- package/dist/boot/types.d.ts +62 -0
- package/dist/boot/types.d.ts.map +1 -0
- package/dist/common/component.d.ts +3 -1
- package/dist/common/component.d.ts.map +1 -1
- package/dist/common/jsx.d.ts +1 -1
- package/dist/common/jsx.d.ts.map +1 -1
- package/dist/common/jsx.js.map +1 -1
- package/dist/common/props.d.ts +1 -1
- package/dist/common/render-context.js +55 -0
- package/dist/common/render-context.js.map +1 -0
- package/dist/common/router.d.ts +5 -1
- package/dist/common/router.d.ts.map +1 -1
- package/dist/common/ssr.d.ts +1 -1
- package/dist/common/ssr.js.map +1 -1
- package/dist/common/vnode.d.ts +5 -4
- package/dist/common/vnode.d.ts.map +1 -1
- package/dist/common/vnode.js.map +1 -1
- package/dist/components/error-boundary.d.ts +1 -1
- package/dist/components/error-boundary.js +2 -1
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/link.js.map +1 -1
- package/dist/control/for.js +2 -1
- package/dist/control/for.js.map +1 -1
- package/dist/data/data-runtime.d.ts +28 -0
- package/dist/data/data-runtime.d.ts.map +1 -0
- package/dist/data/data-runtime.js +114 -0
- package/dist/data/data-runtime.js.map +1 -0
- package/dist/data/index.d.ts +6 -142
- package/dist/data/index.js +5 -539
- package/dist/data/invalidation.d.ts +9 -0
- package/dist/data/invalidation.d.ts.map +1 -0
- package/dist/data/invalidation.js +27 -0
- package/dist/data/invalidation.js.map +1 -0
- package/dist/data/mutation-cell.d.ts +28 -0
- package/dist/data/mutation-cell.d.ts.map +1 -0
- package/dist/data/mutation-cell.js +132 -0
- package/dist/data/mutation-cell.js.map +1 -0
- package/dist/data/query-cell.d.ts +46 -0
- package/dist/data/query-cell.d.ts.map +1 -0
- package/dist/data/query-cell.js +290 -0
- package/dist/data/query-cell.js.map +1 -0
- package/dist/data/query-key.js +42 -0
- package/dist/data/query-key.js.map +1 -0
- package/dist/data/shared.js +20 -0
- package/dist/data/shared.js.map +1 -0
- package/dist/data/types.d.ts +161 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/foundations/icon/icon.d.ts.map +1 -1
- package/dist/foundations/icon/icon.js.map +1 -1
- package/dist/foundations/structures/portal.d.ts +1 -1
- package/dist/foundations/structures/portal.d.ts.map +1 -1
- package/dist/foundations/structures/portal.js +2 -1
- package/dist/foundations/structures/portal.js.map +1 -1
- package/dist/fx/fx.d.ts +1 -1
- package/dist/fx/fx.js +5 -4
- package/dist/fx/fx.js.map +1 -1
- package/dist/fx/timing.d.ts.map +1 -1
- package/dist/fx/timing.js +10 -6
- package/dist/fx/timing.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/jsx/index.d.ts +2 -1
- package/dist/jsx/index.js +3 -2
- package/dist/jsx/types.d.ts +2 -0
- package/dist/jsx/types.js +2 -1
- package/dist/jsx-runtime2.d.ts +2 -1
- package/dist/jsx-runtime2.js +3 -2
- package/dist/renderer/attributes.js +231 -0
- package/dist/renderer/attributes.js.map +1 -0
- package/dist/renderer/boundaries.js +266 -0
- package/dist/renderer/boundaries.js.map +1 -0
- package/dist/renderer/child-shape.js +85 -0
- package/dist/renderer/child-shape.js.map +1 -0
- package/dist/renderer/children.js +3 -2
- package/dist/renderer/children.js.map +1 -1
- package/dist/renderer/cleanup.js +2 -1
- package/dist/renderer/cleanup.js.map +1 -1
- package/dist/renderer/component-host-cleanup.js +68 -0
- package/dist/renderer/component-host-cleanup.js.map +1 -0
- package/dist/renderer/component-host-instances.js +65 -0
- package/dist/renderer/component-host-instances.js.map +1 -0
- package/dist/renderer/component-host.js +247 -0
- package/dist/renderer/component-host.js.map +1 -0
- package/dist/renderer/dom-host.js +13 -0
- package/dist/renderer/dom-host.js.map +1 -0
- package/dist/renderer/dom-internal.js +185 -0
- package/dist/renderer/dom-internal.js.map +1 -0
- package/dist/renderer/dom.js +9 -2356
- package/dist/renderer/element-children.js +279 -0
- package/dist/renderer/element-children.js.map +1 -0
- package/dist/renderer/env.js +2 -1
- package/dist/renderer/error-boundary-dom.js +29 -0
- package/dist/renderer/error-boundary-dom.js.map +1 -0
- package/dist/renderer/evaluate-dom-range.js +85 -0
- package/dist/renderer/evaluate-dom-range.js.map +1 -0
- package/dist/renderer/evaluate-reconcile.js +281 -0
- package/dist/renderer/evaluate-reconcile.js.map +1 -0
- package/dist/renderer/evaluate.js +13 -399
- package/dist/renderer/evaluate.js.map +1 -1
- package/dist/renderer/fastpath.js +6 -5
- package/dist/renderer/fastpath.js.map +1 -1
- package/dist/renderer/for-commit-dom-map.js +83 -0
- package/dist/renderer/for-commit-dom-map.js.map +1 -0
- package/dist/renderer/for-commit-removal.js +36 -0
- package/dist/renderer/for-commit-removal.js.map +1 -0
- package/dist/renderer/for-commit-reorder.js +89 -0
- package/dist/renderer/for-commit-reorder.js.map +1 -0
- package/dist/renderer/for-commit.js +6 -188
- package/dist/renderer/for-commit.js.map +1 -1
- package/dist/renderer/index.js +28 -16
- package/dist/renderer/index.js.map +1 -1
- package/dist/renderer/keyed-children.js +32 -0
- package/dist/renderer/keyed-children.js.map +1 -0
- package/dist/renderer/keyed.js +2 -15
- package/dist/renderer/keyed.js.map +1 -1
- package/dist/renderer/namespaces.js +23 -0
- package/dist/renderer/namespaces.js.map +1 -0
- package/dist/renderer/prop-bindings.js +280 -0
- package/dist/renderer/prop-bindings.js.map +1 -0
- package/dist/renderer/reactive-child-dom.js +133 -0
- package/dist/renderer/reactive-child-dom.js.map +1 -0
- package/dist/renderer/reactive-child-sources.js +184 -0
- package/dist/renderer/reactive-child-sources.js.map +1 -0
- package/dist/renderer/reactive-children.js +294 -0
- package/dist/renderer/reactive-children.js.map +1 -0
- package/dist/renderer/reconcile-commit.js +38 -0
- package/dist/renderer/reconcile-commit.js.map +1 -0
- package/dist/renderer/reconcile-fastpaths.js +106 -0
- package/dist/renderer/reconcile-fastpaths.js.map +1 -0
- package/dist/renderer/reconcile-resolution.js +187 -0
- package/dist/renderer/reconcile-resolution.js.map +1 -0
- package/dist/renderer/reconcile.js +9 -371
- package/dist/renderer/reconcile.js.map +1 -1
- package/dist/renderer/retained-element-rollback.js +276 -0
- package/dist/renderer/retained-element-rollback.js.map +1 -0
- package/dist/renderer/stable-patch.js +82 -0
- package/dist/renderer/stable-patch.js.map +1 -0
- package/dist/renderer/static-reuse.js +96 -0
- package/dist/renderer/static-reuse.js.map +1 -0
- package/dist/renderer/types.js +2 -1
- package/dist/renderer/utils.js +4 -4
- package/dist/renderer/utils.js.map +1 -1
- package/dist/resources/index.d.ts +3 -2
- package/dist/resources/index.js +5 -2
- package/dist/router/access.js +36 -0
- package/dist/router/access.js.map +1 -0
- package/dist/router/activity.d.ts +10 -0
- package/dist/router/activity.d.ts.map +1 -0
- package/dist/router/activity.js +89 -0
- package/dist/router/activity.js.map +1 -0
- package/dist/router/authoring.d.ts +22 -0
- package/dist/router/authoring.d.ts.map +1 -0
- package/dist/router/authoring.js +198 -0
- package/dist/router/authoring.js.map +1 -0
- package/dist/router/index.d.ts +12 -4
- package/dist/router/index.js +10 -3
- package/dist/router/internal-types.d.ts +31 -0
- package/dist/router/internal-types.d.ts.map +1 -0
- package/dist/router/lazy.d.ts +19 -0
- package/dist/router/lazy.d.ts.map +1 -0
- package/dist/router/lazy.js +52 -0
- package/dist/router/lazy.js.map +1 -0
- package/dist/router/manifest.d.ts +10 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +49 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/navigate.d.ts +4 -51
- package/dist/router/navigate.d.ts.map +1 -1
- package/dist/router/navigate.js +16 -459
- package/dist/router/navigate.js.map +1 -1
- package/dist/router/navigation-registry.d.ts +32 -0
- package/dist/router/navigation-registry.d.ts.map +1 -0
- package/dist/router/navigation-registry.js +105 -0
- package/dist/router/navigation-registry.js.map +1 -0
- package/dist/router/navigation-scroll.d.ts +14 -0
- package/dist/router/navigation-scroll.d.ts.map +1 -0
- package/dist/router/navigation-scroll.js +93 -0
- package/dist/router/navigation-scroll.js.map +1 -0
- package/dist/router/navigation-targets.d.ts +31 -0
- package/dist/router/navigation-targets.d.ts.map +1 -0
- package/dist/router/navigation-targets.js +253 -0
- package/dist/router/navigation-targets.js.map +1 -0
- package/dist/router/policy.d.ts +7 -1
- package/dist/router/policy.d.ts.map +1 -1
- package/dist/router/policy.js +27 -9
- package/dist/router/policy.js.map +1 -1
- package/dist/router/rendering.d.ts +10 -0
- package/dist/router/rendering.d.ts.map +1 -0
- package/dist/router/rendering.js +45 -0
- package/dist/router/rendering.js.map +1 -0
- package/dist/router/resolution.d.ts +17 -0
- package/dist/router/resolution.d.ts.map +1 -0
- package/dist/router/resolution.js +253 -0
- package/dist/router/resolution.js.map +1 -0
- package/dist/router/route-query.d.ts +17 -0
- package/dist/router/route-query.d.ts.map +1 -0
- package/dist/router/route-query.js +47 -0
- package/dist/router/route-query.js.map +1 -0
- package/dist/router/route.d.ts +8 -149
- package/dist/router/route.js +8 -854
- package/dist/router/store.d.ts +50 -0
- package/dist/router/store.d.ts.map +1 -0
- package/dist/router/store.js +171 -0
- package/dist/router/store.js.map +1 -0
- package/dist/runtime/access.js +45 -0
- package/dist/runtime/access.js.map +1 -0
- package/dist/runtime/child-scope.d.ts +1 -1
- package/dist/runtime/child-scope.js +4 -1
- package/dist/runtime/child-scope.js.map +1 -1
- package/dist/runtime/component-cleanup.d.ts +16 -0
- package/dist/runtime/component-cleanup.d.ts.map +1 -0
- package/dist/runtime/component-cleanup.js +70 -0
- package/dist/runtime/component-cleanup.js.map +1 -0
- package/dist/runtime/component-commit.js +165 -0
- package/dist/runtime/component-commit.js.map +1 -0
- package/dist/runtime/component-contracts.js +5 -0
- package/dist/runtime/component-facade.d.ts +5 -0
- package/dist/runtime/component-facade.js +4 -0
- package/dist/runtime/component-internal.d.ts +100 -0
- package/dist/runtime/component-internal.d.ts.map +1 -0
- package/dist/runtime/component-internal.js +219 -0
- package/dist/runtime/component-internal.js.map +1 -0
- package/dist/runtime/component-lifecycle.d.ts +49 -0
- package/dist/runtime/component-lifecycle.d.ts.map +1 -0
- package/dist/runtime/component-lifecycle.js +176 -0
- package/dist/runtime/component-lifecycle.js.map +1 -0
- package/dist/runtime/component-scope.d.ts +55 -0
- package/dist/runtime/component-scope.d.ts.map +1 -0
- package/dist/runtime/component-scope.js +154 -0
- package/dist/runtime/component-scope.js.map +1 -0
- package/dist/runtime/component.d.ts +4 -152
- package/dist/runtime/component.js +4 -692
- package/dist/runtime/context.d.ts +1 -1
- package/dist/runtime/context.js +6 -4
- package/dist/runtime/context.js.map +1 -1
- package/dist/runtime/control.d.ts +3 -3
- package/dist/runtime/control.js +2 -1
- package/dist/runtime/control.js.map +1 -1
- package/dist/runtime/derive.d.ts.map +1 -1
- package/dist/runtime/derive.js +6 -5
- package/dist/runtime/derive.js.map +1 -1
- package/dist/runtime/effect.d.ts +1 -1
- package/dist/runtime/effect.d.ts.map +1 -1
- package/dist/runtime/effect.js +2 -2
- package/dist/runtime/effect.js.map +1 -1
- package/dist/runtime/events.js +3 -3
- package/dist/runtime/events.js.map +1 -1
- package/dist/runtime/fastlane.js +13 -27
- package/dist/runtime/fastlane.js.map +1 -1
- package/dist/runtime/for-bench.d.ts +1 -1
- package/dist/runtime/for-bench.js +1 -4
- package/dist/runtime/for-bench.js.map +1 -1
- package/dist/runtime/for-internal.d.ts +43 -0
- package/dist/runtime/for-internal.d.ts.map +1 -0
- package/dist/runtime/for-internal.js +98 -0
- package/dist/runtime/for-internal.js.map +1 -0
- package/dist/runtime/for-reconcile.d.ts +8 -0
- package/dist/runtime/for-reconcile.d.ts.map +1 -0
- package/dist/runtime/for-reconcile.js +389 -0
- package/dist/runtime/for-reconcile.js.map +1 -0
- package/dist/runtime/for-scopes.d.ts +26 -0
- package/dist/runtime/for-scopes.d.ts.map +1 -0
- package/dist/runtime/for-scopes.js +160 -0
- package/dist/runtime/for-scopes.js.map +1 -0
- package/dist/runtime/for-signals.d.ts +30 -0
- package/dist/runtime/for-signals.d.ts.map +1 -0
- package/dist/runtime/for-signals.js +139 -0
- package/dist/runtime/for-signals.js.map +1 -0
- package/dist/runtime/for.d.ts +4 -66
- package/dist/runtime/for.js +5 -773
- package/dist/runtime/lifecycle-operations.d.ts +31 -0
- package/dist/runtime/lifecycle-operations.d.ts.map +1 -0
- package/dist/runtime/lifecycle-operations.js +195 -0
- package/dist/runtime/lifecycle-operations.js.map +1 -0
- package/dist/runtime/operations.d.ts +3 -40
- package/dist/runtime/operations.js +2 -357
- package/dist/runtime/readable.d.ts +2 -3
- package/dist/runtime/readable.d.ts.map +1 -1
- package/dist/runtime/readable.js +6 -5
- package/dist/runtime/readable.js.map +1 -1
- package/dist/runtime/resource-cell.js +2 -2
- package/dist/runtime/resource-cell.js.map +1 -1
- package/dist/runtime/resource-operation.d.ts +13 -0
- package/dist/runtime/resource-operation.d.ts.map +1 -0
- package/dist/runtime/resource-operation.js +170 -0
- package/dist/runtime/resource-operation.js.map +1 -0
- package/dist/runtime/runtime.d.ts +42 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +59 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime/scheduler.d.ts +5 -1
- package/dist/runtime/scheduler.d.ts.map +1 -1
- package/dist/runtime/scheduler.js +17 -17
- package/dist/runtime/scheduler.js.map +1 -1
- package/dist/runtime/selector.js +4 -3
- package/dist/runtime/selector.js.map +1 -1
- package/dist/runtime/snapshot-source.d.ts +1 -1
- package/dist/runtime/snapshot-source.js +1 -1
- package/dist/runtime/state.js +2 -1
- package/dist/runtime/state.js.map +1 -1
- package/dist/ssg/batch-render.js +2 -1
- package/dist/ssg/batch-render.js.map +1 -1
- package/dist/ssg/create-static-gen.d.ts +9 -3
- package/dist/ssg/create-static-gen.d.ts.map +1 -1
- package/dist/ssg/create-static-gen.js +12 -99
- package/dist/ssg/create-static-gen.js.map +1 -1
- package/dist/ssg/generation-plan.js +70 -0
- package/dist/ssg/generation-plan.js.map +1 -0
- package/dist/ssg/incremental-manifest.js +1 -1
- package/dist/ssg/static-routes.js +101 -0
- package/dist/ssg/static-routes.js.map +1 -0
- package/dist/ssg/types.d.ts +15 -7
- package/dist/ssg/types.d.ts.map +1 -1
- package/dist/ssr/boundaries.js +113 -0
- package/dist/ssr/boundaries.js.map +1 -0
- package/dist/ssr/component-runtime.js +111 -0
- package/dist/ssr/component-runtime.js.map +1 -0
- package/dist/ssr/context.d.ts +3 -1
- package/dist/ssr/context.d.ts.map +1 -1
- package/dist/ssr/context.js +9 -2
- package/dist/ssr/context.js.map +1 -1
- package/dist/ssr/errors.d.ts +2 -0
- package/dist/ssr/errors.js +11 -1
- package/dist/ssr/errors.js.map +1 -1
- package/dist/ssr/escape.js +3 -3
- package/dist/ssr/escape.js.map +1 -1
- package/dist/ssr/hydration-data.js +10 -0
- package/dist/ssr/hydration-data.js.map +1 -0
- package/dist/ssr/hydration-verify.d.ts +12 -0
- package/dist/ssr/hydration-verify.d.ts.map +1 -0
- package/dist/ssr/hydration-verify.js +144 -0
- package/dist/ssr/hydration-verify.js.map +1 -0
- package/dist/ssr/index-internal.d.ts +15 -0
- package/dist/ssr/index-internal.d.ts.map +1 -0
- package/dist/ssr/index-internal.js +19 -0
- package/dist/ssr/index-internal.js.map +1 -0
- package/dist/ssr/index.d.ts +5 -57
- package/dist/ssr/index.js +3 -738
- package/dist/ssr/render-keys.js +9 -32
- package/dist/ssr/render-keys.js.map +1 -1
- package/dist/ssr/render-resolved.d.ts +1 -1
- package/dist/ssr/render-resolved.d.ts.map +1 -1
- package/dist/ssr/render-resolved.js +4 -2
- package/dist/ssr/render-resolved.js.map +1 -1
- package/dist/ssr/render-sync.d.ts +21 -0
- package/dist/ssr/render-sync.d.ts.map +1 -0
- package/dist/ssr/render-sync.js +275 -0
- package/dist/ssr/render-sync.js.map +1 -0
- package/dist/ssr/route-policy-resolution.js +77 -0
- package/dist/ssr/route-policy-resolution.js.map +1 -0
- package/dist/ssr/route-render.d.ts +77 -0
- package/dist/ssr/route-render.d.ts.map +1 -0
- package/dist/ssr/route-render.js +119 -0
- package/dist/ssr/route-render.js.map +1 -0
- package/dist/ssr/sink.d.ts +26 -0
- package/dist/ssr/sink.d.ts.map +1 -0
- package/dist/ssr/types.d.ts +1 -0
- package/dist/ssr/types.d.ts.map +1 -1
- package/dist/ssr/verify-hydration.js.map +1 -1
- package/dist/testing/index.d.ts +1 -2
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +2 -1
- package/dist/testing/index.js.map +1 -1
- package/package.json +4 -3
- package/dist/data/index.d.ts.map +0 -1
- package/dist/data/index.js.map +0 -1
- package/dist/renderer/dom.js.map +0 -1
- package/dist/router/route.d.ts.map +0 -1
- package/dist/router/route.js.map +0 -1
- package/dist/runtime/component.d.ts.map +0 -1
- package/dist/runtime/component.js.map +0 -1
- package/dist/runtime/for.d.ts.map +0 -1
- package/dist/runtime/for.js.map +0 -1
- package/dist/runtime/operations.d.ts.map +0 -1
- package/dist/runtime/operations.js.map +0 -1
- package/dist/runtime/ssr-bridge.js +0 -24
- package/dist/runtime/ssr-bridge.js.map +0 -1
- package/dist/ssr/index.d.ts.map +0 -1
- package/dist/ssr/index.js.map +0 -1
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { _isDOMElement } from "../common/vnode.js";
|
|
2
|
+
import "./types.js";
|
|
3
|
+
import { teardownNodeSubtree } from "./cleanup.js";
|
|
4
|
+
import { extractKey } from "./utils.js";
|
|
5
|
+
import { keyedElements } from "./keyed.js";
|
|
6
|
+
import { getParentNamespace } from "./namespaces.js";
|
|
7
|
+
import { clearControlBoundaryCommitOwner, commitForBoundaryChildren, evaluateControlBoundaryState, getControlBoundaryState, getDirectControlBoundaryVNode, registerControlBoundaryCommitOwner, trySyncControlBoundaryChild } from "./boundaries.js";
|
|
8
|
+
import { isBulkTextFastPathEligible, performBulkTextReplace } from "./children.js";
|
|
9
|
+
import { isFragmentVNode, normalizeComponentChildren } from "./child-shape.js";
|
|
10
|
+
import { getRendererDOMHost } from "./dom-host.js";
|
|
11
|
+
import { trySyncScalarChildSequenceInPlace } from "./reactive-children.js";
|
|
12
|
+
import { reconcileKeyedChildren } from "./reconcile.js";
|
|
13
|
+
import { tagsEqualIgnoreCase } from "./static-reuse.js";
|
|
14
|
+
//#region src/renderer/element-children.ts
|
|
15
|
+
const rendererReactiveChildDOMHost = {
|
|
16
|
+
createDOMNode: (node, parentNamespace) => getRendererDOMHost().createDOMNode(node, parentNamespace),
|
|
17
|
+
updateElementChildren: (el, children, forceUpdate) => updateElementChildren(el, children, forceUpdate)
|
|
18
|
+
};
|
|
19
|
+
function updateElementChildren(el, children, forceUpdate = false) {
|
|
20
|
+
const directControlBoundary = getDirectControlBoundaryVNode(children);
|
|
21
|
+
if (directControlBoundary) {
|
|
22
|
+
const controlState = getControlBoundaryState(directControlBoundary);
|
|
23
|
+
if (!controlState) throw new Error("[updateElementChildren] Control boundary missing internal state");
|
|
24
|
+
registerControlBoundaryCommitOwner(el, controlState);
|
|
25
|
+
commitForBoundaryChildren(el, controlState, evaluateControlBoundaryState(controlState));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
clearControlBoundaryCommitOwner(el);
|
|
29
|
+
if (children === null || children === void 0) {
|
|
30
|
+
for (let n = el.firstChild; n;) {
|
|
31
|
+
const next = n.nextSibling;
|
|
32
|
+
teardownNodeSubtree(n);
|
|
33
|
+
n = next;
|
|
34
|
+
}
|
|
35
|
+
el.textContent = "";
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (!Array.isArray(children) && isFragmentVNode(children)) {
|
|
39
|
+
updateUnkeyedChildren(el, normalizeComponentChildren(children), forceUpdate);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (!Array.isArray(children) && (typeof children === "string" || typeof children === "number")) {
|
|
43
|
+
if (el.childNodes.length === 1 && el.firstChild?.nodeType === 3) {
|
|
44
|
+
const s = String(children);
|
|
45
|
+
const t = el.firstChild;
|
|
46
|
+
if (t.data !== s) t.data = s;
|
|
47
|
+
} else {
|
|
48
|
+
for (let n = el.firstChild; n;) {
|
|
49
|
+
const next = n.nextSibling;
|
|
50
|
+
teardownNodeSubtree(n);
|
|
51
|
+
n = next;
|
|
52
|
+
}
|
|
53
|
+
el.textContent = String(children);
|
|
54
|
+
}
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (Array.isArray(children)) {
|
|
58
|
+
const normalizedChildren = normalizeComponentChildren(children);
|
|
59
|
+
if (trySyncScalarChildSequenceInPlace(el, normalizedChildren, rendererReactiveChildDOMHost)) {
|
|
60
|
+
keyedElements.delete(el);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (hasKeyedVNodeChildren(normalizedChildren)) {
|
|
64
|
+
const newKeyMap = reconcileKeyedChildren(el, normalizedChildren, getOrBuildDomKeyMap(el));
|
|
65
|
+
keyedElements.set(el, newKeyMap);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (isBulkTextFastPathEligible(el, normalizedChildren)) {
|
|
69
|
+
performBulkTextReplace(el, normalizedChildren);
|
|
70
|
+
keyedElements.delete(el);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
updateUnkeyedChildren(el, normalizedChildren, forceUpdate);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (_isDOMElement(children)) {
|
|
77
|
+
updateUnkeyedChildren(el, [children], forceUpdate);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
for (let n = el.firstChild; n;) {
|
|
81
|
+
const next = n.nextSibling;
|
|
82
|
+
teardownNodeSubtree(n);
|
|
83
|
+
n = next;
|
|
84
|
+
}
|
|
85
|
+
el.textContent = "";
|
|
86
|
+
const dom = getRendererDOMHost().createDOMNode(children);
|
|
87
|
+
if (dom) el.appendChild(dom);
|
|
88
|
+
}
|
|
89
|
+
function hasKeyedVNodeChildren(children) {
|
|
90
|
+
for (let i = 0; i < children.length; i++) if (extractKey(children[i]) !== void 0) return true;
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
function isEmptyChild(child) {
|
|
94
|
+
return child === null || child === void 0 || child === false;
|
|
95
|
+
}
|
|
96
|
+
function getOrBuildDomKeyMap(parent) {
|
|
97
|
+
let keyMap = keyedElements.get(parent);
|
|
98
|
+
if (!keyMap) {
|
|
99
|
+
keyMap = /* @__PURE__ */ new Map();
|
|
100
|
+
for (let child = parent.firstElementChild; child; child = child.nextElementSibling) {
|
|
101
|
+
const key = child.getAttribute("data-key");
|
|
102
|
+
if (key !== null) {
|
|
103
|
+
keyMap.set(key, child);
|
|
104
|
+
const numericKey = Number(key);
|
|
105
|
+
if (!Number.isNaN(numericKey)) keyMap.set(numericKey, child);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (keyMap.size > 0) keyedElements.set(parent, keyMap);
|
|
109
|
+
}
|
|
110
|
+
return keyMap.size > 0 ? keyMap : void 0;
|
|
111
|
+
}
|
|
112
|
+
function updateUnkeyedChildren(parent, newChildren, forceUpdate = false) {
|
|
113
|
+
const parentNamespace = getParentNamespace(parent);
|
|
114
|
+
const domHost = getRendererDOMHost();
|
|
115
|
+
const trySyncComponentChild = (currentDom, next) => {
|
|
116
|
+
if (typeof next.type !== "function") return null;
|
|
117
|
+
return domHost.syncComponentElement(currentDom, next, next.type, (next.props ?? {}) || {}, parentNamespace, forceUpdate);
|
|
118
|
+
};
|
|
119
|
+
const hasText = newChildren.some((c) => typeof c === "string" || typeof c === "number");
|
|
120
|
+
const hasElements = newChildren.some((c) => _isDOMElement(c));
|
|
121
|
+
const hasEmptyChildren = newChildren.some(isEmptyChild);
|
|
122
|
+
const hasComponentChildren = newChildren.some((c) => _isDOMElement(c) && typeof c.type === "function");
|
|
123
|
+
const hasNonElementDomChildren = parent.childNodes.length !== parent.children.length;
|
|
124
|
+
if (!hasEmptyChildren && !hasText && !hasComponentChildren && !hasNonElementDomChildren && hasElements && parent.children.length === newChildren.length) {
|
|
125
|
+
const c = parent.children;
|
|
126
|
+
for (let i = 0; i < newChildren.length; i++) {
|
|
127
|
+
const next = newChildren[i];
|
|
128
|
+
const current = c[i];
|
|
129
|
+
if (!current || next === void 0) continue;
|
|
130
|
+
if (_isDOMElement(next) && typeof next.type === "string") if (tagsEqualIgnoreCase(current.tagName, next.type)) domHost.updateElementFromVnode(current, next, true, forceUpdate);
|
|
131
|
+
else {
|
|
132
|
+
const dom = domHost.createDOMNode(next, parentNamespace);
|
|
133
|
+
if (dom) {
|
|
134
|
+
teardownNodeSubtree(current);
|
|
135
|
+
parent.replaceChild(dom, current);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else if (_isDOMElement(next)) {
|
|
139
|
+
if (trySyncControlBoundaryChild(parent, current, next)) continue;
|
|
140
|
+
const synced = trySyncComponentChild(current, next);
|
|
141
|
+
if (synced && synced !== current) teardownNodeSubtree(current);
|
|
142
|
+
else if (!synced) {
|
|
143
|
+
const dom = domHost.createDOMNode(next, parentNamespace);
|
|
144
|
+
if (dom) {
|
|
145
|
+
teardownNodeSubtree(current);
|
|
146
|
+
parent.replaceChild(dom, current);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
} else {
|
|
150
|
+
const dom = domHost.createDOMNode(next, parentNamespace);
|
|
151
|
+
if (dom) {
|
|
152
|
+
teardownNodeSubtree(current);
|
|
153
|
+
parent.replaceChild(dom, current);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const existing = Array.from(parent.children);
|
|
160
|
+
if (hasText || hasComponentChildren || hasEmptyChildren || hasNonElementDomChildren) {
|
|
161
|
+
const allNodes = Array.from(parent.childNodes);
|
|
162
|
+
const max = Math.max(allNodes.length, newChildren.length);
|
|
163
|
+
for (let i = 0; i < max; i++) {
|
|
164
|
+
const currentNode = allNodes[i];
|
|
165
|
+
const next = newChildren[i];
|
|
166
|
+
const nextIsEmpty = isEmptyChild(next);
|
|
167
|
+
if (nextIsEmpty && currentNode) {
|
|
168
|
+
teardownNodeSubtree(currentNode);
|
|
169
|
+
currentNode.remove();
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (!currentNode && !nextIsEmpty) {
|
|
173
|
+
const dom = domHost.createDOMNode(next, parentNamespace);
|
|
174
|
+
if (dom) parent.appendChild(dom);
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
if (!currentNode || nextIsEmpty) continue;
|
|
178
|
+
if (typeof next === "string" || typeof next === "number") if (currentNode.nodeType === 3) currentNode.data = String(next);
|
|
179
|
+
else {
|
|
180
|
+
const textNode = document.createTextNode(String(next));
|
|
181
|
+
parent.replaceChild(textNode, currentNode);
|
|
182
|
+
}
|
|
183
|
+
else if (_isDOMElement(next)) if (currentNode.nodeType === 1) {
|
|
184
|
+
const currentEl = currentNode;
|
|
185
|
+
if (typeof next.type === "string") if (tagsEqualIgnoreCase(currentEl.tagName, next.type)) domHost.updateElementFromVnode(currentEl, next, true, forceUpdate);
|
|
186
|
+
else {
|
|
187
|
+
const dom = domHost.createDOMNode(next, parentNamespace);
|
|
188
|
+
if (dom) {
|
|
189
|
+
teardownNodeSubtree(currentEl);
|
|
190
|
+
parent.replaceChild(dom, currentNode);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
if (trySyncControlBoundaryChild(parent, currentNode, next)) continue;
|
|
195
|
+
const synced = trySyncComponentChild(currentEl, next);
|
|
196
|
+
if (synced && synced !== currentNode) teardownNodeSubtree(currentEl);
|
|
197
|
+
else if (!synced) {
|
|
198
|
+
const dom = domHost.createDOMNode(next, parentNamespace);
|
|
199
|
+
if (dom) {
|
|
200
|
+
teardownNodeSubtree(currentEl);
|
|
201
|
+
parent.replaceChild(dom, currentNode);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
} else {
|
|
206
|
+
const dom = domHost.createDOMNode(next, parentNamespace);
|
|
207
|
+
if (dom) parent.replaceChild(dom, currentNode);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (newChildren.length === 1 && existing.length === 0 && parent.childNodes.length === 1) {
|
|
213
|
+
const firstNewChild = newChildren[0];
|
|
214
|
+
const firstExisting = parent.firstChild;
|
|
215
|
+
if ((typeof firstNewChild === "string" || typeof firstNewChild === "number") && firstExisting?.nodeType === 3) {
|
|
216
|
+
firstExisting.data = String(firstNewChild);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (existing.length === 0 && parent.childNodes.length > 0) {
|
|
221
|
+
for (let n = parent.firstChild; n;) {
|
|
222
|
+
const next = n.nextSibling;
|
|
223
|
+
teardownNodeSubtree(n);
|
|
224
|
+
n = next;
|
|
225
|
+
}
|
|
226
|
+
parent.textContent = "";
|
|
227
|
+
}
|
|
228
|
+
const max = Math.max(existing.length, newChildren.length);
|
|
229
|
+
for (let i = 0; i < max; i++) {
|
|
230
|
+
const current = existing[i];
|
|
231
|
+
const next = newChildren[i];
|
|
232
|
+
const nextIsEmpty = isEmptyChild(next);
|
|
233
|
+
if (nextIsEmpty && current) {
|
|
234
|
+
teardownNodeSubtree(current);
|
|
235
|
+
current.remove();
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
if (!current && !nextIsEmpty) {
|
|
239
|
+
const dom = domHost.createDOMNode(next, parentNamespace);
|
|
240
|
+
if (dom) parent.appendChild(dom);
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
if (!current || nextIsEmpty) continue;
|
|
244
|
+
if (typeof next === "string" || typeof next === "number") {
|
|
245
|
+
const textNode = document.createTextNode(String(next));
|
|
246
|
+
teardownNodeSubtree(current);
|
|
247
|
+
parent.replaceChild(textNode, current);
|
|
248
|
+
} else if (_isDOMElement(next)) if (typeof next.type === "string") if (tagsEqualIgnoreCase(current.tagName, next.type)) domHost.updateElementFromVnode(current, next, true, forceUpdate);
|
|
249
|
+
else {
|
|
250
|
+
const dom = domHost.createDOMNode(next, parentNamespace);
|
|
251
|
+
if (dom) {
|
|
252
|
+
teardownNodeSubtree(current);
|
|
253
|
+
parent.replaceChild(dom, current);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
const synced = trySyncComponentChild(current, next);
|
|
258
|
+
if (synced && synced !== current) teardownNodeSubtree(current);
|
|
259
|
+
else if (!synced) {
|
|
260
|
+
const dom = domHost.createDOMNode(next, parentNamespace);
|
|
261
|
+
if (dom) {
|
|
262
|
+
teardownNodeSubtree(current);
|
|
263
|
+
parent.replaceChild(dom, current);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
const dom = domHost.createDOMNode(next);
|
|
269
|
+
if (dom) {
|
|
270
|
+
teardownNodeSubtree(current);
|
|
271
|
+
parent.replaceChild(dom, current);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
//#endregion
|
|
277
|
+
export { rendererReactiveChildDOMHost, updateElementChildren, updateUnkeyedChildren };
|
|
278
|
+
|
|
279
|
+
//# sourceMappingURL=element-children.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-children.js","names":[],"sources":["../../src/renderer/element-children.ts"],"sourcesContent":["import type { ComponentFunction } from '../runtime/component-contracts';\nimport { clearControlBoundaryCommitOwner } from './boundaries';\nimport {\n commitForBoundaryChildren,\n evaluateControlBoundaryState,\n getControlBoundaryState,\n getDirectControlBoundaryVNode,\n registerControlBoundaryCommitOwner,\n trySyncControlBoundaryChild,\n} from './boundaries';\nimport { isBulkTextFastPathEligible, performBulkTextReplace } from './children';\nimport { isFragmentVNode, normalizeComponentChildren } from './child-shape';\nimport { teardownNodeSubtree } from './cleanup';\nimport { getRendererDOMHost, type ElementWithContext } from './dom-host';\nimport { keyedElements } from './keyed';\nimport { getParentNamespace } from './namespaces';\nimport {\n trySyncScalarChildSequenceInPlace,\n type ReactiveChildDOMHost,\n} from './reactive-children';\nimport { reconcileKeyedChildren } from './reconcile';\nimport { tagsEqualIgnoreCase } from './static-reuse';\nimport { _isDOMElement, type DOMElement, type VNode } from './types';\nimport { extractKey } from './utils';\n\nexport const rendererReactiveChildDOMHost: ReactiveChildDOMHost = {\n createDOMNode: (node, parentNamespace) =>\n getRendererDOMHost().createDOMNode(node, parentNamespace),\n updateElementChildren: (el, children, forceUpdate) =>\n updateElementChildren(el, children, forceUpdate),\n};\n\nexport function updateElementChildren(\n el: Element,\n children: VNode | VNode[] | undefined,\n forceUpdate = false\n): void {\n const directControlBoundary = getDirectControlBoundaryVNode(children);\n if (directControlBoundary) {\n const controlState = getControlBoundaryState(directControlBoundary);\n if (!controlState) {\n throw new Error(\n '[updateElementChildren] Control boundary missing internal state'\n );\n }\n\n registerControlBoundaryCommitOwner(el, controlState);\n const childrenVNodes = evaluateControlBoundaryState(controlState);\n commitForBoundaryChildren(el, controlState, childrenVNodes as VNode[]);\n return;\n }\n\n clearControlBoundaryCommitOwner(el);\n\n if (children === null || children === undefined) {\n for (let n = el.firstChild; n; ) {\n const next = n.nextSibling;\n teardownNodeSubtree(n);\n n = next;\n }\n el.textContent = '';\n return;\n }\n\n if (!Array.isArray(children) && isFragmentVNode(children)) {\n updateUnkeyedChildren(\n el,\n normalizeComponentChildren(children),\n forceUpdate\n );\n return;\n }\n\n if (\n !Array.isArray(children) &&\n (typeof children === 'string' || typeof children === 'number')\n ) {\n if (el.childNodes.length === 1 && el.firstChild?.nodeType === 3) {\n const s = String(children);\n const t = el.firstChild as Text;\n if (t.data !== s) t.data = s;\n } else {\n for (let n = el.firstChild; n; ) {\n const next = n.nextSibling;\n teardownNodeSubtree(n);\n n = next;\n }\n el.textContent = String(children);\n }\n return;\n }\n\n if (Array.isArray(children)) {\n const normalizedChildren = normalizeComponentChildren(children) as VNode[];\n\n if (\n trySyncScalarChildSequenceInPlace(\n el,\n normalizedChildren,\n rendererReactiveChildDOMHost\n )\n ) {\n keyedElements.delete(el);\n return;\n }\n\n if (hasKeyedVNodeChildren(normalizedChildren)) {\n const oldKeyMap = getOrBuildDomKeyMap(el);\n const newKeyMap = reconcileKeyedChildren(\n el,\n normalizedChildren,\n oldKeyMap\n );\n keyedElements.set(el, newKeyMap);\n return;\n }\n if (isBulkTextFastPathEligible(el, normalizedChildren)) {\n performBulkTextReplace(el, normalizedChildren);\n keyedElements.delete(el);\n return;\n }\n updateUnkeyedChildren(el, normalizedChildren, forceUpdate);\n return;\n }\n\n if (_isDOMElement(children)) {\n updateUnkeyedChildren(el, [children], forceUpdate);\n return;\n }\n\n for (let n = el.firstChild; n; ) {\n const next = n.nextSibling;\n teardownNodeSubtree(n);\n n = next;\n }\n el.textContent = '';\n const dom = getRendererDOMHost().createDOMNode(children);\n if (dom) el.appendChild(dom);\n}\n\nfunction hasKeyedVNodeChildren(children: VNode[]): boolean {\n for (let i = 0; i < children.length; i++) {\n if (extractKey(children[i]) !== undefined) return true;\n }\n return false;\n}\n\nfunction isEmptyChild(child: unknown): boolean {\n return child === null || child === undefined || child === false;\n}\n\nfunction getOrBuildDomKeyMap(\n parent: Element\n): Map<string | number, Element> | undefined {\n let keyMap = keyedElements.get(parent);\n if (!keyMap) {\n keyMap = new Map<string | number, Element>();\n for (\n let child = parent.firstElementChild;\n child;\n child = child.nextElementSibling\n ) {\n const key = child.getAttribute('data-key');\n if (key !== null) {\n keyMap.set(key, child);\n const numericKey = Number(key);\n if (!Number.isNaN(numericKey)) keyMap.set(numericKey, child);\n }\n }\n if (keyMap.size > 0) keyedElements.set(parent, keyMap);\n }\n return keyMap.size > 0 ? keyMap : undefined;\n}\n\nexport function updateUnkeyedChildren(\n parent: Element,\n newChildren: unknown[],\n forceUpdate = false\n): void {\n const parentNamespace = getParentNamespace(parent);\n const domHost = getRendererDOMHost();\n\n const trySyncComponentChild = (\n currentDom: Element,\n next: DOMElement\n ): Node | null => {\n if (typeof next.type !== 'function') {\n return null;\n }\n\n return domHost.syncComponentElement(\n currentDom,\n next as ElementWithContext,\n next.type as ComponentFunction,\n (((next as DOMElement).props ?? {}) as Record<string, unknown>) || {},\n parentNamespace,\n forceUpdate\n );\n };\n\n const hasText = newChildren.some(\n (c) => typeof c === 'string' || typeof c === 'number'\n );\n const hasElements = newChildren.some((c) => _isDOMElement(c));\n const hasEmptyChildren = newChildren.some(isEmptyChild);\n const hasComponentChildren = newChildren.some(\n (c) => _isDOMElement(c) && typeof (c as DOMElement).type === 'function'\n );\n const hasNonElementDomChildren =\n parent.childNodes.length !== parent.children.length;\n\n if (\n !hasEmptyChildren &&\n !hasText &&\n !hasComponentChildren &&\n !hasNonElementDomChildren &&\n hasElements &&\n parent.children.length === newChildren.length\n ) {\n const c = parent.children;\n for (let i = 0; i < newChildren.length; i++) {\n const next = newChildren[i];\n const current = c[i];\n if (!current || next === undefined) continue;\n if (_isDOMElement(next) && typeof next.type === 'string') {\n if (tagsEqualIgnoreCase(current.tagName, next.type)) {\n domHost.updateElementFromVnode(current, next, true, forceUpdate);\n } else {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) {\n teardownNodeSubtree(current);\n parent.replaceChild(dom, current);\n }\n }\n } else if (_isDOMElement(next)) {\n if (trySyncControlBoundaryChild(parent, current, next)) {\n continue;\n }\n\n const synced = trySyncComponentChild(current, next);\n if (synced && synced !== current) {\n teardownNodeSubtree(current);\n } else if (!synced) {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) {\n teardownNodeSubtree(current);\n parent.replaceChild(dom, current);\n }\n }\n } else {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) {\n teardownNodeSubtree(current);\n parent.replaceChild(dom, current);\n }\n }\n }\n return;\n }\n\n const existing = Array.from(parent.children);\n\n if (\n hasText ||\n hasComponentChildren ||\n hasEmptyChildren ||\n hasNonElementDomChildren\n ) {\n const allNodes = Array.from(parent.childNodes);\n const max = Math.max(allNodes.length, newChildren.length);\n\n for (let i = 0; i < max; i++) {\n const currentNode = allNodes[i];\n const next = newChildren[i];\n const nextIsEmpty = isEmptyChild(next);\n\n if (nextIsEmpty && currentNode) {\n teardownNodeSubtree(currentNode);\n currentNode.remove();\n continue;\n }\n\n if (!currentNode && !nextIsEmpty) {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) parent.appendChild(dom);\n continue;\n }\n\n if (!currentNode || nextIsEmpty) continue;\n\n if (typeof next === 'string' || typeof next === 'number') {\n if (currentNode.nodeType === 3) {\n (currentNode as Text).data = String(next);\n } else {\n const textNode = document.createTextNode(String(next));\n parent.replaceChild(textNode, currentNode);\n }\n } else if (_isDOMElement(next)) {\n if (currentNode.nodeType === 1) {\n const currentEl = currentNode as Element;\n if (typeof next.type === 'string') {\n if (tagsEqualIgnoreCase(currentEl.tagName, next.type)) {\n domHost.updateElementFromVnode(\n currentEl,\n next,\n true,\n forceUpdate\n );\n } else {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) {\n teardownNodeSubtree(currentEl);\n parent.replaceChild(dom, currentNode);\n }\n }\n } else {\n if (trySyncControlBoundaryChild(parent, currentNode, next)) {\n continue;\n }\n\n const synced = trySyncComponentChild(currentEl, next);\n if (synced && synced !== currentNode) {\n teardownNodeSubtree(currentEl);\n } else if (!synced) {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) {\n teardownNodeSubtree(currentEl);\n parent.replaceChild(dom, currentNode);\n }\n }\n }\n } else {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) parent.replaceChild(dom, currentNode);\n }\n }\n }\n return;\n }\n\n if (\n newChildren.length === 1 &&\n existing.length === 0 &&\n parent.childNodes.length === 1\n ) {\n const firstNewChild = newChildren[0];\n const firstExisting = parent.firstChild;\n if (\n (typeof firstNewChild === 'string' ||\n typeof firstNewChild === 'number') &&\n firstExisting?.nodeType === 3\n ) {\n (firstExisting as Text).data = String(firstNewChild);\n return;\n }\n }\n\n if (existing.length === 0 && parent.childNodes.length > 0) {\n for (let n = parent.firstChild; n; ) {\n const next = n.nextSibling;\n teardownNodeSubtree(n);\n n = next;\n }\n parent.textContent = '';\n }\n const max = Math.max(existing.length, newChildren.length);\n\n for (let i = 0; i < max; i++) {\n const current = existing[i];\n const next = newChildren[i];\n const nextIsEmpty = isEmptyChild(next);\n\n if (nextIsEmpty && current) {\n teardownNodeSubtree(current);\n current.remove();\n continue;\n }\n\n if (!current && !nextIsEmpty) {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) parent.appendChild(dom);\n continue;\n }\n\n if (!current || nextIsEmpty) continue;\n\n if (typeof next === 'string' || typeof next === 'number') {\n const textNode = document.createTextNode(String(next));\n teardownNodeSubtree(current);\n parent.replaceChild(textNode, current);\n } else if (_isDOMElement(next)) {\n if (typeof next.type === 'string') {\n if (tagsEqualIgnoreCase(current.tagName, next.type)) {\n domHost.updateElementFromVnode(current, next, true, forceUpdate);\n } else {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) {\n teardownNodeSubtree(current);\n parent.replaceChild(dom, current);\n }\n }\n } else {\n const synced = trySyncComponentChild(current, next);\n if (synced && synced !== current) {\n teardownNodeSubtree(current);\n } else if (!synced) {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) {\n teardownNodeSubtree(current);\n parent.replaceChild(dom, current);\n }\n }\n }\n } else {\n const dom = domHost.createDOMNode(next);\n if (dom) {\n teardownNodeSubtree(current);\n parent.replaceChild(dom, current);\n }\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/renderer/env.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
import "../common/env.js";
|
|
1
|
+
import { getRuntimeEnv } from "../common/env.js";
|
|
2
|
+
export { getRuntimeEnv };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { logger } from "../dev/logger.js";
|
|
2
|
+
import { getRendererDOMHost } from "./dom-host.js";
|
|
3
|
+
import { createBoundaryReset, reportBoundaryError, resolveErrorBoundaryFallback } from "../components/error-boundary.js";
|
|
4
|
+
//#region src/renderer/error-boundary-dom.ts
|
|
5
|
+
function createErrorBoundaryElement(node, props, parentNamespace) {
|
|
6
|
+
const boundaryState = node.__instance?.errorBoundaryState ?? null;
|
|
7
|
+
const reset = node.__instance ? createBoundaryReset(node.__instance) : () => {};
|
|
8
|
+
const fallback = props.fallback;
|
|
9
|
+
const children = props.children;
|
|
10
|
+
const domHost = getRendererDOMHost();
|
|
11
|
+
if (boundaryState?.error != null) {
|
|
12
|
+
const fallbackValue = resolveErrorBoundaryFallback(fallback, boundaryState.error, reset);
|
|
13
|
+
if (fallbackValue instanceof Node) return fallbackValue;
|
|
14
|
+
return domHost.createDOMNode(fallbackValue, parentNamespace) ?? document.createComment("");
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
return domHost.createDOMNode(children, parentNamespace) ?? document.createComment("");
|
|
18
|
+
} catch (error) {
|
|
19
|
+
if (node.__instance) reportBoundaryError(node.__instance, error, props.onError);
|
|
20
|
+
else logger.error("[Askr] ErrorBoundary caught render error:", error);
|
|
21
|
+
const fallbackValue = resolveErrorBoundaryFallback(fallback, error, reset);
|
|
22
|
+
if (fallbackValue instanceof Node) return fallbackValue;
|
|
23
|
+
return domHost.createDOMNode(fallbackValue, parentNamespace) ?? document.createComment("");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { createErrorBoundaryElement };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=error-boundary-dom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-boundary-dom.js","names":[],"sources":["../../src/renderer/error-boundary-dom.ts"],"sourcesContent":["import { logger } from '../dev/logger';\nimport {\n createBoundaryReset,\n reportBoundaryError,\n resolveErrorBoundaryFallback,\n type ErrorBoundaryProps,\n} from '../components/error-boundary';\nimport type { ComponentInstance } from '../runtime/component-contracts';\nimport { getRendererDOMHost } from './dom-host';\nimport type { DOMElement } from './types';\n\nexport type ErrorBoundaryVNode = DOMElement & {\n __instance?: ComponentInstance;\n};\n\nexport function createErrorBoundaryElement(\n node: ErrorBoundaryVNode,\n props: Record<string, unknown>,\n parentNamespace?: string\n): Node {\n const boundaryState = node.__instance?.errorBoundaryState ?? null;\n const reset = node.__instance\n ? createBoundaryReset(node.__instance)\n : () => {};\n const fallback = props.fallback as ErrorBoundaryProps['fallback'];\n const children = props.children as ErrorBoundaryProps['children'];\n const domHost = getRendererDOMHost();\n\n if (boundaryState?.error != null) {\n const fallbackValue = resolveErrorBoundaryFallback(\n fallback,\n boundaryState.error,\n reset\n );\n if (fallbackValue instanceof Node) {\n return fallbackValue;\n }\n const fallbackDom = domHost.createDOMNode(fallbackValue, parentNamespace);\n return fallbackDom ?? document.createComment('');\n }\n\n try {\n const dom = domHost.createDOMNode(children, parentNamespace);\n return dom ?? document.createComment('');\n } catch (error) {\n if (node.__instance) {\n reportBoundaryError(\n node.__instance,\n error,\n props.onError as ((next: unknown) => void) | undefined\n );\n } else {\n logger.error('[Askr] ErrorBoundary caught render error:', error);\n }\n\n const fallbackValue = resolveErrorBoundaryFallback(fallback, error, reset);\n if (fallbackValue instanceof Node) {\n return fallbackValue;\n }\n const fallbackDom = domHost.createDOMNode(fallbackValue, parentNamespace);\n return fallbackDom ?? document.createComment('');\n }\n}\n"],"mappings":";;;;AAeA,SAAgB,2BACd,MACA,OACA,iBACM;CACN,MAAM,gBAAgB,KAAK,YAAY,sBAAsB;CAC7D,MAAM,QAAQ,KAAK,aACf,oBAAoB,KAAK,UAAU,UAC7B,CAAC;CACX,MAAM,WAAW,MAAM;CACvB,MAAM,WAAW,MAAM;CACvB,MAAM,UAAU,mBAAmB;CAEnC,IAAI,eAAe,SAAS,MAAM;EAChC,MAAM,gBAAgB,6BACpB,UACA,cAAc,OACd,KACF;EACA,IAAI,yBAAyB,MAC3B,OAAO;EAGT,OADoB,QAAQ,cAAc,eAAe,eAClD,KAAe,SAAS,cAAc,EAAE;CACjD;CAEA,IAAI;EAEF,OADY,QAAQ,cAAc,UAAU,eACrC,KAAO,SAAS,cAAc,EAAE;CACzC,SAAS,OAAO;EACd,IAAI,KAAK,YACP,oBACE,KAAK,YACL,OACA,MAAM,OACR;OAEA,OAAO,MAAM,6CAA6C,KAAK;EAGjE,MAAM,gBAAgB,6BAA6B,UAAU,OAAO,KAAK;EACzE,IAAI,yBAAyB,MAC3B,OAAO;EAGT,OADoB,QAAQ,cAAc,eAAe,eAClD,KAAe,SAAS,cAAc,EAAE;CACjD;AACF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { _isDOMElement } from "../common/vnode.js";
|
|
2
|
+
import "./types.js";
|
|
3
|
+
import { teardownNodeSubtree } from "./cleanup.js";
|
|
4
|
+
import { getRendererDOMHost } from "./dom-host.js";
|
|
5
|
+
import { smartUpdateElement, tagNamesEqualIgnoreCase } from "./evaluate-reconcile.js";
|
|
6
|
+
//#region src/renderer/evaluate-dom-range.ts
|
|
7
|
+
const domRanges = /* @__PURE__ */ new WeakMap();
|
|
8
|
+
function hasDOMRange(context) {
|
|
9
|
+
return domRanges.has(context);
|
|
10
|
+
}
|
|
11
|
+
function createDOMRange(target, context, node) {
|
|
12
|
+
const start = document.createComment("component-start");
|
|
13
|
+
const end = document.createComment("component-end");
|
|
14
|
+
target.appendChild(start);
|
|
15
|
+
target.appendChild(end);
|
|
16
|
+
domRanges.set(context, {
|
|
17
|
+
start,
|
|
18
|
+
end
|
|
19
|
+
});
|
|
20
|
+
const dom = getRendererDOMHost().createDOMNode(node);
|
|
21
|
+
if (dom) target.insertBefore(dom, end);
|
|
22
|
+
}
|
|
23
|
+
function cleanupRangeNode(node) {
|
|
24
|
+
teardownNodeSubtree(node);
|
|
25
|
+
}
|
|
26
|
+
function updateDOMRangeForContext(target, context, children) {
|
|
27
|
+
const range = domRanges.get(context);
|
|
28
|
+
if (!range) return;
|
|
29
|
+
let current = range.start.nextSibling;
|
|
30
|
+
const domHost = getRendererDOMHost();
|
|
31
|
+
for (let i = 0; i < children.length; i++) {
|
|
32
|
+
const nextChild = children[i];
|
|
33
|
+
const currentNode = current === range.end ? null : current;
|
|
34
|
+
const nextCurrent = currentNode?.nextSibling ?? null;
|
|
35
|
+
if (nextChild === null || nextChild === void 0 || nextChild === false) {
|
|
36
|
+
if (currentNode) {
|
|
37
|
+
cleanupRangeNode(currentNode);
|
|
38
|
+
target.removeChild(currentNode);
|
|
39
|
+
}
|
|
40
|
+
current = nextCurrent;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (typeof nextChild === "string" || typeof nextChild === "number") {
|
|
44
|
+
if (currentNode?.nodeType === 3) currentNode.data = String(nextChild);
|
|
45
|
+
else {
|
|
46
|
+
const textNode = document.createTextNode(String(nextChild));
|
|
47
|
+
if (currentNode) {
|
|
48
|
+
cleanupRangeNode(currentNode);
|
|
49
|
+
target.replaceChild(textNode, currentNode);
|
|
50
|
+
} else target.insertBefore(textNode, range.end);
|
|
51
|
+
}
|
|
52
|
+
current = nextCurrent;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (currentNode instanceof Element && _isDOMElement(nextChild) && typeof nextChild.type === "string" && tagNamesEqualIgnoreCase(currentNode.tagName, nextChild.type)) {
|
|
56
|
+
smartUpdateElement(currentNode, nextChild, cleanupRangeNode);
|
|
57
|
+
current = nextCurrent;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const newDom = domHost.createDOMNode(nextChild);
|
|
61
|
+
if (!newDom) {
|
|
62
|
+
if (currentNode) {
|
|
63
|
+
cleanupRangeNode(currentNode);
|
|
64
|
+
target.removeChild(currentNode);
|
|
65
|
+
}
|
|
66
|
+
current = nextCurrent;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (currentNode) {
|
|
70
|
+
cleanupRangeNode(currentNode);
|
|
71
|
+
target.replaceChild(newDom, currentNode);
|
|
72
|
+
} else target.insertBefore(newDom, range.end);
|
|
73
|
+
current = nextCurrent;
|
|
74
|
+
}
|
|
75
|
+
while (current && current !== range.end) {
|
|
76
|
+
const next = current.nextSibling;
|
|
77
|
+
cleanupRangeNode(current);
|
|
78
|
+
target.removeChild(current);
|
|
79
|
+
current = next;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//#endregion
|
|
83
|
+
export { cleanupRangeNode, createDOMRange, hasDOMRange, updateDOMRangeForContext };
|
|
84
|
+
|
|
85
|
+
//# sourceMappingURL=evaluate-dom-range.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate-dom-range.js","names":[],"sources":["../../src/renderer/evaluate-dom-range.ts"],"sourcesContent":["import { teardownNodeSubtree } from './cleanup';\nimport { getRendererDOMHost } from './dom-host';\nimport {\n smartUpdateElement,\n tagNamesEqualIgnoreCase,\n} from './evaluate-reconcile';\nimport { _isDOMElement } from './types';\n\ninterface DOMRange {\n start: Node;\n end: Node;\n}\n\nconst domRanges = new WeakMap<object, DOMRange>();\n\nexport function hasDOMRange(context: object): boolean {\n return domRanges.has(context);\n}\n\nexport function createDOMRange(\n target: Element,\n context: object,\n node: unknown\n): void {\n const start = document.createComment('component-start');\n const end = document.createComment('component-end');\n target.appendChild(start);\n target.appendChild(end);\n domRanges.set(context, { start, end });\n\n const dom = getRendererDOMHost().createDOMNode(node);\n if (dom) {\n target.insertBefore(dom, end);\n }\n}\n\nexport function cleanupRangeNode(node: Node): void {\n teardownNodeSubtree(node);\n}\n\nexport function updateDOMRangeForContext(\n target: Element,\n context: object,\n children: unknown[]\n): void {\n const range = domRanges.get(context);\n if (!range) {\n return;\n }\n\n let current: Node | null = range.start.nextSibling;\n const domHost = getRendererDOMHost();\n\n for (let i = 0; i < children.length; i++) {\n const nextChild = children[i];\n const currentNode = current === range.end ? null : current;\n const nextCurrent = currentNode?.nextSibling ?? null;\n\n if (nextChild === null || nextChild === undefined || nextChild === false) {\n if (currentNode) {\n cleanupRangeNode(currentNode);\n target.removeChild(currentNode);\n }\n current = nextCurrent;\n continue;\n }\n\n if (typeof nextChild === 'string' || typeof nextChild === 'number') {\n if (currentNode?.nodeType === 3) {\n (currentNode as Text).data = String(nextChild);\n } else {\n const textNode = document.createTextNode(String(nextChild));\n if (currentNode) {\n cleanupRangeNode(currentNode);\n target.replaceChild(textNode, currentNode);\n } else {\n target.insertBefore(textNode, range.end);\n }\n }\n current = nextCurrent;\n continue;\n }\n\n if (\n currentNode instanceof Element &&\n _isDOMElement(nextChild) &&\n typeof nextChild.type === 'string' &&\n tagNamesEqualIgnoreCase(currentNode.tagName, nextChild.type)\n ) {\n smartUpdateElement(currentNode, nextChild, cleanupRangeNode);\n current = nextCurrent;\n continue;\n }\n\n const newDom = domHost.createDOMNode(nextChild);\n if (!newDom) {\n if (currentNode) {\n cleanupRangeNode(currentNode);\n target.removeChild(currentNode);\n }\n current = nextCurrent;\n continue;\n }\n\n if (currentNode) {\n cleanupRangeNode(currentNode);\n target.replaceChild(newDom, currentNode);\n } else {\n target.insertBefore(newDom, range.end);\n }\n\n current = nextCurrent;\n }\n\n while (current && current !== range.end) {\n const next = current.nextSibling;\n cleanupRangeNode(current);\n target.removeChild(current);\n current = next;\n }\n}\n\nexport function clearDOMRange(context: object): void {\n domRanges.delete(context);\n}\n"],"mappings":";;;;;;AAaA,MAAM,4BAAY,IAAI,QAA0B;AAEhD,SAAgB,YAAY,SAA0B;CACpD,OAAO,UAAU,IAAI,OAAO;AAC9B;AAEA,SAAgB,eACd,QACA,SACA,MACM;CACN,MAAM,QAAQ,SAAS,cAAc,iBAAiB;CACtD,MAAM,MAAM,SAAS,cAAc,eAAe;CAClD,OAAO,YAAY,KAAK;CACxB,OAAO,YAAY,GAAG;CACtB,UAAU,IAAI,SAAS;EAAE;EAAO;CAAI,CAAC;CAErC,MAAM,MAAM,mBAAmB,CAAC,CAAC,cAAc,IAAI;CACnD,IAAI,KACF,OAAO,aAAa,KAAK,GAAG;AAEhC;AAEA,SAAgB,iBAAiB,MAAkB;CACjD,oBAAoB,IAAI;AAC1B;AAEA,SAAgB,yBACd,QACA,SACA,UACM;CACN,MAAM,QAAQ,UAAU,IAAI,OAAO;CACnC,IAAI,CAAC,OACH;CAGF,IAAI,UAAuB,MAAM,MAAM;CACvC,MAAM,UAAU,mBAAmB;CAEnC,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,YAAY,SAAS;EAC3B,MAAM,cAAc,YAAY,MAAM,MAAM,OAAO;EACnD,MAAM,cAAc,aAAa,eAAe;EAEhD,IAAI,cAAc,QAAQ,cAAc,UAAa,cAAc,OAAO;GACxE,IAAI,aAAa;IACf,iBAAiB,WAAW;IAC5B,OAAO,YAAY,WAAW;GAChC;GACA,UAAU;GACV;EACF;EAEA,IAAI,OAAO,cAAc,YAAY,OAAO,cAAc,UAAU;GAClE,IAAI,aAAa,aAAa,GAC5B,YAAsB,OAAO,OAAO,SAAS;QACxC;IACL,MAAM,WAAW,SAAS,eAAe,OAAO,SAAS,CAAC;IAC1D,IAAI,aAAa;KACf,iBAAiB,WAAW;KAC5B,OAAO,aAAa,UAAU,WAAW;IAC3C,OACE,OAAO,aAAa,UAAU,MAAM,GAAG;GAE3C;GACA,UAAU;GACV;EACF;EAEA,IACE,uBAAuB,WACvB,cAAc,SAAS,KACvB,OAAO,UAAU,SAAS,YAC1B,wBAAwB,YAAY,SAAS,UAAU,IAAI,GAC3D;GACA,mBAAmB,aAAa,WAAW,gBAAgB;GAC3D,UAAU;GACV;EACF;EAEA,MAAM,SAAS,QAAQ,cAAc,SAAS;EAC9C,IAAI,CAAC,QAAQ;GACX,IAAI,aAAa;IACf,iBAAiB,WAAW;IAC5B,OAAO,YAAY,WAAW;GAChC;GACA,UAAU;GACV;EACF;EAEA,IAAI,aAAa;GACf,iBAAiB,WAAW;GAC5B,OAAO,aAAa,QAAQ,WAAW;EACzC,OACE,OAAO,aAAa,QAAQ,MAAM,GAAG;EAGvC,UAAU;CACZ;CAEA,OAAO,WAAW,YAAY,MAAM,KAAK;EACvC,MAAM,OAAO,QAAQ;EACrB,iBAAiB,OAAO;EACxB,OAAO,YAAY,OAAO;EAC1B,UAAU;CACZ;AACF"}
|