@bquery/bquery 1.2.0 → 1.4.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 (309) hide show
  1. package/README.md +127 -27
  2. package/dist/batch-x7b2eZST.js +13 -0
  3. package/dist/batch-x7b2eZST.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 +55 -3
  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 +31 -4
  21. package/dist/core/element.d.ts.map +1 -1
  22. package/dist/core/index.d.ts +2 -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 +87 -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-BhpuvPhy.js +170 -0
  41. package/dist/core-BhpuvPhy.js.map +1 -0
  42. package/dist/core.es.mjs +495 -489
  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-DHoi3uEs.js +278 -0
  81. package/dist/persisted-DHoi3uEs.js.map +1 -0
  82. package/dist/platform/storage.d.ts.map +1 -1
  83. package/dist/platform.es.mjs +12 -7
  84. package/dist/platform.es.mjs.map +1 -1
  85. package/dist/reactive/batch.d.ts +13 -0
  86. package/dist/reactive/batch.d.ts.map +1 -0
  87. package/dist/reactive/computed.d.ts +50 -0
  88. package/dist/reactive/computed.d.ts.map +1 -0
  89. package/dist/reactive/core.d.ts +72 -0
  90. package/dist/reactive/core.d.ts.map +1 -0
  91. package/dist/reactive/effect.d.ts +15 -0
  92. package/dist/reactive/effect.d.ts.map +1 -0
  93. package/dist/reactive/index.d.ts +2 -2
  94. package/dist/reactive/index.d.ts.map +1 -1
  95. package/dist/reactive/internals.d.ts +42 -0
  96. package/dist/reactive/internals.d.ts.map +1 -0
  97. package/dist/reactive/linked.d.ts +36 -0
  98. package/dist/reactive/linked.d.ts.map +1 -0
  99. package/dist/reactive/persisted.d.ts +14 -0
  100. package/dist/reactive/persisted.d.ts.map +1 -0
  101. package/dist/reactive/readonly.d.ts +26 -0
  102. package/dist/reactive/readonly.d.ts.map +1 -0
  103. package/dist/reactive/signal.d.ts +13 -312
  104. package/dist/reactive/signal.d.ts.map +1 -1
  105. package/dist/reactive/type-guards.d.ts +20 -0
  106. package/dist/reactive/type-guards.d.ts.map +1 -0
  107. package/dist/reactive/untrack.d.ts +29 -0
  108. package/dist/reactive/untrack.d.ts.map +1 -0
  109. package/dist/reactive/watch.d.ts +42 -0
  110. package/dist/reactive/watch.d.ts.map +1 -0
  111. package/dist/reactive.es.mjs +30 -163
  112. package/dist/reactive.es.mjs.map +1 -1
  113. package/dist/router/index.d.ts +6 -252
  114. package/dist/router/index.d.ts.map +1 -1
  115. package/dist/router/links.d.ts +44 -0
  116. package/dist/router/links.d.ts.map +1 -0
  117. package/dist/router/match.d.ts +20 -0
  118. package/dist/router/match.d.ts.map +1 -0
  119. package/dist/router/navigation.d.ts +45 -0
  120. package/dist/router/navigation.d.ts.map +1 -0
  121. package/dist/router/query.d.ts +16 -0
  122. package/dist/router/query.d.ts.map +1 -0
  123. package/dist/router/router.d.ts +34 -0
  124. package/dist/router/router.d.ts.map +1 -0
  125. package/dist/router/state.d.ts +27 -0
  126. package/dist/router/state.d.ts.map +1 -0
  127. package/dist/router/types.d.ts +88 -0
  128. package/dist/router/types.d.ts.map +1 -0
  129. package/dist/router/utils.d.ts +65 -0
  130. package/dist/router/utils.d.ts.map +1 -0
  131. package/dist/router.es.mjs +168 -132
  132. package/dist/router.es.mjs.map +1 -1
  133. package/dist/sanitize-Cxvxa-DX.js +283 -0
  134. package/dist/sanitize-Cxvxa-DX.js.map +1 -0
  135. package/dist/security/constants.d.ts +42 -0
  136. package/dist/security/constants.d.ts.map +1 -0
  137. package/dist/security/csp.d.ts +24 -0
  138. package/dist/security/csp.d.ts.map +1 -0
  139. package/dist/security/index.d.ts +4 -2
  140. package/dist/security/index.d.ts.map +1 -1
  141. package/dist/security/sanitize-core.d.ts +13 -0
  142. package/dist/security/sanitize-core.d.ts.map +1 -0
  143. package/dist/security/sanitize.d.ts +5 -57
  144. package/dist/security/sanitize.d.ts.map +1 -1
  145. package/dist/security/trusted-types.d.ts +25 -0
  146. package/dist/security/trusted-types.d.ts.map +1 -0
  147. package/dist/security/types.d.ts +36 -0
  148. package/dist/security/types.d.ts.map +1 -0
  149. package/dist/security.es.mjs +50 -277
  150. package/dist/security.es.mjs.map +1 -1
  151. package/dist/store/create-store.d.ts +15 -0
  152. package/dist/store/create-store.d.ts.map +1 -0
  153. package/dist/store/define-store.d.ts +28 -0
  154. package/dist/store/define-store.d.ts.map +1 -0
  155. package/dist/store/devtools.d.ts +22 -0
  156. package/dist/store/devtools.d.ts.map +1 -0
  157. package/dist/store/index.d.ts +10 -286
  158. package/dist/store/index.d.ts.map +1 -1
  159. package/dist/store/mapping.d.ts +28 -0
  160. package/dist/store/mapping.d.ts.map +1 -0
  161. package/dist/store/persisted.d.ts +13 -0
  162. package/dist/store/persisted.d.ts.map +1 -0
  163. package/dist/store/plugins.d.ts +13 -0
  164. package/dist/store/plugins.d.ts.map +1 -0
  165. package/dist/store/registry.d.ts +28 -0
  166. package/dist/store/registry.d.ts.map +1 -0
  167. package/dist/store/types.d.ts +71 -0
  168. package/dist/store/types.d.ts.map +1 -0
  169. package/dist/store/utils.d.ts +28 -0
  170. package/dist/store/utils.d.ts.map +1 -0
  171. package/dist/store/watch.d.ts +23 -0
  172. package/dist/store/watch.d.ts.map +1 -0
  173. package/dist/store.es.mjs +22 -224
  174. package/dist/store.es.mjs.map +1 -1
  175. package/dist/type-guards-BdKlYYlS.js +32 -0
  176. package/dist/type-guards-BdKlYYlS.js.map +1 -0
  177. package/dist/untrack-DNnnqdlR.js +6 -0
  178. package/dist/untrack-DNnnqdlR.js.map +1 -0
  179. package/dist/view/directives/bind.d.ts +7 -0
  180. package/dist/view/directives/bind.d.ts.map +1 -0
  181. package/dist/view/directives/class.d.ts +8 -0
  182. package/dist/view/directives/class.d.ts.map +1 -0
  183. package/dist/view/directives/for.d.ts +23 -0
  184. package/dist/view/directives/for.d.ts.map +1 -0
  185. package/dist/view/directives/html.d.ts +7 -0
  186. package/dist/view/directives/html.d.ts.map +1 -0
  187. package/dist/view/directives/if.d.ts +7 -0
  188. package/dist/view/directives/if.d.ts.map +1 -0
  189. package/dist/view/directives/index.d.ts +12 -0
  190. package/dist/view/directives/index.d.ts.map +1 -0
  191. package/dist/view/directives/model.d.ts +7 -0
  192. package/dist/view/directives/model.d.ts.map +1 -0
  193. package/dist/view/directives/on.d.ts +7 -0
  194. package/dist/view/directives/on.d.ts.map +1 -0
  195. package/dist/view/directives/ref.d.ts +7 -0
  196. package/dist/view/directives/ref.d.ts.map +1 -0
  197. package/dist/view/directives/show.d.ts +7 -0
  198. package/dist/view/directives/show.d.ts.map +1 -0
  199. package/dist/view/directives/style.d.ts +7 -0
  200. package/dist/view/directives/style.d.ts.map +1 -0
  201. package/dist/view/directives/text.d.ts +7 -0
  202. package/dist/view/directives/text.d.ts.map +1 -0
  203. package/dist/view/evaluate.d.ts +43 -0
  204. package/dist/view/evaluate.d.ts.map +1 -0
  205. package/dist/view/index.d.ts +3 -93
  206. package/dist/view/index.d.ts.map +1 -1
  207. package/dist/view/mount.d.ts +69 -0
  208. package/dist/view/mount.d.ts.map +1 -0
  209. package/dist/view/process.d.ts +26 -0
  210. package/dist/view/process.d.ts.map +1 -0
  211. package/dist/view/types.d.ts +36 -0
  212. package/dist/view/types.d.ts.map +1 -0
  213. package/dist/view.es.mjs +358 -251
  214. package/dist/view.es.mjs.map +1 -1
  215. package/dist/watch-DXXv3iAI.js +58 -0
  216. package/dist/watch-DXXv3iAI.js.map +1 -0
  217. package/package.json +14 -14
  218. package/src/component/component.ts +289 -0
  219. package/src/component/html.ts +53 -0
  220. package/src/component/index.ts +40 -414
  221. package/src/component/props.ts +116 -0
  222. package/src/component/types.ts +85 -0
  223. package/src/core/collection.ts +181 -7
  224. package/src/core/dom.ts +38 -0
  225. package/src/core/element.ts +59 -25
  226. package/src/core/index.ts +48 -4
  227. package/src/core/utils/array.ts +102 -0
  228. package/src/core/utils/function.ts +151 -0
  229. package/src/core/utils/index.ts +83 -0
  230. package/src/core/utils/misc.ts +82 -0
  231. package/src/core/utils/number.ts +78 -0
  232. package/src/core/utils/object.ts +206 -0
  233. package/src/core/utils/string.ts +112 -0
  234. package/src/core/utils/type-guards.ts +112 -0
  235. package/src/full.ts +187 -150
  236. package/src/index.ts +36 -36
  237. package/src/motion/animate.ts +113 -0
  238. package/src/motion/easing.ts +40 -0
  239. package/src/motion/flip.ts +176 -0
  240. package/src/motion/index.ts +41 -358
  241. package/src/motion/keyframes.ts +46 -0
  242. package/src/motion/reduced-motion.ts +17 -0
  243. package/src/motion/scroll.ts +57 -0
  244. package/src/motion/spring.ts +150 -0
  245. package/src/motion/stagger.ts +43 -0
  246. package/src/motion/timeline.ts +246 -0
  247. package/src/motion/transition.ts +51 -0
  248. package/src/motion/types.ts +198 -0
  249. package/src/platform/storage.ts +215 -208
  250. package/src/reactive/batch.ts +22 -0
  251. package/src/reactive/computed.ts +92 -0
  252. package/src/reactive/core.ts +114 -0
  253. package/src/reactive/effect.ts +54 -0
  254. package/src/reactive/index.ts +23 -22
  255. package/src/reactive/internals.ts +122 -0
  256. package/src/reactive/linked.ts +56 -0
  257. package/src/reactive/persisted.ts +74 -0
  258. package/src/reactive/readonly.ts +35 -0
  259. package/src/reactive/signal.ts +20 -520
  260. package/src/reactive/type-guards.ts +22 -0
  261. package/src/reactive/untrack.ts +31 -0
  262. package/src/reactive/watch.ts +73 -0
  263. package/src/router/index.ts +41 -718
  264. package/src/router/links.ts +130 -0
  265. package/src/router/match.ts +106 -0
  266. package/src/router/navigation.ts +71 -0
  267. package/src/router/query.ts +35 -0
  268. package/src/router/router.ts +211 -0
  269. package/src/router/state.ts +46 -0
  270. package/src/router/types.ts +93 -0
  271. package/src/router/utils.ts +116 -0
  272. package/src/security/constants.ts +209 -0
  273. package/src/security/csp.ts +77 -0
  274. package/src/security/index.ts +4 -12
  275. package/src/security/sanitize-core.ts +364 -0
  276. package/src/security/sanitize.ts +66 -625
  277. package/src/security/trusted-types.ts +69 -0
  278. package/src/security/types.ts +40 -0
  279. package/src/store/create-store.ts +329 -0
  280. package/src/store/define-store.ts +48 -0
  281. package/src/store/devtools.ts +45 -0
  282. package/src/store/index.ts +22 -848
  283. package/src/store/mapping.ts +73 -0
  284. package/src/store/persisted.ts +61 -0
  285. package/src/store/plugins.ts +32 -0
  286. package/src/store/registry.ts +51 -0
  287. package/src/store/types.ts +94 -0
  288. package/src/store/utils.ts +141 -0
  289. package/src/store/watch.ts +52 -0
  290. package/src/view/directives/bind.ts +23 -0
  291. package/src/view/directives/class.ts +70 -0
  292. package/src/view/directives/for.ts +275 -0
  293. package/src/view/directives/html.ts +19 -0
  294. package/src/view/directives/if.ts +30 -0
  295. package/src/view/directives/index.ts +11 -0
  296. package/src/view/directives/model.ts +56 -0
  297. package/src/view/directives/on.ts +41 -0
  298. package/src/view/directives/ref.ts +41 -0
  299. package/src/view/directives/show.ts +26 -0
  300. package/src/view/directives/style.ts +47 -0
  301. package/src/view/directives/text.ts +15 -0
  302. package/src/view/evaluate.ts +290 -0
  303. package/src/view/index.ts +112 -1041
  304. package/src/view/mount.ts +200 -0
  305. package/src/view/process.ts +92 -0
  306. package/src/view/types.ts +44 -0
  307. package/dist/core/utils.d.ts +0 -313
  308. package/dist/core/utils.d.ts.map +0 -1
  309. package/src/core/utils.ts +0 -444
