@bquery/bquery 1.5.0 → 1.7.0

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 (380) hide show
  1. package/README.md +193 -23
  2. package/dist/a11y/announce.d.ts +43 -0
  3. package/dist/a11y/announce.d.ts.map +1 -0
  4. package/dist/a11y/audit.d.ts +42 -0
  5. package/dist/a11y/audit.d.ts.map +1 -0
  6. package/dist/a11y/index.d.ts +53 -0
  7. package/dist/a11y/index.d.ts.map +1 -0
  8. package/dist/a11y/media-preferences.d.ts +77 -0
  9. package/dist/a11y/media-preferences.d.ts.map +1 -0
  10. package/dist/a11y/roving-tab-index.d.ts +38 -0
  11. package/dist/a11y/roving-tab-index.d.ts.map +1 -0
  12. package/dist/a11y/skip-link.d.ts +37 -0
  13. package/dist/a11y/skip-link.d.ts.map +1 -0
  14. package/dist/a11y/trap-focus.d.ts +49 -0
  15. package/dist/a11y/trap-focus.d.ts.map +1 -0
  16. package/dist/a11y/types.d.ts +152 -0
  17. package/dist/a11y/types.d.ts.map +1 -0
  18. package/dist/a11y-C5QOVvRn.js +421 -0
  19. package/dist/a11y-C5QOVvRn.js.map +1 -0
  20. package/dist/a11y.es.mjs +14 -0
  21. package/dist/component/component.d.ts +13 -5
  22. package/dist/component/component.d.ts.map +1 -1
  23. package/dist/component/html.d.ts +40 -3
  24. package/dist/component/html.d.ts.map +1 -1
  25. package/dist/component/index.d.ts +3 -2
  26. package/dist/component/index.d.ts.map +1 -1
  27. package/dist/component/library.d.ts.map +1 -1
  28. package/dist/component/scope.d.ts +138 -0
  29. package/dist/component/scope.d.ts.map +1 -0
  30. package/dist/component/types.d.ts +184 -17
  31. package/dist/component/types.d.ts.map +1 -1
  32. package/dist/component-CuuTijA6.js +684 -0
  33. package/dist/component-CuuTijA6.js.map +1 -0
  34. package/dist/component.es.mjs +10 -6
  35. package/dist/{config-DRmZZno3.js → config-BW35FKuA.js} +4 -4
  36. package/dist/config-BW35FKuA.js.map +1 -0
  37. package/dist/constraints-3lV9yyBw.js +100 -0
  38. package/dist/constraints-3lV9yyBw.js.map +1 -0
  39. package/dist/core/collection.d.ts +48 -0
  40. package/dist/core/collection.d.ts.map +1 -1
  41. package/dist/core/element.d.ts +92 -0
  42. package/dist/core/element.d.ts.map +1 -1
  43. package/dist/core/env.d.ts +18 -0
  44. package/dist/core/env.d.ts.map +1 -0
  45. package/dist/core/index.d.ts +1 -0
  46. package/dist/core/index.d.ts.map +1 -1
  47. package/dist/core/shared.d.ts +8 -0
  48. package/dist/core/shared.d.ts.map +1 -1
  49. package/dist/core/utils/index.d.ts +52 -41
  50. package/dist/core/utils/index.d.ts.map +1 -1
  51. package/dist/core-Cjl7GUu8.js +717 -0
  52. package/dist/core-Cjl7GUu8.js.map +1 -0
  53. package/dist/{core-DPdbItcq.js → core-DnlyjbF2.js} +1 -1
  54. package/dist/{core-DPdbItcq.js.map → core-DnlyjbF2.js.map} +1 -1
  55. package/dist/core.es.mjs +45 -44
  56. package/dist/custom-directives-7wAShnnd.js +9 -0
  57. package/dist/custom-directives-7wAShnnd.js.map +1 -0
  58. package/dist/devtools/devtools.d.ts +212 -0
  59. package/dist/devtools/devtools.d.ts.map +1 -0
  60. package/dist/devtools/index.d.ts +20 -0
  61. package/dist/devtools/index.d.ts.map +1 -0
  62. package/dist/devtools/types.d.ts +69 -0
  63. package/dist/devtools/types.d.ts.map +1 -0
  64. package/dist/devtools-D2fQLhDN.js +122 -0
  65. package/dist/devtools-D2fQLhDN.js.map +1 -0
  66. package/dist/devtools.es.mjs +19 -0
  67. package/dist/dnd/draggable.d.ts +51 -0
  68. package/dist/dnd/draggable.d.ts.map +1 -0
  69. package/dist/dnd/droppable.d.ts +38 -0
  70. package/dist/dnd/droppable.d.ts.map +1 -0
  71. package/dist/dnd/index.d.ts +47 -0
  72. package/dist/dnd/index.d.ts.map +1 -0
  73. package/dist/dnd/sortable.d.ts +43 -0
  74. package/dist/dnd/sortable.d.ts.map +1 -0
  75. package/dist/dnd/types.d.ts +250 -0
  76. package/dist/dnd/types.d.ts.map +1 -0
  77. package/dist/dnd-B8EgyzaI.js +244 -0
  78. package/dist/dnd-B8EgyzaI.js.map +1 -0
  79. package/dist/dnd.es.mjs +6 -0
  80. package/dist/env-NeVmr4Gf.js +19 -0
  81. package/dist/env-NeVmr4Gf.js.map +1 -0
  82. package/dist/forms/create-form.d.ts +49 -0
  83. package/dist/forms/create-form.d.ts.map +1 -0
  84. package/dist/forms/index.d.ts +39 -0
  85. package/dist/forms/index.d.ts.map +1 -0
  86. package/dist/forms/types.d.ts +139 -0
  87. package/dist/forms/types.d.ts.map +1 -0
  88. package/dist/forms/validators.d.ts +179 -0
  89. package/dist/forms/validators.d.ts.map +1 -0
  90. package/dist/forms-C3yovgH9.js +141 -0
  91. package/dist/forms-C3yovgH9.js.map +1 -0
  92. package/dist/forms.es.mjs +14 -0
  93. package/dist/full.d.ts +37 -9
  94. package/dist/full.d.ts.map +1 -1
  95. package/dist/full.es.mjs +186 -91
  96. package/dist/full.iife.js +47 -31
  97. package/dist/full.iife.js.map +1 -1
  98. package/dist/full.umd.js +47 -31
  99. package/dist/full.umd.js.map +1 -1
  100. package/dist/i18n/formatting.d.ts +40 -0
  101. package/dist/i18n/formatting.d.ts.map +1 -0
  102. package/dist/i18n/i18n.d.ts +48 -0
  103. package/dist/i18n/i18n.d.ts.map +1 -0
  104. package/dist/i18n/index.d.ts +57 -0
  105. package/dist/i18n/index.d.ts.map +1 -0
  106. package/dist/i18n/translate.d.ts +83 -0
  107. package/dist/i18n/translate.d.ts.map +1 -0
  108. package/dist/i18n/types.d.ts +156 -0
  109. package/dist/i18n/types.d.ts.map +1 -0
  110. package/dist/i18n-BnnhTFOS.js +89 -0
  111. package/dist/i18n-BnnhTFOS.js.map +1 -0
  112. package/dist/i18n.es.mjs +6 -0
  113. package/dist/index.d.ts +11 -0
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.es.mjs +233 -138
  116. package/dist/media/battery.d.ts +35 -0
  117. package/dist/media/battery.d.ts.map +1 -0
  118. package/dist/media/breakpoints.d.ts +51 -0
  119. package/dist/media/breakpoints.d.ts.map +1 -0
  120. package/dist/media/clipboard.d.ts +30 -0
  121. package/dist/media/clipboard.d.ts.map +1 -0
  122. package/dist/media/device-sensors.d.ts +54 -0
  123. package/dist/media/device-sensors.d.ts.map +1 -0
  124. package/dist/media/geolocation.d.ts +38 -0
  125. package/dist/media/geolocation.d.ts.map +1 -0
  126. package/dist/media/index.d.ts +42 -0
  127. package/dist/media/index.d.ts.map +1 -0
  128. package/dist/media/media-query.d.ts +36 -0
  129. package/dist/media/media-query.d.ts.map +1 -0
  130. package/dist/media/network.d.ts +35 -0
  131. package/dist/media/network.d.ts.map +1 -0
  132. package/dist/media/types.d.ts +173 -0
  133. package/dist/media/types.d.ts.map +1 -0
  134. package/dist/media/viewport.d.ts +32 -0
  135. package/dist/media/viewport.d.ts.map +1 -0
  136. package/dist/media-Di2Ta22s.js +340 -0
  137. package/dist/media-Di2Ta22s.js.map +1 -0
  138. package/dist/media.es.mjs +12 -0
  139. package/dist/motion/index.d.ts +7 -3
  140. package/dist/motion/index.d.ts.map +1 -1
  141. package/dist/motion/morph.d.ts +27 -0
  142. package/dist/motion/morph.d.ts.map +1 -0
  143. package/dist/motion/parallax.d.ts +30 -0
  144. package/dist/motion/parallax.d.ts.map +1 -0
  145. package/dist/motion/reduced-motion.d.ts +36 -3
  146. package/dist/motion/reduced-motion.d.ts.map +1 -1
  147. package/dist/motion/types.d.ts +58 -0
  148. package/dist/motion/types.d.ts.map +1 -1
  149. package/dist/motion/typewriter.d.ts +31 -0
  150. package/dist/motion/typewriter.d.ts.map +1 -0
  151. package/dist/motion-qPj_TYGv.js +530 -0
  152. package/dist/motion-qPj_TYGv.js.map +1 -0
  153. package/dist/motion.es.mjs +27 -23
  154. package/dist/mount-SM07RUa6.js +403 -0
  155. package/dist/mount-SM07RUa6.js.map +1 -0
  156. package/dist/{object-qGpWr6-J.js → object-BCk-1c8T.js} +5 -4
  157. package/dist/{object-qGpWr6-J.js.map → object-BCk-1c8T.js.map} +1 -1
  158. package/dist/{platform-B7JhGBc7.js → platform-CPbCprb6.js} +3 -3
  159. package/dist/platform-CPbCprb6.js.map +1 -0
  160. package/dist/platform.es.mjs +2 -2
  161. package/dist/plugin/index.d.ts +22 -0
  162. package/dist/plugin/index.d.ts.map +1 -0
  163. package/dist/plugin/registry.d.ts +108 -0
  164. package/dist/plugin/registry.d.ts.map +1 -0
  165. package/dist/plugin/types.d.ts +110 -0
  166. package/dist/plugin/types.d.ts.map +1 -0
  167. package/dist/plugin-cPoOHFLY.js +64 -0
  168. package/dist/plugin-cPoOHFLY.js.map +1 -0
  169. package/dist/plugin.es.mjs +9 -0
  170. package/dist/reactive/computed.d.ts +7 -0
  171. package/dist/reactive/computed.d.ts.map +1 -1
  172. package/dist/reactive-Cfv0RK6x.js +233 -0
  173. package/dist/reactive-Cfv0RK6x.js.map +1 -0
  174. package/dist/reactive.es.mjs +18 -17
  175. package/dist/registry-CWf368tT.js +26 -0
  176. package/dist/registry-CWf368tT.js.map +1 -0
  177. package/dist/router/bq-link.d.ts +112 -0
  178. package/dist/router/bq-link.d.ts.map +1 -0
  179. package/dist/router/constraints.d.ts +9 -0
  180. package/dist/router/constraints.d.ts.map +1 -0
  181. package/dist/router/index.d.ts +14 -6
  182. package/dist/router/index.d.ts.map +1 -1
  183. package/dist/router/match.d.ts +0 -1
  184. package/dist/router/match.d.ts.map +1 -1
  185. package/dist/router/path-pattern.d.ts +14 -0
  186. package/dist/router/path-pattern.d.ts.map +1 -0
  187. package/dist/router/query.d.ts.map +1 -1
  188. package/dist/router/router.d.ts +3 -1
  189. package/dist/router/router.d.ts.map +1 -1
  190. package/dist/router/types.d.ts +48 -4
  191. package/dist/router/types.d.ts.map +1 -1
  192. package/dist/router/use-route.d.ts +50 -0
  193. package/dist/router/use-route.d.ts.map +1 -0
  194. package/dist/router/utils.d.ts +3 -0
  195. package/dist/router/utils.d.ts.map +1 -1
  196. package/dist/router-BrthaP_z.js +473 -0
  197. package/dist/router-BrthaP_z.js.map +1 -0
  198. package/dist/router.es.mjs +13 -10
  199. package/dist/{sanitize-jyJ2ryE2.js → sanitize-B1V4JswB.js} +95 -83
  200. package/dist/sanitize-B1V4JswB.js.map +1 -0
  201. package/dist/security/index.d.ts +2 -0
  202. package/dist/security/index.d.ts.map +1 -1
  203. package/dist/security/sanitize.d.ts +4 -1
  204. package/dist/security/sanitize.d.ts.map +1 -1
  205. package/dist/security/trusted-html.d.ts +53 -0
  206. package/dist/security/trusted-html.d.ts.map +1 -0
  207. package/dist/security.es.mjs +10 -9
  208. package/dist/ssr/hydrate.d.ts +65 -0
  209. package/dist/ssr/hydrate.d.ts.map +1 -0
  210. package/dist/ssr/index.d.ts +59 -0
  211. package/dist/ssr/index.d.ts.map +1 -0
  212. package/dist/ssr/render.d.ts +62 -0
  213. package/dist/ssr/render.d.ts.map +1 -0
  214. package/dist/ssr/serialize.d.ts +118 -0
  215. package/dist/ssr/serialize.d.ts.map +1 -0
  216. package/dist/ssr/types.d.ts +70 -0
  217. package/dist/ssr/types.d.ts.map +1 -0
  218. package/dist/ssr-B2qd_WBB.js +248 -0
  219. package/dist/ssr-B2qd_WBB.js.map +1 -0
  220. package/dist/ssr.es.mjs +9 -0
  221. package/dist/store/create-store.d.ts.map +1 -1
  222. package/dist/store/define-store.d.ts +1 -1
  223. package/dist/store/define-store.d.ts.map +1 -1
  224. package/dist/store/index.d.ts +1 -1
  225. package/dist/store/index.d.ts.map +1 -1
  226. package/dist/store/mapping.d.ts +1 -1
  227. package/dist/store/mapping.d.ts.map +1 -1
  228. package/dist/store/persisted.d.ts +38 -4
  229. package/dist/store/persisted.d.ts.map +1 -1
  230. package/dist/store/types.d.ts +140 -3
  231. package/dist/store/types.d.ts.map +1 -1
  232. package/dist/store/utils.d.ts +2 -2
  233. package/dist/store/utils.d.ts.map +1 -1
  234. package/dist/store/watch.d.ts +1 -1
  235. package/dist/store/watch.d.ts.map +1 -1
  236. package/dist/store-DWpyH6p5.js +338 -0
  237. package/dist/store-DWpyH6p5.js.map +1 -0
  238. package/dist/store.es.mjs +11 -10
  239. package/dist/storybook/index.d.ts +37 -0
  240. package/dist/storybook/index.d.ts.map +1 -0
  241. package/dist/storybook.es.mjs +151 -0
  242. package/dist/storybook.es.mjs.map +1 -0
  243. package/dist/testing/index.d.ts +23 -0
  244. package/dist/testing/index.d.ts.map +1 -0
  245. package/dist/testing/testing.d.ts +156 -0
  246. package/dist/testing/testing.d.ts.map +1 -0
  247. package/dist/testing/types.d.ts +134 -0
  248. package/dist/testing/types.d.ts.map +1 -0
  249. package/dist/testing-CsqjNUyy.js +224 -0
  250. package/dist/testing-CsqjNUyy.js.map +1 -0
  251. package/dist/testing.es.mjs +9 -0
  252. package/dist/type-guards-Do9DWgNp.js +44 -0
  253. package/dist/type-guards-Do9DWgNp.js.map +1 -0
  254. package/dist/untrack-DJVQQ2WM.js +33 -0
  255. package/dist/untrack-DJVQQ2WM.js.map +1 -0
  256. package/dist/view/custom-directives.d.ts +20 -0
  257. package/dist/view/custom-directives.d.ts.map +1 -0
  258. package/dist/view/evaluate.d.ts.map +1 -1
  259. package/dist/view/process.d.ts.map +1 -1
  260. package/dist/view.es.mjs +11 -10
  261. package/package.json +52 -11
  262. package/src/a11y/announce.ts +131 -0
  263. package/src/a11y/audit.ts +314 -0
  264. package/src/a11y/index.ts +68 -0
  265. package/src/a11y/media-preferences.ts +255 -0
  266. package/src/a11y/roving-tab-index.ts +164 -0
  267. package/src/a11y/skip-link.ts +255 -0
  268. package/src/a11y/trap-focus.ts +184 -0
  269. package/src/a11y/types.ts +183 -0
  270. package/src/component/component.ts +345 -65
  271. package/src/component/html.ts +153 -53
  272. package/src/component/index.ts +12 -2
  273. package/src/component/library.ts +66 -28
  274. package/src/component/scope.ts +212 -0
  275. package/src/component/types.ts +238 -19
  276. package/src/core/collection.ts +707 -628
  277. package/src/core/element.ts +981 -774
  278. package/src/core/env.ts +60 -0
  279. package/src/core/index.ts +49 -48
  280. package/src/core/shared.ts +62 -13
  281. package/src/core/utils/index.ts +148 -83
  282. package/src/devtools/devtools.ts +410 -0
  283. package/src/devtools/index.ts +48 -0
  284. package/src/devtools/types.ts +104 -0
  285. package/src/dnd/draggable.ts +296 -0
  286. package/src/dnd/droppable.ts +228 -0
  287. package/src/dnd/index.ts +62 -0
  288. package/src/dnd/sortable.ts +307 -0
  289. package/src/dnd/types.ts +293 -0
  290. package/src/forms/create-form.ts +278 -0
  291. package/src/forms/index.ts +65 -0
  292. package/src/forms/types.ts +154 -0
  293. package/src/forms/validators.ts +265 -0
  294. package/src/full.ts +260 -3
  295. package/src/i18n/formatting.ts +67 -0
  296. package/src/i18n/i18n.ts +200 -0
  297. package/src/i18n/index.ts +67 -0
  298. package/src/i18n/translate.ts +182 -0
  299. package/src/i18n/types.ts +171 -0
  300. package/src/index.ts +108 -36
  301. package/src/media/battery.ts +116 -0
  302. package/src/media/breakpoints.ts +131 -0
  303. package/src/media/clipboard.ts +80 -0
  304. package/src/media/device-sensors.ts +158 -0
  305. package/src/media/geolocation.ts +119 -0
  306. package/src/media/index.ts +76 -0
  307. package/src/media/media-query.ts +92 -0
  308. package/src/media/network.ts +115 -0
  309. package/src/media/types.ts +177 -0
  310. package/src/media/viewport.ts +84 -0
  311. package/src/motion/index.ts +57 -48
  312. package/src/motion/morph.ts +151 -0
  313. package/src/motion/parallax.ts +120 -0
  314. package/src/motion/reduced-motion.ts +66 -17
  315. package/src/motion/transition.ts +97 -97
  316. package/src/motion/types.ts +63 -0
  317. package/src/motion/typewriter.ts +164 -0
  318. package/src/platform/announcer.ts +208 -208
  319. package/src/platform/config.ts +163 -163
  320. package/src/platform/cookies.ts +165 -165
  321. package/src/platform/index.ts +39 -39
  322. package/src/platform/meta.ts +168 -168
  323. package/src/plugin/index.ts +37 -0
  324. package/src/plugin/registry.ts +269 -0
  325. package/src/plugin/types.ts +137 -0
  326. package/src/reactive/async-data.ts +486 -486
  327. package/src/reactive/computed.ts +130 -92
  328. package/src/reactive/index.ts +37 -37
  329. package/src/reactive/signal.ts +29 -29
  330. package/src/router/bq-link.ts +279 -0
  331. package/src/router/constraints.ts +201 -0
  332. package/src/router/index.ts +49 -41
  333. package/src/router/match.ts +312 -106
  334. package/src/router/path-pattern.ts +52 -0
  335. package/src/router/query.ts +38 -35
  336. package/src/router/router.ts +402 -211
  337. package/src/router/types.ts +139 -93
  338. package/src/router/use-route.ts +68 -0
  339. package/src/router/utils.ts +157 -116
  340. package/src/security/constants.ts +211 -211
  341. package/src/security/index.ts +12 -10
  342. package/src/security/sanitize.ts +6 -2
  343. package/src/security/trusted-html.ts +71 -0
  344. package/src/ssr/hydrate.ts +82 -0
  345. package/src/ssr/index.ts +70 -0
  346. package/src/ssr/render.ts +508 -0
  347. package/src/ssr/serialize.ts +296 -0
  348. package/src/ssr/types.ts +81 -0
  349. package/src/store/create-store.ts +467 -329
  350. package/src/store/define-store.ts +2 -1
  351. package/src/store/index.ts +27 -22
  352. package/src/store/mapping.ts +2 -1
  353. package/src/store/persisted.ts +249 -61
  354. package/src/store/types.ts +247 -94
  355. package/src/store/utils.ts +135 -141
  356. package/src/store/watch.ts +2 -1
  357. package/src/storybook/index.ts +480 -0
  358. package/src/testing/index.ts +42 -0
  359. package/src/testing/testing.ts +593 -0
  360. package/src/testing/types.ts +170 -0
  361. package/src/view/custom-directives.ts +30 -0
  362. package/src/view/evaluate.ts +292 -290
  363. package/src/view/process.ts +108 -92
  364. package/dist/component-CY5MVoYN.js +0 -531
  365. package/dist/component-CY5MVoYN.js.map +0 -1
  366. package/dist/config-DRmZZno3.js.map +0 -1
  367. package/dist/core-CK2Mfpf4.js +0 -648
  368. package/dist/core-CK2Mfpf4.js.map +0 -1
  369. package/dist/motion-C5DRdPnO.js +0 -415
  370. package/dist/motion-C5DRdPnO.js.map +0 -1
  371. package/dist/platform-B7JhGBc7.js.map +0 -1
  372. package/dist/reactive-BDya-ia8.js +0 -253
  373. package/dist/reactive-BDya-ia8.js.map +0 -1
  374. package/dist/router-CijiICxt.js +0 -188
  375. package/dist/router-CijiICxt.js.map +0 -1
  376. package/dist/sanitize-jyJ2ryE2.js.map +0 -1
  377. package/dist/store-CPK9E62U.js +0 -262
  378. package/dist/store-CPK9E62U.js.map +0 -1
  379. package/dist/view-Cdi0g-qo.js +0 -396
  380. package/dist/view-Cdi0g-qo.js.map +0 -1
