@askrjs/askr 0.0.28 → 0.0.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/README.md +44 -172
  2. package/dist/_virtual/_rolldown/runtime.js +7 -0
  3. package/dist/bench/components/benchmark-row.d.ts +20 -0
  4. package/dist/bench/components/benchmark-row.d.ts.map +1 -0
  5. package/dist/bench/components/benchmark-row.js +42 -0
  6. package/dist/bench/components/benchmark-row.js.map +1 -0
  7. package/dist/bench/components/benchmark-table.js +25 -0
  8. package/dist/bench/components/benchmark-table.js.map +1 -0
  9. package/dist/benchmark.d.ts +22 -0
  10. package/dist/benchmark.d.ts.map +1 -0
  11. package/dist/benchmark.js +64 -1
  12. package/dist/benchmark.js.map +1 -0
  13. package/dist/bin/askr-ssg.d.ts +22 -26
  14. package/dist/bin/askr-ssg.d.ts.map +1 -1
  15. package/dist/bin/askr-ssg.js +149 -2
  16. package/dist/bin/askr-ssg.js.map +1 -0
  17. package/dist/boot/index.d.ts +64 -42
  18. package/dist/boot/index.d.ts.map +1 -1
  19. package/dist/boot/index.js +416 -2
  20. package/dist/boot/index.js.map +1 -0
  21. package/dist/common/component.d.ts +14 -13
  22. package/dist/common/component.d.ts.map +1 -1
  23. package/dist/common/control.d.ts +13 -0
  24. package/dist/common/control.d.ts.map +1 -0
  25. package/dist/common/control.js +14 -0
  26. package/dist/common/control.js.map +1 -0
  27. package/dist/common/env.js +47 -0
  28. package/dist/common/env.js.map +1 -0
  29. package/dist/common/jsx.d.ts +17 -15
  30. package/dist/common/jsx.d.ts.map +1 -1
  31. package/dist/common/jsx.js +8 -1
  32. package/dist/common/jsx.js.map +1 -0
  33. package/dist/common/props.d.ts +14 -11
  34. package/dist/common/props.d.ts.map +1 -1
  35. package/dist/common/router.d.ts +190 -32
  36. package/dist/common/router.d.ts.map +1 -1
  37. package/dist/common/ssr-errors.d.ts +6 -3
  38. package/dist/common/ssr-errors.d.ts.map +1 -1
  39. package/dist/common/ssr-errors.js +16 -1
  40. package/dist/common/ssr-errors.js.map +1 -0
  41. package/dist/common/ssr.d.ts +12 -9
  42. package/dist/common/ssr.d.ts.map +1 -1
  43. package/dist/common/vnode.d.ts +17 -15
  44. package/dist/common/vnode.d.ts.map +1 -1
  45. package/dist/common/vnode.js +10 -1
  46. package/dist/common/vnode.js.map +1 -0
  47. package/dist/components/link.d.ts +37 -25
  48. package/dist/components/link.d.ts.map +1 -1
  49. package/dist/components/link.js +64 -1
  50. package/dist/components/link.js.map +1 -0
  51. package/dist/control/case.d.ts +17 -0
  52. package/dist/control/case.d.ts.map +1 -0
  53. package/dist/control/case.js +69 -0
  54. package/dist/control/case.js.map +1 -0
  55. package/dist/control/for.d.ts +23 -0
  56. package/dist/control/for.d.ts.map +1 -0
  57. package/dist/control/for.js +62 -0
  58. package/dist/control/for.js.map +1 -0
  59. package/dist/control/index.d.ts +4 -0
  60. package/dist/control/index.js +4 -0
  61. package/dist/control/shared.js +20 -0
  62. package/dist/control/shared.js.map +1 -0
  63. package/dist/control/show.d.ts +14 -0
  64. package/dist/control/show.d.ts.map +1 -0
  65. package/dist/control/show.js +33 -0
  66. package/dist/control/show.js.map +1 -0
  67. package/dist/dev/invariant.js +29 -2
  68. package/dist/dev/invariant.js.map +1 -0
  69. package/dist/dev/logger.js +37 -1
  70. package/dist/dev/logger.js.map +1 -0
  71. package/dist/foundations/icon/icon.d.ts +53 -0
  72. package/dist/foundations/icon/icon.d.ts.map +1 -0
  73. package/dist/foundations/icon/icon.js +88 -0
  74. package/dist/foundations/icon/icon.js.map +1 -0
  75. package/dist/foundations/icon/icon.types.d.ts +21 -0
  76. package/dist/foundations/icon/icon.types.d.ts.map +1 -0
  77. package/dist/foundations/index.d.ts +10 -3
  78. package/dist/foundations/index.js +9 -1
  79. package/dist/foundations/interactions/interaction-policy.js +93 -1
  80. package/dist/foundations/interactions/interaction-policy.js.map +1 -0
  81. package/dist/foundations/interactions/pressable.js +51 -1
  82. package/dist/foundations/interactions/pressable.js.map +1 -0
  83. package/dist/foundations/structures/collection.d.ts +25 -40
  84. package/dist/foundations/structures/collection.d.ts.map +1 -1
  85. package/dist/foundations/structures/collection.js +51 -1
  86. package/dist/foundations/structures/collection.js.map +1 -0
  87. package/dist/foundations/structures/layer.d.ts +47 -68
  88. package/dist/foundations/structures/layer.d.ts.map +1 -1
  89. package/dist/foundations/structures/layer.js +81 -1
  90. package/dist/foundations/structures/layer.js.map +1 -0
  91. package/dist/foundations/structures/layout.d.ts +6 -3
  92. package/dist/foundations/structures/layout.d.ts.map +1 -1
  93. package/dist/foundations/structures/layout.js +13 -1
  94. package/dist/foundations/structures/layout.js.map +1 -0
  95. package/dist/foundations/structures/portal.d.ts +17 -10
  96. package/dist/foundations/structures/portal.d.ts.map +1 -1
  97. package/dist/foundations/structures/portal.js +105 -1
  98. package/dist/foundations/structures/portal.js.map +1 -0
  99. package/dist/foundations/structures/presence.d.ts +11 -5
  100. package/dist/foundations/structures/presence.d.ts.map +1 -1
  101. package/dist/foundations/structures/presence.js +39 -1
  102. package/dist/foundations/structures/presence.js.map +1 -0
  103. package/dist/foundations/structures/slot.d.ts +11 -8
  104. package/dist/foundations/structures/slot.d.ts.map +1 -1
  105. package/dist/foundations/structures/slot.js +41 -1
  106. package/dist/foundations/structures/slot.js.map +1 -0
  107. package/dist/foundations/structures.d.ts +7 -14
  108. package/dist/foundations/structures.js +6 -1
  109. package/dist/foundations/utilities/aria.js +11 -1
  110. package/dist/foundations/utilities/aria.js.map +1 -0
  111. package/dist/foundations/utilities/compose-handlers.js +20 -1
  112. package/dist/foundations/utilities/compose-handlers.js.map +1 -0
  113. package/dist/foundations/utilities/compose-ref.d.ts +7 -4
  114. package/dist/foundations/utilities/compose-ref.d.ts.map +1 -1
  115. package/dist/foundations/utilities/compose-ref.js +18 -1
  116. package/dist/foundations/utilities/compose-ref.js.map +1 -0
  117. package/dist/foundations/utilities/merge-props.js +49 -1
  118. package/dist/foundations/utilities/merge-props.js.map +1 -0
  119. package/dist/fx/fx.d.ts +24 -21
  120. package/dist/fx/fx.d.ts.map +1 -1
  121. package/dist/fx/fx.js +212 -1
  122. package/dist/fx/fx.js.map +1 -0
  123. package/dist/fx/index.d.ts +4 -7
  124. package/dist/fx/index.js +4 -1
  125. package/dist/fx/noop.js +9 -1
  126. package/dist/fx/noop.js.map +1 -0
  127. package/dist/fx/timing.d.ts +24 -21
  128. package/dist/fx/timing.d.ts.map +1 -1
  129. package/dist/fx/timing.js +236 -1
  130. package/dist/fx/timing.js.map +1 -0
  131. package/dist/index.d.ts +21 -23
  132. package/dist/index.js +34 -1
  133. package/dist/index.js.map +1 -0
  134. package/dist/jsx/index.d.ts +1 -4
  135. package/dist/jsx/index.js +3 -1
  136. package/dist/jsx/types.d.ts +18 -25
  137. package/dist/jsx/types.d.ts.map +1 -1
  138. package/dist/jsx/types.js +1 -1
  139. package/dist/jsx/utils.d.ts +4 -3
  140. package/dist/jsx/utils.d.ts.map +1 -1
  141. package/dist/jsx/utils.js +19 -1
  142. package/dist/jsx/utils.js.map +1 -0
  143. package/dist/jsx-dev-runtime.d.ts +8 -0
  144. package/dist/jsx-dev-runtime.d.ts.map +1 -0
  145. package/dist/jsx-dev-runtime.js +32 -1
  146. package/dist/jsx-dev-runtime.js.map +1 -0
  147. package/dist/jsx-runtime.d.ts +12 -0
  148. package/dist/jsx-runtime.d.ts.map +1 -0
  149. package/dist/jsx-runtime.js +45 -1
  150. package/dist/jsx-runtime.js.map +1 -0
  151. package/dist/jsx-runtime2.d.ts +2 -0
  152. package/dist/jsx-runtime2.js +3 -0
  153. package/dist/renderer/children.js +293 -0
  154. package/dist/renderer/children.js.map +1 -0
  155. package/dist/renderer/cleanup.js +150 -1
  156. package/dist/renderer/cleanup.js.map +1 -0
  157. package/dist/renderer/dom.js +2439 -1
  158. package/dist/renderer/dom.js.map +1 -0
  159. package/dist/renderer/env.js +1 -0
  160. package/dist/renderer/evaluate.js +450 -1
  161. package/dist/renderer/evaluate.js.map +1 -0
  162. package/dist/renderer/fastpath.js +145 -1
  163. package/dist/renderer/fastpath.js.map +1 -0
  164. package/dist/renderer/index.js +24 -1
  165. package/dist/renderer/index.js.map +1 -0
  166. package/dist/renderer/keyed.js +119 -1
  167. package/dist/renderer/keyed.js.map +1 -0
  168. package/dist/renderer/reconcile.js +359 -1
  169. package/dist/renderer/reconcile.js.map +1 -0
  170. package/dist/renderer/types.js +1 -1
  171. package/dist/renderer/utils.js +220 -1
  172. package/dist/renderer/utils.js.map +1 -0
  173. package/dist/resources/index.d.ts +3 -9
  174. package/dist/resources/index.js +3 -1
  175. package/dist/router/index.d.ts +6 -10
  176. package/dist/router/index.js +5 -1
  177. package/dist/router/match.js +83 -1
  178. package/dist/router/match.js.map +1 -0
  179. package/dist/router/navigate.d.ts +20 -8
  180. package/dist/router/navigate.d.ts.map +1 -1
  181. package/dist/router/navigate.js +288 -1
  182. package/dist/router/navigate.js.map +1 -0
  183. package/dist/router/policy.d.ts +22 -0
  184. package/dist/router/policy.d.ts.map +1 -0
  185. package/dist/router/policy.js +116 -0
  186. package/dist/router/policy.js.map +1 -0
  187. package/dist/router/route-context.js +79 -0
  188. package/dist/router/route-context.js.map +1 -0
  189. package/dist/router/route.d.ts +101 -34
  190. package/dist/router/route.d.ts.map +1 -1
  191. package/dist/router/route.js +599 -1
  192. package/dist/router/route.js.map +1 -0
  193. package/dist/runtime/child-scope.d.ts +21 -0
  194. package/dist/runtime/child-scope.d.ts.map +1 -0
  195. package/dist/runtime/child-scope.js +77 -0
  196. package/dist/runtime/child-scope.js.map +1 -0
  197. package/dist/runtime/component.d.ts +67 -56
  198. package/dist/runtime/component.d.ts.map +1 -1
  199. package/dist/runtime/component.js +462 -1
  200. package/dist/runtime/component.js.map +1 -0
  201. package/dist/runtime/context.d.ts +28 -42
  202. package/dist/runtime/context.d.ts.map +1 -1
  203. package/dist/runtime/context.js +205 -1
  204. package/dist/runtime/context.js.map +1 -0
  205. package/dist/runtime/control.d.ts +43 -0
  206. package/dist/runtime/control.d.ts.map +1 -0
  207. package/dist/runtime/control.js +125 -0
  208. package/dist/runtime/control.js.map +1 -0
  209. package/dist/runtime/derive.d.ts +12 -9
  210. package/dist/runtime/derive.d.ts.map +1 -1
  211. package/dist/runtime/derive.js +134 -1
  212. package/dist/runtime/derive.js.map +1 -0
  213. package/dist/runtime/dev-namespace.js +57 -1
  214. package/dist/runtime/dev-namespace.js.map +1 -0
  215. package/dist/runtime/effect.d.ts +32 -0
  216. package/dist/runtime/effect.d.ts.map +1 -0
  217. package/dist/runtime/effect.js +146 -0
  218. package/dist/runtime/effect.js.map +1 -0
  219. package/dist/runtime/events.js +162 -1
  220. package/dist/runtime/events.js.map +1 -0
  221. package/dist/runtime/execution-model.js +15 -1
  222. package/dist/runtime/execution-model.js.map +1 -0
  223. package/dist/runtime/fastlane.js +204 -1
  224. package/dist/runtime/fastlane.js.map +1 -0
  225. package/dist/runtime/for-bench.d.ts +41 -0
  226. package/dist/runtime/for-bench.d.ts.map +1 -0
  227. package/dist/runtime/for-bench.js +173 -0
  228. package/dist/runtime/for-bench.js.map +1 -0
  229. package/dist/runtime/for.d.ts +62 -49
  230. package/dist/runtime/for.d.ts.map +1 -1
  231. package/dist/runtime/for.js +668 -1
  232. package/dist/runtime/for.js.map +1 -0
  233. package/dist/runtime/operations.d.ts +18 -15
  234. package/dist/runtime/operations.d.ts.map +1 -1
  235. package/dist/runtime/operations.js +209 -1
  236. package/dist/runtime/operations.js.map +1 -0
  237. package/dist/runtime/perf-metrics.js +64 -1
  238. package/dist/runtime/perf-metrics.js.map +1 -0
  239. package/dist/runtime/readable.d.ts +24 -18
  240. package/dist/runtime/readable.d.ts.map +1 -1
  241. package/dist/runtime/readable.js +118 -1
  242. package/dist/runtime/readable.js.map +1 -0
  243. package/dist/runtime/resource-cell.js +102 -1
  244. package/dist/runtime/resource-cell.js.map +1 -0
  245. package/dist/runtime/scheduler.d.ts +51 -50
  246. package/dist/runtime/scheduler.d.ts.map +1 -1
  247. package/dist/runtime/scheduler.js +328 -1
  248. package/dist/runtime/scheduler.js.map +1 -0
  249. package/dist/runtime/selector.d.ts +7 -5
  250. package/dist/runtime/selector.d.ts.map +1 -1
  251. package/dist/runtime/selector.js +188 -1
  252. package/dist/runtime/selector.js.map +1 -0
  253. package/dist/runtime/ssr-bridge.js +24 -1
  254. package/dist/runtime/ssr-bridge.js.map +1 -0
  255. package/dist/runtime/state.d.ts +11 -19
  256. package/dist/runtime/state.d.ts.map +1 -1
  257. package/dist/runtime/state.js +99 -1
  258. package/dist/runtime/state.js.map +1 -0
  259. package/dist/ssg/batch-render.d.ts +10 -10
  260. package/dist/ssg/batch-render.d.ts.map +1 -1
  261. package/dist/ssg/batch-render.js +84 -1
  262. package/dist/ssg/batch-render.js.map +1 -0
  263. package/dist/ssg/create-static-gen.d.ts +28 -29
  264. package/dist/ssg/create-static-gen.d.ts.map +1 -1
  265. package/dist/ssg/create-static-gen.js +282 -1
  266. package/dist/ssg/create-static-gen.js.map +1 -0
  267. package/dist/ssg/generate-metadata.d.ts +12 -15
  268. package/dist/ssg/generate-metadata.d.ts.map +1 -1
  269. package/dist/ssg/generate-metadata.js +94 -1
  270. package/dist/ssg/generate-metadata.js.map +1 -0
  271. package/dist/ssg/incremental-manifest.js +56 -1
  272. package/dist/ssg/incremental-manifest.js.map +1 -0
  273. package/dist/ssg/index.d.ts +8 -28
  274. package/dist/ssg/index.js +7 -1
  275. package/dist/ssg/resolve-ssg-data.d.ts +10 -13
  276. package/dist/ssg/resolve-ssg-data.d.ts.map +1 -1
  277. package/dist/ssg/resolve-ssg-data.js +46 -1
  278. package/dist/ssg/resolve-ssg-data.js.map +1 -0
  279. package/dist/ssg/route-utils.d.ts +14 -10
  280. package/dist/ssg/route-utils.d.ts.map +1 -1
  281. package/dist/ssg/route-utils.js +24 -1
  282. package/dist/ssg/route-utils.js.map +1 -0
  283. package/dist/ssg/types.d.ts +157 -144
  284. package/dist/ssg/types.d.ts.map +1 -1
  285. package/dist/ssg/write-static-files.d.ts +8 -14
  286. package/dist/ssg/write-static-files.d.ts.map +1 -1
  287. package/dist/ssg/write-static-files.js +73 -1
  288. package/dist/ssg/write-static-files.js.map +1 -0
  289. package/dist/ssr/attrs.js +93 -1
  290. package/dist/ssr/attrs.js.map +1 -0
  291. package/dist/ssr/context.d.ts +31 -35
  292. package/dist/ssr/context.d.ts.map +1 -1
  293. package/dist/ssr/context.js +63 -1
  294. package/dist/ssr/context.js.map +1 -0
  295. package/dist/ssr/errors.d.ts +6 -4
  296. package/dist/ssr/errors.d.ts.map +1 -1
  297. package/dist/ssr/errors.js +4 -1
  298. package/dist/ssr/errors.js.map +1 -0
  299. package/dist/ssr/escape.js +153 -1
  300. package/dist/ssr/escape.js.map +1 -0
  301. package/dist/ssr/index.d.ts +74 -72
  302. package/dist/ssr/index.d.ts.map +1 -1
  303. package/dist/ssr/index.js +543 -1
  304. package/dist/ssr/index.js.map +1 -0
  305. package/dist/ssr/render-keys.d.ts +27 -29
  306. package/dist/ssr/render-keys.d.ts.map +1 -1
  307. package/dist/ssr/render-keys.js +39 -1
  308. package/dist/ssr/render-keys.js.map +1 -0
  309. package/dist/ssr/sink.js +86 -1
  310. package/dist/ssr/sink.js.map +1 -0
  311. package/dist/ssr/stream-render.js +76 -1
  312. package/dist/ssr/stream-render.js.map +1 -0
  313. package/dist/ssr/types.d.ts +14 -13
  314. package/dist/ssr/types.d.ts.map +1 -1
  315. package/package.json +49 -69
  316. package/dist/_virtual/___vite-browser-external.js +0 -1
  317. package/dist/_virtual/__vite-browser-external.js +0 -1
  318. package/dist/_virtual/_commonjsHelpers.js +0 -1
  319. package/dist/_virtual/_fs.js +0 -1
  320. package/dist/_virtual/_path.js +0 -1
  321. package/dist/_virtual/main.js +0 -1
  322. package/dist/_virtual/preload-helper.js +0 -1
  323. package/dist/bench/benchmark-entry.d.ts +0 -14
  324. package/dist/bench/benchmark-entry.d.ts.map +0 -1
  325. package/dist/common/errors.d.ts +0 -53
  326. package/dist/common/errors.d.ts.map +0 -1
  327. package/dist/common/index.d.ts +0 -14
  328. package/dist/common/index.d.ts.map +0 -1
  329. package/dist/dev/invariant.d.ts +0 -83
  330. package/dist/dev/invariant.d.ts.map +0 -1
  331. package/dist/dev/logger.d.ts +0 -13
  332. package/dist/dev/logger.d.ts.map +0 -1
  333. package/dist/dev/vite-plugin-askr.d.ts +0 -25
  334. package/dist/dev/vite-plugin-askr.d.ts.map +0 -1
  335. package/dist/dev/warnings.d.ts +0 -5
  336. package/dist/dev/warnings.d.ts.map +0 -1
  337. package/dist/for/for.d.ts +0 -16
  338. package/dist/for/for.d.ts.map +0 -1
  339. package/dist/for/for.js +0 -1
  340. package/dist/for/index.d.ts +0 -2
  341. package/dist/for/index.d.ts.map +0 -1
  342. package/dist/for/index.js +0 -1
  343. package/dist/foundations/core.d.ts +0 -23
  344. package/dist/foundations/core.d.ts.map +0 -1
  345. package/dist/foundations/core.js +0 -1
  346. package/dist/foundations/index.d.ts.map +0 -1
  347. package/dist/foundations/interactions/dismissable.d.ts +0 -58
  348. package/dist/foundations/interactions/dismissable.d.ts.map +0 -1
  349. package/dist/foundations/interactions/dismissable.js +0 -1
  350. package/dist/foundations/interactions/focusable.d.ts +0 -16
  351. package/dist/foundations/interactions/focusable.d.ts.map +0 -1
  352. package/dist/foundations/interactions/focusable.js +0 -1
  353. package/dist/foundations/interactions/hoverable.d.ts +0 -19
  354. package/dist/foundations/interactions/hoverable.d.ts.map +0 -1
  355. package/dist/foundations/interactions/hoverable.js +0 -1
  356. package/dist/foundations/interactions/index.d.ts +0 -5
  357. package/dist/foundations/interactions/index.d.ts.map +0 -1
  358. package/dist/foundations/interactions/interaction-policy.d.ts +0 -96
  359. package/dist/foundations/interactions/interaction-policy.d.ts.map +0 -1
  360. package/dist/foundations/interactions/pressable.d.ts +0 -54
  361. package/dist/foundations/interactions/pressable.d.ts.map +0 -1
  362. package/dist/foundations/interactions/roving-focus.d.ts +0 -117
  363. package/dist/foundations/interactions/roving-focus.d.ts.map +0 -1
  364. package/dist/foundations/interactions/roving-focus.js +0 -1
  365. package/dist/foundations/state/controllable.d.ts +0 -53
  366. package/dist/foundations/state/controllable.d.ts.map +0 -1
  367. package/dist/foundations/state/controllable.js +0 -1
  368. package/dist/foundations/state/index.d.ts +0 -2
  369. package/dist/foundations/state/index.d.ts.map +0 -1
  370. package/dist/foundations/structures/index.d.ts +0 -5
  371. package/dist/foundations/structures/index.d.ts.map +0 -1
  372. package/dist/foundations/structures.d.ts.map +0 -1
  373. package/dist/foundations/utilities/aria.d.ts +0 -13
  374. package/dist/foundations/utilities/aria.d.ts.map +0 -1
  375. package/dist/foundations/utilities/compose-handlers.d.ts +0 -34
  376. package/dist/foundations/utilities/compose-handlers.d.ts.map +0 -1
  377. package/dist/foundations/utilities/event-types.d.ts +0 -17
  378. package/dist/foundations/utilities/event-types.d.ts.map +0 -1
  379. package/dist/foundations/utilities/index.d.ts +0 -7
  380. package/dist/foundations/utilities/index.d.ts.map +0 -1
  381. package/dist/foundations/utilities/merge-props.d.ts +0 -2
  382. package/dist/foundations/utilities/merge-props.d.ts.map +0 -1
  383. package/dist/foundations/utilities/use-id.d.ts +0 -29
  384. package/dist/foundations/utilities/use-id.d.ts.map +0 -1
  385. package/dist/foundations/utilities/use-id.js +0 -1
  386. package/dist/fx/index.d.ts.map +0 -1
  387. package/dist/fx/noop.d.ts +0 -12
  388. package/dist/fx/noop.d.ts.map +0 -1
  389. package/dist/index.d.ts.map +0 -1
  390. package/dist/jsx/index.d.ts.map +0 -1
  391. package/dist/jsx/jsx-dev-runtime.d.ts +0 -4
  392. package/dist/jsx/jsx-dev-runtime.d.ts.map +0 -1
  393. package/dist/jsx/jsx-runtime.d.ts +0 -10
  394. package/dist/jsx/jsx-runtime.d.ts.map +0 -1
  395. package/dist/node_modules/esbuild/lib/main.js +0 -65
  396. package/dist/renderer/cleanup.d.ts +0 -28
  397. package/dist/renderer/cleanup.d.ts.map +0 -1
  398. package/dist/renderer/dom.d.ts +0 -64
  399. package/dist/renderer/dom.d.ts.map +0 -1
  400. package/dist/renderer/evaluate.d.ts +0 -4
  401. package/dist/renderer/evaluate.d.ts.map +0 -1
  402. package/dist/renderer/fastpath.d.ts +0 -7
  403. package/dist/renderer/fastpath.d.ts.map +0 -1
  404. package/dist/renderer/index.d.ts +0 -6
  405. package/dist/renderer/index.d.ts.map +0 -1
  406. package/dist/renderer/keyed.d.ts +0 -23
  407. package/dist/renderer/keyed.d.ts.map +0 -1
  408. package/dist/renderer/reconcile.d.ts +0 -88
  409. package/dist/renderer/reconcile.d.ts.map +0 -1
  410. package/dist/renderer/types.d.ts +0 -3
  411. package/dist/renderer/types.d.ts.map +0 -1
  412. package/dist/renderer/utils.d.ts +0 -63
  413. package/dist/renderer/utils.d.ts.map +0 -1
  414. package/dist/resources/index.d.ts.map +0 -1
  415. package/dist/router/index.d.ts.map +0 -1
  416. package/dist/router/match.d.ts +0 -22
  417. package/dist/router/match.d.ts.map +0 -1
  418. package/dist/runtime/dev-namespace.d.ts +0 -31
  419. package/dist/runtime/dev-namespace.d.ts.map +0 -1
  420. package/dist/runtime/events.d.ts +0 -53
  421. package/dist/runtime/events.d.ts.map +0 -1
  422. package/dist/runtime/execution-model.d.ts +0 -4
  423. package/dist/runtime/execution-model.d.ts.map +0 -1
  424. package/dist/runtime/fastlane.d.ts +0 -27
  425. package/dist/runtime/fastlane.d.ts.map +0 -1
  426. package/dist/runtime/hydration.d.ts +0 -25
  427. package/dist/runtime/hydration.d.ts.map +0 -1
  428. package/dist/runtime/perf-metrics.d.ts +0 -25
  429. package/dist/runtime/perf-metrics.d.ts.map +0 -1
  430. package/dist/runtime/resource-cell.d.ts +0 -35
  431. package/dist/runtime/resource-cell.d.ts.map +0 -1
  432. package/dist/runtime/snapshot.d.ts +0 -25
  433. package/dist/runtime/snapshot.d.ts.map +0 -1
  434. package/dist/runtime/ssr-bridge.d.ts +0 -10
  435. package/dist/runtime/ssr-bridge.d.ts.map +0 -1
  436. package/dist/ssg/discover-resources.d.ts +0 -15
  437. package/dist/ssg/discover-resources.d.ts.map +0 -1
  438. package/dist/ssg/incremental-manifest.d.ts +0 -23
  439. package/dist/ssg/incremental-manifest.d.ts.map +0 -1
  440. package/dist/ssg/index.d.ts.map +0 -1
  441. package/dist/ssr/attrs.d.ts +0 -26
  442. package/dist/ssr/attrs.d.ts.map +0 -1
  443. package/dist/ssr/create-ssr.d.ts +0 -19
  444. package/dist/ssr/create-ssr.d.ts.map +0 -1
  445. package/dist/ssr/escape.d.ts +0 -38
  446. package/dist/ssr/escape.d.ts.map +0 -1
  447. package/dist/ssr/sink.d.ts +0 -23
  448. package/dist/ssr/sink.d.ts.map +0 -1
  449. package/dist/ssr/stream-render.d.ts +0 -7
  450. package/dist/ssr/stream-render.d.ts.map +0 -1
  451. package/dist/vite/index.js +0 -4
