{"version":3,"file":"env.mjs","sources":["../../src/config/env.ts"],"sourcesContent":["/**\n * @file Type-Safe Environment Variables\n * @description Runtime-validated, type-safe environment configuration\n *\n * Features:\n * - Compile-time type checking\n * - Runtime validation with meaningful errors\n * - Development-only warnings for missing optional values\n * - Frozen configuration to prevent mutation\n * - Full IntelliSense support\n */\n\n/// <reference types=\"vite/client\" />\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\ntype Environment = 'development' | 'staging' | 'production' | 'test';\ntype FeatureFlagSource = 'local' | 'remote' | 'launchdarkly';\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';\n\ninterface EnvConfig {\n  // API Configuration\n  readonly apiBaseUrl: string;\n  readonly apiTimeout: number;\n  readonly apiRetryCount: number;\n  readonly apiRetryDelay: number;\n\n  // WebSocket/SSE Endpoints\n  readonly wsUrl: string;\n  readonly sseUrl: string;\n  readonly wsReconnectInterval: number;\n  readonly wsMaxReconnectAttempts: number;\n\n  // Feature Flags\n  readonly featureFlagsEnabled: boolean;\n  readonly featureFlagsSource: FeatureFlagSource;\n  readonly featureFlagsRefreshInterval: number;\n\n  // Auth Configuration\n  readonly authTokenKey: string;\n  readonly authRefreshInterval: number;\n  readonly authTokenRefreshThreshold: number;\n\n  // Monitoring & Logging\n  readonly sentryDsn: string;\n  readonly sentryEnvironment: string;\n  readonly sentryRelease: string;\n  readonly enableErrorReporting: boolean;\n  readonly logLevel: LogLevel;\n  readonly enablePerformanceMonitoring: boolean;\n\n  // Analytics\n  readonly analyticsEnabled: boolean;\n  readonly analyticsKey: string;\n\n  // Environment\n  readonly appEnv: Environment;\n  readonly appVersion: string;\n  readonly appName: string;\n  readonly buildTime: string;\n\n  // Computed flags\n  readonly isDev: boolean;\n  readonly isProd: boolean;\n  readonly isTest: boolean;\n  readonly isStaging: boolean;\n}\n\n// ============================================================================\n// Environment Variable Parsers\n// ============================================================================\n\nclass EnvParser {\n  private readonly prefix = 'VITE_';\n  private readonly errors: string[] = [];\n  private readonly warnings: string[] = [];\n\n  getString(key: string, defaultValue?: string): string {\n    const fullKey = `${this.prefix}${key}`;\n    const value = (import.meta.env[fullKey] as string | undefined) ?? defaultValue;\n\n    if (value === undefined) {\n      this.errors.push(`Missing required environment variable: ${fullKey}`);\n      return '';\n    }\n\n    return value;\n  }\n\n  getOptionalString(key: string, defaultValue: string): string {\n    const fullKey = `${this.prefix}${key}`;\n    const value = import.meta.env[fullKey] as string | undefined;\n\n    if (value === undefined) {\n      if (import.meta.env['DEV']) {\n        this.warnings.push(`Using default value for ${fullKey}: \"${defaultValue}\"`);\n      }\n      return defaultValue;\n    }\n\n    return value;\n  }\n\n  getBoolean(key: string, defaultValue: boolean): boolean {\n    const fullKey = `${this.prefix}${key}`;\n    const value = import.meta.env[fullKey] as string | undefined;\n\n    if (value === undefined) {\n      return defaultValue;\n    }\n\n    return value === 'true' || value === '1';\n  }\n\n  getNumber(key: string, defaultValue: number): number {\n    const fullKey = `${this.prefix}${key}`;\n    const value = import.meta.env[fullKey] as string | undefined;\n\n    if (value === undefined) {\n      return defaultValue;\n    }\n\n    const parsed = parseInt(value, 10);\n\n    if (isNaN(parsed)) {\n      this.warnings.push(\n        `Invalid number for ${fullKey}: \"${value}\", using default: ${String(defaultValue)}`\n      );\n      return defaultValue;\n    }\n\n    return parsed;\n  }\n\n  getEnum<T extends string>(key: string, validValues: readonly T[], defaultValue: T): T {\n    const fullKey = `${this.prefix}${key}`;\n    const value = import.meta.env[fullKey] as T | undefined;\n\n    if (value === undefined) {\n      return defaultValue;\n    }\n\n    if (!validValues.includes(value)) {\n      this.warnings.push(\n        `Invalid value for ${fullKey}: \"${value}\". Valid values: ${validValues.join(', ')}. Using default: ${defaultValue}`\n      );\n      return defaultValue;\n    }\n\n    return value;\n  }\n\n  validate(): void {\n    // Log warnings in development\n    if (import.meta.env['DEV'] && this.warnings.length > 0) {\n      console.group('[Env Config] Warnings');\n      this.warnings.forEach((w) => {\n        console.warn(w);\n      });\n      console.groupEnd();\n    }\n\n    // Throw if there are errors\n    if (this.errors.length > 0) {\n      const errorMessage = [\n        'Environment configuration errors:',\n        ...this.errors.map((e) => `  - ${e}`),\n        '',\n        'Please check your .env file and ensure all required variables are set.',\n      ].join('\\n');\n\n      throw new Error(errorMessage);\n    }\n  }\n}\n\n// ============================================================================\n// Environment Configuration Builder\n// ============================================================================\n\nfunction buildEnvConfig(): EnvConfig {\n  const parser = new EnvParser();\n\n  const appEnv = parser.getEnum(\n    'APP_ENV',\n    ['development', 'staging', 'production', 'test'] as const,\n    'development'\n  );\n\n  const config: EnvConfig = {\n    // API Configuration\n    apiBaseUrl: parser.getOptionalString('API_BASE_URL', 'http://localhost:3001/api'),\n    apiTimeout: parser.getNumber('API_TIMEOUT', 30000),\n    apiRetryCount: parser.getNumber('API_RETRY_COUNT', 3),\n    apiRetryDelay: parser.getNumber('API_RETRY_DELAY', 1000),\n\n    // WebSocket/SSE Endpoints\n    wsUrl: parser.getOptionalString('WS_URL', 'ws://localhost:3001/ws'),\n    sseUrl: parser.getOptionalString('SSE_URL', 'http://localhost:3001/sse'),\n    wsReconnectInterval: parser.getNumber('WS_RECONNECT_INTERVAL', 3000),\n    wsMaxReconnectAttempts: parser.getNumber('WS_MAX_RECONNECT_ATTEMPTS', 10),\n\n    // Feature Flags\n    featureFlagsEnabled: parser.getBoolean('FEATURE_FLAGS_ENABLED', true),\n    featureFlagsSource: parser.getEnum(\n      'FEATURE_FLAGS_SOURCE',\n      ['local', 'remote', 'launchdarkly'] as const,\n      'local'\n    ),\n    featureFlagsRefreshInterval: parser.getNumber('FEATURE_FLAGS_REFRESH_INTERVAL', 60000),\n\n    // Auth Configuration\n    authTokenKey: parser.getOptionalString('AUTH_TOKEN_KEY', 'auth_token'),\n    authRefreshInterval: parser.getNumber('AUTH_REFRESH_INTERVAL', 300000),\n    authTokenRefreshThreshold: parser.getNumber('AUTH_TOKEN_REFRESH_THRESHOLD', 60000),\n\n    // Monitoring & Logging\n    sentryDsn: parser.getOptionalString('SENTRY_DSN', ''),\n    sentryEnvironment: parser.getOptionalString('SENTRY_ENVIRONMENT', appEnv),\n    sentryRelease: parser.getOptionalString('SENTRY_RELEASE', ''),\n    enableErrorReporting: parser.getBoolean('ENABLE_ERROR_REPORTING', appEnv === 'production'),\n    logLevel: parser.getEnum(\n      'LOG_LEVEL',\n      ['debug', 'info', 'warn', 'error', 'silent'] as const,\n      appEnv === 'production' ? 'warn' : 'debug'\n    ),\n    enablePerformanceMonitoring: parser.getBoolean(\n      'ENABLE_PERFORMANCE_MONITORING',\n      appEnv === 'production'\n    ),\n\n    // Analytics\n    analyticsEnabled: parser.getBoolean('ANALYTICS_ENABLED', appEnv === 'production'),\n    analyticsKey: parser.getOptionalString('ANALYTICS_KEY', ''),\n\n    // Environment\n    appEnv,\n    appVersion: parser.getOptionalString('APP_VERSION', '0.0.0-dev'),\n    appName: parser.getOptionalString('APP_NAME', 'Harbor React'),\n    buildTime: parser.getOptionalString('BUILD_TIME', new Date().toISOString()),\n\n    // Computed flags\n    isDev: import.meta.env['DEV'],\n    isProd: import.meta.env['PROD'],\n    isTest: appEnv === 'test',\n    isStaging: appEnv === 'staging',\n  };\n\n  // Validate configuration\n  parser.validate();\n\n  return Object.freeze(config);\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport const env = buildEnvConfig();\n\n/**\n * Get environment configuration (alias for backwards compatibility)\n */\nexport function getEnvConfig(): EnvConfig {\n  return env;\n}\n\n/**\n * Check if current environment matches\n */\nexport function isEnv(environment: Environment): boolean {\n  return env.appEnv === environment;\n}\n\n/**\n * Run callback only in specified environment\n */\nexport function inEnv<T>(environment: Environment, callback: () => T): T | undefined {\n  if (env.appEnv === environment) {\n    return callback();\n  }\n  return undefined;\n}\n\n/**\n * Run callback only in development\n */\nexport function inDev<T>(callback: () => T): T | undefined {\n  return inEnv('development', callback);\n}\n\n/**\n * Run callback only in production\n */\nexport function inProd<T>(callback: () => T): T | undefined {\n  return inEnv('production', callback);\n}\n\n// Export type for external usage\nexport type { EnvConfig, Environment, FeatureFlagSource, LogLevel };\n"],"names":["EnvParser","key","defaultValue","fullKey","value","__vite_import_meta_env__","parsed","validValues","errorMessage","e","buildEnvConfig","parser","appEnv","config","env","getEnvConfig"],"mappings":"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"}