@bquery/bquery 1.3.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 (71) hide show
  1. package/README.md +527 -501
  2. package/dist/{batch-4LAvfLE7.js → batch-x7b2eZST.js} +2 -2
  3. package/dist/{batch-4LAvfLE7.js.map → batch-x7b2eZST.js.map} +1 -1
  4. package/dist/component.es.mjs +1 -1
  5. package/dist/core/collection.d.ts +19 -3
  6. package/dist/core/collection.d.ts.map +1 -1
  7. package/dist/core/element.d.ts +23 -4
  8. package/dist/core/element.d.ts.map +1 -1
  9. package/dist/core/index.d.ts +1 -0
  10. package/dist/core/index.d.ts.map +1 -1
  11. package/dist/core/utils/function.d.ts +21 -4
  12. package/dist/core/utils/function.d.ts.map +1 -1
  13. package/dist/{core-COenAZjD.js → core-BhpuvPhy.js} +62 -37
  14. package/dist/core-BhpuvPhy.js.map +1 -0
  15. package/dist/core.es.mjs +174 -131
  16. package/dist/core.es.mjs.map +1 -1
  17. package/dist/full.es.mjs +7 -7
  18. package/dist/full.iife.js +2 -2
  19. package/dist/full.iife.js.map +1 -1
  20. package/dist/full.umd.js +2 -2
  21. package/dist/full.umd.js.map +1 -1
  22. package/dist/index.es.mjs +7 -7
  23. package/dist/motion.es.mjs.map +1 -1
  24. package/dist/{persisted-Dz_ryNuC.js → persisted-DHoi3uEs.js} +4 -4
  25. package/dist/{persisted-Dz_ryNuC.js.map → persisted-DHoi3uEs.js.map} +1 -1
  26. package/dist/platform/storage.d.ts.map +1 -1
  27. package/dist/platform.es.mjs +12 -7
  28. package/dist/platform.es.mjs.map +1 -1
  29. package/dist/reactive/core.d.ts +12 -0
  30. package/dist/reactive/core.d.ts.map +1 -1
  31. package/dist/reactive/effect.d.ts.map +1 -1
  32. package/dist/reactive/internals.d.ts +6 -0
  33. package/dist/reactive/internals.d.ts.map +1 -1
  34. package/dist/reactive.es.mjs +6 -6
  35. package/dist/router.es.mjs +1 -1
  36. package/dist/{sanitize-1FBEPAFH.js → sanitize-Cxvxa-DX.js} +50 -39
  37. package/dist/sanitize-Cxvxa-DX.js.map +1 -0
  38. package/dist/security/sanitize-core.d.ts.map +1 -1
  39. package/dist/security.es.mjs +2 -2
  40. package/dist/store.es.mjs +2 -2
  41. package/dist/type-guards-BdKlYYlS.js +32 -0
  42. package/dist/type-guards-BdKlYYlS.js.map +1 -0
  43. package/dist/untrack-DNnnqdlR.js +6 -0
  44. package/dist/{untrack-BuEQKH7_.js.map → untrack-DNnnqdlR.js.map} +1 -1
  45. package/dist/view/evaluate.d.ts.map +1 -1
  46. package/dist/view.es.mjs +157 -151
  47. package/dist/view.es.mjs.map +1 -1
  48. package/dist/{watch-CXyaBC_9.js → watch-DXXv3iAI.js} +3 -3
  49. package/dist/{watch-CXyaBC_9.js.map → watch-DXXv3iAI.js.map} +1 -1
  50. package/package.json +132 -132
  51. package/src/core/collection.ts +628 -588
  52. package/src/core/element.ts +774 -746
  53. package/src/core/index.ts +48 -47
  54. package/src/core/utils/function.ts +151 -110
  55. package/src/motion/animate.ts +113 -113
  56. package/src/motion/flip.ts +176 -176
  57. package/src/motion/scroll.ts +57 -57
  58. package/src/motion/spring.ts +150 -150
  59. package/src/motion/timeline.ts +246 -246
  60. package/src/motion/transition.ts +51 -51
  61. package/src/platform/storage.ts +215 -208
  62. package/src/reactive/core.ts +114 -93
  63. package/src/reactive/effect.ts +54 -43
  64. package/src/reactive/internals.ts +122 -105
  65. package/src/security/sanitize-core.ts +364 -343
  66. package/src/view/evaluate.ts +290 -274
  67. package/dist/core-COenAZjD.js.map +0 -1
  68. package/dist/sanitize-1FBEPAFH.js.map +0 -1
  69. package/dist/type-guards-DRma3-Kc.js +0 -16
  70. package/dist/type-guards-DRma3-Kc.js.map +0 -1
  71. package/dist/untrack-BuEQKH7_.js +0 -6
package/dist/index.es.mjs CHANGED
@@ -1,17 +1,17 @@
1
1
  import { $ as s, $$ as a, BQueryCollection as r, BQueryElement as o, capitalize as i, chunk as n, clamp as c, clone as p, compact as m, debounce as l, ensureArray as u, escapeRegExp as f, flatten as g, hasOwn as d, inRange as x, isArray as S, isBoolean as b, isCollection as C, isDate as y, isElement as h, isEmpty as k, isFunction as P, isNumber as O, isObject as E, isPlainObject as T, isPromise as A, isString as v, merge as w, noop as I, omit as Q, once as R, parseJson as B, pick as H, randomInt as z, sleep as N, slugify as $, throttle as j, toCamelCase as q, toKebabCase as D, toNumber as L, truncate as F, uid as G, unique as J, utils as K } from "./core.es.mjs";
2
- import { C as U, S as V, c as W, s as X } from "./core-COenAZjD.js";
3
- import { b as Z } from "./batch-4LAvfLE7.js";
4
- import { e as ee, i as te, a as se } from "./type-guards-DRma3-Kc.js";
2
+ import { C as U, S as V, c as W, s as X } from "./core-BhpuvPhy.js";
3
+ import { b as Z } from "./batch-x7b2eZST.js";
4
+ import { e as ee, i as te, a as se } from "./type-guards-BdKlYYlS.js";
5
5
  import { linkedSignal as re } from "./reactive.es.mjs";
6
- import { p as ie, r as ne, w as ce } from "./watch-CXyaBC_9.js";
7
- import { u as me } from "./untrack-BuEQKH7_.js";
6
+ import { p as ie, r as ne, w as ce } from "./watch-DXXv3iAI.js";
7
+ import { u as me } from "./untrack-DNnnqdlR.js";
8
8
  import { component as ue, defineComponent as fe, html as ge, safeHtml as de } from "./component.es.mjs";
9
9
  import { animate as Se, capturePosition as be, easeInCubic as Ce, easeInOutCubic as ye, easeInOutQuad as he, easeInQuad as ke, easeOutBack as Pe, easeOutCubic as Oe, easeOutExpo as Ee, easeOutQuad as Te, easingPresets as Ae, flip as ve, flipElements as we, flipList as Ie, keyframePresets as Qe, linear as Re, prefersReducedMotion as Be, scrollAnimate as He, sequence as ze, spring as Ne, springPresets as $e, stagger as je, timeline as qe, transition as De } from "./motion.es.mjs";
10
10
  import { createTrustedHtml as Fe, generateNonce as Ge, getTrustedTypesPolicy as Je, hasCSPDirective as Ke, isTrustedTypesSupported as Me } from "./security.es.mjs";
11
- import { e as Ve, s as We, s as Xe, a as Ye } from "./sanitize-1FBEPAFH.js";
11
+ import { e as Ve, s as We, s as Xe, a as Ye } from "./sanitize-Cxvxa-DX.js";
12
12
  import { buckets as _e, cache as et, notifications as tt, storage as st } from "./platform.es.mjs";
13
13
  import { back as rt, createRouter as ot, currentRoute as it, forward as nt, interceptLinks as ct, isActive as pt, isActiveSignal as mt, link as lt, navigate as ut, resolve as ft } from "./router.es.mjs";
14
- import { c as dt, a as xt, d as St, g as bt, l as Ct, m as yt, e as ht, b as kt, r as Pt } from "./persisted-Dz_ryNuC.js";
14
+ import { c as dt, a as xt, d as St, g as bt, l as Ct, m as yt, e as ht, b as kt, r as Pt } from "./persisted-DHoi3uEs.js";
15
15
  import { defineStore as Et, watchStore as Tt } from "./store.es.mjs";
16
16
  import { clearExpressionCache as vt, createTemplate as wt, mount as It } from "./view.es.mjs";
