@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,22 @@
1
+ // standardized demo/world seed applier — the one mechanism every runtime uses
2
+ // to apply a project's database/seed.ts rows after migrations: pg via the
3
+ // --seed flag on database/migrate.ts, and the browser preview worker (PGlite)
4
+ // at cold boot. same rows, same insert semantics, only the client differs.
5
+ const quote = (id) => `"${id.replaceAll('"', '""')}"`;
6
+ // INSERT ... ON CONFLICT DO NOTHING per row, tables in key order. idempotent
7
+ // by construction: deterministic seed ids make re-application a no-op and a
8
+ // grown seed set back-fills only the missing rows. undefined columns are
9
+ // omitted so they fall to the DB default.
10
+ export async function applySeed(client, rows) {
11
+ for (const [table, tableRows] of Object.entries(rows)) {
12
+ for (const row of tableRows) {
13
+ const columns = Object.keys(row).filter((key) => row[key] !== undefined);
14
+ if (columns.length === 0)
15
+ continue;
16
+ const values = columns.map((key) => row[key]);
17
+ const placeholders = columns.map((_, i) => `$${i + 1}`).join(', ');
18
+ await client.query(`INSERT INTO ${quote(table)} (${columns.map(quote).join(', ')}) VALUES (${placeholders}) ON CONFLICT DO NOTHING`, values);
19
+ }
20
+ }
21
+ }
22
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/takeout/seed.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,0EAA0E;AAC1E,8EAA8E;AAC9E,2EAA2E;AAsB3E,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAA;AAE7D,6EAA6E;AAC7E,4EAA4E;AAC5E,yEAAyE;AACzE,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAkB,EAAE,IAAc;IAChE,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAA;YACxE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAQ;YAClC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;YAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAClE,MAAM,MAAM,CAAC,KAAK,CAChB,eAAe,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,YAAY,0BAA0B,EAChH,MAAM,CACP,CAAA;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Pool, QueryResult } from 'pg';
2
+ export type SqlQuery = {
3
+ text: string;
4
+ values: any[];
5
+ };
6
+ export declare const createSql: (pool: Pool) => (strings: TemplateStringsArray, ...values: any[]) => Promise<QueryResult>;
7
+ export declare const setDefaultPool: (pool: Pool) => void;
8
+ export declare const sql: (strings: TemplateStringsArray, ...values: any[]) => Promise<QueryResult>;
9
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/takeout/sql.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,IAAI,CAAA;AAE3C,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,GAAG,EAAE,CAAA;CACd,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,MAAM,IAAI,MAC1B,SAAS,oBAAoB,EAAE,GAAG,QAAQ,GAAG,EAAE,KAAG,OAAO,CAAC,WAAW,CAW9E,CAAA;AAKD,eAAO,MAAM,cAAc,GAAI,MAAM,IAAI,SAExC,CAAA;AAED,eAAO,MAAM,GAAG,GACd,SAAS,oBAAoB,EAC7B,GAAG,QAAQ,GAAG,EAAE,KACf,OAAO,CAAC,WAAW,CAKrB,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { ellipsis } from '@o/helpers';
2
+ export const createSql = (pool) => {
3
+ return (strings, ...values) => {
4
+ const text = strings.reduce((result, str, i) => {
5
+ return result + str + (i < values.length ? `$${i + 1}` : '');
6
+ }, '');
7
+ if (process.env.DEBUG) {
8
+ console.info(`sql: ${ellipsis(text, 80)}`);
9
+ }
10
+ return pool.query(text.trim(), values);
11
+ };
12
+ };
13
+ // default export for backward compatibility
14
+ let defaultPool = null;
15
+ export const setDefaultPool = (pool) => {
16
+ defaultPool = pool;
17
+ };
18
+ export const sql = (strings, ...values) => {
19
+ if (!defaultPool) {
20
+ throw new Error('No default pool set. Call setDefaultPool() first or use createSql()');
21
+ }
22
+ return createSql(defaultPool)(strings, ...values);
23
+ };
24
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/takeout/sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AASrC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAU,EAAE,EAAE;IACtC,OAAO,CAAC,OAA6B,EAAE,GAAG,MAAa,EAAwB,EAAE;QAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;YAC7C,OAAO,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC9D,CAAC,EAAE,EAAE,CAAC,CAAA;QAEN,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,QAAQ,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;QAC5C,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAA;IACxC,CAAC,CAAA;AACH,CAAC,CAAA;AAED,4CAA4C;AAC5C,IAAI,WAAW,GAAgB,IAAI,CAAA;AAEnC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAU,EAAE,EAAE;IAC3C,WAAW,GAAG,IAAI,CAAA;AACpB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,CACjB,OAA6B,EAC7B,GAAG,MAAa,EACM,EAAE;IACxB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAA;IACxF,CAAC;IACD,OAAO,SAAS,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAA;AACnD,CAAC,CAAA"}
@@ -0,0 +1,66 @@
1
+ import { type SqliteRemoteDatabase } from 'drizzle-orm/sqlite-proxy';
2
+ import type { Database } from 'bun:sqlite';
3
+ import type { AnyRelations, EmptyRelations } from 'drizzle-orm';
4
+ import type { SQLiteTable } from 'drizzle-orm/sqlite-core';
5
+ export type SqlStatementMetadata = {
6
+ table: string;
7
+ publicTable: string;
8
+ kind: 'delete' | 'insert' | 'update' | 'upsert';
9
+ };
10
+ export type SQLiteQueryFormat = {
11
+ relationships: Record<string, SQLiteQueryFormat>;
12
+ singular: boolean;
13
+ };
14
+ export type SQLiteExecResult = {
15
+ changes: number;
16
+ };
17
+ export type SQLiteStatement = {
18
+ sql: string;
19
+ params?: readonly unknown[];
20
+ metadata?: SqlStatementMetadata;
21
+ };
22
+ export type SQLiteTransactionExecutor = {
23
+ exec(sql: string, params?: readonly unknown[], metadata?: SqlStatementMetadata): SQLiteExecResult | Promise<SQLiteExecResult>;
24
+ /**
25
+ * every statement in one call to the storage owner, in order, as one
26
+ * atomic step. a remote owner holds its writer across each round trip, so a
27
+ * list sent one statement at a time holds it for the whole exchange.
28
+ */
29
+ execMany(statements: readonly SQLiteStatement[]): SQLiteExecResult[] | Promise<SQLiteExecResult[]>;
30
+ query<Row extends Record<string, unknown> = Record<string, unknown>>(sql: string, params?: readonly unknown[]): Row[] | Promise<Row[]>;
31
+ queryAst<Result = unknown>(ast: unknown, format: SQLiteQueryFormat, queryName?: string): Result | Promise<Result>;
32
+ };
33
+ export type SQLiteTransactionProvider = <Value>(work: (executor: SQLiteTransactionExecutor) => Value | Promise<Value>) => Promise<Value>;
34
+ export type SQLiteSchema = Record<string, SQLiteTable>;
35
+ export type CreateSQLiteDatabaseOptions<TSchema extends SQLiteSchema, TRelations extends AnyRelations = EmptyRelations> = {
36
+ schema: TSchema;
37
+ relations?: TRelations;
38
+ transactionProvider: SQLiteTransactionProvider;
39
+ };
40
+ export type SQLiteDatabaseTransaction<TSchema extends SQLiteSchema, TRelations extends AnyRelations> = {
41
+ executor: SQLiteTransactionExecutor;
42
+ drizzle: SqliteRemoteDatabase<TSchema, TRelations>;
43
+ };
44
+ export type SQLiteDatabase<TSchema extends SQLiteSchema, TRelations extends AnyRelations> = {
45
+ transaction<Value>(work: (transaction: SQLiteDatabaseTransaction<TSchema, TRelations>) => Value | Promise<Value>): Promise<Value>;
46
+ };
47
+ /**
48
+ * Creates Drizzle only after the storage owner has started its transaction.
49
+ * The sqlite-proxy driver is used solely to turn its query callbacks into
50
+ * typed Drizzle operations; it never owns BEGIN or COMMIT.
51
+ */
52
+ export declare function createSQLiteDatabase<TSchema extends SQLiteSchema, TRelations extends AnyRelations = EmptyRelations>(options: CreateSQLiteDatabaseOptions<TSchema, TRelations>): SQLiteDatabase<TSchema, TRelations>;
53
+ export declare function createSQLiteDrizzle<TSchema extends SQLiteSchema, TRelations extends AnyRelations = EmptyRelations>(executor: SQLiteTransactionExecutor, options: Pick<CreateSQLiteDatabaseOptions<TSchema, TRelations>, 'relations' | 'schema'>): SqliteRemoteDatabase<TSchema, TRelations>;
54
+ export type CreateBunSQLiteExecutorOptions = {
55
+ database: Database;
56
+ queryAst<Result = unknown>(ast: unknown, format: SQLiteQueryFormat, queryName?: string): Result | Promise<Result>;
57
+ };
58
+ export declare function createBunSQLiteExecutor({ database, queryAst, }: CreateBunSQLiteExecutorOptions): SQLiteTransactionExecutor;
59
+ export type CreateBunSQLiteTransactionProviderOptions = CreateBunSQLiteExecutorOptions;
60
+ /**
61
+ * Bun's synchronous driver needs its own native transaction boundary. Remote
62
+ * and Durable Object hosts pass their protected callback directly to
63
+ * createSQLiteDatabase instead.
64
+ */
65
+ export declare function createBunSQLiteTransactionProvider({ database, queryAst, }: CreateBunSQLiteTransactionProviderOptions): SQLiteTransactionProvider;
66
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/takeout/sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import { drizzle } from 'drizzle-orm/sqlite-proxy';
3
+ /**
4
+ * Creates Drizzle only after the storage owner has started its transaction.
5
+ * The sqlite-proxy driver is used solely to turn its query callbacks into
6
+ * typed Drizzle operations; it never owns BEGIN or COMMIT.
7
+ */
8
+ export function createSQLiteDatabase(options) {
9
+ return {
10
+ transaction(work) {
11
+ return options.transactionProvider(async (executor) => work({
12
+ executor,
13
+ drizzle: createSQLiteDrizzle(executor, options),
14
+ }));
15
+ },
16
+ };
17
+ }
18
+ export function createSQLiteDrizzle(executor, options) {
19
+ return drizzle(async (sql, params, method) => {
20
+ if (method === 'run') {
21
+ const result = await executor.exec(sql, params);
22
+ return { changes: result.changes, rows: [] };
23
+ }
24
+ const rows = await executor.query(sql, params);
25
+ if (method === 'get') {
26
+ const row = rows[0];
27
+ return remoteRows(row ? rowValues(row) : undefined);
28
+ }
29
+ return remoteRows(rows.map(rowValues));
30
+ }, {
31
+ schema: options.schema,
32
+ relations: options.relations,
33
+ });
34
+ }
35
+ export function createBunSQLiteExecutor({ database, queryAst, }) {
36
+ return {
37
+ exec(sql, params = []) {
38
+ const result = database.prepare(sql).run(...bunBindings(params));
39
+ return { changes: result.changes };
40
+ },
41
+ execMany(statements) {
42
+ return statements.map(({ sql, params = [] }) => ({
43
+ changes: database.prepare(sql).run(...bunBindings(params)).changes,
44
+ }));
45
+ },
46
+ query(sql, params = []) {
47
+ return database.prepare(sql).all(...bunBindings(params));
48
+ },
49
+ queryAst,
50
+ };
51
+ }
52
+ /**
53
+ * Bun's synchronous driver needs its own native transaction boundary. Remote
54
+ * and Durable Object hosts pass their protected callback directly to
55
+ * createSQLiteDatabase instead.
56
+ */
57
+ export function createBunSQLiteTransactionProvider({ database, queryAst, }) {
58
+ const executor = createBunSQLiteExecutor({ database, queryAst });
59
+ const transactionContext = new AsyncLocalStorage();
60
+ let tail = Promise.resolve();
61
+ return async (work) => {
62
+ if (transactionContext.getStore()) {
63
+ throw new Error('nested SQLite transactions are not supported');
64
+ }
65
+ // keep the native connection's transaction state exclusive across awaits.
66
+ const previous = tail;
67
+ let release;
68
+ tail = new Promise((resolve) => {
69
+ release = resolve;
70
+ });
71
+ await previous;
72
+ try {
73
+ return await transactionContext.run(true, async () => {
74
+ let began = false;
75
+ try {
76
+ database.exec('BEGIN');
77
+ began = true;
78
+ const value = await work(executor);
79
+ database.exec('COMMIT');
80
+ began = false;
81
+ return value;
82
+ }
83
+ catch (error) {
84
+ if (began)
85
+ database.exec('ROLLBACK');
86
+ throw error;
87
+ }
88
+ });
89
+ }
90
+ finally {
91
+ release();
92
+ }
93
+ };
94
+ }
95
+ function rowValues(row) {
96
+ return Object.values(row);
97
+ }
98
+ function remoteRows(rows) {
99
+ // Drizzle's sqlite-proxy declaration requires an array even though its get()
100
+ // implementation recognizes an absent row. Keep that transport mismatch at
101
+ // this one adapter boundary rather than turning a missing row into one full
102
+ // of undefined column values.
103
+ return { rows: rows };
104
+ }
105
+ function bunBindings(params) {
106
+ // on-zero accepts unknown bindings so every native provider can expose one
107
+ // structural contract. Bun validates these at its typed boundary.
108
+ return params;
109
+ }
110
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/takeout/sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function waitForDatabase(connectionString: string, maxRetries?: number): Promise<void>;
2
+ //# sourceMappingURL=waitForDatabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waitForDatabase.d.ts","sourceRoot":"","sources":["../../src/takeout/waitForDatabase.ts"],"names":[],"mappings":"AAEA,wBAAsB,eAAe,CAAC,gBAAgB,EAAE,MAAM,EAAE,UAAU,SAAK,iBAwB9E"}
@@ -0,0 +1,26 @@
1
+ import pg from 'pg';
2
+ export async function waitForDatabase(connectionString, maxRetries = 30) {
3
+ for (let i = 0; i < maxRetries; i++) {
4
+ try {
5
+ const client = new pg.Client({
6
+ connectionString,
7
+ connectionTimeoutMillis: 5_000,
8
+ ssl: connectionString.includes('sslmode=require')
9
+ ? { rejectUnauthorized: false }
10
+ : undefined,
11
+ });
12
+ await client.connect();
13
+ await client.query('SELECT 1');
14
+ await client.end();
15
+ console.info('[database] connection successful');
16
+ return;
17
+ }
18
+ catch {
19
+ const delay = Math.min(1000 * 1.5 ** i, 10000);
20
+ console.info(`[database] waiting... attempt ${i + 1}/${maxRetries} (retry in ${delay}ms)`);
21
+ await new Promise((resolve) => setTimeout(resolve, delay));
22
+ }
23
+ }
24
+ throw new Error('database connection timeout after ' + maxRetries + ' attempts');
25
+ }
26
+ //# sourceMappingURL=waitForDatabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waitForDatabase.js","sourceRoot":"","sources":["../../src/takeout/waitForDatabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AAEnB,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,gBAAwB,EAAE,UAAU,GAAG,EAAE;IAC7E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC;gBAC3B,gBAAgB;gBAChB,uBAAuB,EAAE,KAAK;gBAC9B,GAAG,EAAE,gBAAgB,CAAC,QAAQ,CAAC,iBAAiB,CAAC;oBAC/C,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE;oBAC/B,CAAC,CAAC,SAAS;aACd,CAAC,CAAA;YACF,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;YACtB,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YAC9B,MAAM,MAAM,CAAC,GAAG,EAAE,CAAA;YAClB,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;YAChD,OAAM;QACR,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;YAC9C,OAAO,CAAC,IAAI,CACV,iCAAiC,CAAC,GAAG,CAAC,IAAI,UAAU,cAAc,KAAK,KAAK,CAC7E,CAAA;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,UAAU,GAAG,WAAW,CAAC,CAAA;AAClF,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { PoolClient } from 'pg';
2
+ export type ZeroPublicationOptions = {
3
+ connectionString: string;
4
+ /** zero publication name, e.g. 'zero_takeout' or 'zero_chat' */
5
+ publicationName: string;
6
+ /** table names excluded from publication (private/auth tables) */
7
+ privateTableNames: string[];
8
+ };
9
+ export declare function ensureZeroPublication(options: ZeroPublicationOptions): Promise<void>;
10
+ export type ZeroDatabaseOptions = {
11
+ connectionString: string;
12
+ cvrDb?: string;
13
+ changeDb?: string;
14
+ };
15
+ export declare function ensureZeroDatabases(options: ZeroDatabaseOptions): Promise<void>;
16
+ export type TriggerDefinition = {
17
+ name: string;
18
+ sql: string;
19
+ };
20
+ export declare function defineTrigger(name: string, sql: string): TriggerDefinition;
21
+ /** load trigger definitions from a glob result (import.meta.glob or loadTriggersFromDir) */
22
+ export declare function loadTriggers(glob: Record<string, () => Promise<unknown>>): Promise<TriggerDefinition[]>;
23
+ export declare function ensureZeroTriggers(client: PoolClient, triggers: TriggerDefinition[]): Promise<void>;
24
+ export type SeedDefinition = {
25
+ name: string;
26
+ sql: string;
27
+ };
28
+ export declare function defineSeed(name: string, sql: string): SeedDefinition;
29
+ export declare function loadSeeds(glob: Record<string, () => Promise<unknown>>): Promise<SeedDefinition[]>;
30
+ export declare function ensureZeroSeeds(client: PoolClient, seeds: SeedDefinition[]): Promise<void>;
31
+ export type InitSqlOptions = {
32
+ /** DDL statements (CREATE TABLE, etc.) */
33
+ ddl?: string;
34
+ triggers?: TriggerDefinition[];
35
+ seeds?: SeedDefinition[];
36
+ };
37
+ export declare function buildInitSql(options: InitSqlOptions): string;
38
+ /** wrap pgTable to mark tables as private (excluded from zero replication) */
39
+ export declare function privateTable<T extends (...args: any[]) => any>(createTable: T): T;
40
+ /** check if a table is marked as private */
41
+ export declare function isPrivateTable(table: unknown): boolean;
42
+ /** derive public table names from a schema (all tables not marked private) */
43
+ export declare function derivePublicTables(schema: Record<string, unknown>): string[];
44
+ //# sourceMappingURL=zero.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zero.d.ts","sourceRoot":"","sources":["../../src/takeout/zero.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAIpC,MAAM,MAAM,sBAAsB,GAAG;IACnC,gBAAgB,EAAE,MAAM,CAAA;IACxB,gEAAgE;IAChE,eAAe,EAAE,MAAM,CAAA;IACvB,kEAAkE;IAClE,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAC5B,CAAA;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,iBAqF1E;AAID,MAAM,MAAM,mBAAmB,GAAG;IAChC,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,iBAqBrE;AAID,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAE1E;AAED,4FAA4F;AAC5F,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,GAC3C,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAiB9B;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,iBAAiB,EAAE,iBAW9B;AAID,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,CAEpE;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,GAC3C,OAAO,CAAC,cAAc,EAAE,CAAC,CAiB3B;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,iBAUhF;AAKD,MAAM,MAAM,cAAc,GAAG;IAC3B,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAC9B,KAAK,CAAC,EAAE,cAAc,EAAE,CAAA;CACzB,CAAA;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAgB5D;AAMD,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,CAMjF;AAED,4CAA4C;AAC5C,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEtD;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAI5E"}
@@ -0,0 +1,177 @@
1
+ import { basename } from 'node:path';
2
+ import { getTableName } from 'drizzle-orm';
3
+ import { PgTable } from 'drizzle-orm/pg-core';
4
+ import { getDBClient } from './getDBClient.js';
5
+ export async function ensureZeroPublication(options) {
6
+ const { connectionString, publicationName, privateTableNames } = options;
7
+ const client = await getDBClient({ connectionString });
8
+ try {
9
+ const { rows: wanted } = await client.query(`SELECT tablename FROM pg_tables
10
+ WHERE schemaname = 'public'
11
+ AND tablename != ALL($1)
12
+ AND tablename NOT LIKE '_zero_%'
13
+ AND tablename != 'migrations'`, [privateTableNames]);
14
+ const wantedSet = new Set(wanted.map((r) => r.tablename));
15
+ if (!wantedSet.size) {
16
+ console.info(`[zero] no public tables found for ${publicationName} publication`);
17
+ return;
18
+ }
19
+ const { rows: pub } = await client.query(`SELECT 1 FROM pg_publication WHERE pubname = $1`, [publicationName]);
20
+ if (!pub.length) {
21
+ try {
22
+ const tableList = [...wantedSet].map((t) => `"${t}"`).join(', ');
23
+ await client.query(`CREATE PUBLICATION ${publicationName} FOR TABLE ${tableList}`);
24
+ console.info(`[zero] created publication ${publicationName} with ${wantedSet.size} tables`);
25
+ }
26
+ catch (e) {
27
+ if (e.code === '42710') {
28
+ console.info(`[zero] ${publicationName} publication was created concurrently, will sync`);
29
+ }
30
+ else {
31
+ console.warn(`[zero] could not create ${publicationName} publication: ${e.message}`);
32
+ return;
33
+ }
34
+ }
35
+ }
36
+ const { rows: current } = await client.query(`SELECT tablename FROM pg_publication_tables
37
+ WHERE pubname = $1 AND schemaname = 'public'`, [publicationName]);
38
+ const currentSet = new Set(current.map((r) => r.tablename));
39
+ const toRemove = [...currentSet].filter((t) => !wantedSet.has(t));
40
+ if (toRemove.length) {
41
+ const dropList = toRemove.map((t) => `"${t}"`).join(', ');
42
+ await client.query(`ALTER PUBLICATION ${publicationName} DROP TABLE ${dropList}`);
43
+ console.info(`[zero] removed from ${publicationName}: ${dropList}`);
44
+ }
45
+ const toAdd = [...wantedSet].filter((t) => !currentSet.has(t));
46
+ const added = [];
47
+ for (const table of toAdd) {
48
+ try {
49
+ await client.query(`ALTER PUBLICATION ${publicationName} ADD TABLE "${table}"`);
50
+ added.push(table);
51
+ }
52
+ catch (e) {
53
+ if (e.code !== '42710')
54
+ throw e;
55
+ }
56
+ }
57
+ if (added.length) {
58
+ console.info(`[zero] added to ${publicationName}: ${added.map((t) => `"${t}"`).join(', ')}`);
59
+ }
60
+ if (!toRemove.length && !added.length) {
61
+ console.info(`[zero] ${publicationName} publication is up to date (${currentSet.size} tables)`);
62
+ }
63
+ }
64
+ finally {
65
+ client.release();
66
+ }
67
+ }
68
+ export async function ensureZeroDatabases(options) {
69
+ const { connectionString, cvrDb, changeDb } = options;
70
+ if (!cvrDb && !changeDb)
71
+ return;
72
+ const client = await getDBClient({ connectionString });
73
+ try {
74
+ const dbNames = [basename(cvrDb || ''), basename(changeDb || '')].filter(Boolean);
75
+ for (const name of dbNames) {
76
+ const { rows } = await client.query(`SELECT 1 FROM pg_database WHERE datname = '${name}'`);
77
+ if (!rows.length) {
78
+ await client.query(`CREATE DATABASE ${name};`);
79
+ console.info(`[zero] created database ${name}`);
80
+ }
81
+ }
82
+ }
83
+ finally {
84
+ client.release();
85
+ }
86
+ }
87
+ export function defineTrigger(name, sql) {
88
+ return { name, sql };
89
+ }
90
+ /** load trigger definitions from a glob result (import.meta.glob or loadTriggersFromDir) */
91
+ export async function loadTriggers(glob) {
92
+ const triggers = [];
93
+ for (const [path, load] of Object.entries(glob).sort(([a], [b]) => a.localeCompare(b))) {
94
+ const mod = (await load());
95
+ if (mod.default) {
96
+ triggers.push(mod.default);
97
+ }
98
+ else if (mod.sql) {
99
+ triggers.push({ name: mod.name || basename(path, '.ts'), sql: mod.sql });
100
+ }
101
+ }
102
+ return triggers;
103
+ }
104
+ export async function ensureZeroTriggers(client, triggers) {
105
+ for (const trigger of triggers) {
106
+ try {
107
+ await client.query(trigger.sql);
108
+ }
109
+ catch (err) {
110
+ console.error(`[zero] failed to apply trigger ${trigger.name}:`, err);
111
+ throw err;
112
+ }
113
+ }
114
+ console.info(`[zero] applied ${triggers.length} trigger definitions`);
115
+ }
116
+ export function defineSeed(name, sql) {
117
+ return { name, sql };
118
+ }
119
+ export async function loadSeeds(glob) {
120
+ const seeds = [];
121
+ for (const [path, load] of Object.entries(glob).sort(([a], [b]) => a.localeCompare(b))) {
122
+ const mod = (await load());
123
+ if (mod.default) {
124
+ seeds.push(mod.default);
125
+ }
126
+ else if (mod.sql) {
127
+ seeds.push({ name: mod.name || basename(path, '.ts'), sql: mod.sql });
128
+ }
129
+ }
130
+ return seeds;
131
+ }
132
+ export async function ensureZeroSeeds(client, seeds) {
133
+ for (const seed of seeds) {
134
+ try {
135
+ await client.query(seed.sql);
136
+ }
137
+ catch (err) {
138
+ console.error(`[zero] failed to apply seed ${seed.name}:`, err);
139
+ throw err;
140
+ }
141
+ }
142
+ console.info(`[zero] applied ${seeds.length} seed definitions`);
143
+ }
144
+ export function buildInitSql(options) {
145
+ const parts = [];
146
+ if (options.ddl) {
147
+ parts.push(options.ddl);
148
+ }
149
+ if (options.triggers?.length) {
150
+ parts.push(...options.triggers.map((t) => `-- trigger: ${t.name}\n${t.sql}`));
151
+ }
152
+ if (options.seeds?.length) {
153
+ parts.push(...options.seeds.map((s) => `-- seed: ${s.name}\n${s.sql}`));
154
+ }
155
+ return parts.join('\n\n');
156
+ }
157
+ // --- schema helpers ---
158
+ const PRIVATE = Symbol.for('take-out/database/private');
159
+ /** wrap pgTable to mark tables as private (excluded from zero replication) */
160
+ export function privateTable(createTable) {
161
+ return ((...args) => {
162
+ const table = createTable(...args);
163
+ table[PRIVATE] = true;
164
+ return table;
165
+ });
166
+ }
167
+ /** check if a table is marked as private */
168
+ export function isPrivateTable(table) {
169
+ return !!(table && typeof table === 'object' && PRIVATE in table);
170
+ }
171
+ /** derive public table names from a schema (all tables not marked private) */
172
+ export function derivePublicTables(schema) {
173
+ return Object.values(schema)
174
+ .filter((v) => v instanceof PgTable && !isPrivateTable(v))
175
+ .map((t) => getTableName(t));
176
+ }
177
+ //# sourceMappingURL=zero.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zero.js","sourceRoot":"","sources":["../../src/takeout/zero.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@o/database",
3
- "version": "0.16.18",
3
+ "version": "0.16.19-canary.1790191946359",
4
4
  "description": "SQLite database helpers for Orez hosts: Drizzle over a host-owned transaction, a Better Auth adapter with read and write lanes, seed application, and private-table marking.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -33,12 +33,38 @@