package/dist/fx/fx.js CHANGED
@@ -1 +1,212 @@
1
- import{globalScheduler as h}from"../runtime/scheduler.js";import{getCurrentComponentInstance as d}from"../runtime/component.js";import{logger as T}from"../dev/logger.js";import{noopEventListenerWithFlush as g,noopEventListener as F}from"./noop.js";function p(){if(d()!==null)throw new Error("[Askr] calling FX handler during render is not allowed. Move calls to event handlers or effects.")}function m(c){h.enqueue(()=>{try{c()}catch(u){T.error("[Askr] FX handler error:",u)}})}function A(c,u,e){const{leading:n=!1,trailing:o=!0}=e||{},r=d();if(r&&r.ssr)return g;let l=null,t=null,s=0;const i=function(f){p();const a=Date.now();t=f,l!==null&&(clearTimeout(l),l=null),n&&a-s>=c&&(m(()=>u.call(null,f)),s=a),o&&(l=setTimeout(()=>{t&&m(()=>u.call(null,t)),l=null,s=Date.now()},c))};return i.cancel=()=>{l!==null&&(clearTimeout(l),l=null),t=null},i.flush=()=>{if(l!==null){clearTimeout(l);const f=t;t=null,l=null,f&&m(()=>u.call(null,f))}},r&&r.cleanupFns.push(()=>{i.cancel()}),i}function C(c,u,e){const{leading:n=!0,trailing:o=!0}=e||{},r=d();if(r&&r.ssr)return F;let l=0,t=null,s=null;const i=function(f){p();const a=Date.now();if(s=f,n&&a-l>=c?(m(()=>u.call(null,f)),l=a,t!==null&&(clearTimeout(t),t=null)):!n&&l===0&&(l=a),o&&t===null){const w=c-(a-l);t=setTimeout(()=>{s&&m(()=>u.call(null,s)),l=Date.now(),t=null},Math.max(0,w))}};return i.cancel=()=>{t!==null&&(clearTimeout(t),t=null),s=null},r&&r.cleanupFns.push(()=>i.cancel()),i}function k(c){const u=d();if(u&&u.ssr)return F;let e=null,n=null;const o=()=>{e=(typeof requestAnimationFrame<"u"?requestAnimationFrame:t=>setTimeout(()=>t(Date.now()),16))(()=>{if(e=null,n){const t=n;n=null,m(()=>c.call(null,t))}})},r=function(l){p(),n=l,e===null&&o()};return r.cancel=()=>{e!==null&&(typeof cancelAnimationFrame<"u"&&typeof e=="number"?cancelAnimationFrame(e):clearTimeout(e),e=null),n=null},u&&u.cleanupFns.push(()=>r.cancel()),r}function E(c,u){p();const e=d();if(e&&e.ssr)return()=>{};let n=setTimeout(()=>{n=null,m(u)},c);const o=()=>{n!==null&&(clearTimeout(n),n=null)};return e&&e.cleanupFns.push(o),o}function q(c,u){p();const e=d();if(e&&e.ssr)return()=>{};let n=null,o=!1;typeof requestIdleCallback<"u"?(o=!0,n=requestIdleCallback(()=>{n=null,m(c)},u)):n=setTimeout(()=>{n=null,m(c)},0);const r=()=>{n!==null&&(o&&typeof cancelIdleCallback<"u"&&typeof n=="number"?cancelIdleCallback(n):clearTimeout(n),n=null)};return e&&e.cleanupFns.push(r),r}function D(c,u){p();const e=d();if(e&&e.ssr)return{cancel:()=>{}};const{maxAttempts:n=3,delayMs:o=100,backoff:r=i=>o*Math.pow(2,i)}=u||{};let l=!1;const t=i=>{l||h.enqueue(()=>{if(l)return;c().then(()=>{},()=>{if(!l&&i+1<n){const a=r(i);setTimeout(()=>{t(i+1)},a)}}).catch(a=>{T.error("[Askr] scheduleRetry error:",a)})})};t(0);const s=()=>{l=!0};return e&&e.cleanupFns.push(s),{cancel:s}}export{A as debounceEvent,k as rafEvent,q as scheduleIdle,D as scheduleRetry,E as scheduleTimeout,C as throttleEvent};
1
+ import { logger } from "../dev/logger.js";
2
+ import { globalScheduler } from "../runtime/scheduler.js";
3
+ import { getCurrentComponentInstance } from "../runtime/component.js";
4
+ import { noopEventListener, noopEventListenerWithFlush } from "./noop.js";
5
+ //#region src/fx/fx.ts
6
+ function throwIfDuringRender() {
7
+ if (getCurrentComponentInstance() !== null) throw new Error("[Askr] calling FX handler during render is not allowed. Move calls to event handlers or effects.");
8
+ }
9
+ /**
10
+ * Helper: schedule a user callback through the global scheduler
11
+ */
12
+ function enqueueUserCallback(fn) {
13
+ globalScheduler.enqueue(() => {
14
+ try {
15
+ fn();
16
+ } catch (err) {
17
+ logger.error("[Askr] FX handler error:", err);
18
+ }
19
+ });
20
+ }
21
+ function debounceEvent(ms, handler, options) {
22
+ const { leading = false, trailing = true } = options || {};
23
+ const inst = getCurrentComponentInstance();
24
+ if (inst && inst.ssr) return noopEventListenerWithFlush;
25
+ let timeoutId = null;
26
+ let lastEvent = null;
27
+ let lastCallTime = 0;
28
+ const debounced = function(ev) {
29
+ throwIfDuringRender();
30
+ const now = Date.now();
31
+ lastEvent = ev;
32
+ if (timeoutId !== null) {
33
+ clearTimeout(timeoutId);
34
+ timeoutId = null;
35
+ }
36
+ if (leading && now - lastCallTime >= ms) {
37
+ enqueueUserCallback(() => handler.call(null, ev));
38
+ lastCallTime = now;
39
+ }
40
+ if (trailing) timeoutId = setTimeout(() => {
41
+ if (lastEvent) enqueueUserCallback(() => handler.call(null, lastEvent));
42
+ timeoutId = null;
43
+ lastCallTime = Date.now();
44
+ }, ms);
45
+ };
46
+ debounced.cancel = () => {
47
+ if (timeoutId !== null) {
48
+ clearTimeout(timeoutId);
49
+ timeoutId = null;
50
+ }
51
+ lastEvent = null;
52
+ };
53
+ debounced.flush = () => {
54
+ if (timeoutId !== null) {
55
+ clearTimeout(timeoutId);
56
+ const ev = lastEvent;
57
+ lastEvent = null;
58
+ timeoutId = null;
59
+ if (ev) enqueueUserCallback(() => handler.call(null, ev));
60
+ }
61
+ };
62
+ if (inst) (inst.cleanupFns ??= []).push(() => {
63
+ debounced.cancel();
64
+ });
65
+ return debounced;
66
+ }
67
+ function throttleEvent(ms, handler, options) {
68
+ const { leading = true, trailing = true } = options || {};
69
+ const inst = getCurrentComponentInstance();
70
+ if (inst && inst.ssr) return noopEventListener;
71
+ let lastCallTime = 0;
72
+ let timeoutId = null;
73
+ let lastEvent = null;
74
+ const throttled = function(ev) {
75
+ throwIfDuringRender();
76
+ const now = Date.now();
77
+ lastEvent = ev;
78
+ if (leading && now - lastCallTime >= ms) {
79
+ enqueueUserCallback(() => handler.call(null, ev));
80
+ lastCallTime = now;
81
+ if (timeoutId !== null) {
82
+ clearTimeout(timeoutId);
83
+ timeoutId = null;
84
+ }
85
+ } else if (!leading && lastCallTime === 0) lastCallTime = now;
86
+ if (trailing && timeoutId === null) {
87
+ const wait = ms - (now - lastCallTime);
88
+ timeoutId = setTimeout(() => {
89
+ if (lastEvent) enqueueUserCallback(() => handler.call(null, lastEvent));
90
+ lastCallTime = Date.now();
91
+ timeoutId = null;
92
+ }, Math.max(0, wait));
93
+ }
94
+ };
95
+ throttled.cancel = () => {
96
+ if (timeoutId !== null) {
97
+ clearTimeout(timeoutId);
98
+ timeoutId = null;
99
+ }
100
+ lastEvent = null;
101
+ };
102
+ if (inst) (inst.cleanupFns ??= []).push(() => throttled.cancel());
103
+ return throttled;
104
+ }
105
+ function rafEvent(handler) {
106
+ const inst = getCurrentComponentInstance();
107
+ if (inst && inst.ssr) return noopEventListener;
108
+ let frameId = null;
109
+ let lastEvent = null;
110
+ const scheduleFrame = () => {
111
+ frameId = (typeof requestAnimationFrame !== "undefined" ? requestAnimationFrame : (cb) => setTimeout(() => cb(Date.now()), 16))(() => {
112
+ frameId = null;
113
+ if (lastEvent) {
114
+ const ev = lastEvent;
115
+ lastEvent = null;
116
+ enqueueUserCallback(() => handler.call(null, ev));
117
+ }
118
+ });
119
+ };
120
+ const fn = function(ev) {
121
+ throwIfDuringRender();
122
+ lastEvent = ev;
123
+ if (frameId === null) scheduleFrame();
124
+ };
125
+ fn.cancel = () => {
126
+ if (frameId !== null) {
127
+ if (typeof cancelAnimationFrame !== "undefined" && typeof frameId === "number") cancelAnimationFrame(frameId);
128
+ else clearTimeout(frameId);
129
+ frameId = null;
130
+ }
131
+ lastEvent = null;
132
+ };
133
+ if (inst) (inst.cleanupFns ??= []).push(() => fn.cancel());
134
+ return fn;
135
+ }
136
+ function scheduleTimeout(ms, fn) {
137
+ throwIfDuringRender();
138
+ const inst = getCurrentComponentInstance();
139
+ if (inst && inst.ssr) return () => {};
140
+ let id = setTimeout(() => {
141
+ id = null;
142
+ enqueueUserCallback(fn);
143
+ }, ms);
144
+ const cancel = () => {
145
+ if (id !== null) {
146
+ clearTimeout(id);
147
+ id = null;
148
+ }
149
+ };
150
+ if (inst) (inst.cleanupFns ??= []).push(cancel);
151
+ return cancel;
152
+ }
153
+ function scheduleIdle(fn, options) {
154
+ throwIfDuringRender();
155
+ const inst = getCurrentComponentInstance();
156
+ if (inst && inst.ssr) return () => {};
157
+ let id = null;
158
+ let usingRIC = false;
159
+ if (typeof requestIdleCallback !== "undefined") {
160
+ usingRIC = true;
161
+ id = requestIdleCallback(() => {
162
+ id = null;
163
+ enqueueUserCallback(fn);
164
+ }, options);
165
+ } else id = setTimeout(() => {
166
+ id = null;
167
+ enqueueUserCallback(fn);
168
+ }, 0);
169
+ const cancel = () => {
170
+ if (id !== null) {
171
+ if (usingRIC && typeof cancelIdleCallback !== "undefined" && typeof id === "number") cancelIdleCallback(id);
172
+ else clearTimeout(id);
173
+ id = null;
174
+ }
175
+ };
176
+ if (inst) (inst.cleanupFns ??= []).push(cancel);
177
+ return cancel;
178
+ }
179
+ function scheduleRetry(fn, options) {
180
+ throwIfDuringRender();
181
+ const inst = getCurrentComponentInstance();
182
+ if (inst && inst.ssr) return { cancel: () => {} };
183
+ const { maxAttempts = 3, delayMs = 100, backoff = (i) => delayMs * Math.pow(2, i) } = options || {};
184
+ let cancelled = false;
185
+ const attempt = (index) => {
186
+ if (cancelled) return;
187
+ globalScheduler.enqueue(() => {
188
+ if (cancelled) return;
189
+ fn().then(() => {}, () => {
190
+ if (cancelled) return;
191
+ if (index + 1 < maxAttempts) {
192
+ const delay = backoff(index);
193
+ setTimeout(() => {
194
+ attempt(index + 1);
195
+ }, delay);
196
+ }
197
+ }).catch((e) => {
198
+ logger.error("[Askr] scheduleRetry error:", e);
199
+ });
200
+ });
201
+ };
202
+ attempt(0);
203
+ const cancel = () => {
204
+ cancelled = true;
205
+ };
206
+ if (inst) (inst.cleanupFns ??= []).push(cancel);
207
+ return { cancel };
208
+ }
209
+ //#endregion
210
+ export { debounceEvent, rafEvent, scheduleIdle, scheduleRetry, scheduleTimeout, throttleEvent };
211
+
212
+ //# sourceMappingURL=fx.js.map
@@ -0,0 +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,7 +1,4 @@
1
- /**
2
- * Standard library pure helpers for common patterns
3
- * Zero framework coupling
4
- */
5
- export { debounce, throttle, once, defer, raf, idle, timeout, retry, type DebounceOptions, type ThrottleOptions, type RetryOptions, } from './timing';
6
- export { debounceEvent, throttleEvent, rafEvent, scheduleTimeout, scheduleIdle, scheduleRetry, } from './fx';
7
- //# sourceMappingURL=index.d.ts.map
1
+ import { scheduleEventHandler } from "../runtime/scheduler.js";
2
+ import { DebounceOptions, RetryOptions, ThrottleOptions, debounce, defer, idle, once, raf, retry, throttle, timeout } from "./timing.js";
3
+ import { debounceEvent, rafEvent, scheduleIdle, scheduleRetry, scheduleTimeout, throttleEvent } from "./fx.js";
4
+ export { type DebounceOptions, type RetryOptions, type ThrottleOptions, debounce, debounceEvent, defer, idle, once, raf, rafEvent, retry, scheduleEventHandler, scheduleIdle, scheduleRetry, scheduleTimeout, throttle, throttleEvent, timeout };
package/dist/fx/index.js CHANGED
@@ -1 +1,4 @@
1
- import{debounce as r,defer as o,idle as d,once as l,raf as u,retry as c,throttle as n,timeout as f}from"./timing.js";import{debounceEvent as m,rafEvent as i,scheduleIdle as s,scheduleRetry as v,scheduleTimeout as E,throttleEvent as a}from"./fx.js";export{r as debounce,m as debounceEvent,o as defer,d as idle,l as once,u as raf,i as rafEvent,c as retry,s as scheduleIdle,v as scheduleRetry,E as scheduleTimeout,n as throttle,a as throttleEvent,f as timeout};
1
+ import { scheduleEventHandler } from "../runtime/scheduler.js";
2
+ import { debounce, defer, idle, once, raf, retry, throttle, timeout } from "./timing.js";
3
+ import { debounceEvent, rafEvent, scheduleIdle, scheduleRetry, scheduleTimeout, throttleEvent } from "./fx.js";
4
+ export { debounce, debounceEvent, defer, idle, once, raf, rafEvent, retry, scheduleEventHandler, scheduleIdle, scheduleRetry, scheduleTimeout, throttle, throttleEvent, timeout };
package/dist/fx/noop.js CHANGED
@@ -1 +1,9 @@
1
- const e=()=>{},c=Object.assign(n=>{},{cancel(){}}),o=Object.assign(n=>{},{cancel(){},flush(){}}),s={cancel(){}};export{e as noop,s as noopCancel,c as noopEventListener,o as noopEventListenerWithFlush};
1
+ const noopEventListener = Object.assign((_ev) => {}, { cancel() {} });
2
+ const noopEventListenerWithFlush = Object.assign((_ev) => {}, {
3
+ cancel() {},
4
+ flush() {}
5
+ });
6
+ //#endregion
7
+ export { noopEventListener, noopEventListenerWithFlush };
8
+
9
+ //# sourceMappingURL=noop.js.map
@@ -0,0 +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,IAAI,EAAE,SAAS,IAAI,CAAC;AAErD,MAAa,6BAGT,OAAO,QAAQ,QAAgB,IAAI;CAAE,SAAS;CAAI,QAAQ;CAAI,CAAC"}
@@ -1,19 +1,20 @@
1
+ //#region src/fx/timing.d.ts
1
2
  /**
2
3
  * Timing utilities — pure helpers for common async patterns
3
4
  * No framework coupling. No lifecycle awareness.
4
5
  */