17
17
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"motion.es.mjs","sources":["../src/motion/reduced-motion.ts","../src/motion/animate.ts","../src/motion/easing.ts","../src/motion/flip.ts","../src/motion/keyframes.ts","../src/motion/scroll.ts","../src/motion/spring.ts","../src/motion/stagger.ts","../src/motion/timeline.ts","../src/motion/transition.ts"],"sourcesContent":["/**\n * Reduced motion detection helpers.\n *\n * @module bquery/motion\n */\n\n/**\n * Check whether the user prefers reduced motion.\n *\n * @returns true if the user prefers reduced motion, otherwise false\n */\nexport const prefersReducedMotion = (): boolean => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return false;\n }\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n};\n","/**\n * Web Animations helpers.\n *\n * @module bquery/motion\n */\n\nimport { prefersReducedMotion } from './reduced-motion';\nimport type { AnimateOptions } from './types';\n\n/** @internal */\nconst isStyleValue = (value: unknown): value is string | number =>\n typeof value === 'string' || typeof value === 'number';\n\n/**\n * Convert camelCase property names to kebab-case for CSS.\n * @internal\n */\nconst toKebabCase = (str: string): string => {\n return str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n};\n\n/** @internal */\nexport const applyFinalKeyframeStyles = (\n element: Element,\n keyframes: Keyframe[] | PropertyIndexedKeyframes\n): void => {\n const htmlElement = element as HTMLElement;\n const style = htmlElement.style;\n\n if (Array.isArray(keyframes)) {\n const last = keyframes[keyframes.length - 1];\n if (!last) return;\n for (const [prop, value] of Object.entries(last)) {\n if (prop === 'offset' || prop === 'easing' || prop === 'composite') continue;\n if (isStyleValue(value)) {\n // Convert camelCase to kebab-case for CSS properties\n const cssProp = prop.startsWith('--') ? prop : toKebabCase(prop);\n style.setProperty(cssProp, String(value));\n }\n }\n return;\n }\n\n for (const [prop, value] of Object.entries(keyframes)) {\n if (prop === 'offset' || prop === 'easing' || prop === 'composite') continue;\n const finalValue = Array.isArray(value) ? value[value.length - 1] : value;\n if (isStyleValue(finalValue)) {\n // Convert camelCase to kebab-case for CSS properties\n const cssProp = prop.startsWith('--') ? prop : toKebabCase(prop);\n style.setProperty(cssProp, String(finalValue));\n }\n }\n};\n\n/**\n * Animate an element using the Web Animations API with reduced-motion fallback.\n *\n * @param element - Element to animate\n * @param config - Animation configuration\n * @returns Promise that resolves when animation completes\n *\n * @example\n * ```ts\n * await animate(element, {\n * keyframes: [{ opacity: 0 }, { opacity: 1 }],\n * options: { duration: 200, easing: 'ease-out' },\n * });\n * ```\n */\nexport const animate = (element: Element, config: AnimateOptions): Promise<void> => {\n const { keyframes, options, commitStyles = true, respectReducedMotion = true, onFinish } = config;\n\n if (respectReducedMotion && prefersReducedMotion()) {\n if (commitStyles) {\n applyFinalKeyframeStyles(element, keyframes);\n }\n onFinish?.();\n return Promise.resolve();\n }\n\n const htmlElement = element as HTMLElement;\n if (typeof htmlElement.animate !== 'function') {\n if (commitStyles) {\n applyFinalKeyframeStyles(element, keyframes);\n }\n onFinish?.();\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n const animation = htmlElement.animate(keyframes, options);\n let finalized = false;\n const finalize = () => {\n if (finalized) return;\n finalized = true;\n if (commitStyles) {\n if (typeof animation.commitStyles === 'function') {\n animation.commitStyles();\n } else {\n applyFinalKeyframeStyles(element, keyframes);\n }\n }\n animation.cancel();\n onFinish?.();\n resolve();\n };\n\n animation.onfinish = finalize;\n if (animation.finished) {\n animation.finished.then(finalize).catch(finalize);\n }\n });\n};\n","/**\n * Easing helpers.\n *\n * @module bquery/motion\n */\n\nimport type { EasingFunction } from './types';\n\nconst clamp = (value: number) => Math.min(1, Math.max(0, value));\n\nexport const linear: EasingFunction = (t) => clamp(t);\nexport const easeInQuad: EasingFunction = (t) => clamp(t * t);\nexport const easeOutQuad: EasingFunction = (t) => clamp(1 - (1 - t) * (1 - t));\nexport const easeInOutQuad: EasingFunction = (t) =>\n clamp(t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2);\nexport const easeInCubic: EasingFunction = (t) => clamp(t * t * t);\nexport const easeOutCubic: EasingFunction = (t) => clamp(1 - Math.pow(1 - t, 3));\nexport const easeInOutCubic: EasingFunction = (t) =>\n clamp(t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2);\nexport const easeOutBack: EasingFunction = (t) => {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n return clamp(1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2));\n};\nexport const easeOutExpo: EasingFunction = (t) => clamp(t === 1 ? 1 : 1 - Math.pow(2, -10 * t));\n\n/**\n * Named easing presets.\n */\nexport const easingPresets = {\n linear,\n easeInQuad,\n easeOutQuad,\n easeInOutQuad,\n easeInCubic,\n easeOutCubic,\n easeInOutCubic,\n easeOutBack,\n easeOutExpo,\n};\n","/**\n * FLIP animation helpers.\n *\n * @module bquery/motion\n */\n\nimport type { ElementBounds, FlipGroupOptions, FlipOptions } from './types';\n\n/**\n * Capture the current bounds of an element for FLIP animation.\n *\n * @param element - The DOM element to measure\n * @returns The element's current position and size\n */\nexport const capturePosition = (element: Element): ElementBounds => {\n const rect = element.getBoundingClientRect();\n return {\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n };\n};\n\n/**\n * Perform a FLIP (First, Last, Invert, Play) animation.\n * Animates an element from its captured position to its current position.\n *\n * @param element - The element to animate\n * @param firstBounds - The previously captured bounds\n * @param options - Animation configuration\n * @returns Promise that resolves when animation completes\n *\n * @example\n * ```ts\n * const first = capturePosition(element);\n * // ... DOM changes that move the element ...\n * await flip(element, first, { duration: 300 });\n * ```\n */\nexport const flip = (\n element: Element,\n firstBounds: ElementBounds,\n options: FlipOptions = {}\n): Promise<void> => {\n const { duration = 300, easing = 'ease-out', onComplete } = options;\n\n // Last: Get current position\n const lastBounds = capturePosition(element);\n\n // Skip animation if element has zero dimensions (avoid division by zero)\n if (lastBounds.width === 0 || lastBounds.height === 0) {\n onComplete?.();\n return Promise.resolve();\n }\n\n // Invert: Calculate the delta\n const deltaX = firstBounds.left - lastBounds.left;\n const deltaY = firstBounds.top - lastBounds.top;\n const deltaW = firstBounds.width / lastBounds.width;\n const deltaH = firstBounds.height / lastBounds.height;\n\n // Skip animation if no change\n if (deltaX === 0 && deltaY === 0 && deltaW === 1 && deltaH === 1) {\n onComplete?.();\n return Promise.resolve();\n }\n\n const htmlElement = element as HTMLElement;\n\n // Feature check: fallback if Web Animations API is unavailable\n if (typeof htmlElement.animate !== 'function') {\n onComplete?.();\n return Promise.resolve();\n }\n\n // Apply inverted transform\n htmlElement.style.transform = `translate(${deltaX}px, ${deltaY}px) scale(${deltaW}, ${deltaH})`;\n htmlElement.style.transformOrigin = 'top left';\n\n // Force reflow\n void htmlElement.offsetHeight;\n\n // Play: Animate back to current position\n return new Promise((resolve) => {\n const animation = htmlElement.animate(\n [\n {\n transform: `translate(${deltaX}px, ${deltaY}px) scale(${deltaW}, ${deltaH})`,\n },\n { transform: 'translate(0, 0) scale(1, 1)' },\n ],\n { duration, easing, fill: 'forwards' }\n );\n\n let finalized = false;\n const finalize = () => {\n if (finalized) return;\n finalized = true;\n htmlElement.style.transform = '';\n htmlElement.style.transformOrigin = '';\n onComplete?.();\n resolve();\n };\n\n animation.onfinish = finalize;\n // Handle cancel/rejection via the finished promise\n if (animation.finished) {\n animation.finished.then(finalize).catch(finalize);\n }\n });\n};\n\n/**\n * FLIP helper for animating a list of elements.\n * Useful for reordering lists with smooth animations.\n *\n * @param elements - Array of elements to animate\n * @param performUpdate - Function that performs the DOM update\n * @param options - Animation configuration\n *\n * @example\n * ```ts\n * await flipList(listItems, () => {\n * container.appendChild(container.firstChild); // Move first to last\n * });\n * ```\n */\nexport const flipList = async (\n elements: Element[],\n performUpdate: () => void,\n options: FlipOptions = {}\n): Promise<void> => {\n await flipElements(elements, performUpdate, options);\n};\n\n/**\n * FLIP helper with optional stagger support.\n *\n * @param elements - Array of elements to animate\n * @param performUpdate - Function that performs the DOM update\n * @param options - Animation configuration\n */\nexport const flipElements = async (\n elements: Element[],\n performUpdate: () => void,\n options: FlipGroupOptions = {}\n): Promise<void> => {\n const { stagger, ...flipOptions } = options;\n\n // First: Capture all positions\n const positions = new Map<Element, ElementBounds>();\n for (const el of elements) {\n positions.set(el, capturePosition(el));\n }\n\n // Perform DOM update\n performUpdate();\n\n const total = elements.length;\n\n // Animate each element\n const animations = elements.map((el, index) => {\n const first = positions.get(el);\n if (!first) return Promise.resolve();\n const delay = stagger ? stagger(index, total) : 0;\n if (delay > 0) {\n return new Promise((resolve) => setTimeout(resolve, delay)).then(() =>\n flip(el, first, flipOptions)\n );\n }\n return flip(el, first, flipOptions);\n });\n\n await Promise.all(animations);\n};\n","/**\n * Keyframe presets.\n *\n * @module bquery/motion\n */\n\n/**\n * Common keyframe presets for quick animations.\n */\nexport const keyframePresets = {\n fadeIn: (from = 0, to = 1): Keyframe[] => [{ opacity: from }, { opacity: to }],\n fadeOut: (from = 1, to = 0): Keyframe[] => [{ opacity: from }, { opacity: to }],\n slideInUp: (distance = 16): Keyframe[] => [\n { opacity: 0, transform: `translateY(${distance}px)` },\n { opacity: 1, transform: 'translateY(0)' },\n ],\n slideInDown: (distance = 16): Keyframe[] => [\n { opacity: 0, transform: `translateY(-${distance}px)` },\n { opacity: 1, transform: 'translateY(0)' },\n ],\n slideInLeft: (distance = 16): Keyframe[] => [\n { opacity: 0, transform: `translateX(${distance}px)` },\n { opacity: 1, transform: 'translateX(0)' },\n ],\n slideInRight: (distance = 16): Keyframe[] => [\n { opacity: 0, transform: `translateX(-${distance}px)` },\n { opacity: 1, transform: 'translateX(0)' },\n ],\n scaleIn: (from = 0.95, to = 1): Keyframe[] => [\n { opacity: 0, transform: `scale(${from})` },\n { opacity: 1, transform: `scale(${to})` },\n ],\n scaleOut: (from = 1, to = 0.95): Keyframe[] => [\n { opacity: 1, transform: `scale(${from})` },\n { opacity: 0, transform: `scale(${to})` },\n ],\n pop: (from = 0.9, mid = 1.02, to = 1): Keyframe[] => [\n { opacity: 0, transform: `scale(${from})` },\n { opacity: 1, transform: `scale(${mid})`, offset: 0.6 },\n { opacity: 1, transform: `scale(${to})` },\n ],\n rotateIn: (degrees = 6): Keyframe[] => [\n { opacity: 0, transform: `rotate(${degrees}deg) scale(0.98)` },\n { opacity: 1, transform: 'rotate(0deg) scale(1)' },\n ],\n};\n","/**\n * Scroll-triggered animation helpers.\n *\n * @module bquery/motion\n */\n\nimport { animate } from './animate';\nimport type { ScrollAnimateCleanup, ScrollAnimateOptions } from './types';\n\nconst resolveElements = (elements: Element | Iterable<Element> | ArrayLike<Element>): Element[] => {\n if (typeof Element !== 'undefined' && elements instanceof Element) return [elements];\n return Array.from(elements as Iterable<Element>);\n};\n\n/**\n * Animate elements when they enter the viewport.\n *\n * @param elements - Target element(s)\n * @param options - Scroll animation configuration\n * @returns Cleanup function to disconnect observers\n */\nexport const scrollAnimate = (\n elements: Element | Iterable<Element> | ArrayLike<Element>,\n options: ScrollAnimateOptions\n): ScrollAnimateCleanup => {\n const targets = resolveElements(elements);\n if (!targets.length) return () => undefined;\n\n const { root = null, rootMargin, threshold, once = true, onEnter, ...animationConfig } = options;\n\n if (typeof IntersectionObserver === 'undefined') {\n targets.forEach((element) => {\n onEnter?.(element);\n void animate(element, animationConfig);\n });\n return () => undefined;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (!entry.isIntersecting) return;\n const element = entry.target as Element;\n onEnter?.(element);\n void animate(element, animationConfig);\n if (once) {\n observer.unobserve(element);\n }\n });\n },\n { root, rootMargin, threshold }\n );\n\n targets.forEach((element) => observer.observe(element));\n\n return () => observer.disconnect();\n};\n","/**\n * Spring physics helpers.\n *\n * @module bquery/motion\n */\n\nimport type { Spring, SpringConfig } from './types';\n\n/**\n * Default spring configuration values.\n */\nconst DEFAULT_SPRING_CONFIG: Required<SpringConfig> = {\n stiffness: 100,\n damping: 10,\n mass: 1,\n precision: 0.01,\n};\n\n/**\n * Create a spring-based animation for smooth, physics-based motion.\n *\n * Uses variable frame rate timing based on `requestAnimationFrame` timestamps\n * to ensure consistent animation speed across different devices and frame rates.\n * Large time deltas (e.g., from tab backgrounding) are clamped to maintain\n * simulation stability.\n *\n * @param initialValue - Starting value for the spring\n * @param config - Spring physics configuration\n * @returns Spring instance for controlling the animation\n *\n * @example\n * ```ts\n * const x = spring(0, { stiffness: 120, damping: 14 });\n * x.onChange((value) => {\n * element.style.transform = `translateX(${value}px)`;\n * });\n * await x.to(100);\n * ```\n */\nexport const spring = (initialValue: number, config: SpringConfig = {}): Spring => {\n const { stiffness, damping, mass, precision } = {\n ...DEFAULT_SPRING_CONFIG,\n ...config,\n };\n\n let current = initialValue;\n let velocity = 0;\n let target = initialValue;\n let animationFrame: number | null = null;\n let resolvePromise: (() => void) | null = null;\n let lastTime: number | null = null;\n const listeners = new Set<(value: number) => void>();\n\n const notifyListeners = () => {\n for (const listener of listeners) {\n listener(current);\n }\n };\n\n const step = (timestamp: number) => {\n // Calculate time delta (in seconds) from last frame\n // If this is the first frame, use a sensible default (1/60s)\n // This ensures the animation speed is independent of frame rate\n const deltaTime = lastTime !== null ? (timestamp - lastTime) / 1000 : 1 / 60;\n // Clamp large deltas to prevent instability (e.g. tab backgrounding)\n // Maximum delta of 1/30s (~33ms) keeps simulation stable\n const clampedDelta = Math.min(deltaTime, 1 / 30);\n lastTime = timestamp;\n\n // Spring physics calculation\n const displacement = current - target;\n const springForce = -stiffness * displacement;\n const dampingForce = -damping * velocity;\n const acceleration = (springForce + dampingForce) / mass;\n\n velocity += acceleration * clampedDelta;\n current += velocity * clampedDelta;\n\n notifyListeners();\n\n // Check if spring has settled\n if (Math.abs(velocity) < precision && Math.abs(displacement) < precision) {\n current = target;\n velocity = 0;\n animationFrame = null;\n notifyListeners();\n resolvePromise?.();\n resolvePromise = null;\n return;\n }\n\n animationFrame = requestAnimationFrame(step);\n };\n\n return {\n to(newTarget: number): Promise<void> {\n target = newTarget;\n\n if (animationFrame !== null) {\n cancelAnimationFrame(animationFrame);\n }\n\n // Resolve any pending promise from a previous to() call\n // This ensures all returned promises eventually settle\n resolvePromise?.();\n\n // Reset lastTime to ensure clean start for new animation\n lastTime = null;\n\n return new Promise((resolve) => {\n resolvePromise = resolve;\n animationFrame = requestAnimationFrame(step);\n });\n },\n\n current(): number {\n return current;\n },\n\n stop(): void {\n if (animationFrame !== null) {\n cancelAnimationFrame(animationFrame);\n animationFrame = null;\n }\n velocity = 0;\n lastTime = null;\n resolvePromise?.();\n resolvePromise = null;\n },\n\n onChange(callback: (value: number) => void): () => void {\n listeners.add(callback);\n return () => listeners.delete(callback);\n },\n };\n};\n\n/**\n * Preset spring configurations for common use cases.\n */\nexport const springPresets = {\n /** Gentle, slow-settling spring */\n gentle: { stiffness: 80, damping: 15 } as SpringConfig,\n /** Responsive, snappy spring */\n snappy: { stiffness: 200, damping: 20 } as SpringConfig,\n /** Bouncy, playful spring */\n bouncy: { stiffness: 300, damping: 8 } as SpringConfig,\n /** Stiff, quick spring with minimal overshoot */\n stiff: { stiffness: 400, damping: 30 } as SpringConfig,\n};\n","/**\n * Stagger helpers.\n *\n * @module bquery/motion\n */\n\nimport type { StaggerFunction, StaggerOptions } from './types';\n\n/**\n * Create a staggered delay function for list animations.\n *\n * @param step - Delay between items in milliseconds\n * @param options - Stagger configuration\n * @returns Function that returns delay for a given index\n *\n * @example\n * ```ts\n * const delay = stagger(50, { from: 'center' });\n * delay(0, 3); // 50\n * delay(1, 3); // 0\n * ```\n */\nexport const stagger = (step: number, options: StaggerOptions = {}): StaggerFunction => {\n const { start = 0, from = 'start', easing } = options;\n\n return (index: number, total = 0): number => {\n const origin =\n typeof from === 'number'\n ? from\n : from === 'center'\n ? (total - 1) / 2\n : from === 'end'\n ? total - 1\n : 0;\n\n const distance = Math.abs(index - origin);\n const maxDistance = total > 1 ? Math.max(origin, total - 1 - origin) : 1;\n const normalized = maxDistance === 0 ? 0 : distance / maxDistance;\n const eased = easing ? easing(normalized) * maxDistance : distance;\n\n return start + eased * step;\n };\n};\n","/**\n * Timeline and sequence helpers.\n *\n * @module bquery/motion\n */\n\nimport { animate, applyFinalKeyframeStyles } from './animate';\nimport { prefersReducedMotion } from './reduced-motion';\nimport type {\n SequenceOptions,\n SequenceStep,\n TimelineConfig,\n TimelineControls,\n TimelineStep,\n} from './types';\n\nconst resolveTimeValue = (value?: number | string): number => {\n if (typeof value === 'number') return value;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.endsWith('ms')) {\n const parsed = Number.parseFloat(trimmed.slice(0, -2));\n return Number.isFinite(parsed) ? parsed : 0;\n }\n if (trimmed.endsWith('s')) {\n const parsed = Number.parseFloat(trimmed.slice(0, -1));\n return Number.isFinite(parsed) ? parsed * 1000 : 0;\n }\n const parsed = Number.parseFloat(trimmed);\n return Number.isFinite(parsed) ? parsed : 0;\n }\n return 0;\n};\n\nconst resolveAt = (at: TimelineStep['at'], previousEnd: number): number => {\n if (typeof at === 'number') return at;\n if (typeof at === 'string') {\n const match = /^([+-])=(\\d+(?:\\.\\d+)?)$/.exec(at);\n if (match) {\n const delta = Number.parseFloat(match[2]);\n if (!Number.isFinite(delta)) return previousEnd;\n return match[1] === '+' ? previousEnd + delta : previousEnd - delta;\n }\n }\n return previousEnd;\n};\n\nconst normalizeDuration = (options?: KeyframeAnimationOptions): number => {\n const baseDuration = resolveTimeValue(options?.duration as number | string | undefined);\n const endDelay = resolveTimeValue(options?.endDelay as number | string | undefined);\n const rawIterations = options?.iterations ?? 1;\n\n // Handle infinite iterations - treat as a special case with a very large duration\n // In practice, infinite iterations shouldn't be used in timelines as they never end\n if (rawIterations === Infinity) {\n // Return a large sentinel value - timeline calculations will be incorrect,\n // but this at least prevents NaN/Infinity from breaking scheduling\n return Number.MAX_SAFE_INTEGER;\n }\n\n // Per Web Animations spec, iterations must be a non-negative number\n // Treat negative as 0 (only endDelay duration)\n const iterations = Math.max(0, rawIterations);\n\n // Total duration = (baseDuration * iterations) + endDelay\n // Note: endDelay is applied once at the end, after all iterations\n return baseDuration * iterations + endDelay;\n};\n\nconst scheduleSteps = (steps: TimelineStep[]) => {\n let previousEnd = 0;\n return steps.map((step) => {\n const baseStart = resolveAt(step.at, previousEnd);\n const stepDelay = resolveTimeValue(step.options?.delay as number | string | undefined);\n const start = Math.max(0, baseStart + stepDelay);\n const duration = normalizeDuration(step.options);\n const end = start + duration;\n previousEnd = Math.max(previousEnd, end);\n return { step, start, end, duration };\n });\n};\n\n/**\n * Run a list of animations sequentially.\n *\n * @param steps - Steps to run in order\n * @param options - Sequence configuration\n */\nexport const sequence = async (\n steps: SequenceStep[],\n options: SequenceOptions = {}\n): Promise<void> => {\n const { stagger, onFinish } = options;\n const total = steps.length;\n\n for (let index = 0; index < steps.length; index += 1) {\n const step = steps[index];\n const delay = stagger ? stagger(index, total) : 0;\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n await animate(step.target, step);\n }\n\n onFinish?.();\n};\n\n/**\n * Create a timeline controller for multiple animations.\n *\n * @param initialSteps - Steps for the timeline\n * @param config - Timeline configuration\n */\nexport const timeline = (\n initialSteps: TimelineStep[] = [],\n config: TimelineConfig = {}\n): TimelineControls => {\n const steps = [...initialSteps];\n const listeners = new Set<() => void>();\n let animations: Array<{ animation: Animation; step: TimelineStep; start: number }> = [];\n let totalDuration = 0;\n let reducedMotionApplied = false;\n let finalized = false;\n\n const { commitStyles = true, respectReducedMotion = true, onFinish } = config;\n\n const finalize = () => {\n if (finalized) return;\n finalized = true;\n\n if (commitStyles) {\n for (const item of animations) {\n const { animation, step } = item;\n if (typeof animation.commitStyles === 'function') {\n animation.commitStyles();\n } else {\n applyFinalKeyframeStyles(step.target, step.keyframes);\n }\n animation.cancel();\n }\n }\n\n listeners.forEach((listener) => listener());\n onFinish?.();\n };\n\n const buildAnimations = () => {\n animations.forEach(({ animation }) => animation.cancel());\n animations = [];\n finalized = false;\n\n const schedule = scheduleSteps(steps);\n totalDuration = schedule.length ? Math.max(...schedule.map((item) => item.end)) : 0;\n\n if (respectReducedMotion && prefersReducedMotion()) {\n if (commitStyles) {\n schedule.forEach(({ step }) => applyFinalKeyframeStyles(step.target, step.keyframes));\n }\n reducedMotionApplied = true;\n return;\n }\n\n // Check if Web Animations API is available on all targets\n const animateUnavailable = schedule.some(\n ({ step }) => typeof (step.target as HTMLElement).animate !== 'function'\n );\n if (animateUnavailable) {\n if (commitStyles) {\n schedule.forEach(({ step }) => applyFinalKeyframeStyles(step.target, step.keyframes));\n }\n reducedMotionApplied = true;\n return;\n }\n\n reducedMotionApplied = false;\n animations = schedule.map(({ step, start }) => {\n const { delay: _delay, ...options } = step.options ?? {};\n const animation = step.target.animate(step.keyframes, {\n ...options,\n delay: start,\n fill: options.fill ?? 'both',\n });\n return { animation, step, start };\n });\n };\n\n return {\n add(step: TimelineStep): void {\n steps.push(step);\n },\n\n duration(): number {\n if (!steps.length) return 0;\n if (!animations.length) {\n const schedule = scheduleSteps(steps);\n return Math.max(...schedule.map((item) => item.end));\n }\n return totalDuration;\n },\n\n async play(): Promise<void> {\n buildAnimations();\n\n if (reducedMotionApplied || animations.length === 0) {\n finalize();\n return;\n }\n\n const finishPromises = animations.map((item) =>\n item.animation.finished.catch(() => undefined)\n );\n await Promise.all(finishPromises);\n finalize();\n },\n\n pause(): void {\n if (reducedMotionApplied) return;\n animations.forEach(({ animation }) => animation.pause());\n },\n\n resume(): void {\n if (reducedMotionApplied) return;\n animations.forEach(({ animation }) => animation.play());\n },\n\n stop(): void {\n animations.forEach(({ animation }) => animation.cancel());\n animations = [];\n reducedMotionApplied = false;\n },\n\n seek(time: number): void {\n if (reducedMotionApplied) return;\n animations.forEach(({ animation }) => {\n // currentTime is measured from the beginning of the animation including delay,\n // so we set it directly to the requested timeline time\n animation.currentTime = time;\n });\n },\n\n onFinish(callback: () => void): () => void {\n listeners.add(callback);\n return () => listeners.delete(callback);\n },\n };\n};\n","/**\n * View transition helpers.\n *\n * @module bquery/motion\n */\n\nimport type { TransitionOptions } from './types';\n\n/** Extended document type with View Transitions API */\ntype DocumentWithTransition = Document & {\n startViewTransition?: (callback: () => void) => {\n finished: Promise<void>;\n ready: Promise<void>;\n updateCallbackDone: Promise<void>;\n };\n};\n\n/**\n * Execute a DOM update with view transition animation.\n * Falls back to immediate update when View Transitions API is unavailable.\n *\n * @param updateOrOptions - Update function or options object\n * @returns Promise that resolves when transition completes\n *\n * @example\n * ```ts\n * await transition(() => {\n * $('#content').text('Updated');\n * });\n * ```\n */\nexport const transition = async (\n updateOrOptions: (() => void) | TransitionOptions\n): Promise<void> => {\n const update = typeof updateOrOptions === 'function' ? updateOrOptions : updateOrOptions.update;\n\n // SSR/non-DOM environment fallback\n if (typeof document === 'undefined') {\n update();\n return;\n }\n\n const doc = document as DocumentWithTransition;\n\n if (doc.startViewTransition) {\n await doc.startViewTransition(() => update()).finished;\n return;\n }\n\n update();\n};\n"],"names":["prefersReducedMotion","isStyleValue","value","toKebabCase","str","letter","applyFinalKeyframeStyles","element","keyframes","style","last","prop","cssProp","finalValue","animate","config","options","commitStyles","respectReducedMotion","onFinish","htmlElement","resolve","animation","finalized","finalize","clamp","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeOutBack","easeOutExpo","easingPresets","capturePosition","rect","flip","firstBounds","duration","easing","onComplete","lastBounds","deltaX","deltaY","deltaW","deltaH","flipList","elements","performUpdate","flipElements","stagger","flipOptions","positions","el","total","animations","index","first","delay","keyframePresets","from","to","distance","mid","degrees","resolveElements","scrollAnimate","targets","root","rootMargin","threshold","once","onEnter","animationConfig","observer","entries","entry","DEFAULT_SPRING_CONFIG","spring","initialValue","stiffness","damping","mass","precision","current","velocity","target","animationFrame","resolvePromise","lastTime","listeners","notifyListeners","listener","step","timestamp","deltaTime","clampedDelta","displacement","springForce","dampingForce","acceleration","newTarget","callback","springPresets","start","origin","maxDistance","normalized","eased","resolveTimeValue","trimmed","parsed","resolveAt","at","previousEnd","match","delta","normalizeDuration","baseDuration","endDelay","rawIterations","iterations","scheduleSteps","steps","baseStart","stepDelay","end","sequence","timeline","initialSteps","totalDuration","reducedMotionApplied","item","buildAnimations","schedule","_delay","finishPromises","time","transition","updateOrOptions","update","doc"],"mappings":"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"}
1
+ {"version":3,"file":"motion.es.mjs","sources":["../src/motion/reduced-motion.ts","../src/motion/animate.ts","../src/motion/easing.ts","../src/motion/flip.ts","../src/motion/keyframes.ts","../src/motion/scroll.ts","../src/motion/spring.ts","../src/motion/stagger.ts","../src/motion/timeline.ts","../src/motion/transition.ts"],"sourcesContent":["/**\n * Reduced motion detection helpers.\n *\n * @module bquery/motion\n */\n\n/**\n * Check whether the user prefers reduced motion.\n *\n * @returns true if the user prefers reduced motion, otherwise false\n */\nexport const prefersReducedMotion = (): boolean => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return false;\n }\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n};\n","/**\r\n * Web Animations helpers.\r\n *\r\n * @module bquery/motion\r\n */\r\n\r\nimport { prefersReducedMotion } from './reduced-motion';\r\nimport type { AnimateOptions } from './types';\r\n\r\n/** @internal */\r\nconst isStyleValue = (value: unknown): value is string | number =>\r\n typeof value === 'string' || typeof value === 'number';\r\n\r\n/**\r\n * Convert camelCase property names to kebab-case for CSS.\r\n * @internal\r\n */\r\nconst toKebabCase = (str: string): string => {\r\n return str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\r\n};\r\n\r\n/** @internal */\r\nexport const applyFinalKeyframeStyles = (\r\n element: Element,\r\n keyframes: Keyframe[] | PropertyIndexedKeyframes\r\n): void => {\r\n const htmlElement = element as HTMLElement;\r\n const style = htmlElement.style;\r\n\r\n if (Array.isArray(keyframes)) {\r\n const last = keyframes[keyframes.length - 1];\r\n if (!last) return;\r\n for (const [prop, value] of Object.entries(last)) {\r\n if (prop === 'offset' || prop === 'easing' || prop === 'composite') continue;\r\n if (isStyleValue(value)) {\r\n // Convert camelCase to kebab-case for CSS properties\r\n const cssProp = prop.startsWith('--') ? prop : toKebabCase(prop);\r\n style.setProperty(cssProp, String(value));\r\n }\r\n }\r\n return;\r\n }\r\n\r\n for (const [prop, value] of Object.entries(keyframes)) {\r\n if (prop === 'offset' || prop === 'easing' || prop === 'composite') continue;\r\n const finalValue = Array.isArray(value) ? value[value.length - 1] : value;\r\n if (isStyleValue(finalValue)) {\r\n // Convert camelCase to kebab-case for CSS properties\r\n const cssProp = prop.startsWith('--') ? prop : toKebabCase(prop);\r\n style.setProperty(cssProp, String(finalValue));\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Animate an element using the Web Animations API with reduced-motion fallback.\r\n *\r\n * @param element - Element to animate\r\n * @param config - Animation configuration\r\n * @returns Promise that resolves when animation completes\r\n *\r\n * @example\r\n * ```ts\r\n * await animate(element, {\r\n * keyframes: [{ opacity: 0 }, { opacity: 1 }],\r\n * options: { duration: 200, easing: 'ease-out' },\r\n * });\r\n * ```\r\n */\r\nexport const animate = (element: Element, config: AnimateOptions): Promise<void> => {\r\n const { keyframes, options, commitStyles = true, respectReducedMotion = true, onFinish } = config;\r\n\r\n if (respectReducedMotion && prefersReducedMotion()) {\r\n if (commitStyles) {\r\n applyFinalKeyframeStyles(element, keyframes);\r\n }\r\n onFinish?.();\r\n return Promise.resolve();\r\n }\r\n\r\n const htmlElement = element as HTMLElement;\r\n if (typeof htmlElement.animate !== 'function') {\r\n if (commitStyles) {\r\n applyFinalKeyframeStyles(element, keyframes);\r\n }\r\n onFinish?.();\r\n return Promise.resolve();\r\n }\r\n\r\n return new Promise((resolve) => {\r\n const animation = htmlElement.animate(keyframes, options);\r\n let finalized = false;\r\n const finalize = () => {\r\n if (finalized) return;\r\n finalized = true;\r\n if (commitStyles) {\r\n if (typeof animation.commitStyles === 'function') {\r\n animation.commitStyles();\r\n } else {\r\n applyFinalKeyframeStyles(element, keyframes);\r\n }\r\n }\r\n animation.cancel();\r\n onFinish?.();\r\n resolve();\r\n };\r\n\r\n animation.onfinish = finalize;\r\n if (animation.finished) {\r\n animation.finished.then(finalize).catch(finalize);\r\n }\r\n });\r\n};\r\n","/**\n * Easing helpers.\n *\n * @module bquery/motion\n */\n\nimport type { EasingFunction } from './types';\n\nconst clamp = (value: number) => Math.min(1, Math.max(0, value));\n\nexport const linear: EasingFunction = (t) => clamp(t);\nexport const easeInQuad: EasingFunction = (t) => clamp(t * t);\nexport const easeOutQuad: EasingFunction = (t) => clamp(1 - (1 - t) * (1 - t));\nexport const easeInOutQuad: EasingFunction = (t) =>\n clamp(t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2);\nexport const easeInCubic: EasingFunction = (t) => clamp(t * t * t);\nexport const easeOutCubic: EasingFunction = (t) => clamp(1 - Math.pow(1 - t, 3));\nexport const easeInOutCubic: EasingFunction = (t) =>\n clamp(t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2);\nexport const easeOutBack: EasingFunction = (t) => {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n return clamp(1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2));\n};\nexport const easeOutExpo: EasingFunction = (t) => clamp(t === 1 ? 1 : 1 - Math.pow(2, -10 * t));\n\n/**\n * Named easing presets.\n */\nexport const easingPresets = {\n linear,\n easeInQuad,\n easeOutQuad,\n easeInOutQuad,\n easeInCubic,\n easeOutCubic,\n easeInOutCubic,\n easeOutBack,\n easeOutExpo,\n};\n","/**\r\n * FLIP animation helpers.\r\n *\r\n * @module bquery/motion\r\n */\r\n\r\nimport type { ElementBounds, FlipGroupOptions, FlipOptions } from './types';\r\n\r\n/**\r\n * Capture the current bounds of an element for FLIP animation.\r\n *\r\n * @param element - The DOM element to measure\r\n * @returns The element's current position and size\r\n */\r\nexport const capturePosition = (element: Element): ElementBounds => {\r\n const rect = element.getBoundingClientRect();\r\n return {\r\n top: rect.top,\r\n left: rect.left,\r\n width: rect.width,\r\n height: rect.height,\r\n };\r\n};\r\n\r\n/**\r\n * Perform a FLIP (First, Last, Invert, Play) animation.\r\n * Animates an element from its captured position to its current position.\r\n *\r\n * @param element - The element to animate\r\n * @param firstBounds - The previously captured bounds\r\n * @param options - Animation configuration\r\n * @returns Promise that resolves when animation completes\r\n *\r\n * @example\r\n * ```ts\r\n * const first = capturePosition(element);\r\n * // ... DOM changes that move the element ...\r\n * await flip(element, first, { duration: 300 });\r\n * ```\r\n */\r\nexport const flip = (\r\n element: Element,\r\n firstBounds: ElementBounds,\r\n options: FlipOptions = {}\r\n): Promise<void> => {\r\n const { duration = 300, easing = 'ease-out', onComplete } = options;\r\n\r\n // Last: Get current position\r\n const lastBounds = capturePosition(element);\r\n\r\n // Skip animation if element has zero dimensions (avoid division by zero)\r\n if (lastBounds.width === 0 || lastBounds.height === 0) {\r\n onComplete?.();\r\n return Promise.resolve();\r\n }\r\n\r\n // Invert: Calculate the delta\r\n const deltaX = firstBounds.left - lastBounds.left;\r\n const deltaY = firstBounds.top - lastBounds.top;\r\n const deltaW = firstBounds.width / lastBounds.width;\r\n const deltaH = firstBounds.height / lastBounds.height;\r\n\r\n // Skip animation if no change\r\n if (deltaX === 0 && deltaY === 0 && deltaW === 1 && deltaH === 1) {\r\n onComplete?.();\r\n return Promise.resolve();\r\n }\r\n\r\n const htmlElement = element as HTMLElement;\r\n\r\n // Feature check: fallback if Web Animations API is unavailable\r\n if (typeof htmlElement.animate !== 'function') {\r\n onComplete?.();\r\n return Promise.resolve();\r\n }\r\n\r\n // Apply inverted transform\r\n htmlElement.style.transform = `translate(${deltaX}px, ${deltaY}px) scale(${deltaW}, ${deltaH})`;\r\n htmlElement.style.transformOrigin = 'top left';\r\n\r\n // Force reflow\r\n void htmlElement.offsetHeight;\r\n\r\n // Play: Animate back to current position\r\n return new Promise((resolve) => {\r\n const animation = htmlElement.animate(\r\n [\r\n {\r\n transform: `translate(${deltaX}px, ${deltaY}px) scale(${deltaW}, ${deltaH})`,\r\n },\r\n { transform: 'translate(0, 0) scale(1, 1)' },\r\n ],\r\n { duration, easing, fill: 'forwards' }\r\n );\r\n\r\n let finalized = false;\r\n const finalize = () => {\r\n if (finalized) return;\r\n finalized = true;\r\n htmlElement.style.transform = '';\r\n htmlElement.style.transformOrigin = '';\r\n onComplete?.();\r\n resolve();\r\n };\r\n\r\n animation.onfinish = finalize;\r\n // Handle cancel/rejection via the finished promise\r\n if (animation.finished) {\r\n animation.finished.then(finalize).catch(finalize);\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * FLIP helper for animating a list of elements.\r\n * Useful for reordering lists with smooth animations.\r\n *\r\n * @param elements - Array of elements to animate\r\n * @param performUpdate - Function that performs the DOM update\r\n * @param options - Animation configuration\r\n *\r\n * @example\r\n * ```ts\r\n * await flipList(listItems, () => {\r\n * container.appendChild(container.firstChild); // Move first to last\r\n * });\r\n * ```\r\n */\r\nexport const flipList = async (\r\n elements: Element[],\r\n performUpdate: () => void,\r\n options: FlipOptions = {}\r\n): Promise<void> => {\r\n await flipElements(elements, performUpdate, options);\r\n};\r\n\r\n/**\r\n * FLIP helper with optional stagger support.\r\n *\r\n * @param elements - Array of elements to animate\r\n * @param performUpdate - Function that performs the DOM update\r\n * @param options - Animation configuration\r\n */\r\nexport const flipElements = async (\r\n elements: Element[],\r\n performUpdate: () => void,\r\n options: FlipGroupOptions = {}\r\n): Promise<void> => {\r\n const { stagger, ...flipOptions } = options;\r\n\r\n // First: Capture all positions\r\n const positions = new Map<Element, ElementBounds>();\r\n for (const el of elements) {\r\n positions.set(el, capturePosition(el));\r\n }\r\n\r\n // Perform DOM update\r\n performUpdate();\r\n\r\n const total = elements.length;\r\n\r\n // Animate each element\r\n const animations = elements.map((el, index) => {\r\n const first = positions.get(el);\r\n if (!first) return Promise.resolve();\r\n const delay = stagger ? stagger(index, total) : 0;\r\n if (delay > 0) {\r\n return new Promise((resolve) => setTimeout(resolve, delay)).then(() =>\r\n flip(el, first, flipOptions)\r\n );\r\n }\r\n return flip(el, first, flipOptions);\r\n });\r\n\r\n await Promise.all(animations);\r\n};\r\n","/**\n * Keyframe presets.\n *\n * @module bquery/motion\n */\n\n/**\n * Common keyframe presets for quick animations.\n */\nexport const keyframePresets = {\n fadeIn: (from = 0, to = 1): Keyframe[] => [{ opacity: from }, { opacity: to }],\n fadeOut: (from = 1, to = 0): Keyframe[] => [{ opacity: from }, { opacity: to }],\n slideInUp: (distance = 16): Keyframe[] => [\n { opacity: 0, transform: `translateY(${distance}px)` },\n { opacity: 1, transform: 'translateY(0)' },\n ],\n slideInDown: (distance = 16): Keyframe[] => [\n { opacity: 0, transform: `translateY(-${distance}px)` },\n { opacity: 1, transform: 'translateY(0)' },\n ],\n slideInLeft: (distance = 16): Keyframe[] => [\n { opacity: 0, transform: `translateX(${distance}px)` },\n { opacity: 1, transform: 'translateX(0)' },\n ],\n slideInRight: (distance = 16): Keyframe[] => [\n { opacity: 0, transform: `translateX(-${distance}px)` },\n { opacity: 1, transform: 'translateX(0)' },\n ],\n scaleIn: (from = 0.95, to = 1): Keyframe[] => [\n { opacity: 0, transform: `scale(${from})` },\n { opacity: 1, transform: `scale(${to})` },\n ],\n scaleOut: (from = 1, to = 0.95): Keyframe[] => [\n { opacity: 1, transform: `scale(${from})` },\n { opacity: 0, transform: `scale(${to})` },\n ],\n pop: (from = 0.9, mid = 1.02, to = 1): Keyframe[] => [\n { opacity: 0, transform: `scale(${from})` },\n { opacity: 1, transform: `scale(${mid})`, offset: 0.6 },\n { opacity: 1, transform: `scale(${to})` },\n ],\n rotateIn: (degrees = 6): Keyframe[] => [\n { opacity: 0, transform: `rotate(${degrees}deg) scale(0.98)` },\n { opacity: 1, transform: 'rotate(0deg) scale(1)' },\n ],\n};\n","/**\r\n * Scroll-triggered animation helpers.\r\n *\r\n * @module bquery/motion\r\n */\r\n\r\nimport { animate } from './animate';\r\nimport type { ScrollAnimateCleanup, ScrollAnimateOptions } from './types';\r\n\r\nconst resolveElements = (elements: Element | Iterable<Element> | ArrayLike<Element>): Element[] => {\r\n if (typeof Element !== 'undefined' && elements instanceof Element) return [elements];\r\n return Array.from(elements as Iterable<Element>);\r\n};\r\n\r\n/**\r\n * Animate elements when they enter the viewport.\r\n *\r\n * @param elements - Target element(s)\r\n * @param options - Scroll animation configuration\r\n * @returns Cleanup function to disconnect observers\r\n */\r\nexport const scrollAnimate = (\r\n elements: Element | Iterable<Element> | ArrayLike<Element>,\r\n options: ScrollAnimateOptions\r\n): ScrollAnimateCleanup => {\r\n const targets = resolveElements(elements);\r\n if (!targets.length) return () => undefined;\r\n\r\n const { root = null, rootMargin, threshold, once = true, onEnter, ...animationConfig } = options;\r\n\r\n if (typeof IntersectionObserver === 'undefined') {\r\n targets.forEach((element) => {\r\n onEnter?.(element);\r\n void animate(element, animationConfig);\r\n });\r\n return () => undefined;\r\n }\r\n\r\n const observer = new IntersectionObserver(\r\n (entries) => {\r\n entries.forEach((entry) => {\r\n if (!entry.isIntersecting) return;\r\n const element = entry.target as Element;\r\n onEnter?.(element);\r\n void animate(element, animationConfig);\r\n if (once) {\r\n observer.unobserve(element);\r\n }\r\n });\r\n },\r\n { root, rootMargin, threshold }\r\n );\r\n\r\n targets.forEach((element) => observer.observe(element));\r\n\r\n return () => observer.disconnect();\r\n};\r\n","/**\r\n * Spring physics helpers.\r\n *\r\n * @module bquery/motion\r\n */\r\n\r\nimport type { Spring, SpringConfig } from './types';\r\n\r\n/**\r\n * Default spring configuration values.\r\n */\r\nconst DEFAULT_SPRING_CONFIG: Required<SpringConfig> = {\r\n stiffness: 100,\r\n damping: 10,\r\n mass: 1,\r\n precision: 0.01,\r\n};\r\n\r\n/**\r\n * Create a spring-based animation for smooth, physics-based motion.\r\n *\r\n * Uses variable frame rate timing based on `requestAnimationFrame` timestamps\r\n * to ensure consistent animation speed across different devices and frame rates.\r\n * Large time deltas (e.g., from tab backgrounding) are clamped to maintain\r\n * simulation stability.\r\n *\r\n * @param initialValue - Starting value for the spring\r\n * @param config - Spring physics configuration\r\n * @returns Spring instance for controlling the animation\r\n *\r\n * @example\r\n * ```ts\r\n * const x = spring(0, { stiffness: 120, damping: 14 });\r\n * x.onChange((value) => {\r\n * element.style.transform = `translateX(${value}px)`;\r\n * });\r\n * await x.to(100);\r\n * ```\r\n */\r\nexport const spring = (initialValue: number, config: SpringConfig = {}): Spring => {\r\n const { stiffness, damping, mass, precision } = {\r\n ...DEFAULT_SPRING_CONFIG,\r\n ...config,\r\n };\r\n\r\n let current = initialValue;\r\n let velocity = 0;\r\n let target = initialValue;\r\n let animationFrame: number | null = null;\r\n let resolvePromise: (() => void) | null = null;\r\n let lastTime: number | null = null;\r\n const listeners = new Set<(value: number) => void>();\r\n\r\n const notifyListeners = () => {\r\n for (const listener of listeners) {\r\n listener(current);\r\n }\r\n };\r\n\r\n const step = (timestamp: number) => {\r\n // Calculate time delta (in seconds) from last frame\r\n // If this is the first frame, use a sensible default (1/60s)\r\n // This ensures the animation speed is independent of frame rate\r\n const deltaTime = lastTime !== null ? (timestamp - lastTime) / 1000 : 1 / 60;\r\n // Clamp large deltas to prevent instability (e.g. tab backgrounding)\r\n // Maximum delta of 1/30s (~33ms) keeps simulation stable\r\n const clampedDelta = Math.min(deltaTime, 1 / 30);\r\n lastTime = timestamp;\r\n\r\n // Spring physics calculation\r\n const displacement = current - target;\r\n const springForce = -stiffness * displacement;\r\n const dampingForce = -damping * velocity;\r\n const acceleration = (springForce + dampingForce) / mass;\r\n\r\n velocity += acceleration * clampedDelta;\r\n current += velocity * clampedDelta;\r\n\r\n notifyListeners();\r\n\r\n // Check if spring has settled\r\n if (Math.abs(velocity) < precision && Math.abs(displacement) < precision) {\r\n current = target;\r\n velocity = 0;\r\n animationFrame = null;\r\n notifyListeners();\r\n resolvePromise?.();\r\n resolvePromise = null;\r\n return;\r\n }\r\n\r\n animationFrame = requestAnimationFrame(step);\r\n };\r\n\r\n return {\r\n to(newTarget: number): Promise<void> {\r\n target = newTarget;\r\n\r\n if (animationFrame !== null) {\r\n cancelAnimationFrame(animationFrame);\r\n }\r\n\r\n // Resolve any pending promise from a previous to() call\r\n // This ensures all returned promises eventually settle\r\n resolvePromise?.();\r\n\r\n // Reset lastTime to ensure clean start for new animation\r\n lastTime = null;\r\n\r\n return new Promise((resolve) => {\r\n resolvePromise = resolve;\r\n animationFrame = requestAnimationFrame(step);\r\n });\r\n },\r\n\r\n current(): number {\r\n return current;\r\n },\r\n\r\n stop(): void {\r\n if (animationFrame !== null) {\r\n cancelAnimationFrame(animationFrame);\r\n animationFrame = null;\r\n }\r\n velocity = 0;\r\n lastTime = null;\r\n resolvePromise?.();\r\n resolvePromise = null;\r\n },\r\n\r\n onChange(callback: (value: number) => void): () => void {\r\n listeners.add(callback);\r\n return () => listeners.delete(callback);\r\n },\r\n };\r\n};\r\n\r\n/**\r\n * Preset spring configurations for common use cases.\r\n */\r\nexport const springPresets = {\r\n /** Gentle, slow-settling spring */\r\n gentle: { stiffness: 80, damping: 15 } as SpringConfig,\r\n /** Responsive, snappy spring */\r\n snappy: { stiffness: 200, damping: 20 } as SpringConfig,\r\n /** Bouncy, playful spring */\r\n bouncy: { stiffness: 300, damping: 8 } as SpringConfig,\r\n /** Stiff, quick spring with minimal overshoot */\r\n stiff: { stiffness: 400, damping: 30 } as SpringConfig,\r\n};\r\n","/**\n * Stagger helpers.\n *\n * @module bquery/motion\n */\n\nimport type { StaggerFunction, StaggerOptions } from './types';\n\n/**\n * Create a staggered delay function for list animations.\n *\n * @param step - Delay between items in milliseconds\n * @param options - Stagger configuration\n * @returns Function that returns delay for a given index\n *\n * @example\n * ```ts\n * const delay = stagger(50, { from: 'center' });\n * delay(0, 3); // 50\n * delay(1, 3); // 0\n * ```\n */\nexport const stagger = (step: number, options: StaggerOptions = {}): StaggerFunction => {\n const { start = 0, from = 'start', easing } = options;\n\n return (index: number, total = 0): number => {\n const origin =\n typeof from === 'number'\n ? from\n : from === 'center'\n ? (total - 1) / 2\n : from === 'end'\n ? total - 1\n : 0;\n\n const distance = Math.abs(index - origin);\n const maxDistance = total > 1 ? Math.max(origin, total - 1 - origin) : 1;\n const normalized = maxDistance === 0 ? 0 : distance / maxDistance;\n const eased = easing ? easing(normalized) * maxDistance : distance;\n\n return start + eased * step;\n };\n};\n","/**\r\n * Timeline and sequence helpers.\r\n *\r\n * @module bquery/motion\r\n */\r\n\r\nimport { animate, applyFinalKeyframeStyles } from './animate';\r\nimport { prefersReducedMotion } from './reduced-motion';\r\nimport type {\r\n SequenceOptions,\r\n SequenceStep,\r\n TimelineConfig,\r\n TimelineControls,\r\n TimelineStep,\r\n} from './types';\r\n\r\nconst resolveTimeValue = (value?: number | string): number => {\r\n if (typeof value === 'number') return value;\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim();\r\n if (trimmed.endsWith('ms')) {\r\n const parsed = Number.parseFloat(trimmed.slice(0, -2));\r\n return Number.isFinite(parsed) ? parsed : 0;\r\n }\r\n if (trimmed.endsWith('s')) {\r\n const parsed = Number.parseFloat(trimmed.slice(0, -1));\r\n return Number.isFinite(parsed) ? parsed * 1000 : 0;\r\n }\r\n const parsed = Number.parseFloat(trimmed);\r\n return Number.isFinite(parsed) ? parsed : 0;\r\n }\r\n return 0;\r\n};\r\n\r\nconst resolveAt = (at: TimelineStep['at'], previousEnd: number): number => {\r\n if (typeof at === 'number') return at;\r\n if (typeof at === 'string') {\r\n const match = /^([+-])=(\\d+(?:\\.\\d+)?)$/.exec(at);\r\n if (match) {\r\n const delta = Number.parseFloat(match[2]);\r\n if (!Number.isFinite(delta)) return previousEnd;\r\n return match[1] === '+' ? previousEnd + delta : previousEnd - delta;\r\n }\r\n }\r\n return previousEnd;\r\n};\r\n\r\nconst normalizeDuration = (options?: KeyframeAnimationOptions): number => {\r\n const baseDuration = resolveTimeValue(options?.duration as number | string | undefined);\r\n const endDelay = resolveTimeValue(options?.endDelay as number | string | undefined);\r\n const rawIterations = options?.iterations ?? 1;\r\n\r\n // Handle infinite iterations - treat as a special case with a very large duration\r\n // In practice, infinite iterations shouldn't be used in timelines as they never end\r\n if (rawIterations === Infinity) {\r\n // Return a large sentinel value - timeline calculations will be incorrect,\r\n // but this at least prevents NaN/Infinity from breaking scheduling\r\n return Number.MAX_SAFE_INTEGER;\r\n }\r\n\r\n // Per Web Animations spec, iterations must be a non-negative number\r\n // Treat negative as 0 (only endDelay duration)\r\n const iterations = Math.max(0, rawIterations);\r\n\r\n // Total duration = (baseDuration * iterations) + endDelay\r\n // Note: endDelay is applied once at the end, after all iterations\r\n return baseDuration * iterations + endDelay;\r\n};\r\n\r\nconst scheduleSteps = (steps: TimelineStep[]) => {\r\n let previousEnd = 0;\r\n return steps.map((step) => {\r\n const baseStart = resolveAt(step.at, previousEnd);\r\n const stepDelay = resolveTimeValue(step.options?.delay as number | string | undefined);\r\n const start = Math.max(0, baseStart + stepDelay);\r\n const duration = normalizeDuration(step.options);\r\n const end = start + duration;\r\n previousEnd = Math.max(previousEnd, end);\r\n return { step, start, end, duration };\r\n });\r\n};\r\n\r\n/**\r\n * Run a list of animations sequentially.\r\n *\r\n * @param steps - Steps to run in order\r\n * @param options - Sequence configuration\r\n */\r\nexport const sequence = async (\r\n steps: SequenceStep[],\r\n options: SequenceOptions = {}\r\n): Promise<void> => {\r\n const { stagger, onFinish } = options;\r\n const total = steps.length;\r\n\r\n for (let index = 0; index < steps.length; index += 1) {\r\n const step = steps[index];\r\n const delay = stagger ? stagger(index, total) : 0;\r\n if (delay > 0) {\r\n await new Promise((resolve) => setTimeout(resolve, delay));\r\n }\r\n await animate(step.target, step);\r\n }\r\n\r\n onFinish?.();\r\n};\r\n\r\n/**\r\n * Create a timeline controller for multiple animations.\r\n *\r\n * @param initialSteps - Steps for the timeline\r\n * @param config - Timeline configuration\r\n */\r\nexport const timeline = (\r\n initialSteps: TimelineStep[] = [],\r\n config: TimelineConfig = {}\r\n): TimelineControls => {\r\n const steps = [...initialSteps];\r\n const listeners = new Set<() => void>();\r\n let animations: Array<{ animation: Animation; step: TimelineStep; start: number }> = [];\r\n let totalDuration = 0;\r\n let reducedMotionApplied = false;\r\n let finalized = false;\r\n\r\n const { commitStyles = true, respectReducedMotion = true, onFinish } = config;\r\n\r\n const finalize = () => {\r\n if (finalized) return;\r\n finalized = true;\r\n\r\n if (commitStyles) {\r\n for (const item of animations) {\r\n const { animation, step } = item;\r\n if (typeof animation.commitStyles === 'function') {\r\n animation.commitStyles();\r\n } else {\r\n applyFinalKeyframeStyles(step.target, step.keyframes);\r\n }\r\n animation.cancel();\r\n }\r\n }\r\n\r\n listeners.forEach((listener) => listener());\r\n onFinish?.();\r\n };\r\n\r\n const buildAnimations = () => {\r\n animations.forEach(({ animation }) => animation.cancel());\r\n animations = [];\r\n finalized = false;\r\n\r\n const schedule = scheduleSteps(steps);\r\n totalDuration = schedule.length ? Math.max(...schedule.map((item) => item.end)) : 0;\r\n\r\n if (respectReducedMotion && prefersReducedMotion()) {\r\n if (commitStyles) {\r\n schedule.forEach(({ step }) => applyFinalKeyframeStyles(step.target, step.keyframes));\r\n }\r\n reducedMotionApplied = true;\r\n return;\r\n }\r\n\r\n // Check if Web Animations API is available on all targets\r\n const animateUnavailable = schedule.some(\r\n ({ step }) => typeof (step.target as HTMLElement).animate !== 'function'\r\n );\r\n if (animateUnavailable) {\r\n if (commitStyles) {\r\n schedule.forEach(({ step }) => applyFinalKeyframeStyles(step.target, step.keyframes));\r\n }\r\n reducedMotionApplied = true;\r\n return;\r\n }\r\n\r\n reducedMotionApplied = false;\r\n animations = schedule.map(({ step, start }) => {\r\n const { delay: _delay, ...options } = step.options ?? {};\r\n const animation = step.target.animate(step.keyframes, {\r\n ...options,\r\n delay: start,\r\n fill: options.fill ?? 'both',\r\n });\r\n return { animation, step, start };\r\n });\r\n };\r\n\r\n return {\r\n add(step: TimelineStep): void {\r\n steps.push(step);\r\n },\r\n\r\n duration(): number {\r\n if (!steps.length) return 0;\r\n if (!animations.length) {\r\n const schedule = scheduleSteps(steps);\r\n return Math.max(...schedule.map((item) => item.end));\r\n }\r\n return totalDuration;\r\n },\r\n\r\n async play(): Promise<void> {\r\n buildAnimations();\r\n\r\n if (reducedMotionApplied || animations.length === 0) {\r\n finalize();\r\n return;\r\n }\r\n\r\n const finishPromises = animations.map((item) =>\r\n item.animation.finished.catch(() => undefined)\r\n );\r\n await Promise.all(finishPromises);\r\n finalize();\r\n },\r\n\r\n pause(): void {\r\n if (reducedMotionApplied) return;\r\n animations.forEach(({ animation }) => animation.pause());\r\n },\r\n\r\n resume(): void {\r\n if (reducedMotionApplied) return;\r\n animations.forEach(({ animation }) => animation.play());\r\n },\r\n\r\n stop(): void {\r\n animations.forEach(({ animation }) => animation.cancel());\r\n animations = [];\r\n reducedMotionApplied = false;\r\n },\r\n\r\n seek(time: number): void {\r\n if (reducedMotionApplied) return;\r\n animations.forEach(({ animation }) => {\r\n // currentTime is measured from the beginning of the animation including delay,\r\n // so we set it directly to the requested timeline time\r\n animation.currentTime = time;\r\n });\r\n },\r\n\r\n onFinish(callback: () => void): () => void {\r\n listeners.add(callback);\r\n return () => listeners.delete(callback);\r\n },\r\n };\r\n};\r\n","/**\r\n * View transition helpers.\r\n *\r\n * @module bquery/motion\r\n */\r\n\r\nimport type { TransitionOptions } from './types';\r\n\r\n/** Extended document type with View Transitions API */\r\ntype DocumentWithTransition = Document & {\r\n startViewTransition?: (callback: () => void) => {\r\n finished: Promise<void>;\r\n ready: Promise<void>;\r\n updateCallbackDone: Promise<void>;\r\n };\r\n};\r\n\r\n/**\r\n * Execute a DOM update with view transition animation.\r\n * Falls back to immediate update when View Transitions API is unavailable.\r\n *\r\n * @param updateOrOptions - Update function or options object\r\n * @returns Promise that resolves when transition completes\r\n *\r\n * @example\r\n * ```ts\r\n * await transition(() => {\r\n * $('#content').text('Updated');\r\n * });\r\n * ```\r\n */\r\nexport const transition = async (\r\n updateOrOptions: (() => void) | TransitionOptions\r\n): Promise<void> => {\r\n const update = typeof updateOrOptions === 'function' ? updateOrOptions : updateOrOptions.update;\r\n\r\n // SSR/non-DOM environment fallback\r\n if (typeof document === 'undefined') {\r\n update();\r\n return;\r\n }\r\n\r\n const doc = document as DocumentWithTransition;\r\n\r\n if (doc.startViewTransition) {\r\n await doc.startViewTransition(() => update()).finished;\r\n return;\r\n }\r\n\r\n update();\r\n};\r\n"],"names":["prefersReducedMotion","isStyleValue","value","toKebabCase","str","letter","applyFinalKeyframeStyles","element","keyframes","style","last","prop","cssProp","finalValue","animate","config","options","commitStyles","respectReducedMotion","onFinish","htmlElement","resolve","animation","finalized","finalize","clamp","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeOutBack","easeOutExpo","easingPresets","capturePosition","rect","flip","firstBounds","duration","easing","onComplete","lastBounds","deltaX","deltaY","deltaW","deltaH","flipList","elements","performUpdate","flipElements","stagger","flipOptions","positions","el","total","animations","index","first","delay","keyframePresets","from","to","distance","mid","degrees","resolveElements","scrollAnimate","targets","root","rootMargin","threshold","once","onEnter","animationConfig","observer","entries","entry","DEFAULT_SPRING_CONFIG","spring","initialValue","stiffness","damping","mass","precision","current","velocity","target","animationFrame","resolvePromise","lastTime","listeners","notifyListeners","listener","step","timestamp","deltaTime","clampedDelta","displacement","springForce","dampingForce","acceleration","newTarget","callback","springPresets","start","origin","maxDistance","normalized","eased","resolveTimeValue","trimmed","parsed","resolveAt","at","previousEnd","match","delta","normalizeDuration","baseDuration","endDelay","rawIterations","iterations","scheduleSteps","steps","baseStart","stepDelay","end","sequence","timeline","initialSteps","totalDuration","reducedMotionApplied","item","buildAnimations","schedule","_delay","finishPromises","time","transition","updateOrOptions","update","doc"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { s as P, c as j } from "./core-COenAZjD.js";
2
- import { u as x } from "./untrack-BuEQKH7_.js";
3
- import { b as S } from "./batch-4LAvfLE7.js";
1
+ import { s as P, c as j } from "./core-BhpuvPhy.js";
2
+ import { u as x } from "./untrack-DNnnqdlR.js";
3
+ import { b as S } from "./batch-x7b2eZST.js";
4
4
  const V = () => {
5
5
  if (!(typeof window > "u"))
6
6
  return window.__BQUERY_DEVTOOLS__ || (window.__BQUERY_DEVTOOLS__ = { stores: /* @__PURE__ */ new Map() }), window.__BQUERY_DEVTOOLS__;
@@ -275,4 +275,4 @@ export {
275
275
  J as m,
276
276
  F as r
277
277
  };
278
- //# sourceMappingURL=persisted-Dz_ryNuC.js.map
278
+ //# sourceMappingURL=persisted-DHoi3uEs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"persisted-Dz_ryNuC.js","sources":["../src/store/devtools.ts","../src/store/plugins.ts","../src/store/registry.ts","../src/store/utils.ts","../src/store/create-store.ts","../src/store/mapping.ts","../src/store/persisted.ts"],"sourcesContent":["/**\n * Devtools integration for stores.\n * @internal\n */\n\ndeclare global {\n interface Window {\n __BQUERY_DEVTOOLS__?: {\n stores: Map<string, unknown>;\n onStoreCreated?: (id: string, store: unknown) => void;\n onStateChange?: (id: string, state: unknown) => void;\n };\n }\n}\n\nexport type DevtoolsHook = {\n stores: Map<string, unknown>;\n onStoreCreated?: (id: string, store: unknown) => void;\n onStateChange?: (id: string, state: unknown) => void;\n};\n\nconst ensureDevtools = (): DevtoolsHook | undefined => {\n if (typeof window === 'undefined') return undefined;\n if (!window.__BQUERY_DEVTOOLS__) {\n window.__BQUERY_DEVTOOLS__ = { stores: new Map() };\n }\n return window.__BQUERY_DEVTOOLS__;\n};\n\nexport const registerDevtoolsStore = (id: string, store: unknown): void => {\n const devtools = ensureDevtools();\n if (!devtools) return;\n devtools.stores.set(id, store);\n devtools.onStoreCreated?.(id, store);\n};\n\nexport const unregisterDevtoolsStore = (id: string): void => {\n if (typeof window === 'undefined' || !window.__BQUERY_DEVTOOLS__) return;\n window.__BQUERY_DEVTOOLS__.stores.delete(id);\n};\n\nexport const notifyDevtoolsStateChange = (id: string, state: unknown): void => {\n if (typeof window === 'undefined') return;\n window.__BQUERY_DEVTOOLS__?.onStateChange?.(id, state);\n};\n","/**\n * Store plugins API.\n */\n\nimport type { Store, StoreDefinition, StorePlugin } from './types';\n\n/** @internal Registered plugins */\nconst plugins: StorePlugin[] = [];\n\n/**\n * Registers a plugin that extends all stores.\n *\n * @param plugin - The plugin function\n */\nexport const registerPlugin = (plugin: StorePlugin): void => {\n plugins.push(plugin);\n};\n\n/** @internal */\nexport const applyPlugins = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n store: Store<any, any, any>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: StoreDefinition<any, any, any>\n): void => {\n for (const plugin of plugins) {\n const extension = plugin({ store, options });\n if (extension) {\n Object.assign(store, extension);\n }\n }\n};\n","/**\n * Store registry utilities.\n */\n\nimport { unregisterDevtoolsStore } from './devtools';\nimport type { Store } from './types';\n\n/** @internal Registry of all stores for devtools */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst storeRegistry = new Map<string, Store<any, any, any>>();\n\n/** @internal */\nexport const hasStore = (id: string): boolean => storeRegistry.has(id);\n\n/** @internal */\nexport const registerStore = (\n id: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n store: Store<any, any, any>\n): void => {\n storeRegistry.set(id, store);\n};\n\n/**\n * Retrieves an existing store by its ID.\n *\n * @param id - The store identifier\n * @returns The store instance or undefined if not found\n */\nexport const getStore = <T = unknown>(id: string): T | undefined => {\n return storeRegistry.get(id) as T | undefined;\n};\n\n/**\n * Lists all registered store IDs.\n *\n * @returns Array of store IDs\n */\nexport const listStores = (): string[] => {\n return Array.from(storeRegistry.keys());\n};\n\n/**\n * Removes a store from the registry.\n *\n * @param id - The store identifier\n */\nexport const destroyStore = (id: string): void => {\n storeRegistry.delete(id);\n unregisterDevtoolsStore(id);\n};\n","/**\n * Internal utilities for the store module.\n * @internal\n */\n\n/**\n * Check if a value is a plain object (not array, null, Date, etc.).\n * @internal\n */\nexport const isPlainObject = (value: unknown): value is Record<string, unknown> => {\n return (\n value !== null && typeof value === 'object' && Object.getPrototypeOf(value) === Object.prototype\n );\n};\n\n/**\n * Deep clones an object. Used for deep reactivity support.\n * @internal\n */\nexport const deepClone = <T>(obj: T): T => {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(deepClone) as T;\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as T;\n }\n\n if (obj instanceof Map) {\n return new Map(Array.from(obj.entries()).map(([k, v]) => [k, deepClone(v)])) as T;\n }\n\n if (obj instanceof Set) {\n return new Set(Array.from(obj).map(deepClone)) as T;\n }\n\n const cloned = {} as T;\n for (const key of Object.keys(obj)) {\n (cloned as Record<string, unknown>)[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return cloned;\n};\n\n/**\n * Compares two values for deep equality.\n * @internal\n */\nexport const deepEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false;\n for (const [key, value] of a.entries()) {\n if (!b.has(key) || !deepEqual(value, b.get(key))) return false;\n }\n return true;\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false;\n for (const value of a.values()) {\n let found = false;\n for (const candidate of b.values()) {\n if (deepEqual(value, candidate)) {\n found = true;\n break;\n }\n }\n if (!found) return false;\n }\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, i) => deepEqual(item, b[i]));\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every((key) =>\n deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])\n );\n};\n\n/**\n * Detects if nested objects were mutated but the reference stayed the same.\n * Returns the keys where nested mutations were detected.\n * @internal\n */\nexport const detectNestedMutations = <S extends Record<string, unknown>>(\n before: S,\n after: S,\n signalValues: Map<keyof S, unknown>\n): Array<keyof S> => {\n const mutatedKeys: Array<keyof S> = [];\n\n for (const key of Object.keys(after) as Array<keyof S>) {\n const beforeValue = before[key];\n const afterValue = after[key];\n const signalValue = signalValues.get(key);\n\n // Check if it's the same reference but content changed\n if (\n signalValue === afterValue &&\n isPlainObject(beforeValue) &&\n isPlainObject(afterValue) &&\n !deepEqual(beforeValue, afterValue)\n ) {\n mutatedKeys.push(key);\n }\n }\n\n return mutatedKeys;\n};\n\n/** @internal Flag to enable/disable development warnings */\nexport const isDev = (() => {\n try {\n const globalProcess = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;\n // Default to dev mode unless explicitly set to production\n return !(typeof globalProcess !== 'undefined' && globalProcess.env?.NODE_ENV === 'production');\n } catch {\n return true;\n }\n})();\n","/**\n * Store creation logic.\n */\n\nimport {\n batch,\n computed,\n signal,\n untrack,\n type ReadonlySignal,\n type Signal,\n} from '../reactive/index';\nimport { notifyDevtoolsStateChange, registerDevtoolsStore } from './devtools';\nimport { applyPlugins } from './plugins';\nimport { getStore, hasStore, registerStore } from './registry';\nimport type { Getters, Store, StoreDefinition, StoreSubscriber } from './types';\nimport { deepClone, detectNestedMutations, isDev } from './utils';\n\n/**\n * Creates a reactive store with state, getters, and actions.\n *\n * @template S - State type\n * @template G - Getters type\n * @template A - Actions type\n * @param definition - Store definition\n * @returns The reactive store instance\n */\nexport const createStore = <\n S extends Record<string, unknown>,\n G extends Record<string, unknown> = Record<string, never>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n A extends Record<string, (...args: any[]) => any> = Record<string, never>,\n>(\n definition: StoreDefinition<S, G, A>\n): Store<S, G, A> => {\n const { id, state: stateFactory, getters = {} as Getters<S, G>, actions = {} as A } = definition;\n\n // Check for duplicate store IDs\n if (hasStore(id)) {\n console.warn(`bQuery store: Store \"${id}\" already exists. Returning existing instance.`);\n return getStore(id) as Store<S, G, A>;\n }\n\n // Create initial state\n const initialState = stateFactory();\n\n // Create signals for each state property\n const stateSignals = new Map<keyof S, Signal<unknown>>();\n for (const key of Object.keys(initialState) as Array<keyof S>) {\n stateSignals.set(key, signal(initialState[key]));\n }\n\n // Subscribers for $subscribe\n const subscribers: Array<StoreSubscriber<S>> = [];\n\n /**\n * Gets the current state.\n *\n * For subscriber notifications (where a plain object snapshot is needed),\n * this creates a shallow copy. For internal reads, use stateProxy directly.\n *\n * **Note:** Returns a shallow snapshot. Nested object mutations will NOT\n * trigger reactive updates. This differs from frameworks like Pinia that\n * use deep reactivity. To update nested state, replace the entire object.\n *\n * Uses `untrack()` to prevent accidental dependency tracking when called\n * from within reactive contexts (e.g., `effect()` or `computed()`).\n *\n * @internal\n */\n const getCurrentState = (): S =>\n untrack(() => {\n return { ...stateProxy };\n });\n\n /**\n * Notifies subscribers of state changes.\n * Short-circuits if there are no subscribers and devtools aren't active\n * to avoid unnecessary snapshot overhead.\n * @internal\n */\n const notifySubscribers = (): void => {\n // Early return if no subscribers and no devtools hook\n const hasDevtools =\n typeof window !== 'undefined' &&\n typeof window.__BQUERY_DEVTOOLS__?.onStateChange === 'function';\n if (subscribers.length === 0 && !hasDevtools) {\n return;\n }\n\n const currentState = getCurrentState();\n for (const callback of subscribers) {\n callback(currentState);\n }\n\n notifyDevtoolsStateChange(id, currentState);\n };\n\n /**\n * Cached state proxy that lazily reads signal values.\n * Uses a Proxy to avoid creating new objects on each access.\n *\n * **Note:** This returns a shallow snapshot of the state. Nested object\n * mutations will NOT trigger reactive updates. For nested reactivity,\n * replace the entire object or use signals for nested properties.\n *\n * @internal\n */\n const stateProxy = new Proxy({} as S, {\n get: (_, prop: string | symbol) => {\n const key = prop as keyof S;\n if (stateSignals.has(key)) {\n return stateSignals.get(key)!.value;\n }\n return undefined;\n },\n ownKeys: () => Array.from(stateSignals.keys()) as string[],\n getOwnPropertyDescriptor: (_, prop) => {\n if (stateSignals.has(prop as keyof S)) {\n return { enumerable: true, configurable: true };\n }\n return undefined;\n },\n has: (_, prop) => stateSignals.has(prop as keyof S),\n });\n\n // Create computed getters\n const getterComputed = new Map<keyof G, ReadonlySignal<unknown>>();\n\n // Build the store proxy\n const store = {} as Store<S, G, A>;\n\n // Define state properties with getters/setters\n for (const key of Object.keys(initialState) as Array<keyof S>) {\n Object.defineProperty(store, key, {\n get: () => stateSignals.get(key)!.value,\n set: (value: unknown) => {\n stateSignals.get(key)!.value = value;\n notifySubscribers();\n },\n enumerable: true,\n configurable: false,\n });\n }\n\n // Define getters as computed properties\n for (const key of Object.keys(getters) as Array<keyof G>) {\n const getterFn = getters[key];\n\n // Create computed that reads from state signals via proxy (more efficient)\n const computedGetter = computed(() => {\n const state = stateProxy;\n // For getter dependencies, pass a proxy that reads from computed getters\n const getterProxy = new Proxy({} as G, {\n get: (_, prop: string | symbol) => {\n const propKey = prop as keyof G;\n if (getterComputed.has(propKey)) {\n return getterComputed.get(propKey)!.value;\n }\n return undefined;\n },\n });\n return getterFn(state, getterProxy);\n });\n\n getterComputed.set(key, computedGetter as unknown as ReadonlySignal<unknown>);\n\n Object.defineProperty(store, key, {\n get: () => computedGetter.value,\n enumerable: true,\n configurable: false,\n });\n }\n\n // Bind actions to the store context\n for (const key of Object.keys(actions) as Array<keyof A>) {\n const actionFn = actions[key];\n\n // Wrap action to enable 'this' binding\n (store as Record<string, unknown>)[key as string] = function (...args: unknown[]) {\n // Create a context that allows 'this.property' access\n const context = new Proxy(store, {\n get: (target, prop) => {\n if (typeof prop === 'string' && stateSignals.has(prop as keyof S)) {\n return stateSignals.get(prop as keyof S)!.value;\n }\n return (target as Record<string, unknown>)[prop as string];\n },\n set: (target, prop, value) => {\n if (typeof prop === 'string' && stateSignals.has(prop as keyof S)) {\n stateSignals.get(prop as keyof S)!.value = value;\n notifySubscribers();\n return true;\n }\n // Allow non-state property assignments (e.g., temporary variables in actions)\n // by delegating to the target object rather than returning false\n return Reflect.set(target, prop, value);\n },\n });\n\n return actionFn.apply(context, args);\n };\n }\n\n // Add store utility methods\n Object.defineProperties(store, {\n $id: {\n value: id,\n writable: false,\n enumerable: false,\n },\n $reset: {\n value: () => {\n const fresh = stateFactory();\n batch(() => {\n for (const [key, sig] of stateSignals) {\n sig.value = fresh[key];\n }\n });\n notifySubscribers();\n },\n writable: false,\n enumerable: false,\n },\n $subscribe: {\n value: (callback: StoreSubscriber<S>) => {\n subscribers.push(callback);\n return () => {\n const index = subscribers.indexOf(callback);\n if (index > -1) subscribers.splice(index, 1);\n };\n },\n writable: false,\n enumerable: false,\n },\n $patch: {\n value: (partial: Partial<S> | ((state: S) => void)) => {\n batch(() => {\n if (typeof partial === 'function') {\n // Capture state before mutation for nested mutation detection\n const stateBefore = isDev ? deepClone(getCurrentState()) : null;\n const signalValuesBefore = isDev\n ? new Map(Array.from(stateSignals.entries()).map(([k, s]) => [k, s.value]))\n : null;\n\n // Mutation function\n const state = getCurrentState();\n partial(state);\n\n // Detect nested mutations in development mode\n if (isDev && stateBefore && signalValuesBefore) {\n const mutatedKeys = detectNestedMutations(stateBefore, state, signalValuesBefore);\n if (mutatedKeys.length > 0) {\n console.warn(\n `[bQuery store \"${id}\"] Nested mutation detected in $patch() for keys: ${mutatedKeys\n .map(String)\n .join(', ')}.\\n` +\n 'Nested object mutations do not trigger reactive updates because the store uses shallow reactivity.\\n' +\n 'To fix this, either:\\n' +\n ' 1. Replace the entire object: state.user = { ...state.user, name: \"New\" }\\n' +\n ' 2. Use $patchDeep() for automatic deep cloning\\n' +\n 'See: https://bquery.dev/guide/store#deep-reactivity'\n );\n }\n }\n\n for (const [key, value] of Object.entries(state) as Array<[keyof S, unknown]>) {\n if (stateSignals.has(key)) {\n stateSignals.get(key)!.value = value;\n }\n }\n } else {\n // Partial object\n for (const [key, value] of Object.entries(partial) as Array<[keyof S, unknown]>) {\n if (stateSignals.has(key)) {\n stateSignals.get(key)!.value = value;\n }\n }\n }\n });\n notifySubscribers();\n },\n writable: false,\n enumerable: false,\n },\n $patchDeep: {\n value: (partial: Partial<S> | ((state: S) => void)) => {\n batch(() => {\n if (typeof partial === 'function') {\n // Deep clone state before mutation to ensure new references\n const state = deepClone(getCurrentState());\n partial(state);\n\n for (const [key, value] of Object.entries(state) as Array<[keyof S, unknown]>) {\n if (stateSignals.has(key)) {\n stateSignals.get(key)!.value = value;\n }\n }\n } else {\n // Deep clone each value in partial to ensure new references\n for (const [key, value] of Object.entries(partial) as Array<[keyof S, unknown]>) {\n if (stateSignals.has(key)) {\n stateSignals.get(key)!.value = deepClone(value);\n }\n }\n }\n });\n notifySubscribers();\n },\n writable: false,\n enumerable: false,\n },\n $state: {\n get: () => getCurrentState(),\n enumerable: false,\n },\n });\n\n // Register store\n registerStore(id, store);\n\n // Apply plugins\n applyPlugins(store, definition);\n\n // Notify devtools\n registerDevtoolsStore(id, store);\n\n return store;\n};\n","/**\n * Mapping helpers for store state and actions.\n */\n\n/**\n * Maps store state properties to a reactive object for use in components.\n *\n * @param store - The store instance\n * @param keys - State keys to map\n * @returns Object with mapped properties\n */\nexport const mapState = <S extends Record<string, unknown>, K extends keyof S>(\n store: S,\n keys: K[]\n): Pick<S, K> => {\n const mapped = {} as Pick<S, K>;\n\n for (const key of keys) {\n Object.defineProperty(mapped, key, {\n get: () => store[key],\n enumerable: true,\n });\n }\n\n return mapped;\n};\n\n/**\n * Maps store getters to a reactive object for use in components.\n *\n * @param store - The store instance\n * @param keys - Getter keys to map\n * @returns Object with mapped getters\n */\nexport const mapGetters = <G extends Record<string, unknown>, K extends keyof G>(\n store: G,\n keys: K[]\n): Pick<G, K> => {\n const mapped = {} as Pick<G, K>;\n\n for (const key of keys) {\n Object.defineProperty(mapped, key, {\n get: () => store[key],\n enumerable: true,\n });\n }\n\n return mapped;\n};\n\n/**\n * Maps store actions to an object for easier destructuring.\n *\n * @param store - The store instance\n * @param keys - Action keys to map\n * @returns Object with mapped actions\n */\nexport const mapActions = <\n A extends Record<string, (...args: unknown[]) => unknown>,\n K extends keyof A,\n>(\n store: A,\n keys: K[]\n): Pick<A, K> => {\n const mapped = {} as Pick<A, K>;\n\n for (const key of keys) {\n (mapped as Record<string, unknown>)[key as string] = (...args: unknown[]) =>\n (store[key] as (...args: unknown[]) => unknown)(...args);\n }\n\n return mapped;\n};\n","/**\n * Store persistence helpers.\n */\n\nimport { createStore } from './create-store';\nimport type { Store, StoreDefinition } from './types';\n\n/**\n * Creates a store with automatic persistence to localStorage.\n *\n * @param definition - Store definition\n * @param storageKey - Optional custom storage key\n * @returns The reactive store instance\n */\nexport const createPersistedStore = <\n S extends Record<string, unknown>,\n G extends Record<string, unknown> = Record<string, never>,\n A extends Record<string, (...args: unknown[]) => unknown> = Record<string, never>,\n>(\n definition: StoreDefinition<S, G, A>,\n storageKey?: string\n): Store<S, G, A> => {\n const key = storageKey ?? `bquery-store-${definition.id}`;\n\n const originalStateFactory = definition.state;\n\n const wrappedDefinition: StoreDefinition<S, G, A> = {\n ...definition,\n state: () => {\n const defaultState = originalStateFactory();\n\n if (typeof window !== 'undefined') {\n try {\n const saved = localStorage.getItem(key);\n if (saved) {\n return { ...defaultState, ...JSON.parse(saved) } as S;\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return defaultState;\n },\n };\n\n const store = createStore(wrappedDefinition);\n\n // Subscribe to save changes\n store.$subscribe((state) => {\n if (typeof window !== 'undefined') {\n try {\n localStorage.setItem(key, JSON.stringify(state));\n } catch {\n // Ignore quota errors\n }\n }\n });\n\n return store;\n};\n"],"names":["ensureDevtools","registerDevtoolsStore","id","store","devtools","unregisterDevtoolsStore","notifyDevtoolsStateChange","state","plugins","registerPlugin","plugin","applyPlugins","options","extension","storeRegistry","hasStore","registerStore","getStore","listStores","destroyStore","isPlainObject","value","deepClone","obj","k","v","cloned","key","deepEqual","a","b","found","candidate","item","i","keysA","keysB","detectNestedMutations","before","after","signalValues","mutatedKeys","beforeValue","afterValue","isDev","globalProcess","createStore","definition","stateFactory","getters","actions","initialState","stateSignals","signal","subscribers","getCurrentState","untrack","stateProxy","notifySubscribers","hasDevtools","currentState","callback","_","prop","getterComputed","getterFn","computedGetter","computed","getterProxy","propKey","actionFn","args","context","target","fresh","batch","sig","index","partial","stateBefore","signalValuesBefore","s","mapState","keys","mapped","mapGetters","mapActions","createPersistedStore","storageKey","originalStateFactory","wrappedDefinition","defaultState","saved"],"mappings":"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"}
1
+ {"version":3,"file":"persisted-DHoi3uEs.js","sources":["../src/store/devtools.ts","../src/store/plugins.ts","../src/store/registry.ts","../src/store/utils.ts","../src/store/create-store.ts","../src/store/mapping.ts","../src/store/persisted.ts"],"sourcesContent":["/**\n * Devtools integration for stores.\n * @internal\n */\n\ndeclare global {\n interface Window {\n __BQUERY_DEVTOOLS__?: {\n stores: Map<string, unknown>;\n onStoreCreated?: (id: string, store: unknown) => void;\n onStateChange?: (id: string, state: unknown) => void;\n };\n }\n}\n\nexport type DevtoolsHook = {\n stores: Map<string, unknown>;\n onStoreCreated?: (id: string, store: unknown) => void;\n onStateChange?: (id: string, state: unknown) => void;\n};\n\nconst ensureDevtools = (): DevtoolsHook | undefined => {\n if (typeof window === 'undefined') return undefined;\n if (!window.__BQUERY_DEVTOOLS__) {\n window.__BQUERY_DEVTOOLS__ = { stores: new Map() };\n }\n return window.__BQUERY_DEVTOOLS__;\n};\n\nexport const registerDevtoolsStore = (id: string, store: unknown): void => {\n const devtools = ensureDevtools();\n if (!devtools) return;\n devtools.stores.set(id, store);\n devtools.onStoreCreated?.(id, store);\n};\n\nexport const unregisterDevtoolsStore = (id: string): void => {\n if (typeof window === 'undefined' || !window.__BQUERY_DEVTOOLS__) return;\n window.__BQUERY_DEVTOOLS__.stores.delete(id);\n};\n\nexport const notifyDevtoolsStateChange = (id: string, state: unknown): void => {\n if (typeof window === 'undefined') return;\n window.__BQUERY_DEVTOOLS__?.onStateChange?.(id, state);\n};\n","/**\n * Store plugins API.\n */\n\nimport type { Store, StoreDefinition, StorePlugin } from './types';\n\n/** @internal Registered plugins */\nconst plugins: StorePlugin[] = [];\n\n/**\n * Registers a plugin that extends all stores.\n *\n * @param plugin - The plugin function\n */\nexport const registerPlugin = (plugin: StorePlugin): void => {\n plugins.push(plugin);\n};\n\n/** @internal */\nexport const applyPlugins = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n store: Store<any, any, any>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: StoreDefinition<any, any, any>\n): void => {\n for (const plugin of plugins) {\n const extension = plugin({ store, options });\n if (extension) {\n Object.assign(store, extension);\n }\n }\n};\n","/**\n * Store registry utilities.\n */\n\nimport { unregisterDevtoolsStore } from './devtools';\nimport type { Store } from './types';\n\n/** @internal Registry of all stores for devtools */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst storeRegistry = new Map<string, Store<any, any, any>>();\n\n/** @internal */\nexport const hasStore = (id: string): boolean => storeRegistry.has(id);\n\n/** @internal */\nexport const registerStore = (\n id: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n store: Store<any, any, any>\n): void => {\n storeRegistry.set(id, store);\n};\n\n/**\n * Retrieves an existing store by its ID.\n *\n * @param id - The store identifier\n * @returns The store instance or undefined if not found\n */\nexport const getStore = <T = unknown>(id: string): T | undefined => {\n return storeRegistry.get(id) as T | undefined;\n};\n\n/**\n * Lists all registered store IDs.\n *\n * @returns Array of store IDs\n */\nexport const listStores = (): string[] => {\n return Array.from(storeRegistry.keys());\n};\n\n/**\n * Removes a store from the registry.\n *\n * @param id - The store identifier\n */\nexport const destroyStore = (id: string): void => {\n storeRegistry.delete(id);\n unregisterDevtoolsStore(id);\n};\n","/**\n * Internal utilities for the store module.\n * @internal\n */\n\n/**\n * Check if a value is a plain object (not array, null, Date, etc.).\n * @internal\n */\nexport const isPlainObject = (value: unknown): value is Record<string, unknown> => {\n return (\n value !== null && typeof value === 'object' && Object.getPrototypeOf(value) === Object.prototype\n );\n};\n\n/**\n * Deep clones an object. Used for deep reactivity support.\n * @internal\n */\nexport const deepClone = <T>(obj: T): T => {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(deepClone) as T;\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as T;\n }\n\n if (obj instanceof Map) {\n return new Map(Array.from(obj.entries()).map(([k, v]) => [k, deepClone(v)])) as T;\n }\n\n if (obj instanceof Set) {\n return new Set(Array.from(obj).map(deepClone)) as T;\n }\n\n const cloned = {} as T;\n for (const key of Object.keys(obj)) {\n (cloned as Record<string, unknown>)[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return cloned;\n};\n\n/**\n * Compares two values for deep equality.\n * @internal\n */\nexport const deepEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false;\n for (const [key, value] of a.entries()) {\n if (!b.has(key) || !deepEqual(value, b.get(key))) return false;\n }\n return true;\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false;\n for (const value of a.values()) {\n let found = false;\n for (const candidate of b.values()) {\n if (deepEqual(value, candidate)) {\n found = true;\n break;\n }\n }\n if (!found) return false;\n }\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, i) => deepEqual(item, b[i]));\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every((key) =>\n deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])\n );\n};\n\n/**\n * Detects if nested objects were mutated but the reference stayed the same.\n * Returns the keys where nested mutations were detected.\n * @internal\n */\nexport const detectNestedMutations = <S extends Record<string, unknown>>(\n before: S,\n after: S,\n signalValues: Map<keyof S, unknown>\n): Array<keyof S> => {\n const mutatedKeys: Array<keyof S> = [];\n\n for (const key of Object.keys(after) as Array<keyof S>) {\n const beforeValue = before[key];\n const afterValue = after[key];\n const signalValue = signalValues.get(key);\n\n // Check if it's the same reference but content changed\n if (\n signalValue === afterValue &&\n isPlainObject(beforeValue) &&\n isPlainObject(afterValue) &&\n !deepEqual(beforeValue, afterValue)\n ) {\n mutatedKeys.push(key);\n }\n }\n\n return mutatedKeys;\n};\n\n/** @internal Flag to enable/disable development warnings */\nexport const isDev = (() => {\n try {\n const globalProcess = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;\n // Default to dev mode unless explicitly set to production\n return !(typeof globalProcess !== 'undefined' && globalProcess.env?.NODE_ENV === 'production');\n } catch {\n return true;\n }\n})();\n","/**\n * Store creation logic.\n */\n\nimport {\n batch,\n computed,\n signal,\n untrack,\n type ReadonlySignal,\n type Signal,\n} from '../reactive/index';\nimport { notifyDevtoolsStateChange, registerDevtoolsStore } from './devtools';\nimport { applyPlugins } from './plugins';\nimport { getStore, hasStore, registerStore } from './registry';\nimport type { Getters, Store, StoreDefinition, StoreSubscriber } from './types';\nimport { deepClone, detectNestedMutations, isDev } from './utils';\n\n/**\n * Creates a reactive store with state, getters, and actions.\n *\n * @template S - State type\n * @template G - Getters type\n * @template A - Actions type\n * @param definition - Store definition\n * @returns The reactive store instance\n */\nexport const createStore = <\n S extends Record<string, unknown>,\n G extends Record<string, unknown> = Record<string, never>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n A extends Record<string, (...args: any[]) => any> = Record<string, never>,\n>(\n definition: StoreDefinition<S, G, A>\n): Store<S, G, A> => {\n const { id, state: stateFactory, getters = {} as Getters<S, G>, actions = {} as A } = definition;\n\n // Check for duplicate store IDs\n if (hasStore(id)) {\n console.warn(`bQuery store: Store \"${id}\" already exists. Returning existing instance.`);\n return getStore(id) as Store<S, G, A>;\n }\n\n // Create initial state\n const initialState = stateFactory();\n\n // Create signals for each state property\n const stateSignals = new Map<keyof S, Signal<unknown>>();\n for (const key of Object.keys(initialState) as Array<keyof S>) {\n stateSignals.set(key, signal(initialState[key]));\n }\n\n // Subscribers for $subscribe\n const subscribers: Array<StoreSubscriber<S>> = [];\n\n /**\n * Gets the current state.\n *\n * For subscriber notifications (where a plain object snapshot is needed),\n * this creates a shallow copy. For internal reads, use stateProxy directly.\n *\n * **Note:** Returns a shallow snapshot. Nested object mutations will NOT\n * trigger reactive updates. This differs from frameworks like Pinia that\n * use deep reactivity. To update nested state, replace the entire object.\n *\n * Uses `untrack()` to prevent accidental dependency tracking when called\n * from within reactive contexts (e.g., `effect()` or `computed()`).\n *\n * @internal\n */\n const getCurrentState = (): S =>\n untrack(() => {\n return { ...stateProxy };\n });\n\n /**\n * Notifies subscribers of state changes.\n * Short-circuits if there are no subscribers and devtools aren't active\n * to avoid unnecessary snapshot overhead.\n * @internal\n */\n const notifySubscribers = (): void => {\n // Early return if no subscribers and no devtools hook\n const hasDevtools =\n typeof window !== 'undefined' &&\n typeof window.__BQUERY_DEVTOOLS__?.onStateChange === 'function';\n if (subscribers.length === 0 && !hasDevtools) {\n return;\n }\n\n const currentState = getCurrentState();\n for (const callback of subscribers) {\n callback(currentState);\n }\n\n notifyDevtoolsStateChange(id, currentState);\n };\n\n /**\n * Cached state proxy that lazily reads signal values.\n * Uses a Proxy to avoid creating new objects on each access.\n *\n * **Note:** This returns a shallow snapshot of the state. Nested object\n * mutations will NOT trigger reactive updates. For nested reactivity,\n * replace the entire object or use signals for nested properties.\n *\n * @internal\n */\n const stateProxy = new Proxy({} as S, {\n get: (_, prop: string | symbol) => {\n const key = prop as keyof S;\n if (stateSignals.has(key)) {\n return stateSignals.get(key)!.value;\n }\n return undefined;\n },\n ownKeys: () => Array.from(stateSignals.keys()) as string[],\n getOwnPropertyDescriptor: (_, prop) => {\n if (stateSignals.has(prop as keyof S)) {\n return { enumerable: true, configurable: true };\n }\n return undefined;\n },\n has: (_, prop) => stateSignals.has(prop as keyof S),\n });\n\n // Create computed getters\n const getterComputed = new Map<keyof G, ReadonlySignal<unknown>>();\n\n // Build the store proxy\n const store = {} as Store<S, G, A>;\n\n // Define state properties with getters/setters\n for (const key of Object.keys(initialState) as Array<keyof S>) {\n Object.defineProperty(store, key, {\n get: () => stateSignals.get(key)!.value,\n set: (value: unknown) => {\n stateSignals.get(key)!.value = value;\n notifySubscribers();\n },\n enumerable: true,\n configurable: false,\n });\n }\n\n // Define getters as computed properties\n for (const key of Object.keys(getters) as Array<keyof G>) {\n const getterFn = getters[key];\n\n // Create computed that reads from state signals via proxy (more efficient)\n const computedGetter = computed(() => {\n const state = stateProxy;\n // For getter dependencies, pass a proxy that reads from computed getters\n const getterProxy = new Proxy({} as G, {\n get: (_, prop: string | symbol) => {\n const propKey = prop as keyof G;\n if (getterComputed.has(propKey)) {\n return getterComputed.get(propKey)!.value;\n }\n return undefined;\n },\n });\n return getterFn(state, getterProxy);\n });\n\n getterComputed.set(key, computedGetter as unknown as ReadonlySignal<unknown>);\n\n Object.defineProperty(store, key, {\n get: () => computedGetter.value,\n enumerable: true,\n configurable: false,\n });\n }\n\n // Bind actions to the store context\n for (const key of Object.keys(actions) as Array<keyof A>) {\n const actionFn = actions[key];\n\n // Wrap action to enable 'this' binding\n (store as Record<string, unknown>)[key as string] = function (...args: unknown[]) {\n // Create a context that allows 'this.property' access\n const context = new Proxy(store, {\n get: (target, prop) => {\n if (typeof prop === 'string' && stateSignals.has(prop as keyof S)) {\n return stateSignals.get(prop as keyof S)!.value;\n }\n return (target as Record<string, unknown>)[prop as string];\n },\n set: (target, prop, value) => {\n if (typeof prop === 'string' && stateSignals.has(prop as keyof S)) {\n stateSignals.get(prop as keyof S)!.value = value;\n notifySubscribers();\n return true;\n }\n // Allow non-state property assignments (e.g., temporary variables in actions)\n // by delegating to the target object rather than returning false\n return Reflect.set(target, prop, value);\n },\n });\n\n return actionFn.apply(context, args);\n };\n }\n\n // Add store utility methods\n Object.defineProperties(store, {\n $id: {\n value: id,\n writable: false,\n enumerable: false,\n },\n $reset: {\n value: () => {\n const fresh = stateFactory();\n batch(() => {\n for (const [key, sig] of stateSignals) {\n sig.value = fresh[key];\n }\n });\n notifySubscribers();\n },\n writable: false,\n enumerable: false,\n },\n $subscribe: {\n value: (callback: StoreSubscriber<S>) => {\n subscribers.push(callback);\n return () => {\n const index = subscribers.indexOf(callback);\n if (index > -1) subscribers.splice(index, 1);\n };\n },\n writable: false,\n enumerable: false,\n },\n $patch: {\n value: (partial: Partial<S> | ((state: S) => void)) => {\n batch(() => {\n if (typeof partial === 'function') {\n // Capture state before mutation for nested mutation detection\n const stateBefore = isDev ? deepClone(getCurrentState()) : null;\n const signalValuesBefore = isDev\n ? new Map(Array.from(stateSignals.entries()).map(([k, s]) => [k, s.value]))\n : null;\n\n // Mutation function\n const state = getCurrentState();\n partial(state);\n\n // Detect nested mutations in development mode\n if (isDev && stateBefore && signalValuesBefore) {\n const mutatedKeys = detectNestedMutations(stateBefore, state, signalValuesBefore);\n if (mutatedKeys.length > 0) {\n console.warn(\n `[bQuery store \"${id}\"] Nested mutation detected in $patch() for keys: ${mutatedKeys\n .map(String)\n .join(', ')}.\\n` +\n 'Nested object mutations do not trigger reactive updates because the store uses shallow reactivity.\\n' +\n 'To fix this, either:\\n' +\n ' 1. Replace the entire object: state.user = { ...state.user, name: \"New\" }\\n' +\n ' 2. Use $patchDeep() for automatic deep cloning\\n' +\n 'See: https://bquery.dev/guide/store#deep-reactivity'\n );\n }\n }\n\n for (const [key, value] of Object.entries(state) as Array<[keyof S, unknown]>) {\n if (stateSignals.has(key)) {\n stateSignals.get(key)!.value = value;\n }\n }\n } else {\n // Partial object\n for (const [key, value] of Object.entries(partial) as Array<[keyof S, unknown]>) {\n if (stateSignals.has(key)) {\n stateSignals.get(key)!.value = value;\n }\n }\n }\n });\n notifySubscribers();\n },\n writable: false,\n enumerable: false,\n },\n $patchDeep: {\n value: (partial: Partial<S> | ((state: S) => void)) => {\n batch(() => {\n if (typeof partial === 'function') {\n // Deep clone state before mutation to ensure new references\n const state = deepClone(getCurrentState());\n partial(state);\n\n for (const [key, value] of Object.entries(state) as Array<[keyof S, unknown]>) {\n if (stateSignals.has(key)) {\n stateSignals.get(key)!.value = value;\n }\n }\n } else {\n // Deep clone each value in partial to ensure new references\n for (const [key, value] of Object.entries(partial) as Array<[keyof S, unknown]>) {\n if (stateSignals.has(key)) {\n stateSignals.get(key)!.value = deepClone(value);\n }\n }\n }\n });\n notifySubscribers();\n },\n writable: false,\n enumerable: false,\n },\n $state: {\n get: () => getCurrentState(),\n enumerable: false,\n },\n });\n\n // Register store\n registerStore(id, store);\n\n // Apply plugins\n applyPlugins(store, definition);\n\n // Notify devtools\n registerDevtoolsStore(id, store);\n\n return store;\n};\n","/**\n * Mapping helpers for store state and actions.\n */\n\n/**\n * Maps store state properties to a reactive object for use in components.\n *\n * @param store - The store instance\n * @param keys - State keys to map\n * @returns Object with mapped properties\n */\nexport const mapState = <S extends Record<string, unknown>, K extends keyof S>(\n store: S,\n keys: K[]\n): Pick<S, K> => {\n const mapped = {} as Pick<S, K>;\n\n for (const key of keys) {\n Object.defineProperty(mapped, key, {\n get: () => store[key],\n enumerable: true,\n });\n }\n\n return mapped;\n};\n\n/**\n * Maps store getters to a reactive object for use in components.\n *\n * @param store - The store instance\n * @param keys - Getter keys to map\n * @returns Object with mapped getters\n */\nexport const mapGetters = <G extends Record<string, unknown>, K extends keyof G>(\n store: G,\n keys: K[]\n): Pick<G, K> => {\n const mapped = {} as Pick<G, K>;\n\n for (const key of keys) {\n Object.defineProperty(mapped, key, {\n get: () => store[key],\n enumerable: true,\n });\n }\n\n return mapped;\n};\n\n/**\n * Maps store actions to an object for easier destructuring.\n *\n * @param store - The store instance\n * @param keys - Action keys to map\n * @returns Object with mapped actions\n */\nexport const mapActions = <\n A extends Record<string, (...args: unknown[]) => unknown>,\n K extends keyof A,\n>(\n store: A,\n keys: K[]\n): Pick<A, K> => {\n const mapped = {} as Pick<A, K>;\n\n for (const key of keys) {\n (mapped as Record<string, unknown>)[key as string] = (...args: unknown[]) =>\n (store[key] as (...args: unknown[]) => unknown)(...args);\n }\n\n return mapped;\n};\n","/**\n * Store persistence helpers.\n */\n\nimport { createStore } from './create-store';\nimport type { Store, StoreDefinition } from './types';\n\n/**\n * Creates a store with automatic persistence to localStorage.\n *\n * @param definition - Store definition\n * @param storageKey - Optional custom storage key\n * @returns The reactive store instance\n */\nexport const createPersistedStore = <\n S extends Record<string, unknown>,\n G extends Record<string, unknown> = Record<string, never>,\n A extends Record<string, (...args: unknown[]) => unknown> = Record<string, never>,\n>(\n definition: StoreDefinition<S, G, A>,\n storageKey?: string\n): Store<S, G, A> => {\n const key = storageKey ?? `bquery-store-${definition.id}`;\n\n const originalStateFactory = definition.state;\n\n const wrappedDefinition: StoreDefinition<S, G, A> = {\n ...definition,\n state: () => {\n const defaultState = originalStateFactory();\n\n if (typeof window !== 'undefined') {\n try {\n const saved = localStorage.getItem(key);\n if (saved) {\n return { ...defaultState, ...JSON.parse(saved) } as S;\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return defaultState;\n },\n };\n\n const store = createStore(wrappedDefinition);\n\n // Subscribe to save changes\n store.$subscribe((state) => {\n if (typeof window !== 'undefined') {\n try {\n localStorage.setItem(key, JSON.stringify(state));\n } catch {\n // Ignore quota errors\n }\n }\n });\n\n return store;\n};\n"],"names":["ensureDevtools","registerDevtoolsStore","id","store","devtools","unregisterDevtoolsStore","notifyDevtoolsStateChange","state","plugins","registerPlugin","plugin","applyPlugins","options","extension","storeRegistry","hasStore","registerStore","getStore","listStores","destroyStore","isPlainObject","value","deepClone","obj","k","v","cloned","key","deepEqual","a","b","found","candidate","item","i","keysA","keysB","detectNestedMutations","before","after","signalValues","mutatedKeys","beforeValue","afterValue","isDev","globalProcess","createStore","definition","stateFactory","getters","actions","initialState","stateSignals","signal","subscribers","getCurrentState","untrack","stateProxy","notifySubscribers","hasDevtools","currentState","callback","_","prop","getterComputed","getterFn","computedGetter","computed","getterProxy","propKey","actionFn","args","context","target","fresh","batch","sig","index","partial","stateBefore","signalValuesBefore","s","mapState","keys","mapped","mapGetters","mapActions","createPersistedStore","storageKey","originalStateFactory","wrappedDefinition","defaultState","saved"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/platform/storage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEvC;;;;OAIG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC3B;AAuDD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA0ED;;GAEG;AACH,eAAO,MAAM,OAAO;IAClB;;;OAGG;aACM,cAAc;IAIvB;;;OAGG;eACQ,cAAc;IAIzB;;;;OAIG;uBACgB,gBAAgB,GAAG,cAAc;CAGrD,CAAC"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/platform/storage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEvC;;;;OAIG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC3B;AA8DD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA0ED;;GAEG;AACH,eAAO,MAAM,OAAO;IAClB;;;OAGG;aACM,cAAc;IAIvB;;;OAGG;eACQ,cAAc;IAIzB;;;;OAIG;uBACgB,gBAAgB,GAAG,cAAc;CAGrD,CAAC"}
@@ -1,4 +1,4 @@
1
- class d {
1
+ class h {
2
2
  constructor(e) {
3
3
  this.bucketName = e, this.dbPromise = null, this.storeName = "blobs";
4
4
  }
@@ -40,10 +40,10 @@ const y = {
40
40
  * @returns Bucket instance for blob operations
41
41
  */
42
42
  async open(r) {
43
- return new d(r);
43
+ return new h(r);
44
44
  }
45
45
  };
46
- class h {
46
+ class d {
47
47
  constructor(e) {
48
48
  this.cache = e;
49
49
  }
@@ -83,7 +83,7 @@ const m = {
83
83
  if (!this.isSupported())
84
84
  throw new Error("bQuery: Cache Storage API not supported");
85
85
  const e = await caches.open(r);
86
- return new h(e);
86
+ return new d(e);
87
87
  },
88
88
  /**
89
89
  * Delete a named cache.
@@ -157,7 +157,12 @@ class c {
157
157
  this.storage.clear();
158
158
  }
159
159
  async keys() {
160
- return Object.keys(this.storage);
160
+ const e = [];
161
+ for (let t = 0; t < this.storage.length; t++) {
162
+ const s = this.storage.key(t);
163
+ s !== null && e.push(s);
164
+ }
165
+ return e;
161
166
  }
162
167
  }
163
168
  class l extends c {
@@ -212,7 +217,7 @@ class w {
212
217
  return (await this.withStore("readonly", (t) => t.getAllKeys())).map((t) => String(t));
213
218
  }
214
219
  }
215
- const b = {
220
+ const g = {
216
221
  /**
217
222
  * Create a localStorage adapter.
218
223
  * @returns StorageAdapter wrapping localStorage
@@ -240,6 +245,6 @@ export {
240
245
  y as buckets,
241
246
  m as cache,
242
247
  S as notifications,
243
- b as storage
248
+ g as storage
244
249
  };
245
250
  //# sourceMappingURL=platform.es.mjs.map
@@ -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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"}