@askrjs/askr 0.0.52 → 0.0.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/dist/{runtime/scheduler.js → access-Bg4RJNC8.js} +182 -9
- package/dist/actions/index.d.ts +2 -0
- package/dist/actions/index.js +103 -0
- package/dist/{common/attr-names.js → attr-names-CjhzmHOn.js} +1 -1
- package/dist/benchmark.d.ts +6 -2
- package/dist/benchmark.js +63 -11
- package/dist/boot/index.d.ts +61 -2
- package/dist/boot/index.js +1 -203
- package/dist/boot-j2KoN6ss.js +647 -0
- package/dist/cleanup-COv77su2.js +487 -0
- package/dist/component-internal-B3z7GXlD.js +614 -0
- package/dist/component-lifecycle-CO4hXlP4.js +357 -0
- package/dist/{runtime/component-scope.js → component-scope-CC3cojX9.js} +8 -1
- package/dist/component-scope-CvPba6O6.d.ts +12 -0
- package/dist/components/index.d.ts +17 -2
- package/dist/components/index.js +39 -1
- package/dist/compose-ref-Cc_YkUpM.js +92 -0
- package/dist/{foundations/utilities/compose-ref.d.ts → compose-ref-Cizq72-x.d.ts} +1 -1
- package/dist/control/index.d.ts +1 -3
- package/dist/control/index.js +1 -3
- package/dist/control-BQvNVfAd.d.ts +436 -0
- package/dist/control-BYyLTFyw.js +165 -0
- package/dist/control-Bf4Wkdvv.d.ts +9 -0
- package/dist/{common/control.js → control-DhFRTIoE.js} +1 -1
- package/dist/data/index.d.ts +2 -6
- package/dist/data/index.js +4 -5
- package/dist/data-DnxnDxD-.js +559 -0
- package/dist/{data/data-runtime.js → data-runtime-SJ1BSUvk.js} +32 -31
- package/dist/deferred-lKE8uR0z.js +386 -0
- package/dist/{runtime/effect.js → effect-BwnIvLah.js} +4 -4
- package/dist/fastlane-Dw8SOBr9.js +343 -0
- package/dist/for-internal-BKf_Tnv1.js +1563 -0
- package/dist/foundations/icon/index.d.ts +68 -2
- package/dist/foundations/icon/index.js +85 -1
- package/dist/foundations/index.d.ts +2 -5
- package/dist/foundations/index.js +2 -5
- package/dist/foundations/interactions/index.d.ts +264 -6
- package/dist/foundations/interactions/index.js +1 -6
- package/dist/foundations/state/index.d.ts +32 -1
- package/dist/foundations/state/index.js +78 -1
- package/dist/foundations/structures/index.d.ts +2 -7
- package/dist/foundations/structures/index.js +2 -7
- package/dist/foundations/utilities/index.d.ts +2 -6
- package/dist/foundations/utilities/index.js +2 -5
- package/dist/fx/index.d.ts +190 -3
- package/dist/fx/index.js +454 -4
- package/dist/index-31Uoz_NS.d.ts +239 -0
- package/dist/index-Bki2rqcr.d.ts +233 -0
- package/dist/index-BnU0NPwM.d.ts +101 -0
- package/dist/index-D73jgYx1.d.ts +48 -0
- package/dist/{runtime/runtime.d.ts → index-R2JJIbM-.d.ts} +31 -8
- package/dist/index-SJXJkssx.d.ts +44 -0
- package/dist/index.d.ts +8 -13
- package/dist/index.js +150 -15
- package/dist/interactions-w7gQN4ha.js +280 -0
- package/dist/{data/invalidation-listeners.js → invalidation-listeners-Des3AHYs.js} +1 -1
- package/dist/{common/props.d.ts → jsx-CP0gmYwJ.d.ts} +17 -5
- package/dist/{common/jsx.js → jsx-CUpRxrLH.js} +1 -1
- package/dist/jsx-dev-runtime.d.ts +2 -4
- package/dist/jsx-dev-runtime.js +7 -5
- package/dist/jsx-runtime-92bV2hSa.d.ts +34 -0
- package/dist/jsx-runtime-BVVgDSdq.d.ts +1 -0
- package/dist/jsx-runtime.d.ts +2 -35
- package/dist/jsx-runtime.js +11 -5
- package/dist/{runtime/lifecycle-operations.js → lifecycle-operations-D9va7GOU.js} +4 -5
- package/dist/navigate-BVDCzOuB.d.ts +34 -0
- package/dist/navigate-CmPLSXyw.js +1449 -0
- package/dist/{runtime/portal.js → portal-CyU3Ucf2.js} +33 -36
- package/dist/query-registry-CQIT4mXr.js +73 -0
- package/dist/{common/render-context.js → render-context-Clw3rFiO.js} +14 -6
- package/dist/renderer-DzPjeLby.js +6197 -0
- package/dist/{runtime/resource-operation.js → resource-operation-CEzfpnDk.js} +118 -15
- package/dist/resources/index.d.ts +42 -3
- package/dist/resources/index.js +3 -4
- package/dist/{common/route-activity.js → route-activity-CNJfpwx-.js} +1 -1
- package/dist/route-matching-vJpvLVbX.js +515 -0
- package/dist/router/index.d.ts +166 -14
- package/dist/router/index.js +150 -12
- package/dist/{common/router.d.ts → router-CeYvjj5_.d.ts} +72 -28
- package/dist/{common/router-internal.js → router-internal-BC0w1_xk.js} +1 -1
- package/dist/{runtime/scheduler.d.ts → scheduler-CmLO4Dfm.d.ts} +1 -3
- package/dist/{runtime/selector.js → selector-DafVYzV4.js} +34 -11
- package/dist/{runtime/snapshot-source.js → snapshot-source-BB42xgwb.js} +1 -1
- package/dist/ssg/index.d.ts +252 -4
- package/dist/ssg/index.js +857 -1
- package/dist/ssr/index.d.ts +225 -8
- package/dist/ssr/index.js +3 -6
- package/dist/{common/ssr.js → ssr-CbQO5xd3.js} +1 -1
- package/dist/ssr-D3t80Rc0.js +1413 -0
- package/dist/{runtime/state.js → state-DPl8lffD.js} +3 -5
- package/dist/structures-DUB3HchX.js +221 -0
- package/dist/testing/index.d.ts +3 -2
- package/dist/testing/index.js +2 -5
- package/dist/{jsx/types.d.ts → types-DnQVG4ZY.d.ts} +2 -5
- package/dist/{foundations/utilities/use-id.js → utilities-C_CGX4Dz.js} +1 -1
- package/dist/{ssr/verify-hydration.js → verify-hydration-io9ahUeq.js} +2 -2
- package/dist/{common/vnode.js → vnode-CGMJYPMB.js} +2 -2
- package/package.json +12 -7
- package/dist/bench/components/benchmark-row.d.ts +0 -20
- package/dist/bench/components/benchmark-row.js +0 -40
- package/dist/bench/components/benchmark-table.js +0 -23
- package/dist/bin/askr-ssg.d.ts +0 -27
- package/dist/bin/askr-ssg.js +0 -186
- package/dist/boot/hydration.js +0 -139
- package/dist/boot/root-lifecycle.d.ts +0 -18
- package/dist/boot/root-lifecycle.js +0 -209
- package/dist/boot/route-startup.js +0 -54
- package/dist/boot/types.d.ts +0 -61
- package/dist/common/component.d.ts +0 -18
- package/dist/common/control.d.ts +0 -12
- package/dist/common/dom-range.d.ts +0 -13
- package/dist/common/env.js +0 -41
- package/dist/common/error-boundary.d.ts +0 -15
- package/dist/common/invariant.js +0 -15
- package/dist/common/jsx.d.ts +0 -22
- package/dist/common/logger.js +0 -34
- package/dist/common/promise.js +0 -6
- package/dist/common/ssr-errors.d.ts +0 -10
- package/dist/common/ssr-errors.js +0 -14
- package/dist/common/ssr.d.ts +0 -41
- package/dist/common/vnode.d.ts +0 -21
- package/dist/components/error-boundary.d.ts +0 -14
- package/dist/components/error-boundary.js +0 -41
- package/dist/components/link.d.ts +0 -68
- package/dist/components/link.js +0 -74
- package/dist/control/case.d.ts +0 -18
- package/dist/control/case.js +0 -68
- package/dist/control/for.d.ts +0 -23
- package/dist/control/for.js +0 -61
- package/dist/control/shared.d.ts +0 -8
- package/dist/control/shared.js +0 -18
- package/dist/control/show.d.ts +0 -14
- package/dist/control/show.js +0 -32
- package/dist/data/data-runtime.d.ts +0 -27
- package/dist/data/invalidation.d.ts +0 -8
- package/dist/data/invalidation.js +0 -25
- package/dist/data/mutation-cell.d.ts +0 -27
- package/dist/data/mutation-cell.js +0 -133
- package/dist/data/query-cell.d.ts +0 -47
- package/dist/data/query-cell.js +0 -324
- package/dist/data/query-key.js +0 -40
- package/dist/data/shared.js +0 -20
- package/dist/data/testing.js +0 -2
- package/dist/data/types.d.ts +0 -160
- package/dist/foundations/icon/icon.d.ts +0 -52
- package/dist/foundations/icon/icon.js +0 -86
- package/dist/foundations/icon/icon.types.d.ts +0 -21
- package/dist/foundations/interactions/dismissable.d.ts +0 -71
- package/dist/foundations/interactions/dismissable.js +0 -24
- package/dist/foundations/interactions/focusable.d.ts +0 -21
- package/dist/foundations/interactions/focusable.js +0 -16
- package/dist/foundations/interactions/hoverable.d.ts +0 -25
- package/dist/foundations/interactions/hoverable.js +0 -13
- package/dist/foundations/interactions/interaction-policy.d.ts +0 -49
- package/dist/foundations/interactions/interaction-policy.js +0 -120
- package/dist/foundations/interactions/pressable.d.ts +0 -60
- package/dist/foundations/interactions/pressable.js +0 -49
- package/dist/foundations/interactions/roving-focus.d.ts +0 -51
- package/dist/foundations/interactions/roving-focus.js +0 -69
- package/dist/foundations/state/controllable.d.ts +0 -32
- package/dist/foundations/state/controllable.js +0 -80
- package/dist/foundations/structures/collection.d.ts +0 -51
- package/dist/foundations/structures/collection.js +0 -49
- package/dist/foundations/structures/layer.d.ts +0 -80
- package/dist/foundations/structures/layer.js +0 -79
- package/dist/foundations/structures/layout.d.ts +0 -32
- package/dist/foundations/structures/layout.js +0 -11
- package/dist/foundations/structures/portal.d.ts +0 -2
- package/dist/foundations/structures/portal.js +0 -3
- package/dist/foundations/structures/presence.d.ts +0 -36
- package/dist/foundations/structures/presence.js +0 -37
- package/dist/foundations/structures/slot.d.ts +0 -34
- package/dist/foundations/structures/slot.js +0 -39
- package/dist/foundations/utilities/aria.d.ts +0 -15
- package/dist/foundations/utilities/aria.js +0 -15
- package/dist/foundations/utilities/compose-handlers.d.ts +0 -36
- package/dist/foundations/utilities/compose-handlers.js +0 -18
- package/dist/foundations/utilities/compose-ref.js +0 -16
- package/dist/foundations/utilities/event-types.d.ts +0 -19
- package/dist/foundations/utilities/merge-props.d.ts +0 -4
- package/dist/foundations/utilities/merge-props.js +0 -47
- package/dist/foundations/utilities/use-id.d.ts +0 -31
- package/dist/fx/fx.d.ts +0 -32
- package/dist/fx/fx.js +0 -211
- package/dist/fx/noop.js +0 -7
- package/dist/fx/timing.d.ts +0 -158
- package/dist/fx/timing.js +0 -241
- package/dist/jsx/index.d.ts +0 -2
- package/dist/jsx/index.js +0 -4
- package/dist/jsx/types.js +0 -2
- package/dist/jsx/utils.d.ts +0 -4
- package/dist/jsx/utils.js +0 -17
- package/dist/jsx-runtime2.d.ts +0 -3
- package/dist/jsx-runtime2.js +0 -4
- package/dist/renderer/attributes.js +0 -254
- package/dist/renderer/boundaries.js +0 -142
- package/dist/renderer/boundary-materialization.js +0 -72
- package/dist/renderer/boundary-range-adoption.js +0 -76
- package/dist/renderer/boundary-range-sync.js +0 -101
- package/dist/renderer/boundary-state.js +0 -50
- package/dist/renderer/child-shape.js +0 -83
- package/dist/renderer/children-fastpath.js +0 -149
- package/dist/renderer/children.js +0 -158
- package/dist/renderer/cleanup.js +0 -267
- package/dist/renderer/component-host-cleanup.js +0 -143
- package/dist/renderer/component-host-instances.js +0 -116
- package/dist/renderer/component-host-replacement.js +0 -105
- package/dist/renderer/component-host-results.js +0 -138
- package/dist/renderer/component-host.js +0 -172
- package/dist/renderer/dom-host.js +0 -11
- package/dist/renderer/dom-internal.js +0 -243
- package/dist/renderer/dom-range.js +0 -161
- package/dist/renderer/dom.js +0 -11
- package/dist/renderer/element-children.js +0 -359
- package/dist/renderer/env.js +0 -2
- package/dist/renderer/error-boundary-dom.js +0 -86
- package/dist/renderer/evaluate-dom-range.js +0 -84
- package/dist/renderer/evaluate-reconcile.js +0 -257
- package/dist/renderer/evaluate.js +0 -95
- package/dist/renderer/fastpath.js +0 -142
- package/dist/renderer/for-commit-dom-map.js +0 -71
- package/dist/renderer/for-commit-removal.js +0 -27
- package/dist/renderer/for-commit-reorder.js +0 -87
- package/dist/renderer/for-commit.js +0 -442
- package/dist/renderer/hydration-boundaries.js +0 -60
- package/dist/renderer/hydration-listener-transaction.js +0 -49
- package/dist/renderer/index.js +0 -39
- package/dist/renderer/intrinsic-blueprint-analysis.js +0 -202
- package/dist/renderer/intrinsic-blueprint-bindings.js +0 -152
- package/dist/renderer/intrinsic-blueprint-materialization.js +0 -100
- package/dist/renderer/intrinsic-blueprint.js +0 -30
- package/dist/renderer/intrinsic-hydration-adoption.js +0 -66
- package/dist/renderer/keyed-children.js +0 -26
- package/dist/renderer/keyed.js +0 -167
- package/dist/renderer/namespaces.js +0 -21
- package/dist/renderer/prop-bindings.js +0 -315
- package/dist/renderer/reactive-child-dom.js +0 -139
- package/dist/renderer/reactive-child-sources.js +0 -182
- package/dist/renderer/reactive-children.js +0 -303
- package/dist/renderer/reconcile-commit.js +0 -36
- package/dist/renderer/reconcile-fastpaths.js +0 -100
- package/dist/renderer/reconcile-resolution.js +0 -163
- package/dist/renderer/reconcile.js +0 -37
- package/dist/renderer/retained-element-rollback.js +0 -288
- package/dist/renderer/stable-patch.js +0 -80
- package/dist/renderer/static-reuse.js +0 -94
- package/dist/renderer/types.js +0 -2
- package/dist/renderer/utils.js +0 -265
- package/dist/router/access.js +0 -34
- package/dist/router/activity.d.ts +0 -9
- package/dist/router/activity.js +0 -85
- package/dist/router/authoring.d.ts +0 -21
- package/dist/router/authoring.js +0 -196
- package/dist/router/internal-types.d.ts +0 -30
- package/dist/router/lazy.d.ts +0 -18
- package/dist/router/lazy.js +0 -50
- package/dist/router/manifest.d.ts +0 -9
- package/dist/router/manifest.js +0 -47
- package/dist/router/match.js +0 -120
- package/dist/router/navigate.d.ts +0 -10
- package/dist/router/navigate.js +0 -73
- package/dist/router/navigation-registry.d.ts +0 -31
- package/dist/router/navigation-registry.js +0 -103
- package/dist/router/navigation-scroll.d.ts +0 -13
- package/dist/router/navigation-scroll.js +0 -91
- package/dist/router/navigation-targets.d.ts +0 -30
- package/dist/router/navigation-targets.js +0 -634
- package/dist/router/policy.d.ts +0 -27
- package/dist/router/policy.js +0 -130
- package/dist/router/rendering.d.ts +0 -9
- package/dist/router/rendering.js +0 -47
- package/dist/router/resolution.d.ts +0 -3
- package/dist/router/resolution.js +0 -84
- package/dist/router/route-context.js +0 -77
- package/dist/router/route-matching.d.ts +0 -19
- package/dist/router/route-matching.js +0 -173
- package/dist/router/route-query.d.ts +0 -16
- package/dist/router/route-query.js +0 -45
- package/dist/router/route.d.ts +0 -8
- package/dist/router/route.js +0 -10
- package/dist/router/store.d.ts +0 -49
- package/dist/router/store.js +0 -169
- package/dist/router/testing.js +0 -4
- package/dist/runtime/access.d.ts +0 -19
- package/dist/runtime/access.js +0 -43
- package/dist/runtime/child-scope.d.ts +0 -41
- package/dist/runtime/child-scope.js +0 -134
- package/dist/runtime/component-cleanup.d.ts +0 -15
- package/dist/runtime/component-cleanup.js +0 -68
- package/dist/runtime/component-commit.js +0 -167
- package/dist/runtime/component-facade.d.ts +0 -5
- package/dist/runtime/component-facade.js +0 -6
- package/dist/runtime/component-internal.d.ts +0 -105
- package/dist/runtime/component-internal.js +0 -237
- package/dist/runtime/component-lifecycle.d.ts +0 -10
- package/dist/runtime/component-lifecycle.js +0 -33
- package/dist/runtime/component-scope.d.ts +0 -54
- package/dist/runtime/component.d.ts +0 -5
- package/dist/runtime/component.js +0 -6
- package/dist/runtime/context.d.ts +0 -72
- package/dist/runtime/context.js +0 -236
- package/dist/runtime/control.d.ts +0 -62
- package/dist/runtime/control.js +0 -239
- package/dist/runtime/derive.d.ts +0 -16
- package/dist/runtime/derive.js +0 -140
- package/dist/runtime/dev-namespace.d.ts +0 -30
- package/dist/runtime/dev-namespace.js +0 -64
- package/dist/runtime/effect.d.ts +0 -35
- package/dist/runtime/error-boundary.d.ts +0 -4
- package/dist/runtime/error-boundary.js +0 -29
- package/dist/runtime/events.d.ts +0 -58
- package/dist/runtime/events.js +0 -201
- package/dist/runtime/execution-model.d.ts +0 -6
- package/dist/runtime/execution-model.js +0 -13
- package/dist/runtime/fastlane.d.ts +0 -33
- package/dist/runtime/fastlane.js +0 -173
- package/dist/runtime/for-bench.d.ts +0 -40
- package/dist/runtime/for-bench.js +0 -13
- package/dist/runtime/for-internal.d.ts +0 -106
- package/dist/runtime/for-internal.js +0 -285
- package/dist/runtime/for-reconcile.d.ts +0 -7
- package/dist/runtime/for-reconcile.js +0 -442
- package/dist/runtime/for-scopes.d.ts +0 -26
- package/dist/runtime/for-scopes.js +0 -280
- package/dist/runtime/for-signals.d.ts +0 -39
- package/dist/runtime/for-signals.js +0 -213
- package/dist/runtime/for-types.d.ts +0 -8
- package/dist/runtime/for.d.ts +0 -4
- package/dist/runtime/for.js +0 -5
- package/dist/runtime/index.d.ts +0 -24
- package/dist/runtime/index.js +0 -33
- package/dist/runtime/lifecycle-batch.d.ts +0 -59
- package/dist/runtime/lifecycle-batch.js +0 -178
- package/dist/runtime/lifecycle-operation-settlement.d.ts +0 -5
- package/dist/runtime/lifecycle-operation-settlement.js +0 -51
- package/dist/runtime/lifecycle-operations.d.ts +0 -30
- package/dist/runtime/operations.d.ts +0 -3
- package/dist/runtime/operations.js +0 -3
- package/dist/runtime/perf-metrics.d.ts +0 -27
- package/dist/runtime/perf-metrics.js +0 -6
- package/dist/runtime/portal.d.ts +0 -21
- package/dist/runtime/readable.d.ts +0 -34
- package/dist/runtime/readable.js +0 -183
- package/dist/runtime/resource-cell.js +0 -112
- package/dist/runtime/resource-operation.d.ts +0 -12
- package/dist/runtime/runtime.js +0 -57
- package/dist/runtime/selector-store.js +0 -22
- package/dist/runtime/selector.d.ts +0 -10
- package/dist/runtime/snapshot-source.d.ts +0 -9
- package/dist/runtime/state.d.ts +0 -54
- package/dist/ssg/batch-render.js +0 -101
- package/dist/ssg/create-static-gen.d.ts +0 -66
- package/dist/ssg/create-static-gen.js +0 -250
- package/dist/ssg/generate-metadata.js +0 -92
- package/dist/ssg/generation-plan.js +0 -68
- package/dist/ssg/incremental-manifest.js +0 -54
- package/dist/ssg/resolve-ssg-data.js +0 -103
- package/dist/ssg/route-utils.js +0 -22
- package/dist/ssg/static-routes.js +0 -100
- package/dist/ssg/types.d.ts +0 -188
- package/dist/ssg/write-static-files.js +0 -77
- package/dist/ssr/attrs.js +0 -92
- package/dist/ssr/boundaries.js +0 -124
- package/dist/ssr/component-runtime.js +0 -85
- package/dist/ssr/context.d.ts +0 -49
- package/dist/ssr/context.js +0 -89
- package/dist/ssr/errors.d.ts +0 -9
- package/dist/ssr/errors.js +0 -12
- package/dist/ssr/escape.js +0 -191
- package/dist/ssr/hydration-data.js +0 -8
- package/dist/ssr/hydration-verify.d.ts +0 -11
- package/dist/ssr/hydration-verify.js +0 -171
- package/dist/ssr/index-internal.d.ts +0 -14
- package/dist/ssr/index-internal.js +0 -17
- package/dist/ssr/render-keys.js +0 -14
- package/dist/ssr/render-resolved.d.ts +0 -19
- package/dist/ssr/render-resolved.js +0 -33
- package/dist/ssr/render-sync.d.ts +0 -20
- package/dist/ssr/render-sync.js +0 -283
- package/dist/ssr/route-policy-resolution.js +0 -76
- package/dist/ssr/route-render.d.ts +0 -76
- package/dist/ssr/route-render.js +0 -118
- package/dist/ssr/sink.d.ts +0 -25
- package/dist/ssr/sink.js +0 -84
- package/dist/ssr/types.d.ts +0 -22
package/dist/runtime/fastlane.js
DELETED
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
import { isDevelopmentEnvironment } from "../common/env.js";
|
|
2
|
-
import { getRuntimeRenderer, getRuntimeSchedulerState, runRuntimeWithSyncProgress, setRuntimeBulkCommitProbe } from "./access.js";
|
|
3
|
-
import { Fragment } from "../common/jsx.js";
|
|
4
|
-
import { finalizeReadableSubscriptions } from "./readable.js";
|
|
5
|
-
import { getDevNamespace, getDevValue, setDevValue } from "./dev-namespace.js";
|
|
6
|
-
//#region src/runtime/fastlane.ts
|
|
7
|
-
let _bulkCommitActive = false;
|
|
8
|
-
let _appliedParents = null;
|
|
9
|
-
function enterBulkCommit() {
|
|
10
|
-
_bulkCommitActive = true;
|
|
11
|
-
_appliedParents = /* @__PURE__ */ new WeakSet();
|
|
12
|
-
setDevValue("__FASTLANE_CLEARED_TASKS", 0);
|
|
13
|
-
}
|
|
14
|
-
function exitBulkCommit() {
|
|
15
|
-
_bulkCommitActive = false;
|
|
16
|
-
_appliedParents = null;
|
|
17
|
-
}
|
|
18
|
-
function isBulkCommitActive() {
|
|
19
|
-
return _bulkCommitActive;
|
|
20
|
-
}
|
|
21
|
-
function markFastPathApplied(parent) {
|
|
22
|
-
if (!_appliedParents) return;
|
|
23
|
-
try {
|
|
24
|
-
_appliedParents.add(parent);
|
|
25
|
-
} catch (e) {}
|
|
26
|
-
}
|
|
27
|
-
function finalizeReadSubscriptions(instance) {
|
|
28
|
-
finalizeReadableSubscriptions(instance);
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Attempt to execute a runtime fast-lane for a single component's synchronous
|
|
32
|
-
* render result. Returns true if the fast-lane was used and commit was done.
|
|
33
|
-
*
|
|
34
|
-
* Preconditions (checked conservatively):
|
|
35
|
-
* - The render result is an intrinsic element root with keyed children
|
|
36
|
-
* - The renderer's fast-path heuristics indicate to use the fast-path
|
|
37
|
-
* - No mount operations are pending on the component instance
|
|
38
|
-
* - No child vnodes are component functions (avoid async/component mounts)
|
|
39
|
-
*/
|
|
40
|
-
function unwrapFragmentForFastPath(vnode) {
|
|
41
|
-
if (!vnode || typeof vnode !== "object" || !("type" in vnode)) return vnode;
|
|
42
|
-
const v = vnode;
|
|
43
|
-
if (typeof v.type === "symbol" && (v.type === Fragment || String(v.type) === "Symbol(askr.fragment)")) {
|
|
44
|
-
const children = v.props?.children ?? v.children;
|
|
45
|
-
if (Array.isArray(children) && children.length > 0) {
|
|
46
|
-
for (const child of children) if (child && typeof child === "object" && "type" in child) {
|
|
47
|
-
if (typeof child.type === "string") return child;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return vnode;
|
|
52
|
-
}
|
|
53
|
-
function classifyUpdate(instance, result) {
|
|
54
|
-
const unwrappedResult = unwrapFragmentForFastPath(result);
|
|
55
|
-
if (!unwrappedResult || typeof unwrappedResult !== "object" || !("type" in unwrappedResult)) return {
|
|
56
|
-
useFastPath: false,
|
|
57
|
-
reason: "not-vnode"
|
|
58
|
-
};
|
|
59
|
-
const vnode = unwrappedResult;
|
|
60
|
-
if (vnode == null || typeof vnode.type !== "string") return {
|
|
61
|
-
useFastPath: false,
|
|
62
|
-
reason: "not-intrinsic"
|
|
63
|
-
};
|
|
64
|
-
const parent = instance.target;
|
|
65
|
-
if (!parent) return {
|
|
66
|
-
useFastPath: false,
|
|
67
|
-
reason: "no-root"
|
|
68
|
-
};
|
|
69
|
-
const firstChild = parent.children[0];
|
|
70
|
-
if (!firstChild) return {
|
|
71
|
-
useFastPath: false,
|
|
72
|
-
reason: "no-first-child"
|
|
73
|
-
};
|
|
74
|
-
if (firstChild.tagName.toLowerCase() !== String(vnode.type).toLowerCase()) return {
|
|
75
|
-
useFastPath: false,
|
|
76
|
-
reason: "root-tag-mismatch"
|
|
77
|
-
};
|
|
78
|
-
const children = vnode.props?.children ?? vnode.children;
|
|
79
|
-
if (!Array.isArray(children)) return {
|
|
80
|
-
useFastPath: false,
|
|
81
|
-
reason: "no-children-array"
|
|
82
|
-
};
|
|
83
|
-
for (const c of children) if (typeof c === "object" && c !== null && "type" in c && typeof c.type === "function") return {
|
|
84
|
-
useFastPath: false,
|
|
85
|
-
reason: "component-child-present"
|
|
86
|
-
};
|
|
87
|
-
if ((instance.mountOperations?.length ?? 0) > 0) return {
|
|
88
|
-
useFastPath: false,
|
|
89
|
-
reason: "pending-mounts"
|
|
90
|
-
};
|
|
91
|
-
if ((instance.commitOperations?.length ?? 0) > 0) return {
|
|
92
|
-
useFastPath: false,
|
|
93
|
-
reason: "pending-lifecycle-commits"
|
|
94
|
-
};
|
|
95
|
-
const renderer = getRuntimeRenderer();
|
|
96
|
-
try {
|
|
97
|
-
renderer.populateKeyMapForElement(firstChild);
|
|
98
|
-
} catch {}
|
|
99
|
-
const oldKeyMap = renderer.getKeyMapForElement(firstChild);
|
|
100
|
-
const decision = renderer.isKeyedReorderFastPathEligible(firstChild, children, oldKeyMap);
|
|
101
|
-
if (!decision.useFastPath || decision.totalKeyed < 128) return {
|
|
102
|
-
...decision,
|
|
103
|
-
useFastPath: false,
|
|
104
|
-
reason: "renderer-declined"
|
|
105
|
-
};
|
|
106
|
-
return {
|
|
107
|
-
...decision,
|
|
108
|
-
useFastPath: true
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
function commitReorderOnly(instance, result) {
|
|
112
|
-
const renderer = getRuntimeRenderer();
|
|
113
|
-
const schedBefore = isDevelopmentEnvironment() ? getRuntimeSchedulerState() : null;
|
|
114
|
-
enterBulkCommit();
|
|
115
|
-
try {
|
|
116
|
-
runRuntimeWithSyncProgress(() => {
|
|
117
|
-
renderer.evaluate(result, instance.target);
|
|
118
|
-
try {
|
|
119
|
-
finalizeReadSubscriptions(instance);
|
|
120
|
-
} catch (e) {
|
|
121
|
-
if (isDevelopmentEnvironment()) throw e;
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
setDevValue("__FASTLANE_CLEARED_AFTER", 0);
|
|
125
|
-
if (isDevelopmentEnvironment()) validateFastLaneInvariants(instance, schedBefore);
|
|
126
|
-
return true;
|
|
127
|
-
} finally {
|
|
128
|
-
exitBulkCommit();
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Validates fast-lane invariants in dev mode.
|
|
133
|
-
* Extracted to reduce complexity in commitReorderOnly.
|
|
134
|
-
*/
|
|
135
|
-
function validateFastLaneInvariants(instance, schedBefore) {
|
|
136
|
-
const commitCount = getDevValue("__LAST_FASTPATH_COMMIT_COUNT") ?? 0;
|
|
137
|
-
const invariants = {
|
|
138
|
-
commitCount,
|
|
139
|
-
mountOps: instance.mountOperations?.length ?? 0,
|
|
140
|
-
commitOps: instance.commitOperations?.length ?? 0,
|
|
141
|
-
cleanupFns: instance.cleanupFns?.length ?? 0
|
|
142
|
-
};
|
|
143
|
-
setDevValue("__LAST_FASTLANE_INVARIANTS", invariants);
|
|
144
|
-
if (commitCount !== 1) {
|
|
145
|
-
console.error("[FASTLANE][INV] commitCount", commitCount, "diag", getDevNamespace());
|
|
146
|
-
throw new Error("Fast-lane invariant violated: expected exactly one DOM commit during reorder-only commit");
|
|
147
|
-
}
|
|
148
|
-
if (invariants.mountOps > 0) throw new Error("Fast-lane invariant violated: mount operations were registered during bulk commit");
|
|
149
|
-
if (invariants.commitOps > 0) throw new Error("Fast-lane invariant violated: lifecycle commit operations were registered during bulk commit");
|
|
150
|
-
if (invariants.cleanupFns > 0) throw new Error("Fast-lane invariant violated: cleanup functions were added during bulk commit");
|
|
151
|
-
const schedAfter = getRuntimeSchedulerState();
|
|
152
|
-
if (schedBefore && schedAfter && schedAfter.taskCount > schedBefore.taskCount) {
|
|
153
|
-
console.error("[FASTLANE] schedBefore, schedAfter", schedBefore, schedAfter);
|
|
154
|
-
console.error("[FASTLANE] enqueue logs", getDevValue("__ENQUEUE_LOGS"));
|
|
155
|
-
throw new Error("Fast-lane invariant violated: scheduler enqueued leftover work during bulk commit");
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
function tryRuntimeFastLaneSync(instance, result) {
|
|
159
|
-
if (!classifyUpdate(instance, result).useFastPath) {
|
|
160
|
-
setDevValue("__LAST_FASTPATH_STATS", void 0);
|
|
161
|
-
setDevValue("__LAST_FASTPATH_COMMIT_COUNT", 0);
|
|
162
|
-
return false;
|
|
163
|
-
}
|
|
164
|
-
try {
|
|
165
|
-
return commitReorderOnly(instance, result);
|
|
166
|
-
} catch (err) {
|
|
167
|
-
if (isDevelopmentEnvironment()) throw err;
|
|
168
|
-
return false;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
setRuntimeBulkCommitProbe(isBulkCommitActive);
|
|
172
|
-
//#endregion
|
|
173
|
-
export { classifyUpdate, commitReorderOnly, enterBulkCommit, exitBulkCommit, isBulkCommitActive, markFastPathApplied, tryRuntimeFastLaneSync };
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
//#region src/runtime/for-bench.d.ts
|
|
2
|
-
interface BenchMetrics {
|
|
3
|
-
itemsCreated: number;
|
|
4
|
-
itemsReused: number;
|
|
5
|
-
itemsRemoved: number;
|
|
6
|
-
itemsMoved: number;
|
|
7
|
-
rowFactoryInvocations: number;
|
|
8
|
-
keyLookups: number;
|
|
9
|
-
keyHits: number;
|
|
10
|
-
keyMisses: number;
|
|
11
|
-
domInserts: number;
|
|
12
|
-
domRemoves: number;
|
|
13
|
-
domMoves: number;
|
|
14
|
-
domAttrSets: number;
|
|
15
|
-
domTextSets: number;
|
|
16
|
-
domNodesCreated: number;
|
|
17
|
-
listenerBindings: number;
|
|
18
|
-
reactivePropsMounted: number;
|
|
19
|
-
replaceChildrenCommits: number;
|
|
20
|
-
bulkClearCommits: number;
|
|
21
|
-
reconcilePhaseMs: number;
|
|
22
|
-
domCommitPhaseMs: number;
|
|
23
|
-
fastLaneName: string | null;
|
|
24
|
-
}
|
|
25
|
-
type BenchEvent = 'itemCreated' | 'itemReused' | 'itemRemoved' | 'itemMoved' | 'rowFactory' | 'keyLookup' | 'keyHit' | 'keyMiss' | 'domInsert' | 'domRemove' | 'domMove' | 'domAttrSet' | 'domTextSet';
|
|
26
|
-
type BenchMetricScope = 'coldCreate' | 'fullClear';
|
|
27
|
-
type BenchCounter = 'domNodesCreated' | 'listenerBindings' | 'reactivePropsMounted' | 'replaceChildrenCommits' | 'bulkClearCommits';
|
|
28
|
-
declare function withBenchMetricScopeLive<T>(scope: BenchMetricScope, run: () => T): T;
|
|
29
|
-
declare const resetBenchMetrics: () => void;
|
|
30
|
-
declare const recordBenchEvent: (event: BenchEvent, delta?: number) => void;
|
|
31
|
-
declare const recordBenchFastLane: (name: string) => void;
|
|
32
|
-
declare const recordBenchTiming: (phase: "reconcile" | "domCommit", ms: number) => void;
|
|
33
|
-
declare const recordBenchCounter: (counter: BenchCounter, delta?: number) => void;
|
|
34
|
-
declare const withBenchMetricScope: typeof withBenchMetricScopeLive;
|
|
35
|
-
declare const isBenchMetricScopeActive: (scope: BenchMetricScope) => boolean;
|
|
36
|
-
declare const getBenchMetrics: () => BenchMetrics;
|
|
37
|
-
declare const flushBenchMetrics: () => void;
|
|
38
|
-
declare const isBenchBuildEnabled: () => boolean;
|
|
39
|
-
//#endregion
|
|
40
|
-
export { BenchEvent, BenchMetrics };
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
//#region src/runtime/for-bench.ts
|
|
2
|
-
const BENCH_BUILD_ENABLED = false;
|
|
3
|
-
const resetBenchMetrics = () => {};
|
|
4
|
-
const recordBenchEvent = (_event) => {};
|
|
5
|
-
const recordBenchFastLane = (_name) => {};
|
|
6
|
-
const recordBenchTiming = (_phase, _ms) => {};
|
|
7
|
-
const recordBenchCounter = (_counter, _delta = 1) => {};
|
|
8
|
-
const withBenchMetricScope = (_scope, run) => run();
|
|
9
|
-
const isBenchMetricScopeActive = (_scope) => false;
|
|
10
|
-
const flushBenchMetrics = () => {};
|
|
11
|
-
const isBenchBuildEnabled = () => BENCH_BUILD_ENABLED;
|
|
12
|
-
//#endregion
|
|
13
|
-
export { flushBenchMetrics, isBenchBuildEnabled, isBenchMetricScopeActive, recordBenchCounter, recordBenchEvent, recordBenchFastLane, recordBenchTiming, resetBenchMetrics, withBenchMetricScope };
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import { ComponentInstance } from "./component-internal.js";
|
|
2
|
-
import { ReadableSource } from "./readable.js";
|
|
3
|
-
import { DOMRange } from "../common/dom-range.js";
|
|
4
|
-
import { ChildScope, ChildScopeTransactionSnapshot } from "./child-scope.js";
|
|
5
|
-
import { ForIndexSignal, ForItemPropertySignal } from "./for-signals.js";
|
|
6
|
-
import { ForItemInstance } from "./for-scopes.js";
|
|
7
|
-
import { FineGrainedEffectHandle } from "./effect.js";
|
|
8
|
-
import { ForEachSource, ForKeySelector, ForRenderItem } from "./for-types.js";
|
|
9
|
-
import { reconcileForItems } from "./for-reconcile.js";
|
|
10
|
-
import { VNode } from "../common/vnode.js";
|
|
11
|
-
|
|
12
|
-
//#region src/runtime/for-internal.d.ts
|
|
13
|
-
type ForCommitStrategy = 'APPEND' | 'INSERT_ONE' | 'TRUNCATE' | 'NO_REORDER' | 'SWAP' | 'FULL_KEYED';
|
|
14
|
-
interface ForState<T> {
|
|
15
|
-
kind: 'for';
|
|
16
|
-
currentItems: T[];
|
|
17
|
-
_committedItems: T[];
|
|
18
|
-
eachSource: ForEachSource<T>;
|
|
19
|
-
fallback: VNode | null;
|
|
20
|
-
fallbackScope: ChildScope | null;
|
|
21
|
-
items: Map<string | number, ForItemInstance<T>>;
|
|
22
|
-
orderedKeys: Array<string | number>;
|
|
23
|
-
orderedItems: ForItemInstance<T>[];
|
|
24
|
-
orderedVNodes: VNode[];
|
|
25
|
-
byFn: ForKeySelector<T>;
|
|
26
|
-
renderFn: ForRenderItem<T>;
|
|
27
|
-
parentInstance: ComponentInstance | null;
|
|
28
|
-
lastCommitStrategy: ForCommitStrategy;
|
|
29
|
-
lastRemovedNodes: Node[];
|
|
30
|
-
lastRemovedRanges: DOMRange[];
|
|
31
|
-
pendingDirtyIndices: number[] | null;
|
|
32
|
-
pendingSwapIndices: [number, number] | null;
|
|
33
|
-
pendingMoveOnly: boolean;
|
|
34
|
-
pendingInsertedIndex: number | null;
|
|
35
|
-
pendingAppendStart: number | null;
|
|
36
|
-
_hasResolvedItemDom: boolean;
|
|
37
|
-
_needsSourceReconcile: boolean;
|
|
38
|
-
_sourceEffect: FineGrainedEffectHandle<T[]> | null;
|
|
39
|
-
_suspendSourceCommit: boolean;
|
|
40
|
-
_enqueueBoundaryCommit?: (() => void) | null;
|
|
41
|
-
_hasPendingBoundaryCommit?: boolean;
|
|
42
|
-
devKeyKinds?: Map<string | number, 'number' | 'string'>;
|
|
43
|
-
_transaction?: ForTransaction<T> | null;
|
|
44
|
-
}
|
|
45
|
-
interface ForItemTransactionSnapshot<T> {
|
|
46
|
-
item: T;
|
|
47
|
-
itemSignalExists: boolean;
|
|
48
|
-
itemSignalValue: T | undefined;
|
|
49
|
-
itemSignalHasBeenRead: boolean;
|
|
50
|
-
indexValue: number;
|
|
51
|
-
indexHasBeenRead: boolean;
|
|
52
|
-
propertySignalStore: Map<PropertyKey, ForItemPropertySignal> | null;
|
|
53
|
-
propertySignals: Map<PropertyKey, {
|
|
54
|
-
signal: ForItemPropertySignal;
|
|
55
|
-
value: unknown;
|
|
56
|
-
hasBeenRead: boolean;
|
|
57
|
-
}> | null;
|
|
58
|
-
scope: ChildScopeTransactionSnapshot;
|
|
59
|
-
}
|
|
60
|
-
interface ForTransaction<T> {
|
|
61
|
-
collectionSnapshotMode: 'copy' | 'reset-empty' | 'preserve-clear' | 'reuse';
|
|
62
|
-
currentItems: T[];
|
|
63
|
-
items: Map<string | number, ForItemInstance<T>>;
|
|
64
|
-
orderedKeys: Array<string | number>;
|
|
65
|
-
orderedItems: ForItemInstance<T>[];
|
|
66
|
-
orderedVNodes: VNode[];
|
|
67
|
-
fallbackScope: ChildScope | null;
|
|
68
|
-
lastCommitStrategy: ForCommitStrategy;
|
|
69
|
-
lastRemovedNodes: Node[];
|
|
70
|
-
lastRemovedRanges: DOMRange[];
|
|
71
|
-
pendingDirtyIndices: number[] | null;
|
|
72
|
-
pendingSwapIndices: [number, number] | null;
|
|
73
|
-
pendingMoveOnly: boolean;
|
|
74
|
-
pendingInsertedIndex: number | null;
|
|
75
|
-
pendingAppendStart: number | null;
|
|
76
|
-
hasResolvedItemDom: boolean;
|
|
77
|
-
needsSourceReconcile: boolean;
|
|
78
|
-
devKeyKinds?: Map<string | number, 'number' | 'string'>;
|
|
79
|
-
itemSnapshots: Map<ForItemInstance<T>, ForItemTransactionSnapshot<T>> | null;
|
|
80
|
-
unreadIndexSnapshots: Map<ForIndexSignal, number> | null;
|
|
81
|
-
fallbackScopeSnapshot: ChildScopeTransactionSnapshot | null;
|
|
82
|
-
removedScopes: ChildScope[] | null;
|
|
83
|
-
removeAllItems: boolean;
|
|
84
|
-
signalEffects: Map<ReadableSource<unknown>, {
|
|
85
|
-
parentInstance: ComponentInstance | null;
|
|
86
|
-
notify: boolean;
|
|
87
|
-
skipInstance: ComponentInstance | null;
|
|
88
|
-
skipOwnedBy: ComponentInstance | null;
|
|
89
|
-
}> | null;
|
|
90
|
-
shouldClearDomUpdateState: boolean;
|
|
91
|
-
}
|
|
92
|
-
declare function createForState<T>(eachSource: ForEachSource<T>, byFn: ForState<T>['byFn'], renderFn: ForRenderItem<T>, fallback: VNode | null): ForState<T>;
|
|
93
|
-
declare function useForState<T>(eachSource: ForEachSource<T>, byFn: ForState<T>['byFn'], renderFn: ForRenderItem<T>, fallback: VNode | null): ForState<T>;
|
|
94
|
-
declare function evaluateForState<T>(forState: ForState<T>): VNode[];
|
|
95
|
-
/**
|
|
96
|
-
* Reconciliation changes ownership before DOM work can fail. Keep a private
|
|
97
|
-
* structural snapshot until the boundary has committed so failed work cannot
|
|
98
|
-
* leave provisional child scopes in the parent owner graph.
|
|
99
|
-
*/
|
|
100
|
-
declare function beginForStateTransaction<T>(forState: ForState<T>, collectionMode?: 'auto' | 'reuse'): void;
|
|
101
|
-
declare function registerForStateTransaction<T>(forState: ForState<T>, transaction?: ForTransaction<T> | null | undefined): boolean;
|
|
102
|
-
declare function commitForStateTransaction<T>(forState: ForState<T>, transaction?: ForTransaction<T> | null | undefined): void;
|
|
103
|
-
declare function rollbackForStateTransaction<T>(forState: ForState<T>, transaction?: ForTransaction<T> | null | undefined): void;
|
|
104
|
-
declare function clearForDomUpdateState<T>(forState: ForState<T>): void;
|
|
105
|
-
//#endregion
|
|
106
|
-
export { ForCommitStrategy, ForItemTransactionSnapshot, ForState, ForTransaction, reconcileForItems };
|
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
import { logger } from "../common/logger.js";
|
|
2
|
-
import { getRuntimeRenderer } from "./access.js";
|
|
3
|
-
import { claimHookIndex, getCurrentInstance } from "./component-scope.js";
|
|
4
|
-
import { registerLifecycleTransaction } from "./lifecycle-batch.js";
|
|
5
|
-
import "./component-lifecycle.js";
|
|
6
|
-
import "./component.js";
|
|
7
|
-
import { disposeChildScope, restoreChildScopeTransactionSnapshot } from "./child-scope.js";
|
|
8
|
-
import { notifyForSignalReaders, removeForParentReaders } from "./for-signals.js";
|
|
9
|
-
import { isBenchMetricScopeActive, recordBenchCounter, recordBenchEvent, recordBenchTiming, withBenchMetricScope } from "./for-bench.js";
|
|
10
|
-
import { reconcileForItems } from "./for-reconcile.js";
|
|
11
|
-
//#region src/runtime/for-internal.ts
|
|
12
|
-
/**
|
|
13
|
-
* For primitive runtime
|
|
14
|
-
*
|
|
15
|
-
* Manages For state storage, hook binding, source evaluation,
|
|
16
|
-
* and DOM update state cleanup.
|
|
17
|
-
*/
|
|
18
|
-
const forStates = /* @__PURE__ */ new WeakMap();
|
|
19
|
-
function getForStore(instance) {
|
|
20
|
-
let store = forStates.get(instance);
|
|
21
|
-
if (!store) {
|
|
22
|
-
store = /* @__PURE__ */ new Map();
|
|
23
|
-
forStates.set(instance, store);
|
|
24
|
-
}
|
|
25
|
-
return store;
|
|
26
|
-
}
|
|
27
|
-
function createForState(eachSource, byFn, renderFn, fallback) {
|
|
28
|
-
const parentInstance = getCurrentInstance();
|
|
29
|
-
return {
|
|
30
|
-
kind: "for",
|
|
31
|
-
currentItems: [],
|
|
32
|
-
_committedItems: [],
|
|
33
|
-
eachSource,
|
|
34
|
-
fallback,
|
|
35
|
-
fallbackScope: null,
|
|
36
|
-
items: /* @__PURE__ */ new Map(),
|
|
37
|
-
orderedKeys: [],
|
|
38
|
-
orderedItems: [],
|
|
39
|
-
orderedVNodes: [],
|
|
40
|
-
byFn,
|
|
41
|
-
renderFn,
|
|
42
|
-
parentInstance,
|
|
43
|
-
lastCommitStrategy: "NO_REORDER",
|
|
44
|
-
lastRemovedNodes: [],
|
|
45
|
-
lastRemovedRanges: [],
|
|
46
|
-
pendingDirtyIndices: null,
|
|
47
|
-
pendingSwapIndices: null,
|
|
48
|
-
pendingMoveOnly: false,
|
|
49
|
-
pendingInsertedIndex: null,
|
|
50
|
-
pendingAppendStart: null,
|
|
51
|
-
_hasResolvedItemDom: false,
|
|
52
|
-
_needsSourceReconcile: false,
|
|
53
|
-
_sourceEffect: null,
|
|
54
|
-
_suspendSourceCommit: false,
|
|
55
|
-
_enqueueBoundaryCommit: null,
|
|
56
|
-
_hasPendingBoundaryCommit: false,
|
|
57
|
-
_transaction: null
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
function useForState(eachSource, byFn, renderFn, fallback) {
|
|
61
|
-
const instance = getCurrentInstance();
|
|
62
|
-
if (!instance) throw new Error("For can only be created during component render execution.");
|
|
63
|
-
const hookIndex = claimHookIndex(instance, "For");
|
|
64
|
-
const store = getForStore(instance);
|
|
65
|
-
const existing = store.get(hookIndex);
|
|
66
|
-
if (existing) {
|
|
67
|
-
existing.eachSource = eachSource;
|
|
68
|
-
existing.byFn = byFn;
|
|
69
|
-
existing.renderFn = renderFn;
|
|
70
|
-
existing.fallback = fallback;
|
|
71
|
-
return existing;
|
|
72
|
-
}
|
|
73
|
-
const created = createForState(eachSource, byFn, renderFn, fallback);
|
|
74
|
-
store.set(hookIndex, created);
|
|
75
|
-
(instance.cleanupFns ??= []).push(() => {
|
|
76
|
-
created._sourceEffect?.cleanup();
|
|
77
|
-
created._sourceEffect = null;
|
|
78
|
-
store.delete(hookIndex);
|
|
79
|
-
});
|
|
80
|
-
return created;
|
|
81
|
-
}
|
|
82
|
-
function evaluateForState(forState) {
|
|
83
|
-
if (!Array.isArray(forState.currentItems)) throw new Error("For source must evaluate to an array");
|
|
84
|
-
beginForStateTransaction(forState);
|
|
85
|
-
forState._needsSourceReconcile = false;
|
|
86
|
-
try {
|
|
87
|
-
return reconcileForItems(forState, forState.currentItems);
|
|
88
|
-
} catch (error) {
|
|
89
|
-
rollbackForStateTransaction(forState);
|
|
90
|
-
throw error;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Reconciliation changes ownership before DOM work can fail. Keep a private
|
|
95
|
-
* structural snapshot until the boundary has committed so failed work cannot
|
|
96
|
-
* leave provisional child scopes in the parent owner graph.
|
|
97
|
-
*/
|
|
98
|
-
function beginForStateTransaction(forState, collectionMode = "auto") {
|
|
99
|
-
if (forState._transaction) return;
|
|
100
|
-
const hasEmptyCollections = forState.items.size === 0 && forState.orderedKeys.length === 0 && forState.orderedItems.length === 0 && forState.orderedVNodes.length === 0;
|
|
101
|
-
const isFullClear = forState.currentItems.length === 0 && forState.orderedKeys.length > 0;
|
|
102
|
-
const collectionSnapshotMode = collectionMode === "reuse" ? "reuse" : hasEmptyCollections ? "reset-empty" : isFullClear ? "preserve-clear" : "copy";
|
|
103
|
-
const transaction = {
|
|
104
|
-
collectionSnapshotMode,
|
|
105
|
-
currentItems: forState._committedItems,
|
|
106
|
-
items: collectionSnapshotMode === "copy" ? new Map(forState.items) : forState.items,
|
|
107
|
-
orderedKeys: collectionSnapshotMode === "copy" ? forState.orderedKeys.slice() : forState.orderedKeys,
|
|
108
|
-
orderedItems: collectionSnapshotMode === "copy" ? forState.orderedItems.slice() : forState.orderedItems,
|
|
109
|
-
orderedVNodes: collectionSnapshotMode === "copy" ? forState.orderedVNodes.slice() : forState.orderedVNodes,
|
|
110
|
-
fallbackScope: forState.fallbackScope,
|
|
111
|
-
lastCommitStrategy: forState.lastCommitStrategy,
|
|
112
|
-
lastRemovedNodes: forState.lastRemovedNodes,
|
|
113
|
-
lastRemovedRanges: forState.lastRemovedRanges,
|
|
114
|
-
pendingDirtyIndices: forState.pendingDirtyIndices,
|
|
115
|
-
pendingSwapIndices: forState.pendingSwapIndices,
|
|
116
|
-
pendingMoveOnly: forState.pendingMoveOnly,
|
|
117
|
-
pendingInsertedIndex: forState.pendingInsertedIndex,
|
|
118
|
-
pendingAppendStart: forState.pendingAppendStart,
|
|
119
|
-
hasResolvedItemDom: forState._hasResolvedItemDom,
|
|
120
|
-
needsSourceReconcile: forState._needsSourceReconcile,
|
|
121
|
-
devKeyKinds: forState.devKeyKinds,
|
|
122
|
-
itemSnapshots: null,
|
|
123
|
-
unreadIndexSnapshots: null,
|
|
124
|
-
fallbackScopeSnapshot: null,
|
|
125
|
-
removedScopes: null,
|
|
126
|
-
removeAllItems: false,
|
|
127
|
-
signalEffects: null,
|
|
128
|
-
shouldClearDomUpdateState: false
|
|
129
|
-
};
|
|
130
|
-
forState._transaction = transaction;
|
|
131
|
-
registerForStateTransaction(forState, transaction);
|
|
132
|
-
}
|
|
133
|
-
function registerForStateTransaction(forState, transaction = forState._transaction) {
|
|
134
|
-
if (!transaction || forState._transaction !== transaction) return false;
|
|
135
|
-
return registerLifecycleTransaction(transaction, () => commitForStateTransaction(forState, transaction), () => rollbackForStateTransaction(forState, transaction));
|
|
136
|
-
}
|
|
137
|
-
function finalizeForStateRemovals(transaction) {
|
|
138
|
-
const removedScopes = transaction.removedScopes;
|
|
139
|
-
if (!transaction.removeAllItems && !removedScopes) return;
|
|
140
|
-
const cleanupErrors = [];
|
|
141
|
-
const finalizeScope = (scope) => {
|
|
142
|
-
const removedDom = scope.dom;
|
|
143
|
-
const removedRange = scope.range;
|
|
144
|
-
try {
|
|
145
|
-
disposeChildScope(scope);
|
|
146
|
-
} catch (error) {
|
|
147
|
-
cleanupErrors.push(error);
|
|
148
|
-
}
|
|
149
|
-
if (typeof Element !== "undefined" && removedDom instanceof Element) try {
|
|
150
|
-
getRuntimeRenderer().teardownNodeSubtree(removedDom);
|
|
151
|
-
} catch (error) {
|
|
152
|
-
cleanupErrors.push(error);
|
|
153
|
-
}
|
|
154
|
-
if (removedRange && !removedRange.single) for (let node = removedRange.start.nextSibling; node && node !== removedRange.end;) {
|
|
155
|
-
const next = node.nextSibling;
|
|
156
|
-
if (typeof Element !== "undefined" && node instanceof Element) try {
|
|
157
|
-
getRuntimeRenderer().teardownNodeSubtree(node);
|
|
158
|
-
} catch (error) {
|
|
159
|
-
cleanupErrors.push(error);
|
|
160
|
-
}
|
|
161
|
-
node = next;
|
|
162
|
-
}
|
|
163
|
-
};
|
|
164
|
-
if (transaction.removeAllItems) for (let index = 0; index < transaction.orderedItems.length; index++) {
|
|
165
|
-
const item = transaction.orderedItems[index];
|
|
166
|
-
if (item) finalizeScope(item.scope);
|
|
167
|
-
}
|
|
168
|
-
for (const scope of removedScopes ?? []) finalizeScope(scope);
|
|
169
|
-
if (removedScopes) removedScopes.length = 0;
|
|
170
|
-
transaction.removeAllItems = false;
|
|
171
|
-
if (cleanupErrors.length > 0) logger.error("[Askr] For removal cleanup failed:", new AggregateError(cleanupErrors, "For removal cleanup failed"));
|
|
172
|
-
}
|
|
173
|
-
function finalizeForSignalEffects(transaction) {
|
|
174
|
-
if (!transaction.signalEffects) return;
|
|
175
|
-
for (const [source, effect] of transaction.signalEffects) {
|
|
176
|
-
removeForParentReaders(effect.parentInstance, source);
|
|
177
|
-
if (effect.notify) notifyForSignalReaders(source, effect.skipInstance, effect.skipOwnedBy);
|
|
178
|
-
}
|
|
179
|
-
transaction.signalEffects.clear();
|
|
180
|
-
}
|
|
181
|
-
function finalizeForDomUpdateFlags(forState) {
|
|
182
|
-
for (let index = 0; index < forState.orderedItems.length; index++) {
|
|
183
|
-
const item = forState.orderedItems[index];
|
|
184
|
-
if (item) item.scope.needsDomUpdate = false;
|
|
185
|
-
}
|
|
186
|
-
if (forState.fallbackScope) forState.fallbackScope.needsDomUpdate = false;
|
|
187
|
-
}
|
|
188
|
-
function commitForStateTransaction(forState, transaction = forState._transaction) {
|
|
189
|
-
if (!transaction || forState._transaction !== transaction) return;
|
|
190
|
-
try {
|
|
191
|
-
finalizeForStateRemovals(transaction);
|
|
192
|
-
finalizeForSignalEffects(transaction);
|
|
193
|
-
if (transaction.shouldClearDomUpdateState) finalizeForDomUpdateFlags(forState);
|
|
194
|
-
} finally {
|
|
195
|
-
transaction.itemSnapshots?.clear();
|
|
196
|
-
transaction.unreadIndexSnapshots?.clear();
|
|
197
|
-
transaction.fallbackScopeSnapshot = null;
|
|
198
|
-
forState._committedItems = forState.currentItems;
|
|
199
|
-
forState._transaction = null;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
function rollbackForStateTransaction(forState, transaction = forState._transaction) {
|
|
203
|
-
if (!transaction || forState._transaction !== transaction) return;
|
|
204
|
-
const rollbackCleanupErrors = [];
|
|
205
|
-
const scopesToDispose = /* @__PURE__ */ new Set();
|
|
206
|
-
const committedScopes = transaction.collectionSnapshotMode === "reset-empty" ? null : new Set(transaction.orderedItems.map((item) => item.scope));
|
|
207
|
-
if (transaction.fallbackScope) committedScopes?.add(transaction.fallbackScope);
|
|
208
|
-
if (transaction.collectionSnapshotMode === "reset-empty") for (const item of forState.items.values()) scopesToDispose.add(item.scope);
|
|
209
|
-
else for (const [key, item] of forState.items) if (transaction.items.get(key) !== item) scopesToDispose.add(item.scope);
|
|
210
|
-
for (const scope of transaction.removedScopes ?? []) if (scope !== transaction.fallbackScope && !committedScopes?.has(scope)) scopesToDispose.add(scope);
|
|
211
|
-
if (forState.fallbackScope && forState.fallbackScope !== transaction.fallbackScope) scopesToDispose.add(forState.fallbackScope);
|
|
212
|
-
for (const scope of scopesToDispose) try {
|
|
213
|
-
disposeChildScope(scope);
|
|
214
|
-
} catch (error) {
|
|
215
|
-
rollbackCleanupErrors.push(error);
|
|
216
|
-
}
|
|
217
|
-
if (transaction.collectionSnapshotMode === "reset-empty") {
|
|
218
|
-
forState.items.clear();
|
|
219
|
-
forState.orderedKeys.length = 0;
|
|
220
|
-
forState.orderedItems.length = 0;
|
|
221
|
-
forState.orderedVNodes.length = 0;
|
|
222
|
-
}
|
|
223
|
-
for (const [itemInstance, snapshot] of transaction.itemSnapshots ?? []) {
|
|
224
|
-
itemInstance.item = snapshot.item;
|
|
225
|
-
const reactiveItemState = itemInstance.reactiveItemState;
|
|
226
|
-
if (reactiveItemState) reactiveItemState.currentItem = snapshot.item;
|
|
227
|
-
const itemSignal = reactiveItemState?.itemSignal;
|
|
228
|
-
if (itemSignal && snapshot.itemSignalExists) {
|
|
229
|
-
itemSignal.set(snapshot.itemSignalValue, false);
|
|
230
|
-
itemSignal._hasBeenRead = snapshot.itemSignalHasBeenRead;
|
|
231
|
-
}
|
|
232
|
-
itemInstance.indexSignal.set(snapshot.indexValue, false);
|
|
233
|
-
itemInstance.indexSignal._hasBeenRead = snapshot.indexHasBeenRead;
|
|
234
|
-
const propertySignals = snapshot.propertySignalStore;
|
|
235
|
-
if (reactiveItemState) reactiveItemState.propertySignals = propertySignals;
|
|
236
|
-
if (propertySignals) {
|
|
237
|
-
propertySignals.clear();
|
|
238
|
-
for (const [property, propertySnapshot] of snapshot.propertySignals ?? []) {
|
|
239
|
-
propertySnapshot.signal.set(propertySnapshot.value, false);
|
|
240
|
-
propertySnapshot.signal._hasBeenRead = propertySnapshot.hasBeenRead;
|
|
241
|
-
propertySignals.set(property, propertySnapshot.signal);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
restoreChildScopeTransactionSnapshot(itemInstance.scope, snapshot.scope);
|
|
245
|
-
}
|
|
246
|
-
for (const [indexSignal, index] of transaction.unreadIndexSnapshots ?? []) indexSignal.set(index, false);
|
|
247
|
-
if (transaction.fallbackScope && transaction.fallbackScopeSnapshot) restoreChildScopeTransactionSnapshot(transaction.fallbackScope, transaction.fallbackScopeSnapshot);
|
|
248
|
-
forState.currentItems = transaction.currentItems;
|
|
249
|
-
forState._committedItems = transaction.currentItems;
|
|
250
|
-
forState.items = transaction.items;
|
|
251
|
-
forState.orderedKeys = transaction.orderedKeys;
|
|
252
|
-
forState.orderedItems = transaction.orderedItems;
|
|
253
|
-
forState.orderedVNodes = transaction.orderedVNodes;
|
|
254
|
-
forState.fallbackScope = transaction.fallbackScope;
|
|
255
|
-
forState.lastCommitStrategy = transaction.lastCommitStrategy;
|
|
256
|
-
forState.lastRemovedNodes = transaction.lastRemovedNodes;
|
|
257
|
-
forState.lastRemovedRanges = transaction.lastRemovedRanges;
|
|
258
|
-
forState.pendingDirtyIndices = transaction.pendingDirtyIndices;
|
|
259
|
-
forState.pendingSwapIndices = transaction.pendingSwapIndices;
|
|
260
|
-
forState.pendingMoveOnly = transaction.pendingMoveOnly;
|
|
261
|
-
forState.pendingInsertedIndex = transaction.pendingInsertedIndex;
|
|
262
|
-
forState.pendingAppendStart = transaction.pendingAppendStart;
|
|
263
|
-
forState._hasResolvedItemDom = transaction.hasResolvedItemDom;
|
|
264
|
-
forState._needsSourceReconcile = transaction.needsSourceReconcile;
|
|
265
|
-
forState.devKeyKinds = transaction.devKeyKinds;
|
|
266
|
-
forState._transaction = null;
|
|
267
|
-
if (rollbackCleanupErrors.length > 0) logger.error("[Askr] transaction rollback cleanup failed:", new AggregateError(rollbackCleanupErrors, "Transaction rollback cleanup failed"));
|
|
268
|
-
}
|
|
269
|
-
function clearForDomUpdateState(forState) {
|
|
270
|
-
const transaction = forState._transaction;
|
|
271
|
-
if (transaction) transaction.shouldClearDomUpdateState = true;
|
|
272
|
-
if (transaction && !registerForStateTransaction(forState, transaction)) commitForStateTransaction(forState, transaction);
|
|
273
|
-
if (!transaction) finalizeForDomUpdateFlags(forState);
|
|
274
|
-
forState.lastRemovedNodes = [];
|
|
275
|
-
forState.lastRemovedRanges = [];
|
|
276
|
-
forState.pendingDirtyIndices = null;
|
|
277
|
-
forState.pendingSwapIndices = null;
|
|
278
|
-
forState.pendingMoveOnly = false;
|
|
279
|
-
forState.pendingInsertedIndex = null;
|
|
280
|
-
forState.pendingAppendStart = null;
|
|
281
|
-
forState._needsSourceReconcile = false;
|
|
282
|
-
forState._hasResolvedItemDom = forState.orderedKeys.length > 0;
|
|
283
|
-
}
|
|
284
|
-
//#endregion
|
|
285
|
-
export { beginForStateTransaction, clearForDomUpdateState, commitForStateTransaction, createForState, evaluateForState, isBenchMetricScopeActive, reconcileForItems, recordBenchCounter, recordBenchEvent, recordBenchTiming, registerForStateTransaction, rollbackForStateTransaction, useForState, withBenchMetricScope };
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { ForState } from "./for-internal.js";
|
|
2
|
-
import { VNode } from "../common/vnode.js";
|
|
3
|
-
|
|
4
|
-
//#region src/runtime/for-reconcile.d.ts
|
|
5
|
-
declare function reconcileForItems<T>(forState: ForState<T>, newArray: T[]): VNode[];
|
|
6
|
-
//#endregion
|
|
7
|
-
export { reconcileForItems };
|