Socket
Book a DemoSign in
Socket

@valencets/db

Package Overview
Dependencies
Maintainers
1
Versions
6
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@valencets/db - npm Package Compare versions

Comparing version
0.1.4
to
0.2.0
+2
dist/test-helpers-entry.d.ts
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"}
+2
-2
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"}
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":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAG/B,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAE3D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAOxC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACrC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;IAC9C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;IAC9C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;IACxD,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;IAC7B,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa,CAAC,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QAC7G,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,IAAI,EAAE,CAAC,aAAa,CAAC;YACrB,OAAO,EAAE,2CAA2C,MAAM,CAAC,OAAO,EAAE;SACrE,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,UAAU,gBAAgB,CAAE,MAAe;IAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAE/C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC/C,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAC5C,CAAA;IAED,OAAO,GAAG,CAAC;QACT,IAAI,EAAE,WAAW,CAAC,cAAc;QAChC,OAAO,EAAE,4BAA4B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACzD,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAE,MAAgB;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,SAAS,CAAA;IAC3C,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;KACnB,CAAA;IAED,MAAM,GAAG,GAAG,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;IAExD,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,KAAK,SAAS;QAC5C,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC;QACrF,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,CAAA;IAE9B,OAAO,EAAE,GAAG,EAAE,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,SAAS,CAAE,IAAY;IACrC,OAAO,WAAW,CAAC,WAAW,CAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EACd,CAAC,CAAU,EAAW,EAAE,CAAC,CAAC;QACxB,IAAI,EAAE,WAAW,CAAC,iBAAiB;QACnC,OAAO,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB;KACjE,CAAC,CACH,CAAA;AACH,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAsB;IAChD,CAAC,OAAO,EAAE,WAAW,CAAC,oBAAoB,CAAC;IAC3C,CAAC,OAAO,EAAE,WAAW,CAAC,oBAAoB,CAAC;IAC3C,CAAC,OAAO,EAAE,WAAW,CAAC,oBAAoB,CAAC;IAC3C,CAAC,OAAO,EAAE,WAAW,CAAC,oBAAoB,CAAC;IAC3C,CAAC,OAAO,EAAE,WAAW,CAAC,WAAW,CAAC;IAClC,CAAC,OAAO,EAAE,WAAW,CAAC,WAAW,CAAC;IAClC,CAAC,OAAO,EAAE,WAAW,CAAC,iBAAiB,CAAC;IACxC,CAAC,OAAO,EAAE,WAAW,CAAC,iBAAiB,CAAC;IACxC,CAAC,OAAO,EAAE,WAAW,CAAC,iBAAiB,CAAC;IACxC,CAAC,OAAO,EAAE,WAAW,CAAC,iBAAiB,CAAC;IACxC,CAAC,OAAO,EAAE,WAAW,CAAC,aAAa,CAAC;IACpC,CAAC,OAAO,EAAE,WAAW,CAAC,cAAc,CAAC;IACrC,CAAC,OAAO,EAAE,WAAW,CAAC,qBAAqB,CAAC;IAC5C,CAAC,OAAO,EAAE,WAAW,CAAC,YAAY,CAAC;CACpC,CAAC,CAAA;AAEF,MAAM,UAAU,gBAAgB,CAAE,CAAU;IAC1C,IAAI,CAAC,YAAY,KAAK,IAAI,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpE,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC3C,OAAO;YACL,IAAI,EAAE,UAAU,IAAI,WAAW,CAAC,YAAY;YAC5C,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAA;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW,CAAC,YAAY;QAC9B,OAAO,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;KACnE,CAAA;AACH,CAAC;AAED,MAAM,+BAA+B,GAAG,GAAG,EAAE,CAAC,SAAS,CAAA;AAEvD,SAAS,eAAe,CAAE,OAAkB,EAAE,WAAoB;IAKhE,MAAM,eAAe,GAAG;QACtB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE;YACX,EAAE,EAAE,WAAW,IAAI,EAAE;YACrB,kBAAkB,EAAE,IAAa;YACjC,mBAAmB,EAAE,+BAA+B;SACrD;QACD,aAAa,EAAE;YACb,EAAE,EAAE,WAAW,IAAI,EAAE;YACrB,kBAAkB,EAAE,IAAa;SAClC;KAKD,CAAA;IAEF,OAAO,eAAe,CAAC,OAAO,CAAC,CAAA;AACjC,CAAC"}
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"}
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"}
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"}

@@ -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"}
{
"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"

# @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 @@