@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/README.md
CHANGED
|
@@ -1,187 +1,95 @@
|
|
|
1
1
|
# Askr
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Askr is an actor-backed UI runtime for TypeScript applications.
|
|
4
|
+
It provides explicit reactivity, routed application startup, server-side rendering,
|
|
5
|
+
and static-site generation entrypoints.
|
|
4
6
|
|
|
5
7
|
## Quick Start
|
|
6
8
|
|
|
7
|
-
```
|
|
9
|
+
```ts
|
|
8
10
|
import { createIsland, state } from '@askrjs/askr';
|
|
9
11
|
|
|
10
12
|
function Counter() {
|
|
11
13
|
const [count, setCount] = state(0);
|
|
12
|
-
return <button onClick={() => setCount(count() + 1)}>{count()}</button>;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
createIsland({ root: document.body, component: Counter });
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## Core Features
|
|
21
|
-
|
|
22
|
-
### Runtime Enforcement
|
|
23
|
-
|
|
24
|
-
Askr validates component structure as it runs, catching mistakes with clear error messages.
|
|
25
|
-
|
|
26
|
-
```typescript
|
|
27
|
-
// This error is caught immediately:
|
|
28
|
-
if (condition) {
|
|
29
|
-
const [x, setX] = state(0); // ❌ Hook order violation
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Error shows the fix:
|
|
33
|
-
const [x, setX] = state(0);
|
|
34
|
-
if (condition) {
|
|
35
|
-
setX(newValue); // ✅ Correct
|
|
36
|
-
}
|
|
37
|
-
```
|
|
38
14
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
Events serialize through a scheduler. State updates are atomic. Renders follow strict ordering.
|
|
42
|
-
|
|
43
|
-
```typescript
|
|
44
|
-
// Event 1 completes (handler + state + DOM)
|
|
45
|
-
// Then Event 2 starts
|
|
46
|
-
// No race conditions
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
Proven with 133 tests covering:
|
|
50
|
-
|
|
51
|
-
- Event ordering (12 tests)
|
|
52
|
-
- State atomicity (12 tests)
|
|
53
|
-
- Transaction semantics (30 tests)
|
|
54
|
-
|
|
55
|
-
### Automatic Cleanup
|
|
56
|
-
|
|
57
|
-
Every component gets an AbortSignal for automatic cancellation.
|
|
58
|
-
|
|
59
|
-
```typescript
|
|
60
|
-
import { resource, getSignal } from '@askrjs/askr/resources';
|
|
61
|
-
|
|
62
|
-
function Data({ id }) {
|
|
63
|
-
const data = resource(async () => {
|
|
64
|
-
const res = await fetch(`/api/${id}`, { signal: getSignal() });
|
|
65
|
-
return res.json();
|
|
66
|
-
}, [id]);
|
|
67
|
-
|
|
68
|
-
if (!data) return <div>Loading...</div>;
|
|
69
|
-
return <div>{data.name}</div>;
|
|
15
|
+
return <button onClick={() => setCount((value) => value + 1)}>{count()}</button>;
|
|
70
16
|
}
|
|
71
|
-
// Async work is cancelled automatically on unmount/navigation
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### Explicit Reactivity
|
|
75
17
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
const [count, setCount] = state(0);
|
|
80
|
-
console.log(count()); // getter: read
|
|
81
|
-
setCount(1); // setter: write
|
|
18
|
+
createIsland({ root: document.body, component: Counter });
|
|
82
19
|
```
|
|
83
20
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
---
|
|
21
|
+
## What It Provides
|
|
87
22
|
|
|
88
|
-
|
|
23
|
+
### Runtime
|
|
89
24
|
|
|
90
|
-
|
|
25
|
+
`@askrjs/askr` exports the core runtime primitives: `state()`, `derive()`,
|
|
26
|
+
`selector()`, `resource()`, routing helpers, JSX control-flow helpers, and SSR/SSG
|
|
27
|
+
entrypoints.
|
|
91
28
|
|
|
92
|
-
|
|
93
|
-
const [value, setValue] = state(initialValue);
|
|
29
|
+
### Explicit reactivity
|
|
94
30
|
|
|
95
|
-
|
|
96
|
-
value();
|
|
97
|
-
|
|
98
|
-
// Write
|
|
99
|
-
setValue(newValue);
|
|
100
|
-
|
|
101
|
-
// Update
|
|
102
|
-
setValue((prev) => prev + 1);
|
|
103
|
-
```
|
|
31
|
+
State is read through getter functions and updated through setter functions.
|
|
104
32
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
```typescript
|
|
33
|
+
```ts
|
|
108
34
|
const [count, setCount] = state(0);
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
console.log(doubled()); // Automatically updates
|
|
35
|
+
console.log(count());
|
|
36
|
+
setCount(1);
|
|
112
37
|
```
|
|
113
38
|
|
|
114
|
-
###
|
|
115
|
-
|
|
116
|
-
```typescript
|
|
117
|
-
const [items, setItems] = state([...]);
|
|
39
|
+
### Routing and app startup
|
|
118
40
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
(item) => item.id,
|
|
122
|
-
(item) => <Item {...item} />
|
|
123
|
-
)
|
|
124
|
-
```
|
|
41
|
+
Startup belongs in `@askrjs/askr/boot`. Routing helpers live in
|
|
42
|
+
`@askrjs/askr/router`.
|
|
125
43
|
|
|
126
|
-
|
|
44
|
+
```ts
|
|
45
|
+
import { createIsland, createSPA } from '@askrjs/askr/boot';
|
|
46
|
+
import { getRoutes, route } from '@askrjs/askr/router';
|
|
127
47
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
createIsland({
|
|
131
|
-
root: document.body,
|
|
132
|
-
component: MyComponent,
|
|
133
|
-
});
|
|
48
|
+
route('/', () => <Home />);
|
|
49
|
+
route('/about', () => <About />);
|
|
134
50
|
|
|
135
|
-
// Routed app
|
|
136
51
|
createSPA({
|
|
137
52
|
root: document.body,
|
|
138
|
-
|
|
139
|
-
routes: [
|
|
140
|
-
{ path: '/', component: Home },
|
|
141
|
-
{ path: '/about', component: About },
|
|
142
|
-
],
|
|
53
|
+
routes: getRoutes(),
|
|
143
54
|
});
|
|
144
55
|
```
|
|
145
56
|
|
|
146
|
-
|
|
57
|
+
### Async resources
|
|
147
58
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
- [Getting Started](docs/getting-started.md)
|
|
151
|
-
- [State Management](docs/state.md)
|
|
152
|
-
- [Runtime Enforcement](docs/enforcement.md)
|
|
153
|
-
- [Deterministic Execution](docs/determinism.md)
|
|
154
|
-
- [API Reference](docs/api.md)
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
## Guarantees
|
|
159
|
-
|
|
160
|
-
Askr provides provable guarantees, tested with 133 tests:
|
|
161
|
-
|
|
162
|
-
- Hook order enforcement (12 tests)
|
|
163
|
-
- Event serialization (12 tests)
|
|
164
|
-
- Atomic transactions (30 tests)
|
|
165
|
-
- Keyed reconciliation (12 tests)
|
|
166
|
-
- Memory safety (8 tests)
|
|
59
|
+
`resource()` manages async work with cancellation support.
|
|
167
60
|
|
|
168
|
-
|
|
61
|
+
```ts
|
|
62
|
+
import { resource } from '@askrjs/askr/resources';
|
|
169
63
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
64
|
+
function Data({ id }: { id: string }) {
|
|
65
|
+
const data = resource(async ({ signal }) => {
|
|
66
|
+
const response = await fetch(`/api/${id}`, { signal });
|
|
67
|
+
return response.json();
|
|
68
|
+
}, [id]);
|
|
175
69
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
70
|
+
if (data.pending) return <div>Loading...</div>;
|
|
71
|
+
if (data.error) return <div>Failed to load</div>;
|
|
72
|
+
return <div>{data.value.name}</div>;
|
|
73
|
+
}
|
|
74
|
+
```
|
|
181
75
|
|
|
182
|
-
|
|
76
|
+
## Documentation
|
|
183
77
|
|
|
184
|
-
|
|
78
|
+
- [Documentation Index](docs/index.md)
|
|
79
|
+
- [Installation](docs/getting-started/installation.md)
|
|
80
|
+
- [Quick Start](docs/getting-started/quick-start.md)
|
|
81
|
+
- [State Guide](docs/guides/state.md)
|
|
82
|
+
- [Router Guide](docs/guides/router.md)
|
|
83
|
+
- [Resources Guide](docs/guides/resources.md)
|
|
84
|
+
- [SSG Guide](docs/guides/ssg.md)
|
|
85
|
+
- [Runtime Enforcement](docs/concepts/runtime-enforcement.md)
|
|
86
|
+
- [Determinism](docs/concepts/determinism.md)
|
|
87
|
+
- [API Reference](docs/reference/api.md)
|
|
88
|
+
|
|
89
|
+
## Release Notes
|
|
90
|
+
|
|
91
|
+
The published package is versioned with the repository `package.json`.
|
|
92
|
+
Release workflows validate the version tag before publishing.
|
|
185
93
|
|
|
186
94
|
## Install
|
|
187
95
|
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { get: (a, b) => (typeof require !== "undefined" ? require : a)[b] }) : x)(function(x) {
|
|
3
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
4
|
+
throw Error("Calling `require` for \"" + x + "\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.");
|
|
5
|
+
});
|
|
6
|
+
//#endregion
|
|
7
|
+
export { __require };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/bench/components/benchmark-row.d.ts
|
|
2
|
+
interface BenchmarkRowData {
|
|
3
|
+
id: number;
|
|
4
|
+
label: string;
|
|
5
|
+
}
|
|
6
|
+
interface BenchmarkRowProps {
|
|
7
|
+
item: BenchmarkRowData;
|
|
8
|
+
isSelected: (id: number) => boolean;
|
|
9
|
+
onSelect: (id: number) => void;
|
|
10
|
+
onRemove: (id: number) => void;
|
|
11
|
+
}
|
|
12
|
+
declare function BenchmarkRow({
|
|
13
|
+
item,
|
|
14
|
+
isSelected,
|
|
15
|
+
onSelect,
|
|
16
|
+
onRemove
|
|
17
|
+
}: BenchmarkRowProps): JSX.Element;
|
|
18
|
+
//#endregion
|
|
19
|
+
export { BenchmarkRowData };
|
|
20
|
+
//# sourceMappingURL=benchmark-row.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark-row.d.ts","names":[],"sources":["../../../src/bench/components/benchmark-row.tsx"],"mappings":";UAAiB,gBAAA;EACf,EAAA;EACA,KAAA;AAAA;AAAA,UAGQ,iBAAA;EACR,IAAA,EAAM,gBAAA;EACN,UAAA,GAAa,EAAA;EACb,QAAA,GAAW,EAAA;EACX,QAAA,GAAW,EAAA;AAAA;AAAA,iBAGG,YAAA,CAAA;EACd,IAAA;EACA,UAAA;EACA,QAAA;EACA;AAAA,GACC,iBAAA,GAAiB,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx, jsxs } from "../../jsx-runtime.js";
|
|
2
|
+
import "../../jsx-runtime2.js";
|
|
3
|
+
//#region src/bench/components/benchmark-row.tsx
|
|
4
|
+
function BenchmarkRow({ item, isSelected, onSelect, onRemove }) {
|
|
5
|
+
return /* @__PURE__ */ jsxs("tr", {
|
|
6
|
+
class: () => isSelected(item.id) ? "danger" : "",
|
|
7
|
+
children: [
|
|
8
|
+
/* @__PURE__ */ jsx("td", {
|
|
9
|
+
class: "col-md-1",
|
|
10
|
+
children: () => item.id
|
|
11
|
+
}, "id"),
|
|
12
|
+
/* @__PURE__ */ jsx("td", {
|
|
13
|
+
class: "col-md-4",
|
|
14
|
+
children: /* @__PURE__ */ jsx("a", {
|
|
15
|
+
onClick: (event) => {
|
|
16
|
+
event.preventDefault();
|
|
17
|
+
onSelect(item.id);
|
|
18
|
+
},
|
|
19
|
+
children: () => item.label
|
|
20
|
+
})
|
|
21
|
+
}, "label"),
|
|
22
|
+
/* @__PURE__ */ jsx("td", {
|
|
23
|
+
class: "col-md-1",
|
|
24
|
+
children: /* @__PURE__ */ jsx("a", {
|
|
25
|
+
onClick: (event) => {
|
|
26
|
+
event.preventDefault();
|
|
27
|
+
onRemove(item.id);
|
|
28
|
+
},
|
|
29
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
30
|
+
class: "glyphicon glyphicon-remove",
|
|
31
|
+
"aria-hidden": "true"
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
}, "remove"),
|
|
35
|
+
/* @__PURE__ */ jsx("td", { class: "col-md-6" }, "spacer")
|
|
36
|
+
]
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { BenchmarkRow };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=benchmark-row.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark-row.js","names":[],"sources":["../../../src/bench/components/benchmark-row.tsx"],"sourcesContent":["export interface BenchmarkRowData {\n id: number;\n label: string;\n}\n\ninterface BenchmarkRowProps {\n item: BenchmarkRowData;\n isSelected: (id: number) => boolean;\n onSelect: (id: number) => void;\n onRemove: (id: number) => void;\n}\n\nexport function BenchmarkRow({\n item,\n isSelected,\n onSelect,\n onRemove,\n}: BenchmarkRowProps) {\n return (\n <tr class={() => (isSelected(item.id) ? 'danger' : '')}>\n <td key=\"id\" class=\"col-md-1\">\n {() => item.id}\n </td>\n <td key=\"label\" class=\"col-md-4\">\n <a\n onClick={(event: MouseEvent) => {\n event.preventDefault();\n onSelect(item.id);\n }}\n >\n {() => item.label}\n </a>\n </td>\n <td key=\"remove\" class=\"col-md-1\">\n <a\n onClick={(event: MouseEvent) => {\n event.preventDefault();\n onRemove(item.id);\n }}\n >\n <span class=\"glyphicon glyphicon-remove\" aria-hidden=\"true\" />\n </a>\n </td>\n <td key=\"spacer\" class=\"col-md-6\" />\n </tr>\n );\n}\n"],"mappings":";;;AAYA,SAAgB,aAAa,EAC3B,MACA,YACA,UACA,YACoB;AACpB,QACE,qBAAC,MAAD;EAAI,aAAc,WAAW,KAAK,GAAG,GAAG,WAAW;YAAnD;GACE,oBAAC,MAAD;IAAa,OAAM;oBACV,KAAK;IACT,EAFG,KAEH;GACL,oBAAC,MAAD;IAAgB,OAAM;cACpB,oBAAC,KAAD;KACE,UAAU,UAAsB;AAC9B,YAAM,gBAAgB;AACtB,eAAS,KAAK,GAAG;;qBAGZ,KAAK;KACV,CAAA;IACD,EATG,QASH;GACL,oBAAC,MAAD;IAAiB,OAAM;cACrB,oBAAC,KAAD;KACE,UAAU,UAAsB;AAC9B,YAAM,gBAAgB;AACtB,eAAS,KAAK,GAAG;;eAGnB,oBAAC,QAAD;MAAM,OAAM;MAA6B,eAAY;MAAS,CAAA;KAC5D,CAAA;IACD,EATG,SASH;GACL,oBAAC,MAAD,EAAiB,OAAM,YAAa,EAA5B,SAA4B;GACjC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx } from "../../jsx-runtime.js";
|
|
2
|
+
import "../../jsx-runtime2.js";
|
|
3
|
+
import { For } from "../../control/for.js";
|
|
4
|
+
import "../../index.js";
|
|
5
|
+
import { BenchmarkRow } from "./benchmark-row.js";
|
|
6
|
+
//#region src/bench/components/benchmark-table.tsx
|
|
7
|
+
function BenchmarkTable({ rows, isSelected, onSelect, onRemove }) {
|
|
8
|
+
return /* @__PURE__ */ jsx("table", {
|
|
9
|
+
class: "table table-hover table-striped test-data",
|
|
10
|
+
children: /* @__PURE__ */ jsx("tbody", { children: /* @__PURE__ */ jsx(For, {
|
|
11
|
+
each: () => rows(),
|
|
12
|
+
by: (item) => item.id,
|
|
13
|
+
children: (item) => /* @__PURE__ */ jsx(BenchmarkRow, {
|
|
14
|
+
item,
|
|
15
|
+
isSelected,
|
|
16
|
+
onSelect,
|
|
17
|
+
onRemove
|
|
18
|
+
})
|
|
19
|
+
}) })
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { BenchmarkTable };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=benchmark-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark-table.js","names":[],"sources":["../../../src/bench/components/benchmark-table.tsx"],"sourcesContent":["import { For, type State } from '../../index';\nimport { BenchmarkRow, type BenchmarkRowData } from './benchmark-row';\n\ninterface BenchmarkTableProps {\n rows: State<BenchmarkRowData[]>;\n isSelected: (id: number) => boolean;\n onSelect: (id: number) => void;\n onRemove: (id: number) => void;\n}\n\nexport function BenchmarkTable({\n rows,\n isSelected,\n onSelect,\n onRemove,\n}: BenchmarkTableProps) {\n return (\n <table class=\"table table-hover table-striped test-data\">\n <tbody>\n {\n <For each={() => rows()} by={(item) => item.id}>\n {(item) => (\n <BenchmarkRow\n item={item}\n isSelected={isSelected}\n onSelect={onSelect}\n onRemove={onRemove}\n />\n )}\n </For>\n }\n </tbody>\n </table>\n );\n}\n"],"mappings":";;;;;;AAUA,SAAgB,eAAe,EAC7B,MACA,YACA,UACA,YACsB;AACtB,QACE,oBAAC,SAAD;EAAO,OAAM;YACX,oBAAC,SAAD,EAAA,UAEI,oBAAC,KAAD;GAAK,YAAY,MAAM;GAAE,KAAK,SAAS,KAAK;cACxC,SACA,oBAAC,cAAD;IACQ;IACM;IACF;IACA;IACV,CAAA;GAEA,CAAA,EAEF,CAAA;EACF,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BenchmarkRowData } from "./bench/components/benchmark-row.js";
|
|
2
|
+
|
|
3
|
+
//#region src/bench/benchmark-entry.d.ts
|
|
4
|
+
type RowData = BenchmarkRowData;
|
|
5
|
+
interface BenchmarkMetadata {
|
|
6
|
+
packageName: string;
|
|
7
|
+
packageVersion: string;
|
|
8
|
+
buildLabel: string;
|
|
9
|
+
}
|
|
10
|
+
declare const benchmarkMetadata: BenchmarkMetadata;
|
|
11
|
+
declare function getBenchmarkMetadata(): BenchmarkMetadata;
|
|
12
|
+
declare function mountBenchmark(root: Element, initialRows?: RowData[]): {
|
|
13
|
+
setRows(rows: RowData[]): void;
|
|
14
|
+
setSelected(id: number | null): void;
|
|
15
|
+
cleanup(): void;
|
|
16
|
+
};
|
|
17
|
+
declare const _default: {
|
|
18
|
+
mountBenchmark: typeof mountBenchmark;
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
export { BenchmarkMetadata, benchmarkMetadata, _default as default, getBenchmarkMetadata, mountBenchmark };
|
|
22
|
+
//# sourceMappingURL=benchmark.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.d.ts","names":[],"sources":["../src/bench/benchmark-entry.tsx"],"mappings":";;;KAWK,OAAA,GAAU,gBAAA;AAAA,UAEE,iBAAA;EACf,WAAA;EACA,cAAA;EACA,UAAA;AAAA;AAAA,cAYW,iBAAA,EAAmB,iBAAA;AAAA,iBAOhB,oBAAA,CAAA,GAAwB,iBAAA;AAAA,iBAIxB,cAAA,CAAe,IAAA,EAAM,OAAA,EAAS,WAAA,GAAc,OAAA;gBAmC1C,OAAA;;;;cAcjB,QAAA"}
|
package/dist/benchmark.js
CHANGED
|
@@ -1 +1,64 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { globalScheduler } from "./runtime/scheduler.js";
|
|
2
|
+
import { jsx } from "./jsx-runtime.js";
|
|
3
|
+
import { installRendererBridge } from "./renderer/index.js";
|
|
4
|
+
import { state } from "./runtime/state.js";
|
|
5
|
+
import { selector } from "./runtime/selector.js";
|
|
6
|
+
import { createIsland } from "./boot/index.js";
|
|
7
|
+
import "./jsx-runtime2.js";
|
|
8
|
+
import { BenchmarkTable } from "./bench/components/benchmark-table.js";
|
|
9
|
+
//#region src/bench/benchmark-entry.tsx
|
|
10
|
+
installRendererBridge();
|
|
11
|
+
const benchmarkMetadata = {
|
|
12
|
+
packageName: "@askrjs/askr",
|
|
13
|
+
packageVersion: "0.0.29",
|
|
14
|
+
buildLabel: "0.0.29-local"
|
|
15
|
+
};
|
|
16
|
+
function getBenchmarkMetadata() {
|
|
17
|
+
return { ...benchmarkMetadata };
|
|
18
|
+
}
|
|
19
|
+
function mountBenchmark(root, initialRows) {
|
|
20
|
+
const initialRowsTyped = Array.isArray(initialRows) ? initialRows : [];
|
|
21
|
+
let dataState;
|
|
22
|
+
let selectedState;
|
|
23
|
+
const App = () => {
|
|
24
|
+
dataState = state(initialRowsTyped);
|
|
25
|
+
selectedState = state(null);
|
|
26
|
+
dataState._hasBeenRead = true;
|
|
27
|
+
const isSelected = selector(selectedState);
|
|
28
|
+
const select = (id) => selectedState.set(id);
|
|
29
|
+
const remove = (id) => {
|
|
30
|
+
dataState.set((rows) => rows.filter((item) => item.id !== id));
|
|
31
|
+
selectedState.set((selected) => selected === id ? null : selected);
|
|
32
|
+
};
|
|
33
|
+
return /* @__PURE__ */ jsx("div", {
|
|
34
|
+
class: "container",
|
|
35
|
+
children: /* @__PURE__ */ jsx(BenchmarkTable, {
|
|
36
|
+
rows: dataState,
|
|
37
|
+
isSelected,
|
|
38
|
+
onSelect: select,
|
|
39
|
+
onRemove: remove
|
|
40
|
+
})
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
createIsland({
|
|
44
|
+
root,
|
|
45
|
+
component: App
|
|
46
|
+
});
|
|
47
|
+
globalScheduler.flush();
|
|
48
|
+
return {
|
|
49
|
+
setRows(rows) {
|
|
50
|
+
dataState.set(rows);
|
|
51
|
+
globalScheduler.flush();
|
|
52
|
+
},
|
|
53
|
+
setSelected(id) {
|
|
54
|
+
selectedState.set(id);
|
|
55
|
+
globalScheduler.flush();
|
|
56
|
+
},
|
|
57
|
+
cleanup() {}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
var benchmark_entry_default = { mountBenchmark };
|
|
61
|
+
//#endregion
|
|
62
|
+
export { benchmarkMetadata, benchmark_entry_default as default, getBenchmarkMetadata, mountBenchmark };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.js","names":[],"sources":["../src/bench/benchmark-entry.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { createIsland } from '../boot';\nimport { installRendererBridge } from '../renderer';\nimport { selector } from '../runtime/selector';\nimport { state, State } from '../runtime/state';\nimport { globalScheduler } from '../runtime/scheduler';\nimport { BenchmarkTable } from './components/benchmark-table';\nimport type { BenchmarkRowData } from './components/benchmark-row';\n\ninstallRendererBridge();\n\ntype RowData = BenchmarkRowData;\n\nexport interface BenchmarkMetadata {\n packageName: string;\n packageVersion: string;\n buildLabel: string;\n}\n\nconst packageName =\n process.env.ASKR_PACKAGE_NAME ||\n process.env.npm_package_name ||\n '@askrjs/askr';\nconst packageVersion =\n process.env.ASKR_PACKAGE_VERSION ||\n process.env.npm_package_version ||\n '0.0.0';\n\nexport const benchmarkMetadata: BenchmarkMetadata = {\n packageName,\n packageVersion,\n buildLabel:\n process.env.ASKR_BENCHMARK_BUILD_LABEL || `${packageVersion}-local`,\n};\n\nexport function getBenchmarkMetadata(): BenchmarkMetadata {\n return { ...benchmarkMetadata };\n}\n\nexport function mountBenchmark(root: Element, initialRows?: RowData[]) {\n const initialRowsTyped: RowData[] = Array.isArray(initialRows)\n ? initialRows\n : [];\n let dataState!: State<RowData[]>;\n let selectedState!: State<number | null>;\n\n const App = () => {\n dataState = state<RowData[]>(initialRowsTyped);\n selectedState = state<number | null>(null);\n dataState._hasBeenRead = true;\n const isSelected = selector(selectedState);\n\n const select = (id: number) => selectedState.set(id);\n const remove = (id: number) => {\n dataState.set((rows) => rows.filter((item) => item.id !== id));\n selectedState.set((selected) => (selected === id ? null : selected));\n };\n\n return (\n <div class=\"container\">\n <BenchmarkTable\n rows={dataState}\n isSelected={isSelected}\n onSelect={select}\n onRemove={remove}\n />\n </div>\n );\n };\n\n createIsland({ root, component: App as any });\n globalScheduler.flush();\n\n return {\n setRows(rows: RowData[]) {\n dataState.set(rows);\n // Ensure work is flushed so external harnesses (like JFB) that check the DOM\n // immediately after calling `setRows` observe the committed DOM.\n globalScheduler.flush();\n },\n setSelected(id: number | null) {\n selectedState.set(id);\n globalScheduler.flush();\n },\n cleanup() {\n // nothing to do; outer test may clean the container\n },\n };\n}\n\nexport default { mountBenchmark };\n"],"mappings":";;;;;;;;;AASA,uBAAuB;AAmBvB,MAAa,oBAAuC;CAClD;CACA;CACA,YAAA;CAED;AAED,SAAgB,uBAA0C;AACxD,QAAO,EAAE,GAAG,mBAAmB;;AAGjC,SAAgB,eAAe,MAAe,aAAyB;CACrE,MAAM,mBAA8B,MAAM,QAAQ,YAAY,GAC1D,cACA,EAAE;CACN,IAAI;CACJ,IAAI;CAEJ,MAAM,YAAY;AAChB,cAAY,MAAiB,iBAAiB;AAC9C,kBAAgB,MAAqB,KAAK;AAC1C,YAAU,eAAe;EACzB,MAAM,aAAa,SAAS,cAAc;EAE1C,MAAM,UAAU,OAAe,cAAc,IAAI,GAAG;EACpD,MAAM,UAAU,OAAe;AAC7B,aAAU,KAAK,SAAS,KAAK,QAAQ,SAAS,KAAK,OAAO,GAAG,CAAC;AAC9D,iBAAc,KAAK,aAAc,aAAa,KAAK,OAAO,SAAU;;AAGtE,SACE,oBAAC,OAAD;GAAK,OAAM;aACT,oBAAC,gBAAD;IACE,MAAM;IACM;IACZ,UAAU;IACV,UAAU;IACV,CAAA;GACE,CAAA;;AAIV,cAAa;EAAE;EAAM,WAAW;EAAY,CAAC;AAC7C,iBAAgB,OAAO;AAEvB,QAAO;EACL,QAAQ,MAAiB;AACvB,aAAU,IAAI,KAAK;AAGnB,mBAAgB,OAAO;;EAEzB,YAAY,IAAmB;AAC7B,iBAAc,IAAI,GAAG;AACrB,mBAAgB,OAAO;;EAEzB,UAAU;EAGX;;AAGH,IAAA,0BAAe,EAAE,gBAAgB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { createStaticGen } from "../ssg/create-static-gen.js";
|
|
2
|
+
//#region src/bin/askr-ssg.d.ts
|
|
3
|
+
interface ParsedCliArgs {
|
|
4
|
+
configPath: string;
|
|
5
|
+
outputDir: string;
|
|
6
|
+
workers: number | 'auto';
|
|
7
|
+
incremental: boolean;
|
|
8
|
+
changedKeys: string[];
|
|
9
|
+
changedRoutes: string[];
|
|
10
|
+
forceFull: boolean;
|
|
11
|
+
help: boolean;
|
|
12
|
+
}
|
|
13
|
+
interface CliIo {
|
|
14
|
+
log: (...args: unknown[]) => void;
|
|
15
|
+
error: (...args: unknown[]) => void;
|
|
16
|
+
}
|
|
17
|
+
interface CliDeps {
|
|
18
|
+
cwd: () => string;
|
|
19
|
+
now: () => number;
|
|
20
|
+
existsSync: (path: string) => boolean;
|
|
21
|
+
importConfig: (path: string) => Promise<Record<string, unknown>>;
|
|
22
|
+
createStaticGen: typeof createStaticGen;
|
|
23
|
+
}
|
|
24
|
+
declare function parseCliArgs(args: string[]): ParsedCliArgs;
|
|
25
|
+
declare function runCli(args: string[], deps?: Partial<CliDeps>, io?: CliIo): Promise<number>;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { ParsedCliArgs, parseCliArgs, runCli };
|
|
28
|
+
//# sourceMappingURL=askr-ssg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"askr-ssg.d.ts","names":[],"sources":["../../src/bin/askr-ssg.ts"],"mappings":";;UAuBiB,aAAA;EACf,UAAA;EACA,SAAA;EACA,OAAA;EACA,WAAA;EACA,WAAA;EACA,aAAA;EACA,SAAA;EACA,IAAA;AAAA;AAAA,UAGQ,KAAA;EACR,GAAA,MAAS,IAAA;EACT,KAAA,MAAW,IAAA;AAAA;AAAA,UAGH,OAAA;EACR,GAAA;EACA,GAAA;EACA,UAAA,GAAa,IAAA;EACb,YAAA,GAAe,IAAA,aAAiB,OAAA,CAAQ,MAAA;EACxC,eAAA,SAAwB,eAAA;AAAA;AAAA,iBA2CV,YAAA,CAAa,IAAA,aAAiB,aAAA;AAAA,iBAqExB,MAAA,CACpB,IAAA,YACA,IAAA,GAAM,OAAA,CAAQ,OAAA,GACd,EAAA,GAAI,KAAA,GACH,OAAA"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createStaticGen } from "../ssg/create-static-gen.js";
|
|
3
|
+
import "../ssg/index.js";
|
|
4
|
+
import * as pathModule from "path";
|
|
5
|
+
import * as fsModule from "fs";
|
|
6
|
+
//#region src/bin/askr-ssg.ts
|
|
7
|
+
/**
|
|
8
|
+
* askr-ssg CLI
|
|
9
|
+
*
|
|
10
|
+
* Usage: askr-ssg --config path/to/config.ts --output dist/static
|
|
11
|
+
*/
|
|
12
|
+
const { resolve } = pathModule;
|
|
13
|
+
const { existsSync } = fsModule;
|
|
14
|
+
function toFileUrl(filePath) {
|
|
15
|
+
const normalized = resolve(filePath).replace(/\\/g, "/");
|
|
16
|
+
return `file://${normalized.startsWith("/") ? "" : "/"}${encodeURI(normalized)}`;
|
|
17
|
+
}
|
|
18
|
+
const defaultCliDeps = {
|
|
19
|
+
cwd: () => process.cwd(),
|
|
20
|
+
now: () => performance.now(),
|
|
21
|
+
existsSync,
|
|
22
|
+
importConfig: async (path) => await import(toFileUrl(path)),
|
|
23
|
+
createStaticGen
|
|
24
|
+
};
|
|
25
|
+
const helpText = `
|
|
26
|
+
askr-ssg - Static Site Generation for Askr
|
|
27
|
+
|
|
28
|
+
Usage:
|
|
29
|
+
askr-ssg --config <path> --output <dir> [--incremental]
|
|
30
|
+
|
|
31
|
+
Options:
|
|
32
|
+
--config <path> Path to SSG config file (TypeScript module)
|
|
33
|
+
--output <dir> Output directory for generated HTML
|
|
34
|
+
--workers <n|auto> Preferred render worker count for SSG throughput
|
|
35
|
+
--incremental Use incremental generation if a manifest exists
|
|
36
|
+
--changed-key <key> Mark an invalidation key as changed (repeatable)
|
|
37
|
+
--changed-route <path> Mark a concrete route path as changed (repeatable)
|
|
38
|
+
--force-full Force a full rebuild even with incremental flags
|
|
39
|
+
--help Show this help message
|
|
40
|
+
|
|
41
|
+
Example:
|
|
42
|
+
askr-ssg --config ./ssg.config.ts --output ./dist/static --incremental --changed-key blog/post-123
|
|
43
|
+
|
|
44
|
+
TypeScript config execution:
|
|
45
|
+
Use tsx to run the CLI with TS config loading:
|
|
46
|
+
tsx node_modules/@askrjs/askr/dist/bin/askr-ssg.js --config ./ssg.config.ts --output ./dist/static
|
|
47
|
+
`;
|
|
48
|
+
function parseCliArgs(args) {
|
|
49
|
+
const parsed = {
|
|
50
|
+
configPath: "",
|
|
51
|
+
outputDir: "",
|
|
52
|
+
workers: 1,
|
|
53
|
+
incremental: false,
|
|
54
|
+
changedKeys: [],
|
|
55
|
+
changedRoutes: [],
|
|
56
|
+
forceFull: false,
|
|
57
|
+
help: false
|
|
58
|
+
};
|
|
59
|
+
for (let i = 0; i < args.length; i++) if (args[i] === "--config" && i + 1 < args.length) {
|
|
60
|
+
parsed.configPath = args[i + 1];
|
|
61
|
+
i++;
|
|
62
|
+
} else if (args[i] === "--output" && i + 1 < args.length) {
|
|
63
|
+
parsed.outputDir = args[i + 1];
|
|
64
|
+
i++;
|
|
65
|
+
} else if (args[i] === "--workers" && i + 1 < args.length) {
|
|
66
|
+
parsed.workers = args[i + 1] === "auto" ? "auto" : Number(args[i + 1]);
|
|
67
|
+
i++;
|
|
68
|
+
} else if (args[i] === "--changed-key" && i + 1 < args.length) {
|
|
69
|
+
parsed.changedKeys.push(args[i + 1]);
|
|
70
|
+
i++;
|
|
71
|
+
} else if (args[i] === "--changed-route" && i + 1 < args.length) {
|
|
72
|
+
parsed.changedRoutes.push(args[i + 1]);
|
|
73
|
+
i++;
|
|
74
|
+
} else if (args[i] === "--incremental") parsed.incremental = true;
|
|
75
|
+
else if (args[i] === "--force-full") parsed.forceFull = true;
|
|
76
|
+
else if (args[i] === "--help" || args[i] === "-h") parsed.help = true;
|
|
77
|
+
return parsed;
|
|
78
|
+
}
|
|
79
|
+
function toGenerateOptions(args) {
|
|
80
|
+
return {
|
|
81
|
+
mode: args.incremental ? "incremental" : "full",
|
|
82
|
+
changedKeys: args.changedKeys,
|
|
83
|
+
changedRoutes: args.changedRoutes,
|
|
84
|
+
forceFull: args.forceFull
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function printSummary(io, outputDir, durationSeconds, result) {
|
|
88
|
+
io.log("");
|
|
89
|
+
io.log(`Generation complete in ${durationSeconds}s`);
|
|
90
|
+
io.log(` Mode: ${result.mode}`);
|
|
91
|
+
io.log(` Generated: ${result.successful}/${result.totalRoutes} routes`);
|
|
92
|
+
io.log(` Failed: ${result.failed} routes`);
|
|
93
|
+
io.log(` Rebuilt: ${result.rebuilt} routes`);
|
|
94
|
+
io.log(` Skipped: ${result.skipped} routes`);
|
|
95
|
+
io.log(` Removed: ${result.removed} routes`);
|
|
96
|
+
io.log(` CacheHit: ${result.cacheHits} routes`);
|
|
97
|
+
io.log(` Output: ${outputDir}`);
|
|
98
|
+
io.log(` Metadata: ${outputDir}/metadata.json`);
|
|
99
|
+
io.log("");
|
|
100
|
+
}
|
|
101
|
+
async function runCli(args, deps = {}, io = console) {
|
|
102
|
+
const parsed = parseCliArgs(args);
|
|
103
|
+
if (parsed.help) {
|
|
104
|
+
io.log(helpText);
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
if (!parsed.configPath) {
|
|
108
|
+
io.error("Error: --config argument is required");
|
|
109
|
+
return 1;
|
|
110
|
+
}
|
|
111
|
+
if (!parsed.configPath.endsWith(".ts")) {
|
|
112
|
+
io.error("Error: --config must point to a TypeScript file (.ts)");
|
|
113
|
+
return 1;
|
|
114
|
+
}
|
|
115
|
+
if (!parsed.outputDir) {
|
|
116
|
+
io.error("Error: --output argument is required");
|
|
117
|
+
return 1;
|
|
118
|
+
}
|
|
119
|
+
const resolvedDeps = {
|
|
120
|
+
...defaultCliDeps,
|
|
121
|
+
...deps
|
|
122
|
+
};
|
|
123
|
+
const resolvedConfigPath = resolve(resolvedDeps.cwd(), parsed.configPath);
|
|
124
|
+
const resolvedOutputDir = resolve(resolvedDeps.cwd(), parsed.outputDir);
|
|
125
|
+
if (!resolvedDeps.existsSync(resolvedConfigPath)) {
|
|
126
|
+
io.error(`Error: Config file not found: ${resolvedConfigPath}`);
|
|
127
|
+
return 1;
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
io.log(`Loading config: ${resolvedConfigPath}`);
|
|
131
|
+
const configModule = await resolvedDeps.importConfig(resolvedConfigPath);
|
|
132
|
+
const config = configModule.default || configModule;
|
|
133
|
+
if (!Array.isArray(config.routes)) {
|
|
134
|
+
io.error("Error: Config must export routes array");
|
|
135
|
+
return 1;
|
|
136
|
+
}
|
|
137
|
+
io.log(`Generating ${config.routes.length} routes...`);
|
|
138
|
+
const ssg = resolvedDeps.createStaticGen({
|
|
139
|
+
routes: config.routes,
|
|
140
|
+
outputDir: resolvedOutputDir,
|
|
141
|
+
seed: config.seed,
|
|
142
|
+
dataOverrides: config.dataOverrides,
|
|
143
|
+
concurrency: config.concurrency,
|
|
144
|
+
parallelism: parsed.workers
|
|
145
|
+
});
|
|
146
|
+
const startTime = resolvedDeps.now();
|
|
147
|
+
const result = await ssg.generate(toGenerateOptions(parsed));
|
|
148
|
+
printSummary(io, resolvedOutputDir, ((resolvedDeps.now() - startTime) / 1e3).toFixed(2), result);
|
|
149
|
+
if (result.failed > 0) {
|
|
150
|
+
io.log("Errors encountered:");
|
|
151
|
+
for (const route of result.routes) if (route.status === "error") io.log(` ${route.path}: ${route.error}`);
|
|
152
|
+
io.log("");
|
|
153
|
+
return 1;
|
|
154
|
+
}
|
|
155
|
+
return 0;
|
|
156
|
+
} catch (error) {
|
|
157
|
+
io.error("Generation failed:");
|
|
158
|
+
io.error(error instanceof Error ? error.message : String(error));
|
|
159
|
+
if (error instanceof Error && error.stack) io.error(error.stack);
|
|
160
|
+
return 1;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
async function main() {
|
|
164
|
+
const exitCode = await runCli(process.argv.slice(2));
|
|
165
|
+
process.exit(exitCode);
|
|
166
|
+
}
|
|
167
|
+
if (process.argv[1] && import.meta.url === toFileUrl(process.argv[1])) main();
|
|
168
|
+
//#endregion
|
|
169
|
+
export { parseCliArgs, runCli };
|
|
170
|
+
|
|
171
|
+
//# sourceMappingURL=askr-ssg.js.map
|