@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,51 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export async function buildMigrations(options) {
|
|
4
|
+
const { migrationsDir, outFile = 'migrate-dist.js', target = 'node22', aliases = {}, } = options;
|
|
5
|
+
const { build } = await import('vite');
|
|
6
|
+
const migrateFile = path.join(migrationsDir, '..', 'migrate.ts');
|
|
7
|
+
const result = await build({
|
|
8
|
+
configFile: false,
|
|
9
|
+
resolve: {
|
|
10
|
+
alias: aliases,
|
|
11
|
+
},
|
|
12
|
+
define: {
|
|
13
|
+
'process.env.GIT_SHA': JSON.stringify(execSync('git rev-parse HEAD').toString().trim()),
|
|
14
|
+
},
|
|
15
|
+
build: {
|
|
16
|
+
outDir: path.dirname(migrateFile),
|
|
17
|
+
target,
|
|
18
|
+
minify: false,
|
|
19
|
+
emptyOutDir: false,
|
|
20
|
+
copyPublicDir: false,
|
|
21
|
+
lib: {
|
|
22
|
+
name: 'migrate',
|
|
23
|
+
formats: ['es'],
|
|
24
|
+
entry: migrateFile,
|
|
25
|
+
},
|
|
26
|
+
rollupOptions: {
|
|
27
|
+
external: (id) => {
|
|
28
|
+
// externalize all node modules and node: imports
|
|
29
|
+
if (id.startsWith('node:') || id === 'pg')
|
|
30
|
+
return true;
|
|
31
|
+
// externalize all absolute paths (like aliases)
|
|
32
|
+
if (id.startsWith('/'))
|
|
33
|
+
return false;
|
|
34
|
+
// externalize node_modules
|
|
35
|
+
if (!id.startsWith('.') && !id.startsWith('/'))
|
|
36
|
+
return true;
|
|
37
|
+
return false;
|
|
38
|
+
},
|
|
39
|
+
output: {
|
|
40
|
+
format: 'es',
|
|
41
|
+
inlineDynamicImports: true,
|
|
42
|
+
exports: 'named',
|
|
43
|
+
entryFileNames: outFile,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
console.info(`✓ Built migration bundle: ${outFile}`);
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=build-migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-migrations.js","sourceRoot":"","sources":["../../../src/takeout/scripts/build-migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAA;AAS5B,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA+B;IACnE,MAAM,EACJ,aAAa,EACb,OAAO,GAAG,iBAAiB,EAC3B,MAAM,GAAG,QAAQ,EACjB,OAAO,GAAG,EAAE,GACb,GAAG,OAAO,CAAA;IAEX,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAA;IAEtC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;IAEhE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;QACzB,UAAU,EAAE,KAAK;QACjB,OAAO,EAAE;YACP,KAAK,EAAE,OAAO;SACf;QACD,MAAM,EAAE;YACN,qBAAqB,EAAE,IAAI,CAAC,SAAS,CACnC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CACjD;SACF;QACD,KAAK,EAAE;YACL,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;YACjC,MAAM;YACN,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,aAAa,EAAE,KAAK;YACpB,GAAG,EAAE;gBACH,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,CAAC,IAAI,CAAC;gBACf,KAAK,EAAE,WAAW;aACnB;YACD,aAAa,EAAE;gBACb,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE;oBACf,iDAAiD;oBACjD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI;wBAAE,OAAO,IAAI,CAAA;oBACtD,gDAAgD;oBAChD,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;wBAAE,OAAO,KAAK,CAAA;oBACpC,2BAA2B;oBAC3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;wBAAE,OAAO,IAAI,CAAA;oBAC3D,OAAO,KAAK,CAAA;gBACd,CAAC;gBACD,MAAM,EAAE;oBACN,MAAM,EAAE,IAAI;oBACZ,oBAAoB,EAAE,IAAI;oBAC1B,OAAO,EAAE,OAAO;oBAChB,cAAc,EAAE,OAAO;iBACxB;aACF;SACF;KACF,CAAC,CAAA;IAEF,OAAO,CAAC,IAAI,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAA;IACpD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* drizzle-kit v1 beta generates migrations as directories:
|
|
4
|
+
* YYYYMMDDHHMMSS_name/migration.sql + snapshot.json
|
|
5
|
+
*
|
|
6
|
+
* our migration runner uses loadMigrationsFromDir which only
|
|
7
|
+
* finds flat .ts files. this script creates a flat .ts wrapper for each
|
|
8
|
+
* directory migration so the runner can pick them up.
|
|
9
|
+
*
|
|
10
|
+
* the wrapper inlines the SQL as a string constant (no ?raw import needed)
|
|
11
|
+
* which makes it work with both vite and bun.
|
|
12
|
+
*/
|
|
13
|
+
export type DrizzleSyncOptions = {
|
|
14
|
+
migrationsDir: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function syncDrizzleMigrations(options: DrizzleSyncOptions): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=drizzle-migrations-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle-migrations-sync.d.ts","sourceRoot":"","sources":["../../../src/takeout/scripts/drizzle-migrations-sync.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AAMH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,iBA0DtE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* drizzle-kit v1 beta generates migrations as directories:
|
|
4
|
+
* YYYYMMDDHHMMSS_name/migration.sql + snapshot.json
|
|
5
|
+
*
|
|
6
|
+
* our migration runner uses loadMigrationsFromDir which only
|
|
7
|
+
* finds flat .ts files. this script creates a flat .ts wrapper for each
|
|
8
|
+
* directory migration so the runner can pick them up.
|
|
9
|
+
*
|
|
10
|
+
* the wrapper inlines the SQL as a string constant (no ?raw import needed)
|
|
11
|
+
* which makes it work with both vite and bun.
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync } from 'node:fs';
|
|
14
|
+
import { readdir, readFile, writeFile, stat } from 'node:fs/promises';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
export async function syncDrizzleMigrations(options) {
|
|
17
|
+
const { migrationsDir } = options;
|
|
18
|
+
const entries = await readdir(migrationsDir, { withFileTypes: true });
|
|
19
|
+
// find directory-format migrations (contain migration.sql)
|
|
20
|
+
const migrationDirs = entries.filter((e) => e.isDirectory() && e.name !== 'meta' && e.name !== 'node_modules');
|
|
21
|
+
let created = 0;
|
|
22
|
+
let updated = 0;
|
|
23
|
+
for (const dir of migrationDirs) {
|
|
24
|
+
const sqlPath = join(migrationsDir, dir.name, 'migration.sql');
|
|
25
|
+
if (!existsSync(sqlPath))
|
|
26
|
+
continue;
|
|
27
|
+
const sql = await readFile(sqlPath, 'utf-8');
|
|
28
|
+
const trimmed = sql.trim();
|
|
29
|
+
if (!trimmed || trimmed.startsWith('-- seed')) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const wrapperPath = join(migrationsDir, `${dir.name}.ts`);
|
|
33
|
+
// check if wrapper already exists and is up to date
|
|
34
|
+
if (existsSync(wrapperPath)) {
|
|
35
|
+
const sqlMtime = (await stat(sqlPath)).mtimeMs;
|
|
36
|
+
const tsMtime = (await stat(wrapperPath)).mtimeMs;
|
|
37
|
+
if (tsMtime > sqlMtime)
|
|
38
|
+
continue;
|
|
39
|
+
updated++;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
created++;
|
|
43
|
+
}
|
|
44
|
+
// generate wrapper with inlined SQL
|
|
45
|
+
const escaped = trimmed
|
|
46
|
+
.replace(/\\/g, '\\\\')
|
|
47
|
+
.replace(/`/g, '\\`')
|
|
48
|
+
.replace(/\$/g, '\\$');
|
|
49
|
+
const content = `import type { PoolClient } from 'pg'
|
|
50
|
+
|
|
51
|
+
const sql = \`${escaped}\`
|
|
52
|
+
|
|
53
|
+
export async function up(client: PoolClient) {
|
|
54
|
+
for (const stmt of sql.split('--> statement-breakpoint')) {
|
|
55
|
+
const trimmed = stmt.trim()
|
|
56
|
+
if (trimmed) await client.query(trimmed)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
`;
|
|
60
|
+
await writeFile(wrapperPath, content);
|
|
61
|
+
}
|
|
62
|
+
if (created > 0)
|
|
63
|
+
console.info(`created ${created} migration wrapper(s)`);
|
|
64
|
+
if (updated > 0)
|
|
65
|
+
console.info(`updated ${updated} migration wrapper(s)`);
|
|
66
|
+
if (created === 0 && updated === 0)
|
|
67
|
+
console.info('migration wrappers up to date');
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=drizzle-migrations-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle-migrations-sync.js","sourceRoot":"","sources":["../../../src/takeout/scripts/drizzle-migrations-sync.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAMhC,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAA2B;IACrE,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAA;IACjC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAErE,2DAA2D;IAC3D,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CACzE,CAAA;IAED,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,IAAI,OAAO,GAAG,CAAC,CAAA;IAEf,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,CAAA;QAC9D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,SAAQ;QAElC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;QAE1B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9C,SAAQ;QACV,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,CAAA;QAEzD,oDAAoD;QACpD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAA;YAC9C,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAA;YACjD,IAAI,OAAO,GAAG,QAAQ;gBAAE,SAAQ;YAChC,OAAO,EAAE,CAAA;QACX,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,CAAA;QACX,CAAC;QAED,oCAAoC;QACpC,MAAM,OAAO,GAAG,OAAO;aACpB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;aACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;aACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QACxB,MAAM,OAAO,GAAG;;gBAEJ,OAAO;;;;;;;;CAQtB,CAAA;QAEG,MAAM,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IACvC,CAAC;IAED,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,WAAW,OAAO,uBAAuB,CAAC,CAAA;IACxE,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,WAAW,OAAO,uBAAuB,CAAC,CAAA;IACxE,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;AACnF,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type DumpDatabaseOptions = {
|
|
2
|
+
host: string;
|
|
3
|
+
database: string;
|
|
4
|
+
username: string;
|
|
5
|
+
password?: string;
|
|
6
|
+
/** output file path */
|
|
7
|
+
outputPath: string;
|
|
8
|
+
/** timeout in ms (default: 5 minutes) */
|
|
9
|
+
timeout?: number;
|
|
10
|
+
/** pg_dump format (default: 'custom') */
|
|
11
|
+
format?: 'custom' | 'plain' | 'directory' | 'tar';
|
|
12
|
+
/** compression level 0-9 (default: 9) */
|
|
13
|
+
compress?: number;
|
|
14
|
+
};
|
|
15
|
+
export declare function dumpDatabase(options: DumpDatabaseOptions): Promise<boolean>;
|
|
16
|
+
export declare function checkDatabaseConnection(options: {
|
|
17
|
+
host: string;
|
|
18
|
+
database: string;
|
|
19
|
+
username: string;
|
|
20
|
+
timeout?: number;
|
|
21
|
+
}): Promise<boolean>;
|
|
22
|
+
//# sourceMappingURL=dump-database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dump-database.d.ts","sourceRoot":"","sources":["../../../src/takeout/scripts/dump-database.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yCAAyC;IACzC,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,KAAK,CAAA;IACjD,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAkEjF;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IACrD,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,GAAG,OAAO,CAAC,OAAO,CAAC,CAYnB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
export async function dumpDatabase(options) {
|
|
3
|
+
const { host, database, username, password, outputPath, timeout = 5 * 60 * 1000, format = 'custom', compress = 9, } = options;
|
|
4
|
+
return new Promise((resolve) => {
|
|
5
|
+
const proc = spawn('pg_dump', [
|
|
6
|
+
'--clean',
|
|
7
|
+
'--if-exists',
|
|
8
|
+
'--no-owner',
|
|
9
|
+
'--no-privileges',
|
|
10
|
+
'--verbose',
|
|
11
|
+
`--format=${format}`,
|
|
12
|
+
`--compress=${compress}`,
|
|
13
|
+
'--file',
|
|
14
|
+
outputPath,
|
|
15
|
+
], {
|
|
16
|
+
env: {
|
|
17
|
+
...process.env,
|
|
18
|
+
PGPASSWORD: password,
|
|
19
|
+
PGUSER: username,
|
|
20
|
+
PGHOST: host,
|
|
21
|
+
PGDATABASE: database,
|
|
22
|
+
PGCONNECT_TIMEOUT: '10',
|
|
23
|
+
},
|
|
24
|
+
stdio: 'inherit',
|
|
25
|
+
});
|
|
26
|
+
let timeoutId;
|
|
27
|
+
proc.on('error', (err) => {
|
|
28
|
+
console.error('[database] pg_dump process error:', err);
|
|
29
|
+
clearTimeout(timeoutId);
|
|
30
|
+
resolve(false);
|
|
31
|
+
});
|
|
32
|
+
proc.on('exit', (code) => {
|
|
33
|
+
clearTimeout(timeoutId);
|
|
34
|
+
if (code === 0) {
|
|
35
|
+
resolve(true);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.error(`[database] pg_dump exited with code ${code}`);
|
|
39
|
+
resolve(false);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
timeoutId = setTimeout(() => {
|
|
43
|
+
console.error(`[database] pg_dump timed out after ${timeout}ms`);
|
|
44
|
+
proc.kill('SIGTERM');
|
|
45
|
+
setTimeout(() => {
|
|
46
|
+
if (!proc.killed)
|
|
47
|
+
proc.kill('SIGKILL');
|
|
48
|
+
}, 5000);
|
|
49
|
+
resolve(false);
|
|
50
|
+
}, timeout);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
export async function checkDatabaseConnection(options) {
|
|
54
|
+
const { host, database, username, timeout = 5000 } = options;
|
|
55
|
+
return new Promise((resolve) => {
|
|
56
|
+
const proc = spawn('pg_isready', ['-d', database, '-h', host, '-U', username], {
|
|
57
|
+
stdio: 'inherit',
|
|
58
|
+
timeout,
|
|
59
|
+
});
|
|
60
|
+
proc.on('error', () => resolve(false));
|
|
61
|
+
proc.on('exit', (code) => resolve(code === 0));
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=dump-database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dump-database.js","sourceRoot":"","sources":["../../../src/takeout/scripts/dump-database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-add.d.ts","sourceRoot":"","sources":["../../../src/takeout/scripts/migration-add.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAID,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CA2CjE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { readdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
const commonWords = ['sapphire', 'emerald', 'ruby', 'amber', 'topaz', 'onyx', 'pearl'];
|
|
4
|
+
export function addMigration(options) {
|
|
5
|
+
const { migrationsDir, name } = options;
|
|
6
|
+
// if no name is provided, pick a random one from common words
|
|
7
|
+
const migrationName = name || commonWords[Math.floor(Math.random() * commonWords.length)];
|
|
8
|
+
// read all files in the migrations directory
|
|
9
|
+
const files = readdirSync(migrationsDir);
|
|
10
|
+
// find the highest migration number from both .ts and .sql files
|
|
11
|
+
const migrationRegex = /^(\d+)[-_].*\.(ts|sql)$/;
|
|
12
|
+
let maxNumber = 0;
|
|
13
|
+
for (const file of files) {
|
|
14
|
+
const match = file.match(migrationRegex);
|
|
15
|
+
if (match?.[1]) {
|
|
16
|
+
const num = Number.parseInt(match[1], 10);
|
|
17
|
+
if (!Number.isNaN(num) && num > maxNumber) {
|
|
18
|
+
maxNumber = num;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// calculate the next migration number and pad to 4 digits
|
|
23
|
+
const nextNumber = (maxNumber + 1).toString().padStart(4, '0');
|
|
24
|
+
const newFilename = `${nextNumber}-${migrationName}.ts`;
|
|
25
|
+
const newFilePath = join(migrationsDir, newFilename);
|
|
26
|
+
// create a template for custom TypeScript migrations
|
|
27
|
+
const templateContent = `import type { PoolClient } from 'pg'
|
|
28
|
+
|
|
29
|
+
export async function up(client: PoolClient) {
|
|
30
|
+
// implementation for applying this migration
|
|
31
|
+
}
|
|
32
|
+
`;
|
|
33
|
+
// write the template to the new file
|
|
34
|
+
writeFileSync(newFilePath, templateContent);
|
|
35
|
+
console.info(`Created custom migration: ${newFilePath}`);
|
|
36
|
+
console.info(`For Drizzle schema migrations, run 'drizzle-kit generate' instead`);
|
|
37
|
+
return newFilePath;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=migration-add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-add.js","sourceRoot":"","sources":["../../../src/takeout/scripts/migration-add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAOhC,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;AAEtF,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IAEvC,8DAA8D;IAC9D,MAAM,aAAa,GACjB,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAE,CAAA;IAEtE,6CAA6C;IAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC,CAAA;IAExC,iEAAiE;IACjE,MAAM,cAAc,GAAG,yBAAyB,CAAA;IAChD,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;QACxC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,SAAS,EAAE,CAAC;gBAC1C,SAAS,GAAG,GAAG,CAAA;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,MAAM,UAAU,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC9D,MAAM,WAAW,GAAG,GAAG,UAAU,IAAI,aAAa,KAAK,CAAA;IACvD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;IAEpD,qDAAqD;IACrD,MAAM,eAAe,GAAG;;;;;CAKzB,CAAA;IAEC,qCAAqC;IACrC,aAAa,CAAC,WAAW,EAAE,eAAe,CAAC,CAAA;IAE3C,OAAO,CAAC,IAAI,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAA;IACxD,OAAO,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAA;IAEjF,OAAO,WAAW,CAAA;AACpB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type PgDumpOptions = {
|
|
2
|
+
connectionString?: string;
|
|
3
|
+
host?: string;
|
|
4
|
+
port?: number;
|
|
5
|
+
database?: string;
|
|
6
|
+
user?: string;
|
|
7
|
+
password?: string;
|
|
8
|
+
args?: string[];
|
|
9
|
+
};
|
|
10
|
+
export declare function runPgDump(options?: PgDumpOptions): number | null;
|
|
11
|
+
//# sourceMappingURL=pg_dump.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pg_dump.d.ts","sourceRoot":"","sources":["../../../src/takeout/scripts/pg_dump.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AAED,wBAAgB,SAAS,CAAC,OAAO,GAAE,aAAkB,iBAiCpD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
export function runPgDump(options = {}) {
|
|
3
|
+
const { connectionString, host, port, database, user, password, args = [] } = options;
|
|
4
|
+
const env = {
|
|
5
|
+
...process.env,
|
|
6
|
+
};
|
|
7
|
+
if (connectionString) {
|
|
8
|
+
// parse connection string and set individual env vars
|
|
9
|
+
const url = new URL(connectionString);
|
|
10
|
+
env.PGHOST = url.hostname;
|
|
11
|
+
env.PGPORT = url.port || '5432';
|
|
12
|
+
env.PGDATABASE = url.pathname.slice(1);
|
|
13
|
+
env.PGUSER = url.username;
|
|
14
|
+
if (url.password) {
|
|
15
|
+
env.PGPASSWORD = url.password;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
if (host)
|
|
20
|
+
env.PGHOST = host;
|
|
21
|
+
if (port)
|
|
22
|
+
env.PGPORT = port.toString();
|
|
23
|
+
if (database)
|
|
24
|
+
env.PGDATABASE = database;
|
|
25
|
+
if (user)
|
|
26
|
+
env.PGUSER = user;
|
|
27
|
+
if (password)
|
|
28
|
+
env.PGPASSWORD = password;
|
|
29
|
+
}
|
|
30
|
+
console.info(`Running pg_dump on postgres ${env.PGHOST}/${env.PGDATABASE}`);
|
|
31
|
+
const result = spawnSync('pg_dump', args, {
|
|
32
|
+
stdio: ['ignore', 'inherit', 'inherit'],
|
|
33
|
+
env,
|
|
34
|
+
});
|
|
35
|
+
return result.status;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=pg_dump.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pg_dump.js","sourceRoot":"","sources":["../../../src/takeout/scripts/pg_dump.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAY9C,MAAM,UAAU,SAAS,CAAC,UAAyB,EAAE;IACnD,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,OAAO,CAAA;IAErF,MAAM,GAAG,GAA2B;QAClC,GAAG,OAAO,CAAC,GAAG;KACR,CAAA;IAER,IAAI,gBAAgB,EAAE,CAAC;QACrB,sDAAsD;QACtD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAA;QACrC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAA;QACzB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,MAAM,CAAA;QAC/B,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACtC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAA;QACzB,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAA;QAC/B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,IAAI;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAA;QAC3B,IAAI,IAAI;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QACtC,IAAI,QAAQ;YAAE,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAA;QACvC,IAAI,IAAI;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAA;QAC3B,IAAI,QAAQ;YAAE,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAA;IACzC,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,+BAA+B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;IAE3E,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE;QACxC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;QACvC,GAAG;KACJ,CAAC,CAAA;IAEF,OAAO,MAAM,CAAC,MAAM,CAAA;AACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune-backups.d.ts","sourceRoot":"","sources":["../../../src/takeout/scripts/prune-backups.ts"],"names":[],"mappings":"AAQA,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,GACA,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAmMhD"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { DeleteObjectsCommand, ListObjectsV2Command, S3Client } from '@aws-sdk/client-s3';
|
|
2
|
+
export async function pruneBackups(bucketName, prefix, options) {
|
|
3
|
+
const region = options?.region ?? 'us-west-1';
|
|
4
|
+
const dryRun = options?.dryRun ?? false;
|
|
5
|
+
const s3Client = new S3Client({
|
|
6
|
+
region,
|
|
7
|
+
credentials: {
|
|
8
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
9
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
console.info('🧹 Pruning old backups...');
|
|
13
|
+
// list all backups
|
|
14
|
+
const allBackups = [];
|
|
15
|
+
let continuationToken;
|
|
16
|
+
do {
|
|
17
|
+
const response = await s3Client.send(new ListObjectsV2Command({
|
|
18
|
+
Bucket: bucketName,
|
|
19
|
+
Prefix: prefix,
|
|
20
|
+
ContinuationToken: continuationToken,
|
|
21
|
+
}));
|
|
22
|
+
if (response.Contents) {
|
|
23
|
+
for (const obj of response.Contents) {
|
|
24
|
+
if (obj.Key && obj.LastModified && obj.Size) {
|
|
25
|
+
// extract date from filename (format: db-backup-2025-08-21T15-50-48-103Z.sql)
|
|
26
|
+
const match = obj.Key.match(/(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-\d{3}Z)/);
|
|
27
|
+
if (match) {
|
|
28
|
+
const dateStr = match[1].replace(/-(\d{2})-(\d{2})-(\d{3}Z)/, ':$1:$2.$3');
|
|
29
|
+
allBackups.push({
|
|
30
|
+
key: obj.Key,
|
|
31
|
+
date: new Date(dateStr),
|
|
32
|
+
size: obj.Size,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
continuationToken = response.NextContinuationToken;
|
|
39
|
+
} while (continuationToken);
|
|
40
|
+
if (allBackups.length === 0) {
|
|
41
|
+
console.info('No backups found to prune');
|
|
42
|
+
return { kept: [], deleted: [] };
|
|
43
|
+
}
|
|
44
|
+
// sort by date (newest first)
|
|
45
|
+
allBackups.sort((a, b) => b.date.getTime() - a.date.getTime());
|
|
46
|
+
const now = new Date();
|
|
47
|
+
const thirtyDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);
|
|
48
|
+
const toKeep = new Set();
|
|
49
|
+
const toDelete = [];
|
|
50
|
+
// group backups by day and month
|
|
51
|
+
const dailyBackups = new Map();
|
|
52
|
+
const monthlyBackups = new Map();
|
|
53
|
+
for (const backup of allBackups) {
|
|
54
|
+
const dayKey = backup.date.toISOString().split('T')[0]; // YYYY-MM-DD
|
|
55
|
+
const monthKey = dayKey.substring(0, 7); // YYYY-MM
|
|
56
|
+
if (!dailyBackups.has(dayKey)) {
|
|
57
|
+
dailyBackups.set(dayKey, []);
|
|
58
|
+
}
|
|
59
|
+
const dayBackupsList = dailyBackups.get(dayKey);
|
|
60
|
+
if (dayBackupsList) {
|
|
61
|
+
dayBackupsList.push(backup);
|
|
62
|
+
}
|
|
63
|
+
if (!monthlyBackups.has(monthKey)) {
|
|
64
|
+
monthlyBackups.set(monthKey, []);
|
|
65
|
+
}
|
|
66
|
+
const monthBackupsList = monthlyBackups.get(monthKey);
|
|
67
|
+
if (monthBackupsList) {
|
|
68
|
+
monthBackupsList.push(backup);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// keep daily backups for last 30 days
|
|
72
|
+
for (const [dayKey, backups] of dailyBackups) {
|
|
73
|
+
const dayDate = new Date(dayKey);
|
|
74
|
+
if (dayDate >= thirtyDaysAgo) {
|
|
75
|
+
// keep the most recent backup for each day
|
|
76
|
+
const latestBackup = backups[0];
|
|
77
|
+
if (latestBackup) {
|
|
78
|
+
toKeep.add(latestBackup.key);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// keep monthly backups for older than 30 days
|
|
83
|
+
for (const [monthKey, backups] of monthlyBackups) {
|
|
84
|
+
const monthDate = new Date(monthKey + '-01');
|
|
85
|
+
if (monthDate < thirtyDaysAgo) {
|
|
86
|
+
// keep the most recent backup for each month
|
|
87
|
+
const latestBackup = backups[0];
|
|
88
|
+
if (latestBackup) {
|
|
89
|
+
toKeep.add(latestBackup.key);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// always keep the very latest backup regardless of rules
|
|
94
|
+
if (allBackups.length > 0) {
|
|
95
|
+
const latestBackup = allBackups[0];
|
|
96
|
+
if (latestBackup) {
|
|
97
|
+
toKeep.add(latestBackup.key);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// determine which backups to delete
|
|
101
|
+
for (const backup of allBackups) {
|
|
102
|
+
if (!toKeep.has(backup.key)) {
|
|
103
|
+
toDelete.push(backup.key);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
console.info(`📊 Backup retention summary:`);
|
|
107
|
+
console.info(` Total backups: ${allBackups.length}`);
|
|
108
|
+
console.info(` Keeping: ${toKeep.size}`);
|
|
109
|
+
console.info(` Deleting: ${toDelete.length}`);
|
|
110
|
+
if (toDelete.length > 0) {
|
|
111
|
+
if (dryRun) {
|
|
112
|
+
console.info('\n🔍 DRY RUN - Would delete:');
|
|
113
|
+
for (const key of toDelete.slice(0, 10)) {
|
|
114
|
+
console.info(` - ${key}`);
|
|
115
|
+
}
|
|
116
|
+
if (toDelete.length > 10) {
|
|
117
|
+
console.info(` ... and ${toDelete.length - 10} more`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
console.info('\n🗑️ Deleting old backups...');
|
|
122
|
+
// delete in batches of 1000 (S3 limit)
|
|
123
|
+
for (let i = 0; i < toDelete.length; i += 1000) {
|
|
124
|
+
const batch = toDelete.slice(i, i + 1000);
|
|
125
|
+
await s3Client.send(new DeleteObjectsCommand({
|
|
126
|
+
Bucket: bucketName,
|
|
127
|
+
Delete: {
|
|
128
|
+
Objects: batch.map((key) => ({ Key: key })),
|
|
129
|
+
Quiet: true,
|
|
130
|
+
},
|
|
131
|
+
}));
|
|
132
|
+
console.info(` Deleted batch ${Math.floor(i / 1000) + 1}/${Math.ceil(toDelete.length / 1000)}`);
|
|
133
|
+
}
|
|
134
|
+
console.info(`✅ Successfully deleted ${toDelete.length} old backup(s)`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
console.info('✅ No backups need to be deleted');
|
|
139
|
+
}
|
|
140
|
+
// log retention details
|
|
141
|
+
console.info('\n📅 Retention details:');
|
|
142
|
+
const keptList = Array.from(toKeep).sort();
|
|
143
|
+
const recentBackups = keptList.filter((key) => {
|
|
144
|
+
const match = key.match(/(\d{4}-\d{2}-\d{2})/);
|
|
145
|
+
if (match && match[1]) {
|
|
146
|
+
const date = new Date(match[1]);
|
|
147
|
+
return date >= thirtyDaysAgo;
|
|
148
|
+
}
|
|
149
|
+
return false;
|
|
150
|
+
});
|
|
151
|
+
const oldBackups = keptList.filter((key) => {
|
|
152
|
+
const match = key.match(/(\d{4}-\d{2}-\d{2})/);
|
|
153
|
+
if (match && match[1]) {
|
|
154
|
+
const date = new Date(match[1]);
|
|
155
|
+
return date < thirtyDaysAgo;
|
|
156
|
+
}
|
|
157
|
+
return false;
|
|
158
|
+
});
|
|
159
|
+
console.info(` Daily backups (last 30 days): ${recentBackups.length}`);
|
|
160
|
+
console.info(` Monthly backups (older): ${oldBackups.length}`);
|
|
161
|
+
return {
|
|
162
|
+
kept: Array.from(toKeep),
|
|
163
|
+
deleted: toDelete,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=prune-backups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune-backups.js","sourceRoot":"","sources":["../../../src/takeout/scripts/prune-backups.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAQzF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAAkB,EAClB,MAAc,EACd,OAGC;IAED,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,WAAW,CAAA;IAC7C,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,KAAK,CAAA;IAEvC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC;QAC5B,MAAM;QACN,WAAW,EAAE;YACX,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAkB;YAC3C,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAsB;SACpD;KACF,CAAC,CAAA;IAEF,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;IAEzC,mBAAmB;IACnB,MAAM,UAAU,GAAiB,EAAE,CAAA;IACnC,IAAI,iBAAqC,CAAA;IAEzC,GAAG,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAClC,IAAI,oBAAoB,CAAC;YACvB,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,MAAM;YACd,iBAAiB,EAAE,iBAAiB;SACrC,CAAC,CACH,CAAA;QAED,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACpC,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC5C,8EAA8E;oBAC9E,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAA;oBAC3E,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,2BAA2B,EAAE,WAAW,CAAC,CAAA;wBAC3E,UAAU,CAAC,IAAI,CAAC;4BACd,GAAG,EAAE,GAAG,CAAC,GAAG;4BACZ,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC;4BACvB,IAAI,EAAE,GAAG,CAAC,IAAI;yBACf,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,iBAAiB,GAAG,QAAQ,CAAC,qBAAqB,CAAA;IACpD,CAAC,QAAQ,iBAAiB,EAAC;IAE3B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;QACzC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;IAClC,CAAC;IAED,8BAA8B;IAC9B,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;IAE9D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IAExE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;IAChC,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,iCAAiC;IACjC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAwB,CAAA;IACpD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAwB,CAAA;IAEtD,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,aAAa;QACrE,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAC,UAAU;QAElD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAC9B,CAAC;QACD,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC/C,IAAI,cAAc,EAAE,CAAC;YACnB,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC7B,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QAClC,CAAC;QACD,MAAM,gBAAgB,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACrD,IAAI,gBAAgB,EAAE,CAAC;YACrB,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAA;QAChC,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC;YAC7B,2CAA2C;YAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YAC/B,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,cAAc,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAA;QAC5C,IAAI,SAAS,GAAG,aAAa,EAAE,CAAC;YAC9B,6CAA6C;YAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YAC/B,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;QAClC,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAA;IAC5C,OAAO,CAAC,IAAI,CAAC,qBAAqB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;IACtD,OAAO,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IAC1C,OAAO,CAAC,IAAI,CAAC,gBAAgB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAE/C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAA;YAC5C,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAA;YAC7B,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAA;YACzD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;YAE9C,uCAAuC;YACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;gBAEzC,MAAM,QAAQ,CAAC,IAAI,CACjB,IAAI,oBAAoB,CAAC;oBACvB,MAAM,EAAE,UAAU;oBAClB,MAAM,EAAE;wBACN,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;wBAC3C,KAAK,EAAE,IAAI;qBACZ;iBACF,CAAC,CACH,CAAA;gBAED,OAAO,CAAC,IAAI,CACV,oBAAoB,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CACpF,CAAA;YACH,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,0BAA0B,QAAQ,CAAC,MAAM,gBAAgB,CAAC,CAAA;QACzE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;IACjD,CAAC;IAED,wBAAwB;IACxB,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;IAC1C,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;QAC9C,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/B,OAAO,IAAI,IAAI,aAAa,CAAA;QAC9B,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;QAC9C,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/B,OAAO,IAAI,GAAG,aAAa,CAAA;QAC7B,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,IAAI,CAAC,oCAAoC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAA;IACxE,OAAO,CAAC,IAAI,CAAC,+BAA+B,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;IAEhE,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QACxB,OAAO,EAAE,QAAQ;KAClB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type PsqlOptions = {
|
|
2
|
+
connectionString?: string;
|
|
3
|
+
host?: string;
|
|
4
|
+
port?: number;
|
|
5
|
+
database?: string;
|
|
6
|
+
user?: string;
|
|
7
|
+
password?: string;
|
|
8
|
+
query?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function runPsql(options?: PsqlOptions): number | null;
|
|
11
|
+
//# sourceMappingURL=psql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"psql.d.ts","sourceRoot":"","sources":["../../../src/takeout/scripts/psql.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,wBAAgB,OAAO,CAAC,OAAO,GAAE,WAAgB,iBAsChD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
export function runPsql(options = {}) {
|
|
3
|
+
const { connectionString, host, port, database, user, password, query } = options;
|
|
4
|
+
const env = {
|
|
5
|
+
...process.env,
|
|
6
|
+
};
|
|
7
|
+
if (connectionString) {
|
|
8
|
+
// parse connection string and set individual env vars
|
|
9
|
+
const url = new URL(connectionString);
|
|
10
|
+
env.PGHOST = url.hostname;
|
|
11
|
+
env.PGPORT = url.port || '5432';
|
|
12
|
+
env.PGDATABASE = url.pathname.slice(1);
|
|
13
|
+
env.PGUSER = url.username;
|
|
14
|
+
if (url.password) {
|
|
15
|
+
env.PGPASSWORD = url.password;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
if (host)
|
|
20
|
+
env.PGHOST = host;
|
|
21
|
+
if (port)
|
|
22
|
+
env.PGPORT = port.toString();
|
|
23
|
+
if (database)
|
|
24
|
+
env.PGDATABASE = database;
|
|
25
|
+
if (user)
|
|
26
|
+
env.PGUSER = user;
|
|
27
|
+
if (password)
|
|
28
|
+
env.PGPASSWORD = password;
|
|
29
|
+
}
|
|
30
|
+
const args = [];
|
|
31
|
+
if (query) {
|
|
32
|
+
args.push('-c', query);
|
|
33
|
+
}
|
|
34
|
+
console.info(`Connecting to postgres ${env.PGHOST}/${env.PGDATABASE}`);
|
|
35
|
+
const result = spawnSync('psql', args, {
|
|
36
|
+
stdio: ['ignore', 'inherit', 'inherit'],
|
|
37
|
+
env,
|
|
38
|
+
});
|
|
39
|
+
return result.status;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=psql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"psql.js","sourceRoot":"","sources":["../../../src/takeout/scripts/psql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAY9C,MAAM,UAAU,OAAO,CAAC,UAAuB,EAAE;IAC/C,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,OAAO,CAAA;IAEjF,MAAM,GAAG,GAA2B;QAClC,GAAG,OAAO,CAAC,GAAG;KACR,CAAA;IAER,IAAI,gBAAgB,EAAE,CAAC;QACrB,sDAAsD;QACtD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAA;QACrC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAA;QACzB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,MAAM,CAAA;QAC/B,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACtC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAA;QACzB,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAA;QAC/B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,IAAI;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAA;QAC3B,IAAI,IAAI;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QACtC,IAAI,QAAQ;YAAE,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAA;QACvC,IAAI,IAAI;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAA;QAC3B,IAAI,QAAQ;YAAE,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAA;IACzC,CAAC;IAED,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACxB,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,0BAA0B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;IAEtE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE;QACrC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;QACvC,GAAG;KACJ,CAAC,CAAA;IAEF,OAAO,MAAM,CAAC,MAAM,CAAA;AACtB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { InferInsertModel, Table } from 'drizzle-orm';
|
|
2
|
+
export type SeedRows = Record<string, Array<Record<string, unknown>>>;
|
|
3
|
+
export type SeedData<TSchema> = {
|
|
4
|
+
[K in keyof TSchema as TSchema[K] extends Table ? K : never]?: Array<InferInsertModel<Extract<TSchema[K], Table>>>;
|
|
5
|
+
};
|
|
6
|
+
export interface SeedClient {
|
|
7
|
+
query(sql: string, params?: unknown[]): Promise<unknown>;
|
|
8
|
+
}
|
|
9
|
+
export declare function applySeed(client: SeedClient, rows: SeedRows): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=seed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/takeout/seed.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAG1D,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;AAKrE,MAAM,MAAM,QAAQ,CAAC,OAAO,IAAI;KAC7B,CAAC,IAAI,MAAM,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK,CAClE,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAC7C;CACF,CAAA;AAID,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACzD;AAQD,wBAAsB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAajF"}
|