@askrjs/askr 0.0.48 → 0.0.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/benchmark.js +6 -6
- package/dist/benchmark.js.map +1 -1
- package/dist/boot/hydration.js +140 -0
- package/dist/boot/hydration.js.map +1 -0
- package/dist/boot/index.d.ts +3 -56
- package/dist/boot/index.d.ts.map +1 -1
- package/dist/boot/index.js +62 -410
- package/dist/boot/index.js.map +1 -1
- package/dist/boot/root-lifecycle.d.ts +15 -0
- package/dist/boot/root-lifecycle.d.ts.map +1 -0
- package/dist/boot/root-lifecycle.js +205 -0
- package/dist/boot/root-lifecycle.js.map +1 -0
- package/dist/boot/route-startup.js +45 -0
- package/dist/boot/route-startup.js.map +1 -0
- package/dist/boot/types.d.ts +62 -0
- package/dist/boot/types.d.ts.map +1 -0
- package/dist/common/component.d.ts +3 -1
- package/dist/common/component.d.ts.map +1 -1
- package/dist/common/jsx.d.ts +6 -2
- package/dist/common/jsx.d.ts.map +1 -1
- package/dist/common/jsx.js.map +1 -1
- package/dist/common/props.d.ts +1 -1
- package/dist/common/render-context.js +55 -0
- package/dist/common/render-context.js.map +1 -0
- package/dist/common/router.d.ts +5 -1
- package/dist/common/router.d.ts.map +1 -1
- package/dist/common/ssr.d.ts +1 -1
- package/dist/common/ssr.js.map +1 -1
- package/dist/common/vnode.d.ts +5 -4
- package/dist/common/vnode.d.ts.map +1 -1
- package/dist/common/vnode.js.map +1 -1
- package/dist/components/error-boundary.d.ts +1 -1
- package/dist/components/error-boundary.js +2 -1
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/link.js.map +1 -1
- package/dist/control/for.js +2 -1
- package/dist/control/for.js.map +1 -1
- package/dist/data/data-runtime.d.ts +28 -0
- package/dist/data/data-runtime.d.ts.map +1 -0
- package/dist/data/data-runtime.js +114 -0
- package/dist/data/data-runtime.js.map +1 -0
- package/dist/data/index.d.ts +6 -142
- package/dist/data/index.js +5 -539
- package/dist/data/invalidation.d.ts +9 -0
- package/dist/data/invalidation.d.ts.map +1 -0
- package/dist/data/invalidation.js +27 -0
- package/dist/data/invalidation.js.map +1 -0
- package/dist/data/mutation-cell.d.ts +28 -0
- package/dist/data/mutation-cell.d.ts.map +1 -0
- package/dist/data/mutation-cell.js +132 -0
- package/dist/data/mutation-cell.js.map +1 -0
- package/dist/data/query-cell.d.ts +46 -0
- package/dist/data/query-cell.d.ts.map +1 -0
- package/dist/data/query-cell.js +290 -0
- package/dist/data/query-cell.js.map +1 -0
- package/dist/data/query-key.js +42 -0
- package/dist/data/query-key.js.map +1 -0
- package/dist/data/shared.js +20 -0
- package/dist/data/shared.js.map +1 -0
- package/dist/data/types.d.ts +161 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/foundations/icon/icon.d.ts.map +1 -1
- package/dist/foundations/icon/icon.js.map +1 -1
- package/dist/foundations/structures/portal.d.ts +1 -1
- package/dist/foundations/structures/portal.d.ts.map +1 -1
- package/dist/foundations/structures/portal.js +2 -1
- package/dist/foundations/structures/portal.js.map +1 -1
- package/dist/fx/fx.d.ts +1 -1
- package/dist/fx/fx.js +5 -4
- package/dist/fx/fx.js.map +1 -1
- package/dist/fx/timing.d.ts.map +1 -1
- package/dist/fx/timing.js +10 -6
- package/dist/fx/timing.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/jsx/index.d.ts +2 -1
- package/dist/jsx/index.js +3 -2
- package/dist/jsx/types.d.ts +3 -1
- package/dist/jsx/types.d.ts.map +1 -1
- package/dist/jsx/types.js +2 -1
- package/dist/jsx-dev-runtime.d.ts +2 -2
- package/dist/jsx-dev-runtime.d.ts.map +1 -1
- package/dist/jsx-dev-runtime.js.map +1 -1
- package/dist/jsx-runtime.d.ts +2 -2
- package/dist/jsx-runtime.d.ts.map +1 -1
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/jsx-runtime2.d.ts +3 -2
- package/dist/jsx-runtime2.js +3 -2
- package/dist/renderer/attributes.js +231 -0
- package/dist/renderer/attributes.js.map +1 -0
- package/dist/renderer/boundaries.js +266 -0
- package/dist/renderer/boundaries.js.map +1 -0
- package/dist/renderer/child-shape.js +85 -0
- package/dist/renderer/child-shape.js.map +1 -0
- package/dist/renderer/children.js +3 -2
- package/dist/renderer/children.js.map +1 -1
- package/dist/renderer/cleanup.js +2 -1
- package/dist/renderer/cleanup.js.map +1 -1
- package/dist/renderer/component-host-cleanup.js +68 -0
- package/dist/renderer/component-host-cleanup.js.map +1 -0
- package/dist/renderer/component-host-instances.js +65 -0
- package/dist/renderer/component-host-instances.js.map +1 -0
- package/dist/renderer/component-host.js +247 -0
- package/dist/renderer/component-host.js.map +1 -0
- package/dist/renderer/dom-host.js +13 -0
- package/dist/renderer/dom-host.js.map +1 -0
- package/dist/renderer/dom-internal.js +185 -0
- package/dist/renderer/dom-internal.js.map +1 -0
- package/dist/renderer/dom.js +9 -2356
- package/dist/renderer/element-children.js +279 -0
- package/dist/renderer/element-children.js.map +1 -0
- package/dist/renderer/env.js +2 -1
- package/dist/renderer/error-boundary-dom.js +29 -0
- package/dist/renderer/error-boundary-dom.js.map +1 -0
- package/dist/renderer/evaluate-dom-range.js +85 -0
- package/dist/renderer/evaluate-dom-range.js.map +1 -0
- package/dist/renderer/evaluate-reconcile.js +281 -0
- package/dist/renderer/evaluate-reconcile.js.map +1 -0
- package/dist/renderer/evaluate.js +13 -399
- package/dist/renderer/evaluate.js.map +1 -1
- package/dist/renderer/fastpath.js +6 -5
- package/dist/renderer/fastpath.js.map +1 -1
- package/dist/renderer/for-commit-dom-map.js +83 -0
- package/dist/renderer/for-commit-dom-map.js.map +1 -0
- package/dist/renderer/for-commit-removal.js +36 -0
- package/dist/renderer/for-commit-removal.js.map +1 -0
- package/dist/renderer/for-commit-reorder.js +89 -0
- package/dist/renderer/for-commit-reorder.js.map +1 -0
- package/dist/renderer/for-commit.js +6 -188
- package/dist/renderer/for-commit.js.map +1 -1
- package/dist/renderer/index.js +28 -16
- package/dist/renderer/index.js.map +1 -1
- package/dist/renderer/keyed-children.js +32 -0
- package/dist/renderer/keyed-children.js.map +1 -0
- package/dist/renderer/keyed.js +2 -15
- package/dist/renderer/keyed.js.map +1 -1
- package/dist/renderer/namespaces.js +23 -0
- package/dist/renderer/namespaces.js.map +1 -0
- package/dist/renderer/prop-bindings.js +280 -0
- package/dist/renderer/prop-bindings.js.map +1 -0
- package/dist/renderer/reactive-child-dom.js +133 -0
- package/dist/renderer/reactive-child-dom.js.map +1 -0
- package/dist/renderer/reactive-child-sources.js +184 -0
- package/dist/renderer/reactive-child-sources.js.map +1 -0
- package/dist/renderer/reactive-children.js +294 -0
- package/dist/renderer/reactive-children.js.map +1 -0
- package/dist/renderer/reconcile-commit.js +38 -0
- package/dist/renderer/reconcile-commit.js.map +1 -0
- package/dist/renderer/reconcile-fastpaths.js +106 -0
- package/dist/renderer/reconcile-fastpaths.js.map +1 -0
- package/dist/renderer/reconcile-resolution.js +187 -0
- package/dist/renderer/reconcile-resolution.js.map +1 -0
- package/dist/renderer/reconcile.js +9 -371
- package/dist/renderer/reconcile.js.map +1 -1
- package/dist/renderer/retained-element-rollback.js +276 -0
- package/dist/renderer/retained-element-rollback.js.map +1 -0
- package/dist/renderer/stable-patch.js +82 -0
- package/dist/renderer/stable-patch.js.map +1 -0
- package/dist/renderer/static-reuse.js +96 -0
- package/dist/renderer/static-reuse.js.map +1 -0
- package/dist/renderer/types.js +2 -1
- package/dist/renderer/utils.js +4 -4
- package/dist/renderer/utils.js.map +1 -1
- package/dist/resources/index.d.ts +3 -2
- package/dist/resources/index.js +5 -2
- package/dist/router/access.js +36 -0
- package/dist/router/access.js.map +1 -0
- package/dist/router/activity.d.ts +10 -0
- package/dist/router/activity.d.ts.map +1 -0
- package/dist/router/activity.js +89 -0
- package/dist/router/activity.js.map +1 -0
- package/dist/router/authoring.d.ts +22 -0
- package/dist/router/authoring.d.ts.map +1 -0
- package/dist/router/authoring.js +198 -0
- package/dist/router/authoring.js.map +1 -0
- package/dist/router/index.d.ts +12 -4
- package/dist/router/index.js +10 -3
- package/dist/router/internal-types.d.ts +31 -0
- package/dist/router/internal-types.d.ts.map +1 -0
- package/dist/router/lazy.d.ts +19 -0
- package/dist/router/lazy.d.ts.map +1 -0
- package/dist/router/lazy.js +52 -0
- package/dist/router/lazy.js.map +1 -0
- package/dist/router/manifest.d.ts +10 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +49 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/navigate.d.ts +4 -51
- package/dist/router/navigate.d.ts.map +1 -1
- package/dist/router/navigate.js +16 -459
- package/dist/router/navigate.js.map +1 -1
- package/dist/router/navigation-registry.d.ts +32 -0
- package/dist/router/navigation-registry.d.ts.map +1 -0
- package/dist/router/navigation-registry.js +105 -0
- package/dist/router/navigation-registry.js.map +1 -0
- package/dist/router/navigation-scroll.d.ts +14 -0
- package/dist/router/navigation-scroll.d.ts.map +1 -0
- package/dist/router/navigation-scroll.js +93 -0
- package/dist/router/navigation-scroll.js.map +1 -0
- package/dist/router/navigation-targets.d.ts +31 -0
- package/dist/router/navigation-targets.d.ts.map +1 -0
- package/dist/router/navigation-targets.js +253 -0
- package/dist/router/navigation-targets.js.map +1 -0
- package/dist/router/policy.d.ts +7 -1
- package/dist/router/policy.d.ts.map +1 -1
- package/dist/router/policy.js +27 -9
- package/dist/router/policy.js.map +1 -1
- package/dist/router/rendering.d.ts +10 -0
- package/dist/router/rendering.d.ts.map +1 -0
- package/dist/router/rendering.js +45 -0
- package/dist/router/rendering.js.map +1 -0
- package/dist/router/resolution.d.ts +17 -0
- package/dist/router/resolution.d.ts.map +1 -0
- package/dist/router/resolution.js +253 -0
- package/dist/router/resolution.js.map +1 -0
- package/dist/router/route-query.d.ts +17 -0
- package/dist/router/route-query.d.ts.map +1 -0
- package/dist/router/route-query.js +47 -0
- package/dist/router/route-query.js.map +1 -0
- package/dist/router/route.d.ts +8 -149
- package/dist/router/route.js +8 -854
- package/dist/router/store.d.ts +50 -0
- package/dist/router/store.d.ts.map +1 -0
- package/dist/router/store.js +171 -0
- package/dist/router/store.js.map +1 -0
- package/dist/runtime/access.js +45 -0
- package/dist/runtime/access.js.map +1 -0
- package/dist/runtime/child-scope.d.ts +1 -1
- package/dist/runtime/child-scope.js +4 -1
- package/dist/runtime/child-scope.js.map +1 -1
- package/dist/runtime/component-cleanup.d.ts +16 -0
- package/dist/runtime/component-cleanup.d.ts.map +1 -0
- package/dist/runtime/component-cleanup.js +70 -0
- package/dist/runtime/component-cleanup.js.map +1 -0
- package/dist/runtime/component-commit.js +165 -0
- package/dist/runtime/component-commit.js.map +1 -0
- package/dist/runtime/component-contracts.js +5 -0
- package/dist/runtime/component-facade.d.ts +5 -0
- package/dist/runtime/component-facade.js +4 -0
- package/dist/runtime/component-internal.d.ts +100 -0
- package/dist/runtime/component-internal.d.ts.map +1 -0
- package/dist/runtime/component-internal.js +219 -0
- package/dist/runtime/component-internal.js.map +1 -0
- package/dist/runtime/component-lifecycle.d.ts +49 -0
- package/dist/runtime/component-lifecycle.d.ts.map +1 -0
- package/dist/runtime/component-lifecycle.js +176 -0
- package/dist/runtime/component-lifecycle.js.map +1 -0
- package/dist/runtime/component-scope.d.ts +55 -0
- package/dist/runtime/component-scope.d.ts.map +1 -0
- package/dist/runtime/component-scope.js +154 -0
- package/dist/runtime/component-scope.js.map +1 -0
- package/dist/runtime/component.d.ts +4 -152
- package/dist/runtime/component.js +4 -692
- package/dist/runtime/context.d.ts +1 -1
- package/dist/runtime/context.js +6 -4
- package/dist/runtime/context.js.map +1 -1
- package/dist/runtime/control.d.ts +3 -3
- package/dist/runtime/control.js +2 -1
- package/dist/runtime/control.js.map +1 -1
- package/dist/runtime/derive.d.ts.map +1 -1
- package/dist/runtime/derive.js +6 -5
- package/dist/runtime/derive.js.map +1 -1
- package/dist/runtime/effect.d.ts +1 -1
- package/dist/runtime/effect.d.ts.map +1 -1
- package/dist/runtime/effect.js +2 -2
- package/dist/runtime/effect.js.map +1 -1
- package/dist/runtime/events.js +3 -3
- package/dist/runtime/events.js.map +1 -1
- package/dist/runtime/fastlane.js +13 -27
- package/dist/runtime/fastlane.js.map +1 -1
- package/dist/runtime/for-bench.d.ts +1 -1
- package/dist/runtime/for-bench.js +1 -4
- package/dist/runtime/for-bench.js.map +1 -1
- package/dist/runtime/for-internal.d.ts +43 -0
- package/dist/runtime/for-internal.d.ts.map +1 -0
- package/dist/runtime/for-internal.js +98 -0
- package/dist/runtime/for-internal.js.map +1 -0
- package/dist/runtime/for-reconcile.d.ts +8 -0
- package/dist/runtime/for-reconcile.d.ts.map +1 -0
- package/dist/runtime/for-reconcile.js +389 -0
- package/dist/runtime/for-reconcile.js.map +1 -0
- package/dist/runtime/for-scopes.d.ts +26 -0
- package/dist/runtime/for-scopes.d.ts.map +1 -0
- package/dist/runtime/for-scopes.js +160 -0
- package/dist/runtime/for-scopes.js.map +1 -0
- package/dist/runtime/for-signals.d.ts +30 -0
- package/dist/runtime/for-signals.d.ts.map +1 -0
- package/dist/runtime/for-signals.js +139 -0
- package/dist/runtime/for-signals.js.map +1 -0
- package/dist/runtime/for.d.ts +4 -66
- package/dist/runtime/for.js +5 -773
- package/dist/runtime/lifecycle-operations.d.ts +31 -0
- package/dist/runtime/lifecycle-operations.d.ts.map +1 -0
- package/dist/runtime/lifecycle-operations.js +195 -0
- package/dist/runtime/lifecycle-operations.js.map +1 -0
- package/dist/runtime/operations.d.ts +3 -40
- package/dist/runtime/operations.js +2 -357
- package/dist/runtime/readable.d.ts +2 -3
- package/dist/runtime/readable.d.ts.map +1 -1
- package/dist/runtime/readable.js +6 -5
- package/dist/runtime/readable.js.map +1 -1
- package/dist/runtime/resource-cell.js +2 -2
- package/dist/runtime/resource-cell.js.map +1 -1
- package/dist/runtime/resource-operation.d.ts +13 -0
- package/dist/runtime/resource-operation.d.ts.map +1 -0
- package/dist/runtime/resource-operation.js +170 -0
- package/dist/runtime/resource-operation.js.map +1 -0
- package/dist/runtime/runtime.d.ts +42 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +59 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime/scheduler.d.ts +5 -1
- package/dist/runtime/scheduler.d.ts.map +1 -1
- package/dist/runtime/scheduler.js +17 -17
- package/dist/runtime/scheduler.js.map +1 -1
- package/dist/runtime/selector.js +4 -3
- package/dist/runtime/selector.js.map +1 -1
- package/dist/runtime/snapshot-source.d.ts +1 -1
- package/dist/runtime/snapshot-source.js +1 -1
- package/dist/runtime/state.js +2 -1
- package/dist/runtime/state.js.map +1 -1
- package/dist/ssg/batch-render.js +2 -1
- package/dist/ssg/batch-render.js.map +1 -1
- package/dist/ssg/create-static-gen.d.ts +9 -3
- package/dist/ssg/create-static-gen.d.ts.map +1 -1
- package/dist/ssg/create-static-gen.js +12 -99
- package/dist/ssg/create-static-gen.js.map +1 -1
- package/dist/ssg/generation-plan.js +70 -0
- package/dist/ssg/generation-plan.js.map +1 -0
- package/dist/ssg/incremental-manifest.js +1 -1
- package/dist/ssg/static-routes.js +101 -0
- package/dist/ssg/static-routes.js.map +1 -0
- package/dist/ssg/types.d.ts +15 -7
- package/dist/ssg/types.d.ts.map +1 -1
- package/dist/ssr/boundaries.js +113 -0
- package/dist/ssr/boundaries.js.map +1 -0
- package/dist/ssr/component-runtime.js +111 -0
- package/dist/ssr/component-runtime.js.map +1 -0
- package/dist/ssr/context.d.ts +3 -1
- package/dist/ssr/context.d.ts.map +1 -1
- package/dist/ssr/context.js +9 -2
- package/dist/ssr/context.js.map +1 -1
- package/dist/ssr/errors.d.ts +2 -0
- package/dist/ssr/errors.js +11 -1
- package/dist/ssr/errors.js.map +1 -1
- package/dist/ssr/escape.js +3 -3
- package/dist/ssr/escape.js.map +1 -1
- package/dist/ssr/hydration-data.js +10 -0
- package/dist/ssr/hydration-data.js.map +1 -0
- package/dist/ssr/hydration-verify.d.ts +12 -0
- package/dist/ssr/hydration-verify.d.ts.map +1 -0
- package/dist/ssr/hydration-verify.js +144 -0
- package/dist/ssr/hydration-verify.js.map +1 -0
- package/dist/ssr/index-internal.d.ts +15 -0
- package/dist/ssr/index-internal.d.ts.map +1 -0
- package/dist/ssr/index-internal.js +19 -0
- package/dist/ssr/index-internal.js.map +1 -0
- package/dist/ssr/index.d.ts +5 -57
- package/dist/ssr/index.js +3 -738
- package/dist/ssr/render-keys.js +9 -32
- package/dist/ssr/render-keys.js.map +1 -1
- package/dist/ssr/render-resolved.d.ts +1 -1
- package/dist/ssr/render-resolved.d.ts.map +1 -1
- package/dist/ssr/render-resolved.js +4 -2
- package/dist/ssr/render-resolved.js.map +1 -1
- package/dist/ssr/render-sync.d.ts +21 -0
- package/dist/ssr/render-sync.d.ts.map +1 -0
- package/dist/ssr/render-sync.js +275 -0
- package/dist/ssr/render-sync.js.map +1 -0
- package/dist/ssr/route-policy-resolution.js +77 -0
- package/dist/ssr/route-policy-resolution.js.map +1 -0
- package/dist/ssr/route-render.d.ts +77 -0
- package/dist/ssr/route-render.d.ts.map +1 -0
- package/dist/ssr/route-render.js +119 -0
- package/dist/ssr/route-render.js.map +1 -0
- package/dist/ssr/sink.d.ts +26 -0
- package/dist/ssr/sink.d.ts.map +1 -0
- package/dist/ssr/types.d.ts +1 -0
- package/dist/ssr/types.d.ts.map +1 -1
- package/dist/ssr/verify-hydration.js.map +1 -1
- package/dist/testing/index.d.ts +1 -2
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +2 -1
- package/dist/testing/index.js.map +1 -1
- package/package.json +4 -3
- package/dist/data/index.d.ts.map +0 -1
- package/dist/data/index.js.map +0 -1
- package/dist/renderer/dom.js.map +0 -1
- package/dist/router/route.d.ts.map +0 -1
- package/dist/router/route.js.map +0 -1
- package/dist/runtime/component.d.ts.map +0 -1
- package/dist/runtime/component.js.map +0 -1
- package/dist/runtime/for.d.ts.map +0 -1
- package/dist/runtime/for.js.map +0 -1
- package/dist/runtime/operations.d.ts.map +0 -1
- package/dist/runtime/operations.js.map +0 -1
- package/dist/runtime/ssr-bridge.js +0 -24
- package/dist/runtime/ssr-bridge.js.map +0 -1
- package/dist/ssr/index.d.ts.map +0 -1
- package/dist/ssr/index.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ReadableSource } from "./readable.js";
|
|
2
|
+
import { ComponentInstance } from "./component-internal.js";
|
|
3
|
+
import { ChildScope } from "./child-scope.js";
|
|
4
|
+
|
|
5
|
+
//#region src/runtime/for-signals.d.ts
|
|
6
|
+
type ForItemSignal<T> = ReadableSource<T> & (() => T) & {
|
|
7
|
+
peek(): T;
|
|
8
|
+
set(newValue: T, notifyReaders?: boolean): void;
|
|
9
|
+
};
|
|
10
|
+
type ForItemPropertySignal = ReadableSource<unknown> & (() => unknown) & {
|
|
11
|
+
peek(): unknown;
|
|
12
|
+
set(newValue: unknown, notifyReaders?: boolean): void;
|
|
13
|
+
};
|
|
14
|
+
type ForIndexSignal = ReadableSource<number> & (() => number) & {
|
|
15
|
+
peek(): number;
|
|
16
|
+
set(newValue: number | ((prev: number) => number), notifyReaders?: boolean): void;
|
|
17
|
+
};
|
|
18
|
+
declare function notifyForSignalReaders(source: ReadableSource<unknown>, skipInstance?: ComponentInstance | null): void;
|
|
19
|
+
declare function createForIndexSignal(initialIndex: number): ForIndexSignal;
|
|
20
|
+
declare function syncForIndexSignal(indexSignal: ForIndexSignal, nextIndex: number): boolean;
|
|
21
|
+
declare function createForItemSignal<T>(initialItem: T): ForItemSignal<T>;
|
|
22
|
+
declare function readForItemProperty(item: unknown, prop: PropertyKey): unknown;
|
|
23
|
+
declare function haveSameOwnKeys(previousItem: unknown, nextItem: unknown): boolean;
|
|
24
|
+
declare function scopeReadsSource(scope: ChildScope, source: ReadableSource<unknown>): boolean;
|
|
25
|
+
declare function removeForParentReaders(parentInstance: ComponentInstance | null, source: ReadableSource<unknown>): void;
|
|
26
|
+
declare function canProxyForItem(item: unknown): item is object;
|
|
27
|
+
declare function createReactiveForItem<T>(itemSignal: ForItemSignal<T>, propertySignals: Map<PropertyKey, ForItemPropertySignal>): T;
|
|
28
|
+
//#endregion
|
|
29
|
+
export { ForIndexSignal, ForItemPropertySignal, ForItemSignal };
|
|
30
|
+
//# sourceMappingURL=for-signals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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,iBAMpC,qBAAA,IACd,UAAA,EAAY,aAAA,CAAc,CAAA,GAC1B,eAAA,EAAiB,GAAA,CAAI,WAAA,EAAa,qBAAA,IACjC,CAAA"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { markReactivePropsDirtySource, markReadableDerivedSubscribersDirty, notifyReadableReaders, recordReadableRead } from "./readable.js";
|
|
2
|
+
//#region src/runtime/for-signals.ts
|
|
3
|
+
function notifyForSignalReaders(source, skipInstance) {
|
|
4
|
+
markReadableDerivedSubscribersDirty(source);
|
|
5
|
+
markReactivePropsDirtySource(source);
|
|
6
|
+
notifyReadableReaders(source, skipInstance);
|
|
7
|
+
}
|
|
8
|
+
function createForIndexSignal(initialIndex) {
|
|
9
|
+
let indexValue = initialIndex;
|
|
10
|
+
const readers = /* @__PURE__ */ new Map();
|
|
11
|
+
const indexSignal = (() => {
|
|
12
|
+
indexSignal._hasBeenRead = true;
|
|
13
|
+
recordReadableRead(indexSignal);
|
|
14
|
+
return indexValue;
|
|
15
|
+
});
|
|
16
|
+
indexSignal._readers = readers;
|
|
17
|
+
indexSignal.peek = () => indexValue;
|
|
18
|
+
indexSignal.set = (newValue, notifyReaders = true) => {
|
|
19
|
+
const nextValue = typeof newValue === "function" ? newValue(indexValue) : newValue;
|
|
20
|
+
if (nextValue !== indexValue) {
|
|
21
|
+
indexValue = nextValue;
|
|
22
|
+
if (notifyReaders) notifyForSignalReaders(indexSignal);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
indexSignal._hasBeenRead = false;
|
|
26
|
+
return indexSignal;
|
|
27
|
+
}
|
|
28
|
+
function syncForIndexSignal(indexSignal, nextIndex) {
|
|
29
|
+
if (indexSignal.peek() === nextIndex) return false;
|
|
30
|
+
indexSignal.set(nextIndex, indexSignal._hasBeenRead);
|
|
31
|
+
return indexSignal._hasBeenRead === true;
|
|
32
|
+
}
|
|
33
|
+
function createForItemSignal(initialItem) {
|
|
34
|
+
let itemValue = initialItem;
|
|
35
|
+
const readers = /* @__PURE__ */ new Map();
|
|
36
|
+
const itemSignal = (() => {
|
|
37
|
+
itemSignal._hasBeenRead = true;
|
|
38
|
+
recordReadableRead(itemSignal);
|
|
39
|
+
return itemValue;
|
|
40
|
+
});
|
|
41
|
+
itemSignal._readers = readers;
|
|
42
|
+
itemSignal.peek = () => itemValue;
|
|
43
|
+
itemSignal.set = (newValue, notifyReaders = true) => {
|
|
44
|
+
if (Object.is(itemValue, newValue)) return;
|
|
45
|
+
itemValue = newValue;
|
|
46
|
+
if (notifyReaders) notifyForSignalReaders(itemSignal);
|
|
47
|
+
};
|
|
48
|
+
itemSignal._hasBeenRead = false;
|
|
49
|
+
return itemSignal;
|
|
50
|
+
}
|
|
51
|
+
function createForItemPropertySignal(initialValue) {
|
|
52
|
+
let propertyValue = initialValue;
|
|
53
|
+
const readers = /* @__PURE__ */ new Map();
|
|
54
|
+
const propertySignal = (() => {
|
|
55
|
+
propertySignal._hasBeenRead = true;
|
|
56
|
+
recordReadableRead(propertySignal);
|
|
57
|
+
return propertyValue;
|
|
58
|
+
});
|
|
59
|
+
propertySignal._readers = readers;
|
|
60
|
+
propertySignal.peek = () => propertyValue;
|
|
61
|
+
propertySignal.set = (newValue, notifyReaders = true) => {
|
|
62
|
+
if (Object.is(propertyValue, newValue)) return;
|
|
63
|
+
propertyValue = newValue;
|
|
64
|
+
if (notifyReaders) notifyForSignalReaders(propertySignal);
|
|
65
|
+
};
|
|
66
|
+
propertySignal._hasBeenRead = false;
|
|
67
|
+
return propertySignal;
|
|
68
|
+
}
|
|
69
|
+
function readForItemProperty(item, prop) {
|
|
70
|
+
return Reflect.get(Object(item), prop);
|
|
71
|
+
}
|
|
72
|
+
function haveSameOwnKeys(previousItem, nextItem) {
|
|
73
|
+
const previousKeys = Reflect.ownKeys(Object(previousItem));
|
|
74
|
+
const nextKeys = Reflect.ownKeys(Object(nextItem));
|
|
75
|
+
if (previousKeys.length !== nextKeys.length) return false;
|
|
76
|
+
for (let i = 0; i < previousKeys.length; i += 1) if (previousKeys[i] !== nextKeys[i]) return false;
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
function scopeReadsSource(scope, source) {
|
|
80
|
+
return source._readers?.has(scope.componentInstance) ?? false;
|
|
81
|
+
}
|
|
82
|
+
function isForParentReader(parentInstance, reader) {
|
|
83
|
+
let current = parentInstance;
|
|
84
|
+
while (current) {
|
|
85
|
+
if (current === reader) return true;
|
|
86
|
+
current = current.parentInstance;
|
|
87
|
+
}
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
function removeForParentReaders(parentInstance, source) {
|
|
91
|
+
const readers = source._readers;
|
|
92
|
+
if (!readers || readers.size === 0) return;
|
|
93
|
+
for (const reader of readers.keys()) if (isForParentReader(parentInstance, reader)) readers.delete(reader);
|
|
94
|
+
}
|
|
95
|
+
function getOrCreateForItemPropertySignal(item, propertySignals, prop) {
|
|
96
|
+
const existingSignal = propertySignals.get(prop);
|
|
97
|
+
if (existingSignal) return existingSignal;
|
|
98
|
+
const propertySignal = createForItemPropertySignal(readForItemProperty(item, prop));
|
|
99
|
+
propertySignals.set(prop, propertySignal);
|
|
100
|
+
return propertySignal;
|
|
101
|
+
}
|
|
102
|
+
function canProxyForItem(item) {
|
|
103
|
+
return typeof item === "object" && item !== null || typeof item === "function";
|
|
104
|
+
}
|
|
105
|
+
function createReactiveForItem(itemSignal, propertySignals) {
|
|
106
|
+
return new Proxy(Object.create(null), {
|
|
107
|
+
get(target, prop, receiver) {
|
|
108
|
+
if (Reflect.getOwnPropertyDescriptor(target, prop)) return Reflect.get(target, prop, receiver);
|
|
109
|
+
const currentItem = itemSignal.peek();
|
|
110
|
+
if (typeof prop !== "symbol") return getOrCreateForItemPropertySignal(currentItem, propertySignals, prop)();
|
|
111
|
+
recordReadableRead(itemSignal);
|
|
112
|
+
return Reflect.get(Object(currentItem), prop, receiver);
|
|
113
|
+
},
|
|
114
|
+
has(target, prop) {
|
|
115
|
+
recordReadableRead(itemSignal);
|
|
116
|
+
return prop in target || prop in Object(itemSignal.peek());
|
|
117
|
+
},
|
|
118
|
+
ownKeys(target) {
|
|
119
|
+
recordReadableRead(itemSignal);
|
|
120
|
+
const keys = new Set(Reflect.ownKeys(target));
|
|
121
|
+
for (const key of Reflect.ownKeys(Object(itemSignal.peek()))) keys.add(key);
|
|
122
|
+
return Array.from(keys);
|
|
123
|
+
},
|
|
124
|
+
getOwnPropertyDescriptor(target, prop) {
|
|
125
|
+
recordReadableRead(itemSignal);
|
|
126
|
+
const ownDescriptor = Reflect.getOwnPropertyDescriptor(target, prop);
|
|
127
|
+
if (ownDescriptor) return ownDescriptor;
|
|
128
|
+
return Object.getOwnPropertyDescriptor(Object(itemSignal.peek()), prop);
|
|
129
|
+
},
|
|
130
|
+
getPrototypeOf() {
|
|
131
|
+
recordReadableRead(itemSignal);
|
|
132
|
+
return Object.getPrototypeOf(Object(itemSignal.peek()));
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
//#endregion
|
|
137
|
+
export { canProxyForItem, createForIndexSignal, createForItemSignal, createReactiveForItem, haveSameOwnKeys, notifyForSignalReaders, readForItemProperty, removeForParentReaders, scopeReadsSource, syncForIndexSignal };
|
|
138
|
+
|
|
139
|
+
//# sourceMappingURL=for-signals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 === 'object' && item !== null) || typeof item === 'function'\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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"}
|
package/dist/runtime/for.d.ts
CHANGED
|
@@ -1,66 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
import { FineGrainedEffectHandle } from "./effect.js";
|
|
6
|
-
import { getBenchMetrics, isBenchMetricScopeActive, recordBenchCounter, recordBenchEvent, recordBenchTiming, resetBenchMetrics, withBenchMetricScope } from "./for-bench.js";
|
|
7
|
-
import { VNode } from "../common/vnode.js";
|
|
8
|
-
|
|
9
|
-
//#region src/runtime/for.d.ts
|
|
10
|
-
interface ForItemInstance<T> {
|
|
11
|
-
key: string | number;
|
|
12
|
-
item: T;
|
|
13
|
-
reactiveItem: T;
|
|
14
|
-
itemSignal: ForItemSignal<T> | null;
|
|
15
|
-
itemPropertySignals: Map<PropertyKey, ForItemPropertySignal> | null;
|
|
16
|
-
indexSignal: ForIndexSignal;
|
|
17
|
-
scope: ChildScope;
|
|
18
|
-
}
|
|
19
|
-
type ForItemSignal<T> = ReadableSource<T> & (() => T) & {
|
|
20
|
-
peek(): T;
|
|
21
|
-
set(newValue: T, notifyReaders?: boolean): void;
|
|
22
|
-
};
|
|
23
|
-
type ForItemPropertySignal = ReadableSource<unknown> & (() => unknown) & {
|
|
24
|
-
peek(): unknown;
|
|
25
|
-
set(newValue: unknown, notifyReaders?: boolean): void;
|
|
26
|
-
};
|
|
27
|
-
type ForIndexSignal = ReadableSource<number> & (() => number) & {
|
|
28
|
-
peek(): number;
|
|
29
|
-
set(newValue: number | ((prev: number) => number), notifyReaders?: boolean): void;
|
|
30
|
-
};
|
|
31
|
-
type ForCommitStrategy = 'APPEND' | 'TRUNCATE' | 'NO_REORDER' | 'SWAP' | 'FULL_KEYED';
|
|
32
|
-
interface ForState<T> {
|
|
33
|
-
kind: 'for';
|
|
34
|
-
currentItems: T[];
|
|
35
|
-
eachSource: ForEachSource<T>;
|
|
36
|
-
fallback: VNode | null;
|
|
37
|
-
fallbackScope: ChildScope | null;
|
|
38
|
-
items: Map<string | number, ForItemInstance<T>>;
|
|
39
|
-
orderedKeys: Array<string | number>;
|
|
40
|
-
orderedItems: ForItemInstance<T>[];
|
|
41
|
-
orderedVNodes: VNode[];
|
|
42
|
-
byFn: NonNullable<ForProps<T>['by']> | ((item: T, index: number) => number);
|
|
43
|
-
renderFn: (item: T, index: () => number) => VNode;
|
|
44
|
-
parentInstance: ComponentInstance | null;
|
|
45
|
-
lastCommitStrategy: ForCommitStrategy;
|
|
46
|
-
lastRemovedNodes: Node[];
|
|
47
|
-
pendingDirtyIndices: number[] | null;
|
|
48
|
-
pendingSwapIndices: [number, number] | null;
|
|
49
|
-
pendingMoveOnly: boolean;
|
|
50
|
-
_hasResolvedItemDom: boolean;
|
|
51
|
-
_needsSourceReconcile: boolean;
|
|
52
|
-
_sourceEffect: FineGrainedEffectHandle<T[]> | null;
|
|
53
|
-
_suspendSourceCommit: boolean;
|
|
54
|
-
_enqueueBoundaryCommit?: (() => void) | null;
|
|
55
|
-
_hasPendingBoundaryCommit?: boolean;
|
|
56
|
-
devKeyKinds?: Map<string, 'number' | 'string'>;
|
|
57
|
-
}
|
|
58
|
-
declare function createForState<T>(eachSource: ForEachSource<T>, byFn: ForState<T>['byFn'], renderFn: (item: T, index: () => number) => VNode, fallback: VNode | null): ForState<T>;
|
|
59
|
-
declare function useForState<T>(eachSource: ForEachSource<T>, byFn: ForState<T>['byFn'], renderFn: (item: T, index: () => number) => VNode, fallback: VNode | null): ForState<T>;
|
|
60
|
-
declare function createItemInstance<T>(key: string | number, item: T, index: number, forState: ForState<T>): ForItemInstance<T>;
|
|
61
|
-
declare function reconcileForItems<T>(forState: ForState<T>, newArray: T[]): VNode[];
|
|
62
|
-
declare function evaluateForState<T>(forState: ForState<T>): VNode[];
|
|
63
|
-
declare function clearForDomUpdateState<T>(forState: ForState<T>): void;
|
|
64
|
-
//#endregion
|
|
65
|
-
export { ForState };
|
|
66
|
-
//# sourceMappingURL=for.d.ts.map
|
|
1
|
+
import { ForItemInstance } from "./for-scopes.js";
|
|
2
|
+
import { reconcileForItems } from "./for-reconcile.js";
|
|
3
|
+
import { ForCommitStrategy, ForState } from "./for-internal.js";
|
|
4
|
+
export { ForCommitStrategy, ForState, reconcileForItems };
|