notification-kit
Version:
A unified notification library for React + Capacitor apps. One API for push notifications, in-app notifications, and local notifications across Web, iOS, and Android.
1 lines • 8.9 kB
Source Map (JSON)
{"version":3,"file":"config-validator-CAcf6-xn.mjs","sources":["../src/utils/config-validator.ts"],"sourcesContent":["import { Logger } from './logger'\nimport type { FirebaseConfig, OneSignalConfig } from '@/types'\n\n/**\n * Configuration validator with security checks\n */\nexport class ConfigValidator {\n /**\n * Validate Firebase configuration\n */\n static validateFirebaseConfig(config: FirebaseConfig): void {\n const requiredFields: (keyof FirebaseConfig)[] = [\n 'apiKey',\n 'authDomain',\n 'projectId',\n 'storageBucket',\n 'messagingSenderId',\n 'appId',\n ]\n\n const missingFields = requiredFields.filter(field => !config[field])\n\n if (missingFields.length > 0) {\n throw new Error(\n `Missing required Firebase configuration fields: ${missingFields.join(', ')}. ` +\n 'Make sure all required environment variables are set.'\n )\n }\n\n // Security checks\n this.performSecurityChecks(config)\n }\n\n /**\n * Validate OneSignal configuration\n */\n static validateOneSignalConfig(config: OneSignalConfig): void {\n if (!config.appId) {\n throw new Error(\n 'Missing required OneSignal appId. ' +\n 'Make sure ONESIGNAL_APP_ID environment variable is set.'\n )\n }\n\n // Validate REST API key if provided (needed for server operations)\n if (config.restApiKey && config.restApiKey.length < 48) {\n Logger.warn(\n 'OneSignal REST API key appears to be invalid. ' +\n 'Server-side operations may fail.'\n )\n }\n\n // Security checks\n this.performSecurityChecks(config)\n }\n\n /**\n * Perform security checks on configuration\n */\n private static performSecurityChecks(config: Record<string, any>): void {\n // Check for hardcoded credentials (common patterns)\n const suspiciousPatterns = [\n { field: 'apiKey', pattern: /^AIzaSy/, provider: 'Firebase' },\n { field: 'appId', pattern: /^[0-9a-f]{8}-[0-9a-f]{4}-/, provider: 'OneSignal' },\n ]\n\n for (const { field, pattern, provider } of suspiciousPatterns) {\n if (config[field] && typeof config[field] === 'string') {\n const value = config[field] as string\n \n // Check if it looks like a real credential\n if (pattern.test(value)) {\n // Check if it's from environment variable\n const isFromEnv = this.isFromEnvironmentVariable(value)\n \n if (!isFromEnv && process.env.NODE_ENV === 'production') {\n Logger.warn(\n `Potential hardcoded ${provider} ${field} detected. ` +\n 'Consider using environment variables for better security.'\n )\n }\n }\n }\n }\n\n // Check for localhost in production\n if (process.env.NODE_ENV === 'production') {\n const localhostFields = ['authDomain', 'databaseURL']\n for (const field of localhostFields) {\n if (config[field] && config[field].includes('localhost')) {\n Logger.warn(\n `Configuration field '${field}' contains 'localhost' in production. ` +\n 'This may cause issues.'\n )\n }\n }\n }\n }\n\n /**\n * Check if a value likely comes from an environment variable\n */\n private static isFromEnvironmentVariable(value: string): boolean {\n // This is a heuristic - in a browser environment we can't directly check\n // if a value came from process.env, but we can check common patterns\n \n // Check if running in Node.js environment\n if (typeof process !== 'undefined' && process.env) {\n // Check common environment variable names\n const commonEnvVars = [\n 'FIREBASE_API_KEY',\n 'NEXT_PUBLIC_FIREBASE_API_KEY',\n 'REACT_APP_FIREBASE_API_KEY',\n 'VITE_FIREBASE_API_KEY',\n 'VUE_APP_FIREBASE_API_KEY',\n 'ONESIGNAL_APP_ID',\n 'NEXT_PUBLIC_ONESIGNAL_APP_ID',\n 'REACT_APP_ONESIGNAL_APP_ID',\n 'VITE_ONESIGNAL_APP_ID',\n 'VUE_APP_ONESIGNAL_APP_ID',\n ]\n\n return commonEnvVars.some(envVar => process.env[envVar] === value)\n }\n\n return false\n }\n\n /**\n * Validate environment variables are set\n */\n static validateEnvironmentVariables(provider: 'firebase' | 'onesignal'): void {\n if (typeof process === 'undefined' || !process.env) {\n // Not in Node.js environment, skip validation\n return\n }\n\n const requiredEnvVars = provider === 'firebase' \n ? this.getRequiredFirebaseEnvVars()\n : this.getRequiredOneSignalEnvVars()\n\n const missingEnvVars: string[] = []\n \n for (const envVars of requiredEnvVars) {\n const hasAny = envVars.some(envVar => !!process.env[envVar])\n if (!hasAny) {\n missingEnvVars.push(envVars.join(' or '))\n }\n }\n\n if (missingEnvVars.length > 0) {\n Logger.warn(\n `Missing environment variables for ${provider}: ${missingEnvVars.join(', ')}. ` +\n 'Make sure to set these in your .env file or deployment environment.'\n )\n }\n }\n\n /**\n * Get required Firebase environment variables (with common prefixes)\n */\n private static getRequiredFirebaseEnvVars(): string[][] {\n return [\n ['FIREBASE_API_KEY', 'NEXT_PUBLIC_FIREBASE_API_KEY', 'REACT_APP_FIREBASE_API_KEY', 'VITE_FIREBASE_API_KEY'],\n ['FIREBASE_AUTH_DOMAIN', 'NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN', 'REACT_APP_FIREBASE_AUTH_DOMAIN', 'VITE_FIREBASE_AUTH_DOMAIN'],\n ['FIREBASE_PROJECT_ID', 'NEXT_PUBLIC_FIREBASE_PROJECT_ID', 'REACT_APP_FIREBASE_PROJECT_ID', 'VITE_FIREBASE_PROJECT_ID'],\n ['FIREBASE_STORAGE_BUCKET', 'NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET', 'REACT_APP_FIREBASE_STORAGE_BUCKET', 'VITE_FIREBASE_STORAGE_BUCKET'],\n ['FIREBASE_MESSAGING_SENDER_ID', 'NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID', 'REACT_APP_FIREBASE_MESSAGING_SENDER_ID', 'VITE_FIREBASE_MESSAGING_SENDER_ID'],\n ['FIREBASE_APP_ID', 'NEXT_PUBLIC_FIREBASE_APP_ID', 'REACT_APP_FIREBASE_APP_ID', 'VITE_FIREBASE_APP_ID'],\n ]\n }\n\n /**\n * Get required OneSignal environment variables (with common prefixes)\n */\n private static getRequiredOneSignalEnvVars(): string[][] {\n return [\n ['ONESIGNAL_APP_ID', 'NEXT_PUBLIC_ONESIGNAL_APP_ID', 'REACT_APP_ONESIGNAL_APP_ID', 'VITE_ONESIGNAL_APP_ID'],\n ]\n }\n}"],"names":[],"mappings":";AAMO,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAI3B,OAAO,uBAAuB,QAA8B;AAC1D,UAAM,iBAA2C;AAAA,MAC/C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAGF,UAAM,gBAAgB,eAAe,OAAO,WAAS,CAAC,OAAO,KAAK,CAAC;AAEnE,QAAI,cAAc,SAAS,GAAG;AAC5B,YAAM,IAAI;AAAA,QACR,mDAAmD,cAAc,KAAK,IAAI,CAAC;AAAA,MAAA;AAAA,IAG/E;AAGA,SAAK,sBAAsB,MAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,wBAAwB,QAA+B;AAC5D,QAAI,CAAC,OAAO,OAAO;AACjB,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAGJ;AAGA,QAAI,OAAO,cAAc,OAAO,WAAW,SAAS,IAAI;AACtD,aAAO;AAAA,QACL;AAAA,MAAA;AAAA,IAGJ;AAGA,SAAK,sBAAsB,MAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,sBAAsB,QAAmC;AAEtE,UAAM,qBAAqB;AAAA,MACzB,EAAE,OAAO,UAAU,SAAS,WAAW,UAAU,WAAA;AAAA,MACjD,EAAE,OAAO,SAAS,SAAS,6BAA6B,UAAU,YAAA;AAAA,IAAY;AAGhF,eAAW,EAAE,OAAO,SAAS,SAAA,KAAc,oBAAoB;AAC7D,UAAI,OAAO,KAAK,KAAK,OAAO,OAAO,KAAK,MAAM,UAAU;AACtD,cAAM,QAAQ,OAAO,KAAK;AAG1B,YAAI,QAAQ,KAAK,KAAK,GAAG;AAEvB,gBAAM,YAAY,KAAK,0BAA0B,KAAK;AAEtD,cAAI,CAAC,aAAa,QAAQ,IAAI,aAAa,cAAc;AACvD,mBAAO;AAAA,cACL,uBAAuB,QAAQ,IAAI,KAAK;AAAA,YAAA;AAAA,UAG5C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,YAAM,kBAAkB,CAAC,cAAc,aAAa;AACpD,iBAAW,SAAS,iBAAiB;AACnC,YAAI,OAAO,KAAK,KAAK,OAAO,KAAK,EAAE,SAAS,WAAW,GAAG;AACxD,iBAAO;AAAA,YACL,wBAAwB,KAAK;AAAA,UAAA;AAAA,QAGjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,0BAA0B,OAAwB;AAK/D,QAAI,OAAO,YAAY,eAAe,QAAQ,KAAK;AAEjD,YAAM,gBAAgB;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGF,aAAO,cAAc,KAAK,CAAA,WAAU,QAAQ,IAAI,MAAM,MAAM,KAAK;AAAA,IACnE;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,6BAA6B,UAA0C;AAC5E,QAAI,OAAO,YAAY,eAAe,CAAC,QAAQ,KAAK;AAElD;AAAA,IACF;AAEA,UAAM,kBAAkB,aAAa,aACjC,KAAK,2BAAA,IACL,KAAK,4BAAA;AAET,UAAM,iBAA2B,CAAA;AAEjC,eAAW,WAAW,iBAAiB;AACrC,YAAM,SAAS,QAAQ,KAAK,CAAA,WAAU,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC;AAC3D,UAAI,CAAC,QAAQ;AACX,uBAAe,KAAK,QAAQ,KAAK,MAAM,CAAC;AAAA,MAC1C;AAAA,IACF;AAEA,QAAI,eAAe,SAAS,GAAG;AAC7B,aAAO;AAAA,QACL,qCAAqC,QAAQ,KAAK,eAAe,KAAK,IAAI,CAAC;AAAA,MAAA;AAAA,IAG/E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,6BAAyC;AACtD,WAAO;AAAA,MACL,CAAC,oBAAoB,gCAAgC,8BAA8B,uBAAuB;AAAA,MAC1G,CAAC,wBAAwB,oCAAoC,kCAAkC,2BAA2B;AAAA,MAC1H,CAAC,uBAAuB,mCAAmC,iCAAiC,0BAA0B;AAAA,MACtH,CAAC,2BAA2B,uCAAuC,qCAAqC,8BAA8B;AAAA,MACtI,CAAC,gCAAgC,4CAA4C,0CAA0C,mCAAmC;AAAA,MAC1J,CAAC,mBAAmB,+BAA+B,6BAA6B,sBAAsB;AAAA,IAAA;AAAA,EAE1G;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,8BAA0C;AACvD,WAAO;AAAA,MACL,CAAC,oBAAoB,gCAAgC,8BAA8B,uBAAuB;AAAA,IAAA;AAAA,EAE9G;AACF;"}