@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.
Files changed (121) hide show
  1. package/dist/takeout/better-auth.d.ts +19 -0
  2. package/dist/takeout/better-auth.d.ts.map +1 -0
  3. package/dist/takeout/better-auth.js +59 -0
  4. package/dist/takeout/better-auth.js.map +1 -0
  5. package/dist/takeout/build.d.ts +2 -0
  6. package/dist/takeout/build.d.ts.map +1 -0
  7. package/dist/takeout/build.js +3 -0
  8. package/dist/takeout/build.js.map +1 -0
  9. package/dist/takeout/chunkedQuery.d.ts +17 -0
  10. package/dist/takeout/chunkedQuery.d.ts.map +1 -0
  11. package/dist/takeout/chunkedQuery.js +55 -0
  12. package/dist/takeout/chunkedQuery.js.map +1 -0
  13. package/dist/takeout/cli.d.ts +3 -0
  14. package/dist/takeout/cli.d.ts.map +1 -0
  15. package/dist/takeout/cli.js +114 -0
  16. package/dist/takeout/cli.js.map +1 -0
  17. package/dist/takeout/createDatabase.d.ts +49 -0
  18. package/dist/takeout/createDatabase.d.ts.map +1 -0
  19. package/dist/takeout/createDatabase.js +100 -0
  20. package/dist/takeout/createDatabase.js.map +1 -0
  21. package/dist/takeout/createDb.d.ts +3 -0
  22. package/dist/takeout/createDb.d.ts.map +1 -0
  23. package/dist/takeout/createDb.js +11 -0
  24. package/dist/takeout/createDb.js.map +1 -0
  25. package/dist/takeout/createDrizzle.d.ts +38 -0
  26. package/dist/takeout/createDrizzle.d.ts.map +1 -0
  27. package/dist/takeout/createDrizzle.js +60 -0
  28. package/dist/takeout/createDrizzle.js.map +1 -0
  29. package/dist/takeout/createPool.d.ts +11 -0
  30. package/dist/takeout/createPool.d.ts.map +1 -0
  31. package/dist/takeout/createPool.js +36 -0
  32. package/dist/takeout/createPool.js.map +1 -0
  33. package/dist/takeout/createServerHelpers.d.ts +9 -0
  34. package/dist/takeout/createServerHelpers.d.ts.map +1 -0
  35. package/dist/takeout/createServerHelpers.js +11 -0
  36. package/dist/takeout/createServerHelpers.js.map +1 -0
  37. package/dist/takeout/getDBClient.d.ts +11 -0
  38. package/dist/takeout/getDBClient.d.ts.map +1 -0
  39. package/dist/takeout/getDBClient.js +169 -0
  40. package/dist/takeout/getDBClient.js.map +1 -0
  41. package/dist/takeout/index.d.ts +13 -0
  42. package/dist/takeout/index.d.ts.map +1 -0
  43. package/dist/takeout/index.js +13 -0
  44. package/dist/takeout/index.js.map +1 -0
  45. package/dist/takeout/migrate.d.ts +33 -0
  46. package/dist/takeout/migrate.d.ts.map +1 -0
  47. package/dist/takeout/migrate.js +214 -0
  48. package/dist/takeout/migrate.js.map +1 -0
  49. package/dist/takeout/scripts/build-migrations.d.ts +8 -0
  50. package/dist/takeout/scripts/build-migrations.d.ts.map +1 -0
  51. package/dist/takeout/scripts/build-migrations.js +51 -0
  52. package/dist/takeout/scripts/build-migrations.js.map +1 -0
  53. package/dist/takeout/scripts/drizzle-migrations-sync.d.ts +17 -0
  54. package/dist/takeout/scripts/drizzle-migrations-sync.d.ts.map +1 -0
  55. package/dist/takeout/scripts/drizzle-migrations-sync.js +69 -0
  56. package/dist/takeout/scripts/drizzle-migrations-sync.js.map +1 -0
  57. package/dist/takeout/scripts/dump-database.d.ts +22 -0
  58. package/dist/takeout/scripts/dump-database.d.ts.map +1 -0
  59. package/dist/takeout/scripts/dump-database.js +64 -0
  60. package/dist/takeout/scripts/dump-database.js.map +1 -0
  61. package/dist/takeout/scripts/migration-add.d.ts +6 -0
  62. package/dist/takeout/scripts/migration-add.d.ts.map +1 -0
  63. package/dist/takeout/scripts/migration-add.js +39 -0
  64. package/dist/takeout/scripts/migration-add.js.map +1 -0
  65. package/dist/takeout/scripts/pg_dump.d.ts +11 -0
  66. package/dist/takeout/scripts/pg_dump.d.ts.map +1 -0
  67. package/dist/takeout/scripts/pg_dump.js +37 -0
  68. package/dist/takeout/scripts/pg_dump.js.map +1 -0
  69. package/dist/takeout/scripts/prune-backups.d.ts +8 -0
  70. package/dist/takeout/scripts/prune-backups.d.ts.map +1 -0
  71. package/dist/takeout/scripts/prune-backups.js +166 -0
  72. package/dist/takeout/scripts/prune-backups.js.map +1 -0
  73. package/dist/takeout/scripts/psql.d.ts +11 -0
  74. package/dist/takeout/scripts/psql.d.ts.map +1 -0
  75. package/dist/takeout/scripts/psql.js +41 -0
  76. package/dist/takeout/scripts/psql.js.map +1 -0
  77. package/dist/takeout/seed.d.ts +10 -0
  78. package/dist/takeout/seed.d.ts.map +1 -0
  79. package/dist/takeout/seed.js +22 -0
  80. package/dist/takeout/seed.js.map +1 -0
  81. package/dist/takeout/sql.d.ts +9 -0
  82. package/dist/takeout/sql.d.ts.map +1 -0
  83. package/dist/takeout/sql.js +24 -0
  84. package/dist/takeout/sql.js.map +1 -0
  85. package/dist/takeout/sqlite.d.ts +66 -0
  86. package/dist/takeout/sqlite.d.ts.map +1 -0
  87. package/dist/takeout/sqlite.js +110 -0
  88. package/dist/takeout/sqlite.js.map +1 -0
  89. package/dist/takeout/waitForDatabase.d.ts +2 -0
  90. package/dist/takeout/waitForDatabase.d.ts.map +1 -0
  91. package/dist/takeout/waitForDatabase.js +26 -0
  92. package/dist/takeout/waitForDatabase.js.map +1 -0
  93. package/dist/takeout/zero.d.ts +44 -0
  94. package/dist/takeout/zero.d.ts.map +1 -0
  95. package/dist/takeout/zero.js +177 -0
  96. package/dist/takeout/zero.js.map +1 -0
  97. package/package.json +54 -4
  98. package/src/takeout/better-auth.ts +110 -0
  99. package/src/takeout/build.ts +2 -0
  100. package/src/takeout/chunkedQuery.ts +91 -0
  101. package/src/takeout/cli.ts +126 -0
  102. package/src/takeout/createDatabase.ts +164 -0
  103. package/src/takeout/createDb.ts +15 -0
  104. package/src/takeout/createDrizzle.ts +127 -0
  105. package/src/takeout/createPool.ts +58 -0
  106. package/src/takeout/createServerHelpers.ts +21 -0
  107. package/src/takeout/getDBClient.ts +254 -0
  108. package/src/takeout/index.ts +38 -0
  109. package/src/takeout/migrate.ts +272 -0
  110. package/src/takeout/scripts/build-migrations.ts +66 -0
  111. package/src/takeout/scripts/drizzle-migrations-sync.ts +81 -0
  112. package/src/takeout/scripts/dump-database.ts +103 -0
  113. package/src/takeout/scripts/migration-add.ts +54 -0
  114. package/src/takeout/scripts/pg_dump.ts +46 -0
  115. package/src/takeout/scripts/prune-backups.ts +211 -0
  116. package/src/takeout/scripts/psql.ts +51 -0
  117. package/src/takeout/seed.ts +45 -0
  118. package/src/takeout/sql.ts +39 -0
  119. package/src/takeout/sqlite.ts +237 -0
  120. package/src/takeout/waitForDatabase.ts +27 -0
  121. 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,6 @@
1
+ export type MigrationAddOptions = {
2
+ migrationsDir: string;
3
+ name?: string;
4
+ };
5
+ export declare function addMigration(options: MigrationAddOptions): string;
6
+ //# sourceMappingURL=migration-add.d.ts.map
@@ -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,8 @@
1
+ export declare function pruneBackups(bucketName: string, prefix: string, options?: {
2
+ region?: string;
3
+ dryRun?: boolean;
4
+ }): Promise<{
5
+ kept: string[];
6
+ deleted: string[];
7
+ }>;
8
+ //# sourceMappingURL=prune-backups.d.ts.map
@@ -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":"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"}
@@ -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"}