33
33
  "types": "./dist/seed.d.ts",
34
34
  "import": "./dist/seed.js",
35
35
  "default": "./dist/seed.js"
36
+ },
37
+ "./postgres": {
38
+ "types": "./dist/takeout/index.d.ts",
39
+ "import": "./dist/takeout/index.js",
40
+ "default": "./dist/takeout/index.js"
41
+ },
42
+ "./postgres/*": {
43
+ "types": "./dist/takeout/*.d.ts",
44
+ "import": "./dist/takeout/*.js",
45
+ "default": "./dist/takeout/*.js"
46
+ },
47
+ "./scripts/*": {
48
+ "types": "./dist/takeout/scripts/*.d.ts",
49
+ "import": "./dist/takeout/scripts/*.js",
50
+ "default": "./dist/takeout/scripts/*.js"
51
+ },
52
+ "./postgres/helpers": {
53
+ "types": "./dist/takeout/index.d.ts",
54
+ "import": "./dist/takeout/index.js",
55
+ "default": "./dist/takeout/index.js"
56
+ },
57
+ "./*": {
58
+ "types": "./dist/takeout/*.d.ts",
59
+ "import": "./dist/takeout/*.js",
60
+ "default": "./dist/takeout/*.js"
36
61
  }
37
62
  },
