From 03f865a777726a80accd3b4c6d2e862437ad8e69 Mon Sep 17 00:00:00 2001 From: adsqx <213518341+adsqx@users.noreply.github.com> Date: Thu, 20 Aug 2026 23:00:18 +0200 Subject: [PATCH] fix: default db:generate to PGlite so Postgres is not required Flip --pglite default to true (with --no-pglite escape hatch), await the generate CLI handler, close the in-memory server in finally, and scaffold the init script with --pglite. --- README.md | 2 +- src/cli.ts | 4 ++-- src/generate.ts | 40 ++++++++++++++++++----------------- src/init.ts | 2 +- tests/generate.pglite.test.ts | 23 ++++++++++++++++++++ tests/init.test.ts | 2 +- 6 files changed, 49 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 20e3127..84daecf 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. Migrations run against an in-memory PGlite database, so no Postgres server is required. Pass `--no-pglite` to generate from an already-running Postgres database instead. - `npm run db:create-migration` - Create a new migration file ### Configuration diff --git a/src/cli.ts b/src/cli.ts index 9a9bdec..90d4dbd 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -35,10 +35,10 @@ 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 }) + await generate({ ...(await getProjectContext()), pglite: !!argv.pglite }) }, ) .parse() diff --git a/src/generate.ts b/src/generate.ts index f337094..e74f209 100644 --- a/src/generate.ts +++ b/src/generate.ts @@ -12,7 +12,7 @@ export const generate = async ({ schemas, defaultDatabase, dbDir, - pglite = false, + pglite = true, migrationsDir, }: Pick & { pglite?: boolean @@ -67,25 +67,27 @@ export const generate = async ({ const prevDbUrl = process.env.DATABASE_URL process.env.DATABASE_URL = connectionString - await zg.generate({ - db: { - connectionString, - }, - schemas: Object.fromEntries( - schemas.map((s) => [s, { include: "*", exclude: [] }]), - ), - outDir: dbDir, - }) - - await dumpTree({ - targetDir: path.join(dbDir, "structure"), - defaultDatabase: "postgres", - schemas, - }) + try { + await zg.generate({ + db: { + connectionString, + }, + schemas: Object.fromEntries( + schemas.map((s) => [s, { include: "*", exclude: [] }]), + ), + outDir: dbDir, + }) - server.close() - if (prevDbUrl === undefined) delete process.env.DATABASE_URL - else process.env.DATABASE_URL = prevDbUrl + await dumpTree({ + targetDir: path.join(dbDir, "structure"), + defaultDatabase: "postgres", + schemas, + }) + } finally { + server.close() + if (prevDbUrl === undefined) delete process.env.DATABASE_URL + else process.env.DATABASE_URL = prevDbUrl + } return } diff --git a/src/init.ts b/src/init.ts index b84f9cd..e396f28 100644 --- a/src/init.ts +++ b/src/init.ts @@ -16,7 +16,7 @@ export const initPgstrap = async (ctx: Pick) => { pkg.scripts["db:migrate"] = "pgstrap migrate" pkg.scripts["db:reset"] = "pgstrap reset" - pkg.scripts["db:generate"] = "pgstrap generate" + pkg.scripts["db:generate"] = "pgstrap generate --pglite" pkg.scripts["db:create-migration"] = "pgstrap create-migration" if (!pkg.devDependencies) pkg.devDependencies = {} diff --git a/tests/generate.pglite.test.ts b/tests/generate.pglite.test.ts index 56dcd53..6bc44a2 100644 --- a/tests/generate.pglite.test.ts +++ b/tests/generate.pglite.test.ts @@ -45,3 +45,26 @@ test("generate with pglite runs migrations and dumps structure", async () => { fs.rmSync(tmp, { recursive: true, force: true }) }) + +test("generate defaults to pglite so no postgres server is required", async () => { + const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "pgstrap-generate-")) + const migrationsDir = path.join(tmp, "migrations") + fs.mkdirSync(migrationsDir, { recursive: true }) + fs.writeFileSync( + path.join(migrationsDir, "001_create_table.js"), + migrationFile, + ) + + await generate({ + schemas: ["public"], + defaultDatabase: "postgres", + dbDir: path.join(tmp, "db"), + migrationsDir, + }) + + expect(fs.existsSync(path.join(tmp, "db", "zapatos", "schema.d.ts"))).toBe( + true, + ) + + fs.rmSync(tmp, { recursive: true, force: true }) +}) diff --git a/tests/init.test.ts b/tests/init.test.ts index cd4ec4b..aabc7f7 100644 --- a/tests/init.test.ts +++ b/tests/init.test.ts @@ -25,6 +25,6 @@ test("initPgstrap writes scripts to package.json", async () => { ) expect(pkg.scripts["db:migrate"]).toBe("pgstrap migrate") expect(pkg.scripts["db:reset"]).toBe("pgstrap reset") - expect(pkg.scripts["db:generate"]).toBe("pgstrap generate") + expect(pkg.scripts["db:generate"]).toBe("pgstrap generate --pglite") expect(pkg.scripts["db:create-migration"]).toBe("pgstrap create-migration") })