diff --git a/bun.lock b/bun.lock index b071e8f..334a2f0 100644 --- a/bun.lock +++ b/bun.lock @@ -120,6 +120,7 @@ "snakecase-keys": "^9.0.2", "tiktoken": "^1.0.22", "uuid": "^13.0.0", + "zod": "^4.1.12", }, "devDependencies": { "@types/pg": "^8.15.6", @@ -151,7 +152,7 @@ "react-dom": "^19.1.1", "tailwind-merge": "^3.3.1", "tw-animate-css": "^1.3.6", - "zod": "^3.25.76", + "zod": "^4.1.12", }, "devDependencies": { "@basango/tsconfig": "workspace:*", @@ -2466,8 +2467,6 @@ "@babel/traverse--for-generate-function-map/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - "@basango/ui/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "@commitlint/format/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "@commitlint/load/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], diff --git a/packages/db/package.json b/packages/db/package.json index b896642..62c55ae 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -8,7 +8,8 @@ "pg": "^8.16.3", "snakecase-keys": "^9.0.2", "tiktoken": "^1.0.22", - "uuid": "^13.0.0" + "uuid": "^13.0.0", + "zod": "^4.1.12" }, "devDependencies": { "@types/pg": "^8.15.6", diff --git a/packages/db/src/client.ts b/packages/db/src/client.ts index 4f0b59f..75a0776 100644 --- a/packages/db/src/client.ts +++ b/packages/db/src/client.ts @@ -1,13 +1,11 @@ -import { createEnvAccessor } from "@devscast/config"; import { drizzle } from "drizzle-orm/node-postgres"; import { Pool } from "pg"; +import { env } from "@/config"; import * as schema from "@/schema"; const isDevelopment = process.env.NODE_ENV === "development"; -const env = createEnvAccessor(["BASANGO_DATABASE_URL"] as const); - const pool = new Pool({ allowExitOnIdle: true, connectionString: env("BASANGO_DATABASE_URL"), diff --git a/packages/db/src/config.ts b/packages/db/src/config.ts new file mode 100644 index 0000000..e4bb166 --- /dev/null +++ b/packages/db/src/config.ts @@ -0,0 +1,20 @@ +import path from "node:path"; + +import { loadConfig } from "@devscast/config"; +import { z } from "zod"; + +const PROJECT_DIR = path.resolve(__dirname, "../../"); + +export const { env, config } = loadConfig({ + env: { + knownKeys: [ + "BASANGO_DATABASE_URL", + "BASANGO_SOURCE_DATABASE_HOST", + "BASANGO_SOURCE_DATABASE_USER", + "BASANGO_SOURCE_DATABASE_PASS", + "BASANGO_SOURCE_DATABASE_NAME", + ] as const, + path: path.join(PROJECT_DIR, ".env"), + }, + schema: z.object({}), +}); diff --git a/packages/db/src/importer/import.ts b/packages/db/src/importer/import.ts index 34be5ef..d7d22ab 100644 --- a/packages/db/src/importer/import.ts +++ b/packages/db/src/importer/import.ts @@ -1,39 +1,9 @@ #!/usr/bin/env bun -import { stdin as input, stdout as output } from "node:process"; -import { createInterface } from "node:readline/promises"; - -import { createEnvAccessor } from "@devscast/config"; +import { env } from "@/config"; import { Engine } from "@/importer"; -const env = createEnvAccessor([ - "BASANGO_SOURCE_DATABASE_HOST", - "BASANGO_SOURCE_DATABASE_USER", - "BASANGO_SOURCE_DATABASE_PASS", - "BASANGO_SOURCE_DATABASE_NAME", - "BASANGO_DATABASE_URL", -]); - -async function askConfirmation(question: string, def = false) { - const rl = createInterface({ input, output }); - const suffix = def ? "[Y/n]" : "[y/N]"; - const answer = await rl.question(`${question} ${suffix} `); - rl.close(); - const v = String(answer || "") - .trim() - .toLowerCase(); - if (v === "y" || v === "yes") return true; - if (v === "n" || v === "no") return false; - return def; -} - async function main() { - const ok = await askConfirmation("Do you want to continue?", false); - if (!ok) { - console.warn("Process aborted"); - process.exit(1); - } - const engine = new Engine( { database: env("BASANGO_SOURCE_DATABASE_NAME"), @@ -54,6 +24,7 @@ async function main() { console.log(`Imported ${count} records into ${t} table.`); } console.log("Import completed successfully"); + process.exit(0); } finally { await engine.close(); } diff --git a/packages/ui/package.json b/packages/ui/package.json index a594233..7ff563f 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -9,7 +9,7 @@ "react-dom": "^19.1.1", "tailwind-merge": "^3.3.1", "tw-animate-css": "^1.3.6", - "zod": "^3.25.76" + "zod": "^4.1.12" }, "devDependencies": { "@basango/tsconfig": "workspace:*",