{"version":3,"sources":["../../src/storage/local-storage.ts"],"names":[],"mappings":"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","file":"local-storage.mjs","sourcesContent":["import { 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() {\n    return this._keys;\n  }\n\n  get size() {\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) {\n    this._hit(key);\n    return this._store.get(key);\n  }\n\n  set(key: string, value: T) {\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) {\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() {\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) {\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"]}