|
| 1 | +import { z } from "zod"; |
1 | 2 | import { NodeEnv, PORT_DEFAULT_BACKEND } from "@core/constants/core.constants"; |
2 | 3 | import { isDev } from "@core/util/env.util"; |
| 4 | +import { Logger } from "@core/logger/winston.logger"; |
| 5 | + |
| 6 | +const logger = Logger("app:constants"); |
3 | 7 |
|
4 | 8 | const _nodeEnv = process.env["NODE_ENV"] as NodeEnv; |
5 | 9 | if (!Object.values(NodeEnv).includes(_nodeEnv)) { |
6 | 10 | throw new Error(`Invalid NODE_ENV value: '${_nodeEnv}'`); |
7 | 11 | } |
8 | 12 |
|
9 | | -export const IS_DEV = isDev(_nodeEnv); |
10 | | -const db = IS_DEV ? "dev_calendar" : "prod_calendar"; |
| 13 | +const IS_DEV = isDev(_nodeEnv); |
| 14 | + |
| 15 | +const EnvSchema = z |
| 16 | + .object({ |
| 17 | + BASEURL: z.string().nonempty(), |
| 18 | + CHANNEL_EXPIRATION_MIN: z.string().nonempty().default("10"), |
| 19 | + CLIENT_ID: z.string().nonempty(), |
| 20 | + CLIENT_SECRET: z.string().nonempty(), |
| 21 | + DB: z.string().nonempty(), |
| 22 | + EMAILER_SECRET: z.string().nonempty().optional(), |
| 23 | + EMAILER_LIST_ID: z.string().nonempty().optional(), |
| 24 | + MONGO_URI: z.string().nonempty(), |
| 25 | + NODE_ENV: z.nativeEnum(NodeEnv), |
| 26 | + ORIGINS_ALLOWED: z.array(z.string().nonempty()).default([]), |
| 27 | + PORT: z.string().nonempty().default(PORT_DEFAULT_BACKEND.toString()), |
| 28 | + SUPERTOKENS_URI: z.string().nonempty(), |
| 29 | + SUPERTOKENS_KEY: z.string().nonempty(), |
| 30 | + TOKEN_GCAL_NOTIFICATION: z.string().nonempty(), |
| 31 | + TOKEN_COMPASS_SYNC: z.string().nonempty(), |
| 32 | + }) |
| 33 | + .strict(); |
11 | 34 |
|
12 | | -const _error = ">> TODO: set this value in .env <<"; |
| 35 | +type Env = z.infer<typeof EnvSchema>; |
13 | 36 |
|
14 | 37 | export const ENV = { |
15 | | - BASEURL: process.env["BASEURL"] as string, |
16 | | - CHANNEL_EXPIRATION_MIN: process.env["CHANNEL_EXPIRATION_MIN"] || "10", |
17 | | - CLIENT_ID: process.env["CLIENT_ID"] || _error, |
18 | | - CLIENT_SECRET: process.env["CLIENT_SECRET"] || _error, |
19 | | - DB: db, |
20 | | - EMAILER_KEY: process.env["EMAILER_API_KEY"] || _error, |
21 | | - EMAILER_SECRET: process.env["EMAILER_API_SECRET"] || _error, |
22 | | - EMAILER_LIST_ID: process.env["EMAILER_LIST_ID"] || _error, |
23 | | - MONGO_URI: process.env["MONGO_URI"] || _error, |
| 38 | + BASEURL: process.env["BASEURL"], |
| 39 | + CHANNEL_EXPIRATION_MIN: process.env["CHANNEL_EXPIRATION_MIN"], |
| 40 | + CLIENT_ID: process.env["CLIENT_ID"], |
| 41 | + CLIENT_SECRET: process.env["CLIENT_SECRET"], |
| 42 | + DB: IS_DEV ? "dev_calendar" : "prod_calendar", |
| 43 | + EMAILER_SECRET: process.env["EMAILER_API_SECRET"], |
| 44 | + EMAILER_LIST_ID: process.env["EMAILER_LIST_ID"], |
| 45 | + MONGO_URI: process.env["MONGO_URI"], |
24 | 46 | NODE_ENV: _nodeEnv, |
25 | 47 | ORIGINS_ALLOWED: process.env["CORS"] ? process.env["CORS"].split(",") : [], |
26 | | - PORT: process.env["PORT"] || PORT_DEFAULT_BACKEND, |
27 | | - SUPERTOKENS_URI: process.env["SUPERTOKENS_URI"] || _error, |
28 | | - SUPERTOKENS_KEY: process.env["SUPERTOKENS_KEY"] || _error, |
29 | | - TOKEN_GCAL_NOTIFICATION: process.env["TOKEN_GCAL_NOTIFICATION"] || _error, |
30 | | - TOKEN_COMPASS_SYNC: process.env["TOKEN_COMPASS_SYNC"] || _error, |
31 | | -}; |
32 | | - |
33 | | -if (Object.values(ENV).includes(_error)) { |
34 | | - console.log( |
35 | | - `Exiting because a critical env value is missing: ${JSON.stringify( |
36 | | - ENV, |
37 | | - null, |
38 | | - 2 |
39 | | - )}` |
40 | | - ); |
| 48 | + PORT: process.env["PORT"], |
| 49 | + SUPERTOKENS_URI: process.env["SUPERTOKENS_URI"], |
| 50 | + SUPERTOKENS_KEY: process.env["SUPERTOKENS_KEY"], |
| 51 | + TOKEN_GCAL_NOTIFICATION: process.env["TOKEN_GCAL_NOTIFICATION"], |
| 52 | + TOKEN_COMPASS_SYNC: process.env["TOKEN_COMPASS_SYNC"], |
| 53 | +} as Env; |
| 54 | + |
| 55 | +const parsedEnv = EnvSchema.safeParse(ENV); |
| 56 | + |
| 57 | +if (!parsedEnv.success) { |
| 58 | + logger.error(`Exiting because a critical env value is missing or invalid:`); |
| 59 | + console.error(parsedEnv.error.issues); |
41 | 60 | process.exit(1); |
42 | 61 | } |
0 commit comments