@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,145 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { getRuntimeEnv } from "../common/env.js";
|
|
2
|
+
import { logger } from "../dev/logger.js";
|
|
3
|
+
import { isSchedulerExecuting } from "../runtime/scheduler.js";
|
|
4
|
+
import { incDevCounter, setDevValue } from "../runtime/dev-namespace.js";
|
|
5
|
+
import "./env.js";
|
|
6
|
+
import { _reconcilerRecordedParents } from "./keyed.js";
|
|
7
|
+
import { isBulkCommitActive, markFastPathApplied } from "../runtime/fastlane.js";
|
|
8
|
+
import { cleanupInstanceIfPresent, removeAllListeners } from "./cleanup.js";
|
|
9
|
+
import { createDOMNode } from "./dom.js";
|
|
10
|
+
function applyRendererFastPath(parent, keyedVnodes, oldKeyMap, unkeyedVnodes) {
|
|
11
|
+
if (typeof document === "undefined") return null;
|
|
12
|
+
const totalKeyed = keyedVnodes.length;
|
|
13
|
+
if (totalKeyed === 0 && (!unkeyedVnodes || unkeyedVnodes.length === 0)) return null;
|
|
14
|
+
if (!isSchedulerExecuting()) logger.warn("[Askr][FASTPATH][DEV] Fast-path reconciliation invoked outside scheduler execution");
|
|
15
|
+
let parentChildrenArr;
|
|
16
|
+
let localOldKeyMap;
|
|
17
|
+
if (totalKeyed <= 20) try {
|
|
18
|
+
parentChildrenArr = Array.from(parent.children, (child) => child);
|
|
19
|
+
} catch (e) {
|
|
20
|
+
parentChildrenArr = void 0;
|
|
21
|
+
}
|
|
22
|
+
else if (!oldKeyMap || oldKeyMap.size === 0) {
|
|
23
|
+
localOldKeyMap = /* @__PURE__ */ new Map();
|
|
24
|
+
try {
|
|
25
|
+
for (let ch = parent.firstElementChild; ch; ch = ch.nextElementSibling) {
|
|
26
|
+
const k = ch.getAttribute("data-key");
|
|
27
|
+
if (k !== null) {
|
|
28
|
+
localOldKeyMap.set(k, ch);
|
|
29
|
+
const n = Number(k);
|
|
30
|
+
if (!Number.isNaN(n)) localOldKeyMap.set(n, ch);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
} catch (e) {
|
|
34
|
+
localOldKeyMap = void 0;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const finalNodes = [];
|
|
38
|
+
let mapLookups = 0;
|
|
39
|
+
let createdNodes = 0;
|
|
40
|
+
let reusedCount = 0;
|
|
41
|
+
for (let i = 0; i < keyedVnodes.length; i++) {
|
|
42
|
+
const { key, vnode } = keyedVnodes[i];
|
|
43
|
+
mapLookups++;
|
|
44
|
+
let el;
|
|
45
|
+
if (totalKeyed <= 20 && parentChildrenArr) {
|
|
46
|
+
const ks = String(key);
|
|
47
|
+
for (let j = 0; j < parentChildrenArr.length; j++) {
|
|
48
|
+
const ch = parentChildrenArr[j];
|
|
49
|
+
const k = ch.getAttribute("data-key");
|
|
50
|
+
if (k !== null && (k === ks || Number(k) === key)) {
|
|
51
|
+
el = ch;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (!el) el = oldKeyMap?.get(key);
|
|
56
|
+
} else el = localOldKeyMap?.get(key) ?? oldKeyMap?.get(key);
|
|
57
|
+
if (el) {
|
|
58
|
+
finalNodes.push(el);
|
|
59
|
+
reusedCount++;
|
|
60
|
+
} else {
|
|
61
|
+
const newEl = createDOMNode(vnode);
|
|
62
|
+
if (newEl) {
|
|
63
|
+
finalNodes.push(newEl);
|
|
64
|
+
createdNodes++;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (unkeyedVnodes && unkeyedVnodes.length) for (const vnode of unkeyedVnodes) {
|
|
69
|
+
const newEl = createDOMNode(vnode);
|
|
70
|
+
if (newEl) {
|
|
71
|
+
finalNodes.push(newEl);
|
|
72
|
+
createdNodes++;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const tFragmentStart = Date.now();
|
|
77
|
+
const fragment = document.createDocumentFragment();
|
|
78
|
+
let fragmentAppendCount = 0;
|
|
79
|
+
for (let i = 0; i < finalNodes.length; i++) {
|
|
80
|
+
fragment.appendChild(finalNodes[i]);
|
|
81
|
+
fragmentAppendCount++;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
for (let n = parent.firstChild; n;) {
|
|
85
|
+
const next = n.nextSibling;
|
|
86
|
+
if (n instanceof Element) removeAllListeners(n);
|
|
87
|
+
cleanupInstanceIfPresent(n);
|
|
88
|
+
n = next;
|
|
89
|
+
}
|
|
90
|
+
} catch (e) {}
|
|
91
|
+
try {
|
|
92
|
+
incDevCounter("__DOM_REPLACE_COUNT");
|
|
93
|
+
setDevValue("__LAST_DOM_REPLACE_STACK_FASTPATH", (/* @__PURE__ */ new Error()).stack);
|
|
94
|
+
} catch (e) {}
|
|
95
|
+
parent.replaceChildren(fragment);
|
|
96
|
+
try {
|
|
97
|
+
setDevValue("__LAST_FASTPATH_COMMIT_COUNT", 1);
|
|
98
|
+
} catch (e) {}
|
|
99
|
+
try {
|
|
100
|
+
if (isBulkCommitActive()) markFastPathApplied(parent);
|
|
101
|
+
} catch (e) {}
|
|
102
|
+
const newKeyMap = /* @__PURE__ */ new Map();
|
|
103
|
+
for (let i = 0; i < keyedVnodes.length; i++) {
|
|
104
|
+
const key = keyedVnodes[i].key;
|
|
105
|
+
const node = finalNodes[i];
|
|
106
|
+
if (node instanceof Element) newKeyMap.set(key, node);
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
const stats = {
|
|
110
|
+
n: totalKeyed,
|
|
111
|
+
moves: 0,
|
|
112
|
+
lisLen: 0,
|
|
113
|
+
t_lookup: 0,
|
|
114
|
+
t_fragment: Date.now() - tFragmentStart,
|
|
115
|
+
t_commit: 0,
|
|
116
|
+
t_bookkeeping: 0,
|
|
117
|
+
fragmentAppendCount,
|
|
118
|
+
mapLookups,
|
|
119
|
+
createdNodes,
|
|
120
|
+
reusedCount
|
|
121
|
+
};
|
|
122
|
+
if (typeof globalThis !== "undefined") {
|
|
123
|
+
setDevValue("__LAST_FASTPATH_STATS", stats);
|
|
124
|
+
setDevValue("__LAST_FASTPATH_REUSED", reusedCount > 0);
|
|
125
|
+
incDevCounter("fastpathHistoryPush");
|
|
126
|
+
}
|
|
127
|
+
const env = getRuntimeEnv();
|
|
128
|
+
if (env.ASKR_FASTPATH_DEBUG === "1" || env.ASKR_FASTPATH_DEBUG === "true") logger.warn("[Askr][FASTPATH]", JSON.stringify({
|
|
129
|
+
n: totalKeyed,
|
|
130
|
+
createdNodes,
|
|
131
|
+
reusedCount
|
|
132
|
+
}));
|
|
133
|
+
} catch (e) {}
|
|
134
|
+
try {
|
|
135
|
+
_reconcilerRecordedParents.add(parent);
|
|
136
|
+
} catch (e) {}
|
|
137
|
+
return newKeyMap;
|
|
138
|
+
} catch (e) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//#endregion
|
|
143
|
+
export { applyRendererFastPath };
|
|
144
|
+
|
|
145
|
+
//# sourceMappingURL=fastpath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastpath.js","names":[],"sources":["../../src/renderer/fastpath.ts"],"sourcesContent":["import type { VNode } from './types';\nimport { createDOMNode } from './dom';\nimport { _reconcilerRecordedParents } from './keyed';\nimport { logger } from '../dev/logger';\nimport { getRuntimeEnv } from './env';\nimport { cleanupInstanceIfPresent, removeAllListeners } from './cleanup';\nimport { setDevValue, incDevCounter } from '../runtime/dev-namespace';\nimport { isSchedulerExecuting } from '../runtime/scheduler';\nimport { isBulkCommitActive, markFastPathApplied } from '../runtime/fastlane';\n\nexport const IS_DOM_AVAILABLE = typeof document !== 'undefined';\n\n// Apply the \"renderer\" fast-path: build final node list reusing existing\n// elements by key when possible, then perform a single atomic replaceChildren\n// commit. Returns a new key map when the fast-path is applied, otherwise\n// returns null to indicate the caller should continue with fallback paths.\nexport function applyRendererFastPath(\n parent: Element,\n keyedVnodes: Array<{ key: string | number; vnode: VNode }>,\n oldKeyMap?: Map<string | number, Element>,\n unkeyedVnodes?: VNode[]\n): Map<string | number, Element> | null {\n // SSR guard: fast-path is DOM-specific\n if (typeof document === 'undefined') return null;\n\n const totalKeyed = keyedVnodes.length;\n if (totalKeyed === 0 && (!unkeyedVnodes || unkeyedVnodes.length === 0))\n return null;\n\n // Dev invariant: ensure we are executing inside the scheduler/commit flush\n if (!isSchedulerExecuting()) {\n logger.warn(\n '[Askr][FASTPATH][DEV] Fast-path reconciliation invoked outside scheduler execution'\n );\n }\n\n // Choose lookup strategy depending on size (linear scan for small lists)\n let parentChildrenArr: Element[] | undefined;\n let localOldKeyMap: Map<string | number, Element> | undefined;\n\n if (totalKeyed <= 20) {\n // Small lists: use array scan (faster than Map overhead for ≤20 items)\n try {\n parentChildrenArr = Array.from(\n parent.children,\n (child) => child as Element\n );\n } catch (e) {\n parentChildrenArr = undefined;\n void e;\n }\n } else if (!oldKeyMap || oldKeyMap.size === 0) {\n // Medium/large lists without existing key map: build from DOM\n localOldKeyMap = new Map<string | number, Element>();\n try {\n for (let ch = parent.firstElementChild; ch; ch = ch.nextElementSibling) {\n const k = ch.getAttribute('data-key');\n if (k !== null) {\n localOldKeyMap.set(k, ch);\n const n = Number(k);\n if (!Number.isNaN(n)) localOldKeyMap.set(n, ch);\n }\n }\n } catch (e) {\n localOldKeyMap = undefined;\n void e;\n }\n }\n // else: reuse oldKeyMap directly (most common case for repeat renders)\n\n const finalNodes: Node[] = [];\n let mapLookups = 0;\n let createdNodes = 0;\n let reusedCount = 0;\n\n for (let i = 0; i < keyedVnodes.length; i++) {\n const { key, vnode } = keyedVnodes[i];\n mapLookups++;\n\n let el: Element | undefined;\n if (totalKeyed <= 20 && parentChildrenArr) {\n const ks = String(key);\n for (let j = 0; j < parentChildrenArr.length; j++) {\n const ch = parentChildrenArr[j];\n const k = ch.getAttribute('data-key');\n if (k !== null && (k === ks || Number(k) === (key as number))) {\n el = ch;\n break;\n }\n }\n if (!el) el = oldKeyMap?.get(key);\n } else {\n el = localOldKeyMap?.get(key as string | number) ?? oldKeyMap?.get(key);\n }\n\n if (el) {\n finalNodes.push(el);\n reusedCount++;\n } else {\n const newEl = createDOMNode(vnode);\n if (newEl) {\n finalNodes.push(newEl);\n createdNodes++;\n }\n }\n }\n\n // Add unkeyed nodes (detached as well)\n if (unkeyedVnodes && unkeyedVnodes.length) {\n for (const vnode of unkeyedVnodes) {\n const newEl = createDOMNode(vnode);\n if (newEl) {\n finalNodes.push(newEl);\n createdNodes++;\n }\n }\n }\n\n // Atomic commit\n try {\n const tFragmentStart = Date.now();\n const fragment = document.createDocumentFragment();\n let fragmentAppendCount = 0;\n for (let i = 0; i < finalNodes.length; i++) {\n fragment.appendChild(finalNodes[i]);\n fragmentAppendCount++;\n }\n\n // Pre-cleanup: remove component instances that will be removed by replaceChildren\n try {\n // At this point, any reused nodes have been moved into the fragment,\n // so whatever remains under parent will be removed by replaceChildren.\n for (let n = parent.firstChild; n; ) {\n const next = n.nextSibling;\n if (n instanceof Element) removeAllListeners(n);\n cleanupInstanceIfPresent(n);\n n = next;\n }\n } catch (e) {\n void e;\n }\n\n try {\n incDevCounter('__DOM_REPLACE_COUNT');\n setDevValue('__LAST_DOM_REPLACE_STACK_FASTPATH', new Error().stack);\n } catch (e) {\n void e;\n }\n\n parent.replaceChildren(fragment);\n\n // Record that we performed exactly one DOM commit.\n try {\n setDevValue('__LAST_FASTPATH_COMMIT_COUNT', 1);\n } catch (e) {\n void e;\n }\n\n // If a runtime bulk commit is active, mark this parent as fast-path applied.\n try {\n if (isBulkCommitActive()) markFastPathApplied(parent);\n } catch (e) {\n void e;\n }\n\n // Phase: bookkeeping - populate newKeyMap\n const newKeyMap = new Map<string | number, Element>();\n for (let i = 0; i < keyedVnodes.length; i++) {\n const key = keyedVnodes[i].key;\n const node = finalNodes[i];\n if (node instanceof Element) newKeyMap.set(key, node as Element);\n }\n\n // Dev tracing\n try {\n const stats = {\n n: totalKeyed,\n moves: 0,\n lisLen: 0,\n t_lookup: 0,\n t_fragment: Date.now() - tFragmentStart,\n t_commit: 0,\n t_bookkeeping: 0,\n fragmentAppendCount,\n mapLookups,\n createdNodes,\n reusedCount,\n } as const;\n if (typeof globalThis !== 'undefined') {\n setDevValue('__LAST_FASTPATH_STATS', stats);\n setDevValue('__LAST_FASTPATH_REUSED', reusedCount > 0);\n incDevCounter('fastpathHistoryPush');\n }\n const env = getRuntimeEnv();\n if (\n env.ASKR_FASTPATH_DEBUG === '1' ||\n env.ASKR_FASTPATH_DEBUG === 'true'\n ) {\n logger.warn(\n '[Askr][FASTPATH]',\n JSON.stringify({ n: totalKeyed, createdNodes, reusedCount })\n );\n }\n } catch (e) {\n void e;\n }\n\n // Record that reconciler recorded stats for this parent in this pass\n try {\n _reconcilerRecordedParents.add(parent);\n } catch (e) {\n void e;\n }\n\n return newKeyMap;\n } catch (e) {\n void e;\n return null;\n }\n}\n"],"mappings":"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"}
|
package/dist/renderer/index.js
CHANGED
|
@@ -1 +1,24 @@
|
|
|
1
|
-
import
|
|
1
|
+
import "../common/vnode.js";
|
|
2
|
+
import "./types.js";
|
|
3
|
+
import { getKeyMapForElement, isKeyedReorderFastPathEligible } from "./keyed.js";
|
|
4
|
+
import "./cleanup.js";
|
|
5
|
+
import "./children.js";
|
|
6
|
+
import { markReactivePropsDirtySource } from "./dom.js";
|
|
7
|
+
import { evaluate } from "./evaluate.js";
|
|
8
|
+
//#region src/renderer/index.ts
|
|
9
|
+
function installRendererBridge() {
|
|
10
|
+
if (typeof globalThis !== "undefined") {
|
|
11
|
+
const _g = globalThis;
|
|
12
|
+
_g.__ASKR_RENDERER = {
|
|
13
|
+
evaluate,
|
|
14
|
+
isKeyedReorderFastPathEligible,
|
|
15
|
+
getKeyMapForElement,
|
|
16
|
+
markReactivePropsDirtySource
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { installRendererBridge };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_evaluate","_markReactivePropsDirtySource"],"sources":["../../src/renderer/index.ts"],"sourcesContent":["// Renderer barrel entrypoint.\n// Keep this file small: re-export the public surface and attach the runtime\n// fast-lane bridge on import.\n\nexport * from './types';\nexport * from './cleanup';\nexport * from './keyed';\nexport * from './dom';\nexport { evaluate, clearDOMRange } from './evaluate';\n\nimport { evaluate as _evaluate } from './evaluate';\nimport { isKeyedReorderFastPathEligible, getKeyMapForElement } from './keyed';\nimport { markReactivePropsDirtySource as _markReactivePropsDirtySource } from './dom';\n\nexport function installRendererBridge(): true {\n if (typeof globalThis !== 'undefined') {\n const _g = globalThis as Record<string, unknown>;\n _g.__ASKR_RENDERER = {\n evaluate: _evaluate,\n isKeyedReorderFastPathEligible,\n getKeyMapForElement,\n markReactivePropsDirtySource: _markReactivePropsDirtySource,\n };\n }\n return true;\n}\n"],"mappings":";;;;;;;;AAcA,SAAgB,wBAA8B;AAC5C,KAAI,OAAO,eAAe,aAAa;EACrC,MAAM,KAAK;AACX,KAAG,kBAAkB;GACTA;GACV;GACA;GAC8BC;GAC/B;;AAEH,QAAO"}
|
package/dist/renderer/keyed.js
CHANGED
|
@@ -1 +1,119 @@
|
|
|
1
|
-
import{buildKeyMapFromChildren
|
|
1
|
+
import { buildKeyMapFromChildren, extractKey, hasPropChanged, isIgnoredForPropChanges } from "./utils.js";
|
|
2
|
+
//#region src/renderer/keyed.ts
|
|
3
|
+
const keyedElements = /* @__PURE__ */ new WeakMap();
|
|
4
|
+
/**
|
|
5
|
+
* Retrieve existing keyed map for a parent element (runtime use)
|
|
6
|
+
*/
|
|
7
|
+
function getKeyMapForElement(el) {
|
|
8
|
+
return keyedElements.get(el);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Populate a keyed map for an element by scanning its immediate children
|
|
12
|
+
* for `data-key` attributes. Proactive initialization for runtime layers.
|
|
13
|
+
*/
|
|
14
|
+
function populateKeyMapForElement(parent) {
|
|
15
|
+
try {
|
|
16
|
+
if (keyedElements.has(parent)) return;
|
|
17
|
+
let domMap = buildKeyMapFromChildren(parent);
|
|
18
|
+
if (domMap.size === 0) {
|
|
19
|
+
domMap = /* @__PURE__ */ new Map();
|
|
20
|
+
const children = Array.from(parent.children);
|
|
21
|
+
for (const ch of children) {
|
|
22
|
+
const text = (ch.textContent || "").trim();
|
|
23
|
+
if (text) {
|
|
24
|
+
domMap.set(text, ch);
|
|
25
|
+
const n = Number(text);
|
|
26
|
+
if (!Number.isNaN(n)) domMap.set(n, ch);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (domMap.size > 0) keyedElements.set(parent, domMap);
|
|
31
|
+
} catch {}
|
|
32
|
+
}
|
|
33
|
+
const _reconcilerRecordedParents = /* @__PURE__ */ new WeakSet();
|
|
34
|
+
const LIS_THRESHOLD_MIN = 64;
|
|
35
|
+
/**
|
|
36
|
+
* Extract keyed vnodes from children array
|
|
37
|
+
*/
|
|
38
|
+
function extractKeyedVnodes(newChildren) {
|
|
39
|
+
const result = [];
|
|
40
|
+
for (const child of newChildren) {
|
|
41
|
+
const key = extractKey(child);
|
|
42
|
+
if (key !== void 0) result.push({
|
|
43
|
+
key,
|
|
44
|
+
vnode: child
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Compute LIS (Longest Increasing Subsequence) length for positions
|
|
51
|
+
*/
|
|
52
|
+
function computeLISLength(positions) {
|
|
53
|
+
const tails = [];
|
|
54
|
+
for (const pos of positions) {
|
|
55
|
+
if (pos === -1) continue;
|
|
56
|
+
let lo = 0;
|
|
57
|
+
let hi = tails.length;
|
|
58
|
+
while (lo < hi) {
|
|
59
|
+
const mid = lo + hi >> 1;
|
|
60
|
+
if (tails[mid] < pos) lo = mid + 1;
|
|
61
|
+
else hi = mid;
|
|
62
|
+
}
|
|
63
|
+
if (lo === tails.length) tails.push(pos);
|
|
64
|
+
else tails[lo] = pos;
|
|
65
|
+
}
|
|
66
|
+
return tails.length;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check for prop changes between vnodes and existing elements
|
|
70
|
+
*/
|
|
71
|
+
function checkVnodePropChanges(keyedVnodes, oldKeyMap) {
|
|
72
|
+
for (const { key, vnode } of keyedVnodes) {
|
|
73
|
+
const el = oldKeyMap?.get(key);
|
|
74
|
+
if (!el || typeof vnode !== "object" || vnode === null) continue;
|
|
75
|
+
const props = vnode.props || {};
|
|
76
|
+
for (const k of Object.keys(props)) {
|
|
77
|
+
if (isIgnoredForPropChanges(k)) continue;
|
|
78
|
+
if (hasPropChanged(el, k, props[k])) return true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Determine if keyed reorder fast-path should be used
|
|
85
|
+
*/
|
|
86
|
+
function isKeyedReorderFastPathEligible(parent, newChildren, oldKeyMap) {
|
|
87
|
+
const keyedVnodes = extractKeyedVnodes(newChildren);
|
|
88
|
+
const totalKeyed = keyedVnodes.length;
|
|
89
|
+
const newKeyOrder = keyedVnodes.map((kv) => kv.key);
|
|
90
|
+
const oldKeyOrder = oldKeyMap ? Array.from(oldKeyMap.keys()) : [];
|
|
91
|
+
let moveCount = 0;
|
|
92
|
+
for (let i = 0; i < newKeyOrder.length; i++) {
|
|
93
|
+
const k = newKeyOrder[i];
|
|
94
|
+
if (i >= oldKeyOrder.length || oldKeyOrder[i] !== k || !oldKeyMap?.has(k)) moveCount++;
|
|
95
|
+
}
|
|
96
|
+
const cheapMoveTrigger = totalKeyed >= LIS_THRESHOLD_MIN && oldKeyOrder.length > 0 && moveCount > Math.max(64, Math.floor(totalKeyed * .1));
|
|
97
|
+
let lisTrigger = false;
|
|
98
|
+
let lisLen = 0;
|
|
99
|
+
if (totalKeyed >= LIS_THRESHOLD_MIN) {
|
|
100
|
+
const parentChildren = Array.from(parent.children);
|
|
101
|
+
lisLen = computeLISLength(keyedVnodes.map(({ key }) => {
|
|
102
|
+
const el = oldKeyMap?.get(key);
|
|
103
|
+
return el?.parentElement === parent ? parentChildren.indexOf(el) : -1;
|
|
104
|
+
}));
|
|
105
|
+
lisTrigger = lisLen < Math.floor(totalKeyed * .5);
|
|
106
|
+
}
|
|
107
|
+
const hasPropChanges = checkVnodePropChanges(keyedVnodes, oldKeyMap);
|
|
108
|
+
return {
|
|
109
|
+
useFastPath: (cheapMoveTrigger || lisTrigger) && !hasPropChanges,
|
|
110
|
+
totalKeyed,
|
|
111
|
+
moveCount,
|
|
112
|
+
lisLen,
|
|
113
|
+
hasPropChanges
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//#endregion
|
|
117
|
+
export { _reconcilerRecordedParents, getKeyMapForElement, isKeyedReorderFastPathEligible, keyedElements, populateKeyMapForElement };
|
|
118
|
+
|
|
119
|
+
//# sourceMappingURL=keyed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyed.js","names":[],"sources":["../../src/renderer/keyed.ts"],"sourcesContent":["import type { VNode } from './types';\nimport {\n extractKey,\n buildKeyMapFromChildren,\n isIgnoredForPropChanges,\n hasPropChanged,\n} from './utils';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Key Map Registry\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const keyedElements = new WeakMap<\n Element,\n Map<string | number, Element>\n>();\n\n/**\n * Retrieve existing keyed map for a parent element (runtime use)\n */\nexport function getKeyMapForElement(el: Element) {\n return keyedElements.get(el);\n}\n\n/**\n * Populate a keyed map for an element by scanning its immediate children\n * for `data-key` attributes. Proactive initialization for runtime layers.\n */\nexport function populateKeyMapForElement(parent: Element): void {\n try {\n if (keyedElements.has(parent)) return;\n\n let domMap = buildKeyMapFromChildren(parent);\n\n // Fallback: map by textContent when keys are not materialized as attrs\n if (domMap.size === 0) {\n domMap = new Map();\n const children = Array.from(parent.children);\n for (const ch of children) {\n const text = (ch.textContent || '').trim();\n if (text) {\n domMap.set(text, ch);\n const n = Number(text);\n if (!Number.isNaN(n)) domMap.set(n, ch);\n }\n }\n }\n\n if (domMap.size > 0) keyedElements.set(parent, domMap);\n } catch {\n // ignore\n }\n}\n\n// Track which parents had the reconciler record fast-path stats during the\n// current evaluation, so we can preserve diagnostics across additional\n// reconciliations within the same render pass without leaking between runs.\nexport const _reconcilerRecordedParents = new WeakSet<Element>();\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Fast-Path Eligibility\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Configuration: LIS fast-path thresholds\nconst LIS_THRESHOLD_MIN = 64; // Minimum list size for LIS optimization\n\ninterface KeyedVnode {\n key: string | number;\n vnode: VNode;\n}\n\n/**\n * Extract keyed vnodes from children array\n */\nfunction extractKeyedVnodes(newChildren: VNode[]): KeyedVnode[] {\n const result: KeyedVnode[] = [];\n for (const child of newChildren) {\n const key = extractKey(child);\n if (key !== undefined) {\n result.push({ key, vnode: child });\n }\n }\n return result;\n}\n\n/**\n * Compute LIS (Longest Increasing Subsequence) length for positions\n */\nfunction computeLISLength(positions: number[]): number {\n const tails: number[] = [];\n for (const pos of positions) {\n if (pos === -1) continue;\n let lo = 0;\n let hi = tails.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (tails[mid] < pos) lo = mid + 1;\n else hi = mid;\n }\n if (lo === tails.length) tails.push(pos);\n else tails[lo] = pos;\n }\n return tails.length;\n}\n\n/**\n * Check for prop changes between vnodes and existing elements\n */\nfunction checkVnodePropChanges(\n keyedVnodes: KeyedVnode[],\n oldKeyMap: Map<string | number, Element> | undefined\n): boolean {\n for (const { key, vnode } of keyedVnodes) {\n const el = oldKeyMap?.get(key);\n if (!el || typeof vnode !== 'object' || vnode === null) continue;\n const vnodeObj = vnode as unknown as { props?: Record<string, unknown> };\n const props = vnodeObj.props || {};\n for (const k of Object.keys(props)) {\n if (isIgnoredForPropChanges(k)) continue;\n if (hasPropChanged(el, k, props[k])) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Determine if keyed reorder fast-path should be used\n */\nexport function isKeyedReorderFastPathEligible(\n parent: Element,\n newChildren: VNode[],\n oldKeyMap: Map<string | number, Element> | undefined\n) {\n const keyedVnodes = extractKeyedVnodes(newChildren);\n const totalKeyed = keyedVnodes.length;\n const newKeyOrder = keyedVnodes.map((kv) => kv.key);\n const oldKeyOrder = oldKeyMap ? Array.from(oldKeyMap.keys()) : [];\n\n // Count moves needed\n let moveCount = 0;\n for (let i = 0; i < newKeyOrder.length; i++) {\n const k = newKeyOrder[i];\n if (i >= oldKeyOrder.length || oldKeyOrder[i] !== k || !oldKeyMap?.has(k)) {\n moveCount++;\n }\n }\n\n // Check move threshold triggers\n const FAST_MOVE_THRESHOLD_ABS = 64;\n const FAST_MOVE_THRESHOLD_REL = 0.1;\n const cheapMoveTrigger =\n totalKeyed >= LIS_THRESHOLD_MIN &&\n oldKeyOrder.length > 0 &&\n moveCount >\n Math.max(\n FAST_MOVE_THRESHOLD_ABS,\n Math.floor(totalKeyed * FAST_MOVE_THRESHOLD_REL)\n );\n\n // Compute LIS trigger for large lists\n let lisTrigger = false;\n let lisLen = 0;\n if (totalKeyed >= LIS_THRESHOLD_MIN) {\n const parentChildren = Array.from(parent.children);\n const positions = keyedVnodes.map(({ key }) => {\n const el = oldKeyMap?.get(key);\n return el?.parentElement === parent ? parentChildren.indexOf(el) : -1;\n });\n lisLen = computeLISLength(positions);\n lisTrigger = lisLen < Math.floor(totalKeyed * 0.5);\n }\n\n // Check for props that would prevent fast-path\n // Only block if props have CHANGED, not just if props exist\n const hasPropChanges = checkVnodePropChanges(keyedVnodes, oldKeyMap);\n\n // Allow fastpath even with props present, as long as props haven't changed\n // This enables fast-path for common patterns like <Row item={item} onClick={...} />\n const useFastPath = (cheapMoveTrigger || lisTrigger) && !hasPropChanges;\n\n return {\n useFastPath,\n totalKeyed,\n moveCount,\n lisLen,\n hasPropChanges,\n } as const;\n}\n"],"mappings":"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"}
|