38
63
  "files": [
39
64
  "dist",
40
65
  "LICENSE",
41
- "README.md"
66
+ "README.md",
67
+ "src/takeout"
42
68
  ],
43
69
  "scripts": {
44
70
  "build": "rm -rf dist && tsc -p tsconfig.build.json",
@@ -50,7 +76,9 @@
50
76
  },
51
77
  "peerDependencies": {
52
78
  "better-auth": ">=1.6.0 <2",
53
- "drizzle-orm": ">=1.0.0-beta.0 <2"
79
+ "drizzle-orm": ">=1.0.0-beta.0 <2",
80
+ "pg": "^8.16.3",
81
+ "vite": ">=5"
54
82
  },
55
83
  "devDependencies": {
56
84
  "@types/bun": "1.3.14",
@@ -58,9 +86,31 @@
58
86
  "drizzle-orm": "1.0.0-beta.9-e89174b",
59
87
  "oxfmt": "0.28.0",
60
88
  "oxlint": "1.43.0",
61
- "typescript": "5.9.3"
89
+ "typescript": "5.9.3",
90
+ "@types/pg": "^8.11.10"
62
91
  },
63
92
  "publishConfig": {
64
93
  "access": "public"
94
+ },
95
+ "dependencies": {
96
+ "@o/helpers": "0.16.19-canary.1790191946359",
97
+ "@types/async-retry": "1.4.9",
98
+ "async-retry": "^1.3.3",
99
+ "citty": "^0.1.6",
100
+ "@aws-sdk/client-s3": "^3.709.0"
101
+ },
102
+ "peerDependenciesMeta": {
103
+ "pg": {
104
+ "optional": true
105
+ },
106
+ "better-auth": {
107
+ "optional": true
108
+ },
109
+ "vite": {
110
+ "optional": true
111
+ }
112
+ },
113
+ "bin": {
114
+ "database": "./dist/takeout/cli.js"
65
115
  }
66
116
  }