@askrjs/askr 0.0.27 → 0.0.29
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 +55 -147
- package/dist/_virtual/_rolldown/runtime.js +7 -0
- package/dist/bench/components/benchmark-row.d.ts +20 -0
- package/dist/bench/components/benchmark-row.d.ts.map +1 -0
- package/dist/bench/components/benchmark-row.js +42 -0
- package/dist/bench/components/benchmark-row.js.map +1 -0
- package/dist/bench/components/benchmark-table.js +25 -0
- package/dist/bench/components/benchmark-table.js.map +1 -0
- package/dist/benchmark.d.ts +22 -0
- package/dist/benchmark.d.ts.map +1 -0
- package/dist/benchmark.js +64 -1
- package/dist/benchmark.js.map +1 -0
- package/dist/bin/askr-ssg.d.ts +28 -0
- package/dist/bin/askr-ssg.d.ts.map +1 -0
- package/dist/bin/askr-ssg.js +171 -0
- package/dist/bin/askr-ssg.js.map +1 -0
- package/dist/boot/index.d.ts +64 -42
- package/dist/boot/index.d.ts.map +1 -1
- package/dist/boot/index.js +416 -2
- package/dist/boot/index.js.map +1 -0
- package/dist/common/component.d.ts +14 -13
- package/dist/common/component.d.ts.map +1 -1
- package/dist/common/control.d.ts +13 -0
- package/dist/common/control.d.ts.map +1 -0
- package/dist/common/control.js +14 -0
- package/dist/common/control.js.map +1 -0
- package/dist/common/env.js +47 -0
- package/dist/common/env.js.map +1 -0
- package/dist/common/jsx.d.ts +17 -15
- package/dist/common/jsx.d.ts.map +1 -1
- package/dist/common/jsx.js +8 -1
- package/dist/common/jsx.js.map +1 -0
- package/dist/common/props.d.ts +14 -11
- package/dist/common/props.d.ts.map +1 -1
- package/dist/common/router.d.ts +190 -32
- package/dist/common/router.d.ts.map +1 -1
- package/dist/common/ssr-errors.d.ts +6 -3
- package/dist/common/ssr-errors.d.ts.map +1 -1
- package/dist/common/ssr-errors.js +16 -1
- package/dist/common/ssr-errors.js.map +1 -0
- package/dist/common/ssr.d.ts +12 -9
- package/dist/common/ssr.d.ts.map +1 -1
- package/dist/common/vnode.d.ts +17 -15
- package/dist/common/vnode.d.ts.map +1 -1
- package/dist/common/vnode.js +10 -1
- package/dist/common/vnode.js.map +1 -0
- package/dist/components/link.d.ts +37 -25
- package/dist/components/link.d.ts.map +1 -1
- package/dist/components/link.js +64 -1
- package/dist/components/link.js.map +1 -0
- package/dist/control/case.d.ts +17 -0
- package/dist/control/case.d.ts.map +1 -0
- package/dist/control/case.js +69 -0
- package/dist/control/case.js.map +1 -0
- package/dist/control/for.d.ts +23 -0
- package/dist/control/for.d.ts.map +1 -0
- package/dist/control/for.js +62 -0
- package/dist/control/for.js.map +1 -0
- package/dist/control/index.d.ts +4 -0
- package/dist/control/index.js +4 -0
- package/dist/control/shared.js +20 -0
- package/dist/control/shared.js.map +1 -0
- package/dist/control/show.d.ts +14 -0
- package/dist/control/show.d.ts.map +1 -0
- package/dist/control/show.js +33 -0
- package/dist/control/show.js.map +1 -0
- package/dist/dev/invariant.js +29 -2
- package/dist/dev/invariant.js.map +1 -0
- package/dist/dev/logger.js +37 -1
- package/dist/dev/logger.js.map +1 -0
- package/dist/foundations/icon/icon.d.ts +53 -0
- package/dist/foundations/icon/icon.d.ts.map +1 -0
- package/dist/foundations/icon/icon.js +88 -0
- package/dist/foundations/icon/icon.js.map +1 -0
- package/dist/foundations/icon/icon.types.d.ts +21 -0
- package/dist/foundations/icon/icon.types.d.ts.map +1 -0
- package/dist/foundations/index.d.ts +10 -3
- package/dist/foundations/index.js +9 -1
- package/dist/foundations/interactions/interaction-policy.js +93 -1
- package/dist/foundations/interactions/interaction-policy.js.map +1 -0
- package/dist/foundations/interactions/pressable.js +51 -1
- package/dist/foundations/interactions/pressable.js.map +1 -0
- package/dist/foundations/structures/collection.d.ts +25 -40
- package/dist/foundations/structures/collection.d.ts.map +1 -1
- package/dist/foundations/structures/collection.js +51 -1
- package/dist/foundations/structures/collection.js.map +1 -0
- package/dist/foundations/structures/layer.d.ts +47 -68
- package/dist/foundations/structures/layer.d.ts.map +1 -1
- package/dist/foundations/structures/layer.js +81 -1
- package/dist/foundations/structures/layer.js.map +1 -0
- package/dist/foundations/structures/layout.d.ts +6 -3
- package/dist/foundations/structures/layout.d.ts.map +1 -1
- package/dist/foundations/structures/layout.js +13 -1
- package/dist/foundations/structures/layout.js.map +1 -0
- package/dist/foundations/structures/portal.d.ts +17 -10
- package/dist/foundations/structures/portal.d.ts.map +1 -1
- package/dist/foundations/structures/portal.js +105 -1
- package/dist/foundations/structures/portal.js.map +1 -0
- package/dist/foundations/structures/presence.d.ts +11 -5
- package/dist/foundations/structures/presence.d.ts.map +1 -1
- package/dist/foundations/structures/presence.js +39 -1
- package/dist/foundations/structures/presence.js.map +1 -0
- package/dist/foundations/structures/slot.d.ts +11 -8
- package/dist/foundations/structures/slot.d.ts.map +1 -1
- package/dist/foundations/structures/slot.js +41 -1
- package/dist/foundations/structures/slot.js.map +1 -0
- package/dist/foundations/structures.d.ts +7 -14
- package/dist/foundations/structures.js +6 -1
- package/dist/foundations/utilities/aria.js +11 -1
- package/dist/foundations/utilities/aria.js.map +1 -0
- package/dist/foundations/utilities/compose-handlers.js +20 -1
- package/dist/foundations/utilities/compose-handlers.js.map +1 -0
- package/dist/foundations/utilities/compose-ref.d.ts +7 -4
- package/dist/foundations/utilities/compose-ref.d.ts.map +1 -1
- package/dist/foundations/utilities/compose-ref.js +18 -1
- package/dist/foundations/utilities/compose-ref.js.map +1 -0
- package/dist/foundations/utilities/merge-props.js +49 -1
- package/dist/foundations/utilities/merge-props.js.map +1 -0
- package/dist/fx/fx.d.ts +24 -21
- package/dist/fx/fx.d.ts.map +1 -1
- package/dist/fx/fx.js +212 -1
- package/dist/fx/fx.js.map +1 -0
- package/dist/fx/index.d.ts +4 -7
- package/dist/fx/index.js +4 -1
- package/dist/fx/noop.js +9 -1
- package/dist/fx/noop.js.map +1 -0
- package/dist/fx/timing.d.ts +24 -21
- package/dist/fx/timing.d.ts.map +1 -1
- package/dist/fx/timing.js +236 -1
- package/dist/fx/timing.js.map +1 -0
- package/dist/index.d.ts +21 -20
- package/dist/index.js +34 -1
- package/dist/index.js.map +1 -0
- package/dist/jsx/index.d.ts +1 -4
- package/dist/jsx/index.js +3 -1
- package/dist/jsx/types.d.ts +18 -25
- package/dist/jsx/types.d.ts.map +1 -1
- package/dist/jsx/types.js +1 -1
- package/dist/jsx/utils.d.ts +4 -3
- package/dist/jsx/utils.d.ts.map +1 -1
- package/dist/jsx/utils.js +19 -1
- package/dist/jsx/utils.js.map +1 -0
- package/dist/jsx-dev-runtime.d.ts +8 -0
- package/dist/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/jsx-dev-runtime.js +32 -1
- package/dist/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx-runtime.d.ts +12 -0
- package/dist/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx-runtime.js +45 -1
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/jsx-runtime2.d.ts +2 -0
- package/dist/jsx-runtime2.js +3 -0
- package/dist/renderer/children.js +293 -0
- package/dist/renderer/children.js.map +1 -0
- package/dist/renderer/cleanup.js +150 -1
- package/dist/renderer/cleanup.js.map +1 -0
- package/dist/renderer/dom.js +2439 -1
- package/dist/renderer/dom.js.map +1 -0
- package/dist/renderer/env.js +1 -0
- package/dist/renderer/evaluate.js +450 -1
- package/dist/renderer/evaluate.js.map +1 -0
- package/dist/renderer/fastpath.js +145 -1
- package/dist/renderer/fastpath.js.map +1 -0
- package/dist/renderer/index.js +24 -1
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/keyed.js +119 -1
- package/dist/renderer/keyed.js.map +1 -0
- package/dist/renderer/reconcile.js +359 -1
- package/dist/renderer/reconcile.js.map +1 -0
- package/dist/renderer/types.js +1 -1
- package/dist/renderer/utils.js +220 -1
- package/dist/renderer/utils.js.map +1 -0
- package/dist/resources/index.d.ts +3 -9
- package/dist/resources/index.js +3 -1
- package/dist/router/index.d.ts +6 -10
- package/dist/router/index.js +5 -1
- package/dist/router/match.js +83 -1
- package/dist/router/match.js.map +1 -0
- package/dist/router/navigate.d.ts +20 -8
- package/dist/router/navigate.d.ts.map +1 -1
- package/dist/router/navigate.js +288 -1
- package/dist/router/navigate.js.map +1 -0
- package/dist/router/policy.d.ts +22 -0
- package/dist/router/policy.d.ts.map +1 -0
- package/dist/router/policy.js +116 -0
- package/dist/router/policy.js.map +1 -0
- package/dist/router/route-context.js +79 -0
- package/dist/router/route-context.js.map +1 -0
- package/dist/router/route.d.ts +101 -33
- package/dist/router/route.d.ts.map +1 -1
- package/dist/router/route.js +599 -1
- package/dist/router/route.js.map +1 -0
- package/dist/runtime/child-scope.d.ts +21 -0
- package/dist/runtime/child-scope.d.ts.map +1 -0
- package/dist/runtime/child-scope.js +77 -0
- package/dist/runtime/child-scope.js.map +1 -0
- package/dist/runtime/component.d.ts +67 -53
- package/dist/runtime/component.d.ts.map +1 -1
- package/dist/runtime/component.js +462 -1
- package/dist/runtime/component.js.map +1 -0
- package/dist/runtime/context.d.ts +28 -42
- package/dist/runtime/context.d.ts.map +1 -1
- package/dist/runtime/context.js +205 -1
- package/dist/runtime/context.js.map +1 -0
- package/dist/runtime/control.d.ts +43 -0
- package/dist/runtime/control.d.ts.map +1 -0
- package/dist/runtime/control.js +125 -0
- package/dist/runtime/control.js.map +1 -0
- package/dist/runtime/derive.d.ts +15 -6
- package/dist/runtime/derive.d.ts.map +1 -1
- package/dist/runtime/derive.js +134 -1
- package/dist/runtime/derive.js.map +1 -0
- package/dist/runtime/dev-namespace.js +57 -1
- package/dist/runtime/dev-namespace.js.map +1 -0
- package/dist/runtime/effect.d.ts +32 -0
- package/dist/runtime/effect.d.ts.map +1 -0
- package/dist/runtime/effect.js +146 -0
- package/dist/runtime/effect.js.map +1 -0
- package/dist/runtime/events.js +162 -1
- package/dist/runtime/events.js.map +1 -0
- package/dist/runtime/execution-model.js +15 -1
- package/dist/runtime/execution-model.js.map +1 -0
- package/dist/runtime/fastlane.js +204 -1
- package/dist/runtime/fastlane.js.map +1 -0
- package/dist/runtime/for-bench.d.ts +41 -0
- package/dist/runtime/for-bench.d.ts.map +1 -0
- package/dist/runtime/for-bench.js +173 -0
- package/dist/runtime/for-bench.js.map +1 -0
- package/dist/runtime/for.d.ts +62 -49
- package/dist/runtime/for.d.ts.map +1 -1
- package/dist/runtime/for.js +668 -1
- package/dist/runtime/for.js.map +1 -0
- package/dist/runtime/operations.d.ts +18 -15
- package/dist/runtime/operations.d.ts.map +1 -1
- package/dist/runtime/operations.js +209 -1
- package/dist/runtime/operations.js.map +1 -0
- package/dist/runtime/perf-metrics.js +64 -0
- package/dist/runtime/perf-metrics.js.map +1 -0
- package/dist/runtime/readable.d.ts +27 -0
- package/dist/runtime/readable.d.ts.map +1 -0
- package/dist/runtime/readable.js +118 -0
- package/dist/runtime/readable.js.map +1 -0
- package/dist/runtime/resource-cell.js +102 -1
- package/dist/runtime/resource-cell.js.map +1 -0
- package/dist/runtime/scheduler.d.ts +51 -35
- package/dist/runtime/scheduler.d.ts.map +1 -1
- package/dist/runtime/scheduler.js +328 -1
- package/dist/runtime/scheduler.js.map +1 -0
- package/dist/runtime/selector.d.ts +11 -0
- package/dist/runtime/selector.d.ts.map +1 -0
- package/dist/runtime/selector.js +188 -0
- package/dist/runtime/selector.js.map +1 -0
- package/dist/runtime/ssr-bridge.js +24 -1
- package/dist/runtime/ssr-bridge.js.map +1 -0
- package/dist/runtime/state.d.ts +11 -21
- package/dist/runtime/state.d.ts.map +1 -1
- package/dist/runtime/state.js +99 -1
- package/dist/runtime/state.js.map +1 -0
- package/dist/ssg/batch-render.d.ts +16 -0
- package/dist/ssg/batch-render.d.ts.map +1 -0
- package/dist/ssg/batch-render.js +84 -0
- package/dist/ssg/batch-render.js.map +1 -0
- package/dist/ssg/create-static-gen.d.ts +50 -0
- package/dist/ssg/create-static-gen.d.ts.map +1 -0
- package/dist/ssg/create-static-gen.js +282 -0
- package/dist/ssg/create-static-gen.js.map +1 -0
- package/dist/ssg/generate-metadata.d.ts +24 -0
- package/dist/ssg/generate-metadata.d.ts.map +1 -0
- package/dist/ssg/generate-metadata.js +94 -0
- package/dist/ssg/generate-metadata.js.map +1 -0
- package/dist/ssg/incremental-manifest.js +56 -0
- package/dist/ssg/incremental-manifest.js.map +1 -0
- package/dist/ssg/index.d.ts +8 -0
- package/dist/ssg/index.js +7 -0
- package/dist/ssg/resolve-ssg-data.d.ts +23 -0
- package/dist/ssg/resolve-ssg-data.d.ts.map +1 -0
- package/dist/ssg/resolve-ssg-data.js +46 -0
- package/dist/ssg/resolve-ssg-data.js.map +1 -0
- package/dist/ssg/route-utils.d.ts +16 -0
- package/dist/ssg/route-utils.d.ts.map +1 -0
- package/dist/ssg/route-utils.js +24 -0
- package/dist/ssg/route-utils.js.map +1 -0
- package/dist/ssg/types.d.ts +177 -0
- package/dist/ssg/types.d.ts.map +1 -0
- package/dist/ssg/write-static-files.d.ts +15 -0
- package/dist/ssg/write-static-files.d.ts.map +1 -0
- package/dist/ssg/write-static-files.js +73 -0
- package/dist/ssg/write-static-files.js.map +1 -0
- package/dist/ssr/attrs.js +93 -1
- package/dist/ssr/attrs.js.map +1 -0
- package/dist/ssr/context.d.ts +31 -32
- package/dist/ssr/context.d.ts.map +1 -1
- package/dist/ssr/context.js +63 -1
- package/dist/ssr/context.js.map +1 -0
- package/dist/ssr/errors.d.ts +6 -4
- package/dist/ssr/errors.d.ts.map +1 -1
- package/dist/ssr/errors.js +4 -1
- package/dist/ssr/errors.js.map +1 -0
- package/dist/ssr/escape.js +153 -1
- package/dist/ssr/escape.js.map +1 -0
- package/dist/ssr/index.d.ts +75 -46
- package/dist/ssr/index.d.ts.map +1 -1
- package/dist/ssr/index.js +543 -1
- package/dist/ssr/index.js.map +1 -0
- package/dist/ssr/render-keys.d.ts +27 -29
- package/dist/ssr/render-keys.d.ts.map +1 -1
- package/dist/ssr/render-keys.js +39 -1
- package/dist/ssr/render-keys.js.map +1 -0
- package/dist/ssr/sink.js +86 -1
- package/dist/ssr/sink.js.map +1 -0
- package/dist/ssr/stream-render.js +76 -1
- package/dist/ssr/stream-render.js.map +1 -0
- package/dist/ssr/types.d.ts +14 -13
- package/dist/ssr/types.d.ts.map +1 -1
- package/package.json +53 -48
- package/dist/_virtual/___vite-browser-external.js +0 -1
- package/dist/_virtual/__vite-browser-external.js +0 -1
- package/dist/_virtual/_commonjsHelpers.js +0 -1
- package/dist/_virtual/main.js +0 -1
- package/dist/_virtual/preload-helper.js +0 -1
- package/dist/bench/benchmark-entry.d.ts +0 -14
- package/dist/bench/benchmark-entry.d.ts.map +0 -1
- package/dist/common/errors.d.ts +0 -53
- package/dist/common/errors.d.ts.map +0 -1
- package/dist/common/index.d.ts +0 -14
- package/dist/common/index.d.ts.map +0 -1
- package/dist/dev/invariant.d.ts +0 -83
- package/dist/dev/invariant.d.ts.map +0 -1
- package/dist/dev/logger.d.ts +0 -13
- package/dist/dev/logger.d.ts.map +0 -1
- package/dist/dev/vite-plugin-askr.d.ts +0 -18
- package/dist/dev/vite-plugin-askr.d.ts.map +0 -1
- package/dist/dev/warnings.d.ts +0 -5
- package/dist/dev/warnings.d.ts.map +0 -1
- package/dist/for/for.d.ts +0 -16
- package/dist/for/for.d.ts.map +0 -1
- package/dist/for/for.js +0 -1
- package/dist/for/index.d.ts +0 -2
- package/dist/for/index.d.ts.map +0 -1
- package/dist/for/index.js +0 -1
- package/dist/foundations/core.d.ts +0 -23
- package/dist/foundations/core.d.ts.map +0 -1
- package/dist/foundations/core.js +0 -1
- package/dist/foundations/index.d.ts.map +0 -1
- package/dist/foundations/interactions/dismissable.d.ts +0 -58
- package/dist/foundations/interactions/dismissable.d.ts.map +0 -1
- package/dist/foundations/interactions/dismissable.js +0 -1
- package/dist/foundations/interactions/focusable.d.ts +0 -16
- package/dist/foundations/interactions/focusable.d.ts.map +0 -1
- package/dist/foundations/interactions/focusable.js +0 -1
- package/dist/foundations/interactions/hoverable.d.ts +0 -19
- package/dist/foundations/interactions/hoverable.d.ts.map +0 -1
- package/dist/foundations/interactions/hoverable.js +0 -1
- package/dist/foundations/interactions/index.d.ts +0 -5
- package/dist/foundations/interactions/index.d.ts.map +0 -1
- package/dist/foundations/interactions/interaction-policy.d.ts +0 -96
- package/dist/foundations/interactions/interaction-policy.d.ts.map +0 -1
- package/dist/foundations/interactions/pressable.d.ts +0 -54
- package/dist/foundations/interactions/pressable.d.ts.map +0 -1
- package/dist/foundations/interactions/roving-focus.d.ts +0 -117
- package/dist/foundations/interactions/roving-focus.d.ts.map +0 -1
- package/dist/foundations/interactions/roving-focus.js +0 -1
- package/dist/foundations/state/controllable.d.ts +0 -53
- package/dist/foundations/state/controllable.d.ts.map +0 -1
- package/dist/foundations/state/controllable.js +0 -1
- package/dist/foundations/state/index.d.ts +0 -2
- package/dist/foundations/state/index.d.ts.map +0 -1
- package/dist/foundations/structures/index.d.ts +0 -5
- package/dist/foundations/structures/index.d.ts.map +0 -1
- package/dist/foundations/structures.d.ts.map +0 -1
- package/dist/foundations/utilities/aria.d.ts +0 -13
- package/dist/foundations/utilities/aria.d.ts.map +0 -1
- package/dist/foundations/utilities/compose-handlers.d.ts +0 -34
- package/dist/foundations/utilities/compose-handlers.d.ts.map +0 -1
- package/dist/foundations/utilities/event-types.d.ts +0 -17
- package/dist/foundations/utilities/event-types.d.ts.map +0 -1
- package/dist/foundations/utilities/index.d.ts +0 -7
- package/dist/foundations/utilities/index.d.ts.map +0 -1
- package/dist/foundations/utilities/merge-props.d.ts +0 -2
- package/dist/foundations/utilities/merge-props.d.ts.map +0 -1
- package/dist/foundations/utilities/use-id.d.ts +0 -29
- package/dist/foundations/utilities/use-id.d.ts.map +0 -1
- package/dist/foundations/utilities/use-id.js +0 -1
- package/dist/fx/index.d.ts.map +0 -1
- package/dist/fx/noop.d.ts +0 -12
- package/dist/fx/noop.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/jsx/index.d.ts.map +0 -1
- package/dist/jsx/jsx-dev-runtime.d.ts +0 -4
- package/dist/jsx/jsx-dev-runtime.d.ts.map +0 -1
- package/dist/jsx/jsx-runtime.d.ts +0 -10
- package/dist/jsx/jsx-runtime.d.ts.map +0 -1
- package/dist/node_modules/esbuild/lib/main.js +0 -65
- package/dist/renderer/cleanup.d.ts +0 -25
- package/dist/renderer/cleanup.d.ts.map +0 -1
- package/dist/renderer/dom.d.ts +0 -62
- package/dist/renderer/dom.d.ts.map +0 -1
- package/dist/renderer/evaluate.d.ts +0 -4
- package/dist/renderer/evaluate.d.ts.map +0 -1
- package/dist/renderer/fastpath.d.ts +0 -7
- package/dist/renderer/fastpath.d.ts.map +0 -1
- package/dist/renderer/index.d.ts +0 -6
- package/dist/renderer/index.d.ts.map +0 -1
- package/dist/renderer/keyed.d.ts +0 -23
- package/dist/renderer/keyed.d.ts.map +0 -1
- package/dist/renderer/reconcile.d.ts +0 -88
- package/dist/renderer/reconcile.d.ts.map +0 -1
- package/dist/renderer/types.d.ts +0 -3
- package/dist/renderer/types.d.ts.map +0 -1
- package/dist/renderer/utils.d.ts +0 -63
- package/dist/renderer/utils.d.ts.map +0 -1
- package/dist/resources/index.d.ts.map +0 -1
- package/dist/router/index.d.ts.map +0 -1
- package/dist/router/match.d.ts +0 -22
- package/dist/router/match.d.ts.map +0 -1
- package/dist/runtime/dev-namespace.d.ts +0 -31
- package/dist/runtime/dev-namespace.d.ts.map +0 -1
- package/dist/runtime/events.d.ts +0 -52
- package/dist/runtime/events.d.ts.map +0 -1
- package/dist/runtime/execution-model.d.ts +0 -4
- package/dist/runtime/execution-model.d.ts.map +0 -1
- package/dist/runtime/fastlane.d.ts +0 -27
- package/dist/runtime/fastlane.d.ts.map +0 -1
- package/dist/runtime/hydration.d.ts +0 -25
- package/dist/runtime/hydration.d.ts.map +0 -1
- package/dist/runtime/resource-cell.d.ts +0 -35
- package/dist/runtime/resource-cell.d.ts.map +0 -1
- package/dist/runtime/snapshot.d.ts +0 -25
- package/dist/runtime/snapshot.d.ts.map +0 -1
- package/dist/runtime/ssr-bridge.d.ts +0 -10
- package/dist/runtime/ssr-bridge.d.ts.map +0 -1
- package/dist/ssr/attrs.d.ts +0 -26
- package/dist/ssr/attrs.d.ts.map +0 -1
- package/dist/ssr/create-ssr.d.ts +0 -19
- package/dist/ssr/create-ssr.d.ts.map +0 -1
- package/dist/ssr/escape.d.ts +0 -38
- package/dist/ssr/escape.d.ts.map +0 -1
- package/dist/ssr/sink.d.ts +0 -23
- package/dist/ssr/sink.d.ts.map +0 -1
- package/dist/ssr/stream-render.d.ts +0 -7
- package/dist/ssr/stream-render.d.ts.map +0 -1
- package/dist/vite/index.js +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"for.js","names":[],"sources":["../../src/runtime/for.ts"],"sourcesContent":["/**\n * For primitive runtime\n *\n * Manages per-item component instances and array reconciliation\n * to eliminate over-invalidation in list rendering.\n */\n\nimport { type ComponentInstance, getCurrentInstance } from './component';\nimport { claimHookIndex } from './component';\nimport { type DOMElement, type VNode } from '../common/vnode';\nimport { isDevelopmentEnvironment } from '../common/env';\nimport { teardownNodeSubtree } from '../renderer/cleanup';\nimport {\n createChildScope,\n disposeChildScope,\n type ChildScope,\n} from './child-scope';\nimport type { ForProps } from '../control/for';\nimport type { ForEachSource } from '../control/for';\nimport {\n markReactivePropsDirtySource,\n markReadableDerivedSubscribersDirty,\n notifyReadableReaders,\n recordReadableRead,\n type ReadableSource,\n} from './readable';\nimport type { FineGrainedEffectHandle } from './effect';\nimport {\n flushBenchMetrics,\n getBenchMetrics,\n isBenchBuildEnabled,\n isBenchMetricScopeActive,\n recordBenchEvent,\n recordBenchCounter,\n recordBenchFastLane,\n recordBenchTiming,\n resetBenchMetrics,\n withBenchMetricScope,\n} from './for-bench';\n\nconst BENCH_BUILD_ENABLED = isBenchBuildEnabled();\n\nexport {\n getBenchMetrics,\n isBenchMetricScopeActive,\n recordBenchEvent,\n recordBenchCounter,\n recordBenchTiming,\n resetBenchMetrics,\n withBenchMetricScope,\n};\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\ntype ForItemSignal<T> = ReadableSource<T> &\n (() => T) & {\n peek(): T;\n set(newValue: T, notifyReaders?: boolean): void;\n };\n\ntype ForItemPropertySignal = ReadableSource<unknown> &\n (() => unknown) & {\n peek(): unknown;\n set(newValue: unknown, notifyReaders?: boolean): void;\n };\n\ntype ForIndexSignal = ReadableSource<number> &\n (() => number) & {\n peek(): number;\n set(newValue: number | ((prev: number) => number)): void;\n };\n\nexport type ForCommitStrategy =\n | 'APPEND'\n | 'TRUNCATE'\n | 'NO_REORDER'\n | 'SWAP'\n | 'FULL_KEYED';\n\nexport interface ForState<T> {\n kind: 'for';\n currentItems: T[];\n eachSource: ForEachSource<T>;\n fallback: VNode | null;\n fallbackScope: ChildScope | null;\n items: Map<string | number, ForItemInstance<T>>;\n orderedKeys: Array<string | number>;\n orderedVNodes: VNode[];\n byFn: NonNullable<ForProps<T>['by']> | ((item: T, index: number) => number);\n renderFn: (item: T, index: () => number) => VNode;\n parentInstance: ComponentInstance | null;\n lastCommitStrategy: ForCommitStrategy;\n lastRemovedNodes: Node[];\n pendingDirtyIndices: number[] | null;\n pendingSwapIndices: [number, number] | null;\n pendingMoveOnly: boolean;\n _hasResolvedItemDom: boolean;\n _needsSourceReconcile: boolean;\n _sourceEffect: FineGrainedEffectHandle<T[]> | null;\n _suspendSourceCommit: boolean;\n _enqueueBoundaryCommit?: (() => void) | null;\n _hasPendingBoundaryCommit?: boolean;\n devKeyKinds?: Map<string, 'number' | 'string'>;\n}\n\nconst forStates = new WeakMap<\n ComponentInstance,\n Map<number, ForState<unknown>>\n>();\n\nfunction getForStore(\n instance: ComponentInstance\n): Map<number, ForState<unknown>> {\n let store = forStates.get(instance);\n if (!store) {\n store = new Map();\n forStates.set(instance, store);\n }\n return store;\n}\n\nexport function createForState<T>(\n eachSource: ForEachSource<T>,\n byFn: ForState<T>['byFn'],\n renderFn: (item: T, index: () => number) => VNode,\n fallback: VNode | null\n): ForState<T> {\n const parentInstance = getCurrentInstance();\n\n return {\n kind: 'for',\n currentItems: [],\n eachSource,\n fallback,\n fallbackScope: null,\n items: new Map(),\n orderedKeys: [],\n orderedVNodes: [],\n byFn,\n renderFn,\n parentInstance,\n lastCommitStrategy: 'NO_REORDER',\n lastRemovedNodes: [],\n pendingDirtyIndices: null,\n pendingSwapIndices: null,\n pendingMoveOnly: false,\n _hasResolvedItemDom: false,\n _needsSourceReconcile: false,\n _sourceEffect: null,\n _suspendSourceCommit: false,\n _enqueueBoundaryCommit: null,\n _hasPendingBoundaryCommit: false,\n };\n}\n\nexport function useForState<T>(\n eachSource: ForEachSource<T>,\n byFn: ForState<T>['byFn'],\n renderFn: (item: T, index: () => number) => VNode,\n fallback: VNode | null\n): ForState<T> {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error(\n 'For can only be created during component render execution.'\n );\n }\n\n const hookIndex = claimHookIndex(instance, 'For');\n const store = getForStore(instance);\n const existing = store.get(hookIndex) as ForState<T> | undefined;\n\n if (existing) {\n existing.eachSource = eachSource;\n existing.byFn = byFn;\n existing.renderFn = renderFn;\n existing.fallback = fallback;\n return existing;\n }\n\n const created = createForState(eachSource, byFn, renderFn, fallback);\n store.set(hookIndex, created as ForState<unknown>);\n\n (instance.cleanupFns ??= []).push(() => {\n created._sourceEffect?.cleanup();\n created._sourceEffect = null;\n store.delete(hookIndex);\n });\n\n return created;\n}\n\nfunction 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 = (newValue: number | ((prev: number) => number)) => {\n const nextValue =\n typeof newValue === 'function' ? newValue(indexValue) : newValue;\n if (nextValue !== indexValue) {\n indexValue = nextValue;\n markReadableDerivedSubscribersDirty(indexSignal);\n markReactivePropsDirtySource(indexSignal);\n notifyReadableReaders(indexSignal);\n }\n };\n indexSignal._hasBeenRead = false;\n\n return indexSignal;\n}\n\nfunction 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 markReadableDerivedSubscribersDirty(itemSignal);\n markReactivePropsDirtySource(itemSignal);\n\n if (notifyReaders) {\n notifyReadableReaders(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 markReadableDerivedSubscribersDirty(propertySignal);\n markReactivePropsDirtySource(propertySignal);\n\n if (notifyReaders) {\n notifyReadableReaders(propertySignal);\n }\n };\n propertySignal._hasBeenRead = false;\n\n return propertySignal;\n}\n\nfunction readForItemProperty(item: unknown, prop: PropertyKey): unknown {\n return Reflect.get(Object(item), prop);\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\nfunction canProxyForItem(item: unknown): item is object {\n return (\n (typeof item === 'object' && item !== null) || typeof item === 'function'\n );\n}\n\nfunction 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 return Reflect.get(Object(currentItem), prop, receiver);\n },\n has(target, prop) {\n return prop in target || prop in Object(itemSignal.peek());\n },\n ownKeys(target) {\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 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 return Object.getPrototypeOf(Object(itemSignal.peek()));\n },\n }) as T;\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\nfunction failForValidation(message: string): never {\n throw new Error(message);\n}\n\nfunction validateForKeys<T>(forState: ForState<T>, newArray: T[]): void {\n if (!isDevelopmentEnvironment()) {\n return;\n }\n\n const seen = new Set<string | number>();\n const keyKinds = new Map<string, 'number' | 'string'>();\n for (let i = 0; i < newArray.length; i++) {\n const key = forState.byFn(newArray[i], i);\n\n if (key === null || key === undefined) {\n failForValidation(\n '[askr] Invalid For key detected. Keys should be stable, non-null, and unique within a For list.'\n );\n }\n\n if (seen.has(key)) {\n failForValidation(\n `[askr] Duplicate For key detected: ${String(key)}. Keys should be stable, non-null, and unique within a For list.`\n );\n }\n\n seen.add(key);\n\n const keyString = String(key);\n const keyKind = typeof key;\n const previousKeyKind = forState.devKeyKinds?.get(keyString);\n if (previousKeyKind && previousKeyKind !== keyKind) {\n failForValidation(\n `[askr] For key type changed for ${keyString}. Keys must remain consistently typed across renders.`\n );\n }\n keyKinds.set(keyString, keyKind as 'number' | 'string');\n }\n\n forState.devKeyKinds = keyKinds;\n}\n\ntype RemovedDomCleanupMode = 'none' | 'teardown' | 'full-clear';\n\nfunction 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 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 const parent = forState.parentInstance;\n if (parent) {\n parent._enqueueRun?.();\n }\n });\n\n renderItemScope(forState, scope, reactiveItem, indexSignal, key);\n\n const itemInstance: ForItemInstance<T> = {\n key,\n item,\n reactiveItem,\n itemSignal,\n itemPropertySignals,\n indexSignal,\n scope,\n };\n\n return itemInstance;\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\nfunction 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 itemSignal = itemInstance.itemSignal;\n if (!itemSignal) {\n rerenderItemInstance(forState, itemInstance, item);\n return true;\n }\n\n let hasPropertyRenderReaders = false;\n const propertySignals = itemInstance.itemPropertySignals;\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 const propertyHasRenderReaders = (propertySignal._readers?.size ?? 0) > 0;\n if (propertyHasRenderReaders) {\n hasPropertyRenderReaders = true;\n }\n\n propertySignal.set(nextValue, !propertyHasRenderReaders);\n }\n }\n\n const hasRenderReaders = (itemSignal._readers?.size ?? 0) > 0;\n itemSignal.set(item, hasRenderReaders);\n\n if (!hasRenderReaders && !hasPropertyRenderReaders) {\n return false;\n }\n\n rerenderItemInstance(forState, itemInstance, itemInstance.reactiveItem);\n return true;\n}\n\nconst FOR_FALLBACK_SCOPE_KEY = '__for-fallback__';\n\nfunction 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 teardownNodeSubtree(removedDom);\n }\n }\n\n forState.lastRemovedNodes.push(removedDom);\n}\n\nfunction 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 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 forState.parentInstance?._enqueueRun?.();\n });\n forState.fallbackScope = fallbackScope;\n\n const vnode = fallbackScope.render(() => forState.fallback as VNode);\n forState.orderedVNodes = vnode == null || vnode === false ? [] : [vnode];\n return forState.orderedVNodes;\n}\n\nfunction 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\nexport function reconcileForItems<T>(\n forState: ForState<T>,\n newArray: T[]\n): VNode[] {\n forState.currentItems = newArray;\n validateForKeys(forState, newArray);\n\n if (BENCH_BUILD_ENABLED) {\n resetBenchMetrics();\n }\n\n const reconcileStartMs = BENCH_BUILD_ENABLED ? performance.now() : 0;\n\n const { items, orderedKeys, byFn } = forState;\n const oldLen = orderedKeys.length;\n const newLen = newArray.length;\n forState.lastRemovedNodes = [];\n\n if (newLen === 0) {\n if (oldLen > 0) {\n disposeAllItems(forState, forState.fallback ? 'teardown' : 'none');\n }\n recordBenchFastLane('TRUNCATE');\n forState.lastCommitStrategy = 'TRUNCATE';\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n return renderFallbackScope(forState);\n }\n\n if (forState.fallbackScope) {\n disposeFallbackScope(forState, 'none');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FAST PATH A: APPEND\n // Guard: oldLen <= newLen && all old keys match new keys at same indices\n // ─────────────────────────────────────────────────────────────────────────\n if (oldLen < newLen) {\n let canUseAppendPath = true;\n for (let i = 0; i < oldLen; i++) {\n const key = byFn(newArray[i], i);\n if (key !== orderedKeys[i]) {\n canUseAppendPath = false;\n break;\n }\n }\n\n if (canUseAppendPath) {\n recordBenchFastLane('APPEND');\n forState.lastCommitStrategy = 'APPEND';\n const resultVNodes = forState.orderedVNodes;\n resultVNodes.length = newLen;\n\n // Update existing rows in-place\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = orderedKeys[i];\n const existing = items.get(key)!;\n recordBenchEvent('itemReused');\n\n updateItemInstance(forState, existing, item);\n\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n // Create and append new rows\n for (let i = oldLen; i < newLen; i++) {\n const item = newArray[i];\n const key = byFn(item, i);\n const itemInstance = createItemInstance(key, item, i, forState);\n items.set(key, itemInstance);\n resultVNodes[i] = itemInstance.scope.vnode as VNode;\n orderedKeys[i] = key;\n }\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.orderedVNodes = resultVNodes;\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FAST PATH B: TRUNCATE\n // Guard: newLen <= oldLen && all new keys match old keys at same indices\n // ─────────────────────────────────────────────────────────────────────────\n if (newLen < oldLen) {\n if (oldLen === newLen + 1) {\n let removedIndex = -1;\n\n for (let i = 0; i < newLen; i++) {\n const nextKey = byFn(newArray[i], i);\n if (nextKey !== orderedKeys[i]) {\n removedIndex = i;\n break;\n }\n }\n\n if (removedIndex !== -1) {\n let canUseRemoveOnePath = true;\n for (let i = removedIndex; i < newLen; i++) {\n const nextKey = byFn(newArray[i], i);\n if (nextKey !== orderedKeys[i + 1]) {\n canUseRemoveOnePath = false;\n break;\n }\n }\n\n if (canUseRemoveOnePath) {\n recordBenchFastLane('REMOVE_ONE');\n forState.lastCommitStrategy = 'NO_REORDER';\n\n const resultVNodes = forState.orderedVNodes;\n resultVNodes.length = newLen;\n const dirtyIndices: number[] = [];\n\n for (let i = 0; i < newLen; i++) {\n const item = newArray[i];\n const key = i < removedIndex ? orderedKeys[i] : orderedKeys[i + 1];\n const existing = items.get(key)!;\n recordBenchEvent('itemReused');\n\n const itemChanged = existing.item !== item;\n const needsDomUpdate = existing.scope.needsDomUpdate;\n const indexChanged = existing.indexSignal.peek() !== i;\n\n if (itemChanged) {\n updateItemInstance(forState, existing, item);\n }\n\n if (indexChanged && existing.indexSignal._hasBeenRead) {\n existing.indexSignal.set(i);\n }\n\n if (\n itemChanged ||\n indexChanged ||\n needsDomUpdate ||\n existing.scope.needsDomUpdate\n ) {\n dirtyIndices.push(i);\n }\n\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n const removedKey = orderedKeys[removedIndex];\n const removedItem = items.get(removedKey);\n if (removedItem) {\n disposeItemInstance(forState, removedItem, 'teardown');\n items.delete(removedKey);\n }\n\n const nextOrderedKeys = orderedKeys.slice(0, newLen);\n for (let i = removedIndex; i < newLen; i++) {\n nextOrderedKeys[i] = orderedKeys[i + 1];\n }\n forState.orderedKeys = nextOrderedKeys;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming(\n 'reconcile',\n performance.now() - reconcileStartMs\n );\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = dirtyIndices;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n }\n }\n\n let canUseTruncatePath = true;\n for (let i = 0; i < newLen; i++) {\n const key = byFn(newArray[i], i);\n if (key !== orderedKeys[i]) {\n canUseTruncatePath = false;\n break;\n }\n }\n\n if (canUseTruncatePath) {\n recordBenchFastLane('TRUNCATE');\n forState.lastCommitStrategy = 'TRUNCATE';\n const resultVNodes = forState.orderedVNodes;\n resultVNodes.length = newLen;\n const isFullClear = newLen === 0;\n\n // Update existing rows in-place\n for (let i = 0; i < newLen; i++) {\n const item = newArray[i];\n const key = orderedKeys[i];\n const existing = items.get(key)!;\n recordBenchEvent('itemReused');\n\n updateItemInstance(forState, existing, item);\n\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n // Remove tail rows\n for (let i = newLen; i < oldLen; i++) {\n const key = orderedKeys[i];\n const itemInstance = items.get(key);\n if (itemInstance) {\n disposeItemInstance(\n forState,\n itemInstance,\n isFullClear ? 'full-clear' : 'teardown'\n );\n items.delete(key);\n }\n }\n\n orderedKeys.length = newLen;\n forState.orderedKeys = orderedKeys;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.orderedVNodes = resultVNodes;\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FAST PATH C: NO-REORDER (in-place update only)\n // Guard: oldLen === newLen && keys match at all indices\n // ─────────────────────────────────────────────────────────────────────────\n if (oldLen === newLen) {\n let canUseNoReorderPath = true;\n for (let i = 0; i < oldLen; i++) {\n const key = byFn(newArray[i], i);\n if (key !== orderedKeys[i]) {\n canUseNoReorderPath = false;\n break;\n }\n }\n\n if (canUseNoReorderPath) {\n recordBenchFastLane('NO_REORDER');\n forState.lastCommitStrategy = 'NO_REORDER';\n const resultVNodes = forState.orderedVNodes;\n resultVNodes.length = oldLen;\n const dirtyIndices: number[] = [];\n\n // Update in-place only, no DOM moves needed\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = orderedKeys[i];\n const existing = items.get(key)!;\n recordBenchEvent('itemReused');\n\n const itemChanged = existing.item !== item;\n const needsDomUpdate = existing.scope.needsDomUpdate;\n let rerendered = false;\n\n if (itemChanged) {\n rerendered = updateItemInstance(forState, existing, item);\n }\n\n if (rerendered || needsDomUpdate || existing.scope.needsDomUpdate) {\n dirtyIndices.push(i);\n }\n\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = dirtyIndices;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n\n let firstMismatch = -1;\n let secondMismatch = -1;\n let firstMismatchKey: string | number | null = null;\n let secondMismatchKey: string | number | null = null;\n let mismatchCount = 0;\n let canUseSwapPath = true;\n\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = byFn(newArray[i], i);\n if (key === orderedKeys[i]) {\n const existing = items.get(key);\n if (existing && existing.item !== item) {\n canUseSwapPath = false;\n break;\n }\n continue;\n }\n\n mismatchCount++;\n if (firstMismatch === -1) {\n firstMismatch = i;\n firstMismatchKey = key;\n continue;\n }\n\n if (secondMismatch === -1) {\n secondMismatch = i;\n secondMismatchKey = key;\n continue;\n }\n\n mismatchCount = 3;\n break;\n }\n\n if (\n canUseSwapPath &&\n mismatchCount === 2 &&\n firstMismatch !== -1 &&\n secondMismatch !== -1 &&\n firstMismatchKey === orderedKeys[secondMismatch] &&\n secondMismatchKey === orderedKeys[firstMismatch]\n ) {\n recordBenchFastLane('SWAP');\n recordBenchEvent('itemMoved');\n recordBenchEvent('itemMoved');\n\n forState.lastCommitStrategy = 'SWAP';\n\n const nextOrderedKeys = orderedKeys.slice();\n nextOrderedKeys[firstMismatch] = firstMismatchKey;\n nextOrderedKeys[secondMismatch] = secondMismatchKey;\n\n const resultVNodes = forState.orderedVNodes;\n const firstExisting = items.get(firstMismatchKey)!;\n const secondExisting = items.get(secondMismatchKey)!;\n const firstItem = newArray[firstMismatch];\n const secondItem = newArray[secondMismatch];\n\n recordBenchEvent('itemReused');\n recordBenchEvent('itemReused');\n\n if (firstExisting.item !== firstItem) {\n updateItemInstance(forState, firstExisting, firstItem);\n }\n\n if (secondExisting.item !== secondItem) {\n updateItemInstance(forState, secondExisting, secondItem);\n }\n\n if (\n firstExisting.indexSignal._hasBeenRead &&\n firstExisting.indexSignal.peek() !== firstMismatch\n ) {\n firstExisting.indexSignal.set(firstMismatch);\n }\n\n if (\n secondExisting.indexSignal._hasBeenRead &&\n secondExisting.indexSignal.peek() !== secondMismatch\n ) {\n secondExisting.indexSignal.set(secondMismatch);\n }\n\n resultVNodes[firstMismatch] = firstExisting.scope.vnode as VNode;\n resultVNodes[secondMismatch] = secondExisting.scope.vnode as VNode;\n\n forState.orderedKeys = nextOrderedKeys;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = [firstMismatch, secondMismatch];\n forState.pendingMoveOnly = true;\n\n return resultVNodes;\n }\n\n let canUseMoveOnlyPath = true;\n const moveOnlyKeys: Array<string | number> = [];\n const moveOnlyVNodes: VNode[] = [];\n\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = byFn(item, i);\n const existing = items.get(key);\n\n if (\n !existing ||\n existing.item !== item ||\n (existing.indexSignal._hasBeenRead && existing.indexSignal.peek() !== i)\n ) {\n canUseMoveOnlyPath = false;\n break;\n }\n\n moveOnlyKeys[i] = key;\n moveOnlyVNodes[i] = existing.scope.vnode as VNode;\n recordBenchEvent('itemReused');\n }\n\n if (canUseMoveOnlyPath) {\n recordBenchFastLane('FULL_KEYED');\n forState.lastCommitStrategy = 'FULL_KEYED';\n forState.orderedKeys = moveOnlyKeys;\n forState.orderedVNodes = moveOnlyVNodes;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = true;\n\n return moveOnlyVNodes;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FULL KEYED RECONCILIATION (slow path for complex reorders)\n // Avoid allocating newKeyMap: iterate directly and track removals\n // ─────────────────────────────────────────────────────────────────────────\n recordBenchFastLane('FULL_KEYED');\n forState.lastCommitStrategy = 'FULL_KEYED';\n\n const toRemove = new Set(orderedKeys);\n const newOrderedKeys: Array<string | number> = [];\n const resultVNodes: VNode[] = [];\n let moveOnly = toRemove.size === newArray.length;\n\n // Single pass: iterate new array directly, no intermediate map\n for (let i = 0; i < newArray.length; i++) {\n const item = newArray[i];\n const key = byFn(item, i);\n recordBenchEvent('keyLookup');\n\n toRemove.delete(key);\n newOrderedKeys.push(key);\n\n const existing = items.get(key);\n recordBenchEvent(existing ? 'keyHit' : 'keyMiss');\n\n if (!existing) {\n // Added: create new item instance\n const itemInstance = createItemInstance(key, item, i, forState);\n items.set(key, itemInstance);\n resultVNodes.push(itemInstance.scope.vnode as VNode);\n } else {\n // Exists: check if item changed (by identity)\n recordBenchEvent('itemReused');\n const itemChanged = existing.item !== item;\n const indexChanged =\n existing.indexSignal._hasBeenRead && existing.indexSignal.peek() !== i;\n\n if (itemChanged) {\n moveOnly = false;\n updateItemInstance(forState, existing, item);\n }\n\n if (indexChanged) {\n // Index changed: update index signal (triggers re-render if index is used)\n existing.indexSignal.set(i);\n }\n\n resultVNodes.push(existing.scope.vnode as VNode);\n }\n }\n\n // Remove deleted items\n for (const key of toRemove) {\n moveOnly = false;\n const itemInstance = items.get(key);\n if (itemInstance) {\n disposeItemInstance(forState, itemInstance, 'none');\n items.delete(key);\n }\n }\n\n forState.orderedKeys = newOrderedKeys;\n\n // Record reconcile timing\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.orderedVNodes = resultVNodes;\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = moveOnly;\n\n return resultVNodes;\n}\n\nexport function evaluateForState<T>(forState: ForState<T>): VNode[] {\n if (!Array.isArray(forState.currentItems)) {\n throw new Error('For source must evaluate to an array');\n }\n\n forState._needsSourceReconcile = false;\n return reconcileForItems(forState, forState.currentItems);\n}\n\nexport function clearForDomUpdateState<T>(forState: ForState<T>): void {\n for (let i = 0; i < forState.orderedKeys.length; i++) {\n const key = forState.orderedKeys[i];\n const itemInstance = forState.items.get(key);\n if (itemInstance) {\n itemInstance.scope.needsDomUpdate = false;\n }\n }\n if (forState.fallbackScope) {\n forState.fallbackScope.needsDomUpdate = false;\n }\n forState.lastRemovedNodes = [];\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n forState._needsSourceReconcile = false;\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
//#region src/runtime/operations.d.ts
|
|
2
|
+
interface ResourceResult<T> {
|
|
3
|
+
value: T | null;
|
|
4
|
+
pending: boolean;
|
|
5
|
+
error: Error | null;
|
|
6
|
+
refresh(): void;
|
|
6
7
|
}
|
|
7
8
|
/**
|
|
8
9
|
* Resource primitive — simple, deterministic async primitive
|
|
@@ -14,17 +15,17 @@ export interface ResourceResult<T> {
|
|
|
14
15
|
* - exposes { value, pending, error, refresh }
|
|
15
16
|
* - during SSR, async results are disallowed and will throw synchronously
|
|
16
17
|
*/
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
declare function resource<T>(fn: (opts: {
|
|
19
|
+
signal: AbortSignal;
|
|
19
20
|
}) => Promise<T> | T, deps?: unknown[]): ResourceResult<T>;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
declare function on(target: EventTarget, event: string, handler: EventListener): void;
|
|
22
|
+
declare function timer(intervalMs: number, fn: () => void): void;
|
|
23
|
+
declare function stream<T>(_source: unknown, _options?: Record<string, unknown>): {
|
|
24
|
+
value: T | null;
|
|
25
|
+
pending: boolean;
|
|
26
|
+
error: Error | null;
|
|
26
27
|
};
|
|
27
|
-
|
|
28
|
+
declare function task(fn: () => void | (() => void) | Promise<void | (() => void)>): void;
|
|
28
29
|
/**
|
|
29
30
|
* Capture the result of a synchronous expression at call time and return a
|
|
30
31
|
* thunk that returns the captured value later. This is a low-level helper for
|
|
@@ -35,5 +36,7 @@ export declare function task(fn: () => void | (() => void) | Promise<void | (()
|
|
|
35
36
|
* const snapshot = capture(() => someState());
|
|
36
37
|
* Promise.resolve().then(() => { use(snapshot()); });
|
|
37
38
|
*/
|
|
38
|
-
|
|
39
|
+
declare function capture<T>(fn: () => T): () => T;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { ResourceResult, capture, on, resource, stream, task, timer };
|
|
39
42
|
//# sourceMappingURL=operations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.d.ts","
|
|
1
|
+
{"version":3,"file":"operations.d.ts","names":[],"sources":["../../src/runtime/operations.ts"],"mappings":";UAYiB,cAAA;EACf,KAAA,EAAO,CAAA;EACP,OAAA;EACA,KAAA,EAAO,KAAA;EACP,OAAA;AAAA;;;;;;;;;AAaF;;iBAAgB,QAAA,GAAA,CACd,EAAA,GAAK,IAAA;EAAQ,MAAA,EAAQ,WAAA;AAAA,MAAkB,OAAA,CAAQ,CAAA,IAAK,CAAA,EACpD,IAAA,eACC,cAAA,CAAe,CAAA;AAAA,iBAsNF,EAAA,CACd,MAAA,EAAQ,WAAA,EACR,KAAA,UACA,OAAA,EAAS,aAAA;AAAA,iBAiBK,KAAA,CAAM,UAAA,UAAoB,EAAA;AAAA,iBAgB1B,MAAA,GAAA,CACd,OAAA,WACA,QAAA,GAAW,MAAA;EACR,KAAA,EAAO,CAAA;EAAU,OAAA;EAAkB,KAAA,EAAO,KAAA;AAAA;AAAA,iBAK/B,IAAA,CACd,EAAA,8BAAgC,OAAA;;;;;;;;;;;iBAwBlB,OAAA,GAAA,CAAW,EAAA,QAAU,CAAA,SAAU,CAAA"}
|
|
@@ -1 +1,209 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { globalScheduler } from "./scheduler.js";
|
|
2
|
+
import { getCurrentContextFrame } from "./context.js";
|
|
3
|
+
import { getCurrentComponentInstance, registerMountOperation } from "./component.js";
|
|
4
|
+
import { state } from "./state.js";
|
|
5
|
+
import { getSSRBridge } from "./ssr-bridge.js";
|
|
6
|
+
import { ResourceCell } from "./resource-cell.js";
|
|
7
|
+
import { SSRDataMissingError } from "../common/ssr-errors.js";
|
|
8
|
+
//#region src/runtime/operations.ts
|
|
9
|
+
/**
|
|
10
|
+
* Resource primitive — simple, deterministic async primitive
|
|
11
|
+
* Usage: resource(fn, deps)
|
|
12
|
+
* - fn receives { signal }
|
|
13
|
+
* - captures execution context once at creation (synchronous step only)
|
|
14
|
+
* - executes at most once per generation; stale async results are ignored
|
|
15
|
+
* - refresh() cancels in-flight execution, increments generation and re-runs
|
|
16
|
+
* - exposes { value, pending, error, refresh }
|
|
17
|
+
* - during SSR, async results are disallowed and will throw synchronously
|
|
18
|
+
*/
|
|
19
|
+
function resource(fn, deps = []) {
|
|
20
|
+
const instance = getCurrentComponentInstance();
|
|
21
|
+
const inst = instance;
|
|
22
|
+
if (!instance) {
|
|
23
|
+
const ssr = getSSRBridge();
|
|
24
|
+
const renderData = ssr.getCurrentRenderData();
|
|
25
|
+
if (renderData) {
|
|
26
|
+
const key = ssr.getNextKey();
|
|
27
|
+
if (!(key in renderData)) ssr.throwSSRDataMissing();
|
|
28
|
+
return {
|
|
29
|
+
value: renderData[key],
|
|
30
|
+
pending: false,
|
|
31
|
+
error: null,
|
|
32
|
+
refresh: () => {}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (ssr.getCurrentSSRContext()) ssr.throwSSRDataMissing();
|
|
36
|
+
throw new Error("[Askr] resource() must be called during component render inside an app. Do not create resources at module scope or outside render.");
|
|
37
|
+
}
|
|
38
|
+
const ssr = getSSRBridge();
|
|
39
|
+
const renderData = ssr.getCurrentRenderData();
|
|
40
|
+
if (renderData) {
|
|
41
|
+
const key = ssr.getNextKey();
|
|
42
|
+
if (!(key in renderData)) ssr.throwSSRDataMissing();
|
|
43
|
+
const val = renderData[key];
|
|
44
|
+
const holder = state({
|
|
45
|
+
cell: void 0,
|
|
46
|
+
snapshot: {
|
|
47
|
+
value: val,
|
|
48
|
+
pending: false,
|
|
49
|
+
error: null,
|
|
50
|
+
refresh: () => {}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
const h = holder();
|
|
54
|
+
h.snapshot.value = val;
|
|
55
|
+
h.snapshot.pending = false;
|
|
56
|
+
h.snapshot.error = null;
|
|
57
|
+
holder.set(h);
|
|
58
|
+
return h.snapshot;
|
|
59
|
+
}
|
|
60
|
+
const holder = state({
|
|
61
|
+
cell: void 0,
|
|
62
|
+
snapshot: {
|
|
63
|
+
value: null,
|
|
64
|
+
pending: true,
|
|
65
|
+
error: null,
|
|
66
|
+
refresh: () => {}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
const h = holder();
|
|
70
|
+
if (!h.cell) {
|
|
71
|
+
const cell = new ResourceCell(fn, deps, getCurrentContextFrame());
|
|
72
|
+
cell.ownerName = inst.fn?.name || "<anonymous>";
|
|
73
|
+
h.cell = cell;
|
|
74
|
+
h.snapshot = cell.snapshot;
|
|
75
|
+
const unsubscribe = cell.subscribe(() => {
|
|
76
|
+
const cur = holder();
|
|
77
|
+
cur.snapshot.value = cell.snapshot.value;
|
|
78
|
+
cur.snapshot.pending = cell.snapshot.pending;
|
|
79
|
+
cur.snapshot.error = cell.snapshot.error;
|
|
80
|
+
holder.set(cur);
|
|
81
|
+
try {
|
|
82
|
+
inst._enqueueRun?.();
|
|
83
|
+
} catch {}
|
|
84
|
+
});
|
|
85
|
+
(inst.cleanupFns ??= []).push(() => {
|
|
86
|
+
unsubscribe();
|
|
87
|
+
cell.abort();
|
|
88
|
+
});
|
|
89
|
+
if (inst.ssr) {
|
|
90
|
+
cell.start(true, false);
|
|
91
|
+
if (!cell.pending) {
|
|
92
|
+
const cur = holder();
|
|
93
|
+
cur.snapshot.value = cell.value;
|
|
94
|
+
cur.snapshot.pending = cell.pending;
|
|
95
|
+
cur.snapshot.error = cell.error;
|
|
96
|
+
}
|
|
97
|
+
} else globalScheduler.enqueue(() => {
|
|
98
|
+
try {
|
|
99
|
+
cell.start(false, false);
|
|
100
|
+
} catch (err) {
|
|
101
|
+
const cur = holder();
|
|
102
|
+
cur.snapshot.value = cell.value;
|
|
103
|
+
cur.snapshot.pending = cell.pending;
|
|
104
|
+
cur.snapshot.error = err ?? null;
|
|
105
|
+
holder.set(cur);
|
|
106
|
+
inst._enqueueRun?.();
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (!cell.pending) {
|
|
110
|
+
const cur = holder();
|
|
111
|
+
cur.snapshot.value = cell.value;
|
|
112
|
+
cur.snapshot.pending = cell.pending;
|
|
113
|
+
cur.snapshot.error = cell.error;
|
|
114
|
+
holder.set(cur);
|
|
115
|
+
inst._enqueueRun?.();
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
const cell = h.cell;
|
|
120
|
+
cell.setLoader(fn);
|
|
121
|
+
if (!cell.deps || cell.deps.length !== deps.length || cell.deps.some((d, i) => d !== deps[i])) {
|
|
122
|
+
cell.deps = deps.slice();
|
|
123
|
+
cell.generation++;
|
|
124
|
+
cell.pending = true;
|
|
125
|
+
cell.error = null;
|
|
126
|
+
try {
|
|
127
|
+
if (inst.ssr) {
|
|
128
|
+
cell.start(true, false);
|
|
129
|
+
if (!cell.pending) {
|
|
130
|
+
const cur = holder();
|
|
131
|
+
cur.snapshot.value = cell.value;
|
|
132
|
+
cur.snapshot.pending = cell.pending;
|
|
133
|
+
cur.snapshot.error = cell.error;
|
|
134
|
+
}
|
|
135
|
+
} else globalScheduler.enqueue(() => {
|
|
136
|
+
cell.start(false, false);
|
|
137
|
+
if (!cell.pending) {
|
|
138
|
+
const cur = holder();
|
|
139
|
+
cur.snapshot.value = cell.value;
|
|
140
|
+
cur.snapshot.pending = cell.pending;
|
|
141
|
+
cur.snapshot.error = cell.error;
|
|
142
|
+
holder.set(cur);
|
|
143
|
+
inst._enqueueRun?.();
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
} catch (err) {
|
|
147
|
+
if (err instanceof SSRDataMissingError) throw err;
|
|
148
|
+
cell.error = err;
|
|
149
|
+
cell.pending = false;
|
|
150
|
+
const cur = holder();
|
|
151
|
+
cur.snapshot.value = cell.value;
|
|
152
|
+
cur.snapshot.pending = cell.pending;
|
|
153
|
+
cur.snapshot.error = cell.error;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return h.snapshot;
|
|
157
|
+
}
|
|
158
|
+
function on(target, event, handler) {
|
|
159
|
+
const ownerIsRoot = getCurrentComponentInstance()?.isRoot ?? false;
|
|
160
|
+
registerMountOperation(() => {
|
|
161
|
+
if (!ownerIsRoot) throw new Error("[Askr] on() may only be used in root components");
|
|
162
|
+
target.addEventListener(event, handler);
|
|
163
|
+
return () => {
|
|
164
|
+
target.removeEventListener(event, handler);
|
|
165
|
+
};
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
function timer(intervalMs, fn) {
|
|
169
|
+
const ownerIsRoot = getCurrentComponentInstance()?.isRoot ?? false;
|
|
170
|
+
registerMountOperation(() => {
|
|
171
|
+
if (!ownerIsRoot) throw new Error("[Askr] timer() may only be used in root components");
|
|
172
|
+
const id = setInterval(fn, intervalMs);
|
|
173
|
+
return () => {
|
|
174
|
+
clearInterval(id);
|
|
175
|
+
};
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
function stream(_source, _options) {
|
|
179
|
+
return {
|
|
180
|
+
value: null,
|
|
181
|
+
pending: true,
|
|
182
|
+
error: null
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function task(fn) {
|
|
186
|
+
const ownerIsRoot = getCurrentComponentInstance()?.isRoot ?? false;
|
|
187
|
+
registerMountOperation(async () => {
|
|
188
|
+
if (!ownerIsRoot) throw new Error("[Askr] task() may only be used in root components");
|
|
189
|
+
return await fn();
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Capture the result of a synchronous expression at call time and return a
|
|
194
|
+
* thunk that returns the captured value later. This is a low-level helper for
|
|
195
|
+
* cases where async continuations need to observe a snapshot of values at the
|
|
196
|
+
* moment scheduling occurred.
|
|
197
|
+
*
|
|
198
|
+
* Usage (public API):
|
|
199
|
+
* const snapshot = capture(() => someState());
|
|
200
|
+
* Promise.resolve().then(() => { use(snapshot()); });
|
|
201
|
+
*/
|
|
202
|
+
function capture(fn) {
|
|
203
|
+
const value = fn();
|
|
204
|
+
return () => value;
|
|
205
|
+
}
|
|
206
|
+
//#endregion
|
|
207
|
+
export { capture, on, resource, stream, task, timer };
|
|
208
|
+
|
|
209
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","names":[],"sources":["../../src/runtime/operations.ts"],"sourcesContent":["import {\n getCurrentComponentInstance,\n registerMountOperation,\n type ComponentInstance,\n} from './component';\nimport { getCurrentContextFrame } from './context';\nimport { ResourceCell } from './resource-cell';\nimport { state } from './state';\nimport { globalScheduler } from './scheduler';\nimport { getSSRBridge } from './ssr-bridge';\nimport { SSRDataMissingError } from '../common/ssr-errors';\n\nexport interface ResourceResult<T> {\n value: T | null;\n pending: boolean;\n error: Error | null;\n refresh(): void;\n}\n\n/**\n * Resource primitive — simple, deterministic async primitive\n * Usage: resource(fn, deps)\n * - fn receives { signal }\n * - captures execution context once at creation (synchronous step only)\n * - executes at most once per generation; stale async results are ignored\n * - refresh() cancels in-flight execution, increments generation and re-runs\n * - exposes { value, pending, error, refresh }\n * - during SSR, async results are disallowed and will throw synchronously\n */\nexport function resource<T>(\n fn: (opts: { signal: AbortSignal }) => Promise<T> | T,\n deps: unknown[] = []\n): ResourceResult<T> {\n const instance = getCurrentComponentInstance();\n // Create a non-null alias early so it can be used in nested closures\n // without TypeScript complaining about possible null access.\n const inst = instance as ComponentInstance;\n\n if (!instance) {\n const ssr = getSSRBridge();\n // If we're in a synchronous SSR render that has resolved data, use it.\n const renderData = ssr.getCurrentRenderData();\n if (renderData) {\n const key = ssr.getNextKey();\n if (!(key in renderData)) {\n ssr.throwSSRDataMissing();\n }\n const val = renderData[key] as T;\n return {\n value: val,\n pending: false,\n error: null,\n refresh: () => {},\n } as ResourceResult<T>;\n }\n\n // If we are in an SSR render pass without supplied data, throw for clarity.\n const ssrCtx = ssr.getCurrentSSRContext();\n if (ssrCtx) {\n ssr.throwSSRDataMissing();\n }\n\n // No active component instance and not in SSR render with data.\n // Autopilot invariant: resources must be created during render within an app.\n throw new Error(\n '[Askr] resource() must be called during component render inside an app. ' +\n 'Do not create resources at module scope or outside render.'\n );\n }\n\n // Internal ResourceCell — pure state machine now moved to its own module\n // to keep component wiring separate and ensure no component access here.\n // (See ./resource-cell.ts)\n\n // If we're in a synchronous SSR render that was supplied resolved data, use it\n const ssr = getSSRBridge();\n const renderData = ssr.getCurrentRenderData();\n if (renderData) {\n // Deterministic key generation: the collection step and render step use\n // the same incremental key generation to align resources.\n const key = ssr.getNextKey();\n if (!(key in renderData)) {\n ssr.throwSSRDataMissing();\n }\n\n // Commit synchronous value from render data and return a stable snapshot\n const val = renderData[key] as T;\n\n const holder = state<{\n cell?: ResourceCell<T>;\n snapshot: ResourceResult<T>;\n }>({\n cell: undefined,\n snapshot: {\n value: val,\n pending: false,\n error: null,\n refresh: () => {},\n },\n });\n\n const h = holder();\n h.snapshot.value = val;\n h.snapshot.pending = false;\n h.snapshot.error = null;\n holder.set(h);\n return h.snapshot;\n }\n\n // Persist a holder so the snapshot identity is stable across renders.\n const holder = state<{ cell?: ResourceCell<T>; snapshot: ResourceResult<T> }>(\n {\n cell: undefined,\n snapshot: {\n value: null,\n pending: true,\n error: null,\n refresh: () => {},\n },\n }\n );\n\n const h = holder();\n\n // Initialize cell on first call\n if (!h.cell) {\n const frame = getCurrentContextFrame();\n const cell = new ResourceCell<T>(fn, deps, frame);\n // Attach debug label (component name) for richer logs\n cell.ownerName = inst.fn?.name || '<anonymous>';\n h.cell = cell;\n h.snapshot = cell.snapshot as ResourceResult<T>;\n\n // Subscribe and schedule component updates when cell changes\n const unsubscribe = cell.subscribe(() => {\n const cur = holder();\n cur.snapshot.value = cell.snapshot.value;\n cur.snapshot.pending = cell.snapshot.pending;\n cur.snapshot.error = cell.snapshot.error;\n holder.set(cur);\n try {\n inst._enqueueRun?.();\n } catch {\n // ignore\n }\n });\n\n // Cleanup on unmount\n (inst.cleanupFns ??= []).push(() => {\n unsubscribe();\n cell.abort();\n });\n\n // Render invariant: do NOT start async work during render on the client.\n // SSR remains strict/synchronous and must throw immediately if async is encountered.\n if (inst.ssr) {\n // SSR: must run synchronously so missing data throws during render\n cell.start(true, false);\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n }\n } else {\n // Client: start after render via scheduler (never inline)\n globalScheduler.enqueue(() => {\n try {\n cell.start(false, false);\n } catch (err) {\n // Non-SSR: reflect synchronous errors into snapshot via manual update\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = (err as Error) ?? null;\n holder.set(cur);\n inst._enqueueRun?.();\n return;\n }\n\n // If the resource completed synchronously, subscribers were not notified.\n // Force a re-render so the component can observe the value.\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n holder.set(cur);\n inst._enqueueRun?.();\n }\n });\n }\n }\n\n const cell = h.cell!;\n cell.setLoader(fn);\n\n // Detect dependency changes and refresh immediately\n const depsChanged =\n !cell.deps ||\n cell.deps.length !== deps.length ||\n cell.deps.some((d, i) => d !== deps[i]);\n\n if (depsChanged) {\n cell.deps = deps.slice();\n cell.generation++;\n cell.pending = true;\n cell.error = null;\n try {\n if (inst.ssr) {\n cell.start(true, false);\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n }\n } else {\n globalScheduler.enqueue(() => {\n cell.start(false, false);\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n holder.set(cur);\n inst._enqueueRun?.();\n }\n });\n }\n } catch (err) {\n if (err instanceof SSRDataMissingError) throw err;\n cell.error = err as Error;\n cell.pending = false;\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n // Do not call holder.set() here; this is still render.\n }\n }\n\n // Return the stable snapshot object owned by the cell\n return h.snapshot;\n}\n\nexport function on(\n target: EventTarget,\n event: string,\n handler: EventListener\n): void {\n const ownerIsRoot = getCurrentComponentInstance()?.isRoot ?? false;\n // Register the listener to be attached on mount. If the owner is not the\n // root app instance, fail loudly to prevent silent no-op behavior.\n registerMountOperation(() => {\n if (!ownerIsRoot) {\n throw new Error('[Askr] on() may only be used in root components');\n }\n target.addEventListener(event, handler);\n // Return cleanup function\n return () => {\n target.removeEventListener(event, handler);\n };\n });\n}\n\nexport function timer(intervalMs: number, fn: () => void): void {\n const ownerIsRoot = getCurrentComponentInstance()?.isRoot ?? false;\n // Register the timer to be started on mount. Fail loudly when used outside\n // of the root component to avoid silent no-ops.\n registerMountOperation(() => {\n if (!ownerIsRoot) {\n throw new Error('[Askr] timer() may only be used in root components');\n }\n const id = setInterval(fn, intervalMs);\n // Return cleanup function\n return () => {\n clearInterval(id);\n };\n });\n}\n\nexport function stream<T>(\n _source: unknown,\n _options?: Record<string, unknown>\n): { value: T | null; pending: boolean; error: Error | null } {\n // Stub implementation: no-op.\n return { value: null, pending: true, error: null };\n}\n\nexport function task(\n fn: () => void | (() => void) | Promise<void | (() => void)>\n): void {\n const ownerIsRoot = getCurrentComponentInstance()?.isRoot ?? false;\n // Register the task to run on mount. Fail loudly when used outside the root\n // component so callers get immediate feedback rather than silent no-op.\n registerMountOperation(async () => {\n if (!ownerIsRoot) {\n throw new Error('[Askr] task() may only be used in root components');\n }\n // Execute the task (may be async) and return its cleanup\n return await fn();\n });\n}\n\n/**\n * Capture the result of a synchronous expression at call time and return a\n * thunk that returns the captured value later. This is a low-level helper for\n * cases where async continuations need to observe a snapshot of values at the\n * moment scheduling occurred.\n *\n * Usage (public API):\n * const snapshot = capture(() => someState());\n * Promise.resolve().then(() => { use(snapshot()); });\n */\nexport function capture<T>(fn: () => T): () => T {\n const value = fn();\n return () => value;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { isDevelopmentEnvironment, isRuntimeEnvFlagEnabled } from "../common/env.js";
|
|
2
|
+
//#region src/runtime/perf-metrics.ts
|
|
3
|
+
const BENCH_BUILD_ENABLED = isRuntimeEnvFlagEnabled("ASKR_BENCH");
|
|
4
|
+
function createInitialPerfMetrics() {
|
|
5
|
+
return {
|
|
6
|
+
selectorInvalidations: 0,
|
|
7
|
+
selectorCandidateReads: 0,
|
|
8
|
+
reactivePropReevaluations: 0,
|
|
9
|
+
skippedDomPropWrites: 0,
|
|
10
|
+
classListPatchOps: 0,
|
|
11
|
+
delegatedAncestorHops: 0,
|
|
12
|
+
hydrationBoundaryActivations: 0,
|
|
13
|
+
ssrTagCacheHits: 0,
|
|
14
|
+
lastSchedulerTaskCountPerFlush: 0,
|
|
15
|
+
maxSchedulerTaskCountPerFlush: 0,
|
|
16
|
+
schedulerFlushCount: 0,
|
|
17
|
+
schedulerTaskExecutions: 0,
|
|
18
|
+
ssgWorkerCount: 0,
|
|
19
|
+
ssgRenderTimeMs: 0,
|
|
20
|
+
ssgWorkerRenderTimeMs: 0,
|
|
21
|
+
ssgWriteTimeMs: 0
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function shouldCollectPerfMetrics() {
|
|
25
|
+
if (isDevelopmentEnvironment()) return true;
|
|
26
|
+
if (!BENCH_BUILD_ENABLED) return false;
|
|
27
|
+
try {
|
|
28
|
+
return !!globalThis.__ASKR_BENCH__;
|
|
29
|
+
} catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function getPerfStore() {
|
|
34
|
+
if (!shouldCollectPerfMetrics()) return null;
|
|
35
|
+
try {
|
|
36
|
+
const g = globalThis;
|
|
37
|
+
if (!g.__ASKR_PERF__) g.__ASKR_PERF__ = createInitialPerfMetrics();
|
|
38
|
+
return g.__ASKR_PERF__;
|
|
39
|
+
} catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function incrementPerfMetric(key, delta = 1) {
|
|
44
|
+
const store = getPerfStore();
|
|
45
|
+
if (!store) return;
|
|
46
|
+
store[key] += delta;
|
|
47
|
+
}
|
|
48
|
+
function addPerfDuration(key, deltaMs) {
|
|
49
|
+
const store = getPerfStore();
|
|
50
|
+
if (!store) return;
|
|
51
|
+
store[key] += deltaMs;
|
|
52
|
+
}
|
|
53
|
+
function recordSchedulerFlushTaskCount(taskCount) {
|
|
54
|
+
const store = getPerfStore();
|
|
55
|
+
if (!store) return;
|
|
56
|
+
store.lastSchedulerTaskCountPerFlush = taskCount;
|
|
57
|
+
store.maxSchedulerTaskCountPerFlush = Math.max(store.maxSchedulerTaskCountPerFlush, taskCount);
|
|
58
|
+
store.schedulerFlushCount += 1;
|
|
59
|
+
store.schedulerTaskExecutions += taskCount;
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
export { addPerfDuration, incrementPerfMetric, recordSchedulerFlushTaskCount };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=perf-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf-metrics.js","names":[],"sources":["../../src/runtime/perf-metrics.ts"],"sourcesContent":["import {\n isDevelopmentEnvironment,\n isRuntimeEnvFlagEnabled,\n} from '../common/env';\n\ntype PerfMetrics = {\n selectorInvalidations: number;\n selectorCandidateReads: number;\n reactivePropReevaluations: number;\n skippedDomPropWrites: number;\n classListPatchOps: number;\n delegatedAncestorHops: number;\n hydrationBoundaryActivations: number;\n ssrTagCacheHits: number;\n lastSchedulerTaskCountPerFlush: number;\n maxSchedulerTaskCountPerFlush: number;\n schedulerFlushCount: number;\n schedulerTaskExecutions: number;\n ssgWorkerCount: number;\n ssgRenderTimeMs: number;\n ssgWorkerRenderTimeMs: number;\n ssgWriteTimeMs: number;\n};\n\ntype PerfMetricsKey = keyof PerfMetrics;\n\ntype AskrPerfGlobal = typeof globalThis & {\n __ASKR_BENCH__?: boolean;\n __ASKR_PERF__?: PerfMetrics;\n};\n\nconst BENCH_BUILD_ENABLED = isRuntimeEnvFlagEnabled('ASKR_BENCH');\n\nfunction createInitialPerfMetrics(): PerfMetrics {\n return {\n selectorInvalidations: 0,\n selectorCandidateReads: 0,\n reactivePropReevaluations: 0,\n skippedDomPropWrites: 0,\n classListPatchOps: 0,\n delegatedAncestorHops: 0,\n hydrationBoundaryActivations: 0,\n ssrTagCacheHits: 0,\n lastSchedulerTaskCountPerFlush: 0,\n maxSchedulerTaskCountPerFlush: 0,\n schedulerFlushCount: 0,\n schedulerTaskExecutions: 0,\n ssgWorkerCount: 0,\n ssgRenderTimeMs: 0,\n ssgWorkerRenderTimeMs: 0,\n ssgWriteTimeMs: 0,\n };\n}\n\nfunction shouldCollectPerfMetrics(): boolean {\n if (isDevelopmentEnvironment()) {\n return true;\n }\n if (!BENCH_BUILD_ENABLED) {\n return false;\n }\n try {\n return !!(globalThis as AskrPerfGlobal).__ASKR_BENCH__;\n } catch {\n return false;\n }\n}\n\nfunction getPerfStore(): PerfMetrics | null {\n if (!shouldCollectPerfMetrics()) {\n return null;\n }\n\n try {\n const g = globalThis as AskrPerfGlobal;\n if (!g.__ASKR_PERF__) {\n g.__ASKR_PERF__ = createInitialPerfMetrics();\n }\n return g.__ASKR_PERF__;\n } catch {\n return null;\n }\n}\n\nexport function incrementPerfMetric(\n key:\n | 'selectorInvalidations'\n | 'selectorCandidateReads'\n | 'reactivePropReevaluations'\n | 'skippedDomPropWrites'\n | 'classListPatchOps'\n | 'delegatedAncestorHops'\n | 'hydrationBoundaryActivations'\n | 'ssrTagCacheHits'\n | 'ssgWorkerCount',\n delta = 1\n): void {\n const store = getPerfStore();\n if (!store) return;\n store[key] += delta;\n}\n\nexport function addPerfDuration(\n key: 'ssgRenderTimeMs' | 'ssgWorkerRenderTimeMs' | 'ssgWriteTimeMs',\n deltaMs: number\n): void {\n const store = getPerfStore();\n if (!store) return;\n store[key] += deltaMs;\n}\n\nexport function recordSchedulerFlushTaskCount(taskCount: number): void {\n const store = getPerfStore();\n if (!store) return;\n store.lastSchedulerTaskCountPerFlush = taskCount;\n store.maxSchedulerTaskCountPerFlush = Math.max(\n store.maxSchedulerTaskCountPerFlush,\n taskCount\n );\n store.schedulerFlushCount += 1;\n store.schedulerTaskExecutions += taskCount;\n}\n\nexport function getPerfMetrics(): Readonly<PerfMetrics> | undefined {\n const store = getPerfStore();\n return store ? { ...store } : undefined;\n}\n\nexport function resetPerfMetrics(): void {\n const store = getPerfStore();\n if (!store) return;\n const next = createInitialPerfMetrics();\n (Object.keys(next) as PerfMetricsKey[]).forEach((key) => {\n store[key] = next[key];\n });\n}\n"],"mappings":";;AA+BA,MAAM,sBAAsB,wBAAwB,aAAa;AAEjE,SAAS,2BAAwC;AAC/C,QAAO;EACL,uBAAuB;EACvB,wBAAwB;EACxB,2BAA2B;EAC3B,sBAAsB;EACtB,mBAAmB;EACnB,uBAAuB;EACvB,8BAA8B;EAC9B,iBAAiB;EACjB,gCAAgC;EAChC,+BAA+B;EAC/B,qBAAqB;EACrB,yBAAyB;EACzB,gBAAgB;EAChB,iBAAiB;EACjB,uBAAuB;EACvB,gBAAgB;EACjB;;AAGH,SAAS,2BAAoC;AAC3C,KAAI,0BAA0B,CAC5B,QAAO;AAET,KAAI,CAAC,oBACH,QAAO;AAET,KAAI;AACF,SAAO,CAAC,CAAE,WAA8B;SAClC;AACN,SAAO;;;AAIX,SAAS,eAAmC;AAC1C,KAAI,CAAC,0BAA0B,CAC7B,QAAO;AAGT,KAAI;EACF,MAAM,IAAI;AACV,MAAI,CAAC,EAAE,cACL,GAAE,gBAAgB,0BAA0B;AAE9C,SAAO,EAAE;SACH;AACN,SAAO;;;AAIX,SAAgB,oBACd,KAUA,QAAQ,GACF;CACN,MAAM,QAAQ,cAAc;AAC5B,KAAI,CAAC,MAAO;AACZ,OAAM,QAAQ;;AAGhB,SAAgB,gBACd,KACA,SACM;CACN,MAAM,QAAQ,cAAc;AAC5B,KAAI,CAAC,MAAO;AACZ,OAAM,QAAQ;;AAGhB,SAAgB,8BAA8B,WAAyB;CACrE,MAAM,QAAQ,cAAc;AAC5B,KAAI,CAAC,MAAO;AACZ,OAAM,iCAAiC;AACvC,OAAM,gCAAgC,KAAK,IACzC,MAAM,+BACN,UACD;AACD,OAAM,uBAAuB;AAC7B,OAAM,2BAA2B"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ComponentInstance } from "./component.js";
|
|
2
|
+
|
|
3
|
+
//#region src/runtime/readable.d.ts
|
|
4
|
+
interface DerivedSubscriber {
|
|
5
|
+
_markDirty(): void;
|
|
6
|
+
_pendingDependencySources?: Set<ReadableSource<unknown>>;
|
|
7
|
+
}
|
|
8
|
+
interface ReadableSource<T = unknown> {
|
|
9
|
+
(): T;
|
|
10
|
+
_hasBeenRead?: boolean;
|
|
11
|
+
_readers?: Map<ComponentInstance, number>;
|
|
12
|
+
_derivedSubscribers?: Set<DerivedSubscriber>;
|
|
13
|
+
}
|
|
14
|
+
declare function markReadableUsage(source: unknown): void;
|
|
15
|
+
declare function recordReadableRead(source: ReadableSource<unknown>): void;
|
|
16
|
+
declare function withFineGrainedReadTracking<T>(pendingSources: Set<ReadableSource<unknown>>, fn: () => T): T;
|
|
17
|
+
declare function finalizeReadableSubscriptions(instance: ComponentInstance): void;
|
|
18
|
+
declare function cleanupReadableSubscriptions(instance: ComponentInstance): void;
|
|
19
|
+
declare function withDerivedReadTracking<T>(subscriber: DerivedSubscriber, fn: () => T): T;
|
|
20
|
+
declare function syncDerivedDependencySubscriptions(subscriber: DerivedSubscriber, prevSources: Set<ReadableSource<unknown>>, nextSources: Set<ReadableSource<unknown>>): void;
|
|
21
|
+
declare function clearDerivedDependencySubscriptions(subscriber: DerivedSubscriber, sources: Set<ReadableSource<unknown>>): void;
|
|
22
|
+
declare function markReadableDerivedSubscribersDirty(source: ReadableSource<unknown>): void;
|
|
23
|
+
declare function markReactivePropsDirtySource(source: ReadableSource<unknown>): void;
|
|
24
|
+
declare function notifyReadableReaders(source: ReadableSource<unknown>): boolean;
|
|
25
|
+
//#endregion
|
|
26
|
+
export { ReadableSource };
|
|
27
|
+
//# sourceMappingURL=readable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readable.d.ts","names":[],"sources":["../../src/runtime/readable.ts"],"mappings":";;;UAGiB,iBAAA;EACf,UAAA;EACA,yBAAA,GAA4B,GAAA,CAAI,cAAA;AAAA;AAAA,UAGjB,cAAA;EAAA,IACX,CAAA;EACJ,YAAA;EACA,QAAA,GAAW,GAAA,CAAI,iBAAA;EACf,mBAAA,GAAsB,GAAA,CAAI,iBAAA;AAAA;AAAA,iBAGZ,iBAAA,CAAkB,MAAA;AAAA,iBAkBlB,kBAAA,CAAmB,MAAA,EAAQ,cAAA;AAAA,iBA4B3B,2BAAA,GAAA,CACd,cAAA,EAAgB,GAAA,CAAI,cAAA,YACpB,EAAA,QAAU,CAAA,GACT,CAAA;AAAA,iBAWa,6BAAA,CACd,QAAA,EAAU,iBAAA;AAAA,iBAoCI,4BAAA,CACd,QAAA,EAAU,iBAAA;AAAA,iBAaI,uBAAA,GAAA,CACd,UAAA,EAAY,iBAAA,EACZ,EAAA,QAAU,CAAA,GACT,CAAA;AAAA,iBAaa,kCAAA,CACd,UAAA,EAAY,iBAAA,EACZ,WAAA,EAAa,GAAA,CAAI,cAAA,YACjB,WAAA,EAAa,GAAA,CAAI,cAAA;AAAA,iBAkBH,mCAAA,CACd,UAAA,EAAY,iBAAA,EACZ,OAAA,EAAS,GAAA,CAAI,cAAA;AAAA,iBAQC,mCAAA,CACd,MAAA,EAAQ,cAAA;AAAA,iBAYM,4BAAA,CACd,MAAA,EAAQ,cAAA;AAAA,iBAaM,qBAAA,CACd,MAAA,EAAQ,cAAA"}
|