@askrjs/askr 0.0.39 → 0.0.40
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/dist/bench/components/benchmark-row.d.ts.map +1 -1
- package/dist/bench/components/benchmark-row.js.map +1 -1
- package/dist/bench/components/benchmark-table.js.map +1 -1
- package/dist/benchmark.d.ts.map +1 -1
- package/dist/benchmark.js +2 -2
- package/dist/benchmark.js.map +1 -1
- package/dist/bin/askr-ssg.d.ts.map +1 -1
- package/dist/bin/askr-ssg.js.map +1 -1
- package/dist/boot/index.d.ts +9 -6
- package/dist/boot/index.d.ts.map +1 -1
- package/dist/boot/index.js +210 -75
- package/dist/boot/index.js.map +1 -1
- package/dist/common/attr-names.js +17 -0
- package/dist/common/attr-names.js.map +1 -0
- package/dist/common/component.d.ts.map +1 -1
- package/dist/common/control.d.ts.map +1 -1
- package/dist/common/control.js.map +1 -1
- package/dist/common/env.js.map +1 -1
- package/dist/common/jsx.d.ts.map +1 -1
- package/dist/common/jsx.js.map +1 -1
- package/dist/common/promise.js +8 -0
- package/dist/common/promise.js.map +1 -0
- package/dist/common/props.d.ts +286 -1
- package/dist/common/props.d.ts.map +1 -1
- package/dist/common/router-internal.js +6 -0
- package/dist/common/router-internal.js.map +1 -0
- package/dist/common/router.d.ts +45 -36
- package/dist/common/router.d.ts.map +1 -1
- package/dist/common/ssr-errors.d.ts.map +1 -1
- package/dist/common/ssr-errors.js.map +1 -1
- package/dist/common/ssr.d.ts +1 -0
- package/dist/common/ssr.d.ts.map +1 -1
- package/dist/common/ssr.js +6 -0
- package/dist/common/ssr.js.map +1 -0
- package/dist/common/vnode.d.ts +2 -1
- package/dist/common/vnode.d.ts.map +1 -1
- package/dist/common/vnode.js.map +1 -1
- package/dist/components/error-boundary.d.ts +7 -4
- package/dist/components/error-boundary.d.ts.map +1 -1
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/link.d.ts +2 -1
- package/dist/components/link.d.ts.map +1 -1
- package/dist/components/link.js +10 -1
- package/dist/components/link.js.map +1 -1
- package/dist/control/case.d.ts +4 -2
- package/dist/control/case.d.ts.map +1 -1
- package/dist/control/case.js.map +1 -1
- package/dist/control/for.d.ts +2 -1
- package/dist/control/for.d.ts.map +1 -1
- package/dist/control/for.js.map +1 -1
- package/dist/control/shared.d.ts +9 -0
- package/dist/control/shared.d.ts.map +1 -0
- package/dist/control/shared.js.map +1 -1
- package/dist/control/show.d.ts +4 -3
- package/dist/control/show.d.ts.map +1 -1
- package/dist/control/show.js.map +1 -1
- package/dist/data/index.d.ts +94 -14
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +65 -14
- package/dist/data/index.js.map +1 -1
- package/dist/dev/invariant.js.map +1 -1
- package/dist/dev/logger.js.map +1 -1
- package/dist/foundations/icon/icon.d.ts.map +1 -1
- package/dist/foundations/icon/icon.js.map +1 -1
- package/dist/foundations/icon/icon.types.d.ts.map +1 -1
- package/dist/foundations/interactions/dismissable.d.ts +9 -3
- package/dist/foundations/interactions/dismissable.d.ts.map +1 -1
- package/dist/foundations/interactions/dismissable.js.map +1 -1
- package/dist/foundations/interactions/focusable.d.ts.map +1 -1
- package/dist/foundations/interactions/focusable.js.map +1 -1
- package/dist/foundations/interactions/hoverable.d.ts.map +1 -1
- package/dist/foundations/interactions/hoverable.js.map +1 -1
- package/dist/foundations/interactions/interaction-policy.d.ts +1 -1
- package/dist/foundations/interactions/interaction-policy.d.ts.map +1 -1
- package/dist/foundations/interactions/interaction-policy.js +3 -3
- package/dist/foundations/interactions/interaction-policy.js.map +1 -1
- package/dist/foundations/interactions/pressable.d.ts.map +1 -1
- package/dist/foundations/interactions/pressable.js.map +1 -1
- package/dist/foundations/interactions/roving-focus.d.ts.map +1 -1
- package/dist/foundations/interactions/roving-focus.js +8 -8
- package/dist/foundations/interactions/roving-focus.js.map +1 -1
- package/dist/foundations/state/controllable.d.ts.map +1 -1
- package/dist/foundations/state/controllable.js.map +1 -1
- package/dist/foundations/structures/collection.d.ts.map +1 -1
- package/dist/foundations/structures/collection.js.map +1 -1
- package/dist/foundations/structures/layer.d.ts.map +1 -1
- package/dist/foundations/structures/layer.js.map +1 -1
- package/dist/foundations/structures/layout.d.ts +4 -2
- package/dist/foundations/structures/layout.d.ts.map +1 -1
- package/dist/foundations/structures/layout.js.map +1 -1
- package/dist/foundations/structures/portal.d.ts +9 -25
- package/dist/foundations/structures/portal.d.ts.map +1 -1
- package/dist/foundations/structures/portal.js +98 -17
- package/dist/foundations/structures/portal.js.map +1 -1
- package/dist/foundations/structures/presence.d.ts +4 -3
- package/dist/foundations/structures/presence.d.ts.map +1 -1
- package/dist/foundations/structures/presence.js +2 -2
- package/dist/foundations/structures/presence.js.map +1 -1
- package/dist/foundations/structures/slot.d.ts +2 -1
- package/dist/foundations/structures/slot.d.ts.map +1 -1
- package/dist/foundations/structures/slot.js.map +1 -1
- package/dist/foundations/utilities/aria.d.ts.map +1 -1
- package/dist/foundations/utilities/aria.js.map +1 -1
- package/dist/foundations/utilities/compose-handlers.d.ts.map +1 -1
- package/dist/foundations/utilities/compose-handlers.js.map +1 -1
- package/dist/foundations/utilities/compose-ref.d.ts.map +1 -1
- package/dist/foundations/utilities/compose-ref.js.map +1 -1
- package/dist/foundations/utilities/event-types.d.ts.map +1 -1
- package/dist/foundations/utilities/merge-props.js.map +1 -1
- package/dist/foundations/utilities/use-id.d.ts.map +1 -1
- package/dist/foundations/utilities/use-id.js.map +1 -1
- package/dist/fx/fx.d.ts.map +1 -1
- package/dist/fx/fx.js.map +1 -1
- package/dist/fx/noop.js.map +1 -1
- package/dist/fx/timing.d.ts +5 -4
- package/dist/fx/timing.d.ts.map +1 -1
- package/dist/fx/timing.js +7 -4
- package/dist/fx/timing.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/jsx/types.d.ts +3 -3
- package/dist/jsx/types.d.ts.map +1 -1
- package/dist/jsx/utils.d.ts.map +1 -1
- package/dist/jsx/utils.js.map +1 -1
- package/dist/jsx-dev-runtime.d.ts +6 -2
- package/dist/jsx-dev-runtime.d.ts.map +1 -1
- package/dist/jsx-dev-runtime.js.map +1 -1
- package/dist/jsx-runtime.d.ts +16 -6
- package/dist/jsx-runtime.d.ts.map +1 -1
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/renderer/children.js.map +1 -1
- package/dist/renderer/cleanup.js +40 -13
- package/dist/renderer/cleanup.js.map +1 -1
- package/dist/renderer/dom.js +163 -63
- package/dist/renderer/dom.js.map +1 -1
- package/dist/renderer/evaluate.js +9 -6
- package/dist/renderer/evaluate.js.map +1 -1
- package/dist/renderer/fastpath.js.map +1 -1
- package/dist/renderer/for-commit.js +1 -0
- package/dist/renderer/for-commit.js.map +1 -1
- package/dist/renderer/index.js.map +1 -1
- package/dist/renderer/keyed.js.map +1 -1
- package/dist/renderer/reconcile.js +34 -0
- package/dist/renderer/reconcile.js.map +1 -1
- package/dist/renderer/utils.js +34 -3
- package/dist/renderer/utils.js.map +1 -1
- package/dist/router/index.d.ts +2 -2
- package/dist/router/match.js +16 -2
- package/dist/router/match.js.map +1 -1
- package/dist/router/navigate.d.ts +9 -1
- package/dist/router/navigate.d.ts.map +1 -1
- package/dist/router/navigate.js +235 -81
- package/dist/router/navigate.js.map +1 -1
- package/dist/router/policy.d.ts +7 -7
- package/dist/router/policy.d.ts.map +1 -1
- package/dist/router/policy.js +5 -7
- package/dist/router/policy.js.map +1 -1
- package/dist/router/route-context.js.map +1 -1
- package/dist/router/route.d.ts +20 -9
- package/dist/router/route.d.ts.map +1 -1
- package/dist/router/route.js +95 -29
- package/dist/router/route.js.map +1 -1
- package/dist/runtime/child-scope.d.ts.map +1 -1
- package/dist/runtime/child-scope.js +5 -1
- package/dist/runtime/child-scope.js.map +1 -1
- package/dist/runtime/component.d.ts +5 -2
- package/dist/runtime/component.d.ts.map +1 -1
- package/dist/runtime/component.js +85 -25
- package/dist/runtime/component.js.map +1 -1
- package/dist/runtime/context.d.ts +5 -2
- package/dist/runtime/context.d.ts.map +1 -1
- package/dist/runtime/context.js +5 -2
- package/dist/runtime/context.js.map +1 -1
- package/dist/runtime/control.d.ts.map +1 -1
- package/dist/runtime/control.js.map +1 -1
- package/dist/runtime/derive.d.ts.map +1 -1
- package/dist/runtime/derive.js +3 -1
- package/dist/runtime/derive.js.map +1 -1
- package/dist/runtime/dev-namespace.js.map +1 -1
- package/dist/runtime/effect.d.ts.map +1 -1
- package/dist/runtime/effect.js +17 -11
- package/dist/runtime/effect.js.map +1 -1
- package/dist/runtime/events.js +43 -1
- package/dist/runtime/events.js.map +1 -1
- package/dist/runtime/execution-model.js.map +1 -1
- package/dist/runtime/fastlane.js +2 -23
- package/dist/runtime/fastlane.js.map +1 -1
- package/dist/runtime/for-bench.d.ts.map +1 -1
- package/dist/runtime/for-bench.js.map +1 -1
- package/dist/runtime/for.d.ts +1 -1
- package/dist/runtime/for.d.ts.map +1 -1
- package/dist/runtime/for.js +36 -12
- package/dist/runtime/for.js.map +1 -1
- package/dist/runtime/operations.d.ts +3 -13
- package/dist/runtime/operations.d.ts.map +1 -1
- package/dist/runtime/operations.js +47 -39
- package/dist/runtime/operations.js.map +1 -1
- package/dist/runtime/perf-metrics.js.map +1 -1
- package/dist/runtime/readable.d.ts +1 -0
- package/dist/runtime/readable.d.ts.map +1 -1
- package/dist/runtime/readable.js +6 -1
- package/dist/runtime/readable.js.map +1 -1
- package/dist/runtime/resource-cell.js +13 -2
- package/dist/runtime/resource-cell.js.map +1 -1
- package/dist/runtime/scheduler.d.ts.map +1 -1
- package/dist/runtime/scheduler.js +8 -4
- package/dist/runtime/scheduler.js.map +1 -1
- package/dist/runtime/selector.d.ts.map +1 -1
- package/dist/runtime/selector.js +8 -2
- package/dist/runtime/selector.js.map +1 -1
- package/dist/runtime/snapshot-source.d.ts.map +1 -1
- package/dist/runtime/snapshot-source.js.map +1 -1
- package/dist/runtime/ssr-bridge.js.map +1 -1
- package/dist/runtime/state.d.ts +4 -3
- package/dist/runtime/state.d.ts.map +1 -1
- package/dist/runtime/state.js.map +1 -1
- package/dist/ssg/batch-render.js +4 -8
- package/dist/ssg/batch-render.js.map +1 -1
- package/dist/ssg/create-static-gen.d.ts +10 -2
- package/dist/ssg/create-static-gen.d.ts.map +1 -1
- package/dist/ssg/create-static-gen.js +5 -4
- package/dist/ssg/create-static-gen.js.map +1 -1
- package/dist/ssg/generate-metadata.js.map +1 -1
- package/dist/ssg/incremental-manifest.js.map +1 -1
- package/dist/ssg/resolve-ssg-data.js +54 -12
- package/dist/ssg/resolve-ssg-data.js.map +1 -1
- package/dist/ssg/route-utils.js.map +1 -1
- package/dist/ssg/types.d.ts +8 -7
- package/dist/ssg/types.d.ts.map +1 -1
- package/dist/ssg/write-static-files.js.map +1 -1
- package/dist/ssr/attrs.js +3 -2
- package/dist/ssr/attrs.js.map +1 -1
- package/dist/ssr/context.d.ts +1 -0
- package/dist/ssr/context.d.ts.map +1 -1
- package/dist/ssr/context.js +1 -0
- package/dist/ssr/context.js.map +1 -1
- package/dist/ssr/errors.d.ts.map +1 -1
- package/dist/ssr/escape.js.map +1 -1
- package/dist/ssr/index.d.ts +8 -12
- package/dist/ssr/index.d.ts.map +1 -1
- package/dist/ssr/index.js +55 -30
- package/dist/ssr/index.js.map +1 -1
- package/dist/ssr/render-keys.js +15 -4
- package/dist/ssr/render-keys.js.map +1 -1
- package/dist/ssr/render-resolved.js +33 -0
- package/dist/ssr/render-resolved.js.map +1 -0
- package/dist/ssr/sink.js.map +1 -1
- package/dist/ssr/types.d.ts.map +1 -1
- package/dist/ssr/verify-hydration.js +5 -6
- package/dist/ssr/verify-hydration.js.map +1 -1
- package/package.json +12 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presence.d.ts","names":[],"sources":["../../../src/foundations/structures/presence.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"presence.d.ts","names":[],"sources":["../../../src/foundations/structures/presence.ts"],"mappings":";;;UAIiB,aAAA;EACf,OAAA;EACA,QAAA,GAAW,eAAe;AAAA;;;;;;;;AAAA;AA0B5B;;;;;;;;;;;;;;;iBAAgB,QAAA,CAAA;EACd,OAAA;EACA;AAAA,GACC,aAAA,GAAgB,UAAA"}
|
|
@@ -16,8 +16,8 @@ import "../../jsx/index.js";
|
|
|
16
16
|
* Function is called once per render. Use boolean form for static values.
|
|
17
17
|
*
|
|
18
18
|
* 2. Children Type
|
|
19
|
-
*
|
|
20
|
-
*
|
|
19
|
+
* Presence forwards normal renderable child content only.
|
|
20
|
+
* Imperative DOM nodes are not part of the public contract.
|
|
21
21
|
*
|
|
22
22
|
* 3. Immediate Mount/Unmount
|
|
23
23
|
* No exit animations or transitions. When `present` becomes false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presence.js","names":[],"sources":["../../../src/foundations/structures/presence.ts"],"sourcesContent":["import { ELEMENT_TYPE, Fragment } from '../../jsx';\nimport type { JSXElement } from '../../jsx';\n\nexport interface PresenceProps {\n present: boolean | (() => boolean);\n children?:
|
|
1
|
+
{"version":3,"file":"presence.js","names":[],"sources":["../../../src/foundations/structures/presence.ts"],"sourcesContent":["import { ELEMENT_TYPE, Fragment } from '../../jsx';\nimport type { JSXElement } from '../../jsx';\nimport type { RenderableChild } from '../../common/vnode';\n\nexport interface PresenceProps {\n present: boolean | (() => boolean);\n children?: RenderableChild;\n}\n\n/**\n * Presence\n *\n * Structural policy primitive for conditional mount/unmount.\n * - No timers\n * - No animation coupling\n * - No DOM side-effects\n *\n * POLICY DECISIONS (LOCKED):\n *\n * 1. Present as Function\n * Accepts boolean OR function to support lazy evaluation patterns.\n * Function is called once per render. Use boolean form for static values.\n *\n * 2. Children Type\n * Presence forwards normal renderable child content only.\n * Imperative DOM nodes are not part of the public contract.\n *\n * 3. Immediate Mount/Unmount\n * No exit animations or transitions. When `present` becomes false,\n * children are removed immediately. Animation must be layered above\n * this primitive.\n */\nexport function Presence({\n present,\n children,\n}: PresenceProps): JSXElement | null {\n const isPresent =\n typeof present === 'function' ? present() : Boolean(present);\n if (!isPresent) return null;\n\n const element: JSXElement = {\n $$typeof: ELEMENT_TYPE,\n type: Fragment,\n props: { children },\n key: null,\n };\n return element;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,SAAgB,SAAS,EACvB,SACA,YACmC;CAGnC,IAAI,EADF,OAAO,YAAY,aAAa,QAAQ,IAAI,QAAQ,OAAO,IAC7C,OAAO;CAQvB,OAAO;EALL,UAAU;EACV,MAAM;EACN,OAAO,EAAE,SAAS;EAClB,KAAK;CAEA;AACT"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { JSXElement } from "../../common/jsx.js";
|
|
2
|
+
import { RenderableChild } from "../../common/vnode.js";
|
|
2
3
|
//#region src/foundations/structures/slot.d.ts
|
|
3
4
|
type SlotProps = {
|
|
4
5
|
asChild: true;
|
|
@@ -6,7 +7,7 @@ type SlotProps = {
|
|
|
6
7
|
[key: string]: unknown;
|
|
7
8
|
} | {
|
|
8
9
|
asChild?: false;
|
|
9
|
-
children?:
|
|
10
|
+
children?: RenderableChild;
|
|
10
11
|
};
|
|
11
12
|
/**
|
|
12
13
|
* Slot
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slot.d.ts","names":[],"sources":["../../../src/foundations/structures/slot.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"slot.d.ts","names":[],"sources":["../../../src/foundations/structures/slot.tsx"],"mappings":";;;KAIY,SAAA;EAEN,OAAA;EACA,QAAA,EAAU,UAAA;EAAA,CACT,GAAA;AAAA;EAGD,OAAA;EACA,QAAA,GAAW,eAAe;AAAA;;;;;;;;AAAA;AAuBhC;;;;;;;;AAAkD;;;;iBAAlC,IAAA,CAAK,KAAA,EAAO,SAAA,GAAY,UAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slot.js","names":[],"sources":["../../../src/foundations/structures/slot.tsx"],"sourcesContent":["import { Fragment, cloneElement, isElement, ELEMENT_TYPE } from '../../jsx';\nimport type { JSXElement } from '../../jsx';\n\nexport type SlotProps =\n | {\n asChild: true;\n children: JSXElement;\n [key: string]: unknown;\n }\n | {\n asChild?: false;\n children?:
|
|
1
|
+
{"version":3,"file":"slot.js","names":[],"sources":["../../../src/foundations/structures/slot.tsx"],"sourcesContent":["import { Fragment, cloneElement, isElement, ELEMENT_TYPE } from '../../jsx';\nimport type { JSXElement } from '../../jsx';\nimport type { RenderableChild } from '../../common/vnode';\n\nexport type SlotProps =\n | {\n asChild: true;\n children: JSXElement;\n [key: string]: unknown;\n }\n | {\n asChild?: false;\n children?: RenderableChild;\n };\n\n/**\n * Slot\n *\n * Structural primitive for prop forwarding patterns.\n *\n * POLICY DECISIONS (LOCKED):\n *\n * 1. asChild Pattern\n * When asChild=true, merges props into the single child element.\n * Child must be a valid JSXElement; non-element children return null.\n * **Slot props override child props** (injection pattern).\n *\n * 2. Fallback Behavior\n * When asChild=false, returns a Fragment (structural no-op).\n * No DOM element is introduced.\n *\n * 3. Type Safety\n * asChild=true requires exactly one JSXElement child (enforced by type).\n * Runtime validates with isElement() check.\n */\nexport function Slot(props: SlotProps): JSXElement | null {\n if (props.asChild) {\n const { children, asChild: _asChild, ...rest } = props;\n\n if (isElement(children)) {\n return cloneElement(children, rest);\n }\n return null;\n }\n\n // Structural no-op: Slot does not introduce DOM\n // Return a vnode object for the fragment with the internal element marker.\n const element: JSXElement = {\n $$typeof: ELEMENT_TYPE,\n type: Fragment,\n props: { children: props.children },\n key: null,\n };\n return element;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAmCA,SAAgB,KAAK,OAAqC;CACxD,IAAI,MAAM,SAAS;EACjB,MAAM,EAAE,UAAU,SAAS,UAAU,GAAG,SAAS;EAEjD,IAAI,UAAU,QAAQ,GACpB,OAAO,aAAa,UAAU,IAAI;EAEpC,OAAO;CACT;CAUA,OAAO;EALL,UAAU;EACV,MAAM;EACN,OAAO,EAAE,UAAU,MAAM,SAAS;EAClC,KAAK;CAEA;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aria.d.ts","names":[],"sources":["../../../src/foundations/utilities/aria.ts"],"mappings":";;AAIA;;iBAAgB,YAAA,CAAa,QAAA;EAAuB,
|
|
1
|
+
{"version":3,"file":"aria.d.ts","names":[],"sources":["../../../src/foundations/utilities/aria.ts"],"mappings":";;AAIA;;iBAAgB,YAAA,CAAa,QAAA;EAAuB,eAAe;AAAA;AAAA,iBAInD,YAAA,CAAa,QAAA;EAC3B,eAAe;AAAA;AAAA,iBAOD,YAAA,CAAa,QAAA;EAC3B,eAAe;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aria.js","names":[],"sources":["../../../src/foundations/utilities/aria.ts"],"sourcesContent":["/**\n * Tiny aria helpers\n */\n\nexport function ariaDisabled(disabled?: boolean): { 'aria-disabled'?: 'true' } {\n return disabled ? { 'aria-disabled': 'true' } : {};\n}\n\nexport function ariaExpanded(expanded?: boolean): {\n 'aria-expanded'?: 'true' | 'false';\n} {\n return expanded === undefined\n ? {}\n : { 'aria-expanded': String(expanded) as 'true' | 'false' };\n}\n\nexport function ariaSelected(selected?: boolean): {\n 'aria-selected'?: 'true' | 'false';\n} {\n return selected === undefined\n ? {}\n : { 'aria-selected': String(selected) as 'true' | 'false' };\n}\n"],"mappings":";;;;AAIA,SAAgB,aAAa,UAAkD;CAC7E,OAAO,WAAW,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"aria.js","names":[],"sources":["../../../src/foundations/utilities/aria.ts"],"sourcesContent":["/**\n * Tiny aria helpers\n */\n\nexport function ariaDisabled(disabled?: boolean): { 'aria-disabled'?: 'true' } {\n return disabled ? { 'aria-disabled': 'true' } : {};\n}\n\nexport function ariaExpanded(expanded?: boolean): {\n 'aria-expanded'?: 'true' | 'false';\n} {\n return expanded === undefined\n ? {}\n : { 'aria-expanded': String(expanded) as 'true' | 'false' };\n}\n\nexport function ariaSelected(selected?: boolean): {\n 'aria-selected'?: 'true' | 'false';\n} {\n return selected === undefined\n ? {}\n : { 'aria-selected': String(selected) as 'true' | 'false' };\n}\n"],"mappings":";;;;AAIA,SAAgB,aAAa,UAAkD;CAC7E,OAAO,WAAW,EAAE,iBAAiB,OAAO,IAAI,CAAC;AACnD;AAEA,SAAgB,aAAa,UAE3B;CACA,OAAO,aAAa,SAChB,CAAC,IACD,EAAE,iBAAiB,OAAO,QAAQ,EAAsB;AAC9D;AAEA,SAAgB,aAAa,UAE3B;CACA,OAAO,aAAa,SAChB,CAAC,IACD,EAAE,iBAAiB,OAAO,QAAQ,EAAsB;AAC9D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose-handlers.d.ts","names":[],"sources":["../../../src/foundations/utilities/compose-handlers.ts"],"mappings":";;AA0BA
|
|
1
|
+
{"version":3,"file":"compose-handlers.d.ts","names":[],"sources":["../../../src/foundations/utilities/compose-handlers.ts"],"mappings":";;AA0BA;;;;AAKuB;AAcvB;;;;;;;;;;;;;;;;;;;UAnBiB,sBAAA;EAuBH;AAAA;;;EAlBZ,qBAAqB;AAAA;AAAA,iBAcP,eAAA,8BAAA,CACd,KAAA,OAAY,IAAA,EAAM,CAAA,WAClB,MAAA,OAAa,IAAA,EAAM,CAAA,WACnB,OAAA,GAAU,sBAAA,OACL,IAAA,EAAM,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose-handlers.js","names":[],"sources":["../../../src/foundations/utilities/compose-handlers.ts"],"sourcesContent":["/**\n * composeHandlers\n *\n * Compose two event handlers into one. The first handler runs, and unless it\n * calls `event.preventDefault()` (or sets `defaultPrevented`), the second\n * handler runs. This prevents accidental clobbering of child handlers when\n * injecting props.\n *\n * POLICY DECISIONS (LOCKED):\n *\n * 1. Execution Order\n * First handler runs before second (injected before base).\n * This allows injected handlers to prevent default behavior.\n *\n * 2. Default Prevention Check\n * By default, checks `defaultPrevented` on first argument.\n * Can be disabled via options.checkDefaultPrevented = false.\n *\n * 3. Undefined Handler Support\n * Undefined handlers are skipped (no-op). This simplifies usage\n * where handlers are optional.\n *\n * 4. Type Safety\n * Args are readonly to prevent mutation. Return type matches input.\n */\n\nexport interface ComposeHandlersOptions {\n /**\n * When true (default), do not run the second handler if the first prevented default.\n * When false, always run both handlers.\n */\n checkDefaultPrevented?: boolean;\n}\n\nfunction isDefaultPrevented(\n value: unknown\n): value is { defaultPrevented: true } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'defaultPrevented' in value &&\n (value as { defaultPrevented?: boolean }).defaultPrevented === true\n );\n}\n\nexport function composeHandlers<A extends readonly unknown[]>(\n first?: (...args: A) => void,\n second?: (...args: A) => void,\n options?: ComposeHandlersOptions\n): (...args: A) => void {\n // Fast path: if neither handler exists, return stable no-op\n if (!first && !second) {\n return noop as (...args: A) => void;\n }\n\n // Fast path: if only one handler exists, return it directly\n if (!first) return second!;\n if (!second) return first;\n\n // Composition path: both handlers exist\n const checkDefaultPrevented = options?.checkDefaultPrevented !== false;\n\n return function composed(...args: A) {\n first(...args);\n\n if (checkDefaultPrevented && isDefaultPrevented(args[0])) {\n return;\n }\n\n second(...args);\n } as (...args: A) => void;\n}\n\n// Stable no-op for fast path\nfunction noop() {}\n"],"mappings":";AAkCA,SAAS,mBACP,OACqC;CACrC,OACE,OAAO,UAAU,YACjB,UAAU,QACV,sBAAsB,SACrB,MAAyC,qBAAqB
|
|
1
|
+
{"version":3,"file":"compose-handlers.js","names":[],"sources":["../../../src/foundations/utilities/compose-handlers.ts"],"sourcesContent":["/**\n * composeHandlers\n *\n * Compose two event handlers into one. The first handler runs, and unless it\n * calls `event.preventDefault()` (or sets `defaultPrevented`), the second\n * handler runs. This prevents accidental clobbering of child handlers when\n * injecting props.\n *\n * POLICY DECISIONS (LOCKED):\n *\n * 1. Execution Order\n * First handler runs before second (injected before base).\n * This allows injected handlers to prevent default behavior.\n *\n * 2. Default Prevention Check\n * By default, checks `defaultPrevented` on first argument.\n * Can be disabled via options.checkDefaultPrevented = false.\n *\n * 3. Undefined Handler Support\n * Undefined handlers are skipped (no-op). This simplifies usage\n * where handlers are optional.\n *\n * 4. Type Safety\n * Args are readonly to prevent mutation. Return type matches input.\n */\n\nexport interface ComposeHandlersOptions {\n /**\n * When true (default), do not run the second handler if the first prevented default.\n * When false, always run both handlers.\n */\n checkDefaultPrevented?: boolean;\n}\n\nfunction isDefaultPrevented(\n value: unknown\n): value is { defaultPrevented: true } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'defaultPrevented' in value &&\n (value as { defaultPrevented?: boolean }).defaultPrevented === true\n );\n}\n\nexport function composeHandlers<A extends readonly unknown[]>(\n first?: (...args: A) => void,\n second?: (...args: A) => void,\n options?: ComposeHandlersOptions\n): (...args: A) => void {\n // Fast path: if neither handler exists, return stable no-op\n if (!first && !second) {\n return noop as (...args: A) => void;\n }\n\n // Fast path: if only one handler exists, return it directly\n if (!first) return second!;\n if (!second) return first;\n\n // Composition path: both handlers exist\n const checkDefaultPrevented = options?.checkDefaultPrevented !== false;\n\n return function composed(...args: A) {\n first(...args);\n\n if (checkDefaultPrevented && isDefaultPrevented(args[0])) {\n return;\n }\n\n second(...args);\n } as (...args: A) => void;\n}\n\n// Stable no-op for fast path\nfunction noop() {}\n"],"mappings":";AAkCA,SAAS,mBACP,OACqC;CACrC,OACE,OAAO,UAAU,YACjB,UAAU,QACV,sBAAsB,SACrB,MAAyC,qBAAqB;AAEnE;AAEA,SAAgB,gBACd,OACA,QACA,SACsB;CAEtB,IAAI,CAAC,SAAS,CAAC,QACb,OAAO;CAIT,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,CAAC,QAAQ,OAAO;CAGpB,MAAM,wBAAwB,SAAS,0BAA0B;CAEjE,OAAO,SAAS,SAAS,GAAG,MAAS;EACnC,MAAM,GAAG,IAAI;EAEb,IAAI,yBAAyB,mBAAmB,KAAK,EAAE,GACrD;EAGF,OAAO,GAAG,IAAI;CAChB;AACF;AAGA,SAAS,OAAO,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose-ref.d.ts","names":[],"sources":["../../../src/foundations/utilities/compose-ref.ts"],"mappings":";;AAmBA
|
|
1
|
+
{"version":3,"file":"compose-ref.d.ts","names":[],"sources":["../../../src/foundations/utilities/compose-ref.ts"],"mappings":";;AAmBA;;;;;;;;;;AAEgB;AAIhB;;;;;;KANY,GAAA,QACN,KAAA,EAAO,CAAA;EACP,OAAA,EAAS,CAAC;AAAA;AAAA,iBAIA,MAAA,GAAA,CAAU,GAAA,EAAK,GAAA,CAAI,CAAA,GAAI,KAAA,EAAO,CAAA;AAAA,iBAY9B,WAAA,GAAA,CAAA,GACX,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,CAAA,MACjB,KAAA,EAAO,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose-ref.js","names":[],"sources":["../../../src/foundations/utilities/compose-ref.ts"],"sourcesContent":["/**\n * Ref composition utilities\n *\n * POLICY DECISIONS (LOCKED):\n *\n * 1. Ref Types Supported\n * - Callback refs: (value: T | null) => void\n * - Object refs: { current: T | null }\n * - null/undefined (no-op)\n *\n * 2. Write Failure Handling\n * setRef catches write failures (readonly refs) and ignores them.\n * This is intentional — refs may be readonly in some contexts.\n *\n * 3. Composition Order\n * composeRefs applies refs in array order (left to right).\n * All refs are called even if one fails.\n */\n\nexport type Ref<T> =\n | ((value: T | null) => void)\n | { current: T | null }\n | null\n | undefined;\n\nexport function setRef<T>(ref: Ref<T>, value: T | null): void {\n if (!ref) return;\n if (typeof ref === 'function') {\n ref(value);\n return;\n }\n // Fast path: use Object.isExtensible check instead of try/catch for better performance\n if (Object.isExtensible(ref)) {\n (ref as { current: T | null }).current = value;\n }\n}\n\nexport function composeRefs<T>(\n ...refs: Array<Ref<T>>\n): (value: T | null) => void {\n return (value: T | null) => {\n for (const ref of refs) setRef(ref, value);\n };\n}\n"],"mappings":";AAyBA,SAAgB,OAAU,KAAa,OAAuB;CAC5D,IAAI,CAAC,KAAK;CACV,IAAI,OAAO,QAAQ,YAAY;EAC7B,IAAI,
|
|
1
|
+
{"version":3,"file":"compose-ref.js","names":[],"sources":["../../../src/foundations/utilities/compose-ref.ts"],"sourcesContent":["/**\n * Ref composition utilities\n *\n * POLICY DECISIONS (LOCKED):\n *\n * 1. Ref Types Supported\n * - Callback refs: (value: T | null) => void\n * - Object refs: { current: T | null }\n * - null/undefined (no-op)\n *\n * 2. Write Failure Handling\n * setRef catches write failures (readonly refs) and ignores them.\n * This is intentional — refs may be readonly in some contexts.\n *\n * 3. Composition Order\n * composeRefs applies refs in array order (left to right).\n * All refs are called even if one fails.\n */\n\nexport type Ref<T> =\n | ((value: T | null) => void)\n | { current: T | null }\n | null\n | undefined;\n\nexport function setRef<T>(ref: Ref<T>, value: T | null): void {\n if (!ref) return;\n if (typeof ref === 'function') {\n ref(value);\n return;\n }\n // Fast path: use Object.isExtensible check instead of try/catch for better performance\n if (Object.isExtensible(ref)) {\n (ref as { current: T | null }).current = value;\n }\n}\n\nexport function composeRefs<T>(\n ...refs: Array<Ref<T>>\n): (value: T | null) => void {\n return (value: T | null) => {\n for (const ref of refs) setRef(ref, value);\n };\n}\n"],"mappings":";AAyBA,SAAgB,OAAU,KAAa,OAAuB;CAC5D,IAAI,CAAC,KAAK;CACV,IAAI,OAAO,QAAQ,YAAY;EAC7B,IAAI,KAAK;EACT;CACF;CAEA,IAAI,OAAO,aAAa,GAAG,GACzB,IAA+B,UAAU;AAE7C;AAEA,SAAgB,YACd,GAAG,MACwB;CAC3B,QAAQ,UAAoB;EAC1B,KAAK,MAAM,OAAO,MAAM,OAAO,KAAK,KAAK;CAC3C;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-types.d.ts","names":[],"sources":["../../../src/foundations/utilities/event-types.ts"],"mappings":";UAAiB,kBAAA;EACf,gBAAA;EACA,
|
|
1
|
+
{"version":3,"file":"event-types.d.ts","names":[],"sources":["../../../src/foundations/utilities/event-types.ts"],"mappings":";UAAiB,kBAAA;EACf,gBAAA;EACA,cAAc;AAAA;AAAA,UAGC,oBAAA;EACf,eAAe;AAAA;AAAA,UAGA,iBAAA,SACP,kBAAA,EAAoB,oBAAoB;EAChD,GAAA;AAAA;AAAA,UAGe,gBAAA,SACP,kBAAA,EAAoB,oBAAoB;EAChD,MAAA;AAAA;AAAA,UAGe,cAAA,SACP,kBAAA,EAAoB,oBAAoB;EAChD,aAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-props.js","names":[],"sources":["../../../src/foundations/utilities/merge-props.ts"],"sourcesContent":["/**\n * mergeProps\n *\n * Deterministic props merging.\n * - For non-handlers: `base` overwrites `injected`.\n * - For handlers present in both: handlers are composed with `injected` running\n * first; it may call `preventDefault()` to suppress the `base` handler.\n *\n * POLICY DECISIONS (LOCKED):\n *\n * 1. Merge Strategy\n * Base props overwrite injected props (base wins).\n * Exception: Event handlers are composed, not overwritten.\n *\n * 2. Event Handler Detection\n * Keys starting with \"on\" are treated as event handlers.\n * This matches JSX conventions.\n *\n * 3. Handler Composition Order\n * Injected handler runs first, base handler second.\n * This allows injected handlers to prevent default.\n *\n * 4. Return Type\n * Returns intersection type (TInjected & TBase) for type safety.\n */\nimport { composeHandlers } from './compose-handlers';\n\ntype Fn = (...args: readonly unknown[]) => void;\n\nfunction isEventHandlerKey(key: string): boolean {\n return key.startsWith('on');\n}\n\nexport function mergeProps<TBase extends object, TInjected extends object>(\n base: TBase,\n injected: TInjected\n): TInjected & TBase {\n // Fast path: if base is empty, return injected as-is\n const baseKeys = Object.keys(base);\n if (baseKeys.length === 0) {\n return injected as TInjected & TBase;\n }\n\n const out = { ...(injected as object) } as TInjected & TBase;\n\n for (const key of baseKeys as Array<Extract<keyof TBase, string>>) {\n const baseValue = (base as Record<string, unknown>)[key];\n const injectedValue = (injected as Record<string, unknown>)[key];\n\n if (\n isEventHandlerKey(key) &&\n typeof baseValue === 'function' &&\n typeof injectedValue === 'function'\n ) {\n // Invariant: injected runs first; it may call preventDefault() to\n // suppress base behaviour.\n (out as Record<string, unknown>)[key] = composeHandlers(\n injectedValue as unknown as Fn,\n baseValue as unknown as Fn\n );\n continue;\n }\n\n (out as Record<string, unknown>)[key] = baseValue;\n }\n\n return out;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,SAAS,kBAAkB,KAAsB;CAC/C,OAAO,IAAI,WAAW,
|
|
1
|
+
{"version":3,"file":"merge-props.js","names":[],"sources":["../../../src/foundations/utilities/merge-props.ts"],"sourcesContent":["/**\n * mergeProps\n *\n * Deterministic props merging.\n * - For non-handlers: `base` overwrites `injected`.\n * - For handlers present in both: handlers are composed with `injected` running\n * first; it may call `preventDefault()` to suppress the `base` handler.\n *\n * POLICY DECISIONS (LOCKED):\n *\n * 1. Merge Strategy\n * Base props overwrite injected props (base wins).\n * Exception: Event handlers are composed, not overwritten.\n *\n * 2. Event Handler Detection\n * Keys starting with \"on\" are treated as event handlers.\n * This matches JSX conventions.\n *\n * 3. Handler Composition Order\n * Injected handler runs first, base handler second.\n * This allows injected handlers to prevent default.\n *\n * 4. Return Type\n * Returns intersection type (TInjected & TBase) for type safety.\n */\nimport { composeHandlers } from './compose-handlers';\n\ntype Fn = (...args: readonly unknown[]) => void;\n\nfunction isEventHandlerKey(key: string): boolean {\n return key.startsWith('on');\n}\n\nexport function mergeProps<TBase extends object, TInjected extends object>(\n base: TBase,\n injected: TInjected\n): TInjected & TBase {\n // Fast path: if base is empty, return injected as-is\n const baseKeys = Object.keys(base);\n if (baseKeys.length === 0) {\n return injected as TInjected & TBase;\n }\n\n const out = { ...(injected as object) } as TInjected & TBase;\n\n for (const key of baseKeys as Array<Extract<keyof TBase, string>>) {\n const baseValue = (base as Record<string, unknown>)[key];\n const injectedValue = (injected as Record<string, unknown>)[key];\n\n if (\n isEventHandlerKey(key) &&\n typeof baseValue === 'function' &&\n typeof injectedValue === 'function'\n ) {\n // Invariant: injected runs first; it may call preventDefault() to\n // suppress base behaviour.\n (out as Record<string, unknown>)[key] = composeHandlers(\n injectedValue as unknown as Fn,\n baseValue as unknown as Fn\n );\n continue;\n }\n\n (out as Record<string, unknown>)[key] = baseValue;\n }\n\n return out;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,SAAS,kBAAkB,KAAsB;CAC/C,OAAO,IAAI,WAAW,IAAI;AAC5B;AAEA,SAAgB,WACd,MACA,UACmB;CAEnB,MAAM,WAAW,OAAO,KAAK,IAAI;CACjC,IAAI,SAAS,WAAW,GACtB,OAAO;CAGT,MAAM,MAAM,EAAE,GAAI,SAAoB;CAEtC,KAAK,MAAM,OAAO,UAAiD;EACjE,MAAM,YAAa,KAAiC;EACpD,MAAM,gBAAiB,SAAqC;EAE5D,IACE,kBAAkB,GAAG,KACrB,OAAO,cAAc,cACrB,OAAO,kBAAkB,YACzB;GAGA,IAAiC,OAAO,gBACtC,eACA,SACF;GACA;EACF;EAEA,IAAiC,OAAO;CAC1C;CAEA,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-id.d.ts","names":[],"sources":["../../../src/foundations/utilities/use-id.ts"],"mappings":";UAAiB,eAAA;EAAA;EAEf,MAAA;;EAEA,
|
|
1
|
+
{"version":3,"file":"use-id.d.ts","names":[],"sources":["../../../src/foundations/utilities/use-id.ts"],"mappings":";UAAiB,eAAA;EAAA;EAEf,MAAA;;EAEA,EAAE;AAAA;AAwBJ;;;;AAAiD;;;;;;;;;;;;;;;;;AAAjD,iBAAgB,QAAA,CAAS,OAAwB,EAAf,eAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-id.js","names":[],"sources":["../../../src/foundations/utilities/use-id.ts"],"sourcesContent":["export interface FormatIdOptions {\n /** Defaults to 'askr' */\n prefix?: string;\n /** Stable, caller-provided identity */\n id: string | number;\n}\n\n/**\n * formatId\n *\n * Formats a stable ID from a caller-provided identity.\n * - Pure and deterministic (no time/randomness/global counters)\n * - SSR-safe\n *\n * POLICY DECISIONS (LOCKED):\n *\n * 1. No Auto-Generation\n * Caller must provide the `id`. No random/sequential generation.\n * This ensures determinism and SSR safety.\n *\n * 2. Format Convention\n * IDs are formatted as `{prefix}-{id}`.\n * Default prefix is \"askr\".\n *\n * 3. Type Coercion\n * Numbers are coerced to strings via String().\n * This is deterministic and consistent.\n */\nexport function formatId(options: FormatIdOptions): string {\n const prefix = options.prefix ?? 'askr';\n return `${prefix}-${String(options.id)}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA4BA,SAAgB,SAAS,SAAkC;CAEzD,OAAO,GADQ,QAAQ,UAAU,OAChB,GAAG,OAAO,QAAQ,
|
|
1
|
+
{"version":3,"file":"use-id.js","names":[],"sources":["../../../src/foundations/utilities/use-id.ts"],"sourcesContent":["export interface FormatIdOptions {\n /** Defaults to 'askr' */\n prefix?: string;\n /** Stable, caller-provided identity */\n id: string | number;\n}\n\n/**\n * formatId\n *\n * Formats a stable ID from a caller-provided identity.\n * - Pure and deterministic (no time/randomness/global counters)\n * - SSR-safe\n *\n * POLICY DECISIONS (LOCKED):\n *\n * 1. No Auto-Generation\n * Caller must provide the `id`. No random/sequential generation.\n * This ensures determinism and SSR safety.\n *\n * 2. Format Convention\n * IDs are formatted as `{prefix}-{id}`.\n * Default prefix is \"askr\".\n *\n * 3. Type Coercion\n * Numbers are coerced to strings via String().\n * This is deterministic and consistent.\n */\nexport function formatId(options: FormatIdOptions): string {\n const prefix = options.prefix ?? 'askr';\n return `${prefix}-${String(options.id)}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA4BA,SAAgB,SAAS,SAAkC;CAEzD,OAAO,GADQ,QAAQ,UAAU,OAChB,GAAG,OAAO,QAAQ,EAAE;AACvC"}
|
package/dist/fx/fx.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx.d.ts","names":[],"sources":["../../src/fx/fx.ts"],"mappings":";KAKY,QAAA;AAAA,iBAwCI,aAAA,CACd,EAAA,UACA,OAAA,EAAS,aAAA,EACT,OAAA;EAAY,OAAA;EAAmB,QAAA;AAAA,IAC9B,
|
|
1
|
+
{"version":3,"file":"fx.d.ts","names":[],"sources":["../../src/fx/fx.ts"],"mappings":";KAKY,QAAA;AAAA,iBAwCI,aAAA,CACd,EAAA,UACA,OAAA,EAAS,aAAA,EACT,OAAA;EAAY,OAAA;EAAmB,QAAA;AAAA,IAC9B,aAAa;EAAK,MAAA;EAAgB,KAAA;AAAA;AAAA,iBAsErB,aAAA,CACd,EAAA,UACA,OAAA,EAAS,aAAA,EACT,OAAA;EAAY,OAAA;EAAmB,QAAA;AAAA,IAC9B,aAAa;EAAK,MAAA;AAAA;AAAA,iBA0DL,QAAA,CACd,OAAA,EAAS,aAAA,GACR,aAAa;EAAK,MAAA;AAAA;AAAA,iBAuDL,eAAA,CAAgB,EAAA,UAAY,EAAA,eAAiB,QAAQ;AAAA,iBAuBrD,YAAA,CACd,EAAA,cACA,OAAA;EAAY,OAAA;AAAA,IACX,QAAQ;AAAA,UA0CM,YAAA;EACf,WAAA;EACA,OAAA;EACA,OAAA,IAAW,YAAA;AAAA;AAAA,iBAGG,aAAA,GAAA,CACd,EAAA,QAAU,OAAA,CAAQ,CAAA,GAClB,OAAA,GAAU,YAAA;EACP,MAAA;AAAA"}
|
package/dist/fx/fx.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx.js","names":[],"sources":["../../src/fx/fx.ts"],"sourcesContent":["import { globalScheduler } from '../runtime/scheduler';\nimport { getCurrentComponentInstance } from '../runtime/component';\nimport { logger } from '../dev/logger';\nimport { noopEventListener, noopEventListenerWithFlush } from './noop';\n\nexport type CancelFn = () => void;\n\n// Platform-specific timer handle types\ntype TimeoutHandle = ReturnType<typeof setTimeout> | null;\n// rAF may fall back to setTimeout in some environments/tests, include both\ntype RafHandle =\n | ReturnType<typeof requestAnimationFrame>\n | ReturnType<typeof setTimeout>\n | null;\n// requestIdleCallback may be unavailable; allow setTimeout fallback handle\ntype IdleHandle =\n | ReturnType<typeof requestIdleCallback>\n | ReturnType<typeof setTimeout>\n | null;\n\nfunction throwIfDuringRender(): void {\n const inst = getCurrentComponentInstance();\n if (inst !== null) {\n throw new Error(\n '[Askr] calling FX handler during render is not allowed. Move calls to event handlers or effects.'\n );\n }\n}\n\n/**\n * Helper: schedule a user callback through the global scheduler\n */\nfunction enqueueUserCallback(fn: () => void) {\n globalScheduler.enqueue(() => {\n try {\n fn();\n } catch (err) {\n // Keep behavior consistent with other scheduler-queued work\n logger.error('[Askr] FX handler error:', err);\n }\n });\n}\n\n// ---------- Event handlers ----------\n\nexport function debounceEvent(\n ms: number,\n handler: EventListener,\n options?: { leading?: boolean; trailing?: boolean }\n): EventListener & { cancel(): void; flush(): void } {\n const { leading = false, trailing = true } = options || {};\n\n const inst = getCurrentComponentInstance();\n // On SSR, event handlers are inert\n if (inst && inst.ssr) {\n return noopEventListenerWithFlush;\n }\n\n let timeoutId: TimeoutHandle = null;\n let lastEvent: Event | null = null;\n let lastCallTime = 0;\n\n const debounced = function (this: unknown, ev: Event) {\n // Disallow using returned handler during render\n throwIfDuringRender();\n\n const now = Date.now();\n lastEvent = ev;\n\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n if (leading && now - lastCallTime >= ms) {\n enqueueUserCallback(() => handler.call(null, ev));\n lastCallTime = now;\n }\n\n if (trailing) {\n timeoutId = setTimeout(() => {\n // Schedule through scheduler\n if (lastEvent) {\n enqueueUserCallback(() => handler.call(null, lastEvent!));\n }\n timeoutId = null;\n lastCallTime = Date.now();\n }, ms);\n }\n } as EventListener & { cancel(): void; flush(): void };\n\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastEvent = null;\n };\n\n debounced.flush = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n const ev = lastEvent;\n lastEvent = null;\n timeoutId = null;\n if (ev) enqueueUserCallback(() => handler.call(null, ev));\n }\n };\n\n // Auto-cleanup on component unmount\n if (inst) {\n (inst.cleanupFns ??= []).push(() => {\n debounced.cancel();\n });\n }\n\n return debounced;\n}\n\nexport function throttleEvent(\n ms: number,\n handler: EventListener,\n options?: { leading?: boolean; trailing?: boolean }\n): EventListener & { cancel(): void } {\n const { leading = true, trailing = true } = options || {};\n\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) {\n return noopEventListener;\n }\n\n let lastCallTime = 0;\n let timeoutId: TimeoutHandle = null;\n let lastEvent: Event | null = null;\n\n const throttled = function (this: unknown, ev: Event) {\n throwIfDuringRender();\n\n const now = Date.now();\n lastEvent = ev;\n\n if (leading && now - lastCallTime >= ms) {\n enqueueUserCallback(() => handler.call(null, ev));\n lastCallTime = now;\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n } else if (!leading && lastCallTime === 0) {\n lastCallTime = now;\n }\n\n if (trailing && timeoutId === null) {\n const wait = ms - (now - lastCallTime);\n timeoutId = setTimeout(\n () => {\n if (lastEvent)\n enqueueUserCallback(() => handler.call(null, lastEvent!));\n lastCallTime = Date.now();\n timeoutId = null;\n },\n Math.max(0, wait)\n );\n }\n } as EventListener & { cancel(): void };\n\n throttled.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastEvent = null;\n };\n\n if (inst) {\n (inst.cleanupFns ??= []).push(() => throttled.cancel());\n }\n\n return throttled;\n}\n\nexport function rafEvent(\n handler: EventListener\n): EventListener & { cancel(): void } {\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) {\n return noopEventListener;\n }\n\n let frameId: RafHandle = null;\n let lastEvent: Event | null = null;\n\n const scheduleFrame = () => {\n const rAF =\n typeof requestAnimationFrame !== 'undefined'\n ? requestAnimationFrame\n : (cb: FrameRequestCallback) => setTimeout(() => cb(Date.now()), 16);\n\n frameId = rAF(() => {\n frameId = null;\n if (lastEvent) {\n const ev = lastEvent;\n lastEvent = null;\n enqueueUserCallback(() => handler.call(null, ev));\n }\n });\n };\n\n const fn = function (this: unknown, ev: Event) {\n throwIfDuringRender();\n lastEvent = ev;\n if (frameId === null) scheduleFrame();\n } as EventListener & { cancel(): void };\n\n fn.cancel = () => {\n if (frameId !== null) {\n // If frameId is numeric and cancelAnimationFrame is available, use it;\n // otherwise fall back to clearTimeout for the setTimeout fallback.\n if (\n typeof cancelAnimationFrame !== 'undefined' &&\n typeof frameId === 'number'\n ) {\n cancelAnimationFrame(frameId);\n } else {\n clearTimeout(frameId as ReturnType<typeof setTimeout>);\n }\n frameId = null;\n }\n lastEvent = null;\n };\n\n if (inst) (inst.cleanupFns ??= []).push(() => fn.cancel());\n\n return fn;\n}\n\n// ---------- Scheduled work ----------\n\nexport function scheduleTimeout(ms: number, fn: () => void): CancelFn {\n throwIfDuringRender();\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) {\n return () => {};\n }\n\n let id: TimeoutHandle = setTimeout(() => {\n id = null;\n enqueueUserCallback(fn);\n }, ms);\n\n const cancel = () => {\n if (id !== null) {\n clearTimeout(id);\n id = null;\n }\n };\n\n if (inst) (inst.cleanupFns ??= []).push(cancel);\n return cancel;\n}\n\nexport function scheduleIdle(\n fn: () => void,\n options?: { timeout?: number }\n): CancelFn {\n throwIfDuringRender();\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) return () => {};\n\n let id: IdleHandle = null;\n let usingRIC = false;\n\n if (typeof requestIdleCallback !== 'undefined') {\n usingRIC = true;\n id = requestIdleCallback(() => {\n id = null;\n enqueueUserCallback(fn);\n }, options);\n } else {\n // Fallback: schedule on next macrotask\n id = setTimeout(() => {\n id = null;\n enqueueUserCallback(fn);\n }, 0);\n }\n\n const cancel = () => {\n if (id !== null) {\n // If using requestIdleCallback and available, call cancelIdleCallback for numeric ids.\n if (\n usingRIC &&\n typeof cancelIdleCallback !== 'undefined' &&\n typeof id === 'number'\n ) {\n cancelIdleCallback(id);\n } else {\n clearTimeout(id as ReturnType<typeof setTimeout>);\n }\n id = null;\n }\n };\n\n if (inst) (inst.cleanupFns ??= []).push(cancel);\n return cancel;\n}\n\nexport interface RetryOptions {\n maxAttempts?: number;\n delayMs?: number;\n backoff?: (attemptIndex: number) => number;\n}\n\nexport function scheduleRetry<T>(\n fn: () => Promise<T>,\n options?: RetryOptions\n): { cancel(): void } {\n throwIfDuringRender();\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) return { cancel: () => {} };\n\n const {\n maxAttempts = 3,\n delayMs = 100,\n backoff = (i: number) => delayMs * Math.pow(2, i),\n } = options || {};\n\n let cancelled = false;\n\n const attempt = (index: number) => {\n if (cancelled) return;\n // Run user fn inside scheduler\n globalScheduler.enqueue(() => {\n if (cancelled) return;\n // Call fn (it may be async)\n const p = fn();\n p.then(\n () => {\n // Completed successfully\n },\n () => {\n if (cancelled) return;\n if (index + 1 < maxAttempts) {\n const delay = backoff(index);\n // Schedule next attempt via setTimeout so it gets enqueued through scheduleTimeout\n setTimeout(() => {\n attempt(index + 1);\n }, delay);\n }\n }\n ).catch((e) => {\n logger.error('[Askr] scheduleRetry error:', e);\n });\n });\n };\n\n // Start first attempt\n attempt(0);\n\n const cancel = () => {\n cancelled = true;\n };\n\n if (inst) (inst.cleanupFns ??= []).push(cancel);\n return { cancel };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fx.js","names":[],"sources":["../../src/fx/fx.ts"],"sourcesContent":["import { globalScheduler } from '../runtime/scheduler';\nimport { getCurrentComponentInstance } from '../runtime/component';\nimport { logger } from '../dev/logger';\nimport { noopEventListener, noopEventListenerWithFlush } from './noop';\n\nexport type CancelFn = () => void;\n\n// Platform-specific timer handle types\ntype TimeoutHandle = ReturnType<typeof setTimeout> | null;\n// rAF may fall back to setTimeout in some environments/tests, include both\ntype RafHandle =\n | ReturnType<typeof requestAnimationFrame>\n | ReturnType<typeof setTimeout>\n | null;\n// requestIdleCallback may be unavailable; allow setTimeout fallback handle\ntype IdleHandle =\n | ReturnType<typeof requestIdleCallback>\n | ReturnType<typeof setTimeout>\n | null;\n\nfunction throwIfDuringRender(): void {\n const inst = getCurrentComponentInstance();\n if (inst !== null) {\n throw new Error(\n '[Askr] calling FX handler during render is not allowed. Move calls to event handlers or effects.'\n );\n }\n}\n\n/**\n * Helper: schedule a user callback through the global scheduler\n */\nfunction enqueueUserCallback(fn: () => void) {\n globalScheduler.enqueue(() => {\n try {\n fn();\n } catch (err) {\n // Keep behavior consistent with other scheduler-queued work\n logger.error('[Askr] FX handler error:', err);\n }\n });\n}\n\n// ---------- Event handlers ----------\n\nexport function debounceEvent(\n ms: number,\n handler: EventListener,\n options?: { leading?: boolean; trailing?: boolean }\n): EventListener & { cancel(): void; flush(): void } {\n const { leading = false, trailing = true } = options || {};\n\n const inst = getCurrentComponentInstance();\n // On SSR, event handlers are inert\n if (inst && inst.ssr) {\n return noopEventListenerWithFlush;\n }\n\n let timeoutId: TimeoutHandle = null;\n let lastEvent: Event | null = null;\n let lastCallTime = 0;\n\n const debounced = function (this: unknown, ev: Event) {\n // Disallow using returned handler during render\n throwIfDuringRender();\n\n const now = Date.now();\n lastEvent = ev;\n\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n if (leading && now - lastCallTime >= ms) {\n enqueueUserCallback(() => handler.call(null, ev));\n lastCallTime = now;\n }\n\n if (trailing) {\n timeoutId = setTimeout(() => {\n // Schedule through scheduler\n if (lastEvent) {\n enqueueUserCallback(() => handler.call(null, lastEvent!));\n }\n timeoutId = null;\n lastCallTime = Date.now();\n }, ms);\n }\n } as EventListener & { cancel(): void; flush(): void };\n\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastEvent = null;\n };\n\n debounced.flush = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n const ev = lastEvent;\n lastEvent = null;\n timeoutId = null;\n if (ev) enqueueUserCallback(() => handler.call(null, ev));\n }\n };\n\n // Auto-cleanup on component unmount\n if (inst) {\n (inst.cleanupFns ??= []).push(() => {\n debounced.cancel();\n });\n }\n\n return debounced;\n}\n\nexport function throttleEvent(\n ms: number,\n handler: EventListener,\n options?: { leading?: boolean; trailing?: boolean }\n): EventListener & { cancel(): void } {\n const { leading = true, trailing = true } = options || {};\n\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) {\n return noopEventListener;\n }\n\n let lastCallTime = 0;\n let timeoutId: TimeoutHandle = null;\n let lastEvent: Event | null = null;\n\n const throttled = function (this: unknown, ev: Event) {\n throwIfDuringRender();\n\n const now = Date.now();\n lastEvent = ev;\n\n if (leading && now - lastCallTime >= ms) {\n enqueueUserCallback(() => handler.call(null, ev));\n lastCallTime = now;\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n } else if (!leading && lastCallTime === 0) {\n lastCallTime = now;\n }\n\n if (trailing && timeoutId === null) {\n const wait = ms - (now - lastCallTime);\n timeoutId = setTimeout(\n () => {\n if (lastEvent)\n enqueueUserCallback(() => handler.call(null, lastEvent!));\n lastCallTime = Date.now();\n timeoutId = null;\n },\n Math.max(0, wait)\n );\n }\n } as EventListener & { cancel(): void };\n\n throttled.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastEvent = null;\n };\n\n if (inst) {\n (inst.cleanupFns ??= []).push(() => throttled.cancel());\n }\n\n return throttled;\n}\n\nexport function rafEvent(\n handler: EventListener\n): EventListener & { cancel(): void } {\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) {\n return noopEventListener;\n }\n\n let frameId: RafHandle = null;\n let lastEvent: Event | null = null;\n\n const scheduleFrame = () => {\n const rAF =\n typeof requestAnimationFrame !== 'undefined'\n ? requestAnimationFrame\n : (cb: FrameRequestCallback) => setTimeout(() => cb(Date.now()), 16);\n\n frameId = rAF(() => {\n frameId = null;\n if (lastEvent) {\n const ev = lastEvent;\n lastEvent = null;\n enqueueUserCallback(() => handler.call(null, ev));\n }\n });\n };\n\n const fn = function (this: unknown, ev: Event) {\n throwIfDuringRender();\n lastEvent = ev;\n if (frameId === null) scheduleFrame();\n } as EventListener & { cancel(): void };\n\n fn.cancel = () => {\n if (frameId !== null) {\n // If frameId is numeric and cancelAnimationFrame is available, use it;\n // otherwise fall back to clearTimeout for the setTimeout fallback.\n if (\n typeof cancelAnimationFrame !== 'undefined' &&\n typeof frameId === 'number'\n ) {\n cancelAnimationFrame(frameId);\n } else {\n clearTimeout(frameId as ReturnType<typeof setTimeout>);\n }\n frameId = null;\n }\n lastEvent = null;\n };\n\n if (inst) (inst.cleanupFns ??= []).push(() => fn.cancel());\n\n return fn;\n}\n\n// ---------- Scheduled work ----------\n\nexport function scheduleTimeout(ms: number, fn: () => void): CancelFn {\n throwIfDuringRender();\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) {\n return () => {};\n }\n\n let id: TimeoutHandle = setTimeout(() => {\n id = null;\n enqueueUserCallback(fn);\n }, ms);\n\n const cancel = () => {\n if (id !== null) {\n clearTimeout(id);\n id = null;\n }\n };\n\n if (inst) (inst.cleanupFns ??= []).push(cancel);\n return cancel;\n}\n\nexport function scheduleIdle(\n fn: () => void,\n options?: { timeout?: number }\n): CancelFn {\n throwIfDuringRender();\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) return () => {};\n\n let id: IdleHandle = null;\n let usingRIC = false;\n\n if (typeof requestIdleCallback !== 'undefined') {\n usingRIC = true;\n id = requestIdleCallback(() => {\n id = null;\n enqueueUserCallback(fn);\n }, options);\n } else {\n // Fallback: schedule on next macrotask\n id = setTimeout(() => {\n id = null;\n enqueueUserCallback(fn);\n }, 0);\n }\n\n const cancel = () => {\n if (id !== null) {\n // If using requestIdleCallback and available, call cancelIdleCallback for numeric ids.\n if (\n usingRIC &&\n typeof cancelIdleCallback !== 'undefined' &&\n typeof id === 'number'\n ) {\n cancelIdleCallback(id);\n } else {\n clearTimeout(id as ReturnType<typeof setTimeout>);\n }\n id = null;\n }\n };\n\n if (inst) (inst.cleanupFns ??= []).push(cancel);\n return cancel;\n}\n\nexport interface RetryOptions {\n maxAttempts?: number;\n delayMs?: number;\n backoff?: (attemptIndex: number) => number;\n}\n\nexport function scheduleRetry<T>(\n fn: () => Promise<T>,\n options?: RetryOptions\n): { cancel(): void } {\n throwIfDuringRender();\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) return { cancel: () => {} };\n\n const {\n maxAttempts = 3,\n delayMs = 100,\n backoff = (i: number) => delayMs * Math.pow(2, i),\n } = options || {};\n\n let cancelled = false;\n\n const attempt = (index: number) => {\n if (cancelled) return;\n // Run user fn inside scheduler\n globalScheduler.enqueue(() => {\n if (cancelled) return;\n // Call fn (it may be async)\n const p = fn();\n p.then(\n () => {\n // Completed successfully\n },\n () => {\n if (cancelled) return;\n if (index + 1 < maxAttempts) {\n const delay = backoff(index);\n // Schedule next attempt via setTimeout so it gets enqueued through scheduleTimeout\n setTimeout(() => {\n attempt(index + 1);\n }, delay);\n }\n }\n ).catch((e) => {\n logger.error('[Askr] scheduleRetry error:', e);\n });\n });\n };\n\n // Start first attempt\n attempt(0);\n\n const cancel = () => {\n cancelled = true;\n };\n\n if (inst) (inst.cleanupFns ??= []).push(cancel);\n return { cancel };\n}\n"],"mappings":";;;;;AAoBA,SAAS,sBAA4B;CAEnC,IADa,4BACT,MAAS,MACX,MAAM,IAAI,MACR,kGACF;AAEJ;;;;AAKA,SAAS,oBAAoB,IAAgB;CAC3C,gBAAgB,cAAc;EAC5B,IAAI;GACF,GAAG;EACL,SAAS,KAAK;GAEZ,OAAO,MAAM,4BAA4B,GAAG;EAC9C;CACF,CAAC;AACH;AAIA,SAAgB,cACd,IACA,SACA,SACmD;CACnD,MAAM,EAAE,UAAU,OAAO,WAAW,SAAS,WAAW,CAAC;CAEzD,MAAM,OAAO,4BAA4B;CAEzC,IAAI,QAAQ,KAAK,KACf,OAAO;CAGT,IAAI,YAA2B;CAC/B,IAAI,YAA0B;CAC9B,IAAI,eAAe;CAEnB,MAAM,YAAY,SAAyB,IAAW;EAEpD,oBAAoB;EAEpB,MAAM,MAAM,KAAK,IAAI;EACrB,YAAY;EAEZ,IAAI,cAAc,MAAM;GACtB,aAAa,SAAS;GACtB,YAAY;EACd;EAEA,IAAI,WAAW,MAAM,gBAAgB,IAAI;GACvC,0BAA0B,QAAQ,KAAK,MAAM,EAAE,CAAC;GAChD,eAAe;EACjB;EAEA,IAAI,UACF,YAAY,iBAAiB;GAE3B,IAAI,WACF,0BAA0B,QAAQ,KAAK,MAAM,SAAU,CAAC;GAE1D,YAAY;GACZ,eAAe,KAAK,IAAI;EAC1B,GAAG,EAAE;CAET;CAEA,UAAU,eAAe;EACvB,IAAI,cAAc,MAAM;GACtB,aAAa,SAAS;GACtB,YAAY;EACd;EACA,YAAY;CACd;CAEA,UAAU,cAAc;EACtB,IAAI,cAAc,MAAM;GACtB,aAAa,SAAS;GACtB,MAAM,KAAK;GACX,YAAY;GACZ,YAAY;GACZ,IAAI,IAAI,0BAA0B,QAAQ,KAAK,MAAM,EAAE,CAAC;EAC1D;CACF;CAGA,IAAI,MACF,CAAC,KAAK,eAAe,CAAC,GAAG,WAAW;EAClC,UAAU,OAAO;CACnB,CAAC;CAGH,OAAO;AACT;AAEA,SAAgB,cACd,IACA,SACA,SACoC;CACpC,MAAM,EAAE,UAAU,MAAM,WAAW,SAAS,WAAW,CAAC;CAExD,MAAM,OAAO,4BAA4B;CACzC,IAAI,QAAQ,KAAK,KACf,OAAO;CAGT,IAAI,eAAe;CACnB,IAAI,YAA2B;CAC/B,IAAI,YAA0B;CAE9B,MAAM,YAAY,SAAyB,IAAW;EACpD,oBAAoB;EAEpB,MAAM,MAAM,KAAK,IAAI;EACrB,YAAY;EAEZ,IAAI,WAAW,MAAM,gBAAgB,IAAI;GACvC,0BAA0B,QAAQ,KAAK,MAAM,EAAE,CAAC;GAChD,eAAe;GACf,IAAI,cAAc,MAAM;IACtB,aAAa,SAAS;IACtB,YAAY;GACd;EACF,OAAO,IAAI,CAAC,WAAW,iBAAiB,GACtC,eAAe;EAGjB,IAAI,YAAY,cAAc,MAAM;GAClC,MAAM,OAAO,MAAM,MAAM;GACzB,YAAY,iBACJ;IACJ,IAAI,WACF,0BAA0B,QAAQ,KAAK,MAAM,SAAU,CAAC;IAC1D,eAAe,KAAK,IAAI;IACxB,YAAY;GACd,GACA,KAAK,IAAI,GAAG,IAAI,CAClB;EACF;CACF;CAEA,UAAU,eAAe;EACvB,IAAI,cAAc,MAAM;GACtB,aAAa,SAAS;GACtB,YAAY;EACd;EACA,YAAY;CACd;CAEA,IAAI,MACF,CAAC,KAAK,eAAe,CAAC,GAAG,WAAW,UAAU,OAAO,CAAC;CAGxD,OAAO;AACT;AAEA,SAAgB,SACd,SACoC;CACpC,MAAM,OAAO,4BAA4B;CACzC,IAAI,QAAQ,KAAK,KACf,OAAO;CAGT,IAAI,UAAqB;CACzB,IAAI,YAA0B;CAE9B,MAAM,sBAAsB;EAM1B,WAJE,OAAO,0BAA0B,cAC7B,yBACC,OAA6B,iBAAiB,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,SAEnD;GAClB,UAAU;GACV,IAAI,WAAW;IACb,MAAM,KAAK;IACX,YAAY;IACZ,0BAA0B,QAAQ,KAAK,MAAM,EAAE,CAAC;GAClD;EACF,CAAC;CACH;CAEA,MAAM,KAAK,SAAyB,IAAW;EAC7C,oBAAoB;EACpB,YAAY;EACZ,IAAI,YAAY,MAAM,cAAc;CACtC;CAEA,GAAG,eAAe;EAChB,IAAI,YAAY,MAAM;GAGpB,IACE,OAAO,yBAAyB,eAChC,OAAO,YAAY,UAEnB,qBAAqB,OAAO;QAE5B,aAAa,OAAwC;GAEvD,UAAU;EACZ;EACA,YAAY;CACd;CAEA,IAAI,MAAM,CAAC,KAAK,eAAe,CAAC,GAAG,WAAW,GAAG,OAAO,CAAC;CAEzD,OAAO;AACT;AAIA,SAAgB,gBAAgB,IAAY,IAA0B;CACpE,oBAAoB;CACpB,MAAM,OAAO,4BAA4B;CACzC,IAAI,QAAQ,KAAK,KACf,aAAa,CAAC;CAGhB,IAAI,KAAoB,iBAAiB;EACvC,KAAK;EACL,oBAAoB,EAAE;CACxB,GAAG,EAAE;CAEL,MAAM,eAAe;EACnB,IAAI,OAAO,MAAM;GACf,aAAa,EAAE;GACf,KAAK;EACP;CACF;CAEA,IAAI,MAAM,CAAC,KAAK,eAAe,CAAC,GAAG,KAAK,MAAM;CAC9C,OAAO;AACT;AAEA,SAAgB,aACd,IACA,SACU;CACV,oBAAoB;CACpB,MAAM,OAAO,4BAA4B;CACzC,IAAI,QAAQ,KAAK,KAAK,aAAa,CAAC;CAEpC,IAAI,KAAiB;CACrB,IAAI,WAAW;CAEf,IAAI,OAAO,wBAAwB,aAAa;EAC9C,WAAW;EACX,KAAK,0BAA0B;GAC7B,KAAK;GACL,oBAAoB,EAAE;EACxB,GAAG,OAAO;CACZ,OAEE,KAAK,iBAAiB;EACpB,KAAK;EACL,oBAAoB,EAAE;CACxB,GAAG,CAAC;CAGN,MAAM,eAAe;EACnB,IAAI,OAAO,MAAM;GAEf,IACE,YACA,OAAO,uBAAuB,eAC9B,OAAO,OAAO,UAEd,mBAAmB,EAAE;QAErB,aAAa,EAAmC;GAElD,KAAK;EACP;CACF;CAEA,IAAI,MAAM,CAAC,KAAK,eAAe,CAAC,GAAG,KAAK,MAAM;CAC9C,OAAO;AACT;AAQA,SAAgB,cACd,IACA,SACoB;CACpB,oBAAoB;CACpB,MAAM,OAAO,4BAA4B;CACzC,IAAI,QAAQ,KAAK,KAAK,OAAO,EAAE,cAAc,CAAC,EAAE;CAEhD,MAAM,EACJ,cAAc,GACd,UAAU,KACV,WAAW,MAAc,UAAU,KAAK,IAAI,GAAG,CAAC,MAC9C,WAAW,CAAC;CAEhB,IAAI,YAAY;CAEhB,MAAM,WAAW,UAAkB;EACjC,IAAI,WAAW;EAEf,gBAAgB,cAAc;GAC5B,IAAI,WAAW;GAGf,AADU,GACV,EAAE,WACM,CAEN,SACM;IACJ,IAAI,WAAW;IACf,IAAI,QAAQ,IAAI,aAAa;KAC3B,MAAM,QAAQ,QAAQ,KAAK;KAE3B,iBAAiB;MACf,QAAQ,QAAQ,CAAC;KACnB,GAAG,KAAK;IACV;GACF,CACF,EAAE,OAAO,MAAM;IACb,OAAO,MAAM,+BAA+B,CAAC;GAC/C,CAAC;EACH,CAAC;CACH;CAGA,QAAQ,CAAC;CAET,MAAM,eAAe;EACnB,YAAY;CACd;CAEA,IAAI,MAAM,CAAC,KAAK,eAAe,CAAC,GAAG,KAAK,MAAM;CAC9C,OAAO,EAAE,OAAO;AAClB"}
|
package/dist/fx/noop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noop.js","names":[],"sources":["../../src/fx/noop.ts"],"sourcesContent":["// Lightweight shared no-op helpers to avoid double-casts and duplicated definitions\n\nexport const noop: () => void = () => {};\n\nexport const noopEventListener: EventListener & { cancel(): void } =\n Object.assign((_ev?: Event) => {}, { cancel() {} });\n\nexport const noopEventListenerWithFlush: EventListener & {\n cancel(): void;\n flush(): void;\n} = Object.assign((_ev?: Event) => {}, { cancel() {}, flush() {} });\n\nexport const noopCancel: { cancel(): void } = { cancel() {} };\n"],"mappings":"AAIA,MAAa,oBACX,OAAO,QAAQ,QAAgB,
|
|
1
|
+
{"version":3,"file":"noop.js","names":[],"sources":["../../src/fx/noop.ts"],"sourcesContent":["// Lightweight shared no-op helpers to avoid double-casts and duplicated definitions\n\nexport const noop: () => void = () => {};\n\nexport const noopEventListener: EventListener & { cancel(): void } =\n Object.assign((_ev?: Event) => {}, { cancel() {} });\n\nexport const noopEventListenerWithFlush: EventListener & {\n cancel(): void;\n flush(): void;\n} = Object.assign((_ev?: Event) => {}, { cancel() {}, flush() {} });\n\nexport const noopCancel: { cancel(): void } = { cancel() {} };\n"],"mappings":"AAIA,MAAa,oBACX,OAAO,QAAQ,QAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC;AAEpD,MAAa,6BAGT,OAAO,QAAQ,QAAgB,CAAC,GAAG;CAAE,SAAS,CAAC;CAAG,QAAQ,CAAC;AAAE,CAAC"}
|
package/dist/fx/timing.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ interface RetryOptions {
|
|
|
16
16
|
delayMs?: number;
|
|
17
17
|
backoff?: (attemptIndex: number) => number;
|
|
18
18
|
}
|
|
19
|
+
type AnyFn = (...args: never[]) => unknown;
|
|
19
20
|
/**
|
|
20
21
|
* Debounce — delay execution, coalesce rapid calls
|
|
21
22
|
*
|
|
@@ -33,7 +34,7 @@ interface RetryOptions {
|
|
|
33
34
|
* save.cancel(); // stop any pending execution
|
|
34
35
|
* ```
|
|
35
36
|
*/
|
|
36
|
-
declare function debounce<T extends
|
|
37
|
+
declare function debounce<T extends AnyFn>(fn: T, ms: number, options?: DebounceOptions): T & {
|
|
37
38
|
cancel(): void;
|
|
38
39
|
};
|
|
39
40
|
/**
|
|
@@ -53,7 +54,7 @@ declare function debounce<T extends (...args: unknown[]) => unknown>(fn: T, ms:
|
|
|
53
54
|
* handleScroll.cancel();
|
|
54
55
|
* ```
|
|
55
56
|
*/
|
|
56
|
-
declare function throttle<T extends
|
|
57
|
+
declare function throttle<T extends AnyFn>(fn: T, ms: number, options?: ThrottleOptions): T & {
|
|
57
58
|
cancel(): void;
|
|
58
59
|
};
|
|
59
60
|
/**
|
|
@@ -72,7 +73,7 @@ declare function throttle<T extends (...args: unknown[]) => unknown>(fn: T, ms:
|
|
|
72
73
|
* init(); // does nothing
|
|
73
74
|
* ```
|
|
74
75
|
*/
|
|
75
|
-
declare function once<T extends
|
|
76
|
+
declare function once<T extends AnyFn>(fn: T): T;
|
|
76
77
|
/**
|
|
77
78
|
* Defer — schedule on microtask queue
|
|
78
79
|
*
|
|
@@ -102,7 +103,7 @@ declare function defer(fn: () => void): void;
|
|
|
102
103
|
* update(); // same frame, no duplicate
|
|
103
104
|
* ```
|
|
104
105
|
*/
|
|
105
|
-
declare function raf<T extends
|
|
106
|
+
declare function raf<T extends AnyFn>(fn: T): T;
|
|
106
107
|
/**
|
|
107
108
|
* Idle — schedule low-priority work
|
|
108
109
|
*
|
package/dist/fx/timing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timing.d.ts","names":[],"sources":["../../src/fx/timing.ts"],"mappings":";;AAKA;;;UAAiB,eAAA;EACf,OAAA;EACA,
|
|
1
|
+
{"version":3,"file":"timing.d.ts","names":[],"sources":["../../src/fx/timing.ts"],"mappings":";;AAKA;;;UAAiB,eAAA;EACf,OAAA;EACA,QAAQ;AAAA;AAAA,UAGO,eAAA;EACf,OAAA;EACA,QAAQ;AAAA;AAAA,UAGO,YAAA;EACf,WAAA;EACA,OAAA;EACA,OAAA,IAAW,YAAA;AAAA;AAAA,KAGR,KAAA,OAAY,IAAI;;;AAHY;AAChC;;;;AAEoB;AAmBrB;;;;;;;;;iBAAgB,QAAA,WAAmB,KAAA,CAAA,CACjC,EAAA,EAAI,CAAA,EACJ,EAAA,UACA,OAAA,GAAU,eAAA,GACT,CAAA;EAAM,MAAA;AAAA;;;;;;;;AAAM;AA0Df;;;;;;;;;iBAAgB,QAAA,WAAmB,KAAA,CAAA,CACjC,EAAA,EAAI,CAAA,EACJ,EAAA,UACA,OAAA,GAAU,eAAA,GACT,CAAA;EAAM,MAAA;AAAA;;;;;;;;AAAM;AAqEf;;;;;;;;iBAAgB,IAAA,WAAe,KAAA,CAAA,CAAO,EAAA,EAAI,CAAA,GAAI,CAAA;;;;;;AAAC;AA0B/C;;;;AAAoC;AAmBpC;;iBAnBgB,KAAA,CAAM,EAAc;;;;;;;;;;;;AAmBU;AAiC9C;;;iBAjCgB,GAAA,WAAc,KAAA,CAAA,CAAO,EAAA,EAAI,CAAA,GAAI,CAAA;;;;;AAiCsB;AAyBnE;;;;AAA4C;AAqB5C;;;;iBA9CgB,IAAA,CAAK,EAAA,cAAgB,OAAA;EAAY,OAAA;AAAA;;;;;;;;;;;;;AAiDrC;;iBAxBI,OAAA,CAAQ,EAAA,WAAa,OAAO;;;;;;;;;;;;;;;;;;iBAqBtB,KAAA,GAAA,CACpB,EAAA,QAAU,OAAA,CAAQ,CAAA,GAClB,OAAA,GAAU,YAAA,GACT,OAAA,CAAQ,CAAA"}
|
package/dist/fx/timing.js
CHANGED
|
@@ -63,28 +63,31 @@ function debounce(fn, ms, options) {
|
|
|
63
63
|
* ```
|
|
64
64
|
*/
|
|
65
65
|
function throttle(fn, ms, options) {
|
|
66
|
-
let lastCallTime =
|
|
66
|
+
let lastCallTime = null;
|
|
67
67
|
let timeoutId = null;
|
|
68
68
|
const { leading = true, trailing = true } = options || {};
|
|
69
69
|
let lastArgs = null;
|
|
70
70
|
let lastThis = null;
|
|
71
71
|
const throttled = function(...args) {
|
|
72
72
|
const callTime = Date.now();
|
|
73
|
+
const timeSinceLastCall = lastCallTime === null ? Number.POSITIVE_INFINITY : callTime - lastCallTime;
|
|
73
74
|
lastArgs = args;
|
|
74
75
|
lastThis = this;
|
|
75
|
-
if (leading &&
|
|
76
|
+
if (leading && timeSinceLastCall >= ms) {
|
|
76
77
|
fn.apply(this, args);
|
|
77
78
|
lastCallTime = callTime;
|
|
78
79
|
if (timeoutId !== null) {
|
|
79
80
|
clearTimeout(timeoutId);
|
|
80
81
|
timeoutId = null;
|
|
81
82
|
}
|
|
82
|
-
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (!leading && lastCallTime === null) lastCallTime = callTime;
|
|
83
86
|
if (trailing && timeoutId === null) timeoutId = setTimeout(() => {
|
|
84
87
|
fn.apply(lastThis, lastArgs);
|
|
85
88
|
lastCallTime = Date.now();
|
|
86
89
|
timeoutId = null;
|
|
87
|
-
}, ms - (callTime - lastCallTime));
|
|
90
|
+
}, lastCallTime === null ? ms : Math.max(0, ms - (callTime - lastCallTime)));
|
|
88
91
|
};
|
|
89
92
|
throttled.cancel = () => {
|
|
90
93
|
if (timeoutId !== null) {
|
package/dist/fx/timing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timing.js","names":[],"sources":["../../src/fx/timing.ts"],"sourcesContent":["/**\n * Timing utilities — pure helpers for common async patterns\n * No framework coupling. No lifecycle awareness.\n */\n\nexport interface DebounceOptions {\n leading?: boolean;\n trailing?: boolean;\n}\n\nexport interface ThrottleOptions {\n leading?: boolean;\n trailing?: boolean;\n}\n\nexport interface RetryOptions {\n maxAttempts?: number;\n delayMs?: number;\n backoff?: (attemptIndex: number) => number;\n}\n\n/**\n * Debounce — delay execution, coalesce rapid calls\n *\n * Useful for: text input, resize, autosave\n *\n * @param fn Function to debounce\n * @param ms Delay in milliseconds\n * @param options trailing (default true), leading\n * @returns Debounced function with cancel() method\n *\n * @example\n * ```ts\n * const save = debounce((text) => api.save(text), 500);\n * input.addEventListener('input', (e) => save(e.target.value));\n * save.cancel(); // stop any pending execution\n * ```\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n fn: T,\n ms: number,\n options?: DebounceOptions\n): T & { cancel(): void } {\n let timeoutId: NodeJS.Timeout | null = null;\n const { leading = false, trailing = true } = options || {};\n let lastArgs: unknown[] | null = null;\n let lastThis: unknown = null;\n let lastCallTime = 0;\n\n const debounced = function (this: unknown, ...args: unknown[]) {\n const callTime = Date.now();\n lastArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this;\n\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n\n if (leading && callTime - lastCallTime >= ms) {\n fn.apply(this, args);\n lastCallTime = callTime;\n }\n\n if (trailing) {\n timeoutId = setTimeout(() => {\n fn.apply(lastThis, lastArgs!);\n timeoutId = null;\n lastCallTime = Date.now();\n }, ms);\n }\n };\n\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return debounced as T & { cancel(): void };\n}\n\n/**\n * Throttle — rate-limit execution, keep first/last\n *\n * Useful for: scroll, mouse move, high-frequency events\n *\n * @param fn Function to throttle\n * @param ms Minimum interval between calls in milliseconds\n * @param options leading (default true), trailing (default true)\n * @returns Throttled function with cancel() method\n *\n * @example\n * ```ts\n * const handleScroll = throttle(updateUI, 100);\n * window.addEventListener('scroll', handleScroll);\n * handleScroll.cancel();\n * ```\n */\nexport function throttle<T extends (...args: unknown[]) => unknown>(\n fn: T,\n ms: number,\n options?: ThrottleOptions\n): T & { cancel(): void } {\n let lastCallTime = 0;\n let timeoutId: NodeJS.Timeout | null = null;\n const { leading = true, trailing = true } = options || {};\n let lastArgs: unknown[] | null = null;\n let lastThis: unknown = null;\n\n const throttled = function (this: unknown, ...args: unknown[]) {\n const callTime = Date.now();\n lastArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this;\n\n if (leading && callTime - lastCallTime >= ms) {\n fn.apply(this, args);\n lastCallTime = callTime;\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n } else if (!leading && lastCallTime === 0) {\n lastCallTime = callTime;\n }\n\n if (trailing && timeoutId === null) {\n timeoutId = setTimeout(\n () => {\n fn.apply(lastThis, lastArgs!);\n lastCallTime = Date.now();\n timeoutId = null;\n },\n ms - (callTime - lastCallTime)\n );\n }\n };\n\n throttled.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return throttled as T & { cancel(): void };\n}\n\n/**\n * Once — guard against double execution\n *\n * Useful for: init logic, event safety\n *\n * @param fn Function to call at most once\n * @returns Function that executes fn only on first call\n *\n * @example\n * ```ts\n * const init = once(setup);\n * init(); // runs\n * init(); // does nothing\n * init(); // does nothing\n * ```\n */\nexport function once<T extends (...args: unknown[]) => unknown>(fn: T): T {\n let called = false;\n let result: unknown;\n\n return ((...args: unknown[]) => {\n if (!called) {\n called = true;\n result = fn(...args);\n }\n return result;\n }) as T;\n}\n\n/**\n * Defer — schedule on microtask queue\n *\n * Useful for: run-after-current-stack logic\n * More reliable than setTimeout(..., 0)\n *\n * @param fn Function to defer\n *\n * @example\n * ```ts\n * defer(() => update()); // runs after current stack, before next macrotask\n * ```\n */\nexport function defer(fn: () => void): void {\n Promise.resolve().then(fn);\n}\n\n/**\n * RAF — coalesce multiple updates into single frame\n *\n * Useful for: animation, layout work, render updates\n *\n * @param fn Function to schedule on next animation frame\n * @returns Function that schedules fn on requestAnimationFrame\n *\n * @example\n * ```ts\n * const update = raf(render);\n * update(); // schedules on next frame\n * update(); // same frame, no duplicate\n * ```\n */\nexport function raf<T extends (...args: unknown[]) => unknown>(fn: T): T {\n let frameId: number | null = null;\n let lastArgs: unknown[] | null = null;\n let lastThis: unknown = null;\n\n return function (this: unknown, ...args: unknown[]) {\n lastArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this;\n\n if (frameId === null) {\n frameId = requestAnimationFrame(() => {\n fn.apply(lastThis, lastArgs!);\n frameId = null;\n });\n }\n } as T;\n}\n\n/**\n * Idle — schedule low-priority work\n *\n * Useful for: background prep, non-urgent updates\n * Falls back to setTimeout if requestIdleCallback unavailable\n *\n * @param fn Function to call when idle\n * @param options timeout for fallback\n *\n * @example\n * ```ts\n * idle(() => prefetchData());\n * ```\n */\nexport function idle(fn: () => void, options?: { timeout?: number }): void {\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(fn, options ? { timeout: options.timeout } : undefined);\n } else {\n // Fallback: defer to microtask, then use setTimeout\n Promise.resolve().then(() => {\n setTimeout(fn, 0);\n });\n }\n}\n\n/**\n * Timeout — Promise-based delay\n *\n * Useful for: readable async code, waiting between retries\n *\n * @param ms Milliseconds to wait\n * @returns Promise that resolves after delay\n *\n * @example\n * ```ts\n * await timeout(300);\n * console.log('300ms later');\n * ```\n */\nexport function timeout(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry — attempt function with backoff\n *\n * Useful for: network calls, transient failures\n *\n * @param fn Async function to retry\n * @param options maxAttempts, delayMs, backoff function\n * @returns Promise with final result or error\n *\n * @example\n * ```ts\n * const data = await retry(() => fetch(url), {\n * maxAttempts: 3,\n * delayMs: 100,\n * });\n * ```\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options?: RetryOptions\n): Promise<T> {\n const {\n maxAttempts = 3,\n delayMs = 100,\n backoff = (i: number) => delayMs * Math.pow(2, i),\n } = options || {};\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n if (attempt < maxAttempts - 1) {\n const delay = backoff(attempt);\n await timeout(delay);\n }\n }\n }\n\n throw lastError || new Error('Retry failed');\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"timing.js","names":[],"sources":["../../src/fx/timing.ts"],"sourcesContent":["/**\n * Timing utilities — pure helpers for common async patterns\n * No framework coupling. No lifecycle awareness.\n */\n\nexport interface DebounceOptions {\n leading?: boolean;\n trailing?: boolean;\n}\n\nexport interface ThrottleOptions {\n leading?: boolean;\n trailing?: boolean;\n}\n\nexport interface RetryOptions {\n maxAttempts?: number;\n delayMs?: number;\n backoff?: (attemptIndex: number) => number;\n}\n\ntype AnyFn = (...args: never[]) => unknown;\n\n/**\n * Debounce — delay execution, coalesce rapid calls\n *\n * Useful for: text input, resize, autosave\n *\n * @param fn Function to debounce\n * @param ms Delay in milliseconds\n * @param options trailing (default true), leading\n * @returns Debounced function with cancel() method\n *\n * @example\n * ```ts\n * const save = debounce((text) => api.save(text), 500);\n * input.addEventListener('input', (e) => save(e.target.value));\n * save.cancel(); // stop any pending execution\n * ```\n */\nexport function debounce<T extends AnyFn>(\n fn: T,\n ms: number,\n options?: DebounceOptions\n): T & { cancel(): void } {\n let timeoutId: NodeJS.Timeout | null = null;\n const { leading = false, trailing = true } = options || {};\n let lastArgs: unknown[] | null = null;\n let lastThis: unknown = null;\n let lastCallTime = 0;\n\n const debounced = function (this: unknown, ...args: unknown[]) {\n const callTime = Date.now();\n lastArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this;\n\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n\n if (leading && callTime - lastCallTime >= ms) {\n fn.apply(this, args);\n lastCallTime = callTime;\n }\n\n if (trailing) {\n timeoutId = setTimeout(() => {\n fn.apply(lastThis, lastArgs!);\n timeoutId = null;\n lastCallTime = Date.now();\n }, ms);\n }\n };\n\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return debounced as T & { cancel(): void };\n}\n\n/**\n * Throttle — rate-limit execution, keep first/last\n *\n * Useful for: scroll, mouse move, high-frequency events\n *\n * @param fn Function to throttle\n * @param ms Minimum interval between calls in milliseconds\n * @param options leading (default true), trailing (default true)\n * @returns Throttled function with cancel() method\n *\n * @example\n * ```ts\n * const handleScroll = throttle(updateUI, 100);\n * window.addEventListener('scroll', handleScroll);\n * handleScroll.cancel();\n * ```\n */\nexport function throttle<T extends AnyFn>(\n fn: T,\n ms: number,\n options?: ThrottleOptions\n): T & { cancel(): void } {\n let lastCallTime: number | null = null;\n let timeoutId: NodeJS.Timeout | null = null;\n const { leading = true, trailing = true } = options || {};\n let lastArgs: unknown[] | null = null;\n let lastThis: unknown = null;\n\n const throttled = function (this: unknown, ...args: unknown[]) {\n const callTime = Date.now();\n const timeSinceLastCall =\n lastCallTime === null\n ? Number.POSITIVE_INFINITY\n : callTime - lastCallTime;\n lastArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this;\n\n if (leading && timeSinceLastCall >= ms) {\n fn.apply(this, args);\n lastCallTime = callTime;\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n return;\n }\n\n if (!leading && lastCallTime === null) {\n lastCallTime = callTime;\n }\n\n if (trailing && timeoutId === null) {\n timeoutId = setTimeout(\n () => {\n fn.apply(lastThis, lastArgs!);\n lastCallTime = Date.now();\n timeoutId = null;\n },\n lastCallTime === null ? ms : Math.max(0, ms - (callTime - lastCallTime))\n );\n }\n };\n\n throttled.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return throttled as T & { cancel(): void };\n}\n\n/**\n * Once — guard against double execution\n *\n * Useful for: init logic, event safety\n *\n * @param fn Function to call at most once\n * @returns Function that executes fn only on first call\n *\n * @example\n * ```ts\n * const init = once(setup);\n * init(); // runs\n * init(); // does nothing\n * init(); // does nothing\n * ```\n */\nexport function once<T extends AnyFn>(fn: T): T {\n let called = false;\n let result: unknown;\n\n return ((...args: unknown[]) => {\n if (!called) {\n called = true;\n result = fn(...args);\n }\n return result;\n }) as T;\n}\n\n/**\n * Defer — schedule on microtask queue\n *\n * Useful for: run-after-current-stack logic\n * More reliable than setTimeout(..., 0)\n *\n * @param fn Function to defer\n *\n * @example\n * ```ts\n * defer(() => update()); // runs after current stack, before next macrotask\n * ```\n */\nexport function defer(fn: () => void): void {\n Promise.resolve().then(fn);\n}\n\n/**\n * RAF — coalesce multiple updates into single frame\n *\n * Useful for: animation, layout work, render updates\n *\n * @param fn Function to schedule on next animation frame\n * @returns Function that schedules fn on requestAnimationFrame\n *\n * @example\n * ```ts\n * const update = raf(render);\n * update(); // schedules on next frame\n * update(); // same frame, no duplicate\n * ```\n */\nexport function raf<T extends AnyFn>(fn: T): T {\n let frameId: number | null = null;\n let lastArgs: unknown[] | null = null;\n let lastThis: unknown = null;\n\n return function (this: unknown, ...args: unknown[]) {\n lastArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this;\n\n if (frameId === null) {\n frameId = requestAnimationFrame(() => {\n fn.apply(lastThis, lastArgs!);\n frameId = null;\n });\n }\n } as T;\n}\n\n/**\n * Idle — schedule low-priority work\n *\n * Useful for: background prep, non-urgent updates\n * Falls back to setTimeout if requestIdleCallback unavailable\n *\n * @param fn Function to call when idle\n * @param options timeout for fallback\n *\n * @example\n * ```ts\n * idle(() => prefetchData());\n * ```\n */\nexport function idle(fn: () => void, options?: { timeout?: number }): void {\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(fn, options ? { timeout: options.timeout } : undefined);\n } else {\n // Fallback: defer to microtask, then use setTimeout\n Promise.resolve().then(() => {\n setTimeout(fn, 0);\n });\n }\n}\n\n/**\n * Timeout — Promise-based delay\n *\n * Useful for: readable async code, waiting between retries\n *\n * @param ms Milliseconds to wait\n * @returns Promise that resolves after delay\n *\n * @example\n * ```ts\n * await timeout(300);\n * console.log('300ms later');\n * ```\n */\nexport function timeout(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry — attempt function with backoff\n *\n * Useful for: network calls, transient failures\n *\n * @param fn Async function to retry\n * @param options maxAttempts, delayMs, backoff function\n * @returns Promise with final result or error\n *\n * @example\n * ```ts\n * const data = await retry(() => fetch(url), {\n * maxAttempts: 3,\n * delayMs: 100,\n * });\n * ```\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options?: RetryOptions\n): Promise<T> {\n const {\n maxAttempts = 3,\n delayMs = 100,\n backoff = (i: number) => delayMs * Math.pow(2, i),\n } = options || {};\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n if (attempt < maxAttempts - 1) {\n const delay = backoff(attempt);\n await timeout(delay);\n }\n }\n }\n\n throw lastError || new Error('Retry failed');\n}\n"],"mappings":"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"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * Askr: Actor-backed deterministic UI framework\n *\n * Public API surface — only users should import from here\n */\n\nimport { installRendererBridge } from './renderer';\n\ninstallRendererBridge();\n\n// Runtime primitives\nexport { state } from './runtime/state';\nexport type { State, StateSetter, StateTuple } from './runtime/state';\nexport { derive } from './runtime/derive';\nexport type { Derived } from './runtime/derive';\nexport { getSignal } from './runtime/component';\nexport { selector } from './runtime/selector';\nexport type { Selector } from './runtime/selector';\n\n// Control flow\nexport { Case, For, Match, Show } from './control';\nexport type { CaseProps, ForProps, MatchProps, ShowProps } from './control';\n\n// Context\nexport { defineContext, readContext } from './runtime/context';\nexport type { Context } from './runtime/context';\n\n// Re-export JSX runtime for tsconfig jsxImportSource\nexport { jsx, jsxs, Fragment } from './jsx-runtime';\n\n// Public types\nexport type { Props } from './common/props';\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAQA,
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * Askr: Actor-backed deterministic UI framework\n *\n * Public API surface — only users should import from here\n */\n\nimport { installRendererBridge } from './renderer';\n\ninstallRendererBridge();\n\n// Runtime primitives\nexport { state } from './runtime/state';\nexport type { State, StateSetter, StateTuple } from './runtime/state';\nexport { derive } from './runtime/derive';\nexport type { Derived } from './runtime/derive';\nexport { getSignal } from './runtime/component';\nexport { selector } from './runtime/selector';\nexport type { Selector } from './runtime/selector';\n\n// Control flow\nexport { Case, For, Match, Show } from './control';\nexport type { CaseProps, ForProps, MatchProps, ShowProps } from './control';\n\n// Context\nexport { defineContext, readContext } from './runtime/context';\nexport type { Context } from './runtime/context';\n\n// Re-export JSX runtime for tsconfig jsxImportSource\nexport { jsx, jsxs, Fragment } from './jsx-runtime';\n\n// Public types\nexport type { Props } from './common/props';\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAQA,sBAAsB"}
|
package/dist/jsx/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Props } from "../common/props.js";
|
|
1
|
+
import { IntrinsicFallbackProps, KnownIntrinsicElementProps, Props } from "../common/props.js";
|
|
2
2
|
import { Fragment, JSXElement } from "../common/jsx.js";
|
|
3
3
|
|
|
4
4
|
//#region src/jsx/types.d.ts
|
|
@@ -7,8 +7,8 @@ declare global {
|
|
|
7
7
|
interface Element extends JSXElement {
|
|
8
8
|
readonly __askrJsxElementBrand?: never;
|
|
9
9
|
}
|
|
10
|
-
interface IntrinsicElements {
|
|
11
|
-
[elem: string]:
|
|
10
|
+
interface IntrinsicElements extends KnownIntrinsicElementProps {
|
|
11
|
+
[elem: string]: IntrinsicFallbackProps | KnownIntrinsicElementProps[keyof KnownIntrinsicElementProps];
|
|
12
12
|
}
|
|
13
13
|
interface ElementAttributesProperty {
|
|
14
14
|
props: Props;
|
package/dist/jsx/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/jsx/types.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/jsx/types.ts"],"mappings":";;;;QAoBQ,MAAA;EAAA,UAEI,GAAA;IAAA,UAEE,OAAA,SAAgB,UAAA;MAAA,SACf,qBAAA;IAAA;IAAA,UAGD,iBAAA,SAA0B,0BAAA;MAAA,CACjC,IAAA,WACG,sBAAA,GACA,0BAAA,OAAiC,0BAAA;IAAA;IAAA,UAG7B,yBAAA;MACR,KAAA,EAAO,KAAA;IAAA;IAAA,UAGC,wBAAA;MACR,QAAA;IAAA;EAAA;AAAA"}
|
package/dist/jsx/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","names":[],"sources":["../../src/jsx/utils.ts"],"mappings":";;iBAEgB,SAAA,CAAU,KAAA,YAAiB,KAAA,IAAS,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","names":[],"sources":["../../src/jsx/utils.ts"],"mappings":";;iBAEgB,SAAA,CAAU,KAAA,YAAiB,KAAA,IAAS,UAAU;AAAA,iBAQ9C,YAAA,CACd,OAAA,EAAS,UAAA,EACT,KAAA,EAAO,MAAA,oBACN,UAAA"}
|
package/dist/jsx/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":[],"sources":["../../src/jsx/utils.ts"],"sourcesContent":["import { ELEMENT_TYPE, JSXElement } from './types';\n\nexport function isElement(value: unknown): value is JSXElement {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as JSXElement).$$typeof === ELEMENT_TYPE\n );\n}\n\nexport function cloneElement(\n element: JSXElement,\n props: Record<string, unknown>\n): JSXElement {\n return {\n ...element,\n props: { ...element.props, ...props },\n };\n}\n"],"mappings":";;;AAEA,SAAgB,UAAU,OAAqC;CAC7D,OACE,OAAO,UAAU,YACjB,UAAU,QACT,MAAqB,aAAa
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../src/jsx/utils.ts"],"sourcesContent":["import { ELEMENT_TYPE, JSXElement } from './types';\n\nexport function isElement(value: unknown): value is JSXElement {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as JSXElement).$$typeof === ELEMENT_TYPE\n );\n}\n\nexport function cloneElement(\n element: JSXElement,\n props: Record<string, unknown>\n): JSXElement {\n return {\n ...element,\n props: { ...element.props, ...props },\n };\n}\n"],"mappings":";;;AAEA,SAAgB,UAAU,OAAqC;CAC7D,OACE,OAAO,UAAU,YACjB,UAAU,QACT,MAAqB,aAAa;AAEvC;AAEA,SAAgB,aACd,SACA,OACY;CACZ,OAAO;EACL,GAAG;EACH,OAAO;GAAE,GAAG,QAAQ;GAAO,GAAG;EAAM;CACtC;AACF"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import { IntrinsicFallbackProps, KnownIntrinsicElementProps, Props } from "./common/props.js";
|
|
1
2
|
import { Fragment, JSXElement } from "./common/jsx.js";
|
|
2
3
|
import { EagerControlPrimitive } from "./common/control.js";
|
|
3
4
|
//#region src/jsx/jsx-dev-runtime.d.ts
|
|
4
|
-
declare function jsxDEV(type: EagerControlPrimitive, props:
|
|
5
|
-
declare function jsxDEV(type:
|
|
5
|
+
declare function jsxDEV(type: EagerControlPrimitive, props: Props | null, key?: string | number, isStaticChildren?: boolean): unknown;
|
|
6
|
+
declare function jsxDEV<TTag extends keyof KnownIntrinsicElementProps>(type: TTag, props: KnownIntrinsicElementProps[TTag] | null, key?: string | number, isStaticChildren?: boolean): JSXElement;
|
|
7
|
+
declare function jsxDEV<TTag extends string>(type: Exclude<TTag, keyof KnownIntrinsicElementProps>, props: IntrinsicFallbackProps | null, key?: string | number, isStaticChildren?: boolean): JSXElement;
|
|
8
|
+
declare function jsxDEV<TProps extends object>(type: (props: TProps) => unknown, props: TProps | null, key?: string | number, isStaticChildren?: boolean): JSXElement;
|
|
9
|
+
declare function jsxDEV(type: symbol, props: Props | null, key?: string | number, isStaticChildren?: boolean): JSXElement;
|
|
6
10
|
//#endregion
|
|
7
11
|
export { Fragment, type JSXElement, jsxDEV };
|
|
8
12
|
//# sourceMappingURL=jsx-dev-runtime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-dev-runtime.d.ts","names":[],"sources":["../src/jsx/jsx-dev-runtime.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"jsx-dev-runtime.d.ts","names":[],"sources":["../src/jsx/jsx-dev-runtime.ts"],"mappings":";;;;iBA0CgB,MAAA,CACd,IAAA,EAAM,qBAAA,EACN,KAAA,EAAO,KAAK,SACZ,GAAA,oBACA,gBAAA;AAAA,iBAEc,MAAA,oBAA0B,0BAAA,CAAA,CACxC,IAAA,EAAM,IAAA,EACN,KAAA,EAAO,0BAAA,CAA2B,IAAA,UAClC,GAAA,oBACA,gBAAA,aACC,UAAA;AAAA,iBACa,MAAA,qBAAA,CACd,IAAA,EAAM,OAAA,CAAQ,IAAA,QAAY,0BAAA,GAC1B,KAAA,EAAO,sBAAA,SACP,GAAA,oBACA,gBAAA,aACC,UAAA;AAAA,iBACa,MAAA,uBAAA,CACd,IAAA,GAAO,KAAA,EAAO,MAAA,cACd,KAAA,EAAO,MAAA,SACP,GAAA,oBACA,gBAAA,aACC,UAAA;AAAA,iBACa,MAAA,CACd,IAAA,UACA,KAAA,EAAO,KAAA,SACP,GAAA,oBACA,gBAAA,aACC,UAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-dev-runtime.js","names":[],"sources":["../src/jsx/jsx-dev-runtime.ts"],"sourcesContent":["/**\n * JSX dev runtime factory\n * Same element shape as production runtime, with room for dev warnings.\n */\nimport type {
|
|
1
|
+
{"version":3,"file":"jsx-dev-runtime.js","names":[],"sources":["../src/jsx/jsx-dev-runtime.ts"],"sourcesContent":["/**\n * JSX dev runtime factory\n * Same element shape as production runtime, with room for dev warnings.\n */\nimport type {\n IntrinsicFallbackProps,\n KnownIntrinsicElementProps,\n Props,\n} from '../common/props';\nimport {\n isEagerControlPrimitive,\n type EagerControlPrimitive,\n} from '../common/control';\nimport {\n ELEMENT_TYPE,\n Fragment,\n STATIC_CHILDREN,\n type JSXElement,\n} from './types';\nimport { markReadableUsage } from '../runtime/readable';\n\nfunction annotatePropsUsage(props: Record<string, unknown> | null): Props {\n const normalizedProps = (props ?? {}) as Props;\n\n for (const value of Object.values(normalizedProps)) {\n markReadableUsage(value);\n }\n\n return normalizedProps;\n}\n\nfunction markStaticChildren(props: Props): Props {\n if (Array.isArray(props.children)) {\n Object.defineProperty(props.children, STATIC_CHILDREN, {\n value: true,\n configurable: true,\n });\n }\n\n return props;\n}\n\nexport function jsxDEV(\n type: EagerControlPrimitive,\n props: Props | null,\n key?: string | number,\n isStaticChildren?: boolean\n): unknown;\nexport function jsxDEV<TTag extends keyof KnownIntrinsicElementProps>(\n type: TTag,\n props: KnownIntrinsicElementProps[TTag] | null,\n key?: string | number,\n isStaticChildren?: boolean\n): JSXElement;\nexport function jsxDEV<TTag extends string>(\n type: Exclude<TTag, keyof KnownIntrinsicElementProps>,\n props: IntrinsicFallbackProps | null,\n key?: string | number,\n isStaticChildren?: boolean\n): JSXElement;\nexport function jsxDEV<TProps extends object>(\n type: (props: TProps) => unknown,\n props: TProps | null,\n key?: string | number,\n isStaticChildren?: boolean\n): JSXElement;\nexport function jsxDEV(\n type: symbol,\n props: Props | null,\n key?: string | number,\n isStaticChildren?: boolean\n): JSXElement;\nexport function jsxDEV(\n type: unknown,\n props: Record<string, unknown> | null,\n key?: string | number,\n isStaticChildren = false\n): JSXElement | unknown {\n const normalizedProps = annotatePropsUsage(props);\n const preparedProps = isStaticChildren\n ? markStaticChildren(normalizedProps)\n : normalizedProps;\n\n if (isEagerControlPrimitive(type)) {\n return type(preparedProps);\n }\n\n return {\n $$typeof: ELEMENT_TYPE,\n type: type as string | ((props: Props) => unknown) | symbol,\n props: preparedProps,\n key: key ?? null,\n };\n}\n\n// Re-export Fragment for JSX\nexport { Fragment };\nexport type { JSXElement };\n"],"mappings":";;;;;AAqBA,SAAS,mBAAmB,OAA8C;CACxE,MAAM,kBAAmB,SAAS,CAAC;CAEnC,KAAK,MAAM,SAAS,OAAO,OAAO,eAAe,GAC/C,kBAAkB,KAAK;CAGzB,OAAO;AACT;AAEA,SAAS,mBAAmB,OAAqB;CAC/C,IAAI,MAAM,QAAQ,MAAM,QAAQ,GAC9B,OAAO,eAAe,MAAM,UAAU,iBAAiB;EACrD,OAAO;EACP,cAAc;CAChB,CAAC;CAGH,OAAO;AACT;AAgCA,SAAgB,OACd,MACA,OACA,KACA,mBAAmB,OACG;CACtB,MAAM,kBAAkB,mBAAmB,KAAK;CAChD,MAAM,gBAAgB,mBAClB,mBAAmB,eAAe,IAClC;CAEJ,IAAI,wBAAwB,IAAI,GAC9B,OAAO,KAAK,aAAa;CAG3B,OAAO;EACL,UAAU;EACJ;EACN,OAAO;EACP,KAAK,OAAO;CACd;AACF"}
|
package/dist/jsx-runtime.d.ts
CHANGED
|
@@ -1,12 +1,22 @@
|
|
|
1
|
+
import { IntrinsicFallbackProps, KnownIntrinsicElementProps, Props } from "./common/props.js";
|
|
1
2
|
import { Fragment, JSXElement } from "./common/jsx.js";
|
|
2
3
|
import { EagerControlPrimitive } from "./common/control.js";
|
|
3
4
|
//#region src/jsx/jsx-runtime.d.ts
|
|
4
|
-
declare function jsxDEV(type: EagerControlPrimitive, props:
|
|
5
|
-
declare function jsxDEV(type:
|
|
6
|
-
declare function
|
|
7
|
-
declare function
|
|
8
|
-
declare function
|
|
9
|
-
declare function
|
|
5
|
+
declare function jsxDEV(type: EagerControlPrimitive, props: Props | null, key?: string | number, isStaticChildren?: boolean): unknown;
|
|
6
|
+
declare function jsxDEV<TTag extends keyof KnownIntrinsicElementProps>(type: TTag, props: KnownIntrinsicElementProps[TTag] | null, key?: string | number, isStaticChildren?: boolean): JSXElement;
|
|
7
|
+
declare function jsxDEV<TTag extends string>(type: Exclude<TTag, keyof KnownIntrinsicElementProps>, props: IntrinsicFallbackProps | null, key?: string | number, isStaticChildren?: boolean): JSXElement;
|
|
8
|
+
declare function jsxDEV<TProps extends object>(type: (props: TProps) => unknown, props: TProps | null, key?: string | number, isStaticChildren?: boolean): JSXElement;
|
|
9
|
+
declare function jsxDEV(type: symbol, props: Props | null, key?: string | number, isStaticChildren?: boolean): JSXElement;
|
|
10
|
+
declare function jsx(type: EagerControlPrimitive, props: Props | null, key?: string | number): unknown;
|
|
11
|
+
declare function jsx<TTag extends keyof KnownIntrinsicElementProps>(type: TTag, props: KnownIntrinsicElementProps[TTag] | null, key?: string | number): JSXElement;
|
|
12
|
+
declare function jsx<TTag extends string>(type: Exclude<TTag, keyof KnownIntrinsicElementProps>, props: IntrinsicFallbackProps | null, key?: string | number): JSXElement;
|
|
13
|
+
declare function jsx<TProps extends object>(type: (props: TProps) => unknown, props: TProps | null, key?: string | number): JSXElement;
|
|
14
|
+
declare function jsx(type: symbol, props: Props | null, key?: string | number): JSXElement;
|
|
15
|
+
declare function jsxs(type: EagerControlPrimitive, props: Props | null, key?: string | number): unknown;
|
|
16
|
+
declare function jsxs<TTag extends keyof KnownIntrinsicElementProps>(type: TTag, props: KnownIntrinsicElementProps[TTag] | null, key?: string | number): JSXElement;
|
|
17
|
+
declare function jsxs<TTag extends string>(type: Exclude<TTag, keyof KnownIntrinsicElementProps>, props: IntrinsicFallbackProps | null, key?: string | number): JSXElement;
|
|
18
|
+
declare function jsxs<TProps extends object>(type: (props: TProps) => unknown, props: TProps | null, key?: string | number): JSXElement;
|
|
19
|
+
declare function jsxs(type: symbol, props: Props | null, key?: string | number): JSXElement;
|
|
10
20
|
//#endregion
|
|
11
21
|
export { Fragment, type JSXElement, jsx, jsxDEV, jsxs };
|
|
12
22
|
//# sourceMappingURL=jsx-runtime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-runtime.d.ts","names":[],"sources":["../src/jsx/jsx-runtime.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"jsx-runtime.d.ts","names":[],"sources":["../src/jsx/jsx-runtime.ts"],"mappings":";;;;iBA2CgB,MAAA,CACd,IAAA,EAAM,qBAAA,EACN,KAAA,EAAO,KAAK,SACZ,GAAA,oBACA,gBAAA;AAAA,iBAEc,MAAA,oBAA0B,0BAAA,CAAA,CACxC,IAAA,EAAM,IAAA,EACN,KAAA,EAAO,0BAAA,CAA2B,IAAA,UAClC,GAAA,oBACA,gBAAA,aACC,UAAA;AAAA,iBACa,MAAA,qBAAA,CACd,IAAA,EAAM,OAAA,CAAQ,IAAA,QAAY,0BAAA,GAC1B,KAAA,EAAO,sBAAA,SACP,GAAA,oBACA,gBAAA,aACC,UAAA;AAAA,iBACa,MAAA,uBAAA,CACd,IAAA,GAAO,KAAA,EAAO,MAAA,cACd,KAAA,EAAO,MAAA,SACP,GAAA,oBACA,gBAAA,aACC,UAAA;AAAA,iBACa,MAAA,CACd,IAAA,UACA,KAAA,EAAO,KAAA,SACP,GAAA,oBACA,gBAAA,aACC,UAAU;AAAA,iBAyBG,GAAA,CACd,IAAA,EAAM,qBAAA,EACN,KAAA,EAAO,KAAK,SACZ,GAAA;AAAA,iBAEc,GAAA,oBAAuB,0BAAA,CAAA,CACrC,IAAA,EAAM,IAAA,EACN,KAAA,EAAO,0BAAA,CAA2B,IAAA,UAClC,GAAA,qBACC,UAAA;AAAA,iBACa,GAAA,qBAAA,CACd,IAAA,EAAM,OAAA,CAAQ,IAAA,QAAY,0BAAA,GAC1B,KAAA,EAAO,sBAAA,SACP,GAAA,qBACC,UAAA;AAAA,iBACa,GAAA,uBAAA,CACd,IAAA,GAAO,KAAA,EAAO,MAAA,cACd,KAAA,EAAO,MAAA,SACP,GAAA,qBACC,UAAA;AAAA,iBACa,GAAA,CACd,IAAA,UACA,KAAA,EAAO,KAAA,SACP,GAAA,qBACC,UAAU;AAAA,iBASG,IAAA,CACd,IAAA,EAAM,qBAAA,EACN,KAAA,EAAO,KAAK,SACZ,GAAA;AAAA,iBAEc,IAAA,oBAAwB,0BAAA,CAAA,CACtC,IAAA,EAAM,IAAA,EACN,KAAA,EAAO,0BAAA,CAA2B,IAAA,UAClC,GAAA,qBACC,UAAA;AAAA,iBACa,IAAA,qBAAA,CACd,IAAA,EAAM,OAAA,CAAQ,IAAA,QAAY,0BAAA,GAC1B,KAAA,EAAO,sBAAA,SACP,GAAA,qBACC,UAAA;AAAA,iBACa,IAAA,uBAAA,CACd,IAAA,GAAO,KAAA,EAAO,MAAA,cACd,KAAA,EAAO,MAAA,SACP,GAAA,qBACC,UAAA;AAAA,iBACa,IAAA,CACd,IAAA,UACA,KAAA,EAAO,KAAA,SACP,GAAA,qBACC,UAAU"}
|
package/dist/jsx-runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-runtime.js","names":[],"sources":["../src/jsx/jsx-runtime.ts"],"sourcesContent":["/**\n * JSX runtime factory\n * Same element shape as production runtime.\n */\n\nimport type {
|
|
1
|
+
{"version":3,"file":"jsx-runtime.js","names":[],"sources":["../src/jsx/jsx-runtime.ts"],"sourcesContent":["/**\n * JSX runtime factory\n * Same element shape as production runtime.\n */\n\nimport type {\n IntrinsicFallbackProps,\n KnownIntrinsicElementProps,\n Props,\n} from '../common/props';\nimport {\n isEagerControlPrimitive,\n type EagerControlPrimitive,\n} from '../common/control';\nimport {\n ELEMENT_TYPE,\n Fragment,\n STATIC_CHILDREN,\n type JSXElement,\n} from './types';\nimport { markReadableUsage } from '../runtime/readable';\n\nfunction annotatePropsUsage(props: Record<string, unknown> | null): Props {\n const normalizedProps = (props ?? {}) as Props;\n\n for (const value of Object.values(normalizedProps)) {\n markReadableUsage(value);\n }\n\n return normalizedProps;\n}\n\nfunction markStaticChildren(props: Props): Props {\n if (Array.isArray(props.children)) {\n Object.defineProperty(props.children, STATIC_CHILDREN, {\n value: true,\n configurable: true,\n });\n }\n\n return props;\n}\n\nexport function jsxDEV(\n type: EagerControlPrimitive,\n props: Props | null,\n key?: string | number,\n isStaticChildren?: boolean\n): unknown;\nexport function jsxDEV<TTag extends keyof KnownIntrinsicElementProps>(\n type: TTag,\n props: KnownIntrinsicElementProps[TTag] | null,\n key?: string | number,\n isStaticChildren?: boolean\n): JSXElement;\nexport function jsxDEV<TTag extends string>(\n type: Exclude<TTag, keyof KnownIntrinsicElementProps>,\n props: IntrinsicFallbackProps | null,\n key?: string | number,\n isStaticChildren?: boolean\n): JSXElement;\nexport function jsxDEV<TProps extends object>(\n type: (props: TProps) => unknown,\n props: TProps | null,\n key?: string | number,\n isStaticChildren?: boolean\n): JSXElement;\nexport function jsxDEV(\n type: symbol,\n props: Props | null,\n key?: string | number,\n isStaticChildren?: boolean\n): JSXElement;\nexport function jsxDEV(\n type: unknown,\n props: Record<string, unknown> | null,\n key?: string | number,\n isStaticChildren = false\n): JSXElement | unknown {\n const normalizedProps = annotatePropsUsage(props);\n const preparedProps = isStaticChildren\n ? markStaticChildren(normalizedProps)\n : normalizedProps;\n\n if (isEagerControlPrimitive(type)) {\n return type(preparedProps);\n }\n\n return {\n $$typeof: ELEMENT_TYPE,\n type: type as string | ((props: Props) => unknown) | symbol,\n props: preparedProps,\n key: key ?? null,\n };\n}\n\n// Production-style helpers: alias to the DEV factory for now\nexport function jsx(\n type: EagerControlPrimitive,\n props: Props | null,\n key?: string | number\n): unknown;\nexport function jsx<TTag extends keyof KnownIntrinsicElementProps>(\n type: TTag,\n props: KnownIntrinsicElementProps[TTag] | null,\n key?: string | number\n): JSXElement;\nexport function jsx<TTag extends string>(\n type: Exclude<TTag, keyof KnownIntrinsicElementProps>,\n props: IntrinsicFallbackProps | null,\n key?: string | number\n): JSXElement;\nexport function jsx<TProps extends object>(\n type: (props: TProps) => unknown,\n props: TProps | null,\n key?: string | number\n): JSXElement;\nexport function jsx(\n type: symbol,\n props: Props | null,\n key?: string | number\n): JSXElement;\nexport function jsx(\n type: unknown,\n props: Record<string, unknown> | null,\n key?: string | number\n) {\n return jsxDEV(type as never, props, key);\n}\n\nexport function jsxs(\n type: EagerControlPrimitive,\n props: Props | null,\n key?: string | number\n): unknown;\nexport function jsxs<TTag extends keyof KnownIntrinsicElementProps>(\n type: TTag,\n props: KnownIntrinsicElementProps[TTag] | null,\n key?: string | number\n): JSXElement;\nexport function jsxs<TTag extends string>(\n type: Exclude<TTag, keyof KnownIntrinsicElementProps>,\n props: IntrinsicFallbackProps | null,\n key?: string | number\n): JSXElement;\nexport function jsxs<TProps extends object>(\n type: (props: TProps) => unknown,\n props: TProps | null,\n key?: string | number\n): JSXElement;\nexport function jsxs(\n type: symbol,\n props: Props | null,\n key?: string | number\n): JSXElement;\nexport function jsxs(\n type: unknown,\n props: Record<string, unknown> | null,\n key?: string | number\n) {\n const normalizedProps = markStaticChildren(annotatePropsUsage(props));\n\n if (isEagerControlPrimitive(type)) {\n return type(normalizedProps);\n }\n\n return {\n $$typeof: ELEMENT_TYPE,\n type: type as string | ((props: Props) => unknown) | symbol,\n props: normalizedProps,\n key: key ?? null,\n } as JSXElement;\n}\n\n// Re-export Fragment for JSX.\nexport { Fragment };\nexport type { JSXElement };\n"],"mappings":";;;;;AAsBA,SAAS,mBAAmB,OAA8C;CACxE,MAAM,kBAAmB,SAAS,CAAC;CAEnC,KAAK,MAAM,SAAS,OAAO,OAAO,eAAe,GAC/C,kBAAkB,KAAK;CAGzB,OAAO;AACT;AAEA,SAAS,mBAAmB,OAAqB;CAC/C,IAAI,MAAM,QAAQ,MAAM,QAAQ,GAC9B,OAAO,eAAe,MAAM,UAAU,iBAAiB;EACrD,OAAO;EACP,cAAc;CAChB,CAAC;CAGH,OAAO;AACT;AAgCA,SAAgB,OACd,MACA,OACA,KACA,mBAAmB,OACG;CACtB,MAAM,kBAAkB,mBAAmB,KAAK;CAChD,MAAM,gBAAgB,mBAClB,mBAAmB,eAAe,IAClC;CAEJ,IAAI,wBAAwB,IAAI,GAC9B,OAAO,KAAK,aAAa;CAG3B,OAAO;EACL,UAAU;EACJ;EACN,OAAO;EACP,KAAK,OAAO;CACd;AACF;AA4BA,SAAgB,IACd,MACA,OACA,KACA;CACA,OAAO,OAAO,MAAe,OAAO,GAAG;AACzC;AA2BA,SAAgB,KACd,MACA,OACA,KACA;CACA,MAAM,kBAAkB,mBAAmB,mBAAmB,KAAK,CAAC;CAEpE,IAAI,wBAAwB,IAAI,GAC9B,OAAO,KAAK,eAAe;CAG7B,OAAO;EACL,UAAU;EACJ;EACN,OAAO;EACP,KAAK,OAAO;CACd;AACF"}
|