@askrjs/askr 0.0.27 → 0.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -147
- package/dist/_virtual/_rolldown/runtime.js +7 -0
- package/dist/bench/components/benchmark-row.d.ts +20 -0
- package/dist/bench/components/benchmark-row.d.ts.map +1 -0
- package/dist/bench/components/benchmark-row.js +42 -0
- package/dist/bench/components/benchmark-row.js.map +1 -0
- package/dist/bench/components/benchmark-table.js +25 -0
- package/dist/bench/components/benchmark-table.js.map +1 -0
- package/dist/benchmark.d.ts +22 -0
- package/dist/benchmark.d.ts.map +1 -0
- package/dist/benchmark.js +64 -1
- package/dist/benchmark.js.map +1 -0
- package/dist/bin/askr-ssg.d.ts +28 -0
- package/dist/bin/askr-ssg.d.ts.map +1 -0
- package/dist/bin/askr-ssg.js +171 -0
- package/dist/bin/askr-ssg.js.map +1 -0
- package/dist/boot/index.d.ts +64 -42
- package/dist/boot/index.d.ts.map +1 -1
- package/dist/boot/index.js +416 -2
- package/dist/boot/index.js.map +1 -0
- package/dist/common/component.d.ts +14 -13
- package/dist/common/component.d.ts.map +1 -1
- package/dist/common/control.d.ts +13 -0
- package/dist/common/control.d.ts.map +1 -0
- package/dist/common/control.js +14 -0
- package/dist/common/control.js.map +1 -0
- package/dist/common/env.js +47 -0
- package/dist/common/env.js.map +1 -0
- package/dist/common/jsx.d.ts +17 -15
- package/dist/common/jsx.d.ts.map +1 -1
- package/dist/common/jsx.js +8 -1
- package/dist/common/jsx.js.map +1 -0
- package/dist/common/props.d.ts +14 -11
- package/dist/common/props.d.ts.map +1 -1
- package/dist/common/router.d.ts +190 -32
- package/dist/common/router.d.ts.map +1 -1
- package/dist/common/ssr-errors.d.ts +6 -3
- package/dist/common/ssr-errors.d.ts.map +1 -1
- package/dist/common/ssr-errors.js +16 -1
- package/dist/common/ssr-errors.js.map +1 -0
- package/dist/common/ssr.d.ts +12 -9
- package/dist/common/ssr.d.ts.map +1 -1
- package/dist/common/vnode.d.ts +17 -15
- package/dist/common/vnode.d.ts.map +1 -1
- package/dist/common/vnode.js +10 -1
- package/dist/common/vnode.js.map +1 -0
- package/dist/components/link.d.ts +37 -25
- package/dist/components/link.d.ts.map +1 -1
- package/dist/components/link.js +64 -1
- package/dist/components/link.js.map +1 -0
- package/dist/control/case.d.ts +17 -0
- package/dist/control/case.d.ts.map +1 -0
- package/dist/control/case.js +69 -0
- package/dist/control/case.js.map +1 -0
- package/dist/control/for.d.ts +23 -0
- package/dist/control/for.d.ts.map +1 -0
- package/dist/control/for.js +62 -0
- package/dist/control/for.js.map +1 -0
- package/dist/control/index.d.ts +4 -0
- package/dist/control/index.js +4 -0
- package/dist/control/shared.js +20 -0
- package/dist/control/shared.js.map +1 -0
- package/dist/control/show.d.ts +14 -0
- package/dist/control/show.d.ts.map +1 -0
- package/dist/control/show.js +33 -0
- package/dist/control/show.js.map +1 -0
- package/dist/dev/invariant.js +29 -2
- package/dist/dev/invariant.js.map +1 -0
- package/dist/dev/logger.js +37 -1
- package/dist/dev/logger.js.map +1 -0
- package/dist/foundations/icon/icon.d.ts +53 -0
- package/dist/foundations/icon/icon.d.ts.map +1 -0
- package/dist/foundations/icon/icon.js +88 -0
- package/dist/foundations/icon/icon.js.map +1 -0
- package/dist/foundations/icon/icon.types.d.ts +21 -0
- package/dist/foundations/icon/icon.types.d.ts.map +1 -0
- package/dist/foundations/index.d.ts +10 -3
- package/dist/foundations/index.js +9 -1
- package/dist/foundations/interactions/interaction-policy.js +93 -1
- package/dist/foundations/interactions/interaction-policy.js.map +1 -0
- package/dist/foundations/interactions/pressable.js +51 -1
- package/dist/foundations/interactions/pressable.js.map +1 -0
- package/dist/foundations/structures/collection.d.ts +25 -40
- package/dist/foundations/structures/collection.d.ts.map +1 -1
- package/dist/foundations/structures/collection.js +51 -1
- package/dist/foundations/structures/collection.js.map +1 -0
- package/dist/foundations/structures/layer.d.ts +47 -68
- package/dist/foundations/structures/layer.d.ts.map +1 -1
- package/dist/foundations/structures/layer.js +81 -1
- package/dist/foundations/structures/layer.js.map +1 -0
- package/dist/foundations/structures/layout.d.ts +6 -3
- package/dist/foundations/structures/layout.d.ts.map +1 -1
- package/dist/foundations/structures/layout.js +13 -1
- package/dist/foundations/structures/layout.js.map +1 -0
- package/dist/foundations/structures/portal.d.ts +17 -10
- package/dist/foundations/structures/portal.d.ts.map +1 -1
- package/dist/foundations/structures/portal.js +105 -1
- package/dist/foundations/structures/portal.js.map +1 -0
- package/dist/foundations/structures/presence.d.ts +11 -5
- package/dist/foundations/structures/presence.d.ts.map +1 -1
- package/dist/foundations/structures/presence.js +39 -1
- package/dist/foundations/structures/presence.js.map +1 -0
- package/dist/foundations/structures/slot.d.ts +11 -8
- package/dist/foundations/structures/slot.d.ts.map +1 -1
- package/dist/foundations/structures/slot.js +41 -1
- package/dist/foundations/structures/slot.js.map +1 -0
- package/dist/foundations/structures.d.ts +7 -14
- package/dist/foundations/structures.js +6 -1
- package/dist/foundations/utilities/aria.js +11 -1
- package/dist/foundations/utilities/aria.js.map +1 -0
- package/dist/foundations/utilities/compose-handlers.js +20 -1
- package/dist/foundations/utilities/compose-handlers.js.map +1 -0
- package/dist/foundations/utilities/compose-ref.d.ts +7 -4
- package/dist/foundations/utilities/compose-ref.d.ts.map +1 -1
- package/dist/foundations/utilities/compose-ref.js +18 -1
- package/dist/foundations/utilities/compose-ref.js.map +1 -0
- package/dist/foundations/utilities/merge-props.js +49 -1
- package/dist/foundations/utilities/merge-props.js.map +1 -0
- package/dist/fx/fx.d.ts +24 -21
- package/dist/fx/fx.d.ts.map +1 -1
- package/dist/fx/fx.js +212 -1
- package/dist/fx/fx.js.map +1 -0
- package/dist/fx/index.d.ts +4 -7
- package/dist/fx/index.js +4 -1
- package/dist/fx/noop.js +9 -1
- package/dist/fx/noop.js.map +1 -0
- package/dist/fx/timing.d.ts +24 -21
- package/dist/fx/timing.d.ts.map +1 -1
- package/dist/fx/timing.js +236 -1
- package/dist/fx/timing.js.map +1 -0
- package/dist/index.d.ts +21 -20
- package/dist/index.js +34 -1
- package/dist/index.js.map +1 -0
- package/dist/jsx/index.d.ts +1 -4
- package/dist/jsx/index.js +3 -1
- package/dist/jsx/types.d.ts +18 -25
- package/dist/jsx/types.d.ts.map +1 -1
- package/dist/jsx/types.js +1 -1
- package/dist/jsx/utils.d.ts +4 -3
- package/dist/jsx/utils.d.ts.map +1 -1
- package/dist/jsx/utils.js +19 -1
- package/dist/jsx/utils.js.map +1 -0
- package/dist/jsx-dev-runtime.d.ts +8 -0
- package/dist/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/jsx-dev-runtime.js +32 -1
- package/dist/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx-runtime.d.ts +12 -0
- package/dist/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx-runtime.js +45 -1
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/jsx-runtime2.d.ts +2 -0
- package/dist/jsx-runtime2.js +3 -0
- package/dist/renderer/children.js +293 -0
- package/dist/renderer/children.js.map +1 -0
- package/dist/renderer/cleanup.js +150 -1
- package/dist/renderer/cleanup.js.map +1 -0
- package/dist/renderer/dom.js +2439 -1
- package/dist/renderer/dom.js.map +1 -0
- package/dist/renderer/env.js +1 -0
- package/dist/renderer/evaluate.js +450 -1
- package/dist/renderer/evaluate.js.map +1 -0
- package/dist/renderer/fastpath.js +145 -1
- package/dist/renderer/fastpath.js.map +1 -0
- package/dist/renderer/index.js +24 -1
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/keyed.js +119 -1
- package/dist/renderer/keyed.js.map +1 -0
- package/dist/renderer/reconcile.js +359 -1
- package/dist/renderer/reconcile.js.map +1 -0
- package/dist/renderer/types.js +1 -1
- package/dist/renderer/utils.js +220 -1
- package/dist/renderer/utils.js.map +1 -0
- package/dist/resources/index.d.ts +3 -9
- package/dist/resources/index.js +3 -1
- package/dist/router/index.d.ts +6 -10
- package/dist/router/index.js +5 -1
- package/dist/router/match.js +83 -1
- package/dist/router/match.js.map +1 -0
- package/dist/router/navigate.d.ts +20 -8
- package/dist/router/navigate.d.ts.map +1 -1
- package/dist/router/navigate.js +288 -1
- package/dist/router/navigate.js.map +1 -0
- package/dist/router/policy.d.ts +22 -0
- package/dist/router/policy.d.ts.map +1 -0
- package/dist/router/policy.js +116 -0
- package/dist/router/policy.js.map +1 -0
- package/dist/router/route-context.js +79 -0
- package/dist/router/route-context.js.map +1 -0
- package/dist/router/route.d.ts +101 -33
- package/dist/router/route.d.ts.map +1 -1
- package/dist/router/route.js +599 -1
- package/dist/router/route.js.map +1 -0
- package/dist/runtime/child-scope.d.ts +21 -0
- package/dist/runtime/child-scope.d.ts.map +1 -0
- package/dist/runtime/child-scope.js +77 -0
- package/dist/runtime/child-scope.js.map +1 -0
- package/dist/runtime/component.d.ts +67 -53
- package/dist/runtime/component.d.ts.map +1 -1
- package/dist/runtime/component.js +462 -1
- package/dist/runtime/component.js.map +1 -0
- package/dist/runtime/context.d.ts +28 -42
- package/dist/runtime/context.d.ts.map +1 -1
- package/dist/runtime/context.js +205 -1
- package/dist/runtime/context.js.map +1 -0
- package/dist/runtime/control.d.ts +43 -0
- package/dist/runtime/control.d.ts.map +1 -0
- package/dist/runtime/control.js +125 -0
- package/dist/runtime/control.js.map +1 -0
- package/dist/runtime/derive.d.ts +15 -6
- package/dist/runtime/derive.d.ts.map +1 -1
- package/dist/runtime/derive.js +134 -1
- package/dist/runtime/derive.js.map +1 -0
- package/dist/runtime/dev-namespace.js +57 -1
- package/dist/runtime/dev-namespace.js.map +1 -0
- package/dist/runtime/effect.d.ts +32 -0
- package/dist/runtime/effect.d.ts.map +1 -0
- package/dist/runtime/effect.js +146 -0
- package/dist/runtime/effect.js.map +1 -0
- package/dist/runtime/events.js +162 -1
- package/dist/runtime/events.js.map +1 -0
- package/dist/runtime/execution-model.js +15 -1
- package/dist/runtime/execution-model.js.map +1 -0
- package/dist/runtime/fastlane.js +204 -1
- package/dist/runtime/fastlane.js.map +1 -0
- package/dist/runtime/for-bench.d.ts +41 -0
- package/dist/runtime/for-bench.d.ts.map +1 -0
- package/dist/runtime/for-bench.js +173 -0
- package/dist/runtime/for-bench.js.map +1 -0
- package/dist/runtime/for.d.ts +62 -49
- package/dist/runtime/for.d.ts.map +1 -1
- package/dist/runtime/for.js +668 -1
- package/dist/runtime/for.js.map +1 -0
- package/dist/runtime/operations.d.ts +18 -15
- package/dist/runtime/operations.d.ts.map +1 -1
- package/dist/runtime/operations.js +209 -1
- package/dist/runtime/operations.js.map +1 -0
- package/dist/runtime/perf-metrics.js +64 -0
- package/dist/runtime/perf-metrics.js.map +1 -0
- package/dist/runtime/readable.d.ts +27 -0
- package/dist/runtime/readable.d.ts.map +1 -0
- package/dist/runtime/readable.js +118 -0
- package/dist/runtime/readable.js.map +1 -0
- package/dist/runtime/resource-cell.js +102 -1
- package/dist/runtime/resource-cell.js.map +1 -0
- package/dist/runtime/scheduler.d.ts +51 -35
- package/dist/runtime/scheduler.d.ts.map +1 -1
- package/dist/runtime/scheduler.js +328 -1
- package/dist/runtime/scheduler.js.map +1 -0
- package/dist/runtime/selector.d.ts +11 -0
- package/dist/runtime/selector.d.ts.map +1 -0
- package/dist/runtime/selector.js +188 -0
- package/dist/runtime/selector.js.map +1 -0
- package/dist/runtime/ssr-bridge.js +24 -1
- package/dist/runtime/ssr-bridge.js.map +1 -0
- package/dist/runtime/state.d.ts +11 -21
- package/dist/runtime/state.d.ts.map +1 -1
- package/dist/runtime/state.js +99 -1
- package/dist/runtime/state.js.map +1 -0
- package/dist/ssg/batch-render.d.ts +16 -0
- package/dist/ssg/batch-render.d.ts.map +1 -0
- package/dist/ssg/batch-render.js +84 -0
- package/dist/ssg/batch-render.js.map +1 -0
- package/dist/ssg/create-static-gen.d.ts +50 -0
- package/dist/ssg/create-static-gen.d.ts.map +1 -0
- package/dist/ssg/create-static-gen.js +282 -0
- package/dist/ssg/create-static-gen.js.map +1 -0
- package/dist/ssg/generate-metadata.d.ts +24 -0
- package/dist/ssg/generate-metadata.d.ts.map +1 -0
- package/dist/ssg/generate-metadata.js +94 -0
- package/dist/ssg/generate-metadata.js.map +1 -0
- package/dist/ssg/incremental-manifest.js +56 -0
- package/dist/ssg/incremental-manifest.js.map +1 -0
- package/dist/ssg/index.d.ts +8 -0
- package/dist/ssg/index.js +7 -0
- package/dist/ssg/resolve-ssg-data.d.ts +23 -0
- package/dist/ssg/resolve-ssg-data.d.ts.map +1 -0
- package/dist/ssg/resolve-ssg-data.js +46 -0
- package/dist/ssg/resolve-ssg-data.js.map +1 -0
- package/dist/ssg/route-utils.d.ts +16 -0
- package/dist/ssg/route-utils.d.ts.map +1 -0
- package/dist/ssg/route-utils.js +24 -0
- package/dist/ssg/route-utils.js.map +1 -0
- package/dist/ssg/types.d.ts +177 -0
- package/dist/ssg/types.d.ts.map +1 -0
- package/dist/ssg/write-static-files.d.ts +15 -0
- package/dist/ssg/write-static-files.d.ts.map +1 -0
- package/dist/ssg/write-static-files.js +73 -0
- package/dist/ssg/write-static-files.js.map +1 -0
- package/dist/ssr/attrs.js +93 -1
- package/dist/ssr/attrs.js.map +1 -0
- package/dist/ssr/context.d.ts +31 -32
- package/dist/ssr/context.d.ts.map +1 -1
- package/dist/ssr/context.js +63 -1
- package/dist/ssr/context.js.map +1 -0
- package/dist/ssr/errors.d.ts +6 -4
- package/dist/ssr/errors.d.ts.map +1 -1
- package/dist/ssr/errors.js +4 -1
- package/dist/ssr/errors.js.map +1 -0
- package/dist/ssr/escape.js +153 -1
- package/dist/ssr/escape.js.map +1 -0
- package/dist/ssr/index.d.ts +75 -46
- package/dist/ssr/index.d.ts.map +1 -1
- package/dist/ssr/index.js +543 -1
- package/dist/ssr/index.js.map +1 -0
- package/dist/ssr/render-keys.d.ts +27 -29
- package/dist/ssr/render-keys.d.ts.map +1 -1
- package/dist/ssr/render-keys.js +39 -1
- package/dist/ssr/render-keys.js.map +1 -0
- package/dist/ssr/sink.js +86 -1
- package/dist/ssr/sink.js.map +1 -0
- package/dist/ssr/stream-render.js +76 -1
- package/dist/ssr/stream-render.js.map +1 -0
- package/dist/ssr/types.d.ts +14 -13
- package/dist/ssr/types.d.ts.map +1 -1
- package/package.json +53 -48
- package/dist/_virtual/___vite-browser-external.js +0 -1
- package/dist/_virtual/__vite-browser-external.js +0 -1
- package/dist/_virtual/_commonjsHelpers.js +0 -1
- package/dist/_virtual/main.js +0 -1
- package/dist/_virtual/preload-helper.js +0 -1
- package/dist/bench/benchmark-entry.d.ts +0 -14
- package/dist/bench/benchmark-entry.d.ts.map +0 -1
- package/dist/common/errors.d.ts +0 -53
- package/dist/common/errors.d.ts.map +0 -1
- package/dist/common/index.d.ts +0 -14
- package/dist/common/index.d.ts.map +0 -1
- package/dist/dev/invariant.d.ts +0 -83
- package/dist/dev/invariant.d.ts.map +0 -1
- package/dist/dev/logger.d.ts +0 -13
- package/dist/dev/logger.d.ts.map +0 -1
- package/dist/dev/vite-plugin-askr.d.ts +0 -18
- package/dist/dev/vite-plugin-askr.d.ts.map +0 -1
- package/dist/dev/warnings.d.ts +0 -5
- package/dist/dev/warnings.d.ts.map +0 -1
- package/dist/for/for.d.ts +0 -16
- package/dist/for/for.d.ts.map +0 -1
- package/dist/for/for.js +0 -1
- package/dist/for/index.d.ts +0 -2
- package/dist/for/index.d.ts.map +0 -1
- package/dist/for/index.js +0 -1
- package/dist/foundations/core.d.ts +0 -23
- package/dist/foundations/core.d.ts.map +0 -1
- package/dist/foundations/core.js +0 -1
- package/dist/foundations/index.d.ts.map +0 -1
- package/dist/foundations/interactions/dismissable.d.ts +0 -58
- package/dist/foundations/interactions/dismissable.d.ts.map +0 -1
- package/dist/foundations/interactions/dismissable.js +0 -1
- package/dist/foundations/interactions/focusable.d.ts +0 -16
- package/dist/foundations/interactions/focusable.d.ts.map +0 -1
- package/dist/foundations/interactions/focusable.js +0 -1
- package/dist/foundations/interactions/hoverable.d.ts +0 -19
- package/dist/foundations/interactions/hoverable.d.ts.map +0 -1
- package/dist/foundations/interactions/hoverable.js +0 -1
- package/dist/foundations/interactions/index.d.ts +0 -5
- package/dist/foundations/interactions/index.d.ts.map +0 -1
- package/dist/foundations/interactions/interaction-policy.d.ts +0 -96
- package/dist/foundations/interactions/interaction-policy.d.ts.map +0 -1
- package/dist/foundations/interactions/pressable.d.ts +0 -54
- package/dist/foundations/interactions/pressable.d.ts.map +0 -1
- package/dist/foundations/interactions/roving-focus.d.ts +0 -117
- package/dist/foundations/interactions/roving-focus.d.ts.map +0 -1
- package/dist/foundations/interactions/roving-focus.js +0 -1
- package/dist/foundations/state/controllable.d.ts +0 -53
- package/dist/foundations/state/controllable.d.ts.map +0 -1
- package/dist/foundations/state/controllable.js +0 -1
- package/dist/foundations/state/index.d.ts +0 -2
- package/dist/foundations/state/index.d.ts.map +0 -1
- package/dist/foundations/structures/index.d.ts +0 -5
- package/dist/foundations/structures/index.d.ts.map +0 -1
- package/dist/foundations/structures.d.ts.map +0 -1
- package/dist/foundations/utilities/aria.d.ts +0 -13
- package/dist/foundations/utilities/aria.d.ts.map +0 -1
- package/dist/foundations/utilities/compose-handlers.d.ts +0 -34
- package/dist/foundations/utilities/compose-handlers.d.ts.map +0 -1
- package/dist/foundations/utilities/event-types.d.ts +0 -17
- package/dist/foundations/utilities/event-types.d.ts.map +0 -1
- package/dist/foundations/utilities/index.d.ts +0 -7
- package/dist/foundations/utilities/index.d.ts.map +0 -1
- package/dist/foundations/utilities/merge-props.d.ts +0 -2
- package/dist/foundations/utilities/merge-props.d.ts.map +0 -1
- package/dist/foundations/utilities/use-id.d.ts +0 -29
- package/dist/foundations/utilities/use-id.d.ts.map +0 -1
- package/dist/foundations/utilities/use-id.js +0 -1
- package/dist/fx/index.d.ts.map +0 -1
- package/dist/fx/noop.d.ts +0 -12
- package/dist/fx/noop.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/jsx/index.d.ts.map +0 -1
- package/dist/jsx/jsx-dev-runtime.d.ts +0 -4
- package/dist/jsx/jsx-dev-runtime.d.ts.map +0 -1
- package/dist/jsx/jsx-runtime.d.ts +0 -10
- package/dist/jsx/jsx-runtime.d.ts.map +0 -1
- package/dist/node_modules/esbuild/lib/main.js +0 -65
- package/dist/renderer/cleanup.d.ts +0 -25
- package/dist/renderer/cleanup.d.ts.map +0 -1
- package/dist/renderer/dom.d.ts +0 -62
- package/dist/renderer/dom.d.ts.map +0 -1
- package/dist/renderer/evaluate.d.ts +0 -4
- package/dist/renderer/evaluate.d.ts.map +0 -1
- package/dist/renderer/fastpath.d.ts +0 -7
- package/dist/renderer/fastpath.d.ts.map +0 -1
- package/dist/renderer/index.d.ts +0 -6
- package/dist/renderer/index.d.ts.map +0 -1
- package/dist/renderer/keyed.d.ts +0 -23
- package/dist/renderer/keyed.d.ts.map +0 -1
- package/dist/renderer/reconcile.d.ts +0 -88
- package/dist/renderer/reconcile.d.ts.map +0 -1
- package/dist/renderer/types.d.ts +0 -3
- package/dist/renderer/types.d.ts.map +0 -1
- package/dist/renderer/utils.d.ts +0 -63
- package/dist/renderer/utils.d.ts.map +0 -1
- package/dist/resources/index.d.ts.map +0 -1
- package/dist/router/index.d.ts.map +0 -1
- package/dist/router/match.d.ts +0 -22
- package/dist/router/match.d.ts.map +0 -1
- package/dist/runtime/dev-namespace.d.ts +0 -31
- package/dist/runtime/dev-namespace.d.ts.map +0 -1
- package/dist/runtime/events.d.ts +0 -52
- package/dist/runtime/events.d.ts.map +0 -1
- package/dist/runtime/execution-model.d.ts +0 -4
- package/dist/runtime/execution-model.d.ts.map +0 -1
- package/dist/runtime/fastlane.d.ts +0 -27
- package/dist/runtime/fastlane.d.ts.map +0 -1
- package/dist/runtime/hydration.d.ts +0 -25
- package/dist/runtime/hydration.d.ts.map +0 -1
- package/dist/runtime/resource-cell.d.ts +0 -35
- package/dist/runtime/resource-cell.d.ts.map +0 -1
- package/dist/runtime/snapshot.d.ts +0 -25
- package/dist/runtime/snapshot.d.ts.map +0 -1
- package/dist/runtime/ssr-bridge.d.ts +0 -10
- package/dist/runtime/ssr-bridge.d.ts.map +0 -1
- package/dist/ssr/attrs.d.ts +0 -26
- package/dist/ssr/attrs.d.ts.map +0 -1
- package/dist/ssr/create-ssr.d.ts +0 -19
- package/dist/ssr/create-ssr.d.ts.map +0 -1
- package/dist/ssr/escape.d.ts +0 -38
- package/dist/ssr/escape.d.ts.map +0 -1
- package/dist/ssr/sink.d.ts +0 -23
- package/dist/ssr/sink.d.ts.map +0 -1
- package/dist/ssr/stream-render.d.ts +0 -7
- package/dist/ssr/stream-render.d.ts.map +0 -1
- package/dist/vite/index.js +0 -3
package/dist/common/ssr.d.ts
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
|
+
//#region src/common/ssr.d.ts
|
|
1
2
|
/**
|
|
2
3
|
* Common call contracts: SSR types
|
|
3
4
|
*/
|
|
4
|
-
|
|
5
|
+
type SSRData = Record<string, unknown>;
|
|
5
6
|
/** Full context for sink-based streaming SSR */
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
type SSRContext = {
|
|
8
|
+
url: string;
|
|
9
|
+
seed: number;
|
|
10
|
+
data?: SSRData;
|
|
11
|
+
params?: Record<string, string>;
|
|
12
|
+
signal?: AbortSignal;
|
|
12
13
|
};
|
|
13
14
|
/** Lightweight context for synchronous render passes */
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
type RenderContext = {
|
|
16
|
+
seed: number;
|
|
16
17
|
};
|
|
18
|
+
//#endregion
|
|
19
|
+
export { SSRData };
|
|
17
20
|
//# sourceMappingURL=ssr.d.ts.map
|
package/dist/common/ssr.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr.d.ts","
|
|
1
|
+
{"version":3,"file":"ssr.d.ts","names":[],"sources":["../../src/common/ssr.ts"],"mappings":";;AAIA;;KAAY,OAAA,GAAU,MAAA;;KAGV,UAAA;EACV,GAAA;EACA,IAAA;EACA,IAAA,GAAO,OAAA;EACP,MAAA,GAAS,MAAA;EACT,MAAA,GAAS,WAAA;AAAA;;KAIC,aAAA;EACV,IAAA;AAAA"}
|
package/dist/common/vnode.d.ts
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
import { Props } from "./props.js";
|
|
2
|
+
import { ForState } from "../runtime/for.js";
|
|
3
|
+
import { ControlBoundaryState } from "../runtime/control.js";
|
|
4
|
+
//#region src/common/vnode.d.ts
|
|
5
|
+
interface DOMElement {
|
|
6
|
+
type: string | ((props: Props) => any) | symbol;
|
|
7
|
+
props?: Props;
|
|
8
|
+
children?: VNode[];
|
|
9
|
+
key?: string | number | null;
|
|
10
|
+
[Symbol.iterator]?: never;
|
|
11
|
+
_controlState?: ControlBoundaryState;
|
|
12
|
+
_forState?: ForState<unknown>;
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
type VNode = DOMElement | string | number | boolean | null | undefined;
|
|
15
|
+
declare const __FOR_BOUNDARY__: symbol;
|
|
16
|
+
declare function _isDOMElement(node: unknown): node is DOMElement;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { VNode };
|
|
17
19
|
//# sourceMappingURL=vnode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vnode.d.ts","
|
|
1
|
+
{"version":3,"file":"vnode.d.ts","names":[],"sources":["../../src/common/vnode.ts"],"mappings":";;;;UAUiB,UAAA;EAKf,IAAA,aAAiB,KAAA,EAAO,KAAA;EACxB,KAAA,GAAQ,KAAA;EACR,QAAA,GAAW,KAAA;EACX,GAAA;EAAA,CACC,MAAA,CAAO,QAAA;EACR,aAAA,GAAgB,oBAAA;EAChB,SAAA,GAAY,QAAA;AAAA;AAAA,KAIF,KAAA,GAAQ,UAAA;AAAA,cAIP,gBAAA;AAAA,iBAEG,aAAA,CAAc,IAAA,YAAgB,IAAA,IAAQ,UAAA"}
|
package/dist/common/vnode.js
CHANGED
|
@@ -1 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
import { __CONTROL_BOUNDARY__ } from "./control.js";
|
|
2
|
+
//#region src/common/vnode.ts
|
|
3
|
+
const __FOR_BOUNDARY__ = __CONTROL_BOUNDARY__;
|
|
4
|
+
function _isDOMElement(node) {
|
|
5
|
+
return typeof node === "object" && node !== null && "type" in node;
|
|
6
|
+
}
|
|
7
|
+
//#endregion
|
|
8
|
+
export { __FOR_BOUNDARY__, _isDOMElement };
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=vnode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vnode.js","names":[],"sources":["../../src/common/vnode.ts"],"sourcesContent":["/**\n * Common call contracts: VNode / virtual DOM shapes\n */\n\nimport type { Props } from './props';\nimport type { ControlBoundaryState } from '../runtime/control';\nimport type { ForState } from '../runtime/for';\nexport { __CONTROL_BOUNDARY__ } from './control';\nimport { __CONTROL_BOUNDARY__ } from './control';\n\nexport interface DOMElement {\n // Element `type` can be an intrinsic tag name, a component function, or\n // a special symbol (e.g. `Fragment`). Include `symbol` in the type union\n // so runtime comparisons against `Fragment` are type-safe.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n type: string | ((props: Props) => any) | symbol;\n props?: Props;\n children?: VNode[];\n key?: string | number | null;\n [Symbol.iterator]?: never;\n _controlState?: ControlBoundaryState; // Internal: control boundary state\n _forState?: ForState<unknown>; // Deprecated internal alias during migration\n}\n\n// Type for virtual DOM nodes\nexport type VNode = DOMElement | string | number | boolean | null | undefined;\n\n// Backward-compatible internal alias while renderer/runtime migrates away from\n// the old For-only boundary naming.\nexport const __FOR_BOUNDARY__ = __CONTROL_BOUNDARY__;\n\nexport function _isDOMElement(node: unknown): node is DOMElement {\n return typeof node === 'object' && node !== null && 'type' in node;\n}\n"],"mappings":";;AA6BA,MAAa,mBAAmB;AAEhC,SAAgB,cAAc,MAAmC;AAC/D,QAAO,OAAO,SAAS,YAAY,SAAS,QAAQ,UAAU"}
|
|
@@ -1,30 +1,31 @@
|
|
|
1
|
+
//#region src/components/link.d.ts
|
|
1
2
|
/**
|
|
2
3
|
* Link component for client-side navigation
|
|
3
4
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
5
|
+
type LinkProps = Omit<JSX.IntrinsicElements['a'], 'children' | 'href' | 'class' | 'rel' | 'target' | 'aria-current' | 'aria-label'> & {
|
|
6
|
+
href: string;
|
|
7
|
+
class?: string;
|
|
8
|
+
children?: unknown;
|
|
9
|
+
/**
|
|
10
|
+
* Optional rel attribute for link relationships.
|
|
11
|
+
* Common values: "noopener", "noreferrer", "nofollow"
|
|
12
|
+
*/
|
|
13
|
+
rel?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Optional target attribute.
|
|
16
|
+
* Use "_blank" for new tab/window.
|
|
17
|
+
*/
|
|
18
|
+
target?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Optional aria-current attribute for indicating current page/location.
|
|
21
|
+
* Use "page" for the current page in navigation.
|
|
22
|
+
*/
|
|
23
|
+
'aria-current'?: 'page' | 'step' | 'location' | 'date' | 'time' | 'true' | 'false';
|
|
24
|
+
/**
|
|
25
|
+
* Optional aria-label for accessibility when link text isn't descriptive enough.
|
|
26
|
+
*/
|
|
27
|
+
'aria-label'?: string;
|
|
28
|
+
};
|
|
28
29
|
/**
|
|
29
30
|
* Link component that prevents default navigation and uses navigate()
|
|
30
31
|
* Provides declarative way to navigate between routes
|
|
@@ -52,5 +53,16 @@ export interface LinkProps {
|
|
|
52
53
|
* - Keyboard handling automatic
|
|
53
54
|
* - Composable via mergeProps
|
|
54
55
|
*/
|
|
55
|
-
|
|
56
|
+
declare function Link({
|
|
57
|
+
href,
|
|
58
|
+
class: className,
|
|
59
|
+
children,
|
|
60
|
+
rel,
|
|
61
|
+
target,
|
|
62
|
+
'aria-current': ariaCurrent,
|
|
63
|
+
'aria-label': ariaLabel,
|
|
64
|
+
...rest
|
|
65
|
+
}: LinkProps): JSX.Element;
|
|
66
|
+
//#endregion
|
|
67
|
+
export { Link, LinkProps };
|
|
56
68
|
//# sourceMappingURL=link.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.d.ts","
|
|
1
|
+
{"version":3,"file":"link.d.ts","names":[],"sources":["../../src/components/link.tsx"],"mappings":";;AAQA;;KAAY,SAAA,GAAY,IAAA,CACtB,GAAA,CAAI,iBAAA;EASJ,IAAA;EACA,KAAA;EACA,QAAA;EAXI;;;;EAgBJ,GAAA;EAKA;;;;EAAA,MAAA;EA8Cc;;;;EAzCd,cAAA;EA4CA;;;EAjCA,YAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8Bc,IAAA,CAAA;EACd,IAAA;EACA,KAAA,EAAO,SAAA;EACP,QAAA;EACA,GAAA;EACA,MAAA;EAAA,gBACgB,WAAA;EAAA,cACF,SAAA;EAAA,GACX;AAAA,GACF,SAAA,GAAY,GAAA,CAAI,OAAA"}
|
package/dist/components/link.js
CHANGED
|
@@ -1 +1,64 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx } from "../jsx-runtime.js";
|
|
2
|
+
import { navigate } from "../router/navigate.js";
|
|
3
|
+
import { mergeProps } from "../foundations/utilities/merge-props.js";
|
|
4
|
+
import { applyInteractionPolicy } from "../foundations/interactions/interaction-policy.js";
|
|
5
|
+
import "../jsx-runtime2.js";
|
|
6
|
+
//#region src/components/link.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Link component for client-side navigation
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Link component that prevents default navigation and uses navigate()
|
|
12
|
+
* Provides declarative way to navigate between routes
|
|
13
|
+
*
|
|
14
|
+
* Accessibility features:
|
|
15
|
+
* - Proper semantic <a> element (not a button)
|
|
16
|
+
* - Supports aria-current for indicating active page
|
|
17
|
+
* - Supports aria-label for descriptive labels
|
|
18
|
+
* - Keyboard accessible (Enter key handled by native <a> element)
|
|
19
|
+
*
|
|
20
|
+
* Respects native browser behaviors:
|
|
21
|
+
* - Middle-click (opens in new tab)
|
|
22
|
+
* - Ctrl/Cmd+click (opens in new tab)
|
|
23
|
+
* - Shift+click (opens in new window)
|
|
24
|
+
* - Alt+click (downloads link)
|
|
25
|
+
* - Right-click context menu
|
|
26
|
+
*
|
|
27
|
+
* Best practices:
|
|
28
|
+
* - Use target="_blank" with rel="noopener noreferrer" for external links
|
|
29
|
+
* - Use aria-current="page" for the current page in navigation
|
|
30
|
+
* - Provide descriptive link text or aria-label
|
|
31
|
+
*
|
|
32
|
+
* Uses applyInteractionPolicy to enforce pit-of-success principles:
|
|
33
|
+
* - Interaction behavior centralized in foundations
|
|
34
|
+
* - Keyboard handling automatic
|
|
35
|
+
* - Composable via mergeProps
|
|
36
|
+
*/
|
|
37
|
+
function Link({ href, class: className, children, rel, target, "aria-current": ariaCurrent, "aria-label": ariaLabel, ...rest }) {
|
|
38
|
+
return /* @__PURE__ */ jsx("a", {
|
|
39
|
+
...mergeProps(rest, {
|
|
40
|
+
...applyInteractionPolicy({
|
|
41
|
+
isNative: true,
|
|
42
|
+
disabled: false,
|
|
43
|
+
onPress: (e) => {
|
|
44
|
+
const event = e;
|
|
45
|
+
if ((event.button ?? 0) !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return;
|
|
46
|
+
if (target) return;
|
|
47
|
+
event.preventDefault();
|
|
48
|
+
navigate(href);
|
|
49
|
+
}
|
|
50
|
+
}),
|
|
51
|
+
href,
|
|
52
|
+
class: className,
|
|
53
|
+
rel,
|
|
54
|
+
target,
|
|
55
|
+
"aria-current": ariaCurrent,
|
|
56
|
+
"aria-label": ariaLabel
|
|
57
|
+
}),
|
|
58
|
+
children
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
export { Link };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","names":[],"sources":["../../src/components/link.tsx"],"sourcesContent":["/**\n * Link component for client-side navigation\n */\n\nimport { navigate } from '../router/navigate';\nimport { applyInteractionPolicy } from '../foundations/interactions/interaction-policy';\nimport { mergeProps } from '../foundations/utilities/merge-props';\n\nexport type LinkProps = Omit<\n JSX.IntrinsicElements['a'],\n | 'children'\n | 'href'\n | 'class'\n | 'rel'\n | 'target'\n | 'aria-current'\n | 'aria-label'\n> & {\n href: string;\n class?: string;\n children?: unknown;\n /**\n * Optional rel attribute for link relationships.\n * Common values: \"noopener\", \"noreferrer\", \"nofollow\"\n */\n rel?: string;\n /**\n * Optional target attribute.\n * Use \"_blank\" for new tab/window.\n */\n target?: string;\n /**\n * Optional aria-current attribute for indicating current page/location.\n * Use \"page\" for the current page in navigation.\n */\n 'aria-current'?:\n | 'page'\n | 'step'\n | 'location'\n | 'date'\n | 'time'\n | 'true'\n | 'false';\n /**\n * Optional aria-label for accessibility when link text isn't descriptive enough.\n */\n 'aria-label'?: string;\n};\n\n/**\n * Link component that prevents default navigation and uses navigate()\n * Provides declarative way to navigate between routes\n *\n * Accessibility features:\n * - Proper semantic <a> element (not a button)\n * - Supports aria-current for indicating active page\n * - Supports aria-label for descriptive labels\n * - Keyboard accessible (Enter key handled by native <a> element)\n *\n * Respects native browser behaviors:\n * - Middle-click (opens in new tab)\n * - Ctrl/Cmd+click (opens in new tab)\n * - Shift+click (opens in new window)\n * - Alt+click (downloads link)\n * - Right-click context menu\n *\n * Best practices:\n * - Use target=\"_blank\" with rel=\"noopener noreferrer\" for external links\n * - Use aria-current=\"page\" for the current page in navigation\n * - Provide descriptive link text or aria-label\n *\n * Uses applyInteractionPolicy to enforce pit-of-success principles:\n * - Interaction behavior centralized in foundations\n * - Keyboard handling automatic\n * - Composable via mergeProps\n */\nexport function Link({\n href,\n class: className,\n children,\n rel,\n target,\n 'aria-current': ariaCurrent,\n 'aria-label': ariaLabel,\n ...rest\n}: LinkProps): JSX.Element {\n const interaction = applyInteractionPolicy({\n isNative: true,\n disabled: false,\n onPress: (e: Event) => {\n const event = e as MouseEvent;\n\n // Only intercept left-click without modifiers\n // Default button to 0 if undefined (for mock events in tests)\n const button = event.button ?? 0;\n if (\n button !== 0 || // not left-click\n event.ctrlKey || // Ctrl/Cmd+click\n event.metaKey || // Cmd on Mac\n event.shiftKey || // Shift+click\n event.altKey // Alt+click\n ) {\n return; // Let browser handle it (new tab, etc.)\n }\n\n // Don't intercept external links or explicit target\n if (target) {\n return; // Let browser handle it\n }\n\n event.preventDefault();\n navigate(href);\n },\n });\n\n const props = mergeProps(rest, {\n ...interaction,\n href,\n class: className,\n rel,\n target,\n 'aria-current': ariaCurrent,\n 'aria-label': ariaLabel,\n });\n\n return <a {...props}>{children}</a>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4EA,SAAgB,KAAK,EACnB,MACA,OAAO,WACP,UACA,KACA,QACA,gBAAgB,aAChB,cAAc,WACd,GAAG,QACsB;AAwCzB,QAAO,oBAAC,KAAD;EAAG,GAVI,WAAW,MAAM;GAC7B,GA9BkB,uBAAuB;IACzC,UAAU;IACV,UAAU;IACV,UAAU,MAAa;KACrB,MAAM,QAAQ;AAKd,UADe,MAAM,UAAU,OAElB,KACX,MAAM,WACN,MAAM,WACN,MAAM,YACN,MAAM,OAEN;AAIF,SAAI,OACF;AAGF,WAAM,gBAAgB;AACtB,cAAS,KAAK;;IAEjB,CAGI;GACH;GACA,OAAO;GACP;GACA;GACA,gBAAgB;GAChB,cAAc;GACf,CAEa;EAAQ;EAAa,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { JSXElement } from "../common/jsx.js";
|
|
2
|
+
|
|
3
|
+
//#region src/control/case.d.ts
|
|
4
|
+
type MatchProps = {
|
|
5
|
+
key?: string | number | null;
|
|
6
|
+
when: unknown;
|
|
7
|
+
children: unknown;
|
|
8
|
+
};
|
|
9
|
+
type CaseProps = {
|
|
10
|
+
fallback?: unknown;
|
|
11
|
+
children?: unknown;
|
|
12
|
+
};
|
|
13
|
+
declare function Match(_props: MatchProps): null;
|
|
14
|
+
declare const Case: (props: CaseProps) => JSXElement;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { Case, CaseProps, Match, MatchProps };
|
|
17
|
+
//# sourceMappingURL=case.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"case.d.ts","names":[],"sources":["../../src/control/case.ts"],"mappings":";;;KAeY,UAAA;EACV,GAAA;EACA,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,SAAA;EACV,QAAA;EACA,QAAA;AAAA;AAAA,iBAmBc,KAAA,CAAM,MAAA,EAAQ,UAAA;AAAA,cAqFjB,IAAA,GAEP,KAAA,EAAO,SAAA,KAAc,UAAA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { __CONTROL_BOUNDARY__, markEagerControlPrimitive } from "../common/control.js";
|
|
2
|
+
import { isDevelopmentEnvironment } from "../common/env.js";
|
|
3
|
+
import { createCaseState } from "../runtime/control.js";
|
|
4
|
+
import { state } from "../runtime/state.js";
|
|
5
|
+
import { normalizeBoundaryChild } from "./shared.js";
|
|
6
|
+
//#region src/control/case.ts
|
|
7
|
+
function flattenChildren(children) {
|
|
8
|
+
if (!Array.isArray(children)) return children == null || children === false ? [] : [children];
|
|
9
|
+
const result = [];
|
|
10
|
+
for (const child of children) {
|
|
11
|
+
if (Array.isArray(child)) {
|
|
12
|
+
result.push(...flattenChildren(child));
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
result.push(child);
|
|
16
|
+
}
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
function Match(_props) {
|
|
20
|
+
if (isDevelopmentEnvironment()) throw new Error("[askr] <Match> may only be used as a direct child of <Case>.");
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
function createCaseFallbackRenderer(fallback) {
|
|
24
|
+
const normalizedFallback = normalizeBoundaryChild(fallback);
|
|
25
|
+
if (normalizedFallback == null || normalizedFallback === false) return null;
|
|
26
|
+
return () => normalizedFallback;
|
|
27
|
+
}
|
|
28
|
+
function createMatchBranchKey(key, index) {
|
|
29
|
+
if (key == null) return index;
|
|
30
|
+
return `match:${index}:${typeof key}:${String(key)}`;
|
|
31
|
+
}
|
|
32
|
+
function readMatchBranches(children) {
|
|
33
|
+
const branches = [];
|
|
34
|
+
const flatChildren = flattenChildren(children);
|
|
35
|
+
for (let index = 0; index < flatChildren.length; index += 1) {
|
|
36
|
+
const child = flatChildren[index];
|
|
37
|
+
if (child == null || child === false) continue;
|
|
38
|
+
if (typeof child === "object" && child !== null && "type" in child && child.type === Match) {
|
|
39
|
+
const element = child;
|
|
40
|
+
const props = element.props ?? {};
|
|
41
|
+
const key = createMatchBranchKey(element.key, index);
|
|
42
|
+
const render = typeof props.children === "function" ? () => normalizeBoundaryChild(props.children()) : () => normalizeBoundaryChild(props.children);
|
|
43
|
+
branches.push({
|
|
44
|
+
key,
|
|
45
|
+
render,
|
|
46
|
+
when: props.when
|
|
47
|
+
});
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (isDevelopmentEnvironment()) throw new Error("[askr] <Case> only accepts <Match> children.");
|
|
51
|
+
}
|
|
52
|
+
return branches;
|
|
53
|
+
}
|
|
54
|
+
function CasePrimitive(props) {
|
|
55
|
+
const matches = readMatchBranches(props.children);
|
|
56
|
+
const fallback = createCaseFallbackRenderer(props.fallback);
|
|
57
|
+
const caseState = state(createCaseState(matches, fallback))();
|
|
58
|
+
caseState.matches = matches;
|
|
59
|
+
caseState.fallback = fallback;
|
|
60
|
+
return {
|
|
61
|
+
type: __CONTROL_BOUNDARY__,
|
|
62
|
+
_controlState: caseState
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const Case = markEagerControlPrimitive(CasePrimitive);
|
|
66
|
+
//#endregion
|
|
67
|
+
export { Case, Match };
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=case.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"case.js","names":[],"sources":["../../src/control/case.ts"],"sourcesContent":["import {\n __CONTROL_BOUNDARY__,\n markEagerControlPrimitive,\n} from '../common/control';\nimport type { JSXElement } from '../common/jsx';\nimport type { VNode } from '../common/vnode';\nimport { isDevelopmentEnvironment } from '../common/env';\nimport {\n createCaseState,\n type CaseState,\n type MatchBranch,\n} from '../runtime/control';\nimport { state } from '../runtime/state';\nimport { normalizeBoundaryChild } from './shared';\n\nexport type MatchProps = {\n key?: string | number | null;\n when: unknown;\n children: unknown;\n};\n\nexport type CaseProps = {\n fallback?: unknown;\n children?: unknown;\n};\n\nfunction flattenChildren(children: unknown): unknown[] {\n if (!Array.isArray(children)) {\n return children == null || children === false ? [] : [children];\n }\n\n const result: unknown[] = [];\n for (const child of children) {\n if (Array.isArray(child)) {\n result.push(...flattenChildren(child));\n continue;\n }\n result.push(child);\n }\n return result;\n}\n\nexport function Match(_props: MatchProps): null {\n if (isDevelopmentEnvironment()) {\n throw new Error(\n '[askr] <Match> may only be used as a direct child of <Case>.'\n );\n }\n return null;\n}\n\nfunction createCaseFallbackRenderer(fallback: unknown): (() => VNode) | null {\n const normalizedFallback = normalizeBoundaryChild(fallback);\n if (normalizedFallback == null || normalizedFallback === false) {\n return null;\n }\n return () => normalizedFallback;\n}\n\nfunction createMatchBranchKey(\n key: string | number | null | undefined,\n index: number\n): string | number {\n if (key == null) {\n return index;\n }\n return `match:${index}:${typeof key}:${String(key)}`;\n}\n\nfunction readMatchBranches(children: unknown): MatchBranch[] {\n const branches: MatchBranch[] = [];\n const flatChildren = flattenChildren(children);\n\n for (let index = 0; index < flatChildren.length; index += 1) {\n const child = flatChildren[index];\n if (child == null || child === false) {\n continue;\n }\n\n if (\n typeof child === 'object' &&\n child !== null &&\n 'type' in child &&\n (child as JSXElement).type === Match\n ) {\n const element = child as JSXElement;\n const props = (element.props ?? {}) as MatchProps;\n const key = createMatchBranchKey(element.key, index);\n const render =\n typeof props.children === 'function'\n ? () =>\n normalizeBoundaryChild((props.children as () => VNode)()) as VNode\n : () => normalizeBoundaryChild(props.children) as VNode;\n branches.push({\n key,\n render,\n when: props.when,\n });\n continue;\n }\n\n if (isDevelopmentEnvironment()) {\n throw new Error('[askr] <Case> only accepts <Match> children.');\n }\n }\n\n return branches;\n}\n\nfunction CasePrimitive(props: CaseProps): JSXElement {\n const matches = readMatchBranches(props.children);\n const fallback = createCaseFallbackRenderer(props.fallback);\n\n const caseStateContainer = state<CaseState>(\n createCaseState(matches, fallback)\n );\n const caseState = caseStateContainer();\n\n caseState.matches = matches;\n caseState.fallback = fallback;\n\n return {\n type: __CONTROL_BOUNDARY__,\n _controlState: caseState,\n } as unknown as JSXElement;\n}\n\nexport const Case = markEagerControlPrimitive(\n CasePrimitive as (props: CaseProps) => JSXElement\n) as (props: CaseProps) => JSXElement;\n"],"mappings":";;;;;;AA0BA,SAAS,gBAAgB,UAA8B;AACrD,KAAI,CAAC,MAAM,QAAQ,SAAS,CAC1B,QAAO,YAAY,QAAQ,aAAa,QAAQ,EAAE,GAAG,CAAC,SAAS;CAGjE,MAAM,SAAoB,EAAE;AAC5B,MAAK,MAAM,SAAS,UAAU;AAC5B,MAAI,MAAM,QAAQ,MAAM,EAAE;AACxB,UAAO,KAAK,GAAG,gBAAgB,MAAM,CAAC;AACtC;;AAEF,SAAO,KAAK,MAAM;;AAEpB,QAAO;;AAGT,SAAgB,MAAM,QAA0B;AAC9C,KAAI,0BAA0B,CAC5B,OAAM,IAAI,MACR,+DACD;AAEH,QAAO;;AAGT,SAAS,2BAA2B,UAAyC;CAC3E,MAAM,qBAAqB,uBAAuB,SAAS;AAC3D,KAAI,sBAAsB,QAAQ,uBAAuB,MACvD,QAAO;AAET,cAAa;;AAGf,SAAS,qBACP,KACA,OACiB;AACjB,KAAI,OAAO,KACT,QAAO;AAET,QAAO,SAAS,MAAM,GAAG,OAAO,IAAI,GAAG,OAAO,IAAI;;AAGpD,SAAS,kBAAkB,UAAkC;CAC3D,MAAM,WAA0B,EAAE;CAClC,MAAM,eAAe,gBAAgB,SAAS;AAE9C,MAAK,IAAI,QAAQ,GAAG,QAAQ,aAAa,QAAQ,SAAS,GAAG;EAC3D,MAAM,QAAQ,aAAa;AAC3B,MAAI,SAAS,QAAQ,UAAU,MAC7B;AAGF,MACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACT,MAAqB,SAAS,OAC/B;GACA,MAAM,UAAU;GAChB,MAAM,QAAS,QAAQ,SAAS,EAAE;GAClC,MAAM,MAAM,qBAAqB,QAAQ,KAAK,MAAM;GACpD,MAAM,SACJ,OAAO,MAAM,aAAa,mBAEpB,uBAAwB,MAAM,UAA0B,CAAC,SACrD,uBAAuB,MAAM,SAAS;AAClD,YAAS,KAAK;IACZ;IACA;IACA,MAAM,MAAM;IACb,CAAC;AACF;;AAGF,MAAI,0BAA0B,CAC5B,OAAM,IAAI,MAAM,+CAA+C;;AAInE,QAAO;;AAGT,SAAS,cAAc,OAA8B;CACnD,MAAM,UAAU,kBAAkB,MAAM,SAAS;CACjD,MAAM,WAAW,2BAA2B,MAAM,SAAS;CAK3D,MAAM,YAHqB,MACzB,gBAAgB,SAAS,SAAS,CAElB,EAAoB;AAEtC,WAAU,UAAU;AACpB,WAAU,WAAW;AAErB,QAAO;EACL,MAAM;EACN,eAAe;EAChB;;AAGH,MAAa,OAAO,0BAClB,cACD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { JSXElement } from "../common/jsx.js";
|
|
2
|
+
import { VNode } from "../common/vnode.js";
|
|
3
|
+
|
|
4
|
+
//#region src/control/for.d.ts
|
|
5
|
+
type ForEachSource<T> = T[] | (() => T[]);
|
|
6
|
+
type ForBaseProps<T> = {
|
|
7
|
+
each: ForEachSource<T>;
|
|
8
|
+
fallback?: unknown;
|
|
9
|
+
children: (item: T, index: () => number) => VNode;
|
|
10
|
+
};
|
|
11
|
+
type KeyedForProps<T, K extends string | number> = ForBaseProps<T> & {
|
|
12
|
+
by: (item: T, index: number) => K;
|
|
13
|
+
byIndex?: never;
|
|
14
|
+
};
|
|
15
|
+
type IndexedForProps<T> = ForBaseProps<T> & {
|
|
16
|
+
by?: never;
|
|
17
|
+
byIndex: true;
|
|
18
|
+
};
|
|
19
|
+
type ForProps<T, K extends string | number = string | number> = KeyedForProps<T, K> | IndexedForProps<T>;
|
|
20
|
+
declare const For: <T, K extends string | number = string | number>(props: ForProps<T, K>) => JSXElement;
|
|
21
|
+
//#endregion
|
|
22
|
+
export { For, ForEachSource, ForProps };
|
|
23
|
+
//# sourceMappingURL=for.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"for.d.ts","names":[],"sources":["../../src/control/for.ts"],"mappings":";;;;KAgBY,aAAA,MAAmB,CAAA,YAAa,CAAA;AAAA,KAEvC,YAAA;EACH,IAAA,EAAM,aAAA,CAAc,CAAA;EACpB,QAAA;EACA,QAAA,GAAW,IAAA,EAAM,CAAA,EAAG,KAAA,mBAAwB,KAAA;AAAA;AAAA,KAGzC,aAAA,iCAA8C,YAAA,CAAa,CAAA;EAC9D,EAAA,GAAK,IAAA,EAAM,CAAA,EAAG,KAAA,aAAkB,CAAA;EAChC,OAAA;AAAA;AAAA,KAGG,eAAA,MAAqB,YAAA,CAAa,CAAA;EACrC,EAAA;EACA,OAAA;AAAA;AAAA,KAGU,QAAA,mDACR,aAAA,CAAc,CAAA,EAAG,CAAA,IACjB,eAAA,CAAgB,CAAA;AAAA,cA0EP,GAAA,mDAKX,KAAA,EAAO,QAAA,CAAS,CAAA,EAAG,CAAA,MAChB,UAAA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { __CONTROL_BOUNDARY__, markEagerControlPrimitive } from "../common/control.js";
|
|
2
|
+
import { useForState } from "../runtime/for.js";
|
|
3
|
+
import { createFineGrainedEffect } from "../runtime/effect.js";
|
|
4
|
+
import { normalizeBoundaryChild } from "./shared.js";
|
|
5
|
+
//#region src/control/for.ts
|
|
6
|
+
/**
|
|
7
|
+
* For JSX primitive
|
|
8
|
+
*
|
|
9
|
+
* Creates a keyed child-scope boundary for efficient list rendering.
|
|
10
|
+
*/
|
|
11
|
+
function resolveEach(each) {
|
|
12
|
+
const resolved = typeof each === "function" ? each() : each;
|
|
13
|
+
if (!Array.isArray(resolved)) throw new Error("For each must resolve to an array.");
|
|
14
|
+
return resolved;
|
|
15
|
+
}
|
|
16
|
+
function resolveKeyFn(props) {
|
|
17
|
+
if ("by" in props && typeof props.by === "function") return props.by;
|
|
18
|
+
if ("byIndex" in props && props.byIndex === true) return (_item, index) => index;
|
|
19
|
+
throw new Error("[askr] <For> requires a stable `by` key function. Use `byIndex` only as an explicit positional escape hatch.");
|
|
20
|
+
}
|
|
21
|
+
function createForBoundary(props) {
|
|
22
|
+
if ("by" in props && typeof props.by === "function" && "byIndex" in props) throw new Error("[askr] <For> accepts either `by` or `byIndex`, not both.");
|
|
23
|
+
const byFn = resolveKeyFn(props);
|
|
24
|
+
const fallback = normalizeBoundaryChild(props.fallback);
|
|
25
|
+
const forState = useForState(props.each, byFn, props.children, fallback);
|
|
26
|
+
const computeItems = () => resolveEach(forState.eachSource);
|
|
27
|
+
if (!forState._sourceEffect) {
|
|
28
|
+
forState._suspendSourceCommit = true;
|
|
29
|
+
forState._sourceEffect = createFineGrainedEffect({
|
|
30
|
+
lane: "reactive",
|
|
31
|
+
compute: computeItems,
|
|
32
|
+
commit: (items) => {
|
|
33
|
+
forState.currentItems = items;
|
|
34
|
+
if (forState._suspendSourceCommit) return;
|
|
35
|
+
forState._needsSourceReconcile = true;
|
|
36
|
+
if (forState._enqueueBoundaryCommit) {
|
|
37
|
+
forState._enqueueBoundaryCommit();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
forState.parentInstance?._enqueueRun?.();
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
forState._suspendSourceCommit = false;
|
|
44
|
+
} else {
|
|
45
|
+
forState._suspendSourceCommit = true;
|
|
46
|
+
forState._sourceEffect.updateCompute(computeItems);
|
|
47
|
+
forState._suspendSourceCommit = false;
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
type: __CONTROL_BOUNDARY__,
|
|
51
|
+
_controlState: forState,
|
|
52
|
+
_forState: forState
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function ForPrimitive(props) {
|
|
56
|
+
return createForBoundary(props);
|
|
57
|
+
}
|
|
58
|
+
const For = markEagerControlPrimitive(ForPrimitive);
|
|
59
|
+
//#endregion
|
|
60
|
+
export { For };
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=for.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"for.js","names":[],"sources":["../../src/control/for.ts"],"sourcesContent":["/**\n * For JSX primitive\n *\n * Creates a keyed child-scope boundary for efficient list rendering.\n */\n\nimport {\n __CONTROL_BOUNDARY__,\n markEagerControlPrimitive,\n} from '../common/control';\nimport type { JSXElement } from '../common/jsx';\nimport type { DOMElement, VNode } from '../common/vnode';\nimport { createFineGrainedEffect } from '../runtime/effect';\nimport { type ForState, useForState } from '../runtime/for';\nimport { normalizeBoundaryChild } from './shared';\n\nexport type ForEachSource<T> = T[] | (() => T[]);\n\ntype ForBaseProps<T> = {\n each: ForEachSource<T>;\n fallback?: unknown;\n children: (item: T, index: () => number) => VNode;\n};\n\ntype KeyedForProps<T, K extends string | number> = ForBaseProps<T> & {\n by: (item: T, index: number) => K;\n byIndex?: never;\n};\n\ntype IndexedForProps<T> = ForBaseProps<T> & {\n by?: never;\n byIndex: true;\n};\n\nexport type ForProps<T, K extends string | number = string | number> =\n | KeyedForProps<T, K>\n | IndexedForProps<T>;\n\nfunction resolveEach<T>(each: ForEachSource<T>): T[] {\n const resolved = typeof each === 'function' ? each() : each;\n if (!Array.isArray(resolved)) {\n throw new Error('For each must resolve to an array.');\n }\n return resolved;\n}\n\nfunction resolveKeyFn<T>(\n props: ForProps<T>\n): (item: T, index: number) => string | number {\n if ('by' in props && typeof props.by === 'function') {\n return props.by;\n }\n if ('byIndex' in props && props.byIndex === true) {\n return (_item, index) => index;\n }\n throw new Error(\n '[askr] <For> requires a stable `by` key function. Use `byIndex` only as an explicit positional escape hatch.'\n );\n}\n\nfunction createForBoundary<T>(props: ForProps<T>): DOMElement {\n if ('by' in props && typeof props.by === 'function' && 'byIndex' in props) {\n throw new Error('[askr] <For> accepts either `by` or `byIndex`, not both.');\n }\n\n const byFn = resolveKeyFn(props);\n const fallback = normalizeBoundaryChild(props.fallback);\n const forState = useForState(props.each, byFn, props.children, fallback);\n\n const computeItems = () => resolveEach(forState.eachSource);\n if (!forState._sourceEffect) {\n forState._suspendSourceCommit = true;\n forState._sourceEffect = createFineGrainedEffect({\n lane: 'reactive',\n compute: computeItems,\n commit: (items) => {\n forState.currentItems = items;\n\n if (forState._suspendSourceCommit) {\n return;\n }\n\n forState._needsSourceReconcile = true;\n\n if (forState._enqueueBoundaryCommit) {\n forState._enqueueBoundaryCommit();\n return;\n }\n\n forState.parentInstance?._enqueueRun?.();\n },\n });\n forState._suspendSourceCommit = false;\n } else {\n forState._suspendSourceCommit = true;\n forState._sourceEffect.updateCompute(computeItems);\n forState._suspendSourceCommit = false;\n }\n\n return {\n type: __CONTROL_BOUNDARY__,\n _controlState: forState as unknown as ForState<unknown>,\n _forState: forState as unknown as ForState<unknown>,\n };\n}\n\nfunction ForPrimitive<T>(props: ForProps<T>): JSXElement {\n return createForBoundary(props) as unknown as JSXElement;\n}\n\nexport const For = markEagerControlPrimitive(\n ForPrimitive as <T, K extends string | number = string | number>(\n props: ForProps<T, K>\n ) => JSXElement\n) as <T, K extends string | number = string | number>(\n props: ForProps<T, K>\n) => JSXElement;\n"],"mappings":";;;;;;;;;;AAsCA,SAAS,YAAe,MAA6B;CACnD,MAAM,WAAW,OAAO,SAAS,aAAa,MAAM,GAAG;AACvD,KAAI,CAAC,MAAM,QAAQ,SAAS,CAC1B,OAAM,IAAI,MAAM,qCAAqC;AAEvD,QAAO;;AAGT,SAAS,aACP,OAC6C;AAC7C,KAAI,QAAQ,SAAS,OAAO,MAAM,OAAO,WACvC,QAAO,MAAM;AAEf,KAAI,aAAa,SAAS,MAAM,YAAY,KAC1C,SAAQ,OAAO,UAAU;AAE3B,OAAM,IAAI,MACR,+GACD;;AAGH,SAAS,kBAAqB,OAAgC;AAC5D,KAAI,QAAQ,SAAS,OAAO,MAAM,OAAO,cAAc,aAAa,MAClE,OAAM,IAAI,MAAM,2DAA2D;CAG7E,MAAM,OAAO,aAAa,MAAM;CAChC,MAAM,WAAW,uBAAuB,MAAM,SAAS;CACvD,MAAM,WAAW,YAAY,MAAM,MAAM,MAAM,MAAM,UAAU,SAAS;CAExE,MAAM,qBAAqB,YAAY,SAAS,WAAW;AAC3D,KAAI,CAAC,SAAS,eAAe;AAC3B,WAAS,uBAAuB;AAChC,WAAS,gBAAgB,wBAAwB;GAC/C,MAAM;GACN,SAAS;GACT,SAAS,UAAU;AACjB,aAAS,eAAe;AAExB,QAAI,SAAS,qBACX;AAGF,aAAS,wBAAwB;AAEjC,QAAI,SAAS,wBAAwB;AACnC,cAAS,wBAAwB;AACjC;;AAGF,aAAS,gBAAgB,eAAe;;GAE3C,CAAC;AACF,WAAS,uBAAuB;QAC3B;AACL,WAAS,uBAAuB;AAChC,WAAS,cAAc,cAAc,aAAa;AAClD,WAAS,uBAAuB;;AAGlC,QAAO;EACL,MAAM;EACN,eAAe;EACf,WAAW;EACZ;;AAGH,SAAS,aAAgB,OAAgC;AACvD,QAAO,kBAAkB,MAAM;;AAGjC,MAAa,MAAM,0BACjB,aAGD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Fragment } from "../common/jsx.js";
|
|
2
|
+
//#region src/control/shared.ts
|
|
3
|
+
function normalizeBoundaryChild(value) {
|
|
4
|
+
if (Array.isArray(value)) {
|
|
5
|
+
if (value.length === 0) return null;
|
|
6
|
+
if (value.length === 1) return normalizeBoundaryChild(value[0]);
|
|
7
|
+
return {
|
|
8
|
+
type: Fragment,
|
|
9
|
+
props: { children: value }
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
return value ?? null;
|
|
13
|
+
}
|
|
14
|
+
function resolveMaybeAccessor(value) {
|
|
15
|
+
return typeof value === "function" ? value() : value;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { normalizeBoundaryChild, resolveMaybeAccessor };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","names":[],"sources":["../../src/control/shared.ts"],"sourcesContent":["import { Fragment } from '../common/jsx';\nimport type { DOMElement, VNode } from '../common/vnode';\n\nexport function normalizeBoundaryChild(value: unknown): VNode | null {\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return null;\n }\n if (value.length === 1) {\n return normalizeBoundaryChild(value[0]);\n }\n return {\n type: Fragment,\n props: {\n children: value,\n },\n } as DOMElement;\n }\n\n return (value ?? null) as VNode | null;\n}\n\nexport function resolveMaybeAccessor<T>(value: T | (() => T)): T {\n return typeof value === 'function' ? (value as () => T)() : value;\n}\n"],"mappings":";;AAGA,SAAgB,uBAAuB,OAA8B;AACnE,KAAI,MAAM,QAAQ,MAAM,EAAE;AACxB,MAAI,MAAM,WAAW,EACnB,QAAO;AAET,MAAI,MAAM,WAAW,EACnB,QAAO,uBAAuB,MAAM,GAAG;AAEzC,SAAO;GACL,MAAM;GACN,OAAO,EACL,UAAU,OACX;GACF;;AAGH,QAAQ,SAAS;;AAGnB,SAAgB,qBAAwB,OAAyB;AAC/D,QAAO,OAAO,UAAU,aAAc,OAAmB,GAAG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { JSXElement } from "../common/jsx.js";
|
|
2
|
+
import { VNode } from "../common/vnode.js";
|
|
3
|
+
|
|
4
|
+
//#region src/control/show.d.ts
|
|
5
|
+
type ShowSource<T> = T | (() => T);
|
|
6
|
+
type ShowProps<T> = {
|
|
7
|
+
when: ShowSource<T>;
|
|
8
|
+
fallback?: unknown;
|
|
9
|
+
children: unknown | ((value: NonNullable<T>) => VNode);
|
|
10
|
+
};
|
|
11
|
+
declare const Show: <T>(props: ShowProps<T>) => JSXElement;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { Show, ShowProps };
|
|
14
|
+
//# sourceMappingURL=show.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.d.ts","names":[],"sources":["../../src/control/show.ts"],"mappings":";;;;KAUK,UAAA,MAAgB,CAAA,UAAW,CAAA;AAAA,KAEpB,SAAA;EACV,IAAA,EAAM,UAAA,CAAW,CAAA;EACjB,QAAA;EACA,QAAA,cAAsB,KAAA,EAAO,WAAA,CAAY,CAAA,MAAO,KAAA;AAAA;AAAA,cA+CrC,IAAA,MAEJ,KAAA,EAAO,SAAA,CAAU,CAAA,MAAO,UAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { __CONTROL_BOUNDARY__, markEagerControlPrimitive } from "../common/control.js";
|
|
2
|
+
import { createShowState } from "../runtime/control.js";
|
|
3
|
+
import { state } from "../runtime/state.js";
|
|
4
|
+
import { normalizeBoundaryChild, resolveMaybeAccessor } from "./shared.js";
|
|
5
|
+
//#region src/control/show.ts
|
|
6
|
+
function createTruthyRenderer(props) {
|
|
7
|
+
if (typeof props.children === "function") return (value) => normalizeBoundaryChild(props.children(value));
|
|
8
|
+
const staticChild = normalizeBoundaryChild(props.children);
|
|
9
|
+
return () => staticChild;
|
|
10
|
+
}
|
|
11
|
+
function createFallbackRenderer(fallback) {
|
|
12
|
+
const normalizedFallback = normalizeBoundaryChild(fallback);
|
|
13
|
+
if (normalizedFallback == null || normalizedFallback === false) return null;
|
|
14
|
+
return () => normalizedFallback;
|
|
15
|
+
}
|
|
16
|
+
function ShowPrimitive(props) {
|
|
17
|
+
const selectedValue = resolveMaybeAccessor(props.when);
|
|
18
|
+
const renderTruthy = createTruthyRenderer(props);
|
|
19
|
+
const renderFallback = createFallbackRenderer(props.fallback);
|
|
20
|
+
const showState = state(createShowState(selectedValue, renderTruthy, renderFallback))();
|
|
21
|
+
showState.selectedValue = selectedValue;
|
|
22
|
+
showState.renderTruthy = renderTruthy;
|
|
23
|
+
showState.renderFallback = renderFallback;
|
|
24
|
+
return {
|
|
25
|
+
type: __CONTROL_BOUNDARY__,
|
|
26
|
+
_controlState: showState
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const Show = markEagerControlPrimitive(ShowPrimitive);
|
|
30
|
+
//#endregion
|
|
31
|
+
export { Show };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=show.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.js","names":[],"sources":["../../src/control/show.ts"],"sourcesContent":["import {\n __CONTROL_BOUNDARY__,\n markEagerControlPrimitive,\n} from '../common/control';\nimport type { JSXElement } from '../common/jsx';\nimport type { VNode } from '../common/vnode';\nimport { createShowState, type ShowState } from '../runtime/control';\nimport { state } from '../runtime/state';\nimport { normalizeBoundaryChild, resolveMaybeAccessor } from './shared';\n\ntype ShowSource<T> = T | (() => T);\n\nexport type ShowProps<T> = {\n when: ShowSource<T>;\n fallback?: unknown;\n children: unknown | ((value: NonNullable<T>) => VNode);\n};\n\nfunction createTruthyRenderer<T>(\n props: ShowProps<T>\n): ShowState['renderTruthy'] {\n if (typeof props.children === 'function') {\n return (value: unknown) =>\n normalizeBoundaryChild(\n (props.children as (resolved: NonNullable<T>) => VNode)(\n value as NonNullable<T>\n )\n ) as VNode;\n }\n\n const staticChild = normalizeBoundaryChild(props.children);\n return () => staticChild as VNode;\n}\n\nfunction createFallbackRenderer(fallback: unknown): (() => VNode) | null {\n const normalizedFallback = normalizeBoundaryChild(fallback);\n if (normalizedFallback == null || normalizedFallback === false) {\n return null;\n }\n return () => normalizedFallback;\n}\n\nfunction ShowPrimitive<T>(props: ShowProps<T>): JSXElement {\n const selectedValue = resolveMaybeAccessor(props.when);\n const renderTruthy = createTruthyRenderer(props);\n const renderFallback = createFallbackRenderer(props.fallback);\n\n const showStateContainer = state<ShowState>(\n createShowState(selectedValue, renderTruthy, renderFallback)\n );\n const showState = showStateContainer();\n\n showState.selectedValue = selectedValue;\n showState.renderTruthy = renderTruthy;\n showState.renderFallback = renderFallback;\n\n return {\n type: __CONTROL_BOUNDARY__,\n _controlState: showState,\n } as unknown as JSXElement;\n}\n\nexport const Show = markEagerControlPrimitive(\n ShowPrimitive as <T>(props: ShowProps<T>) => JSXElement\n) as <T>(props: ShowProps<T>) => JSXElement;\n"],"mappings":";;;;;AAkBA,SAAS,qBACP,OAC2B;AAC3B,KAAI,OAAO,MAAM,aAAa,WAC5B,SAAQ,UACN,uBACG,MAAM,SACL,MACD,CACF;CAGL,MAAM,cAAc,uBAAuB,MAAM,SAAS;AAC1D,cAAa;;AAGf,SAAS,uBAAuB,UAAyC;CACvE,MAAM,qBAAqB,uBAAuB,SAAS;AAC3D,KAAI,sBAAsB,QAAQ,uBAAuB,MACvD,QAAO;AAET,cAAa;;AAGf,SAAS,cAAiB,OAAiC;CACzD,MAAM,gBAAgB,qBAAqB,MAAM,KAAK;CACtD,MAAM,eAAe,qBAAqB,MAAM;CAChD,MAAM,iBAAiB,uBAAuB,MAAM,SAAS;CAK7D,MAAM,YAHqB,MACzB,gBAAgB,eAAe,cAAc,eAAe,CAE5C,EAAoB;AAEtC,WAAU,gBAAgB;AAC1B,WAAU,eAAe;AACzB,WAAU,iBAAiB;AAE3B,QAAO;EACL,MAAM;EACN,eAAe;EAChB;;AAGH,MAAa,OAAO,0BAClB,cACD"}
|
package/dist/dev/invariant.js
CHANGED
|
@@ -1,2 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
//#region src/dev/invariant.ts
|
|
2
|
+
/**
|
|
3
|
+
* Invariant assertion utilities for correctness checking
|
|
4
|
+
* Production-safe: invariants are enforced at build-time or with minimal overhead
|
|
5
|
+
*
|
|
6
|
+
* Core principle: fail fast when invariants are violated
|
|
7
|
+
* All functions throw descriptive errors for debugging
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Assert a condition; throw with context if false
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
function invariant(condition, message, context) {
|
|
14
|
+
if (!condition) {
|
|
15
|
+
const contextStr = context ? "\n" + JSON.stringify(context, null, 2) : "";
|
|
16
|
+
throw new Error(`[Askr Invariant] ${message}${contextStr}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Assert scheduling precondition (not reentering, not during render, etc)
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
function assertSchedulingPrecondition(condition, violationMessage) {
|
|
24
|
+
invariant(condition, `[Scheduler Precondition] ${violationMessage}`);
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { assertSchedulingPrecondition, invariant };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=invariant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariant.js","names":[],"sources":["../../src/dev/invariant.ts"],"sourcesContent":["/**\n * Invariant assertion utilities for correctness checking\n * Production-safe: invariants are enforced at build-time or with minimal overhead\n *\n * Core principle: fail fast when invariants are violated\n * All functions throw descriptive errors for debugging\n */\n\n/**\n * Assert a condition; throw with context if false\n * @internal\n */\nexport function invariant(\n condition: boolean,\n message: string,\n context?: Record<string, unknown>\n): asserts condition {\n if (!condition) {\n const contextStr = context ? '\\n' + JSON.stringify(context, null, 2) : '';\n throw new Error(`[Askr Invariant] ${message}${contextStr}`);\n }\n}\n\n/**\n * Assert object property exists and has correct type\n * @internal\n */\nexport function assertProperty<T extends object, K extends keyof T>(\n obj: T,\n prop: K,\n expectedType?: string\n): asserts obj is T & Required<Pick<T, K>> {\n invariant(prop in obj, `Object missing required property '${String(prop)}'`, {\n object: obj,\n });\n\n if (expectedType) {\n const actualType = typeof obj[prop];\n invariant(\n actualType === expectedType,\n `Property '${String(prop)}' has type '${actualType}', expected '${expectedType}'`,\n { value: obj[prop], expectedType }\n );\n }\n}\n\n/**\n * Assert a reference is not null/undefined\n * @internal\n */\nexport function assertDefined<T>(\n value: T | null | undefined,\n message: string\n): asserts value is T {\n invariant(value !== null && value !== undefined, message, { value });\n}\n\n/**\n * Assert a task runs exactly once atomically\n * Useful for verifying lifecycle events fire precisely when expected\n * @internal\n */\nexport class Once {\n private called = false;\n private calledAt: number | null = null;\n readonly name: string;\n\n constructor(name: string) {\n this.name = name;\n }\n\n check(): boolean {\n return this.called;\n }\n\n mark(): void {\n invariant(\n !this.called,\n `${this.name} called multiple times (previously at ${this.calledAt}ms)`,\n { now: Date.now() }\n );\n this.called = true;\n this.calledAt = Date.now();\n }\n\n reset(): void {\n this.called = false;\n this.calledAt = null;\n }\n}\n\n/**\n * Assert a value falls in an enumerated set\n * @internal\n */\nexport function assertEnum<T extends readonly unknown[]>(\n value: unknown,\n allowedValues: T,\n fieldName: string\n): asserts value is T[number] {\n invariant(\n allowedValues.includes(value),\n `${fieldName} must be one of [${allowedValues.join(', ')}], got ${JSON.stringify(value)}`,\n { value, allowed: allowedValues }\n );\n}\n\n/**\n * Assert execution context (scheduler, component, etc)\n * @internal\n */\nexport function assertContext(\n actual: unknown,\n expected: unknown,\n contextName: string\n): asserts actual is typeof expected {\n invariant(\n actual === expected,\n `Invalid ${contextName} context. Expected ${expected}, got ${actual}`,\n { expected, actual }\n );\n}\n\n/**\n * Assert scheduling precondition (not reentering, not during render, etc)\n * @internal\n */\nexport function assertSchedulingPrecondition(\n condition: boolean,\n violationMessage: string\n): asserts condition {\n invariant(condition, `[Scheduler Precondition] ${violationMessage}`);\n}\n\n/**\n * Assert state precondition\n * @internal\n */\nexport function assertStatePrecondition(\n condition: boolean,\n violationMessage: string\n): asserts condition {\n invariant(condition, `[State Precondition] ${violationMessage}`);\n}\n\n/**\n * Verify AbortController lifecycle\n * @internal\n */\nexport function assertAbortControllerState(\n signal: AbortSignal,\n expectedAborted: boolean,\n context: string\n): void {\n invariant(\n signal.aborted === expectedAborted,\n `AbortSignal ${expectedAborted ? 'should be' : 'should not be'} aborted in ${context}`,\n { actual: signal.aborted, expected: expectedAborted }\n );\n}\n\n/**\n * Guard: throw if callback is null when it shouldn't be\n * Used for notifyUpdate, event handlers, etc.\n * @internal\n */\nexport function assertCallbackAvailable<\n T extends (...args: unknown[]) => unknown,\n>(callback: T | null | undefined, callbackName: string): asserts callback is T {\n invariant(\n callback !== null && callback !== undefined,\n `${callbackName} callback is required but not available`,\n { callback }\n );\n}\n\n/**\n * Verify evaluation generation prevents stale evaluations\n * @internal\n */\nexport function assertEvaluationGeneration(\n current: number,\n latest: number,\n context: string\n): void {\n invariant(\n current === latest,\n `Stale evaluation generation in ${context}: current ${current}, latest ${latest}`,\n { current, latest }\n );\n}\n\n/**\n * Verify mounted flag state\n * @internal\n */\nexport function assertMountedState(\n mounted: boolean,\n expectedMounted: boolean,\n context: string\n): void {\n invariant(\n mounted === expectedMounted,\n `Invalid mounted state in ${context}: expected ${expectedMounted}, got ${mounted}`,\n { mounted, expected: expectedMounted }\n );\n}\n\n/**\n * Verify no null target when rendering\n * @internal\n */\nexport function assertRenderTarget(\n target: Element | null,\n context: string\n): asserts target is Element {\n invariant(target !== null, `Cannot render in ${context}: target is null`, {\n target,\n });\n}\n"],"mappings":";;;;;;;;;;;;AAYA,SAAgB,UACd,WACA,SACA,SACmB;AACnB,KAAI,CAAC,WAAW;EACd,MAAM,aAAa,UAAU,OAAO,KAAK,UAAU,SAAS,MAAM,EAAE,GAAG;AACvE,QAAM,IAAI,MAAM,oBAAoB,UAAU,aAAa;;;;;;;AA4G/D,SAAgB,6BACd,WACA,kBACmB;AACnB,WAAU,WAAW,4BAA4B,mBAAmB"}
|