5
- export interface DebounceOptions {
6
- leading?: boolean;
7
- trailing?: boolean;
6
+ interface DebounceOptions {
7
+ leading?: boolean;
8
+ trailing?: boolean;
8
9
  }
9
- export interface ThrottleOptions {
10
- leading?: boolean;
11
- trailing?: boolean;
10
+ interface ThrottleOptions {
11
+ leading?: boolean;
12
+ trailing?: boolean;
12
13
  }
13
- export interface RetryOptions {
14
- maxAttempts?: number;
15
- delayMs?: number;
16
- backoff?: (attemptIndex: number) => number;
14
+ interface RetryOptions {
15
+ maxAttempts?: number;
16
+ delayMs?: number;
17
+ backoff?: (attemptIndex: number) => number;
17
18
  }
18
19
  /**
19
20
  * Debounce — delay execution, coalesce rapid calls
@@ -32,8 +33,8 @@ export interface RetryOptions {
32
33
  * save.cancel(); // stop any pending execution
33
34
  * ```
34
35
  */
35
- export declare function debounce<T extends (...args: unknown[]) => unknown>(fn: T, ms: number, options?: DebounceOptions): T & {
36
- cancel(): void;
36
+ declare function debounce<T extends (...args: unknown[]) => unknown>(fn: T, ms: number, options?: DebounceOptions): T & {
37
+ cancel(): void;
37
38
  };
38
39
  /**
39
40
  * Throttle — rate-limit execution, keep first/last
@@ -52,8 +53,8 @@ export declare function debounce<T extends (...args: unknown[]) => unknown>(fn:
52
53
  * handleScroll.cancel();
53
54
  * ```
54
55
  */
55
- export declare function throttle<T extends (...args: unknown[]) => unknown>(fn: T, ms: number, options?: ThrottleOptions): T & {
56
- cancel(): void;
56
+ declare function throttle<T extends (...args: unknown[]) => unknown>(fn: T, ms: number, options?: ThrottleOptions): T & {
57
+ cancel(): void;
57
58
  };
58
59
  /**
59
60
  * Once — guard against double execution
@@ -71,7 +72,7 @@ export declare function throttle<T extends (...args: unknown[]) => unknown>(fn:
71
72
  * init(); // does nothing
72
73
  * ```
73
74
  */
74
- export declare function once<T extends (...args: unknown[]) => unknown>(fn: T): T;
75
+ declare function once<T extends (...args: unknown[]) => unknown>(fn: T): T;
75
76
  /**
76
77
  * Defer — schedule on microtask queue
77
78
  *
@@ -85,7 +86,7 @@ export declare function once<T extends (...args: unknown[]) => unknown>(fn: T):
85
86
  * defer(() => update()); // runs after current stack, before next macrotask
86
87
  * ```
87
88
  */
88
- export declare function defer(fn: () => void): void;
89
+ declare function defer(fn: () => void): void;
89
90
  /**
90
91
  * RAF — coalesce multiple updates into single frame
91
92
  *
@@ -101,7 +102,7 @@ export declare function defer(fn: () => void): void;
101
102
  * update(); // same frame, no duplicate
102
103
  * ```
103
104
  */
104
- export declare function raf<T extends (...args: unknown[]) => unknown>(fn: T): T;
105
+ declare function raf<T extends (...args: unknown[]) => unknown>(fn: T): T;
105
106
  /**
106
107
  * Idle — schedule low-priority work
107
108
  *
@@ -116,8 +117,8 @@ export declare function raf<T extends (...args: unknown[]) => unknown>(fn: T): T
116
117
  * idle(() => prefetchData());
117
118
  * ```
118
119
  */
119
- export declare function idle(fn: () => void, options?: {
120
- timeout?: number;
120
+ declare function idle(fn: () => void, options?: {
121
+ timeout?: number;
121
122
  }): void;
122
123
  /**
123
124
  * Timeout — Promise-based delay
@@ -133,7 +134,7 @@ export declare function idle(fn: () => void, options?: {
133
134
  * console.log('300ms later');
134
135
  * ```
135
136
  */
136
- export declare function timeout(ms: number): Promise<void>;
137
+ declare function timeout(ms: number): Promise<void>;
137
138
  /**
138
139
  * Retry — attempt function with backoff
139
140
  *
@@ -151,5 +152,7 @@ export declare function timeout(ms: number): Promise<void>;
151
152
  * });
152
153
  * ```
153
154
  */
154
- export declare function retry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
155
+ declare function retry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
156
+ //#endregion
157
+ export { DebounceOptions, RetryOptions, ThrottleOptions, debounce, defer, idle, once, raf, retry, throttle, timeout };
155
158
  //# sourceMappingURL=timing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/fx/timing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;CAC5C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAChE,EAAE,EAAE,CAAC,EACL,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,eAAe,GACxB,CAAC,GAAG;IAAE,MAAM,IAAI,IAAI,CAAA;CAAE,CAuCxB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAChE,EAAE,EAAE,CAAC,EACL,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,eAAe,GACxB,CAAC,GAAG;IAAE,MAAM,IAAI,IAAI,CAAA;CAAE,CA4CxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAWxE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAE1C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAiBvE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,IAAI,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASzE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,CAAC,CAAC,CAsBZ"}
1
+ {"version":3,"file":"timing.d.ts","names":[],"sources":["../../src/fx/timing.ts"],"mappings":";;AAKA;;;UAAiB,eAAA;EACf,OAAA;EACA,QAAA;AAAA;AAAA,UAGe,eAAA;EACf,OAAA;EACA,QAAA;AAAA;AAAA,UAGe,YAAA;EACf,WAAA;EACA,OAAA;EACA,OAAA,IAAW,YAAA;AAAA;;;;;AAoBb;;;;;;;;;;;;;iBAAgB,QAAA,eAAuB,IAAA,wBAAA,CACrC,EAAA,EAAI,CAAA,EACJ,EAAA,UACA,OAAA,GAAU,eAAA,GACT,CAAA;EAAM,MAAA;AAAA;;;;AA0DT;;;;;;;;;;;;;;iBAAgB,QAAA,eAAuB,IAAA,wBAAA,CACrC,EAAA,EAAI,CAAA,EACJ,EAAA,UACA,OAAA,GAAU,eAAA,GACT,CAAA;EAAM,MAAA;AAAA;;;AA8DT;;;;;;;;;;;AA0BA;;;iBA1BgB,IAAA,eAAmB,IAAA,wBAAA,CAA6B,EAAA,EAAI,CAAA,GAAI,CAAA;;AA6CxE;;;;;;;;;;;AAiCA;iBApDgB,KAAA,CAAM,EAAA;;;;;;;;AA6EtB;;;;;AAqBA;;;iBA/EgB,GAAA,eAAkB,IAAA,wBAAA,CAA6B,EAAA,EAAI,CAAA,GAAI,CAAA;;;;;;;;;;;;;;;iBAiCvD,IAAA,CAAK,EAAA,cAAgB,OAAA;EAAY,OAAA;AAAA;;;;;;;;;;;;;;;iBAyBjC,OAAA,CAAQ,EAAA,WAAa,OAAA;;;;;;;;;;;;;;;;;;iBAqBf,KAAA,GAAA,CACpB,EAAA,QAAU,OAAA,CAAQ,CAAA,GAClB,OAAA,GAAU,YAAA,GACT,OAAA,CAAQ,CAAA"}
package/dist/fx/timing.js CHANGED
@@ -1 +1,236 @@
1
- function d(e,l,i){let t=null;const{leading:n=!1,trailing:o=!0}=i||{};let u=null,a=null,r=0;const c=function(...f){const s=Date.now();u=f,a=this,t!==null&&clearTimeout(t),n&&s-r>=l&&(e.apply(this,f),r=s),o&&(t=setTimeout(()=>{e.apply(a,u),t=null,r=Date.now()},l))};return c.cancel=()=>{t!==null&&(clearTimeout(t),t=null)},c}function h(e,l,i){let t=0,n=null;const{leading:o=!0,trailing:u=!0}=i||{};let a=null,r=null;const c=function(...f){const s=Date.now();a=f,r=this,o&&s-t>=l?(e.apply(this,f),t=s,n!==null&&(clearTimeout(n),n=null)):!o&&t===0&&(t=s),u&&n===null&&(n=setTimeout(()=>{e.apply(r,a),t=Date.now(),n=null},l-(s-t)))};return c.cancel=()=>{n!==null&&(clearTimeout(n),n=null)},c}function T(e){let l=!1,i;return((...t)=>(l||(l=!0,i=e(...t)),i))}function p(e){Promise.resolve().then(e)}function y(e){let l=null,i=null,t=null;return function(...n){i=n,t=this,l===null&&(l=requestAnimationFrame(()=>{e.apply(t,i),l=null}))}}function w(e,l){typeof requestIdleCallback<"u"?requestIdleCallback(e,l?{timeout:l.timeout}:void 0):Promise.resolve().then(()=>{setTimeout(e,0)})}function m(e){return new Promise(l=>setTimeout(l,e))}async function b(e,l){const{maxAttempts:i=3,delayMs:t=100,backoff:n=u=>t*Math.pow(2,u)}=l||{};let o=null;for(let u=0;u<i;u++)try{return await e()}catch(a){if(o=a,u<i-1){const r=n(u);await m(r)}}throw o||new Error("Retry failed")}export{d as debounce,p as defer,w as idle,T as once,y as raf,b as retry,h as throttle,m as timeout};
1
+ //#region src/fx/timing.ts
2
+ /**
3
+ * Debounce — delay execution, coalesce rapid calls
4
+ *
5
+ * Useful for: text input, resize, autosave
6
+ *
7
+ * @param fn Function to debounce
8
+ * @param ms Delay in milliseconds
9
+ * @param options trailing (default true), leading
10
+ * @returns Debounced function with cancel() method
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const save = debounce((text) => api.save(text), 500);
15
+ * input.addEventListener('input', (e) => save(e.target.value));
16
+ * save.cancel(); // stop any pending execution
17
+ * ```
18
+ */
19
+ function debounce(fn, ms, options) {
20
+ let timeoutId = null;
21
+ const { leading = false, trailing = true } = options || {};
22
+ let lastArgs = null;
23
+ let lastThis = null;
24
+ let lastCallTime = 0;
25
+ const debounced = function(...args) {
26
+ const callTime = Date.now();
27
+ lastArgs = args;
28
+ lastThis = this;
29
+ if (timeoutId !== null) clearTimeout(timeoutId);
30
+ if (leading && callTime - lastCallTime >= ms) {
31
+ fn.apply(this, args);
32
+ lastCallTime = callTime;
33
+ }
34
+ if (trailing) timeoutId = setTimeout(() => {
35
+ fn.apply(lastThis, lastArgs);
36
+ timeoutId = null;
37
+ lastCallTime = Date.now();
38
+ }, ms);
39
+ };
40
+ debounced.cancel = () => {
41
+ if (timeoutId !== null) {
42
+ clearTimeout(timeoutId);
43
+ timeoutId = null;
44
+ }
45
+ };
46
+ return debounced;
47
+ }
48
+ /**
49
+ * Throttle — rate-limit execution, keep first/last
50
+ *
51
+ * Useful for: scroll, mouse move, high-frequency events
52
+ *
53
+ * @param fn Function to throttle
54
+ * @param ms Minimum interval between calls in milliseconds
55
+ * @param options leading (default true), trailing (default true)
56
+ * @returns Throttled function with cancel() method
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * const handleScroll = throttle(updateUI, 100);
61
+ * window.addEventListener('scroll', handleScroll);
62
+ * handleScroll.cancel();
63
+ * ```
64
+ */
65
+ function throttle(fn, ms, options) {
66
+ let lastCallTime = 0;
67
+ let timeoutId = null;
68
+ const { leading = true, trailing = true } = options || {};
69
+ let lastArgs = null;
70
+ let lastThis = null;
71
+ const throttled = function(...args) {
72
+ const callTime = Date.now();
73
+ lastArgs = args;
74
+ lastThis = this;
75
+ if (leading && callTime - lastCallTime >= ms) {
76
+ fn.apply(this, args);
77
+ lastCallTime = callTime;
78
+ if (timeoutId !== null) {
79
+ clearTimeout(timeoutId);
80
+ timeoutId = null;
81
+ }
82
+ } else if (!leading && lastCallTime === 0) lastCallTime = callTime;
83
+ if (trailing && timeoutId === null) timeoutId = setTimeout(() => {
84
+ fn.apply(lastThis, lastArgs);
85
+ lastCallTime = Date.now();
86
+ timeoutId = null;
87
+ }, ms - (callTime - lastCallTime));
88
+ };
89
+ throttled.cancel = () => {
90
+ if (timeoutId !== null) {
91
+ clearTimeout(timeoutId);
92
+ timeoutId = null;
93
+ }
94
+ };
95
+ return throttled;
96
+ }
97
+ /**
98
+ * Once — guard against double execution
99
+ *
100
+ * Useful for: init logic, event safety
101
+ *
102
+ * @param fn Function to call at most once
103
+ * @returns Function that executes fn only on first call
104
+ *
105
+ * @example
106
+ * ```ts
107
+ * const init = once(setup);
108
+ * init(); // runs
109
+ * init(); // does nothing
110
+ * init(); // does nothing
111
+ * ```
112
+ */
113
+ function once(fn) {
114
+ let called = false;
115
+ let result;
116
+ return ((...args) => {
117
+ if (!called) {
118
+ called = true;
119
+ result = fn(...args);
120
+ }
121
+ return result;
122
+ });
123
+ }
124
+ /**
125
+ * Defer — schedule on microtask queue
126
+ *
127
+ * Useful for: run-after-current-stack logic
128
+ * More reliable than setTimeout(..., 0)
129
+ *
130
+ * @param fn Function to defer
131
+ *
132
+ * @example
133
+ * ```ts
134
+ * defer(() => update()); // runs after current stack, before next macrotask
135
+ * ```
136
+ */
137
+ function defer(fn) {
138
+ Promise.resolve().then(fn);
139
+ }
140
+ /**
141
+ * RAF — coalesce multiple updates into single frame
142
+ *
143
+ * Useful for: animation, layout work, render updates
144
+ *
145
+ * @param fn Function to schedule on next animation frame
146
+ * @returns Function that schedules fn on requestAnimationFrame
147
+ *
148
+ * @example
149
+ * ```ts
150
+ * const update = raf(render);
151
+ * update(); // schedules on next frame
152
+ * update(); // same frame, no duplicate
153
+ * ```
154
+ */
155
+ function raf(fn) {
156
+ let frameId = null;
157
+ let lastArgs = null;
158
+ let lastThis = null;
159
+ return function(...args) {
160
+ lastArgs = args;
161
+ lastThis = this;
162
+ if (frameId === null) frameId = requestAnimationFrame(() => {
163
+ fn.apply(lastThis, lastArgs);
164
+ frameId = null;
165
+ });
166
+ };
167
+ }
168
+ /**
169
+ * Idle — schedule low-priority work
170
+ *
171
+ * Useful for: background prep, non-urgent updates
172
+ * Falls back to setTimeout if requestIdleCallback unavailable
173
+ *
174
+ * @param fn Function to call when idle
175
+ * @param options timeout for fallback
176
+ *
177
+ * @example
178
+ * ```ts
179
+ * idle(() => prefetchData());
180
+ * ```
181
+ */
182
+ function idle(fn, options) {
183
+ if (typeof requestIdleCallback !== "undefined") requestIdleCallback(fn, options ? { timeout: options.timeout } : void 0);
184
+ else Promise.resolve().then(() => {
185
+ setTimeout(fn, 0);
186
+ });
187
+ }
188
+ /**
189
+ * Timeout — Promise-based delay
190
+ *
191
+ * Useful for: readable async code, waiting between retries
192
+ *
193
+ * @param ms Milliseconds to wait
194
+ * @returns Promise that resolves after delay
195
+ *
196
+ * @example
197
+ * ```ts
198
+ * await timeout(300);
199
+ * console.log('300ms later');
200
+ * ```
201
+ */
202
+ function timeout(ms) {
203
+ return new Promise((resolve) => setTimeout(resolve, ms));
204
+ }
205
+ /**
206
+ * Retry — attempt function with backoff
207
+ *
208
+ * Useful for: network calls, transient failures
209
+ *
210
+ * @param fn Async function to retry
211
+ * @param options maxAttempts, delayMs, backoff function
212
+ * @returns Promise with final result or error
213
+ *
214
+ * @example
215
+ * ```ts
216
+ * const data = await retry(() => fetch(url), {
217
+ * maxAttempts: 3,
218
+ * delayMs: 100,
219
+ * });
220
+ * ```
221
+ */
222
+ async function retry(fn, options) {
223
+ const { maxAttempts = 3, delayMs = 100, backoff = (i) => delayMs * Math.pow(2, i) } = options || {};
224
+ let lastError = null;
225
+ for (let attempt = 0; attempt < maxAttempts; attempt++) try {
226
+ return await fn();
227
+ } catch (error) {
228
+ lastError = error;
229
+ if (attempt < maxAttempts - 1) await timeout(backoff(attempt));
230
+ }
231
+ throw lastError || /* @__PURE__ */ new Error("Retry failed");
232
+ }
233
+ //#endregion
234
+ export { debounce, defer, idle, once, raf, retry, throttle, timeout };
235
+
236
+ //# sourceMappingURL=timing.js.map
@@ -0,0 +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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"}