@askrjs/askr 0.0.51 → 0.0.52
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/bench/components/benchmark-row.d.ts +2 -2
- package/dist/bench/components/benchmark-row.js +0 -2
- package/dist/bench/components/benchmark-table.js +0 -2
- package/dist/benchmark.d.ts +1 -2
- package/dist/benchmark.js +2 -4
- package/dist/bin/askr-ssg.d.ts +1 -2
- package/dist/bin/askr-ssg.js +21 -6
- package/dist/boot/hydration.js +10 -11
- package/dist/boot/index.d.ts +1 -2
- package/dist/boot/index.js +20 -11
- package/dist/boot/root-lifecycle.d.ts +6 -3
- package/dist/boot/root-lifecycle.js +14 -10
- package/dist/boot/route-startup.js +13 -4
- package/dist/boot/types.d.ts +1 -2
- package/dist/common/attr-names.js +0 -2
- package/dist/common/component.d.ts +1 -2
- package/dist/common/control.d.ts +1 -2
- package/dist/common/control.js +0 -2
- package/dist/common/dom-range.d.ts +13 -0
- package/dist/common/env.js +1 -7
- package/dist/common/error-boundary.d.ts +1 -2
- package/dist/common/invariant.js +0 -2
- package/dist/common/jsx.d.ts +1 -2
- package/dist/common/jsx.js +0 -2
- package/dist/common/logger.js +0 -2
- package/dist/common/promise.js +0 -2
- package/dist/common/props.d.ts +1 -2
- package/dist/common/render-context.js +0 -2
- package/dist/common/route-activity.js +0 -2
- package/dist/common/router-internal.js +0 -2
- package/dist/common/router.d.ts +1 -2
- package/dist/common/ssr-errors.d.ts +1 -2
- package/dist/common/ssr-errors.js +0 -2
- package/dist/common/ssr.d.ts +1 -2
- package/dist/common/ssr.js +0 -2
- package/dist/common/vnode.d.ts +1 -2
- package/dist/common/vnode.js +0 -2
- package/dist/components/error-boundary.d.ts +1 -2
- package/dist/components/error-boundary.js +0 -2
- package/dist/components/link.d.ts +2 -2
- package/dist/components/link.js +0 -2
- package/dist/control/case.d.ts +1 -2
- package/dist/control/case.js +0 -2
- package/dist/control/for.d.ts +1 -2
- package/dist/control/for.js +0 -2
- package/dist/control/shared.d.ts +1 -2
- package/dist/control/shared.js +0 -2
- package/dist/control/show.d.ts +1 -2
- package/dist/control/show.js +0 -2
- package/dist/data/data-runtime.d.ts +1 -2
- package/dist/data/data-runtime.js +3 -5
- package/dist/data/invalidation-listeners.js +0 -2
- package/dist/data/invalidation.d.ts +1 -2
- package/dist/data/invalidation.js +0 -2
- package/dist/data/mutation-cell.d.ts +1 -2
- package/dist/data/mutation-cell.js +6 -5
- package/dist/data/query-cell.d.ts +3 -2
- package/dist/data/query-cell.js +43 -9
- package/dist/data/query-key.js +0 -2
- package/dist/data/shared.js +2 -3
- package/dist/data/types.d.ts +1 -2
- package/dist/foundations/icon/icon.d.ts +1 -2
- package/dist/foundations/icon/icon.js +0 -2
- package/dist/foundations/icon/icon.types.d.ts +1 -2
- package/dist/foundations/interactions/dismissable.d.ts +1 -2
- package/dist/foundations/interactions/dismissable.js +0 -2
- package/dist/foundations/interactions/focusable.d.ts +1 -2
- package/dist/foundations/interactions/focusable.js +0 -2
- package/dist/foundations/interactions/hoverable.d.ts +1 -2
- package/dist/foundations/interactions/hoverable.js +0 -2
- package/dist/foundations/interactions/interaction-policy.d.ts +1 -2
- package/dist/foundations/interactions/interaction-policy.js +0 -2
- package/dist/foundations/interactions/pressable.d.ts +1 -2
- package/dist/foundations/interactions/pressable.js +0 -2
- package/dist/foundations/interactions/roving-focus.d.ts +1 -2
- package/dist/foundations/interactions/roving-focus.js +0 -2
- package/dist/foundations/state/controllable.d.ts +1 -2
- package/dist/foundations/state/controllable.js +0 -2
- package/dist/foundations/structures/collection.d.ts +1 -2
- package/dist/foundations/structures/collection.js +0 -2
- package/dist/foundations/structures/layer.d.ts +1 -2
- package/dist/foundations/structures/layer.js +0 -2
- package/dist/foundations/structures/layout.d.ts +1 -2
- package/dist/foundations/structures/layout.js +0 -2
- package/dist/foundations/structures/presence.d.ts +1 -2
- package/dist/foundations/structures/presence.js +0 -2
- package/dist/foundations/structures/slot.d.ts +1 -2
- package/dist/foundations/structures/slot.js +0 -2
- package/dist/foundations/utilities/aria.d.ts +1 -2
- package/dist/foundations/utilities/aria.js +0 -2
- package/dist/foundations/utilities/compose-handlers.d.ts +1 -2
- package/dist/foundations/utilities/compose-handlers.js +0 -2
- package/dist/foundations/utilities/compose-ref.d.ts +1 -2
- package/dist/foundations/utilities/compose-ref.js +0 -2
- package/dist/foundations/utilities/event-types.d.ts +1 -2
- package/dist/foundations/utilities/merge-props.d.ts +1 -2
- package/dist/foundations/utilities/merge-props.js +0 -2
- package/dist/foundations/utilities/use-id.d.ts +1 -2
- package/dist/foundations/utilities/use-id.js +0 -2
- package/dist/fx/fx.d.ts +1 -2
- package/dist/fx/fx.js +0 -2
- package/dist/fx/noop.js +0 -2
- package/dist/fx/timing.d.ts +1 -2
- package/dist/fx/timing.js +0 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +0 -2
- package/dist/jsx/types.d.ts +1 -2
- package/dist/jsx/utils.d.ts +1 -2
- package/dist/jsx/utils.js +0 -2
- package/dist/jsx-dev-runtime.d.ts +16 -2
- package/dist/jsx-dev-runtime.js +3 -12
- package/dist/jsx-runtime.d.ts +16 -2
- package/dist/jsx-runtime.js +15 -24
- package/dist/jsx-runtime2.d.ts +1 -1
- package/dist/renderer/attributes.js +28 -6
- package/dist/renderer/boundaries.js +48 -172
- package/dist/renderer/boundary-materialization.js +72 -0
- package/dist/renderer/boundary-range-adoption.js +76 -0
- package/dist/renderer/boundary-range-sync.js +101 -0
- package/dist/renderer/boundary-state.js +50 -0
- package/dist/renderer/child-shape.js +0 -2
- package/dist/renderer/children-fastpath.js +3 -3
- package/dist/renderer/children.js +0 -2
- package/dist/renderer/cleanup.js +70 -13
- package/dist/renderer/component-host-cleanup.js +123 -48
- package/dist/renderer/component-host-instances.js +59 -8
- package/dist/renderer/component-host-replacement.js +105 -0
- package/dist/renderer/component-host-results.js +138 -0
- package/dist/renderer/component-host.js +94 -169
- package/dist/renderer/dom-host.js +0 -2
- package/dist/renderer/dom-internal.js +110 -53
- package/dist/renderer/dom-range.js +161 -0
- package/dist/renderer/dom.js +5 -4
- package/dist/renderer/element-children.js +112 -32
- package/dist/renderer/error-boundary-dom.js +19 -11
- package/dist/renderer/evaluate-dom-range.js +3 -4
- package/dist/renderer/evaluate-reconcile.js +12 -37
- package/dist/renderer/evaluate.js +14 -3
- package/dist/renderer/fastpath.js +4 -12
- package/dist/renderer/for-commit-dom-map.js +6 -18
- package/dist/renderer/for-commit-removal.js +7 -16
- package/dist/renderer/for-commit-reorder.js +0 -2
- package/dist/renderer/for-commit.js +172 -44
- package/dist/renderer/hydration-boundaries.js +60 -0
- package/dist/renderer/hydration-listener-transaction.js +49 -0
- package/dist/renderer/index.js +8 -7
- package/dist/renderer/intrinsic-blueprint-analysis.js +202 -0
- package/dist/renderer/intrinsic-blueprint-bindings.js +152 -0
- package/dist/renderer/intrinsic-blueprint-materialization.js +100 -0
- package/dist/renderer/intrinsic-blueprint.js +30 -0
- package/dist/renderer/intrinsic-hydration-adoption.js +66 -0
- package/dist/renderer/keyed-children.js +3 -9
- package/dist/renderer/keyed.js +10 -10
- package/dist/renderer/namespaces.js +0 -2
- package/dist/renderer/prop-bindings.js +56 -21
- package/dist/renderer/reactive-child-dom.js +10 -4
- package/dist/renderer/reactive-child-sources.js +0 -2
- package/dist/renderer/reactive-children.js +29 -20
- package/dist/renderer/reconcile-commit.js +0 -2
- package/dist/renderer/reconcile-fastpaths.js +4 -11
- package/dist/renderer/reconcile-resolution.js +31 -55
- package/dist/renderer/reconcile.js +0 -2
- package/dist/renderer/retained-element-rollback.js +159 -148
- package/dist/renderer/stable-patch.js +3 -4
- package/dist/renderer/static-reuse.js +0 -2
- package/dist/renderer/utils.js +18 -9
- package/dist/router/access.js +0 -2
- package/dist/router/activity.d.ts +1 -2
- package/dist/router/activity.js +0 -2
- package/dist/router/authoring.d.ts +1 -2
- package/dist/router/authoring.js +0 -2
- package/dist/router/internal-types.d.ts +1 -2
- package/dist/router/lazy.d.ts +1 -2
- package/dist/router/lazy.js +0 -2
- package/dist/router/manifest.d.ts +1 -2
- package/dist/router/manifest.js +0 -2
- package/dist/router/match.js +0 -2
- package/dist/router/navigate.d.ts +1 -2
- package/dist/router/navigate.js +4 -7
- package/dist/router/navigation-registry.d.ts +1 -2
- package/dist/router/navigation-registry.js +0 -2
- package/dist/router/navigation-scroll.d.ts +1 -2
- package/dist/router/navigation-scroll.js +0 -2
- package/dist/router/navigation-targets.d.ts +3 -4
- package/dist/router/navigation-targets.js +419 -40
- package/dist/router/policy.d.ts +1 -2
- package/dist/router/policy.js +0 -2
- package/dist/router/rendering.d.ts +1 -2
- package/dist/router/rendering.js +4 -3
- package/dist/router/resolution.d.ts +1 -2
- package/dist/router/resolution.js +0 -2
- package/dist/router/route-context.js +0 -2
- package/dist/router/route-matching.d.ts +1 -2
- package/dist/router/route-matching.js +0 -2
- package/dist/router/route-query.d.ts +1 -2
- package/dist/router/route-query.js +1 -3
- package/dist/router/store.d.ts +1 -2
- package/dist/router/store.js +0 -2
- package/dist/runtime/access.d.ts +1 -2
- package/dist/runtime/access.js +0 -2
- package/dist/runtime/child-scope.d.ts +21 -2
- package/dist/runtime/child-scope.js +101 -54
- package/dist/runtime/component-cleanup.d.ts +1 -2
- package/dist/runtime/component-cleanup.js +2 -4
- package/dist/runtime/component-commit.js +25 -23
- package/dist/runtime/component-facade.js +5 -3
- package/dist/runtime/component-internal.d.ts +11 -6
- package/dist/runtime/component-internal.js +63 -45
- package/dist/runtime/component-lifecycle.d.ts +2 -41
- package/dist/runtime/component-lifecycle.js +6 -149
- package/dist/runtime/component-scope.d.ts +3 -4
- package/dist/runtime/component-scope.js +27 -8
- package/dist/runtime/component.js +4 -3
- package/dist/runtime/context.d.ts +5 -2
- package/dist/runtime/context.js +29 -3
- package/dist/runtime/control.d.ts +22 -3
- package/dist/runtime/control.js +168 -55
- package/dist/runtime/derive.d.ts +1 -2
- package/dist/runtime/derive.js +0 -2
- package/dist/runtime/dev-namespace.d.ts +5 -6
- package/dist/runtime/dev-namespace.js +32 -25
- package/dist/runtime/effect.d.ts +8 -5
- package/dist/runtime/effect.js +158 -75
- package/dist/runtime/error-boundary.d.ts +1 -2
- package/dist/runtime/error-boundary.js +0 -2
- package/dist/runtime/events.d.ts +3 -3
- package/dist/runtime/events.js +66 -69
- package/dist/runtime/execution-model.d.ts +1 -2
- package/dist/runtime/execution-model.js +0 -2
- package/dist/runtime/fastlane.d.ts +1 -2
- package/dist/runtime/fastlane.js +0 -2
- package/dist/runtime/for-bench.d.ts +1 -2
- package/dist/runtime/for-bench.js +9 -167
- package/dist/runtime/for-internal.d.ts +68 -5
- package/dist/runtime/for-internal.js +201 -14
- package/dist/runtime/for-reconcile.d.ts +1 -2
- package/dist/runtime/for-reconcile.js +76 -23
- package/dist/runtime/for-scopes.d.ts +5 -5
- package/dist/runtime/for-scopes.js +168 -48
- package/dist/runtime/for-signals.d.ts +13 -4
- package/dist/runtime/for-signals.js +155 -81
- package/dist/runtime/for-types.d.ts +1 -2
- package/dist/runtime/for.d.ts +2 -2
- package/dist/runtime/for.js +3 -3
- package/dist/runtime/index.d.ts +5 -5
- package/dist/runtime/index.js +12 -10
- package/dist/runtime/lifecycle-batch.d.ts +59 -0
- package/dist/runtime/lifecycle-batch.js +178 -0
- package/dist/runtime/lifecycle-operation-settlement.d.ts +5 -0
- package/dist/runtime/lifecycle-operation-settlement.js +51 -0
- package/dist/runtime/lifecycle-operations.d.ts +1 -2
- package/dist/runtime/lifecycle-operations.js +5 -6
- package/dist/runtime/perf-metrics.d.ts +8 -7
- package/dist/runtime/perf-metrics.js +4 -68
- package/dist/runtime/portal.d.ts +1 -2
- package/dist/runtime/portal.js +103 -11
- package/dist/runtime/readable.d.ts +9 -4
- package/dist/runtime/readable.js +41 -17
- package/dist/runtime/resource-cell.js +2 -4
- package/dist/runtime/resource-operation.d.ts +1 -2
- package/dist/runtime/resource-operation.js +37 -34
- package/dist/runtime/runtime.d.ts +1 -2
- package/dist/runtime/runtime.js +0 -2
- package/dist/runtime/scheduler.d.ts +1 -2
- package/dist/runtime/scheduler.js +8 -11
- package/dist/runtime/selector-store.js +0 -2
- package/dist/runtime/selector.d.ts +1 -2
- package/dist/runtime/selector.js +3 -11
- package/dist/runtime/snapshot-source.d.ts +1 -2
- package/dist/runtime/snapshot-source.js +0 -2
- package/dist/runtime/state.d.ts +1 -2
- package/dist/runtime/state.js +1 -3
- package/dist/ssg/batch-render.js +0 -2
- package/dist/ssg/create-static-gen.d.ts +4 -2
- package/dist/ssg/create-static-gen.js +65 -14
- package/dist/ssg/generate-metadata.js +0 -2
- package/dist/ssg/generation-plan.js +0 -2
- package/dist/ssg/incremental-manifest.js +1 -3
- package/dist/ssg/resolve-ssg-data.js +0 -2
- package/dist/ssg/route-utils.js +0 -2
- package/dist/ssg/static-routes.js +0 -2
- package/dist/ssg/types.d.ts +2 -3
- package/dist/ssg/write-static-files.js +16 -12
- package/dist/ssr/attrs.js +0 -2
- package/dist/ssr/boundaries.js +16 -5
- package/dist/ssr/component-runtime.js +1 -27
- package/dist/ssr/context.d.ts +1 -2
- package/dist/ssr/context.js +0 -2
- package/dist/ssr/errors.d.ts +1 -2
- package/dist/ssr/errors.js +0 -2
- package/dist/ssr/escape.js +0 -2
- package/dist/ssr/hydration-data.js +0 -2
- package/dist/ssr/hydration-verify.d.ts +1 -2
- package/dist/ssr/hydration-verify.js +34 -7
- package/dist/ssr/index-internal.d.ts +1 -2
- package/dist/ssr/index-internal.js +0 -2
- package/dist/ssr/render-keys.js +0 -2
- package/dist/ssr/render-resolved.d.ts +1 -2
- package/dist/ssr/render-resolved.js +0 -2
- package/dist/ssr/render-sync.d.ts +1 -2
- package/dist/ssr/render-sync.js +27 -19
- package/dist/ssr/route-policy-resolution.js +0 -2
- package/dist/ssr/route-render.d.ts +1 -2
- package/dist/ssr/route-render.js +0 -2
- package/dist/ssr/sink.d.ts +1 -2
- package/dist/ssr/sink.js +0 -2
- package/dist/ssr/types.d.ts +1 -2
- package/dist/ssr/verify-hydration.js +0 -2
- package/dist/testing/index.d.ts +1 -2
- package/dist/testing/index.js +0 -2
- package/package.json +57 -44
- package/dist/bench/components/benchmark-row.d.ts.map +0 -1
- package/dist/bench/components/benchmark-row.js.map +0 -1
- package/dist/bench/components/benchmark-table.js.map +0 -1
- package/dist/benchmark.d.ts.map +0 -1
- package/dist/benchmark.js.map +0 -1
- package/dist/bin/askr-ssg.d.ts.map +0 -1
- package/dist/bin/askr-ssg.js.map +0 -1
- package/dist/boot/hydration.js.map +0 -1
- package/dist/boot/index.d.ts.map +0 -1
- package/dist/boot/index.js.map +0 -1
- package/dist/boot/root-lifecycle.d.ts.map +0 -1
- package/dist/boot/root-lifecycle.js.map +0 -1
- package/dist/boot/route-startup.js.map +0 -1
- package/dist/boot/types.d.ts.map +0 -1
- package/dist/common/attr-names.js.map +0 -1
- package/dist/common/component.d.ts.map +0 -1
- package/dist/common/control.d.ts.map +0 -1
- package/dist/common/control.js.map +0 -1
- package/dist/common/env.js.map +0 -1
- package/dist/common/error-boundary.d.ts.map +0 -1
- package/dist/common/invariant.js.map +0 -1
- package/dist/common/jsx.d.ts.map +0 -1
- package/dist/common/jsx.js.map +0 -1
- package/dist/common/logger.js.map +0 -1
- package/dist/common/promise.js.map +0 -1
- package/dist/common/props.d.ts.map +0 -1
- package/dist/common/render-context.js.map +0 -1
- package/dist/common/route-activity.js.map +0 -1
- package/dist/common/router-internal.js.map +0 -1
- package/dist/common/router.d.ts.map +0 -1
- package/dist/common/ssr-errors.d.ts.map +0 -1
- package/dist/common/ssr-errors.js.map +0 -1
- package/dist/common/ssr.d.ts.map +0 -1
- package/dist/common/ssr.js.map +0 -1
- package/dist/common/vnode.d.ts.map +0 -1
- package/dist/common/vnode.js.map +0 -1
- package/dist/components/error-boundary.d.ts.map +0 -1
- package/dist/components/error-boundary.js.map +0 -1
- package/dist/components/link.d.ts.map +0 -1
- package/dist/components/link.js.map +0 -1
- package/dist/control/case.d.ts.map +0 -1
- package/dist/control/case.js.map +0 -1
- package/dist/control/for.d.ts.map +0 -1
- package/dist/control/for.js.map +0 -1
- package/dist/control/shared.d.ts.map +0 -1
- package/dist/control/shared.js.map +0 -1
- package/dist/control/show.d.ts.map +0 -1
- package/dist/control/show.js.map +0 -1
- package/dist/data/data-runtime.d.ts.map +0 -1
- package/dist/data/data-runtime.js.map +0 -1
- package/dist/data/invalidation-listeners.js.map +0 -1
- package/dist/data/invalidation.d.ts.map +0 -1
- package/dist/data/invalidation.js.map +0 -1
- package/dist/data/mutation-cell.d.ts.map +0 -1
- package/dist/data/mutation-cell.js.map +0 -1
- package/dist/data/query-cell.d.ts.map +0 -1
- package/dist/data/query-cell.js.map +0 -1
- package/dist/data/query-key.js.map +0 -1
- package/dist/data/shared.js.map +0 -1
- package/dist/data/types.d.ts.map +0 -1
- package/dist/foundations/icon/icon.d.ts.map +0 -1
- package/dist/foundations/icon/icon.js.map +0 -1
- package/dist/foundations/icon/icon.types.d.ts.map +0 -1
- package/dist/foundations/interactions/dismissable.d.ts.map +0 -1
- package/dist/foundations/interactions/dismissable.js.map +0 -1
- package/dist/foundations/interactions/focusable.d.ts.map +0 -1
- package/dist/foundations/interactions/focusable.js.map +0 -1
- package/dist/foundations/interactions/hoverable.d.ts.map +0 -1
- package/dist/foundations/interactions/hoverable.js.map +0 -1
- package/dist/foundations/interactions/interaction-policy.d.ts.map +0 -1
- package/dist/foundations/interactions/interaction-policy.js.map +0 -1
- package/dist/foundations/interactions/pressable.d.ts.map +0 -1
- package/dist/foundations/interactions/pressable.js.map +0 -1
- package/dist/foundations/interactions/roving-focus.d.ts.map +0 -1
- package/dist/foundations/interactions/roving-focus.js.map +0 -1
- package/dist/foundations/state/controllable.d.ts.map +0 -1
- package/dist/foundations/state/controllable.js.map +0 -1
- package/dist/foundations/structures/collection.d.ts.map +0 -1
- package/dist/foundations/structures/collection.js.map +0 -1
- package/dist/foundations/structures/layer.d.ts.map +0 -1
- package/dist/foundations/structures/layer.js.map +0 -1
- package/dist/foundations/structures/layout.d.ts.map +0 -1
- package/dist/foundations/structures/layout.js.map +0 -1
- package/dist/foundations/structures/presence.d.ts.map +0 -1
- package/dist/foundations/structures/presence.js.map +0 -1
- package/dist/foundations/structures/slot.d.ts.map +0 -1
- package/dist/foundations/structures/slot.js.map +0 -1
- package/dist/foundations/utilities/aria.d.ts.map +0 -1
- package/dist/foundations/utilities/aria.js.map +0 -1
- package/dist/foundations/utilities/compose-handlers.d.ts.map +0 -1
- package/dist/foundations/utilities/compose-handlers.js.map +0 -1
- package/dist/foundations/utilities/compose-ref.d.ts.map +0 -1
- package/dist/foundations/utilities/compose-ref.js.map +0 -1
- package/dist/foundations/utilities/event-types.d.ts.map +0 -1
- package/dist/foundations/utilities/merge-props.d.ts.map +0 -1
- package/dist/foundations/utilities/merge-props.js.map +0 -1
- package/dist/foundations/utilities/use-id.d.ts.map +0 -1
- package/dist/foundations/utilities/use-id.js.map +0 -1
- package/dist/fx/fx.d.ts.map +0 -1
- package/dist/fx/fx.js.map +0 -1
- package/dist/fx/noop.js.map +0 -1
- package/dist/fx/timing.d.ts.map +0 -1
- package/dist/fx/timing.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/jsx/types.d.ts.map +0 -1
- package/dist/jsx/utils.d.ts.map +0 -1
- package/dist/jsx/utils.js.map +0 -1
- package/dist/jsx-dev-runtime.d.ts.map +0 -1
- package/dist/jsx-dev-runtime.js.map +0 -1
- package/dist/jsx-runtime.d.ts.map +0 -1
- package/dist/jsx-runtime.js.map +0 -1
- package/dist/renderer/attributes.js.map +0 -1
- package/dist/renderer/boundaries.js.map +0 -1
- package/dist/renderer/child-shape.js.map +0 -1
- package/dist/renderer/children-fastpath.js.map +0 -1
- package/dist/renderer/children.js.map +0 -1
- package/dist/renderer/cleanup.js.map +0 -1
- package/dist/renderer/component-host-cleanup.js.map +0 -1
- package/dist/renderer/component-host-instances.js.map +0 -1
- package/dist/renderer/component-host.js.map +0 -1
- package/dist/renderer/dom-host.js.map +0 -1
- package/dist/renderer/dom-internal.js.map +0 -1
- package/dist/renderer/element-children.js.map +0 -1
- package/dist/renderer/error-boundary-dom.js.map +0 -1
- package/dist/renderer/evaluate-dom-range.js.map +0 -1
- package/dist/renderer/evaluate-reconcile.js.map +0 -1
- package/dist/renderer/evaluate.js.map +0 -1
- package/dist/renderer/fastpath.js.map +0 -1
- package/dist/renderer/for-commit-dom-map.js.map +0 -1
- package/dist/renderer/for-commit-removal.js.map +0 -1
- package/dist/renderer/for-commit-reorder.js.map +0 -1
- package/dist/renderer/for-commit.js.map +0 -1
- package/dist/renderer/index.js.map +0 -1
- package/dist/renderer/keyed-children.js.map +0 -1
- package/dist/renderer/keyed.js.map +0 -1
- package/dist/renderer/namespaces.js.map +0 -1
- package/dist/renderer/prop-bindings.js.map +0 -1
- package/dist/renderer/reactive-child-dom.js.map +0 -1
- package/dist/renderer/reactive-child-sources.js.map +0 -1
- package/dist/renderer/reactive-children.js.map +0 -1
- package/dist/renderer/reconcile-commit.js.map +0 -1
- package/dist/renderer/reconcile-fastpaths.js.map +0 -1
- package/dist/renderer/reconcile-resolution.js.map +0 -1
- package/dist/renderer/reconcile.js.map +0 -1
- package/dist/renderer/retained-element-rollback.js.map +0 -1
- package/dist/renderer/stable-patch.js.map +0 -1
- package/dist/renderer/static-reuse.js.map +0 -1
- package/dist/renderer/utils.js.map +0 -1
- package/dist/router/access.js.map +0 -1
- package/dist/router/activity.d.ts.map +0 -1
- package/dist/router/activity.js.map +0 -1
- package/dist/router/authoring.d.ts.map +0 -1
- package/dist/router/authoring.js.map +0 -1
- package/dist/router/internal-types.d.ts.map +0 -1
- package/dist/router/lazy.d.ts.map +0 -1
- package/dist/router/lazy.js.map +0 -1
- package/dist/router/manifest.d.ts.map +0 -1
- package/dist/router/manifest.js.map +0 -1
- package/dist/router/match.js.map +0 -1
- package/dist/router/navigate.d.ts.map +0 -1
- package/dist/router/navigate.js.map +0 -1
- package/dist/router/navigation-registry.d.ts.map +0 -1
- package/dist/router/navigation-registry.js.map +0 -1
- package/dist/router/navigation-scroll.d.ts.map +0 -1
- package/dist/router/navigation-scroll.js.map +0 -1
- package/dist/router/navigation-targets.d.ts.map +0 -1
- package/dist/router/navigation-targets.js.map +0 -1
- package/dist/router/policy.d.ts.map +0 -1
- package/dist/router/policy.js.map +0 -1
- package/dist/router/rendering.d.ts.map +0 -1
- package/dist/router/rendering.js.map +0 -1
- package/dist/router/resolution.d.ts.map +0 -1
- package/dist/router/resolution.js.map +0 -1
- package/dist/router/route-context.js.map +0 -1
- package/dist/router/route-matching.d.ts.map +0 -1
- package/dist/router/route-matching.js.map +0 -1
- package/dist/router/route-query.d.ts.map +0 -1
- package/dist/router/route-query.js.map +0 -1
- package/dist/router/store.d.ts.map +0 -1
- package/dist/router/store.js.map +0 -1
- package/dist/runtime/access.d.ts.map +0 -1
- package/dist/runtime/access.js.map +0 -1
- package/dist/runtime/child-scope.d.ts.map +0 -1
- package/dist/runtime/child-scope.js.map +0 -1
- package/dist/runtime/component-cleanup.d.ts.map +0 -1
- package/dist/runtime/component-cleanup.js.map +0 -1
- package/dist/runtime/component-commit.js.map +0 -1
- package/dist/runtime/component-internal.d.ts.map +0 -1
- package/dist/runtime/component-internal.js.map +0 -1
- package/dist/runtime/component-lifecycle.d.ts.map +0 -1
- package/dist/runtime/component-lifecycle.js.map +0 -1
- package/dist/runtime/component-scope.d.ts.map +0 -1
- package/dist/runtime/component-scope.js.map +0 -1
- package/dist/runtime/context.d.ts.map +0 -1
- package/dist/runtime/context.js.map +0 -1
- package/dist/runtime/control.d.ts.map +0 -1
- package/dist/runtime/control.js.map +0 -1
- package/dist/runtime/derive.d.ts.map +0 -1
- package/dist/runtime/derive.js.map +0 -1
- package/dist/runtime/dev-namespace.d.ts.map +0 -1
- package/dist/runtime/dev-namespace.js.map +0 -1
- package/dist/runtime/effect.d.ts.map +0 -1
- package/dist/runtime/effect.js.map +0 -1
- package/dist/runtime/error-boundary.d.ts.map +0 -1
- package/dist/runtime/error-boundary.js.map +0 -1
- package/dist/runtime/events.d.ts.map +0 -1
- package/dist/runtime/events.js.map +0 -1
- package/dist/runtime/execution-model.d.ts.map +0 -1
- package/dist/runtime/execution-model.js.map +0 -1
- package/dist/runtime/fastlane.d.ts.map +0 -1
- package/dist/runtime/fastlane.js.map +0 -1
- package/dist/runtime/for-bench.d.ts.map +0 -1
- package/dist/runtime/for-bench.js.map +0 -1
- package/dist/runtime/for-internal.d.ts.map +0 -1
- package/dist/runtime/for-internal.js.map +0 -1
- package/dist/runtime/for-reconcile.d.ts.map +0 -1
- package/dist/runtime/for-reconcile.js.map +0 -1
- package/dist/runtime/for-scopes.d.ts.map +0 -1
- package/dist/runtime/for-scopes.js.map +0 -1
- package/dist/runtime/for-signals.d.ts.map +0 -1
- package/dist/runtime/for-signals.js.map +0 -1
- package/dist/runtime/for-types.d.ts.map +0 -1
- package/dist/runtime/lifecycle-operations.d.ts.map +0 -1
- package/dist/runtime/lifecycle-operations.js.map +0 -1
- package/dist/runtime/perf-metrics.d.ts.map +0 -1
- package/dist/runtime/perf-metrics.js.map +0 -1
- package/dist/runtime/portal.d.ts.map +0 -1
- package/dist/runtime/portal.js.map +0 -1
- package/dist/runtime/readable.d.ts.map +0 -1
- package/dist/runtime/readable.js.map +0 -1
- package/dist/runtime/resource-cell.js.map +0 -1
- package/dist/runtime/resource-operation.d.ts.map +0 -1
- package/dist/runtime/resource-operation.js.map +0 -1
- package/dist/runtime/runtime.d.ts.map +0 -1
- package/dist/runtime/runtime.js.map +0 -1
- package/dist/runtime/scheduler.d.ts.map +0 -1
- package/dist/runtime/scheduler.js.map +0 -1
- package/dist/runtime/selector-store.js.map +0 -1
- package/dist/runtime/selector.d.ts.map +0 -1
- package/dist/runtime/selector.js.map +0 -1
- package/dist/runtime/snapshot-source.d.ts.map +0 -1
- package/dist/runtime/snapshot-source.js.map +0 -1
- package/dist/runtime/state.d.ts.map +0 -1
- package/dist/runtime/state.js.map +0 -1
- package/dist/ssg/batch-render.js.map +0 -1
- package/dist/ssg/create-static-gen.d.ts.map +0 -1
- package/dist/ssg/create-static-gen.js.map +0 -1
- package/dist/ssg/generate-metadata.js.map +0 -1
- package/dist/ssg/generation-plan.js.map +0 -1
- package/dist/ssg/incremental-manifest.js.map +0 -1
- package/dist/ssg/resolve-ssg-data.js.map +0 -1
- package/dist/ssg/route-utils.js.map +0 -1
- package/dist/ssg/static-routes.js.map +0 -1
- package/dist/ssg/types.d.ts.map +0 -1
- package/dist/ssg/write-static-files.js.map +0 -1
- package/dist/ssr/attrs.js.map +0 -1
- package/dist/ssr/boundaries.js.map +0 -1
- package/dist/ssr/component-runtime.js.map +0 -1
- package/dist/ssr/context.d.ts.map +0 -1
- package/dist/ssr/context.js.map +0 -1
- package/dist/ssr/errors.d.ts.map +0 -1
- package/dist/ssr/errors.js.map +0 -1
- package/dist/ssr/escape.js.map +0 -1
- package/dist/ssr/hydration-data.js.map +0 -1
- package/dist/ssr/hydration-verify.d.ts.map +0 -1
- package/dist/ssr/hydration-verify.js.map +0 -1
- package/dist/ssr/index-internal.d.ts.map +0 -1
- package/dist/ssr/index-internal.js.map +0 -1
- package/dist/ssr/render-keys.js.map +0 -1
- package/dist/ssr/render-resolved.d.ts.map +0 -1
- package/dist/ssr/render-resolved.js.map +0 -1
- package/dist/ssr/render-sync.d.ts.map +0 -1
- package/dist/ssr/render-sync.js.map +0 -1
- package/dist/ssr/route-policy-resolution.js.map +0 -1
- package/dist/ssr/route-render.d.ts.map +0 -1
- package/dist/ssr/route-render.js.map +0 -1
- package/dist/ssr/sink.d.ts.map +0 -1
- package/dist/ssr/sink.js.map +0 -1
- package/dist/ssr/types.d.ts.map +0 -1
- package/dist/ssr/verify-hydration.js.map +0 -1
- package/dist/testing/index.d.ts.map +0 -1
- package/dist/testing/index.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","names":[],"sources":["../../src/runtime/events.ts"],"sourcesContent":["/**\n * Event delegation system for Askr\n *\n * Provides efficient event handling by attaching listeners to a container\n * instead of individual elements. This significantly reduces memory usage\n * and improves performance when many elements have the same event type.\n *\n * Delegated handling is enabled by default. Tests and internal runtime code\n * can still disable or re-enable it when they need to exercise both modes.\n */\n\nimport { runRuntimeHandlerScope } from './access';\nimport { logger } from '../common/logger';\nimport { incrementPerfMetric } from './perf-metrics';\nimport { incDevCounter } from './dev-namespace';\n\nexport interface DelegatedEventMap {\n click: MouseEvent;\n dblclick: MouseEvent;\n mousedown: MouseEvent;\n mouseup: MouseEvent;\n mouseover: MouseEvent;\n mouseout: MouseEvent;\n mousemove: MouseEvent;\n focus: FocusEvent;\n blur: FocusEvent;\n input: InputEvent;\n change: Event;\n keydown: KeyboardEvent;\n keyup: KeyboardEvent;\n keypress: KeyboardEvent;\n submit: Event;\n scroll: Event;\n wheel: WheelEvent;\n touchstart: TouchEvent;\n touchend: TouchEvent;\n touchmove: TouchEvent;\n touchcancel: TouchEvent;\n}\n\nconst DELEGATED_EVENTS: (keyof DelegatedEventMap)[] = [\n 'click',\n 'dblclick',\n 'mousedown',\n 'mouseup',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'focus',\n 'blur',\n 'input',\n 'change',\n 'keydown',\n 'keyup',\n 'keypress',\n 'submit',\n 'scroll',\n 'wheel',\n 'touchstart',\n 'touchend',\n 'touchmove',\n 'touchcancel',\n];\n\ninterface DelegatedHandler {\n handler: EventListener;\n original: EventListener;\n element: Element;\n container: Element;\n eventName: string;\n options?: AddEventListenerOptions;\n}\n\ntype DelegatedHandlerStore = DelegatedHandler | Map<string, DelegatedHandler>;\n\nconst delegatedHandlers = new WeakMap<Element, DelegatedHandlerStore>();\n\nlet eventDelegationEnabled = true;\nlet defaultContainer: Element | null = null;\nlet globalDelegationContainer: Element | null = null;\nconst containerDelegatedListeners = new Map<\n Element,\n Map<string, EventListener>\n>();\nconst containerDelegatedListenerUsage = new Map<Element, Map<string, number>>();\n\nexport function isEventDelegationEnabled(): boolean {\n return eventDelegationEnabled;\n}\n\nexport function disableEventDelegation(): void {\n eventDelegationEnabled = false;\n cleanupAllDelegatedListeners();\n}\n\nexport function enableEventDelegation(container?: Element): void {\n eventDelegationEnabled = true;\n if (container) {\n defaultContainer = container;\n }\n}\n\nexport function setGlobalDelegationContainer(container: Element): void {\n globalDelegationContainer = container;\n}\n\nfunction cleanupAllDelegatedListeners(): void {\n for (const [container, listeners] of containerDelegatedListeners) {\n for (const [eventName, handler] of listeners) {\n container.removeEventListener(eventName, handler);\n }\n }\n containerDelegatedListeners.clear();\n containerDelegatedListenerUsage.clear();\n}\n\nfunction incrementContainerListenerUsage(\n container: Element,\n eventName: string\n): void {\n let usage = containerDelegatedListenerUsage.get(container);\n if (!usage) {\n usage = new Map();\n containerDelegatedListenerUsage.set(container, usage);\n }\n usage.set(eventName, (usage.get(eventName) ?? 0) + 1);\n}\n\nfunction decrementContainerListenerUsage(entry: DelegatedHandler): void {\n const usage = containerDelegatedListenerUsage.get(entry.container);\n if (!usage) {\n return;\n }\n\n const nextCount = (usage.get(entry.eventName) ?? 0) - 1;\n if (nextCount > 0) {\n usage.set(entry.eventName, nextCount);\n return;\n }\n\n usage.delete(entry.eventName);\n const listeners = containerDelegatedListeners.get(entry.container);\n const listener = listeners?.get(entry.eventName);\n if (listener) {\n entry.container.removeEventListener(entry.eventName, listener);\n listeners?.delete(entry.eventName);\n }\n\n if (listeners?.size === 0) {\n containerDelegatedListeners.delete(entry.container);\n }\n if (usage.size === 0) {\n containerDelegatedListenerUsage.delete(entry.container);\n }\n}\n\nfunction getDelegationContainer(): Element | null {\n if (globalDelegationContainer) return globalDelegationContainer;\n if (defaultContainer) return defaultContainer;\n if (typeof document !== 'undefined') return document.body;\n return null;\n}\n\nfunction attachDelegatedListener(\n container: Element,\n element: Element,\n eventName: string,\n handler: EventListener,\n originalHandler: EventListener,\n options?: AddEventListenerOptions\n): void {\n const hadHandler = !!getDelegatedHandlerForElement(element, eventName);\n\n if (!containerDelegatedListeners.has(container)) {\n containerDelegatedListeners.set(container, new Map());\n }\n const containerListeners = containerDelegatedListeners.get(container)!;\n\n if (!containerListeners.has(eventName)) {\n const delegatedHandler = (e: Event) => {\n const target = e.target as Element;\n if (!target) return;\n\n runRuntimeHandlerScope(() => {\n let current: Element | null = target;\n while (current && current !== container) {\n incrementPerfMetric('delegatedAncestorHops');\n const store = delegatedHandlers.get(current);\n const entry = !store\n ? undefined\n : store instanceof Map\n ? store.get(eventName)\n : store.eventName === eventName\n ? store\n : undefined;\n if (entry) {\n try {\n entry.handler(e);\n } catch (error) {\n logger.error('[Askr] Delegated event error:', error);\n }\n }\n\n if (e.cancelBubble) {\n break;\n }\n\n current = current.parentElement;\n }\n }, 'sync');\n };\n\n const passiveOptions = getPassiveOptions(eventName);\n const listenerOptions = passiveOptions ?? options;\n\n container.addEventListener(eventName, delegatedHandler, listenerOptions);\n containerListeners.set(eventName, delegatedHandler);\n }\n\n setDelegatedHandlerForElement(element, {\n handler,\n original: originalHandler,\n element,\n container,\n eventName,\n options,\n });\n if (!hadHandler) {\n incrementContainerListenerUsage(container, eventName);\n }\n}\n\nfunction setDelegatedHandlerForElement(\n element: Element,\n entry: DelegatedHandler\n): void {\n const existing = delegatedHandlers.get(element);\n if (!existing) {\n delegatedHandlers.set(element, entry);\n return;\n }\n\n if (existing instanceof Map) {\n existing.set(entry.eventName, entry);\n return;\n }\n\n if (existing.eventName === entry.eventName) {\n delegatedHandlers.set(element, entry);\n return;\n }\n\n const next = new Map<string, DelegatedHandler>();\n next.set(existing.eventName, existing);\n next.set(entry.eventName, entry);\n delegatedHandlers.set(element, next);\n}\n\nfunction getPassiveOptions(\n eventName: string\n): AddEventListenerOptions | undefined {\n if (\n eventName === 'wheel' ||\n eventName === 'scroll' ||\n eventName.startsWith('touch')\n ) {\n return { passive: true };\n }\n return undefined;\n}\n\nexport function addDelegatedListener(\n element: Element,\n eventName: string,\n handler: EventListener,\n originalHandler: EventListener,\n options?: AddEventListenerOptions\n): void {\n if (!eventDelegationEnabled) return;\n\n const container = getDelegationContainer();\n if (!container) return;\n\n incDevCounter('listenerAdds');\n\n attachDelegatedListener(\n container,\n element,\n eventName,\n handler,\n originalHandler,\n options\n );\n}\n\nexport function updateDelegatedListener(\n element: Element,\n eventName: string,\n handler: EventListener,\n originalHandler: EventListener,\n options?: AddEventListenerOptions\n): boolean {\n const existing = getDelegatedHandlerForElement(element, eventName);\n if (!existing) {\n return false;\n }\n\n const container = getDelegationContainer();\n if (\n !container ||\n existing.container !== container ||\n !containerDelegatedListeners.get(existing.container)?.has(eventName)\n ) {\n removeDelegatedListener(element, eventName);\n return false;\n }\n\n existing.handler = handler;\n existing.original = originalHandler;\n existing.options = options;\n return true;\n}\n\nexport function removeDelegatedListener(\n element: Element,\n eventName: string\n): void {\n const existing = delegatedHandlers.get(element);\n if (!existing) {\n return;\n }\n\n if (existing instanceof Map) {\n if (existing.has(eventName)) {\n incDevCounter('listenerRemoves');\n decrementContainerListenerUsage(existing.get(eventName)!);\n }\n existing.delete(eventName);\n if (existing.size === 0) {\n delegatedHandlers.delete(element);\n return;\n }\n if (existing.size === 1) {\n const only = existing.values().next().value as DelegatedHandler;\n delegatedHandlers.set(element, only);\n }\n return;\n }\n\n if (existing.eventName === eventName) {\n incDevCounter('listenerRemoves');\n decrementContainerListenerUsage(existing);\n delegatedHandlers.delete(element);\n }\n}\n\nexport function getDelegatedHandlerForElement(\n element: Element,\n eventName: string\n): DelegatedHandler | undefined {\n const store = delegatedHandlers.get(element);\n if (!store) return undefined;\n if (store instanceof Map) return store.get(eventName);\n return store.eventName === eventName ? store : undefined;\n}\n\nexport function getDelegatedHandlersForElement(\n element: Element\n): Map<string, DelegatedHandler> | undefined {\n const store = delegatedHandlers.get(element);\n if (!store) return undefined;\n if (store instanceof Map) return store;\n return new Map([[store.eventName, store]]);\n}\n\nexport function hasDelegatedHandler(\n element: Element,\n eventName: string\n): boolean {\n return getDelegatedHandlerForElement(element, eventName) !== undefined;\n}\n\nexport function clearDelegatedHandlersForElement(element: Element): void {\n const existing = delegatedHandlers.get(element);\n if (existing instanceof Map) {\n for (const entry of existing.values()) {\n decrementContainerListenerUsage(entry);\n }\n } else if (existing) {\n decrementContainerListenerUsage(existing);\n }\n delegatedHandlers.delete(element);\n}\n\nexport function getDelegatedEventNames(): readonly (keyof DelegatedEventMap)[] {\n return DELEGATED_EVENTS;\n}\n\nexport function isDelegatedEvent(eventName: string): boolean {\n return DELEGATED_EVENTS.includes(eventName as keyof DelegatedEventMap);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAwCA,MAAM,mBAAgD;CACpD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAaA,MAAM,oCAAoB,IAAI,QAAwC;AAEtE,IAAI,yBAAyB;AAG7B,MAAM,8CAA8B,IAAI,IAGtC;AACF,MAAM,kDAAkC,IAAI,IAAkC;AAE9E,SAAgB,2BAAoC;CAClD,OAAO;AACT;AA4BA,SAAS,gCACP,WACA,WACM;CACN,IAAI,QAAQ,gCAAgC,IAAI,SAAS;CACzD,IAAI,CAAC,OAAO;EACV,wBAAQ,IAAI,IAAI;EAChB,gCAAgC,IAAI,WAAW,KAAK;CACtD;CACA,MAAM,IAAI,YAAY,MAAM,IAAI,SAAS,KAAK,KAAK,CAAC;AACtD;AAEA,SAAS,gCAAgC,OAA+B;CACtE,MAAM,QAAQ,gCAAgC,IAAI,MAAM,SAAS;CACjE,IAAI,CAAC,OACH;CAGF,MAAM,aAAa,MAAM,IAAI,MAAM,SAAS,KAAK,KAAK;CACtD,IAAI,YAAY,GAAG;EACjB,MAAM,IAAI,MAAM,WAAW,SAAS;EACpC;CACF;CAEA,MAAM,OAAO,MAAM,SAAS;CAC5B,MAAM,YAAY,4BAA4B,IAAI,MAAM,SAAS;CACjE,MAAM,WAAW,WAAW,IAAI,MAAM,SAAS;CAC/C,IAAI,UAAU;EACZ,MAAM,UAAU,oBAAoB,MAAM,WAAW,QAAQ;EAC7D,WAAW,OAAO,MAAM,SAAS;CACnC;CAEA,IAAI,WAAW,SAAS,GACtB,4BAA4B,OAAO,MAAM,SAAS;CAEpD,IAAI,MAAM,SAAS,GACjB,gCAAgC,OAAO,MAAM,SAAS;AAE1D;AAEA,SAAS,yBAAyC;CAGhD,IAAI,OAAO,aAAa,aAAa,OAAO,SAAS;CACrD,OAAO;AACT;AAEA,SAAS,wBACP,WACA,SACA,WACA,SACA,iBACA,SACM;CACN,MAAM,aAAa,CAAC,CAAC,8BAA8B,SAAS,SAAS;CAErE,IAAI,CAAC,4BAA4B,IAAI,SAAS,GAC5C,4BAA4B,IAAI,2BAAW,IAAI,IAAI,CAAC;CAEtD,MAAM,qBAAqB,4BAA4B,IAAI,SAAS;CAEpE,IAAI,CAAC,mBAAmB,IAAI,SAAS,GAAG;EACtC,MAAM,oBAAoB,MAAa;GACrC,MAAM,SAAS,EAAE;GACjB,IAAI,CAAC,QAAQ;GAEb,6BAA6B;IAC3B,IAAI,UAA0B;IAC9B,OAAO,WAAW,YAAY,WAAW;KACvC,oBAAoB,uBAAuB;KAC3C,MAAM,QAAQ,kBAAkB,IAAI,OAAO;KAC3C,MAAM,QAAQ,CAAC,QACX,SACA,iBAAiB,MACf,MAAM,IAAI,SAAS,IACnB,MAAM,cAAc,YAClB,QACA;KACR,IAAI,OACF,IAAI;MACF,MAAM,QAAQ,CAAC;KACjB,SAAS,OAAO;MACd,OAAO,MAAM,iCAAiC,KAAK;KACrD;KAGF,IAAI,EAAE,cACJ;KAGF,UAAU,QAAQ;IACpB;GACF,GAAG,MAAM;EACX;EAGA,MAAM,kBADiB,kBAAkB,SACjB,KAAkB;EAE1C,UAAU,iBAAiB,WAAW,kBAAkB,eAAe;EACvE,mBAAmB,IAAI,WAAW,gBAAgB;CACpD;CAEA,8BAA8B,SAAS;EACrC;EACA,UAAU;EACV;EACA;EACA;EACA;CACF,CAAC;CACD,IAAI,CAAC,YACH,gCAAgC,WAAW,SAAS;AAExD;AAEA,SAAS,8BACP,SACA,OACM;CACN,MAAM,WAAW,kBAAkB,IAAI,OAAO;CAC9C,IAAI,CAAC,UAAU;EACb,kBAAkB,IAAI,SAAS,KAAK;EACpC;CACF;CAEA,IAAI,oBAAoB,KAAK;EAC3B,SAAS,IAAI,MAAM,WAAW,KAAK;EACnC;CACF;CAEA,IAAI,SAAS,cAAc,MAAM,WAAW;EAC1C,kBAAkB,IAAI,SAAS,KAAK;EACpC;CACF;CAEA,MAAM,uBAAO,IAAI,IAA8B;CAC/C,KAAK,IAAI,SAAS,WAAW,QAAQ;CACrC,KAAK,IAAI,MAAM,WAAW,KAAK;CAC/B,kBAAkB,IAAI,SAAS,IAAI;AACrC;AAEA,SAAS,kBACP,WACqC;CACrC,IACE,cAAc,WACd,cAAc,YACd,UAAU,WAAW,OAAO,GAE5B,OAAO,EAAE,SAAS,KAAK;AAG3B;AAEA,SAAgB,qBACd,SACA,WACA,SACA,iBACA,SACM;CAGN,MAAM,YAAY,uBAAuB;CACzC,IAAI,CAAC,WAAW;CAEhB,cAAc,cAAc;CAE5B,wBACE,WACA,SACA,WACA,SACA,iBACA,OACF;AACF;AAEA,SAAgB,wBACd,SACA,WACA,SACA,iBACA,SACS;CACT,MAAM,WAAW,8BAA8B,SAAS,SAAS;CACjE,IAAI,CAAC,UACH,OAAO;CAGT,MAAM,YAAY,uBAAuB;CACzC,IACE,CAAC,aACD,SAAS,cAAc,aACvB,CAAC,4BAA4B,IAAI,SAAS,SAAS,CAAC,EAAE,IAAI,SAAS,GACnE;EACA,wBAAwB,SAAS,SAAS;EAC1C,OAAO;CACT;CAEA,SAAS,UAAU;CACnB,SAAS,WAAW;CACpB,SAAS,UAAU;CACnB,OAAO;AACT;AAEA,SAAgB,wBACd,SACA,WACM;CACN,MAAM,WAAW,kBAAkB,IAAI,OAAO;CAC9C,IAAI,CAAC,UACH;CAGF,IAAI,oBAAoB,KAAK;EAC3B,IAAI,SAAS,IAAI,SAAS,GAAG;GAC3B,cAAc,iBAAiB;GAC/B,gCAAgC,SAAS,IAAI,SAAS,CAAE;EAC1D;EACA,SAAS,OAAO,SAAS;EACzB,IAAI,SAAS,SAAS,GAAG;GACvB,kBAAkB,OAAO,OAAO;GAChC;EACF;EACA,IAAI,SAAS,SAAS,GAAG;GACvB,MAAM,OAAO,SAAS,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;GACtC,kBAAkB,IAAI,SAAS,IAAI;EACrC;EACA;CACF;CAEA,IAAI,SAAS,cAAc,WAAW;EACpC,cAAc,iBAAiB;EAC/B,gCAAgC,QAAQ;EACxC,kBAAkB,OAAO,OAAO;CAClC;AACF;AAEA,SAAgB,8BACd,SACA,WAC8B;CAC9B,MAAM,QAAQ,kBAAkB,IAAI,OAAO;CAC3C,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,iBAAiB,KAAK,OAAO,MAAM,IAAI,SAAS;CACpD,OAAO,MAAM,cAAc,YAAY,QAAQ;AACjD;AAEA,SAAgB,+BACd,SAC2C;CAC3C,MAAM,QAAQ,kBAAkB,IAAI,OAAO;CAC3C,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,iBAAiB,KAAK,OAAO;CACjC,uBAAO,IAAI,IAAI,CAAC,CAAC,MAAM,WAAW,KAAK,CAAC,CAAC;AAC3C;AASA,SAAgB,iCAAiC,SAAwB;CACvE,MAAM,WAAW,kBAAkB,IAAI,OAAO;CAC9C,IAAI,oBAAoB,KACtB,KAAK,MAAM,SAAS,SAAS,OAAO,GAClC,gCAAgC,KAAK;MAElC,IAAI,UACT,gCAAgC,QAAQ;CAE1C,kBAAkB,OAAO,OAAO;AAClC;AAMA,SAAgB,iBAAiB,WAA4B;CAC3D,OAAO,iBAAiB,SAAS,SAAoC;AACvE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execution-model.d.ts","names":[],"sources":["../../src/runtime/execution-model.ts"],"mappings":";KAAY,cAAA;AAAA,iBAII,iBAAA,IAAqB,cAAc;AAAA,iBAKnC,oBAAA,CAAqB,KAAqB,EAAd,cAAc"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execution-model.js","names":[],"sources":["../../src/runtime/execution-model.ts"],"sourcesContent":["export type ExecutionModel = 'spa' | 'islands' | 'ssr';\n\nconst EXECUTION_MODEL_KEY = Symbol.for('__ASKR_EXECUTION_MODEL__');\n\nexport function getExecutionModel(): ExecutionModel | undefined {\n const g = globalThis as unknown as Record<string | symbol, unknown>;\n return g[EXECUTION_MODEL_KEY] as ExecutionModel | undefined;\n}\n\nexport function assertExecutionModel(model: ExecutionModel): void {\n // Mixing execution models is forbidden: once an app starts in one model,\n // attempting to start another is an invariant violation.\n const g = globalThis as unknown as Record<string | symbol, unknown>;\n const cur = g[EXECUTION_MODEL_KEY] as ExecutionModel | undefined;\n if (cur && cur !== model) {\n throw new Error(\n `[Askr] mixing execution models is not allowed (current: ${cur}, attempted: ${model}). ` +\n `Choose exactly one: createSPA, createSSR, or createIslands.`\n );\n }\n if (!cur) g[EXECUTION_MODEL_KEY] = model;\n}\n"],"mappings":";AAEA,MAAM,sBAAsB,OAAO,IAAI,0BAA0B;AAEjE,SAAgB,oBAAgD;CAE9D,OAAO,WAAE;AACX;AAEA,SAAgB,qBAAqB,OAA6B;CAGhE,MAAM,IAAI;CACV,MAAM,MAAM,EAAE;CACd,IAAI,OAAO,QAAQ,OACjB,MAAM,IAAI,MACR,2DAA2D,IAAI,eAAe,MAAM,+DAEtF;CAEF,IAAI,CAAC,KAAK,EAAE,uBAAuB;AACrC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fastlane.d.ts","names":[],"sources":["../../src/runtime/fastlane.ts"],"mappings":";;iBAegB,eAAA;AAAA,iBAOA,cAAA;AAAA,iBAMA,kBAAA;AAAA,iBAMA,mBAAA,CAAoB,MAAe,EAAP,OAAO;AAAA,iBASnC,iBAAA,CAAkB,MAAe,EAAP,OAAO;AAAA,iBAgDjC,cAAA,CAAe,QAAA,EAAU,iBAAiB,EAAE,MAAA;;;;;;;;;;;;;;;;;;;;;;;;iBA2E5C,iBAAA,CACd,QAAA,EAAU,iBAAiB,EAC3B,MAAA;AAAA,iBAyGc,sBAAA,CACd,QAAA,EAAU,iBAAiB,EAC3B,MAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fastlane.js","names":[],"sources":["../../src/runtime/fastlane.ts"],"sourcesContent":["import { isDevelopmentEnvironment } from '../common/env';\nimport {\n getRuntimeRenderer,\n getRuntimeSchedulerState,\n runRuntimeWithSyncProgress,\n setRuntimeBulkCommitProbe,\n} from './access';\nimport type { ComponentInstance } from './component';\nimport { finalizeReadableSubscriptions } from './readable';\nimport { Fragment } from '../common/jsx';\nimport { setDevValue, getDevValue, getDevNamespace } from './dev-namespace';\n\nlet _bulkCommitActive = false;\nlet _appliedParents: WeakSet<Element> | null = null;\n\nexport function enterBulkCommit(): void {\n _bulkCommitActive = true;\n // Initialize registry of parents that had fast-path applied during this bulk commit\n _appliedParents = new WeakSet<Element>();\n setDevValue('__FASTLANE_CLEARED_TASKS', 0);\n}\n\nexport function exitBulkCommit(): void {\n _bulkCommitActive = false;\n // Clear registry to avoid leaking across commits\n _appliedParents = null;\n}\n\nexport function isBulkCommitActive(): boolean {\n return _bulkCommitActive;\n}\n\n// Mark that a fast-path was applied on a parent element during the active\n// bulk commit. No-op if there is no active bulk commit.\nexport function markFastPathApplied(parent: Element): void {\n if (!_appliedParents) return;\n try {\n _appliedParents.add(parent);\n } catch (e) {\n void e;\n }\n}\n\nexport function isFastPathApplied(parent: Element): boolean {\n return !!(_appliedParents && _appliedParents.has(parent));\n}\n\nfunction finalizeReadSubscriptions(instance: ComponentInstance): void {\n finalizeReadableSubscriptions(instance);\n}\n\n/**\n * Attempt to execute a runtime fast-lane for a single component's synchronous\n * render result. Returns true if the fast-lane was used and commit was done.\n *\n * Preconditions (checked conservatively):\n * - The render result is an intrinsic element root with keyed children\n * - The renderer's fast-path heuristics indicate to use the fast-path\n * - No mount operations are pending on the component instance\n * - No child vnodes are component functions (avoid async/component mounts)\n */\n\n// Helper to unwrap Fragment vnodes to get the first intrinsic element child\nfunction unwrapFragmentForFastPath(vnode: unknown): unknown {\n if (!vnode || typeof vnode !== 'object' || !('type' in vnode)) return vnode;\n const v = vnode as {\n type: unknown;\n children?: unknown;\n props?: { children?: unknown };\n };\n // Check if it's a Fragment\n if (\n typeof v.type === 'symbol' &&\n (v.type === Fragment || String(v.type) === 'Symbol(askr.fragment)')\n ) {\n const children = v.props?.children ?? v.children;\n if (Array.isArray(children) && children.length > 0) {\n // Return the first child that's an intrinsic element\n for (const child of children) {\n if (child && typeof child === 'object' && 'type' in child) {\n const c = child as { type: unknown };\n if (typeof c.type === 'string') {\n return child;\n }\n }\n }\n }\n }\n return vnode;\n}\n\nexport function classifyUpdate(instance: ComponentInstance, result: unknown) {\n // Returns a classification describing whether this update is eligible for\n // the reorder-only fast-lane. The classifier mirrors renderer-level\n // heuristics and performs runtime-level checks (mounts, effects, component\n // children) that the renderer cannot reason about.\n\n // Unwrap Fragment to get the actual element vnode for classification\n const unwrappedResult = unwrapFragmentForFastPath(result);\n\n if (\n !unwrappedResult ||\n typeof unwrappedResult !== 'object' ||\n !('type' in unwrappedResult)\n )\n return { useFastPath: false, reason: 'not-vnode' };\n\n const vnode = unwrappedResult as {\n type: unknown;\n children?: unknown;\n props?: { children?: unknown };\n };\n if (vnode == null || typeof vnode.type !== 'string')\n return { useFastPath: false, reason: 'not-intrinsic' };\n\n const parent = instance.target;\n if (!parent) return { useFastPath: false, reason: 'no-root' };\n\n const firstChild = parent.children[0] as Element | undefined;\n if (!firstChild) return { useFastPath: false, reason: 'no-first-child' };\n if (firstChild.tagName.toLowerCase() !== String(vnode.type).toLowerCase())\n return { useFastPath: false, reason: 'root-tag-mismatch' };\n\n const children = vnode.props?.children ?? vnode.children;\n if (!Array.isArray(children))\n return { useFastPath: false, reason: 'no-children-array' };\n\n // Avoid component child vnodes (they may mount/unmount or trigger async)\n for (const c of children) {\n if (\n typeof c === 'object' &&\n c !== null &&\n 'type' in c &&\n typeof (c as { type?: unknown }).type === 'function'\n ) {\n return { useFastPath: false, reason: 'component-child-present' };\n }\n }\n\n if ((instance.mountOperations?.length ?? 0) > 0)\n return { useFastPath: false, reason: 'pending-mounts' };\n if ((instance.commitOperations?.length ?? 0) > 0)\n return { useFastPath: false, reason: 'pending-lifecycle-commits' };\n\n // Ask renderer for keyed reorder eligibility (prop differences & heuristics)\n // Ensure a keyed map is available for the first child by populating it proactively.\n const renderer = getRuntimeRenderer();\n try {\n renderer.populateKeyMapForElement(firstChild);\n } catch {\n // ignore\n }\n\n const oldKeyMap = renderer.getKeyMapForElement(firstChild);\n const decision = renderer.isKeyedReorderFastPathEligible(\n firstChild,\n children,\n oldKeyMap\n );\n\n if (!decision.useFastPath || decision.totalKeyed < 128)\n return { ...decision, useFastPath: false, reason: 'renderer-declined' };\n\n return { ...decision, useFastPath: true } as const;\n}\n\nexport function commitReorderOnly(\n instance: ComponentInstance,\n result: unknown\n): boolean {\n // Performs the minimal, synchronous reorder-only commit.\n const renderer = getRuntimeRenderer();\n\n const schedBefore = isDevelopmentEnvironment()\n ? getRuntimeSchedulerState()\n : null;\n\n enterBulkCommit();\n\n try {\n runRuntimeWithSyncProgress(() => {\n renderer.evaluate(result, instance.target);\n\n // Finalize runtime bookkeeping (read subscriptions / tokens)\n try {\n finalizeReadSubscriptions(instance);\n } catch (e) {\n if (isDevelopmentEnvironment()) throw e;\n }\n });\n\n setDevValue('__FASTLANE_CLEARED_AFTER', 0);\n\n // Dev-only invariant checks\n if (isDevelopmentEnvironment()) {\n validateFastLaneInvariants(instance, schedBefore);\n }\n\n return true;\n } finally {\n // Clear bulk commit flag first\n exitBulkCommit();\n }\n // Note: The original code had a check here that was dead code because\n // exitBulkCommit() already ran in the finally block. This comment serves\n // as documentation that we've intentionally removed that unreachable code.\n}\n\n/**\n * Validates fast-lane invariants in dev mode.\n * Extracted to reduce complexity in commitReorderOnly.\n */\nfunction validateFastLaneInvariants(\n instance: ComponentInstance,\n schedBefore: ReturnType<typeof getRuntimeSchedulerState> | null\n): void {\n const commitCount = getDevValue<number>('__LAST_FASTPATH_COMMIT_COUNT') ?? 0;\n const invariants = {\n commitCount,\n mountOps: instance.mountOperations?.length ?? 0,\n commitOps: instance.commitOperations?.length ?? 0,\n cleanupFns: instance.cleanupFns?.length ?? 0,\n };\n setDevValue('__LAST_FASTLANE_INVARIANTS', invariants);\n\n if (commitCount !== 1) {\n console.error(\n '[FASTLANE][INV] commitCount',\n commitCount,\n 'diag',\n getDevNamespace()\n );\n throw new Error(\n 'Fast-lane invariant violated: expected exactly one DOM commit during reorder-only commit'\n );\n }\n\n if (invariants.mountOps > 0) {\n throw new Error(\n 'Fast-lane invariant violated: mount operations were registered during bulk commit'\n );\n }\n\n if (invariants.commitOps > 0) {\n throw new Error(\n 'Fast-lane invariant violated: lifecycle commit operations were registered during bulk commit'\n );\n }\n\n if (invariants.cleanupFns > 0) {\n throw new Error(\n 'Fast-lane invariant violated: cleanup functions were added during bulk commit'\n );\n }\n\n const schedAfter = getRuntimeSchedulerState();\n if (\n schedBefore &&\n schedAfter &&\n schedAfter.taskCount > schedBefore.taskCount\n ) {\n console.error(\n '[FASTLANE] schedBefore, schedAfter',\n schedBefore,\n schedAfter\n );\n console.error('[FASTLANE] enqueue logs', getDevValue('__ENQUEUE_LOGS'));\n throw new Error(\n 'Fast-lane invariant violated: scheduler enqueued leftover work during bulk commit'\n );\n }\n}\n\nexport function tryRuntimeFastLaneSync(\n instance: ComponentInstance,\n result: unknown\n): boolean {\n const cls = classifyUpdate(instance, result);\n if (!cls.useFastPath) {\n // Clear stale fast-path diagnostics\n setDevValue('__LAST_FASTPATH_STATS', undefined);\n setDevValue('__LAST_FASTPATH_COMMIT_COUNT', 0);\n return false;\n }\n\n try {\n return commitReorderOnly(instance, result);\n } catch (err) {\n // Surface dev-only invariant failures, otherwise decline silently\n if (isDevelopmentEnvironment()) throw err;\n return false;\n }\n}\n\nsetRuntimeBulkCommitProbe(isBulkCommitActive);\n"],"mappings":";;;;;;AAYA,IAAI,oBAAoB;AACxB,IAAI,kBAA2C;AAE/C,SAAgB,kBAAwB;CACtC,oBAAoB;CAEpB,kCAAkB,IAAI,QAAiB;CACvC,YAAY,4BAA4B,CAAC;AAC3C;AAEA,SAAgB,iBAAuB;CACrC,oBAAoB;CAEpB,kBAAkB;AACpB;AAEA,SAAgB,qBAA8B;CAC5C,OAAO;AACT;AAIA,SAAgB,oBAAoB,QAAuB;CACzD,IAAI,CAAC,iBAAiB;CACtB,IAAI;EACF,gBAAgB,IAAI,MAAM;CAC5B,SAAS,GAAG,CAEZ;AACF;AAMA,SAAS,0BAA0B,UAAmC;CACpE,8BAA8B,QAAQ;AACxC;;;;;;;;;;;AAcA,SAAS,0BAA0B,OAAyB;CAC1D,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,EAAE,UAAU,QAAQ,OAAO;CACtE,MAAM,IAAI;CAMV,IACE,OAAO,EAAE,SAAS,aACjB,EAAE,SAAS,YAAY,OAAO,EAAE,IAAI,MAAM,0BAC3C;EACA,MAAM,WAAW,EAAE,OAAO,YAAY,EAAE;EACxC,IAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,GAE/C;QAAK,MAAM,SAAS,UAClB,IAAI,SAAS,OAAO,UAAU,YAAY,UAAU,OAElD;QAAI,OAAO,MAAE,SAAS,UACpB,OAAO;GACT;EAEJ;CAEJ;CACA,OAAO;AACT;AAEA,SAAgB,eAAe,UAA6B,QAAiB;CAO3E,MAAM,kBAAkB,0BAA0B,MAAM;CAExD,IACE,CAAC,mBACD,OAAO,oBAAoB,YAC3B,EAAE,UAAU,kBAEZ,OAAO;EAAE,aAAa;EAAO,QAAQ;CAAY;CAEnD,MAAM,QAAQ;CAKd,IAAI,SAAS,QAAQ,OAAO,MAAM,SAAS,UACzC,OAAO;EAAE,aAAa;EAAO,QAAQ;CAAgB;CAEvD,MAAM,SAAS,SAAS;CACxB,IAAI,CAAC,QAAQ,OAAO;EAAE,aAAa;EAAO,QAAQ;CAAU;CAE5D,MAAM,aAAa,OAAO,SAAS;CACnC,IAAI,CAAC,YAAY,OAAO;EAAE,aAAa;EAAO,QAAQ;CAAiB;CACvE,IAAI,WAAW,QAAQ,YAAY,MAAM,OAAO,MAAM,IAAI,CAAC,CAAC,YAAY,GACtE,OAAO;EAAE,aAAa;EAAO,QAAQ;CAAoB;CAE3D,MAAM,WAAW,MAAM,OAAO,YAAY,MAAM;CAChD,IAAI,CAAC,MAAM,QAAQ,QAAQ,GACzB,OAAO;EAAE,aAAa;EAAO,QAAQ;CAAoB;CAG3D,KAAK,MAAM,KAAK,UACd,IACE,OAAO,MAAM,YACb,MAAM,QACN,UAAU,KACV,OAAQ,EAAyB,SAAS,YAE1C,OAAO;EAAE,aAAa;EAAO,QAAQ;CAA0B;CAInE,KAAK,SAAS,iBAAiB,UAAU,KAAK,GAC5C,OAAO;EAAE,aAAa;EAAO,QAAQ;CAAiB;CACxD,KAAK,SAAS,kBAAkB,UAAU,KAAK,GAC7C,OAAO;EAAE,aAAa;EAAO,QAAQ;CAA4B;CAInE,MAAM,WAAW,mBAAmB;CACpC,IAAI;EACF,SAAS,yBAAyB,UAAU;CAC9C,QAAQ,CAER;CAEA,MAAM,YAAY,SAAS,oBAAoB,UAAU;CACzD,MAAM,WAAW,SAAS,+BACxB,YACA,UACA,SACF;CAEA,IAAI,CAAC,SAAS,eAAe,SAAS,aAAa,KACjD,OAAO;EAAE,GAAG;EAAU,aAAa;EAAO,QAAQ;CAAoB;CAExE,OAAO;EAAE,GAAG;EAAU,aAAa;CAAK;AAC1C;AAEA,SAAgB,kBACd,UACA,QACS;CAET,MAAM,WAAW,mBAAmB;CAEpC,MAAM,cAAc,yBAAyB,IACzC,yBAAyB,IACzB;CAEJ,gBAAgB;CAEhB,IAAI;EACF,iCAAiC;GAC/B,SAAS,SAAS,QAAQ,SAAS,MAAM;GAGzC,IAAI;IACF,0BAA0B,QAAQ;GACpC,SAAS,GAAG;IACV,IAAI,yBAAyB,GAAG,MAAM;GACxC;EACF,CAAC;EAED,YAAY,4BAA4B,CAAC;EAGzC,IAAI,yBAAyB,GAC3B,2BAA2B,UAAU,WAAW;EAGlD,OAAO;CACT,UAAU;EAER,eAAe;CACjB;AAIF;;;;;AAMA,SAAS,2BACP,UACA,aACM;CACN,MAAM,cAAc,YAAoB,8BAA8B,KAAK;CAC3E,MAAM,aAAa;EACjB;EACA,UAAU,SAAS,iBAAiB,UAAU;EAC9C,WAAW,SAAS,kBAAkB,UAAU;EAChD,YAAY,SAAS,YAAY,UAAU;CAC7C;CACA,YAAY,8BAA8B,UAAU;CAEpD,IAAI,gBAAgB,GAAG;EACrB,QAAQ,MACN,+BACA,aACA,QACA,gBAAgB,CAClB;EACA,MAAM,IAAI,MACR,0FACF;CACF;CAEA,IAAI,WAAW,WAAW,GACxB,MAAM,IAAI,MACR,mFACF;CAGF,IAAI,WAAW,YAAY,GACzB,MAAM,IAAI,MACR,8FACF;CAGF,IAAI,WAAW,aAAa,GAC1B,MAAM,IAAI,MACR,+EACF;CAGF,MAAM,aAAa,yBAAyB;CAC5C,IACE,eACA,cACA,WAAW,YAAY,YAAY,WACnC;EACA,QAAQ,MACN,sCACA,aACA,UACF;EACA,QAAQ,MAAM,2BAA2B,YAAY,gBAAgB,CAAC;EACtE,MAAM,IAAI,MACR,mFACF;CACF;AACF;AAEA,SAAgB,uBACd,UACA,QACS;CAET,IAAI,CADQ,eAAe,UAAU,MAChC,CAAA,CAAI,aAAa;EAEpB,YAAY,yBAAyB,MAAS;EAC9C,YAAY,gCAAgC,CAAC;EAC7C,OAAO;CACT;CAEA,IAAI;EACF,OAAO,kBAAkB,UAAU,MAAM;CAC3C,SAAS,KAAK;EAEZ,IAAI,yBAAyB,GAAG,MAAM;EACtC,OAAO;CACT;AACF;AAEA,0BAA0B,kBAAkB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"for-bench.d.ts","names":[],"sources":["../../src/runtime/for-bench.ts"],"mappings":";UASiB,YAAA;EACf,YAAA;EACA,WAAA;EACA,YAAA;EACA,UAAA;EACA,qBAAA;EACA,UAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,UAAA;EACA,QAAA;EACA,WAAA;EACA,WAAA;EACA,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,sBAAA;EACA,gBAAA;EACA,gBAAA;EACA,gBAAA;EACA,YAAA;AAAA;AAAA,KAGU,UAAA;AAAA,KA0CP,gBAAA;AAAA,KACA,YAAA;AAAA,iBAmJI,wBAAA,IAA4B,KAAA,EAAO,gBAAA,EAAkB,GAAA,QAAW,CAAA,GAAI,CAAA;AAAA,cAoChE,iBAAA;AAAA,cAUA,gBAAA,GAAgB,KAAA,EAlIQ,UAAU,EAAA,KAAA;AAAA,cAsIlC,mBAAA,GAAmB,IAlFa;AAAA,cAsFhC,iBAAA,GAAiB,KAAA,6BAnCI,EACtB;AAAA,cAsCC,kBAAA,GAAkB,OAAA,EAlFU,YAAY,EAAA,KAAA;AAAA,cAsFxC,oBAAA,SAAoB,wBAE0B;AAAA,cAE9C,wBAAA,GAAwB,KAnDwB,EAAhB,gBAAgB;AAAA,cAuDhD,eAAA,QArCmB,YAuCkB;AAAA,cAErC,iBAAA;AAAA,cAIA,mBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"for-bench.js","names":[],"sources":["../../src/runtime/for-bench.ts"],"sourcesContent":["import { isRuntimeEnvFlagEnabled } from '../common/env';\n\nconst BENCH_BUILD_ENABLED = isRuntimeEnvFlagEnabled('ASKR_BENCH');\n\ntype BenchGlobal = typeof globalThis & {\n __ASKR_BENCH__?: boolean;\n __ASKR_FOR_BENCH__?: BenchMetrics;\n};\n\nexport interface BenchMetrics {\n itemsCreated: number;\n itemsReused: number;\n itemsRemoved: number;\n itemsMoved: number;\n rowFactoryInvocations: number;\n keyLookups: number;\n keyHits: number;\n keyMisses: number;\n domInserts: number;\n domRemoves: number;\n domMoves: number;\n domAttrSets: number;\n domTextSets: number;\n domNodesCreated: number;\n listenerBindings: number;\n reactivePropsMounted: number;\n replaceChildrenCommits: number;\n bulkClearCommits: number;\n reconcilePhaseMs: number;\n domCommitPhaseMs: number;\n fastLaneName: string | null;\n}\n\nexport type BenchEvent =\n | 'itemCreated'\n | 'itemReused'\n | 'itemRemoved'\n | 'itemMoved'\n | 'rowFactory'\n | 'keyLookup'\n | 'keyHit'\n | 'keyMiss'\n | 'domInsert'\n | 'domRemove'\n | 'domMove'\n | 'domAttrSet'\n | 'domTextSet';\n\nfunction createInitialBenchMetrics(): BenchMetrics {\n return {\n itemsCreated: 0,\n itemsReused: 0,\n itemsRemoved: 0,\n itemsMoved: 0,\n rowFactoryInvocations: 0,\n keyLookups: 0,\n keyHits: 0,\n keyMisses: 0,\n domInserts: 0,\n domRemoves: 0,\n domMoves: 0,\n domAttrSets: 0,\n domTextSets: 0,\n domNodesCreated: 0,\n listenerBindings: 0,\n reactivePropsMounted: 0,\n replaceChildrenCommits: 0,\n bulkClearCommits: 0,\n reconcilePhaseMs: 0,\n domCommitPhaseMs: 0,\n fastLaneName: null,\n };\n}\n\nconst emptyBenchMetrics = createInitialBenchMetrics();\ntype BenchMetricScope = 'coldCreate' | 'fullClear';\ntype BenchCounter =\n | 'domNodesCreated'\n | 'listenerBindings'\n | 'reactivePropsMounted'\n | 'replaceChildrenCommits'\n | 'bulkClearCommits';\nlet activeBenchMetricScope: BenchMetricScope | null = null;\n\nfunction isBenchRuntimeEnabled(): boolean {\n if (!BENCH_BUILD_ENABLED) {\n return false;\n }\n\n try {\n return !!(globalThis as BenchGlobal).__ASKR_BENCH__;\n } catch {\n return false;\n }\n}\n\nfunction publishBenchMetrics(metrics: BenchMetrics): void {\n if (!isBenchRuntimeEnabled()) {\n return;\n }\n\n (globalThis as BenchGlobal).__ASKR_FOR_BENCH__ = { ...metrics };\n}\n\nconst flushBenchMetricsLive = (): void => {\n if (!benchMetrics) {\n return;\n }\n\n publishBenchMetrics(benchMetrics);\n};\n\nfunction resetBenchMetricsLive(metrics: BenchMetrics): void {\n metrics.itemsCreated = 0;\n metrics.itemsReused = 0;\n metrics.itemsRemoved = 0;\n metrics.itemsMoved = 0;\n metrics.rowFactoryInvocations = 0;\n metrics.keyLookups = 0;\n metrics.keyHits = 0;\n metrics.keyMisses = 0;\n metrics.domInserts = 0;\n metrics.domRemoves = 0;\n metrics.domMoves = 0;\n metrics.domAttrSets = 0;\n metrics.domTextSets = 0;\n metrics.domNodesCreated = 0;\n metrics.listenerBindings = 0;\n metrics.reactivePropsMounted = 0;\n metrics.replaceChildrenCommits = 0;\n metrics.bulkClearCommits = 0;\n metrics.reconcilePhaseMs = 0;\n metrics.domCommitPhaseMs = 0;\n metrics.fastLaneName = null;\n publishBenchMetrics(metrics);\n}\n\nconst benchMetrics = BENCH_BUILD_ENABLED ? createInitialBenchMetrics() : null;\n\nconst recordBenchEventLive = (event: BenchEvent, delta = 1): void => {\n if (!isBenchRuntimeEnabled() || !benchMetrics) {\n return;\n }\n\n if (delta === 0) {\n return;\n }\n\n switch (event) {\n case 'itemCreated':\n benchMetrics.itemsCreated += delta;\n break;\n case 'itemReused':\n benchMetrics.itemsReused += delta;\n break;\n case 'itemRemoved':\n benchMetrics.itemsRemoved += delta;\n break;\n case 'itemMoved':\n benchMetrics.itemsMoved += delta;\n break;\n case 'rowFactory':\n benchMetrics.rowFactoryInvocations += delta;\n break;\n case 'keyLookup':\n benchMetrics.keyLookups += delta;\n break;\n case 'keyHit':\n benchMetrics.keyHits += delta;\n break;\n case 'keyMiss':\n benchMetrics.keyMisses += delta;\n break;\n case 'domInsert':\n benchMetrics.domInserts += delta;\n break;\n case 'domRemove':\n benchMetrics.domRemoves += delta;\n break;\n case 'domMove':\n benchMetrics.domMoves += delta;\n break;\n case 'domAttrSet':\n benchMetrics.domAttrSets += delta;\n break;\n case 'domTextSet':\n benchMetrics.domTextSets += delta;\n break;\n }\n};\n\nconst recordBenchFastLaneLive = (name: string): void => {\n if (!isBenchRuntimeEnabled() || !benchMetrics) {\n return;\n }\n\n benchMetrics.fastLaneName = name;\n};\n\nconst recordBenchCounterLive = (counter: BenchCounter, delta = 1): void => {\n if (!isBenchRuntimeEnabled() || !benchMetrics || delta === 0) {\n return;\n }\n\n switch (counter) {\n case 'domNodesCreated':\n benchMetrics.domNodesCreated += delta;\n break;\n case 'listenerBindings':\n benchMetrics.listenerBindings += delta;\n break;\n case 'reactivePropsMounted':\n benchMetrics.reactivePropsMounted += delta;\n break;\n case 'replaceChildrenCommits':\n benchMetrics.replaceChildrenCommits += delta;\n break;\n case 'bulkClearCommits':\n benchMetrics.bulkClearCommits += delta;\n break;\n }\n};\n\nfunction withBenchMetricScopeLive<T>(scope: BenchMetricScope, run: () => T): T {\n if (!isBenchRuntimeEnabled()) {\n return run();\n }\n\n const previousScope = activeBenchMetricScope;\n activeBenchMetricScope = scope;\n\n try {\n return run();\n } finally {\n activeBenchMetricScope = previousScope;\n }\n}\n\nconst isBenchMetricScopeActiveLive = (scope: BenchMetricScope): boolean =>\n isBenchRuntimeEnabled() && activeBenchMetricScope === scope;\n\nconst recordBenchTimingLive = (\n phase: 'reconcile' | 'domCommit',\n ms: number\n): void => {\n if (!isBenchRuntimeEnabled() || !benchMetrics) {\n return;\n }\n\n if (phase === 'reconcile') {\n benchMetrics.reconcilePhaseMs = ms;\n } else {\n benchMetrics.domCommitPhaseMs = ms;\n }\n};\n\nconst getBenchMetricsLive = (): BenchMetrics =>\n benchMetrics ? { ...benchMetrics } : { ...emptyBenchMetrics };\n\nexport const resetBenchMetrics = BENCH_BUILD_ENABLED\n ? (): void => {\n if (!isBenchRuntimeEnabled() || !benchMetrics) {\n return;\n }\n\n resetBenchMetricsLive(benchMetrics);\n }\n : (): void => {};\n\nexport const recordBenchEvent = BENCH_BUILD_ENABLED\n ? recordBenchEventLive\n : (_event: BenchEvent): void => {};\n\nexport const recordBenchFastLane = BENCH_BUILD_ENABLED\n ? recordBenchFastLaneLive\n : (_name: string): void => {};\n\nexport const recordBenchTiming = BENCH_BUILD_ENABLED\n ? recordBenchTimingLive\n : (_phase: 'reconcile' | 'domCommit', _ms: number): void => {};\n\nexport const recordBenchCounter = BENCH_BUILD_ENABLED\n ? recordBenchCounterLive\n : (_counter: BenchCounter, _delta = 1): void => {};\n\nexport const withBenchMetricScope = BENCH_BUILD_ENABLED\n ? withBenchMetricScopeLive\n : <T>(_scope: BenchMetricScope, run: () => T): T => run();\n\nexport const isBenchMetricScopeActive = BENCH_BUILD_ENABLED\n ? isBenchMetricScopeActiveLive\n : (_scope: BenchMetricScope): boolean => false;\n\nexport const getBenchMetrics = BENCH_BUILD_ENABLED\n ? getBenchMetricsLive\n : (): BenchMetrics => ({ ...emptyBenchMetrics });\n\nexport const flushBenchMetrics = BENCH_BUILD_ENABLED\n ? flushBenchMetricsLive\n : (): void => {};\n\nexport const isBenchBuildEnabled = (): boolean => BENCH_BUILD_ENABLED;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"for-internal.d.ts","names":[],"sources":["../../src/runtime/for-internal.ts"],"mappings":";;;;;;;;;KA4BY,iBAAA;AAAA,UAOK,QAAA;EACf,IAAA;EACA,YAAA,EAAc,CAAA;EACd,UAAA,EAAY,aAAA,CAAc,CAAA;EAC1B,QAAA,EAAU,KAAA;EACV,aAAA,EAAe,UAAA;EACf,KAAA,EAAO,GAAA,kBAAqB,eAAA,CAAgB,CAAA;EAC5C,WAAA,EAAa,KAAA;EACb,YAAA,EAAc,eAAA,CAAgB,CAAA;EAC9B,aAAA,EAAe,KAAA;EACf,IAAA,EAAM,cAAA,CAAe,CAAA;EACrB,QAAA,EAAU,aAAA,CAAc,CAAA;EACxB,cAAA,EAAgB,iBAAA;EAChB,kBAAA,EAAoB,iBAAA;EACpB,gBAAA,EAAkB,IAAA;EAClB,mBAAA;EACA,kBAAA;EACA,eAAA;EACA,mBAAA;EACA,qBAAA;EACA,aAAA,EAAe,uBAAA,CAAwB,CAAA;EACvC,oBAAA;EACA,sBAAA;EACA,yBAAA;EACA,WAAA,GAAc,GAAA;AAAA;AAAA,iBAmBA,cAAA,IACd,UAAA,EAAY,aAAA,CAAc,CAAA,GAC1B,IAAA,EAAM,QAAA,CAAS,CAAA,WACf,QAAA,EAAU,aAAA,CAAc,CAAA,GACxB,QAAA,EAAU,KAAA,UACT,QAAA,CAAS,CAAA;AAAA,iBA8BI,WAAA,IACd,UAAA,EAAY,aAAA,CAAc,CAAA,GAC1B,IAAA,EAAM,QAAA,CAAS,CAAA,WACf,QAAA,EAAU,aAAA,CAAc,CAAA,GACxB,QAAA,EAAU,KAAA,UACT,QAAA,CAAS,CAAA;AAAA,iBAgCI,gBAAA,IAAoB,QAAA,EAAU,QAAA,CAAS,CAAA,IAAK,KAAA;AAAA,iBAS5C,sBAAA,IAA0B,QAAA,EAAU,QAAQ,CAAC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"for-internal.js","names":[],"sources":["../../src/runtime/for-internal.ts"],"sourcesContent":["/**\n * For primitive runtime\n *\n * Manages For state storage, hook binding, source evaluation,\n * and DOM update state cleanup.\n */\n\nimport { type ComponentInstance, getCurrentInstance } from './component';\nimport { claimHookIndex } from './component';\nimport type { VNode } from '../common/vnode';\nimport type { ChildScope } from './child-scope';\nimport type { ForItemInstance } from './for-scopes';\nimport type { FineGrainedEffectHandle } from './effect';\nimport type { ForEachSource, ForKeySelector, ForRenderItem } from './for-types';\nimport { reconcileForItems } from './for-reconcile';\n\nexport {\n getBenchMetrics,\n isBenchMetricScopeActive,\n recordBenchEvent,\n recordBenchCounter,\n recordBenchTiming,\n resetBenchMetrics,\n withBenchMetricScope,\n} from './for-bench';\n\nexport { reconcileForItems };\n\nexport type ForCommitStrategy =\n | 'APPEND'\n | 'TRUNCATE'\n | 'NO_REORDER'\n | 'SWAP'\n | 'FULL_KEYED';\n\nexport interface ForState<T> {\n kind: 'for';\n currentItems: T[];\n eachSource: ForEachSource<T>;\n fallback: VNode | null;\n fallbackScope: ChildScope | null;\n items: Map<string | number, ForItemInstance<T>>;\n orderedKeys: Array<string | number>;\n orderedItems: ForItemInstance<T>[];\n orderedVNodes: VNode[];\n byFn: ForKeySelector<T>;\n renderFn: ForRenderItem<T>;\n parentInstance: ComponentInstance | null;\n lastCommitStrategy: ForCommitStrategy;\n lastRemovedNodes: Node[];\n pendingDirtyIndices: number[] | null;\n pendingSwapIndices: [number, number] | null;\n pendingMoveOnly: boolean;\n _hasResolvedItemDom: boolean;\n _needsSourceReconcile: boolean;\n _sourceEffect: FineGrainedEffectHandle<T[]> | null;\n _suspendSourceCommit: boolean;\n _enqueueBoundaryCommit?: (() => void) | null;\n _hasPendingBoundaryCommit?: boolean;\n devKeyKinds?: Map<string, 'number' | 'string'>;\n}\n\nconst forStates = new WeakMap<\n ComponentInstance,\n Map<number, ForState<unknown>>\n>();\n\nfunction getForStore(\n instance: ComponentInstance\n): Map<number, ForState<unknown>> {\n let store = forStates.get(instance);\n if (!store) {\n store = new Map();\n forStates.set(instance, store);\n }\n return store;\n}\n\nexport function createForState<T>(\n eachSource: ForEachSource<T>,\n byFn: ForState<T>['byFn'],\n renderFn: ForRenderItem<T>,\n fallback: VNode | null\n): ForState<T> {\n const parentInstance = getCurrentInstance();\n\n return {\n kind: 'for',\n currentItems: [],\n eachSource,\n fallback,\n fallbackScope: null,\n items: new Map(),\n orderedKeys: [],\n orderedItems: [],\n orderedVNodes: [],\n byFn,\n renderFn,\n parentInstance,\n lastCommitStrategy: 'NO_REORDER',\n lastRemovedNodes: [],\n pendingDirtyIndices: null,\n pendingSwapIndices: null,\n pendingMoveOnly: false,\n _hasResolvedItemDom: false,\n _needsSourceReconcile: false,\n _sourceEffect: null,\n _suspendSourceCommit: false,\n _enqueueBoundaryCommit: null,\n _hasPendingBoundaryCommit: false,\n };\n}\n\nexport function useForState<T>(\n eachSource: ForEachSource<T>,\n byFn: ForState<T>['byFn'],\n renderFn: ForRenderItem<T>,\n fallback: VNode | null\n): ForState<T> {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error(\n 'For can only be created during component render execution.'\n );\n }\n\n const hookIndex = claimHookIndex(instance, 'For');\n const store = getForStore(instance);\n const existing = store.get(hookIndex) as ForState<T> | undefined;\n\n if (existing) {\n existing.eachSource = eachSource;\n existing.byFn = byFn;\n existing.renderFn = renderFn;\n existing.fallback = fallback;\n return existing;\n }\n\n const created = createForState(eachSource, byFn, renderFn, fallback);\n store.set(hookIndex, created as ForState<unknown>);\n\n (instance.cleanupFns ??= []).push(() => {\n created._sourceEffect?.cleanup();\n created._sourceEffect = null;\n store.delete(hookIndex);\n });\n\n return created;\n}\n\nexport function evaluateForState<T>(forState: ForState<T>): VNode[] {\n if (!Array.isArray(forState.currentItems)) {\n throw new Error('For source must evaluate to an array');\n }\n\n forState._needsSourceReconcile = false;\n return reconcileForItems(forState, forState.currentItems);\n}\n\nexport function clearForDomUpdateState<T>(forState: ForState<T>): void {\n const dirtyIndices = forState.pendingDirtyIndices;\n if (dirtyIndices && dirtyIndices.length > 0) {\n for (let i = 0; i < dirtyIndices.length; i++) {\n const itemInstance = forState.orderedItems[dirtyIndices[i]];\n if (itemInstance) {\n itemInstance.scope.needsDomUpdate = false;\n }\n }\n } else {\n for (let i = 0; i < forState.orderedKeys.length; i++) {\n const key = forState.orderedKeys[i];\n const itemInstance = forState.items.get(key);\n if (itemInstance) {\n itemInstance.scope.needsDomUpdate = false;\n }\n }\n }\n\n if (forState.fallbackScope) {\n forState.fallbackScope.needsDomUpdate = false;\n }\n forState.lastRemovedNodes = [];\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n forState._needsSourceReconcile = false;\n forState._hasResolvedItemDom = forState.orderedKeys.length > 0;\n}\n"],"mappings":";;;;;;;;;;;AA8DA,MAAM,4BAAY,IAAI,QAGpB;AAEF,SAAS,YACP,UACgC;CAChC,IAAI,QAAQ,UAAU,IAAI,QAAQ;CAClC,IAAI,CAAC,OAAO;EACV,wBAAQ,IAAI,IAAI;EAChB,UAAU,IAAI,UAAU,KAAK;CAC/B;CACA,OAAO;AACT;AAEA,SAAgB,eACd,YACA,MACA,UACA,UACa;CACb,MAAM,iBAAiB,mBAAmB;CAE1C,OAAO;EACL,MAAM;EACN,cAAc,CAAC;EACf;EACA;EACA,eAAe;EACf,uBAAO,IAAI,IAAI;EACf,aAAa,CAAC;EACd,cAAc,CAAC;EACf,eAAe,CAAC;EAChB;EACA;EACA;EACA,oBAAoB;EACpB,kBAAkB,CAAC;EACnB,qBAAqB;EACrB,oBAAoB;EACpB,iBAAiB;EACjB,qBAAqB;EACrB,uBAAuB;EACvB,eAAe;EACf,sBAAsB;EACtB,wBAAwB;EACxB,2BAA2B;CAC7B;AACF;AAEA,SAAgB,YACd,YACA,MACA,UACA,UACa;CACb,MAAM,WAAW,mBAAmB;CACpC,IAAI,CAAC,UACH,MAAM,IAAI,MACR,4DACF;CAGF,MAAM,YAAY,eAAe,UAAU,KAAK;CAChD,MAAM,QAAQ,YAAY,QAAQ;CAClC,MAAM,WAAW,MAAM,IAAI,SAAS;CAEpC,IAAI,UAAU;EACZ,SAAS,aAAa;EACtB,SAAS,OAAO;EAChB,SAAS,WAAW;EACpB,SAAS,WAAW;EACpB,OAAO;CACT;CAEA,MAAM,UAAU,eAAe,YAAY,MAAM,UAAU,QAAQ;CACnE,MAAM,IAAI,WAAW,OAA4B;CAEjD,CAAC,SAAS,eAAe,CAAC,EAAA,CAAG,WAAW;EACtC,QAAQ,eAAe,QAAQ;EAC/B,QAAQ,gBAAgB;EACxB,MAAM,OAAO,SAAS;CACxB,CAAC;CAED,OAAO;AACT;AAEA,SAAgB,iBAAoB,UAAgC;CAClE,IAAI,CAAC,MAAM,QAAQ,SAAS,YAAY,GACtC,MAAM,IAAI,MAAM,sCAAsC;CAGxD,SAAS,wBAAwB;CACjC,OAAO,kBAAkB,UAAU,SAAS,YAAY;AAC1D;AAEA,SAAgB,uBAA0B,UAA6B;CACrE,MAAM,eAAe,SAAS;CAC9B,IAAI,gBAAgB,aAAa,SAAS,GACxC,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;EAC5C,MAAM,eAAe,SAAS,aAAa,aAAa;EACxD,IAAI,cACF,aAAa,MAAM,iBAAiB;CAExC;MAEA,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,YAAY,QAAQ,KAAK;EACpD,MAAM,MAAM,SAAS,YAAY;EACjC,MAAM,eAAe,SAAS,MAAM,IAAI,GAAG;EAC3C,IAAI,cACF,aAAa,MAAM,iBAAiB;CAExC;CAGF,IAAI,SAAS,eACX,SAAS,cAAc,iBAAiB;CAE1C,SAAS,mBAAmB,CAAC;CAC7B,SAAS,sBAAsB;CAC/B,SAAS,qBAAqB;CAC9B,SAAS,kBAAkB;CAC3B,SAAS,wBAAwB;CACjC,SAAS,sBAAsB,SAAS,YAAY,SAAS;AAC/D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"for-reconcile.d.ts","names":[],"sources":["../../src/runtime/for-reconcile.ts"],"mappings":";;;;iBAsEgB,iBAAA,IACd,QAAA,EAAU,QAAA,CAAS,CAAA,GACnB,QAAA,EAAU,CAAA,KACT,KAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"for-reconcile.js","names":[],"sources":["../../src/runtime/for-reconcile.ts"],"sourcesContent":["/**\n * For key validation and reconciliation strategy ownership.\n */\n\nimport type { VNode } from '../common/vnode';\nimport { isDevelopmentEnvironment } from '../common/env';\nimport {\n createItemInstance,\n disposeAllItems,\n disposeFallbackScope,\n disposeItemInstance,\n renderFallbackScope,\n syncForItemIndex,\n updateItemInstance,\n type ForItemInstance,\n} from './for-scopes';\nimport {\n flushBenchMetrics,\n isBenchBuildEnabled,\n recordBenchEvent,\n recordBenchFastLane,\n recordBenchTiming,\n resetBenchMetrics,\n} from './for-bench';\nimport type { ForState } from './for-internal';\n\nconst BENCH_BUILD_ENABLED = isBenchBuildEnabled();\n\nfunction failForValidation(message: string): never {\n throw new Error(message);\n}\n\nfunction validateForKeys<T>(forState: ForState<T>, newArray: T[]): void {\n if (!isDevelopmentEnvironment()) {\n return;\n }\n\n const seen = new Set<string | number>();\n const keyKinds = new Map<string, 'number' | 'string'>();\n for (let i = 0; i < newArray.length; i++) {\n const key = forState.byFn(newArray[i], i);\n\n if (key === null || key === undefined) {\n failForValidation(\n '[askr] Invalid For key detected. Keys should be stable, non-null, and unique within a For list.'\n );\n }\n\n if (seen.has(key)) {\n failForValidation(\n `[askr] Duplicate For key detected: ${String(key)}. Keys should be stable, non-null, and unique within a For list.`\n );\n }\n\n seen.add(key);\n\n const keyString = String(key);\n const keyKind = typeof key;\n const previousKeyKind = forState.devKeyKinds?.get(keyString);\n if (previousKeyKind && previousKeyKind !== keyKind) {\n failForValidation(\n `[askr] For key type changed for ${keyString}. Keys must remain consistently typed across renders.`\n );\n }\n keyKinds.set(keyString, keyKind as 'number' | 'string');\n }\n\n forState.devKeyKinds = keyKinds;\n}\n\nexport function reconcileForItems<T>(\n forState: ForState<T>,\n newArray: T[]\n): VNode[] {\n forState.currentItems = newArray;\n validateForKeys(forState, newArray);\n\n if (BENCH_BUILD_ENABLED) {\n resetBenchMetrics();\n }\n\n const reconcileStartMs = BENCH_BUILD_ENABLED ? performance.now() : 0;\n\n const { items, orderedKeys, byFn } = forState;\n const oldLen = orderedKeys.length;\n const newLen = newArray.length;\n forState.lastRemovedNodes = [];\n\n if (newLen === 0) {\n if (oldLen > 0) {\n disposeAllItems(forState, forState.fallback ? 'teardown' : 'none');\n }\n recordBenchFastLane('TRUNCATE');\n forState.lastCommitStrategy = 'TRUNCATE';\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n return renderFallbackScope(forState);\n }\n\n if (forState.fallbackScope) {\n disposeFallbackScope(forState, 'none');\n }\n\n // FAST PATH A: APPEND\n // Guard: oldLen <= newLen && all old keys match new keys at same indices\n if (oldLen < newLen) {\n let canUseAppendPath = true;\n for (let i = 0; i < oldLen; i++) {\n const key = byFn(newArray[i], i);\n if (key !== orderedKeys[i]) {\n canUseAppendPath = false;\n break;\n }\n }\n\n if (canUseAppendPath) {\n recordBenchFastLane('APPEND');\n forState.lastCommitStrategy = 'APPEND';\n const resultVNodes = forState.orderedVNodes;\n const resultItems = forState.orderedItems;\n resultVNodes.length = newLen;\n resultItems.length = newLen;\n\n // Update existing rows in-place\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = orderedKeys[i];\n const existing = resultItems[i] ?? items.get(key)!;\n\n updateItemInstance(forState, existing, item);\n\n resultItems[i] = existing;\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n recordBenchEvent('itemReused', oldLen);\n\n // Create and append new rows\n for (let i = oldLen; i < newLen; i++) {\n const item = newArray[i];\n const key = byFn(item, i);\n const itemInstance = createItemInstance(key, item, i, forState);\n items.set(key, itemInstance);\n resultItems[i] = itemInstance;\n resultVNodes[i] = itemInstance.scope.vnode as VNode;\n orderedKeys[i] = key;\n }\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.orderedVNodes = resultVNodes;\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n }\n\n // FAST PATH B: TRUNCATE\n // Guard: newLen <= oldLen && all new keys match old keys at same indices\n if (newLen < oldLen) {\n if (oldLen === newLen + 1) {\n let removedIndex = -1;\n\n for (let i = 0; i < newLen; i++) {\n const nextKey = byFn(newArray[i], i);\n if (nextKey !== orderedKeys[i]) {\n removedIndex = i;\n break;\n }\n }\n\n if (removedIndex !== -1) {\n let canUseRemoveOnePath = true;\n for (let i = removedIndex; i < newLen; i++) {\n const nextKey = byFn(newArray[i], i);\n if (nextKey !== orderedKeys[i + 1]) {\n canUseRemoveOnePath = false;\n break;\n }\n }\n\n if (canUseRemoveOnePath) {\n recordBenchFastLane('REMOVE_ONE');\n forState.lastCommitStrategy = 'NO_REORDER';\n\n const previousOrderedItems = forState.orderedItems.slice();\n const resultVNodes = forState.orderedVNodes;\n const resultItems = forState.orderedItems;\n resultVNodes.length = newLen;\n resultItems.length = newLen;\n const dirtyIndices: number[] = [];\n\n for (let i = 0; i < newLen; i++) {\n const item = newArray[i];\n const key = i < removedIndex ? orderedKeys[i] : orderedKeys[i + 1];\n const existing = items.get(key)!;\n const scopeNeedsDomUpdate = existing.scope.needsDomUpdate;\n\n const itemChanged = existing.item !== item;\n const indexSignal = existing.indexSignal;\n const indexChanged = indexSignal.peek() !== i;\n\n if (itemChanged) {\n updateItemInstance(forState, existing, item);\n }\n\n const indexVisibleChange = indexChanged\n ? syncForItemIndex(forState, existing, i)\n : false;\n\n if (itemChanged || indexVisibleChange || scopeNeedsDomUpdate) {\n dirtyIndices.push(i);\n }\n\n resultItems[i] = existing;\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n recordBenchEvent('itemReused', newLen);\n\n const removedKey = orderedKeys[removedIndex];\n const removedItem = items.get(removedKey);\n if (removedItem) {\n disposeItemInstance(forState, removedItem, 'teardown');\n items.delete(removedKey);\n }\n\n const nextOrderedKeys = orderedKeys.slice(0, newLen);\n const nextOrderedItems = previousOrderedItems.slice(0, newLen);\n for (let i = removedIndex; i < newLen; i++) {\n nextOrderedKeys[i] = orderedKeys[i + 1];\n nextOrderedItems[i] = previousOrderedItems[i + 1];\n }\n forState.orderedKeys = nextOrderedKeys;\n forState.orderedItems = nextOrderedItems;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming(\n 'reconcile',\n performance.now() - reconcileStartMs\n );\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = dirtyIndices;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n }\n }\n\n let canUseTruncatePath = true;\n for (let i = 0; i < newLen; i++) {\n const key = byFn(newArray[i], i);\n if (key !== orderedKeys[i]) {\n canUseTruncatePath = false;\n break;\n }\n }\n\n if (canUseTruncatePath) {\n recordBenchFastLane('TRUNCATE');\n forState.lastCommitStrategy = 'TRUNCATE';\n const resultVNodes = forState.orderedVNodes;\n const resultItems = forState.orderedItems;\n resultVNodes.length = newLen;\n resultItems.length = newLen;\n const isFullClear = newLen === 0;\n\n // Update existing rows in-place\n for (let i = 0; i < newLen; i++) {\n const item = newArray[i];\n const key = orderedKeys[i];\n const existing = items.get(key)!;\n\n updateItemInstance(forState, existing, item);\n\n resultItems[i] = existing;\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n recordBenchEvent('itemReused', newLen);\n\n // Remove tail rows\n for (let i = newLen; i < oldLen; i++) {\n const key = orderedKeys[i];\n const itemInstance = items.get(key);\n if (itemInstance) {\n disposeItemInstance(\n forState,\n itemInstance,\n isFullClear ? 'full-clear' : 'teardown'\n );\n items.delete(key);\n }\n }\n\n orderedKeys.length = newLen;\n forState.orderedKeys = orderedKeys;\n forState.orderedItems.length = newLen;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.orderedVNodes = resultVNodes;\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n }\n\n // FAST PATH C: NO-REORDER (in-place update only)\n // Guard: oldLen === newLen && keys match at all indices\n if (oldLen === newLen) {\n let canUseNoReorderPath = true;\n for (let i = 0; i < oldLen; i++) {\n const key = byFn(newArray[i], i);\n if (key !== orderedKeys[i]) {\n canUseNoReorderPath = false;\n break;\n }\n }\n\n if (canUseNoReorderPath) {\n recordBenchFastLane('NO_REORDER');\n forState.lastCommitStrategy = 'NO_REORDER';\n const resultVNodes = forState.orderedVNodes;\n const resultItems = forState.orderedItems;\n resultVNodes.length = oldLen;\n resultItems.length = oldLen;\n const dirtyIndices: number[] = [];\n // Update in-place only, no DOM moves needed\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = orderedKeys[i];\n const existing = items.get(key)!;\n const itemChanged = existing.item !== item;\n\n if (itemChanged) {\n updateItemInstance(forState, existing, item);\n }\n\n if (!itemChanged && existing.scope.needsDomUpdate) {\n dirtyIndices.push(i);\n }\n\n resultItems[i] = existing;\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n recordBenchEvent('itemReused', oldLen);\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = dirtyIndices;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n\n let firstMismatch = -1;\n let secondMismatch = -1;\n let firstMismatchKey: string | number | null = null;\n let secondMismatchKey: string | number | null = null;\n let mismatchCount = 0;\n let canUseSwapPath = true;\n\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = byFn(newArray[i], i);\n if (key === orderedKeys[i]) {\n const existing = items.get(key);\n if (existing && existing.item !== item) {\n canUseSwapPath = false;\n break;\n }\n continue;\n }\n\n mismatchCount++;\n if (firstMismatch === -1) {\n firstMismatch = i;\n firstMismatchKey = key;\n continue;\n }\n\n if (secondMismatch === -1) {\n secondMismatch = i;\n secondMismatchKey = key;\n continue;\n }\n\n mismatchCount = 3;\n break;\n }\n\n if (\n canUseSwapPath &&\n mismatchCount === 2 &&\n firstMismatch !== -1 &&\n secondMismatch !== -1 &&\n firstMismatchKey === orderedKeys[secondMismatch] &&\n secondMismatchKey === orderedKeys[firstMismatch]\n ) {\n recordBenchFastLane('SWAP');\n recordBenchEvent('itemMoved');\n recordBenchEvent('itemMoved');\n\n forState.lastCommitStrategy = 'SWAP';\n\n const nextOrderedKeys = orderedKeys.slice();\n nextOrderedKeys[firstMismatch] = firstMismatchKey;\n nextOrderedKeys[secondMismatch] = secondMismatchKey;\n\n const resultVNodes = forState.orderedVNodes;\n const firstExisting = items.get(firstMismatchKey)!;\n const secondExisting = items.get(secondMismatchKey)!;\n const firstItem = newArray[firstMismatch];\n const secondItem = newArray[secondMismatch];\n const nextOrderedItems = forState.orderedItems.slice();\n nextOrderedItems[firstMismatch] = secondExisting;\n nextOrderedItems[secondMismatch] = firstExisting;\n\n recordBenchEvent('itemReused');\n recordBenchEvent('itemReused');\n\n if (firstExisting.item !== firstItem) {\n updateItemInstance(forState, firstExisting, firstItem);\n }\n\n if (secondExisting.item !== secondItem) {\n updateItemInstance(forState, secondExisting, secondItem);\n }\n\n syncForItemIndex(forState, firstExisting, firstMismatch);\n\n syncForItemIndex(forState, secondExisting, secondMismatch);\n\n resultVNodes[firstMismatch] = firstExisting.scope.vnode as VNode;\n resultVNodes[secondMismatch] = secondExisting.scope.vnode as VNode;\n\n forState.orderedKeys = nextOrderedKeys;\n forState.orderedItems = nextOrderedItems;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = [firstMismatch, secondMismatch];\n forState.pendingMoveOnly = true;\n\n return resultVNodes;\n }\n\n let canUseMoveOnlyPath = true;\n const moveOnlyKeys: Array<string | number> = [];\n const moveOnlyItems: ForItemInstance<T>[] = [];\n const moveOnlyVNodes: VNode[] = [];\n\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = byFn(item, i);\n const existing = items.get(key);\n\n if (\n !existing ||\n existing.item !== item ||\n (existing.indexSignal._hasBeenRead && existing.indexSignal.peek() !== i)\n ) {\n canUseMoveOnlyPath = false;\n break;\n }\n\n moveOnlyKeys[i] = key;\n moveOnlyItems[i] = existing;\n moveOnlyVNodes[i] = existing.scope.vnode as VNode;\n recordBenchEvent('itemReused');\n }\n\n if (canUseMoveOnlyPath) {\n recordBenchFastLane('FULL_KEYED');\n forState.lastCommitStrategy = 'FULL_KEYED';\n\n for (let i = 0; i < moveOnlyItems.length; i++) {\n syncForItemIndex(forState, moveOnlyItems[i], i);\n moveOnlyVNodes[i] = moveOnlyItems[i].scope.vnode as VNode;\n }\n\n forState.orderedKeys = moveOnlyKeys;\n forState.orderedItems = moveOnlyItems;\n forState.orderedVNodes = moveOnlyVNodes;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = true;\n\n return moveOnlyVNodes;\n }\n }\n\n // FULL KEYED RECONCILIATION (slow path for complex reorders)\n // Avoid allocating newKeyMap: iterate directly and track removals\n recordBenchFastLane('FULL_KEYED');\n forState.lastCommitStrategy = 'FULL_KEYED';\n\n const toRemove = new Set(orderedKeys);\n const newOrderedKeys: Array<string | number> = [];\n const newOrderedItems: ForItemInstance<T>[] = [];\n const resultVNodes: VNode[] = [];\n let moveOnly = toRemove.size === newArray.length;\n\n // Single pass: iterate new array directly, no intermediate map\n for (let i = 0; i < newArray.length; i++) {\n const item = newArray[i];\n const key = byFn(item, i);\n recordBenchEvent('keyLookup');\n\n toRemove.delete(key);\n newOrderedKeys.push(key);\n\n const existing = items.get(key);\n recordBenchEvent(existing ? 'keyHit' : 'keyMiss');\n\n if (!existing) {\n // Added: create new item instance\n const itemInstance = createItemInstance(key, item, i, forState);\n items.set(key, itemInstance);\n newOrderedItems.push(itemInstance);\n resultVNodes.push(itemInstance.scope.vnode as VNode);\n } else {\n // Exists: check if item changed (by identity)\n recordBenchEvent('itemReused');\n const itemChanged = existing.item !== item;\n const indexChanged = existing.indexSignal.peek() !== i;\n\n if (itemChanged) {\n moveOnly = false;\n updateItemInstance(forState, existing, item);\n }\n\n if (indexChanged) {\n // Index changed: update index signal (triggers re-render if index is used)\n syncForItemIndex(forState, existing, i);\n }\n\n newOrderedItems.push(existing);\n resultVNodes.push(existing.scope.vnode as VNode);\n }\n }\n\n // Remove deleted items\n for (const key of toRemove) {\n moveOnly = false;\n const itemInstance = items.get(key);\n if (itemInstance) {\n disposeItemInstance(forState, itemInstance, 'none');\n items.delete(key);\n }\n }\n\n forState.orderedKeys = newOrderedKeys;\n forState.orderedItems = newOrderedItems;\n\n // Record reconcile timing\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.orderedVNodes = resultVNodes;\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = moveOnly;\n\n return resultVNodes;\n}\n"],"mappings":";;;;AA0BA,MAAM,sBAAsB,oBAAoB;AAEhD,SAAS,kBAAkB,SAAwB;CACjD,MAAM,IAAI,MAAM,OAAO;AACzB;AAEA,SAAS,gBAAmB,UAAuB,UAAqB;CACtE,IAAI,CAAC,yBAAyB,GAC5B;CAGF,MAAM,uBAAO,IAAI,IAAqB;CACtC,MAAM,2BAAW,IAAI,IAAiC;CACtD,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,MAAM,SAAS,KAAK,SAAS,IAAI,CAAC;EAExC,IAAI,QAAQ,QAAQ,QAAQ,QAC1B,kBACE,iGACF;EAGF,IAAI,KAAK,IAAI,GAAG,GACd,kBACE,sCAAsC,OAAO,GAAG,EAAE,iEACpD;EAGF,KAAK,IAAI,GAAG;EAEZ,MAAM,YAAY,OAAO,GAAG;EAC5B,MAAM,UAAU,OAAO;EACvB,MAAM,kBAAkB,SAAS,aAAa,IAAI,SAAS;EAC3D,IAAI,mBAAmB,oBAAoB,SACzC,kBACE,mCAAmC,UAAU,sDAC/C;EAEF,SAAS,IAAI,WAAW,OAA8B;CACxD;CAEA,SAAS,cAAc;AACzB;AAEA,SAAgB,kBACd,UACA,UACS;CACT,SAAS,eAAe;CACxB,gBAAgB,UAAU,QAAQ;CAElC,IAAI,qBACF,kBAAkB;CAGpB,MAAM,mBAAmB,sBAAsB,YAAY,IAAI,IAAI;CAEnE,MAAM,EAAE,OAAO,aAAa,SAAS;CACrC,MAAM,SAAS,YAAY;CAC3B,MAAM,SAAS,SAAS;CACxB,SAAS,mBAAmB,CAAC;CAE7B,IAAI,WAAW,GAAG;EAChB,IAAI,SAAS,GACX,gBAAgB,UAAU,SAAS,WAAW,aAAa,MAAM;EAEnE,oBAAoB,UAAU;EAC9B,SAAS,qBAAqB;EAC9B,SAAS,sBAAsB;EAC/B,SAAS,qBAAqB;EAC9B,SAAS,kBAAkB;EAE3B,IAAI,qBAAqB;GACvB,kBAAkB,aAAa,YAAY,IAAI,IAAI,gBAAgB;GACnE,kBAAkB;EACpB;EAEA,OAAO,oBAAoB,QAAQ;CACrC;CAEA,IAAI,SAAS,eACX,qBAAqB,UAAU,MAAM;CAKvC,IAAI,SAAS,QAAQ;EACnB,IAAI,mBAAmB;EACvB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAE1B,IADY,KAAK,SAAS,IAAI,CAC1B,MAAQ,YAAY,IAAI;GAC1B,mBAAmB;GACnB;EACF;EAGF,IAAI,kBAAkB;GACpB,oBAAoB,QAAQ;GAC5B,SAAS,qBAAqB;GAC9B,MAAM,eAAe,SAAS;GAC9B,MAAM,cAAc,SAAS;GAC7B,aAAa,SAAS;GACtB,YAAY,SAAS;GAGrB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;IAC/B,MAAM,OAAO,SAAS;IACtB,MAAM,MAAM,YAAY;IACxB,MAAM,WAAW,YAAY,MAAM,MAAM,IAAI,GAAG;IAEhD,mBAAmB,UAAU,UAAU,IAAI;IAE3C,YAAY,KAAK;IACjB,aAAa,KAAK,SAAS,MAAM;GACnC;GAEA,iBAAiB,cAAc,MAAM;GAGrC,KAAK,IAAI,IAAI,QAAQ,IAAI,QAAQ,KAAK;IACpC,MAAM,OAAO,SAAS;IACtB,MAAM,MAAM,KAAK,MAAM,CAAC;IACxB,MAAM,eAAe,mBAAmB,KAAK,MAAM,GAAG,QAAQ;IAC9D,MAAM,IAAI,KAAK,YAAY;IAC3B,YAAY,KAAK;IACjB,aAAa,KAAK,aAAa,MAAM;IACrC,YAAY,KAAK;GACnB;GAEA,IAAI,qBAAqB;IACvB,kBAAkB,aAAa,YAAY,IAAI,IAAI,gBAAgB;IACnE,kBAAkB;GACpB;GAEA,SAAS,gBAAgB;GACzB,SAAS,sBAAsB;GAC/B,SAAS,qBAAqB;GAC9B,SAAS,kBAAkB;GAE3B,OAAO;EACT;CACF;CAIA,IAAI,SAAS,QAAQ;EACnB,IAAI,WAAW,SAAS,GAAG;GACzB,IAAI,eAAe;GAEnB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAE1B,IADgB,KAAK,SAAS,IAAI,CAC9B,MAAY,YAAY,IAAI;IAC9B,eAAe;IACf;GACF;GAGF,IAAI,iBAAiB,IAAI;IACvB,IAAI,sBAAsB;IAC1B,KAAK,IAAI,IAAI,cAAc,IAAI,QAAQ,KAErC,IADgB,KAAK,SAAS,IAAI,CAC9B,MAAY,YAAY,IAAI,IAAI;KAClC,sBAAsB;KACtB;IACF;IAGF,IAAI,qBAAqB;KACvB,oBAAoB,YAAY;KAChC,SAAS,qBAAqB;KAE9B,MAAM,uBAAuB,SAAS,aAAa,MAAM;KACzD,MAAM,eAAe,SAAS;KAC9B,MAAM,cAAc,SAAS;KAC7B,aAAa,SAAS;KACtB,YAAY,SAAS;KACrB,MAAM,eAAyB,CAAC;KAEhC,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;MAC/B,MAAM,OAAO,SAAS;MACtB,MAAM,MAAM,IAAI,eAAe,YAAY,KAAK,YAAY,IAAI;MAChE,MAAM,WAAW,MAAM,IAAI,GAAG;MAC9B,MAAM,sBAAsB,SAAS,MAAM;MAE3C,MAAM,cAAc,SAAS,SAAS;MAEtC,MAAM,eADc,SAAS,YACI,KAAK,MAAM;MAE5C,IAAI,aACF,mBAAmB,UAAU,UAAU,IAAI;MAG7C,MAAM,qBAAqB,eACvB,iBAAiB,UAAU,UAAU,CAAC,IACtC;MAEJ,IAAI,eAAe,sBAAsB,qBACvC,aAAa,KAAK,CAAC;MAGrB,YAAY,KAAK;MACjB,aAAa,KAAK,SAAS,MAAM;KACnC;KAEA,iBAAiB,cAAc,MAAM;KAErC,MAAM,aAAa,YAAY;KAC/B,MAAM,cAAc,MAAM,IAAI,UAAU;KACxC,IAAI,aAAa;MACf,oBAAoB,UAAU,aAAa,UAAU;MACrD,MAAM,OAAO,UAAU;KACzB;KAEA,MAAM,kBAAkB,YAAY,MAAM,GAAG,MAAM;KACnD,MAAM,mBAAmB,qBAAqB,MAAM,GAAG,MAAM;KAC7D,KAAK,IAAI,IAAI,cAAc,IAAI,QAAQ,KAAK;MAC1C,gBAAgB,KAAK,YAAY,IAAI;MACrC,iBAAiB,KAAK,qBAAqB,IAAI;KACjD;KACA,SAAS,cAAc;KACvB,SAAS,eAAe;KAExB,IAAI,qBAAqB;MACvB,kBACE,aACA,YAAY,IAAI,IAAI,gBACtB;MACA,kBAAkB;KACpB;KAEA,SAAS,sBAAsB;KAC/B,SAAS,qBAAqB;KAC9B,SAAS,kBAAkB;KAE3B,OAAO;IACT;GACF;EACF;EAEA,IAAI,qBAAqB;EACzB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAE1B,IADY,KAAK,SAAS,IAAI,CAC1B,MAAQ,YAAY,IAAI;GAC1B,qBAAqB;GACrB;EACF;EAGF,IAAI,oBAAoB;GACtB,oBAAoB,UAAU;GAC9B,SAAS,qBAAqB;GAC9B,MAAM,eAAe,SAAS;GAC9B,MAAM,cAAc,SAAS;GAC7B,aAAa,SAAS;GACtB,YAAY,SAAS;GACrB,MAAM,cAAc,WAAW;GAG/B,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;IAC/B,MAAM,OAAO,SAAS;IACtB,MAAM,MAAM,YAAY;IACxB,MAAM,WAAW,MAAM,IAAI,GAAG;IAE9B,mBAAmB,UAAU,UAAU,IAAI;IAE3C,YAAY,KAAK;IACjB,aAAa,KAAK,SAAS,MAAM;GACnC;GAEA,iBAAiB,cAAc,MAAM;GAGrC,KAAK,IAAI,IAAI,QAAQ,IAAI,QAAQ,KAAK;IACpC,MAAM,MAAM,YAAY;IACxB,MAAM,eAAe,MAAM,IAAI,GAAG;IAClC,IAAI,cAAc;KAChB,oBACE,UACA,cACA,cAAc,eAAe,UAC/B;KACA,MAAM,OAAO,GAAG;IAClB;GACF;GAEA,YAAY,SAAS;GACrB,SAAS,cAAc;GACvB,SAAS,aAAa,SAAS;GAE/B,IAAI,qBAAqB;IACvB,kBAAkB,aAAa,YAAY,IAAI,IAAI,gBAAgB;IACnE,kBAAkB;GACpB;GAEA,SAAS,gBAAgB;GACzB,SAAS,sBAAsB;GAC/B,SAAS,qBAAqB;GAC9B,SAAS,kBAAkB;GAE3B,OAAO;EACT;CACF;CAIA,IAAI,WAAW,QAAQ;EACrB,IAAI,sBAAsB;EAC1B,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAE1B,IADY,KAAK,SAAS,IAAI,CAC1B,MAAQ,YAAY,IAAI;GAC1B,sBAAsB;GACtB;EACF;EAGF,IAAI,qBAAqB;GACvB,oBAAoB,YAAY;GAChC,SAAS,qBAAqB;GAC9B,MAAM,eAAe,SAAS;GAC9B,MAAM,cAAc,SAAS;GAC7B,aAAa,SAAS;GACtB,YAAY,SAAS;GACrB,MAAM,eAAyB,CAAC;GAEhC,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;IAC/B,MAAM,OAAO,SAAS;IACtB,MAAM,MAAM,YAAY;IACxB,MAAM,WAAW,MAAM,IAAI,GAAG;IAC9B,MAAM,cAAc,SAAS,SAAS;IAEtC,IAAI,aACF,mBAAmB,UAAU,UAAU,IAAI;IAG7C,IAAI,CAAC,eAAe,SAAS,MAAM,gBACjC,aAAa,KAAK,CAAC;IAGrB,YAAY,KAAK;IACjB,aAAa,KAAK,SAAS,MAAM;GACnC;GAEA,iBAAiB,cAAc,MAAM;GAErC,IAAI,qBAAqB;IACvB,kBAAkB,aAAa,YAAY,IAAI,IAAI,gBAAgB;IACnE,kBAAkB;GACpB;GAEA,SAAS,sBAAsB;GAC/B,SAAS,qBAAqB;GAC9B,SAAS,kBAAkB;GAE3B,OAAO;EACT;EAEA,IAAI,gBAAgB;EACpB,IAAI,iBAAiB;EACrB,IAAI,mBAA2C;EAC/C,IAAI,oBAA4C;EAChD,IAAI,gBAAgB;EACpB,IAAI,iBAAiB;EAErB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;GAC/B,MAAM,OAAO,SAAS;GACtB,MAAM,MAAM,KAAK,SAAS,IAAI,CAAC;GAC/B,IAAI,QAAQ,YAAY,IAAI;IAC1B,MAAM,WAAW,MAAM,IAAI,GAAG;IAC9B,IAAI,YAAY,SAAS,SAAS,MAAM;KACtC,iBAAiB;KACjB;IACF;IACA;GACF;GAEA;GACA,IAAI,kBAAkB,IAAI;IACxB,gBAAgB;IAChB,mBAAmB;IACnB;GACF;GAEA,IAAI,mBAAmB,IAAI;IACzB,iBAAiB;IACjB,oBAAoB;IACpB;GACF;GAEA,gBAAgB;GAChB;EACF;EAEA,IACE,kBACA,kBAAkB,KAClB,kBAAkB,MAClB,mBAAmB,MACnB,qBAAqB,YAAY,mBACjC,sBAAsB,YAAY,gBAClC;GACA,oBAAoB,MAAM;GAC1B,iBAAiB,WAAW;GAC5B,iBAAiB,WAAW;GAE5B,SAAS,qBAAqB;GAE9B,MAAM,kBAAkB,YAAY,MAAM;GAC1C,gBAAgB,iBAAiB;GACjC,gBAAgB,kBAAkB;GAElC,MAAM,eAAe,SAAS;GAC9B,MAAM,gBAAgB,MAAM,IAAI,gBAAgB;GAChD,MAAM,iBAAiB,MAAM,IAAI,iBAAiB;GAClD,MAAM,YAAY,SAAS;GAC3B,MAAM,aAAa,SAAS;GAC5B,MAAM,mBAAmB,SAAS,aAAa,MAAM;GACrD,iBAAiB,iBAAiB;GAClC,iBAAiB,kBAAkB;GAEnC,iBAAiB,YAAY;GAC7B,iBAAiB,YAAY;GAE7B,IAAI,cAAc,SAAS,WACzB,mBAAmB,UAAU,eAAe,SAAS;GAGvD,IAAI,eAAe,SAAS,YAC1B,mBAAmB,UAAU,gBAAgB,UAAU;GAGzD,iBAAiB,UAAU,eAAe,aAAa;GAEvD,iBAAiB,UAAU,gBAAgB,cAAc;GAEzD,aAAa,iBAAiB,cAAc,MAAM;GAClD,aAAa,kBAAkB,eAAe,MAAM;GAEpD,SAAS,cAAc;GACvB,SAAS,eAAe;GAExB,IAAI,qBAAqB;IACvB,kBAAkB,aAAa,YAAY,IAAI,IAAI,gBAAgB;IACnE,kBAAkB;GACpB;GAEA,SAAS,sBAAsB;GAC/B,SAAS,qBAAqB,CAAC,eAAe,cAAc;GAC5D,SAAS,kBAAkB;GAE3B,OAAO;EACT;EAEA,IAAI,qBAAqB;EACzB,MAAM,eAAuC,CAAC;EAC9C,MAAM,gBAAsC,CAAC;EAC7C,MAAM,iBAA0B,CAAC;EAEjC,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;GAC/B,MAAM,OAAO,SAAS;GACtB,MAAM,MAAM,KAAK,MAAM,CAAC;GACxB,MAAM,WAAW,MAAM,IAAI,GAAG;GAE9B,IACE,CAAC,YACD,SAAS,SAAS,QACjB,SAAS,YAAY,gBAAgB,SAAS,YAAY,KAAK,MAAM,GACtE;IACA,qBAAqB;IACrB;GACF;GAEA,aAAa,KAAK;GAClB,cAAc,KAAK;GACnB,eAAe,KAAK,SAAS,MAAM;GACnC,iBAAiB,YAAY;EAC/B;EAEA,IAAI,oBAAoB;GACtB,oBAAoB,YAAY;GAChC,SAAS,qBAAqB;GAE9B,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;IAC7C,iBAAiB,UAAU,cAAc,IAAI,CAAC;IAC9C,eAAe,KAAK,cAAc,EAAE,CAAC,MAAM;GAC7C;GAEA,SAAS,cAAc;GACvB,SAAS,eAAe;GACxB,SAAS,gBAAgB;GAEzB,IAAI,qBAAqB;IACvB,kBAAkB,aAAa,YAAY,IAAI,IAAI,gBAAgB;IACnE,kBAAkB;GACpB;GAEA,SAAS,sBAAsB;GAC/B,SAAS,qBAAqB;GAC9B,SAAS,kBAAkB;GAE3B,OAAO;EACT;CACF;CAIA,oBAAoB,YAAY;CAChC,SAAS,qBAAqB;CAE9B,MAAM,WAAW,IAAI,IAAI,WAAW;CACpC,MAAM,iBAAyC,CAAC;CAChD,MAAM,kBAAwC,CAAC;CAC/C,MAAM,eAAwB,CAAC;CAC/B,IAAI,WAAW,SAAS,SAAS,SAAS;CAG1C,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,OAAO,SAAS;EACtB,MAAM,MAAM,KAAK,MAAM,CAAC;EACxB,iBAAiB,WAAW;EAE5B,SAAS,OAAO,GAAG;EACnB,eAAe,KAAK,GAAG;EAEvB,MAAM,WAAW,MAAM,IAAI,GAAG;EAC9B,iBAAiB,WAAW,WAAW,SAAS;EAEhD,IAAI,CAAC,UAAU;GAEb,MAAM,eAAe,mBAAmB,KAAK,MAAM,GAAG,QAAQ;GAC9D,MAAM,IAAI,KAAK,YAAY;GAC3B,gBAAgB,KAAK,YAAY;GACjC,aAAa,KAAK,aAAa,MAAM,KAAc;EACrD,OAAO;GAEL,iBAAiB,YAAY;GAC7B,MAAM,cAAc,SAAS,SAAS;GACtC,MAAM,eAAe,SAAS,YAAY,KAAK,MAAM;GAErD,IAAI,aAAa;IACf,WAAW;IACX,mBAAmB,UAAU,UAAU,IAAI;GAC7C;GAEA,IAAI,cAEF,iBAAiB,UAAU,UAAU,CAAC;GAGxC,gBAAgB,KAAK,QAAQ;GAC7B,aAAa,KAAK,SAAS,MAAM,KAAc;EACjD;CACF;CAGA,KAAK,MAAM,OAAO,UAAU;EAC1B,WAAW;EACX,MAAM,eAAe,MAAM,IAAI,GAAG;EAClC,IAAI,cAAc;GAChB,oBAAoB,UAAU,cAAc,MAAM;GAClD,MAAM,OAAO,GAAG;EAClB;CACF;CAEA,SAAS,cAAc;CACvB,SAAS,eAAe;CAGxB,IAAI,qBAAqB;EACvB,kBAAkB,aAAa,YAAY,IAAI,IAAI,gBAAgB;EACnE,kBAAkB;CACpB;CAEA,SAAS,gBAAgB;CACzB,SAAS,sBAAsB;CAC/B,SAAS,qBAAqB;CAC9B,SAAS,kBAAkB;CAE3B,OAAO;AACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"for-scopes.d.ts","names":[],"sources":["../../src/runtime/for-scopes.ts"],"mappings":";;;;;;UA+BiB,eAAA;EACf,GAAA;EACA,IAAA,EAAM,CAAA;EACN,YAAA,EAAc,CAAA;EACd,UAAA,EAAY,aAAA,CAAc,CAAA;EAC1B,mBAAA,EAAqB,GAAA,CAAI,WAAA,EAAa,qBAAA;EACtC,WAAA,EAAa,cAAA;EACb,KAAA,EAAO,UAAA;AAAA;AAAA,KAGG,qBAAA;AAAA,iBAMI,gBAAA,IACd,QAAA,EAAU,QAAA,CAAS,CAAA,GACnB,YAAA,EAAc,eAAA,CAAgB,CAAA,GAC9B,SAAA;AAAA,iBAmDc,mBAAA,IACd,QAAA,EAAU,QAAA,CAAS,CAAA,GACnB,YAAA,EAAc,eAAA,CAAgB,CAAA,GAC9B,UAAA,EAAY,qBAAA;AAAA,iBA0BE,kBAAA,IACd,GAAA,mBACA,IAAA,EAAM,CAAA,EACN,KAAA,UACA,QAAA,EAAU,QAAA,CAAS,CAAA,IAClB,eAAA,CAAgB,CAAA;AAAA,iBAkDH,kBAAA,IACd,QAAA,EAAU,QAAA,CAAS,CAAA,GACnB,YAAA,EAAc,eAAA,CAAgB,CAAA,GAC9B,IAAA,EAAM,CAAA;AAAA,iBAgEQ,oBAAA,IACd,QAAA,EAAU,QAAA,CAAS,CAAA,GACnB,UAAA,EAAY,qBAAA;AAAA,iBAwBE,mBAAA,IAAuB,QAAA,EAAU,QAAA,CAAS,CAAA,IAAK,KAAA;AAAA,iBA4B/C,eAAA,IACd,QAAA,EAAU,QAAA,CAAS,CAAA,GACnB,UAAA,EAAY,qBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"for-scopes.js","names":[],"sources":["../../src/runtime/for-scopes.ts"],"sourcesContent":["/**\n * For item and fallback child-scope ownership.\n */\n\nimport type { DOMElement, VNode } from '../common/vnode';\nimport { isDevelopmentEnvironment } from '../common/env';\nimport type { ComponentInstance } from './component';\nimport {\n createChildScope,\n disposeChildScope,\n type ChildScope,\n} from './child-scope';\nimport {\n canProxyForItem,\n createForIndexSignal,\n createForItemSignal,\n createReactiveForItem,\n haveSameOwnKeys,\n notifyForSignalReaders,\n readForItemProperty,\n removeForParentReaders,\n scopeReadsSource,\n syncForIndexSignal,\n type ForIndexSignal,\n type ForItemPropertySignal,\n type ForItemSignal,\n} from './for-signals';\nimport { getRuntimeRenderer } from './access';\nimport { recordBenchEvent } from './for-bench';\nimport type { ForState } from './for-internal';\n\nexport interface ForItemInstance<T> {\n key: string | number;\n item: T;\n reactiveItem: T;\n itemSignal: ForItemSignal<T> | null;\n itemPropertySignals: Map<PropertyKey, ForItemPropertySignal> | null;\n indexSignal: ForIndexSignal;\n scope: ChildScope;\n}\n\nexport type RemovedDomCleanupMode = 'none' | 'teardown' | 'full-clear';\n\nfunction enqueueForScopeUpdate(parent: ComponentInstance | null): void {\n parent?._enqueueRun?.();\n}\n\nexport function syncForItemIndex<T>(\n forState: ForState<T>,\n itemInstance: ForItemInstance<T>,\n nextIndex: number\n): boolean {\n const indexSignal = itemInstance.indexSignal;\n if (indexSignal.peek() === nextIndex) {\n return false;\n }\n\n const scopeReadsIndex = scopeReadsSource(itemInstance.scope, indexSignal);\n if (!scopeReadsIndex) {\n syncForIndexSignal(indexSignal, nextIndex);\n return false;\n }\n\n indexSignal.set(nextIndex, false);\n notifyForSignalReaders(indexSignal, itemInstance.scope.componentInstance);\n\n rerenderItemInstance(forState, itemInstance, itemInstance.reactiveItem);\n\n return true;\n}\n\nfunction materializeItemVnode(\n key: string | number,\n vnode: VNode | undefined\n): void {\n if (vnode && typeof vnode === 'object' && 'type' in vnode) {\n const vn = vnode as DOMElement;\n vn.key = key;\n\n if (typeof vn.type === 'string') {\n if (!vn.props) vn.props = {};\n if (vn.props['data-key'] === undefined) {\n vn.props['data-key'] = String(key);\n }\n }\n }\n}\n\nfunction renderItemScope<T>(\n forState: ForState<T>,\n scope: ChildScope,\n item: T,\n indexSignal: ForIndexSignal,\n key: string | number\n): VNode {\n recordBenchEvent('rowFactory');\n const vnode = scope.render(() => forState.renderFn(item, indexSignal));\n materializeItemVnode(key, vnode);\n return vnode;\n}\n\nexport function disposeItemInstance<T>(\n forState: ForState<T>,\n itemInstance: ForItemInstance<T>,\n domCleanup: RemovedDomCleanupMode\n): void {\n recordBenchEvent('itemRemoved');\n const removedDom = itemInstance.scope.dom;\n\n try {\n disposeChildScope(itemInstance.scope);\n } catch (err) {\n if (isDevelopmentEnvironment()) {\n console.error('[For] Cleanup error:', err);\n }\n }\n\n if (!removedDom) {\n return;\n }\n\n if (removedDom instanceof Element) {\n if (domCleanup === 'teardown') {\n getRuntimeRenderer().teardownNodeSubtree(removedDom);\n }\n }\n\n forState.lastRemovedNodes.push(removedDom);\n}\n\nexport function createItemInstance<T>(\n key: string | number,\n item: T,\n index: number,\n forState: ForState<T>\n): ForItemInstance<T> {\n recordBenchEvent('itemCreated');\n\n // Create index signal manually without going through state() hook\n // to avoid hook order violations (each For item creates its signal dynamically)\n const indexSignal = createForIndexSignal(index);\n const itemSignal = canProxyForItem(item) ? createForItemSignal(item) : null;\n const itemPropertySignals = itemSignal\n ? new Map<PropertyKey, ForItemPropertySignal>()\n : null;\n const reactiveItem =\n itemSignal && itemPropertySignals\n ? createReactiveForItem(itemSignal, itemPropertySignals)\n : item;\n const scope = createChildScope(forState.parentInstance, key, () => {\n if (forState._enqueueBoundaryCommit) {\n forState._enqueueBoundaryCommit();\n return;\n }\n\n enqueueForScopeUpdate(forState.parentInstance);\n });\n\n renderItemScope(forState, scope, reactiveItem, indexSignal, key);\n\n return {\n key,\n item,\n reactiveItem,\n itemSignal,\n itemPropertySignals,\n indexSignal,\n scope,\n };\n}\n\nfunction rerenderItemInstance<T>(\n forState: ForState<T>,\n itemInstance: ForItemInstance<T>,\n item: T\n): void {\n renderItemScope(\n forState,\n itemInstance.scope,\n item,\n itemInstance.indexSignal,\n itemInstance.key\n );\n}\n\nexport function updateItemInstance<T>(\n forState: ForState<T>,\n itemInstance: ForItemInstance<T>,\n item: T\n): boolean {\n if (itemInstance.item === item) {\n return false;\n }\n\n const previousItem = itemInstance.item;\n itemInstance.item = item;\n\n const scope = itemInstance.scope;\n let scopeReadsChangedSignal = false;\n const itemSignal = itemInstance.itemSignal;\n if (!itemSignal) {\n rerenderItemInstance(forState, itemInstance, item);\n return true;\n }\n\n const propertySignals = itemInstance.itemPropertySignals;\n const changedPropertySignals: Array<[ForItemPropertySignal, unknown]> = [];\n if (propertySignals && propertySignals.size > 0) {\n for (const [prop, propertySignal] of propertySignals) {\n const previousValue = readForItemProperty(previousItem, prop);\n const nextValue = readForItemProperty(item, prop);\n if (Object.is(previousValue, nextValue)) {\n continue;\n }\n\n if (scopeReadsSource(scope, propertySignal)) {\n scopeReadsChangedSignal = true;\n }\n\n changedPropertySignals.push([propertySignal, nextValue]);\n }\n }\n\n if (scopeReadsSource(scope, itemSignal)) {\n scopeReadsChangedSignal = true;\n }\n\n const itemShapeChanged =\n changedPropertySignals.length === 0 && !haveSameOwnKeys(previousItem, item);\n const notifyReaders =\n !scopeReadsChangedSignal &&\n (changedPropertySignals.length > 0 || itemShapeChanged);\n const visibleChange =\n scopeReadsChangedSignal ||\n changedPropertySignals.length > 0 ||\n itemShapeChanged;\n for (const [propertySignal, nextValue] of changedPropertySignals) {\n removeForParentReaders(forState.parentInstance, propertySignal);\n propertySignal.set(nextValue, notifyReaders);\n }\n removeForParentReaders(forState.parentInstance, itemSignal);\n itemSignal.set(item, notifyReaders);\n\n if (scopeReadsChangedSignal) {\n rerenderItemInstance(forState, itemInstance, itemInstance.reactiveItem);\n }\n\n return visibleChange;\n}\n\nconst FOR_FALLBACK_SCOPE_KEY = '__for-fallback__';\n\nexport function disposeFallbackScope<T>(\n forState: ForState<T>,\n domCleanup: RemovedDomCleanupMode\n): void {\n const fallbackScope = forState.fallbackScope;\n if (!fallbackScope) {\n return;\n }\n\n const removedDom = fallbackScope.dom;\n disposeChildScope(fallbackScope);\n forState.fallbackScope = null;\n\n if (!removedDom) {\n return;\n }\n\n if (removedDom instanceof Element) {\n if (domCleanup === 'teardown') {\n getRuntimeRenderer().teardownNodeSubtree(removedDom);\n }\n }\n\n forState.lastRemovedNodes.push(removedDom);\n}\n\nexport function renderFallbackScope<T>(forState: ForState<T>): VNode[] {\n if (forState.fallback == null || forState.fallback === false) {\n if (forState.fallbackScope) {\n disposeFallbackScope(forState, 'none');\n }\n forState.orderedVNodes = [];\n forState.orderedItems = [];\n return [];\n }\n\n const fallbackScope =\n forState.fallbackScope ??\n createChildScope(forState.parentInstance, FOR_FALLBACK_SCOPE_KEY, () => {\n if (forState._enqueueBoundaryCommit) {\n forState._enqueueBoundaryCommit();\n return;\n }\n\n enqueueForScopeUpdate(forState.parentInstance);\n });\n forState.fallbackScope = fallbackScope;\n\n const vnode = fallbackScope.render(() => forState.fallback as VNode);\n forState.orderedVNodes = vnode == null || vnode === false ? [] : [vnode];\n forState.orderedItems = [];\n return forState.orderedVNodes;\n}\n\nexport function disposeAllItems<T>(\n forState: ForState<T>,\n domCleanup: RemovedDomCleanupMode\n): void {\n const { items, orderedKeys } = forState;\n for (let index = 0; index < orderedKeys.length; index += 1) {\n const key = orderedKeys[index];\n const itemInstance = items.get(key);\n if (!itemInstance) {\n continue;\n }\n disposeItemInstance(forState, itemInstance, domCleanup);\n items.delete(key);\n }\n orderedKeys.length = 0;\n forState.orderedKeys = orderedKeys;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"for-signals.d.ts","names":[],"sources":["../../src/runtime/for-signals.ts"],"mappings":";;;;;KAUY,aAAA,MAAmB,cAAA,CAAe,CAAA,WACrC,CAAA;EACL,IAAA,IAAQ,CAAA;EACR,GAAA,CAAI,QAAA,EAAU,CAAA,EAAG,aAAA;AAAA;AAAA,KAGT,qBAAA,GAAwB,cAAc;EAE9C,IAAA;EACA,GAAA,CAAI,QAAA,WAAmB,aAAA;AAAA;AAAA,KAGf,cAAA,GAAiB,cAAc;EAEvC,IAAA;EACA,GAAA,CACE,QAAA,aAAqB,IAAA,sBACrB,aAAA;AAAA;AAAA,iBAIU,sBAAA,CACd,MAAA,EAAQ,cAAA,WACR,YAAA,GAAe,iBAAiB;AAAA,iBAOlB,oBAAA,CAAqB,YAAA,WAAuB,cAAc;AAAA,iBA6B1D,kBAAA,CACd,WAAA,EAAa,cAAc,EAC3B,SAAA;AAAA,iBAUc,mBAAA,IAAuB,WAAA,EAAa,CAAA,GAAI,aAAA,CAAc,CAAA;AAAA,iBAwDtD,mBAAA,CAAoB,IAAA,WAAe,IAAA,EAAM,WAAW;AAAA,iBAIpD,eAAA,CACd,YAAA,WACA,QAAiB;AAAA,iBAkBH,gBAAA,CACd,KAAA,EAAO,UAAA,EACP,MAAA,EAAQ,cAAc;AAAA,iBAqBR,sBAAA,CACd,cAAA,EAAgB,iBAAA,SAChB,MAAA,EAAQ,cAAc;AAAA,iBA+BR,eAAA,CAAgB,IAAA,YAAgB,IAAI;AAAA,iBAOpC,qBAAA,IACd,UAAA,EAAY,aAAA,CAAc,CAAA,GAC1B,eAAA,EAAiB,GAAA,CAAI,WAAA,EAAa,qBAAA,IACjC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"for-signals.js","names":[],"sources":["../../src/runtime/for-signals.ts"],"sourcesContent":["import type { ChildScope } from './child-scope';\nimport type { ComponentInstance } from './component';\nimport {\n markReactivePropsDirtySource,\n markReadableDerivedSubscribersDirty,\n notifyReadableReaders,\n recordReadableRead,\n type ReadableSource,\n} from './readable';\n\nexport type ForItemSignal<T> = ReadableSource<T> &\n (() => T) & {\n peek(): T;\n set(newValue: T, notifyReaders?: boolean): void;\n };\n\nexport type ForItemPropertySignal = ReadableSource<unknown> &\n (() => unknown) & {\n peek(): unknown;\n set(newValue: unknown, notifyReaders?: boolean): void;\n };\n\nexport type ForIndexSignal = ReadableSource<number> &\n (() => number) & {\n peek(): number;\n set(\n newValue: number | ((prev: number) => number),\n notifyReaders?: boolean\n ): void;\n };\n\nexport function notifyForSignalReaders(\n source: ReadableSource<unknown>,\n skipInstance?: ComponentInstance | null\n): void {\n markReadableDerivedSubscribersDirty(source);\n markReactivePropsDirtySource(source);\n notifyReadableReaders(source, skipInstance);\n}\n\nexport function createForIndexSignal(initialIndex: number): ForIndexSignal {\n let indexValue = initialIndex;\n const readers = new Map<ComponentInstance, number>();\n\n const indexSignal = (() => {\n indexSignal._hasBeenRead = true;\n recordReadableRead(indexSignal);\n return indexValue;\n }) as ForIndexSignal;\n indexSignal._readers = readers;\n indexSignal.peek = () => indexValue;\n indexSignal.set = (\n newValue: number | ((prev: number) => number),\n notifyReaders = true\n ) => {\n const nextValue =\n typeof newValue === 'function' ? newValue(indexValue) : newValue;\n if (nextValue !== indexValue) {\n indexValue = nextValue;\n if (notifyReaders) {\n notifyForSignalReaders(indexSignal);\n }\n }\n };\n indexSignal._hasBeenRead = false;\n\n return indexSignal;\n}\n\nexport function syncForIndexSignal(\n indexSignal: ForIndexSignal,\n nextIndex: number\n): boolean {\n if (indexSignal.peek() === nextIndex) {\n return false;\n }\n\n indexSignal.set(nextIndex, indexSignal._hasBeenRead);\n return indexSignal._hasBeenRead === true;\n}\n\nexport function createForItemSignal<T>(initialItem: T): ForItemSignal<T> {\n let itemValue = initialItem;\n const readers = new Map<ComponentInstance, number>();\n\n const itemSignal = (() => {\n itemSignal._hasBeenRead = true;\n recordReadableRead(itemSignal);\n return itemValue;\n }) as ForItemSignal<T>;\n\n itemSignal._readers = readers;\n itemSignal.peek = () => itemValue;\n itemSignal.set = (newValue: T, notifyReaders = true) => {\n if (Object.is(itemValue, newValue)) {\n return;\n }\n\n itemValue = newValue;\n if (notifyReaders) {\n notifyForSignalReaders(itemSignal);\n }\n };\n itemSignal._hasBeenRead = false;\n\n return itemSignal;\n}\n\nfunction createForItemPropertySignal(\n initialValue: unknown\n): ForItemPropertySignal {\n let propertyValue = initialValue;\n const readers = new Map<ComponentInstance, number>();\n\n const propertySignal = (() => {\n propertySignal._hasBeenRead = true;\n recordReadableRead(propertySignal);\n return propertyValue;\n }) as ForItemPropertySignal;\n\n propertySignal._readers = readers;\n propertySignal.peek = () => propertyValue;\n propertySignal.set = (newValue: unknown, notifyReaders = true) => {\n if (Object.is(propertyValue, newValue)) {\n return;\n }\n\n propertyValue = newValue;\n if (notifyReaders) {\n notifyForSignalReaders(propertySignal);\n }\n };\n propertySignal._hasBeenRead = false;\n\n return propertySignal;\n}\n\nexport function readForItemProperty(item: unknown, prop: PropertyKey): unknown {\n return Reflect.get(Object(item), prop);\n}\n\nexport function haveSameOwnKeys(\n previousItem: unknown,\n nextItem: unknown\n): boolean {\n const previousKeys = Reflect.ownKeys(Object(previousItem));\n const nextKeys = Reflect.ownKeys(Object(nextItem));\n\n if (previousKeys.length !== nextKeys.length) {\n return false;\n }\n\n for (let i = 0; i < previousKeys.length; i += 1) {\n if (previousKeys[i] !== nextKeys[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function scopeReadsSource(\n scope: ChildScope,\n source: ReadableSource<unknown>\n): boolean {\n return source._readers?.has(scope.componentInstance) ?? false;\n}\n\nfunction isForParentReader(\n parentInstance: ComponentInstance | null,\n reader: ComponentInstance\n): boolean {\n let current = parentInstance;\n\n while (current) {\n if (current === reader) {\n return true;\n }\n current = current.parentInstance;\n }\n\n return false;\n}\n\nexport function removeForParentReaders(\n parentInstance: ComponentInstance | null,\n source: ReadableSource<unknown>\n): void {\n const readers = source._readers;\n if (!readers || readers.size === 0) {\n return;\n }\n\n for (const reader of readers.keys()) {\n if (isForParentReader(parentInstance, reader)) {\n readers.delete(reader);\n }\n }\n}\n\nfunction getOrCreateForItemPropertySignal<T>(\n item: T,\n propertySignals: Map<PropertyKey, ForItemPropertySignal>,\n prop: PropertyKey\n): ForItemPropertySignal {\n const existingSignal = propertySignals.get(prop);\n if (existingSignal) {\n return existingSignal;\n }\n\n const propertySignal = createForItemPropertySignal(\n readForItemProperty(item, prop)\n );\n propertySignals.set(prop, propertySignal);\n return propertySignal;\n}\n\nexport function canProxyForItem(item: unknown): item is object {\n return (\n typeof item === 'function' ||\n (typeof item === 'object' && item !== null && !Array.isArray(item))\n );\n}\n\nexport function createReactiveForItem<T>(\n itemSignal: ForItemSignal<T>,\n propertySignals: Map<PropertyKey, ForItemPropertySignal>\n): T {\n const target = Object.create(null) as Record<string | symbol, unknown>;\n\n return new Proxy(target, {\n get(target, prop, receiver) {\n const ownDescriptor = Reflect.getOwnPropertyDescriptor(target, prop);\n if (ownDescriptor) {\n return Reflect.get(target, prop, receiver);\n }\n\n const currentItem = itemSignal.peek();\n\n if (typeof prop !== 'symbol') {\n return getOrCreateForItemPropertySignal(\n currentItem,\n propertySignals,\n prop\n )();\n }\n\n recordReadableRead(itemSignal);\n return Reflect.get(Object(currentItem), prop, receiver);\n },\n has(target, prop) {\n recordReadableRead(itemSignal);\n return prop in target || prop in Object(itemSignal.peek());\n },\n ownKeys(target) {\n recordReadableRead(itemSignal);\n const keys = new Set<string | symbol>(Reflect.ownKeys(target));\n for (const key of Reflect.ownKeys(Object(itemSignal.peek()))) {\n keys.add(key);\n }\n\n return Array.from(keys);\n },\n getOwnPropertyDescriptor(target, prop) {\n recordReadableRead(itemSignal);\n const ownDescriptor = Reflect.getOwnPropertyDescriptor(target, prop);\n if (ownDescriptor) {\n return ownDescriptor;\n }\n\n return Object.getOwnPropertyDescriptor(Object(itemSignal.peek()), prop);\n },\n getPrototypeOf() {\n recordReadableRead(itemSignal);\n return Object.getPrototypeOf(Object(itemSignal.peek()));\n },\n }) as T;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"for-types.d.ts","names":[],"sources":["../../src/runtime/for-types.ts"],"mappings":";;;KAEY,aAAA,MAAmB,CAAA,YAAa,CAAC;AAAA,KACjC,cAAA,OAAqB,IAAA,EAAM,CAAC,EAAE,KAAA;AAAA,KAC9B,aAAA,OAAoB,IAAA,EAAM,CAAA,EAAG,KAAA,mBAAwB,KAAK"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle-operations.d.ts","names":[],"sources":["../../src/runtime/lifecycle-operations.ts"],"mappings":";KAQY,iBAAA;AAAA,UAEK,YAAA;EACf,IAAA,GAAO,iBAAA,YAA6B,iBAAiB;AAAA;AAAA,iBAsDvC,WAAA,CACd,WAAA,+BACC,iBAAiB;AAAA,iBAIJ,eAAA,IAAmB,iBAAiB;AAAA,iBAKpC,aAAA,IAAiB,iBAAiB;AAAA,KAO7C,eAAA,aAA4B,uBAAuB;AAAA,iBAuGxC,EAAA,CACd,MAAA,EAAQ,WAAA,EACR,KAAA,UACA,OAAA,EAAS,aAAA,EACT,OAAA,GAAU,eAAA;AAAA,iBA8FI,KAAA,CACd,UAAA,UACA,EAAA,cACA,OAAA,GAAU,YAAY;AAAA,iBA8BR,MAAA,IACd,OAAA,WACA,QAAA,GAAW,MAAA;EACR,KAAA,EAAO,CAAA;EAAU,OAAA;EAAkB,KAAA,EAAO,KAAA;AAAA;AAAA,iBAK/B,IAAA,CACd,EAAgE,8BAAhC,WAAW;;;;AAnQzB;AAIpB;;;;AAAoD;AAKpD;iBAqSgB,OAAA,IAAW,EAAA,QAAU,CAAA,SAAU,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle-operations.js","names":[],"sources":["../../src/runtime/lifecycle-operations.ts"],"sourcesContent":["import {\n claimHookIndex,\n getCurrentComponentInstance,\n registerCommitOperation,\n type ComponentInstance,\n} from './component';\nimport { isRouteActivityActive } from '../common/route-activity';\n\nexport type ActivityPredicate = () => boolean;\n\nexport interface TimerOptions {\n when?: ActivityPredicate | readonly ActivityPredicate[];\n}\n\nfunction normalizePredicates(\n predicates: TimerOptions['when']\n): readonly ActivityPredicate[] {\n if (!predicates) {\n return [];\n }\n\n return typeof predicates === 'function' ? [predicates] : predicates;\n}\n\nfunction allPredicatesPass(predicates: readonly ActivityPredicate[]): boolean {\n for (const predicate of predicates) {\n if (!predicate()) {\n return false;\n }\n }\n\n return true;\n}\n\ntype LifecycleSlotKind = 'timer' | 'listener' | 'task';\n\ntype LifecycleSlot = {\n kind: LifecycleSlotKind;\n};\n\nfunction getLifecycleSlot<TSlot extends LifecycleSlot>(\n instance: ComponentInstance,\n index: number,\n kind: TSlot['kind'],\n create: () => TSlot\n): TSlot {\n const existing = instance.lifecycleSlots[index];\n\n if (existing) {\n const slot = existing as LifecycleSlot;\n if (slot.kind !== kind) {\n throw new Error(\n `${kind}() lifecycle order violation: slot ${index} already belongs to ${slot.kind}(). ` +\n 'Keep lifecycle primitives in a stable top-level order.'\n );\n }\n\n return existing as TSlot;\n }\n\n const slot = create();\n instance.lifecycleSlots[index] = slot;\n return slot;\n}\n\nexport function routeActive(\n pathOrPaths: string | readonly string[]\n): ActivityPredicate {\n return () => isRouteActivityActive(pathOrPaths);\n}\n\nexport function documentVisible(): ActivityPredicate {\n return () =>\n typeof document === 'undefined' || document.visibilityState !== 'hidden';\n}\n\nexport function windowFocused(): ActivityPredicate {\n return () =>\n typeof document === 'undefined' ||\n typeof document.hasFocus !== 'function' ||\n document.hasFocus();\n}\n\ntype ListenerOptions = boolean | AddEventListenerOptions | undefined;\n\ntype NormalizedListenerOptions =\n | boolean\n | {\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n signal?: AbortSignal;\n }\n | undefined;\n\ninterface ListenerSlot extends LifecycleSlot {\n kind: 'listener';\n target: EventTarget | null;\n event: string;\n handler: EventListener;\n listener: EventListener;\n options: NormalizedListenerOptions;\n pendingTarget: EventTarget;\n pendingEvent: string;\n pendingHandler: EventListener;\n pendingOptions: NormalizedListenerOptions;\n attached: boolean;\n cleanupRegistered: boolean;\n}\n\nfunction normalizeListenerOptions(\n options: ListenerOptions\n): NormalizedListenerOptions {\n if (options === undefined || typeof options === 'boolean') {\n return options;\n }\n\n return {\n ...(options.capture !== undefined ? { capture: options.capture } : {}),\n ...(options.once !== undefined ? { once: options.once } : {}),\n ...(options.passive !== undefined ? { passive: options.passive } : {}),\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n };\n}\n\nfunction listenerOptionsEqual(\n a: NormalizedListenerOptions,\n b: NormalizedListenerOptions\n): boolean {\n if (a === b) {\n return true;\n }\n if (typeof a === 'boolean' || typeof b === 'boolean') {\n return a === b;\n }\n if (!a || !b) {\n return a === b;\n }\n\n return (\n a.capture === b.capture &&\n a.once === b.once &&\n a.passive === b.passive &&\n a.signal === b.signal\n );\n}\n\nfunction detachListenerSlot(slot: ListenerSlot): void {\n if (!slot.attached || !slot.target) {\n return;\n }\n\n slot.target.removeEventListener(slot.event, slot.listener, slot.options);\n slot.attached = false;\n}\n\nfunction commitListenerSlot(\n instance: ComponentInstance,\n slot: ListenerSlot\n): void {\n slot.handler = slot.pendingHandler;\n\n const shouldReattach =\n !slot.attached ||\n slot.target !== slot.pendingTarget ||\n slot.event !== slot.pendingEvent ||\n !listenerOptionsEqual(slot.options, slot.pendingOptions);\n\n if (shouldReattach) {\n detachListenerSlot(slot);\n slot.target = slot.pendingTarget;\n slot.event = slot.pendingEvent;\n slot.options = slot.pendingOptions;\n slot.target.addEventListener(slot.event, slot.listener, slot.options);\n slot.attached = true;\n }\n\n if (!slot.cleanupRegistered) {\n slot.cleanupRegistered = true;\n instance.cleanupFns.push(() => {\n detachListenerSlot(slot);\n slot.cleanupRegistered = false;\n });\n }\n}\n\nexport function on(\n target: EventTarget,\n event: string,\n handler: EventListener,\n options?: ListenerOptions\n): void {\n const instance = getCurrentComponentInstance();\n if (!instance) {\n return;\n }\n\n const index = claimHookIndex(instance, 'on');\n const normalizedOptions = normalizeListenerOptions(options);\n const slot = getLifecycleSlot<ListenerSlot>(\n instance,\n index,\n 'listener',\n () => {\n const createdSlot = {\n kind: 'listener' as const,\n target: null,\n event,\n handler,\n listener: ((evt: Event) => {\n createdSlot.handler.call(createdSlot.target, evt);\n }) as EventListener,\n options: undefined,\n pendingTarget: target,\n pendingEvent: event,\n pendingHandler: handler,\n pendingOptions: normalizedOptions,\n attached: false,\n cleanupRegistered: false,\n };\n return createdSlot;\n }\n );\n\n slot.pendingTarget = target;\n slot.pendingEvent = event;\n slot.pendingHandler = handler;\n slot.pendingOptions = normalizedOptions;\n\n registerCommitOperation(() => {\n commitListenerSlot(instance, slot);\n });\n}\n\ninterface TimerSlot extends LifecycleSlot {\n kind: 'timer';\n id: ReturnType<typeof setInterval> | null;\n intervalMs: number | null;\n pendingIntervalMs: number;\n callback: () => void;\n predicates: readonly ActivityPredicate[];\n pendingCallback: () => void;\n pendingPredicates: readonly ActivityPredicate[];\n cleanupRegistered: boolean;\n}\n\nfunction stopTimerSlot(slot: TimerSlot): void {\n if (slot.id === null) {\n return;\n }\n\n clearInterval(slot.id);\n slot.id = null;\n}\n\nfunction startTimerSlot(slot: TimerSlot): void {\n slot.id = setInterval(() => {\n if (allPredicatesPass(slot.predicates)) {\n slot.callback();\n }\n }, slot.intervalMs ?? slot.pendingIntervalMs);\n}\n\nfunction commitTimerSlot(instance: ComponentInstance, slot: TimerSlot): void {\n const intervalChanged = slot.intervalMs !== slot.pendingIntervalMs;\n\n slot.callback = slot.pendingCallback;\n slot.predicates = slot.pendingPredicates;\n\n if (slot.id === null || intervalChanged) {\n stopTimerSlot(slot);\n slot.intervalMs = slot.pendingIntervalMs;\n startTimerSlot(slot);\n }\n\n if (!slot.cleanupRegistered) {\n slot.cleanupRegistered = true;\n instance.cleanupFns.push(() => {\n stopTimerSlot(slot);\n slot.cleanupRegistered = false;\n });\n }\n}\n\nexport function timer(\n intervalMs: number,\n fn: () => void,\n options?: TimerOptions\n): void {\n const instance = getCurrentComponentInstance();\n if (!instance) {\n return;\n }\n\n const index = claimHookIndex(instance, 'timer');\n const predicates = normalizePredicates(options?.when);\n const slot = getLifecycleSlot<TimerSlot>(instance, index, 'timer', () => ({\n kind: 'timer',\n id: null,\n intervalMs: null,\n pendingIntervalMs: intervalMs,\n callback: fn,\n predicates,\n pendingCallback: fn,\n pendingPredicates: predicates,\n cleanupRegistered: false,\n }));\n\n slot.pendingIntervalMs = intervalMs;\n slot.pendingCallback = fn;\n slot.pendingPredicates = predicates;\n\n registerCommitOperation(() => {\n commitTimerSlot(instance, slot);\n });\n}\n\nexport function stream<T>(\n _source: unknown,\n _options?: Record<string, unknown>\n): { value: T | null; pending: boolean; error: Error | null } {\n // Stub implementation: no-op.\n return { value: null, pending: true, error: null };\n}\n\nexport function task(\n fn: () => void | (() => void) | PromiseLike<void | (() => void)>\n): void {\n const instance = getCurrentComponentInstance();\n if (!instance) {\n return;\n }\n\n const index = claimHookIndex(instance, 'task');\n const slot = getLifecycleSlot<\n LifecycleSlot & {\n kind: 'task';\n started: boolean;\n task: typeof fn;\n }\n >(instance, index, 'task', () => ({\n kind: 'task',\n started: false,\n task: fn,\n }));\n\n if (!slot.started) {\n slot.task = fn;\n registerCommitOperation(async () => {\n if (slot.started) {\n return;\n }\n\n slot.started = true;\n return await slot.task();\n });\n }\n}\n\n/**\n * Capture the result of a synchronous expression at call time and return a\n * thunk that returns the captured value later. This is a low-level helper for\n * cases where async continuations need to observe a snapshot of values at the\n * moment scheduling occurred.\n *\n * Usage (public API):\n * const snapshot = capture(() => someState());\n * Promise.resolve().then(() => { use(snapshot()); });\n */\nexport function capture<T>(fn: () => T): () => T {\n const value = fn();\n return () => value;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"perf-metrics.d.ts","names":[],"sources":["../../src/runtime/perf-metrics.ts"],"mappings":";KAKK,WAAA;EACH,qBAAA;EACA,sBAAA;EACA,yBAAA;EACA,oBAAA;EACA,iBAAA;EACA,qBAAA;EACA,4BAAA;EACA,eAAA;EACA,8BAAA;EACA,6BAAA;EACA,mBAAA;EACA,uBAAA;EACA,cAAA;EACA,eAAA;EACA,qBAAA;EACA,cAAA;AAAA;AAAA,iBAqEc,mBAAA,IAAuB,WAAW;AAAA,iBAIlC,mBAAA,CACd,GAAA,qOAUA,KAAS;AAAA,iBAOK,eAAA,CACd,GAAA,kEACA,OAAe;AAAA,iBAOD,6BAAA,CAA8B,SAAiB;AAAA,iBAY/C,cAAA,IAAkB,QAAQ,CAAC,WAAA;AAAA,iBAK3B,gBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"perf-metrics.js","names":[],"sources":["../../src/runtime/perf-metrics.ts"],"sourcesContent":["import {\n isDevelopmentEnvironment,\n isRuntimeEnvFlagEnabled,\n} from '../common/env';\n\ntype PerfMetrics = {\n selectorInvalidations: number;\n selectorCandidateReads: number;\n reactivePropReevaluations: number;\n skippedDomPropWrites: number;\n classListPatchOps: number;\n delegatedAncestorHops: number;\n hydrationBoundaryActivations: number;\n ssrTagCacheHits: number;\n lastSchedulerTaskCountPerFlush: number;\n maxSchedulerTaskCountPerFlush: number;\n schedulerFlushCount: number;\n schedulerTaskExecutions: number;\n ssgWorkerCount: number;\n ssgRenderTimeMs: number;\n ssgWorkerRenderTimeMs: number;\n ssgWriteTimeMs: number;\n};\n\ntype PerfMetricsKey = keyof PerfMetrics;\n\ntype AskrPerfGlobal = typeof globalThis & {\n __ASKR_BENCH__?: boolean;\n __ASKR_PERF__?: PerfMetrics;\n};\n\nconst BENCH_BUILD_ENABLED = isRuntimeEnvFlagEnabled('ASKR_BENCH');\nlet cachedPerfStore: PerfMetrics | undefined;\n\nfunction createInitialPerfMetrics(): PerfMetrics {\n return {\n selectorInvalidations: 0,\n selectorCandidateReads: 0,\n reactivePropReevaluations: 0,\n skippedDomPropWrites: 0,\n classListPatchOps: 0,\n delegatedAncestorHops: 0,\n hydrationBoundaryActivations: 0,\n ssrTagCacheHits: 0,\n lastSchedulerTaskCountPerFlush: 0,\n maxSchedulerTaskCountPerFlush: 0,\n schedulerFlushCount: 0,\n schedulerTaskExecutions: 0,\n ssgWorkerCount: 0,\n ssgRenderTimeMs: 0,\n ssgWorkerRenderTimeMs: 0,\n ssgWriteTimeMs: 0,\n };\n}\n\nfunction shouldCollectPerfMetrics(): boolean {\n if (isDevelopmentEnvironment()) {\n return true;\n }\n if (!BENCH_BUILD_ENABLED) {\n return false;\n }\n try {\n return !!(globalThis as AskrPerfGlobal).__ASKR_BENCH__;\n } catch {\n return false;\n }\n}\n\nfunction getPerfStore(): PerfMetrics | null {\n if (cachedPerfStore) {\n return cachedPerfStore;\n }\n\n if (!shouldCollectPerfMetrics()) {\n return null;\n }\n\n try {\n const g = globalThis as AskrPerfGlobal;\n if (!g.__ASKR_PERF__) {\n g.__ASKR_PERF__ = createInitialPerfMetrics();\n }\n cachedPerfStore = g.__ASKR_PERF__;\n return cachedPerfStore;\n } catch {\n return null;\n }\n}\n\nexport function getPerfMetricsStore(): PerfMetrics | null {\n return getPerfStore();\n}\n\nexport function incrementPerfMetric(\n key:\n | 'selectorInvalidations'\n | 'selectorCandidateReads'\n | 'reactivePropReevaluations'\n | 'skippedDomPropWrites'\n | 'classListPatchOps'\n | 'delegatedAncestorHops'\n | 'hydrationBoundaryActivations'\n | 'ssrTagCacheHits'\n | 'ssgWorkerCount',\n delta = 1\n): void {\n const store = getPerfStore();\n if (!store) return;\n store[key] += delta;\n}\n\nexport function addPerfDuration(\n key: 'ssgRenderTimeMs' | 'ssgWorkerRenderTimeMs' | 'ssgWriteTimeMs',\n deltaMs: number\n): void {\n const store = getPerfStore();\n if (!store) return;\n store[key] += deltaMs;\n}\n\nexport function recordSchedulerFlushTaskCount(taskCount: number): void {\n const store = getPerfStore();\n if (!store) return;\n store.lastSchedulerTaskCountPerFlush = taskCount;\n store.maxSchedulerTaskCountPerFlush = Math.max(\n store.maxSchedulerTaskCountPerFlush,\n taskCount\n );\n store.schedulerFlushCount += 1;\n store.schedulerTaskExecutions += taskCount;\n}\n\nexport function getPerfMetrics(): Readonly<PerfMetrics> | undefined {\n const store = getPerfStore();\n return store ? { ...store } : undefined;\n}\n\nexport function resetPerfMetrics(): void {\n const store = getPerfStore();\n if (!store) return;\n const next = createInitialPerfMetrics();\n (Object.keys(next) as PerfMetricsKey[]).forEach((key) => {\n store[key] = next[key];\n });\n}\n"],"mappings":";;AA+BA,MAAM,sBAAsB,wBAAwB,YAAY;AAChE,IAAI;AAEJ,SAAS,2BAAwC;CAC/C,OAAO;EACL,uBAAuB;EACvB,wBAAwB;EACxB,2BAA2B;EAC3B,sBAAsB;EACtB,mBAAmB;EACnB,uBAAuB;EACvB,8BAA8B;EAC9B,iBAAiB;EACjB,gCAAgC;EAChC,+BAA+B;EAC/B,qBAAqB;EACrB,yBAAyB;EACzB,gBAAgB;EAChB,iBAAiB;EACjB,uBAAuB;EACvB,gBAAgB;CAClB;AACF;AAEA,SAAS,2BAAoC;CAC3C,IAAI,yBAAyB,GAC3B,OAAO;CAET,IAAI,CAAC,qBACH,OAAO;CAET,IAAI;EACF,OAAO,CAAC,CAAE,WAA8B;CAC1C,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,eAAmC;CAC1C,IAAI,iBACF,OAAO;CAGT,IAAI,CAAC,yBAAyB,GAC5B,OAAO;CAGT,IAAI;EACF,MAAM,IAAI;EACV,IAAI,CAAC,EAAE,eACL,EAAE,gBAAgB,yBAAyB;EAE7C,kBAAkB,EAAE;EACpB,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAgB,sBAA0C;CACxD,OAAO,aAAa;AACtB;AAEA,SAAgB,oBACd,KAUA,QAAQ,GACF;CACN,MAAM,QAAQ,aAAa;CAC3B,IAAI,CAAC,OAAO;CACZ,MAAM,QAAQ;AAChB;AAEA,SAAgB,gBACd,KACA,SACM;CACN,MAAM,QAAQ,aAAa;CAC3B,IAAI,CAAC,OAAO;CACZ,MAAM,QAAQ;AAChB;AAEA,SAAgB,8BAA8B,WAAyB;CACrE,MAAM,QAAQ,aAAa;CAC3B,IAAI,CAAC,OAAO;CACZ,MAAM,iCAAiC;CACvC,MAAM,gCAAgC,KAAK,IACzC,MAAM,+BACN,SACF;CACA,MAAM,uBAAuB;CAC7B,MAAM,2BAA2B;AACnC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"portal.d.ts","names":[],"sources":["../../src/runtime/portal.ts"],"mappings":";;;;UAeiB,MAAA,WAAiB,eAAA,GAAkB,eAAA;EAAA;EAElD,MAAA,CAAO,KAAA;IAAS,QAAA,GAAW,CAAA;EAAA;AAAA;AAAA,UAGZ,WAAA;EACf,QAAA,GAAW,eAAe;AAAA;AAAA,iBA+BZ,YAAA,WACJ,eAAA,GAAkB,eAAA,KACzB,MAAA,CAAO,CAAA;AAAA,iBAuGI,mBAAA;AAAA,iBAMA,yBAAA,CAA0B,KAAoB;AAAA,iBAyK9C,6BAAA,CACd,QAA2B,EAAjB,iBAAiB;AAAA,cAkBhB,aAAA,EAAe,MAAM,CAAC,eAAA;AAAA,iBA6BnB,MAAA,CAAO,KAAkB,EAAX,WAAW"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"portal.js","names":[],"sources":["../../src/runtime/portal.ts"],"sourcesContent":["import type { RenderableChild } from '../common/vnode';\nimport {\n markReactivePropsDirtySource,\n markReadableDerivedSubscribersDirty,\n notifyReadableReaders,\n recordReadableRead,\n type ReadableSource,\n} from './readable';\nimport {\n getCurrentComponentInstance,\n getCurrentPortalScope,\n type ComponentInstance,\n} from './component';\nimport { enqueueRuntimeTask } from './access';\n\nexport interface Portal<T extends RenderableChild = RenderableChild> {\n (): unknown;\n render(props: { children?: T }): unknown;\n}\n\nexport interface PortalProps {\n children?: RenderableChild;\n}\n\nfunction createPortalSlot<T>(): {\n read(): unknown;\n write(value: T | undefined): void;\n} {\n let currentValue: T | undefined;\n\n const source = (() => {\n recordReadableRead(source);\n return currentValue;\n }) as ReadableSource<T | undefined>;\n\n return {\n read() {\n return source();\n },\n write(value: T | undefined) {\n if (Object.is(currentValue, value)) {\n return;\n }\n\n currentValue = value;\n markReadableDerivedSubscribersDirty(source);\n markReactivePropsDirtySource(source);\n notifyReadableReaders(source);\n },\n };\n}\n\nexport function definePortal<\n T extends RenderableChild = RenderableChild,\n>(): Portal<T> {\n if (typeof createPortalSlot === 'function') {\n const slot = createPortalSlot<T>();\n\n function PortalHost() {\n return slot.read();\n }\n\n PortalHost.render = function PortalRender(props: { children?: T }) {\n slot.write(props.children);\n return null;\n };\n\n return PortalHost as Portal<T>;\n }\n\n let mounted = false;\n let value: T | undefined;\n\n function PortalHostFallback() {\n mounted = true;\n return value as unknown;\n }\n\n PortalHostFallback.render = function PortalRenderFallback(props: {\n children?: T;\n }) {\n if (!mounted) return null;\n value = props.children;\n return null;\n };\n\n return PortalHostFallback as Portal<T>;\n}\n\ntype DefaultPortalState = {\n portal: Portal<RenderableChild>;\n owner: ComponentInstance | null;\n cleanupOwners: WeakSet<ComponentInstance>;\n explicitHostOwners: Set<ComponentInstance>;\n explicitHostCleanupOwners: WeakSet<ComponentInstance>;\n explicitHostSource: ReadableSource<number>;\n};\n\nlet _defaultPortalStates = new Map<object, DefaultPortalState>();\nlet _hasPendingDefaultPortalValue = false;\nlet _pendingDefaultPortalValue: RenderableChild | undefined = undefined;\n\ntype DefaultPortalHostProps = {\n __askrAutoDefaultPortal?: boolean;\n};\n\nfunction createExplicitHostSource(\n readCount: () => number\n): ReadableSource<number> {\n let source: ReadableSource<number>;\n source = (() => {\n recordReadableRead(source);\n return readCount();\n }) as ReadableSource<number>;\n return source;\n}\n\nfunction readExplicitDefaultPortalHosts(state: DefaultPortalState): number {\n return state.explicitHostSource();\n}\n\nfunction notifyExplicitDefaultPortalHostReaders(\n state: DefaultPortalState\n): void {\n markReadableDerivedSubscribersDirty(state.explicitHostSource);\n markReactivePropsDirtySource(state.explicitHostSource);\n notifyReadableReaders(state.explicitHostSource);\n}\n\nfunction createDefaultPortalState(): DefaultPortalState {\n const state: DefaultPortalState = {\n portal: definePortal<RenderableChild>(),\n owner: null,\n cleanupOwners: new WeakSet<ComponentInstance>(),\n explicitHostOwners: new Set<ComponentInstance>(),\n explicitHostCleanupOwners: new WeakSet<ComponentInstance>(),\n explicitHostSource: (() => 0) as ReadableSource<number>,\n };\n\n state.explicitHostSource = createExplicitHostSource(\n () => state.explicitHostOwners.size\n );\n return state;\n}\n\nfunction isExplicitHostOwnerConnected(owner: ComponentInstance): boolean {\n if (owner.target) {\n return owner.target.isConnected;\n }\n\n if (owner._placeholder) {\n return owner._placeholder.isConnected;\n }\n\n return owner.mounted;\n}\n\nexport function _resetDefaultPortal(): void {\n _defaultPortalStates = new Map<object, DefaultPortalState>();\n _hasPendingDefaultPortalValue = false;\n _pendingDefaultPortalValue = undefined;\n}\n\nexport function disposeDefaultPortalScope(scope: object | null): void {\n if (!scope) {\n return;\n }\n\n const state = _defaultPortalStates.get(scope);\n if (state) {\n state.portal.render({ children: undefined });\n }\n\n _defaultPortalStates.delete(scope);\n}\n\nfunction isComponentPortalScope(scope: object): scope is ComponentInstance {\n return Array.isArray((scope as ComponentInstance).cleanupFns);\n}\n\nfunction isStaleDefaultPortalScope(scope: object): boolean {\n if (!isComponentPortalScope(scope)) {\n return false;\n }\n\n if (scope.target && scope.target.isConnected === false) {\n return true;\n }\n\n return scope.mounted === false;\n}\n\nfunction pruneStaleDefaultPortalScopes(): void {\n if (_defaultPortalStates.size === 0) {\n return;\n }\n\n for (const scope of Array.from(_defaultPortalStates.keys())) {\n if (isStaleDefaultPortalScope(scope)) {\n disposeDefaultPortalScope(scope);\n }\n }\n}\n\nfunction getSingleDefaultPortalScope(): object | null {\n pruneStaleDefaultPortalScopes();\n\n if (_defaultPortalStates.size !== 1) {\n return null;\n }\n\n return _defaultPortalStates.keys().next().value ?? null;\n}\n\nfunction getDefaultPortalState(scope: object): DefaultPortalState {\n let state = _defaultPortalStates.get(scope);\n if (!state) {\n state = createDefaultPortalState();\n _defaultPortalStates.set(scope, state);\n }\n return state;\n}\n\nfunction resolveDefaultPortalScope(\n owner: ComponentInstance | null\n): object | null {\n return (\n owner?.portalScope ??\n getCurrentPortalScope() ??\n getSingleDefaultPortalScope()\n );\n}\n\nfunction writeDefaultPortal(\n props: PortalProps,\n owner: ComponentInstance | null\n): void {\n const scope = resolveDefaultPortalScope(owner);\n if (!scope) {\n if (_defaultPortalStates.size !== 0) {\n return;\n }\n\n _hasPendingDefaultPortalValue = true;\n _pendingDefaultPortalValue = props.children;\n return;\n }\n\n const state = getDefaultPortalState(scope);\n _hasPendingDefaultPortalValue = false;\n _pendingDefaultPortalValue = undefined;\n state.portal.render(props);\n state.owner = owner;\n}\n\nfunction applyPendingDefaultPortalValue(scope: object): void {\n if (!_hasPendingDefaultPortalValue) {\n return;\n }\n\n const state = getDefaultPortalState(scope);\n state.portal.render({ children: _pendingDefaultPortalValue });\n state.owner = null;\n _hasPendingDefaultPortalValue = false;\n _pendingDefaultPortalValue = undefined;\n}\n\nfunction registerDefaultPortalOwner(owner: ComponentInstance): void {\n const scope = resolveDefaultPortalScope(owner);\n if (!scope) {\n return;\n }\n\n const state = getDefaultPortalState(scope);\n if (state.cleanupOwners.has(owner)) {\n return;\n }\n\n state.cleanupOwners.add(owner);\n owner.cleanupFns.push(() => {\n const currentState = _defaultPortalStates.get(scope);\n if (!currentState) {\n return;\n }\n\n if (currentState.owner === owner) {\n currentState.portal.render({ children: undefined });\n currentState.owner = null;\n }\n currentState.cleanupOwners.delete(owner);\n });\n}\n\nfunction registerExplicitDefaultPortalHost(\n scope: object,\n state: DefaultPortalState,\n owner: ComponentInstance | null\n): void {\n if (!owner) {\n return;\n }\n\n if (!state.explicitHostOwners.has(owner)) {\n state.explicitHostOwners.add(owner);\n notifyExplicitDefaultPortalHostReaders(state);\n }\n\n if (!state.explicitHostCleanupOwners.has(owner)) {\n state.explicitHostCleanupOwners.add(owner);\n owner.cleanupFns.push(() => {\n if (_defaultPortalStates.get(scope) !== state) {\n return;\n }\n\n state.explicitHostCleanupOwners.delete(owner);\n enqueueRuntimeTask(() => {\n if (_defaultPortalStates.get(scope) !== state) {\n return;\n }\n\n if (isExplicitHostOwnerConnected(owner)) {\n return;\n }\n\n if (state.explicitHostOwners.delete(owner)) {\n notifyExplicitDefaultPortalHostReaders(state);\n }\n });\n });\n }\n}\n\nexport function clearDefaultPortalForInstance(\n instance: ComponentInstance\n): void {\n const scope = instance.portalScope;\n if (!scope) {\n return;\n }\n\n const state = _defaultPortalStates.get(scope);\n if (!state) {\n return;\n }\n\n _hasPendingDefaultPortalValue = false;\n _pendingDefaultPortalValue = undefined;\n state.portal.render({ children: undefined });\n state.owner = null;\n}\n\nexport const DefaultPortal: Portal<RenderableChild> = (() => {\n function Host(props?: DefaultPortalHostProps) {\n const owner = getCurrentComponentInstance();\n const scope = resolveDefaultPortalScope(owner);\n if (!scope) {\n return null;\n }\n\n const state = getDefaultPortalState(scope);\n const isAutomaticFallback = props?.__askrAutoDefaultPortal === true;\n if (!isAutomaticFallback) {\n registerExplicitDefaultPortalHost(scope, state, owner);\n } else if (readExplicitDefaultPortalHosts(state) > 0) {\n return null;\n }\n\n applyPendingDefaultPortalValue(scope);\n const value = state.portal();\n return value === undefined ? null : value;\n }\n\n Host.render = function Render(props: { children?: RenderableChild }) {\n writeDefaultPortal(props, getCurrentComponentInstance());\n return null;\n };\n\n return Host as Portal<RenderableChild>;\n})();\n\nexport function Portal(props: PortalProps): null {\n const owner = getCurrentComponentInstance();\n if (owner) {\n registerDefaultPortalOwner(owner);\n }\n writeDefaultPortal(props, owner);\n return null;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"readable.d.ts","names":[],"sources":["../../src/runtime/readable.ts"],"mappings":";;UAMiB,iBAAA;EACf,UAAA;EACA,yBAAA,GAA4B,GAAG,CAAC,cAAA;AAAA;AAAA,UAGjB,cAAA;EAAA,IACX,CAAA;EACJ,YAAA;EACA,gBAAA;EACA,QAAA,GAAW,GAAA,CAAI,iBAAA;EACf,mBAAA,GAAsB,GAAA,CAAI,iBAAA;EAC1B,QAAA;AAAA;AAAA,iBAGc,iBAAA,CAAkB,MAAe;AAAA,iBAkCjC,kBAAA,CAAmB,MAA+B,EAAvB,cAAc;AAAA,iBAsCzC,2BAAA,IACd,cAAA,EAAgB,GAAA,CAAI,cAAA,YACpB,EAAA,QAAU,CAAA,GACT,CAAA;AAAA,iBAWa,6BAAA,CACd,QAA2B,EAAjB,iBAAiB;AAAA,iBAiBb,yCAAA,CACd,QAAA,EAAU,iBAAA,EACV,KAAA,sBACA,MAAA,EAAQ,GAAA,CAAI,cAAA,wBACZ,yBAAA,GACI,GAAA,CAAI,cAAA;AAAA,iBAkDM,4BAAA,CACd,QAA2B,EAAjB,iBAAiB;AAAA,iBAiBb,uBAAA,IACd,UAAA,EAAY,iBAAA,EACZ,EAAA,QAAU,CAAA,GACT,CAAA;AAAA,iBAaa,kCAAA,CACd,UAAA,EAAY,iBAAA,EACZ,WAAA,EAAa,GAAA,CAAI,cAAA,YACjB,WAAA,EAAa,GAAA,CAAI,cAAA;AAAA,iBAkBH,mCAAA,CACd,UAAA,EAAY,iBAAA,EACZ,OAAA,EAAS,GAAA,CAAI,cAAA;AAAA,iBAQC,mCAAA,CACd,MAA+B,EAAvB,cAAc;AAAA,iBAYR,4BAAA,CACd,MAA+B,EAAvB,cAAc;AAAA,iBASR,qBAAA,CACd,MAAA,EAAQ,cAAA,WACR,YAAA,GAAe,iBAAiB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"readable.js","names":[],"sources":["../../src/runtime/readable.ts"],"sourcesContent":["import {\n enqueueRuntimeTask,\n markRuntimeReactivePropsDirtySource,\n} from './access';\nimport { getCurrentInstance, type ComponentInstance } from './component';\n\nexport interface DerivedSubscriber {\n _markDirty(): void;\n _pendingDependencySources?: Set<ReadableSource<unknown>>;\n}\n\nexport interface ReadableSource<T = unknown> {\n (): T;\n _hasBeenRead?: boolean;\n _hasEverBeenRead?: boolean;\n _readers?: Map<ComponentInstance, number>;\n _derivedSubscribers?: Set<DerivedSubscriber>;\n _version?: number;\n}\n\nexport function markReadableUsage(source: unknown): void {\n if (\n source &&\n typeof source === 'function' &&\n ('_hasBeenRead' in source || '_readers' in source)\n ) {\n const readable = source as ReadableSource<unknown>;\n readable._hasBeenRead = true;\n readable._hasEverBeenRead = true;\n }\n}\n\nlet currentDerivedSubscriber: DerivedSubscriber | null = null;\nlet suppressComponentReadTrackingDepth = 0;\nlet currentFineGrainedReadSources: Set<ReadableSource<unknown>> | null = null;\n\nfunction scheduleReadableInstanceUpdate(instance: ComponentInstance): void {\n if (instance.hasPendingUpdate) {\n return;\n }\n\n instance.hasPendingUpdate = true;\n const task = instance._pendingFlushTask;\n if (task) {\n enqueueRuntimeTask(task);\n return;\n }\n\n enqueueRuntimeTask(() => {\n instance.hasPendingUpdate = false;\n instance.notifyUpdate?.();\n });\n}\n\nexport function recordReadableRead(source: ReadableSource<unknown>): void {\n source._hasEverBeenRead = true;\n\n if (currentFineGrainedReadSources) {\n currentFineGrainedReadSources.add(source);\n return;\n }\n\n if (currentDerivedSubscriber) {\n if (!currentDerivedSubscriber._pendingDependencySources) {\n currentDerivedSubscriber._pendingDependencySources = new Set();\n }\n currentDerivedSubscriber._pendingDependencySources.add(source);\n }\n\n if (suppressComponentReadTrackingDepth > 0) {\n return;\n }\n\n const inst = getCurrentInstance();\n if (!inst || inst._currentRenderToken === undefined) {\n return;\n }\n\n if (!inst._pendingReadSources) {\n inst._pendingReadSources = new Set();\n }\n inst._pendingReadSources.add(source);\n\n const sourceVersion = source._version ?? 0;\n let pendingVersions = inst._pendingReadSourceVersions;\n if (!pendingVersions) {\n pendingVersions = new Map();\n inst._pendingReadSourceVersions = pendingVersions;\n }\n pendingVersions.set(source, sourceVersion);\n}\n\nexport function withFineGrainedReadTracking<T>(\n pendingSources: Set<ReadableSource<unknown>>,\n fn: () => T\n): T {\n const previousPendingSources = currentFineGrainedReadSources;\n currentFineGrainedReadSources = pendingSources;\n\n try {\n return fn();\n } finally {\n currentFineGrainedReadSources = previousPendingSources;\n }\n}\n\nexport function finalizeReadableSubscriptions(\n instance: ComponentInstance\n): void {\n const newSet = instance._pendingReadSources;\n const token = instance._currentRenderToken;\n const pendingVersions = instance._pendingReadSourceVersions;\n\n finalizeReadableSubscriptionsFromSnapshot(\n instance,\n token,\n newSet,\n pendingVersions\n );\n instance._pendingReadSources = undefined;\n instance._currentRenderToken = undefined;\n instance._pendingReadSourceVersions = undefined;\n}\n\nexport function finalizeReadableSubscriptionsFromSnapshot(\n instance: ComponentInstance,\n token: number | undefined,\n newSet: Set<ReadableSource<unknown>> | undefined,\n pendingReadSourceVersions:\n | Map<ReadableSource<unknown>, number>\n | undefined = instance._pendingReadSourceVersions\n): void {\n if (token === undefined) {\n return;\n }\n\n const oldSet = instance._lastReadSources;\n const pendingVersions = pendingReadSourceVersions;\n let needsFollowUpUpdate = false;\n\n if (oldSet) {\n for (const source of oldSet) {\n if (!newSet?.has(source)) {\n source._readers?.delete(instance);\n }\n }\n }\n\n instance.lastRenderToken = token;\n\n if (newSet) {\n for (const source of newSet) {\n // Replay only for sources already owned by this instance, or for its\n // first committed read set. Newly entered branches in mounted components\n // keep their existing scheduler-visible intermediate states.\n if (pendingVersions && (!oldSet || oldSet.has(source))) {\n const sourceVersion = source._version ?? 0;\n const readVersion = pendingVersions.get(source);\n if (readVersion !== undefined && sourceVersion !== readVersion) {\n needsFollowUpUpdate = true;\n }\n }\n\n let readers = source._readers;\n if (!readers) {\n readers = new Map();\n source._readers = readers;\n }\n readers.set(instance, instance.lastRenderToken ?? 0);\n }\n }\n\n instance._lastReadSources = newSet ?? new Set();\n\n if (needsFollowUpUpdate) {\n scheduleReadableInstanceUpdate(instance);\n }\n}\n\nexport function cleanupReadableSubscriptions(\n instance: ComponentInstance\n): void {\n const sources = instance._lastReadSources;\n if (!sources || sources.size === 0) {\n instance._pendingReadSources = undefined;\n instance._pendingReadSourceVersions = undefined;\n return;\n }\n\n for (const source of sources) {\n source._readers?.delete(instance);\n }\n instance._lastReadSources = new Set();\n instance._pendingReadSources = undefined;\n instance._pendingReadSourceVersions = undefined;\n}\n\nexport function withDerivedReadTracking<T>(\n subscriber: DerivedSubscriber,\n fn: () => T\n): T {\n const prevDerivedSubscriber = currentDerivedSubscriber;\n currentDerivedSubscriber = subscriber;\n suppressComponentReadTrackingDepth += 1;\n\n try {\n return fn();\n } finally {\n suppressComponentReadTrackingDepth -= 1;\n currentDerivedSubscriber = prevDerivedSubscriber;\n }\n}\n\nexport function syncDerivedDependencySubscriptions(\n subscriber: DerivedSubscriber,\n prevSources: Set<ReadableSource<unknown>>,\n nextSources: Set<ReadableSource<unknown>>\n): void {\n for (const source of prevSources) {\n if (!nextSources.has(source)) {\n source._derivedSubscribers?.delete(subscriber);\n }\n }\n\n for (const source of nextSources) {\n let subscribers = source._derivedSubscribers;\n if (!subscribers) {\n subscribers = new Set();\n source._derivedSubscribers = subscribers;\n }\n subscribers.add(subscriber);\n }\n}\n\nexport function clearDerivedDependencySubscriptions(\n subscriber: DerivedSubscriber,\n sources: Set<ReadableSource<unknown>>\n): void {\n for (const source of sources) {\n source._derivedSubscribers?.delete(subscriber);\n }\n sources.clear();\n}\n\nexport function markReadableDerivedSubscribersDirty(\n source: ReadableSource<unknown>\n): void {\n const subscribers = source._derivedSubscribers;\n if (!subscribers || subscribers.size === 0) {\n return;\n }\n\n for (const subscriber of subscribers) {\n subscriber._markDirty();\n }\n}\n\nexport function markReactivePropsDirtySource(\n source: ReadableSource<unknown>\n): void {\n try {\n markRuntimeReactivePropsDirtySource(source);\n } catch {\n // Keep readable notifications side-effect safe.\n }\n}\n\nexport function notifyReadableReaders(\n source: ReadableSource<unknown>,\n skipInstance?: ComponentInstance | null\n): boolean {\n source._version = (source._version ?? 0) + 1;\n const readers = source._readers;\n let didScheduleUpdate = false;\n\n if (!readers || readers.size === 0) {\n return false;\n }\n\n for (const [instance, token] of readers) {\n if (skipInstance && instance === skipInstance) {\n continue;\n }\n if (instance.lastRenderToken !== token) {\n continue;\n }\n if (instance.hasPendingUpdate) {\n continue;\n }\n\n scheduleReadableInstanceUpdate(instance);\n didScheduleUpdate = true;\n }\n\n return didScheduleUpdate;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resource-cell.js","names":[],"sources":["../../src/runtime/resource-cell.ts"],"sourcesContent":["import { withAsyncResourceContext, type ContextFrame } from './context';\nimport { logger } from '../common/logger';\nimport {\n brandSnapshotSource,\n type SnapshotSourceBrand,\n} from './snapshot-source';\nimport { isPromiseLike } from '../common/promise';\nimport { throwSSRDataMissing } from '../common/render-context';\n\n/**\n * Pure, component-agnostic ResourceCell state machine.\n * - Holds value/pending/error/generation/controller\n * - Exposes a stable `snapshot` object: { value, pending, error, refresh }\n * - Uses `withAsyncResourceContext` to bind the synchronous execution step\n * to a captured frame. Continuations after await do not see the frame.\n */\nexport class ResourceCell<U> {\n value: U | null = null;\n pending = true;\n error: Error | null = null;\n generation = 0;\n controller: AbortController | null = null;\n deps: readonly unknown[] | null = null;\n resourceFrame: ContextFrame | null = null;\n\n // Optional debug label set by caller (component name) to improve logs\n ownerName?: string;\n\n private subscribers = new Set<() => void>();\n private disposed = false;\n\n readonly snapshot: {\n value: U | null;\n pending: boolean;\n error: Error | null;\n refresh: () => void;\n } & SnapshotSourceBrand;\n\n private fn: (opts: { signal: AbortSignal }) => PromiseLike<U> | U;\n\n constructor(\n fn: (opts: { signal: AbortSignal }) => PromiseLike<U> | U,\n deps: readonly unknown[] | null,\n resourceFrame: ContextFrame | null\n ) {\n this.fn = fn;\n this.deps = deps ? deps.slice() : null;\n this.resourceFrame = resourceFrame;\n this.snapshot = brandSnapshotSource({\n value: null,\n pending: true,\n error: null,\n refresh: () => this.refresh(),\n });\n }\n\n setLoader(fn: (opts: { signal: AbortSignal }) => PromiseLike<U> | U): void {\n this.fn = fn;\n }\n\n subscribe(cb: () => void): () => void {\n this.subscribers.add(cb);\n return () => this.subscribers.delete(cb);\n }\n\n private notifySubscribers() {\n this.snapshot.value = this.value;\n this.snapshot.pending = this.pending;\n this.snapshot.error = this.error;\n for (const cb of this.subscribers) cb();\n }\n\n start(ssr = false, notify = true) {\n if (this.disposed) {\n return;\n }\n\n const generation = this.generation;\n\n this.controller?.abort();\n const controller = new AbortController();\n this.controller = controller;\n this.pending = true;\n this.error = null;\n if (notify) this.notifySubscribers();\n\n let result: PromiseLike<U> | U;\n try {\n // Execute only the synchronous step inside the frozen resource frame.\n result = withAsyncResourceContext(this.resourceFrame, () =>\n this.fn({ signal: controller.signal })\n );\n } catch (err) {\n this.pending = false;\n this.error = err as Error;\n if (notify) this.notifySubscribers();\n return;\n }\n\n if (!isPromiseLike<U>(result)) {\n this.value = result as U;\n this.pending = false;\n this.error = null;\n if (notify) this.notifySubscribers();\n return;\n }\n\n if (ssr) {\n // During SSR async results are disallowed\n throwSSRDataMissing();\n }\n\n Promise.resolve(result)\n .then((val) => {\n if (this.generation !== generation) return;\n if (this.controller !== controller) return;\n // A loader that does not reject on abort (e.g. a plain Promise) would\n // otherwise commit its value after the fetch was cancelled by a deps\n // change, refresh(), or unmount. Mirror the AbortError guard used in\n // the rejection path so an aborted fetch's resolution stays inert.\n if (controller.signal.aborted) return;\n this.value = val;\n this.pending = false;\n this.error = null;\n this.notifySubscribers();\n })\n .catch((err) => {\n if (this.generation !== generation) return;\n if (this.controller !== controller) return;\n\n const isAbortError =\n controller.signal.aborted ||\n (err instanceof Error && err.name === 'AbortError') ||\n (typeof DOMException !== 'undefined' &&\n err instanceof DOMException &&\n err.name === 'AbortError');\n\n if (isAbortError) {\n return;\n }\n\n this.pending = false;\n this.error = err as Error;\n try {\n if (this.ownerName) {\n logger.error(\n `[Askr] Async resource error in ${this.ownerName}:`,\n err\n );\n } else {\n logger.error('[Askr] Async resource error:', err);\n }\n } catch {\n /* ignore logging errors */\n }\n this.notifySubscribers();\n });\n }\n\n refresh() {\n if (this.disposed) {\n return;\n }\n\n this.generation++;\n this.controller?.abort();\n this.start();\n }\n\n abort() {\n this.controller?.abort();\n }\n\n dispose() {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n this.controller?.abort();\n this.subscribers.clear();\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAgBA,IAAa,eAAb,MAA6B;CAwB3B,YACE,IACA,MACA,eACA;eA3BgB;iBACR;eACY;oBACT;oBACwB;cACH;uBACG;qCAKf,IAAI,IAAgB;kBACvB;EAgBjB,KAAK,KAAK;EACV,KAAK,OAAO,OAAO,KAAK,MAAM,IAAI;EAClC,KAAK,gBAAgB;EACrB,KAAK,WAAW,oBAAoB;GAClC,OAAO;GACP,SAAS;GACT,OAAO;GACP,eAAe,KAAK,QAAQ;EAC9B,CAAC;CACH;CAEA,UAAU,IAAiE;EACzE,KAAK,KAAK;CACZ;CAEA,UAAU,IAA4B;EACpC,KAAK,YAAY,IAAI,EAAE;EACvB,aAAa,KAAK,YAAY,OAAO,EAAE;CACzC;CAEA,oBAA4B;EAC1B,KAAK,SAAS,QAAQ,KAAK;EAC3B,KAAK,SAAS,UAAU,KAAK;EAC7B,KAAK,SAAS,QAAQ,KAAK;EAC3B,KAAK,MAAM,MAAM,KAAK,aAAa,GAAG;CACxC;CAEA,MAAM,MAAM,OAAO,SAAS,MAAM;EAChC,IAAI,KAAK,UACP;EAGF,MAAM,aAAa,KAAK;EAExB,KAAK,YAAY,MAAM;EACvB,MAAM,aAAa,IAAI,gBAAgB;EACvC,KAAK,aAAa;EAClB,KAAK,UAAU;EACf,KAAK,QAAQ;EACb,IAAI,QAAQ,KAAK,kBAAkB;EAEnC,IAAI;EACJ,IAAI;GAEF,SAAS,yBAAyB,KAAK,qBACrC,KAAK,GAAG,EAAE,QAAQ,WAAW,OAAO,CAAC,CACvC;EACF,SAAS,KAAK;GACZ,KAAK,UAAU;GACf,KAAK,QAAQ;GACb,IAAI,QAAQ,KAAK,kBAAkB;GACnC;EACF;EAEA,IAAI,CAAC,cAAiB,MAAM,GAAG;GAC7B,KAAK,QAAQ;GACb,KAAK,UAAU;GACf,KAAK,QAAQ;GACb,IAAI,QAAQ,KAAK,kBAAkB;GACnC;EACF;EAEA,IAAI,KAEF,oBAAoB;EAGtB,QAAQ,QAAQ,MAAM,CAAC,CACpB,MAAM,QAAQ;GACb,IAAI,KAAK,eAAe,YAAY;GACpC,IAAI,KAAK,eAAe,YAAY;GAKpC,IAAI,WAAW,OAAO,SAAS;GAC/B,KAAK,QAAQ;GACb,KAAK,UAAU;GACf,KAAK,QAAQ;GACb,KAAK,kBAAkB;EACzB,CAAC,CAAC,CACD,OAAO,QAAQ;GACd,IAAI,KAAK,eAAe,YAAY;GACpC,IAAI,KAAK,eAAe,YAAY;GASpC,IANE,WAAW,OAAO,WACjB,eAAe,SAAS,IAAI,SAAS,gBACrC,OAAO,iBAAiB,eACvB,eAAe,gBACf,IAAI,SAAS,cAGf;GAGF,KAAK,UAAU;GACf,KAAK,QAAQ;GACb,IAAI;IACF,IAAI,KAAK,WACP,OAAO,MACL,kCAAkC,KAAK,UAAU,IACjD,GACF;SAEA,OAAO,MAAM,gCAAgC,GAAG;GAEpD,QAAQ,CAER;GACA,KAAK,kBAAkB;EACzB,CAAC;CACL;CAEA,UAAU;EACR,IAAI,KAAK,UACP;EAGF,KAAK;EACL,KAAK,YAAY,MAAM;EACvB,KAAK,MAAM;CACb;CAEA,QAAQ;EACN,KAAK,YAAY,MAAM;CACzB;CAEA,UAAU;EACR,IAAI,KAAK,UACP;EAGF,KAAK,WAAW;EAChB,KAAK,YAAY,MAAM;EACvB,KAAK,YAAY,MAAM;CACzB;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resource-operation.d.ts","names":[],"sources":["../../src/runtime/resource-operation.ts"],"mappings":";UAiBiB,cAAA;EACf,KAAA,EAAO,CAAA;EACP,OAAA;EACA,KAAA,EAAO,KAAK;EACZ,OAAA;AAAA;AAAA,iBAGc,QAAA,4CACd,EAAA,GAAK,IAAA;EAAQ,MAAA,EAAQ,WAAA;AAAA,MAAkB,WAAA,CAAY,CAAA,IAAK,CAAA,EACxD,IAAA,EAAM,KAAA,GACL,cAAA,CAAe,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resource-operation.js","names":[],"sources":["../../src/runtime/resource-operation.ts"],"sourcesContent":["import {\n getCurrentComponentInstance,\n type ComponentInstance,\n} from './component';\nimport { getCurrentContextFrame } from './context';\nimport { ResourceCell } from './resource-cell';\nimport { state } from './state';\nimport { enqueueRuntimeLane } from './access';\nimport { brandSnapshotSource } from './snapshot-source';\nimport { SSRDataMissingError } from '../common/ssr-errors';\nimport {\n getActiveRenderContext,\n getCurrentRenderData,\n getNextRenderKey,\n throwSSRDataMissing,\n} from '../common/render-context';\n\nexport interface ResourceResult<T> {\n value: T | null;\n pending: boolean;\n error: Error | null;\n refresh(): void;\n}\n\nexport function resource<T, const TDeps extends readonly unknown[]>(\n fn: (opts: { signal: AbortSignal }) => PromiseLike<T> | T,\n deps: TDeps\n): ResourceResult<T>;\n\n/**\n * Resource primitive — simple, deterministic async primitive\n * Usage: resource(fn, deps)\n * - fn receives { signal }\n * - captures execution context once at creation (synchronous step only)\n * - executes at most once per generation; stale async results are ignored\n * - refresh() cancels in-flight execution, increments generation and re-runs\n * - exposes { value, pending, error, refresh }\n * - during SSR, async results are disallowed and will throw synchronously\n */\nexport function resource<T>(\n fn: (opts: { signal: AbortSignal }) => PromiseLike<T> | T,\n deps: readonly unknown[] = []\n): ResourceResult<T> {\n const instance = getCurrentComponentInstance();\n // Create a non-null alias early so it can be used in nested closures\n // without TypeScript complaining about possible null access.\n const inst = instance as ComponentInstance;\n\n if (!instance) {\n // If we're in a synchronous SSR render that has resolved data, use it.\n const renderData = getCurrentRenderData();\n if (renderData) {\n const key = getNextRenderKey();\n if (!(key in renderData)) {\n throwSSRDataMissing();\n }\n const val = renderData[key] as T;\n return brandSnapshotSource({\n value: val,\n pending: false,\n error: null,\n refresh: () => {},\n }) as ResourceResult<T>;\n }\n\n // If we are in an SSR render pass without supplied data, throw for clarity.\n const ssrCtx = getActiveRenderContext();\n if (ssrCtx) {\n throwSSRDataMissing();\n }\n\n // No active component instance and not in SSR render with data.\n // Autopilot invariant: resources must be created during render within an app.\n throw new Error(\n '[Askr] resource() must be called during component render inside an app. ' +\n 'Do not create resources at module scope or outside render.'\n );\n }\n\n // Internal ResourceCell — pure state machine now moved to its own module\n // to keep component wiring separate and ensure no component access here.\n // (See ./resource-cell.ts)\n\n // If we're in a synchronous SSR render that was supplied resolved data, use it\n const renderData = getCurrentRenderData();\n if (renderData) {\n // Deterministic key generation: the collection step and render step use\n // the same incremental key generation to align resources.\n const key = getNextRenderKey();\n if (!(key in renderData)) {\n throwSSRDataMissing();\n }\n\n // Commit synchronous value from render data and return a stable snapshot\n const val = renderData[key] as T;\n\n const holder = state<{\n cell?: ResourceCell<T>;\n snapshot: ResourceResult<T>;\n }>({\n cell: undefined,\n snapshot: brandSnapshotSource({\n value: val,\n pending: false,\n error: null,\n refresh: () => {},\n }) as ResourceResult<T>,\n });\n\n const h = holder();\n h.snapshot.value = val;\n h.snapshot.pending = false;\n h.snapshot.error = null;\n return h.snapshot;\n }\n\n // Persist a holder so the snapshot identity is stable across renders.\n const holder = state<{ cell?: ResourceCell<T>; snapshot: ResourceResult<T> }>(\n {\n cell: undefined,\n snapshot: brandSnapshotSource({\n value: null,\n pending: true,\n error: null,\n refresh: () => {},\n }) as ResourceResult<T>,\n }\n );\n\n const h = holder();\n\n // Initialize cell on first call\n if (!h.cell) {\n const frame = getCurrentContextFrame();\n const cell = new ResourceCell<T>(fn, deps, frame);\n // Attach debug label (component name) for richer logs\n cell.ownerName = inst.fn?.name || '<anonymous>';\n h.cell = cell;\n h.snapshot = cell.snapshot as ResourceResult<T>;\n\n // Subscribe and schedule component updates when cell changes\n const unsubscribe = cell.subscribe(() => {\n const cur = holder();\n cur.snapshot.value = cell.snapshot.value;\n cur.snapshot.pending = cell.snapshot.pending;\n cur.snapshot.error = cell.snapshot.error;\n holder.set(cur);\n try {\n inst.notifyUpdate?.();\n } catch {\n // ignore\n }\n });\n\n // Cleanup on unmount\n (inst.cleanupFns ??= []).push(() => {\n unsubscribe();\n cell.dispose();\n });\n\n // Render invariant: do NOT start async work during render on the client.\n // SSR remains strict/synchronous and must throw immediately if async is encountered.\n if (inst.ssr) {\n // SSR: must run synchronously so missing data throws during render\n cell.start(true, false);\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n }\n } else {\n // Client: start after render via scheduler (never inline)\n const scheduledGeneration = cell.generation;\n enqueueRuntimeLane('post', () => {\n if (!inst.notifyUpdate || cell.generation !== scheduledGeneration) {\n return;\n }\n\n try {\n cell.start(false, false);\n } catch (err) {\n // Non-SSR: reflect synchronous errors into snapshot via manual update\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = (err as Error) ?? null;\n holder.set(cur);\n inst.notifyUpdate?.();\n return;\n }\n\n // If the resource completed synchronously, subscribers were not notified.\n // Force a re-render so the component can observe the value.\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n holder.set(cur);\n inst.notifyUpdate?.();\n }\n });\n }\n }\n\n const cell = h.cell!;\n cell.setLoader(fn);\n\n // Detect dependency changes and refresh immediately\n const depsChanged =\n !cell.deps ||\n cell.deps.length !== deps.length ||\n cell.deps.some((d, i) => !Object.is(d, deps[i]));\n\n if (depsChanged) {\n cell.deps = deps.slice();\n cell.generation++;\n cell.pending = true;\n cell.error = null;\n\n // Synchronously reflect the pending state into the stable snapshot so the\n // render that triggered the deps change can surface a loading indicator.\n // The async start() runs with notify=false and the deps-change branch never\n // re-published the snapshot, so without this a deps-driven refetch jumped\n // straight from the old value to the new value, never exposing pending.\n // Stale-while-revalidate: the previous value is retained until the new\n // fetch resolves.\n h.snapshot.pending = true;\n h.snapshot.error = null;\n try {\n if (inst.ssr) {\n cell.start(true, false);\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n }\n } else {\n const scheduledGeneration = cell.generation;\n enqueueRuntimeLane('post', () => {\n if (!inst.notifyUpdate || cell.generation !== scheduledGeneration) {\n return;\n }\n\n cell.start(false, false);\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n holder.set(cur);\n inst.notifyUpdate?.();\n }\n });\n }\n } catch (err) {\n if (err instanceof SSRDataMissingError) throw err;\n cell.error = err as Error;\n cell.pending = false;\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n // Do not call holder.set() here; this is still render.\n }\n }\n\n // Return the stable snapshot object owned by the cell\n return h.snapshot;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","names":[],"sources":["../../src/runtime/runtime.ts"],"mappings":";;;;;UAIiB,2BAAA;EACf,WAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;EACA,SAAA;EACA,MAAA;EACA,cAAA;EACA,gBAAA;AAAA;AAAA,UAGe,mBAAA;EACf,QAAA,CACE,IAAA,WACA,MAAA,EAAQ,OAAA,SACR,OAAA,WACA,aAAA,GAAgB,iBAAA;EAElB,qBAAA,CAAsB,IAAA,EAAM,IAAA;EAC5B,mBAAA,CAAoB,IAAA,EAAM,OAAA;EAC1B,wBAAA,CAAyB,MAAA,EAAQ,OAAA;EACjC,mBAAA,CACE,MAAA,EAAQ,OAAA,GACP,GAAA,kBAAqB,OAAA;EACxB,8BAAA,CACE,MAAA,EAAQ,OAAA,EACR,QAAA,aACA,SAAA,EAAW,GAAA,kBAAqB,OAAA,gBAC/B,2BAAA;EACH,4BAAA,CAA6B,MAAA,EAAQ,cAAA;AAAA;AAAA,UAGtB,kBAAA;EACf,SAAA,GAAY,SAAA;EACZ,QAAA,GAAW,mBAAmB;AAAA;AAAA,cA4CnB,WAAA;EAAA,SACF,SAAA,EAAW,SAAA;EAAA,QACZ,YAAA;cAEI,OAAA,GAAS,kBAAA;EAAA,IAKjB,QAAA,IAAY,mBAAA;EAIhB,iBAAA,CAAkB,QAAA,EAAU,mBAAA;AAAA;AAAA,cAKjB,cAAA,EAAc,WAEzB;AAAA,iBAEc,aAAA,CAAc,OAAA,GAAS,kBAAA,GAA0B,WAAW;AAAA,iBAI5D,iBAAA,IAAqB,WAAW;AAAA,iBAIhC,wBAAA,CACd,QAAA,EAAU,mBAAA,EACV,OAAA,GAAS,WAA4B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","names":[],"sources":["../../src/runtime/runtime.ts"],"sourcesContent":["import { globalScheduler, type Scheduler } from './scheduler';\nimport type { ComponentInstance } from './component';\nimport type { ReadableSource } from './readable';\n\nexport interface RuntimeKeyedReorderDecision {\n useFastPath: boolean;\n totalKeyed: number;\n totalChildren: number;\n currentKeyCount: number;\n moveCount: number;\n lisLen: number;\n hasPropChanges: boolean;\n isWholeKeyedList: boolean;\n}\n\nexport interface RuntimeRendererHost {\n evaluate(\n node: unknown,\n target: Element | null,\n context?: object,\n retainedOwner?: ComponentInstance\n ): void;\n cleanupInstancesUnder(node: Node): void;\n teardownNodeSubtree(root: Element): void;\n populateKeyMapForElement(parent: Element): void;\n getKeyMapForElement(\n parent: Element\n ): Map<string | number, Element> | undefined;\n isKeyedReorderFastPathEligible(\n parent: Element,\n children: unknown[],\n oldKeyMap: Map<string | number, Element> | undefined\n ): RuntimeKeyedReorderDecision;\n markReactivePropsDirtySource(source: ReadableSource<unknown>): void;\n}\n\nexport interface AskrRuntimeOptions {\n scheduler?: Scheduler;\n renderer?: RuntimeRendererHost;\n}\n\nfunction createMissingRendererHost(): RuntimeRendererHost {\n const missing = (method: string): never => {\n throw new Error(\n `[Askr] renderer host is not configured; cannot call ${method}().`\n );\n };\n\n return {\n evaluate() {\n missing('evaluate');\n },\n cleanupInstancesUnder() {\n missing('cleanupInstancesUnder');\n },\n teardownNodeSubtree() {\n missing('teardownNodeSubtree');\n },\n populateKeyMapForElement() {\n // Fast-lane callers treat an empty key map as a normal decline.\n },\n getKeyMapForElement() {\n return undefined;\n },\n isKeyedReorderFastPathEligible() {\n return {\n useFastPath: false,\n totalKeyed: 0,\n totalChildren: 0,\n currentKeyCount: 0,\n moveCount: 0,\n lisLen: 0,\n hasPropChanges: false,\n isWholeKeyedList: false,\n };\n },\n markReactivePropsDirtySource() {\n // Reactive prop tracking is renderer-owned and optional for runtimes.\n },\n };\n}\n\nexport class AskrRuntime {\n readonly scheduler: Scheduler;\n private rendererHost: RuntimeRendererHost;\n\n constructor(options: AskrRuntimeOptions = {}) {\n this.scheduler = options.scheduler ?? globalScheduler;\n this.rendererHost = options.renderer ?? createMissingRendererHost();\n }\n\n get renderer(): RuntimeRendererHost {\n return this.rendererHost;\n }\n\n configureRenderer(renderer: RuntimeRendererHost): void {\n this.rendererHost = renderer;\n }\n}\n\nexport const defaultRuntime = new AskrRuntime({\n scheduler: globalScheduler,\n});\n\nexport function createRuntime(options: AskrRuntimeOptions = {}): AskrRuntime {\n return new AskrRuntime(options);\n}\n\nexport function getDefaultRuntime(): AskrRuntime {\n return defaultRuntime;\n}\n\nexport function configureRuntimeRenderer(\n renderer: RuntimeRendererHost,\n runtime: AskrRuntime = defaultRuntime\n): void {\n runtime.configureRenderer(renderer);\n}\n"],"mappings":";;AAyCA,SAAS,4BAAiD;CACxD,MAAM,WAAW,WAA0B;EACzC,MAAM,IAAI,MACR,uDAAuD,OAAO,IAChE;CACF;CAEA,OAAO;EACL,WAAW;GACT,QAAQ,UAAU;EACpB;EACA,wBAAwB;GACtB,QAAQ,uBAAuB;EACjC;EACA,sBAAsB;GACpB,QAAQ,qBAAqB;EAC/B;EACA,2BAA2B,CAE3B;EACA,sBAAsB,CAEtB;EACA,iCAAiC;GAC/B,OAAO;IACL,aAAa;IACb,YAAY;IACZ,eAAe;IACf,iBAAiB;IACjB,WAAW;IACX,QAAQ;IACR,gBAAgB;IAChB,kBAAkB;GACpB;EACF;EACA,+BAA+B,CAE/B;CACF;AACF;AAEA,IAAa,cAAb,MAAyB;CAIvB,YAAY,UAA8B,CAAC,GAAG;EAC5C,KAAK,YAAY,QAAQ,aAAa;EACtC,KAAK,eAAe,QAAQ,YAAY,0BAA0B;CACpE;CAEA,IAAI,WAAgC;EAClC,OAAO,KAAK;CACd;CAEA,kBAAkB,UAAqC;EACrD,KAAK,eAAe;CACtB;AACF;AAEA,MAAa,iBAAiB,IAAI,YAAY,EAC5C,WAAW,gBACb,CAAC;AAED,SAAgB,cAAc,UAA8B,CAAC,GAAgB;CAC3E,OAAO,IAAI,YAAY,OAAO;AAChC;AAEA,SAAgB,oBAAiC;CAC/C,OAAO;AACT;AAEA,SAAgB,yBACd,UACA,UAAuB,gBACjB;CACN,QAAQ,kBAAkB,QAAQ;AACpC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.d.ts","names":[],"sources":["../../src/runtime/scheduler.ts"],"mappings":";;;;;;AAkBS;AACT;;;;KADK,IAAA;AAAA,KACO,aAAA;AAAA,KACA,wBAAA;AAAA,cAcC,SAAA;EAAA,QACH,eAAA;EAAA,QAEA,KAAA;EAAA,QAOA,OAAA;EAAA,QACA,SAAA;EAAA,QACA,KAAA;EAAA,QACA,cAAA;EAAA,QAGA,YAAA;EAAA,QAGA,aAAA;EAAA,QAGA,iBAAA;EAAA,QAGA,OAAA;EAAA,QAQA,SAAA;EAER,kBAAA,CAAmB,KAAA,EAAO,wBAAA;EAAA,QAIlB,kBAAA;EAAA,QASA,eAAA;EAAA,QAUA,mBAAA;EAAA,QASA,WAAA;EAAA,QAmBA,iBAAA;EAgCR,OAAA,CAAQ,IAAA,EAAM,IAAA;EAId,aAAA,CAAc,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,IAAA;EAuBzC,KAAA;EA4FA,mBAAA,IAAuB,EAAA,QAAU,CAAA,GAAI,CAAA;EAyCrC,YAAA,CAAa,aAAA,WAAwB,SAAA,YAAmB,OAAA;EAgCxD,QAAA;;;;;;;;;;;;;;;;EAsBA,eAAA;EAIA,aAAA;EAMA,iBAAA,IAAqB,EAAA,QAAU,CAAA,EAAG,SAAA,sBAAwC,CAAA;EAmB1E,YAAA,CAAa,CAAA;EAOb,WAAA;EAIA,WAAA;EAKA,qBAAA;EAAA,QAgCQ,cAAA;AAAA;AAAA,cAmBG,eAAA,EAAe,SAAkB;AAAA,iBAE9B,oBAAA;AAAA,iBAIA,oBAAA,CAAqB,OAAA,EAAS,aAAA,GAAgB,aAAa"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","names":[],"sources":["../../src/runtime/scheduler.ts"],"sourcesContent":["/**\n * Serialized update scheduler — safer design (no inline execution, explicit flush)\n *\n * Key ideas:\n * - Never execute a task inline from `enqueue`.\n * - `flush()` is explicit and non-reentrant.\n * - `runWithSyncProgress()` allows enqueues temporarily but does not run tasks\n * inline; it runs `fn` and then does an explicit `flush()`.\n * - `waitForFlush()` is race-free with a monotonic `flushVersion`.\n */\n\nimport { isDevelopmentEnvironment } from '../common/env';\nimport { assertSchedulingPrecondition, invariant } from '../common/invariant';\nimport { logger } from '../common/logger';\nimport { recordSchedulerFlushTaskCount } from './perf-metrics';\n\nconst MAX_FLUSH_DEPTH = 50;\n\ntype Task = () => void;\nexport type SchedulerLane = 'derived' | 'component' | 'reactive' | 'post';\nexport type SchedulerBulkCommitProbe = () => boolean;\n\nconst SCHEDULER_LANES: SchedulerLane[] = [\n 'derived',\n 'component',\n 'reactive',\n 'post',\n];\n\ninterface LaneQueue {\n tasks: Task[];\n head: number;\n}\n\nexport class Scheduler {\n private bulkCommitProbe: SchedulerBulkCommitProbe = () => false;\n\n private lanes: Record<SchedulerLane, LaneQueue> = {\n derived: { tasks: [], head: 0 },\n component: { tasks: [], head: 0 },\n reactive: { tasks: [], head: 0 },\n post: { tasks: [], head: 0 },\n };\n\n private running = false;\n private inHandler = false;\n private depth = 0;\n private executionDepth = 0; // for compat with existing diagnostics\n\n // Monotonic flush version increments at end of each flush\n private flushVersion = 0;\n\n // Best-effort microtask kick scheduling\n private kickScheduled = false;\n\n // Escape hatch flag for runWithSyncProgress\n private allowSyncProgress = false;\n\n // Waiters waiting for flushVersion >= target\n private waiters: Array<{\n target: number;\n resolve: () => void;\n reject: (err: unknown) => void;\n timer?: ReturnType<typeof setTimeout>;\n }> = [];\n\n // Keep a lightweight taskCount for compatibility/diagnostics\n private taskCount = 0;\n\n setBulkCommitProbe(probe: SchedulerBulkCommitProbe): void {\n this.bulkCommitProbe = probe;\n }\n\n private isBulkCommitActive(): boolean {\n try {\n return this.bulkCommitProbe();\n } catch (e) {\n void e;\n return false;\n }\n }\n\n private hasPendingTasks(): boolean {\n for (const lane of SCHEDULER_LANES) {\n const queue = this.lanes[lane];\n if (queue.head < queue.tasks.length) {\n return true;\n }\n }\n return false;\n }\n\n private getPendingTaskCount(): number {\n let total = 0;\n for (const lane of SCHEDULER_LANES) {\n const queue = this.lanes[lane];\n total += queue.tasks.length - queue.head;\n }\n return total;\n }\n\n private compactLane(queue: LaneQueue): void {\n if (queue.head >= queue.tasks.length) {\n queue.tasks.length = 0;\n queue.head = 0;\n return;\n }\n\n if (queue.head <= 0) {\n return;\n }\n\n const remaining = queue.tasks.length - queue.head;\n for (let i = 0; i < remaining; i++) {\n queue.tasks[i] = queue.tasks[queue.head + i];\n }\n queue.tasks.length = remaining;\n queue.head = 0;\n }\n\n private scheduleFlushKick(): void {\n if (\n this.running ||\n this.kickScheduled ||\n this.inHandler ||\n this.allowSyncProgress ||\n this.isBulkCommitActive() ||\n !this.hasPendingTasks()\n ) {\n return;\n }\n\n this.kickScheduled = true;\n queueMicrotask(() => {\n this.kickScheduled = false;\n if (\n this.running ||\n this.isBulkCommitActive() ||\n !this.hasPendingTasks()\n ) {\n return;\n }\n try {\n this.flush();\n } catch (err) {\n setTimeout(() => {\n throw err;\n });\n }\n });\n }\n\n enqueue(task: Task): void {\n this.enqueueInLane('component', task);\n }\n\n enqueueInLane(lane: SchedulerLane, task: Task): void {\n assertSchedulingPrecondition(\n typeof task === 'function',\n 'enqueue() requires a function'\n );\n\n // Strict rule: during bulk commit, only allow enqueues if runWithSyncProgress enabled\n if (this.isBulkCommitActive() && !this.allowSyncProgress) {\n if (isDevelopmentEnvironment()) {\n throw new Error(\n '[Scheduler] enqueue() during bulk commit (not allowed)'\n );\n }\n return;\n }\n\n // Enqueue task and account counts\n this.lanes[lane].tasks.push(task);\n this.taskCount++;\n\n this.scheduleFlushKick();\n }\n\n flush(): void {\n invariant(\n !this.running,\n '[Scheduler] flush() called while already running'\n );\n\n // Dev-only guard: disallow flush during bulk commit unless allowed\n if (isDevelopmentEnvironment()) {\n if (this.isBulkCommitActive() && !this.allowSyncProgress) {\n throw new Error(\n '[Scheduler] flush() started during bulk commit (not allowed)'\n );\n }\n }\n\n this.running = true;\n this.depth = 0;\n let fatal: unknown = null;\n let executedTaskCount = 0;\n const checkFlushDepth = isDevelopmentEnvironment();\n const executionsByTask = checkFlushDepth ? new Map<Task, number>() : null;\n\n try {\n while (fatal === null) {\n let didRunTask = false;\n\n for (const lane of SCHEDULER_LANES) {\n const laneQueue = this.lanes[lane];\n let executedInLane = 0;\n\n while (laneQueue.head < laneQueue.tasks.length) {\n const task = laneQueue.tasks[laneQueue.head++];\n if (executionsByTask) {\n const taskExecutions = (executionsByTask.get(task) ?? 0) + 1;\n executionsByTask.set(task, taskExecutions);\n this.depth = Math.max(this.depth, taskExecutions);\n if (taskExecutions > MAX_FLUSH_DEPTH) {\n throw new Error(\n `[Scheduler] exceeded MAX_FLUSH_DEPTH (${MAX_FLUSH_DEPTH}). Likely infinite update loop.`\n );\n }\n }\n\n try {\n this.executionDepth++;\n task();\n this.executionDepth--;\n executedTaskCount++;\n executedInLane++;\n didRunTask = true;\n } catch (err) {\n // ensure executionDepth stays balanced for the task that threw\n if (this.executionDepth > 0) this.executionDepth--;\n fatal = err;\n break;\n }\n }\n\n if (executedInLane > 0) {\n this.taskCount = Math.max(0, this.taskCount - executedInLane);\n }\n\n if (fatal !== null) {\n break;\n }\n }\n\n if (!didRunTask) {\n break;\n }\n }\n } finally {\n this.running = false;\n this.depth = 0;\n this.executionDepth = 0;\n\n for (const lane of SCHEDULER_LANES) {\n const queue = this.lanes[lane];\n if (queue.head > 0) {\n this.compactLane(queue);\n }\n }\n\n // Advance flush epoch and resolve waiters\n this.flushVersion++;\n this.resolveWaiters();\n recordSchedulerFlushTaskCount(executedTaskCount);\n }\n\n if (fatal) throw fatal;\n }\n\n runWithSyncProgress<T>(fn: () => T): T {\n const prev = this.allowSyncProgress;\n this.allowSyncProgress = true;\n\n // Snapshot flushVersion so we can ensure we always complete an epoch\n const startVersion = this.flushVersion;\n\n try {\n const res = fn();\n\n // Flush deterministically if tasks were enqueued (and we're not already running)\n if (!this.running && this.hasPendingTasks()) {\n this.flush();\n }\n\n if (isDevelopmentEnvironment()) {\n if (!this.running && this.hasPendingTasks()) {\n throw new Error(\n '[Scheduler] tasks remain after runWithSyncProgress flush'\n );\n }\n }\n\n return res;\n } finally {\n // If no flush happened during the protected window, complete an epoch so\n // observers (tests) see progress even when fast-lane did synchronous work\n // without enqueuing tasks.\n try {\n if (this.flushVersion === startVersion) {\n this.flushVersion++;\n this.resolveWaiters();\n }\n } catch (e) {\n void e;\n }\n\n this.allowSyncProgress = prev;\n }\n }\n\n waitForFlush(targetVersion?: number, timeoutMs = 2000): Promise<void> {\n const target =\n typeof targetVersion === 'number' ? targetVersion : this.flushVersion + 1;\n if (this.flushVersion >= target) return Promise.resolve();\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n const ns =\n (\n globalThis as unknown as Record<string, unknown> & {\n __ASKR__?: Record<string, unknown>;\n }\n ).__ASKR__ || {};\n const diag = {\n flushVersion: this.flushVersion,\n queueLen: this.getPendingTaskCount(),\n running: this.running,\n inHandler: this.inHandler,\n bulk: this.isBulkCommitActive(),\n namespace: ns,\n };\n reject(\n new Error(\n `waitForFlush timeout ${timeoutMs}ms: ${JSON.stringify(diag)}`\n )\n );\n }, timeoutMs);\n\n this.waiters.push({ target, resolve, reject, timer });\n });\n }\n\n getState() {\n // Provide the compatibility shape expected by diagnostics/tests\n return {\n queueLength: this.getPendingTaskCount(),\n running: this.running,\n depth: this.depth,\n executionDepth: this.executionDepth,\n taskCount: this.taskCount,\n flushVersion: this.flushVersion,\n laneQueues: {\n derived: this.lanes.derived.tasks.length - this.lanes.derived.head,\n component:\n this.lanes.component.tasks.length - this.lanes.component.head,\n reactive: this.lanes.reactive.tasks.length - this.lanes.reactive.head,\n post: this.lanes.post.tasks.length - this.lanes.post.head,\n },\n // New fields for optional inspection\n inHandler: this.inHandler,\n allowSyncProgress: this.allowSyncProgress,\n };\n }\n\n getFlushVersion(): number {\n return this.flushVersion;\n }\n\n flushIfQueued(): void {\n if (!this.running && this.hasPendingTasks()) {\n this.flush();\n }\n }\n\n runInHandlerScope<T>(fn: () => T, flushMode: 'defer' | 'sync' = 'defer'): T {\n const prevInHandler = this.inHandler;\n this.inHandler = true;\n\n try {\n return fn();\n } finally {\n this.inHandler = prevInHandler;\n\n if (!this.inHandler) {\n if (flushMode === 'sync') {\n this.flushIfQueued();\n } else {\n this.scheduleFlushKick();\n }\n }\n }\n }\n\n setInHandler(v: boolean) {\n this.inHandler = v;\n if (!v) {\n this.scheduleFlushKick();\n }\n }\n\n isInHandler(): boolean {\n return this.inHandler;\n }\n\n isExecuting(): boolean {\n return this.running || this.executionDepth > 0;\n }\n\n // Clear pending synchronous tasks (used by fastlane enter/exit)\n clearPendingSyncTasks(): number {\n const remaining = this.getPendingTaskCount();\n if (remaining <= 0) return 0;\n\n if (this.running) {\n for (const lane of SCHEDULER_LANES) {\n const queue = this.lanes[lane];\n queue.tasks.length = queue.head;\n }\n this.taskCount = Math.max(0, this.taskCount - remaining);\n queueMicrotask(() => {\n try {\n this.flushVersion++;\n this.resolveWaiters();\n } catch (e) {\n void e;\n }\n });\n return remaining;\n }\n\n for (const lane of SCHEDULER_LANES) {\n const queue = this.lanes[lane];\n queue.tasks.length = 0;\n queue.head = 0;\n }\n this.taskCount = Math.max(0, this.taskCount - remaining);\n this.flushVersion++;\n this.resolveWaiters();\n return remaining;\n }\n\n private resolveWaiters() {\n if (this.waiters.length === 0) return;\n const ready: Array<() => void> = [];\n const remaining: typeof this.waiters = [];\n\n for (const w of this.waiters) {\n if (this.flushVersion >= w.target) {\n if (w.timer) clearTimeout(w.timer);\n ready.push(w.resolve);\n } else {\n remaining.push(w);\n }\n }\n\n this.waiters = remaining;\n for (const r of ready) r();\n }\n}\n\nexport const globalScheduler = new Scheduler();\n\nexport function isSchedulerExecuting(): boolean {\n return globalScheduler.isExecuting();\n}\n\nexport function scheduleEventHandler(handler: EventListener): EventListener {\n return (event: Event) => {\n try {\n globalScheduler.runInHandlerScope(() => {\n handler.call(null, event);\n });\n } catch (error) {\n logger.error('[Askr] Event handler error:', error);\n }\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selector-store.js","names":[],"sources":["../../src/runtime/selector-store.ts"],"sourcesContent":["import { enqueueRuntimeLane } from './access';\n\ntype DirtySelectorRecord = {\n _dirty: boolean;\n _scheduled: boolean;\n};\n\nconst dirtySelectorRecords = new Set<DirtySelectorRecord>();\nlet hasPendingSelectorFlush = false;\n\nexport function markDirtySelectorRecord<T extends DirtySelectorRecord>(\n record: T,\n flush: () => void\n): void {\n record._dirty = true;\n if (record._scheduled) {\n return;\n }\n\n record._scheduled = true;\n dirtySelectorRecords.add(record);\n\n if (hasPendingSelectorFlush) {\n return;\n }\n\n hasPendingSelectorFlush = true;\n enqueueRuntimeLane('derived', flush);\n}\n\nexport function takeDirtySelectorRecords<T extends DirtySelectorRecord>(): T[] {\n hasPendingSelectorFlush = false;\n\n if (dirtySelectorRecords.size === 0) {\n return [];\n }\n\n const pending = Array.from(dirtySelectorRecords);\n dirtySelectorRecords.clear();\n return pending as T[];\n}\n"],"mappings":";;AAOA,MAAM,uCAAuB,IAAI,IAAyB;AAC1D,IAAI,0BAA0B;AAE9B,SAAgB,wBACd,QACA,OACM;CACN,OAAO,SAAS;CAChB,IAAI,OAAO,YACT;CAGF,OAAO,aAAa;CACpB,qBAAqB,IAAI,MAAM;CAE/B,IAAI,yBACF;CAGF,0BAA0B;CAC1B,mBAAmB,WAAW,KAAK;AACrC;AAEA,SAAgB,2BAA+D;CAC7E,0BAA0B;CAE1B,IAAI,qBAAqB,SAAS,GAChC,OAAO,CAAC;CAGV,MAAM,UAAU,MAAM,KAAK,oBAAoB;CAC/C,qBAAqB,MAAM;CAC3B,OAAO;AACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selector.d.ts","names":[],"sources":["../../src/runtime/selector.ts"],"mappings":";UAgCiB,QAAA;EAAA,CACd,SAAA,EAAW,CAAC;AAAA;AAAA,KAOV,cAAA;EACH,cAAA,CAAe,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC;AAAA;AAAA,iBAicX,QAAA,IACd,MAAA,QAAc,CAAA,EACd,MAAA,GAAQ,cAAA,CAAe,CAAA,IACtB,QAAA,CAAS,CAAA"}
|