{"version":3,"file":"reastorage.mjs","sources":["../src/reastorage.ts"],"sourcesContent":["import { Compress, Options, ReastorageInterface } from \"./ReastorageInterface\";\nimport { DataOrUpdaterFn, isUpdaterFn } from \"./utils\";\nimport {\n  compress as lzCompress,\n  decompress as lzDecompress,\n  compressToUTF16,\n  decompressFromUTF16,\n} from \"lz-string\";\n\nconst handleCompressMethod = (compress: Compress, isDecompress?: boolean) => {\n  switch (compress) {\n    case \"utf-16\":\n      return isDecompress ? decompressFromUTF16 : compressToUTF16;\n    case \"default\":\n      return isDecompress ? lzDecompress : lzCompress;\n    default:\n      throw new Error(\"Invalid compress method\");\n  }\n};\n\nconst getStorageItem = (storage: Storage, key: string, compress: Compress) => {\n  const item = storage.getItem(key);\n  if (item) {\n    return JSON.parse(\n      compress\n        ? (handleCompressMethod(compress, true)(item) as string) || item\n        : item\n    );\n  }\n  return null;\n};\n\nconst setStorageItem = <T>(\n  storage: Storage,\n  key: string,\n  value: T,\n  compress: Compress\n) => {\n  const item = JSON.stringify(value);\n  storage.setItem(\n    key,\n    compress ? (handleCompressMethod(compress)(item) as string) : item\n  );\n};\n\nexport const reastorage = <T>(\n  key: string,\n  initialValue: T,\n  options: Options = { storage: \"local\", compress: \"default\" }\n): ReastorageInterface<T> => {\n  const { storage, compress } = options;\n  let data = initialValue;\n  let getInitial = false;\n  let listeners = new Set<VoidFunction>();\n\n  const get = () => {\n    if (getInitial) return data;\n    if (typeof window === \"undefined\") return initialValue;\n    getInitial = true;\n\n    const targetValue = getStorageItem(\n      window[`${storage}Storage`],\n      key,\n      compress\n    );\n    if (targetValue === null) {\n      setStorageItem(window[`${storage}Storage`], key, initialValue, compress);\n    } else {\n      data = targetValue;\n    }\n    return data;\n  };\n\n  const getInitialValue = () => initialValue;\n\n  const set = (dataOrUpdater: DataOrUpdaterFn<T>) => {\n    const value = isUpdaterFn(dataOrUpdater)\n      ? dataOrUpdater(data)\n      : dataOrUpdater;\n\n    setStorageItem(window[`${storage}Storage`], key, value, compress);\n    data = value;\n    listeners.forEach((cb) => cb());\n  };\n  const reset = () => set(initialValue);\n\n  const subscribe = (listen: VoidFunction) => {\n    listeners.add(listen);\n    return () => {\n      listeners.delete(listen);\n    };\n  };\n\n  return {\n    get,\n    getInitialValue,\n    reset,\n    set,\n    subscribe,\n  };\n};\n"],"names":["handleCompressMethod","compress","isDecompress","decompressFromUTF16","compressToUTF16","lzDecompress","lzCompress","getStorageItem","storage","key","item","setStorageItem","value","reastorage","initialValue","options","data","getInitial","listeners","get","targetValue","getInitialValue","set","dataOrUpdater","isUpdaterFn","cb","listen"],"mappings":"6IASA,MAAMA,EAAuB,CAACC,EAAoBC,IAA2B,CAC3E,OAAQD,OACD,SACH,OAAOC,EAAeC,EAAsBC,MACzC,UACH,OAAOF,EAAeG,EAAeC,UAErC,MAAM,IAAI,MAAM,yBAAyB,EAE/C,EAEMC,EAAiB,CAACC,EAAkBC,EAAaR,IAAuB,CAC5E,MAAMS,EAAOF,EAAQ,QAAQC,CAAG,EAChC,OAAIC,EACK,KAAK,MACVT,GACKD,EAAqBC,EAAU,EAAI,EAAES,CAAI,GAAgBA,CAEhE,EAEK,IACT,EAEMC,EAAiB,CACrBH,EACAC,EACAG,EACAX,IACG,CACH,MAAMS,EAAO,KAAK,UAAUE,CAAK,EACjCJ,EAAQ,QACNC,EACAR,EAAYD,EAAqBC,CAAQ,EAAES,CAAI,EAAeA,CAChE,CACF,EAEaG,EAAa,CACxBJ,EACAK,EACAC,EAAmB,CAAE,QAAS,QAAS,SAAU,SAAU,IAChC,CAC3B,KAAM,CAAE,QAAAP,EAAS,SAAAP,CAAS,EAAIc,EAC9B,IAAIC,EAAOF,EACPG,EAAa,GACbC,EAAY,IAAI,IAEpB,MAAMC,EAAM,IAAM,CAChB,GAAIF,EAAY,OAAOD,EACvB,GAAI,OAAO,OAAW,IAAa,OAAOF,EAC1CG,EAAa,GAEb,MAAMG,EAAcb,EAClB,OAAO,GAAGC,YACVC,EACAR,CACF,EACA,OAAImB,IAAgB,KAClBT,EAAe,OAAO,GAAGH,YAAmBC,EAAKK,EAAcb,CAAQ,EAEvEe,EAAOI,EAEFJ,CACT,EAEMK,EAAkB,IAAMP,EAExBQ,EAAOC,GAAsC,CACjD,MAAMX,EAAQY,EAAYD,CAAa,EACnCA,EAAcP,CAAI,EAClBO,EAEJZ,EAAe,OAAO,GAAGH,YAAmBC,EAAKG,EAAOX,CAAQ,EAChEe,EAAOJ,EACPM,EAAU,QAASO,GAAOA,EAAG,CAAC,CAChC,EAUA,MAAO,CACL,IAAAN,EACA,gBAAAE,EACA,MAZY,IAAMC,EAAIR,CAAY,EAalC,IAAAQ,EACA,UAZiBI,IACjBR,EAAU,IAAIQ,CAAM,EACb,IAAM,CACXR,EAAU,OAAOQ,CAAM,CACzB,EASF,CACF"}