@@ -0,0 +1,233 @@
1
+ import { a as R } from "./object-BCk-1c8T.js";
2
+ import { i as E, n as v, o as q, r as g, t as k } from "./core-DnlyjbF2.js";
3
+ import { n as U } from "./config-BW35FKuA.js";
4
+ import { n as B, r as b, t as S } from "./untrack-DJVQQ2WM.js";
5
+ var F = (e) => {
6
+ E();
7
+ try {
8
+ e();
9
+ } finally {
10
+ q();
11
+ }
12
+ }, I = (e) => {
13
+ if (e instanceof Error) return e;
14
+ if (typeof e == "string") return new Error(e);
15
+ try {
16
+ return new Error(JSON.stringify(e));
17
+ } catch {
18
+ return new Error(String(e));
19
+ }
20
+ }, O = (e) => typeof e == "function" ? e() : e.value, p = (...e) => {
21
+ const t = new Headers();
22
+ for (const a of e)
23
+ a && new Headers(a).forEach((r, s) => {
24
+ t.set(s, r);
25
+ });
26
+ return t;
27
+ }, x = (e) => typeof e == "string" || e instanceof Blob || e instanceof FormData || e instanceof URLSearchParams || typeof ArrayBuffer < "u" && e instanceof ArrayBuffer || typeof ReadableStream < "u" && e instanceof ReadableStream ? !0 : typeof e == "object" && e !== null && ArrayBuffer.isView(e), _ = (e, t) => e == null || x(e) ? e : (t.has("content-type") || t.set("content-type", "application/json"), JSON.stringify(e)), L = (e) => typeof e == "function" ? e() : e, A = (e, t) => {
28
+ for (const [a, r] of Object.entries(t))
29
+ if (r != null) {
30
+ if (Array.isArray(r)) {
31
+ for (const s of r) s != null && e.searchParams.append(a, String(s));
32
+ continue;
33
+ }
34
+ e.searchParams.set(a, String(r));
35
+ }
36
+ }, M = (e, t) => {
37
+ const a = typeof window < "u" && /^https?:/i.test(window.location.href) ? window.location.href : "http://localhost", r = t ? new URL(t, a).toString() : a;
38
+ return e instanceof URL ? new URL(e.toString(), r) : new URL(e, r);
39
+ }, j = async (e, t) => {
40
+ if (t === "response") return e;
41
+ if (t === "text") return await e.text();
42
+ if (t === "blob") return await e.blob();
43
+ if (t === "arrayBuffer") return await e.arrayBuffer();
44
+ if (t === "formData") return await e.formData();
45
+ const a = await e.text();
46
+ if (a)
47
+ try {
48
+ return JSON.parse(a);
49
+ } catch (r) {
50
+ const s = e.url ? ` for ${e.url}` : "";
51
+ throw new Error(`Failed to parse JSON response${s} (status ${e.status}): ${r instanceof Error ? r.message : String(r)}`);
52
+ }
53
+ }, w = (e) => {
54
+ const t = e?.trim();
55
+ return t ? t.toUpperCase() : void 0;
56
+ }, D = (e, t, a) => {
57
+ const r = t instanceof Request ? w(t.method) : void 0;
58
+ return e ?? r ?? (a ? "POST" : void 0);
59
+ }, P = (e, t, a) => e || (t instanceof Request ? void 0 : a), T = (e) => {
60
+ const t = w(e.method);
61
+ let a;
62
+ if (t !== "GET" && t !== "HEAD" && !e.bodyUsed) try {
63
+ a = e.clone().body ?? void 0;
64
+ } catch {
65
+ a = void 0;
66
+ }
67
+ return {
68
+ method: t,
69
+ headers: e.headers,
70
+ body: a,
71
+ cache: e.cache,
72
+ credentials: e.credentials,
73
+ integrity: e.integrity,
74
+ keepalive: e.keepalive,
75
+ mode: e.mode,
76
+ redirect: e.redirect,
77
+ referrer: e.referrer,
78
+ referrerPolicy: e.referrerPolicy,
79
+ signal: e.signal
80
+ };
81
+ }, V = (e, t = {}) => {
82
+ const a = t.immediate ?? !0, r = v(t.defaultValue), s = v(null), n = v("idle"), o = b(() => n.value === "pending");
83
+ let c = 0, f = !1, y = () => {
84
+ };
85
+ const h = () => {
86
+ c += 1, r.value = t.defaultValue, s.value = null, n.value = "idle";
87
+ }, m = () => {
88
+ f || (f = !0, c += 1, y());
89
+ }, d = async () => {
90
+ if (f) return r.peek();
91
+ const i = ++c;
92
+ n.value = "pending", s.value = null;
93
+ try {
94
+ const l = await e(), u = t.transform ? t.transform(l) : l;
95
+ return f || i !== c ? r.peek() : (r.value = u, n.value = "success", t.onSuccess?.(u), u);
96
+ } catch (l) {
97
+ const u = I(l);
98
+ return f || i !== c || (s.value = u, n.value = "error", t.onError?.(u)), r.peek();
99
+ }
100
+ };
101
+ if (t.watch?.length) {
102
+ let i = !1;
103
+ y = g(() => {
104
+ for (const l of t.watch ?? []) O(l);
105
+ if (!i) {
106
+ i = !0, a && S(() => d());
107
+ return;
108
+ }
109
+ S(() => d());
110
+ });
111
+ } else a && d();
112
+ return {
113
+ data: r,
114
+ error: s,
115
+ status: n,
116
+ pending: o,
117
+ execute: d,
118
+ refresh: d,
119
+ clear: h,
120
+ dispose: m
121
+ };
122
+ }, $ = (e, t = {}) => {
123
+ const a = U().fetch, r = t.parseAs ?? a?.parseAs ?? "json", s = t.fetcher ?? fetch;
124
+ return V(async () => {
125
+ const n = L(e), o = typeof n == "string" || n instanceof URL ? M(n, t.baseUrl ?? a?.baseUrl) : n instanceof Request && t.query ? new URL(n.url) : null;
126
+ o && t.query && A(o, t.query);
127
+ const c = p(a?.headers, n instanceof Request ? n.headers : void 0, t.headers), f = t.body != null, y = w(t.method), h = D(y, n, f), m = h === "GET" || h === "HEAD" ? h : null;
128
+ if (f && m) throw new Error(`Cannot send a request body with ${m} requests`);
129
+ const d = P(y, n, h), i = {
130
+ ...t,
131
+ method: d,
132
+ headers: c,
133
+ body: _(t.body, c)
134
+ };
135
+ delete i.baseUrl, delete i.query, delete i.parseAs, delete i.fetcher, delete i.defaultValue, delete i.immediate, delete i.watch, delete i.transform, delete i.onSuccess, delete i.onError;
136
+ let l = o ?? n;
137
+ n instanceof Request && o && o.toString() !== n.url && (l = new Request(o.toString(), T(n)));
138
+ const u = await s(l, i);
139
+ if (!u.ok) throw Object.assign(/* @__PURE__ */ new Error(`Request failed with status ${u.status}`), {
140
+ response: u,
141
+ status: u.status,
142
+ statusText: u.statusText
143
+ });
144
+ return j(u, r);
145
+ }, t);
146
+ };
147
+ function H(e = {}) {
148
+ return (t, a = {}) => {
149
+ const r = e, s = R({}, r.query ?? {}, a.query ?? {});
150
+ return $(t, {
151
+ ...r,
152
+ ...a,
153
+ headers: p(r.headers, a.headers),
154
+ query: Object.keys(s).length > 0 ? s : void 0
155
+ });
156
+ };
157
+ }
158
+ var G = (e, t) => {
159
+ const a = b(e);
160
+ return {
161
+ get value() {
162
+ return a.value;
163
+ },
164
+ set value(r) {
165
+ t(r);
166
+ },
167
+ peek() {
168
+ return a.peek();
169
+ }
170
+ };
171
+ }, Q = (e, t) => {
172
+ let a = !1, r = null;
173
+ try {
174
+ if (r = globalThis.localStorage, r) {
175
+ const o = `__bquery_test_${Math.random().toString(36).slice(2, 9)}__`, c = "__test__";
176
+ try {
177
+ r.setItem(o, c), r.getItem(o), a = !0;
178
+ } finally {
179
+ try {
180
+ r.removeItem(o);
181
+ } catch {
182
+ }
183
+ }
184
+ }
185
+ } catch {
186
+ a = !1;
187
+ }
188
+ let s = t;
189
+ if (a && r) try {
190
+ const o = r.getItem(e);
191
+ o !== null && (s = JSON.parse(o));
192
+ } catch {
193
+ }
194
+ const n = v(s);
195
+ return a && r && g(() => {
196
+ try {
197
+ r.setItem(e, JSON.stringify(n.value));
198
+ } catch {
199
+ }
200
+ }), n;
201
+ }, W = (e) => ({
202
+ get value() {
203
+ return e.value;
204
+ },
205
+ peek() {
206
+ return e.peek();
207
+ }
208
+ }), K = (e) => e instanceof k, X = (e) => e instanceof B, Y = (e, t, a = {}) => {
209
+ const { immediate: r = !1, equals: s = Object.is } = a;
210
+ let n, o = !0;
211
+ return g(() => {
212
+ const c = e.value;
213
+ if (o) {
214
+ o = !1, n = c, r && t(c, void 0);
215
+ return;
216
+ }
217
+ s(c, n) || (t(c, n), n = c);
218
+ });
219
+ };
220
+ export {
221
+ Q as a,
222
+ V as c,
223
+ W as i,
224
+ $ as l,
225
+ X as n,
226
+ G as o,
227
+ K as r,
228
+ H as s,
229
+ Y as t,
230
+ F as u
231
+ };
232
+
233
+ //# sourceMappingURL=reactive-Cfv0RK6x.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive-Cfv0RK6x.js","names":[],"sources":["../src/reactive/batch.ts","../src/reactive/async-data.ts","../src/reactive/linked.ts","../src/reactive/persisted.ts","../src/reactive/readonly.ts","../src/reactive/type-guards.ts","../src/reactive/watch.ts"],"sourcesContent":["/**\n * Batched reactive updates.\n */\n\nimport { beginBatch, endBatch } from './internals';\n\n/**\n * Batches multiple signal updates into a single notification cycle.\n *\n * Updates made inside the batch function are deferred until the batch\n * completes, preventing intermediate re-renders and improving performance.\n *\n * @param fn - Function containing multiple signal updates\n */\nexport const batch = (fn: () => void): void => {\n beginBatch();\n try {\n fn();\n } finally {\n endBatch();\n }\n};\n","/**\n * Async data and fetch composables built on bQuery signals.\n *\n * @module bquery/reactive\n */\n\nimport { merge } from '../core/utils/object';\nimport { getBqueryConfig, type BqueryFetchParseAs } from '../platform/config';\nimport { computed } from './computed';\nimport { effect } from './effect';\nimport { Signal, signal } from './core';\nimport { untrack } from './untrack';\n\n/** Allowed status values for async composables. */\nexport type AsyncDataStatus = 'idle' | 'pending' | 'success' | 'error';\n\n/** Reactive source types that can trigger refreshes. */\nexport type AsyncWatchSource = (() => unknown) | { value: unknown };\n\n/** Options shared by async composables. */\nexport interface UseAsyncDataOptions<TResult, TData = TResult> {\n /** Run the handler immediately (default: true). */\n immediate?: boolean;\n /** Default data value before the first successful execution. */\n defaultValue?: TData;\n /** Optional reactive sources that trigger refreshes when they change. */\n watch?: AsyncWatchSource[];\n /** Transform the resolved value before storing it. */\n transform?: (value: TResult) => TData;\n /** Called after a successful execution. */\n onSuccess?: (value: TData) => void;\n /** Called after a failed execution. */\n onError?: (error: Error) => void;\n}\n\n/** Return value of useAsyncData() and useFetch(). */\nexport interface AsyncDataState<TData> {\n /** Reactive data signal. */\n data: Signal<TData | undefined>;\n /** Last error encountered by the composable. */\n error: Signal<Error | null>;\n /** Current lifecycle status. */\n status: Signal<AsyncDataStatus>;\n /** Computed boolean that mirrors `status === 'pending'`. */\n pending: { readonly value: boolean; peek(): boolean };\n /** Execute the handler manually. Returns the cached data value when called after dispose(). */\n execute: () => Promise<TData | undefined>;\n /** Alias for execute(). */\n refresh: () => Promise<TData | undefined>;\n /** Clear data, error, and status back to the initial state. */\n clear: () => void;\n /** Dispose reactive watchers and prevent future executions. */\n dispose: () => void;\n}\n\n/** Options for useFetch(). */\nexport interface UseFetchOptions<TResponse = unknown, TData = TResponse>\n extends UseAsyncDataOptions<TResponse, TData>, Omit<RequestInit, 'body' | 'headers'> {\n /** Base URL prepended to relative URLs. */\n baseUrl?: string;\n /** Query parameters appended to the request URL. */\n query?: Record<string, unknown>;\n /** Request headers. */\n headers?: HeadersInit;\n /** Request body, including plain objects for JSON requests. */\n body?: BodyInit | Record<string, unknown> | unknown[] | null;\n /** Override the parser used for the response body. */\n parseAs?: BqueryFetchParseAs;\n /** Custom fetch implementation for testing or adapters. */\n fetcher?: typeof fetch;\n}\n\n/** Input accepted by useFetch(). */\nexport type FetchInput = string | URL | Request | (() => string | URL | Request);\n\nconst normalizeError = (error: unknown): Error => {\n if (error instanceof Error) return error;\n if (typeof error === 'string') {\n return new Error(error);\n }\n\n try {\n return new Error(JSON.stringify(error));\n } catch {\n return new Error(String(error));\n }\n};\n\nconst readWatchSource = (source: AsyncWatchSource): unknown => {\n if (typeof source === 'function') {\n return source();\n }\n return source.value;\n};\n\nconst toHeaders = (...sources: Array<HeadersInit | undefined>): Headers => {\n const headers = new Headers();\n for (const source of sources) {\n if (!source) continue;\n new Headers(source).forEach((value, key) => {\n headers.set(key, value);\n });\n }\n return headers;\n};\n\nconst isBodyLike = (value: unknown): value is BodyInit => {\n if (typeof value === 'string') return true;\n if (value instanceof Blob || value instanceof FormData || value instanceof URLSearchParams) {\n return true;\n }\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) return true;\n if (typeof ReadableStream !== 'undefined' && value instanceof ReadableStream) return true;\n return typeof value === 'object' && value !== null && ArrayBuffer.isView(value);\n};\n\nconst serializeBody = (\n body: UseFetchOptions['body'],\n headers: Headers\n): BodyInit | null | undefined => {\n if (body == null) return body;\n if (isBodyLike(body)) return body;\n\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n\n return JSON.stringify(body);\n};\n\nconst resolveInput = (input: FetchInput): string | URL | Request => {\n return typeof input === 'function' ? input() : input;\n};\n\nconst appendQuery = (url: URL, query: Record<string, unknown>): void => {\n for (const [key, value] of Object.entries(query)) {\n if (value == null) continue;\n\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item != null) {\n url.searchParams.append(key, String(item));\n }\n }\n continue;\n }\n\n url.searchParams.set(key, String(value));\n }\n};\n\nconst toUrl = (input: string | URL, baseUrl?: string): URL => {\n const runtimeBase =\n typeof window !== 'undefined' && /^https?:/i.test(window.location.href)\n ? window.location.href\n : 'http://localhost';\n const base = baseUrl ? new URL(baseUrl, runtimeBase).toString() : runtimeBase;\n return input instanceof URL ? new URL(input.toString(), base) : new URL(input, base);\n};\n\nconst parseResponse = async <TResponse>(\n response: Response,\n parseAs: BqueryFetchParseAs\n): Promise<TResponse> => {\n if (parseAs === 'response') return response as TResponse;\n if (parseAs === 'text') return (await response.text()) as TResponse;\n if (parseAs === 'blob') return (await response.blob()) as TResponse;\n if (parseAs === 'arrayBuffer') return (await response.arrayBuffer()) as TResponse;\n if (parseAs === 'formData') return (await response.formData()) as TResponse;\n\n const text = await response.text();\n if (!text) {\n return undefined as TResponse;\n }\n\n try {\n return JSON.parse(text) as TResponse;\n } catch (error) {\n const detail = response.url ? ` for ${response.url}` : '';\n throw new Error(\n `Failed to parse JSON response${detail} (status ${response.status}): ${error instanceof Error ? error.message : String(error)}`\n );\n }\n};\n\nconst normalizeMethod = (method?: string): string | undefined => {\n const normalized = method?.trim();\n return normalized ? normalized.toUpperCase() : undefined;\n};\n\nconst resolveMethod = (\n explicitMethod: string | undefined,\n requestInput: string | URL | Request,\n bodyProvided: boolean\n): string | undefined => {\n const requestMethod =\n requestInput instanceof Request ? normalizeMethod(requestInput.method) : undefined;\n return explicitMethod ?? requestMethod ?? (bodyProvided ? 'POST' : undefined);\n};\n\nconst resolveRequestInitMethod = (\n explicitMethod: string | undefined,\n requestInput: string | URL | Request,\n method: string | undefined\n): string | undefined => {\n if (explicitMethod) return explicitMethod;\n return requestInput instanceof Request ? undefined : method;\n};\n\nconst toRequestInit = (request: Request): RequestInit => {\n const requestMethod = normalizeMethod(request.method);\n let body: BodyInit | undefined;\n if (requestMethod !== 'GET' && requestMethod !== 'HEAD' && !request.bodyUsed) {\n try {\n body = request.clone().body ?? undefined;\n } catch {\n body = undefined;\n }\n }\n\n return {\n method: requestMethod,\n headers: request.headers,\n body,\n cache: request.cache,\n credentials: request.credentials,\n integrity: request.integrity,\n keepalive: request.keepalive,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n signal: request.signal,\n };\n};\n\n/**\n * Create a reactive wrapper around an async resolver.\n *\n * @template TResult - Raw result type returned by the handler\n * @template TData - Stored data type after optional transformation\n * @param handler - Async function to execute\n * @param options - Execution, transform, and refresh options\n * @returns Reactive data state with execute(), refresh(), and clear()\n *\n * @example\n * ```ts\n * const user = useAsyncData(() => fetch('/api/user').then((res) => res.json()));\n * ```\n */\nexport const useAsyncData = <TResult, TData = TResult>(\n handler: () => Promise<TResult>,\n options: UseAsyncDataOptions<TResult, TData> = {}\n): AsyncDataState<TData> => {\n const immediate = options.immediate ?? true;\n const data = signal<TData | undefined>(options.defaultValue);\n const error = signal<Error | null>(null);\n const status = signal<AsyncDataStatus>('idle');\n const pending = computed(() => status.value === 'pending');\n let executionId = 0;\n let disposed = false;\n let stopWatching = (): void => {};\n\n const clear = (): void => {\n executionId += 1;\n data.value = options.defaultValue;\n error.value = null;\n status.value = 'idle';\n };\n\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n executionId += 1;\n stopWatching();\n };\n\n const execute = async (): Promise<TData | undefined> => {\n if (disposed) {\n return data.peek();\n }\n\n const currentExecution = ++executionId;\n status.value = 'pending';\n error.value = null;\n\n try {\n const resolved = await handler();\n const transformed = options.transform\n ? options.transform(resolved)\n : (resolved as unknown as TData);\n\n if (disposed || currentExecution !== executionId) {\n return data.peek();\n }\n\n data.value = transformed;\n status.value = 'success';\n options.onSuccess?.(transformed);\n return transformed;\n } catch (caught) {\n const normalizedError = normalizeError(caught);\n\n if (disposed || currentExecution !== executionId) {\n return data.peek();\n }\n\n error.value = normalizedError;\n status.value = 'error';\n options.onError?.(normalizedError);\n return data.peek();\n }\n };\n\n if (options.watch?.length) {\n let initialized = false;\n stopWatching = effect(() => {\n for (const source of options.watch ?? []) {\n readWatchSource(source);\n }\n\n if (!initialized) {\n initialized = true;\n if (immediate) {\n void untrack(() => execute());\n }\n return;\n }\n\n void untrack(() => execute());\n });\n } else if (immediate) {\n void execute();\n }\n\n return {\n data,\n error,\n status,\n pending,\n execute,\n refresh: execute,\n clear,\n dispose,\n };\n};\n\n/**\n * Reactive fetch composable using the browser Fetch API.\n *\n * @template TResponse - Raw parsed response type\n * @template TData - Stored response type after optional transformation\n * @param input - Request URL, Request object, or lazy input factory\n * @param options - Request and reactive state options\n * @returns Reactive fetch state with execute(), refresh(), and clear()\n *\n * @example\n * ```ts\n * const users = useFetch<{ id: number; name: string }[]>('/api/users');\n * ```\n */\nexport const useFetch = <TResponse = unknown, TData = TResponse>(\n input: FetchInput,\n options: UseFetchOptions<TResponse, TData> = {}\n): AsyncDataState<TData> => {\n const fetchConfig = getBqueryConfig().fetch;\n const parseAs = options.parseAs ?? fetchConfig?.parseAs ?? 'json';\n const fetcher = options.fetcher ?? fetch;\n\n return useAsyncData<TResponse, TData>(async () => {\n const requestInput = resolveInput(input);\n const requestUrl =\n typeof requestInput === 'string' || requestInput instanceof URL\n ? toUrl(requestInput, options.baseUrl ?? fetchConfig?.baseUrl)\n : requestInput instanceof Request && options.query\n ? new URL(requestInput.url)\n : null;\n\n if (requestUrl && options.query) {\n appendQuery(requestUrl, options.query);\n }\n\n const headers = toHeaders(\n fetchConfig?.headers,\n requestInput instanceof Request ? requestInput.headers : undefined,\n options.headers\n );\n const bodyProvided = options.body != null;\n const explicitMethod = normalizeMethod(options.method);\n const method = resolveMethod(explicitMethod, requestInput, bodyProvided);\n const bodylessMethod = method === 'GET' || method === 'HEAD' ? method : null;\n if (bodyProvided && bodylessMethod) {\n throw new Error(`Cannot send a request body with ${bodylessMethod} requests`);\n }\n const requestInitMethod = resolveRequestInitMethod(explicitMethod, requestInput, method);\n const requestInit: RequestInit = {\n ...options,\n method: requestInitMethod,\n headers,\n body: serializeBody(options.body, headers),\n };\n\n delete (requestInit as Partial<UseFetchOptions>).baseUrl;\n delete (requestInit as Partial<UseFetchOptions>).query;\n delete (requestInit as Partial<UseFetchOptions>).parseAs;\n delete (requestInit as Partial<UseFetchOptions>).fetcher;\n delete (requestInit as Partial<UseFetchOptions>).defaultValue;\n delete (requestInit as Partial<UseFetchOptions>).immediate;\n delete (requestInit as Partial<UseFetchOptions>).watch;\n delete (requestInit as Partial<UseFetchOptions>).transform;\n delete (requestInit as Partial<UseFetchOptions>).onSuccess;\n delete (requestInit as Partial<UseFetchOptions>).onError;\n\n let requestTarget: Request | string | URL = requestUrl ?? requestInput;\n if (\n requestInput instanceof Request &&\n requestUrl &&\n requestUrl.toString() !== requestInput.url\n ) {\n // Rebuild Request inputs when query params changed so the updated URL is preserved.\n // String/URL inputs already use `requestUrl` directly, so only Request objects need rebuilding.\n requestTarget = new Request(requestUrl.toString(), toRequestInit(requestInput));\n }\n const response = await fetcher(requestTarget, requestInit);\n\n if (!response.ok) {\n throw Object.assign(new Error(`Request failed with status ${response.status}`), {\n response,\n status: response.status,\n statusText: response.statusText,\n });\n }\n\n return parseResponse<TResponse>(response, parseAs);\n }, options);\n};\n\n/**\n * Create a preconfigured useFetch() helper.\n *\n * @param defaults - Default request options merged into every useFetch() call\n * @returns A useFetch-compatible function with merged defaults\n *\n * @example\n * ```ts\n * const useApiFetch = createUseFetch({ baseUrl: 'https://api.example.com' });\n * const profile = useApiFetch('/profile');\n * ```\n */\n/** Overload for factories without a configured transform, preserving per-call `TResponse -> TData` inference. */\nexport function createUseFetch<TDefaultResponse = unknown>(\n defaults?: UseFetchOptions<TDefaultResponse, TDefaultResponse>\n): <TResponse = TDefaultResponse, TData = TResponse>(\n input: FetchInput,\n options?: UseFetchOptions<TResponse, TData>\n) => AsyncDataState<TData>;\n\n/** Overload for factories with a configured transform, preserving the transformed factory data type by default. */\nexport function createUseFetch<TDefaultResponse = unknown, TDefaultData = TDefaultResponse>(\n defaults: UseFetchOptions<TDefaultResponse, TDefaultData>\n): <TResponse = TDefaultResponse, TData = TDefaultData>(\n input: FetchInput,\n options?: UseFetchOptions<TResponse, TData>\n) => AsyncDataState<TData>;\n\nexport function createUseFetch<TDefaultResponse = unknown, TDefaultData = TDefaultResponse>(\n defaults: UseFetchOptions<TDefaultResponse, TDefaultData> = {}\n) {\n return <TResponse = TDefaultResponse, TData = TDefaultData>(\n input: FetchInput,\n options: UseFetchOptions<TResponse, TData> = {}\n ): AsyncDataState<TData> => {\n const resolvedDefaults = defaults as unknown as UseFetchOptions<TResponse, TData>;\n const mergedQuery = merge({}, resolvedDefaults.query ?? {}, options.query ?? {}) as Record<\n string,\n unknown\n >;\n\n return useFetch<TResponse, TData>(input, {\n ...resolvedDefaults,\n ...options,\n headers: toHeaders(resolvedDefaults.headers, options.headers),\n query: Object.keys(mergedQuery).length > 0 ? mergedQuery : undefined,\n });\n };\n}\n","/**\n * Linked (writable) computed helpers.\n */\n\nimport { computed, Computed } from './computed';\n\n/**\n * A writable computed-like signal.\n */\nexport interface LinkedSignal<T> {\n /** Gets or sets the current value with dependency tracking. */\n value: T;\n /** Gets the current value without dependency tracking. */\n peek(): T;\n}\n\n/**\n * Creates a writable computed signal by linking a getter and setter.\n *\n * @template T - The derived value type\n * @param getValue - Getter that derives the current value\n * @param setValue - Setter that writes back to underlying signals\n * @returns A writable computed-like signal\n *\n * @example\n * ```ts\n * const first = signal('Ada');\n * const last = signal('Lovelace');\n * const fullName = linkedSignal(\n * () => `${first.value} ${last.value}`,\n * (next) => {\n * const [a, b] = next.split(' ');\n * first.value = a ?? '';\n * last.value = b ?? '';\n * }\n * );\n * ```\n */\nexport const linkedSignal = <T>(\n getValue: () => T,\n setValue: (value: T) => void\n): LinkedSignal<T> => {\n const derived: Computed<T> = computed(getValue);\n\n return {\n get value(): T {\n return derived.value;\n },\n set value(next: T) {\n setValue(next);\n },\n peek(): T {\n return derived.peek();\n },\n };\n};\n","/**\n * LocalStorage-backed signals.\n */\n\nimport { signal, Signal } from './core';\nimport { effect } from './effect';\n\n/**\n * Creates a signal that persists to localStorage.\n *\n * @template T - The type of the signal value\n * @param key - The localStorage key\n * @param initialValue - The initial value if not found in storage\n * @returns A Signal that syncs with localStorage (falls back to in-memory if unavailable)\n */\nexport const persistedSignal = <T>(key: string, initialValue: T): Signal<T> => {\n // Check if localStorage is available and accessible\n let hasLocalStorage = false;\n let storage: Storage | null = null;\n\n try {\n // In Safari private mode, accessing localStorage can throw SecurityError\n storage = globalThis.localStorage;\n if (storage) {\n // Test actual access to ensure it's not just present but usable\n // Use a randomized test key to avoid overwriting real user data\n const testKey = `__bquery_test_${Math.random().toString(36).slice(2, 9)}__`;\n const testValue = '__test__';\n try {\n storage.setItem(testKey, testValue);\n storage.getItem(testKey);\n hasLocalStorage = true;\n } finally {\n // Ensure we don't leave any test data behind\n try {\n storage.removeItem(testKey);\n } catch {\n // Ignore cleanup errors (e.g., storage becoming unavailable)\n }\n }\n }\n } catch {\n // localStorage unavailable or access denied (Safari private mode, sandboxed iframes, etc.)\n hasLocalStorage = false;\n }\n\n let stored: T = initialValue;\n\n if (hasLocalStorage && storage) {\n try {\n const raw = storage.getItem(key);\n if (raw !== null) {\n stored = JSON.parse(raw) as T;\n }\n } catch {\n // Use initial value on parse error or access denial\n }\n }\n\n const sig = signal(stored);\n\n // Only set up persistence effect if localStorage is available\n if (hasLocalStorage && storage) {\n effect(() => {\n try {\n storage!.setItem(key, JSON.stringify(sig.value));\n } catch {\n // Ignore storage errors (quota exceeded, sandboxed iframes, etc.)\n }\n });\n }\n\n return sig;\n};\n","/**\n * Read-only signal wrappers.\n */\n\nimport type { Signal } from './core';\n\n/**\n * A readonly wrapper around a signal that prevents writes.\n * Provides read-only access to a signal's value while maintaining reactivity.\n *\n * @template T - The type of the wrapped value\n */\nexport interface ReadonlySignal<T> {\n /** Gets the current value with dependency tracking. */\n readonly value: T;\n /** Gets the current value without dependency tracking. */\n peek(): T;\n}\n\n/**\n * Creates a read-only view of a signal.\n * Useful for exposing reactive state without allowing modifications.\n *\n * @template T - The type of the signal value\n * @param sig - The signal to wrap\n * @returns A readonly signal wrapper\n */\nexport const readonly = <T>(sig: Signal<T>): ReadonlySignal<T> => ({\n get value(): T {\n return sig.value;\n },\n peek(): T {\n return sig.peek();\n },\n});\n","/**\n * Type guards for reactive primitives.\n */\n\nimport { Computed } from './computed';\nimport { Signal } from './core';\n\n/**\n * Type guard to check if a value is a Signal instance.\n *\n * @param value - The value to check\n * @returns True if the value is a Signal\n */\nexport const isSignal = (value: unknown): value is Signal<unknown> => value instanceof Signal;\n\n/**\n * Type guard to check if a value is a Computed instance.\n *\n * @param value - The value to check\n * @returns True if the value is a Computed\n */\nexport const isComputed = (value: unknown): value is Computed<unknown> => value instanceof Computed;\n","/**\n * Value watching helpers.\n */\n\nimport type { Computed } from './computed';\nimport type { Signal } from './core';\nimport type { CleanupFn } from './internals';\n\nimport { effect } from './effect';\n\n/**\n * Options for the watch function.\n */\nexport interface WatchOptions<T> {\n /** If true, the callback is invoked immediately with the current value. */\n immediate?: boolean;\n /** Custom equality function. Defaults to Object.is. */\n equals?: (a: T, b: T | undefined) => boolean;\n}\n\n/**\n * Watches a signal or computed value and calls a callback with old and new values.\n * Unlike effect, watch provides access to the previous value.\n * The callback is only invoked when the value actually changes (compared via Object.is or custom equals).\n *\n * @template T - The type of the watched value\n * @param source - The signal or computed to watch\n * @param callback - Function called with (newValue, oldValue) on changes\n * @param options - Watch options\n * @returns A cleanup function to stop watching\n *\n * @example\n * ```ts\n * const count = signal(0);\n * watch(count, (newVal, oldVal) => {\n * console.log(`Changed from ${oldVal} to ${newVal}`);\n * });\n *\n * // With custom equality for objects\n * const user = signal({ id: 1, name: 'Alice' });\n * watch(user, (newVal, oldVal) => { ... }, {\n * equals: (a, b) => a?.id === b?.id\n * });\n * ```\n */\nexport const watch = <T>(\n source: Signal<T> | Computed<T>,\n callback: (newValue: T, oldValue: T | undefined) => void,\n options: WatchOptions<T> = {}\n): CleanupFn => {\n const { immediate = false, equals = Object.is } = options;\n let oldValue: T | undefined;\n let isFirst = true;\n\n return effect(() => {\n const newValue = source.value;\n\n if (isFirst) {\n isFirst = false;\n oldValue = newValue;\n if (immediate) {\n callback(newValue, undefined);\n }\n return;\n }\n\n // Only call callback if value actually changed\n if (!equals(newValue, oldValue)) {\n callback(newValue, oldValue);\n oldValue = newValue;\n }\n });\n};\n"],"mappings":"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"}
@@ -1,20 +1,21 @@
1
- import { n as s, r as e, t } from "./core-DPdbItcq.js";
2
- import { a as n, c as r, d as c, f as o, i as l, l as p, n as d, o as m, p as u, r as f, s as g, t as h, u as S } from "./reactive-BDya-ia8.js";
1
+ import { n as s, r as t, t as e } from "./core-DnlyjbF2.js";
2
+ import { a as i, c as n, i as o, l as c, n as m, o as l, r as p, s as u, t as d, u as f } from "./reactive-Cfv0RK6x.js";
3
+ import { n as h, r as S, t as k } from "./untrack-DJVQQ2WM.js";
3
4
  export {
4
- c as Computed,
5
- t as Signal,
6
- u as batch,
7
- o as computed,
8
- g as createUseFetch,
9
- e as effect,
10
- d as isComputed,
11
- f as isSignal,
12
- m as linkedSignal,
13
- n as persistedSignal,
14
- l as readonly,
5
+ h as Computed,
6
+ e as Signal,
7
+ f as batch,
8
+ S as computed,
9
+ u as createUseFetch,
10
+ t as effect,
11
+ m as isComputed,
12
+ p as isSignal,
13
+ l as linkedSignal,
14
+ i as persistedSignal,
15
+ o as readonly,
15
16
  s as signal,
16
- S as untrack,
17
- r as useAsyncData,
18
- p as useFetch,
19
- h as watch
17
+ k as untrack,
18
+ n as useAsyncData,
19
+ c as useFetch,
20
+ d as watch
20
21
  };
