From 9fd2fc32ed2763861329e6b574a40cf636c69f77 Mon Sep 17 00:00:00 2001 From: Aris Ripandi Date: Tue, 13 Feb 2024 08:51:24 +0700 Subject: [PATCH] fix: envars configuration --- .env.example | 4 ++-- Dockerfile | 6 ++++-- package.json | 3 ++- pnpm-lock.yaml | 9 ++++++--- src/config.ts | 13 +++++++++++++ src/envar.ts | 0 src/model/client.ts | 17 +++++++++++------ src/server.ts | 13 +++++++++---- static/robots.txt | 2 -- tsconfig.json | 1 + 10 files changed, 48 insertions(+), 20 deletions(-) create mode 100644 src/config.ts delete mode 100644 src/envar.ts delete mode 100644 static/robots.txt diff --git a/.env.example b/.env.example index df18ba6..48de882 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -APP_BASE_URL= +APP_BASE_URL=http://localhost:8030 APP_SECRET_KEY= -LIBSQL_CLIENT_URL=http://localhost:8080 +LIBSQL_CLIENT_URL=libsql://localhost:8080?tls=0 LIBSQL_CLIENT_TOKEN= diff --git a/Dockerfile b/Dockerfile index 052f76f..03e4462 100644 --- a/Dockerfile +++ b/Dockerfile @@ -50,13 +50,15 @@ WORKDIR /srv RUN addgroup --system --gid 1001 nonroot && adduser --system --uid 1001 nonroot RUN corepack enable && corepack prepare pnpm@latest-8 --activate -ARG DATABASE_URL ARG APP_BASE_URL ARG APP_SECRET_KEY +ARG LIBSQL_CLIENT_URL +ARG LIBSQL_CLIENT_TOKEN -ENV DATABASE_URL $DATABASE_URL ENV APP_BASE_URL $APP_BASE_URL ENV APP_SECRET_KEY $APP_SECRET_KEY +ENV LIBSQL_CLIENT_URL $LIBSQL_CLIENT_URL +ENV LIBSQL_CLIENT_TOKEN $LIBSQL_CLIENT_TOKEN # Copy built files, spawns command as a child process. COPY --from=installer --chown=nonroot:nonroot /pnpm /pnpm diff --git a/package.json b/package.json index bf07bec..35d0bc5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "trusty", - "version": "0.0.1", + "version": "0.0.2", "private": true, "type": "module", "config": { @@ -47,6 +47,7 @@ "@libsql/client": "^0.4.3", "@libsql/kysely-libsql": "^0.3.0", "consola": "^3.2.3", + "dotenv": "^16.4.3", "fs-extra": "^11.2.0", "hono": "^4.0.1", "kysely": "^0.27.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3dfa944..a8ad685 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ dependencies: consola: specifier: ^3.2.3 version: 3.2.3 + dotenv: + specifier: ^16.4.3 + version: 16.4.3 fs-extra: specifier: ^11.2.0 version: 11.2.0 @@ -1414,7 +1417,7 @@ packages: hasBin: true dependencies: '@actions/core': 1.10.1 - dotenv: 16.4.2 + dotenv: 16.4.3 front-matter: 4.0.2 nanoid: 4.0.2 oslo: 1.1.0 @@ -1728,8 +1731,8 @@ packages: is-obj: 2.0.0 dev: true - /dotenv@16.4.2: - resolution: {integrity: sha512-rZSSFxke7d9nYQ5NeMIwp5PP+f8wXgKNljpOb7KtH6SKW1cEqcXAz9VSJYVLKe7Jhup/gUYOkaeSVyK8GJ+nBg==} + /dotenv@16.4.3: + resolution: {integrity: sha512-II98GFrje5psQTSve0E7bnwMFybNLqT8Vu8JIFWRjsE3khyNUm/loZupuy5DVzG2IXf/ysxvrixYOQnM6mjD3A==} engines: {node: '>=12'} dev: false diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..d51b6b5 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,13 @@ +const env = process.env; + +const envars = { + NODE_ENV: env.NODE_ENV || "production", + HOSTNAME: env.HOSTNAME || "localhost", + PORT: parseInt(env.PORT as string) || 8030, + APP_BASE_URL: env.APP_BASE_URL as string, + APP_SECRET_KEY: env.APP_SECRET_KEY as string, + LIBSQL_CLIENT_URL: env.LIBSQL_CLIENT_URL as string, + LIBSQL_CLIENT_TOKEN: env.LIBSQL_CLIENT_TOKEN as string, +}; + +export default envars; diff --git a/src/envar.ts b/src/envar.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/model/client.ts b/src/model/client.ts index 049dc37..2e1cb9c 100644 --- a/src/model/client.ts +++ b/src/model/client.ts @@ -5,6 +5,8 @@ import { ColumnType, Kysely } from "kysely"; import { SessionTable } from "@/model/schema/session.schema"; import { PasswordTable, UserTable } from "@/model/schema/user.schema"; +import env from "@/config"; + /** * For Kysely's type-safety and autocompletion to work, it needs to know * your database structure. This requires a TypeScript Database interface, @@ -29,12 +31,15 @@ export interface WithSoftDeleteSchema { deleted_at: ColumnType; } -const url = process.env.LIBSQL_URL || "libsql://localhost:8080?tls=0"; -const authToken = process.env.LIBSQL_TOKEN || ""; - export const db = new Kysely({ - dialect: new LibsqlDialect({ url, authToken }), - log: process.env.NODE_ENV === "development" ? ["error", "query"] : ["error"], + dialect: new LibsqlDialect({ + url: env.LIBSQL_CLIENT_URL, + authToken: env.LIBSQL_CLIENT_TOKEN, + }), + log: env.NODE_ENV === "development" ? ["error", "query"] : ["error"], }); -export const libsqlClient = createClient({ url, authToken }); +export const libsqlClient = createClient({ + url: env.LIBSQL_CLIENT_URL, + authToken: env.LIBSQL_CLIENT_TOKEN, +}); diff --git a/src/server.ts b/src/server.ts index dd3caa2..50aee67 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,3 +1,4 @@ +import "dotenv/config"; import { serve } from "@hono/node-server"; import { consola } from "consola"; import { Hono } from "hono"; @@ -13,8 +14,8 @@ import * as handler from "@/http/handler/root"; import { onErrorResponse, throwResponse } from "@/http/response"; import apiRoutes from "@/routes/api"; -const hostname = process.env.HOSTNAME || "localhost"; -const port = process.env.PORT || 8030; +import env from "@/config"; + const app = new Hono(); // Global middlewares @@ -56,6 +57,10 @@ middleware.use("*", async (c, next) => { app.route("/api", middleware); app.route("/api", apiRoutes); -consola.info(`Server is listening on http://${hostname}:${port}`); +consola.info(`Server is listening on http://${env.HOSTNAME}:${env.PORT}`); -serve({ fetch: app.fetch, hostname, port }); +serve({ + fetch: app.fetch, + hostname: env.HOSTNAME, + port: env.PORT, +}); diff --git a/static/robots.txt b/static/robots.txt deleted file mode 100644 index 6f27bb6..0000000 --- a/static/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 6c99331..72fef31 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,7 @@ "esModuleInterop": true, "moduleResolution": "Node", "resolveJsonModule": true, + "strictNullChecks": true, "module": "ES2020", "target": "ES2020", "allowJs": true,