-
Notifications
You must be signed in to change notification settings - Fork 4.3k
Expand file tree
/
Copy pathenv.validators.ts
More file actions
127 lines (114 loc) · 5.36 KB
/
env.validators.ts
File metadata and controls
127 lines (114 loc) · 5.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import { DEFAULT_NOTIFICATION_RETENTION_DAYS, FeatureFlagsKeysEnum, StringifyEnv } from '@novu/shared';
import { bool, CleanedEnv, cleanEnv, json, num, port, str, url, ValidatorSpec } from 'envalid';
export function validateEnv() {
return cleanEnv(process.env, envValidators);
}
export type ValidatedEnv = StringifyEnv<CleanedEnv<typeof envValidators>>;
const processEnv = process.env as Record<string, string>; // Hold the initial process.env to avoid circular reference
export const envValidators = {
TZ: str({ default: 'UTC' }),
NODE_ENV: str({ choices: ['dev', 'test', 'production', 'ci', 'local'], default: 'local' }),
LOG_LEVEL: str({ choices: ['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'none'] }),
PORT: port(),
FRONT_BASE_URL: str(),
DISABLE_USER_REGISTRATION: bool({ default: false }),
REDIS_HOST: str(),
REDIS_PORT: port(),
REDIS_TLS: json({ default: undefined }),
REDIS_MASTER_HOST: str({ default: '' }),
REDIS_MASTER_PORT: str({ default: '' }),
REDIS_SLAVE_HOST: str({ default: '' }),
REDIS_SLAVE_PORT: str({ default: '' }),
JWT_SECRET: str(),
SENDGRID_API_KEY: str({ default: '' }),
MONGO_AUTO_CREATE_INDEXES: bool({ default: false }),
MONGO_MAX_IDLE_TIME_IN_MS: num({ default: 1000 * 30 }),
MONGO_MAX_POOL_SIZE: num({ default: 50 }),
MONGO_MIN_POOL_SIZE: num({ default: 10 }),
MONGO_URL: str(),
NOVU_API_KEY: str({ default: '' }),
STORE_ENCRYPTION_KEY: str(),
REDIS_CACHE_SERVICE_HOST: str({ default: '' }),
REDIS_CACHE_SERVICE_PORT: str({ default: '' }),
REDIS_CACHE_SERVICE_TLS: json({ default: undefined }),
REDIS_CLUSTER_SERVICE_HOST: str({ default: '' }),
REDIS_CLUSTER_SERVICE_PORTS: str({ default: '' }),
STORE_NOTIFICATION_CONTENT: bool({ default: false }),
WORKER_DEFAULT_CONCURRENCY: num({ default: undefined }),
WORKER_DEFAULT_LOCK_DURATION: num({ default: undefined }),
ENABLE_OTEL: bool({ default: false }),
NOTIFICATION_RETENTION_DAYS: num({ default: DEFAULT_NOTIFICATION_RETENTION_DAYS }),
API_ROOT_URL: url(),
NOVU_INVITE_TEAM_MEMBER_NUDGE_TRIGGER_IDENTIFIER: str({ default: undefined }),
SUBSCRIBER_WIDGET_JWT_EXPIRATION_TIME: str({ default: '15 days' }),
NOVU_REGION: str({ default: 'local' }),
NOVU_SECRET_KEY: str({ default: '' }),
INTERNAL_SERVICES_API_KEY: str({ default: undefined }),
SCHEDULER_URL: str({ default: undefined }),
SCHEDULER_API_KEY: str({ default: undefined }),
INTERNAL_CALLBACK_API_KEY: str({ default: undefined }),
// Novu Cloud third party services
...(processEnv.IS_SELF_HOSTED !== 'true' &&
processEnv.NOVU_ENTERPRISE === 'true' && {
HUBSPOT_INVITE_NUDGE_EMAIL_USER_LIST_ID: str({ default: undefined }),
HUBSPOT_PRIVATE_APP_ACCESS_TOKEN: str({ default: undefined }),
LAUNCH_DARKLY_SDK_KEY: str({ default: '' }),
NEW_RELIC_APP_NAME: str({ default: '' }),
NEW_RELIC_LICENSE_KEY: str({ default: '' }),
PLAIN_SUPPORT_KEY: str({ default: undefined }),
PLAIN_IDENTITY_VERIFICATION_SECRET_KEY: str({ default: undefined }),
PLAIN_CARDS_HMAC_SECRET_KEY: str({ default: undefined }),
STRIPE_API_KEY: str({ default: undefined }),
STRIPE_CONNECT_SECRET: str({ default: undefined }),
NOVU_INTERNAL_SECRET_KEY: str({ default: '' }),
KEYLESS_ORGANIZATION_ID: str({ desc: 'Required organizationId for Keyless authentication', default: undefined }),
KEYLESS_USER_EMAIL: str({ desc: 'Required email for Keyless authentication', default: undefined }),
CLICK_HOUSE_URL: str({ default: '' }),
CLICK_HOUSE_DATABASE: str({ default: '' }),
CLICK_HOUSE_USER: str({ default: '' }),
CLICK_HOUSE_PASSWORD: str({ default: '' }),
}),
// Feature Flags - Boolean (start with IS_)
...Object.keys(FeatureFlagsKeysEnum)
.filter((key) => key.startsWith('IS_'))
.reduce<Record<string, ValidatorSpec<boolean>>>((acc, key) => {
acc[key] = bool({ default: false });
return acc;
}, {}),
// Feature Flags - Numeric (end with _NUMBER)
...Object.keys(FeatureFlagsKeysEnum)
.filter((key) => key.endsWith('_NUMBER'))
.reduce<Record<string, ValidatorSpec<number | undefined>>>((acc, key) => {
acc[key] = num({ default: undefined });
return acc;
}, {}),
// Feature Flags - String
CF_SCHEDULER_MODE_STR: str({ choices: ['off', 'shadow', 'live', 'complete'], default: 'off' }),
LOG_LEVEL_STR: str({ choices: ['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'none'], default: undefined }),
// Azure validators
...(processEnv.STORAGE_SERVICE === 'AZURE' && {
AZURE_ACCOUNT_NAME: str(),
AZURE_ACCOUNT_KEY: str(),
AZURE_HOST_NAME: str({ default: `https://${processEnv.AZURE_ACCOUNT_NAME}.blob.core.windows.net` }),
AZURE_CONTAINER_NAME: str({ default: 'novu' }),
}),
// GCS validators
...(processEnv.STORAGE_SERVICE === 'GCS' && {
GCS_BUCKET_NAME: str(),
GCS_DOMAIN: str(),
}),
// AWS validators
...(processEnv.STORAGE_SERVICE === 'AWS' && {
S3_LOCAL_STACK: str({ default: '' }),
S3_BUCKET_NAME: str(),
S3_REGION: str(),
}),
// Production validators
...(['local', 'test'].includes(processEnv.NODE_ENV) && {
SENTRY_DSN: str({ default: '' }),
VERCEL_CLIENT_ID: str({ default: '' }),
VERCEL_CLIENT_SECRET: str({ default: '' }),
VERCEL_REDIRECT_URI: url({ default: 'https://dashboard.novu.co/auth/login' }),
VERCEL_BASE_URL: url({ default: 'https://api.vercel.com' }),
}),
} satisfies Record<string, ValidatorSpec<unknown>>;