@@ -1 +1 @@
1
- {"version":3,"file":"platform.es.mjs","sources":["../src/platform/buckets.ts","../src/platform/cache.ts","../src/platform/notifications.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 * 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 * 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 return Object.keys(this.storage);\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"],"names":["IndexedDBBucket","bucketName","dbName","resolve","reject","request","db","mode","operation","store","key","data","buckets","name","CacheHandleImpl","cache","url","urls","response","req","c","notifications","title","options","WebStorageAdapter","storage","raw","value","serialized","LocalStorageAdapter","SessionStorageAdapter","IndexedDBAdapter"],"mappings":"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"}
1
+ {"version":3,"file":"platform.es.mjs","sources":["../src/platform/buckets.ts","../src/platform/cache.ts","../src/platform/notifications.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 * 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","/**\r\n * Unified storage adapters for web platform storage APIs.\r\n * Provides a consistent, promise-based interface with predictable errors.\r\n */\r\n\r\n/**\r\n * Common interface for all storage adapters.\r\n * All methods return promises for a unified async API.\r\n */\r\nexport interface StorageAdapter {\r\n /**\r\n * Retrieve a value by key.\r\n * @param key - The storage key\r\n * @returns The stored value or null if not found\r\n */\r\n get<T>(key: string): Promise<T | null>;\r\n\r\n /**\r\n * Store a value by key.\r\n * @param key - The storage key\r\n * @param value - The value to store\r\n */\r\n set<T>(key: string, value: T): Promise<void>;\r\n\r\n /**\r\n * Remove a value by key.\r\n * @param key - The storage key\r\n */\r\n remove(key: string): Promise<void>;\r\n\r\n /**\r\n * Clear all stored values.\r\n */\r\n clear(): Promise<void>;\r\n\r\n /**\r\n * Get all storage keys.\r\n * @returns Array of all keys\r\n */\r\n keys(): Promise<string[]>;\r\n}\r\n\r\n/**\r\n * Abstract base class for web storage adapters (localStorage/sessionStorage).\r\n * Implements DRY principle by sharing common logic.\r\n */\r\nabstract class WebStorageAdapter implements StorageAdapter {\r\n constructor(protected readonly storage: Storage) {}\r\n\r\n async get<T>(key: string): Promise<T | null> {\r\n const raw = this.storage.getItem(key);\r\n if (raw === null) return null;\r\n try {\r\n return JSON.parse(raw) as T;\r\n } catch {\r\n return raw as unknown as T;\r\n }\r\n }\r\n\r\n async set<T>(key: string, value: T): Promise<void> {\r\n const serialized = typeof value === 'string' ? value : JSON.stringify(value);\r\n this.storage.setItem(key, serialized);\r\n }\r\n\r\n async remove(key: string): Promise<void> {\r\n this.storage.removeItem(key);\r\n }\r\n\r\n async clear(): Promise<void> {\r\n this.storage.clear();\r\n }\r\n\r\n async keys(): Promise<string[]> {\r\n const result: string[] = [];\r\n for (let i = 0; i < this.storage.length; i++) {\r\n const key = this.storage.key(i);\r\n if (key !== null) {\r\n result.push(key);\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * localStorage adapter with async interface.\r\n */\r\nclass LocalStorageAdapter extends WebStorageAdapter {\r\n constructor() {\r\n super(localStorage);\r\n }\r\n}\r\n\r\n/**\r\n * sessionStorage adapter with async interface.\r\n */\r\nclass SessionStorageAdapter extends WebStorageAdapter {\r\n constructor() {\r\n super(sessionStorage);\r\n }\r\n}\r\n\r\n/**\r\n * IndexedDB configuration options.\r\n */\r\nexport interface IndexedDBOptions {\r\n /** Database name */\r\n name: string;\r\n /** Object store name */\r\n store: string;\r\n /** Database version (optional) */\r\n version?: number;\r\n}\r\n\r\n/**\r\n * IndexedDB key-value adapter.\r\n * Wraps IndexedDB with a simple key-value interface.\r\n */\r\nclass IndexedDBAdapter implements StorageAdapter {\r\n private dbPromise: Promise<IDBDatabase> | null = null;\r\n\r\n constructor(private readonly options: IndexedDBOptions) {}\r\n\r\n /**\r\n * Opens or creates the IndexedDB database.\r\n */\r\n private openDB(): Promise<IDBDatabase> {\r\n if (this.dbPromise) return this.dbPromise;\r\n\r\n this.dbPromise = new Promise((resolve, reject) => {\r\n const request = indexedDB.open(this.options.name, this.options.version ?? 1);\r\n\r\n request.onupgradeneeded = () => {\r\n const db = request.result;\r\n if (!db.objectStoreNames.contains(this.options.store)) {\r\n db.createObjectStore(this.options.store);\r\n }\r\n };\r\n\r\n request.onsuccess = () => resolve(request.result);\r\n request.onerror = () => reject(request.error);\r\n });\r\n\r\n return this.dbPromise;\r\n }\r\n\r\n /**\r\n * Executes a transaction on the object store.\r\n */\r\n private async withStore<T>(\r\n mode: IDBTransactionMode,\r\n operation: (store: IDBObjectStore) => IDBRequest<T>\r\n ): Promise<T> {\r\n const db = await this.openDB();\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(this.options.store, mode);\r\n const store = tx.objectStore(this.options.store);\r\n const request = operation(store);\r\n request.onsuccess = () => resolve(request.result);\r\n request.onerror = () => reject(request.error);\r\n });\r\n }\r\n\r\n async get<T>(key: string): Promise<T | null> {\r\n const result = await this.withStore<T | undefined>('readonly', (store) => store.get(key));\r\n return result ?? null;\r\n }\r\n\r\n async set<T>(key: string, value: T): Promise<void> {\r\n await this.withStore('readwrite', (store) => store.put(value, key));\r\n }\r\n\r\n async remove(key: string): Promise<void> {\r\n await this.withStore('readwrite', (store) => store.delete(key));\r\n }\r\n\r\n async clear(): Promise<void> {\r\n await this.withStore('readwrite', (store) => store.clear());\r\n }\r\n\r\n async keys(): Promise<string[]> {\r\n const result = await this.withStore<IDBValidKey[]>('readonly', (store) => store.getAllKeys());\r\n return result.map((key) => String(key));\r\n }\r\n}\r\n\r\n/**\r\n * Storage factory providing access to different storage adapters.\r\n */\r\nexport const storage = {\r\n /**\r\n * Create a localStorage adapter.\r\n * @returns StorageAdapter wrapping localStorage\r\n */\r\n local(): StorageAdapter {\r\n return new LocalStorageAdapter();\r\n },\r\n\r\n /**\r\n * Create a sessionStorage adapter.\r\n * @returns StorageAdapter wrapping sessionStorage\r\n */\r\n session(): StorageAdapter {\r\n return new SessionStorageAdapter();\r\n },\r\n\r\n /**\r\n * Create an IndexedDB adapter with key-value interface.\r\n * @param options - Database and store configuration\r\n * @returns StorageAdapter wrapping IndexedDB\r\n */\r\n indexedDB(options: IndexedDBOptions): StorageAdapter {\r\n return new IndexedDBAdapter(options);\r\n },\r\n};\r\n"],"names":["IndexedDBBucket","bucketName","dbName","resolve","reject","request","db","mode","operation","store","key","data","buckets","name","CacheHandleImpl","cache","url","urls","response","req","c","notifications","title","options","WebStorageAdapter","storage","raw","value","serialized","result","i","LocalStorageAdapter","SessionStorageAdapter","IndexedDBAdapter"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Batched reactive updates.
3
+ */
4
+ /**
5
+ * Batches multiple signal updates into a single notification cycle.
6
+ *
7
+ * Updates made inside the batch function are deferred until the batch
8
+ * completes, preventing intermediate re-renders and improving performance.
9
+ *
10
+ * @param fn - Function containing multiple signal updates
11
+ */
12
+ export declare const batch: (fn: () => void) => void;
13
+ //# sourceMappingURL=batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../src/reactive/batch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;;;GAOG;AACH,eAAO,MAAM,KAAK,GAAI,IAAI,MAAM,IAAI,KAAG,IAOtC,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Computed reactive values.
3
+ */
4
+ import { type ReactiveSource } from './internals';
5
+ /**
6
+ * A computed value that derives from other reactive sources.
7
+ *
8
+ * Computed values are lazily evaluated and cached. They only
9
+ * recompute when their dependencies change.
10
+ *
11
+ * @template T - The type of the computed value
12
+ */
13
+ export declare class Computed<T> implements ReactiveSource {
14
+ private readonly compute;
15
+ private cachedValue;
16
+ private dirty;
17
+ private subscribers;
18
+ private readonly markDirty;
19
+ /**
20
+ * Creates a new computed value.
21
+ * @param compute - Function that computes the value
22
+ */
23
+ constructor(compute: () => T);
24
+ /**
25
+ * Gets the computed value, recomputing if dependencies changed.
26
+ * During untrack calls, getCurrentObserver returns undefined, preventing dependency tracking.
27
+ */
28
+ get value(): T;
29
+ /**
30
+ * Reads the current computed value without tracking.
31
+ * Useful when you need the value but don't want to create a dependency.
32
+ *
33
+ * @returns The current cached value (recomputes if dirty)
34
+ */
35
+ peek(): T;
36
+ /**
37
+ * Removes an observer from this computed's subscriber set.
38
+ * @internal
39
+ */
40
+ unsubscribe(observer: () => void): void;
41
+ }
42
+ /**
43
+ * Creates a new computed value.
44
+ *
45
+ * @template T - The type of the computed value
46
+ * @param fn - Function that computes the value from reactive sources
47
+ * @returns A new Computed instance
48
+ */
49
+ export declare const computed: <T>(fn: () => T) => Computed<T>;
50
+ //# sourceMappingURL=computed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../../src/reactive/computed.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB;;;;;;;GAOG;AACH,qBAAa,QAAQ,CAAC,CAAC,CAAE,YAAW,cAAc;IAiBpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAhBpC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAOxB;IAEF;;;OAGG;gBAC0B,OAAO,EAAE,MAAM,CAAC;IAE7C;;;OAGG;IACH,IAAI,KAAK,IAAI,CAAC,CAab;IAED;;;;;OAKG;IACH,IAAI,IAAI,CAAC;IAUT;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;CAGxC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,IAAI,MAAM,CAAC,KAAG,QAAQ,CAAC,CAAC,CAAqB,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Core reactive signals.
3
+ */
4
+ import { type ReactiveSource } from './internals';
5
+ /**
6
+ * A reactive value container that notifies subscribers on change.
7
+ *
8
+ * Signals are the foundational primitive of the reactive system.
9
+ * Reading a signal's value inside an effect or computed automatically
10
+ * establishes a reactive dependency.
11
+ *
12
+ * @template T - The type of the stored value
13
+ */
14
+ export declare class Signal<T> implements ReactiveSource {
15
+ private _value;
16
+ private subscribers;
17
+ /**
18
+ * Creates a new signal with an initial value.
19
+ * @param _value - The initial value
20
+ */
21
+ constructor(_value: T);
22
+ /**
23
+ * Gets the current value and tracks the read if inside an observer.
24
+ * During untrack calls, getCurrentObserver returns undefined, preventing dependency tracking.
25
+ */
26
+ get value(): T;
27
+ /**
28
+ * Sets a new value and notifies all subscribers if the value changed.
29
+ * Uses Object.is for equality comparison.
30
+ */
31
+ set value(next: T);
32
+ /**
33
+ * Reads the current value without tracking.
34
+ * Useful when you need the value but don't want to create a dependency.
35
+ *
36
+ * @returns The current value
37
+ */
38
+ peek(): T;
39
+ /**
40
+ * Updates the value using a function.
41
+ * Useful for updates based on the current value.
42
+ *
43
+ * @param updater - Function that receives current value and returns new value
44
+ */
45
+ update(updater: (current: T) => T): void;
46
+ /**
47
+ * Removes all subscribers from this signal.
48
+ * Use this when a signal is no longer needed to prevent memory leaks.
49
+ *
50
+ * @example
51
+ * ```ts
52
+ * const count = signal(0);
53
+ * effect(() => console.log(count.value));
54
+ * count.dispose(); // All subscribers removed
55
+ * ```
56
+ */
57
+ dispose(): void;
58
+ /**
59
+ * Removes an observer from this signal's subscriber set.
60
+ * @internal
61
+ */
62
+ unsubscribe(observer: () => void): void;
63
+ }
64
+ /**
65
+ * Creates a new reactive signal.
66
+ *
67
+ * @template T - The type of the signal value
68
+ * @param value - The initial value
69
+ * @returns A new Signal instance
70
+ */
71
+ export declare const signal: <T>(value: T) => Signal<T>;
72
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/reactive/core.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB;;;;;;;;GAQG;AACH,qBAAa,MAAM,CAAC,CAAC,CAAE,YAAW,cAAc;IAOlC,OAAO,CAAC,MAAM;IAN1B,OAAO,CAAC,WAAW,CAAyB;IAE5C;;;OAGG;gBACiB,MAAM,EAAE,CAAC;IAE7B;;;OAGG;IACH,IAAI,KAAK,IAAI,CAAC,CAOb;IAED;;;OAGG;IACH,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,EAQhB;IAED;;;;;OAKG;IACH,IAAI,IAAI,CAAC;IAIT;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI;IAIxC;;;;;;;;;;OAUG;IACH,OAAO,IAAI,IAAI;IASf;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;CAGxC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,CAAC,CAAsB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Reactive effects.
3
+ */
4
+ import { CleanupFn } from './internals';
5
+ /**
6
+ * Creates a side effect that automatically re-runs when dependencies change.
7
+ *
8
+ * The effect runs immediately upon creation and then re-runs whenever
9
+ * any signal or computed value read inside it changes.
10
+ *
11
+ * @param fn - The effect function to run
12
+ * @returns A cleanup function to stop the effect
13
+ */
14
+ export declare const effect: (fn: () => void | CleanupFn) => CleanupFn;
15
+ //# sourceMappingURL=effect.d.ts.map
@@ -0,0 +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"}
@@ -3,6 +3,6 @@
3
3
  *
4
4
  * @module bquery/reactive
5
5
  */
6
- export { Computed, Signal, batch, computed, effect, isComputed, isSignal, persistedSignal, readonly, signal, untrack, watch, } from './signal';
7
- export type { CleanupFn, Observer, ReadonlySignal } from './signal';
6
+ export { Computed, Signal, batch, computed, effect, isComputed, isSignal, linkedSignal, persistedSignal, readonly, signal, untrack, watch, } from './signal';
7
+ export type { CleanupFn, LinkedSignal, Observer, ReadonlySignal } from './signal';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reactive/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAM,EACN,UAAU,EACV,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,MAAM,EACN,OAAO,EACP,KAAK,GACN,MAAM,UAAU,CAAC;AAElB,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reactive/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAM,EACN,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,MAAM,EACN,OAAO,EACP,KAAK,GACN,MAAM,UAAU,CAAC;AAElB,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Internal reactive plumbing shared across primitives.
3
+ * @internal
4
+ */
5
+ export type Observer = () => void;
6
+ export type CleanupFn = () => void;
7
+ /**
8
+ * Interface for reactive sources (Signals, Computed) that can unsubscribe observers.
9
+ * @internal
10
+ */
11
+ export interface ReactiveSource {
12
+ unsubscribe(observer: Observer): void;
13
+ }
14
+ export declare const track: <T>(observer: Observer, fn: () => T) => T;
15
+ export declare const getCurrentObserver: () => Observer | undefined;
16
+ /**
17
+ * Executes a function without exposing the current observer to dependencies.
18
+ * Unlike disabling tracking globally, this still allows nested reactive internals
19
+ * (e.g., computed recomputation) to track their own dependencies.
20
+ * @internal
21
+ */
22
+ export declare const withoutCurrentObserver: <T>(fn: () => T) => T;
23
+ export declare const scheduleObserver: (observer: Observer) => void;
24
+ export declare const beginBatch: () => void;
25
+ export declare const endBatch: () => void;
26
+ /**
27
+ * Registers a dependency between an observer and a reactive source.
28
+ * @internal
29
+ */
30
+ export declare const registerDependency: (observer: Observer, source: ReactiveSource) => void;
31
+ /**
32
+ * Removes a specific source from an observer's dependency set.
33
+ * Used when a source (e.g. Signal) is disposed to prevent stale references.
34
+ * @internal
35
+ */
36
+ export declare const removeDependency: (observer: Observer, source: ReactiveSource) => void;
37
+ /**
38
+ * Clears all dependencies for an observer, unsubscribing from all sources.
39
+ * @internal
40
+ */
41
+ export declare const clearDependencies: (observer: Observer) => void;
42
+ //# sourceMappingURL=internals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internals.d.ts","sourceRoot":"","sources":["../../src/reactive/internals.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC;AAClC,MAAM,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC;AAEnC;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CACvC;AASD,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,UAAU,QAAQ,EAAE,IAAI,MAAM,CAAC,KAAG,CAO1D,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,QAAQ,GAAG,SACR,CAAC;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,EAAE,IAAI,MAAM,CAAC,KAAG,CAUvD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,UAAU,QAAQ,KAAG,IAMrD,CAAC;AAaF,eAAO,MAAM,UAAU,QAAO,IAE7B,CAAC;AAEF,eAAO,MAAM,QAAQ,QAAO,IAM3B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,QAAQ,EAAE,QAAQ,cAAc,KAAG,IAO/E,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU,QAAQ,EAAE,QAAQ,cAAc,KAAG,IAK7E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,QAAQ,KAAG,IAQtD,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Linked (writable) computed helpers.
3
+ */
4
+ /**
5
+ * A writable computed-like signal.
6
+ */
7
+ export interface LinkedSignal<T> {
8
+ /** Gets or sets the current value with dependency tracking. */
9
+ value: T;
10
+ /** Gets the current value without dependency tracking. */
11
+ peek(): T;
12
+ }
13
+ /**
14
+ * Creates a writable computed signal by linking a getter and setter.
15
+ *
16
+ * @template T - The derived value type
17
+ * @param getValue - Getter that derives the current value
18
+ * @param setValue - Setter that writes back to underlying signals
19
+ * @returns A writable computed-like signal
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * const first = signal('Ada');
24
+ * const last = signal('Lovelace');
25
+ * const fullName = linkedSignal(
26
+ * () => `${first.value} ${last.value}`,
27
+ * (next) => {
28
+ * const [a, b] = next.split(' ');
29
+ * first.value = a ?? '';
30
+ * last.value = b ?? '';
31
+ * }
32
+ * );
33
+ * ```
34
+ */
35
+ export declare const linkedSignal: <T>(getValue: () => T, setValue: (value: T) => void) => LinkedSignal<T>;
36
+ //# sourceMappingURL=linked.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linked.d.ts","sourceRoot":"","sources":["../../src/reactive/linked.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,+DAA+D;IAC/D,KAAK,EAAE,CAAC,CAAC;IACT,0DAA0D;IAC1D,IAAI,IAAI,CAAC,CAAC;CACX;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,EAC5B,UAAU,MAAM,CAAC,EACjB,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,KAC3B,YAAY,CAAC,CAAC,CAchB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * LocalStorage-backed signals.
3
+ */
4
+ import { Signal } from './core';
5
+ /**
6
+ * Creates a signal that persists to localStorage.
7
+ *
8
+ * @template T - The type of the signal value
9
+ * @param key - The localStorage key
10
+ * @param initialValue - The initial value if not found in storage
11
+ * @returns A Signal that syncs with localStorage (falls back to in-memory if unavailable)
12
+ */
13
+ export declare const persistedSignal: <T>(key: string, initialValue: T) => Signal<T>;
14
+ //# sourceMappingURL=persisted.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persisted.d.ts","sourceRoot":"","sources":["../../src/reactive/persisted.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGxC;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,KAAK,MAAM,EAAE,cAAc,CAAC,KAAG,MAAM,CAAC,CAAC,CA0DzE,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Read-only signal wrappers.
3
+ */
4
+ import type { Signal } from './core';
5
+ /**
6
+ * A readonly wrapper around a signal that prevents writes.
7
+ * Provides read-only access to a signal's value while maintaining reactivity.
8
+ *
9
+ * @template T - The type of the wrapped value
10
+ */
11
+ export interface ReadonlySignal<T> {
12
+ /** Gets the current value with dependency tracking. */
13
+ readonly value: T;
14
+ /** Gets the current value without dependency tracking. */
15
+ peek(): T;
16
+ }
17
+ /**
18
+ * Creates a read-only view of a signal.
19
+ * Useful for exposing reactive state without allowing modifications.
20
+ *
21
+ * @template T - The type of the signal value
22
+ * @param sig - The signal to wrap
23
+ * @returns A readonly signal wrapper
24
+ */
25
+ export declare const readonly: <T>(sig: Signal<T>) => ReadonlySignal<T>;
26
+ //# sourceMappingURL=readonly.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readonly.d.ts","sourceRoot":"","sources":["../../src/reactive/readonly.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC;;;;;GAKG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,0DAA0D;IAC1D,IAAI,IAAI,CAAC,CAAC;CACX;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,KAAG,cAAc,CAAC,CAAC,CAO3D,CAAC"}