@askrjs/askr 0.0.28 → 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 +44 -172
- 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 +22 -26
- package/dist/bin/askr-ssg.d.ts.map +1 -1
- package/dist/bin/askr-ssg.js +149 -2
- 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 -23
- 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 -34
- 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 -56
- 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 +12 -9
- 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 -1
- package/dist/runtime/perf-metrics.js.map +1 -0
- package/dist/runtime/readable.d.ts +24 -18
- package/dist/runtime/readable.d.ts.map +1 -1
- package/dist/runtime/readable.js +118 -1
- 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 -50
- 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 +7 -5
- package/dist/runtime/selector.d.ts.map +1 -1
- package/dist/runtime/selector.js +188 -1
- 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 -19
- 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 +10 -10
- package/dist/ssg/batch-render.d.ts.map +1 -1
- package/dist/ssg/batch-render.js +84 -1
- package/dist/ssg/batch-render.js.map +1 -0
- package/dist/ssg/create-static-gen.d.ts +28 -29
- package/dist/ssg/create-static-gen.d.ts.map +1 -1
- package/dist/ssg/create-static-gen.js +282 -1
- package/dist/ssg/create-static-gen.js.map +1 -0
- package/dist/ssg/generate-metadata.d.ts +12 -15
- package/dist/ssg/generate-metadata.d.ts.map +1 -1
- package/dist/ssg/generate-metadata.js +94 -1
- package/dist/ssg/generate-metadata.js.map +1 -0
- package/dist/ssg/incremental-manifest.js +56 -1
- package/dist/ssg/incremental-manifest.js.map +1 -0
- package/dist/ssg/index.d.ts +8 -28
- package/dist/ssg/index.js +7 -1
- package/dist/ssg/resolve-ssg-data.d.ts +10 -13
- package/dist/ssg/resolve-ssg-data.d.ts.map +1 -1
- package/dist/ssg/resolve-ssg-data.js +46 -1
- package/dist/ssg/resolve-ssg-data.js.map +1 -0
- package/dist/ssg/route-utils.d.ts +14 -10
- package/dist/ssg/route-utils.d.ts.map +1 -1
- package/dist/ssg/route-utils.js +24 -1
- package/dist/ssg/route-utils.js.map +1 -0
- package/dist/ssg/types.d.ts +157 -144
- package/dist/ssg/types.d.ts.map +1 -1
- package/dist/ssg/write-static-files.d.ts +8 -14
- package/dist/ssg/write-static-files.d.ts.map +1 -1
- package/dist/ssg/write-static-files.js +73 -1
- 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 -35
- 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 +74 -72
- 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 +49 -69
- 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/_fs.js +0 -1
- package/dist/_virtual/_path.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 -25
- 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 -28
- package/dist/renderer/cleanup.d.ts.map +0 -1
- package/dist/renderer/dom.d.ts +0 -64
- 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 -53
- 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/perf-metrics.d.ts +0 -25
- package/dist/runtime/perf-metrics.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/ssg/discover-resources.d.ts +0 -15
- package/dist/ssg/discover-resources.d.ts.map +0 -1
- package/dist/ssg/incremental-manifest.d.ts +0 -23
- package/dist/ssg/incremental-manifest.d.ts.map +0 -1
- package/dist/ssg/index.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 -4
|
@@ -1 +1,57 @@
|
|
|
1
|
-
|
|
1
|
+
import { isProductionEnvironment } from "../common/env.js";
|
|
2
|
+
//#region src/runtime/dev-namespace.ts
|
|
3
|
+
/**
|
|
4
|
+
* Dev-only namespace helpers for diagnostics
|
|
5
|
+
*
|
|
6
|
+
* Centralizes the repetitive globalThis.__ASKR__ access pattern
|
|
7
|
+
* used throughout runtime for dev-mode diagnostics.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Get or create the __ASKR__ dev namespace on globalThis.
|
|
11
|
+
* Returns empty object in production to avoid allocations.
|
|
12
|
+
*/
|
|
13
|
+
function getDevNamespace() {
|
|
14
|
+
if (isProductionEnvironment()) return {};
|
|
15
|
+
try {
|
|
16
|
+
const g = globalThis;
|
|
17
|
+
if (!g.__ASKR__) g.__ASKR__ = {};
|
|
18
|
+
return g.__ASKR__;
|
|
19
|
+
} catch {
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Set a value in the dev namespace (no-op in production).
|
|
25
|
+
*/
|
|
26
|
+
function setDevValue(key, value) {
|
|
27
|
+
if (isProductionEnvironment()) return;
|
|
28
|
+
try {
|
|
29
|
+
getDevNamespace()[key] = value;
|
|
30
|
+
} catch {}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get a value from the dev namespace (returns undefined in production).
|
|
34
|
+
*/
|
|
35
|
+
function getDevValue(key) {
|
|
36
|
+
if (isProductionEnvironment()) return void 0;
|
|
37
|
+
try {
|
|
38
|
+
return getDevNamespace()[key];
|
|
39
|
+
} catch {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Increment a counter in the dev namespace (no-op in production).
|
|
45
|
+
* Safely handles non-number values by resetting to 1.
|
|
46
|
+
*/
|
|
47
|
+
function incDevCounter(key) {
|
|
48
|
+
if (isProductionEnvironment()) return;
|
|
49
|
+
try {
|
|
50
|
+
const ns = getDevNamespace();
|
|
51
|
+
ns[key] = (typeof ns[key] === "number" ? ns[key] : 0) + 1;
|
|
52
|
+
} catch {}
|
|
53
|
+
}
|
|
54
|
+
//#endregion
|
|
55
|
+
export { getDevNamespace, getDevValue, incDevCounter, setDevValue };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=dev-namespace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-namespace.js","names":[],"sources":["../../src/runtime/dev-namespace.ts"],"sourcesContent":["/**\n * Dev-only namespace helpers for diagnostics\n *\n * Centralizes the repetitive globalThis.__ASKR__ access pattern\n * used throughout runtime for dev-mode diagnostics.\n */\n\nimport { isProductionEnvironment } from '../common/env';\n\ntype DevNamespace = Record<string, unknown>;\n\n/**\n * Get or create the __ASKR__ dev namespace on globalThis.\n * Returns empty object in production to avoid allocations.\n */\nexport function getDevNamespace(): DevNamespace {\n if (isProductionEnvironment()) return {};\n try {\n const g = globalThis as unknown as Record<string, DevNamespace>;\n if (!g.__ASKR__) g.__ASKR__ = {};\n return g.__ASKR__;\n } catch {\n return {};\n }\n}\n\n/**\n * Set a value in the dev namespace (no-op in production).\n */\nexport function setDevValue(key: string, value: unknown): void {\n if (isProductionEnvironment()) return;\n try {\n getDevNamespace()[key] = value;\n } catch {\n // ignore\n }\n}\n\n/**\n * Get a value from the dev namespace (returns undefined in production).\n */\nexport function getDevValue<T>(key: string): T | undefined {\n if (isProductionEnvironment()) return undefined;\n try {\n return getDevNamespace()[key] as T | undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Delete a value from the dev namespace (no-op in production).\n */\nexport function deleteDevValue(key: string): void {\n if (isProductionEnvironment()) return;\n try {\n delete getDevNamespace()[key];\n } catch {\n // ignore\n }\n}\n\n/**\n * Increment a counter in the dev namespace (no-op in production).\n * Safely handles non-number values by resetting to 1.\n */\nexport function incDevCounter(key: string): void {\n if (isProductionEnvironment()) return;\n try {\n const ns = getDevNamespace();\n const prev = typeof ns[key] === 'number' ? (ns[key] as number) : 0;\n ns[key] = prev + 1;\n } catch {\n // ignore\n }\n}\n"],"mappings":";;;;;;;;;;;;AAeA,SAAgB,kBAAgC;AAC9C,KAAI,yBAAyB,CAAE,QAAO,EAAE;AACxC,KAAI;EACF,MAAM,IAAI;AACV,MAAI,CAAC,EAAE,SAAU,GAAE,WAAW,EAAE;AAChC,SAAO,EAAE;SACH;AACN,SAAO,EAAE;;;;;;AAOb,SAAgB,YAAY,KAAa,OAAsB;AAC7D,KAAI,yBAAyB,CAAE;AAC/B,KAAI;AACF,mBAAiB,CAAC,OAAO;SACnB;;;;;AAQV,SAAgB,YAAe,KAA4B;AACzD,KAAI,yBAAyB,CAAE,QAAO;AACtC,KAAI;AACF,SAAO,iBAAiB,CAAC;SACnB;AACN;;;;;;;AAoBJ,SAAgB,cAAc,KAAmB;AAC/C,KAAI,yBAAyB,CAAE;AAC/B,KAAI;EACF,MAAM,KAAK,iBAAiB;AAE5B,KAAG,QADU,OAAO,GAAG,SAAS,WAAY,GAAG,OAAkB,KAChD;SACX"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ReadableSource } from "./readable.js";
|
|
2
|
+
import { SchedulerLane } from "./scheduler.js";
|
|
3
|
+
|
|
4
|
+
//#region src/runtime/effect.d.ts
|
|
5
|
+
interface FineGrainedEffect<T> {
|
|
6
|
+
lane: SchedulerLane;
|
|
7
|
+
compute(): T;
|
|
8
|
+
commit(value: T, previousValue: T | undefined): void;
|
|
9
|
+
equals(previousValue: T, nextValue: T): boolean;
|
|
10
|
+
readSources: Set<ReadableSource<unknown>>;
|
|
11
|
+
isActive: boolean;
|
|
12
|
+
hasValue: boolean;
|
|
13
|
+
lastValue: T | undefined;
|
|
14
|
+
onError?(error: unknown): void;
|
|
15
|
+
}
|
|
16
|
+
interface FineGrainedEffectHandle<T> {
|
|
17
|
+
cleanup(): void;
|
|
18
|
+
updateCompute(nextCompute: () => T): void;
|
|
19
|
+
flush(): void;
|
|
20
|
+
}
|
|
21
|
+
interface CreateFineGrainedEffectOptions<T> {
|
|
22
|
+
lane: SchedulerLane;
|
|
23
|
+
compute: () => T;
|
|
24
|
+
commit: (value: T, previousValue: T | undefined) => void;
|
|
25
|
+
equals?: (previousValue: T, nextValue: T) => boolean;
|
|
26
|
+
onError?: (error: unknown) => void;
|
|
27
|
+
}
|
|
28
|
+
declare function markFineGrainedEffectsDirtySource(source: ReadableSource<unknown>): void;
|
|
29
|
+
declare function createFineGrainedEffect<T>(options: CreateFineGrainedEffectOptions<T>): FineGrainedEffectHandle<T>;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { FineGrainedEffectHandle };
|
|
32
|
+
//# sourceMappingURL=effect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect.d.ts","names":[],"sources":["../../src/runtime/effect.ts"],"mappings":";;;;UA6BiB,iBAAA;EACf,IAAA,EAAM,aAAA;EACN,OAAA,IAAW,CAAA;EACX,MAAA,CAAO,KAAA,EAAO,CAAA,EAAG,aAAA,EAAe,CAAA;EAChC,MAAA,CAAO,aAAA,EAAe,CAAA,EAAG,SAAA,EAAW,CAAA;EACpC,WAAA,EAAa,GAAA,CAAI,cAAA;EACjB,QAAA;EACA,QAAA;EACA,SAAA,EAAW,CAAA;EACX,OAAA,EAAS,KAAA;AAAA;AAAA,UAGM,uBAAA;EACf,OAAA;EACA,aAAA,CAAc,WAAA,QAAmB,CAAA;EACjC,KAAA;AAAA;AAAA,UAGe,8BAAA;EACf,IAAA,EAAM,aAAA;EACN,OAAA,QAAe,CAAA;EACf,MAAA,GAAS,KAAA,EAAO,CAAA,EAAG,aAAA,EAAe,CAAA;EAClC,MAAA,IAAU,aAAA,EAAe,CAAA,EAAG,SAAA,EAAW,CAAA;EACvC,OAAA,IAAW,KAAA;AAAA;AAAA,iBA+JG,iCAAA,CACd,MAAA,EAAQ,cAAA;AAAA,iBAqBM,uBAAA,GAAA,CACd,OAAA,EAAS,8BAAA,CAA+B,CAAA,IACvC,uBAAA,CAAwB,CAAA"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { globalScheduler } from "./scheduler.js";
|
|
2
|
+
import { withFineGrainedReadTracking } from "./readable.js";
|
|
3
|
+
import { incDevCounter } from "./dev-namespace.js";
|
|
4
|
+
//#region src/runtime/effect.ts
|
|
5
|
+
const effectSources = /* @__PURE__ */ new WeakMap();
|
|
6
|
+
const dirtyEffectsByLane = {
|
|
7
|
+
derived: /* @__PURE__ */ new Set(),
|
|
8
|
+
component: /* @__PURE__ */ new Set(),
|
|
9
|
+
reactive: /* @__PURE__ */ new Set(),
|
|
10
|
+
post: /* @__PURE__ */ new Set()
|
|
11
|
+
};
|
|
12
|
+
const hasPendingLaneFlush = {
|
|
13
|
+
derived: false,
|
|
14
|
+
component: false,
|
|
15
|
+
reactive: false,
|
|
16
|
+
post: false
|
|
17
|
+
};
|
|
18
|
+
const _evalSourceBuffer = /* @__PURE__ */ new Set();
|
|
19
|
+
function registerEffectSource(source, effect) {
|
|
20
|
+
let effects = effectSources.get(source);
|
|
21
|
+
if (!effects) {
|
|
22
|
+
effects = /* @__PURE__ */ new Set();
|
|
23
|
+
effectSources.set(source, effects);
|
|
24
|
+
}
|
|
25
|
+
effects.add(effect);
|
|
26
|
+
}
|
|
27
|
+
function unregisterEffectSource(source, effect) {
|
|
28
|
+
effectSources.get(source)?.delete(effect);
|
|
29
|
+
}
|
|
30
|
+
function clearEffectSubscriptions(effect) {
|
|
31
|
+
for (const source of effect.readSources) unregisterEffectSource(source, effect);
|
|
32
|
+
effect.readSources.clear();
|
|
33
|
+
}
|
|
34
|
+
function normalizeNextSources(previousSources, pendingSources) {
|
|
35
|
+
if (previousSources.size === pendingSources.size) {
|
|
36
|
+
let same = true;
|
|
37
|
+
for (const source of previousSources) if (!pendingSources.has(source)) {
|
|
38
|
+
same = false;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
if (same) return previousSources;
|
|
42
|
+
}
|
|
43
|
+
return new Set(pendingSources);
|
|
44
|
+
}
|
|
45
|
+
function evaluateEffect(effect) {
|
|
46
|
+
_evalSourceBuffer.clear();
|
|
47
|
+
try {
|
|
48
|
+
incDevCounter("effectRuns");
|
|
49
|
+
return {
|
|
50
|
+
value: withFineGrainedReadTracking(_evalSourceBuffer, () => effect.compute()),
|
|
51
|
+
nextSources: normalizeNextSources(effect.readSources, _evalSourceBuffer)
|
|
52
|
+
};
|
|
53
|
+
} finally {
|
|
54
|
+
_evalSourceBuffer.clear();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function commitEffectSubscriptions(effect, nextSources) {
|
|
58
|
+
const previousSources = effect.readSources;
|
|
59
|
+
if (previousSources === nextSources) return;
|
|
60
|
+
for (const source of previousSources) if (!nextSources.has(source)) unregisterEffectSource(source, effect);
|
|
61
|
+
for (const source of nextSources) if (!previousSources.has(source)) registerEffectSource(source, effect);
|
|
62
|
+
effect.readSources = nextSources;
|
|
63
|
+
}
|
|
64
|
+
function commitEffectResult(effect, value, nextSources) {
|
|
65
|
+
const previousValue = effect.lastValue;
|
|
66
|
+
if (!effect.hasValue || !effect.equals(previousValue, value)) effect.commit(value, effect.hasValue ? previousValue : void 0);
|
|
67
|
+
commitEffectSubscriptions(effect, nextSources);
|
|
68
|
+
effect.lastValue = value;
|
|
69
|
+
effect.hasValue = true;
|
|
70
|
+
}
|
|
71
|
+
function flushLaneEffects(lane) {
|
|
72
|
+
hasPendingLaneFlush[lane] = false;
|
|
73
|
+
const effects = dirtyEffectsByLane[lane];
|
|
74
|
+
if (effects.size === 0) return;
|
|
75
|
+
const pending = Array.from(effects);
|
|
76
|
+
effects.clear();
|
|
77
|
+
for (const effect of pending) {
|
|
78
|
+
if (!effect.isActive) continue;
|
|
79
|
+
try {
|
|
80
|
+
const { value, nextSources } = evaluateEffect(effect);
|
|
81
|
+
commitEffectResult(effect, value, nextSources);
|
|
82
|
+
} catch (error) {
|
|
83
|
+
effect.onError?.(error);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function scheduleLaneFlush(lane) {
|
|
88
|
+
if (hasPendingLaneFlush[lane]) return;
|
|
89
|
+
hasPendingLaneFlush[lane] = true;
|
|
90
|
+
globalScheduler.enqueueInLane(lane, () => {
|
|
91
|
+
flushLaneEffects(lane);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
function unscheduleEffect(effect) {
|
|
95
|
+
dirtyEffectsByLane[effect.lane].delete(effect);
|
|
96
|
+
}
|
|
97
|
+
function recomputeEffectNow(effect) {
|
|
98
|
+
const { value, nextSources } = evaluateEffect(effect);
|
|
99
|
+
commitEffectResult(effect, value, nextSources);
|
|
100
|
+
}
|
|
101
|
+
function markFineGrainedEffectsDirtySource(source) {
|
|
102
|
+
const effects = effectSources.get(source);
|
|
103
|
+
if (!effects || effects.size === 0) return;
|
|
104
|
+
for (const effect of effects) {
|
|
105
|
+
if (!effect.isActive) continue;
|
|
106
|
+
dirtyEffectsByLane[effect.lane].add(effect);
|
|
107
|
+
}
|
|
108
|
+
for (const lane of Object.keys(hasPendingLaneFlush)) if (dirtyEffectsByLane[lane].size > 0) scheduleLaneFlush(lane);
|
|
109
|
+
}
|
|
110
|
+
function createFineGrainedEffect(options) {
|
|
111
|
+
const effect = {
|
|
112
|
+
lane: options.lane,
|
|
113
|
+
compute: options.compute,
|
|
114
|
+
commit: options.commit,
|
|
115
|
+
equals: options.equals ?? Object.is,
|
|
116
|
+
readSources: /* @__PURE__ */ new Set(),
|
|
117
|
+
isActive: true,
|
|
118
|
+
hasValue: false,
|
|
119
|
+
lastValue: void 0,
|
|
120
|
+
onError: options.onError
|
|
121
|
+
};
|
|
122
|
+
recomputeEffectNow(effect);
|
|
123
|
+
return {
|
|
124
|
+
cleanup() {
|
|
125
|
+
if (!effect.isActive) return;
|
|
126
|
+
effect.isActive = false;
|
|
127
|
+
unscheduleEffect(effect);
|
|
128
|
+
clearEffectSubscriptions(effect);
|
|
129
|
+
},
|
|
130
|
+
updateCompute(nextCompute) {
|
|
131
|
+
if (!effect.isActive) return;
|
|
132
|
+
effect.compute = nextCompute;
|
|
133
|
+
unscheduleEffect(effect);
|
|
134
|
+
recomputeEffectNow(effect);
|
|
135
|
+
},
|
|
136
|
+
flush() {
|
|
137
|
+
if (!effect.isActive) return;
|
|
138
|
+
unscheduleEffect(effect);
|
|
139
|
+
recomputeEffectNow(effect);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
//#endregion
|
|
144
|
+
export { createFineGrainedEffect, markFineGrainedEffectsDirtySource };
|
|
145
|
+
|
|
146
|
+
//# sourceMappingURL=effect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect.js","names":[],"sources":["../../src/runtime/effect.ts"],"sourcesContent":["import { incDevCounter } from './dev-namespace';\nimport { type ReadableSource, withFineGrainedReadTracking } from './readable';\nimport { globalScheduler, type SchedulerLane } from './scheduler';\n\ntype EffectRegistry = WeakMap<\n ReadableSource<unknown>,\n Set<FineGrainedEffect<unknown>>\n>;\n\ntype EffectFlushSets = Record<SchedulerLane, Set<FineGrainedEffect<unknown>>>;\n\ntype EffectPendingFlushState = Record<SchedulerLane, boolean>;\n\nconst effectSources: EffectRegistry = new WeakMap();\nconst dirtyEffectsByLane: EffectFlushSets = {\n derived: new Set(),\n component: new Set(),\n reactive: new Set(),\n post: new Set(),\n};\nconst hasPendingLaneFlush: EffectPendingFlushState = {\n derived: false,\n component: false,\n reactive: false,\n post: false,\n};\n\nconst _evalSourceBuffer = new Set<ReadableSource<unknown>>();\n\nexport interface FineGrainedEffect<T> {\n lane: SchedulerLane;\n compute(): T;\n commit(value: T, previousValue: T | undefined): void;\n equals(previousValue: T, nextValue: T): boolean;\n readSources: Set<ReadableSource<unknown>>;\n isActive: boolean;\n hasValue: boolean;\n lastValue: T | undefined;\n onError?(error: unknown): void;\n}\n\nexport interface FineGrainedEffectHandle<T> {\n cleanup(): void;\n updateCompute(nextCompute: () => T): void;\n flush(): void;\n}\n\nexport interface CreateFineGrainedEffectOptions<T> {\n lane: SchedulerLane;\n compute: () => T;\n commit: (value: T, previousValue: T | undefined) => void;\n equals?: (previousValue: T, nextValue: T) => boolean;\n onError?: (error: unknown) => void;\n}\n\nfunction registerEffectSource(\n source: ReadableSource<unknown>,\n effect: FineGrainedEffect<unknown>\n): void {\n let effects = effectSources.get(source);\n if (!effects) {\n effects = new Set();\n effectSources.set(source, effects);\n }\n effects.add(effect);\n}\n\nfunction unregisterEffectSource(\n source: ReadableSource<unknown>,\n effect: FineGrainedEffect<unknown>\n): void {\n effectSources.get(source)?.delete(effect);\n}\n\nfunction clearEffectSubscriptions(effect: FineGrainedEffect<unknown>): void {\n for (const source of effect.readSources) {\n unregisterEffectSource(source, effect);\n }\n effect.readSources.clear();\n}\n\nfunction normalizeNextSources(\n previousSources: Set<ReadableSource<unknown>>,\n pendingSources: Set<ReadableSource<unknown>>\n): Set<ReadableSource<unknown>> {\n if (previousSources.size === pendingSources.size) {\n let same = true;\n for (const source of previousSources) {\n if (!pendingSources.has(source)) {\n same = false;\n break;\n }\n }\n\n if (same) {\n return previousSources;\n }\n }\n\n return new Set(pendingSources);\n}\n\nfunction evaluateEffect<T>(effect: FineGrainedEffect<T>): {\n value: T;\n nextSources: Set<ReadableSource<unknown>>;\n} {\n _evalSourceBuffer.clear();\n\n try {\n incDevCounter('effectRuns');\n const value = withFineGrainedReadTracking(_evalSourceBuffer, () =>\n effect.compute()\n );\n const nextSources = normalizeNextSources(\n effect.readSources,\n _evalSourceBuffer\n );\n return { value, nextSources };\n } finally {\n _evalSourceBuffer.clear();\n }\n}\n\nfunction commitEffectSubscriptions(\n effect: FineGrainedEffect<unknown>,\n nextSources: Set<ReadableSource<unknown>>\n): void {\n const previousSources = effect.readSources;\n\n if (previousSources === nextSources) {\n return;\n }\n\n for (const source of previousSources) {\n if (!nextSources.has(source)) {\n unregisterEffectSource(source, effect);\n }\n }\n\n for (const source of nextSources) {\n if (!previousSources.has(source)) {\n registerEffectSource(source, effect);\n }\n }\n\n effect.readSources = nextSources;\n}\n\nfunction commitEffectResult<T>(\n effect: FineGrainedEffect<T>,\n value: T,\n nextSources: Set<ReadableSource<unknown>>\n): void {\n const previousValue = effect.lastValue;\n const shouldCommit =\n !effect.hasValue || !effect.equals(previousValue as T, value);\n\n if (shouldCommit) {\n effect.commit(value, effect.hasValue ? previousValue : undefined);\n }\n\n commitEffectSubscriptions(effect, nextSources);\n effect.lastValue = value;\n effect.hasValue = true;\n}\n\nfunction flushLaneEffects(lane: SchedulerLane): void {\n hasPendingLaneFlush[lane] = false;\n\n const effects = dirtyEffectsByLane[lane];\n if (effects.size === 0) {\n return;\n }\n\n const pending = Array.from(effects);\n effects.clear();\n\n for (const effect of pending) {\n if (!effect.isActive) {\n continue;\n }\n\n try {\n const { value, nextSources } = evaluateEffect(effect);\n commitEffectResult(effect, value, nextSources);\n } catch (error) {\n effect.onError?.(error);\n }\n }\n}\n\nfunction scheduleLaneFlush(lane: SchedulerLane): void {\n if (hasPendingLaneFlush[lane]) {\n return;\n }\n\n hasPendingLaneFlush[lane] = true;\n globalScheduler.enqueueInLane(lane, () => {\n flushLaneEffects(lane);\n });\n}\n\nfunction unscheduleEffect(effect: FineGrainedEffect<unknown>): void {\n dirtyEffectsByLane[effect.lane].delete(effect);\n}\n\nfunction recomputeEffectNow<T>(effect: FineGrainedEffect<T>): void {\n const { value, nextSources } = evaluateEffect(effect);\n commitEffectResult(effect, value, nextSources);\n}\n\nexport function markFineGrainedEffectsDirtySource(\n source: ReadableSource<unknown>\n): void {\n const effects = effectSources.get(source);\n if (!effects || effects.size === 0) {\n return;\n }\n\n for (const effect of effects) {\n if (!effect.isActive) {\n continue;\n }\n dirtyEffectsByLane[effect.lane].add(effect);\n }\n\n for (const lane of Object.keys(hasPendingLaneFlush) as SchedulerLane[]) {\n if (dirtyEffectsByLane[lane].size > 0) {\n scheduleLaneFlush(lane);\n }\n }\n}\n\nexport function createFineGrainedEffect<T>(\n options: CreateFineGrainedEffectOptions<T>\n): FineGrainedEffectHandle<T> {\n const effect: FineGrainedEffect<T> = {\n lane: options.lane,\n compute: options.compute,\n commit: options.commit,\n equals: options.equals ?? Object.is,\n readSources: new Set(),\n isActive: true,\n hasValue: false,\n lastValue: undefined,\n onError: options.onError,\n };\n\n recomputeEffectNow(effect);\n\n return {\n cleanup(): void {\n if (!effect.isActive) {\n return;\n }\n\n effect.isActive = false;\n unscheduleEffect(effect);\n clearEffectSubscriptions(effect);\n },\n\n updateCompute(nextCompute: () => T): void {\n if (!effect.isActive) {\n return;\n }\n\n effect.compute = nextCompute;\n unscheduleEffect(effect);\n recomputeEffectNow(effect);\n },\n\n flush(): void {\n if (!effect.isActive) {\n return;\n }\n\n unscheduleEffect(effect);\n recomputeEffectNow(effect);\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/runtime/events.js
CHANGED
|
@@ -1 +1,162 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import { logger } from "../dev/logger.js";
|
|
2
|
+
import { incrementPerfMetric } from "./perf-metrics.js";
|
|
3
|
+
import { globalScheduler } from "./scheduler.js";
|
|
4
|
+
import { incDevCounter } from "./dev-namespace.js";
|
|
5
|
+
//#region src/runtime/events.ts
|
|
6
|
+
/**
|
|
7
|
+
* Event delegation system for Askr
|
|
8
|
+
*
|
|
9
|
+
* Provides efficient event handling by attaching listeners to a container
|
|
10
|
+
* instead of individual elements. This significantly reduces memory usage
|
|
11
|
+
* and improves performance when many elements have the same event type.
|
|
12
|
+
*
|
|
13
|
+
* Delegated handling is enabled by default. Tests and internal runtime code
|
|
14
|
+
* can still disable or re-enable it when they need to exercise both modes.
|
|
15
|
+
*/
|
|
16
|
+
const DELEGATED_EVENTS = [
|
|
17
|
+
"click",
|
|
18
|
+
"dblclick",
|
|
19
|
+
"mousedown",
|
|
20
|
+
"mouseup",
|
|
21
|
+
"mouseover",
|
|
22
|
+
"mouseout",
|
|
23
|
+
"mousemove",
|
|
24
|
+
"focus",
|
|
25
|
+
"blur",
|
|
26
|
+
"input",
|
|
27
|
+
"change",
|
|
28
|
+
"keydown",
|
|
29
|
+
"keyup",
|
|
30
|
+
"keypress",
|
|
31
|
+
"submit",
|
|
32
|
+
"scroll",
|
|
33
|
+
"wheel",
|
|
34
|
+
"touchstart",
|
|
35
|
+
"touchend",
|
|
36
|
+
"touchmove",
|
|
37
|
+
"touchcancel"
|
|
38
|
+
];
|
|
39
|
+
const delegatedHandlers = /* @__PURE__ */ new WeakMap();
|
|
40
|
+
let eventDelegationEnabled = true;
|
|
41
|
+
const containerDelegatedListeners = /* @__PURE__ */ new Map();
|
|
42
|
+
function isEventDelegationEnabled() {
|
|
43
|
+
return eventDelegationEnabled;
|
|
44
|
+
}
|
|
45
|
+
function getDelegationContainer() {
|
|
46
|
+
if (typeof document !== "undefined") return document.body;
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
function attachDelegatedListener(container, element, eventName, handler, originalHandler, options) {
|
|
50
|
+
if (!containerDelegatedListeners.has(container)) containerDelegatedListeners.set(container, /* @__PURE__ */ new Map());
|
|
51
|
+
const containerListeners = containerDelegatedListeners.get(container);
|
|
52
|
+
if (!containerListeners.has(eventName)) {
|
|
53
|
+
const delegatedHandler = (e) => {
|
|
54
|
+
const target = e.target;
|
|
55
|
+
if (!target) return;
|
|
56
|
+
globalScheduler.runInHandlerScope(() => {
|
|
57
|
+
let current = target;
|
|
58
|
+
while (current && current !== container) {
|
|
59
|
+
incrementPerfMetric("delegatedAncestorHops");
|
|
60
|
+
const store = delegatedHandlers.get(current);
|
|
61
|
+
const entry = !store ? void 0 : store instanceof Map ? store.get(eventName) : store.eventName === eventName ? store : void 0;
|
|
62
|
+
if (entry) try {
|
|
63
|
+
entry.handler(e);
|
|
64
|
+
} catch (error) {
|
|
65
|
+
logger.error("[Askr] Delegated event error:", error);
|
|
66
|
+
}
|
|
67
|
+
if (e.cancelBubble) break;
|
|
68
|
+
current = current.parentElement;
|
|
69
|
+
}
|
|
70
|
+
}, "sync");
|
|
71
|
+
};
|
|
72
|
+
const listenerOptions = getPassiveOptions(eventName) ?? options;
|
|
73
|
+
container.addEventListener(eventName, delegatedHandler, listenerOptions);
|
|
74
|
+
containerListeners.set(eventName, delegatedHandler);
|
|
75
|
+
}
|
|
76
|
+
setDelegatedHandlerForElement(element, {
|
|
77
|
+
handler,
|
|
78
|
+
original: originalHandler,
|
|
79
|
+
element,
|
|
80
|
+
eventName,
|
|
81
|
+
options
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
function setDelegatedHandlerForElement(element, entry) {
|
|
85
|
+
const existing = delegatedHandlers.get(element);
|
|
86
|
+
if (!existing) {
|
|
87
|
+
delegatedHandlers.set(element, entry);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (existing instanceof Map) {
|
|
91
|
+
existing.set(entry.eventName, entry);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (existing.eventName === entry.eventName) {
|
|
95
|
+
delegatedHandlers.set(element, entry);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const next = /* @__PURE__ */ new Map();
|
|
99
|
+
next.set(existing.eventName, existing);
|
|
100
|
+
next.set(entry.eventName, entry);
|
|
101
|
+
delegatedHandlers.set(element, next);
|
|
102
|
+
}
|
|
103
|
+
function getPassiveOptions(eventName) {
|
|
104
|
+
if (eventName === "wheel" || eventName === "scroll" || eventName.startsWith("touch")) return { passive: true };
|
|
105
|
+
}
|
|
106
|
+
function addDelegatedListener(element, eventName, handler, originalHandler, options) {
|
|
107
|
+
const container = getDelegationContainer();
|
|
108
|
+
if (!container) return;
|
|
109
|
+
incDevCounter("listenerAdds");
|
|
110
|
+
attachDelegatedListener(container, element, eventName, handler, originalHandler, options);
|
|
111
|
+
}
|
|
112
|
+
function updateDelegatedListener(element, eventName, handler, originalHandler, options) {
|
|
113
|
+
const existing = getDelegatedHandlerForElement(element, eventName);
|
|
114
|
+
if (!existing) return false;
|
|
115
|
+
existing.handler = handler;
|
|
116
|
+
existing.original = originalHandler;
|
|
117
|
+
existing.options = options;
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
function removeDelegatedListener(element, eventName) {
|
|
121
|
+
const existing = delegatedHandlers.get(element);
|
|
122
|
+
if (!existing) return;
|
|
123
|
+
if (existing instanceof Map) {
|
|
124
|
+
if (existing.has(eventName)) incDevCounter("listenerRemoves");
|
|
125
|
+
existing.delete(eventName);
|
|
126
|
+
if (existing.size === 0) {
|
|
127
|
+
delegatedHandlers.delete(element);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (existing.size === 1) {
|
|
131
|
+
const only = existing.values().next().value;
|
|
132
|
+
delegatedHandlers.set(element, only);
|
|
133
|
+
}
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (existing.eventName === eventName) {
|
|
137
|
+
incDevCounter("listenerRemoves");
|
|
138
|
+
delegatedHandlers.delete(element);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function getDelegatedHandlerForElement(element, eventName) {
|
|
142
|
+
const store = delegatedHandlers.get(element);
|
|
143
|
+
if (!store) return void 0;
|
|
144
|
+
if (store instanceof Map) return store.get(eventName);
|
|
145
|
+
return store.eventName === eventName ? store : void 0;
|
|
146
|
+
}
|
|
147
|
+
function getDelegatedHandlersForElement(element) {
|
|
148
|
+
const store = delegatedHandlers.get(element);
|
|
149
|
+
if (!store) return void 0;
|
|
150
|
+
if (store instanceof Map) return store;
|
|
151
|
+
return new Map([[store.eventName, store]]);
|
|
152
|
+
}
|
|
153
|
+
function clearDelegatedHandlersForElement(element) {
|
|
154
|
+
delegatedHandlers.delete(element);
|
|
155
|
+
}
|
|
156
|
+
function isDelegatedEvent(eventName) {
|
|
157
|
+
return DELEGATED_EVENTS.includes(eventName);
|
|
158
|
+
}
|
|
159
|
+
//#endregion
|
|
160
|
+
export { addDelegatedListener, clearDelegatedHandlersForElement, getDelegatedHandlerForElement, getDelegatedHandlersForElement, isDelegatedEvent, isEventDelegationEnabled, removeDelegatedListener, updateDelegatedListener };
|
|
161
|
+
|
|
162
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","names":[],"sources":["../../src/runtime/events.ts"],"sourcesContent":["/**\n * Event delegation system for Askr\n *\n * Provides efficient event handling by attaching listeners to a container\n * instead of individual elements. This significantly reduces memory usage\n * and improves performance when many elements have the same event type.\n *\n * Delegated handling is enabled by default. Tests and internal runtime code\n * can still disable or re-enable it when they need to exercise both modes.\n */\n\nimport { globalScheduler } from './scheduler';\nimport { logger } from '../dev/logger';\nimport { incrementPerfMetric } from './perf-metrics';\nimport { incDevCounter } from './dev-namespace';\n\nexport interface DelegatedEventMap {\n click: MouseEvent;\n dblclick: MouseEvent;\n mousedown: MouseEvent;\n mouseup: MouseEvent;\n mouseover: MouseEvent;\n mouseout: MouseEvent;\n mousemove: MouseEvent;\n focus: FocusEvent;\n blur: FocusEvent;\n input: InputEvent;\n change: Event;\n keydown: KeyboardEvent;\n keyup: KeyboardEvent;\n keypress: KeyboardEvent;\n submit: Event;\n scroll: Event;\n wheel: WheelEvent;\n touchstart: TouchEvent;\n touchend: TouchEvent;\n touchmove: TouchEvent;\n touchcancel: TouchEvent;\n}\n\nconst DELEGATED_EVENTS: (keyof DelegatedEventMap)[] = [\n 'click',\n 'dblclick',\n 'mousedown',\n 'mouseup',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'focus',\n 'blur',\n 'input',\n 'change',\n 'keydown',\n 'keyup',\n 'keypress',\n 'submit',\n 'scroll',\n 'wheel',\n 'touchstart',\n 'touchend',\n 'touchmove',\n 'touchcancel',\n];\n\ninterface DelegatedHandler {\n handler: EventListener;\n original: EventListener;\n element: Element;\n eventName: string;\n options?: AddEventListenerOptions;\n}\n\ntype DelegatedHandlerStore = DelegatedHandler | Map<string, DelegatedHandler>;\n\nconst delegatedHandlers = new WeakMap<Element, DelegatedHandlerStore>();\n\nlet eventDelegationEnabled = true;\nlet defaultContainer: Element | null = null;\nlet globalDelegationContainer: Element | null = null;\nconst containerDelegatedListeners = new Map<\n Element,\n Map<string, EventListener>\n>();\n\nexport function isEventDelegationEnabled(): boolean {\n return eventDelegationEnabled;\n}\n\nexport function disableEventDelegation(): void {\n eventDelegationEnabled = false;\n cleanupAllDelegatedListeners();\n}\n\nexport function enableEventDelegation(container?: Element): void {\n eventDelegationEnabled = true;\n if (container) {\n defaultContainer = container;\n }\n}\n\nexport function setGlobalDelegationContainer(container: Element): void {\n globalDelegationContainer = container;\n}\n\nfunction cleanupAllDelegatedListeners(): void {\n for (const [container, listeners] of containerDelegatedListeners) {\n for (const [eventName, handler] of listeners) {\n container.removeEventListener(eventName, handler);\n }\n }\n containerDelegatedListeners.clear();\n}\n\nfunction getDelegationContainer(): Element | null {\n if (globalDelegationContainer) return globalDelegationContainer;\n if (defaultContainer) return defaultContainer;\n if (typeof document !== 'undefined') return document.body;\n return null;\n}\n\nfunction attachDelegatedListener(\n container: Element,\n element: Element,\n eventName: string,\n handler: EventListener,\n originalHandler: EventListener,\n options?: AddEventListenerOptions\n): void {\n if (!containerDelegatedListeners.has(container)) {\n containerDelegatedListeners.set(container, new Map());\n }\n const containerListeners = containerDelegatedListeners.get(container)!;\n\n if (!containerListeners.has(eventName)) {\n const delegatedHandler = (e: Event) => {\n const target = e.target as Element;\n if (!target) return;\n\n globalScheduler.runInHandlerScope(() => {\n let current: Element | null = target;\n while (current && current !== container) {\n incrementPerfMetric('delegatedAncestorHops');\n const store = delegatedHandlers.get(current);\n const entry = !store\n ? undefined\n : store instanceof Map\n ? store.get(eventName)\n : store.eventName === eventName\n ? store\n : undefined;\n if (entry) {\n try {\n entry.handler(e);\n } catch (error) {\n logger.error('[Askr] Delegated event error:', error);\n }\n }\n\n if (e.cancelBubble) {\n break;\n }\n\n current = current.parentElement;\n }\n }, 'sync');\n };\n\n const passiveOptions = getPassiveOptions(eventName);\n const listenerOptions = passiveOptions ?? options;\n\n container.addEventListener(eventName, delegatedHandler, listenerOptions);\n containerListeners.set(eventName, delegatedHandler);\n }\n\n setDelegatedHandlerForElement(element, {\n handler,\n original: originalHandler,\n element,\n eventName,\n options,\n });\n}\n\nfunction setDelegatedHandlerForElement(\n element: Element,\n entry: DelegatedHandler\n): void {\n const existing = delegatedHandlers.get(element);\n if (!existing) {\n delegatedHandlers.set(element, entry);\n return;\n }\n\n if (existing instanceof Map) {\n existing.set(entry.eventName, entry);\n return;\n }\n\n if (existing.eventName === entry.eventName) {\n delegatedHandlers.set(element, entry);\n return;\n }\n\n const next = new Map<string, DelegatedHandler>();\n next.set(existing.eventName, existing);\n next.set(entry.eventName, entry);\n delegatedHandlers.set(element, next);\n}\n\nfunction getPassiveOptions(\n eventName: string\n): AddEventListenerOptions | undefined {\n if (\n eventName === 'wheel' ||\n eventName === 'scroll' ||\n eventName.startsWith('touch')\n ) {\n return { passive: true };\n }\n return undefined;\n}\n\nexport function addDelegatedListener(\n element: Element,\n eventName: string,\n handler: EventListener,\n originalHandler: EventListener,\n options?: AddEventListenerOptions\n): void {\n if (!eventDelegationEnabled) return;\n\n const container = getDelegationContainer();\n if (!container) return;\n\n incDevCounter('listenerAdds');\n\n attachDelegatedListener(\n container,\n element,\n eventName,\n handler,\n originalHandler,\n options\n );\n}\n\nexport function updateDelegatedListener(\n element: Element,\n eventName: string,\n handler: EventListener,\n originalHandler: EventListener,\n options?: AddEventListenerOptions\n): boolean {\n const existing = getDelegatedHandlerForElement(element, eventName);\n if (!existing) {\n return false;\n }\n\n existing.handler = handler;\n existing.original = originalHandler;\n existing.options = options;\n return true;\n}\n\nexport function removeDelegatedListener(\n element: Element,\n eventName: string\n): void {\n const existing = delegatedHandlers.get(element);\n if (!existing) {\n return;\n }\n\n if (existing instanceof Map) {\n if (existing.has(eventName)) {\n incDevCounter('listenerRemoves');\n }\n existing.delete(eventName);\n if (existing.size === 0) {\n delegatedHandlers.delete(element);\n return;\n }\n if (existing.size === 1) {\n const only = existing.values().next().value as DelegatedHandler;\n delegatedHandlers.set(element, only);\n }\n return;\n }\n\n if (existing.eventName === eventName) {\n incDevCounter('listenerRemoves');\n delegatedHandlers.delete(element);\n }\n}\n\nexport function getDelegatedHandlerForElement(\n element: Element,\n eventName: string\n): DelegatedHandler | undefined {\n const store = delegatedHandlers.get(element);\n if (!store) return undefined;\n if (store instanceof Map) return store.get(eventName);\n return store.eventName === eventName ? store : undefined;\n}\n\nexport function getDelegatedHandlersForElement(\n element: Element\n): Map<string, DelegatedHandler> | undefined {\n const store = delegatedHandlers.get(element);\n if (!store) return undefined;\n if (store instanceof Map) return store;\n return new Map([[store.eventName, store]]);\n}\n\nexport function hasDelegatedHandler(\n element: Element,\n eventName: string\n): boolean {\n return getDelegatedHandlerForElement(element, eventName) !== undefined;\n}\n\nexport function clearDelegatedHandlersForElement(element: Element): void {\n delegatedHandlers.delete(element);\n}\n\nexport function getDelegatedEventNames(): readonly (keyof DelegatedEventMap)[] {\n return DELEGATED_EVENTS;\n}\n\nexport function isDelegatedEvent(eventName: string): boolean {\n return DELEGATED_EVENTS.includes(eventName as keyof DelegatedEventMap);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
//#region src/runtime/execution-model.ts
|
|
2
|
+
const EXECUTION_MODEL_KEY = Symbol.for("__ASKR_EXECUTION_MODEL__");
|
|
3
|
+
function getExecutionModel() {
|
|
4
|
+
return globalThis[EXECUTION_MODEL_KEY];
|
|
5
|
+
}
|
|
6
|
+
function assertExecutionModel(model) {
|
|
7
|
+
const g = globalThis;
|
|
8
|
+
const cur = g[EXECUTION_MODEL_KEY];
|
|
9
|
+
if (cur && cur !== model) throw new Error(`[Askr] mixing execution models is not allowed (current: ${cur}, attempted: ${model}). Choose exactly one: createSPA, createSSR, or createIslands.`);
|
|
10
|
+
if (!cur) g[EXECUTION_MODEL_KEY] = model;
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
export { assertExecutionModel, getExecutionModel };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=execution-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-model.js","names":[],"sources":["../../src/runtime/execution-model.ts"],"sourcesContent":["export type ExecutionModel = 'spa' | 'islands' | 'ssr';\n\nconst EXECUTION_MODEL_KEY = Symbol.for('__ASKR_EXECUTION_MODEL__');\n\nexport function getExecutionModel(): ExecutionModel | undefined {\n const g = globalThis as unknown as Record<string | symbol, unknown>;\n return g[EXECUTION_MODEL_KEY] as ExecutionModel | undefined;\n}\n\nexport function assertExecutionModel(model: ExecutionModel): void {\n // Mixing execution models is forbidden: once an app starts in one model,\n // attempting to start another is an invariant violation.\n const g = globalThis as unknown as Record<string | symbol, unknown>;\n const cur = g[EXECUTION_MODEL_KEY] as ExecutionModel | undefined;\n if (cur && cur !== model) {\n throw new Error(\n `[Askr] mixing execution models is not allowed (current: ${cur}, attempted: ${model}). ` +\n `Choose exactly one: createSPA, createSSR, or createIslands.`\n );\n }\n if (!cur) g[EXECUTION_MODEL_KEY] = model;\n}\n"],"mappings":";AAEA,MAAM,sBAAsB,OAAO,IAAI,2BAA2B;AAElE,SAAgB,oBAAgD;AAE9D,QAAO,WAAE;;AAGX,SAAgB,qBAAqB,OAA6B;CAGhE,MAAM,IAAI;CACV,MAAM,MAAM,EAAE;AACd,KAAI,OAAO,QAAQ,MACjB,OAAM,IAAI,MACR,2DAA2D,IAAI,eAAe,MAAM,gEAErF;AAEH,KAAI,CAAC,IAAK,GAAE,uBAAuB"}
|