{"version":3,"file":"local-provider.mjs","sources":["../../../../src/lib/flags/providers/local-provider.ts"],"sourcesContent":["/**\n * @fileoverview Local/static flag provider for client-side flag management.\n *\n * Provides in-memory flag storage with optional localStorage persistence.\n * Ideal for:\n * - Development and testing\n * - Offline-first applications\n * - Static flag configurations\n * - Feature flag overrides\n *\n * @module flags/providers/local-provider\n *\n * @example\n * ```typescript\n * const provider = new LocalProvider({\n *   flags: initialFlags,\n *   persistToStorage: true,\n *   storageKey: 'my-app-flags',\n * });\n *\n * await provider.initialize();\n * const flags = await provider.getFlags();\n * ```\n */\n\nimport type { FeatureFlag, Segment, SegmentId } from '../advanced/types';\nimport type {\n  WritableFlagProvider,\n  LocalProviderConfig,\n  FlagChangeListener,\n  FlagChangeEvent,\n  ProviderHealth,\n  ProviderStats,\n} from './types';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_STORAGE_KEY = 'feature-flags';\n// Unused constant removed: DEFAULT_SEGMENTS_STORAGE_KEY\n\n// ============================================================================\n// Local Provider\n// ============================================================================\n\n/**\n * Local/in-memory flag provider with optional persistence.\n */\nexport class LocalProvider implements WritableFlagProvider {\n  readonly name: string;\n  readonly priority: number;\n\n  private flags = new Map<string, FeatureFlag>();\n  private segments = new Map<SegmentId, Segment>();\n  private listeners = new Set<FlagChangeListener>();\n  private ready = false;\n  private config: Required<LocalProviderConfig>;\n  private stats: ProviderStats = {\n    flagCount: 0,\n    segmentCount: 0,\n    requestCount: 0,\n    errorCount: 0,\n  };\n\n  constructor(config: LocalProviderConfig = {}) {\n    this.name = config.name ?? 'local';\n    this.priority = config.priority ?? 100;\n\n    this.config = {\n      name: this.name,\n      priority: this.priority,\n      debug: config.debug ?? false,\n      flags: config.flags ?? [],\n      segments: config.segments ?? [],\n      persistToStorage: config.persistToStorage ?? false,\n      storageKey: config.storageKey ?? DEFAULT_STORAGE_KEY,\n    };\n  }\n\n  // ==========================================================================\n  // Initialization\n  // ==========================================================================\n\n  /**\n   * Initialize the provider.\n   */\n  async initialize(): Promise<void> {\n    await Promise.resolve();\n    this.log('Initializing local provider');\n\n    // Load from storage if enabled\n    if (this.config.persistToStorage) {\n      this.loadFromStorage();\n    }\n\n    // Load initial flags (override storage)\n    for (const flag of this.config.flags) {\n      this.flags.set(flag.key, flag);\n    }\n\n    // Load initial segments\n    for (const segment of this.config.segments) {\n      this.segments.set(segment.id, segment);\n    }\n\n    this.updateStats();\n    this.ready = true;\n    this.log(`Initialized with ${this.flags.size} flags and ${this.segments.size} segments`);\n  }\n\n  // ==========================================================================\n  // Flag Operations\n  // ==========================================================================\n\n  /**\n   * Get all flags.\n   */\n  async getFlags(): Promise<readonly FeatureFlag[]> {\n    await Promise.resolve();\n    this.stats = { ...this.stats, requestCount: this.stats.requestCount + 1 };\n    return Promise.resolve(Array.from(this.flags.values()));\n  }\n\n  /**\n   * Get a flag by key.\n   */\n  async getFlag(key: string): Promise<FeatureFlag | null> {\n    await Promise.resolve();\n    this.stats = { ...this.stats, requestCount: this.stats.requestCount + 1 };\n    return Promise.resolve(this.flags.get(key) ?? null);\n  }\n\n  /**\n   * Update or add a flag.\n   */\n  async updateFlag(flag: FeatureFlag): Promise<void> {\n    await Promise.resolve();\n    const existing = this.flags.get(flag.key);\n    const isNew = !existing;\n\n    this.flags.set(flag.key, flag);\n    this.updateStats();\n\n    if (this.config.persistToStorage) {\n      this.saveToStorage();\n    }\n\n    this.emitChange({\n      type: isNew ? 'added' : 'updated',\n      flagKey: flag.key,\n      previousFlag: existing,\n      newFlag: flag,\n      timestamp: new Date(),\n      source: this.name,\n    });\n\n    this.log(`Flag ${isNew ? 'added' : 'updated'}: ${flag.key}`);\n  }\n\n  /**\n   * Delete a flag.\n   */\n  async deleteFlag(key: string): Promise<void> {\n    await Promise.resolve();\n    const existing = this.flags.get(key);\n    if (!existing) {\n      return;\n    }\n\n    this.flags.delete(key);\n    this.updateStats();\n\n    if (this.config.persistToStorage) {\n      this.saveToStorage();\n    }\n\n    this.emitChange({\n      type: 'deleted',\n      flagKey: key,\n      previousFlag: existing,\n      timestamp: new Date(),\n      source: this.name,\n    });\n\n    this.log(`Flag deleted: ${key}`);\n  }\n\n  /**\n   * Set multiple flags at once.\n   */\n  async setFlags(flags: readonly FeatureFlag[]): Promise<void> {\n    await Promise.resolve();\n    this.flags.clear();\n    for (const flag of flags) {\n      this.flags.set(flag.key, flag);\n    }\n    this.updateStats();\n\n    if (this.config.persistToStorage) {\n      this.saveToStorage();\n    }\n\n    this.emitChange({\n      type: 'refreshed',\n      timestamp: new Date(),\n      source: this.name,\n    });\n\n    this.log(`Set ${flags.length} flags`);\n  }\n\n  // ==========================================================================\n  // Segment Operations\n  // ==========================================================================\n\n  /**\n   * Get all segments.\n   */\n  async getSegments(): Promise<readonly Segment[]> {\n    return Promise.resolve(Array.from(this.segments.values()));\n  }\n\n  /**\n   * Get a segment by ID.\n   */\n  async getSegment(id: SegmentId): Promise<Segment | null> {\n    return Promise.resolve(this.segments.get(id) ?? null);\n  }\n\n  /**\n   * Update or add a segment.\n   */\n  async updateSegment(segment: Segment): Promise<void> {\n    await Promise.resolve();\n    this.segments.set(segment.id, segment);\n    this.updateStats();\n\n    if (this.config.persistToStorage) {\n      this.saveSegmentsToStorage();\n    }\n\n    this.log(`Segment updated: ${segment.id}`);\n  }\n\n  /**\n   * Delete a segment.\n   */\n  async deleteSegment(id: SegmentId): Promise<void> {\n    await Promise.resolve();\n    this.segments.delete(id);\n    this.updateStats();\n\n    if (this.config.persistToStorage) {\n      this.saveSegmentsToStorage();\n    }\n\n    this.log(`Segment deleted: ${id}`);\n  }\n\n  // ==========================================================================\n  // Storage Operations\n  // ==========================================================================\n\n  /**\n   * Check if the provider is ready.\n   */\n  isReady(): boolean {\n    return this.ready;\n  }\n\n  /**\n   * Check if the provider is healthy.\n   */\n  async isHealthy(): Promise<boolean> {\n    return Promise.resolve(this.ready);\n  }\n\n  /**\n   * Get provider health status.\n   */\n  getHealth(): ProviderHealth {\n    return {\n      healthy: this.ready,\n      consecutiveFailures: 0,\n    };\n  }\n\n  /**\n   * Get provider statistics.\n   */\n  getStats(): ProviderStats {\n    return { ...this.stats };\n  }\n\n  /**\n   * Subscribe to flag changes.\n   */\n  subscribe(listener: FlagChangeListener): () => void {\n    this.listeners.add(listener);\n    return () => {\n      this.listeners.delete(listener);\n    };\n  }\n\n  // ==========================================================================\n  // Status and Health\n  // ==========================================================================\n\n  /**\n   * Shutdown the provider.\n   */\n  async shutdown(): Promise<void> {\n    this.ready = false;\n    this.listeners.clear();\n    this.log('Provider shutdown');\n    return Promise.resolve();\n  }\n\n  /**\n   * Clear all flags and segments.\n   */\n  async clear(): Promise<void> {\n    this.flags.clear();\n    this.segments.clear();\n    this.updateStats();\n\n    if (this.config.persistToStorage && typeof window !== 'undefined') {\n      localStorage.removeItem(this.config.storageKey);\n      localStorage.removeItem(`${this.config.storageKey}-segments`);\n    }\n\n    this.emitChange({\n      type: 'refreshed',\n      timestamp: new Date(),\n      source: this.name,\n    });\n\n    this.log('All flags and segments cleared');\n    return Promise.resolve();\n  }\n\n  /**\n   * Export all data for backup.\n   */\n  export(): { flags: FeatureFlag[]; segments: Segment[] } {\n    return {\n      flags: Array.from(this.flags.values()),\n      segments: Array.from(this.segments.values()),\n    };\n  }\n\n  /**\n   * Import data from backup.\n   */\n  async import(data: { flags?: FeatureFlag[]; segments?: Segment[] }): Promise<void> {\n    await Promise.resolve();\n    if (data.flags) {\n      for (const flag of data.flags) {\n        this.flags.set(flag.key, flag);\n      }\n    }\n\n    if (data.segments) {\n      for (const segment of data.segments) {\n        this.segments.set(segment.id, segment);\n      }\n    }\n\n    this.updateStats();\n\n    if (this.config.persistToStorage) {\n      this.saveToStorage();\n      this.saveSegmentsToStorage();\n    }\n\n    this.emitChange({\n      type: 'refreshed',\n      timestamp: new Date(),\n      source: this.name,\n    });\n\n    this.log(\n      `Imported ${data.flags?.length ?? 0} flags and ${data.segments?.length ?? 0} segments`\n    );\n  }\n\n  // ==========================================================================\n  // Subscription\n  // ==========================================================================\n\n  private loadFromStorage(): void {\n    if (\n      typeof window === 'undefined' ||\n      window.localStorage === null ||\n      window.localStorage === undefined\n    ) {\n      return;\n    }\n\n    try {\n      // Load flags\n      const flagsJson = localStorage.getItem(this.config.storageKey);\n      if (flagsJson !== null && flagsJson !== '') {\n        const flags = JSON.parse(flagsJson) as FeatureFlag[];\n        for (const flag of flags) {\n          this.flags.set(flag.key, this.deserializeFlag(flag));\n        }\n        this.log(`Loaded ${flags.length} flags from storage`);\n      }\n\n      // Load segments\n      const segmentsJson = localStorage.getItem(`${this.config.storageKey}-segments`);\n      if (segmentsJson !== null && segmentsJson !== '') {\n        const segments = JSON.parse(segmentsJson) as Segment[];\n        for (const segment of segments) {\n          this.segments.set(segment.id, this.deserializeSegment(segment));\n        }\n        this.log(`Loaded ${segments.length} segments from storage`);\n      }\n    } catch (error) {\n      this.log('Error loading from storage:', error);\n      this.stats = { ...this.stats, errorCount: this.stats.errorCount + 1 };\n    }\n  }\n\n  private saveToStorage(): void {\n    if (\n      typeof window === 'undefined' ||\n      window.localStorage === null ||\n      window.localStorage === undefined\n    ) {\n      return;\n    }\n\n    try {\n      const flags = Array.from(this.flags.values());\n      localStorage.setItem(this.config.storageKey, JSON.stringify(flags));\n      this.log(`Saved ${flags.length} flags to storage`);\n    } catch (error) {\n      this.log('Error saving to storage:', error);\n      this.stats = { ...this.stats, errorCount: this.stats.errorCount + 1 };\n    }\n  }\n\n  // ==========================================================================\n  // Shutdown\n  // ==========================================================================\n\n  private saveSegmentsToStorage(): void {\n    if (\n      typeof window === 'undefined' ||\n      window.localStorage === null ||\n      window.localStorage === undefined\n    ) {\n      return;\n    }\n\n    try {\n      const segments = Array.from(this.segments.values());\n      localStorage.setItem(`${this.config.storageKey}-segments`, JSON.stringify(segments));\n    } catch (error) {\n      this.log('Error saving segments to storage:', error);\n    }\n  }\n\n  // ==========================================================================\n  // Utilities\n  // ==========================================================================\n\n  private deserializeFlag(flag: FeatureFlag): FeatureFlag {\n    // Convert date strings back to Date objects\n    return {\n      ...flag,\n      lifecycle: {\n        ...flag.lifecycle,\n        createdAt: new Date(flag.lifecycle.createdAt),\n        updatedAt: new Date(flag.lifecycle.updatedAt),\n        activatedAt: flag.lifecycle.activatedAt ? new Date(flag.lifecycle.activatedAt) : undefined,\n        deprecationDate: flag.lifecycle.deprecationDate\n          ? new Date(flag.lifecycle.deprecationDate)\n          : undefined,\n        removalDate: flag.lifecycle.removalDate ? new Date(flag.lifecycle.removalDate) : undefined,\n        reviewDate: flag.lifecycle.reviewDate ? new Date(flag.lifecycle.reviewDate) : undefined,\n      },\n    };\n  }\n\n  private deserializeSegment(segment: Segment): Segment {\n    return {\n      ...segment,\n      updatedAt: new Date(segment.updatedAt),\n    };\n  }\n\n  private emitChange(event: FlagChangeEvent): void {\n    for (const listener of this.listeners) {\n      try {\n        listener(event);\n      } catch (error) {\n        this.log('Error in change listener:', error);\n      }\n    }\n  }\n\n  private updateStats(): void {\n    this.stats = {\n      ...this.stats,\n      flagCount: this.flags.size,\n      segmentCount: this.segments.size,\n      lastRefresh: new Date(),\n    };\n  }\n\n  private log(message: string, ...args: unknown[]): void {\n    if (this.config.debug) {\n      // eslint-disable-next-line no-console\n      console.log(`[LocalProvider] ${message}`, ...args);\n    }\n  }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create a local provider instance.\n */\nexport function createLocalProvider(config?: LocalProviderConfig): LocalProvider {\n  return new LocalProvider(config);\n}\n"],"names":["DEFAULT_STORAGE_KEY","LocalProvider","config","flag","segment","key","existing","isNew","flags","id","listener","data","flagsJson","segmentsJson","segments","error","event","message","args","createLocalProvider"],"mappings":"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"}