@o/database 0.16.18 → 0.16.19-canary.1790191946359
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/takeout/better-auth.d.ts +19 -0
- package/dist/takeout/better-auth.d.ts.map +1 -0
- package/dist/takeout/better-auth.js +59 -0
- package/dist/takeout/better-auth.js.map +1 -0
- package/dist/takeout/build.d.ts +2 -0
- package/dist/takeout/build.d.ts.map +1 -0
- package/dist/takeout/build.js +3 -0
- package/dist/takeout/build.js.map +1 -0
- package/dist/takeout/chunkedQuery.d.ts +17 -0
- package/dist/takeout/chunkedQuery.d.ts.map +1 -0
- package/dist/takeout/chunkedQuery.js +55 -0
- package/dist/takeout/chunkedQuery.js.map +1 -0
- package/dist/takeout/cli.d.ts +3 -0
- package/dist/takeout/cli.d.ts.map +1 -0
- package/dist/takeout/cli.js +114 -0
- package/dist/takeout/cli.js.map +1 -0
- package/dist/takeout/createDatabase.d.ts +49 -0
- package/dist/takeout/createDatabase.d.ts.map +1 -0
- package/dist/takeout/createDatabase.js +100 -0
- package/dist/takeout/createDatabase.js.map +1 -0
- package/dist/takeout/createDb.d.ts +3 -0
- package/dist/takeout/createDb.d.ts.map +1 -0
- package/dist/takeout/createDb.js +11 -0
- package/dist/takeout/createDb.js.map +1 -0
- package/dist/takeout/createDrizzle.d.ts +38 -0
- package/dist/takeout/createDrizzle.d.ts.map +1 -0
- package/dist/takeout/createDrizzle.js +60 -0
- package/dist/takeout/createDrizzle.js.map +1 -0
- package/dist/takeout/createPool.d.ts +11 -0
- package/dist/takeout/createPool.d.ts.map +1 -0
- package/dist/takeout/createPool.js +36 -0
- package/dist/takeout/createPool.js.map +1 -0
- package/dist/takeout/createServerHelpers.d.ts +9 -0
- package/dist/takeout/createServerHelpers.d.ts.map +1 -0
- package/dist/takeout/createServerHelpers.js +11 -0
- package/dist/takeout/createServerHelpers.js.map +1 -0
- package/dist/takeout/getDBClient.d.ts +11 -0
- package/dist/takeout/getDBClient.d.ts.map +1 -0
- package/dist/takeout/getDBClient.js +169 -0
- package/dist/takeout/getDBClient.js.map +1 -0
- package/dist/takeout/index.d.ts +13 -0
- package/dist/takeout/index.d.ts.map +1 -0
- package/dist/takeout/index.js +13 -0
- package/dist/takeout/index.js.map +1 -0
- package/dist/takeout/migrate.d.ts +33 -0
- package/dist/takeout/migrate.d.ts.map +1 -0
- package/dist/takeout/migrate.js +214 -0
- package/dist/takeout/migrate.js.map +1 -0
- package/dist/takeout/scripts/build-migrations.d.ts +8 -0
- package/dist/takeout/scripts/build-migrations.d.ts.map +1 -0
- package/dist/takeout/scripts/build-migrations.js +51 -0
- package/dist/takeout/scripts/build-migrations.js.map +1 -0
- package/dist/takeout/scripts/drizzle-migrations-sync.d.ts +17 -0
- package/dist/takeout/scripts/drizzle-migrations-sync.d.ts.map +1 -0
- package/dist/takeout/scripts/drizzle-migrations-sync.js +69 -0
- package/dist/takeout/scripts/drizzle-migrations-sync.js.map +1 -0
- package/dist/takeout/scripts/dump-database.d.ts +22 -0
- package/dist/takeout/scripts/dump-database.d.ts.map +1 -0
- package/dist/takeout/scripts/dump-database.js +64 -0
- package/dist/takeout/scripts/dump-database.js.map +1 -0
- package/dist/takeout/scripts/migration-add.d.ts +6 -0
- package/dist/takeout/scripts/migration-add.d.ts.map +1 -0
- package/dist/takeout/scripts/migration-add.js +39 -0
- package/dist/takeout/scripts/migration-add.js.map +1 -0
- package/dist/takeout/scripts/pg_dump.d.ts +11 -0
- package/dist/takeout/scripts/pg_dump.d.ts.map +1 -0
- package/dist/takeout/scripts/pg_dump.js +37 -0
- package/dist/takeout/scripts/pg_dump.js.map +1 -0
- package/dist/takeout/scripts/prune-backups.d.ts +8 -0
- package/dist/takeout/scripts/prune-backups.d.ts.map +1 -0
- package/dist/takeout/scripts/prune-backups.js +166 -0
- package/dist/takeout/scripts/prune-backups.js.map +1 -0
- package/dist/takeout/scripts/psql.d.ts +11 -0
- package/dist/takeout/scripts/psql.d.ts.map +1 -0
- package/dist/takeout/scripts/psql.js +41 -0
- package/dist/takeout/scripts/psql.js.map +1 -0
- package/dist/takeout/seed.d.ts +10 -0
- package/dist/takeout/seed.d.ts.map +1 -0
- package/dist/takeout/seed.js +22 -0
- package/dist/takeout/seed.js.map +1 -0
- package/dist/takeout/sql.d.ts +9 -0
- package/dist/takeout/sql.d.ts.map +1 -0
- package/dist/takeout/sql.js +24 -0
- package/dist/takeout/sql.js.map +1 -0
- package/dist/takeout/sqlite.d.ts +66 -0
- package/dist/takeout/sqlite.d.ts.map +1 -0
- package/dist/takeout/sqlite.js +110 -0
- package/dist/takeout/sqlite.js.map +1 -0
- package/dist/takeout/waitForDatabase.d.ts +2 -0
- package/dist/takeout/waitForDatabase.d.ts.map +1 -0
- package/dist/takeout/waitForDatabase.js +26 -0
- package/dist/takeout/waitForDatabase.js.map +1 -0
- package/dist/takeout/zero.d.ts +44 -0
- package/dist/takeout/zero.d.ts.map +1 -0
- package/dist/takeout/zero.js +177 -0
- package/dist/takeout/zero.js.map +1 -0
- package/package.json +54 -4
- package/src/takeout/better-auth.ts +110 -0
- package/src/takeout/build.ts +2 -0
- package/src/takeout/chunkedQuery.ts +91 -0
- package/src/takeout/cli.ts +126 -0
- package/src/takeout/createDatabase.ts +164 -0
- package/src/takeout/createDb.ts +15 -0
- package/src/takeout/createDrizzle.ts +127 -0
- package/src/takeout/createPool.ts +58 -0
- package/src/takeout/createServerHelpers.ts +21 -0
- package/src/takeout/getDBClient.ts +254 -0
- package/src/takeout/index.ts +38 -0
- package/src/takeout/migrate.ts +272 -0
- package/src/takeout/scripts/build-migrations.ts +66 -0
- package/src/takeout/scripts/drizzle-migrations-sync.ts +81 -0
- package/src/takeout/scripts/dump-database.ts +103 -0
- package/src/takeout/scripts/migration-add.ts +54 -0
- package/src/takeout/scripts/pg_dump.ts +46 -0
- package/src/takeout/scripts/prune-backups.ts +211 -0
- package/src/takeout/scripts/psql.ts +51 -0
- package/src/takeout/seed.ts +45 -0
- package/src/takeout/sql.ts +39 -0
- package/src/takeout/sqlite.ts +237 -0
- package/src/takeout/waitForDatabase.ts +27 -0
- package/src/takeout/zero.ts +281 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Pool } from 'pg';
|
|
2
|
+
export type CreatePoolOptions = {
|
|
3
|
+
connectionString: string;
|
|
4
|
+
max?: number;
|
|
5
|
+
idleTimeoutMillis?: number;
|
|
6
|
+
connectionTimeoutMillis?: number;
|
|
7
|
+
keepAlive?: boolean;
|
|
8
|
+
keepAliveInitialDelayMillis?: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function createPool(options: CreatePoolOptions): Pool;
|
|
11
|
+
//# sourceMappingURL=createPool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPool.d.ts","sourceRoot":"","sources":["../../src/takeout/createPool.ts"],"names":[],"mappings":"AAAA,OAAW,EAAE,KAAK,IAAI,EAAE,MAAM,IAAI,CAAA;AAElC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gBAAgB,EAAE,MAAM,CAAA;IACxB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,2BAA2B,CAAC,EAAE,MAAM,CAAA;CACrC,CAAA;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CA8C3D"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import pg from 'pg';
|
|
2
|
+
export function createPool(options) {
|
|
3
|
+
const { connectionString, max = 20, idleTimeoutMillis = 30_000, connectionTimeoutMillis = 5_000, keepAlive = true, keepAliveInitialDelayMillis = 10_000, } = options;
|
|
4
|
+
const ssl = connectionString.includes('sslmode=require')
|
|
5
|
+
? { rejectUnauthorized: false }
|
|
6
|
+
: undefined;
|
|
7
|
+
const pool = new pg.Pool({
|
|
8
|
+
connectionString,
|
|
9
|
+
max,
|
|
10
|
+
idleTimeoutMillis,
|
|
11
|
+
connectionTimeoutMillis,
|
|
12
|
+
keepAlive,
|
|
13
|
+
keepAliveInitialDelayMillis,
|
|
14
|
+
ssl,
|
|
15
|
+
});
|
|
16
|
+
pool.on('error', (error) => {
|
|
17
|
+
console.error(`[database] pool error`, error.message, error.stack);
|
|
18
|
+
});
|
|
19
|
+
pool.on('connect', (client) => {
|
|
20
|
+
client.on('error', (error) => {
|
|
21
|
+
console.error(`[database] client error`, error.message, error.stack);
|
|
22
|
+
});
|
|
23
|
+
// pg-protocol's parser can throw synchronously inside the stream 'data' handler
|
|
24
|
+
// (e.g. RangeError when reading corrupted/stale buffer data from a zombie connection).
|
|
25
|
+
// wrapping the stream with its own error handler catches them at the source.
|
|
26
|
+
const stream = client.connection?.stream;
|
|
27
|
+
if (stream && !stream.__pgErrorPatched) {
|
|
28
|
+
stream.__pgErrorPatched = true;
|
|
29
|
+
stream.on('error', (error) => {
|
|
30
|
+
console.error(`[database] stream error`, error.message, error.stack);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return pool;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=createPool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPool.js","sourceRoot":"","sources":["../../src/takeout/createPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,IAAI,CAAA;AAWlC,MAAM,UAAU,UAAU,CAAC,OAA0B;IACnD,MAAM,EACJ,gBAAgB,EAChB,GAAG,GAAG,EAAE,EACR,iBAAiB,GAAG,MAAM,EAC1B,uBAAuB,GAAG,KAAK,EAC/B,SAAS,GAAG,IAAI,EAChB,2BAA2B,GAAG,MAAM,GACrC,GAAG,OAAO,CAAA;IAEX,MAAM,GAAG,GAAG,gBAAgB,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACtD,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE;QAC/B,CAAC,CAAC,SAAS,CAAA;IAEb,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC;QACvB,gBAAgB;QAChB,GAAG;QACH,iBAAiB;QACjB,uBAAuB;QACvB,SAAS;QACT,2BAA2B;QAC3B,GAAG;KACJ,CAAC,CAAA;IAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACzB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IACpE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;QAC5B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;QACtE,CAAC,CAAC,CAAA;QAEF,gFAAgF;QAChF,uFAAuF;QACvF,6EAA6E;QAC7E,MAAM,MAAM,GAAI,MAAc,CAAC,UAAU,EAAE,MAAM,CAAA;QACjD,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACvC,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAA;YAC9B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;gBAClC,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;YACtE,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { getDBClient, type GetDBClientOptions } from './getDBClient.js';
|
|
2
|
+
import { createSql } from './sql.js';
|
|
3
|
+
import type { Pool } from 'pg';
|
|
4
|
+
export type ServerHelpers = {
|
|
5
|
+
sql: ReturnType<typeof createSql>;
|
|
6
|
+
getDBClient: (options?: Omit<GetDBClientOptions, 'pool' | 'connectionString'>) => ReturnType<typeof getDBClient>;
|
|
7
|
+
};
|
|
8
|
+
export declare function createServerHelpers(pool: Pool): ServerHelpers;
|
|
9
|
+
//# sourceMappingURL=createServerHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createServerHelpers.d.ts","sourceRoot":"","sources":["../../src/takeout/createServerHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAAE,SAAS,EAAkB,MAAM,UAAU,CAAA;AAEpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAE9B,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,CAAA;IACjC,WAAW,EAAE,CACX,OAAO,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,kBAAkB,CAAC,KAC5D,UAAU,CAAC,OAAO,WAAW,CAAC,CAAA;CACpC,CAAA;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,aAAa,CAQ7D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { getDBClient } from './getDBClient.js';
|
|
2
|
+
import { createSql, setDefaultPool } from './sql.js';
|
|
3
|
+
export function createServerHelpers(pool) {
|
|
4
|
+
const sql = createSql(pool);
|
|
5
|
+
setDefaultPool(pool);
|
|
6
|
+
return {
|
|
7
|
+
sql,
|
|
8
|
+
getDBClient: (options = {}) => getDBClient({ pool, ...options }),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=createServerHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createServerHelpers.js","sourceRoot":"","sources":["../../src/takeout/createServerHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA2B,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAWpD,MAAM,UAAU,mBAAmB,CAAC,IAAU;IAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC3B,cAAc,CAAC,IAAI,CAAC,CAAA;IAEpB,OAAO;QACL,GAAG;QACH,WAAW,EAAE,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;KACjE,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import pg, { type Pool, type PoolClient } from 'pg';
|
|
2
|
+
export type GetDBClientOptions = {
|
|
3
|
+
pool?: Pool;
|
|
4
|
+
connectionString?: string;
|
|
5
|
+
retries?: number;
|
|
6
|
+
onRetry?: (error: Error, attempt: number) => void;
|
|
7
|
+
};
|
|
8
|
+
export declare function getDBClient(options?: GetDBClientOptions): Promise<PoolClient>;
|
|
9
|
+
export declare function queryDb(queryText: string, params?: any[], options?: GetDBClientOptions): Promise<pg.QueryResult>;
|
|
10
|
+
export declare function getNewClient(options?: GetDBClientOptions): Promise<pg.Client>;
|
|
11
|
+
//# sourceMappingURL=getDBClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getDBClient.d.ts","sourceRoot":"","sources":["../../src/takeout/getDBClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,KAAK,UAAU,EAAE,MAAM,IAAI,CAAA;AAKnD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAClD,CAAA;AA+BD,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBvF;AA4CD,wBAAsB,OAAO,CAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,GAAG,EAAE,EACd,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAqCzB;AAuED,wBAAsB,YAAY,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAcvF"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import pg from 'pg';
|
|
2
|
+
const cache = new Map();
|
|
3
|
+
const createPoolKey = (connectionString) => connectionString;
|
|
4
|
+
const getOrCreatePoolCache = (connectionString, config) => {
|
|
5
|
+
const key = createPoolKey(connectionString);
|
|
6
|
+
if (!cache.has(key)) {
|
|
7
|
+
cache.set(key, {
|
|
8
|
+
pool: new pg.Pool(config),
|
|
9
|
+
maxConnections: null,
|
|
10
|
+
reservedConnections: null,
|
|
11
|
+
openedConnections: null,
|
|
12
|
+
openedConnectionsLastUpdate: null,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
return cache.get(key);
|
|
16
|
+
};
|
|
17
|
+
export async function getDBClient(options = {}) {
|
|
18
|
+
const { pool, connectionString, retries = 8 } = options;
|
|
19
|
+
if (!pool && !connectionString) {
|
|
20
|
+
throw new Error('Either pool or connectionString must be provided');
|
|
21
|
+
}
|
|
22
|
+
let client = null;
|
|
23
|
+
try {
|
|
24
|
+
client = await tryToGetNewClientFromPool(pool, connectionString, retries);
|
|
25
|
+
return client;
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
console.error(`Failed to get DB client:`, error);
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function tryToGetNewClientFromPool(providedPool, connectionString, retries) {
|
|
33
|
+
const { default: retry } = await import('async-retry');
|
|
34
|
+
const clientFromPool = await retry(async () => {
|
|
35
|
+
if (providedPool) {
|
|
36
|
+
const client = await providedPool.connect();
|
|
37
|
+
return client;
|
|
38
|
+
}
|
|
39
|
+
if (!connectionString) {
|
|
40
|
+
throw new Error('No connection string provided');
|
|
41
|
+
}
|
|
42
|
+
const configurations = {
|
|
43
|
+
connectionString,
|
|
44
|
+
connectionTimeoutMillis: 5_000,
|
|
45
|
+
// idle_session_timeout set to 35s on server, client timeout at 30s
|
|
46
|
+
// fix via https://github.com/brianc/node-postgres/issues/2718#issuecomment-2094885323
|
|
47
|
+
idleTimeoutMillis: 30_000,
|
|
48
|
+
allowExitOnIdle: true,
|
|
49
|
+
};
|
|
50
|
+
const poolCache = getOrCreatePoolCache(connectionString, configurations);
|
|
51
|
+
const client = await poolCache.pool.connect();
|
|
52
|
+
return client;
|
|
53
|
+
}, {
|
|
54
|
+
retries,
|
|
55
|
+
minTimeout: 300,
|
|
56
|
+
factor: 2,
|
|
57
|
+
maxTimeout: 8000,
|
|
58
|
+
});
|
|
59
|
+
return clientFromPool;
|
|
60
|
+
}
|
|
61
|
+
export async function queryDb(queryText, params, options = {}) {
|
|
62
|
+
let client = null;
|
|
63
|
+
try {
|
|
64
|
+
client = await tryToGetNewClientFromPool(options.pool, options.connectionString, options.retries || 8);
|
|
65
|
+
return await client.query(queryText, params);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error(`Database query failed:`, {
|
|
69
|
+
query: queryText,
|
|
70
|
+
error: error instanceof Error ? error.message : String(error),
|
|
71
|
+
});
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
if (client && options.connectionString) {
|
|
76
|
+
const tooManyConnections = await checkForTooManyConnections(client, options.connectionString);
|
|
77
|
+
if (tooManyConnections) {
|
|
78
|
+
const poolCache = cache.get(createPoolKey(options.connectionString));
|
|
79
|
+
client.release();
|
|
80
|
+
await poolCache?.pool.end();
|
|
81
|
+
if (poolCache) {
|
|
82
|
+
cache.delete(createPoolKey(options.connectionString));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
client.release();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else if (client) {
|
|
90
|
+
client.release();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function checkForTooManyConnections(client, connectionString) {
|
|
95
|
+
const poolCache = cache.get(createPoolKey(connectionString));
|
|
96
|
+
if (!poolCache)
|
|
97
|
+
return false;
|
|
98
|
+
const currentTime = Date.now();
|
|
99
|
+
const openedConnectionsMaxAge = 10000;
|
|
100
|
+
const maxConnectionsTolerance = 0.9;
|
|
101
|
+
if (poolCache.maxConnections === null || poolCache.reservedConnections === null) {
|
|
102
|
+
const [maxConnections, reservedConnections] = await getConnectionLimits(client);
|
|
103
|
+
poolCache.maxConnections = maxConnections;
|
|
104
|
+
poolCache.reservedConnections = reservedConnections;
|
|
105
|
+
}
|
|
106
|
+
if (poolCache.openedConnections === null ||
|
|
107
|
+
poolCache.openedConnectionsLastUpdate === null ||
|
|
108
|
+
currentTime - poolCache.openedConnectionsLastUpdate > openedConnectionsMaxAge) {
|
|
109
|
+
const openedConnections = await getOpenedConnections(client, connectionString);
|
|
110
|
+
poolCache.openedConnections = openedConnections;
|
|
111
|
+
poolCache.openedConnectionsLastUpdate = currentTime;
|
|
112
|
+
}
|
|
113
|
+
if (poolCache.openedConnections >
|
|
114
|
+
(poolCache.maxConnections - poolCache.reservedConnections) * maxConnectionsTolerance) {
|
|
115
|
+
console.warn(`Too many connections detected: ${poolCache.openedConnections}/${poolCache.maxConnections - poolCache.reservedConnections}`);
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
async function getConnectionLimits(client) {
|
|
121
|
+
const maxConnectionsResult = await client.query('SHOW max_connections');
|
|
122
|
+
const reservedConnectionResult = await client.query('SHOW superuser_reserved_connections');
|
|
123
|
+
return [
|
|
124
|
+
Number.parseInt(maxConnectionsResult.rows[0].max_connections, 10),
|
|
125
|
+
Number.parseInt(reservedConnectionResult.rows[0].superuser_reserved_connections, 10),
|
|
126
|
+
];
|
|
127
|
+
}
|
|
128
|
+
async function getOpenedConnections(client, connectionString) {
|
|
129
|
+
// For Aurora/RDS, we need to get the database name from connection string
|
|
130
|
+
const dbName = new URL(connectionString).pathname.slice(1);
|
|
131
|
+
const openConnectionsResult = await client.query('SELECT numbackends as opened_connections FROM pg_stat_database WHERE datname = $1', [dbName]);
|
|
132
|
+
const result = Number.parseInt(openConnectionsResult.rows[0]?.opened_connections || 0, 10);
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
export async function getNewClient(options = {}) {
|
|
136
|
+
const { connectionString } = options;
|
|
137
|
+
if (!connectionString) {
|
|
138
|
+
throw new Error('connectionString is required for getNewClient');
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
const client = await tryToGetNewClient(connectionString);
|
|
142
|
+
return client;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.error(`Failed to get new client:`, error);
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async function tryToGetNewClient(connectionString) {
|
|
150
|
+
const configurations = {
|
|
151
|
+
connectionString,
|
|
152
|
+
connectionTimeoutMillis: 5_000,
|
|
153
|
+
idleTimeoutMillis: 30_000,
|
|
154
|
+
allowExitOnIdle: true,
|
|
155
|
+
};
|
|
156
|
+
const { default: retry } = await import('async-retry');
|
|
157
|
+
const client = await retry(async () => {
|
|
158
|
+
const newClient = new pg.Client(configurations);
|
|
159
|
+
await newClient.connect();
|
|
160
|
+
return newClient;
|
|
161
|
+
}, {
|
|
162
|
+
retries: 10,
|
|
163
|
+
minTimeout: 100,
|
|
164
|
+
factor: 2,
|
|
165
|
+
maxTimeout: 5000,
|
|
166
|
+
});
|
|
167
|
+
return client;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=getDBClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getDBClient.js","sourceRoot":"","sources":["../../src/takeout/getDBClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { createDatabase, type DatabaseConfig, type MigrateOptions, } from './createDatabase.js';
|
|
2
|
+
export { createPool, type CreatePoolOptions } from './createPool.js';
|
|
3
|
+
export { createDrizzle, type CreateDrizzleOptions, type DrizzleHelpers, } from './createDrizzle.js';
|
|
4
|
+
export { createSql, type SqlQuery } from './sql.js';
|
|
5
|
+
export { createServerHelpers, type ServerHelpers } from './createServerHelpers.js';
|
|
6
|
+
export { getDBClient, queryDb, type GetDBClientOptions } from './getDBClient.js';
|
|
7
|
+
export { processInChunks, updateInChunks } from './chunkedQuery.js';
|
|
8
|
+
export { createDb } from './createDb.js';
|
|
9
|
+
export { migrate, loadMigrationsFromDir, type Migration } from './migrate.js';
|
|
10
|
+
export { waitForDatabase } from './waitForDatabase.js';
|
|
11
|
+
export { buildInitSql, defineSeed, defineTrigger, derivePublicTables, ensureZeroDatabases, ensureZeroPublication, ensureZeroSeeds, ensureZeroTriggers, isPrivateTable, loadSeeds, loadTriggers, privateTable, type InitSqlOptions, type SeedDefinition, type TriggerDefinition, type ZeroDatabaseOptions, type ZeroPublicationOptions, } from './zero.js';
|
|
12
|
+
export { applySeed, type SeedClient, type SeedData, type SeedRows } from './seed.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/takeout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACpE,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAClF,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAChF,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EACL,YAAY,EACZ,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { createDatabase, } from './createDatabase.js';
|
|
2
|
+
export { createPool } from './createPool.js';
|
|
3
|
+
export { createDrizzle, } from './createDrizzle.js';
|
|
4
|
+
export { createSql } from './sql.js';
|
|
5
|
+
export { createServerHelpers } from './createServerHelpers.js';
|
|
6
|
+
export { getDBClient, queryDb } from './getDBClient.js';
|
|
7
|
+
export { processInChunks, updateInChunks } from './chunkedQuery.js';
|
|
8
|
+
export { createDb } from './createDb.js';
|
|
9
|
+
export { migrate, loadMigrationsFromDir } from './migrate.js';
|
|
10
|
+
export { waitForDatabase } from './waitForDatabase.js';
|
|
11
|
+
export { buildInitSql, defineSeed, defineTrigger, derivePublicTables, ensureZeroDatabases, ensureZeroPublication, ensureZeroSeeds, ensureZeroTriggers, isPrivateTable, loadSeeds, loadTriggers, privateTable, } from './zero.js';
|
|
12
|
+
export { applySeed } from './seed.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/takeout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAGf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,UAAU,EAA0B,MAAM,iBAAiB,CAAA;AACpE,OAAO,EACL,aAAa,GAGd,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAiB,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAsB,MAAM,0BAA0B,CAAA;AAClF,OAAO,EAAE,WAAW,EAAE,OAAO,EAA2B,MAAM,kBAAkB,CAAA;AAChF,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAkB,MAAM,cAAc,CAAA;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EACL,YAAY,EACZ,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,GAMb,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,SAAS,EAAiD,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom migration script - why?
|
|
3
|
+
* Well migration scripts aren't so complex, and we haven't found a simple enough library
|
|
4
|
+
* to deserve a new dependency. We like this setup because we can customize it easily
|
|
5
|
+
* and it's pretty easy to understand.
|
|
6
|
+
*
|
|
7
|
+
* This migration system handles both custom TypeScript migrations and
|
|
8
|
+
* SQL migrations generated by Drizzle.
|
|
9
|
+
*/
|
|
10
|
+
import type { PoolClient } from 'pg';
|
|
11
|
+
export type Migration = {
|
|
12
|
+
name: string;
|
|
13
|
+
up?: (client: PoolClient) => Promise<void>;
|
|
14
|
+
/** per-migration timeout in ms, overrides defaultTimeout */
|
|
15
|
+
timeout?: number;
|
|
16
|
+
};
|
|
17
|
+
export type MigrateOptions = {
|
|
18
|
+
connectionString: string;
|
|
19
|
+
migrations: Record<string, () => Promise<unknown>>;
|
|
20
|
+
createDatabases?: string[];
|
|
21
|
+
onMigrationComplete?: () => Promise<void>;
|
|
22
|
+
gitSha?: string;
|
|
23
|
+
cvrDb?: string;
|
|
24
|
+
changeDb?: string;
|
|
25
|
+
/** call process.exit(0) after migrations complete (default: false) */
|
|
26
|
+
forceExit?: boolean;
|
|
27
|
+
/** default timeout for all migrations in ms (default: 5000) */
|
|
28
|
+
defaultTimeout?: number;
|
|
29
|
+
};
|
|
30
|
+
export declare function migrate(options: MigrateOptions): Promise<void>;
|
|
31
|
+
/** load migration files from a directory (for non-vite contexts like bun scripts) */
|
|
32
|
+
export declare function loadMigrationsFromDir(dir: string): Record<string, () => Promise<unknown>>;
|
|
33
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/takeout/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAEpC,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAKD,MAAM,MAAM,cAAc,GAAG;IAC3B,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IAClD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAgBD,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,iBAwKpD;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,GACV,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CA0CxC"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom migration script - why?
|
|
3
|
+
* Well migration scripts aren't so complex, and we haven't found a simple enough library
|
|
4
|
+
* to deserve a new dependency. We like this setup because we can customize it easily
|
|
5
|
+
* and it's pretty easy to understand.
|
|
6
|
+
*
|
|
7
|
+
* This migration system handles both custom TypeScript migrations and
|
|
8
|
+
* SQL migrations generated by Drizzle.
|
|
9
|
+
*/
|
|
10
|
+
import { readdirSync, readFileSync } from 'node:fs';
|
|
11
|
+
import { basename, resolve } from 'node:path';
|
|
12
|
+
import { getDBClient } from './getDBClient.js';
|
|
13
|
+
import { ensureZeroDatabases } from './zero.js';
|
|
14
|
+
/** default timeout for migrations (5 seconds) */
|
|
15
|
+
const DEFAULT_MIGRATION_TIMEOUT = 5_000;
|
|
16
|
+
async function withTimeout(promise, ms, name) {
|
|
17
|
+
let timeoutId;
|
|
18
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
19
|
+
timeoutId = setTimeout(() => {
|
|
20
|
+
reject(new Error(`migration "${name}" timed out after ${ms}ms`));
|
|
21
|
+
}, ms);
|
|
22
|
+
});
|
|
23
|
+
try {
|
|
24
|
+
return await Promise.race([promise, timeoutPromise]);
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
clearTimeout(timeoutId);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function migrate(options) {
|
|
31
|
+
const { connectionString, migrations, createDatabases = [], onMigrationComplete, forceExit = false, gitSha, cvrDb, changeDb, defaultTimeout = DEFAULT_MIGRATION_TIMEOUT, } = options;
|
|
32
|
+
// create zero + additional databases before running migrations
|
|
33
|
+
await ensureZeroDatabases({ connectionString, cvrDb, changeDb });
|
|
34
|
+
for (const dbUrl of createDatabases) {
|
|
35
|
+
await ensureZeroDatabases({ connectionString, cvrDb: dbUrl });
|
|
36
|
+
}
|
|
37
|
+
const client = await getDBClient({ connectionString });
|
|
38
|
+
try {
|
|
39
|
+
await client.query('BEGIN');
|
|
40
|
+
// force public schema - if a schema matching the db user exists (e.g. startchat),
|
|
41
|
+
// postgres resolves unqualified names there first, causing tables to land in the
|
|
42
|
+
// wrong schema. setting search_path ensures all CREATE TABLE etc go to public.
|
|
43
|
+
await client.query(`SET search_path = public`);
|
|
44
|
+
await client.query(`
|
|
45
|
+
CREATE TABLE IF NOT EXISTS public.migrations (
|
|
46
|
+
id SERIAL PRIMARY KEY,
|
|
47
|
+
name VARCHAR(255) NOT NULL,
|
|
48
|
+
run_on TIMESTAMP NOT NULL DEFAULT NOW()
|
|
49
|
+
)
|
|
50
|
+
`);
|
|
51
|
+
const appliedMigrations = await client.query('SELECT name FROM public.migrations');
|
|
52
|
+
const appliedMigrationNames = new Set(appliedMigrations.rows.map((row) => row.name));
|
|
53
|
+
// get TypeScript migrations
|
|
54
|
+
const tsMigrationsSorted = Object.entries(migrations)
|
|
55
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
56
|
+
.map(([file, run]) => ({
|
|
57
|
+
name: basename(file).replace(/\.(ts|sql)$/, ''),
|
|
58
|
+
run,
|
|
59
|
+
}))
|
|
60
|
+
.filter(({ name }) => /^[\d]+/.test(name));
|
|
61
|
+
// process TypeScript migrations
|
|
62
|
+
const tsMigrations = await Promise.all(tsMigrationsSorted.map(async ({ name, run }) => {
|
|
63
|
+
if (appliedMigrationNames.has(name)) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const migration = (await run());
|
|
68
|
+
return { ...migration, name };
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
console.error(`Failed to load TypeScript migration ${name}:`, error);
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
})).then((migrations) => migrations.filter(Boolean));
|
|
75
|
+
// combine TypeScript and SQL migrations, sorted by name to ensure correct order
|
|
76
|
+
const pendingMigrations = [...tsMigrations].sort((a, b) => a.name.localeCompare(b.name));
|
|
77
|
+
if (!pendingMigrations.length) {
|
|
78
|
+
await client.query('COMMIT');
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
for (const migration of pendingMigrations) {
|
|
82
|
+
if (migration.up) {
|
|
83
|
+
// use savepoints so "already exists" errors don't abort the transaction.
|
|
84
|
+
// this handles cases where tables/columns exist but migration tracking
|
|
85
|
+
// was lost (e.g. db restore, pglite data loss)
|
|
86
|
+
const sp = `sp_${migration.name.replace(/\W/g, '_')}`;
|
|
87
|
+
await client.query(`SAVEPOINT ${sp}`);
|
|
88
|
+
try {
|
|
89
|
+
const timeout = migration.timeout ?? defaultTimeout;
|
|
90
|
+
await withTimeout(migration.up(client), timeout, migration.name);
|
|
91
|
+
await client.query(`RELEASE SAVEPOINT ${sp}`);
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
// ROLLBACK TO SAVEPOINT can fail in its own right (e.g. when running
|
|
95
|
+
// against pglite via orez's wire-protocol proxy, a parallel client
|
|
96
|
+
// sharing the same backend session can corrupt the transaction
|
|
97
|
+
// state, leaving us with no active transaction). if we don't catch
|
|
98
|
+
// the rollback failure separately, the original migration error `e`
|
|
99
|
+
// is replaced by the rollback's error, hiding what actually went
|
|
100
|
+
// wrong. log the rollback failure and re-throw the original.
|
|
101
|
+
try {
|
|
102
|
+
await client.query(`ROLLBACK TO SAVEPOINT ${sp}`);
|
|
103
|
+
}
|
|
104
|
+
catch (rollbackErr) {
|
|
105
|
+
console.error(`[migrate] ${migration.name}: ROLLBACK TO SAVEPOINT failed:`, rollbackErr);
|
|
106
|
+
console.error(`[migrate] ${migration.name}: original migration error was:`, e);
|
|
107
|
+
throw e;
|
|
108
|
+
}
|
|
109
|
+
// only ignore idempotency errors - NOT all 42xxx errors!
|
|
110
|
+
// 42xxx is the entire "Syntax Error or Access Rule Violation" class
|
|
111
|
+
// which includes undefined_table (42P01), syntax_error (42601), etc.
|
|
112
|
+
// we only want to skip migrations where objects already/don't exist:
|
|
113
|
+
const idempotentErrorCodes = [
|
|
114
|
+
'42710', // duplicate_object
|
|
115
|
+
'42P07', // duplicate_table
|
|
116
|
+
'42701', // duplicate_column
|
|
117
|
+
'42P16', // invalid_table_definition (e.g. constraint already exists)
|
|
118
|
+
'42704', // undefined_object (e.g. DROP CONSTRAINT on non-existent constraint)
|
|
119
|
+
];
|
|
120
|
+
if (idempotentErrorCodes.includes(e?.code)) {
|
|
121
|
+
console.info(`[migrate] ${migration.name}: ${e.message} (${e.code}), recording as applied`);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// any other error should fail the migration
|
|
125
|
+
throw e;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
await client.query('INSERT INTO public.migrations (name) VALUES ($1)', [
|
|
130
|
+
migration.name,
|
|
131
|
+
]);
|
|
132
|
+
}
|
|
133
|
+
await client.query('COMMIT');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (e) {
|
|
137
|
+
console.error(`Migration failed, rolling back:`, e);
|
|
138
|
+
await client.query('ROLLBACK');
|
|
139
|
+
try {
|
|
140
|
+
client.release(false);
|
|
141
|
+
}
|
|
142
|
+
catch (releaseErr) {
|
|
143
|
+
console.error(`Error releasing connection after rollback:`, releaseErr);
|
|
144
|
+
}
|
|
145
|
+
throw e;
|
|
146
|
+
}
|
|
147
|
+
if (onMigrationComplete) {
|
|
148
|
+
await onMigrationComplete();
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
// don't destroy the connection forcefully - let it return to pool gracefully
|
|
152
|
+
client.release(false);
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
console.error(`Error releasing connection gracefully, trying to destroy:`, err);
|
|
156
|
+
try {
|
|
157
|
+
client.release(true);
|
|
158
|
+
}
|
|
159
|
+
catch (destroyErr) {
|
|
160
|
+
console.error(`Error destroying connection:`, destroyErr);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (forceExit) {
|
|
164
|
+
// flush stdio before exiting — process.exit() doesn't wait for streams to drain
|
|
165
|
+
await new Promise((resolve) => {
|
|
166
|
+
process.stderr.write('', () => {
|
|
167
|
+
process.stdout.write('', () => resolve());
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
process.exit(0);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/** load migration files from a directory (for non-vite contexts like bun scripts) */
|
|
174
|
+
export function loadMigrationsFromDir(dir) {
|
|
175
|
+
const files = readdirSync(dir)
|
|
176
|
+
.filter((f) => /^\d+/.test(f) && (f.endsWith('.ts') || f.endsWith('.sql')))
|
|
177
|
+
.sort();
|
|
178
|
+
// deduplicate: prefer .ts over .sql for same base name
|
|
179
|
+
const seen = new Set();
|
|
180
|
+
const deduped = [];
|
|
181
|
+
for (const f of files) {
|
|
182
|
+
if (f.endsWith('.ts')) {
|
|
183
|
+
seen.add(f.replace(/\.ts$/, ''));
|
|
184
|
+
deduped.push(f);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
for (const f of files) {
|
|
188
|
+
if (f.endsWith('.sql') && !seen.has(f.replace(/\.sql$/, ''))) {
|
|
189
|
+
deduped.push(f);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
deduped.sort();
|
|
193
|
+
return Object.fromEntries(deduped.map((f) => {
|
|
194
|
+
if (f.endsWith('.sql')) {
|
|
195
|
+
return [
|
|
196
|
+
`./${f}`,
|
|
197
|
+
async () => {
|
|
198
|
+
const sql = readFileSync(resolve(dir, f), 'utf-8');
|
|
199
|
+
return {
|
|
200
|
+
up: async (client) => {
|
|
201
|
+
for (const stmt of sql.split('--> statement-breakpoint')) {
|
|
202
|
+
const trimmed = stmt.trim();
|
|
203
|
+
if (trimmed)
|
|
204
|
+
await client.query(trimmed);
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
},
|
|
209
|
+
];
|
|
210
|
+
}
|
|
211
|
+
return [`./${f}`, () => import(/* @vite-ignore */ resolve(dir, f))];
|
|
212
|
+
}));
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/takeout/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type BuildMigrationsOptions = {
|
|
2
|
+
migrationsDir: string;
|
|
3
|
+
outFile?: string;
|
|
4
|
+
target?: string;
|
|
5
|
+
aliases?: Record<string, string>;
|
|
6
|
+
};
|
|
7
|
+
export declare function buildMigrations(options: BuildMigrationsOptions): Promise<import("rollup").RollupOutput | import("rollup").RollupOutput[] | import("rollup").RollupWatcher>;
|
|
8
|
+
//# sourceMappingURL=build-migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-migrations.d.ts","sourceRoot":"","sources":["../../../src/takeout/scripts/build-migrations.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC,CAAA;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,6GAuDpE"}
|