{"version":3,"sources":["../src/index.ts","../src/with-persistence.ts"],"sourcesContent":["export type { PersistenceConfig, StoredData } from \"./types.ts\";\nexport * from \"./with-persistence.ts\";\n","import type { Container } from \"containerized-state\";\nimport type { PersistenceConfig, StoredData } from \"./types.ts\";\n\n/**\n * Wraps a Container with persistence functionality.\n *\n * Note: This function modifies the original container instance by augmenting it\n * with persistence features. It does not create a new container instance.\n *\n * @template T The type of the container's value\n * @param container The container instance to add persistence to\n * @param config Persistence configuration options\n * @returns The same container instance with persistence functionality added\n *\n * @example\n * ```typescript\n * const persistentContainer = withPersistence(\n *   Container.create({ count: 0 }),\n *   {\n *     key: 'my-counter',\n *     storage: localStorage,\n *\n *     // 24 hours\n *     ttl: 24 * 60 * 60 * 1000\n *   }\n * );\n * ```\n */\nexport const withPersistence = <T>(\n  container: Container<T>,\n  config: PersistenceConfig,\n): Container<T> => {\n  const { key, storage, ttl } = config;\n\n  /**\n   * Loads persisted value from storage if available and not expired.\n   *\n   * @returns The persisted value or null if not found/expired\n   */\n  const loadPersistedValue = (): T | null => {\n    try {\n      const stored = storage.getItem(key);\n\n      if (!stored) return null;\n\n      const data = JSON.parse(stored) as StoredData<T>;\n\n      // Check if data has expired\n      if (ttl && Date.now() - data.timestamp > ttl) {\n        storage.removeItem(key);\n\n        return null;\n      }\n\n      return data.value;\n    } catch {\n      // Return null if parsing fails or storage is unavailable\n      return null;\n    }\n  };\n\n  /**\n   * Saves value to storage with current timestamp.\n   *\n   * @param value The value to persist\n   */\n  const saveValue = (value: T): void => {\n    try {\n      const data: StoredData<T> = {\n        value,\n        timestamp: Date.now(),\n      };\n\n      storage.setItem(key, JSON.stringify(data));\n    } catch {\n      // Silently fail if storage is unavailable\n    }\n  };\n\n  // Override setValue to add persistence\n  const originalSetValue = container.setValue.bind(container);\n\n  container.setValue = async (newValue: T): Promise<void> => {\n    await originalSetValue(newValue);\n\n    saveValue(newValue);\n  };\n\n  // Override reset to clear persisted data\n  const originalReset = container.reset.bind(container);\n\n  container.reset = async (): Promise<void> => {\n    await originalReset();\n\n    storage.removeItem(key);\n  };\n\n  // Initialize container with persisted value if available\n  void container.setValue(loadPersistedValue() ?? container.getValue());\n\n  return container;\n};\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GC4BO,IAAMI,EAAkB,CAC7BC,EACAC,IACiB,CA/BnB,IAAAC,EAgCE,GAAM,CAAE,IAAAC,EAAK,QAAAC,EAAS,IAAAC,CAAI,EAAIJ,EAOxBK,EAAqB,IAAgB,CACzC,GAAI,CACF,IAAMC,EAASH,EAAQ,QAAQD,CAAG,EAElC,GAAI,CAACI,EAAQ,OAAO,KAEpB,IAAMC,EAAO,KAAK,MAAMD,CAAM,EAG9B,OAAIF,GAAO,KAAK,IAAI,EAAIG,EAAK,UAAYH,GACvCD,EAAQ,WAAWD,CAAG,EAEf,MAGFK,EAAK,KACd,OAAQC,EAAA,CAEN,OAAO,IACT,CACF,EAOMC,EAAaC,GAAmB,CACpC,GAAI,CACF,IAAMH,EAAsB,CAC1B,MAAAG,EACA,UAAW,KAAK,IAAI,CACtB,EAEAP,EAAQ,QAAQD,EAAK,KAAK,UAAUK,CAAI,CAAC,CAC3C,OAAQC,EAAA,CAER,CACF,EAGMG,EAAmBZ,EAAU,SAAS,KAAKA,CAAS,EAE1DA,EAAU,SAAW,MAAOa,GAA+B,CACzD,MAAMD,EAAiBC,CAAQ,EAE/BH,EAAUG,CAAQ,CACpB,EAGA,IAAMC,EAAgBd,EAAU,MAAM,KAAKA,CAAS,EAEpD,OAAAA,EAAU,MAAQ,SAA2B,CAC3C,MAAMc,EAAc,EAEpBV,EAAQ,WAAWD,CAAG,CACxB,EAGKH,EAAU,UAASE,EAAAI,EAAmB,IAAnB,KAAAJ,EAAwBF,EAAU,SAAS,CAAC,EAE7DA,CACT","names":["index_exports","__export","withPersistence","__toCommonJS","withPersistence","container","config","_a","key","storage","ttl","loadPersistedValue","stored","data","e","saveValue","value","originalSetValue","newValue","originalReset"]}