@@ -0,0 +1,26 @@
1
+ var n = () => {
2
+ if (!(typeof window > "u"))
3
+ return window.__BQUERY_DEVTOOLS__ || (window.__BQUERY_DEVTOOLS__ = { stores: /* @__PURE__ */ new Map() }), window.__BQUERY_DEVTOOLS__;
4
+ }, _ = (e, r) => {
5
+ const o = n();
6
+ o && (o.stores.set(e, r), o.onStoreCreated?.(e, r));
7
+ }, s = (e) => {
8
+ typeof window > "u" || !window.__BQUERY_DEVTOOLS__ || window.__BQUERY_DEVTOOLS__.stores.delete(e);
9
+ }, a = (e, r) => {
10
+ typeof window > "u" || window.__BQUERY_DEVTOOLS__?.onStateChange?.(e, r);
11
+ }, t = /* @__PURE__ */ new Map(), i = (e) => t.has(e), w = (e, r) => {
12
+ t.set(e, r);
13
+ }, d = (e) => t.get(e), v = () => Array.from(t.keys()), S = (e) => {
14
+ t.delete(e), s(e);
15
+ };
16
+ export {
17
+ w as a,
18
+ v as i,
19
+ d as n,
20
+ a as o,
21
+ i as r,
22
+ _ as s,
23
+ S as t
24
+ };
25
+
26
+ //# sourceMappingURL=registry-CWf368tT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-CWf368tT.js","names":[],"sources":["../src/store/devtools.ts","../src/store/registry.ts"],"sourcesContent":["/**\n * Devtools integration for stores.\n * @internal\n */\n\ndeclare global {\n interface Window {\n __BQUERY_DEVTOOLS__?: {\n stores: Map<string, unknown>;\n onStoreCreated?: (id: string, store: unknown) => void;\n onStateChange?: (id: string, state: unknown) => void;\n };\n }\n}\n\nexport type DevtoolsHook = {\n stores: Map<string, unknown>;\n onStoreCreated?: (id: string, store: unknown) => void;\n onStateChange?: (id: string, state: unknown) => void;\n};\n\nconst ensureDevtools = (): DevtoolsHook | undefined => {\n if (typeof window === 'undefined') return undefined;\n if (!window.__BQUERY_DEVTOOLS__) {\n window.__BQUERY_DEVTOOLS__ = { stores: new Map() };\n }\n return window.__BQUERY_DEVTOOLS__;\n};\n\nexport const registerDevtoolsStore = (id: string, store: unknown): void => {\n const devtools = ensureDevtools();\n if (!devtools) return;\n devtools.stores.set(id, store);\n devtools.onStoreCreated?.(id, store);\n};\n\nexport const unregisterDevtoolsStore = (id: string): void => {\n if (typeof window === 'undefined' || !window.__BQUERY_DEVTOOLS__) return;\n window.__BQUERY_DEVTOOLS__.stores.delete(id);\n};\n\nexport const notifyDevtoolsStateChange = (id: string, state: unknown): void => {\n if (typeof window === 'undefined') return;\n window.__BQUERY_DEVTOOLS__?.onStateChange?.(id, state);\n};\n","/**\n * Store registry utilities.\n */\n\nimport { unregisterDevtoolsStore } from './devtools';\nimport type { Store } from './types';\n\n/** @internal Registry of all stores for devtools */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst storeRegistry = new Map<string, Store<any, any, any>>();\n\n/** @internal */\nexport const hasStore = (id: string): boolean => storeRegistry.has(id);\n\n/** @internal */\nexport const registerStore = (\n id: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n store: Store<any, any, any>\n): void => {\n storeRegistry.set(id, store);\n};\n\n/**\n * Retrieves an existing store by its ID.\n *\n * @param id - The store identifier\n * @returns The store instance or undefined if not found\n */\nexport const getStore = <T = unknown>(id: string): T | undefined => {\n return storeRegistry.get(id) as T | undefined;\n};\n\n/**\n * Lists all registered store IDs.\n *\n * @returns Array of store IDs\n */\nexport const listStores = (): string[] => {\n return Array.from(storeRegistry.keys());\n};\n\n/**\n * Removes a store from the registry.\n *\n * @param id - The store identifier\n */\nexport const destroyStore = (id: string): void => {\n storeRegistry.delete(id);\n unregisterDevtoolsStore(id);\n};\n"],"mappings":"AAqBA,IAAM,IAAA,MAAiD;AACrD,MAAI,SAAO,SAAW;AACtB,WAAK,OAAO,wBACV,OAAO,sBAAsB,EAAE,QAAQ,oBAAI,IAAA,EAAK,IAE3C,OAAO;GAGH,IAAA,CAAyB,GAAY,MAAyB;AACzE,QAAM,IAAW,EAAA;AACjB,EAAK,MACL,EAAS,OAAO,IAAI,GAAI,CAAA,GACxB,EAAS,iBAAiB,GAAI,CAAA;GAGnB,IAAA,CAA2B,MAAqB;AAC3D,EAAI,OAAO,SAAW,OAAe,CAAC,OAAO,uBAC7C,OAAO,oBAAoB,OAAO,OAAO,CAAA;GAG9B,IAAA,CAA6B,GAAY,MAAyB;AAC7E,EAAI,OAAO,SAAW,OACtB,OAAO,qBAAqB,gBAAgB,GAAI,CAAA;GClC5C,IAAgB,oBAAI,IAAA,GAGb,IAAA,CAAY,MAAwB,EAAc,IAAI,CAAA,GAGtD,IAAA,CACX,GAEA,MACS;AACT,EAAA,EAAc,IAAI,GAAI,CAAA;GASX,IAAA,CAAyB,MAC7B,EAAc,IAAI,CAAA,GAQd,IAAA,MACJ,MAAM,KAAK,EAAc,KAAA,CAAM,GAQ3B,IAAA,CAAgB,MAAqB;AAChD,EAAA,EAAc,OAAO,CAAA,GACrB,EAAwB,CAAA"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * `<bq-link>` custom element for declarative SPA navigation.
3
+ *
4
+ * Exposes an accessible custom element that behaves like a link for
5
+ * client-side routing. Automatically toggles an active class when the
6
+ * target path matches the current route.
7
+ *
8
+ * @module bquery/router
9
+ *
10
+ * @example
11
+ * ```html
12
+ * <bq-link to="/">Home</bq-link>
13
+ * <bq-link to="/about" active-class="selected">About</bq-link>
14
+ * <bq-link to="/settings" replace exact>Settings</bq-link>
15
+ * ```
16
+ */
17
+ /** @internal SSR-safe base class for environments without HTMLElement. */
18
+ declare const BQ_LINK_BASE: {
19
+ new (): HTMLElement;
20
+ prototype: HTMLElement;
21
+ };
22
+ /**
23
+ * `<bq-link>` — A navigation custom element for bQuery routers.
24
+ *
25
+ * Attributes:
26
+ * - `to` — Target path (required). Example: `to="/dashboard"`.
27
+ * - `replace` — If present, replaces the current history entry instead of pushing.
28
+ * - `exact` — If present, the active class is only applied on an exact path match.
29
+ * - `active-class` — CSS class added when the route is active (default: `'active'`).
30
+ *
31
+ * The custom element itself acts as the interactive link target using
32
+ * `role="link"` and keyboard handling. It does not render a native `<a>`,
33
+ * so browser-native link affordances like context-menu "open in new tab"
34
+ * are not provided automatically.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * import { registerBqLink } from '@bquery/bquery/router';
39
+ *
40
+ * // Register the <bq-link> element (idempotent)
41
+ * registerBqLink();
42
+ *
43
+ * // Then use in HTML:
44
+ * // <bq-link to="/about">About</bq-link>
45
+ * ```
46
+ */
47
+ export declare class BqLinkElement extends BQ_LINK_BASE {
48
+ /** @internal */
49
+ private _cleanup;
50
+ /** @internal */
51
+ private _trackedActiveClasses;
52
+ static get observedAttributes(): string[];
53
+ /** The target path for navigation. */
54
+ get to(): string;
55
+ set to(value: string);
56
+ /** Whether to replace the current history entry. */
57
+ get replace(): boolean;
58
+ set replace(value: boolean);
59
+ /** Whether to match the path exactly for active class. */
60
+ get exact(): boolean;
61
+ set exact(value: boolean);
62
+ /** CSS class applied when the route is active. */
63
+ get activeClass(): string;
64
+ set activeClass(value: string);
65
+ /** @internal */
66
+ connectedCallback(): void;
67
+ /** @internal */
68
+ disconnectedCallback(): void;
69
+ /** @internal */
70
+ attributeChangedCallback(name: string, _oldValue: string | null, _newValue: string | null): void;
71
+ /**
72
+ * Sets up the reactive effect that toggles the active CSS class
73
+ * based on the current route.
74
+ * @internal
75
+ */
76
+ private _setupActiveTracking;
77
+ /** @internal */
78
+ private _clearTrackedActiveClasses;
79
+ /**
80
+ * Handles click events for SPA navigation.
81
+ * @internal
82
+ */
83
+ private _handleClick;
84
+ /**
85
+ * Handles keyboard activation (Enter).
86
+ * @internal
87
+ */
88
+ private _handleKeydown;
89
+ /**
90
+ * Performs the actual navigation.
91
+ * @internal
92
+ */
93
+ private _navigate;
94
+ }
95
+ /**
96
+ * Registers the `<bq-link>` custom element.
97
+ *
98
+ * This function is idempotent — calling it multiple times is safe.
99
+ * The element is registered under the tag name `bq-link`.
100
+ *
101
+ * @example
102
+ * ```ts
103
+ * import { registerBqLink } from '@bquery/bquery/router';
104
+ *
105
+ * registerBqLink();
106
+ *
107
+ * // Now use <bq-link to="/about">About</bq-link> in HTML
108
+ * ```
109
+ */
110
+ export declare const registerBqLink: () => void;
111
+ export {};
112
+ //# sourceMappingURL=bq-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bq-link.d.ts","sourceRoot":"","sources":["../../src/router/bq-link.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAoBH,0EAA0E;AAC1E,QAAA,MAAM,YAAY;;;CAC8E,CAAC;AAEjG;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,gBAAgB;IAChB,OAAO,CAAC,QAAQ,CAA0B;IAE1C,gBAAgB;IAChB,OAAO,CAAC,qBAAqB,CAA8B;IAE3D,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;IAED,sCAAsC;IACtC,IAAI,EAAE,IAAI,MAAM,CAGf;IAED,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAEnB;IAED,oDAAoD;IACpD,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAMzB;IAED,0DAA0D;IAC1D,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,EAMvB;IAED,kDAAkD;IAClD,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM,EAE5B;IAED,gBAAgB;IAChB,iBAAiB,IAAI,IAAI;IAmBzB,gBAAgB;IAChB,oBAAoB,IAAI,IAAI;IAY5B,gBAAgB;IAChB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAShG;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAuC5B,gBAAgB;IAChB,OAAO,CAAC,0BAA0B;IAOlC;;;OAGG;IACH,OAAO,CAAC,YAAY,CAQlB;IAEF;;;OAGG;IACH,OAAO,CAAC,cAAc,CAKpB;IAEF;;;OAGG;IACH,OAAO,CAAC,SAAS;CASlB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc,QAAO,IAQjC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Shared helpers for validating and normalizing route param constraints.
3
+ * @internal
4
+ */
5
+ export declare const getNormalizedRouteConstraint: (constraint: string) => string;
6
+ export declare const getRouteConstraintRegex: (constraint: string) => RegExp;
7
+ export declare const routeConstraintMatches: (constraint: string, value: string) => boolean;
8
+ export declare const clearRouteConstraintCache: () => void;
9
+ //# sourceMappingURL=constraints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraints.d.ts","sourceRoot":"","sources":["../../src/router/constraints.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwJH,eAAO,MAAM,4BAA4B,GAAI,YAAY,MAAM,KAAG,MASjE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,YAAY,MAAM,KAAG,MAyB5D,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,YAAY,MAAM,EAAE,OAAO,MAAM,KAAG,OAE1E,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAO,IAG5C,CAAC"}
@@ -4,38 +4,46 @@
4
4
  * This module provides a lightweight, signal-based router for single-page
