feat: validate environment configuration with dotenv and zod
This commit is contained in:
@@ -1,5 +1,9 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
require("dotenv").config({ quiet: true });
|
||||||
|
|
||||||
|
const { z } = require("zod");
|
||||||
|
|
||||||
function intFromEnv(name, fallback) {
|
function intFromEnv(name, fallback) {
|
||||||
const raw = process.env[name];
|
const raw = process.env[name];
|
||||||
if (!raw) {
|
if (!raw) {
|
||||||
@@ -15,7 +19,7 @@ function strFromEnv(name, fallback) {
|
|||||||
return raw && String(raw).trim() ? String(raw).trim() : fallback;
|
return raw && String(raw).trim() ? String(raw).trim() : fallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
const config = {
|
const parsed = {
|
||||||
port: intFromEnv("PORT", 3000),
|
port: intFromEnv("PORT", 3000),
|
||||||
stateFilePath: strFromEnv("STATE_FILE_PATH", "./data/state.json"),
|
stateFilePath: strFromEnv("STATE_FILE_PATH", "./data/state.json"),
|
||||||
xWebhookSecret: process.env.X_WEBHOOK_SECRET || "dev-x-secret",
|
xWebhookSecret: process.env.X_WEBHOOK_SECRET || "dev-x-secret",
|
||||||
@@ -34,6 +38,27 @@ const config = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const ConfigSchema = z.object({
|
||||||
|
port: z.number().int().positive(),
|
||||||
|
stateFilePath: z.string().min(1),
|
||||||
|
xWebhookSecret: z.string().min(1),
|
||||||
|
polarWebhookSecret: z.string().min(1),
|
||||||
|
rateLimits: z.object({
|
||||||
|
webhookPerMinute: z.number().int().positive(),
|
||||||
|
authPerMinute: z.number().int().positive(),
|
||||||
|
actionPerMinute: z.number().int().positive(),
|
||||||
|
}),
|
||||||
|
credit: z.object({
|
||||||
|
baseCredits: z.number().int().positive(),
|
||||||
|
includedChars: z.number().int().positive(),
|
||||||
|
stepChars: z.number().int().positive(),
|
||||||
|
stepCredits: z.number().int().positive(),
|
||||||
|
maxCharsPerArticle: z.number().int().positive(),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
const config = ConfigSchema.parse(parsed);
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
config,
|
config,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user