From 0cbb20790c92bb39e3ec493b3f219386173574b6 Mon Sep 17 00:00:00 2001 From: Kyunghan Bae <74843284+qorud02@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:50:17 +0900 Subject: [PATCH 1/5] Make CLI generation use embedded PGlite by default --- src/cli.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cli.ts b/src/cli.ts index 9a9bdec..68f5baf 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -35,7 +35,7 @@ import { getProjectContext } from "./get-project-context" "generate", "generate types and sql documentation from database", (yargs) => { - yargs.option("pglite", { type: "boolean", default: false }) + yargs.option("pglite", { type: "boolean", default: true }) }, async (argv) => { generate({ ...(await getProjectContext()), pglite: !!argv.pglite }) From bad00e70d73ec0b1cc5dd7398e676296b7079487 Mon Sep 17 00:00:00 2001 From: Kyunghan Bae <74843284+qorud02@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:50:19 +0900 Subject: [PATCH 2/5] Make CLI generation use embedded PGlite by default --- src/get-project-context.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/get-project-context.ts b/src/get-project-context.ts index 8d01d80..35680a8 100644 --- a/src/get-project-context.ts +++ b/src/get-project-context.ts @@ -1,5 +1,6 @@ import fs from "fs" import path from "path" +import { pathToFileURL } from "url" import { PgstrapConfig } from "./define-config" export interface Context extends PgstrapConfig { @@ -13,7 +14,9 @@ export const getProjectContext = async (): Promise => { ) } - const config = await import(path.join(process.cwd(), "pgstrap.config.js")) + const config = await import( + pathToFileURL(path.join(process.cwd(), "pgstrap.config.js")).href + ) return { cwd: process.cwd(), From 8dcaab0b2f43159a8b292b899308f29e36acc4d7 Mon Sep 17 00:00:00 2001 From: Kyunghan Bae <74843284+qorud02@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:50:20 +0900 Subject: [PATCH 3/5] Make CLI generation use embedded PGlite by default --- src/generate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/generate.ts b/src/generate.ts index f337094..3ab932d 100644 --- a/src/generate.ts +++ b/src/generate.ts @@ -60,7 +60,7 @@ export const generate = async ({ }) }) - await new Promise((resolve) => server.listen(0, resolve)) + await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)) const port = (server.address() as any).port const connectionString = `postgres://postgres:postgres@127.0.0.1:${port}/postgres` From 7f52f3a010299587822059e3372604e61c3de924 Mon Sep 17 00:00:00 2001 From: Kyunghan Bae <74843284+qorud02@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:50:22 +0900 Subject: [PATCH 4/5] Make CLI generation use embedded PGlite by default --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 20e3127..4fd9609 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ npm install pgstrap --save-dev - `npm run db:migrate` - Run pending migrations - `npm run db:reset` - Drop and recreate the database, then run all migrations -- `npm run db:generate` - Generate types and structure dumps. Use `pgstrap generate --pglite` to run migrations against an in-memory PGlite instance. +- `npm run db:generate` - Generate types and structure dumps from migrations using an in-memory PGlite instance, without a running PostgreSQL server. Use `pgstrap generate --no-pglite` to generate from your configured PostgreSQL database instead. - `npm run db:create-migration` - Create a new migration file ### Configuration From b7b23def3c2e27891ea9f142534a81defb571d2c Mon Sep 17 00:00:00 2001 From: Kyunghan Bae <74843284+qorud02@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:50:24 +0900 Subject: [PATCH 5/5] Add CLI generation regression test without PostgreSQL --- tests/generate.cli.test.ts | 87 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 tests/generate.cli.test.ts diff --git a/tests/generate.cli.test.ts b/tests/generate.cli.test.ts new file mode 100644 index 0000000..f08de1f --- /dev/null +++ b/tests/generate.cli.test.ts @@ -0,0 +1,87 @@ +import { test, expect } from "bun:test" +import fs from "fs" +import os from "os" +import path from "path" + +test("generate defaults to PGlite without a running PostgreSQL server", async () => { + const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "pgstrap-cli-")) + const dbDir = path.join(tmp, "db") + const migrationsDir = path.join(dbDir, "migrations") + fs.mkdirSync(migrationsDir, { recursive: true }) + fs.writeFileSync( + path.join(tmp, "pgstrap.config.js"), + `module.exports = ${JSON.stringify({ schemas: ["public"], defaultDatabase: "postgres", dbDir })}`, + ) + fs.writeFileSync( + path.join(migrationsDir, "001_create_table.js"), + `exports.up = (pgm) => pgm.createTable("cli_items", { id: "id" })\nexports.down = (pgm) => pgm.dropTable("cli_items")`, + ) + + const child = Bun.spawn( + [ + process.execPath, + "run", + path.join(import.meta.dir, "../src/cli.ts"), + "generate", + ], + { + cwd: tmp, + env: { + ...process.env, + DATABASE_URL: "postgres://postgres:postgres@127.0.0.1:1/postgres", + }, + stdout: "pipe", + stderr: "pipe", + }, + ) + + const timeout = setTimeout(() => child.kill(), 45_000) + try { + const [exitCode, stdout, stderr] = await Promise.all([ + child.exited, + new Response(child.stdout).text(), + new Response(child.stderr).text(), + ]) + expect({ exitCode, stdout, stderr }).toMatchObject({ exitCode: 0 }) + expect(fs.existsSync(path.join(dbDir, "zapatos", "schema.d.ts"))).toBe(true) + expect( + fs.readFileSync(path.join(dbDir, "zapatos", "schema.d.ts"), "utf8"), + ).toContain("cli_items") + expect( + fs.existsSync( + path.join( + dbDir, + "structure", + "public", + "tables", + "cli_items", + "table.sql", + ), + ), + ).toBe(true) + expect( + fs.readFileSync( + path.join( + dbDir, + "structure", + "public", + "tables", + "cli_items", + "table.sql", + ), + "utf8", + ), + ).toContain("cli_items") + } finally { + clearTimeout(timeout) + child.kill() + const resolved = path.resolve(tmp) + if ( + !resolved.startsWith(path.resolve(os.tmpdir()) + path.sep) || + !path.basename(resolved).startsWith("pgstrap-cli-") + ) { + throw new Error("Unexpected temporary directory") + } + fs.rmSync(resolved, { recursive: true, force: true }) + } +}, 60_000)