5
5
  * applications. Features include:
6
6
  * - History API navigation
7
- * - Route matching with params and wildcards
7
+ * - Route matching with params, wildcards, and regex constraints
8
8
  * - Lazy route loading
9
- * - Navigation guards (beforeEach, afterEach)
9
+ * - Navigation guards (beforeEach, afterEach, per-route beforeEnter)
10
10
  * - Reactive current route via signals
11
+ * - `useRoute()` composable for fine-grained reactive access
12
+ * - Route redirects via `redirectTo`
13
+ * - Scroll position restoration on back/forward
11
14
  * - Multi-value query params (e.g., `?tag=a&tag=b` → `{ tag: ['a', 'b'] }`)
12
15
  *
13
16
  * @module bquery/router
14
17
  *
15
18
  * @example
16
19
  * ```ts
17
- * import { createRouter, navigate, currentRoute } from 'bquery/router';
18
- * import { effect } from 'bquery/reactive';
20
+ * import { createRouter, navigate, currentRoute, useRoute } from '@bquery/bquery/router';
21
+ * import { effect } from '@bquery/bquery/reactive';
19
22
  *
20
23
  * const router = createRouter({
21
24
  * routes: [
22
25
  * { path: '/', component: () => import('./Home') },
23
- * { path: '/user/:id', component: () => import('./User') },
26
+ * { path: '/user/:id(\\d+)', component: () => import('./User') },
27
+ * { path: '/old', redirectTo: '/new' },
24
28
  * { path: '*', component: () => import('./NotFound') },
25
29
  * ],
30
+ * scrollRestoration: true,
26
31
  * });
27
32
  *
33
+ * const { path, params } = useRoute();
28
34
  * effect(() => {
29
- * console.log('Route changed:', currentRoute.value);
35
+ * console.log('Route changed:', path.value, params.value);
30
36
  * });
31
37
  *
32
38
  * navigate('/user/42');
33
39
  * ```
