{"version":3,"sources":["../../src/persistModule/index.ts"],"names":["alwaysTrue_default","toKey"],"mappings":"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","file":"chunk-LP2Y3GPZ.cjs","sourcesContent":["import toKey from 'keyweaver';\nimport type { StateInitializer } from '../types';\nimport alwaysTrue from '../utils/alwaysTrue';\n\ntype SafeStorage = {\n  /** Retrieves a value by key. */\n  getItem(key: string): string | undefined | null;\n  /** Stores a value with the given key. */\n  setItem(key: string, value: string): void;\n  /** Removes a value by key. */\n  removeItem(key: string): void;\n  /**\n   * listener to observe storage changes\n   * @returns a function to unsubscribe.\n   */\n  listen?(\n    key: string,\n    onChange: (value: string | undefined) => void\n  ): () => void;\n};\n\ntype Converter<T> = {\n  parse(value: string): T;\n  stringify(value: Exclude<T, undefined>): string;\n};\n\ntype Options<T> = {\n  /** The key used to store and retrieve the value from storage. */\n  name: string;\n  storage: SafeStorage | undefined;\n  isValid?(value: T): boolean;\n  converter?: Converter<T>;\n  /** If `true`, enables observing storage changes */\n  sharable?: boolean;\n};\n\nconst isStorageAvailable = (key: 'local' | 'session') => {\n  try {\n    const storage = window[`${key}Storage`];\n\n    const testKey = `__${key}Test__`;\n\n    storage.setItem(testKey, '');\n\n    storage.removeItem(testKey);\n\n    return true;\n  } catch {}\n};\n\nexport const safeLocalStorage =\n  isStorageAvailable('local') &&\n  ({\n    getItem(key) {\n      return localStorage.getItem(key);\n    },\n    setItem(key, value) {\n      localStorage.setItem(key, value);\n    },\n    removeItem(key) {\n      localStorage.removeItem(key);\n    },\n    listen(key, onChange) {\n      const listener = (e: StorageEvent) => {\n        if (e.key == key) {\n          const value = e.newValue;\n\n          onChange(value != null ? value : undefined);\n        }\n      };\n\n      window.addEventListener('storage', listener);\n\n      return () => {\n        window.removeEventListener('storage', listener);\n      };\n    },\n  } satisfies SafeStorage);\n\nexport const safeSessionStorage =\n  isStorageAvailable('session') && (sessionStorage satisfies SafeStorage);\n\n/**\n * A utility for persisting state using a specified storage mechanism such as\n * {@link localStorage} or {@link sessionStorage}. It provides a customizable way to store,\n * retrieve, and observe state changes of provided persistent {@link Options.storage storage}\n */\nconst getPersistInitializer = <T>({\n  name,\n  storage,\n  converter = JSON,\n  isValid = alwaysTrue,\n  sharable,\n}: Options<T>): StateInitializer<T> | undefined =>\n  storage &&\n  ((keys) => {\n    const key = keys ? toKey([name, keys]) : name;\n\n    return {\n      get() {\n        const str = storage.getItem(key);\n\n        if (str != null) {\n          let value: T;\n\n          try {\n            value = converter.parse(str);\n          } catch {\n            return;\n          }\n\n          return isValid(value) ? value : undefined;\n        }\n      },\n      set(value) {\n        if (value !== undefined) {\n          storage.setItem(key, converter.stringify(value as any));\n        } else {\n          storage.removeItem(key);\n        }\n      },\n      observe:\n        sharable && storage.listen\n          ? (setState) =>\n              storage.listen!(key, (value) => {\n                let parsedValue: T;\n\n                if (value !== undefined) {\n                  try {\n                    parsedValue = converter.parse(value);\n                  } catch {\n                    return;\n                  }\n                }\n\n                if (isValid(parsedValue!)) {\n                  setState(parsedValue!);\n                }\n              })\n          : undefined,\n    };\n  });\n\nexport default getPersistInitializer;\n"]}