{"version":3,"file":"index.mjs","sources":["../../../../src/lib/flags/analytics/index.ts"],"sourcesContent":["/**\n * @fileoverview Feature flag analytics module exports.\n *\n * This module provides comprehensive analytics capabilities for feature flags:\n * - Usage analytics and metrics collection\n * - Exposure tracking for experiments and A/B tests\n * - Impact analysis with statistical significance testing\n *\n * @module flags/analytics\n *\n * @example\n * ```typescript\n * import {\n *   FlagAnalytics,\n *   ExposureTracker,\n *   FlagImpactAnalyzer,\n *   initFlagAnalytics,\n *   initExposureTracker,\n *   initImpactAnalyzer,\n * } from '@/lib/flags/analytics';\n *\n * // Initialize analytics\n * const analytics = initFlagAnalytics({\n *   batchSize: 100,\n *   flushInterval: 30000,\n *   endpoint: 'https://api.example.com/analytics',\n * });\n *\n * // Track evaluations\n * analytics.trackEvaluation({\n *   flagKey: 'new-feature',\n *   variantId: 'enabled',\n *   userId: 'user-123',\n * });\n *\n * // Initialize exposure tracking\n * const tracker = initExposureTracker({\n *   deduplicationWindow: 24 * 60 * 60 * 1000,\n *   onExposure: (exposure) => console.log('Exposed:', exposure),\n * });\n *\n * // Track exposures\n * tracker.trackExposure({\n *   flagKey: 'new-checkout',\n *   variantId: 'variant-b',\n *   userId: 'user-123',\n *   experimentId: 'checkout-experiment',\n * });\n *\n * // Initialize impact analyzer\n * const analyzer = initImpactAnalyzer({\n *   significanceThreshold: 0.05,\n *   minSampleSize: 100,\n * });\n *\n * // Record metrics\n * analyzer.recordMetric('conversion_rate', 0.15, {\n *   flagKey: 'new-checkout',\n *   variantId: 'variant-b',\n *   userId: 'user-123',\n * });\n *\n * // Analyze impact\n * const impact = analyzer.analyzeImpact('new-checkout');\n * console.log(impact?.summary);\n * ```\n */\n\n// ============================================================================\n// Flag Analytics\n// ============================================================================\n\nexport {\n  FlagAnalytics,\n  getFlagAnalytics,\n  initFlagAnalytics,\n  resetFlagAnalytics,\n} from './flag-analytics';\n\nexport type {\n  EvaluationEvent,\n  FlagMetrics,\n  FlagAnalyticsConfig,\n  AnalyticsReport,\n} from './flag-analytics';\n\n// ============================================================================\n// Exposure Tracking\n// ============================================================================\n\nexport {\n  ExposureTracker,\n  getExposureTracker,\n  initExposureTracker,\n  resetExposureTracker,\n  createExposureContext,\n} from './flag-exposure-tracker';\n\nexport type {\n  ExposureEvent,\n  ExposureRecord,\n  UserExposureSummary,\n  ExposureTrackerConfig,\n  TrackExposureInput,\n} from './flag-exposure-tracker';\n\n// ============================================================================\n// Impact Analysis\n// ============================================================================\n\nexport {\n  FlagImpactAnalyzer,\n  getImpactAnalyzer,\n  initImpactAnalyzer,\n  resetImpactAnalyzer,\n} from './flag-impact-analyzer';\n\nexport type {\n  MetricDataPoint,\n  MetricStats,\n  VariantComparison,\n  FlagImpactAnalysis,\n  ImpactAnalyzerConfig,\n  RecordMetricInput,\n} from './flag-impact-analyzer';\n\n// ============================================================================\n// Unified Analytics Factory\n// ============================================================================\n\nimport { FlagAnalytics, type FlagAnalyticsConfig } from './flag-analytics';\nimport { ExposureTracker, type ExposureTrackerConfig } from './flag-exposure-tracker';\nimport { FlagImpactAnalyzer, type ImpactAnalyzerConfig } from './flag-impact-analyzer';\n\n/**\n * Configuration for the unified analytics suite.\n */\nexport interface AnalyticsSuiteConfig {\n  /** Flag analytics configuration */\n  readonly analytics?: FlagAnalyticsConfig;\n  /** Exposure tracker configuration */\n  readonly exposure?: ExposureTrackerConfig;\n  /** Impact analyzer configuration */\n  readonly impact?: ImpactAnalyzerConfig;\n  /** Enable all analytics by default */\n  readonly enabled?: boolean;\n  /** Debug mode for all components */\n  readonly debug?: boolean;\n}\n\n/**\n * Unified analytics suite combining all analytics capabilities.\n */\nexport interface AnalyticsSuite {\n  /** Flag analytics collector */\n  readonly analytics: FlagAnalytics;\n  /** Exposure tracker */\n  readonly exposure: ExposureTracker;\n  /** Impact analyzer */\n  readonly impact: FlagImpactAnalyzer;\n  /** Shutdown all analytics */\n  shutdown(): Promise<void>;\n  /** Reset all analytics */\n  reset(): void;\n  /** Set enabled state for all */\n  setEnabled(enabled: boolean): void;\n}\n\n/**\n * Create a unified analytics suite with all components configured.\n *\n * @param config - Configuration for all analytics components\n * @returns Unified analytics suite\n *\n * @example\n * ```typescript\n * const suite = createAnalyticsSuite({\n *   analytics: {\n *     endpoint: 'https://api.example.com/analytics',\n *     batchSize: 100,\n *   },\n *   exposure: {\n *     deduplicationWindow: 86400000,\n *   },\n *   impact: {\n *     significanceThreshold: 0.05,\n *   },\n *   debug: true,\n * });\n *\n * // Use the suite\n * suite.analytics.trackEvaluation({ ... });\n * suite.exposure.trackExposure({ ... });\n * suite.impact.recordMetric('metric', value, { ... });\n *\n * // Cleanup\n * await suite.shutdown();\n * ```\n */\nexport function createAnalyticsSuite(config: AnalyticsSuiteConfig = {}): AnalyticsSuite {\n  const { analytics: analyticsConfig, exposure: exposureConfig, impact: impactConfig } = config;\n  const enabled = config.enabled ?? true;\n  const debug = config.debug ?? false;\n\n  const analytics = new FlagAnalytics({\n    ...analyticsConfig,\n    enabled: analyticsConfig?.enabled ?? enabled,\n    debug: analyticsConfig?.debug ?? debug,\n  });\n\n  const exposure = new ExposureTracker({\n    ...exposureConfig,\n    enabled: exposureConfig?.enabled ?? enabled,\n    debug: exposureConfig?.debug ?? debug,\n  });\n\n  const impact = new FlagImpactAnalyzer({\n    ...impactConfig,\n    enabled: impactConfig?.enabled ?? enabled,\n    debug: impactConfig?.debug ?? debug,\n  });\n\n  return {\n    analytics,\n    exposure,\n    impact,\n\n    async shutdown(): Promise<void> {\n      await Promise.all([analytics.shutdown(), exposure.shutdown()]);\n    },\n\n    reset(): void {\n      analytics.reset();\n      exposure.clear();\n      impact.clear();\n    },\n\n    setEnabled(enabled: boolean): void {\n      analytics.setEnabled(enabled);\n      exposure.setEnabled(enabled);\n      impact.setEnabled(enabled);\n    },\n  };\n}\n\n// ============================================================================\n// Analytics Integration Helpers\n// ============================================================================\n\n/**\n * Connect analytics to flag evaluation events.\n *\n * @param suite - Analytics suite to connect\n * @param options - Connection options\n * @returns Disconnect function\n *\n * @example\n * ```typescript\n * import { getFlagEngine } from '@/lib/flags/advanced';\n * import { createAnalyticsSuite, connectAnalytics } from '@/lib/flags/analytics';\n *\n * const suite = createAnalyticsSuite();\n * const engine = getFlagEngine();\n *\n * // Connect analytics to engine\n * const disconnect = connectAnalytics(suite, {\n *   trackEvaluations: true,\n *   trackExposures: true,\n *   recordMetrics: true,\n * });\n *\n * // Later: disconnect\n * disconnect();\n * ```\n */\nexport function connectAnalytics(\n  suite: AnalyticsSuite,\n  options: {\n    trackEvaluations?: boolean;\n    trackExposures?: boolean;\n    recordMetrics?: boolean;\n  } = {}\n): () => void {\n  const { trackEvaluations = true, trackExposures = true } = options;\n  const unsubscribers: Array<() => void> = [];\n\n  // Connect exposure tracking to analytics events\n  if (trackEvaluations && trackExposures) {\n    const unsubscribe = suite.analytics.subscribe((events) => {\n      for (const event of events) {\n        if (event.userId != null && event.userId !== '') {\n          suite.exposure.trackExposure({\n            flagKey: event.flagKey,\n            variantId: event.variantId,\n            userId: event.userId,\n            sessionId: event.sessionId,\n            reason: event.reason,\n          });\n        }\n      }\n    });\n    unsubscribers.push(unsubscribe);\n  }\n\n  return () => {\n    for (const unsubscribe of unsubscribers) {\n      unsubscribe();\n    }\n  };\n}\n\n/**\n * Get aggregated analytics data from all components.\n *\n * @param suite - Analytics suite to aggregate from\n * @returns Aggregated analytics data\n */\nexport function getAggregatedAnalytics(suite: AnalyticsSuite): {\n  report: ReturnType<FlagAnalytics['getReport']>;\n  exposureCount: number;\n  impactAnalyses: ReturnType<FlagImpactAnalyzer['analyzeImpact']>[];\n} {\n  const report = suite.analytics.getReport();\n\n  // Count total exposures across all tracked flags\n  let exposureCount = 0;\n  for (const flag of report.flagMetrics) {\n    exposureCount += flag.evaluationCount;\n  }\n\n  // Get impact analyses for all tracked flags\n  const impactAnalyses: ReturnType<FlagImpactAnalyzer['analyzeImpact']>[] = [];\n  for (const flagKey of suite.impact.getFlagKeys()) {\n    const analysis = suite.impact.analyzeImpact(flagKey);\n    if (analysis) {\n      impactAnalyses.push(analysis);\n    }\n  }\n\n  return {\n    report,\n    exposureCount,\n    impactAnalyses,\n  };\n}\n"],"names":["createAnalyticsSuite","config","analyticsConfig","exposureConfig","impactConfig","enabled","debug","analytics","FlagAnalytics","exposure","ExposureTracker","impact","FlagImpactAnalyzer","connectAnalytics","suite","options","trackEvaluations","trackExposures","unsubscribers","unsubscribe","events","event","getAggregatedAnalytics","report","exposureCount","flag","impactAnalyses","flagKey","analysis"],"mappings":";;;;;;AAuMO,SAASA,EAAqBC,IAA+B,IAAoB;AACtF,QAAM,EAAE,WAAWC,GAAiB,UAAUC,GAAgB,QAAQC,MAAiBH,GACjFI,IAAUJ,EAAO,WAAW,IAC5BK,IAAQL,EAAO,SAAS,IAExBM,IAAY,IAAIC,EAAc;AAAA,IAClC,GAAGN;AAAA,IACH,SAASA,GAAiB,WAAWG;AAAA,IACrC,OAAOH,GAAiB,SAASI;AAAA,EAAA,CAClC,GAEKG,IAAW,IAAIC,EAAgB;AAAA,IACnC,GAAGP;AAAA,IACH,SAASA,GAAgB,WAAWE;AAAA,IACpC,OAAOF,GAAgB,SAASG;AAAA,EAAA,CACjC,GAEKK,IAAS,IAAIC,EAAmB;AAAA,IACpC,GAAGR;AAAA,IACH,SAASA,GAAc,WAAWC;AAAA,IAClC,OAAOD,GAAc,SAASE;AAAA,EAAA,CAC/B;AAED,SAAO;AAAA,IACL,WAAAC;AAAA,IACA,UAAAE;AAAA,IACA,QAAAE;AAAA,IAEA,MAAM,WAA0B;AAC9B,YAAM,QAAQ,IAAI,CAACJ,EAAU,YAAYE,EAAS,SAAA,CAAU,CAAC;AAAA,IAC/D;AAAA,IAEA,QAAc;AACZ,MAAAF,EAAU,MAAA,GACVE,EAAS,MAAA,GACTE,EAAO,MAAA;AAAA,IACT;AAAA,IAEA,WAAWN,GAAwB;AACjC,MAAAE,EAAU,WAAWF,CAAO,GAC5BI,EAAS,WAAWJ,CAAO,GAC3BM,EAAO,WAAWN,CAAO;AAAA,IAC3B;AAAA,EAAA;AAEJ;AAgCO,SAASQ,EACdC,GACAC,IAII,IACQ;AACZ,QAAM,EAAE,kBAAAC,IAAmB,IAAM,gBAAAC,IAAiB,OAASF,GACrDG,IAAmC,CAAA;AAGzC,MAAIF,KAAoBC,GAAgB;AACtC,UAAME,IAAcL,EAAM,UAAU,UAAU,CAACM,MAAW;AACxD,iBAAWC,KAASD;AAClB,QAAIC,EAAM,UAAU,QAAQA,EAAM,WAAW,MAC3CP,EAAM,SAAS,cAAc;AAAA,UAC3B,SAASO,EAAM;AAAA,UACf,WAAWA,EAAM;AAAA,UACjB,QAAQA,EAAM;AAAA,UACd,WAAWA,EAAM;AAAA,UACjB,QAAQA,EAAM;AAAA,QAAA,CACf;AAAA,IAGP,CAAC;AACD,IAAAH,EAAc,KAAKC,CAAW;AAAA,EAChC;AAEA,SAAO,MAAM;AACX,eAAWA,KAAeD;AACxB,MAAAC,EAAA;AAAA,EAEJ;AACF;AAQO,SAASG,EAAuBR,GAIrC;AACA,QAAMS,IAAST,EAAM,UAAU,UAAA;AAG/B,MAAIU,IAAgB;AACpB,aAAWC,KAAQF,EAAO;AACxB,IAAAC,KAAiBC,EAAK;AAIxB,QAAMC,IAAoE,CAAA;AAC1E,aAAWC,KAAWb,EAAM,OAAO,YAAA,GAAe;AAChD,UAAMc,IAAWd,EAAM,OAAO,cAAca,CAAO;AACnD,IAAIC,KACFF,EAAe,KAAKE,CAAQ;AAAA,EAEhC;AAEA,SAAO;AAAA,IACL,QAAAL;AAAA,IACA,eAAAC;AAAA,IACA,gBAAAE;AAAA,EAAA;AAEJ;"}