@bquery/bquery 1.5.0 → 1.6.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 (106) hide show
  1. package/README.md +586 -546
  2. package/dist/component/component.d.ts +13 -5
  3. package/dist/component/component.d.ts.map +1 -1
  4. package/dist/component/html.d.ts +40 -3
  5. package/dist/component/html.d.ts.map +1 -1
  6. package/dist/component/index.d.ts +2 -2
  7. package/dist/component/index.d.ts.map +1 -1
  8. package/dist/component/library.d.ts.map +1 -1
  9. package/dist/component/types.d.ts +131 -16
  10. package/dist/component/types.d.ts.map +1 -1
  11. package/dist/component-BEQgt5hl.js +600 -0
  12. package/dist/component-BEQgt5hl.js.map +1 -0
  13. package/dist/component.es.mjs +7 -6
  14. package/dist/config-DRmZZno3.js.map +1 -1
  15. package/dist/core-BGQJVw0-.js +35 -0
  16. package/dist/core-BGQJVw0-.js.map +1 -0
  17. package/dist/{core-CK2Mfpf4.js → core-CCEabVHl.js} +2 -2
  18. package/dist/{core-CK2Mfpf4.js.map → core-CCEabVHl.js.map} +1 -1
  19. package/dist/core.es.mjs +1 -1
  20. package/dist/effect-AFRW_Plg.js +84 -0
  21. package/dist/effect-AFRW_Plg.js.map +1 -0
  22. package/dist/full.d.ts +4 -4
  23. package/dist/full.d.ts.map +1 -1
  24. package/dist/full.es.mjs +98 -94
  25. package/dist/full.iife.js +14 -14
  26. package/dist/full.iife.js.map +1 -1
  27. package/dist/full.umd.js +14 -14
  28. package/dist/full.umd.js.map +1 -1
  29. package/dist/index.es.mjs +143 -139
  30. package/dist/{motion-C5DRdPnO.js → motion-D9TcHxOF.js} +1 -1
  31. package/dist/{motion-C5DRdPnO.js.map → motion-D9TcHxOF.js.map} +1 -1
  32. package/dist/motion.es.mjs +1 -1
  33. package/dist/{platform-B7JhGBc7.js → platform-Dr9b6fsq.js} +21 -20
  34. package/dist/platform-Dr9b6fsq.js.map +1 -0
  35. package/dist/platform.es.mjs +1 -1
  36. package/dist/{reactive-BDya-ia8.js → reactive-DSkct0dO.js} +51 -50
  37. package/dist/reactive-DSkct0dO.js.map +1 -0
  38. package/dist/reactive.es.mjs +19 -17
  39. package/dist/{router-CijiICxt.js → router-CbDhl8rS.js} +3 -3
  40. package/dist/{router-CijiICxt.js.map → router-CbDhl8rS.js.map} +1 -1
  41. package/dist/router.es.mjs +1 -1
  42. package/dist/{sanitize-jyJ2ryE2.js → sanitize-Bs2dkMby.js} +94 -83
  43. package/dist/sanitize-Bs2dkMby.js.map +1 -0
  44. package/dist/security/index.d.ts +4 -2
  45. package/dist/security/index.d.ts.map +1 -1
  46. package/dist/security/sanitize.d.ts +4 -1
  47. package/dist/security/sanitize.d.ts.map +1 -1
  48. package/dist/security/trusted-html.d.ts +53 -0
  49. package/dist/security/trusted-html.d.ts.map +1 -0
  50. package/dist/security.es.mjs +10 -9
  51. package/dist/store/define-store.d.ts +1 -1
  52. package/dist/store/define-store.d.ts.map +1 -1
  53. package/dist/store/mapping.d.ts +1 -1
  54. package/dist/store/mapping.d.ts.map +1 -1
  55. package/dist/store/persisted.d.ts +1 -1
  56. package/dist/store/persisted.d.ts.map +1 -1
  57. package/dist/store/types.d.ts +2 -2
  58. package/dist/store/types.d.ts.map +1 -1
  59. package/dist/store/watch.d.ts +1 -1
  60. package/dist/store/watch.d.ts.map +1 -1
  61. package/dist/{store-CPK9E62U.js → store-BwDvI45q.js} +49 -48
  62. package/dist/{store-CPK9E62U.js.map → store-BwDvI45q.js.map} +1 -1
  63. package/dist/store.es.mjs +1 -1
  64. package/dist/storybook/index.d.ts +37 -0
  65. package/dist/storybook/index.d.ts.map +1 -0
  66. package/dist/storybook.es.mjs +151 -0
  67. package/dist/storybook.es.mjs.map +1 -0
  68. package/dist/untrack-B0rVscTc.js +7 -0
  69. package/dist/untrack-B0rVscTc.js.map +1 -0
  70. package/dist/{view-Cdi0g-qo.js → view-C70lA3vf.js} +29 -28
  71. package/dist/{view-Cdi0g-qo.js.map → view-C70lA3vf.js.map} +1 -1
  72. package/dist/view.es.mjs +9 -8
  73. package/package.json +141 -136
  74. package/src/component/component.ts +259 -54
  75. package/src/component/html.ts +153 -53
  76. package/src/component/index.ts +10 -2
  77. package/src/component/library.ts +42 -28
  78. package/src/component/types.ts +184 -19
  79. package/src/full.ts +8 -2
  80. package/src/motion/transition.ts +97 -97
  81. package/src/motion/types.ts +208 -208
  82. package/src/platform/announcer.ts +208 -208
  83. package/src/platform/config.ts +163 -163
  84. package/src/platform/cookies.ts +165 -165
  85. package/src/platform/index.ts +39 -39
  86. package/src/platform/meta.ts +168 -168
  87. package/src/reactive/async-data.ts +486 -486
  88. package/src/reactive/index.ts +37 -37
  89. package/src/reactive/signal.ts +29 -29
  90. package/src/security/constants.ts +211 -211
  91. package/src/security/index.ts +17 -10
  92. package/src/security/sanitize.ts +70 -66
  93. package/src/security/trusted-html.ts +71 -0
  94. package/src/store/define-store.ts +49 -48
  95. package/src/store/mapping.ts +74 -73
  96. package/src/store/persisted.ts +62 -61
  97. package/src/store/types.ts +92 -94
  98. package/src/store/watch.ts +53 -52
  99. package/src/storybook/index.ts +479 -0
  100. package/dist/component-CY5MVoYN.js +0 -531
  101. package/dist/component-CY5MVoYN.js.map +0 -1
  102. package/dist/core-DPdbItcq.js +0 -112
  103. package/dist/core-DPdbItcq.js.map +0 -1
  104. package/dist/platform-B7JhGBc7.js.map +0 -1
  105. package/dist/reactive-BDya-ia8.js.map +0 -1
  106. package/dist/sanitize-jyJ2ryE2.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-Dr9b6fsq.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
