Added env check on compile time
This commit is contained in:
parent
7c03370f53
commit
f038485cb7
|
|
@ -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/*",
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
20
apps/backend/src/appEnv.ts
Normal file
20
apps/backend/src/appEnv.ts
Normal 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;
|
||||||
|
|
@ -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");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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({
|
||||||
|
|
|
||||||
|
|
@ -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, {
|
||||||
|
|
|
||||||
|
|
@ -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";
|
||||||
|
|
|
||||||
|
|
@ -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/**/*"]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user