@valencets/db
Advanced tools
| export { makeMockPool, makeRejectingPool, makeSequentialPool } from './test-helpers.js'; | ||
| //# sourceMappingURL=test-helpers-entry.d.ts.map |
| {"version":3,"file":"test-helpers-entry.d.ts","sourceRoot":"","sources":["../src/test-helpers-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA"} |
| export { makeMockPool, makeRejectingPool, makeSequentialPool } from './test-helpers.js'; | ||
| //# sourceMappingURL=test-helpers-entry.js.map |
| {"version":3,"file":"test-helpers-entry.js","sourceRoot":"","sources":["../src/test-helpers-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA"} |
| import type { Sql } from 'postgres'; | ||
| import { ResultAsync } from 'neverthrow'; | ||
| import type { Result } from 'neverthrow'; | ||
| import { ResultAsync } from '@valencets/resultkit'; | ||
| import type { Result } from '@valencets/resultkit'; | ||
| import type { DbConfig, DbError } from './types.js'; | ||
@@ -5,0 +5,0 @@ export interface DbPool { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAW,WAAW,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAGxC,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEnD,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;CAClB;AAcD,wBAAgB,gBAAgB,CAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAe5E;AAED,wBAAgB,UAAU,CAAE,MAAM,EAAE,QAAQ,GAAG,MAAM,CAkBpD;AAED,wBAAgB,SAAS,CAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAQnE;AAmBD,wBAAgB,gBAAgB,CAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAarD"} | ||
| {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAEnC,OAAO,EAAW,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAGlD,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAa,MAAM,YAAY,CAAA;AAE9D,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;CAClB;AAwBD,wBAAgB,gBAAgB,CAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAe5E;AAED,wBAAgB,UAAU,CAAE,MAAM,EAAE,QAAQ,GAAG,MAAM,CAqBpD;AAED,wBAAgB,SAAS,CAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAQnE;AAmBD,wBAAgB,gBAAgB,CAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAarD"} |
+34
-5
| import postgres from 'postgres'; | ||
| import { ok, err, ResultAsync } from 'neverthrow'; | ||
| import { ok, err, ResultAsync } from '@valencets/resultkit'; | ||
| import { z } from 'zod'; | ||
@@ -10,7 +10,17 @@ import { DbErrorCode } from './types.js'; | ||
| username: z.string().min(1), | ||
| password: z.string(), | ||
| password: z.string().min(1), | ||
| max: z.number().int().min(1).max(100), | ||
| idle_timeout: z.number().min(0).max(3_600_000), | ||
| connect_timeout: z.number().min(0).max(60_000), | ||
| query_timeout: z.number().min(0).max(600_000).optional() | ||
| query_timeout: z.number().min(0).max(600_000).optional(), | ||
| sslmode: z.enum(['disable', 'require', 'verify-ca', 'verify-full']).optional(), | ||
| sslrootcert: z.string().min(1).optional() | ||
| }).superRefine((config, ctx) => { | ||
| if ((config.sslmode === 'verify-ca' || config.sslmode === 'verify-full') && config.sslrootcert === undefined) { | ||
| ctx.addIssue({ | ||
| code: z.ZodIssueCode.custom, | ||
| path: ['sslrootcert'], | ||
| message: `sslrootcert is required when sslmode is ${config.sslmode}` | ||
| }); | ||
| } | ||
| }); | ||
@@ -29,2 +39,3 @@ export function validateDbConfig(config) { | ||
| export function createPool(config) { | ||
| const sslmode = config.sslmode ?? 'disable'; | ||
| const base = { | ||
@@ -41,5 +52,6 @@ host: config.host, | ||
| }; | ||
| const ssl = createSslConfig(sslmode, config.sslrootcert); | ||
| const sql = config.query_timeout !== undefined | ||
| ? postgres({ ...base, connection: { statement_timeout: config.query_timeout } }) | ||
| : postgres(base); | ||
| ? postgres({ ...base, ssl, connection: { statement_timeout: config.query_timeout } }) | ||
| : postgres({ ...base, ssl }); | ||
| return { sql }; | ||
@@ -82,2 +94,19 @@ } | ||
| } | ||
| const VERIFY_CA_CHECK_SERVER_IDENTITY = () => undefined; | ||
| function createSslConfig(sslmode, sslrootcert) { | ||
| const sslConfigByMode = { | ||
| disable: false, | ||
| require: 'require', | ||
| 'verify-ca': { | ||
| ca: sslrootcert ?? '', | ||
| rejectUnauthorized: true, | ||
| checkServerIdentity: VERIFY_CA_CHECK_SERVER_IDENTITY | ||
| }, | ||
| 'verify-full': { | ||
| ca: sslrootcert ?? '', | ||
| rejectUnauthorized: true | ||
| } | ||
| }; | ||
| return sslConfigByMode[sslmode]; | ||
| } | ||
| //# sourceMappingURL=connection.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"} |
+1
-2
| export { DbErrorCode } from './types.js'; | ||
| export type { DbError, DbConfig } from './types.js'; | ||
| export type { DbError, DbConfig, DbSslMode } from './types.js'; | ||
| export { validateDbConfig, createPool, closePool, mapPostgresError } from './connection.js'; | ||
@@ -7,3 +7,2 @@ export type { DbPool } from './connection.js'; | ||
| export type { MigrationFile } from './migration-runner.js'; | ||
| export { makeMockPool, makeErrorPool, makeSequentialPool } from './test-helpers.js'; | ||
| //# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAC3F,YAAY,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACrJ,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAC3F,YAAY,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACrJ,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA"} |
+0
-1
| export { DbErrorCode } from './types.js'; | ||
| export { validateDbConfig, createPool, closePool, mapPostgresError } from './connection.js'; | ||
| export { loadMigrations, runMigrations, getMigrationStatus, parseMigrationFilename, sortMigrations, validateMigrations } from './migration-runner.js'; | ||
| export { makeMockPool, makeErrorPool, makeSequentialPool } from './test-helpers.js'; | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAE3F,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAErJ,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAE3F,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA"} |
@@ -1,3 +0,3 @@ | ||
| import { ResultAsync } from 'neverthrow'; | ||
| import type { Result } from 'neverthrow'; | ||
| import { ResultAsync } from '@valencets/resultkit'; | ||
| import type { Result } from '@valencets/resultkit'; | ||
| import type { DbError } from './types.js'; | ||
@@ -4,0 +4,0 @@ import type { DbPool } from './connection.js'; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"migration-runner.d.ts","sourceRoot":"","sources":["../src/migration-runner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,WAAW,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAID,wBAAgB,sBAAsB,CAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,CAAC,CAW5G;AAED,wBAAgB,cAAc,CAAE,UAAU,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC,aAAa,CAAC,CAEtG;AAED,wBAAgB,kBAAkB,CAAE,UAAU,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,CAc3H;AAED,wBAAgB,cAAc,CAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,CAoCrG;AAoDD,wBAAgB,aAAa,CAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAKnH;AAED,wBAAgB,kBAAkB,CAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,IAAI,CAAA;CAAE,CAAC,EAAE,OAAO,CAAC,CAU5H"} | ||
| {"version":3,"file":"migration-runner.d.ts","sourceRoot":"","sources":["../src/migration-runner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAElD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAID,wBAAgB,sBAAsB,CAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,CAAC,CAW5G;AAED,wBAAgB,cAAc,CAAE,UAAU,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC,aAAa,CAAC,CAEtG;AAED,wBAAgB,kBAAkB,CAAE,UAAU,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,CAc3H;AAED,wBAAgB,cAAc,CAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,CAkDrG;AAqGD,wBAAgB,aAAa,CAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAEnH;AAED,wBAAgB,kBAAkB,CAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,IAAI,CAAA;CAAE,CAAC,EAAE,OAAO,CAAC,CAkB5H"} |
+78
-39
| import { readdir, readFile } from 'node:fs/promises'; | ||
| import { join } from 'node:path'; | ||
| import { ok, err, ResultAsync } from 'neverthrow'; | ||
| import { ok, err, ResultAsync } from '@valencets/resultkit'; | ||
| import { DbErrorCode } from './types.js'; | ||
@@ -34,20 +34,35 @@ import { mapPostgresError } from './connection.js'; | ||
| export function loadMigrations(directory) { | ||
| return ResultAsync.fromPromise(readdir(directory), (e) => ({ | ||
| return ResultAsync.fromPromise(readdir(directory, { withFileTypes: true }), (e) => ({ | ||
| code: DbErrorCode.MIGRATION_FAILED, | ||
| message: e instanceof Error ? e.message : 'Failed to read migrations directory' | ||
| })).andThen((filenames) => { | ||
| const sqlFiles = filenames.filter((f) => f.endsWith('.sql')); | ||
| })).andThen((entries) => { | ||
| const sqlEntries = entries.filter((entry) => entry.name.endsWith('.sql')); | ||
| const parsed = []; | ||
| for (const filename of sqlFiles) { | ||
| for (const entry of sqlEntries) { | ||
| if (!entry.isFile()) { | ||
| return err({ | ||
| code: DbErrorCode.MIGRATION_FAILED, | ||
| message: `Invalid migration entry: ${entry.name}. Migrations must be regular files.` | ||
| }); | ||
| } | ||
| const filename = entry.name; | ||
| const result = parseMigrationFilename(filename); | ||
| if (result.isErr()) { | ||
| return ResultAsync.fromSafePromise(Promise.reject(result.error)).orElse((e) => err(e)); | ||
| return err(result.error); | ||
| } | ||
| const { version, name } = result.value; | ||
| parsed.push({ version, name, sql: '' }); | ||
| parsed.push({ version, name, filename }); | ||
| } | ||
| return ResultAsync.fromPromise(Promise.all(parsed.map(async (m, i) => { | ||
| const content = await readFile(join(directory, sqlFiles[i]), 'utf-8'); | ||
| return { ...m, sql: content }; | ||
| })), (e) => ({ | ||
| return ResultAsync.fromPromise((async () => { | ||
| const migrations = []; | ||
| for (const migration of parsed) { | ||
| const content = await readFile(join(directory, migration.filename), 'utf-8'); | ||
| migrations.push({ | ||
| version: migration.version, | ||
| name: migration.name, | ||
| sql: content | ||
| }); | ||
| } | ||
| return migrations; | ||
| })(), (e) => ({ | ||
| code: DbErrorCode.MIGRATION_FAILED, | ||
@@ -62,15 +77,28 @@ message: e instanceof Error ? e.message : 'Failed to read migration file' | ||
| const MIGRATION_LOCK_ID = 839274628; | ||
| async function runMigrationsWithLock(pool, migrations) { | ||
| await pool.sql.unsafe('SELECT pg_advisory_lock($1)', [MIGRATION_LOCK_ID]); | ||
| const innerResult = await ResultAsync.fromPromise((async () => { | ||
| await pool.sql ` | ||
| CREATE TABLE IF NOT EXISTS _migrations ( | ||
| version INTEGER PRIMARY KEY, | ||
| name TEXT NOT NULL, | ||
| applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW() | ||
| ) | ||
| `; | ||
| const applied = await pool.sql ` | ||
| SELECT version FROM _migrations ORDER BY version | ||
| `; | ||
| function runMigrationsWithLock(pool, migrations) { | ||
| const mergeCleanupErrors = (primary, secondary) => { | ||
| if (!primary) { | ||
| return secondary; | ||
| } | ||
| if (!secondary) { | ||
| return primary; | ||
| } | ||
| return { | ||
| code: primary.code, | ||
| message: `${primary.message}; ${secondary.message}` | ||
| }; | ||
| }; | ||
| const releaseReservedSql = (reservedSql) => ResultAsync.fromPromise(Promise.resolve(reservedSql.release()), mapPostgresError).map(() => null).orElse((releaseError) => ok(releaseError)); | ||
| const unlockAndReleaseReservedSql = (reservedSql) => ResultAsync.fromPromise(reservedSql.unsafe('SELECT pg_advisory_unlock($1)', [MIGRATION_LOCK_ID]), mapPostgresError).map(() => null).orElse((unlockError) => ok(unlockError)).andThen((unlockError) => releaseReservedSql(reservedSql).map((releaseError) => mergeCleanupErrors(unlockError, releaseError))); | ||
| const runMigrationBody = (reservedSql) => ResultAsync.fromPromise((async () => { | ||
| await reservedSql ` | ||
| CREATE TABLE IF NOT EXISTS _migrations ( | ||
| version INTEGER PRIMARY KEY, | ||
| name TEXT NOT NULL, | ||
| applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW() | ||
| ) | ||
| `; | ||
| const applied = await reservedSql ` | ||
| SELECT version FROM _migrations ORDER BY version | ||
| `; | ||
| const appliedVersions = new Set(applied.map((r) => r.version)); | ||
@@ -82,3 +110,3 @@ let count = 0; | ||
| } | ||
| await pool.sql.begin(async (tx) => { | ||
| await reservedSql.begin(async (tx) => { | ||
| await tx.unsafe(migration.sql); | ||
@@ -90,21 +118,32 @@ await tx.unsafe('INSERT INTO _migrations (version, name) VALUES ($1, $2)', [migration.version, migration.name]); | ||
| return count; | ||
| })(), (e) => mapPostgresError(e)); | ||
| // Always release the advisory lock, whether migrations succeeded or not | ||
| await pool.sql.unsafe('SELECT pg_advisory_unlock($1)', [MIGRATION_LOCK_ID]); | ||
| if (innerResult.isErr()) { | ||
| return Promise.reject(innerResult.error); | ||
| } | ||
| return innerResult.value; | ||
| })(), mapPostgresError); | ||
| return ResultAsync.fromPromise(pool.sql.reserve(), mapPostgresError).andThen((reservedSql) => ResultAsync.fromPromise(reservedSql.unsafe('SELECT pg_advisory_lock($1)', [MIGRATION_LOCK_ID]), mapPostgresError).orElse((lockError) => releaseReservedSql(reservedSql).andThen(() => err(lockError))).andThen(() => runMigrationBody(reservedSql) | ||
| .map((count) => ok(count)) | ||
| .orElse((bodyError) => ok(err(bodyError))) | ||
| .andThen((bodyResult) => unlockAndReleaseReservedSql(reservedSql).andThen((cleanupError) => { | ||
| if (bodyResult.isErr()) { | ||
| return err(bodyResult.error); | ||
| } | ||
| if (cleanupError) { | ||
| return err(cleanupError); | ||
| } | ||
| return ok(bodyResult.value); | ||
| })))); | ||
| } | ||
| export function runMigrations(pool, migrations) { | ||
| return ResultAsync.fromPromise(runMigrationsWithLock(pool, migrations), mapPostgresError); | ||
| return runMigrationsWithLock(pool, migrations); | ||
| } | ||
| export function getMigrationStatus(pool) { | ||
| return ResultAsync.fromPromise((async () => { | ||
| const rows = await pool.sql ` | ||
| SELECT version, applied_at FROM _migrations ORDER BY version | ||
| `; | ||
| return rows; | ||
| })(), mapPostgresError); | ||
| return ResultAsync.fromPromise(pool.sql ` | ||
| SELECT version, applied_at FROM _migrations ORDER BY version | ||
| `, (error) => error).orElse((error) => { | ||
| if (typeof error === 'object' && | ||
| error !== null && | ||
| 'code' in error && | ||
| error.code === '42P01') { | ||
| return ok([]); | ||
| } | ||
| return err(mapPostgresError(error)); | ||
| }).map((rows) => rows); | ||
| } | ||
| //# sourceMappingURL=migration-runner.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"migration-runner.js","sourceRoot":"","sources":["../src/migration-runner.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"migration-runner.js","sourceRoot":"","sources":["../src/migration-runner.ts"],"names":[],"mappings":"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"} |
| import type { DbPool } from './connection.js'; | ||
| import type { DbError } from './types.js'; | ||
| type MockRow = Record<string, string | number | boolean | null>; | ||
| type RejectedBoundaryPayload = Error | { | ||
| readonly message: string; | ||
| readonly code?: string; | ||
| }; | ||
| export declare function makeMockPool(rows?: ReadonlyArray<MockRow>): DbPool; | ||
| export declare function makeErrorPool(error: DbError): DbPool; | ||
| export declare function makeRejectingPool(error: RejectedBoundaryPayload): DbPool; | ||
| export declare function makeSequentialPool(returns: ReadonlyArray<ReadonlyArray<MockRow>>): DbPool; | ||
| export {}; | ||
| //# sourceMappingURL=test-helpers.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAA;AAE/D,wBAAgB,YAAY,CAAE,IAAI,GAAE,aAAa,CAAC,OAAO,CAAM,GAAG,MAAM,CAOvE;AAED,wBAAgB,aAAa,CAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAOrD;AAED,wBAAgB,kBAAkB,CAAE,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,CAY1F"} | ||
| {"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAA;AAC/D,KAAK,uBAAuB,GAAG,KAAK,GAAG;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAKD,wBAAgB,YAAY,CAAE,IAAI,GAAE,aAAa,CAAC,OAAO,CAAM,GAAG,MAAM,CAOvE;AAED,wBAAgB,iBAAiB,CAAE,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAOzE;AAED,wBAAgB,kBAAkB,CAAE,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,CAY1F"} |
@@ -0,1 +1,3 @@ | ||
| // Shared DB helpers intentionally cover stateless query-path tests only. | ||
| // Session-affine behaviors such as reserve()/release() should use local inline mocks. | ||
| export function makeMockPool(rows = []) { | ||
@@ -6,5 +8,5 @@ const unsafe = () => Promise.resolve(rows); | ||
| } | ||
| export function makeErrorPool(error) { | ||
| export function makeRejectingPool(error) { | ||
| const unsafe = () => Promise.reject(error); | ||
| const sql = Object.assign(() => Promise.reject(error), { unsafe, begin: () => Promise.reject(error) }); | ||
| const sql = Object.assign(() => Promise.reject(error), { unsafe, begin: () => Promise.reject(error), array: (v) => v }); | ||
| return { sql }; | ||
@@ -19,5 +21,5 @@ } | ||
| }; | ||
| const sql = Object.assign(() => next(), { unsafe: () => next(), begin: () => Promise.resolve() }); | ||
| const sql = Object.assign(() => next(), { unsafe: () => next(), begin: () => Promise.resolve(), array: (v) => v }); | ||
| return { sql }; | ||
| } | ||
| //# sourceMappingURL=test-helpers.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,YAAY,CAAE,OAA+B,EAAE;IAC7D,MAAM,MAAM,GAAG,GAAoC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3E,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CACvB,GAAoC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAC5D,EAAE,MAAM,EAAE,KAAK,EAAE,GAAkB,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAoB,EAAE,EAAE,CAAC,CAAC,EAAE,CAClE,CAAA;IAC7B,OAAO,EAAE,GAAG,EAAE,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAE,KAAc;IAC3C,MAAM,MAAM,GAAG,GAAmB,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CACvB,GAAmB,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAC3C,EAAE,MAAM,EAAE,KAAK,EAAE,GAAmB,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACnC,CAAA;IAC7B,OAAO,EAAE,GAAG,EAAE,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAE,OAA8C;IAChF,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,MAAM,IAAI,GAAG,GAAoC,EAAE;QACjD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;QACpE,OAAO,EAAE,CAAA;QACT,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC,CAAA;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CACvB,GAAoC,EAAE,CAAC,IAAI,EAAE,EAC7C,EAAE,MAAM,EAAE,GAAoC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAkB,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAC7E,CAAA;IAC7B,OAAO,EAAE,GAAG,EAAE,CAAA;AAChB,CAAC"} | ||
| {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAQA,yEAAyE;AACzE,sFAAsF;AAEtF,MAAM,UAAU,YAAY,CAAE,OAA+B,EAAE;IAC7D,MAAM,MAAM,GAAG,GAAoC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3E,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CACvB,GAAoC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAC5D,EAAE,MAAM,EAAE,KAAK,EAAE,GAAkB,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAoB,EAAE,EAAE,CAAC,CAAC,EAAE,CAClE,CAAA;IAC7B,OAAO,EAAE,GAAG,EAAE,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAE,KAA8B;IAC/D,MAAM,MAAM,GAAG,GAAmB,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CACvB,GAAmB,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAC3C,EAAE,MAAM,EAAE,KAAK,EAAE,GAAmB,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAoB,EAAE,EAAE,CAAC,CAAC,EAAE,CACvE,CAAA;IAC7B,OAAO,EAAE,GAAG,EAAE,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAE,OAA8C;IAChF,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,MAAM,IAAI,GAAG,GAAoC,EAAE;QACjD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;QACpE,OAAO,EAAE,CAAA;QACT,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC,CAAA;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CACvB,GAAoC,EAAE,CAAC,IAAI,EAAE,EAC7C,EAAE,MAAM,EAAE,GAAoC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAkB,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAoB,EAAE,EAAE,CAAC,CAAC,EAAE,CACjH,CAAA;IAC7B,OAAO,EAAE,GAAG,EAAE,CAAA;AAChB,CAAC"} |
+3
-0
@@ -18,2 +18,3 @@ export declare const DbErrorCode: { | ||
| } | ||
| export type DbSslMode = 'disable' | 'require' | 'verify-ca' | 'verify-full'; | ||
| export interface DbConfig { | ||
@@ -29,3 +30,5 @@ readonly host: string; | ||
| readonly query_timeout?: number | undefined; | ||
| readonly sslmode?: DbSslMode | undefined; | ||
| readonly sslrootcert?: string | undefined; | ||
| } | ||
| //# sourceMappingURL=types.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW;;;;;;;;;;;CAWd,CAAA;AAEV,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,MAAM,OAAO,WAAW,CAAC,CAAA;AAEtE,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC5C"} | ||
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW;;;;;;;;;;;CAWd,CAAA;AAEV,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,MAAM,OAAO,WAAW,CAAC,CAAA;AAEtE,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,SAAS,GACT,WAAW,GACX,aAAa,CAAA;AAEjB,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC1C"} |
+6
-2
| { | ||
| "name": "@valencets/db", | ||
| "version": "0.1.4", | ||
| "version": "0.2.0", | ||
| "type": "module", | ||
@@ -11,2 +11,6 @@ "main": "dist/index.js", | ||
| "default": "./dist/index.js" | ||
| }, | ||
| "./test": { | ||
| "types": "./dist/test-helpers-entry.d.ts", | ||
| "default": "./dist/test-helpers-entry.js" | ||
| } | ||
@@ -18,3 +22,3 @@ }, | ||
| "dependencies": { | ||
| "neverthrow": "^8.2.0", | ||
| "@valencets/resultkit": "^0.2.0", | ||
| "postgres": "^3.4.8", | ||
@@ -21,0 +25,0 @@ "zod": "^4.3.6" |
+36
-2
| # @valencets/db | ||
| PostgreSQL query layer. Tagged template SQL that is parameterized by default, `Result<T, E>` returns on every operation, and a migration runner for schema changes. Zero dependencies besides neverthrow, postgres, and zod. | ||
| PostgreSQL connection, config validation, and migration runner for Valence. The package validates `DbConfig`, creates `postgres` pools with explicit SSL modes, maps database errors into `DbError`, and applies SQL migrations under an advisory lock. | ||
| 38 tests. [Full documentation on the wiki.](https://github.com/valencets/valence/wiki/Packages:-Db) | ||
| [Full documentation on the wiki.](https://github.com/valencets/valence/wiki/Packages:-Db) | ||
| ## Config | ||
| `DbConfig` includes: | ||
| - host, port, database, username, password | ||
| - pool sizing and timeout settings | ||
| - `sslmode?: 'disable' | 'require' | 'verify-ca' | 'verify-full'` | ||
| - `sslrootcert?: string` | ||
| Verified TLS modes require `sslrootcert`. The package boundary expects certificate contents, not a file path. | ||
| ## Migrations | ||
| `loadMigrations()` reads `NNN-name.sql` files, validates version uniqueness, and sorts them deterministically. | ||
| `runMigrations()`: | ||
| - reserves one database session for the full migration run | ||
| - acquires a session-scoped advisory lock | ||
| - applies each unapplied migration inside its own transaction | ||
| - records applied versions in `_migrations` | ||
| `getMigrationStatus()` returns the applied migration list, and treats a fresh database with no `_migrations` table as zero applied migrations. | ||
| ## Testing | ||
| The package also publishes query-path test helpers at `@valencets/db/test`: | ||
| - `makeMockPool()` for fixed successful query results | ||
| - `makeRejectingPool()` for raw rejected SQL-boundary failures | ||
| - `makeSequentialPool()` for deterministic per-call result sequences | ||
| These shared helpers are intentionally limited to stateless query-path tests. Tests that need session-affine behavior such as `reserve()` and `release()` should use local inline mocks instead of the shared helper surface. | ||
| ## Quick Start | ||
@@ -8,0 +42,0 @@ |
37151
31.12%27
17.39%371
26.62%48
242.86%+ Added
+ Added
- Removed
- Removed
- Removed