{"version":3,"file":"index.cjs","names":["cache"],"sources":["../../../../@mongez/cache/src/CacheManager.ts","../../../../@mongez/cache/src/config.ts","../../../../@mongez/cache/src/drivers/BaseCacheEngine.ts","../../../../@mongez/cache/src/drivers/PlainLocalStorageDriver.ts","../../../../@mongez/cache/src/drivers/EncryptedLocalStorageDriver.ts","../../../../@mongez/cache/src/drivers/EncryptedSessionStorageDriver.ts","../../../../@mongez/cache/src/drivers/PlainSessionStorageDriver.ts","../../../../@mongez/cache/src/drivers/RunTimeDriver.ts","../../../../@mongez/cache/src/index.ts"],"sourcesContent":["import { CacheDriverInterface, CacheManagerInterface } from \"./types\";\r\n\r\nexport class CacheManager implements CacheManagerInterface {\r\n  /**\r\n   * Cache Driver Engine\r\n   */\r\n  private driver!: CacheDriverInterface;\r\n\r\n  /**\r\n   * Set driver engine\r\n   */\r\n  public setDriver(driver: CacheDriverInterface) {\r\n    this.driver = driver;\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Get driver engine\r\n   */\r\n  public getDriver(): CacheDriverInterface {\r\n    return this.driver;\r\n  }\r\n\r\n  /**\r\n   * Set cache into storage\r\n   */\r\n  public set(key: string, value: any, expiresAfter?: number) {\r\n    this.driver.set(key, value, expiresAfter);\r\n    return this as any;\r\n  }\r\n\r\n  /**\r\n   * Get value from cache engine, if key does not exist return default value\r\n   */\r\n  public get(key: string, defaultValue: any = null) {\r\n    return this.driver.get(key, defaultValue);\r\n  }\r\n\r\n  /**\r\n   * Determine whether the cache engine has the given key\r\n   */\r\n  public has(key: string) {\r\n    return this.driver.has(key);\r\n  }\r\n\r\n  /**\r\n   * Remove the given key from the cache storage\r\n   */\r\n  public remove(key: string) {\r\n    this.driver.remove(key);\r\n    return this as any;\r\n  }\r\n\r\n  /**\r\n   * Set prefix key\r\n   */\r\n  public setPrefixKey(key: string) {\r\n    this.driver.setPrefixKey(key);\r\n    return this as any;\r\n  }\r\n\r\n  /**\r\n   * Get prefix key\r\n   */\r\n  public getPrefixKey(): string {\r\n    return this.driver.getPrefixKey();\r\n  }\r\n\r\n  /**\r\n   * {@inheritDoc}\r\n   */\r\n  public setValueParser(parser: any): CacheDriverInterface {\r\n    this.driver.setValueParser(parser);\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * {@inheritDoc}\r\n   */\r\n  public setValueConverter(converter: any): CacheDriverInterface {\r\n    this.driver.setValueConverter(converter);\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Clear the cache storage\r\n   */\r\n  public clear() {\r\n    this.driver.clear();\r\n\r\n    return this;\r\n  }\r\n}\r\n\r\nconst cacheManager = new CacheManager();\r\n\r\nexport default cacheManager;\r\n","import cache from \"./CacheManager\";\r\nimport { CacheConfigurations } from \"./types\";\r\n\r\nlet configuration: Partial<CacheConfigurations> = {};\r\n\r\nexport function setCacheConfigurations(newConfiguration: CacheConfigurations) {\r\n  if (newConfiguration.driver) {\r\n    cache.setDriver(newConfiguration.driver);\r\n  }\r\n\r\n  if (newConfiguration.prefix) {\r\n    cache.getDriver().setPrefixKey(newConfiguration.prefix);\r\n  }\r\n\r\n  if (newConfiguration.valueConverter) {\r\n    cache.getDriver().setValueConverter(newConfiguration.valueConverter);\r\n  }\r\n\r\n  if (newConfiguration.valueParer) {\r\n    cache.getDriver().setValueParser(newConfiguration.valueParer);\r\n  }\r\n\r\n  configuration = { ...configuration, ...newConfiguration };\r\n}\r\n\r\nexport function getCacheConfigurations() {\r\n  return configuration;\r\n}\r\n\r\nexport function getCacheConfig(key: keyof CacheConfigurations) {\r\n  return configuration[key];\r\n}\r\n","import { getCacheConfig } from \"../config\";\r\nimport { CacheDriverInterface } from \"../types\";\r\n\r\nexport default class BaseCacheEngine implements CacheDriverInterface {\r\n  /**\r\n   * Cache storage engine\r\n   */\r\n  public storage: any;\r\n\r\n  /**\r\n   * Prefix key\r\n   */\r\n  public prefixKey: string = \"\";\r\n\r\n  /**\r\n   * Value parser\r\n   */\r\n  protected _valueParser = this.parseValue.bind(this);\r\n\r\n  /**\r\n   * Value converter\r\n   */\r\n  protected _valueConverter = this.convertValue.bind(this);\r\n\r\n  /**\r\n   * set value parser\r\n   */\r\n  public setValueParser(parser: any) {\r\n    this._valueParser = parser;\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Set value converter\r\n   */\r\n  public setValueConverter(converter: any) {\r\n    this._valueConverter = converter;\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Get vale from storage engine\r\n   */\r\n  public get(key: string, defaultValue?: any) {\r\n    let value = this.storage.getItem(this.getKey(key));\r\n\r\n    if (value === null) return defaultValue;\r\n\r\n    try {\r\n      const cachedData = this._valueParser(value);\r\n\r\n      // check if there is a cache timestamp\r\n      // if it is lower than current timestamp\r\n      // then remove the key from storage\r\n      if (cachedData.expiresAt && cachedData.expiresAt < new Date().getTime()) {\r\n        this.remove(key);\r\n        return defaultValue;\r\n      }\r\n\r\n      return cachedData.data;\r\n    } catch (error) {\r\n      this.remove(key);\r\n      return defaultValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set data into storage engine\r\n   */\r\n  public set(key: string, value: any, expiresAfter?: number) {\r\n    const expireTime: number | false =\r\n      expiresAfter !== undefined\r\n        ? expiresAfter\r\n        : ((getCacheConfig(\"expiresAfter\") || 0) as number);\r\n\r\n    const expiresAt = expireTime\r\n      ? new Date().getTime() + expireTime * 1000\r\n      : undefined;\r\n\r\n    this.storage.setItem(\r\n      this.getKey(key),\r\n      this._valueConverter({\r\n        data: value,\r\n        expiresAt,\r\n      })\r\n    );\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Parse stored value\r\n   */\r\n  protected parseValue(value: any) {\r\n    try {\r\n      return JSON.parse(value);\r\n    } catch (error) {\r\n      return value;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set the mechanism to store data\r\n   */\r\n  protected convertValue(value: any) {\r\n    return JSON.stringify(value);\r\n  }\r\n\r\n  /**\r\n   * Determine whether the cache engine has the given key\r\n   */\r\n  public has(key: string): boolean {\r\n    return this.storage.getItem(this.getKey(key)) !== null;\r\n  }\r\n\r\n  /**\r\n   * Remove key from storage\r\n   */\r\n  public remove(key: string) {\r\n    this.storage.removeItem(this.getKey(key));\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Get a proper key\r\n   */\r\n  public getKey(key: string): string {\r\n    key = (this.getPrefixKey() || \"\") + key;\r\n\r\n    return key;\r\n  }\r\n\r\n  /**\r\n   * Get prefix key\r\n   */\r\n  public getPrefixKey(): string {\r\n    return this.prefixKey;\r\n  }\r\n\r\n  /**\r\n   * Set prefix key\r\n   */\r\n  public setPrefixKey(key: string) {\r\n    this.prefixKey = key;\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Clear the cache storage\r\n   */\r\n  public clear() {\r\n    this.storage.clear();\r\n    return this;\r\n  }\r\n}\r\n","import { CacheDriverInterface } from \"../types\";\r\nimport BaseCacheEngine from \"./BaseCacheEngine\";\r\n\r\nexport default class PlainLocalStorageDriver\r\n  extends BaseCacheEngine\r\n  implements CacheDriverInterface\r\n{\r\n  /**\r\n   * Set the storage engine\r\n   */\r\n  public storage = localStorage;\r\n}\r\n","import { getCacheConfig } from \"../config\";\r\nimport { CacheDriverInterface } from \"../types\";\r\nimport PlainLocalStorageDriver from \"./PlainLocalStorageDriver\";\r\n\r\nexport default class EncryptedLocalStorageDriver\r\n  extends PlainLocalStorageDriver\r\n  implements CacheDriverInterface\r\n{\r\n  /**\r\n   * Set data into storage engine\r\n   *\r\n   * Wraps the value in a `{data, expiresAt}` envelope (matching the\r\n   * plain driver shape) BEFORE encrypting, so the encrypted variant\r\n   * honors `expiresAfter` just like the plain drivers do.\r\n   */\r\n  public set(key: string, value: any, expiresAfter?: number) {\r\n    const expireTime: number | false =\r\n      expiresAfter !== undefined\r\n        ? expiresAfter\r\n        : ((getCacheConfig(\"expiresAfter\") || 0) as number);\r\n\r\n    const expiresAt = expireTime\r\n      ? new Date().getTime() + expireTime * 1000\r\n      : undefined;\r\n\r\n    this.storage.setItem(\r\n      this.getKey(key),\r\n      getCacheConfig(\"encryption\")?.encrypt({\r\n        data: value,\r\n        expiresAt,\r\n      })\r\n    );\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Get value from storage engine\r\n   *\r\n   * Decrypts then unwraps the `{data, expiresAt}` envelope and checks\r\n   * expiry. For backward compatibility with legacy cyphers that were\r\n   * written before the envelope was introduced (no `data` / `expiresAt`\r\n   * keys), the decrypted value is returned as-is with no expiration.\r\n   */\r\n  public get(key: string, defaultValue: any = null) {\r\n    let value = this.storage.getItem(this.getKey(key));\r\n\r\n    if (!value) return defaultValue;\r\n\r\n    const decrypted = getCacheConfig(\"encryption\")?.decrypt(value);\r\n\r\n    // Legacy format detection: pre-envelope cyphers decrypt to\r\n    // arbitrary user data (string / number / object without\r\n    // `data` + `expiresAt` keys). Treat those as immortal entries.\r\n    if (\r\n      decrypted === null ||\r\n      decrypted === undefined ||\r\n      typeof decrypted !== \"object\" ||\r\n      !(\"data\" in decrypted)\r\n    ) {\r\n      return decrypted === null || decrypted === undefined\r\n        ? defaultValue\r\n        : decrypted;\r\n    }\r\n\r\n    if (\r\n      decrypted.expiresAt &&\r\n      decrypted.expiresAt < new Date().getTime()\r\n    ) {\r\n      this.remove(key);\r\n      return defaultValue;\r\n    }\r\n\r\n    return decrypted.data;\r\n  }\r\n\r\n  /**\r\n   * Remove key from storage\r\n   */\r\n  public remove(key: string) {\r\n    this.storage.removeItem(this.getKey(key));\r\n\r\n    return this;\r\n  }\r\n}\r\n","import { CacheDriverInterface } from \"../types\";\r\nimport EncryptedLocalStorageDriver from \"./EncryptedLocalStorageDriver\";\r\n\r\nexport default class EncryptedSessionStorageDriver\r\n  extends EncryptedLocalStorageDriver\r\n  implements CacheDriverInterface\r\n{\r\n  /**\r\n   * Set the storage engine\r\n   */\r\n  public storage = sessionStorage;\r\n}\r\n","import { CacheDriverInterface } from \"../types\";\r\nimport BaseCacheEngine from \"./BaseCacheEngine\";\r\n\r\nexport default class PlainSessionStorageDriver\r\n  extends BaseCacheEngine\r\n  implements CacheDriverInterface\r\n{\r\n  /**\r\n   * Set the storage engine\r\n   */\r\n  public storage = sessionStorage;\r\n}\r\n","import { CacheDriverInterface } from \"../types\";\r\nimport BaseCacheEngine from \"./BaseCacheEngine\";\r\n\r\nexport default class RunTimeDriver\r\n  extends BaseCacheEngine\r\n  implements CacheDriverInterface\r\n{\r\n  /**\r\n   * Set the storage engine\r\n   */\r\n  public storage = this;\r\n\r\n  /**\r\n   * Data list\r\n   */\r\n  public data: any = {};\r\n\r\n  /**\r\n   * Get item\r\n   *\r\n   * Returns `null` for missing keys (when no `defaultValue` is given)\r\n   * to match the Web Storage API contract. The previous implementation\r\n   * returned `undefined`, which broke `BaseCacheEngine.has()` — the\r\n   * base engine checks `getItem(...) !== null` and `undefined !== null`\r\n   * is `true`, so `has(missingKey)` reported `true` on this driver.\r\n   */\r\n  public getItem(key: string, defaultValue: any = null) {\r\n    const data = this.data[key];\r\n\r\n    if (!data) return defaultValue;\r\n\r\n    if (data.expiresAt && data.expiresAt < new Date().getTime()) {\r\n      this.removeItem(key);\r\n      return defaultValue;\r\n    }\r\n\r\n    return data.value;\r\n  }\r\n\r\n  /**\r\n   * Set item\r\n   */\r\n  public setItem(key: string, value: any, expiresAfter?: number) {\r\n    this.data[key] = {\r\n      value,\r\n      expiresAt: expiresAfter\r\n        ? new Date().getTime() + expiresAfter * 1000\r\n        : undefined,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Remove item\r\n   */\r\n  public removeItem(key: string) {\r\n    delete this.data[key];\r\n  }\r\n\r\n  /**\r\n   * {@inheritDoc}\r\n   */\r\n  protected convertValue(value: any) {\r\n    return value;\r\n  }\r\n\r\n  /**\r\n   * {@inheritDoc}\r\n   */\r\n  protected parseValue(value: any) {\r\n    return value;\r\n  }\r\n\r\n  /**\r\n   * Clear the cache storage\r\n   */\r\n  public clear() {\r\n    this.data = {};\r\n\r\n    return this;\r\n  }\r\n}\r\n","import cache from \"./CacheManager\";\r\nexport { CacheManager } from \"./CacheManager\";\r\nexport * from \"./config\";\r\nexport { default as BaseCacheEngine } from \"./drivers/BaseCacheEngine\";\r\nexport { default as EncryptedLocalStorageDriver } from \"./drivers/EncryptedLocalStorageDriver\";\r\nexport { default as EncryptedSessionStorageDriver } from \"./drivers/EncryptedSessionStorageDriver\";\r\nexport { default as PlainLocalStorageDriver } from \"./drivers/PlainLocalStorageDriver\";\r\nexport { default as PlainSessionStorageDriver } from \"./drivers/PlainSessionStorageDriver\";\r\nexport { default as RunTimeDriver } from \"./drivers/RunTimeDriver\";\r\nexport * from \"./types\";\r\n\r\nexport default cache;\r\n"],"mappings":"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"}