@adopture/next
Version: 
Next.js SDK for Adopture feature adoption tracking with SSR support
1 lines • 11.3 kB
Source Map (JSON)
{"version":3,"sources":["../src/shared/config.ts"],"names":["DEFAULT_API_URL","ENV_VARS","getEnvVar","key","fallback","loadClientConfig","manualConfig","envConfig","filteredEnvConfig","value","loadServerConfig","validateConfig","config","errors","extractProjectIdFromApiKey","apiKey","match","extractEnvironmentFromApiKey","isDevelopment","isProduction","isClient"],"mappings":"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","file":"chunk-GZFA7KVO.mjs","sourcesContent":["import type { NextAdoptureConfig, ServerAdoptureConfig } from '../types';\n\nexport const DEFAULT_API_URL = 'https://api.adopture.com';\n\n/**\n * Environment variable keys for Next.js configuration\n */\nexport const ENV_VARS = {\n  // Client-side environment variables (must start with NEXT_PUBLIC_)\n  CLIENT: {\n    API_URL: 'NEXT_PUBLIC_ADOPTURE_API_URL',\n    API_KEY: 'NEXT_PUBLIC_ADOPTURE_API_KEY',\n    PROJECT_ID: 'NEXT_PUBLIC_ADOPTURE_PROJECT_ID',\n    ENVIRONMENT: 'NEXT_PUBLIC_ADOPTURE_ENVIRONMENT',\n    DEBUG: 'NEXT_PUBLIC_ADOPTURE_DEBUG',\n  },\n  \n  // Server-side environment variables\n  SERVER: {\n    API_URL: 'ADOPTURE_API_URL',\n    API_KEY: 'ADOPTURE_API_KEY',\n    PROJECT_ID: 'ADOPTURE_PROJECT_ID',\n    ENVIRONMENT: 'ADOPTURE_ENVIRONMENT',\n    DEBUG: 'ADOPTURE_DEBUG',\n  },\n} as const;\n\n/**\n * Get environment variable value with fallback\n */\nfunction getEnvVar(key: string, fallback?: string): string | undefined {\n  if (typeof process !== 'undefined' && process.env) {\n    return process.env[key] || fallback;\n  }\n  return fallback;\n}\n\n/**\n * Load client-side configuration from environment variables and manual config\n */\nexport function loadClientConfig(manualConfig: Partial<NextAdoptureConfig> = {}): NextAdoptureConfig {\n  const envConfig: Partial<NextAdoptureConfig> = {\n    apiUrl: getEnvVar(ENV_VARS.CLIENT.API_URL, DEFAULT_API_URL),\n    apiKey: getEnvVar(ENV_VARS.CLIENT.API_KEY),\n    projectId: getEnvVar(ENV_VARS.CLIENT.PROJECT_ID),\n    environment: getEnvVar(ENV_VARS.CLIENT.ENVIRONMENT) as 'live' | 'test',\n    debug: getEnvVar(ENV_VARS.CLIENT.DEBUG) === 'true',\n  };\n\n  // Filter out undefined values\n  const filteredEnvConfig = Object.fromEntries(\n    Object.entries(envConfig).filter(([, value]) => value !== undefined)\n  );\n\n  return {\n    // Default values\n    apiUrl: DEFAULT_API_URL,\n    batchSize: 50,\n    flushInterval: 5000,\n    retryAttempts: 3,\n    retryDelay: 1000,\n    sessionTimeout: 30 * 60 * 1000, // 30 minutes\n    persistUser: true,\n    autoTrackSessions: true,\n    autoTrackLifecycle: true,\n    lifecycleDeduplication: true,\n    \n    // Next.js specific defaults\n    enableAutoPageTracking: true,\n    enableWebVitals: false,\n    enableRouteTracking: true,\n    routeChangeTimeout: 5000,\n    enableServerSideTracking: false,\n    bootstrapFromServer: false,\n    disableInDevelopment: false,\n    debugMode: false,\n    \n    // Event deduplication defaults\n    eventDeduplication: {\n      enabled: true,\n      maxCacheSize: 1000,\n      cleanupInterval: 60000,\n      strategies: {\n        adoption: {\n          window: 5000,\n        },\n        exposure: {\n          window: 86400000, // 24 hours\n        },\n        lifecycle: {\n          window: 10000,\n        },\n      },\n    },\n    \n    // Exposure deduplication defaults\n    exposureDeduplication: {\n      enabled: true,\n      sessionBased: true,\n      storageKey: 'adopture_exposures',\n      maxStorageEntries: 500,\n      sessionTimeoutMs: 24 * 60 * 60 * 1000, // 24 hours\n      perFeatureLimit: 10,\n      globalDailyLimit: 1000,\n      cleanupInterval: 5 * 60 * 1000, // 5 minutes\n    },\n    \n    // React deduplication defaults\n    reactDeduplication: {\n      enabled: true,\n      strictModeDetection: true,\n      componentLifecycleTracking: true,\n      preventEffectLoops: true,\n      renderCountThreshold: 3,\n      effectIdCacheSize: 1000,\n      debugMode: false,\n    },\n    \n    // Visibility tracking defaults\n    visibility: {\n      enabled: true,\n      threshold: 0.5,\n      minDuration: 1000,\n      observeOnce: true,\n      rootMargin: '0px',\n      trackInSession: true,\n      autoExpose: false,\n    },\n    \n    // Apply environment config\n    ...filteredEnvConfig,\n    \n    // Apply manual config (highest priority)\n    ...manualConfig,\n  };\n}\n\n/**\n * Load server-side configuration from environment variables and manual config\n */\nexport function loadServerConfig(manualConfig: Partial<ServerAdoptureConfig> = {}): ServerAdoptureConfig {\n  const envConfig: Partial<ServerAdoptureConfig> = {\n    apiUrl: getEnvVar(ENV_VARS.SERVER.API_URL, DEFAULT_API_URL),\n    apiKey: getEnvVar(ENV_VARS.SERVER.API_KEY),\n    projectId: getEnvVar(ENV_VARS.SERVER.PROJECT_ID),\n    environment: getEnvVar(ENV_VARS.SERVER.ENVIRONMENT) as 'live' | 'test',\n    debug: getEnvVar(ENV_VARS.SERVER.DEBUG) === 'true',\n  };\n\n  // Filter out undefined values\n  const filteredEnvConfig = Object.fromEntries(\n    Object.entries(envConfig).filter(([, value]) => value !== undefined)\n  );\n\n  return {\n    // Default values\n    apiUrl: DEFAULT_API_URL,\n    batchSize: 50,\n    flushInterval: 5000,\n    retryAttempts: 3,\n    retryDelay: 1000,\n    sessionTimeout: 30 * 60 * 1000, // 30 minutes\n    persistUser: true,\n    autoTrackSessions: true,\n    autoTrackLifecycle: true,\n    lifecycleDeduplication: true,\n    \n    // Server-specific defaults\n    enableEdgeRuntime: true,\n    requestTimeout: 5000,\n    \n    // Apply environment config\n    ...filteredEnvConfig,\n    \n    // Apply manual config (highest priority)\n    ...manualConfig,\n  };\n}\n\n/**\n * Validate that required configuration is present\n */\nexport function validateConfig(config: NextAdoptureConfig | ServerAdoptureConfig): { isValid: boolean; errors: string[] } {\n  const errors: string[] = [];\n\n  if (!config.apiKey) {\n    errors.push('API key is required');\n  }\n\n  if (!config.apiUrl) {\n    errors.push('API URL is required');\n  }\n\n  if (config.apiKey && !config.apiKey.match(/^ad_(live|test)_[a-zA-Z0-9]+$/)) {\n    errors.push('Invalid API key format. Expected format: ad_live_xxx or ad_test_xxx');\n  }\n\n  return {\n    isValid: errors.length === 0,\n    errors,\n  };\n}\n\n/**\n * Extract project ID from API key\n */\nexport function extractProjectIdFromApiKey(apiKey: string): string | null {\n  const match = apiKey.match(/^ad_(live|test)_(.+)$/);\n  if (match && match[2]) {\n    // In a real implementation, you might decode the project ID from the API key\n    // For now, we'll just return the key portion\n    return match[2].substring(0, 8); // Take first 8 chars as project ID\n  }\n  return null;\n}\n\n/**\n * Determine environment from API key\n */\nexport function extractEnvironmentFromApiKey(apiKey: string): 'live' | 'test' | null {\n  if (apiKey.startsWith('ad_live_')) {\n    return 'live';\n  }\n  if (apiKey.startsWith('ad_test_')) {\n    return 'test';\n  }\n  return null;\n}\n\n/**\n * Check if we're in development mode\n */\nexport function isDevelopment(): boolean {\n  return getEnvVar('NODE_ENV') === 'development';\n}\n\n/**\n * Check if we're in production mode\n */\nexport function isProduction(): boolean {\n  return getEnvVar('NODE_ENV') === 'production';\n}\n\n/**\n * Check if we're running on the server side\n */\nexport function isServer(): boolean {\n  return typeof window === 'undefined';\n}\n\n/**\n * Check if we're running on the client side\n */\nexport function isClient(): boolean {\n  return typeof window !== 'undefined';\n}"]}