UNPKG

@adopture/next

Version:

Next.js SDK for Adopture feature adoption tracking with SSR support

1 lines 11.3 kB
{"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}"]}