Added env check on compile time

This commit is contained in:
sianida26 2024-05-29 16:50:46 +07:00
parent 7c03370f53
commit f038485cb7
9 changed files with 41 additions and 17 deletions

View File

@ -1,11 +1,8 @@
import "dotenv/config"; import "dotenv/config";
import type { Config } from "drizzle-kit"; import type { Config } from "drizzle-kit";
import appEnv from "./src/appEnv";
const databaseUrl = process.env.DATABASE_URL; const databaseUrl = appEnv.DATABASE_URL;
if (!databaseUrl) {
throw new Error("DATABASE_URL is not set");
}
export default { export default {
schema: "./src/drizzle/schema/*", schema: "./src/drizzle/schema/*",

View File

@ -6,7 +6,8 @@
"db:push": "drizzle-kit push", "db:push": "drizzle-kit push",
"db:seed": "tsx src/drizzle/seed.ts", "db:seed": "tsx src/drizzle/seed.ts",
"db:migrate": "tsx src/drizzle/migration.ts", "db:migrate": "tsx src/drizzle/migration.ts",
"db:studio": "drizzle-kit studio" "db:studio": "drizzle-kit studio",
"start": "tsc -p tsconfig.json && tsx src/index.ts"
}, },
"dependencies": { "dependencies": {
"@hono/node-server": "^1.11.1", "@hono/node-server": "^1.11.1",

View File

@ -0,0 +1,20 @@
import dotenv from "dotenv";
import { z } from "zod";
dotenv.config();
const envSchema = z.object({
APP_PORT: z.coerce.number().int(),
DATABASE_URL: z.string(),
ACCESS_TOKEN_SECRET: z.string(),
REFRESH_TOKEN_SECRET: z.string(),
COOKIE_SECRET: z.string(),
});
const parsedEnv = envSchema.safeParse(process.env);
if (!parsedEnv.success) {
throw new Error(parsedEnv.error.toString());
}
export default parsedEnv.data;

View File

@ -7,10 +7,11 @@ import * as rolesSchema from "./schema/roles";
import * as permissionsToRolesSchema from "./schema/permissionsToRoles"; import * as permissionsToRolesSchema from "./schema/permissionsToRoles";
import * as permissionsToUsersSchema from "./schema/permissionsToUsers"; import * as permissionsToUsersSchema from "./schema/permissionsToUsers";
import * as rolesToUsersSchema from "./schema/rolesToUsers"; import * as rolesToUsersSchema from "./schema/rolesToUsers";
import appEnv from "../appEnv";
configDotenv(); configDotenv();
const dbUrl = process.env.DATABASE_URL; const dbUrl = appEnv.DATABASE_URL;
if (!dbUrl) throw new Error("DATABASE_URL is not set"); if (!dbUrl) throw new Error("DATABASE_URL is not set");

View File

@ -2,10 +2,11 @@ import { configDotenv } from "dotenv";
import { drizzle } from "drizzle-orm/postgres-js"; import { drizzle } from "drizzle-orm/postgres-js";
import { migrate } from "drizzle-orm/postgres-js/migrator"; import { migrate } from "drizzle-orm/postgres-js/migrator";
import postgres from "postgres"; import postgres from "postgres";
import appEnv from "../appEnv";
configDotenv(); configDotenv();
const dbUrl = process.env.DATABASE_URL; const dbUrl = appEnv.DATABASE_URL;
if (!dbUrl) throw new Error("DATABASE_URL is not set"); if (!dbUrl) throw new Error("DATABASE_URL is not set");

View File

@ -14,6 +14,7 @@ import { logger } from "hono/logger";
import DashboardError from "./errors/DashboardError"; import DashboardError from "./errors/DashboardError";
import HonoEnv from "./types/HonoEnv"; import HonoEnv from "./types/HonoEnv";
import devRoutes from "./routes/dev/route"; import devRoutes from "./routes/dev/route";
import appEnv from "./appEnv";
configDotenv(); configDotenv();
@ -27,7 +28,7 @@ const routes = app
}) })
) )
.use(async (c, next) => { .use(async (c, next) => {
const cookieSecret = process.env.COOKIE_SECRET; const cookieSecret = appEnv.COOKIE_SECRET;
if (!cookieSecret) if (!cookieSecret)
throw new HTTPException(500, { throw new HTTPException(500, {
@ -108,7 +109,7 @@ const routes = app
} }
}); });
const port = +(process.env.APP_PORT ?? 3000); const port = appEnv.APP_PORT;
console.log(`Server is running on port ${port}`); console.log(`Server is running on port ${port}`);
serve({ serve({

View File

@ -21,6 +21,7 @@ import { permissionsSchema } from "../../drizzle/schema/permissions";
import { SpecificPermissionCode } from "../../data/permissions"; import { SpecificPermissionCode } from "../../data/permissions";
import authInfo from "../../middlewares/authInfo"; import authInfo from "../../middlewares/authInfo";
import { unauthorized } from "../../errors/DashboardError"; import { unauthorized } from "../../errors/DashboardError";
import appEnv from "../../appEnv";
const authRoutes = new Hono<HonoEnv>() const authRoutes = new Hono<HonoEnv>()
.post( .post(
@ -98,7 +99,7 @@ const authRoutes = new Hono<HonoEnv>()
uid: user[0].users.id, uid: user[0].users.id,
}); });
const cookieSecret = process.env.COOKIE_SECRET; const cookieSecret = appEnv.COOKIE_SECRET;
if (!cookieSecret) if (!cookieSecret)
throw new HTTPException(500, { throw new HTTPException(500, {

View File

@ -1,10 +1,9 @@
import jwt from "jsonwebtoken"; import jwt from "jsonwebtoken";
import appEnv from "../appEnv";
// Environment variables for secrets, defaulting to a random secret if not set. // Environment variables for secrets, defaulting to a random secret if not set.
const accessTokenSecret = const accessTokenSecret = appEnv.ACCESS_TOKEN_SECRET;
process.env.ACCESS_TOKEN_SECRET ?? "some-random-secret"; const refreshTokenSecret = appEnv.REFRESH_TOKEN_SECRET;
const refreshTokenSecret =
process.env.REFRESH_TOKEN_SECRET ?? "some-very-random-secret";
// Algorithm to be used for JWT encoding. // Algorithm to be used for JWT encoding.
const algorithm: jwt.Algorithm = "HS256"; const algorithm: jwt.Algorithm = "HS256";

View File

@ -6,6 +6,9 @@
"strict": true, "strict": true,
"types": ["node"], "types": ["node"],
"jsx": "react-jsx", "jsx": "react-jsx",
"jsxImportSource": "hono/jsx" "jsxImportSource": "hono/jsx",
} "noEmit": true,
"skipLibCheck": true
},
"include": ["src/**/*"]
} }