1
  import { n as a, t as s } from "./config-DRmZZno3.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-B7JhGBc7.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-Dr9b6fsq.js";
3
3
  export {
4
4
  u as buckets,
5
5
  r as cache,
@@ -1,32 +1,34 @@
1
1
  import { i as q } from "./object-qGpWr6-J.js";
2
- import { a as b, c as D, d as O, i as U, l as B, n as v, o as I, r as g, s as V, t as x, u as S } from "./core-DPdbItcq.js";
3
- import { n as _ } from "./config-DRmZZno3.js";
4
- var K = (e) => {
5
- U();
2
+ import { a as D, c as U, i as O, l as b, n as B, o as I, r as p, t as g } from "./effect-AFRW_Plg.js";
3
+ import { n as V } from "./config-DRmZZno3.js";
4
+ import { n as v, t as x } from "./core-BGQJVw0-.js";
5
+ import { t as S } from "./untrack-B0rVscTc.js";
6
+ var X = (e) => {
7
+ B();
6
8
  try {
7
9
  e();
8
10
  } finally {
9
- I();
11
+ O();
10
12
  }
11
13
  }, k = class {
12
14
  constructor(e) {
13
15
  this.compute = e, this.dirty = !0, this.subscribers = /* @__PURE__ */ new Set(), this.markDirty = () => {
14
16
  this.dirty = !0;
15
17
  const t = Array.from(this.subscribers);
16
- for (const a of t) B(a);
18
+ for (const a of t) U(a);
17
19
  };
18
20
  }
19
21
  get value() {
20
- const e = V();
21
- return e && (this.subscribers.add(e), D(e, this)), this.dirty && (this.dirty = !1, b(this.markDirty), this.cachedValue = S(this.markDirty, this.compute)), this.cachedValue;
22
+ const e = D();
23
+ return e && (this.subscribers.add(e), I(e, this)), this.dirty && (this.dirty = !1, p(this.markDirty), this.cachedValue = b(this.markDirty, this.compute)), this.cachedValue;
22
24
  }
23
25
  peek() {
24
- return this.dirty && (this.dirty = !1, b(this.markDirty), this.cachedValue = S(this.markDirty, this.compute)), this.cachedValue;
26
+ return this.dirty && (this.dirty = !1, p(this.markDirty), this.cachedValue = b(this.markDirty, this.compute)), this.cachedValue;
25
27
  }
26
28
  unsubscribe(e) {
27
29
  this.subscribers.delete(e);
28
30
  }
29
- }, R = (e) => new k(e), p = (e) => O(e), A = (e) => {
31
+ }, R = (e) => new k(e), _ = (e) => {
30
32
  if (e instanceof Error) return e;
31
33
  if (typeof e == "string") return new Error(e);
32
34
  try {
@@ -34,14 +36,14 @@ var K = (e) => {
34
36
  } catch {
35
37
  return new Error(String(e));
36
38
  }
37
- }, L = (e) => typeof e == "function" ? e() : e.value, E = (...e) => {
39
+ }, A = (e) => typeof e == "function" ? e() : e.value, E = (...e) => {
38
40
  const t = new Headers();
39
41
  for (const a of e)
40
42
  a && new Headers(a).forEach((r, n) => {
41
43
  t.set(n, r);
42
44
  });
43
45
  return t;
44
- }, C = (e) => typeof e == "string" || e instanceof Blob || e instanceof FormData || e instanceof URLSearchParams || typeof ArrayBuffer < "u" && e instanceof ArrayBuffer || typeof ReadableStream < "u" && e instanceof ReadableStream ? !0 : typeof e == "object" && e !== null && ArrayBuffer.isView(e), M = (e, t) => e == null || C(e) ? e : (t.has("content-type") || t.set("content-type", "application/json"), JSON.stringify(e)), j = (e) => typeof e == "function" ? e() : e, P = (e, t) => {
46
+ }, L = (e) => typeof e == "string" || e instanceof Blob || e instanceof FormData || e instanceof URLSearchParams || typeof ArrayBuffer < "u" && e instanceof ArrayBuffer || typeof ReadableStream < "u" && e instanceof ReadableStream ? !0 : typeof e == "object" && e !== null && ArrayBuffer.isView(e), M = (e, t) => e == null || L(e) ? e : (t.has("content-type") || t.set("content-type", "application/json"), JSON.stringify(e)), j = (e) => typeof e == "function" ? e() : e, C = (e, t) => {
45
47
  for (const [a, r] of Object.entries(t))
46
48
  if (r != null) {
47
49
  if (Array.isArray(r)) {
@@ -50,10 +52,10 @@ var K = (e) => {
50
52
  }
51
53
  e.searchParams.set(a, String(r));
52
54
  }
53
- }, T = (e, t) => {
55
+ }, P = (e, t) => {
54
56
  const a = typeof window < "u" && /^https?:/i.test(window.location.href) ? window.location.href : "http://localhost", r = t ? new URL(t, a).toString() : a;
55
57
  return e instanceof URL ? new URL(e.toString(), r) : new URL(e, r);
56
- }, $ = async (e, t) => {
58
+ }, T = async (e, t) => {
57
59
  if (t === "response") return e;
58
60
  if (t === "text") return await e.text();
59
61
  if (t === "blob") return await e.blob();
@@ -70,10 +72,10 @@ var K = (e) => {
70
72
  }, w = (e) => {
71
73
  const t = e?.trim();
72
74
  return t ? t.toUpperCase() : void 0;
73
- }, z = (e, t, a) => {
75
+ }, $ = (e, t, a) => {
74
76
  const r = t instanceof Request ? w(t.method) : void 0;
75
77
  return e ?? r ?? (a ? "POST" : void 0);
76
- }, J = (e, t, a) => e || (t instanceof Request ? void 0 : a), N = (e) => {
78
+ }, z = (e, t, a) => e || (t instanceof Request ? void 0 : a), J = (e) => {
77
79
  const t = w(e.method);
78
80
  let a;
79
81
  if (t !== "GET" && t !== "HEAD" && !e.bodyUsed) try {
@@ -95,7 +97,7 @@ var K = (e) => {
95
97
  referrerPolicy: e.referrerPolicy,
96
98
  signal: e.signal
97
99
  };
98
- }, F = (e, t = {}) => {
100
+ }, N = (e, t = {}) => {
99
101
  const a = t.immediate ?? !0, r = v(t.defaultValue), n = v(null), s = v("idle"), i = R(() => s.value === "pending");
100
102
  let c = 0, f = !1, y = () => {
101
103
  };
@@ -111,19 +113,19 @@ var K = (e) => {
111
113
  const l = await e(), u = t.transform ? t.transform(l) : l;
112
114
  return f || o !== c ? r.peek() : (r.value = u, s.value = "success", t.onSuccess?.(u), u);
113
115
  } catch (l) {
114
- const u = A(l);
116
+ const u = _(l);
115
117
  return f || o !== c || (n.value = u, s.value = "error", t.onError?.(u)), r.peek();
116
118
  }
117
119
  };
118
120
  if (t.watch?.length) {
119
121
  let o = !1;
120
122
  y = g(() => {
121
- for (const l of t.watch ?? []) L(l);
123
+ for (const l of t.watch ?? []) A(l);
122
124
  if (!o) {
123
- o = !0, a && p(() => d());
125
+ o = !0, a && S(() => d());
124
126
  return;
125
127
  }
126
- p(() => d());
128
+ S(() => d());
127
129
  });
128
130
  } else a && d();
129
131
  return {
@@ -136,14 +138,14 @@ var K = (e) => {
136
138
  clear: h,
137
139
  dispose: m
138
140
  };
139
- }, H = (e, t = {}) => {
140
- const a = _().fetch, r = t.parseAs ?? a?.parseAs ?? "json", n = t.fetcher ?? fetch;
141
- return F(async () => {
142
- const s = j(e), i = typeof s == "string" || s instanceof URL ? T(s, t.baseUrl ?? a?.baseUrl) : s instanceof Request && t.query ? new URL(s.url) : null;
143
- i && t.query && P(i, t.query);
144
- const c = E(a?.headers, s instanceof Request ? s.headers : void 0, t.headers), f = t.body != null, y = w(t.method), h = z(y, s, f), m = h === "GET" || h === "HEAD" ? h : null;
141
+ }, F = (e, t = {}) => {
142
+ const a = V().fetch, r = t.parseAs ?? a?.parseAs ?? "json", n = t.fetcher ?? fetch;
143
+ return N(async () => {
144
+ const s = j(e), i = typeof s == "string" || s instanceof URL ? P(s, t.baseUrl ?? a?.baseUrl) : s instanceof Request && t.query ? new URL(s.url) : null;
145
+ i && t.query && C(i, t.query);
146
+ const c = E(a?.headers, s instanceof Request ? s.headers : void 0, t.headers), f = t.body != null, y = w(t.method), h = $(y, s, f), m = h === "GET" || h === "HEAD" ? h : null;
145
147
  if (f && m) throw new Error(`Cannot send a request body with ${m} requests`);
146
- const d = J(y, s, h), o = {
148
+ const d = z(y, s, h), o = {
147
149
  ...t,
148
150
  method: d,
149
151
  headers: c,
@@ -151,20 +153,20 @@ var K = (e) => {
151
153
  };
152
154
  delete o.baseUrl, delete o.query, delete o.parseAs, delete o.fetcher, delete o.defaultValue, delete o.immediate, delete o.watch, delete o.transform, delete o.onSuccess, delete o.onError;
153
155
  let l = i ?? s;
154
- s instanceof Request && i && i.toString() !== s.url && (l = new Request(i.toString(), N(s)));
156
+ s instanceof Request && i && i.toString() !== s.url && (l = new Request(i.toString(), J(s)));
155
157
  const u = await n(l, o);
156
158
  if (!u.ok) throw Object.assign(/* @__PURE__ */ new Error(`Request failed with status ${u.status}`), {
157
159
  response: u,
158
160
  status: u.status,
159
161
  statusText: u.statusText
160
162
  });
161
- return $(u, r);
163
+ return T(u, r);
162
164
  }, t);
163
165
  };
164
- function X(e = {}) {
166
+ function Y(e = {}) {
165
167
  return (t, a = {}) => {
166
168
  const r = e, n = q({}, r.query ?? {}, a.query ?? {});
167
- return H(t, {
169
+ return F(t, {
168
170
  ...r,
169
171
  ...a,
170
172
  headers: E(r.headers, a.headers),
@@ -172,7 +174,7 @@ function X(e = {}) {
172
174
  });
173
175
  };
174
176
  }
175
- var Y = (e, t) => {
177
+ var Z = (e, t) => {
176
178
  const a = R(e);
177
179
  return {
178
180
  get value() {
@@ -185,7 +187,7 @@ var Y = (e, t) => {
185
187
  return a.peek();
186
188
  }
187
189
  };
188
- }, Z = (e, t) => {
190
+ }, ee = (e, t) => {
189
191
  let a = !1, r = null;
190
192
  try {
191
193
  if (r = globalThis.localStorage, r) {
@@ -215,14 +217,14 @@ var Y = (e, t) => {
215
217
  } catch {
216
218
  }
217
219
  }), s;
218
- }, ee = (e) => ({
220
+ }, te = (e) => ({
219
221
  get value() {
220
222
  return e.value;
221
223
  },
222
224
  peek() {
223
225
  return e.peek();
224
226
  }
225
- }), te = (e) => e instanceof x, re = (e) => e instanceof k, ae = (e, t, a = {}) => {
227
+ }), re = (e) => e instanceof x, ae = (e) => e instanceof k, se = (e, t, a = {}) => {
226
228
  const { immediate: r = !1, equals: n = Object.is } = a;
227
229
  let s, i = !0;
228
230
  return g(() => {
@@ -235,19 +237,18 @@ var Y = (e, t) => {
235
237
  });
236
238
  };
237
239
  export {
238
- Z as a,
239
- F as c,
240
- k as d,
241
- R as f,
242
- ee as i,
243
- H as l,
244
- re as n,
245
- Y as o,
246
- K as p,
247
- te as r,
248
- X as s,
249
- ae as t,
250
- p as u
240
+ ee as a,
241
+ N as c,
242
+ R as d,
243
+ X as f,
244
+ te as i,
245
+ F as l,
246
+ ae as n,
247
+ Z as o,
248
+ re as r,
249
+ Y as s,
250
+ se as t,
251
+ k as u
251
252
  };
252
253
 
253
- //# sourceMappingURL=reactive-BDya-ia8.js.map
254
+ //# sourceMappingURL=reactive-DSkct0dO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive-DSkct0dO.js","names":[],"sources":["../src/reactive/batch.ts","../src/reactive/computed.ts","../src/reactive/async-data.ts","../src/reactive/linked.ts","../src/reactive/persisted.ts","../src/reactive/readonly.ts","../src/reactive/type-guards.ts","../src/reactive/watch.ts"],"sourcesContent":["/**\n * Batched reactive updates.\n */\n\nimport { beginBatch, endBatch } from './internals';\n\n/**\n * Batches multiple signal updates into a single notification cycle.\n *\n * Updates made inside the batch function are deferred until the batch\n * completes, preventing intermediate re-renders and improving performance.\n *\n * @param fn - Function containing multiple signal updates\n */\nexport const batch = (fn: () => void): void => {\n beginBatch();\n try {\n fn();\n } finally {\n endBatch();\n }\n};\n","/**\n * Computed reactive values.\n */\n\nimport {\n clearDependencies,\n getCurrentObserver,\n registerDependency,\n scheduleObserver,\n track,\n type ReactiveSource,\n} from './internals';\n\n/**\n * A computed value that derives from other reactive sources.\n *\n * Computed values are lazily evaluated and cached. They only\n * recompute when their dependencies change.\n *\n * @template T - The type of the computed value\n */\nexport class Computed<T> implements ReactiveSource {\n private cachedValue!: T;\n private dirty = true;\n private subscribers = new Set<() => void>();\n private readonly markDirty = () => {\n this.dirty = true;\n // Create snapshot to avoid issues with subscribers modifying the set during iteration\n const subscribersSnapshot = Array.from(this.subscribers);\n for (const subscriber of subscribersSnapshot) {\n scheduleObserver(subscriber);\n }\n };\n\n /**\n * Creates a new computed value.\n * @param compute - Function that computes the value\n */\n constructor(private readonly compute: () => T) {}\n\n /**\n * Gets the computed value, recomputing if dependencies changed.\n * During untrack calls, getCurrentObserver returns undefined, preventing dependency tracking.\n */\n get value(): T {\n const current = getCurrentObserver();\n if (current) {\n this.subscribers.add(current);\n registerDependency(current, this);\n }\n if (this.dirty) {\n this.dirty = false;\n // Clear old dependencies before recomputing\n clearDependencies(this.markDirty);\n this.cachedValue = track(this.markDirty, this.compute);\n }\n return this.cachedValue;\n }\n\n /**\n * Reads the current computed value without tracking.\n * Useful when you need the value but don't want to create a dependency.\n *\n * @returns The current cached value (recomputes if dirty)\n */\n peek(): T {\n if (this.dirty) {\n this.dirty = false;\n // Clear old dependencies before recomputing\n clearDependencies(this.markDirty);\n this.cachedValue = track(this.markDirty, this.compute);\n }\n return this.cachedValue;\n }\n\n /**\n * Removes an observer from this computed's subscriber set.\n * @internal\n */\n unsubscribe(observer: () => void): void {\n this.subscribers.delete(observer);\n }\n}\n\n/**\n * Creates a new computed value.\n *\n * @template T - The type of the computed value\n * @param fn - Function that computes the value from reactive sources\n * @returns A new Computed instance\n */\nexport const computed = <T>(fn: () => T): Computed<T> => new Computed(fn);\n","/**\n * Async data and fetch composables built on bQuery signals.\n *\n * @module bquery/reactive\n */\n\nimport { merge } from '../core/utils/object';\nimport { getBqueryConfig, type BqueryFetchParseAs } from '../platform/config';\nimport { computed } from './computed';\nimport { effect } from './effect';\nimport { Signal, signal } from './core';\nimport { untrack } from './untrack';\n\n/** Allowed status values for async composables. */\nexport type AsyncDataStatus = 'idle' | 'pending' | 'success' | 'error';\n\n/** Reactive source types that can trigger refreshes. */\nexport type AsyncWatchSource = (() => unknown) | { value: unknown };\n\n/** Options shared by async composables. */\nexport interface UseAsyncDataOptions<TResult, TData = TResult> {\n /** Run the handler immediately (default: true). */\n immediate?: boolean;\n /** Default data value before the first successful execution. */\n defaultValue?: TData;\n /** Optional reactive sources that trigger refreshes when they change. */\n watch?: AsyncWatchSource[];\n /** Transform the resolved value before storing it. */\n transform?: (value: TResult) => TData;\n /** Called after a successful execution. */\n onSuccess?: (value: TData) => void;\n /** Called after a failed execution. */\n onError?: (error: Error) => void;\n}\n\n/** Return value of useAsyncData() and useFetch(). */\nexport interface AsyncDataState<TData> {\n /** Reactive data signal. */\n data: Signal<TData | undefined>;\n /** Last error encountered by the composable. */\n error: Signal<Error | null>;\n /** Current lifecycle status. */\n status: Signal<AsyncDataStatus>;\n /** Computed boolean that mirrors `status === 'pending'`. */\n pending: { readonly value: boolean; peek(): boolean };\n /** Execute the handler manually. Returns the cached data value when called after dispose(). */\n execute: () => Promise<TData | undefined>;\n /** Alias for execute(). */\n refresh: () => Promise<TData | undefined>;\n /** Clear data, error, and status back to the initial state. */\n clear: () => void;\n /** Dispose reactive watchers and prevent future executions. */\n dispose: () => void;\n}\n\n/** Options for useFetch(). */\nexport interface UseFetchOptions<TResponse = unknown, TData = TResponse>\n extends UseAsyncDataOptions<TResponse, TData>, Omit<RequestInit, 'body' | 'headers'> {\n /** Base URL prepended to relative URLs. */\n baseUrl?: string;\n /** Query parameters appended to the request URL. */\n query?: Record<string, unknown>;\n /** Request headers. */\n headers?: HeadersInit;\n /** Request body, including plain objects for JSON requests. */\n body?: BodyInit | Record<string, unknown> | unknown[] | null;\n /** Override the parser used for the response body. */\n parseAs?: BqueryFetchParseAs;\n /** Custom fetch implementation for testing or adapters. */\n fetcher?: typeof fetch;\n}\n\n/** Input accepted by useFetch(). */\nexport type FetchInput = string | URL | Request | (() => string | URL | Request);\n\nconst normalizeError = (error: unknown): Error => {\n if (error instanceof Error) return error;\n if (typeof error === 'string') {\n return new Error(error);\n }\n\n try {\n return new Error(JSON.stringify(error));\n } catch {\n return new Error(String(error));\n }\n};\n\nconst readWatchSource = (source: AsyncWatchSource): unknown => {\n if (typeof source === 'function') {\n return source();\n }\n return source.value;\n};\n\nconst toHeaders = (...sources: Array<HeadersInit | undefined>): Headers => {\n const headers = new Headers();\n for (const source of sources) {\n if (!source) continue;\n new Headers(source).forEach((value, key) => {\n headers.set(key, value);\n });\n }\n return headers;\n};\n\nconst isBodyLike = (value: unknown): value is BodyInit => {\n if (typeof value === 'string') return true;\n if (value instanceof Blob || value instanceof FormData || value instanceof URLSearchParams) {\n return true;\n }\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) return true;\n if (typeof ReadableStream !== 'undefined' && value instanceof ReadableStream) return true;\n return typeof value === 'object' && value !== null && ArrayBuffer.isView(value);\n};\n\nconst serializeBody = (\n body: UseFetchOptions['body'],\n headers: Headers\n): BodyInit | null | undefined => {\n if (body == null) return body;\n if (isBodyLike(body)) return body;\n\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n\n return JSON.stringify(body);\n};\n\nconst resolveInput = (input: FetchInput): string | URL | Request => {\n return typeof input === 'function' ? input() : input;\n};\n\nconst appendQuery = (url: URL, query: Record<string, unknown>): void => {\n for (const [key, value] of Object.entries(query)) {\n if (value == null) continue;\n\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item != null) {\n url.searchParams.append(key, String(item));\n }\n }\n continue;\n }\n\n url.searchParams.set(key, String(value));\n }\n};\n\nconst toUrl = (input: string | URL, baseUrl?: string): URL => {\n const runtimeBase =\n typeof window !== 'undefined' && /^https?:/i.test(window.location.href)\n ? window.location.href\n : 'http://localhost';\n const base = baseUrl ? new URL(baseUrl, runtimeBase).toString() : runtimeBase;\n return input instanceof URL ? new URL(input.toString(), base) : new URL(input, base);\n};\n\nconst parseResponse = async <TResponse>(\n response: Response,\n parseAs: BqueryFetchParseAs\n): Promise<TResponse> => {\n if (parseAs === 'response') return response as TResponse;\n if (parseAs === 'text') return (await response.text()) as TResponse;\n if (parseAs === 'blob') return (await response.blob()) as TResponse;\n if (parseAs === 'arrayBuffer') return (await response.arrayBuffer()) as TResponse;\n if (parseAs === 'formData') return (await response.formData()) as TResponse;\n\n const text = await response.text();\n if (!text) {\n return undefined as TResponse;\n }\n\n try {\n return JSON.parse(text) as TResponse;\n } catch (error) {\n const detail = response.url ? ` for ${response.url}` : '';\n throw new Error(\n `Failed to parse JSON response${detail} (status ${response.status}): ${error instanceof Error ? error.message : String(error)}`\n );\n }\n};\n\nconst normalizeMethod = (method?: string): string | undefined => {\n const normalized = method?.trim();\n return normalized ? normalized.toUpperCase() : undefined;\n};\n\nconst resolveMethod = (\n explicitMethod: string | undefined,\n requestInput: string | URL | Request,\n bodyProvided: boolean\n): string | undefined => {\n const requestMethod =\n requestInput instanceof Request ? normalizeMethod(requestInput.method) : undefined;\n return explicitMethod ?? requestMethod ?? (bodyProvided ? 'POST' : undefined);\n};\n\nconst resolveRequestInitMethod = (\n explicitMethod: string | undefined,\n requestInput: string | URL | Request,\n method: string | undefined\n): string | undefined => {\n if (explicitMethod) return explicitMethod;\n return requestInput instanceof Request ? undefined : method;\n};\n\nconst toRequestInit = (request: Request): RequestInit => {\n const requestMethod = normalizeMethod(request.method);\n let body: BodyInit | undefined;\n if (requestMethod !== 'GET' && requestMethod !== 'HEAD' && !request.bodyUsed) {\n try {\n body = request.clone().body ?? undefined;\n } catch {\n body = undefined;\n }\n }\n\n return {\n method: requestMethod,\n headers: request.headers,\n body,\n cache: request.cache,\n credentials: request.credentials,\n integrity: request.integrity,\n keepalive: request.keepalive,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n signal: request.signal,\n };\n};\n\n/**\n * Create a reactive wrapper around an async resolver.\n *\n * @template TResult - Raw result type returned by the handler\n * @template TData - Stored data type after optional transformation\n * @param handler - Async function to execute\n * @param options - Execution, transform, and refresh options\n * @returns Reactive data state with execute(), refresh(), and clear()\n *\n * @example\n * ```ts\n * const user = useAsyncData(() => fetch('/api/user').then((res) => res.json()));\n * ```\n */\nexport const useAsyncData = <TResult, TData = TResult>(\n handler: () => Promise<TResult>,\n options: UseAsyncDataOptions<TResult, TData> = {}\n): AsyncDataState<TData> => {\n const immediate = options.immediate ?? true;\n const data = signal<TData | undefined>(options.defaultValue);\n const error = signal<Error | null>(null);\n const status = signal<AsyncDataStatus>('idle');\n const pending = computed(() => status.value === 'pending');\n let executionId = 0;\n let disposed = false;\n let stopWatching = (): void => {};\n\n const clear = (): void => {\n executionId += 1;\n data.value = options.defaultValue;\n error.value = null;\n status.value = 'idle';\n };\n\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n executionId += 1;\n stopWatching();\n };\n\n const execute = async (): Promise<TData | undefined> => {\n if (disposed) {\n return data.peek();\n }\n\n const currentExecution = ++executionId;\n status.value = 'pending';\n error.value = null;\n\n try {\n const resolved = await handler();\n const transformed = options.transform\n ? options.transform(resolved)\n : (resolved as unknown as TData);\n\n if (disposed || currentExecution !== executionId) {\n return data.peek();\n }\n\n data.value = transformed;\n status.value = 'success';\n options.onSuccess?.(transformed);\n return transformed;\n } catch (caught) {\n const normalizedError = normalizeError(caught);\n\n if (disposed || currentExecution !== executionId) {\n return data.peek();\n }\n\n error.value = normalizedError;\n status.value = 'error';\n options.onError?.(normalizedError);\n return data.peek();\n }\n };\n\n if (options.watch?.length) {\n let initialized = false;\n stopWatching = effect(() => {\n for (const source of options.watch ?? []) {\n readWatchSource(source);\n }\n\n if (!initialized) {\n initialized = true;\n if (immediate) {\n void untrack(() => execute());\n }\n return;\n }\n\n void untrack(() => execute());\n });\n } else if (immediate) {\n void execute();\n }\n\n return {\n data,\n error,\n status,\n pending,\n execute,\n refresh: execute,\n clear,\n dispose,\n };\n};\n\n/**\n * Reactive fetch composable using the browser Fetch API.\n *\n * @template TResponse - Raw parsed response type\n * @template TData - Stored response type after optional transformation\n * @param input - Request URL, Request object, or lazy input factory\n * @param options - Request and reactive state options\n * @returns Reactive fetch state with execute(), refresh(), and clear()\n *\n * @example\n * ```ts\n * const users = useFetch<{ id: number; name: string }[]>('/api/users');\n * ```\n */\nexport const useFetch = <TResponse = unknown, TData = TResponse>(\n input: FetchInput,\n options: UseFetchOptions<TResponse, TData> = {}\n): AsyncDataState<TData> => {\n const fetchConfig = getBqueryConfig().fetch;\n const parseAs = options.parseAs ?? fetchConfig?.parseAs ?? 'json';\n const fetcher = options.fetcher ?? fetch;\n\n return useAsyncData<TResponse, TData>(async () => {\n const requestInput = resolveInput(input);\n const requestUrl =\n typeof requestInput === 'string' || requestInput instanceof URL\n ? toUrl(requestInput, options.baseUrl ?? fetchConfig?.baseUrl)\n : requestInput instanceof Request && options.query\n ? new URL(requestInput.url)\n : null;\n\n if (requestUrl && options.query) {\n appendQuery(requestUrl, options.query);\n }\n\n const headers = toHeaders(\n fetchConfig?.headers,\n requestInput instanceof Request ? requestInput.headers : undefined,\n options.headers\n );\n const bodyProvided = options.body != null;\n const explicitMethod = normalizeMethod(options.method);\n const method = resolveMethod(explicitMethod, requestInput, bodyProvided);\n const bodylessMethod = method === 'GET' || method === 'HEAD' ? method : null;\n if (bodyProvided && bodylessMethod) {\n throw new Error(`Cannot send a request body with ${bodylessMethod} requests`);\n }\n const requestInitMethod = resolveRequestInitMethod(explicitMethod, requestInput, method);\n const requestInit: RequestInit = {\n ...options,\n method: requestInitMethod,\n headers,\n body: serializeBody(options.body, headers),\n };\n\n delete (requestInit as Partial<UseFetchOptions>).baseUrl;\n delete (requestInit as Partial<UseFetchOptions>).query;\n delete (requestInit as Partial<UseFetchOptions>).parseAs;\n delete (requestInit as Partial<UseFetchOptions>).fetcher;\n delete (requestInit as Partial<UseFetchOptions>).defaultValue;\n delete (requestInit as Partial<UseFetchOptions>).immediate;\n delete (requestInit as Partial<UseFetchOptions>).watch;\n delete (requestInit as Partial<UseFetchOptions>).transform;\n delete (requestInit as Partial<UseFetchOptions>).onSuccess;\n delete (requestInit as Partial<UseFetchOptions>).onError;\n\n let requestTarget: Request | string | URL = requestUrl ?? requestInput;\n if (\n requestInput instanceof Request &&\n requestUrl &&\n requestUrl.toString() !== requestInput.url\n ) {\n // Rebuild Request inputs when query params changed so the updated URL is preserved.\n // String/URL inputs already use `requestUrl` directly, so only Request objects need rebuilding.\n requestTarget = new Request(requestUrl.toString(), toRequestInit(requestInput));\n }\n const response = await fetcher(requestTarget, requestInit);\n\n if (!response.ok) {\n throw Object.assign(new Error(`Request failed with status ${response.status}`), {\n response,\n status: response.status,\n statusText: response.statusText,\n });\n }\n\n return parseResponse<TResponse>(response, parseAs);\n }, options);\n};\n\n/**\n * Create a preconfigured useFetch() helper.\n *\n * @param defaults - Default request options merged into every useFetch() call\n * @returns A useFetch-compatible function with merged defaults\n *\n * @example\n * ```ts\n * const useApiFetch = createUseFetch({ baseUrl: 'https://api.example.com' });\n * const profile = useApiFetch('/profile');\n * ```\n */\n/** Overload for factories without a configured transform, preserving per-call `TResponse -> TData` inference. */\nexport function createUseFetch<TDefaultResponse = unknown>(\n defaults?: UseFetchOptions<TDefaultResponse, TDefaultResponse>\n): <TResponse = TDefaultResponse, TData = TResponse>(\n input: FetchInput,\n options?: UseFetchOptions<TResponse, TData>\n) => AsyncDataState<TData>;\n\n/** Overload for factories with a configured transform, preserving the transformed factory data type by default. */\nexport function createUseFetch<TDefaultResponse = unknown, TDefaultData = TDefaultResponse>(\n defaults: UseFetchOptions<TDefaultResponse, TDefaultData>\n): <TResponse = TDefaultResponse, TData = TDefaultData>(\n input: FetchInput,\n options?: UseFetchOptions<TResponse, TData>\n) => AsyncDataState<TData>;\n\nexport function createUseFetch<TDefaultResponse = unknown, TDefaultData = TDefaultResponse>(\n defaults: UseFetchOptions<TDefaultResponse, TDefaultData> = {}\n) {\n return <TResponse = TDefaultResponse, TData = TDefaultData>(\n input: FetchInput,\n options: UseFetchOptions<TResponse, TData> = {}\n ): AsyncDataState<TData> => {\n const resolvedDefaults = defaults as unknown as UseFetchOptions<TResponse, TData>;\n const mergedQuery = merge({}, resolvedDefaults.query ?? {}, options.query ?? {}) as Record<\n string,\n unknown\n >;\n\n return useFetch<TResponse, TData>(input, {\n ...resolvedDefaults,\n ...options,\n headers: toHeaders(resolvedDefaults.headers, options.headers),\n query: Object.keys(mergedQuery).length > 0 ? mergedQuery : undefined,\n });\n };\n}\n","/**\n * Linked (writable) computed helpers.\n */\n\nimport { computed, Computed } from './computed';\n\n/**\n * A writable computed-like signal.\n */\nexport interface LinkedSignal<T> {\n /** Gets or sets the current value with dependency tracking. */\n value: T;\n /** Gets the current value without dependency tracking. */\n peek(): T;\n}\n\n/**\n * Creates a writable computed signal by linking a getter and setter.\n *\n * @template T - The derived value type\n * @param getValue - Getter that derives the current value\n * @param setValue - Setter that writes back to underlying signals\n * @returns A writable computed-like signal\n *\n * @example\n * ```ts\n * const first = signal('Ada');\n * const last = signal('Lovelace');\n * const fullName = linkedSignal(\n * () => `${first.value} ${last.value}`,\n * (next) => {\n * const [a, b] = next.split(' ');\n * first.value = a ?? '';\n * last.value = b ?? '';\n * }\n * );\n * ```\n */\nexport const linkedSignal = <T>(\n getValue: () => T,\n setValue: (value: T) => void\n): LinkedSignal<T> => {\n const derived: Computed<T> = computed(getValue);\n\n return {\n get value(): T {\n return derived.value;\n },\n set value(next: T) {\n setValue(next);\n },\n peek(): T {\n return derived.peek();\n },\n };\n};\n","/**\n * LocalStorage-backed signals.\n */\n\nimport { signal, Signal } from './core';\nimport { effect } from './effect';\n\n/**\n * Creates a signal that persists to localStorage.\n *\n * @template T - The type of the signal value\n * @param key - The localStorage key\n * @param initialValue - The initial value if not found in storage\n * @returns A Signal that syncs with localStorage (falls back to in-memory if unavailable)\n */\nexport const persistedSignal = <T>(key: string, initialValue: T): Signal<T> => {\n // Check if localStorage is available and accessible\n let hasLocalStorage = false;\n let storage: Storage | null = null;\n\n try {\n // In Safari private mode, accessing localStorage can throw SecurityError\n storage = globalThis.localStorage;\n if (storage) {\n // Test actual access to ensure it's not just present but usable\n // Use a randomized test key to avoid overwriting real user data\n const testKey = `__bquery_test_${Math.random().toString(36).slice(2, 9)}__`;\n const testValue = '__test__';\n try {\n storage.setItem(testKey, testValue);\n storage.getItem(testKey);\n hasLocalStorage = true;\n } finally {\n // Ensure we don't leave any test data behind\n try {\n storage.removeItem(testKey);\n } catch {\n // Ignore cleanup errors (e.g., storage becoming unavailable)\n }\n }\n }\n } catch {\n // localStorage unavailable or access denied (Safari private mode, sandboxed iframes, etc.)\n hasLocalStorage = false;\n }\n\n let stored: T = initialValue;\n\n if (hasLocalStorage && storage) {\n try {\n const raw = storage.getItem(key);\n if (raw !== null) {\n stored = JSON.parse(raw) as T;\n }\n } catch {\n // Use initial value on parse error or access denial\n }\n }\n\n const sig = signal(stored);\n\n // Only set up persistence effect if localStorage is available\n if (hasLocalStorage && storage) {\n effect(() => {\n try {\n storage!.setItem(key, JSON.stringify(sig.value));\n } catch {\n // Ignore storage errors (quota exceeded, sandboxed iframes, etc.)\n }\n });\n }\n\n return sig;\n};\n","/**\n * Read-only signal wrappers.\n */\n\nimport type { Signal } from './core';\n\n/**\n * A readonly wrapper around a signal that prevents writes.\n * Provides read-only access to a signal's value while maintaining reactivity.\n *\n * @template T - The type of the wrapped value\n */\nexport interface ReadonlySignal<T> {\n /** Gets the current value with dependency tracking. */\n readonly value: T;\n /** Gets the current value without dependency tracking. */\n peek(): T;\n}\n\n/**\n * Creates a read-only view of a signal.\n * Useful for exposing reactive state without allowing modifications.\n *\n * @template T - The type of the signal value\n * @param sig - The signal to wrap\n * @returns A readonly signal wrapper\n */\nexport const readonly = <T>(sig: Signal<T>): ReadonlySignal<T> => ({\n get value(): T {\n return sig.value;\n },\n peek(): T {\n return sig.peek();\n },\n});\n","/**\n * Type guards for reactive primitives.\n */\n\nimport { Computed } from './computed';\nimport { Signal } from './core';\n\n/**\n * Type guard to check if a value is a Signal instance.\n *\n * @param value - The value to check\n * @returns True if the value is a Signal\n */\nexport const isSignal = (value: unknown): value is Signal<unknown> => value instanceof Signal;\n\n/**\n * Type guard to check if a value is a Computed instance.\n *\n * @param value - The value to check\n * @returns True if the value is a Computed\n */\nexport const isComputed = (value: unknown): value is Computed<unknown> => value instanceof Computed;\n","/**\n * Value watching helpers.\n */\n\nimport type { Computed } from './computed';\nimport type { Signal } from './core';\nimport type { CleanupFn } from './internals';\n\nimport { effect } from './effect';\n\n/**\n * Options for the watch function.\n */\nexport interface WatchOptions<T> {\n /** If true, the callback is invoked immediately with the current value. */\n immediate?: boolean;\n /** Custom equality function. Defaults to Object.is. */\n equals?: (a: T, b: T | undefined) => boolean;\n}\n\n/**\n * Watches a signal or computed value and calls a callback with old and new values.\n * Unlike effect, watch provides access to the previous value.\n * The callback is only invoked when the value actually changes (compared via Object.is or custom equals).\n *\n * @template T - The type of the watched value\n * @param source - The signal or computed to watch\n * @param callback - Function called with (newValue, oldValue) on changes\n * @param options - Watch options\n * @returns A cleanup function to stop watching\n *\n * @example\n * ```ts\n * const count = signal(0);\n * watch(count, (newVal, oldVal) => {\n * console.log(`Changed from ${oldVal} to ${newVal}`);\n * });\n *\n * // With custom equality for objects\n * const user = signal({ id: 1, name: 'Alice' });\n * watch(user, (newVal, oldVal) => { ... }, {\n * equals: (a, b) => a?.id === b?.id\n * });\n * ```\n */\nexport const watch = <T>(\n source: Signal<T> | Computed<T>,\n callback: (newValue: T, oldValue: T | undefined) => void,\n options: WatchOptions<T> = {}\n): CleanupFn => {\n const { immediate = false, equals = Object.is } = options;\n let oldValue: T | undefined;\n let isFirst = true;\n\n return effect(() => {\n const newValue = source.value;\n\n if (isFirst) {\n isFirst = false;\n oldValue = newValue;\n if (immediate) {\n callback(newValue, undefined);\n }\n return;\n }\n\n // Only call callback if value actually changed\n if (!equals(newValue, oldValue)) {\n callback(newValue, oldValue);\n oldValue = newValue;\n }\n });\n};\n"],"mappings":"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"}
@@ -1,20 +1,22 @@
1
- import { n as s, r as e, t } from "./core-DPdbItcq.js";
2
- import { a as n, c as r, d as c, f as o, i as l, l as p, n as d, o as m, p as u, r as f, s as g, t as h, u as S } from "./reactive-BDya-ia8.js";
1
+ import { t as s } from "./effect-AFRW_Plg.js";
2
+ import { a as e, c as i, d as o, f as r, i as m, l as n, n as c, o as p, r as l, s as d, t as f, u } from "./reactive-DSkct0dO.js";
3
+ import { n as h, t as S } from "./core-BGQJVw0-.js";
4
+ import { t as y } from "./untrack-B0rVscTc.js";
3
5
  export {
4
- c as Computed,
5
- t as Signal,
6
- u as batch,
6
+ u as Computed,
7
+ S as Signal,
8
+ r as batch,
7
9
  o as computed,
8
- g as createUseFetch,
9
- e as effect,
10
- d as isComputed,
11
- f as isSignal,
12
- m as linkedSignal,
13
- n as persistedSignal,
14
- l as readonly,
15
- s as signal,
16
- S as untrack,
17
- r as useAsyncData,
18
- p as useFetch,
19
- h as watch
10
+ d as createUseFetch,
11
+ s as effect,
12
+ c as isComputed,
13
+ l as isSignal,
14
+ p as linkedSignal,
15
+ e as persistedSignal,
16
+ m as readonly,
17
+ h as signal,
18
+ y as untrack,
19
+ i as useAsyncData,
20
+ n as useFetch,
21
+ f as watch
20
22
  };
@@ -1,5 +1,5 @@
1
- import { n as D } from "./core-DPdbItcq.js";
2
- import { f as W } from "./reactive-BDya-ia8.js";
1
+ import { d as W } from "./reactive-DSkct0dO.js";
2
+ import { n as D } from "./core-BGQJVw0-.js";
3
3
  var N = null, d = D({
4
4
  path: "",
5
5
  params: {},
@@ -185,4 +185,4 @@ export {
185
185
  K as u
186
186
  };
187
187
 
188
- //# sourceMappingURL=router-CijiICxt.js.map
188
+ //# sourceMappingURL=router-CbDhl8rS.js.map