@bquery/bquery 1.2.0 → 1.3.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 (305) hide show
  1. package/README.md +501 -427
  2. package/dist/batch-4LAvfLE7.js +13 -0
  3. package/dist/batch-4LAvfLE7.js.map +1 -0
  4. package/dist/component/component.d.ts +69 -0
  5. package/dist/component/component.d.ts.map +1 -0
  6. package/dist/component/html.d.ts +35 -0
  7. package/dist/component/html.d.ts.map +1 -0
  8. package/dist/component/index.d.ts +3 -126
  9. package/dist/component/index.d.ts.map +1 -1
  10. package/dist/component/props.d.ts +18 -0
  11. package/dist/component/props.d.ts.map +1 -0
  12. package/dist/component/types.d.ts +77 -0
  13. package/dist/component/types.d.ts.map +1 -0
  14. package/dist/component.es.mjs +90 -59
  15. package/dist/component.es.mjs.map +1 -1
  16. package/dist/core/collection.d.ts +36 -0
  17. package/dist/core/collection.d.ts.map +1 -1
  18. package/dist/core/dom.d.ts +6 -0
  19. package/dist/core/dom.d.ts.map +1 -0
  20. package/dist/core/element.d.ts +8 -0
  21. package/dist/core/element.d.ts.map +1 -1
  22. package/dist/core/index.d.ts +1 -0
  23. package/dist/core/index.d.ts.map +1 -1
  24. package/dist/core/utils/array.d.ts +74 -0
  25. package/dist/core/utils/array.d.ts.map +1 -0
  26. package/dist/core/utils/function.d.ts +70 -0
  27. package/dist/core/utils/function.d.ts.map +1 -0
  28. package/dist/core/utils/index.d.ts +70 -0
  29. package/dist/core/utils/index.d.ts.map +1 -0
  30. package/dist/core/utils/misc.d.ts +63 -0
  31. package/dist/core/utils/misc.d.ts.map +1 -0
  32. package/dist/core/utils/number.d.ts +65 -0
  33. package/dist/core/utils/number.d.ts.map +1 -0
  34. package/dist/core/utils/object.d.ts +133 -0
  35. package/dist/core/utils/object.d.ts.map +1 -0
  36. package/dist/core/utils/string.d.ts +80 -0
  37. package/dist/core/utils/string.d.ts.map +1 -0
  38. package/dist/core/utils/type-guards.d.ts +79 -0
  39. package/dist/core/utils/type-guards.d.ts.map +1 -0
  40. package/dist/core-COenAZjD.js +145 -0
  41. package/dist/core-COenAZjD.js.map +1 -0
  42. package/dist/core.es.mjs +411 -448
  43. package/dist/core.es.mjs.map +1 -1
  44. package/dist/full.d.ts +2 -2
  45. package/dist/full.d.ts.map +1 -1
  46. package/dist/full.es.mjs +87 -64
  47. package/dist/full.es.mjs.map +1 -1
  48. package/dist/full.iife.js +2 -2
  49. package/dist/full.iife.js.map +1 -1
  50. package/dist/full.umd.js +2 -2
  51. package/dist/full.umd.js.map +1 -1
  52. package/dist/index.es.mjs +138 -68
  53. package/dist/index.es.mjs.map +1 -1
  54. package/dist/motion/animate.d.ts +25 -0
  55. package/dist/motion/animate.d.ts.map +1 -0
  56. package/dist/motion/easing.d.ts +30 -0
  57. package/dist/motion/easing.d.ts.map +1 -0
  58. package/dist/motion/flip.d.ts +55 -0
  59. package/dist/motion/flip.d.ts.map +1 -0
  60. package/dist/motion/index.d.ts +11 -138
  61. package/dist/motion/index.d.ts.map +1 -1
  62. package/dist/motion/keyframes.d.ts +21 -0
  63. package/dist/motion/keyframes.d.ts.map +1 -0
  64. package/dist/motion/reduced-motion.d.ts +12 -0
  65. package/dist/motion/reduced-motion.d.ts.map +1 -0
  66. package/dist/motion/scroll.d.ts +15 -0
  67. package/dist/motion/scroll.d.ts.map +1 -0
  68. package/dist/motion/spring.d.ts +42 -0
  69. package/dist/motion/spring.d.ts.map +1 -0
  70. package/dist/motion/stagger.d.ts +22 -0
  71. package/dist/motion/stagger.d.ts.map +1 -0
  72. package/dist/motion/timeline.d.ts +21 -0
  73. package/dist/motion/timeline.d.ts.map +1 -0
  74. package/dist/motion/transition.d.ts +22 -0
  75. package/dist/motion/transition.d.ts.map +1 -0
  76. package/dist/motion/types.d.ts +182 -0
  77. package/dist/motion/types.d.ts.map +1 -0
  78. package/dist/motion.es.mjs +320 -61
  79. package/dist/motion.es.mjs.map +1 -1
  80. package/dist/persisted-Dz_ryNuC.js +278 -0
  81. package/dist/persisted-Dz_ryNuC.js.map +1 -0
  82. package/dist/reactive/batch.d.ts +13 -0
  83. package/dist/reactive/batch.d.ts.map +1 -0
  84. package/dist/reactive/computed.d.ts +50 -0
  85. package/dist/reactive/computed.d.ts.map +1 -0
  86. package/dist/reactive/core.d.ts +60 -0
  87. package/dist/reactive/core.d.ts.map +1 -0
  88. package/dist/reactive/effect.d.ts +15 -0
  89. package/dist/reactive/effect.d.ts.map +1 -0
  90. package/dist/reactive/index.d.ts +2 -2
  91. package/dist/reactive/index.d.ts.map +1 -1
  92. package/dist/reactive/internals.d.ts +36 -0
  93. package/dist/reactive/internals.d.ts.map +1 -0
  94. package/dist/reactive/linked.d.ts +36 -0
  95. package/dist/reactive/linked.d.ts.map +1 -0
  96. package/dist/reactive/persisted.d.ts +14 -0
  97. package/dist/reactive/persisted.d.ts.map +1 -0
  98. package/dist/reactive/readonly.d.ts +26 -0
  99. package/dist/reactive/readonly.d.ts.map +1 -0
  100. package/dist/reactive/signal.d.ts +13 -312
  101. package/dist/reactive/signal.d.ts.map +1 -1
  102. package/dist/reactive/type-guards.d.ts +20 -0
  103. package/dist/reactive/type-guards.d.ts.map +1 -0
  104. package/dist/reactive/untrack.d.ts +29 -0
  105. package/dist/reactive/untrack.d.ts.map +1 -0
  106. package/dist/reactive/watch.d.ts +42 -0
  107. package/dist/reactive/watch.d.ts.map +1 -0
  108. package/dist/reactive.es.mjs +30 -163
  109. package/dist/reactive.es.mjs.map +1 -1
  110. package/dist/router/index.d.ts +6 -252
  111. package/dist/router/index.d.ts.map +1 -1
  112. package/dist/router/links.d.ts +44 -0
  113. package/dist/router/links.d.ts.map +1 -0
  114. package/dist/router/match.d.ts +20 -0
  115. package/dist/router/match.d.ts.map +1 -0
  116. package/dist/router/navigation.d.ts +45 -0
  117. package/dist/router/navigation.d.ts.map +1 -0
  118. package/dist/router/query.d.ts +16 -0
  119. package/dist/router/query.d.ts.map +1 -0
  120. package/dist/router/router.d.ts +34 -0
  121. package/dist/router/router.d.ts.map +1 -0
  122. package/dist/router/state.d.ts +27 -0
  123. package/dist/router/state.d.ts.map +1 -0
  124. package/dist/router/types.d.ts +88 -0
  125. package/dist/router/types.d.ts.map +1 -0
  126. package/dist/router/utils.d.ts +65 -0
  127. package/dist/router/utils.d.ts.map +1 -0
  128. package/dist/router.es.mjs +168 -132
  129. package/dist/router.es.mjs.map +1 -1
  130. package/dist/sanitize-1FBEPAFH.js +272 -0
  131. package/dist/sanitize-1FBEPAFH.js.map +1 -0
  132. package/dist/security/constants.d.ts +42 -0
  133. package/dist/security/constants.d.ts.map +1 -0
  134. package/dist/security/csp.d.ts +24 -0
  135. package/dist/security/csp.d.ts.map +1 -0
  136. package/dist/security/index.d.ts +4 -2
  137. package/dist/security/index.d.ts.map +1 -1
  138. package/dist/security/sanitize-core.d.ts +13 -0
  139. package/dist/security/sanitize-core.d.ts.map +1 -0
  140. package/dist/security/sanitize.d.ts +5 -57
  141. package/dist/security/sanitize.d.ts.map +1 -1
  142. package/dist/security/trusted-types.d.ts +25 -0
  143. package/dist/security/trusted-types.d.ts.map +1 -0
  144. package/dist/security/types.d.ts +36 -0
  145. package/dist/security/types.d.ts.map +1 -0
  146. package/dist/security.es.mjs +50 -277
  147. package/dist/security.es.mjs.map +1 -1
  148. package/dist/store/create-store.d.ts +15 -0
  149. package/dist/store/create-store.d.ts.map +1 -0
  150. package/dist/store/define-store.d.ts +28 -0
  151. package/dist/store/define-store.d.ts.map +1 -0
  152. package/dist/store/devtools.d.ts +22 -0
  153. package/dist/store/devtools.d.ts.map +1 -0
  154. package/dist/store/index.d.ts +10 -286
  155. package/dist/store/index.d.ts.map +1 -1
  156. package/dist/store/mapping.d.ts +28 -0
  157. package/dist/store/mapping.d.ts.map +1 -0
  158. package/dist/store/persisted.d.ts +13 -0
  159. package/dist/store/persisted.d.ts.map +1 -0
  160. package/dist/store/plugins.d.ts +13 -0
  161. package/dist/store/plugins.d.ts.map +1 -0
  162. package/dist/store/registry.d.ts +28 -0
  163. package/dist/store/registry.d.ts.map +1 -0
  164. package/dist/store/types.d.ts +71 -0
  165. package/dist/store/types.d.ts.map +1 -0
  166. package/dist/store/utils.d.ts +28 -0
  167. package/dist/store/utils.d.ts.map +1 -0
  168. package/dist/store/watch.d.ts +23 -0
  169. package/dist/store/watch.d.ts.map +1 -0
  170. package/dist/store.es.mjs +22 -224
  171. package/dist/store.es.mjs.map +1 -1
  172. package/dist/type-guards-DRma3-Kc.js +16 -0
  173. package/dist/type-guards-DRma3-Kc.js.map +1 -0
  174. package/dist/untrack-BuEQKH7_.js +6 -0
  175. package/dist/untrack-BuEQKH7_.js.map +1 -0
  176. package/dist/view/directives/bind.d.ts +7 -0
  177. package/dist/view/directives/bind.d.ts.map +1 -0
  178. package/dist/view/directives/class.d.ts +8 -0
  179. package/dist/view/directives/class.d.ts.map +1 -0
  180. package/dist/view/directives/for.d.ts +23 -0
  181. package/dist/view/directives/for.d.ts.map +1 -0
  182. package/dist/view/directives/html.d.ts +7 -0
  183. package/dist/view/directives/html.d.ts.map +1 -0
  184. package/dist/view/directives/if.d.ts +7 -0
  185. package/dist/view/directives/if.d.ts.map +1 -0
  186. package/dist/view/directives/index.d.ts +12 -0
  187. package/dist/view/directives/index.d.ts.map +1 -0
  188. package/dist/view/directives/model.d.ts +7 -0
  189. package/dist/view/directives/model.d.ts.map +1 -0
  190. package/dist/view/directives/on.d.ts +7 -0
  191. package/dist/view/directives/on.d.ts.map +1 -0
  192. package/dist/view/directives/ref.d.ts +7 -0
  193. package/dist/view/directives/ref.d.ts.map +1 -0
  194. package/dist/view/directives/show.d.ts +7 -0
  195. package/dist/view/directives/show.d.ts.map +1 -0
  196. package/dist/view/directives/style.d.ts +7 -0
  197. package/dist/view/directives/style.d.ts.map +1 -0
  198. package/dist/view/directives/text.d.ts +7 -0
  199. package/dist/view/directives/text.d.ts.map +1 -0
  200. package/dist/view/evaluate.d.ts +43 -0
  201. package/dist/view/evaluate.d.ts.map +1 -0
  202. package/dist/view/index.d.ts +3 -93
  203. package/dist/view/index.d.ts.map +1 -1
  204. package/dist/view/mount.d.ts +69 -0
  205. package/dist/view/mount.d.ts.map +1 -0
  206. package/dist/view/process.d.ts +26 -0
  207. package/dist/view/process.d.ts.map +1 -0
  208. package/dist/view/types.d.ts +36 -0
  209. package/dist/view/types.d.ts.map +1 -0
  210. package/dist/view.es.mjs +368 -267
  211. package/dist/view.es.mjs.map +1 -1
  212. package/dist/watch-CXyaBC_9.js +58 -0
  213. package/dist/watch-CXyaBC_9.js.map +1 -0
  214. package/package.json +132 -132
  215. package/src/component/component.ts +289 -0
  216. package/src/component/html.ts +53 -0
  217. package/src/component/index.ts +40 -414
  218. package/src/component/props.ts +116 -0
  219. package/src/component/types.ts +85 -0
  220. package/src/core/collection.ts +588 -454
  221. package/src/core/dom.ts +38 -0
  222. package/src/core/element.ts +746 -740
  223. package/src/core/index.ts +43 -0
  224. package/src/core/utils/array.ts +102 -0
  225. package/src/core/utils/function.ts +110 -0
  226. package/src/core/utils/index.ts +83 -0
  227. package/src/core/utils/misc.ts +82 -0
  228. package/src/core/utils/number.ts +78 -0
  229. package/src/core/utils/object.ts +206 -0
  230. package/src/core/utils/string.ts +112 -0
  231. package/src/core/utils/type-guards.ts +112 -0
  232. package/src/full.ts +187 -150
  233. package/src/index.ts +36 -36
  234. package/src/motion/animate.ts +113 -0
  235. package/src/motion/easing.ts +40 -0
  236. package/src/motion/flip.ts +176 -0
  237. package/src/motion/index.ts +41 -358
  238. package/src/motion/keyframes.ts +46 -0
  239. package/src/motion/reduced-motion.ts +17 -0
  240. package/src/motion/scroll.ts +57 -0
  241. package/src/motion/spring.ts +150 -0
  242. package/src/motion/stagger.ts +43 -0
  243. package/src/motion/timeline.ts +246 -0
  244. package/src/motion/transition.ts +51 -0
  245. package/src/motion/types.ts +198 -0
  246. package/src/reactive/batch.ts +22 -0
  247. package/src/reactive/computed.ts +92 -0
  248. package/src/reactive/core.ts +93 -0
  249. package/src/reactive/effect.ts +43 -0
  250. package/src/reactive/index.ts +23 -22
  251. package/src/reactive/internals.ts +105 -0
  252. package/src/reactive/linked.ts +56 -0
  253. package/src/reactive/persisted.ts +74 -0
  254. package/src/reactive/readonly.ts +35 -0
  255. package/src/reactive/signal.ts +20 -520
  256. package/src/reactive/type-guards.ts +22 -0
  257. package/src/reactive/untrack.ts +31 -0
  258. package/src/reactive/watch.ts +73 -0
  259. package/src/router/index.ts +41 -718
  260. package/src/router/links.ts +130 -0
  261. package/src/router/match.ts +106 -0
  262. package/src/router/navigation.ts +71 -0
  263. package/src/router/query.ts +35 -0
  264. package/src/router/router.ts +211 -0
  265. package/src/router/state.ts +46 -0
  266. package/src/router/types.ts +93 -0
  267. package/src/router/utils.ts +116 -0
  268. package/src/security/constants.ts +209 -0
  269. package/src/security/csp.ts +77 -0
  270. package/src/security/index.ts +4 -12
  271. package/src/security/sanitize-core.ts +343 -0
  272. package/src/security/sanitize.ts +66 -625
  273. package/src/security/trusted-types.ts +69 -0
  274. package/src/security/types.ts +40 -0
  275. package/src/store/create-store.ts +329 -0
  276. package/src/store/define-store.ts +48 -0
  277. package/src/store/devtools.ts +45 -0
  278. package/src/store/index.ts +22 -848
  279. package/src/store/mapping.ts +73 -0
  280. package/src/store/persisted.ts +61 -0
  281. package/src/store/plugins.ts +32 -0
  282. package/src/store/registry.ts +51 -0
  283. package/src/store/types.ts +94 -0
  284. package/src/store/utils.ts +141 -0
  285. package/src/store/watch.ts +52 -0
  286. package/src/view/directives/bind.ts +23 -0
  287. package/src/view/directives/class.ts +70 -0
  288. package/src/view/directives/for.ts +275 -0
  289. package/src/view/directives/html.ts +19 -0
  290. package/src/view/directives/if.ts +30 -0
  291. package/src/view/directives/index.ts +11 -0
  292. package/src/view/directives/model.ts +56 -0
  293. package/src/view/directives/on.ts +41 -0
  294. package/src/view/directives/ref.ts +41 -0
  295. package/src/view/directives/show.ts +26 -0
  296. package/src/view/directives/style.ts +47 -0
  297. package/src/view/directives/text.ts +15 -0
  298. package/src/view/evaluate.ts +274 -0
  299. package/src/view/index.ts +112 -1041
  300. package/src/view/mount.ts +200 -0
  301. package/src/view/process.ts +92 -0
  302. package/src/view/types.ts +44 -0
  303. package/dist/core/utils.d.ts +0 -313
  304. package/dist/core/utils.d.ts.map +0 -1
  305. package/src/core/utils.ts +0 -444
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Router creation and lifecycle management.
3
+ * @module bquery/router
4
+ */
5
+ import type { Router, RouterOptions } from './types';
6
+ /**
7
+ * Creates and initializes a router instance.
8
+ *
9
+ * @param options - Router configuration
10
+ * @returns The router instance
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { createRouter } from 'bquery/router';
15
+ *
16
+ * const router = createRouter({
17
+ * routes: [
18
+ * { path: '/', component: () => import('./pages/Home') },
19
+ * { path: '/about', component: () => import('./pages/About') },
20
+ * { path: '/user/:id', component: () => import('./pages/User') },
21
+ * { path: '*', component: () => import('./pages/NotFound') },
22
+ * ],
23
+ * base: '/app',
24
+ * });
25
+ *
26
+ * router.beforeEach((to, from) => {
27
+ * if (to.path === '/admin' && !isAuthenticated()) {
28
+ * return false; // Cancel navigation
29
+ * }
30
+ * });
31
+ * ```
32
+ */
33
+ export declare const createRouter: (options: RouterOptions) => Router;
34
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Internal router state (active router and current route signal).
3
+ * @module bquery/router
4
+ */
5
+ import { type ReadonlySignal, type Signal } from '../reactive/index';
6
+ import type { Route, Router } from './types';
7
+ /** @internal */
8
+ export declare const routeSignal: Signal<Route>;
9
+ /**
10
+ * Reactive signal containing the current route.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { currentRoute } from 'bquery/router';
15
+ * import { effect } from 'bquery/reactive';
16
+ *
17
+ * effect(() => {
18
+ * document.title = `Page: ${currentRoute.value.path}`;
19
+ * });
20
+ * ```
21
+ */
22
+ export declare const currentRoute: ReadonlySignal<Route>;
23
+ /** @internal */
24
+ export declare const getActiveRouter: () => Router | null;
25
+ /** @internal */
26
+ export declare const setActiveRouter: (router: Router | null) => void;
27
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/router/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAoB,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAS7C,gBAAgB;AAChB,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,KAAK,CAMpC,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,KAAK,CAAqC,CAAC;AAErF,gBAAgB;AAChB,eAAO,MAAM,eAAe,QAAO,MAAM,GAAG,IAAoB,CAAC;AAEjE,gBAAgB;AAChB,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,GAAG,IAAI,KAAG,IAEvD,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Router types and public contracts.
3
+ * @module bquery/router
4
+ */
5
+ import type { ReadonlySignal } from '../reactive/index';
6
+ /**
7
+ * Represents a parsed route with matched params.
8
+ */
9
+ export type Route = {
10
+ /** The current path (e.g., '/user/42') */
11
+ path: string;
12
+ /** Extracted route params (e.g., { id: '42' }) */
13
+ params: Record<string, string>;
14
+ /**
15
+ * Query string params.
16
+ * Each key maps to a single string value by default.
17
+ * Only keys that appear multiple times in the query string become arrays.
18
+ * @example
19
+ * // ?foo=1 → { foo: '1' }
20
+ * // ?tag=a&tag=b → { tag: ['a', 'b'] }
21
+ * // ?x=1&y=2&x=3 → { x: ['1', '3'], y: '2' }
22
+ */
23
+ query: Record<string, string | string[]>;
24
+ /** The matched route definition */
25
+ matched: RouteDefinition | null;
26
+ /** Hash fragment without # */
27
+ hash: string;
28
+ };
29
+ /**
30
+ * Route definition for configuration.
31
+ */
32
+ export type RouteDefinition = {
33
+ /** Path pattern (e.g., '/user/:id', '/posts/*') */
34
+ path: string;
35
+ /** Component loader (sync or async) */
36
+ component: () => unknown | Promise<unknown>;
37
+ /** Optional route name for programmatic navigation */
38
+ name?: string;
39
+ /** Optional metadata */
40
+ meta?: Record<string, unknown>;
41
+ /** Nested child routes */
42
+ children?: RouteDefinition[];
43
+ };
44
+ /**
45
+ * Router configuration options.
46
+ */
47
+ export type RouterOptions = {
48
+ /** Array of route definitions */
49
+ routes: RouteDefinition[];
50
+ /** Base path for all routes (default: '') */
51
+ base?: string;
52
+ /** Use hash-based routing instead of history (default: false) */
53
+ hash?: boolean;
54
+ };
55
+ /**
56
+ * Navigation guard function type.
57
+ */
58
+ export type NavigationGuard = (to: Route, from: Route) => boolean | void | Promise<boolean | void>;
59
+ /**
60
+ * Router instance returned by createRouter.
61
+ */
62
+ export type Router = {
63
+ /** Navigate to a path */
64
+ push: (path: string) => Promise<void>;
65
+ /** Replace current history entry */
66
+ replace: (path: string) => Promise<void>;
67
+ /** Go back in history */
68
+ back: () => void;
69
+ /** Go forward in history */
70
+ forward: () => void;
71
+ /** Go to a specific history entry */
72
+ go: (delta: number) => void;
73
+ /** Add a beforeEach guard */
74
+ beforeEach: (guard: NavigationGuard) => () => void;
75
+ /** Add an afterEach hook */
76
+ afterEach: (hook: (to: Route, from: Route) => void) => () => void;
77
+ /** Current route (reactive) */
78
+ currentRoute: ReadonlySignal<Route>;
79
+ /** All route definitions */
80
+ routes: RouteDefinition[];
81
+ /** Base path for all routes */
82
+ base: string;
83
+ /** Whether hash-based routing is enabled */
84
+ hash: boolean;
85
+ /** Destroy the router and cleanup listeners */
86
+ destroy: () => void;
87
+ };
88
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B;;;;;;;;OAQG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACzC,mCAAmC;IACnC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,SAAS,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,iCAAiC;IACjC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,KAAK,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AAEnG;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,yBAAyB;IACzB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,oCAAoC;IACpC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,yBAAyB;IACzB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,qCAAqC;IACrC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,6BAA6B;IAC7B,UAAU,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,IAAI,CAAC;IACnD,4BAA4B;IAC5B,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAClE,+BAA+B;IAC/B,YAAY,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,4BAA4B;IAC5B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,IAAI,EAAE,OAAO,CAAC;IACd,+CAA+C;IAC/C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Router utilities.
3
+ * @module bquery/router
4
+ */
5
+ import { type ReadonlySignal } from '../reactive/index';
6
+ import type { RouteDefinition } from './types';
7
+ /**
8
+ * Flattens nested routes into a single array with full paths.
9
+ * Does NOT include the router base - base is only for browser history.
10
+ * @internal
11
+ */
12
+ export declare const flattenRoutes: (routes: RouteDefinition[], parentPath?: string) => RouteDefinition[];
13
+ /**
14
+ * Resolves a route by name and params.
15
+ *
16
+ * @param name - The route name
17
+ * @param params - Route params to interpolate
18
+ * @returns The resolved path
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * import { resolve } from 'bquery/router';
23
+ *
24
+ * const path = resolve('user', { id: '42' });
25
+ * // Returns '/user/42' if route is defined as { name: 'user', path: '/user/:id' }
26
+ * ```
27
+ */
28
+ export declare const resolve: (name: string, params?: Record<string, string>) => string;
29
+ /**
30
+ * Checks if a path matches the current route.
31
+ *
32
+ * @param path - Path to check
33
+ * @param exact - Whether to match exactly (default: false)
34
+ * @returns True if the path matches
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * import { isActive } from 'bquery/router';
39
+ *
40
+ * if (isActive('/dashboard')) {
41
+ * // Highlight nav item
42
+ * }
43
+ * ```
44
+ */
45
+ export declare const isActive: (path: string, exact?: boolean) => boolean;
46
+ /**
47
+ * Creates a computed signal that checks if a path is active.
48
+ *
49
+ * @param path - Path to check
50
+ * @param exact - Whether to match exactly
51
+ * @returns A reactive signal
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * import { isActiveSignal } from 'bquery/router';
56
+ * import { effect } from 'bquery/reactive';
57
+ *
58
+ * const dashboardActive = isActiveSignal('/dashboard');
59
+ * effect(() => {
60
+ * navItem.classList.toggle('active', dashboardActive.value);
61
+ * });
62
+ * ```
63
+ */
64
+ export declare const isActiveSignal: (path: string, exact?: boolean) => ReadonlySignal<boolean>;
65
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/router/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM/C;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,eAAe,EAAE,EAAE,mBAAe,KAAG,eAAe,EAiBzF,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,EAAE,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,KAAG,MAiB3E,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,eAAa,KAAG,OAGtD,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,EAAE,eAAa,KAAG,cAAc,CAAC,OAAO,CAKlF,CAAC"}
@@ -1,166 +1,202 @@
1
- import { computed as E, signal as S } from "./reactive.es.mjs";
2
- let h = null;
3
- const d = S({
1
+ import { c as N, s as D } from "./core-COenAZjD.js";
2
+ let M = null;
3
+ const w = D({
4
4
  path: "",
5
5
  params: {},
6
6
  query: {},
7
7
  matched: null,
8
8
  hash: ""
9
- }), _ = E(() => d.value), z = (r) => {
10
- if (r === "*")
9
+ }), K = N(() => w.value), y = () => M, k = (e) => {
10
+ M = e;
11
+ }, L = async (e, o = {}) => {
12
+ const r = y();
13
+ if (!r)
14
+ throw new Error("bQuery router: No router initialized. Call createRouter() first.");
15
+ await r[o.replace ? "replace" : "push"](e);
16
+ }, U = () => {
17
+ const e = y();
18
+ e ? e.back() : history.back();
19
+ }, Z = () => {
20
+ const e = y();
21
+ e ? e.forward() : history.forward();
22
+ }, T = (e, o = {}) => (r) => {
23
+ r.preventDefault(), L(e, o).catch((t) => {
24
+ console.error("Navigation failed:", t);
25
+ });
26
+ }, j = (e) => {
27
+ const o = e ?? (typeof document < "u" ? document.body : null);
28
+ if (!o)
29
+ return () => {
30
+ };
31
+ const r = (t) => {
32
+ if (!(t instanceof MouseEvent) || t.defaultPrevented || t.button !== 0 || t.ctrlKey || t.metaKey || t.shiftKey || t.altKey || typeof Element > "u" || !(t.target instanceof Element)) return;
33
+ const n = t.target.closest("a");
34
+ if (!n) return;
35
+ const l = n.ownerDocument.defaultView?.HTMLAnchorElement ?? HTMLAnchorElement;
36
+ if (!(n instanceof l) || n.target || n.hasAttribute("download") || typeof window > "u" || n.origin !== window.location.origin) return;
37
+ const f = y();
38
+ if (!f) {
39
+ t.preventDefault(), L(n.pathname + n.search + n.hash).catch((u) => {
40
+ console.error("Navigation failed:", u);
41
+ });
42
+ return;
43
+ }
44
+ const d = f.base, $ = f.hash;
45
+ let g;
46
+ if ($ && n.hash && n.hash.startsWith("#/"))
47
+ g = n.hash.slice(1);
48
+ else {
49
+ let u = n.pathname;
50
+ d && d !== "/" && u.startsWith(d) && (u = u.slice(d.length) || "/"), g = u + n.search + n.hash;
51
+ }
52
+ t.preventDefault(), L(g).catch((u) => {
53
+ console.error("Navigation failed:", u);
54
+ });
55
+ };
56
+ return o.addEventListener("click", r), () => o.removeEventListener("click", r);
57
+ }, _ = (e) => {
58
+ const o = {};
59
+ return new URLSearchParams(e).forEach((t, s) => {
60
+ const n = o[s];
61
+ n === void 0 ? o[s] = t : Array.isArray(n) ? n.push(t) : o[s] = [n, t];
62
+ }), o;
63
+ }, q = (e) => {
64
+ if (e === "*")
11
65
  return /^.*$/;
12
- const o = "\0P\0", e = "\0W\0", a = [];
13
- let t = r.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (u, p) => (a.push(p), o));
14
- t = t.replace(/\*/g, e), t = t.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&");
15
- let n = 0;
16
- return t = t.replace(/\u0000P\u0000/g, () => `(?<${a[n++]}>[^/]+)`), t = t.replace(/\u0000W\u0000/g, ".*"), new RegExp(`^${t}$`);
17
- }, N = (r) => {
18
- const o = r.match(/:([a-zA-Z_][a-zA-Z0-9_]*)/g);
19
- return o ? o.map((e) => e.slice(1)) : [];
20
- }, W = (r, o) => {
21
- for (const e of o) {
22
- const a = z(e.path), t = r.match(a);
23
- if (t) {
24
- const n = N(e.path), u = {};
25
- return t.groups ? Object.assign(u, t.groups) : n.forEach((p, w) => {
26
- u[p] = t[w + 1] || "";
27
- }), { matched: e, params: u };
66
+ const o = "\0P\0", r = "\0W\0";
67
+ let t = e.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, () => o);
68
+ return t = t.replace(/\*/g, r), t = t.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&"), t = t.replace(/\u0000P\u0000/g, () => "([^/]+)"), t = t.replace(/\u0000W\u0000/g, ".*"), new RegExp(`^${t}$`);
69
+ }, H = (e) => {
70
+ const o = e.match(/:([a-zA-Z_][a-zA-Z0-9_]*)/g);
71
+ return o ? o.map((r) => r.slice(1)) : [];
72
+ }, Q = (e, o) => {
73
+ for (const r of o) {
74
+ const t = q(r.path), s = e.match(t);
75
+ if (s) {
76
+ const n = H(r.path), h = {};
77
+ return n.forEach((l, f) => {
78
+ h[l] = s[f + 1] || "";
79
+ }), { matched: r, params: h };
28
80
  }
29
81
  }
30
82
  return null;
31
- }, C = (r) => {
32
- const o = {};
33
- return new URLSearchParams(r).forEach((a, t) => {
34
- const n = o[t];
35
- n === void 0 ? o[t] = a : Array.isArray(n) ? n.push(a) : o[t] = [n, a];
36
- }), o;
37
- }, y = (r, o, e, a) => {
38
- const t = W(r, a);
83
+ }, P = (e, o, r, t) => {
84
+ const s = Q(e, t);
39
85
  return {
40
- path: r,
41
- params: t?.params ?? {},
42
- query: C(o),
43
- matched: t?.matched ?? null,
44
- hash: e.replace(/^#/, "")
86
+ path: e,
87
+ params: s?.params ?? {},
88
+ query: _(o),
89
+ matched: s?.matched ?? null,
90
+ hash: r.replace(/^#/, "")
45
91
  };
46
- }, P = async (r, o = {}) => {
47
- if (!h)
48
- throw new Error("bQuery router: No router initialized. Call createRouter() first.");
49
- await h[o.replace ? "replace" : "push"](r);
50
- }, Q = () => {
51
- h ? h.back() : history.back();
52
- }, Z = () => {
53
- h ? h.forward() : history.forward();
54
- }, q = (r) => {
55
- h && h.destroy();
56
- const { routes: o, base: e = "", hash: a = !1 } = r, t = [], n = [], u = x(o, e), p = () => {
57
- if (a) {
58
- const c = window.location.hash.slice(1) || "/", [f, i = ""] = c.split("?"), [m, l = ""] = i.split("#");
92
+ }, z = (e, o = "") => {
93
+ const r = [];
94
+ for (const t of e) {
95
+ const s = t.path === "*" ? "*" : `${o}${t.path}`.replace(/\/+/g, "/");
96
+ r.push({
97
+ ...t,
98
+ path: s
99
+ }), t.children && r.push(...z(t.children, s));
100
+ }
101
+ return r;
102
+ }, I = (e, o = {}) => {
103
+ const r = y();
104
+ if (!r)
105
+ throw new Error("bQuery router: No router initialized.");
106
+ const t = r.routes.find((n) => n.name === e);
107
+ if (!t)
108
+ throw new Error(`bQuery router: Route "${e}" not found.`);
109
+ let s = t.path;
110
+ for (const [n, h] of Object.entries(o))
111
+ s = s.replace(`:${n}`, encodeURIComponent(h));
112
+ return s;
113
+ }, G = (e, o = !1) => {
114
+ const r = w.value.path;
115
+ return o ? r === e : r.startsWith(e);
116
+ }, V = (e, o = !1) => N(() => {
117
+ const r = w.value.path;
118
+ return o ? r === e : r.startsWith(e);
119
+ }), B = (e) => {
120
+ const o = y();
121
+ o && o.destroy();
122
+ const { routes: r, base: t = "", hash: s = !1 } = e, n = [], h = [], l = z(r), f = () => {
123
+ if (s) {
124
+ const i = window.location.hash.slice(1) || "/", [m, c = ""] = i.split("#"), [R, p = ""] = m.split("?");
59
125
  return {
60
- pathname: f,
61
- search: m ? `?${m}` : "",
62
- hash: l ? `#${l}` : ""
126
+ pathname: R,
127
+ search: p ? `?${p}` : "",
128
+ hash: c ? `#${c}` : ""
63
129
  };
64
130
  }
65
- let s = window.location.pathname;
66
- return e && s.startsWith(e) && (s = s.slice(e.length) || "/"), {
67
- pathname: s,
131
+ let a = window.location.pathname;
132
+ return t && (a === t || a.startsWith(t + "/")) && (a = a.slice(t.length) || "/"), {
133
+ pathname: a,
68
134
  search: window.location.search,
69
135
  hash: window.location.hash
70
136
  };
71
- }, w = () => {
72
- const { pathname: s, search: c, hash: f } = p(), i = y(s, c, f, u);
73
- d.value = i;
74
- }, $ = async (s, c) => {
75
- const { pathname: f, search: i, hash: m } = p(), l = y(f, i, m, u), g = new URL(s, window.location.origin), R = a ? s : g.pathname, k = y(R, g.search, g.hash, u);
76
- for (const v of t)
77
- if (await v(k, l) === !1)
78
- return;
79
- const L = a ? `#${s}` : `${e}${s}`;
80
- history[c]({}, "", L), w();
137
+ }, d = () => {
138
+ const { pathname: a, search: i, hash: m } = f(), c = P(a, i, m, l);
139
+ w.value = c;
140
+ }, $ = async (a, i) => {
141
+ const { pathname: m, search: c, hash: R } = f(), p = P(m, c, R, l), A = new URL(a, window.location.origin), E = P(A.pathname, A.search, A.hash, l);
81
142
  for (const v of n)
82
- v(d.value, l);
83
- }, b = async () => {
84
- const { pathname: s, search: c, hash: f } = p(), i = d.value, m = y(s, c, f, u);
85
- for (const l of t)
86
- if (await l(m, i) === !1) {
87
- const R = a ? `#${i.path}` : `${e}${i.path}`;
88
- history.pushState({}, "", R);
143
+ if (await v(E, p) === !1)
144
+ return;
145
+ const b = s ? `#${a}` : `${t}${a}`;
146
+ history[i]({}, "", b), d();
147
+ for (const v of h)
148
+ v(w.value, p);
149
+ }, g = async () => {
150
+ const { pathname: a, search: i, hash: m } = f(), c = w.value, R = P(a, i, m, l);
151
+ for (const p of n)
152
+ if (await p(R, c) === !1) {
153
+ const E = new URLSearchParams(
154
+ Object.entries(c.query).flatMap(
155
+ ([S, x]) => Array.isArray(x) ? x.map((C) => [S, C]) : [[S, x]]
156
+ )
157
+ ).toString(), b = E ? `?${E}` : "", v = c.hash ? `#${c.hash}` : "", W = s ? `#${c.path}${b}${v}` : `${t}${c.path}${b}${v}`;
158
+ history.replaceState({}, "", W);
89
159
  return;
90
160
  }
91
- w();
92
- for (const l of n)
93
- l(d.value, i);
161
+ d();
162
+ for (const p of h)
163
+ p(w.value, c);
94
164
  };
95
- window.addEventListener("popstate", b), w();
96
- const A = {
97
- push: (s) => $(s, "pushState"),
98
- replace: (s) => $(s, "replaceState"),
165
+ window.addEventListener("popstate", g), d();
166
+ const u = {
167
+ push: (a) => $(a, "pushState"),
168
+ replace: (a) => $(a, "replaceState"),
99
169
  back: () => history.back(),
100
170
  forward: () => history.forward(),
101
- go: (s) => history.go(s),
102
- beforeEach: (s) => (t.push(s), () => {
103
- const c = t.indexOf(s);
104
- c > -1 && t.splice(c, 1);
171
+ go: (a) => history.go(a),
172
+ beforeEach: (a) => (n.push(a), () => {
173
+ const i = n.indexOf(a);
174
+ i > -1 && n.splice(i, 1);
105
175
  }),
106
- afterEach: (s) => (n.push(s), () => {
107
- const c = n.indexOf(s);
108
- c > -1 && n.splice(c, 1);
176
+ afterEach: (a) => (h.push(a), () => {
177
+ const i = h.indexOf(a);
178
+ i > -1 && h.splice(i, 1);
109
179
  }),
110
- currentRoute: _,
111
- routes: u,
180
+ currentRoute: K,
181
+ routes: l,
182
+ base: t,
183
+ hash: s,
112
184
  destroy: () => {
113
- window.removeEventListener("popstate", b), t.length = 0, n.length = 0, h = null;
185
+ window.removeEventListener("popstate", g), n.length = 0, h.length = 0, k(null);
114
186
  }
115
187
  };
116
- return h = A, A;
117
- }, x = (r, o = "") => {
118
- const e = [];
119
- for (const a of r) {
120
- const t = a.path === "*" ? "*" : `${o}${a.path}`.replace(/\/+/g, "/");
121
- e.push({
122
- ...a,
123
- path: t
124
- }), a.children && e.push(...x(a.children, t));
125
- }
126
- return e;
127
- }, I = (r, o = {}) => {
128
- if (!h)
129
- throw new Error("bQuery router: No router initialized.");
130
- const e = h.routes.find((t) => t.name === r);
131
- if (!e)
132
- throw new Error(`bQuery router: Route "${r}" not found.`);
133
- let a = e.path;
134
- for (const [t, n] of Object.entries(o))
135
- a = a.replace(`:${t}`, encodeURIComponent(n));
136
- return a;
137
- }, M = (r, o = !1) => {
138
- const e = d.value.path;
139
- return o ? e === r : e.startsWith(r);
140
- }, U = (r, o = !1) => E(() => {
141
- const e = d.value.path;
142
- return o ? e === r : e.startsWith(r);
143
- }), j = (r, o = {}) => (e) => {
144
- e.preventDefault(), P(r, o);
145
- }, H = (r = document.body) => {
146
- const o = (e) => {
147
- const t = e.target.closest("a");
148
- if (!t || t.target || t.hasAttribute("download") || t.origin !== window.location.origin) return;
149
- const n = t.pathname + t.search + t.hash;
150
- e.preventDefault(), P(n);
151
- };
152
- return r.addEventListener("click", o), () => r.removeEventListener("click", o);
188
+ return k(u), u;
153
189
  };
154
190
  export {
155
- Q as back,
156
- q as createRouter,
157
- _ as currentRoute,
191
+ U as back,
192
+ B as createRouter,
193
+ K as currentRoute,
158
194
  Z as forward,
159
- H as interceptLinks,
160
- M as isActive,
161
- U as isActiveSignal,
162
- j as link,
163
- P as navigate,
195
+ j as interceptLinks,
196
+ G as isActive,
197
+ V as isActiveSignal,
198
+ T as link,
199
+ L as navigate,
164
200
  I as resolve
165
201
  };
166
202
  //# sourceMappingURL=router.es.mjs.map