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.
159 lines (158 loc) • 5.68 kB
JavaScript
import { L as Logger } from "./inApp-ClGwbWFU.js";
function isFirebaseAppConfig(config) {
return "app" in config;
}
function isOneSignalInstanceConfig(config) {
return "instance" in config;
}
const types = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
isFirebaseAppConfig,
isOneSignalInstanceConfig
}, Symbol.toStringTag, { value: "Module" }));
class ConfigValidator {
/**
* Validate Firebase configuration
*/
static validateFirebaseConfig(config) {
if (isFirebaseAppConfig(config)) {
return;
}
const requiredFields = [
"apiKey",
"authDomain",
"projectId",
"storageBucket",
"messagingSenderId",
"appId"
];
const missingFields = requiredFields.filter((field) => !(field in config));
if (missingFields.length > 0) {
throw new Error(
`Missing required Firebase configuration fields: ${missingFields.join(", ")}. Make sure all required environment variables are set.`
);
}
this.performSecurityChecks(config);
}
/**
* Validate OneSignal configuration
*/
static validateOneSignalConfig(config) {
if (isOneSignalInstanceConfig(config)) {
return;
}
if (!config.appId) {
throw new Error(
"Missing required OneSignal appId. Make sure ONESIGNAL_APP_ID environment variable is set."
);
}
if ("restApiKey" in config && config.restApiKey && config.restApiKey.length < 48) {
Logger.warn(
"OneSignal REST API key appears to be invalid. Server-side operations may fail."
);
}
this.performSecurityChecks(config);
}
/**
* Perform security checks on configuration
*/
static performSecurityChecks(config) {
const suspiciousPatterns = [
{ field: "apiKey", pattern: /^AIzaSy/, provider: "Firebase" },
{ field: "appId", pattern: /^[0-9a-f]{8}-[0-9a-f]{4}-/, provider: "OneSignal" }
];
for (const { field, pattern, provider } of suspiciousPatterns) {
if (config[field] && typeof config[field] === "string") {
const value = config[field];
if (pattern.test(value)) {
const isFromEnv = this.isFromEnvironmentVariable(value);
if (!isFromEnv && process.env.NODE_ENV === "production") {
Logger.warn(
`Potential hardcoded ${provider} ${field} detected. Consider using environment variables for better security.`
);
}
}
}
}
if (process.env.NODE_ENV === "production") {
const localhostFields = ["authDomain", "databaseURL"];
for (const field of localhostFields) {
if (config[field] && config[field].includes("localhost")) {
Logger.warn(
`Configuration field '${field}' contains 'localhost' in production. This may cause issues.`
);
}
}
}
}
/**
* Check if a value likely comes from an environment variable
*/
static isFromEnvironmentVariable(value) {
if (typeof process !== "undefined" && process.env) {
const commonEnvVars = [
"FIREBASE_API_KEY",
"NEXT_PUBLIC_FIREBASE_API_KEY",
"REACT_APP_FIREBASE_API_KEY",
"VITE_FIREBASE_API_KEY",
"VUE_APP_FIREBASE_API_KEY",
"ONESIGNAL_APP_ID",
"NEXT_PUBLIC_ONESIGNAL_APP_ID",
"REACT_APP_ONESIGNAL_APP_ID",
"VITE_ONESIGNAL_APP_ID",
"VUE_APP_ONESIGNAL_APP_ID"
];
return commonEnvVars.some((envVar) => process.env[envVar] === value);
}
return false;
}
/**
* Validate environment variables are set
*/
static validateEnvironmentVariables(provider) {
if (typeof process === "undefined" || !process.env) {
return;
}
const requiredEnvVars = provider === "firebase" ? this.getRequiredFirebaseEnvVars() : this.getRequiredOneSignalEnvVars();
const missingEnvVars = [];
for (const envVars of requiredEnvVars) {
const hasAny = envVars.some((envVar) => !!process.env[envVar]);
if (!hasAny) {
missingEnvVars.push(envVars.join(" or "));
}
}
if (missingEnvVars.length > 0) {
Logger.warn(
`Missing environment variables for ${provider}: ${missingEnvVars.join(", ")}. Make sure to set these in your .env file or deployment environment.`
);
}
}
/**
* Get required Firebase environment variables (with common prefixes)
*/
static getRequiredFirebaseEnvVars() {
return [
["FIREBASE_API_KEY", "NEXT_PUBLIC_FIREBASE_API_KEY", "REACT_APP_FIREBASE_API_KEY", "VITE_FIREBASE_API_KEY"],
["FIREBASE_AUTH_DOMAIN", "NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN", "REACT_APP_FIREBASE_AUTH_DOMAIN", "VITE_FIREBASE_AUTH_DOMAIN"],
["FIREBASE_PROJECT_ID", "NEXT_PUBLIC_FIREBASE_PROJECT_ID", "REACT_APP_FIREBASE_PROJECT_ID", "VITE_FIREBASE_PROJECT_ID"],
["FIREBASE_STORAGE_BUCKET", "NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET", "REACT_APP_FIREBASE_STORAGE_BUCKET", "VITE_FIREBASE_STORAGE_BUCKET"],
["FIREBASE_MESSAGING_SENDER_ID", "NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID", "REACT_APP_FIREBASE_MESSAGING_SENDER_ID", "VITE_FIREBASE_MESSAGING_SENDER_ID"],
["FIREBASE_APP_ID", "NEXT_PUBLIC_FIREBASE_APP_ID", "REACT_APP_FIREBASE_APP_ID", "VITE_FIREBASE_APP_ID"]
];
}
/**
* Get required OneSignal environment variables (with common prefixes)
*/
static getRequiredOneSignalEnvVars() {
return [
["ONESIGNAL_APP_ID", "NEXT_PUBLIC_ONESIGNAL_APP_ID", "REACT_APP_ONESIGNAL_APP_ID", "VITE_ONESIGNAL_APP_ID"]
];
}
}
export {
ConfigValidator as C,
isOneSignalInstanceConfig as a,
isFirebaseAppConfig as i,
types as t
};
//# sourceMappingURL=config-validator-CiAZwcZR.js.map