@o/database 0.16.18 → 0.16.19-canary.1790165522484

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,19 @@
1
+ import { drizzleAdapter, type DrizzleAdapterConfig } from 'better-auth/adapters/drizzle';
2
+ import { type CreateSQLiteDatabaseOptions, type SQLiteSchema, type SQLiteTransactionProvider } from './sqlite.js';
3
+ import type { AnyRelations, EmptyRelations } from 'drizzle-orm';
4
+ export type CreateBetterAuthSQLiteAdapterOptions<TSchema extends SQLiteSchema, TRelations extends AnyRelations = EmptyRelations> = Pick<CreateSQLiteDatabaseOptions<TSchema, TRelations>, 'relations' | 'schema' | 'transactionProvider'> & {
5
+ /**
6
+ * runs the adapter's read-only operations (`findOne`, `findMany`, `count`).
7
+ * the SQLite host decides what a read session means; on a host that admits
8
+ * one writer at a time and readers together, a session lookup no longer
9
+ * waits for the writer turn. defaults to `transactionProvider`.
10
+ */
11
+ readTransactionProvider?: SQLiteTransactionProvider;
12
+ } & Omit<DrizzleAdapterConfig, 'provider' | 'schema' | 'transaction'>;
13
+ /**
14
+ * gives Better Auth its official Drizzle adapter inside the transaction
15
+ * callback owned by the SQLite host. the Drizzle adapter's transaction mode
16
+ * stays disabled because it must never emit its own BEGIN or COMMIT.
17
+ */
18
+ export declare function createBetterAuthSQLiteAdapter<TSchema extends SQLiteSchema, TRelations extends AnyRelations = EmptyRelations>(options: CreateBetterAuthSQLiteAdapterOptions<TSchema, TRelations>): ReturnType<typeof drizzleAdapter>;
19
+ //# sourceMappingURL=better-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"better-auth.d.ts","sourceRoot":"","sources":["../../src/takeout/better-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAExF,OAAO,EAEL,KAAK,2BAA2B,EAChC,KAAK,YAAY,EAEjB,KAAK,yBAAyB,EAC/B,MAAM,aAAa,CAAA;AAEpB,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE/D,MAAM,MAAM,oCAAoC,CAC9C,OAAO,SAAS,YAAY,EAC5B,UAAU,SAAS,YAAY,GAAG,cAAc,IAC9C,IAAI,CACN,2BAA2B,CAAC,OAAO,EAAE,UAAU,CAAC,EAChD,WAAW,GAAG,QAAQ,GAAG,qBAAqB,CAC/C,GAAG;IACF;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,yBAAyB,CAAA;CACpD,GAAG,IAAI,CAAC,oBAAoB,EAAE,UAAU,GAAG,QAAQ,GAAG,aAAa,CAAC,CAAA;AAMrE;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,SAAS,YAAY,EAC5B,UAAU,SAAS,YAAY,GAAG,cAAc,EAEhD,OAAO,EAAE,oCAAoC,CAAC,OAAO,EAAE,UAAU,CAAC,GACjE,UAAU,CAAC,OAAO,cAAc,CAAC,CAmEnC"}
@@ -0,0 +1,59 @@
1
+ import { drizzleAdapter } from 'better-auth/adapters/drizzle';
2
+ import { createSQLiteDrizzle, } from './sqlite.js';
3
+ // the adapter operations that only SELECT. every other operation, and the
4
+ // explicit `transaction`, keeps the write provider.
5
+ const READ_OPERATIONS = new Set(['findOne', 'findMany', 'count']);
6
+ /**
7
+ * gives Better Auth its official Drizzle adapter inside the transaction
8
+ * callback owned by the SQLite host. the Drizzle adapter's transaction mode
9
+ * stays disabled because it must never emit its own BEGIN or COMMIT.
10
+ */
11
+ export function createBetterAuthSQLiteAdapter(options) {
12
+ const { relations, schema, transactionProvider, readTransactionProvider = transactionProvider, ...drizzleOptions } = options;
13
+ const adapterConfig = {
14
+ ...drizzleOptions,
15
+ provider: 'sqlite',
16
+ schema,
17
+ transaction: false,
18
+ };
19
+ const createAdapter = (executor, authOptions) => drizzleAdapter(createSQLiteDrizzle(executor, { relations, schema }), adapterConfig)(authOptions);
20
+ return (authOptions) => {
21
+ const unavailableExecutor = {
22
+ exec() {
23
+ throw new Error('Better Auth SQLite operations require a transaction callback');
24
+ },
25
+ execMany() {
26
+ throw new Error('Better Auth SQLite operations require a transaction callback');
27
+ },
28
+ query() {
29
+ throw new Error('Better Auth SQLite operations require a transaction callback');
30
+ },
31
+ queryAst() {
32
+ throw new Error('Better Auth SQLite operations require a transaction callback');
33
+ },
34
+ };
35
+ const target = createAdapter(unavailableExecutor, authOptions);
36
+ const transaction = (work) => transactionProvider(async (executor) => work(createAdapter(executor, authOptions)));
37
+ return new Proxy(target, {
38
+ get(_target, property, receiver) {
39
+ if (property === 'transaction')
40
+ return transaction;
41
+ const value = Reflect.get(target, property, receiver);
42
+ if (typeof value !== 'function')
43
+ return value;
44
+ const provider = typeof property === 'string' && READ_OPERATIONS.has(property)
45
+ ? readTransactionProvider
46
+ : transactionProvider;
47
+ return (...args) => provider(async (executor) => {
48
+ const adapter = createAdapter(executor, authOptions);
49
+ const operation = Reflect.get(adapter, property);
50
+ if (typeof operation !== 'function') {
51
+ throw new TypeError(`Better Auth adapter operation ${String(property)} is unavailable`);
52
+ }
53
+ return Reflect.apply(operation, adapter, args);
54
+ });
55
+ },
56
+ });
57
+ };
58
+ }
59
+ //# sourceMappingURL=better-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"better-auth.js","sourceRoot":"","sources":["../../src/takeout/better-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA6B,MAAM,8BAA8B,CAAA;AAExF,OAAO,EACL,mBAAmB,GAKpB,MAAM,aAAa,CAAA;AAoBpB,0EAA0E;AAC1E,oDAAoD;AACpD,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAA;AAEtF;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAI3C,OAAkE;IAElE,MAAM,EACJ,SAAS,EACT,MAAM,EACN,mBAAmB,EACnB,uBAAuB,GAAG,mBAAmB,EAC7C,GAAG,cAAc,EAClB,GAAG,OAAO,CAAA;IACX,MAAM,aAAa,GAAG;QACpB,GAAG,cAAc;QACjB,QAAQ,EAAE,QAAQ;QAClB,MAAM;QACN,WAAW,EAAE,KAAK;KACY,CAAA;IAChC,MAAM,aAAa,GAAG,CACpB,QAAmC,EACnC,WAA6D,EAC7D,EAAE,CACF,cAAc,CACZ,mBAAmB,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EACpD,aAAa,CACd,CAAC,WAAW,CAAC,CAAA;IAEhB,OAAO,CAAC,WAAW,EAAE,EAAE;QACrB,MAAM,mBAAmB,GAA8B;YACrD,IAAI;gBACF,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;YACjF,CAAC;YACD,QAAQ;gBACN,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;YACjF,CAAC;YACD,KAAK;gBACH,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;YACjF,CAAC;YACD,QAAQ;gBACN,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;YACjF,CAAC;SACF,CAAA;QACD,MAAM,MAAM,GAAG,aAAa,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAA;QAC9D,MAAM,WAAW,GAA8B,CAAC,IAAI,EAAE,EAAE,CACtD,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;QAErF,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE;YACvB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ;gBAC7B,IAAI,QAAQ,KAAK,aAAa;oBAAE,OAAO,WAAW,CAAA;gBAElD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;gBACrD,IAAI,OAAO,KAAK,KAAK,UAAU;oBAAE,OAAO,KAAK,CAAA;gBAE7C,MAAM,QAAQ,GACZ,OAAO,QAAQ,KAAK,QAAQ,IAAI,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAC3D,CAAC,CAAC,uBAAuB;oBACzB,CAAC,CAAC,mBAAmB,CAAA;gBACzB,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE,CAC5B,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;oBAC1B,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;oBACpD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;oBAChD,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;wBACpC,MAAM,IAAI,SAAS,CACjB,iCAAiC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CACnE,CAAA;oBACH,CAAC;oBACD,OAAO,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;gBAChD,CAAC,CAAC,CAAA;YACN,CAAC;SACF,CAAC,CAAA;IACJ,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { buildMigrations } from './scripts/build-migrations.js';
2
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/takeout/build.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA"}
@@ -0,0 +1,3 @@
1
+ // build utilities that depend on vite
2
+ export { buildMigrations } from './scripts/build-migrations.js';
3
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/takeout/build.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA"}
@@ -0,0 +1,17 @@
1
+ import type { PoolClient, QueryResultRow } from 'pg';
2
+ interface ChunkedQueryOptions {
3
+ chunkSize?: number;
4
+ onProgress?: (processed: number, total: number) => void;
5
+ }
6
+ /**
7
+ * Process database records in chunks to avoid memory issues with large datasets
8
+ */
9
+ export declare function processInChunks<T extends QueryResultRow = QueryResultRow>(client: PoolClient, query: string, processor: (rows: T[]) => Promise<void>, options?: ChunkedQueryOptions): Promise<void>;
10
+ /**
11
+ * Update records in chunks with a transformer function
12
+ */
13
+ export declare function updateInChunks<T extends QueryResultRow & {
14
+ id: string;
15
+ }>(client: PoolClient, tableName: string, selectQuery: string, transformer: (row: T) => Promise<Partial<T> | null>, options?: ChunkedQueryOptions): Promise<number>;
16
+ export {};
17
+ //# sourceMappingURL=chunkedQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunkedQuery.d.ts","sourceRoot":"","sources":["../../src/takeout/chunkedQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,IAAI,CAAA;AAEpD,UAAU,mBAAmB;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACxD;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAC7E,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EACvC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAoCf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAC5E,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EACnD,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CA4BjB"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Process database records in chunks to avoid memory issues with large datasets
3
+ */
4
+ export async function processInChunks(client, query, processor, options = {}) {
5
+ const { chunkSize = 1000, onProgress } = options;
6
+ let offset = 0;
7
+ let hasMore = true;
8
+ let totalProcessed = 0;
9
+ // first get total count for progress reporting
10
+ const countQuery = query
11
+ .replace(/SELECT .+ FROM/, 'SELECT COUNT(*) FROM')
12
+ .replace(/ORDER BY .+/, '');
13
+ const countResult = await client.query(countQuery);
14
+ const totalCount = Number.parseInt(countResult.rows[0].count, 10);
15
+ while (hasMore) {
16
+ const paginatedQuery = `${query} LIMIT ${chunkSize} OFFSET ${offset}`;
17
+ const result = await client.query(paginatedQuery);
18
+ if (result.rows.length === 0) {
19
+ hasMore = false;
20
+ break;
21
+ }
22
+ await processor(result.rows);
23
+ totalProcessed += result.rows.length;
24
+ offset += chunkSize;
25
+ if (onProgress) {
26
+ onProgress(totalProcessed, totalCount);
27
+ }
28
+ // check if we've processed all records
29
+ if (result.rows.length < chunkSize) {
30
+ hasMore = false;
31
+ }
32
+ }
33
+ }
34
+ /**
35
+ * Update records in chunks with a transformer function
36
+ */
37
+ export async function updateInChunks(client, tableName, selectQuery, transformer, options = {}) {
38
+ let totalUpdated = 0;
39
+ await processInChunks(client, selectQuery, async (rows) => {
40
+ for (const row of rows) {
41
+ const updates = await transformer(row);
42
+ if (updates && Object.keys(updates).length > 0) {
43
+ // build update query dynamically
44
+ const setClause = Object.keys(updates)
45
+ .map((key, index) => `${key} = $${index + 2}`)
46
+ .join(', ');
47
+ const values = [row.id, ...Object.values(updates)];
48
+ await client.query(`UPDATE ${tableName} SET ${setClause} WHERE id = $1`, values);
49
+ totalUpdated++;
50
+ }
51
+ }
52
+ }, options);
53
+ return totalUpdated;
54
+ }
55
+ //# sourceMappingURL=chunkedQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunkedQuery.js","sourceRoot":"","sources":["../../src/takeout/chunkedQuery.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAkB,EAClB,KAAa,EACb,SAAuC,EACvC,UAA+B,EAAE;IAEjC,MAAM,EAAE,SAAS,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IAChD,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,IAAI,OAAO,GAAG,IAAI,CAAA;IAClB,IAAI,cAAc,GAAG,CAAC,CAAA;IAEtB,+CAA+C;IAC/C,MAAM,UAAU,GAAG,KAAK;SACrB,OAAO,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;SACjD,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAA;IAC7B,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAClD,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAEjE,OAAO,OAAO,EAAE,CAAC;QACf,MAAM,cAAc,GAAG,GAAG,KAAK,UAAU,SAAS,WAAW,MAAM,EAAE,CAAA;QACrE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAI,cAAc,CAAC,CAAA;QAEpD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,KAAK,CAAA;YACf,MAAK;QACP,CAAC;QAED,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAE5B,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAA;QACpC,MAAM,IAAI,SAAS,CAAA;QAEnB,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QACxC,CAAC;QAED,uCAAuC;QACvC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YACnC,OAAO,GAAG,KAAK,CAAA;QACjB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAkB,EAClB,SAAiB,EACjB,WAAmB,EACnB,WAAmD,EACnD,UAA+B,EAAE;IAEjC,IAAI,YAAY,GAAG,CAAC,CAAA;IAEpB,MAAM,eAAe,CACnB,MAAM,EACN,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAA;YAEtC,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/C,iCAAiC;gBACjC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;qBACnC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;qBAC7C,IAAI,CAAC,IAAI,CAAC,CAAA;gBAEb,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;gBAElD,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,SAAS,QAAQ,SAAS,gBAAgB,EAAE,MAAM,CAAC,CAAA;gBAEhF,YAAY,EAAE,CAAA;YAChB,CAAC;QACH,CAAC;IACH,CAAC,EACD,OAAO,CACR,CAAA;IAED,OAAO,YAAY,CAAA;AACrB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/takeout/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env node
2
+ import { join } from 'node:path';
3
+ import { defineCommand, runMain } from 'citty';
4
+ import { syncDrizzleMigrations } from './scripts/drizzle-migrations-sync.js';
5
+ import { addMigration } from './scripts/migration-add.js';
6
+ import { runPgDump } from './scripts/pg_dump.js';
7
+ import { runPsql } from './scripts/psql.js';
8
+ const syncDrizzle = defineCommand({
9
+ meta: {
10
+ name: 'sync-drizzle',
11
+ description: 'Sync Drizzle SQL migrations to TypeScript wrappers',
12
+ },
13
+ args: {
14
+ dir: {
15
+ type: 'string',
16
+ description: 'Migrations directory',
17
+ required: false,
18
+ default: './src/database/migrations',
19
+ },
20
+ },
21
+ async run({ args }) {
22
+ const migrationsDir = join(process.cwd(), args.dir);
23
+ console.info(`Syncing migrations in ${migrationsDir}`);
24
+ await syncDrizzleMigrations({ migrationsDir });
25
+ },
26
+ });
27
+ const migrationAdd = defineCommand({
28
+ meta: {
29
+ name: 'migrate:add',
30
+ description: 'Create a new custom TypeScript migration',
31
+ },
32
+ args: {
33
+ name: {
34
+ type: 'positional',
35
+ description: 'Migration name',
36
+ required: false,
37
+ },
38
+ dir: {
39
+ type: 'string',
40
+ description: 'Migrations directory',
41
+ required: false,
42
+ default: './src/database/migrations',
43
+ },
44
+ },
45
+ async run({ args }) {
46
+ const migrationsDir = join(process.cwd(), args.dir);
47
+ addMigration({ migrationsDir, name: args.name });
48
+ },
49
+ });
50
+ const psql = defineCommand({
51
+ meta: {
52
+ name: 'psql',
53
+ description: 'Connect to PostgreSQL database with psql',
54
+ },
55
+ args: {
56
+ connectionString: {
57
+ type: 'string',
58
+ description: 'PostgreSQL connection string',
59
+ required: false,
60
+ },
61
+ query: {
62
+ type: 'string',
63
+ description: 'Query to execute',
64
+ required: false,
65
+ },
66
+ },
67
+ async run({ args }) {
68
+ const connectionString = args.connectionString || process.env.ZERO_UPSTREAM_DB;
69
+ if (!connectionString) {
70
+ console.error('No connection string provided. Set ZERO_UPSTREAM_DB or pass --connectionString');
71
+ process.exit(1);
72
+ }
73
+ const exitCode = runPsql({ connectionString, query: args.query });
74
+ process.exit(exitCode || 0);
75
+ },
76
+ });
77
+ const pgDump = defineCommand({
78
+ meta: {
79
+ name: 'pg_dump',
80
+ description: 'Dump PostgreSQL database using pg_dump',
81
+ },
82
+ args: {
83
+ connectionString: {
84
+ type: 'string',
85
+ description: 'PostgreSQL connection string',
86
+ required: false,
87
+ },
88
+ },
89
+ async run({ args }) {
90
+ const connectionString = args.connectionString || process.env.ZERO_UPSTREAM_DB;
91
+ if (!connectionString) {
92
+ console.error('No connection string provided. Set ZERO_UPSTREAM_DB or pass --connectionString');
93
+ process.exit(1);
94
+ }
95
+ const cliArgs = process.argv.slice(3); // get args after command name
96
+ const exitCode = runPgDump({ connectionString, args: cliArgs });
97
+ process.exit(exitCode || 0);
98
+ },
99
+ });
100
+ const main = defineCommand({
101
+ meta: {
102
+ name: 'database',
103
+ description: 'Database utilities and migration tools',
104
+ version: '0.0.1',
105
+ },
106
+ subCommands: {
107
+ 'sync-drizzle': syncDrizzle,
108
+ 'migrate:add': migrationAdd,
109
+ psql,
110
+ pg_dump: pgDump,
111
+ },
112
+ });
113
+ runMain(main);
114
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/takeout/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { type CreatePoolOptions } from './createPool.js';
2
+ import { getDBClient } from './getDBClient.js';
3
+ import { type SeedDefinition, type TriggerDefinition } from './zero.js';
4
+ import type { AnyRelations, EmptyRelations } from 'drizzle-orm';
5
+ import type { Pool } from 'pg';
6
+ export type DatabaseConfig<TSchema extends Record<string, unknown>, TRelations extends AnyRelations | Record<string, unknown> = EmptyRelations> = {
7
+ /**
8
+ * The PG connection string. Required unless a pre-built `pool` is provided
9
+ * (it is still used by `migrate()` / `waitForDatabase()`, which need a string).
10
+ */
11
+ connectionString?: string;
12
+ schema: TSchema;
13
+ relations?: TRelations;
14
+ /**
15
+ * Optional pre-built Pool-like client (e.g. a DoBackend-backed Pool for the
16
+ * Cloudflare Durable Object runtime, where there is no external Postgres).
17
+ * When provided, `createPool` is skipped and this pool is used directly.
18
+ * `connectionString` is then only needed for the migration helpers.
19
+ */
20
+ pool?: Pool;
21
+ /** Options forwarded to the default `createPool` (ignored when `pool` is set). */
22
+ poolOptions?: Omit<CreatePoolOptions, 'connectionString'>;
23
+ zero?: {
24
+ publicationName: string;
25
+ publicTables: string[];
26
+ triggers?: TriggerDefinition[];
27
+ seeds?: SeedDefinition[];
28
+ };
29
+ };
30
+ export type MigrateOptions = {
31
+ migrations: Record<string, () => Promise<unknown>>;
32
+ cvrDb?: string;
33
+ changeDb?: string;
34
+ createDatabases?: string[];
35
+ gitSha?: string;
36
+ defaultTimeout?: number;
37
+ onMigrationComplete?: () => Promise<void>;
38
+ };
39
+ export declare function createDatabase<TSchema extends Record<string, unknown>, TRelations extends AnyRelations = EmptyRelations>(config: DatabaseConfig<TSchema, TRelations>): {
40
+ pool: Pool;
41
+ drizzle: import("drizzle-orm/node-postgres").NodePgDatabase<TSchema, TRelations & import("drizzle-orm").TablesRelationalConfig> & import("./createDrizzle.js").DrizzleHelpers<TSchema, import("drizzle-orm/node-postgres").NodePgDatabase<TSchema, TRelations & import("drizzle-orm").TablesRelationalConfig>>;
42
+ sql: (strings: TemplateStringsArray, ...values: any[]) => Promise<import("pg").QueryResult>;
43
+ getDBClient: (options?: Omit<import("./getDBClient.js").GetDBClientOptions, "pool" | "connectionString">) => ReturnType<typeof getDBClient>;
44
+ close: () => Promise<void>;
45
+ migrate: (options: MigrateOptions) => Promise<void>;
46
+ privateTableNames: string[];
47
+ config: DatabaseConfig<TSchema, TRelations>;
48
+ };
49
+ //# sourceMappingURL=createDatabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDatabase.d.ts","sourceRoot":"","sources":["../../src/takeout/createDatabase.ts"],"names":[],"mappings":"AAIA,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAG9C,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACvB,MAAM,WAAW,CAAA;AAElB,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAE9B,MAAM,MAAM,cAAc,CACxB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,UAAU,SAAS,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,IACxE;IACF;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,kFAAkF;IAClF,WAAW,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAA;IACzD,IAAI,CAAC,EAAE;QACL,eAAe,EAAE,MAAM,CAAA;QACvB,YAAY,EAAE,MAAM,EAAE,CAAA;QACtB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAA;QAC9B,KAAK,CAAC,EAAE,cAAc,EAAE,CAAA;KACzB,CAAA;CACF,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IAClD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1C,CAAA;AAOD,wBAAgB,cAAc,CAC5B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,UAAU,SAAS,YAAY,GAAG,cAAc,EAChD,MAAM,EAAE,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC;;;;;;uBAmCR,cAAc;;;EA6DlD"}
@@ -0,0 +1,100 @@
1
+ import { getTableName } from 'drizzle-orm';
2
+ import { PgTable } from 'drizzle-orm/pg-core';
3
+ import { createDrizzle } from './createDrizzle.js';
4
+ import { createPool } from './createPool.js';
5
+ import { createServerHelpers } from './createServerHelpers.js';
6
+ import { getDBClient } from './getDBClient.js';
7
+ import { migrate } from './migrate.js';
8
+ import { waitForDatabase } from './waitForDatabase.js';
9
+ import { ensureZeroPublication, ensureZeroSeeds, ensureZeroTriggers, } from './zero.js';
10
+ function stripQueryParams(connStr) {
11
+ if (!connStr)
12
+ return connStr;
13
+ return connStr.split('?')[0];
14
+ }
15
+ export function createDatabase(config) {
16
+ const { connectionString, schema, relations, zero } = config;
17
+ // use a caller-provided pool (e.g. the Cloudflare DO-backed pool) when given;
18
+ // otherwise build the default real-pg pool from the connection string.
19
+ const pool = config.pool ??
20
+ createPool({
21
+ connectionString: connectionString ?? '',
22
+ ...config.poolOptions,
23
+ });
24
+ const drizzle = createDrizzle({
25
+ pool,
26
+ schema,
27
+ relations: relations,
28
+ });
29
+ const { sql, getDBClient: getBoundDBClient } = createServerHelpers(pool);
30
+ const allTableNames = Object.values(schema)
31
+ .filter((v) => v instanceof PgTable)
32
+ .map((t) => getTableName(t));
33
+ const publicTableSet = new Set(zero?.publicTables || []);
34
+ const privateTableNames = allTableNames.filter((n) => !publicTableSet.has(n));
35
+ async function close() {
36
+ try {
37
+ await pool.end();
38
+ }
39
+ catch (e) {
40
+ console.error('[database] error closing:', e);
41
+ }
42
+ }
43
+ async function runMigrate(options) {
44
+ if (!connectionString) {
45
+ throw new Error('createDatabase: migrate() requires a `connectionString` (it is not derivable from a pre-built `pool`)');
46
+ }
47
+ console.info('[database] waiting for database to be ready...');
48
+ await waitForDatabase(connectionString);
49
+ console.info('[database] running migrations...');
50
+ await migrate({
51
+ connectionString,
52
+ migrations: options.migrations,
53
+ cvrDb: stripQueryParams(options.cvrDb),
54
+ changeDb: stripQueryParams(options.changeDb),
55
+ createDatabases: options.createDatabases,
56
+ gitSha: options.gitSha,
57
+ defaultTimeout: options.defaultTimeout,
58
+ onMigrationComplete: async () => {
59
+ if (zero) {
60
+ await ensureZeroPublication({
61
+ connectionString,
62
+ publicationName: zero.publicationName,
63
+ privateTableNames,
64
+ });
65
+ if (zero.triggers?.length || zero.seeds?.length) {
66
+ const client = await getDBClient({ connectionString });
67
+ try {
68
+ if (zero.triggers?.length) {
69
+ await ensureZeroTriggers(client, zero.triggers);
70
+ }
71
+ if (zero.seeds?.length) {
72
+ await ensureZeroSeeds(client, zero.seeds);
73
+ }
74
+ }
75
+ finally {
76
+ client.release();
77
+ }
78
+ }
79
+ }
80
+ if (options.onMigrationComplete) {
81
+ await options.onMigrationComplete();
82
+ }
83
+ },
84
+ });
85
+ console.info('[database] migrations complete');
86
+ await close();
87
+ process.exit(0);
88
+ }
89
+ return {
90
+ pool,
91
+ drizzle,
92
+ sql,
93
+ getDBClient: getBoundDBClient,
94
+ close,
95
+ migrate: runMigrate,
96
+ privateTableNames,
97
+ config,
98
+ };
99
+ }
100
+ //# sourceMappingURL=createDatabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDatabase.js","sourceRoot":"","sources":["../../src/takeout/createDatabase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type NodePgDatabase } from 'drizzle-orm/node-postgres';
2
+ export declare const createDb: <TSchema extends Record<string, unknown>>(connectionString: string, schema: TSchema) => NodePgDatabase<TSchema>;
3
+ //# sourceMappingURL=createDb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDb.d.ts","sourceRoot":"","sources":["../../src/takeout/createDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAW,MAAM,2BAA2B,CAAA;AAIxE,eAAO,MAAM,QAAQ,GAAI,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,kBAAkB,MAAM,EACxB,QAAQ,OAAO,KACd,cAAc,CAAC,OAAO,CAOxB,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { drizzle } from 'drizzle-orm/node-postgres';
2
+ import { createPool } from './createPool.js';
3
+ export const createDb = (connectionString, schema) => {
4
+ const pool = createPool({ connectionString });
5
+ return drizzle({
6
+ client: pool,
7
+ schema: schema,
8
+ logger: false,
9
+ });
10
+ };
11
+ //# sourceMappingURL=createDb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDb.js","sourceRoot":"","sources":["../../src/takeout/createDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAExE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,gBAAwB,EACxB,MAAe,EACU,EAAE;IAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAA;IAC7C,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,MAAiC;QACzC,MAAM,EAAE,KAAK;KACP,CAAuC,CAAA;AACjD,CAAC,CAAA"}
@@ -0,0 +1,38 @@
1
+ import { type NodePgDatabase } from 'drizzle-orm/node-postgres';
2
+ import type { AnyRelations, EmptyRelations, InferInsertModel, SQL } from 'drizzle-orm';
3
+ import type { PgTable } from 'drizzle-orm/pg-core';
4
+ import type { Pool } from 'pg';
5
+ declare const operators: {
6
+ readonly eq: import("drizzle-orm").BinaryOperator;
7
+ readonly ne: import("drizzle-orm").BinaryOperator;
8
+ readonly lt: import("drizzle-orm").BinaryOperator;
9
+ readonly lte: import("drizzle-orm").BinaryOperator;
10
+ readonly gt: import("drizzle-orm").BinaryOperator;
11
+ readonly gte: import("drizzle-orm").BinaryOperator;
12
+ };
13
+ type Op = keyof typeof operators;
14
+ type WhereOp = Partial<Record<Op, any>>;
15
+ type WhereValue = string | number | boolean | null | WhereOp;
16
+ type WithSQL<T> = {
17
+ [K in keyof T]: T[K] | SQL;
18
+ };
19
+ type TableName<TSchema> = {
20
+ [K in keyof TSchema]: TSchema[K] extends PgTable ? K : never;
21
+ }[keyof TSchema];
22
+ type WhereClause<TSchema, T extends TableName<TSchema>> = Partial<Record<keyof InferInsertModel<TSchema[T] extends PgTable ? TSchema[T] : never> & string, WhereValue>>;
23
+ type InsertMap<TSchema> = {
24
+ [K in TableName<TSchema>]: Partial<WithSQL<InferInsertModel<TSchema[K] extends PgTable ? TSchema[K] : never>>>;
25
+ };
26
+ export type CreateDrizzleOptions<TSchema extends Record<string, unknown>, TRelations extends AnyRelations = EmptyRelations> = {
27
+ pool: Pool;
28
+ schema: TSchema;
29
+ relations?: TRelations;
30
+ };
31
+ export type DrizzleHelpers<TSchema extends Record<string, unknown> = Record<string, unknown>, TDb extends NodePgDatabase<any, any> = NodePgDatabase<TSchema>> = {
32
+ insertRow<T extends TableName<TSchema>>(tableName: T, values: InsertMap<TSchema>[T]): ReturnType<ReturnType<TDb['insert']>['values']>;
33
+ updateRow<T extends TableName<TSchema>>(tableName: T, where: WhereClause<TSchema, T>, set: InsertMap<TSchema>[T]): ReturnType<ReturnType<ReturnType<TDb['update']>['set']>['where']>;
34
+ deleteRow<T extends TableName<TSchema>>(tableName: T, where: WhereClause<TSchema, T>): ReturnType<ReturnType<TDb['delete']>['where']>;
35
+ };
36
+ export declare function createDrizzle<TSchema extends Record<string, unknown>, TRelations extends AnyRelations = EmptyRelations>(options: CreateDrizzleOptions<TSchema, TRelations>): NodePgDatabase<TSchema, TRelations> & DrizzleHelpers<TSchema, NodePgDatabase<TSchema, TRelations>>;
37
+ export {};
38
+ //# sourceMappingURL=createDrizzle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDrizzle.d.ts","sourceRoot":"","sources":["../../src/takeout/createDrizzle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { and, eq, gt, gte, lt, lte, ne } from 'drizzle-orm';
2
+ import { drizzle } from 'drizzle-orm/node-postgres';
3
+ import { PgTimestampString } from 'drizzle-orm/pg-core';
4
+ let patched = false;
5
+ function patchTimestampForZero() {
6
+ if (patched)
7
+ return;
8
+ patched = true;
9
+ const orig = PgTimestampString.prototype.mapToDriverValue;
10
+ PgTimestampString.prototype.mapToDriverValue = function (value) {
11
+ if (typeof value === 'number')
12
+ return new Date(value).toISOString();
13
+ return orig.call(this, value);
14
+ };
15
+ }
16
+ const operators = { eq, ne, lt, lte, gt, gte };
17
+ function resolveWhere(table, where) {
18
+ const conditions = Object.entries(where).map(([key, value]) => {
19
+ if (value !== null && typeof value === 'object') {
20
+ const entries = Object.entries(value);
21
+ if (entries.length === 1) {
22
+ return operators[entries[0][0]](table[key], entries[0][1]);
23
+ }
24
+ return and(...entries.map(([op, v]) => operators[op](table[key], v)));
25
+ }
26
+ return eq(table[key], value);
27
+ });
28
+ return conditions.length === 1 ? conditions[0] : and(...conditions);
29
+ }
30
+ export function createDrizzle(options) {
31
+ patchTimestampForZero();
32
+ // drizzle v1 overloads don't support generic schema+relations together at the call site
33
+ const instance = drizzle({
34
+ client: options.pool,
35
+ schema: options.schema,
36
+ relations: options.relations,
37
+ logger: process.env.DEBUG_SQL === '1',
38
+ });
39
+ const helpers = {
40
+ insertRow(tableName, values) {
41
+ const table = options.schema[tableName];
42
+ return instance.insert(table).values(values);
43
+ },
44
+ updateRow(tableName, where, set) {
45
+ const table = options.schema[tableName];
46
+ return instance
47
+ .update(table)
48
+ .set(set)
49
+ .where(resolveWhere(table, where));
50
+ },
51
+ deleteRow(tableName, where) {
52
+ const table = options.schema[tableName];
53
+ return instance
54
+ .delete(table)
55
+ .where(resolveWhere(table, where));
56
+ },
57
+ };
58
+ return Object.assign(instance, helpers);
59
+ }
60
+ //# sourceMappingURL=createDrizzle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDrizzle.js","sourceRoot":"","sources":["../../src/takeout/createDrizzle.ts"],"names":[],"mappings":"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"}