34
40
  */
41
+ export { BqLinkElement, registerBqLink } from './bq-link';
35
42
  export { interceptLinks, link } from './links';
36
43
  export { back, forward, navigate } from './navigation';
37
44
  export { createRouter } from './router';
38
45
  export { currentRoute } from './state';
39
46
  export type { NavigationGuard, Route, RouteDefinition, Router, RouterOptions } from './types';
47
+ export { useRoute, type UseRouteReturn } from './use-route';
40
48
  export { isActive, isActiveSignal, resolve } from './utils';
41
49
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC"}
@@ -5,7 +5,6 @@
5
5
  import type { Route, RouteDefinition } from './types';
6
6
  /**
7
7
  * Matches a path against route definitions and extracts params.
8
- * Uses positional captures for maximum compatibility.
9
8
  * @internal
10
9
  */
11
10
  export declare const matchRoute: (path: string, routes: RouteDefinition[]) => {
@@ -1 +1 @@
1
- {"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../../src/router/match.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAmDtD;;;;GAIG;AACH,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,QAAQ,eAAe,EAAE,KACxB;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,IAmBjE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,MAAM,MAAM,EACZ,QAAQ,eAAe,EAAE,KACxB,KAUF,CAAC"}
1
+ {"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../../src/router/match.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAyQtD;;;GAGG;AACH,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,QAAQ,eAAe,EAAE,KACxB;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,IAUjE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,MAAM,MAAM,EACZ,QAAQ,eAAe,EAAE,KACxB,KAUF,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Shared helpers for parsing route path params and constraints.
3
+ * @internal
4
+ */
5
+ /** Validates whether a character can start a route param name. @internal */
6
+ export declare const isParamStart: (char: string | undefined) => boolean;
7
+ /** Validates whether a character can appear after the start of a route param name. @internal */
8
+ export declare const isParamChar: (char: string | undefined) => boolean;
9
+ /** Reads a route param constraint while preserving escaped chars and nested groups. @internal */
10
+ export declare const readConstraint: (path: string, startIndex: number) => {
11
+ constraint: string;
12
+ endIndex: number;
13
+ } | null;
14
+ //# sourceMappingURL=path-pattern.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-pattern.d.ts","sourceRoot":"","sources":["../../src/router/path-pattern.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,4EAA4E;AAC5E,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,GAAG,SAAS,KAAG,OAEwB,CAAC;AAEjF,gGAAgG;AAChG,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,GAAG,SAAS,KAAG,OACmB,CAAC;AAE3E,iGAAiG;AACjG,eAAO,MAAM,cAAc,GACzB,MAAM,MAAM,EACZ,YAAY,MAAM,KACjB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAiC7C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/router/query.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAmB3E,CAAC"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/router/query.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAoB3E,CAAC"}
@@ -17,10 +17,12 @@ import type { Router, RouterOptions } from './types';
17
17
  * routes: [
18
18
  * { path: '/', component: () => import('./pages/Home') },
19
19
  * { path: '/about', component: () => import('./pages/About') },
20
- * { path: '/user/:id', component: () => import('./pages/User') },
20
+ * { path: '/user/:id(\\d+)', component: () => import('./pages/User') },
21
+ * { path: '/old-page', redirectTo: '/new-page' },
21
22
  * { path: '*', component: () => import('./pages/NotFound') },
22
23
  * ],
23
24
  * base: '/app',
25
+ * scrollRestoration: true,
24
26
  * });
25
27
  *
26
28
  * router.beforeEach((to, from) => {
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAA0B,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAO7E;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,aAAa,KAAG,MAyKrD,CAAC"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAA0B,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAoB7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,aAAa,KAAG,MAwVrD,CAAC"}