{"version":3,"sources":["../src/config/types.ts","../src/config/constants.ts","../src/utils/cache-helpers.ts","../src/utils/hash-generator.ts","../src/config/defaults.ts","../src/config/config.ts","../src/config/index.ts","../src/core/register-sw.ts","../src/core/errors.ts","../src/core/cache-manager.ts","../src/core/version-manager.ts","../src/core/asset-loader.ts","../src/index.ts","../src/strategies/cache-first.ts","../src/strategies/network-first.ts","../src/strategies/stale-while-revalidate.ts","../src/init.ts"],"names":["AssetType","ServiceWorkerMessageType","getDefaultAssetCacheConfig","init_config","CacheErrorCode","CacheManagerState","AssetLoaderState","networkResponse","AssetLoader","VersionManager","registerServiceWorker","mergeAssetCacheConfig"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Asset Cache Type Definitions\n * Centralized type definitions for the entire asset cache system\n */\n\n// ============================================================================\n// CORE ASSET TYPES\n// ============================================================================\n\n/**\n * Asset types that can be cached\n */\nexport enum AssetType {\n  IMAGE = \"image\",\n  VIDEO = \"video\",\n  FONT = \"font\",\n  AUDIO = \"audio\",\n  OTHER = \"other\",\n}\n\n// ============================================================================\n// CACHE OPERATION TYPES\n// ============================================================================\n\n/**\n * Options for asset cache operations\n */\nexport interface CacheOptions {\n  ttl?: number; // Time to live in seconds\n  revalidate?: boolean; // Whether to revalidate on access\n  tags?: string[]; // Cache tags for invalidation\n  priority?: \"high\" | \"medium\" | \"low\"; // Priority for preloading\n}\n\n/**\n * Cache entry with metadata\n */\nexport interface CacheEntry<T> {\n  data: T;\n  timestamp: number;\n  expires?: number;\n  type: AssetType;\n  tags?: string[];\n  version?: string;\n}\n\n/**\n * Result of a cache operation\n */\nexport interface CacheResult<T> {\n  success: boolean;\n  data?: T;\n  fromCache: boolean;\n  error?: Error;\n}\n\n/**\n * Asset metadata for cache manifest\n */\nexport interface AssetMetadata {\n  url: string;\n  type: AssetType;\n  version: string;\n  lastModified: string;\n  size?: number;\n  tags?: string[];\n}\n\n/**\n * Cache manifest structure\n */\nexport interface CacheManifest {\n  version: string;\n  generatedAt: string;\n  assets: Record<string, AssetMetadata>;\n}\n\n// ============================================================================\n// SERVICE WORKER TYPES\n// ============================================================================\n\n/**\n * Service worker message types\n */\nexport enum ServiceWorkerMessageType {\n  CACHE_ASSET = \"CACHE_ASSET\",\n  INVALIDATE_ASSET = \"INVALIDATE_ASSET\",\n  INVALIDATE_TAG = \"INVALIDATE_TAG\",\n  CLEAR_CACHE = \"CLEAR_CACHE\",\n  UPDATE_MANIFEST = \"UPDATE_MANIFEST\",\n  CHECK_ASSET = \"CHECK_ASSET\",\n}\n\n// Service Worker Global Scope Types (simplified to avoid DOM conflicts)\nexport interface ExtendableEvent extends Event {\n  waitUntil(promise: Promise<any>): void;\n}\n\nexport interface FetchEvent extends ExtendableEvent {\n  request: Request;\n  respondWith(response: Promise<Response> | Response): void;\n}\n\nexport interface ExtendableMessageEvent extends ExtendableEvent {\n  data: any;\n  source: Client | MessagePort | ServiceWorker | null;\n}\n\nexport interface ServiceWorkerGlobalScope {\n  caches: CacheStorage;\n  clients: Clients;\n  registration: ServiceWorkerRegistration;\n  location: Location;\n  addEventListener(\n    type: \"install\",\n    listener: (event: ExtendableEvent) => void\n  ): void;\n  addEventListener(\n    type: \"activate\",\n    listener: (event: ExtendableEvent) => void\n  ): void;\n  addEventListener(type: \"fetch\", listener: (event: FetchEvent) => void): void;\n  addEventListener(\n    type: \"message\",\n    listener: (event: ExtendableMessageEvent) => void\n  ): void;\n  skipWaiting(): Promise<void>;\n}\n\nexport interface Client {\n  id: string;\n  type: \"window\" | \"worker\" | \"sharedworker\";\n  url: string;\n  postMessage(message: any, transfer?: Transferable[]): void;\n}\n\nexport interface Clients {\n  get(id: string): Promise<Client | undefined>;\n  matchAll(options?: ClientQueryOptions): Promise<Client[]>;\n  openWindow(url: string): Promise<WindowClient | null>;\n  claim(): Promise<void>;\n}\n\nexport interface ClientQueryOptions {\n  includeUncontrolled?: boolean;\n  type?: \"window\" | \"worker\" | \"sharedworker\" | \"all\";\n}\n\nexport interface WindowClient extends Client {\n  focused: boolean;\n  visibilityState: \"hidden\" | \"visible\" | \"prerender\" | \"unloaded\";\n  focus(): Promise<WindowClient>;\n  navigate(url: string): Promise<WindowClient | null>;\n}\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Asset Cache Configuration Interface\n * Simplified configuration interface containing only implemented features\n */\nexport interface AssetCacheConfig {\n  /** Enable or disable the asset cache system */\n  enabled?: boolean;\n  /** Cache version for invalidation */\n  version?: string;\n  /** Enable debug logging */\n  debug?: boolean;\n  /**\n   * Name of the cache storage (used with browser Cache API)\n   * Should be a unique identifier for your application's cache\n   * Examples: \"my-app-cache-v1\", \"storefront-assets\", \"asset-cache-prod\"\n   */\n  storageName?: string;\n  /** Maximum cache size in MB */\n  maxSize?: number;\n  /** Maximum age for cached assets in seconds */\n  maxAge?: number;\n  /** Enable service worker for caching */\n  serviceWorkerEnabled?: boolean;\n  /** Service worker file path */\n  serviceWorkerPath?: string;\n  /** Cache manifest file path */\n  manifestPath?: string;\n}\n\n/**\n * Asset loader configuration\n */\nexport interface AssetLoaderConfig {\n  cacheName?: string;\n  defaultTTL?: number;\n  maxSize?: number; // Maximum size in bytes for cacheable assets\n  enableServiceWorker?: boolean;\n  manifestPath?: string;\n  debug?: boolean;\n}\n","/**\n * Constants for the asset caching module\n * This file contains all constant values used throughout the asset cache system\n */\n\n// ============================================================================\n// CACHE CONFIGURATION CONSTANTS\n// ============================================================================\n\n/**\n * Default cache name for the Cache Storage API\n */\nexport const DEFAULT_CACHE_NAME = \"asset-cache-v1\";\n\n/**\n * Default time to live for cached assets (in seconds)\n * 7 days\n */\nexport const DEFAULT_CACHE_TTL = 7 * 24 * 60 * 60;\n\n/**\n * Maximum size for cacheable assets (in bytes)\n * 50MB\n */\nexport const MAX_CACHEABLE_SIZE = 50 * 1024 * 1024;\n\n/**\n * Path to the cache manifest file\n */\nexport const CACHE_MANIFEST_PATH = \"/manifest.json\";\n\n// ============================================================================\n// SERVICE WORKER CONSTANTS\n// ============================================================================\n\n/**\n * Default service worker scope\n */\nexport const DEFAULT_SW_SCOPE = \"/\";\n\n// ============================================================================\n// CACHE STRATEGY MAPPINGS\n// ============================================================================\n\n/**\n * Asset types that should use a cache-first strategy\n * These are typically static assets that don't change frequently\n */\nexport const CACHE_FIRST_TYPES = [\n  \"image/jpeg\",\n  \"image/png\",\n  \"image/webp\",\n  \"image/gif\",\n  \"image/svg+xml\",\n  \"font/woff\",\n  \"font/woff2\",\n  \"font/ttf\",\n  \"font/otf\",\n];\n\n/**\n * Asset types that should use a network-first strategy\n * These are typically large media files that benefit from fresh content\n */\nexport const NETWORK_FIRST_TYPES = [\n  \"video/mp4\",\n  \"video/webm\",\n  \"audio/mpeg\",\n  \"audio/ogg\",\n];\n\n/**\n * Asset types that should use a stale-while-revalidate strategy\n * These are assets that can be served stale while being updated in background\n */\nexport const STALE_WHILE_REVALIDATE_TYPES = [\n  \"application/javascript\",\n  \"text/css\",\n  \"application/json\",\n];\n\n// ============================================================================\n// FILE TYPE MAPPINGS\n// ============================================================================\n\n/**\n * File extensions to MIME type mapping\n * Used to determine the correct content type for cached assets\n */\nexport const FILE_EXTENSION_TO_ASSET_TYPE: Record<string, string> = {\n  // Images\n  jpg: \"image/jpeg\",\n  jpeg: \"image/jpeg\",\n  png: \"image/png\",\n  gif: \"image/gif\",\n  webp: \"image/webp\",\n  svg: \"image/svg+xml\",\n  ico: \"image/x-icon\",\n  avif: \"image/avif\",\n  bmp: \"image/bmp\",\n\n  // Fonts\n  woff: \"font/woff\",\n  woff2: \"font/woff2\",\n  ttf: \"font/ttf\",\n  otf: \"font/otf\",\n  eot: \"application/vnd.ms-fontobject\",\n\n  // Videos\n  mp4: \"video/mp4\",\n  webm: \"video/webm\",\n  ogg: \"video/ogg\",\n  avi: \"video/x-msvideo\",\n  mov: \"video/quicktime\",\n\n  // Audio\n  mp3: \"audio/mpeg\",\n  wav: \"audio/wav\",\n  oga: \"audio/ogg\",\n  flac: \"audio/flac\",\n  aac: \"audio/aac\",\n\n  // Scripts and Styles\n  js: \"application/javascript\",\n  mjs: \"application/javascript\",\n  css: \"text/css\",\n  json: \"application/json\",\n\n  // Documents\n  pdf: \"application/pdf\",\n  txt: \"text/plain\",\n  html: \"text/html\",\n  xml: \"application/xml\",\n};\n","/**\n * Utility functions for cache operations\n */\n\nimport { FILE_EXTENSION_TO_ASSET_TYPE } from \"../config/constants\";\nimport { AssetType, CacheEntry } from \"../config/types\";\n\n/**\n * Determine the asset type from a URL or content type\n * @param url URL of the asset\n * @param contentType Optional content type\n * @returns Asset type\n */\nexport function determineAssetType(\n  url: string,\n  contentType?: string\n): AssetType {\n  // If content type is provided, use it to determine asset type\n  if (contentType) {\n    if (contentType.startsWith(\"image/\")) {\n      return AssetType.IMAGE;\n    } else if (contentType.startsWith(\"video/\")) {\n      return AssetType.VIDEO;\n    } else if (\n      contentType.startsWith(\"font/\") ||\n      contentType === \"application/font-woff\" ||\n      contentType === \"application/font-woff2\"\n    ) {\n      return AssetType.FONT;\n    } else if (contentType.startsWith(\"audio/\")) {\n      return AssetType.AUDIO;\n    }\n  }\n\n  // Otherwise, determine from URL extension\n  const extension = url.split(\".\").pop()?.toLowerCase();\n  if (!extension) {\n    return AssetType.OTHER;\n  }\n\n  const mimeType = FILE_EXTENSION_TO_ASSET_TYPE[extension];\n  if (!mimeType) {\n    return AssetType.OTHER;\n  }\n\n  if (mimeType.startsWith(\"image/\")) {\n    return AssetType.IMAGE;\n  } else if (mimeType.startsWith(\"video/\")) {\n    return AssetType.VIDEO;\n  } else if (mimeType.startsWith(\"font/\")) {\n    return AssetType.FONT;\n  } else if (mimeType.startsWith(\"audio/\")) {\n    return AssetType.AUDIO;\n  }\n\n  return AssetType.OTHER;\n}\n\n/**\n * Check if an asset should be cached based on its type and size\n * @param url URL of the asset\n * @param size Size of the asset in bytes\n * @param contentType Optional content type\n * @param maxSize Maximum size for cacheable assets\n * @returns Whether the asset should be cached\n */\nexport function shouldCacheAsset(\n  url: string,\n  size: number,\n  contentType?: string,\n  maxSize = Infinity\n): boolean {\n  // Don't cache assets that are too large\n  if (size > maxSize) {\n    return false;\n  }\n\n  // Don't cache assets from external domains unless explicitly allowed\n  try {\n    const urlObj = new URL(url, window.location.origin);\n    if (urlObj.origin !== window.location.origin) {\n      // Check if the domain is in the allowed list\n      // This would be implemented based on your configuration\n      // For now, we'll allow all domains\n      // return isAllowedExternalDomain(urlObj.hostname);\n    }\n  } catch (error) {\n    return false;\n  }\n\n  // Determine asset type\n  const assetType = determineAssetType(url, contentType);\n\n  // Cache based on asset type\n  switch (assetType) {\n    case AssetType.IMAGE:\n    case AssetType.FONT:\n      return true;\n    case AssetType.VIDEO:\n    case AssetType.AUDIO:\n      // Only cache videos and audio if they're not too large\n      return size < maxSize / 2;\n    case AssetType.OTHER:\n    default:\n      // Don't cache other asset types by default\n      return false;\n  }\n}\n\n/**\n * Create a cache entry for an asset\n * @param data Asset data\n * @param url URL of the asset\n * @param contentType Optional content type\n * @param options Cache options\n * @returns Cache entry\n */\nexport function createCacheEntry<T>(\n  data: T,\n  url: string,\n  contentType?: string,\n  options?: {\n    ttl?: number;\n    tags?: string[];\n    version?: string;\n  }\n): CacheEntry<T> {\n  const now = Date.now();\n  const assetType = determineAssetType(url, contentType);\n\n  return {\n    data,\n    timestamp: now,\n    expires: options?.ttl ? now + options.ttl * 1000 : undefined,\n    type: assetType,\n    tags: options?.tags,\n    version: options?.version,\n  };\n}\n\n/**\n * Check if a cache entry has expired\n * @param entry Cache entry\n * @returns Whether the entry has expired\n */\nexport function hasExpired(entry: CacheEntry<any>): boolean {\n  return !!entry.expires && entry.expires < Date.now();\n}\n\n/**\n * Format a size in bytes to a human-readable string\n * @param bytes Size in bytes\n * @returns Human-readable size string\n */\nexport function formatSize(bytes: number): string {\n  if (bytes < 1024) {\n    return `${bytes} B`;\n  } else if (bytes < 1024 * 1024) {\n    return `${(bytes / 1024).toFixed(2)} KB`;\n  } else if (bytes < 1024 * 1024 * 1024) {\n    return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n  } else {\n    return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n  }\n}\n\n/**\n * Log a debug message if debug mode is enabled\n * @param message Message to log\n * @param args Additional arguments\n */\nexport function debugLog(message: string, ...args: any[]): void {\n  // Simple debug logging - can be controlled by the configuration\n  // In development, you can enable it via localStorage for debugging\n  if (\n    typeof localStorage !== \"undefined\" &&\n    localStorage.getItem(\"DEBUG_ASSET_CACHE\") === \"true\"\n  ) {\n    console.log(`[AssetCache] ${message}`, ...args);\n  }\n}\n","/**\n * Utility functions for generating content hashes\n */\n\n/**\n * Generate a simple hash from a string\n * @param str String to hash\n * @returns Hash string\n */\nexport function generateSimpleHash(str: string): string {\n  let hash = 0;\n  if (str.length === 0) return hash.toString(16);\n\n  for (let i = 0; i < str.length; i++) {\n    const char = str.charCodeAt(i);\n    hash = (hash << 5) - hash + char;\n    hash = hash & hash; // Convert to 32bit integer\n  }\n\n  return Math.abs(hash).toString(16);\n}\n\n/**\n * Generate a content hash from a Blob or File\n * @param content Blob or File to hash\n * @returns Promise resolving to hash string\n */\nexport async function generateContentHash(content: Blob): Promise<string> {\n  // Use the Web Crypto API if available\n  if (typeof crypto !== \"undefined\" && crypto.subtle) {\n    try {\n      const buffer = await content.arrayBuffer();\n      const hashBuffer = await crypto.subtle.digest(\"SHA-256\", buffer);\n      const hashArray = Array.from(new Uint8Array(hashBuffer));\n      const hashHex = hashArray\n        .map((b) => b.toString(16).padStart(2, \"0\"))\n        .join(\"\");\n      return hashHex;\n    } catch (error) {\n      console.error(\"Error generating content hash:\", error);\n      // Fall back to simple hash\n      return generateSimpleHashFromBlob(content);\n    }\n  }\n\n  // Fall back to simple hash if Web Crypto API is not available\n  return generateSimpleHashFromBlob(content);\n}\n\n/**\n * Generate a simple hash from a Blob or File\n * @param content Blob or File to hash\n * @returns Promise resolving to hash string\n */\nasync function generateSimpleHashFromBlob(content: Blob): Promise<string> {\n  return new Promise((resolve) => {\n    const reader = new FileReader();\n    reader.onload = () => {\n      const result = reader.result as string;\n      resolve(generateSimpleHash(result));\n    };\n    reader.readAsText(content);\n  });\n}\n\n/**\n * Generate a version string for a URL\n * @param url URL to version\n * @param version Version string\n * @returns Versioned URL\n */\nexport function addVersionToUrl(url: string, version: string): string {\n  const urlObj = new URL(url, window.location.origin);\n  urlObj.searchParams.set(\"v\", version);\n  return urlObj.toString();\n}\n\n/**\n * Extract version from a URL\n * @param url URL with version\n * @returns Version string or null if not found\n */\nexport function extractVersionFromUrl(url: string): string | null {\n  try {\n    const urlObj = new URL(url, window.location.origin);\n    return urlObj.searchParams.get(\"v\");\n  } catch (error) {\n    return null;\n  }\n}\n\n/**\n * Generate a cache key from a URL\n * @param url URL to generate key for\n * @returns Cache key\n */\nexport function generateCacheKey(url: string): string {\n  // Remove version parameter if present\n  const urlObj = new URL(url, window.location.origin);\n  urlObj.searchParams.delete(\"v\");\n  return urlObj.toString();\n}\n","/**\n * Asset Cache Default Configuration\n * This file contains default configuration values for the simplified asset cache system\n */\n\nimport {\n  DEFAULT_CACHE_NAME,\n  DEFAULT_CACHE_TTL,\n  MAX_CACHEABLE_SIZE,\n} from \"./constants\";\nimport type { AssetCacheConfig } from \"./types\";\n\n// ============================================================================\n// DEFAULT CONFIGURATION VALUES\n// ============================================================================\n\n/**\n * Get default asset cache configuration\n * This provides sensible defaults for all implemented configuration options\n */\nexport function getDefaultAssetCacheConfig(): Required<AssetCacheConfig> {\n  return {\n    enabled: true,\n    version: \"1.0.0\",\n    debug: false,\n    storageName: DEFAULT_CACHE_NAME,\n    maxSize: MAX_CACHEABLE_SIZE, // 50 MB\n    maxAge: DEFAULT_CACHE_TTL, // 7 days\n    serviceWorkerEnabled: true,\n    serviceWorkerPath: \"/sw.js\",\n    manifestPath: \"/manifest.json\",\n  };\n}\n","/**\n * Asset Cache Configuration\n * This file contains configuration utility functions\n */\n\nimport type { AssetCacheConfig } from \"./types\";\n\n// ============================================================================\n// CONFIGURATION UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Merge user configuration with defaults\n * Simple merge of user-provided configuration with default values\n */\nexport function mergeAssetCacheConfig(\n  userConfig: AssetCacheConfig = {}\n): Required<AssetCacheConfig> {\n  // Validate user configuration first\n  validateAssetCacheConfig(userConfig);\n\n  // Import defaults here to avoid circular dependency\n  const { getDefaultAssetCacheConfig } = require(\"./defaults\");\n  const defaults = getDefaultAssetCacheConfig();\n\n  return {\n    ...defaults,\n    ...userConfig,\n  };\n}\n\n/**\n * Validate asset cache configuration\n * Validates user-provided configuration and throws errors for invalid values\n */\nexport function validateAssetCacheConfig(config: AssetCacheConfig): void {\n  // Validate numeric values\n  if (config.maxSize !== undefined && config.maxSize <= 0) {\n    throw new Error(\"maxSize must be greater than 0\");\n  }\n\n  if (config.maxAge !== undefined && config.maxAge <= 0) {\n    throw new Error(\"maxAge must be greater than 0\");\n  }\n}\n","/**\n * Asset Cache Configuration Module\n * Centralized exports for all configuration-related functionality\n */\n\n// ============================================================================\n// TYPE DEFINITIONS\n// ============================================================================\n\nexport * from \"./types\";\n\n// ============================================================================\n// CONFIGURATION INTERFACES AND FUNCTIONS\n// ============================================================================\n\nexport * from \"./config\";\n\n// ============================================================================\n// DEFAULT CONFIGURATIONS AND PRESETS\n// ============================================================================\n\nexport * from \"./defaults\";\n\n// ============================================================================\n// CONSTANTS AND MAPPINGS\n// ============================================================================\n\nexport * from \"./constants\";\n\n// ============================================================================\n// EXPLICIT TYPE EXPORTS (for better IDE support)\n// ============================================================================\n\nexport type {\n  AssetCacheConfig,\n  // Core types\n  AssetType,\n\n  // Cache operation types\n  CacheOptions,\n  CacheEntry,\n  CacheResult,\n  AssetMetadata,\n  CacheManifest,\n\n  // Service worker types\n  ServiceWorkerMessageType,\n\n  // Asset loader configuration\n  AssetLoaderConfig,\n} from \"./types\";\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\nexport { mergeAssetCacheConfig, validateAssetCacheConfig } from \"./config\";\n\nexport { getDefaultAssetCacheConfig } from \"./defaults\";\n","/**\n * Service worker registration\n *\n * This module:\n * - Registers the service worker\n * - Handles service worker updates\n * - Provides methods to communicate with the service worker\n */\nimport { DEFAULT_SW_SCOPE } from \"../config\";\nimport { ServiceWorkerMessageType } from \"../config/types\";\nimport { debugLog } from \"../utils/cache-helpers\";\n\n/**\n * Options for service worker registration\n */\ninterface RegisterOptions {\n  scope?: string;\n  updateViaCache?: ServiceWorkerUpdateViaCache;\n  immediate?: boolean;\n  onSuccess?: () => void;\n  onError?: (error: Error) => void;\n  onUpdate?: (registration: ServiceWorkerRegistration) => void;\n}\n\n/**\n * Register the service worker\n * @param swPath Path to the service worker file\n * @param options Registration options\n * @returns Promise resolving to the service worker registration\n */\nexport async function registerServiceWorker(\n  swPath: string = \"/service-worker.js\",\n  options: RegisterOptions = {}\n): Promise<ServiceWorkerRegistration | null> {\n  // Check if service workers are supported\n  if (!(\"serviceWorker\" in navigator)) {\n    debugLog(\"Service workers are not supported in this browser\");\n    return null;\n  }\n\n  try {\n    // Register the service worker\n    const registration = await navigator.serviceWorker.register(swPath, {\n      scope: options.scope || DEFAULT_SW_SCOPE,\n      updateViaCache: options.updateViaCache || \"none\",\n    });\n\n    debugLog(\"Service worker registered:\", registration);\n\n    // Call success callback if provided\n    if (options.onSuccess) {\n      options.onSuccess();\n    }\n\n    // Handle updates\n    if (options.immediate) {\n      await forceUpdate(registration);\n    }\n\n    // Set up update detection\n    setupUpdateDetection(registration, options.onUpdate);\n\n    return registration;\n  } catch (error) {\n    debugLog(\"Service worker registration failed:\", error);\n\n    // Call error callback if provided\n    if (options.onError && error instanceof Error) {\n      options.onError(error);\n    }\n\n    return null;\n  }\n}\n\n/**\n * Force update of the service worker\n * @param registration Service worker registration\n */\nexport async function forceUpdate(\n  registration: ServiceWorkerRegistration\n): Promise<void> {\n  try {\n    await registration.update();\n    debugLog(\"Service worker updated\");\n\n    if (registration.waiting) {\n      // If there's a waiting service worker, activate it\n      debugLog(\"New service worker waiting, activating...\");\n      registration.waiting.postMessage({ type: \"SKIP_WAITING\" });\n    }\n  } catch (error) {\n    debugLog(\"Service worker update failed:\", error);\n  }\n}\n\n/**\n * Set up detection for service worker updates\n * @param registration Service worker registration\n * @param callback Callback to call when an update is available\n */\nfunction setupUpdateDetection(\n  registration: ServiceWorkerRegistration,\n  callback?: (registration: ServiceWorkerRegistration) => void\n): void {\n  // Check for updates on page load\n  if (registration.waiting) {\n    debugLog(\"New service worker waiting\");\n    if (callback) {\n      callback(registration);\n    }\n    return;\n  }\n\n  // Listen for new installing workers\n  const handleUpdate = () => {\n    if (registration.installing) {\n      // Track progress\n      registration.installing.addEventListener(\"statechange\", () => {\n        if (registration.waiting) {\n          debugLog(\"New service worker installed and waiting\");\n          if (callback) {\n            callback(registration);\n          }\n        }\n      });\n    }\n  };\n\n  // Initial check\n  handleUpdate();\n\n  // Listen for future updates\n  registration.addEventListener(\"updatefound\", handleUpdate);\n}\n\n/**\n * Send a message to the service worker\n * @param type Message type\n * @param payload Message payload\n * @returns Promise resolving to the response\n */\nexport async function sendMessageToSW<T = any>(\n  type: ServiceWorkerMessageType,\n  payload?: any\n): Promise<T | null> {\n  if (!(\"serviceWorker\" in navigator) || !navigator.serviceWorker.controller) {\n    debugLog(\"No active service worker found\");\n    return null;\n  }\n\n  try {\n    // Create a message channel for the response\n    const messageChannel = new MessageChannel();\n\n    // Create a promise that will resolve with the response\n    const responsePromise = new Promise<T>((resolve) => {\n      messageChannel.port1.onmessage = (event) => {\n        resolve(event.data);\n      };\n    });\n\n    // Send the message\n    navigator.serviceWorker.controller.postMessage({ type, payload }, [\n      messageChannel.port2,\n    ]);\n\n    // Wait for the response with a timeout\n    const timeoutPromise = new Promise<null>((resolve) => {\n      setTimeout(() => resolve(null), 3000);\n    });\n\n    return Promise.race([responsePromise, timeoutPromise]);\n  } catch (error) {\n    debugLog(\"Error sending message to service worker:\", error);\n    return null;\n  }\n}\n\n/**\n * Check if the service worker is active\n * @returns Whether the service worker is active\n */\nexport function isServiceWorkerActive(): boolean {\n  return !!(\"serviceWorker\" in navigator && navigator.serviceWorker.controller);\n}\n\n/**\n * Unregister all service workers\n * @returns Promise resolving when all service workers are unregistered\n */\nexport async function unregisterAllServiceWorkers(): Promise<void> {\n  if (!(\"serviceWorker\" in navigator)) {\n    return;\n  }\n\n  try {\n    const registrations = await navigator.serviceWorker.getRegistrations();\n\n    await Promise.all(\n      registrations.map(async (registration) => {\n        const result = await registration.unregister();\n        debugLog(`Service worker unregistered:`, result ? \"success\" : \"failed\");\n      })\n    );\n  } catch (error) {\n    debugLog(\"Error unregistering service workers:\", error);\n  }\n}\n","/**\n * Asset Cache Error Types\n *\n * Provides typed error handling for all cache operations.\n * Each error type corresponds to a specific failure mode in the caching system.\n */\n\n/**\n * Error codes for cache operations\n */\nexport enum CacheErrorCode {\n  // Initialization errors\n  CACHE_API_NOT_SUPPORTED = \"CACHE_API_NOT_SUPPORTED\",\n  CACHE_NOT_INITIALIZED = \"CACHE_NOT_INITIALIZED\",\n  CACHE_OPEN_FAILED = \"CACHE_OPEN_FAILED\",\n\n  // Manifest errors\n  MANIFEST_NOT_FOUND = \"MANIFEST_NOT_FOUND\",\n  MANIFEST_PARSE_ERROR = \"MANIFEST_PARSE_ERROR\",\n  MANIFEST_SAVE_FAILED = \"MANIFEST_SAVE_FAILED\",\n\n  // Asset errors\n  ASSET_NOT_CACHED = \"ASSET_NOT_CACHED\",\n  ASSET_EXPIRED = \"ASSET_EXPIRED\",\n  ASSET_FETCH_FAILED = \"ASSET_FETCH_FAILED\",\n  ASSET_TOO_LARGE = \"ASSET_TOO_LARGE\",\n  ASSET_INVALID_RESPONSE = \"ASSET_INVALID_RESPONSE\",\n\n  // Service Worker errors\n  SERVICE_WORKER_NOT_SUPPORTED = \"SERVICE_WORKER_NOT_SUPPORTED\",\n  SERVICE_WORKER_REGISTRATION_FAILED = \"SERVICE_WORKER_REGISTRATION_FAILED\",\n  SERVICE_WORKER_COMMUNICATION_FAILED = \"SERVICE_WORKER_COMMUNICATION_FAILED\",\n\n  // Storage errors\n  STORAGE_QUOTA_EXCEEDED = \"STORAGE_QUOTA_EXCEEDED\",\n  STORAGE_ACCESS_DENIED = \"STORAGE_ACCESS_DENIED\",\n\n  // Generic errors\n  UNKNOWN_ERROR = \"UNKNOWN_ERROR\",\n}\n\n/**\n * Base class for all cache-related errors\n */\nexport class CacheError extends Error {\n  public readonly code: CacheErrorCode;\n  public readonly recoverable: boolean;\n  public readonly details?: Record<string, unknown>;\n  public readonly originalCause?: Error;\n\n  constructor(\n    code: CacheErrorCode,\n    message: string,\n    options?: {\n      recoverable?: boolean;\n      details?: Record<string, unknown>;\n      cause?: Error;\n    }\n  ) {\n    super(message);\n    this.name = \"CacheError\";\n    this.code = code;\n    this.recoverable = options?.recoverable ?? false;\n    this.details = options?.details;\n    this.originalCause = options?.cause;\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, CacheError);\n    }\n  }\n\n  /**\n   * Convert error to JSON for logging/serialization\n   */\n  toJSON(): Record<string, unknown> {\n    return {\n      name: this.name,\n      code: this.code,\n      message: this.message,\n      recoverable: this.recoverable,\n      details: this.details,\n      stack: this.stack,\n    };\n  }\n}\n\n// ============================================================================\n// INITIALIZATION ERRORS\n// ============================================================================\n\n/**\n * Error thrown when Cache API is not supported in the browser\n */\nexport class CacheAPINotSupportedError extends CacheError {\n  constructor() {\n    super(\n      CacheErrorCode.CACHE_API_NOT_SUPPORTED,\n      \"Cache API is not supported in this browser. Asset caching will be disabled.\",\n      { recoverable: false }\n    );\n    this.name = \"CacheAPINotSupportedError\";\n  }\n}\n\n/**\n * Error thrown when cache operations are attempted before initialization\n */\nexport class CacheNotInitializedError extends CacheError {\n  constructor(operation?: string) {\n    super(\n      CacheErrorCode.CACHE_NOT_INITIALIZED,\n      `Cache is not initialized${operation ? `. Cannot perform: ${operation}` : \"\"}. Call init() first.`,\n      { recoverable: true, details: { operation } }\n    );\n    this.name = \"CacheNotInitializedError\";\n  }\n}\n\n/**\n * Error thrown when opening the cache fails\n */\nexport class CacheOpenFailedError extends CacheError {\n  constructor(cacheName: string, cause?: Error) {\n    super(\n      CacheErrorCode.CACHE_OPEN_FAILED,\n      `Failed to open cache: ${cacheName}`,\n      { recoverable: true, details: { cacheName }, cause }\n    );\n    this.name = \"CacheOpenFailedError\";\n  }\n}\n\n// ============================================================================\n// MANIFEST ERRORS\n// ============================================================================\n\n/**\n * Error thrown when manifest is not found in cache\n */\nexport class ManifestNotFoundError extends CacheError {\n  constructor() {\n    super(\n      CacheErrorCode.MANIFEST_NOT_FOUND,\n      \"Cache manifest not found. A new manifest will be created.\",\n      { recoverable: true }\n    );\n    this.name = \"ManifestNotFoundError\";\n  }\n}\n\n/**\n * Error thrown when manifest JSON parsing fails\n */\nexport class ManifestParseError extends CacheError {\n  constructor(cause?: Error) {\n    super(\n      CacheErrorCode.MANIFEST_PARSE_ERROR,\n      \"Failed to parse cache manifest. A new manifest will be created.\",\n      { recoverable: true, cause }\n    );\n    this.name = \"ManifestParseError\";\n  }\n}\n\n/**\n * Error thrown when saving manifest fails\n */\nexport class ManifestSaveFailedError extends CacheError {\n  constructor(cause?: Error) {\n    super(\n      CacheErrorCode.MANIFEST_SAVE_FAILED,\n      \"Failed to save cache manifest. Changes may not persist.\",\n      { recoverable: true, cause }\n    );\n    this.name = \"ManifestSaveFailedError\";\n  }\n}\n\n// ============================================================================\n// ASSET ERRORS\n// ============================================================================\n\n/**\n * Error thrown when requested asset is not in cache\n */\nexport class AssetNotCachedError extends CacheError {\n  constructor(url: string) {\n    super(\n      CacheErrorCode.ASSET_NOT_CACHED,\n      `Asset not found in cache: ${url}`,\n      { recoverable: true, details: { url } }\n    );\n    this.name = \"AssetNotCachedError\";\n  }\n}\n\n/**\n * Error thrown when cached asset has expired\n */\nexport class AssetExpiredError extends CacheError {\n  constructor(url: string, expiredAt: Date) {\n    super(CacheErrorCode.ASSET_EXPIRED, `Cached asset has expired: ${url}`, {\n      recoverable: true,\n      details: { url, expiredAt: expiredAt.toISOString() },\n    });\n    this.name = \"AssetExpiredError\";\n  }\n}\n\n/**\n * Error thrown when fetching asset from network fails\n */\nexport class AssetFetchFailedError extends CacheError {\n  constructor(url: string, status?: number, statusText?: string, cause?: Error) {\n    super(\n      CacheErrorCode.ASSET_FETCH_FAILED,\n      `Failed to fetch asset: ${url}${status ? ` (${status} ${statusText || \"\"})` : \"\"}`,\n      { recoverable: true, details: { url, status, statusText }, cause }\n    );\n    this.name = \"AssetFetchFailedError\";\n  }\n}\n\n/**\n * Error thrown when asset exceeds maximum cacheable size\n */\nexport class AssetTooLargeError extends CacheError {\n  constructor(url: string, size: number, maxSize: number) {\n    super(\n      CacheErrorCode.ASSET_TOO_LARGE,\n      `Asset too large to cache: ${url} (${formatBytes(size)} > ${formatBytes(maxSize)})`,\n      { recoverable: false, details: { url, size, maxSize } }\n    );\n    this.name = \"AssetTooLargeError\";\n  }\n}\n\n/**\n * Error thrown when response is invalid (status >= 400)\n */\nexport class AssetInvalidResponseError extends CacheError {\n  constructor(url: string, status: number, statusText: string) {\n    super(\n      CacheErrorCode.ASSET_INVALID_RESPONSE,\n      `Invalid response for asset: ${url} (${status} ${statusText})`,\n      { recoverable: true, details: { url, status, statusText } }\n    );\n    this.name = \"AssetInvalidResponseError\";\n  }\n}\n\n// ============================================================================\n// SERVICE WORKER ERRORS\n// ============================================================================\n\n/**\n * Error thrown when Service Worker API is not supported\n */\nexport class ServiceWorkerNotSupportedError extends CacheError {\n  constructor() {\n    super(\n      CacheErrorCode.SERVICE_WORKER_NOT_SUPPORTED,\n      \"Service Worker is not supported in this browser.\",\n      { recoverable: false }\n    );\n    this.name = \"ServiceWorkerNotSupportedError\";\n  }\n}\n\n/**\n * Error thrown when Service Worker registration fails\n */\nexport class ServiceWorkerRegistrationFailedError extends CacheError {\n  constructor(path: string, cause?: Error) {\n    super(\n      CacheErrorCode.SERVICE_WORKER_REGISTRATION_FAILED,\n      `Failed to register service worker: ${path}`,\n      { recoverable: true, details: { path }, cause }\n    );\n    this.name = \"ServiceWorkerRegistrationFailedError\";\n  }\n}\n\n/**\n * Error thrown when communication with Service Worker fails\n */\nexport class ServiceWorkerCommunicationFailedError extends CacheError {\n  constructor(messageType: string, cause?: Error) {\n    super(\n      CacheErrorCode.SERVICE_WORKER_COMMUNICATION_FAILED,\n      `Failed to communicate with service worker: ${messageType}`,\n      { recoverable: true, details: { messageType }, cause }\n    );\n    this.name = \"ServiceWorkerCommunicationFailedError\";\n  }\n}\n\n// ============================================================================\n// STORAGE ERRORS\n// ============================================================================\n\n/**\n * Error thrown when storage quota is exceeded\n */\nexport class StorageQuotaExceededError extends CacheError {\n  constructor(cause?: Error) {\n    super(\n      CacheErrorCode.STORAGE_QUOTA_EXCEEDED,\n      \"Storage quota exceeded. Consider clearing old cache entries.\",\n      { recoverable: true, cause }\n    );\n    this.name = \"StorageQuotaExceededError\";\n  }\n}\n\n/**\n * Error thrown when storage access is denied\n */\nexport class StorageAccessDeniedError extends CacheError {\n  constructor(cause?: Error) {\n    super(\n      CacheErrorCode.STORAGE_ACCESS_DENIED,\n      \"Storage access denied. This may happen in private/incognito mode.\",\n      { recoverable: false, cause }\n    );\n    this.name = \"StorageAccessDeniedError\";\n  }\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Format bytes to human-readable string\n */\nfunction formatBytes(bytes: number): string {\n  if (bytes === 0) return \"0 B\";\n  const k = 1024;\n  const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n  const i = Math.floor(Math.log(bytes) / Math.log(k));\n  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n}\n\n/**\n * Check if an error is a storage quota exceeded error\n */\nexport function isQuotaExceededError(error: unknown): boolean {\n  if (error instanceof DOMException) {\n    // Different browsers use different names\n    return (\n      error.name === \"QuotaExceededError\" ||\n      error.name === \"NS_ERROR_DOM_QUOTA_REACHED\"\n    );\n  }\n  return false;\n}\n\n/**\n * Check if an error is a storage access denied error\n */\nexport function isStorageAccessDeniedError(error: unknown): boolean {\n  if (error instanceof DOMException) {\n    return (\n      error.name === \"SecurityError\" ||\n      error.name === \"InvalidAccessError\" ||\n      error.name === \"NotAllowedError\"\n    );\n  }\n  return false;\n}\n\n/**\n * Wrap an unknown error in a CacheError\n */\nexport function wrapError(error: unknown, context?: string): CacheError {\n  if (error instanceof CacheError) {\n    return error;\n  }\n\n  if (isQuotaExceededError(error)) {\n    return new StorageQuotaExceededError(error as Error);\n  }\n\n  if (isStorageAccessDeniedError(error)) {\n    return new StorageAccessDeniedError(error as Error);\n  }\n\n  const message = error instanceof Error ? error.message : String(error);\n  return new CacheError(\n    CacheErrorCode.UNKNOWN_ERROR,\n    context ? `${context}: ${message}` : message,\n    {\n      recoverable: true,\n      cause: error instanceof Error ? error : undefined,\n    }\n  );\n}\n","/**\n * Cache manager module\n *\n * This module:\n * - Manages cache operations\n * - Handles cache invalidation\n * - Provides utilities for working with the cache\n * - Handles all error states with typed errors\n */\nimport {\n  CacheManifest,\n  AssetMetadata,\n  AssetType,\n  ServiceWorkerMessageType,\n} from \"../config/types\";\nimport {\n  DEFAULT_CACHE_NAME,\n  DEFAULT_CACHE_TTL,\n  CACHE_MANIFEST_PATH,\n} from \"../config/constants\";\nimport {\n  debugLog,\n  determineAssetType,\n  formatSize,\n} from \"../utils/cache-helpers\";\nimport { generateCacheKey } from \"../utils/hash-generator\";\nimport { sendMessageToSW, isServiceWorkerActive } from \"./register-sw\";\nimport {\n  CacheError,\n  CacheErrorCode,\n  CacheAPINotSupportedError,\n  CacheNotInitializedError,\n  CacheOpenFailedError,\n  ManifestParseError,\n  ManifestSaveFailedError,\n  StorageQuotaExceededError,\n  StorageAccessDeniedError,\n  isQuotaExceededError,\n  isStorageAccessDeniedError,\n  wrapError,\n} from \"./errors\";\n\n/**\n * Initialization state of the cache manager\n */\nexport enum CacheManagerState {\n  UNINITIALIZED = \"UNINITIALIZED\",\n  INITIALIZING = \"INITIALIZING\",\n  READY = \"READY\",\n  ERROR = \"ERROR\",\n  UNSUPPORTED = \"UNSUPPORTED\",\n}\n\n/**\n * Result of initialization attempt\n */\nexport interface InitResult {\n  success: boolean;\n  state: CacheManagerState;\n  error?: CacheError;\n}\n\n/**\n * Cache manager class with proper error handling\n */\nexport class CacheManager {\n  private static cache: Cache | null = null;\n  private static manifest: CacheManifest | null = null;\n  private static state: CacheManagerState = CacheManagerState.UNINITIALIZED;\n  private static lastError: CacheError | null = null;\n  private static initPromise: Promise<InitResult> | null = null;\n\n  /**\n   * Get the current state of the cache manager\n   */\n  static getState(): CacheManagerState {\n    return this.state;\n  }\n\n  /**\n   * Get the last error that occurred\n   */\n  static getLastError(): CacheError | null {\n    return this.lastError;\n  }\n\n  /**\n   * Check if the cache manager is ready for operations\n   */\n  static isReady(): boolean {\n    return this.state === CacheManagerState.READY;\n  }\n\n  /**\n   * Check if caching is supported in the current environment\n   */\n  static isSupported(): boolean {\n    return typeof window !== \"undefined\" && \"caches\" in window;\n  }\n\n  /**\n   * Initialize the cache manager\n   * @param cacheName Name of the cache to use\n   * @returns Promise resolving to initialization result\n   */\n  static async init(cacheName: string = DEFAULT_CACHE_NAME): Promise<InitResult> {\n    // Return existing promise if initialization is in progress\n    if (this.initPromise) {\n      return this.initPromise;\n    }\n\n    // Already initialized successfully\n    if (this.state === CacheManagerState.READY) {\n      return { success: true, state: this.state };\n    }\n\n    // Already determined to be unsupported\n    if (this.state === CacheManagerState.UNSUPPORTED) {\n      const error = new CacheAPINotSupportedError();\n      return { success: false, state: this.state, error };\n    }\n\n    this.initPromise = this.performInit(cacheName);\n    const result = await this.initPromise;\n    this.initPromise = null;\n    return result;\n  }\n\n  /**\n   * Perform the actual initialization\n   */\n  private static async performInit(cacheName: string): Promise<InitResult> {\n    this.state = CacheManagerState.INITIALIZING;\n    this.lastError = null;\n\n    // Check for Cache API support\n    if (!this.isSupported()) {\n      const error = new CacheAPINotSupportedError();\n      this.lastError = error;\n      this.state = CacheManagerState.UNSUPPORTED;\n      debugLog(\"Cache API not supported in this browser\");\n      return { success: false, state: this.state, error };\n    }\n\n    try {\n      // Open the cache\n      this.cache = await caches.open(cacheName);\n      debugLog(\"Cache opened:\", cacheName);\n\n      // Load the manifest\n      await this.loadManifest();\n\n      this.state = CacheManagerState.READY;\n      debugLog(\"Cache manager initialized successfully\");\n      return { success: true, state: this.state };\n    } catch (error) {\n      const cacheError = this.handleInitError(error, cacheName);\n      this.lastError = cacheError;\n      this.state = CacheManagerState.ERROR;\n      debugLog(\"Failed to initialize cache manager:\", cacheError);\n      return { success: false, state: this.state, error: cacheError };\n    }\n  }\n\n  /**\n   * Handle initialization errors and convert to typed errors\n   */\n  private static handleInitError(error: unknown, cacheName: string): CacheError {\n    if (isStorageAccessDeniedError(error)) {\n      return new StorageAccessDeniedError(error as Error);\n    }\n    if (isQuotaExceededError(error)) {\n      return new StorageQuotaExceededError(error as Error);\n    }\n    return new CacheOpenFailedError(\n      cacheName,\n      error instanceof Error ? error : undefined\n    );\n  }\n\n  /**\n   * Reset the cache manager (useful for recovery or testing)\n   */\n  static reset(): void {\n    this.cache = null;\n    this.manifest = null;\n    this.state = CacheManagerState.UNINITIALIZED;\n    this.lastError = null;\n    this.initPromise = null;\n    debugLog(\"Cache manager reset\");\n  }\n\n  /**\n   * Attempt to recover from an error state\n   * @param cacheName Name of the cache to use\n   */\n  static async recover(cacheName: string = DEFAULT_CACHE_NAME): Promise<InitResult> {\n    if (this.state === CacheManagerState.UNSUPPORTED) {\n      // Cannot recover from unsupported state\n      return {\n        success: false,\n        state: this.state,\n        error: new CacheAPINotSupportedError(),\n      };\n    }\n\n    this.reset();\n    return this.init(cacheName);\n  }\n\n  /**\n   * Load the cache manifest\n   */\n  static async loadManifest(): Promise<void> {\n    try {\n      if (!this.cache) {\n        const result = await this.init();\n        if (!result.success) {\n          throw result.error || new CacheNotInitializedError(\"loadManifest\");\n        }\n      }\n\n      if (!this.cache) {\n        throw new CacheNotInitializedError(\"loadManifest\");\n      }\n\n      // Try to get the manifest from the cache\n      const manifestResponse = await this.cache.match(CACHE_MANIFEST_PATH);\n\n      if (manifestResponse) {\n        try {\n          this.manifest = await manifestResponse.json();\n          debugLog(\"Cache manifest loaded:\", this.manifest);\n        } catch (parseError) {\n          // Handle JSON parse errors\n          debugLog(\"Failed to parse manifest, creating new one:\", parseError);\n          this.manifest = this.createNewManifest();\n        }\n      } else {\n        // Create a new manifest\n        this.manifest = this.createNewManifest();\n        debugLog(\"New cache manifest created\");\n      }\n    } catch (error) {\n      debugLog(\"Failed to load cache manifest:\", error);\n\n      // Create a new manifest as fallback\n      this.manifest = this.createNewManifest();\n\n      // Re-throw if it's a critical error\n      if (error instanceof CacheError && !error.recoverable) {\n        throw error;\n      }\n    }\n  }\n\n  /**\n   * Create a new empty manifest\n   */\n  private static createNewManifest(): CacheManifest {\n    return {\n      version: \"1\",\n      generatedAt: new Date().toISOString(),\n      assets: {},\n    };\n  }\n\n  /**\n   * Ensure the cache manager is initialized\n   */\n  private static async ensureInitialized(): Promise<void> {\n    if (this.state === CacheManagerState.UNSUPPORTED) {\n      throw new CacheAPINotSupportedError();\n    }\n\n    if (this.state !== CacheManagerState.READY) {\n      const result = await this.init();\n      if (!result.success) {\n        throw result.error || new CacheNotInitializedError();\n      }\n    }\n  }\n\n  /**\n   * Save the cache manifest\n   */\n  static async saveManifest(): Promise<void> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.cache || !this.manifest) {\n        throw new CacheNotInitializedError(\"saveManifest\");\n      }\n\n      // Create a response with the manifest\n      const manifestResponse = new Response(JSON.stringify(this.manifest), {\n        headers: { \"Content-Type\": \"application/json\" },\n      });\n\n      // Store in the cache\n      await this.cache.put(CACHE_MANIFEST_PATH, manifestResponse);\n\n      // If service worker is active, update it too\n      if (isServiceWorkerActive()) {\n        try {\n          await sendMessageToSW(ServiceWorkerMessageType.UPDATE_MANIFEST, {\n            manifest: this.manifest,\n          });\n        } catch (swError) {\n          // Log but don't fail - SW sync is best-effort\n          debugLog(\"Failed to sync manifest with service worker:\", swError);\n        }\n      }\n\n      debugLog(\"Cache manifest saved\");\n    } catch (error) {\n      if (error instanceof CacheError) {\n        this.lastError = error;\n        throw error;\n      }\n\n      const cacheError = new ManifestSaveFailedError(\n        error instanceof Error ? error : undefined\n      );\n      this.lastError = cacheError;\n      debugLog(\"Failed to save cache manifest:\", cacheError);\n      throw cacheError;\n    }\n  }\n\n  /**\n   * Add an asset to the manifest\n   * @param url URL of the asset\n   * @param metadata Asset metadata\n   */\n  static async addToManifest(\n    url: string,\n    metadata: Partial<AssetMetadata>\n  ): Promise<void> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.manifest) {\n        await this.loadManifest();\n      }\n\n      if (!this.manifest) {\n        throw new CacheNotInitializedError(\"addToManifest\");\n      }\n\n      // Create or update the asset entry\n      const cacheKey = generateCacheKey(url);\n\n      this.manifest.assets[cacheKey] = {\n        url,\n        type: metadata.type || determineAssetType(url),\n        version: metadata.version || Date.now().toString(36),\n        lastModified: metadata.lastModified || new Date().toISOString(),\n        size: metadata.size,\n        tags: metadata.tags,\n      };\n\n      // Save the manifest\n      await this.saveManifest();\n    } catch (error) {\n      const cacheError = wrapError(error, \"Failed to add asset to manifest\");\n      this.lastError = cacheError;\n      debugLog(\"Failed to add asset to manifest:\", cacheError);\n      // Don't throw - this is a non-critical operation\n    }\n  }\n\n  /**\n   * Remove an asset from the manifest\n   * @param url URL of the asset\n   */\n  static async removeFromManifest(url: string): Promise<void> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.manifest) {\n        await this.loadManifest();\n      }\n\n      if (!this.manifest) {\n        throw new CacheNotInitializedError(\"removeFromManifest\");\n      }\n\n      // Remove the asset entry\n      const cacheKey = generateCacheKey(url);\n\n      if (this.manifest.assets[cacheKey]) {\n        delete this.manifest.assets[cacheKey];\n\n        // Save the manifest\n        await this.saveManifest();\n      }\n    } catch (error) {\n      const cacheError = wrapError(error, \"Failed to remove asset from manifest\");\n      this.lastError = cacheError;\n      debugLog(\"Failed to remove asset from manifest:\", cacheError);\n      // Don't throw - this is a non-critical operation\n    }\n  }\n\n  /**\n   * Get asset metadata from the manifest\n   * @param url URL of the asset\n   * @returns Asset metadata or null if not found\n   */\n  static async getAssetMetadata(url: string): Promise<AssetMetadata | null> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.manifest) {\n        await this.loadManifest();\n      }\n\n      if (!this.manifest) {\n        return null;\n      }\n\n      const cacheKey = generateCacheKey(url);\n      return this.manifest.assets[cacheKey] || null;\n    } catch (error) {\n      debugLog(\"Failed to get asset metadata:\", error);\n      return null;\n    }\n  }\n\n  /**\n   * Get all assets of a specific type\n   * @param type Asset type\n   * @returns Array of asset metadata\n   */\n  static async getAssetsByType(type: AssetType): Promise<AssetMetadata[]> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.manifest) {\n        await this.loadManifest();\n      }\n\n      if (!this.manifest) {\n        return [];\n      }\n\n      return Object.values(this.manifest.assets).filter(\n        (asset) => asset.type === type\n      );\n    } catch (error) {\n      debugLog(\"Failed to get assets by type:\", error);\n      return [];\n    }\n  }\n\n  /**\n   * Get all assets with a specific tag\n   * @param tag Tag to filter by\n   * @returns Array of asset metadata\n   */\n  static async getAssetsByTag(tag: string): Promise<AssetMetadata[]> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.manifest) {\n        await this.loadManifest();\n      }\n\n      if (!this.manifest) {\n        return [];\n      }\n\n      return Object.values(this.manifest.assets).filter((asset) =>\n        asset.tags?.includes(tag)\n      );\n    } catch (error) {\n      debugLog(\"Failed to get assets by tag:\", error);\n      return [];\n    }\n  }\n\n  /**\n   * Get cache statistics\n   * @returns Cache statistics\n   */\n  static async getStats(): Promise<{\n    totalAssets: number;\n    totalSize: number;\n    assetsByType: Record<AssetType, number>;\n    formattedSize: string;\n    state: CacheManagerState;\n    lastError: CacheError | null;\n  }> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.manifest) {\n        await this.loadManifest();\n      }\n\n      if (!this.manifest) {\n        return this.getEmptyStats();\n      }\n\n      const assets = Object.values(this.manifest.assets);\n      const totalAssets = assets.length;\n      const totalSize = assets.reduce(\n        (sum, asset) => sum + (asset.size || 0),\n        0\n      );\n\n      // Count assets by type\n      const assetsByType = assets.reduce(\n        (counts, asset) => {\n          counts[asset.type] = (counts[asset.type] || 0) + 1;\n          return counts;\n        },\n        {} as Record<AssetType, number>\n      );\n\n      return {\n        totalAssets,\n        totalSize,\n        assetsByType,\n        formattedSize: formatSize(totalSize),\n        state: this.state,\n        lastError: this.lastError,\n      };\n    } catch (error) {\n      debugLog(\"Failed to get cache stats:\", error);\n      return this.getEmptyStats();\n    }\n  }\n\n  /**\n   * Get empty stats object\n   */\n  private static getEmptyStats(): {\n    totalAssets: number;\n    totalSize: number;\n    assetsByType: Record<AssetType, number>;\n    formattedSize: string;\n    state: CacheManagerState;\n    lastError: CacheError | null;\n  } {\n    return {\n      totalAssets: 0,\n      totalSize: 0,\n      assetsByType: {} as Record<AssetType, number>,\n      formattedSize: \"0 B\",\n      state: this.state,\n      lastError: this.lastError,\n    };\n  }\n\n  /**\n   * Clear the cache and manifest\n   */\n  static async clear(): Promise<void> {\n    try {\n      if (!this.isSupported()) {\n        return;\n      }\n\n      // Delete the cache\n      await caches.delete(DEFAULT_CACHE_NAME);\n\n      // Reset the manifest\n      this.manifest = this.createNewManifest();\n\n      // Reset the cache reference\n      this.cache = null;\n\n      // Reset state (but keep as READY since clear was successful)\n      if (this.state === CacheManagerState.READY) {\n        // Will need to re-init on next operation\n        this.state = CacheManagerState.UNINITIALIZED;\n      }\n\n      debugLog(\"Cache and manifest cleared\");\n    } catch (error) {\n      const cacheError = wrapError(error, \"Failed to clear cache and manifest\");\n      this.lastError = cacheError;\n      debugLog(\"Failed to clear cache and manifest:\", cacheError);\n      // Don't throw - clearing is best-effort\n    }\n  }\n\n  /**\n   * Purge expired assets from the cache\n   * @returns Number of assets purged\n   */\n  static async purgeExpired(): Promise<number> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.cache || !this.manifest) {\n        return 0;\n      }\n\n      const now = Date.now();\n      const expiredAssets: string[] = [];\n\n      // Find expired assets\n      for (const [cacheKey, metadata] of Object.entries(this.manifest.assets)) {\n        // Check if the asset has an expiration time\n        if (metadata.lastModified) {\n          const lastModifiedTime = new Date(metadata.lastModified).getTime();\n          const age = now - lastModifiedTime;\n\n          // If older than the default TTL, consider it expired\n          if (age > DEFAULT_CACHE_TTL * 1000) {\n            expiredAssets.push(cacheKey);\n          }\n        }\n      }\n\n      // Remove expired assets\n      for (const cacheKey of expiredAssets) {\n        try {\n          await this.cache.delete(cacheKey);\n          delete this.manifest.assets[cacheKey];\n        } catch (deleteError) {\n          debugLog(`Failed to delete expired asset ${cacheKey}:`, deleteError);\n          // Continue with other assets\n        }\n      }\n\n      // Save the manifest if any assets were removed\n      if (expiredAssets.length > 0) {\n        await this.saveManifest();\n        debugLog(`Purged ${expiredAssets.length} expired assets`);\n      }\n\n      return expiredAssets.length;\n    } catch (error) {\n      const cacheError = wrapError(error, \"Failed to purge expired assets\");\n      this.lastError = cacheError;\n      debugLog(\"Failed to purge expired assets:\", cacheError);\n      return 0;\n    }\n  }\n}\n","/**\n * Version manager module\n *\n * This module:\n * - Handles asset versioning\n * - Manages cache invalidation based on versions\n * - Provides utilities for working with versioned assets\n */\nimport { CacheManifest } from \"../config/types\";\nimport { CACHE_MANIFEST_PATH } from \"../config/constants\";\nimport { debugLog } from \"../utils/cache-helpers\";\nimport {\n  addVersionToUrl,\n  extractVersionFromUrl,\n  generateSimpleHash,\n} from \"../utils/hash-generator\";\nimport { CacheManager } from \"./cache-manager\";\n\n/**\n * Version manager class\n */\nexport class VersionManager {\n  private static deploymentId: string = \"\";\n\n  /**\n   * Initialize the version manager\n   * @param deploymentId Optional deployment ID for versioning\n   */\n  static init(deploymentId?: string): void {\n    // Generate a deployment ID if not provided\n    this.deploymentId = deploymentId || this.generateDeploymentId();\n    debugLog(\n      \"Version manager initialized with deployment ID:\",\n      this.deploymentId\n    );\n  }\n\n  /**\n   * Generate a deployment ID\n   * @returns Deployment ID\n   */\n  private static generateDeploymentId(): string {\n    // Use the current timestamp as a simple deployment ID\n    return Date.now().toString(36);\n  }\n\n  /**\n   * Get the current deployment ID\n   * @returns Deployment ID\n   */\n  static getDeploymentId(): string {\n    return this.deploymentId;\n  }\n\n  /**\n   * Create a versioned URL for an asset\n   * @param url URL of the asset\n   * @param version Optional version string (defaults to deployment ID)\n   * @returns Versioned URL\n   */\n  static createVersionedUrl(url: string, version?: string): string {\n    const versionToUse = version || this.deploymentId;\n    return addVersionToUrl(url, versionToUse);\n  }\n\n  /**\n   * Check if an asset needs to be updated\n   * @param url URL of the asset\n   * @param version Current version of the asset\n   * @returns Whether the asset needs to be updated\n   */\n  static async needsUpdate(url: string, version: string): Promise<boolean> {\n    // Get the asset metadata from the cache manifest\n    const metadata = await CacheManager.getAssetMetadata(url);\n\n    if (!metadata) {\n      // Asset not in cache, needs update\n      return true;\n    }\n\n    // Compare versions\n    return metadata.version !== version;\n  }\n\n  /**\n   * Update the version of an asset in the cache manifest\n   * @param url URL of the asset\n   * @param version New version of the asset\n   */\n  static async updateVersion(url: string, version: string): Promise<void> {\n    // Get the asset metadata from the cache manifest\n    const metadata = await CacheManager.getAssetMetadata(url);\n\n    if (metadata) {\n      // Update the version\n      metadata.version = version;\n      metadata.lastModified = new Date().toISOString();\n\n      // Update the manifest\n      await CacheManager.addToManifest(url, metadata);\n    }\n  }\n\n  /**\n   * Generate a content-based version for an asset\n   * @param content Asset content\n   * @returns Content hash\n   */\n  static async generateContentVersion(content: Blob | string): Promise<string> {\n    if (typeof content === \"string\") {\n      return generateSimpleHash(content);\n    } else {\n      return await this.generateContentHash(content);\n    }\n  }\n\n  /**\n   * Generate a content hash from a Blob\n   * @param content Blob to hash\n   * @returns Content hash\n   */\n  private static async generateContentHash(content: Blob): Promise<string> {\n    // Use the Web Crypto API if available\n    if (typeof crypto !== \"undefined\" && crypto.subtle) {\n      try {\n        const buffer = await content.arrayBuffer();\n        const hashBuffer = await crypto.subtle.digest(\"SHA-256\", buffer);\n        const hashArray = Array.from(new Uint8Array(hashBuffer));\n        const hashHex = hashArray\n          .map((b) => b.toString(16).padStart(2, \"0\"))\n          .join(\"\");\n        return hashHex.slice(0, 8); // Use first 8 characters for brevity\n      } catch (error) {\n        // Fall back to simple hash\n        return this.generateSimpleHashFromBlob(content);\n      }\n    }\n\n    // Fall back to simple hash if Web Crypto API is not available\n    return this.generateSimpleHashFromBlob(content);\n  }\n\n  /**\n   * Generate a simple hash from a Blob\n   * @param content Blob to hash\n   * @returns Simple hash\n   */\n  private static async generateSimpleHashFromBlob(\n    content: Blob\n  ): Promise<string> {\n    return new Promise((resolve) => {\n      const reader = new FileReader();\n      reader.onload = () => {\n        const result = reader.result as string;\n        resolve(generateSimpleHash(result).slice(0, 8));\n      };\n      reader.readAsText(content);\n    });\n  }\n\n  /**\n   * Check if a URL has a version parameter\n   * @param url URL to check\n   * @returns Whether the URL has a version parameter\n   */\n  static hasVersion(url: string): boolean {\n    return extractVersionFromUrl(url) !== null;\n  }\n\n  /**\n   * Extract the version from a URL\n   * @param url URL to extract version from\n   * @returns Version string or null if not found\n   */\n  static getVersionFromUrl(url: string): string | null {\n    return extractVersionFromUrl(url);\n  }\n\n  /**\n   * Invalidate all assets from a previous deployment\n   * @param previousDeploymentId Previous deployment ID\n   */\n  static async invalidatePreviousDeployment(\n    previousDeploymentId: string\n  ): Promise<void> {\n    try {\n      // Get all assets from the cache manifest\n      const manifest = await this.getManifest();\n\n      if (!manifest) {\n        return;\n      }\n\n      // Find assets with the previous deployment ID\n      const assetsToInvalidate = Object.values(manifest.assets).filter(\n        (asset) => asset.version.startsWith(previousDeploymentId)\n      );\n\n      // Invalidate each asset\n      for (const asset of assetsToInvalidate) {\n        await CacheManager.removeFromManifest(asset.url);\n      }\n\n      debugLog(\n        `Invalidated ${assetsToInvalidate.length} assets from previous deployment`\n      );\n    } catch (error) {\n      debugLog(\"Failed to invalidate previous deployment:\", error);\n    }\n  }\n\n  /**\n   * Get the cache manifest\n   * @returns Cache manifest or null if not available\n   */\n  private static async getManifest(): Promise<CacheManifest | null> {\n    try {\n      // Try to get the manifest from the cache\n      const cache = await caches.open(\"asset-cache-v1\");\n      const manifestResponse = await cache.match(CACHE_MANIFEST_PATH);\n\n      if (manifestResponse) {\n        return await manifestResponse.json();\n      }\n\n      return null;\n    } catch (error) {\n      debugLog(\"Failed to get manifest:\", error);\n      return null;\n    }\n  }\n\n  /**\n   * Compare two versions\n   * @param version1 First version\n   * @param version2 Second version\n   * @returns -1 if version1 < version2, 0 if equal, 1 if version1 > version2\n   */\n  static compareVersions(version1: string, version2: string): number {\n    // If versions are timestamps in base36, convert to numbers\n    if (/^[0-9a-z]+$/.test(version1) && /^[0-9a-z]+$/.test(version2)) {\n      const num1 = parseInt(version1, 36);\n      const num2 = parseInt(version2, 36);\n\n      if (!isNaN(num1) && !isNaN(num2)) {\n        return num1 - num2;\n      }\n    }\n\n    // Otherwise, compare as strings\n    return version1.localeCompare(version2);\n  }\n}\n","/**\n * Asset loader module\n *\n * This module:\n * - Provides methods for loading assets with caching\n * - Handles preloading of assets\n * - Manages cache invalidation\n */\nimport {\n  AssetLoaderConfig,\n  AssetType,\n  CacheEntry,\n  CacheOptions,\n  CacheResult,\n  ServiceWorkerMessageType,\n} from \"../config/types\";\nimport {\n  DEFAULT_CACHE_NAME,\n  DEFAULT_CACHE_TTL,\n  MAX_CACHEABLE_SIZE,\n} from \"../config/constants\";\nimport {\n  createCacheEntry,\n  debugLog,\n  hasExpired,\n  shouldCacheAsset,\n} from \"../utils/cache-helpers\";\nimport { generateCacheKey, generateContentHash } from \"../utils/hash-generator\";\nimport { CacheManager, CacheManagerState } from \"./cache-manager\";\nimport { VersionManager } from \"./version-manager\";\nimport { isServiceWorkerActive, sendMessageToSW } from \"./register-sw\";\nimport {\n  CacheError,\n  CacheErrorCode,\n  CacheNotInitializedError,\n  AssetFetchFailedError,\n  AssetTooLargeError,\n  AssetNotCachedError,\n  AssetExpiredError,\n  wrapError,\n  isQuotaExceededError,\n  StorageQuotaExceededError,\n} from \"./errors\";\n\n/**\n * Asset loader state\n */\nexport enum AssetLoaderState {\n  UNINITIALIZED = \"UNINITIALIZED\",\n  INITIALIZING = \"INITIALIZING\",\n  READY = \"READY\",\n  ERROR = \"ERROR\",\n  CACHE_UNAVAILABLE = \"CACHE_UNAVAILABLE\",\n}\n\n/**\n * Asset loader initialization result\n */\nexport interface AssetLoaderInitResult {\n  success: boolean;\n  state: AssetLoaderState;\n  cacheManagerState: CacheManagerState;\n  error?: CacheError;\n}\n\n/**\n * Asset loader class\n */\nexport class AssetLoader {\n  private static state: AssetLoaderState = AssetLoaderState.UNINITIALIZED;\n  private static lastError: CacheError | null = null;\n  private static initPromise: Promise<AssetLoaderInitResult> | null = null;\n  private static config: AssetLoaderConfig = {\n    cacheName: DEFAULT_CACHE_NAME,\n    defaultTTL: DEFAULT_CACHE_TTL,\n    maxSize: MAX_CACHEABLE_SIZE,\n    enableServiceWorker: true,\n    debug: false,\n  };\n\n  /**\n   * Get the current state of the asset loader\n   */\n  static getState(): AssetLoaderState {\n    return this.state;\n  }\n\n  /**\n   * Get the last error that occurred\n   */\n  static getLastError(): CacheError | null {\n    return this.lastError;\n  }\n\n  /**\n   * Check if the asset loader is ready\n   */\n  static isReady(): boolean {\n    return this.state === AssetLoaderState.READY;\n  }\n\n  /**\n   * Check if caching is available (even if degraded)\n   */\n  static isCacheAvailable(): boolean {\n    return (\n      this.state === AssetLoaderState.READY ||\n      CacheManager.getState() === CacheManagerState.READY\n    );\n  }\n\n  /**\n   * Initialize the asset loader\n   * @param config Configuration options\n   * @returns Initialization result with state information\n   */\n  static async init(\n    config?: Partial<AssetLoaderConfig>\n  ): Promise<AssetLoaderInitResult> {\n    // Return existing promise if already initializing\n    if (this.initPromise) {\n      return this.initPromise;\n    }\n\n    // Already initialized - return current state\n    if (this.state === AssetLoaderState.READY) {\n      return {\n        success: true,\n        state: this.state,\n        cacheManagerState: CacheManager.getState(),\n      };\n    }\n\n    // Cache unavailable - don't retry\n    if (this.state === AssetLoaderState.CACHE_UNAVAILABLE) {\n      return {\n        success: false,\n        state: this.state,\n        cacheManagerState: CacheManager.getState(),\n        error: this.lastError || undefined,\n      };\n    }\n\n    this.initPromise = this.performInit(config);\n    return this.initPromise;\n  }\n\n  /**\n   * Perform the actual initialization\n   */\n  private static async performInit(\n    config?: Partial<AssetLoaderConfig>\n  ): Promise<AssetLoaderInitResult> {\n    this.state = AssetLoaderState.INITIALIZING;\n\n    try {\n      // Merge config with defaults\n      this.config = {\n        ...this.config,\n        ...config,\n      };\n\n      debugLog(\"Initializing asset loader with config:\", this.config);\n\n      // Initialize the cache manager\n      const cacheResult = await CacheManager.init(this.config.cacheName);\n\n      if (!cacheResult.success) {\n        // CacheManager failed to initialize\n        if (cacheResult.state === CacheManagerState.UNSUPPORTED) {\n          this.state = AssetLoaderState.CACHE_UNAVAILABLE;\n          this.lastError = cacheResult.error || null;\n          debugLog(\n            \"Asset loader: Cache API not supported, caching disabled\",\n            cacheResult.error\n          );\n        } else {\n          this.state = AssetLoaderState.ERROR;\n          this.lastError = cacheResult.error || null;\n          debugLog(\n            \"Asset loader: CacheManager initialization failed\",\n            cacheResult.error\n          );\n        }\n\n        return {\n          success: false,\n          state: this.state,\n          cacheManagerState: cacheResult.state,\n          error: cacheResult.error,\n        };\n      }\n\n      this.state = AssetLoaderState.READY;\n      this.lastError = null;\n      debugLog(\"Asset loader initialized successfully\");\n\n      return {\n        success: true,\n        state: this.state,\n        cacheManagerState: cacheResult.state,\n      };\n    } catch (error) {\n      const cacheError = wrapError(error, \"AssetLoader initialization failed\");\n      this.state = AssetLoaderState.ERROR;\n      this.lastError = cacheError;\n      debugLog(\"Asset loader initialization error:\", cacheError);\n\n      return {\n        success: false,\n        state: this.state,\n        cacheManagerState: CacheManager.getState(),\n        error: cacheError,\n      };\n    } finally {\n      this.initPromise = null;\n    }\n  }\n\n  /**\n   * Reset the asset loader state (primarily for testing)\n   */\n  static reset(): void {\n    this.state = AssetLoaderState.UNINITIALIZED;\n    this.lastError = null;\n    this.initPromise = null;\n    this.config = {\n      cacheName: DEFAULT_CACHE_NAME,\n      defaultTTL: DEFAULT_CACHE_TTL,\n      maxSize: MAX_CACHEABLE_SIZE,\n      enableServiceWorker: true,\n      debug: false,\n    };\n    CacheManager.reset();\n  }\n\n  /**\n   * Attempt to recover from an error state\n   * @param config Configuration options\n   * @returns Recovery result\n   */\n  static async recover(\n    config?: Partial<AssetLoaderConfig>\n  ): Promise<AssetLoaderInitResult> {\n    // Can't recover from CACHE_UNAVAILABLE - browser doesn't support Cache API\n    if (this.state === AssetLoaderState.CACHE_UNAVAILABLE) {\n      return {\n        success: false,\n        state: this.state,\n        cacheManagerState: CacheManager.getState(),\n        error: this.lastError || undefined,\n      };\n    }\n\n    // Try to recover CacheManager first\n    const cacheRecovery = await CacheManager.recover(this.config.cacheName);\n    if (!cacheRecovery.success) {\n      this.state = AssetLoaderState.ERROR;\n      this.lastError = cacheRecovery.error || null;\n      return {\n        success: false,\n        state: this.state,\n        cacheManagerState: cacheRecovery.state,\n        error: cacheRecovery.error,\n      };\n    }\n\n    // Reset state and re-initialize\n    this.state = AssetLoaderState.UNINITIALIZED;\n    this.lastError = null;\n    this.initPromise = null;\n\n    return this.init(config);\n  }\n\n  /**\n   * Ensure the asset loader is initialized\n   * @throws {CacheNotInitializedError} If initialization fails\n   */\n  private static async ensureInitialized(): Promise<void> {\n    if (this.state === AssetLoaderState.READY) {\n      return;\n    }\n\n    if (this.state === AssetLoaderState.CACHE_UNAVAILABLE) {\n      throw new CacheNotInitializedError(\n        \"Cache API not supported in this browser\"\n      );\n    }\n\n    const result = await this.init();\n    if (!result.success) {\n      throw (\n        result.error ||\n        new CacheNotInitializedError(\"AssetLoader initialization failed\")\n      );\n    }\n  }\n\n  /**\n   * Preload an asset\n   * @param url URL of the asset to preload\n   * @param options Caching options\n   * @throws {CacheError} If preloading fails\n   */\n  static async preload(url: string, options?: CacheOptions): Promise<void> {\n    await this.ensureInitialized();\n\n    try {\n      debugLog(`Preloading asset: ${url}`);\n\n      // Check if already cached\n      const isCached = await this.isCached(url);\n      if (isCached) {\n        debugLog(`Asset already cached: ${url}`);\n        return;\n      }\n\n      // Fetch the asset\n      let response: Response;\n      try {\n        response = await fetch(url);\n      } catch (fetchError) {\n        throw new AssetFetchFailedError(\n          url,\n          undefined,\n          undefined,\n          fetchError instanceof Error ? fetchError : undefined\n        );\n      }\n\n      if (!response.ok) {\n        throw new AssetFetchFailedError(url, response.status, response.statusText);\n      }\n\n      // Get the content type and size\n      const contentType = response.headers.get(\"content-type\");\n      const contentLength = response.headers.get(\"content-length\");\n      const size = contentLength ? parseInt(contentLength, 10) : 0;\n\n      // Check if the asset is too large\n      const maxSize = this.config.maxSize ?? MAX_CACHEABLE_SIZE;\n      if (size > 0 && size > maxSize) {\n        throw new AssetTooLargeError(url, size, maxSize);\n      }\n\n      // Check if the asset should be cached\n      if (\n        !shouldCacheAsset(\n          url,\n          size,\n          contentType || undefined,\n          this.config.maxSize\n        )\n      ) {\n        debugLog(`Asset not suitable for caching: ${url}`);\n        return;\n      }\n\n      // Clone the response to avoid consuming it\n      const responseClone = response.clone();\n\n      // Get the asset data as a blob\n      const blob = await responseClone.blob();\n\n      // Generate a content hash for versioning\n      const contentHash = await generateContentHash(blob);\n      const version = options?.tags?.length\n        ? `${contentHash}-${options.tags.join(\"-\")}`\n        : contentHash;\n\n      // Create a cache entry\n      const entry = createCacheEntry<Blob>(\n        blob,\n        url,\n        contentType || undefined,\n        {\n          ttl: options?.ttl || this.config.defaultTTL,\n          tags: options?.tags,\n          version,\n        }\n      );\n\n      // Store in the cache\n      await this.storeInCache(url, entry);\n\n      // If service worker is active, cache in the service worker too\n      if (this.config.enableServiceWorker && isServiceWorkerActive()) {\n        await sendMessageToSW(ServiceWorkerMessageType.CACHE_ASSET, {\n          url,\n          version,\n          tags: options?.tags,\n        });\n      }\n\n      debugLog(`Asset preloaded: ${url}`);\n    } catch (error) {\n      debugLog(`Failed to preload asset: ${url}`, error);\n      // Re-throw CacheErrors as-is, wrap others\n      if (error instanceof CacheError) {\n        throw error;\n      }\n      throw wrapError(error, `Failed to preload asset: ${url}`);\n    }\n  }\n\n  /**\n   * Load an asset with caching\n   * @param url URL of the asset to load\n   * @param options Caching options\n   * @returns Promise resolving to the asset data with typed error information\n   */\n  static async load<T = Blob>(\n    url: string,\n    options?: CacheOptions\n  ): Promise<CacheResult<T>> {\n    // Try to initialize if not ready\n    if (this.state !== AssetLoaderState.READY) {\n      const initResult = await this.init();\n      if (!initResult.success) {\n        // Return error result if initialization fails\n        return {\n          success: false,\n          fromCache: false,\n          error:\n            initResult.error ||\n            new CacheNotInitializedError(\"AssetLoader not initialized\"),\n        };\n      }\n    }\n\n    try {\n      debugLog(`Loading asset: ${url}`);\n\n      // Try to get from cache first\n      const cachedEntry = await this.getFromCache<T>(url);\n\n      if (cachedEntry) {\n        // Check if expired\n        if (hasExpired(cachedEntry)) {\n          debugLog(`Cached asset expired: ${url}`);\n          // Remove from cache\n          await this.removeFromCache(url);\n        } else {\n          debugLog(`Asset loaded from cache: ${url}`);\n          // If revalidate is enabled, update the cache in the background\n          if (options?.revalidate) {\n            this.revalidateInBackground(url, options);\n          }\n          return {\n            success: true,\n            data: cachedEntry.data,\n            fromCache: true,\n          };\n        }\n      }\n\n      // Not in cache or expired, fetch from network\n      debugLog(`Fetching asset from network: ${url}`);\n\n      // Create a versioned URL if needed\n      const versionedUrl = VersionManager.hasVersion(url)\n        ? url\n        : VersionManager.createVersionedUrl(url);\n\n      // Fetch the asset\n      let response: Response;\n      try {\n        response = await fetch(versionedUrl);\n      } catch (fetchError) {\n        const error = new AssetFetchFailedError(\n          url,\n          undefined,\n          undefined,\n          fetchError instanceof Error ? fetchError : undefined\n        );\n        return {\n          success: false,\n          fromCache: false,\n          error,\n        };\n      }\n\n      if (!response.ok) {\n        const error = new AssetFetchFailedError(\n          url,\n          response.status,\n          response.statusText\n        );\n        return {\n          success: false,\n          fromCache: false,\n          error,\n        };\n      }\n\n      // Get the content type and size\n      const contentType = response.headers.get(\"content-type\");\n      const contentLength = response.headers.get(\"content-length\");\n      const size = contentLength ? parseInt(contentLength, 10) : 0;\n\n      // Get the asset data\n      const data = (await response.blob()) as unknown as T;\n\n      // Check if the asset should be cached\n      if (\n        shouldCacheAsset(\n          url,\n          size,\n          contentType || undefined,\n          this.config.maxSize\n        )\n      ) {\n        try {\n          // Generate a content hash for versioning\n          const contentHash = await generateContentHash(\n            data as unknown as Blob\n          );\n          const version = options?.tags?.length\n            ? `${contentHash}-${options.tags.join(\"-\")}`\n            : contentHash;\n\n          // Create a cache entry\n          const entry = createCacheEntry<T>(\n            data,\n            url,\n            contentType || undefined,\n            {\n              ttl: options?.ttl || this.config.defaultTTL,\n              tags: options?.tags,\n              version,\n            }\n          );\n\n          // Store in the cache\n          await this.storeInCache(url, entry);\n\n          // If service worker is active, cache in the service worker too\n          if (this.config.enableServiceWorker && isServiceWorkerActive()) {\n            await sendMessageToSW(ServiceWorkerMessageType.CACHE_ASSET, {\n              url,\n              version,\n              tags: options?.tags,\n            });\n          }\n        } catch (cacheError) {\n          // Log cache errors but don't fail the load - we still have the data\n          debugLog(`Failed to cache asset (non-fatal): ${url}`, cacheError);\n          // If quota exceeded, clear old entries and try again\n          if (isQuotaExceededError(cacheError)) {\n            debugLog(\"Storage quota exceeded, attempting cleanup...\");\n            // Don't throw - we have the data, just couldn't cache it\n          }\n        }\n      }\n\n      return {\n        success: true,\n        data,\n        fromCache: false,\n      };\n    } catch (error) {\n      debugLog(`Failed to load asset: ${url}`, error);\n      const cacheError =\n        error instanceof CacheError\n          ? error\n          : wrapError(error, `Failed to load asset: ${url}`);\n      return {\n        success: false,\n        fromCache: false,\n        error: cacheError,\n      };\n    }\n  }\n\n  /**\n   * Check if an asset is cached\n   * @param url URL of the asset\n   * @returns Whether the asset is cached\n   */\n  static async isCached(url: string): Promise<boolean> {\n    await this.ensureInitialized();\n\n    try {\n      // Check in-memory cache\n      const cachedEntry = await this.getFromCache(url);\n      if (cachedEntry && !hasExpired(cachedEntry)) {\n        return true;\n      }\n\n      // If service worker is active, check service worker cache\n      if (this.config.enableServiceWorker && isServiceWorkerActive()) {\n        const result = await sendMessageToSW<{ cached: boolean }>(\n          ServiceWorkerMessageType.CHECK_ASSET,\n          { url }\n        );\n        return result?.cached || false;\n      }\n\n      return false;\n    } catch (error) {\n      debugLog(`Failed to check if asset is cached: ${url}`, error);\n      return false;\n    }\n  }\n\n  /**\n   * Invalidate a cached asset\n   * @param url URL of the asset to invalidate\n   * @throws {CacheError} If invalidation fails\n   */\n  static async invalidate(url: string): Promise<void> {\n    await this.ensureInitialized();\n\n    try {\n      debugLog(`Invalidating asset: ${url}`);\n\n      // Remove from cache\n      await this.removeFromCache(url);\n\n      // If service worker is active, invalidate in the service worker too\n      if (this.config.enableServiceWorker && isServiceWorkerActive()) {\n        await sendMessageToSW(ServiceWorkerMessageType.INVALIDATE_ASSET, {\n          url,\n        });\n      }\n\n      debugLog(`Asset invalidated: ${url}`);\n    } catch (error) {\n      debugLog(`Failed to invalidate asset: ${url}`, error);\n      if (error instanceof CacheError) {\n        throw error;\n      }\n      throw wrapError(error, `Failed to invalidate asset: ${url}`);\n    }\n  }\n\n  /**\n   * Invalidate cached assets by tag\n   * @param tag Tag to invalidate\n   * @throws {CacheError} If invalidation fails\n   */\n  static async invalidateByTag(tag: string): Promise<void> {\n    await this.ensureInitialized();\n\n    try {\n      debugLog(`Invalidating assets with tag: ${tag}`);\n\n      // Get assets with the tag\n      const assets = await CacheManager.getAssetsByTag(tag);\n\n      // Invalidate each asset\n      for (const asset of assets) {\n        await this.removeFromCache(asset.url);\n      }\n\n      // If service worker is active, invalidate in the service worker too\n      if (this.config.enableServiceWorker && isServiceWorkerActive()) {\n        await sendMessageToSW(ServiceWorkerMessageType.INVALIDATE_TAG, {\n          tag,\n        });\n      }\n\n      debugLog(`Assets with tag invalidated: ${tag}`);\n    } catch (error) {\n      debugLog(`Failed to invalidate assets with tag: ${tag}`, error);\n      if (error instanceof CacheError) {\n        throw error;\n      }\n      throw wrapError(error, `Failed to invalidate assets with tag: ${tag}`);\n    }\n  }\n\n  /**\n   * Store an asset in the cache\n   * @param url URL of the asset\n   * @param entry Cache entry\n   * @throws {CacheError} If storage fails (e.g., quota exceeded)\n   */\n  private static async storeInCache<T>(\n    url: string,\n    entry: CacheEntry<T>\n  ): Promise<void> {\n    try {\n      // Generate a cache key\n      const cacheKey = generateCacheKey(url);\n\n      // Create a response from the blob\n      const response = new Response(entry.data as unknown as Blob, {\n        headers: {\n          \"Content-Type\":\n            entry.type === AssetType.OTHER\n              ? \"application/octet-stream\"\n              : `${entry.type}/*`,\n        },\n      });\n\n      // Get the cache\n      const cache = await caches.open(\n        this.config.cacheName || DEFAULT_CACHE_NAME\n      );\n\n      // Store in the cache\n      await cache.put(cacheKey, response);\n\n      // Add to the manifest\n      await CacheManager.addToManifest(url, {\n        type: entry.type,\n        version: entry.version || Date.now().toString(36),\n        lastModified: new Date().toISOString(),\n        size: entry.data instanceof Blob ? entry.data.size : 0,\n        tags: entry.tags,\n      });\n\n      debugLog(`Asset stored in cache: ${url}`);\n    } catch (error) {\n      debugLog(`Failed to store asset in cache: ${url}`, error);\n      // Check for quota exceeded error\n      if (isQuotaExceededError(error)) {\n        throw new StorageQuotaExceededError(\n          error instanceof Error ? error : undefined\n        );\n      }\n      if (error instanceof CacheError) {\n        throw error;\n      }\n      throw wrapError(error, `Failed to store asset in cache: ${url}`);\n    }\n  }\n\n  /**\n   * Get an asset from the cache\n   * @param url URL of the asset\n   * @returns Cache entry or null if not found\n   */\n  private static async getFromCache<T>(\n    url: string\n  ): Promise<CacheEntry<T> | null> {\n    try {\n      // Generate a cache key\n      const cacheKey = generateCacheKey(url);\n\n      // Get the cache\n      const cache = await caches.open(\n        this.config.cacheName || DEFAULT_CACHE_NAME\n      );\n\n      // Try to get from cache\n      const response = await cache.match(cacheKey);\n      if (!response) {\n        return null;\n      }\n\n      // Get the asset metadata\n      const metadata = await CacheManager.getAssetMetadata(url);\n      if (!metadata) {\n        return null;\n      }\n\n      // Get the blob from the response\n      const blob = await response.blob();\n\n      // Create a cache entry\n      return {\n        data: blob as unknown as T,\n        timestamp: new Date(metadata.lastModified).getTime(),\n        expires: metadata.lastModified\n          ? new Date(metadata.lastModified).getTime() +\n            (this.config.defaultTTL || DEFAULT_CACHE_TTL) * 1000\n          : undefined,\n        type: metadata.type,\n        tags: metadata.tags,\n        version: metadata.version,\n      };\n    } catch (error) {\n      debugLog(`Failed to get asset from cache: ${url}`, error);\n      return null;\n    }\n  }\n\n  /**\n   * Remove an asset from the cache\n   * @param url URL of the asset\n   * @throws {CacheError} If removal fails\n   */\n  private static async removeFromCache(url: string): Promise<void> {\n    try {\n      // Generate a cache key\n      const cacheKey = generateCacheKey(url);\n\n      // Get the cache\n      const cache = await caches.open(\n        this.config.cacheName || DEFAULT_CACHE_NAME\n      );\n\n      // Remove from cache\n      await cache.delete(cacheKey);\n\n      // Remove from manifest\n      await CacheManager.removeFromManifest(url);\n\n      debugLog(`Asset removed from cache: ${url}`);\n    } catch (error) {\n      debugLog(`Failed to remove asset from cache: ${url}`, error);\n      if (error instanceof CacheError) {\n        throw error;\n      }\n      throw wrapError(error, `Failed to remove asset from cache: ${url}`);\n    }\n  }\n\n  /**\n   * Revalidate an asset in the background\n   * Background revalidation errors are logged but not thrown\n   * @param url URL of the asset\n   * @param options Caching options\n   */\n  private static async revalidateInBackground(\n    url: string,\n    options?: CacheOptions\n  ): Promise<void> {\n    try {\n      debugLog(`Revalidating asset in background: ${url}`);\n\n      // Create a versioned URL if needed\n      const versionedUrl = VersionManager.hasVersion(url)\n        ? url\n        : VersionManager.createVersionedUrl(url || \"\");\n\n      // Fetch the asset\n      let response: Response;\n      try {\n        response = await fetch(versionedUrl);\n      } catch (fetchError) {\n        debugLog(\n          `Background revalidation fetch failed: ${url}`,\n          fetchError\n        );\n        return; // Don't throw in background operation\n      }\n\n      if (!response.ok) {\n        debugLog(\n          `Background revalidation received non-ok response: ${url} (${response.status})`\n        );\n        return; // Don't throw in background operation\n      }\n\n      // Get the content type and size\n      const contentType = response.headers.get(\"content-type\");\n      const contentLength = response.headers.get(\"content-length\") || undefined;\n      const size = contentLength ? parseInt(contentLength, 10) : 0;\n\n      // Check if the asset should be cached\n      if (\n        !shouldCacheAsset(\n          url,\n          size,\n          contentType || undefined,\n          this.config.maxSize\n        )\n      ) {\n        debugLog(`Asset not suitable for caching: ${url}`);\n        return;\n      }\n\n      // Get the asset data\n      const blob = await response.blob();\n\n      // Generate a content hash for versioning\n      const contentHash = await generateContentHash(blob);\n      const version = options?.tags?.length\n        ? `${contentHash}-${options.tags.join(\"-\")}`\n        : contentHash;\n\n      // Get the current version from the cache\n      const metadata = await CacheManager.getAssetMetadata(url);\n      if (metadata && metadata.version === version) {\n        debugLog(`Asset unchanged, no need to update cache: ${url}`);\n        return;\n      }\n\n      // Create a cache entry\n      const entry = createCacheEntry<Blob>(\n        blob,\n        url,\n        contentType || undefined,\n        {\n          ttl: options?.ttl || this.config.defaultTTL,\n          tags: options?.tags,\n          version,\n        }\n      );\n\n      // Store in the cache\n      await this.storeInCache(url, entry);\n\n      // If service worker is active, cache in the service worker too\n      if (this.config.enableServiceWorker && isServiceWorkerActive()) {\n        await sendMessageToSW(ServiceWorkerMessageType.CACHE_ASSET, {\n          url,\n          version,\n          tags: options?.tags,\n        });\n      }\n\n      debugLog(`Asset revalidated: ${url}`);\n    } catch (error) {\n      // Log but don't throw - this is a background operation\n      debugLog(`Failed to revalidate asset (background): ${url}`, error);\n    }\n  }\n}\n","/**\n * @shopkit/asset-cache\n *\n * Asset caching system for storefronts with Service Worker support.\n * Provides intelligent caching strategies for images, fonts, and other assets.\n *\n * ## Features\n * - Multiple caching strategies (cache-first, network-first, stale-while-revalidate)\n * - Service Worker integration for offline support\n * - Cache versioning and automatic invalidation\n * - Tag-based cache management\n * - Size-based cache limits\n *\n * ## Usage\n *\n * ```typescript\n * import { initAssetCache, AssetLoader } from '@shopkit/asset-cache';\n *\n * // Initialize the cache system\n * await initAssetCache({\n *   enabled: true,\n *   version: '1.0.0',\n *   storageName: 'my-store-assets',\n *   maxSize: 50, // MB\n *   maxAge: 86400, // 24 hours\n *   serviceWorkerEnabled: true,\n * });\n *\n * // Load assets with caching\n * const imageBlob = await AssetLoader.load('https://example.com/image.jpg');\n * ```\n *\n * @packageDocumentation\n */\n\n// Export types\nexport * from \"./config/types\";\n\n// Export constants\nexport * from \"./config/constants\";\n\n// Export utilities\nexport * from \"./utils/cache-helpers\";\nexport * from \"./utils/hash-generator\";\n\n// Export strategies\nexport * from \"./strategies/cache-first\";\nexport * from \"./strategies/network-first\";\nexport * from \"./strategies/stale-while-revalidate\";\n\n// Export main components\nexport {\n  AssetLoader,\n  AssetLoaderState,\n} from \"./core/asset-loader\";\nexport type { AssetLoaderInitResult } from \"./core/asset-loader\";\nexport { CacheManager, CacheManagerState } from \"./core/cache-manager\";\nexport type { InitResult } from \"./core/cache-manager\";\nexport { VersionManager } from \"./core/version-manager\";\nexport {\n  registerServiceWorker,\n  sendMessageToSW,\n  isServiceWorkerActive,\n  unregisterAllServiceWorkers,\n} from \"./core/register-sw\";\n\n// Export errors\nexport * from \"./core/errors\";\n\n// Export initialization\nexport * from \"./init\";\n","/**\n * Cache-first strategy implementation\n *\n * This strategy:\n * 1. Tries to get the resource from the cache first\n * 2. If not in cache, fetches from network and caches the response\n * 3. Returns the cached or network response\n *\n * Best for: Static assets that rarely change (images, fonts)\n */\nimport { debugLog } from \"../utils/cache-helpers\";\nimport { generateCacheKey } from \"../utils/hash-generator\";\n\n/**\n * Cache-first strategy for fetch requests\n * @param request The request to handle\n * @param cacheName The name of the cache to use\n * @returns Promise resolving to the response\n */\nexport async function cacheFirstStrategy(\n  request: Request,\n  cacheName: string\n): Promise<Response> {\n  const cacheKey = generateCacheKey(request.url);\n\n  try {\n    // Try to get from cache first\n    const cache = await caches.open(cacheName);\n    const cachedResponse = await cache.match(cacheKey);\n\n    if (cachedResponse) {\n      debugLog(`Cache hit for ${request.url}`);\n      return cachedResponse;\n    }\n\n    // Not in cache, fetch from network\n    debugLog(`Cache miss for ${request.url}, fetching from network`);\n    const networkResponse = await fetch(request);\n\n    // Cache the response if it's valid\n    if (networkResponse.ok && networkResponse.status < 400) {\n      // Clone the response before caching it\n      const responseToCache = networkResponse.clone();\n      cache.put(cacheKey, responseToCache);\n      debugLog(`Cached response for ${request.url}`);\n    }\n\n    return networkResponse;\n  } catch (error) {\n    debugLog(`Error in cache-first strategy for ${request.url}:`, error);\n    // If both cache and network fail, throw an error\n    throw error;\n  }\n}\n\n/**\n * Cache-first strategy for the Cache API\n * @param cache The cache object\n * @param url The URL to fetch\n * @param fetchOptions Options for the fetch request\n * @returns Promise resolving to the response\n */\nexport async function cacheFirstWithCacheAPI(\n  cache: Cache,\n  url: string,\n  fetchOptions?: RequestInit\n): Promise<Response> {\n  const cacheKey = generateCacheKey(url);\n\n  try {\n    // Try to get from cache first\n    const cachedResponse = await cache.match(cacheKey);\n\n    if (cachedResponse) {\n      debugLog(`Cache hit for ${url}`);\n      return cachedResponse;\n    }\n\n    // Not in cache, fetch from network\n    debugLog(`Cache miss for ${url}, fetching from network`);\n    const networkResponse = await fetch(url, fetchOptions);\n\n    // Cache the response if it's valid\n    if (networkResponse.ok && networkResponse.status < 400) {\n      // Clone the response before caching it\n      const responseToCache = networkResponse.clone();\n      cache.put(cacheKey, responseToCache);\n      debugLog(`Cached response for ${url}`);\n    }\n\n    return networkResponse;\n  } catch (error) {\n    debugLog(`Error in cache-first strategy for ${url}:`, error);\n    // If both cache and network fail, throw an error\n    throw error;\n  }\n}\n","/**\n * Network-first strategy implementation\n *\n * This strategy:\n * 1. Tries to get the resource from the network first\n * 2. If network fails, falls back to cache\n * 3. Updates the cache with the new network response if successful\n *\n * Best for: Resources that change frequently but should still work offline\n * when necessary (videos, dynamic content)\n */\nimport { debugLog } from \"../utils/cache-helpers\";\nimport { generateCacheKey } from \"../utils/hash-generator\";\n\n/**\n * Network-first strategy for fetch requests\n * @param request The request to handle\n * @param cacheName The name of the cache to use\n * @param timeoutMs Timeout for network requests in milliseconds\n * @returns Promise resolving to the response\n */\nexport async function networkFirstStrategy(\n  request: Request,\n  cacheName: string,\n  timeoutMs = 3000\n): Promise<Response> {\n  const cacheKey = generateCacheKey(request.url);\n\n  try {\n    // Try network first with timeout\n    const networkPromise = fetchWithTimeout(request, timeoutMs);\n\n    try {\n      const networkResponse = await networkPromise;\n\n      // Cache the successful response\n      if (networkResponse.ok && networkResponse.status < 400) {\n        const cache = await caches.open(cacheName);\n        // Clone the response before caching it\n        const responseToCache = networkResponse.clone();\n        cache.put(cacheKey, responseToCache);\n        debugLog(`Updated cache for ${request.url}`);\n      }\n\n      return networkResponse;\n    } catch (error) {\n      debugLog(\n        `Network request failed for ${request.url}, falling back to cache`\n      );\n\n      // Network failed, try cache\n      const cache = await caches.open(cacheName);\n      const cachedResponse = await cache.match(cacheKey);\n\n      if (cachedResponse) {\n        debugLog(`Serving from cache for ${request.url}`);\n        return cachedResponse;\n      }\n\n      // If both network and cache fail, throw the original error\n      throw error;\n    }\n  } catch (error) {\n    debugLog(`Error in network-first strategy for ${request.url}:`, error);\n    throw error;\n  }\n}\n\n/**\n * Network-first strategy for the Cache API\n * @param cache The cache object\n * @param url The URL to fetch\n * @param fetchOptions Options for the fetch request\n * @param timeoutMs Timeout for network requests in milliseconds\n * @returns Promise resolving to the response\n */\nexport async function networkFirstWithCacheAPI(\n  cache: Cache,\n  url: string,\n  fetchOptions?: RequestInit,\n  timeoutMs = 3000\n): Promise<Response> {\n  const cacheKey = generateCacheKey(url);\n\n  try {\n    // Try network first with timeout\n    const networkPromise = fetchWithTimeout(url, timeoutMs, fetchOptions);\n\n    try {\n      const networkResponse = await networkPromise;\n\n      // Cache the successful response\n      if (networkResponse.ok && networkResponse.status < 400) {\n        // Clone the response before caching it\n        const responseToCache = networkResponse.clone();\n        cache.put(cacheKey, responseToCache);\n        debugLog(`Updated cache for ${url}`);\n      }\n\n      return networkResponse;\n    } catch (error) {\n      debugLog(`Network request failed for ${url}, falling back to cache`);\n\n      // Network failed, try cache\n      const cachedResponse = await cache.match(cacheKey);\n\n      if (cachedResponse) {\n        debugLog(`Serving from cache for ${url}`);\n        return cachedResponse;\n      }\n\n      // If both network and cache fail, throw the original error\n      throw error;\n    }\n  } catch (error) {\n    debugLog(`Error in network-first strategy for ${url}:`, error);\n    throw error;\n  }\n}\n\n/**\n * Fetch with timeout\n * @param request The request or URL to fetch\n * @param timeoutMs Timeout in milliseconds\n * @param options Fetch options\n * @returns Promise resolving to the response\n */\nasync function fetchWithTimeout(\n  request: Request | string,\n  timeoutMs: number,\n  options?: RequestInit\n): Promise<Response> {\n  const controller = new AbortController();\n  const { signal } = controller;\n\n  // Create a timeout that aborts the fetch\n  const timeout = setTimeout(() => {\n    controller.abort();\n  }, timeoutMs);\n\n  try {\n    // Merge the abort signal with any existing options\n    const fetchOptions = {\n      ...(options || {}),\n      signal,\n    };\n\n    const response = await fetch(request, fetchOptions);\n    clearTimeout(timeout);\n    return response;\n  } catch (error) {\n    clearTimeout(timeout);\n    throw error;\n  }\n}\n","/**\n * Stale-while-revalidate strategy implementation\n *\n * This strategy:\n * 1. Returns cached response immediately if available (even if stale)\n * 2. Fetches a fresh response from the network in the background\n * 3. Updates the cache with the new response for next time\n *\n * Best for: Resources where having the most up-to-date version is good\n * but not critical (CSS, JS, JSON data)\n */\nimport { debugLog } from \"../utils/cache-helpers\";\nimport { generateCacheKey } from \"../utils/hash-generator\";\n\n/**\n * Stale-while-revalidate strategy for fetch requests\n * @param request The request to handle\n * @param cacheName The name of the cache to use\n * @returns Promise resolving to the response\n */\nexport async function staleWhileRevalidateStrategy(\n  request: Request,\n  cacheName: string\n): Promise<Response> {\n  const cacheKey = generateCacheKey(request.url);\n\n  try {\n    const cache = await caches.open(cacheName);\n    const cachedResponse = await cache.match(cacheKey);\n\n    // Start network fetch in the background\n    const fetchPromise = fetch(request)\n      .then((networkResponse) => {\n        // Cache the new response if it's valid\n        if (networkResponse.ok && networkResponse.status < 400) {\n          // Clone the response before caching it\n          const responseToCache = networkResponse.clone();\n          cache.put(cacheKey, responseToCache);\n          debugLog(`Updated cache for ${request.url} in background`);\n        }\n        return networkResponse;\n      })\n      .catch((error) => {\n        debugLog(`Background fetch failed for ${request.url}:`, error);\n        // If the background fetch fails, we still have the cached response\n        // so we can ignore this error\n        return null;\n      });\n\n    // If we have a cached response, return it immediately\n    if (cachedResponse) {\n      debugLog(\n        `Returning cached response for ${request.url} while revalidating`\n      );\n      // Revalidate in the background\n      fetchPromise;\n      return cachedResponse;\n    }\n\n    // If no cached response, wait for the network response\n    debugLog(`No cached response for ${request.url}, waiting for network`);\n    const networkResponse = await fetchPromise;\n\n    if (!networkResponse) {\n      throw new Error(`Failed to fetch ${request.url}`);\n    }\n\n    return networkResponse;\n  } catch (error) {\n    debugLog(\n      `Error in stale-while-revalidate strategy for ${request.url}:`,\n      error\n    );\n    throw error;\n  }\n}\n\n/**\n * Stale-while-revalidate strategy for the Cache API\n * @param cache The cache object\n * @param url The URL to fetch\n * @param fetchOptions Options for the fetch request\n * @returns Promise resolving to the response\n */\nexport async function staleWhileRevalidateWithCacheAPI(\n  cache: Cache,\n  url: string,\n  fetchOptions?: RequestInit\n): Promise<Response> {\n  const cacheKey = generateCacheKey(url);\n\n  try {\n    const cachedResponse = await cache.match(cacheKey);\n\n    // Start network fetch in the background\n    const fetchPromise = fetch(url, fetchOptions)\n      .then((networkResponse) => {\n        // Cache the new response if it's valid\n        if (networkResponse.ok && networkResponse.status < 400) {\n          // Clone the response before caching it\n          const responseToCache = networkResponse.clone();\n          cache.put(cacheKey, responseToCache);\n          debugLog(`Updated cache for ${url} in background`);\n        }\n        return networkResponse;\n      })\n      .catch((error) => {\n        debugLog(`Background fetch failed for ${url}:`, error);\n        // If the background fetch fails, we still have the cached response\n        // so we can ignore this error\n        return null;\n      });\n\n    // If we have a cached response, return it immediately\n    if (cachedResponse) {\n      debugLog(`Returning cached response for ${url} while revalidating`);\n      // Revalidate in the background\n      fetchPromise;\n      return cachedResponse;\n    }\n\n    // If no cached response, wait for the network response\n    debugLog(`No cached response for ${url}, waiting for network`);\n    const networkResponse = await fetchPromise;\n\n    if (!networkResponse) {\n      throw new Error(`Failed to fetch ${url}`);\n    }\n\n    return networkResponse;\n  } catch (error) {\n    debugLog(`Error in stale-while-revalidate strategy for ${url}:`, error);\n    throw error;\n  }\n}\n\n/**\n * Determine if a cached response is stale based on its age\n * @param response The cached response\n * @param staleTimeMs Time in milliseconds after which a response is considered stale\n * @returns Whether the response is stale\n */\nexport function isResponseStale(\n  response: Response,\n  staleTimeMs = 24 * 60 * 60 * 1000 // 1 day by default\n): boolean {\n  // Check for Date header\n  const dateHeader = response.headers.get(\"date\");\n  if (!dateHeader) {\n    // If no date header, consider it stale to be safe\n    return true;\n  }\n\n  const responseDate = new Date(dateHeader).getTime();\n  const now = Date.now();\n\n  // If the response is older than staleTimeMs, it's stale\n  return now - responseDate > staleTimeMs;\n}\n","/**\n * Asset Cache Initialization\n *\n * Entry point for initializing the asset caching system.\n *\n * @module @shopkit/asset-cache\n */\n\nimport type { AssetCacheConfig } from \"./config\";\n\n/**\n * Initialize the asset caching module\n *\n * Sets up the AssetLoader, VersionManager, and optionally registers\n * a Service Worker for offline asset caching.\n *\n * @param config - Asset cache configuration options\n * @returns Promise that resolves when initialization is complete\n *\n * @example\n * ```typescript\n * import { initAssetCache } from '@shopkit/asset-cache';\n *\n * // Initialize with default settings\n * await initAssetCache();\n *\n * // Initialize with custom settings\n * await initAssetCache({\n *   enabled: true,\n *   version: '1.0.0',\n *   storageName: 'my-store-assets',\n *   maxSize: 50, // MB\n *   maxAge: 86400, // 24 hours\n *   serviceWorkerEnabled: true,\n *   serviceWorkerPath: '/sw.js',\n * });\n * ```\n */\nexport async function initAssetCache(config?: AssetCacheConfig): Promise<void> {\n  const { AssetLoader } = await import(\"./core/asset-loader\");\n  const { VersionManager } = await import(\"./core/version-manager\");\n  const { registerServiceWorker } = await import(\"./core/register-sw\");\n  const { mergeAssetCacheConfig } = await import(\"./config\");\n\n  // Merge configuration with defaults\n  const mergedConfig = mergeAssetCacheConfig(config);\n\n  // Initialize the asset loader with merged config\n  await AssetLoader.init({\n    cacheName: mergedConfig.storageName,\n    enableServiceWorker: mergedConfig.serviceWorkerEnabled,\n    debug: mergedConfig.debug,\n    defaultTTL: mergedConfig.maxAge,\n    maxSize: mergedConfig.maxSize * 1024 * 1024, // Convert MB to bytes\n  });\n\n  // Initialize the version manager\n  VersionManager.init(mergedConfig.version);\n\n  // Register the service worker if enabled\n  if (mergedConfig.serviceWorkerEnabled) {\n    await registerServiceWorker(mergedConfig.serviceWorkerPath);\n  }\n}\n"]}