{"version":3,"sources":["../../src/storage/local-storage.ts"],"names":[],"mappings":"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","file":"local-storage.mjs","sourcesContent":["import type { IStorage } from './storage';\n\nexport type LocalStorageOptions = {\n  /**\n   * max number of records.\n   */\n  readonly max?: number;\n};\n\nexport class LocalStorage<T = any> implements IStorage<string, T> {\n  protected readonly _store: Map<string, T>;\n  protected readonly _keys: string[];\n  protected readonly _options: LocalStorageOptions;\n\n  get keys(): string[] {\n    return this._keys;\n  }\n\n  get size(): number {\n    return this._store.size;\n  }\n\n  constructor(data: Record<string, T> = {}, options: LocalStorageOptions = {}) {\n    this._store = new Map<string, T>(Object.entries(data));\n    this._keys = Object.keys(data);\n    this._options = options;\n  }\n\n  get(key: string): T | undefined {\n    this._hit(key);\n    return this._store.get(key);\n  }\n\n  set(key: string, value: T): void {\n    if (!this._hit(key)) {\n      this._keys.push(key);\n    }\n\n    if (this._options.max) {\n      if (this._keys.length > this._options.max) {\n        const k = this._keys.shift();\n\n        if (k) {\n          this._store.delete(k);\n        }\n      }\n    }\n\n    this._store.set(key, value);\n  }\n\n  delete(key: string): void {\n    const i = this._keys.findIndex((k) => key === k);\n\n    if (i > -1) {\n      this._keys.splice(i, 1);\n    }\n\n    this._store.delete(key);\n  }\n\n  toString(): string {\n    return JSON.stringify(\n      Array.from(this._store.entries()).map(([key, value]) => ({\n        key,\n        value,\n      })),\n      null,\n      2,\n    );\n  }\n\n  protected _hit(key: string): boolean {\n    if (!this._store.has(key)) return false;\n    if (this._keys[this._keys.length - 1] === key) return true;\n\n    const idx = this._keys.findIndex((k) => key === k);\n\n    /* istanbul ignore next */\n    if (idx < 0) return false;\n\n    for (let i = idx + 1; i < this._keys.length; i++) {\n      const tmp = this._keys[i - 1];\n      this._keys[i - 1] = this._keys[i];\n      this._keys[i] = tmp;\n    }\n\n    return true;\n  }\n}\n"]}