@bquery/bquery 1.7.0 → 1.8.2

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 (262) hide show
  1. package/README.md +760 -716
  2. package/dist/{a11y-C5QOVvRn.js → a11y-DVBCy09c.js} +3 -3
  3. package/dist/a11y-DVBCy09c.js.map +1 -0
  4. package/dist/a11y.es.mjs +1 -1
  5. package/dist/component/library.d.ts.map +1 -1
  6. package/dist/{component-CuuTijA6.js → component-L3-JfOFz.js} +5 -5
  7. package/dist/component-L3-JfOFz.js.map +1 -0
  8. package/dist/component.es.mjs +1 -1
  9. package/dist/{config-BW35FKuA.js → config-DhT9auRm.js} +1 -1
  10. package/dist/{config-BW35FKuA.js.map → config-DhT9auRm.js.map} +1 -1
  11. package/dist/{constraints-3lV9yyBw.js → constraints-D5RHQLmP.js} +1 -1
  12. package/dist/constraints-D5RHQLmP.js.map +1 -0
  13. package/dist/core/collection.d.ts +86 -0
  14. package/dist/core/collection.d.ts.map +1 -1
  15. package/dist/core/element.d.ts +28 -0
  16. package/dist/core/element.d.ts.map +1 -1
  17. package/dist/core/shared.d.ts +6 -0
  18. package/dist/core/shared.d.ts.map +1 -1
  19. package/dist/core-DdtZHzsS.js +168 -0
  20. package/dist/core-DdtZHzsS.js.map +1 -0
  21. package/dist/{core-Cjl7GUu8.js → core-EMYSLzaT.js} +289 -259
  22. package/dist/core-EMYSLzaT.js.map +1 -0
  23. package/dist/core.es.mjs +48 -47
  24. package/dist/{custom-directives-7wAShnnd.js → custom-directives-Dr4C5lVV.js} +1 -1
  25. package/dist/custom-directives-Dr4C5lVV.js.map +1 -0
  26. package/dist/{devtools-D2fQLhDN.js → devtools-BhB2iDPT.js} +2 -2
  27. package/dist/devtools-BhB2iDPT.js.map +1 -0
  28. package/dist/devtools.es.mjs +1 -1
  29. package/dist/{dnd-B8EgyzaI.js → dnd-NwZBYh4l.js} +1 -1
  30. package/dist/dnd-NwZBYh4l.js.map +1 -0
  31. package/dist/dnd.es.mjs +1 -1
  32. package/dist/{env-NeVmr4Gf.js → env-CTdvLaH2.js} +1 -1
  33. package/dist/env-CTdvLaH2.js.map +1 -0
  34. package/dist/forms/create-form.d.ts.map +1 -1
  35. package/dist/forms/index.d.ts +3 -2
  36. package/dist/forms/index.d.ts.map +1 -1
  37. package/dist/forms/types.d.ts +46 -0
  38. package/dist/forms/types.d.ts.map +1 -1
  39. package/dist/forms/use-field.d.ts +34 -0
  40. package/dist/forms/use-field.d.ts.map +1 -0
  41. package/dist/forms/validators.d.ts +25 -0
  42. package/dist/forms/validators.d.ts.map +1 -1
  43. package/dist/forms-UcRHsYxC.js +227 -0
  44. package/dist/forms-UcRHsYxC.js.map +1 -0
  45. package/dist/forms.es.mjs +14 -12
  46. package/dist/full.d.ts +17 -26
  47. package/dist/full.d.ts.map +1 -1
  48. package/dist/full.es.mjs +206 -181
  49. package/dist/full.iife.js +33 -33
  50. package/dist/full.iife.js.map +1 -1
  51. package/dist/full.umd.js +33 -33
  52. package/dist/full.umd.js.map +1 -1
  53. package/dist/function-Cybd57JV.js +33 -0
  54. package/dist/function-Cybd57JV.js.map +1 -0
  55. package/dist/{i18n-BnnhTFOS.js → i18n-kuF6Ekj6.js} +3 -3
  56. package/dist/i18n-kuF6Ekj6.js.map +1 -0
  57. package/dist/i18n.es.mjs +1 -1
  58. package/dist/index.es.mjs +251 -228
  59. package/dist/media/breakpoints.d.ts.map +1 -1
  60. package/dist/media/types.d.ts +2 -2
  61. package/dist/media/types.d.ts.map +1 -1
  62. package/dist/{media-Di2Ta22s.js → media-i-fB5WxI.js} +3 -3
  63. package/dist/media-i-fB5WxI.js.map +1 -0
  64. package/dist/media.es.mjs +1 -1
  65. package/dist/{motion-qPj_TYGv.js → motion-BJsAuULb.js} +2 -2
  66. package/dist/motion-BJsAuULb.js.map +1 -0
  67. package/dist/motion.es.mjs +1 -1
  68. package/dist/{mount-SM07RUa6.js → mount-B4Y8bk8Z.js} +5 -5
  69. package/dist/mount-B4Y8bk8Z.js.map +1 -0
  70. package/dist/{platform-CPbCprb6.js → platform-Dw2gE3zI.js} +3 -3
  71. package/dist/{platform-CPbCprb6.js.map → platform-Dw2gE3zI.js.map} +1 -1
  72. package/dist/platform.es.mjs +2 -2
  73. package/dist/plugin/registry.d.ts.map +1 -1
  74. package/dist/{plugin-cPoOHFLY.js → plugin-C2WuC8SF.js} +20 -18
  75. package/dist/plugin-C2WuC8SF.js.map +1 -0
  76. package/dist/plugin.es.mjs +1 -1
  77. package/dist/reactive/async-data.d.ts +28 -3
  78. package/dist/reactive/async-data.d.ts.map +1 -1
  79. package/dist/reactive/computed.d.ts +3 -0
  80. package/dist/reactive/computed.d.ts.map +1 -1
  81. package/dist/reactive/effect.d.ts +3 -0
  82. package/dist/reactive/effect.d.ts.map +1 -1
  83. package/dist/reactive/http.d.ts +194 -0
  84. package/dist/reactive/http.d.ts.map +1 -0
  85. package/dist/reactive/index.d.ts +2 -2
  86. package/dist/reactive/index.d.ts.map +1 -1
  87. package/dist/reactive/pagination.d.ts +126 -0
  88. package/dist/reactive/pagination.d.ts.map +1 -0
  89. package/dist/reactive/polling.d.ts +55 -0
  90. package/dist/reactive/polling.d.ts.map +1 -0
  91. package/dist/reactive/readonly.d.ts +20 -1
  92. package/dist/reactive/readonly.d.ts.map +1 -1
  93. package/dist/reactive/rest.d.ts +293 -0
  94. package/dist/reactive/rest.d.ts.map +1 -0
  95. package/dist/reactive/scope.d.ts +140 -0
  96. package/dist/reactive/scope.d.ts.map +1 -0
  97. package/dist/reactive/signal.d.ts +16 -2
  98. package/dist/reactive/signal.d.ts.map +1 -1
  99. package/dist/reactive/to-value.d.ts +57 -0
  100. package/dist/reactive/to-value.d.ts.map +1 -0
  101. package/dist/reactive/websocket.d.ts +285 -0
  102. package/dist/reactive/websocket.d.ts.map +1 -0
  103. package/dist/reactive-DwkhUJfP.js +1148 -0
  104. package/dist/reactive-DwkhUJfP.js.map +1 -0
  105. package/dist/reactive.es.mjs +38 -19
  106. package/dist/{registry-CWf368tT.js → registry-B08iilIh.js} +1 -1
  107. package/dist/{registry-CWf368tT.js.map → registry-B08iilIh.js.map} +1 -1
  108. package/dist/router/constraints.d.ts.map +1 -1
  109. package/dist/router/index.d.ts +1 -1
  110. package/dist/router/index.d.ts.map +1 -1
  111. package/dist/router/router.d.ts.map +1 -1
  112. package/dist/router/state.d.ts +25 -2
  113. package/dist/router/state.d.ts.map +1 -1
  114. package/dist/router-CQikC9Ed.js +492 -0
  115. package/dist/router-CQikC9Ed.js.map +1 -0
  116. package/dist/router.es.mjs +9 -8
  117. package/dist/ssr/hydrate.d.ts.map +1 -1
  118. package/dist/{ssr-B2qd_WBB.js → ssr-_dAcGdzu.js} +4 -4
  119. package/dist/ssr-_dAcGdzu.js.map +1 -0
  120. package/dist/ssr.es.mjs +1 -1
  121. package/dist/store/persisted.d.ts.map +1 -1
  122. package/dist/{store-DWpyH6p5.js → store-Cb3gPRve.js} +7 -7
  123. package/dist/store-Cb3gPRve.js.map +1 -0
  124. package/dist/store.es.mjs +2 -2
  125. package/dist/storybook.es.mjs.map +1 -1
  126. package/dist/{testing-CsqjNUyy.js → testing-C5Sjfsna.js} +8 -8
  127. package/dist/testing-C5Sjfsna.js.map +1 -0
  128. package/dist/testing.es.mjs +1 -1
  129. package/dist/{type-guards-Do9DWgNp.js → type-guards-BMX2c0LP.js} +1 -1
  130. package/dist/{type-guards-Do9DWgNp.js.map → type-guards-BMX2c0LP.js.map} +1 -1
  131. package/dist/untrack-D0fnO5k2.js +36 -0
  132. package/dist/untrack-D0fnO5k2.js.map +1 -0
  133. package/dist/view/custom-directives.d.ts.map +1 -1
  134. package/dist/view.es.mjs +4 -4
  135. package/package.json +178 -177
  136. package/src/a11y/announce.ts +131 -131
  137. package/src/a11y/audit.ts +314 -314
  138. package/src/a11y/index.ts +68 -68
  139. package/src/a11y/media-preferences.ts +255 -255
  140. package/src/a11y/roving-tab-index.ts +164 -164
  141. package/src/a11y/skip-link.ts +255 -255
  142. package/src/a11y/trap-focus.ts +184 -184
  143. package/src/a11y/types.ts +183 -183
  144. package/src/component/component.ts +599 -599
  145. package/src/component/html.ts +153 -153
  146. package/src/component/index.ts +52 -52
  147. package/src/component/library.ts +540 -542
  148. package/src/component/scope.ts +212 -212
  149. package/src/component/types.ts +310 -310
  150. package/src/core/collection.ts +876 -707
  151. package/src/core/element.ts +1015 -981
  152. package/src/core/env.ts +60 -60
  153. package/src/core/index.ts +49 -49
  154. package/src/core/shared.ts +77 -62
  155. package/src/core/utils/index.ts +148 -148
  156. package/src/devtools/devtools.ts +410 -410
  157. package/src/devtools/index.ts +48 -48
  158. package/src/devtools/types.ts +104 -104
  159. package/src/dnd/draggable.ts +296 -296
  160. package/src/dnd/droppable.ts +228 -228
  161. package/src/dnd/index.ts +62 -62
  162. package/src/dnd/sortable.ts +307 -307
  163. package/src/dnd/types.ts +293 -293
  164. package/src/forms/create-form.ts +320 -278
  165. package/src/forms/index.ts +70 -65
  166. package/src/forms/types.ts +203 -154
  167. package/src/forms/use-field.ts +231 -0
  168. package/src/forms/validators.ts +294 -265
  169. package/src/full.ts +554 -480
  170. package/src/i18n/formatting.ts +67 -67
  171. package/src/i18n/i18n.ts +200 -200
  172. package/src/i18n/index.ts +67 -67
  173. package/src/i18n/translate.ts +182 -182
  174. package/src/i18n/types.ts +171 -171
  175. package/src/index.ts +108 -108
  176. package/src/media/battery.ts +116 -116
  177. package/src/media/breakpoints.ts +129 -131
  178. package/src/media/clipboard.ts +80 -80
  179. package/src/media/device-sensors.ts +158 -158
  180. package/src/media/geolocation.ts +119 -119
  181. package/src/media/index.ts +76 -76
  182. package/src/media/media-query.ts +92 -92
  183. package/src/media/network.ts +115 -115
  184. package/src/media/types.ts +177 -177
  185. package/src/media/viewport.ts +84 -84
  186. package/src/motion/index.ts +57 -57
  187. package/src/motion/morph.ts +151 -151
  188. package/src/motion/parallax.ts +120 -120
  189. package/src/motion/reduced-motion.ts +66 -66
  190. package/src/motion/types.ts +271 -271
  191. package/src/motion/typewriter.ts +164 -164
  192. package/src/plugin/index.ts +37 -37
  193. package/src/plugin/registry.ts +284 -269
  194. package/src/plugin/types.ts +137 -137
  195. package/src/reactive/async-data.ts +250 -29
  196. package/src/reactive/computed.ts +144 -130
  197. package/src/reactive/effect.ts +29 -6
  198. package/src/reactive/http.ts +790 -0
  199. package/src/reactive/index.ts +60 -0
  200. package/src/reactive/pagination.ts +317 -0
  201. package/src/reactive/polling.ts +179 -0
  202. package/src/reactive/readonly.ts +52 -8
  203. package/src/reactive/rest.ts +859 -0
  204. package/src/reactive/scope.ts +276 -0
  205. package/src/reactive/signal.ts +61 -1
  206. package/src/reactive/to-value.ts +71 -0
  207. package/src/reactive/websocket.ts +849 -0
  208. package/src/router/bq-link.ts +279 -279
  209. package/src/router/constraints.ts +204 -201
  210. package/src/router/index.ts +49 -49
  211. package/src/router/match.ts +312 -312
  212. package/src/router/path-pattern.ts +52 -52
  213. package/src/router/query.ts +38 -38
  214. package/src/router/router.ts +421 -402
  215. package/src/router/state.ts +51 -3
  216. package/src/router/types.ts +139 -139
  217. package/src/router/use-route.ts +68 -68
  218. package/src/router/utils.ts +157 -157
  219. package/src/security/index.ts +12 -12
  220. package/src/ssr/hydrate.ts +84 -82
  221. package/src/ssr/index.ts +70 -70
  222. package/src/ssr/render.ts +508 -508
  223. package/src/ssr/serialize.ts +296 -296
  224. package/src/ssr/types.ts +81 -81
  225. package/src/store/create-store.ts +467 -467
  226. package/src/store/index.ts +27 -27
  227. package/src/store/persisted.ts +245 -249
  228. package/src/store/types.ts +247 -247
  229. package/src/store/utils.ts +135 -135
  230. package/src/storybook/index.ts +480 -480
  231. package/src/testing/index.ts +42 -42
  232. package/src/testing/testing.ts +593 -593
  233. package/src/testing/types.ts +170 -170
  234. package/src/view/custom-directives.ts +28 -30
  235. package/src/view/evaluate.ts +292 -292
  236. package/src/view/process.ts +108 -108
  237. package/dist/a11y-C5QOVvRn.js.map +0 -1
  238. package/dist/component-CuuTijA6.js.map +0 -1
  239. package/dist/constraints-3lV9yyBw.js.map +0 -1
  240. package/dist/core-Cjl7GUu8.js.map +0 -1
  241. package/dist/core-DnlyjbF2.js +0 -112
  242. package/dist/core-DnlyjbF2.js.map +0 -1
  243. package/dist/custom-directives-7wAShnnd.js.map +0 -1
  244. package/dist/devtools-D2fQLhDN.js.map +0 -1
  245. package/dist/dnd-B8EgyzaI.js.map +0 -1
  246. package/dist/env-NeVmr4Gf.js.map +0 -1
  247. package/dist/forms-C3yovgH9.js +0 -141
  248. package/dist/forms-C3yovgH9.js.map +0 -1
  249. package/dist/i18n-BnnhTFOS.js.map +0 -1
  250. package/dist/media-Di2Ta22s.js.map +0 -1
  251. package/dist/motion-qPj_TYGv.js.map +0 -1
  252. package/dist/mount-SM07RUa6.js.map +0 -1
  253. package/dist/plugin-cPoOHFLY.js.map +0 -1
  254. package/dist/reactive-Cfv0RK6x.js +0 -233
  255. package/dist/reactive-Cfv0RK6x.js.map +0 -1
  256. package/dist/router-BrthaP_z.js +0 -473
  257. package/dist/router-BrthaP_z.js.map +0 -1
  258. package/dist/ssr-B2qd_WBB.js.map +0 -1
  259. package/dist/store-DWpyH6p5.js.map +0 -1
  260. package/dist/testing-CsqjNUyy.js.map +0 -1
  261. package/dist/untrack-DJVQQ2WM.js +0 -33
  262. package/dist/untrack-DJVQQ2WM.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"platform-CPbCprb6.js","names":[],"sources":["../src/platform/buckets.ts","../src/platform/cache.ts","../src/platform/cookies.ts","../src/platform/notifications.ts","../src/platform/announcer.ts","../src/platform/meta.ts","../src/platform/storage.ts"],"sourcesContent":["/**\n * Storage Buckets API wrapper.\n * Provides a simplified interface for storing blobs and binary data.\n * Falls back to IndexedDB when Storage Buckets API is not available.\n */\n\n/**\n * Bucket interface for blob storage operations.\n */\nexport interface Bucket {\n /**\n * Store a blob in the bucket.\n * @param key - Unique identifier for the blob\n * @param data - Blob data to store\n */\n put(key: string, data: Blob): Promise<void>;\n\n /**\n * Retrieve a blob from the bucket.\n * @param key - Blob identifier\n * @returns The stored blob or null if not found\n */\n get(key: string): Promise<Blob | null>;\n\n /**\n * Remove a blob from the bucket.\n * @param key - Blob identifier\n */\n remove(key: string): Promise<void>;\n\n /**\n * List all keys in the bucket.\n * @returns Array of blob keys\n */\n keys(): Promise<string[]>;\n}\n\n/**\n * IndexedDB-based bucket implementation.\n * Used as fallback when Storage Buckets API is unavailable.\n */\nclass IndexedDBBucket implements Bucket {\n private dbPromise: Promise<IDBDatabase> | null = null;\n private readonly storeName = 'blobs';\n\n constructor(private readonly bucketName: string) {}\n\n private openDB(): Promise<IDBDatabase> {\n if (this.dbPromise) return this.dbPromise;\n\n const dbName = `bquery-bucket-${this.bucketName}`;\n this.dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(dbName, 1);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(this.storeName)) {\n db.createObjectStore(this.storeName);\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n\n return this.dbPromise;\n }\n\n private async withStore<T>(\n mode: IDBTransactionMode,\n operation: (store: IDBObjectStore) => IDBRequest<T>\n ): Promise<T> {\n const db = await this.openDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(this.storeName, mode);\n const store = tx.objectStore(this.storeName);\n const request = operation(store);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n async put(key: string, data: Blob): Promise<void> {\n await this.withStore('readwrite', (store) => store.put(data, key));\n }\n\n async get(key: string): Promise<Blob | null> {\n const result = await this.withStore<Blob | undefined>('readonly', (store) => store.get(key));\n return result ?? null;\n }\n\n async remove(key: string): Promise<void> {\n await this.withStore('readwrite', (store) => store.delete(key));\n }\n\n async keys(): Promise<string[]> {\n const result = await this.withStore<IDBValidKey[]>('readonly', (store) => store.getAllKeys());\n return result.map((key) => String(key));\n }\n}\n\n/**\n * Bucket manager for creating and accessing storage buckets.\n */\nexport const buckets = {\n /**\n * Open or create a storage bucket.\n * @param name - Bucket name\n * @returns Bucket instance for blob operations\n */\n async open(name: string): Promise<Bucket> {\n // Storage Buckets API is experimental; use IndexedDB fallback\n return new IndexedDBBucket(name);\n },\n};\n","/**\n * Cache Storage API wrapper.\n * Provides a simplified interface for caching responses and assets.\n */\n\n/**\n * Cache handle interface for managing cached resources.\n */\nexport interface CacheHandle {\n /**\n * Add a resource to the cache by URL.\n * Fetches the resource and stores the response.\n * @param url - URL to fetch and cache\n */\n add(url: string): Promise<void>;\n\n /**\n * Add multiple resources to the cache.\n * @param urls - Array of URLs to fetch and cache\n */\n addAll(urls: string[]): Promise<void>;\n\n /**\n * Store a custom response in the cache.\n * @param url - URL key for the cached response\n * @param response - Response object to cache\n */\n put(url: string, response: Response): Promise<void>;\n\n /**\n * Retrieve a cached response.\n * @param url - URL to look up\n * @returns Cached Response or undefined if not found\n */\n match(url: string): Promise<Response | undefined>;\n\n /**\n * Remove a cached response.\n * @param url - URL to remove from cache\n * @returns True if the entry was deleted\n */\n remove(url: string): Promise<boolean>;\n\n /**\n * Get all cached request URLs.\n * @returns Array of cached URLs\n */\n keys(): Promise<string[]>;\n}\n\n/**\n * Internal cache handle implementation.\n */\nclass CacheHandleImpl implements CacheHandle {\n constructor(private readonly cache: Cache) {}\n\n async add(url: string): Promise<void> {\n await this.cache.add(url);\n }\n\n async addAll(urls: string[]): Promise<void> {\n await this.cache.addAll(urls);\n }\n\n async put(url: string, response: Response): Promise<void> {\n await this.cache.put(url, response);\n }\n\n async match(url: string): Promise<Response | undefined> {\n return this.cache.match(url);\n }\n\n async remove(url: string): Promise<boolean> {\n return this.cache.delete(url);\n }\n\n async keys(): Promise<string[]> {\n const requests = await this.cache.keys();\n return requests.map((req) => req.url);\n }\n}\n\n/**\n * Cache manager for accessing the Cache Storage API.\n */\nexport const cache = {\n /**\n * Check if Cache Storage API is supported.\n * @returns True if caches API is available\n */\n isSupported(): boolean {\n return 'caches' in window;\n },\n\n /**\n * Open or create a named cache.\n * @param name - Cache name\n * @returns CacheHandle for cache operations\n */\n async open(name: string): Promise<CacheHandle> {\n if (!this.isSupported()) {\n throw new Error('bQuery: Cache Storage API not supported');\n }\n const c = await caches.open(name);\n return new CacheHandleImpl(c);\n },\n\n /**\n * Delete a named cache.\n * @param name - Cache name to delete\n * @returns True if the cache was deleted\n */\n async delete(name: string): Promise<boolean> {\n if (!this.isSupported()) {\n return false;\n }\n return caches.delete(name);\n },\n\n /**\n * List all cache names.\n * @returns Array of cache names\n */\n async keys(): Promise<string[]> {\n if (!this.isSupported()) {\n return [];\n }\n return caches.keys();\n },\n};\n","/**\n * Reactive cookie helpers.\n *\n * @module bquery/platform\n */\n\nimport { effect, signal, type Signal } from '../reactive/signal';\nimport { getBqueryConfig } from './config';\n\n/** Options for useCookie(). */\nexport interface UseCookieOptions<T> {\n /** Default value when the cookie is not present. */\n defaultValue?: T;\n /** Cookie path. Defaults to the global config or `/`. */\n path?: string;\n /** Optional cookie domain. */\n domain?: string;\n /** Cookie SameSite attribute. */\n sameSite?: 'Strict' | 'Lax' | 'None';\n /** Whether the cookie should be marked secure. */\n secure?: boolean;\n /** Cookie expiry date. */\n expires?: Date;\n /** Cookie max-age in seconds. */\n maxAge?: number;\n /** Automatically persist signal updates back to document.cookie. */\n watch?: boolean;\n /** Serialize a value before writing it into the cookie. */\n serialize?: (value: T) => string;\n /** Deserialize a cookie string into a typed value. */\n deserialize?: (value: string) => T;\n}\n\nconst readCookie = (name: string): string | null => {\n if (typeof document === 'undefined') return null;\n\n const prefix = `${encodeURIComponent(name)}=`;\n const segments = document.cookie ? document.cookie.split(';') : [];\n\n for (const segment of segments) {\n const normalizedSegment = segment.trim();\n if (normalizedSegment.startsWith(prefix)) {\n const rawValue = normalizedSegment.slice(prefix.length);\n try {\n return decodeURIComponent(rawValue);\n } catch {\n return rawValue;\n }\n }\n }\n\n return null;\n};\n\nconst requiresJsonParsing = (value: string): boolean => {\n const normalized = value.trim();\n return normalized.startsWith('{') || normalized.startsWith('[') || normalized.startsWith('\"');\n};\n\nconst removeCookie = (\n name: string,\n options: Pick<UseCookieOptions<unknown>, 'path' | 'domain' | 'sameSite' | 'secure'>\n): void => {\n if (typeof document === 'undefined') return;\n\n const segments = [`${encodeURIComponent(name)}=`, 'Expires=Thu, 01 Jan 1970 00:00:00 GMT'];\n\n if (options.path) segments.push(`Path=${options.path}`);\n if (options.domain) segments.push(`Domain=${options.domain}`);\n if (options.sameSite) segments.push(`SameSite=${options.sameSite}`);\n if (options.secure) segments.push('Secure');\n\n document.cookie = segments.join('; ');\n};\n\nconst writeCookie = <T>(name: string, value: T, options: UseCookieOptions<T>): void => {\n if (typeof document === 'undefined') return;\n\n const serialized = options.serialize\n ? options.serialize(value)\n : typeof value === 'string'\n ? value\n : JSON.stringify(value);\n\n const segments = [`${encodeURIComponent(name)}=${encodeURIComponent(serialized)}`];\n\n if (options.path) segments.push(`Path=${options.path}`);\n if (options.domain) segments.push(`Domain=${options.domain}`);\n if (typeof options.maxAge === 'number') segments.push(`Max-Age=${options.maxAge}`);\n if (options.expires) segments.push(`Expires=${options.expires.toUTCString()}`);\n if (options.sameSite) segments.push(`SameSite=${options.sameSite}`);\n if (options.secure) segments.push('Secure');\n\n document.cookie = segments.join('; ');\n};\n\n/**\n * Create a reactive cookie signal.\n *\n * @template T - Cookie value type\n * @param name - Cookie name\n * @param options - Read/write configuration for the cookie\n * @returns Reactive signal representing the cookie value\n *\n * @example\n * ```ts\n * const theme = useCookie('theme', { defaultValue: 'light' });\n * theme.value = 'dark';\n * ```\n */\nexport const useCookie = <T>(name: string, options: UseCookieOptions<T> = {}): Signal<T | null> => {\n const cookieConfig = getBqueryConfig().cookies;\n const resolvedOptions: UseCookieOptions<T> = {\n path: cookieConfig?.path ?? '/',\n sameSite: cookieConfig?.sameSite ?? 'Lax',\n secure: cookieConfig?.secure ?? false,\n watch: true,\n ...options,\n };\n\n if (resolvedOptions.sameSite === 'None') {\n resolvedOptions.secure = true;\n }\n\n const raw = readCookie(name);\n let initialValue = (resolvedOptions.defaultValue ?? null) as T | null;\n\n if (raw !== null) {\n try {\n initialValue = resolvedOptions.deserialize\n ? resolvedOptions.deserialize(raw)\n : requiresJsonParsing(raw)\n ? (JSON.parse(raw) as T)\n : ((raw as T) ?? initialValue);\n } catch (error) {\n console.warn(`bQuery: Failed to deserialize cookie \"${name}\", using raw string value`, error);\n initialValue = (raw as T) ?? initialValue;\n }\n }\n\n const cookie = signal<T | null>(initialValue);\n\n if (typeof document === 'undefined' || resolvedOptions.watch === false) {\n return cookie;\n }\n\n let initialized = false;\n effect(() => {\n const nextValue = cookie.value;\n\n if (!initialized) {\n initialized = true;\n return;\n }\n\n if (nextValue == null) {\n removeCookie(name, resolvedOptions);\n return;\n }\n\n writeCookie(name, nextValue, resolvedOptions);\n });\n\n return cookie;\n};\n","/**\n * Web Notifications API wrapper.\n * Provides a simplified interface for browser notifications.\n */\n\n/**\n * Notification options matching the standard NotificationOptions interface.\n */\nexport interface NotificationOptions {\n /** Body text of the notification */\n body?: string;\n /** Icon URL for the notification */\n icon?: string;\n /** Badge icon for mobile devices */\n badge?: string;\n /** Tag for grouping notifications */\n tag?: string;\n /** Whether to require user interaction */\n requireInteraction?: boolean;\n /** Vibration pattern for mobile devices */\n vibrate?: number[];\n /** Additional data attached to the notification */\n data?: unknown;\n}\n\n/**\n * Notifications manager providing a clean interface for web notifications.\n */\nexport const notifications = {\n /**\n * Check if notifications are supported.\n * @returns True if Notification API is available\n */\n isSupported(): boolean {\n return 'Notification' in window;\n },\n\n /**\n * Get current permission status.\n * @returns Current permission state\n */\n getPermission(): NotificationPermission {\n if (!this.isSupported()) return 'denied';\n return Notification.permission;\n },\n\n /**\n * Request notification permission from the user.\n * @returns Promise resolving to the permission result\n */\n async requestPermission(): Promise<NotificationPermission> {\n if (!this.isSupported()) {\n return 'denied';\n }\n\n if (Notification.permission === 'granted') {\n return 'granted';\n }\n\n if (Notification.permission === 'denied') {\n return 'denied';\n }\n\n return Notification.requestPermission();\n },\n\n /**\n * Send a notification.\n * Requires 'granted' permission.\n * @param title - Notification title\n * @param options - Optional notification settings\n * @returns The Notification instance or null if not permitted\n */\n send(title: string, options?: NotificationOptions): Notification | null {\n if (!this.isSupported()) {\n console.warn('bQuery: Notifications not supported in this browser');\n return null;\n }\n\n if (Notification.permission !== 'granted') {\n console.warn('bQuery: Notification permission not granted');\n return null;\n }\n\n return new Notification(title, options);\n },\n};\n","/**\n * Accessibility live-region announcer helpers.\n *\n * @module bquery/platform\n */\n\nimport { effect, signal, type Signal } from '../reactive/signal';\nimport { getBqueryConfig } from './config';\n\n/** Options for creating an announcer. */\nexport interface UseAnnouncerOptions {\n /** Live region politeness. */\n politeness?: 'polite' | 'assertive';\n /** Whether the live region should be atomic. */\n atomic?: boolean;\n /** Delay before applying the message. */\n delay?: number;\n /** Delay after which the message is cleared automatically. */\n clearDelay?: number;\n /** Optional element id for the live region. */\n id?: string;\n /** Optional CSS class name. */\n className?: string;\n /** Optional container used to append the live region. */\n container?: HTMLElement;\n}\n\n/** Runtime options for a single announcement. */\nexport interface AnnounceOptions {\n /** Override politeness for this specific announcement. */\n politeness?: 'polite' | 'assertive';\n /** Override the message delay for this specific announcement. */\n delay?: number;\n /** Override the auto-clear delay for this specific announcement. */\n clearDelay?: number;\n}\n\n/** Returned announcer API. */\nexport interface AnnouncerHandle {\n /** The live region element or null outside the DOM. */\n element: HTMLElement | null;\n /** Reactive message signal. */\n message: Signal<string>;\n /** Announce a message to assistive technologies. */\n announce: (value: string, options?: AnnounceOptions) => void;\n /** Clear the current announcement. */\n clear: () => void;\n /** Remove the live region if it was created by this announcer. */\n destroy: () => void;\n}\n\nconst visuallyHiddenStyle = [\n 'position:absolute',\n 'width:1px',\n 'height:1px',\n 'padding:0',\n 'margin:-1px',\n 'overflow:hidden',\n 'clip:rect(0, 0, 0, 0)',\n 'white-space:nowrap',\n 'border:0',\n].join(';');\n\n/**\n * Create or reuse an accessible live region.\n *\n * @param options - Live region configuration\n * @returns An announcer handle with announce(), clear(), and destroy()\n *\n * @example\n * ```ts\n * const announcer = useAnnouncer();\n * announcer.announce('Saved successfully');\n * ```\n */\nexport const useAnnouncer = (options: UseAnnouncerOptions = {}): AnnouncerHandle => {\n const defaults = getBqueryConfig().announcer;\n const resolvedOptions: Required<\n Pick<UseAnnouncerOptions, 'politeness' | 'atomic' | 'delay' | 'clearDelay'>\n > &\n UseAnnouncerOptions = {\n politeness: defaults?.politeness ?? 'polite',\n atomic: defaults?.atomic ?? true,\n delay: defaults?.delay ?? 16,\n clearDelay: defaults?.clearDelay ?? 1000,\n ...options,\n };\n\n const message = signal('');\n\n if (typeof document === 'undefined') {\n return {\n element: null,\n message,\n announce(value: string) {\n message.value = value;\n },\n clear() {\n message.value = '';\n },\n destroy() {\n message.value = '';\n },\n };\n }\n\n const existing = resolvedOptions.id ? document.getElementById(resolvedOptions.id) : null;\n const element = (existing ?? document.createElement('div')) as HTMLElement;\n const created = !existing;\n\n if (resolvedOptions.id) {\n element.id = resolvedOptions.id;\n }\n\n if (resolvedOptions.className) {\n element.className = resolvedOptions.className;\n }\n\n element.setAttribute('aria-live', resolvedOptions.politeness);\n element.setAttribute('aria-atomic', String(resolvedOptions.atomic));\n element.setAttribute('role', resolvedOptions.politeness === 'assertive' ? 'alert' : 'status');\n element.setAttribute('data-bquery-announcer', 'true');\n if (!element.getAttribute('style')) {\n element.setAttribute('style', visuallyHiddenStyle);\n }\n\n if (created) {\n const parent = resolvedOptions.container ?? document.body ?? document.documentElement;\n if (!parent) {\n return {\n element: null,\n message,\n announce(value: string) {\n message.value = value;\n },\n clear() {\n message.value = '';\n },\n destroy() {\n message.value = '';\n },\n };\n }\n parent.appendChild(element);\n }\n\n const disposeMessageEffect = effect(() => {\n element.textContent = message.value;\n });\n\n let messageTimer: ReturnType<typeof setTimeout> | undefined;\n let clearTimer: ReturnType<typeof setTimeout> | undefined;\n let destroyed = false;\n\n const clearTimers = (): void => {\n if (messageTimer) {\n clearTimeout(messageTimer);\n messageTimer = undefined;\n }\n if (clearTimer) {\n clearTimeout(clearTimer);\n clearTimer = undefined;\n }\n };\n\n const clear = (): void => {\n if (destroyed) return;\n clearTimers();\n message.value = '';\n };\n\n const announce = (value: string, announceOptions: AnnounceOptions = {}): void => {\n if (destroyed) return;\n const politeness = announceOptions.politeness ?? resolvedOptions.politeness;\n const delay = announceOptions.delay ?? resolvedOptions.delay;\n const clearDelay = announceOptions.clearDelay ?? resolvedOptions.clearDelay;\n\n clearTimers();\n\n element.setAttribute('aria-live', politeness);\n element.setAttribute('role', politeness === 'assertive' ? 'alert' : 'status');\n message.value = '';\n\n messageTimer = setTimeout(() => {\n if (destroyed) return;\n message.value = value;\n if (clearDelay > 0) {\n clearTimer = setTimeout(() => {\n if (destroyed) return;\n message.value = '';\n }, clearDelay);\n }\n }, delay);\n };\n\n const destroy = (): void => {\n if (destroyed) return;\n destroyed = true;\n clearTimers();\n message.value = '';\n disposeMessageEffect();\n if (created) {\n element.remove();\n }\n };\n\n return { element, message, announce, clear, destroy };\n};\n","/**\n * Document title and meta helpers.\n *\n * @module bquery/platform\n */\n\nimport { getBqueryConfig } from './config';\n\n/** Meta tag definition. */\nexport interface PageMetaTag {\n /** Standard meta name attribute. */\n name?: string;\n /** Open Graph / custom property attribute. */\n property?: string;\n /** http-equiv attribute. */\n httpEquiv?: string;\n /** Meta tag content. */\n content: string;\n}\n\n/** Link tag definition. */\nexport interface PageLinkTag {\n /** Link relation. */\n rel: string;\n /** Link URL. */\n href: string;\n /** Optional type attribute. */\n type?: string;\n /** Optional media query. */\n media?: string;\n /** Optional crossOrigin attribute. */\n crossOrigin?: 'anonymous' | 'use-credentials';\n}\n\n/** Page metadata definition. */\nexport interface PageMetaDefinition {\n /** Document title. */\n title?: string;\n /** Convenience shortcut for the description meta tag. */\n description?: string;\n /** Additional meta tags. */\n meta?: PageMetaTag[];\n /** Additional link tags. */\n link?: PageLinkTag[];\n /** Attributes applied to the html element. */\n htmlAttributes?: Record<string, string>;\n /** Attributes applied to the body element. */\n bodyAttributes?: Record<string, string>;\n}\n\n/** Cleanup function returned by definePageMeta(). */\nexport type PageMetaCleanup = () => void;\n\nconst setAttributes = (target: HTMLElement, attributes: Record<string, string>): (() => void) => {\n const previousValues = new Map<string, string | null>();\n\n for (const [name, value] of Object.entries(attributes)) {\n previousValues.set(name, target.getAttribute(name));\n target.setAttribute(name, value);\n }\n\n return () => {\n for (const [name, value] of previousValues.entries()) {\n if (value == null) {\n target.removeAttribute(name);\n } else {\n target.setAttribute(name, value);\n }\n }\n };\n};\n\nconst createElement = <T extends 'meta' | 'link'>(\n tagName: T,\n attributes: Record<string, string | undefined>\n): HTMLElementTagNameMap[T] => {\n const element = document.createElement(tagName);\n element.setAttribute('data-bquery-page-meta', 'true');\n\n for (const [name, value] of Object.entries(attributes)) {\n if (value !== undefined) {\n element.setAttribute(name, value);\n }\n }\n\n return element;\n};\n\n/**\n * Apply document metadata for the current page.\n *\n * @param definition - Title, meta tags, link tags, and document attributes\n * @returns Cleanup function that restores the previous document state\n *\n * @example\n * ```ts\n * const cleanup = definePageMeta({\n * title: 'Dashboard',\n * description: 'Overview of your account',\n * });\n * ```\n */\nexport const definePageMeta = (definition: PageMetaDefinition): PageMetaCleanup => {\n if (typeof document === 'undefined') {\n return () => {};\n }\n\n const config = getBqueryConfig().pageMeta;\n const title = definition.title\n ? config?.titleTemplate\n ? config.titleTemplate(definition.title)\n : definition.title\n : undefined;\n\n const inserted: HTMLElement[] = [];\n const restoreFns: Array<() => void> = [];\n const previousTitle = document.title;\n\n if (title !== undefined) {\n document.title = title;\n }\n\n const metaEntries = [...(definition.meta ?? [])];\n if (definition.description) {\n metaEntries.unshift({ name: 'description', content: definition.description });\n }\n\n for (const entry of metaEntries) {\n const meta = createElement('meta', {\n name: entry.name,\n property: entry.property,\n 'http-equiv': entry.httpEquiv,\n content: entry.content,\n });\n document.head.appendChild(meta);\n inserted.push(meta);\n }\n\n for (const entry of definition.link ?? []) {\n const link = createElement('link', {\n rel: entry.rel,\n href: entry.href,\n type: entry.type,\n media: entry.media,\n crossorigin: entry.crossOrigin,\n });\n document.head.appendChild(link);\n inserted.push(link);\n }\n\n if (definition.htmlAttributes) {\n restoreFns.push(setAttributes(document.documentElement, definition.htmlAttributes));\n }\n\n if (definition.bodyAttributes && document.body) {\n restoreFns.push(setAttributes(document.body, definition.bodyAttributes));\n }\n\n return () => {\n document.title = previousTitle;\n for (const restore of restoreFns.reverse()) {\n restore();\n }\n for (const element of inserted) {\n element.remove();\n }\n };\n};\n","/**\n * Unified storage adapters for web platform storage APIs.\n * Provides a consistent, promise-based interface with predictable errors.\n */\n\n/**\n * Common interface for all storage adapters.\n * All methods return promises for a unified async API.\n */\nexport interface StorageAdapter {\n /**\n * Retrieve a value by key.\n * @param key - The storage key\n * @returns The stored value or null if not found\n */\n get<T>(key: string): Promise<T | null>;\n\n /**\n * Store a value by key.\n * @param key - The storage key\n * @param value - The value to store\n */\n set<T>(key: string, value: T): Promise<void>;\n\n /**\n * Remove a value by key.\n * @param key - The storage key\n */\n remove(key: string): Promise<void>;\n\n /**\n * Clear all stored values.\n */\n clear(): Promise<void>;\n\n /**\n * Get all storage keys.\n * @returns Array of all keys\n */\n keys(): Promise<string[]>;\n}\n\n/**\n * Abstract base class for web storage adapters (localStorage/sessionStorage).\n * Implements DRY principle by sharing common logic.\n */\nabstract class WebStorageAdapter implements StorageAdapter {\n constructor(protected readonly storage: Storage) {}\n\n async get<T>(key: string): Promise<T | null> {\n const raw = this.storage.getItem(key);\n if (raw === null) return null;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return raw as unknown as T;\n }\n }\n\n async set<T>(key: string, value: T): Promise<void> {\n const serialized = typeof value === 'string' ? value : JSON.stringify(value);\n this.storage.setItem(key, serialized);\n }\n\n async remove(key: string): Promise<void> {\n this.storage.removeItem(key);\n }\n\n async clear(): Promise<void> {\n this.storage.clear();\n }\n\n async keys(): Promise<string[]> {\n const result: string[] = [];\n for (let i = 0; i < this.storage.length; i++) {\n const key = this.storage.key(i);\n if (key !== null) {\n result.push(key);\n }\n }\n return result;\n }\n}\n\n/**\n * localStorage adapter with async interface.\n */\nclass LocalStorageAdapter extends WebStorageAdapter {\n constructor() {\n super(localStorage);\n }\n}\n\n/**\n * sessionStorage adapter with async interface.\n */\nclass SessionStorageAdapter extends WebStorageAdapter {\n constructor() {\n super(sessionStorage);\n }\n}\n\n/**\n * IndexedDB configuration options.\n */\nexport interface IndexedDBOptions {\n /** Database name */\n name: string;\n /** Object store name */\n store: string;\n /** Database version (optional) */\n version?: number;\n}\n\n/**\n * IndexedDB key-value adapter.\n * Wraps IndexedDB with a simple key-value interface.\n */\nclass IndexedDBAdapter implements StorageAdapter {\n private dbPromise: Promise<IDBDatabase> | null = null;\n\n constructor(private readonly options: IndexedDBOptions) {}\n\n /**\n * Opens or creates the IndexedDB database.\n */\n private openDB(): Promise<IDBDatabase> {\n if (this.dbPromise) return this.dbPromise;\n\n this.dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(this.options.name, this.options.version ?? 1);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(this.options.store)) {\n db.createObjectStore(this.options.store);\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n\n return this.dbPromise;\n }\n\n /**\n * Executes a transaction on the object store.\n */\n private async withStore<T>(\n mode: IDBTransactionMode,\n operation: (store: IDBObjectStore) => IDBRequest<T>\n ): Promise<T> {\n const db = await this.openDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(this.options.store, mode);\n const store = tx.objectStore(this.options.store);\n const request = operation(store);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n async get<T>(key: string): Promise<T | null> {\n const result = await this.withStore<T | undefined>('readonly', (store) => store.get(key));\n return result ?? null;\n }\n\n async set<T>(key: string, value: T): Promise<void> {\n await this.withStore('readwrite', (store) => store.put(value, key));\n }\n\n async remove(key: string): Promise<void> {\n await this.withStore('readwrite', (store) => store.delete(key));\n }\n\n async clear(): Promise<void> {\n await this.withStore('readwrite', (store) => store.clear());\n }\n\n async keys(): Promise<string[]> {\n const result = await this.withStore<IDBValidKey[]>('readonly', (store) => store.getAllKeys());\n return result.map((key) => String(key));\n }\n}\n\n/**\n * Storage factory providing access to different storage adapters.\n */\nexport const storage = {\n /**\n * Create a localStorage adapter.\n * @returns StorageAdapter wrapping localStorage\n */\n local(): StorageAdapter {\n return new LocalStorageAdapter();\n },\n\n /**\n * Create a sessionStorage adapter.\n * @returns StorageAdapter wrapping sessionStorage\n */\n session(): StorageAdapter {\n return new SessionStorageAdapter();\n },\n\n /**\n * Create an IndexedDB adapter with key-value interface.\n * @param options - Database and store configuration\n * @returns StorageAdapter wrapping IndexedDB\n */\n indexedDB(options: IndexedDBOptions): StorageAdapter {\n return new IndexedDBAdapter(options);\n },\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"platform-Dw2gE3zI.js","names":[],"sources":["../src/platform/buckets.ts","../src/platform/cache.ts","../src/platform/cookies.ts","../src/platform/notifications.ts","../src/platform/announcer.ts","../src/platform/meta.ts","../src/platform/storage.ts"],"sourcesContent":["/**\n * Storage Buckets API wrapper.\n * Provides a simplified interface for storing blobs and binary data.\n * Falls back to IndexedDB when Storage Buckets API is not available.\n */\n\n/**\n * Bucket interface for blob storage operations.\n */\nexport interface Bucket {\n /**\n * Store a blob in the bucket.\n * @param key - Unique identifier for the blob\n * @param data - Blob data to store\n */\n put(key: string, data: Blob): Promise<void>;\n\n /**\n * Retrieve a blob from the bucket.\n * @param key - Blob identifier\n * @returns The stored blob or null if not found\n */\n get(key: string): Promise<Blob | null>;\n\n /**\n * Remove a blob from the bucket.\n * @param key - Blob identifier\n */\n remove(key: string): Promise<void>;\n\n /**\n * List all keys in the bucket.\n * @returns Array of blob keys\n */\n keys(): Promise<string[]>;\n}\n\n/**\n * IndexedDB-based bucket implementation.\n * Used as fallback when Storage Buckets API is unavailable.\n */\nclass IndexedDBBucket implements Bucket {\n private dbPromise: Promise<IDBDatabase> | null = null;\n private readonly storeName = 'blobs';\n\n constructor(private readonly bucketName: string) {}\n\n private openDB(): Promise<IDBDatabase> {\n if (this.dbPromise) return this.dbPromise;\n\n const dbName = `bquery-bucket-${this.bucketName}`;\n this.dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(dbName, 1);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(this.storeName)) {\n db.createObjectStore(this.storeName);\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n\n return this.dbPromise;\n }\n\n private async withStore<T>(\n mode: IDBTransactionMode,\n operation: (store: IDBObjectStore) => IDBRequest<T>\n ): Promise<T> {\n const db = await this.openDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(this.storeName, mode);\n const store = tx.objectStore(this.storeName);\n const request = operation(store);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n async put(key: string, data: Blob): Promise<void> {\n await this.withStore('readwrite', (store) => store.put(data, key));\n }\n\n async get(key: string): Promise<Blob | null> {\n const result = await this.withStore<Blob | undefined>('readonly', (store) => store.get(key));\n return result ?? null;\n }\n\n async remove(key: string): Promise<void> {\n await this.withStore('readwrite', (store) => store.delete(key));\n }\n\n async keys(): Promise<string[]> {\n const result = await this.withStore<IDBValidKey[]>('readonly', (store) => store.getAllKeys());\n return result.map((key) => String(key));\n }\n}\n\n/**\n * Bucket manager for creating and accessing storage buckets.\n */\nexport const buckets = {\n /**\n * Open or create a storage bucket.\n * @param name - Bucket name\n * @returns Bucket instance for blob operations\n */\n async open(name: string): Promise<Bucket> {\n // Storage Buckets API is experimental; use IndexedDB fallback\n return new IndexedDBBucket(name);\n },\n};\n","/**\n * Cache Storage API wrapper.\n * Provides a simplified interface for caching responses and assets.\n */\n\n/**\n * Cache handle interface for managing cached resources.\n */\nexport interface CacheHandle {\n /**\n * Add a resource to the cache by URL.\n * Fetches the resource and stores the response.\n * @param url - URL to fetch and cache\n */\n add(url: string): Promise<void>;\n\n /**\n * Add multiple resources to the cache.\n * @param urls - Array of URLs to fetch and cache\n */\n addAll(urls: string[]): Promise<void>;\n\n /**\n * Store a custom response in the cache.\n * @param url - URL key for the cached response\n * @param response - Response object to cache\n */\n put(url: string, response: Response): Promise<void>;\n\n /**\n * Retrieve a cached response.\n * @param url - URL to look up\n * @returns Cached Response or undefined if not found\n */\n match(url: string): Promise<Response | undefined>;\n\n /**\n * Remove a cached response.\n * @param url - URL to remove from cache\n * @returns True if the entry was deleted\n */\n remove(url: string): Promise<boolean>;\n\n /**\n * Get all cached request URLs.\n * @returns Array of cached URLs\n */\n keys(): Promise<string[]>;\n}\n\n/**\n * Internal cache handle implementation.\n */\nclass CacheHandleImpl implements CacheHandle {\n constructor(private readonly cache: Cache) {}\n\n async add(url: string): Promise<void> {\n await this.cache.add(url);\n }\n\n async addAll(urls: string[]): Promise<void> {\n await this.cache.addAll(urls);\n }\n\n async put(url: string, response: Response): Promise<void> {\n await this.cache.put(url, response);\n }\n\n async match(url: string): Promise<Response | undefined> {\n return this.cache.match(url);\n }\n\n async remove(url: string): Promise<boolean> {\n return this.cache.delete(url);\n }\n\n async keys(): Promise<string[]> {\n const requests = await this.cache.keys();\n return requests.map((req) => req.url);\n }\n}\n\n/**\n * Cache manager for accessing the Cache Storage API.\n */\nexport const cache = {\n /**\n * Check if Cache Storage API is supported.\n * @returns True if caches API is available\n */\n isSupported(): boolean {\n return 'caches' in window;\n },\n\n /**\n * Open or create a named cache.\n * @param name - Cache name\n * @returns CacheHandle for cache operations\n */\n async open(name: string): Promise<CacheHandle> {\n if (!this.isSupported()) {\n throw new Error('bQuery: Cache Storage API not supported');\n }\n const c = await caches.open(name);\n return new CacheHandleImpl(c);\n },\n\n /**\n * Delete a named cache.\n * @param name - Cache name to delete\n * @returns True if the cache was deleted\n */\n async delete(name: string): Promise<boolean> {\n if (!this.isSupported()) {\n return false;\n }\n return caches.delete(name);\n },\n\n /**\n * List all cache names.\n * @returns Array of cache names\n */\n async keys(): Promise<string[]> {\n if (!this.isSupported()) {\n return [];\n }\n return caches.keys();\n },\n};\n","/**\n * Reactive cookie helpers.\n *\n * @module bquery/platform\n */\n\nimport { effect, signal, type Signal } from '../reactive/signal';\nimport { getBqueryConfig } from './config';\n\n/** Options for useCookie(). */\nexport interface UseCookieOptions<T> {\n /** Default value when the cookie is not present. */\n defaultValue?: T;\n /** Cookie path. Defaults to the global config or `/`. */\n path?: string;\n /** Optional cookie domain. */\n domain?: string;\n /** Cookie SameSite attribute. */\n sameSite?: 'Strict' | 'Lax' | 'None';\n /** Whether the cookie should be marked secure. */\n secure?: boolean;\n /** Cookie expiry date. */\n expires?: Date;\n /** Cookie max-age in seconds. */\n maxAge?: number;\n /** Automatically persist signal updates back to document.cookie. */\n watch?: boolean;\n /** Serialize a value before writing it into the cookie. */\n serialize?: (value: T) => string;\n /** Deserialize a cookie string into a typed value. */\n deserialize?: (value: string) => T;\n}\n\nconst readCookie = (name: string): string | null => {\n if (typeof document === 'undefined') return null;\n\n const prefix = `${encodeURIComponent(name)}=`;\n const segments = document.cookie ? document.cookie.split(';') : [];\n\n for (const segment of segments) {\n const normalizedSegment = segment.trim();\n if (normalizedSegment.startsWith(prefix)) {\n const rawValue = normalizedSegment.slice(prefix.length);\n try {\n return decodeURIComponent(rawValue);\n } catch {\n return rawValue;\n }\n }\n }\n\n return null;\n};\n\nconst requiresJsonParsing = (value: string): boolean => {\n const normalized = value.trim();\n return normalized.startsWith('{') || normalized.startsWith('[') || normalized.startsWith('\"');\n};\n\nconst removeCookie = (\n name: string,\n options: Pick<UseCookieOptions<unknown>, 'path' | 'domain' | 'sameSite' | 'secure'>\n): void => {\n if (typeof document === 'undefined') return;\n\n const segments = [`${encodeURIComponent(name)}=`, 'Expires=Thu, 01 Jan 1970 00:00:00 GMT'];\n\n if (options.path) segments.push(`Path=${options.path}`);\n if (options.domain) segments.push(`Domain=${options.domain}`);\n if (options.sameSite) segments.push(`SameSite=${options.sameSite}`);\n if (options.secure) segments.push('Secure');\n\n document.cookie = segments.join('; ');\n};\n\nconst writeCookie = <T>(name: string, value: T, options: UseCookieOptions<T>): void => {\n if (typeof document === 'undefined') return;\n\n const serialized = options.serialize\n ? options.serialize(value)\n : typeof value === 'string'\n ? value\n : JSON.stringify(value);\n\n const segments = [`${encodeURIComponent(name)}=${encodeURIComponent(serialized)}`];\n\n if (options.path) segments.push(`Path=${options.path}`);\n if (options.domain) segments.push(`Domain=${options.domain}`);\n if (typeof options.maxAge === 'number') segments.push(`Max-Age=${options.maxAge}`);\n if (options.expires) segments.push(`Expires=${options.expires.toUTCString()}`);\n if (options.sameSite) segments.push(`SameSite=${options.sameSite}`);\n if (options.secure) segments.push('Secure');\n\n document.cookie = segments.join('; ');\n};\n\n/**\n * Create a reactive cookie signal.\n *\n * @template T - Cookie value type\n * @param name - Cookie name\n * @param options - Read/write configuration for the cookie\n * @returns Reactive signal representing the cookie value\n *\n * @example\n * ```ts\n * const theme = useCookie('theme', { defaultValue: 'light' });\n * theme.value = 'dark';\n * ```\n */\nexport const useCookie = <T>(name: string, options: UseCookieOptions<T> = {}): Signal<T | null> => {\n const cookieConfig = getBqueryConfig().cookies;\n const resolvedOptions: UseCookieOptions<T> = {\n path: cookieConfig?.path ?? '/',\n sameSite: cookieConfig?.sameSite ?? 'Lax',\n secure: cookieConfig?.secure ?? false,\n watch: true,\n ...options,\n };\n\n if (resolvedOptions.sameSite === 'None') {\n resolvedOptions.secure = true;\n }\n\n const raw = readCookie(name);\n let initialValue = (resolvedOptions.defaultValue ?? null) as T | null;\n\n if (raw !== null) {\n try {\n initialValue = resolvedOptions.deserialize\n ? resolvedOptions.deserialize(raw)\n : requiresJsonParsing(raw)\n ? (JSON.parse(raw) as T)\n : ((raw as T) ?? initialValue);\n } catch (error) {\n console.warn(`bQuery: Failed to deserialize cookie \"${name}\", using raw string value`, error);\n initialValue = (raw as T) ?? initialValue;\n }\n }\n\n const cookie = signal<T | null>(initialValue);\n\n if (typeof document === 'undefined' || resolvedOptions.watch === false) {\n return cookie;\n }\n\n let initialized = false;\n effect(() => {\n const nextValue = cookie.value;\n\n if (!initialized) {\n initialized = true;\n return;\n }\n\n if (nextValue == null) {\n removeCookie(name, resolvedOptions);\n return;\n }\n\n writeCookie(name, nextValue, resolvedOptions);\n });\n\n return cookie;\n};\n","/**\n * Web Notifications API wrapper.\n * Provides a simplified interface for browser notifications.\n */\n\n/**\n * Notification options matching the standard NotificationOptions interface.\n */\nexport interface NotificationOptions {\n /** Body text of the notification */\n body?: string;\n /** Icon URL for the notification */\n icon?: string;\n /** Badge icon for mobile devices */\n badge?: string;\n /** Tag for grouping notifications */\n tag?: string;\n /** Whether to require user interaction */\n requireInteraction?: boolean;\n /** Vibration pattern for mobile devices */\n vibrate?: number[];\n /** Additional data attached to the notification */\n data?: unknown;\n}\n\n/**\n * Notifications manager providing a clean interface for web notifications.\n */\nexport const notifications = {\n /**\n * Check if notifications are supported.\n * @returns True if Notification API is available\n */\n isSupported(): boolean {\n return 'Notification' in window;\n },\n\n /**\n * Get current permission status.\n * @returns Current permission state\n */\n getPermission(): NotificationPermission {\n if (!this.isSupported()) return 'denied';\n return Notification.permission;\n },\n\n /**\n * Request notification permission from the user.\n * @returns Promise resolving to the permission result\n */\n async requestPermission(): Promise<NotificationPermission> {\n if (!this.isSupported()) {\n return 'denied';\n }\n\n if (Notification.permission === 'granted') {\n return 'granted';\n }\n\n if (Notification.permission === 'denied') {\n return 'denied';\n }\n\n return Notification.requestPermission();\n },\n\n /**\n * Send a notification.\n * Requires 'granted' permission.\n * @param title - Notification title\n * @param options - Optional notification settings\n * @returns The Notification instance or null if not permitted\n */\n send(title: string, options?: NotificationOptions): Notification | null {\n if (!this.isSupported()) {\n console.warn('bQuery: Notifications not supported in this browser');\n return null;\n }\n\n if (Notification.permission !== 'granted') {\n console.warn('bQuery: Notification permission not granted');\n return null;\n }\n\n return new Notification(title, options);\n },\n};\n","/**\n * Accessibility live-region announcer helpers.\n *\n * @module bquery/platform\n */\n\nimport { effect, signal, type Signal } from '../reactive/signal';\nimport { getBqueryConfig } from './config';\n\n/** Options for creating an announcer. */\nexport interface UseAnnouncerOptions {\n /** Live region politeness. */\n politeness?: 'polite' | 'assertive';\n /** Whether the live region should be atomic. */\n atomic?: boolean;\n /** Delay before applying the message. */\n delay?: number;\n /** Delay after which the message is cleared automatically. */\n clearDelay?: number;\n /** Optional element id for the live region. */\n id?: string;\n /** Optional CSS class name. */\n className?: string;\n /** Optional container used to append the live region. */\n container?: HTMLElement;\n}\n\n/** Runtime options for a single announcement. */\nexport interface AnnounceOptions {\n /** Override politeness for this specific announcement. */\n politeness?: 'polite' | 'assertive';\n /** Override the message delay for this specific announcement. */\n delay?: number;\n /** Override the auto-clear delay for this specific announcement. */\n clearDelay?: number;\n}\n\n/** Returned announcer API. */\nexport interface AnnouncerHandle {\n /** The live region element or null outside the DOM. */\n element: HTMLElement | null;\n /** Reactive message signal. */\n message: Signal<string>;\n /** Announce a message to assistive technologies. */\n announce: (value: string, options?: AnnounceOptions) => void;\n /** Clear the current announcement. */\n clear: () => void;\n /** Remove the live region if it was created by this announcer. */\n destroy: () => void;\n}\n\nconst visuallyHiddenStyle = [\n 'position:absolute',\n 'width:1px',\n 'height:1px',\n 'padding:0',\n 'margin:-1px',\n 'overflow:hidden',\n 'clip:rect(0, 0, 0, 0)',\n 'white-space:nowrap',\n 'border:0',\n].join(';');\n\n/**\n * Create or reuse an accessible live region.\n *\n * @param options - Live region configuration\n * @returns An announcer handle with announce(), clear(), and destroy()\n *\n * @example\n * ```ts\n * const announcer = useAnnouncer();\n * announcer.announce('Saved successfully');\n * ```\n */\nexport const useAnnouncer = (options: UseAnnouncerOptions = {}): AnnouncerHandle => {\n const defaults = getBqueryConfig().announcer;\n const resolvedOptions: Required<\n Pick<UseAnnouncerOptions, 'politeness' | 'atomic' | 'delay' | 'clearDelay'>\n > &\n UseAnnouncerOptions = {\n politeness: defaults?.politeness ?? 'polite',\n atomic: defaults?.atomic ?? true,\n delay: defaults?.delay ?? 16,\n clearDelay: defaults?.clearDelay ?? 1000,\n ...options,\n };\n\n const message = signal('');\n\n if (typeof document === 'undefined') {\n return {\n element: null,\n message,\n announce(value: string) {\n message.value = value;\n },\n clear() {\n message.value = '';\n },\n destroy() {\n message.value = '';\n },\n };\n }\n\n const existing = resolvedOptions.id ? document.getElementById(resolvedOptions.id) : null;\n const element = (existing ?? document.createElement('div')) as HTMLElement;\n const created = !existing;\n\n if (resolvedOptions.id) {\n element.id = resolvedOptions.id;\n }\n\n if (resolvedOptions.className) {\n element.className = resolvedOptions.className;\n }\n\n element.setAttribute('aria-live', resolvedOptions.politeness);\n element.setAttribute('aria-atomic', String(resolvedOptions.atomic));\n element.setAttribute('role', resolvedOptions.politeness === 'assertive' ? 'alert' : 'status');\n element.setAttribute('data-bquery-announcer', 'true');\n if (!element.getAttribute('style')) {\n element.setAttribute('style', visuallyHiddenStyle);\n }\n\n if (created) {\n const parent = resolvedOptions.container ?? document.body ?? document.documentElement;\n if (!parent) {\n return {\n element: null,\n message,\n announce(value: string) {\n message.value = value;\n },\n clear() {\n message.value = '';\n },\n destroy() {\n message.value = '';\n },\n };\n }\n parent.appendChild(element);\n }\n\n const disposeMessageEffect = effect(() => {\n element.textContent = message.value;\n });\n\n let messageTimer: ReturnType<typeof setTimeout> | undefined;\n let clearTimer: ReturnType<typeof setTimeout> | undefined;\n let destroyed = false;\n\n const clearTimers = (): void => {\n if (messageTimer) {\n clearTimeout(messageTimer);\n messageTimer = undefined;\n }\n if (clearTimer) {\n clearTimeout(clearTimer);\n clearTimer = undefined;\n }\n };\n\n const clear = (): void => {\n if (destroyed) return;\n clearTimers();\n message.value = '';\n };\n\n const announce = (value: string, announceOptions: AnnounceOptions = {}): void => {\n if (destroyed) return;\n const politeness = announceOptions.politeness ?? resolvedOptions.politeness;\n const delay = announceOptions.delay ?? resolvedOptions.delay;\n const clearDelay = announceOptions.clearDelay ?? resolvedOptions.clearDelay;\n\n clearTimers();\n\n element.setAttribute('aria-live', politeness);\n element.setAttribute('role', politeness === 'assertive' ? 'alert' : 'status');\n message.value = '';\n\n messageTimer = setTimeout(() => {\n if (destroyed) return;\n message.value = value;\n if (clearDelay > 0) {\n clearTimer = setTimeout(() => {\n if (destroyed) return;\n message.value = '';\n }, clearDelay);\n }\n }, delay);\n };\n\n const destroy = (): void => {\n if (destroyed) return;\n destroyed = true;\n clearTimers();\n message.value = '';\n disposeMessageEffect();\n if (created) {\n element.remove();\n }\n };\n\n return { element, message, announce, clear, destroy };\n};\n","/**\n * Document title and meta helpers.\n *\n * @module bquery/platform\n */\n\nimport { getBqueryConfig } from './config';\n\n/** Meta tag definition. */\nexport interface PageMetaTag {\n /** Standard meta name attribute. */\n name?: string;\n /** Open Graph / custom property attribute. */\n property?: string;\n /** http-equiv attribute. */\n httpEquiv?: string;\n /** Meta tag content. */\n content: string;\n}\n\n/** Link tag definition. */\nexport interface PageLinkTag {\n /** Link relation. */\n rel: string;\n /** Link URL. */\n href: string;\n /** Optional type attribute. */\n type?: string;\n /** Optional media query. */\n media?: string;\n /** Optional crossOrigin attribute. */\n crossOrigin?: 'anonymous' | 'use-credentials';\n}\n\n/** Page metadata definition. */\nexport interface PageMetaDefinition {\n /** Document title. */\n title?: string;\n /** Convenience shortcut for the description meta tag. */\n description?: string;\n /** Additional meta tags. */\n meta?: PageMetaTag[];\n /** Additional link tags. */\n link?: PageLinkTag[];\n /** Attributes applied to the html element. */\n htmlAttributes?: Record<string, string>;\n /** Attributes applied to the body element. */\n bodyAttributes?: Record<string, string>;\n}\n\n/** Cleanup function returned by definePageMeta(). */\nexport type PageMetaCleanup = () => void;\n\nconst setAttributes = (target: HTMLElement, attributes: Record<string, string>): (() => void) => {\n const previousValues = new Map<string, string | null>();\n\n for (const [name, value] of Object.entries(attributes)) {\n previousValues.set(name, target.getAttribute(name));\n target.setAttribute(name, value);\n }\n\n return () => {\n for (const [name, value] of previousValues.entries()) {\n if (value == null) {\n target.removeAttribute(name);\n } else {\n target.setAttribute(name, value);\n }\n }\n };\n};\n\nconst createElement = <T extends 'meta' | 'link'>(\n tagName: T,\n attributes: Record<string, string | undefined>\n): HTMLElementTagNameMap[T] => {\n const element = document.createElement(tagName);\n element.setAttribute('data-bquery-page-meta', 'true');\n\n for (const [name, value] of Object.entries(attributes)) {\n if (value !== undefined) {\n element.setAttribute(name, value);\n }\n }\n\n return element;\n};\n\n/**\n * Apply document metadata for the current page.\n *\n * @param definition - Title, meta tags, link tags, and document attributes\n * @returns Cleanup function that restores the previous document state\n *\n * @example\n * ```ts\n * const cleanup = definePageMeta({\n * title: 'Dashboard',\n * description: 'Overview of your account',\n * });\n * ```\n */\nexport const definePageMeta = (definition: PageMetaDefinition): PageMetaCleanup => {\n if (typeof document === 'undefined') {\n return () => {};\n }\n\n const config = getBqueryConfig().pageMeta;\n const title = definition.title\n ? config?.titleTemplate\n ? config.titleTemplate(definition.title)\n : definition.title\n : undefined;\n\n const inserted: HTMLElement[] = [];\n const restoreFns: Array<() => void> = [];\n const previousTitle = document.title;\n\n if (title !== undefined) {\n document.title = title;\n }\n\n const metaEntries = [...(definition.meta ?? [])];\n if (definition.description) {\n metaEntries.unshift({ name: 'description', content: definition.description });\n }\n\n for (const entry of metaEntries) {\n const meta = createElement('meta', {\n name: entry.name,\n property: entry.property,\n 'http-equiv': entry.httpEquiv,\n content: entry.content,\n });\n document.head.appendChild(meta);\n inserted.push(meta);\n }\n\n for (const entry of definition.link ?? []) {\n const link = createElement('link', {\n rel: entry.rel,\n href: entry.href,\n type: entry.type,\n media: entry.media,\n crossorigin: entry.crossOrigin,\n });\n document.head.appendChild(link);\n inserted.push(link);\n }\n\n if (definition.htmlAttributes) {\n restoreFns.push(setAttributes(document.documentElement, definition.htmlAttributes));\n }\n\n if (definition.bodyAttributes && document.body) {\n restoreFns.push(setAttributes(document.body, definition.bodyAttributes));\n }\n\n return () => {\n document.title = previousTitle;\n for (const restore of restoreFns.reverse()) {\n restore();\n }\n for (const element of inserted) {\n element.remove();\n }\n };\n};\n","/**\n * Unified storage adapters for web platform storage APIs.\n * Provides a consistent, promise-based interface with predictable errors.\n */\n\n/**\n * Common interface for all storage adapters.\n * All methods return promises for a unified async API.\n */\nexport interface StorageAdapter {\n /**\n * Retrieve a value by key.\n * @param key - The storage key\n * @returns The stored value or null if not found\n */\n get<T>(key: string): Promise<T | null>;\n\n /**\n * Store a value by key.\n * @param key - The storage key\n * @param value - The value to store\n */\n set<T>(key: string, value: T): Promise<void>;\n\n /**\n * Remove a value by key.\n * @param key - The storage key\n */\n remove(key: string): Promise<void>;\n\n /**\n * Clear all stored values.\n */\n clear(): Promise<void>;\n\n /**\n * Get all storage keys.\n * @returns Array of all keys\n */\n keys(): Promise<string[]>;\n}\n\n/**\n * Abstract base class for web storage adapters (localStorage/sessionStorage).\n * Implements DRY principle by sharing common logic.\n */\nabstract class WebStorageAdapter implements StorageAdapter {\n constructor(protected readonly storage: Storage) {}\n\n async get<T>(key: string): Promise<T | null> {\n const raw = this.storage.getItem(key);\n if (raw === null) return null;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return raw as unknown as T;\n }\n }\n\n async set<T>(key: string, value: T): Promise<void> {\n const serialized = typeof value === 'string' ? value : JSON.stringify(value);\n this.storage.setItem(key, serialized);\n }\n\n async remove(key: string): Promise<void> {\n this.storage.removeItem(key);\n }\n\n async clear(): Promise<void> {\n this.storage.clear();\n }\n\n async keys(): Promise<string[]> {\n const result: string[] = [];\n for (let i = 0; i < this.storage.length; i++) {\n const key = this.storage.key(i);\n if (key !== null) {\n result.push(key);\n }\n }\n return result;\n }\n}\n\n/**\n * localStorage adapter with async interface.\n */\nclass LocalStorageAdapter extends WebStorageAdapter {\n constructor() {\n super(localStorage);\n }\n}\n\n/**\n * sessionStorage adapter with async interface.\n */\nclass SessionStorageAdapter extends WebStorageAdapter {\n constructor() {\n super(sessionStorage);\n }\n}\n\n/**\n * IndexedDB configuration options.\n */\nexport interface IndexedDBOptions {\n /** Database name */\n name: string;\n /** Object store name */\n store: string;\n /** Database version (optional) */\n version?: number;\n}\n\n/**\n * IndexedDB key-value adapter.\n * Wraps IndexedDB with a simple key-value interface.\n */\nclass IndexedDBAdapter implements StorageAdapter {\n private dbPromise: Promise<IDBDatabase> | null = null;\n\n constructor(private readonly options: IndexedDBOptions) {}\n\n /**\n * Opens or creates the IndexedDB database.\n */\n private openDB(): Promise<IDBDatabase> {\n if (this.dbPromise) return this.dbPromise;\n\n this.dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(this.options.name, this.options.version ?? 1);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(this.options.store)) {\n db.createObjectStore(this.options.store);\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n\n return this.dbPromise;\n }\n\n /**\n * Executes a transaction on the object store.\n */\n private async withStore<T>(\n mode: IDBTransactionMode,\n operation: (store: IDBObjectStore) => IDBRequest<T>\n ): Promise<T> {\n const db = await this.openDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(this.options.store, mode);\n const store = tx.objectStore(this.options.store);\n const request = operation(store);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n async get<T>(key: string): Promise<T | null> {\n const result = await this.withStore<T | undefined>('readonly', (store) => store.get(key));\n return result ?? null;\n }\n\n async set<T>(key: string, value: T): Promise<void> {\n await this.withStore('readwrite', (store) => store.put(value, key));\n }\n\n async remove(key: string): Promise<void> {\n await this.withStore('readwrite', (store) => store.delete(key));\n }\n\n async clear(): Promise<void> {\n await this.withStore('readwrite', (store) => store.clear());\n }\n\n async keys(): Promise<string[]> {\n const result = await this.withStore<IDBValidKey[]>('readonly', (store) => store.getAllKeys());\n return result.map((key) => String(key));\n }\n}\n\n/**\n * Storage factory providing access to different storage adapters.\n */\nexport const storage = {\n /**\n * Create a localStorage adapter.\n * @returns StorageAdapter wrapping localStorage\n */\n local(): StorageAdapter {\n return new LocalStorageAdapter();\n },\n\n /**\n * Create a sessionStorage adapter.\n * @returns StorageAdapter wrapping sessionStorage\n */\n session(): StorageAdapter {\n return new SessionStorageAdapter();\n },\n\n /**\n * Create an IndexedDB adapter with key-value interface.\n * @param options - Database and store configuration\n * @returns StorageAdapter wrapping IndexedDB\n */\n indexedDB(options: IndexedDBOptions): StorageAdapter {\n return new IndexedDBAdapter(options);\n },\n};\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { n as a, t as s } from "./config-BW35FKuA.js";
2
- import { a as i, i as n, n as t, o as r, r as f, s as u, t as c } from "./platform-CPbCprb6.js";
1
+ import { n as a, t as s } from "./config-DhT9auRm.js";
2
+ import { a as i, i as n, n as t, o as r, r as f, s as u, t as c } from "./platform-Dw2gE3zI.js";
3
3
  export {
4
4
  u as buckets,
5
5
  r as cache,
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/plugin/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,sBAAsB,EAEvB,MAAM,SAAS,CAAC;AA0GjB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,GAAG,GAAI,QAAQ,GAAG,OAAO,EACpC,QAAQ,YAAY,CAAC,QAAQ,CAAC,EAC9B,UAAU,QAAQ,KACjB,IAqCF,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,OAAqC,CAAC;AAEjF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,QAAO,SAAS,MAAM,EAA2B,CAAC;AAElF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,sBAAsB,GAAG,SAC/C,CAAC;AAE7B;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB,QAAO,SAAS,eAAe,EACgB,CAAC;AAEhF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,YAAY,QAAO,IAG/B,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/plugin/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,sBAAsB,EAEvB,MAAM,SAAS,CAAC;AAsHjB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,GAAG,GAAI,QAAQ,GAAG,OAAO,EACpC,QAAQ,YAAY,CAAC,QAAQ,CAAC,EAC9B,UAAU,QAAQ,KACjB,IAuCF,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,OAAqC,CAAC;AAEjF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,QAAO,SAAS,MAAM,EAA2B,CAAC;AAElF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,sBAAsB,GAAG,SAC/C,CAAC;AAE7B;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB,QAAO,SAAS,eAAe,EACgB,CAAC;AAEhF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,YAAY,QAAO,IAI/B,CAAC"}
@@ -1,10 +1,12 @@
1
- import { n as u } from "./custom-directives-7wAShnnd.js";
2
- var s = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Map();
3
- u((t) => n.get(t));
4
- var c = (t) => {
1
+ import { n as l } from "./custom-directives-Dr4C5lVV.js";
2
+ var s = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Map(), c = () => {
3
+ l((t) => n.get(t));
4
+ };
5
+ c();
6
+ var u = (t) => {
5
7
  n.clear();
6
8
  for (const [e, r] of t) n.set(e, r);
7
- }, l = (t) => ({
9
+ }, f = (t) => ({
8
10
  directive(e, r) {
9
11
  if (typeof e != "string" || e.length === 0) throw new Error("bQuery plugin directive: name must be a non-empty string");
10
12
  if (e.startsWith("bq-")) {
@@ -29,36 +31,36 @@ var c = (t) => {
29
31
  options: i
30
32
  });
31
33
  }
32
- }), m = (t, e) => {
33
- if (!t || typeof t != "object") throw new Error("bQuery plugin: use() expects a plugin object with { name, install }");
34
+ }), p = (t, e) => {
35
+ if (c(), !t || typeof t != "object") throw new Error("bQuery plugin: use() expects a plugin object with { name, install }");
34
36
  if (typeof t.name != "string" || t.name.length === 0) throw new Error('bQuery plugin: plugin must have a non-empty "name" property');
35
37
  if (typeof t.install != "function") throw new Error(`bQuery plugin: plugin "${t.name}" must have an "install" function`);
36
38
  if (s.has(t.name)) return;
37
- const r = [], i = l(r), a = new Map(n);
39
+ const r = [], i = f(r), a = new Map(n);
38
40
  try {
39
41
  t.install(i, e);
40
42
  } catch (o) {
41
- throw c(a), o;
43
+ throw u(a), o;
42
44
  }
43
45
  try {
44
46
  for (const o of r) customElements.get(o.tagName) || customElements.define(o.tagName, o.constructor, o.options);
45
47
  } catch (o) {
46
- throw c(a), o;
48
+ throw u(a), o;
47
49
  }
48
50
  s.add(t.name);
49
- }, p = (t) => s.has(t), h = () => [...s], w = (t) => n.get(t), y = () => [...n.entries()].map(([t, e]) => ({
51
+ }, h = (t) => s.has(t), v = () => [...s], w = (t) => n.get(t), y = () => [...n.entries()].map(([t, e]) => ({
50
52
  name: t,
51
53
  handler: e
52
- })), v = () => {
53
- s.clear(), n.clear();
54
+ })), d = () => {
55
+ s.clear(), n.clear(), c();
54
56
  };
55
57
  export {
56
- v as a,
57
- p as i,
58
+ d as a,
59
+ h as i,
58
60
  y as n,
59
- m as o,
60
- h as r,
61
+ p as o,
62
+ v as r,
61
63
  w as t
62
64
  };
63
65
 
64
- //# sourceMappingURL=plugin-cPoOHFLY.js.map
66
+ //# sourceMappingURL=plugin-C2WuC8SF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-C2WuC8SF.js","names":[],"sources":["../src/plugin/registry.ts"],"sourcesContent":["/**\n * Global plugin registry for bQuery.\n *\n * Provides `use()` to register plugins and query helpers consumed by\n * other modules (e.g. the view module reads custom directives from here).\n *\n * @module bquery/plugin\n */\n\nimport { registerCustomDirectiveResolver } from '../view/custom-directives';\nimport type {\n BQueryPlugin,\n CustomDirective,\n CustomDirectiveHandler,\n PluginInstallContext,\n} from './types';\n\n// ---------------------------------------------------------------------------\n// Internal registries\n// ---------------------------------------------------------------------------\n\n/** Set of installed plugin names — prevents double-install. */\nconst installedPlugins = new Set<string>();\n\n/** Custom directives contributed by plugins. */\nconst customDirectives = new Map<string, CustomDirectiveHandler>();\n\ntype PendingComponentRegistration = {\n tagName: string;\n constructor: CustomElementConstructor;\n options?: ElementDefinitionOptions;\n};\n\n/**\n * Ensure the view pipeline resolves plugin directives against the current registry.\n *\n * This is intentionally idempotent so tests or internal modules can temporarily\n * clear the resolver without leaving plugin/view integration in a broken state.\n *\n * @internal\n */\nconst attachCustomDirectiveResolver = (): void => {\n registerCustomDirectiveResolver((name) => customDirectives.get(name));\n};\n\nattachCustomDirectiveResolver();\n\n/**\n * Restore the directive registry to a previously captured snapshot.\n *\n * Used to roll back partial plugin installation when `install()` or staged\n * `customElements.define()` calls fail after directives were already registered.\n *\n * @internal\n */\nconst restoreDirectiveSnapshot = (\n directivesSnapshot: ReadonlyMap<string, CustomDirectiveHandler>\n): void => {\n customDirectives.clear();\n for (const [name, handler] of directivesSnapshot) {\n customDirectives.set(name, handler);\n }\n};\n\n// ---------------------------------------------------------------------------\n// Install context factory\n// ---------------------------------------------------------------------------\n\n/**\n * Build the `PluginInstallContext` handed to each plugin's `install()`.\n * @internal\n */\nconst createInstallContext = (\n pendingComponents: PendingComponentRegistration[]\n): PluginInstallContext => ({\n directive(name: string, handler: CustomDirectiveHandler): void {\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error('bQuery plugin directive: name must be a non-empty string');\n }\n if (name.startsWith('bq-')) {\n const suggestedName = name.slice(3);\n throw new Error(\n `bQuery plugin directive: name \"${name}\" must be provided without the \"bq-\" prefix` +\n (suggestedName ? ` (use \"${suggestedName}\")` : '')\n );\n }\n if (typeof handler !== 'function') {\n throw new Error(`bQuery plugin directive: handler for \"${name}\" must be a function`);\n }\n if (customDirectives.has(name)) {\n throw new Error(`bQuery plugin directive: a directive named \"${name}\" is already registered`);\n }\n customDirectives.set(name, handler);\n },\n\n component(\n tagName: string,\n constructor: CustomElementConstructor,\n options?: ElementDefinitionOptions\n ): void {\n if (typeof tagName !== 'string' || tagName.length === 0) {\n throw new Error('bQuery plugin component: tagName must be a non-empty string');\n }\n if (!tagName.includes('-')) {\n throw new Error(\n `bQuery plugin component: tagName \"${tagName}\" must be a valid custom element name containing a hyphen`\n );\n }\n if (typeof constructor !== 'function') {\n throw new Error(`bQuery plugin component: constructor for \"${tagName}\" must be a function`);\n }\n if (typeof customElements === 'undefined') {\n if (typeof console !== 'undefined' && typeof console.warn === 'function') {\n console.warn(\n `[bQuery] plugin component \"${tagName}\" was not registered because customElements is not available in this environment.`\n );\n }\n return;\n }\n // Idempotent — skip if already defined or already staged during this install\n if (\n !customElements.get(tagName) &&\n !pendingComponents.some((entry) => entry.tagName === tagName)\n ) {\n pendingComponents.push({ tagName, constructor, options });\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Register a bQuery plugin.\n *\n * Plugins are installed at most once (identified by `plugin.name`).\n * Duplicate calls with the same name are silently ignored.\n *\n * @param plugin - The plugin object implementing `{ name, install }`.\n * @param options - Optional configuration forwarded to `plugin.install()`.\n * @throws If `plugin` is not a valid plugin object.\n *\n * @example\n * ```ts\n * import { use } from '@bquery/bquery/plugin';\n *\n * use({\n * name: 'highlight',\n * install(ctx) {\n * ctx.directive('highlight', (el, expr) => {\n * (el as HTMLElement).style.background = String(expr);\n * });\n * },\n * });\n * ```\n */\nexport const use = <TOptions = unknown>(\n plugin: BQueryPlugin<TOptions>,\n options?: TOptions\n): void => {\n attachCustomDirectiveResolver();\n\n if (!plugin || typeof plugin !== 'object') {\n throw new Error('bQuery plugin: use() expects a plugin object with { name, install }');\n }\n if (typeof plugin.name !== 'string' || plugin.name.length === 0) {\n throw new Error('bQuery plugin: plugin must have a non-empty \"name\" property');\n }\n if (typeof plugin.install !== 'function') {\n throw new Error(`bQuery plugin: plugin \"${plugin.name}\" must have an \"install\" function`);\n }\n\n // Deduplicate\n if (installedPlugins.has(plugin.name)) return;\n\n const pendingComponents: PendingComponentRegistration[] = [];\n const ctx = createInstallContext(pendingComponents);\n const directivesSnapshot = new Map(customDirectives);\n\n try {\n plugin.install(ctx, options);\n } catch (error) {\n restoreDirectiveSnapshot(directivesSnapshot);\n throw error;\n }\n\n try {\n for (const entry of pendingComponents) {\n if (!customElements.get(entry.tagName)) {\n customElements.define(entry.tagName, entry.constructor, entry.options);\n }\n }\n } catch (error) {\n restoreDirectiveSnapshot(directivesSnapshot);\n throw error;\n }\n\n installedPlugins.add(plugin.name);\n};\n\n/**\n * Check whether a plugin with the given name has been installed.\n *\n * @param name - The plugin name to check.\n * @returns `true` if the plugin was previously installed via `use()`.\n *\n * @example\n * ```ts\n * import { isInstalled } from '@bquery/bquery/plugin';\n *\n * if (!isInstalled('my-plugin')) {\n * use(myPlugin);\n * }\n * ```\n */\nexport const isInstalled = (name: string): boolean => installedPlugins.has(name);\n\n/**\n * Return a read-only snapshot of all installed plugin names.\n *\n * @returns Array of plugin name strings.\n *\n * @example\n * ```ts\n * import { getInstalledPlugins } from '@bquery/bquery/plugin';\n * console.log(getInstalledPlugins()); // ['my-plugin', 'other-plugin']\n * ```\n */\nexport const getInstalledPlugins = (): readonly string[] => [...installedPlugins];\n\n/**\n * Retrieve the handler for a custom directive registered by a plugin.\n *\n * This is used internally by the view module's `processElement` to\n * resolve directives that aren't built-in.\n *\n * @param name - Directive name **without** prefix (e.g. `'tooltip'`).\n * @returns The handler, or `undefined` if none is registered.\n *\n * @example\n * ```ts\n * import { getCustomDirective } from '@bquery/bquery/plugin';\n * const handler = getCustomDirective('tooltip');\n * ```\n */\nexport const getCustomDirective = (name: string): CustomDirectiveHandler | undefined =>\n customDirectives.get(name);\n\n/**\n * Return a read-only snapshot of all registered custom directives.\n *\n * @returns Array of `{ name, handler }` descriptors.\n *\n * @example\n * ```ts\n * import { getCustomDirectives } from '@bquery/bquery/plugin';\n * for (const { name, handler } of getCustomDirectives()) {\n * console.log(`Directive: bq-${name}`);\n * }\n * ```\n */\nexport const getCustomDirectives = (): readonly CustomDirective[] =>\n [...customDirectives.entries()].map(([name, handler]) => ({ name, handler }));\n\n/**\n * Reset all plugin registrations.\n *\n * Clears all installed plugins and custom directives.\n *\n * This utility is primarily intended for tests and other isolated environments\n * that need to reinitialize plugin state between runs.\n *\n * @example\n * ```ts\n * import { resetPlugins } from '@bquery/bquery/plugin';\n * afterEach(() => resetPlugins());\n * ```\n */\nexport const resetPlugins = (): void => {\n installedPlugins.clear();\n customDirectives.clear();\n attachCustomDirectiveResolver();\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { a as e, i as t, n as a, o as i, r, t as l } from "./plugin-cPoOHFLY.js";
1
+ import { a as e, i as t, n as a, o as i, r, t as l } from "./plugin-C2WuC8SF.js";
2
2
  export {
3
3
  l as getCustomDirective,
4
4
  a as getCustomDirectives,
@@ -43,13 +43,24 @@ export interface AsyncDataState<TData> {
43
43
  execute: () => Promise<TData | undefined>;
44
44
  /** Alias for execute(). */
45
45
  refresh: () => Promise<TData | undefined>;
46
+ /** Abort the current in-flight request (useFetch only; no-op for useAsyncData). */
47
+ abort: () => void;
46
48
  /** Clear data, error, and status back to the initial state. */
47
49
  clear: () => void;
48
50
  /** Dispose reactive watchers and prevent future executions. */
49
51
  dispose: () => void;
50
52
  }
53
+ /** Configuration for automatic request retries in useFetch(). */
54
+ export interface UseFetchRetryConfig {
55
+ /** Maximum number of retry attempts (default: 3). */
56
+ count: number;
57
+ /** Delay in ms between retries, or a function receiving the attempt index. */
58
+ delay?: number | ((attempt: number) => number);
59
+ /** Predicate deciding whether to retry. Defaults to network / 5xx errors. */
60
+ retryOn?: (error: Error, attempt: number) => boolean;
61
+ }
51
62
  /** Options for useFetch(). */
52
- export interface UseFetchOptions<TResponse = unknown, TData = TResponse> extends UseAsyncDataOptions<TResponse, TData>, Omit<RequestInit, 'body' | 'headers'> {
63
+ export interface UseFetchOptions<TResponse = unknown, TData = TResponse> extends UseAsyncDataOptions<TResponse, TData>, Omit<RequestInit, 'body' | 'headers' | 'signal'> {
53
64
  /** Base URL prepended to relative URLs. */
54
65
  baseUrl?: string;
55
66
  /** Query parameters appended to the request URL. */
@@ -62,6 +73,14 @@ export interface UseFetchOptions<TResponse = unknown, TData = TResponse> extends
62
73
  parseAs?: BqueryFetchParseAs;
63
74
  /** Custom fetch implementation for testing or adapters. */
64
75
  fetcher?: typeof fetch;
76
+ /** Request timeout in milliseconds. 0 means no timeout. */
77
+ timeout?: number;
78
+ /** External AbortSignal for request cancellation. */
79
+ signal?: AbortSignal;
80
+ /** Retry configuration. Pass a number for simple retry count, or a config object. */
81
+ retry?: number | UseFetchRetryConfig;
82
+ /** Custom status validation. Returns `true` for acceptable statuses. */
83
+ validateStatus?: (status: number) => boolean;
65
84
  }
66
85
  /** Input accepted by useFetch(). */
67
86
  export type FetchInput = string | URL | Request | (() => string | URL | Request);
@@ -83,15 +102,21 @@ export declare const useAsyncData: <TResult, TData = TResult>(handler: () => Pro
83
102
  /**
84
103
  * Reactive fetch composable using the browser Fetch API.
85
104
  *
105
+ * Supports timeout, abort, retry, and custom status validation in addition
106
+ * to the core useFetch features (query params, JSON body, baseUrl, watch).
107
+ *
86
108
  * @template TResponse - Raw parsed response type
87
109
  * @template TData - Stored response type after optional transformation
88
110
  * @param input - Request URL, Request object, or lazy input factory
89
111
  * @param options - Request and reactive state options
90
- * @returns Reactive fetch state with execute(), refresh(), and clear()
112
+ * @returns Reactive fetch state with execute(), refresh(), abort(), clear(), and dispose()
91
113
  *
92
114
  * @example
93
115
  * ```ts
94
- * const users = useFetch<{ id: number; name: string }[]>('/api/users');
116
+ * const users = useFetch<{ id: number; name: string }[]>('/api/users', {
117
+ * timeout: 5000,
118
+ * retry: 3,
119
+ * });
95
120
  * ```
96
121
  */
97
122
  export declare const useFetch: <TResponse = unknown, TData = TResponse>(input: FetchInput, options?: UseFetchOptions<TResponse, TData>) => AsyncDataState<TData>;
@@ -1 +1 @@
1
- {"version":3,"file":"async-data.d.ts","sourceRoot":"","sources":["../../src/reactive/async-data.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"async-data.d.ts","sourceRoot":"","sources":["../../src/reactive/async-data.ts"],"names":[],"mappings":"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"}
@@ -49,6 +49,9 @@ export declare class Computed<T> implements ReactiveSource {
49
49
  /**
50
50
  * Creates a new computed value.
51
51
  *
52
+ * If created inside an {@link effectScope}, the computed value is automatically
53
+ * collected and will be disposed when the scope stops.
54
+ *
52
55
  * @template T - The type of the computed value
53
56
  * @param fn - Function that computes the value from reactive sources
54
57
  * @returns A new Computed instance
@@ -1 +1 @@
1
- {"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../../src/reactive/computed.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB;;;;;;;GAOG;AACH,qBAAa,QAAQ,CAAC,CAAC,CAAE,YAAW,cAAc;IAsBpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IArBpC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAUxB;IAEF;;;OAGG;gBAC0B,OAAO,EAAE,MAAM,CAAC;IAE7C;;;OAGG;IACH,IAAI,KAAK,IAAI,CAAC,CAsBb;IAED;;;;;OAKG;IACH,IAAI,IAAI,CAAC;IAmBT;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIvC;;;OAGG;IACH,OAAO,IAAI,IAAI;CAShB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,IAAI,MAAM,CAAC,KAAG,QAAQ,CAAC,CAAC,CAAqB,CAAC"}
1
+ {"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../../src/reactive/computed.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAGrB;;;;;;;GAOG;AACH,qBAAa,QAAQ,CAAC,CAAC,CAAE,YAAW,cAAc;IAsBpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IArBpC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAUxB;IAEF;;;OAGG;gBAC0B,OAAO,EAAE,MAAM,CAAC;IAE7C;;;OAGG;IACH,IAAI,KAAK,IAAI,CAAC,CAsBb;IAED;;;;;OAKG;IACH,IAAI,IAAI,CAAC;IAmBT;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIvC;;;OAGG;IACH,OAAO,IAAI,IAAI;CAShB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,IAAI,MAAM,CAAC,KAAG,QAAQ,CAAC,CAAC,CAUnD,CAAC"}
@@ -8,6 +8,9 @@ import { CleanupFn } from './internals';
8
8
  * The effect runs immediately upon creation and then re-runs whenever
9
9
  * any signal or computed value read inside it changes.
10
10
  *
11
+ * If created inside an {@link effectScope}, the effect is automatically
12
+ * collected and will be disposed when the scope stops.
13
+ *
11
14
  * @param fn - The effect function to run
12
15
  * @returns A cleanup function to stop the effect
13
16
  */
@@ -1 +1 @@
1
- {"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../../src/reactive/effect.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAsC,MAAM,aAAa,CAAC;AAE5E;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,GAAI,IAAI,MAAM,IAAI,GAAG,SAAS,KAAG,SAsCnD,CAAC"}
1
+ {"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../../src/reactive/effect.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAsC,MAAM,aAAa,CAAC;AAG5E;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM,GAAI,IAAI,MAAM,IAAI,GAAG,SAAS,KAAG,SAyDnD,CAAC"}