@dotdo/postgres 0.1.2 → 0.1.3

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 (103) hide show
  1. package/README.md +73 -1
  2. package/dist/client/index.d.ts +47 -0
  3. package/dist/client/index.d.ts.map +1 -0
  4. package/dist/client/index.js +47 -0
  5. package/dist/client/index.js.map +1 -0
  6. package/dist/client/postgres-client.d.ts +273 -0
  7. package/dist/client/postgres-client.d.ts.map +1 -0
  8. package/dist/client/postgres-client.js +389 -0
  9. package/dist/client/postgres-client.js.map +1 -0
  10. package/dist/client/types.d.ts +167 -0
  11. package/dist/client/types.d.ts.map +1 -0
  12. package/dist/client/types.js +7 -0
  13. package/dist/client/types.js.map +1 -0
  14. package/dist/do/index.d.ts +18 -0
  15. package/dist/do/index.d.ts.map +1 -0
  16. package/dist/do/index.js +18 -0
  17. package/dist/do/index.js.map +1 -0
  18. package/dist/do/postgres.d.ts +110 -0
  19. package/dist/do/postgres.d.ts.map +1 -0
  20. package/dist/do/postgres.js +266 -0
  21. package/dist/do/postgres.js.map +1 -0
  22. package/dist/do/sql.d.ts +92 -0
  23. package/dist/do/sql.d.ts.map +1 -0
  24. package/dist/do/sql.js +204 -0
  25. package/dist/do/sql.js.map +1 -0
  26. package/dist/index.d.ts +25 -30
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +29 -30
  29. package/dist/index.js.map +1 -1
  30. package/dist/mcp/binding.d.ts +47 -0
  31. package/dist/mcp/binding.d.ts.map +1 -0
  32. package/dist/mcp/binding.js +183 -0
  33. package/dist/mcp/binding.js.map +1 -0
  34. package/dist/mcp/index.d.ts +92 -0
  35. package/dist/mcp/index.d.ts.map +1 -0
  36. package/dist/mcp/index.js +91 -0
  37. package/dist/mcp/index.js.map +1 -0
  38. package/dist/mcp/server.d.ts +62 -0
  39. package/dist/mcp/server.d.ts.map +1 -0
  40. package/dist/mcp/server.js +278 -0
  41. package/dist/mcp/server.js.map +1 -0
  42. package/dist/mcp/tools.d.ts +58 -0
  43. package/dist/mcp/tools.d.ts.map +1 -0
  44. package/dist/mcp/tools.js +356 -0
  45. package/dist/mcp/tools.js.map +1 -0
  46. package/dist/mcp/types.d.ts +139 -0
  47. package/dist/mcp/types.d.ts.map +1 -0
  48. package/dist/mcp/types.js +7 -0
  49. package/dist/mcp/types.js.map +1 -0
  50. package/dist/pglite/workers-pglite.d.ts +13 -4
  51. package/dist/pglite/workers-pglite.d.ts.map +1 -1
  52. package/dist/pglite/workers-pglite.js +110 -5
  53. package/dist/pglite/workers-pglite.js.map +1 -1
  54. package/dist/pglite-assets/pglite.data +0 -0
  55. package/dist/pglite-assets/pglite.wasm +0 -0
  56. package/dist/worker/background-pglite-manager.d.ts +243 -0
  57. package/dist/worker/background-pglite-manager.d.ts.map +1 -0
  58. package/dist/worker/background-pglite-manager.js +528 -0
  59. package/dist/worker/background-pglite-manager.js.map +1 -0
  60. package/dist/worker/do-pglite-manager.d.ts +77 -0
  61. package/dist/worker/do-pglite-manager.d.ts.map +1 -1
  62. package/dist/worker/do-pglite-manager.js +189 -12
  63. package/dist/worker/do-pglite-manager.js.map +1 -1
  64. package/dist/worker/index.d.ts +7 -1
  65. package/dist/worker/index.d.ts.map +1 -1
  66. package/dist/worker/index.js +19 -1
  67. package/dist/worker/index.js.map +1 -1
  68. package/dist/worker/lazy-pglite-manager.d.ts +242 -0
  69. package/dist/worker/lazy-pglite-manager.d.ts.map +1 -0
  70. package/dist/worker/lazy-pglite-manager.js +463 -0
  71. package/dist/worker/lazy-pglite-manager.js.map +1 -0
  72. package/package.json +16 -3
  73. package/src/client/index.ts +61 -0
  74. package/src/client/postgres-client.ts +442 -0
  75. package/src/client/types.ts +211 -0
  76. package/src/do/index.ts +18 -0
  77. package/src/do/postgres.ts +367 -0
  78. package/src/do/sql.ts +280 -0
  79. package/src/index.ts +50 -30
  80. package/src/mcp/binding.ts +236 -0
  81. package/src/mcp/index.ts +122 -0
  82. package/src/mcp/server.ts +361 -0
  83. package/src/mcp/tools.ts +464 -0
  84. package/src/mcp/types.ts +148 -0
  85. package/src/pglite/workers-pglite.ts +141 -12
  86. package/src/pglite-assets/pglite.data +0 -0
  87. package/src/pglite-assets/pglite.wasm +0 -0
  88. package/src/worker/background-pglite-manager.ts +680 -0
  89. package/src/worker/do-pglite-manager.ts +235 -19
  90. package/src/worker/index.ts +71 -1
  91. package/src/worker/lazy-pglite-manager.ts +595 -0
  92. package/dist/iceberg/duckdb-wasm.d.ts +0 -447
  93. package/dist/iceberg/duckdb-wasm.d.ts.map +0 -1
  94. package/dist/iceberg/duckdb-wasm.js +0 -600
  95. package/dist/iceberg/duckdb-wasm.js.map +0 -1
  96. package/dist/iceberg/test-fixtures.d.ts +0 -151
  97. package/dist/iceberg/test-fixtures.d.ts.map +0 -1
  98. package/dist/iceberg/test-fixtures.js +0 -446
  99. package/dist/iceberg/test-fixtures.js.map +0 -1
  100. package/dist/worker/__mocks__/cloudflare-workers.d.ts +0 -31
  101. package/dist/worker/__mocks__/cloudflare-workers.d.ts.map +0 -1
  102. package/dist/worker/__mocks__/cloudflare-workers.js +0 -33
  103. package/dist/worker/__mocks__/cloudflare-workers.js.map +0 -1
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Postgres Durable Object
3
+ *
4
+ * A PostgreSQL database running in a Cloudflare Durable Object with:
5
+ * - DO SQLite for durable persistence (survives evictions)
6
+ * - PGLite for full PostgreSQL features (arrays, JSON, window functions, etc.)
7
+ * - Automatic sync between the two layers
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { sql, Postgres } from '@dotdo/postgres'
12
+ * export { Postgres }
13
+ *
14
+ * export default {
15
+ * fetch: () => Response.json(await sql`SELECT * FROM posts`)
16
+ * }
17
+ * ```
18
+ */
19
+ interface SqlStorage {
20
+ exec(query: string, ...bindings: unknown[]): SqlStorageCursor;
21
+ }
22
+ interface SqlStorageCursor {
23
+ [Symbol.iterator](): Iterator<Record<string, SqlStorageValue>>;
24
+ toArray(): Record<string, SqlStorageValue>[];
25
+ one(): Record<string, SqlStorageValue> | null;
26
+ raw<T>(): T[][];
27
+ columnNames: string[];
28
+ rowsRead: number;
29
+ rowsWritten: number;
30
+ }
31
+ type SqlStorageValue = string | number | null | ArrayBuffer;
32
+ interface DurableObjectState {
33
+ storage: {
34
+ sql: SqlStorage;
35
+ get<T>(key: string): Promise<T | undefined>;
36
+ put<T>(key: string, value: T): Promise<void>;
37
+ delete(key: string): Promise<boolean>;
38
+ };
39
+ waitUntil(promise: Promise<unknown>): void;
40
+ id: {
41
+ toString(): string;
42
+ };
43
+ }
44
+ export interface PostgresEnv {
45
+ [key: string]: unknown;
46
+ }
47
+ export interface QueryResult<T = Record<string, unknown>> {
48
+ rows: T[];
49
+ rowCount: number;
50
+ fields?: {
51
+ name: string;
52
+ dataTypeID: number;
53
+ }[];
54
+ }
55
+ /**
56
+ * Postgres Durable Object
57
+ *
58
+ * Provides a full PostgreSQL database in each Durable Object instance.
59
+ * Data persists in DO SQLite and is loaded into PGLite on initialization.
60
+ */
61
+ export declare class Postgres implements DurableObject {
62
+ private state;
63
+ private pglite;
64
+ private initPromise;
65
+ private initialized;
66
+ private sql;
67
+ constructor(state: DurableObjectState, _env: PostgresEnv);
68
+ /**
69
+ * Initialize DO SQLite schema for persistence
70
+ */
71
+ private initStorage;
72
+ /**
73
+ * Initialize PGLite and restore data from DO SQLite
74
+ */
75
+ private init;
76
+ /**
77
+ * Restore all tables and data from DO SQLite into PGLite
78
+ */
79
+ private restoreFromStorage;
80
+ /**
81
+ * Register a table schema for persistence
82
+ */
83
+ private registerTable;
84
+ /**
85
+ * Persist a row to DO SQLite
86
+ */
87
+ private persistRow;
88
+ /**
89
+ * Delete a row from DO SQLite
90
+ */
91
+ private deleteRowFromStorage;
92
+ /**
93
+ * Delete all rows from a table in DO SQLite
94
+ */
95
+ private deleteAllRowsFromStorage;
96
+ /**
97
+ * Execute a SQL query
98
+ */
99
+ query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<QueryResult<T>>;
100
+ /**
101
+ * Execute SQL without returning results
102
+ */
103
+ exec(sql: string): Promise<void>;
104
+ /**
105
+ * Handle HTTP requests to the Durable Object
106
+ */
107
+ fetch(request: Request): Promise<Response>;
108
+ }
109
+ export default Postgres;
110
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/do/postgres.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,UAAU,UAAU;IAClB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAA;CAC9D;AAED,UAAU,gBAAgB;IACxB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAA;IAC9D,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,CAAA;IAC5C,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI,CAAA;IAC7C,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAA;IACf,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,KAAK,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,WAAW,CAAA;AAE3D,UAAU,kBAAkB;IAC1B,OAAO,EAAE;QACP,GAAG,EAAE,UAAU,CAAA;QACf,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;QAC3C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC5C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KACtC,CAAA;IACD,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IAC1C,EAAE,EAAE;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,CAAA;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACtD,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAChD;AAGD;;;;;GAKG;AACH,qBAAa,QAAS,YAAW,aAAa;IAO1C,OAAO,CAAC,KAAK;IANf,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,GAAG,CAAY;gBAGb,KAAK,EAAE,kBAAkB,EACjC,IAAI,EAAE,WAAW;IAMnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAqCnB;;OAEG;YACW,IAAI;IAuBlB;;OAEG;YACW,kBAAkB;IAyChC;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACH,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAOhC;;OAEG;IACG,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IA2ElG;;OAEG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItC;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;CAyCjD;AAED,eAAe,QAAQ,CAAA"}
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Postgres Durable Object
3
+ *
4
+ * A PostgreSQL database running in a Cloudflare Durable Object with:
5
+ * - DO SQLite for durable persistence (survives evictions)
6
+ * - PGLite for full PostgreSQL features (arrays, JSON, window functions, etc.)
7
+ * - Automatic sync between the two layers
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { sql, Postgres } from '@dotdo/postgres'
12
+ * export { Postgres }
13
+ *
14
+ * export default {
15
+ * fetch: () => Response.json(await sql`SELECT * FROM posts`)
16
+ * }
17
+ * ```
18
+ */
19
+ import { PGlite } from '@dotdo/pglite';
20
+ /**
21
+ * Postgres Durable Object
22
+ *
23
+ * Provides a full PostgreSQL database in each Durable Object instance.
24
+ * Data persists in DO SQLite and is loaded into PGLite on initialization.
25
+ */
26
+ export class Postgres {
27
+ state;
28
+ pglite = null;
29
+ initPromise = null;
30
+ initialized = false;
31
+ sql;
32
+ constructor(state, _env) {
33
+ this.state = state;
34
+ this.sql = state.storage.sql;
35
+ this.initStorage();
36
+ }
37
+ /**
38
+ * Initialize DO SQLite schema for persistence
39
+ */
40
+ initStorage() {
41
+ // Core metadata table
42
+ this.sql.exec(`
43
+ CREATE TABLE IF NOT EXISTS __pg_metadata (
44
+ key TEXT PRIMARY KEY,
45
+ value TEXT NOT NULL,
46
+ updated_at TEXT DEFAULT (datetime('now'))
47
+ )
48
+ `);
49
+ // Table registry - tracks all tables and their schemas
50
+ this.sql.exec(`
51
+ CREATE TABLE IF NOT EXISTS __pg_tables (
52
+ name TEXT PRIMARY KEY,
53
+ schema TEXT NOT NULL,
54
+ created_at TEXT DEFAULT (datetime('now'))
55
+ )
56
+ `);
57
+ // Generic data storage - stores all table data as JSON
58
+ this.sql.exec(`
59
+ CREATE TABLE IF NOT EXISTS __pg_data (
60
+ table_name TEXT NOT NULL,
61
+ row_id TEXT NOT NULL,
62
+ data TEXT NOT NULL,
63
+ created_at TEXT DEFAULT (datetime('now')),
64
+ updated_at TEXT DEFAULT (datetime('now')),
65
+ PRIMARY KEY (table_name, row_id)
66
+ )
67
+ `);
68
+ // Create index for faster queries
69
+ this.sql.exec(`
70
+ CREATE INDEX IF NOT EXISTS idx_pg_data_table ON __pg_data(table_name)
71
+ `);
72
+ }
73
+ /**
74
+ * Initialize PGLite and restore data from DO SQLite
75
+ */
76
+ async init() {
77
+ if (this.initialized && this.pglite) {
78
+ return;
79
+ }
80
+ if (this.initPromise) {
81
+ return this.initPromise;
82
+ }
83
+ this.initPromise = (async () => {
84
+ // Initialize PGLite (in-memory PostgreSQL)
85
+ this.pglite = new PGlite();
86
+ await this.pglite.waitReady;
87
+ // Restore tables and data from DO SQLite
88
+ await this.restoreFromStorage();
89
+ this.initialized = true;
90
+ })();
91
+ return this.initPromise;
92
+ }
93
+ /**
94
+ * Restore all tables and data from DO SQLite into PGLite
95
+ */
96
+ async restoreFromStorage() {
97
+ if (!this.pglite)
98
+ return;
99
+ // Get all registered tables
100
+ const tables = [...this.sql.exec('SELECT name, schema FROM __pg_tables')];
101
+ for (const table of tables) {
102
+ const tableName = table.name;
103
+ const schema = table.schema;
104
+ // Create table in PGLite
105
+ try {
106
+ await this.pglite.exec(schema);
107
+ }
108
+ catch (e) {
109
+ // Table might already exist, ignore
110
+ }
111
+ // Restore data for this table
112
+ const rows = [...this.sql.exec('SELECT row_id, data FROM __pg_data WHERE table_name = ?', tableName)];
113
+ for (const row of rows) {
114
+ const data = JSON.parse(row.data);
115
+ const columns = Object.keys(data);
116
+ const values = columns.map(c => data[c]);
117
+ const placeholders = columns.map((_, i) => `$${i + 1}`).join(', ');
118
+ try {
119
+ await this.pglite.query(`INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders}) ON CONFLICT DO NOTHING`, values);
120
+ }
121
+ catch (e) {
122
+ // Row might already exist or schema mismatch, continue
123
+ }
124
+ }
125
+ }
126
+ }
127
+ /**
128
+ * Register a table schema for persistence
129
+ */
130
+ registerTable(tableName, createStatement) {
131
+ this.sql.exec('INSERT OR REPLACE INTO __pg_tables (name, schema) VALUES (?, ?)', tableName, createStatement);
132
+ }
133
+ /**
134
+ * Persist a row to DO SQLite
135
+ */
136
+ persistRow(tableName, rowId, data) {
137
+ this.sql.exec(`INSERT OR REPLACE INTO __pg_data (table_name, row_id, data, updated_at)
138
+ VALUES (?, ?, ?, datetime('now'))`, tableName, rowId, JSON.stringify(data));
139
+ }
140
+ /**
141
+ * Delete a row from DO SQLite
142
+ */
143
+ deleteRowFromStorage(tableName, rowId) {
144
+ this.sql.exec('DELETE FROM __pg_data WHERE table_name = ? AND row_id = ?', tableName, rowId);
145
+ }
146
+ /**
147
+ * Delete all rows from a table in DO SQLite
148
+ */
149
+ deleteAllRowsFromStorage(tableName) {
150
+ this.sql.exec('DELETE FROM __pg_data WHERE table_name = ?', tableName);
151
+ }
152
+ /**
153
+ * Execute a SQL query
154
+ */
155
+ async query(sql, params) {
156
+ await this.init();
157
+ if (!this.pglite) {
158
+ throw new Error('PGLite not initialized');
159
+ }
160
+ // Detect and handle DDL statements
161
+ const upperSql = sql.trim().toUpperCase();
162
+ if (upperSql.startsWith('CREATE TABLE')) {
163
+ // Extract table name and register for persistence
164
+ const match = sql.match(/CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?["']?(\w+)["']?/i);
165
+ if (match) {
166
+ this.registerTable(match[1], sql);
167
+ }
168
+ }
169
+ // Execute on PGLite
170
+ const result = await this.pglite.query(sql, params);
171
+ // Handle INSERT/UPDATE/DELETE - persist changes
172
+ if (upperSql.startsWith('INSERT') || upperSql.startsWith('UPDATE') || upperSql.startsWith('DELETE')) {
173
+ // Extract table name
174
+ let tableName = null;
175
+ if (upperSql.startsWith('INSERT')) {
176
+ const match = sql.match(/INSERT\s+INTO\s+["']?(\w+)["']?/i);
177
+ tableName = match?.[1] || null;
178
+ }
179
+ else if (upperSql.startsWith('UPDATE')) {
180
+ const match = sql.match(/UPDATE\s+["']?(\w+)["']?/i);
181
+ tableName = match?.[1] || null;
182
+ }
183
+ else if (upperSql.startsWith('DELETE')) {
184
+ const match = sql.match(/DELETE\s+FROM\s+["']?(\w+)["']?/i);
185
+ tableName = match?.[1] || null;
186
+ }
187
+ // For RETURNING clauses, persist the returned rows (INSERT/UPDATE)
188
+ if (tableName && (upperSql.startsWith('INSERT') || upperSql.startsWith('UPDATE'))) {
189
+ if (result.rows && result.rows.length > 0) {
190
+ for (const row of result.rows) {
191
+ const rowId = row.id || row._id || JSON.stringify(row);
192
+ this.persistRow(tableName, rowId, row);
193
+ }
194
+ }
195
+ }
196
+ // For DELETE with RETURNING, remove the deleted rows
197
+ if (tableName && upperSql.startsWith('DELETE')) {
198
+ if (result.rows && result.rows.length > 0) {
199
+ for (const row of result.rows) {
200
+ const rowId = row.id || row._id || JSON.stringify(row);
201
+ this.deleteRowFromStorage(tableName, rowId);
202
+ }
203
+ }
204
+ else {
205
+ // DELETE without RETURNING - sync entire table
206
+ // This is expensive but ensures consistency
207
+ this.deleteAllRowsFromStorage(tableName);
208
+ // Re-persist all remaining rows
209
+ const allRows = await this.pglite.query(`SELECT * FROM ${tableName}`);
210
+ for (const row of allRows.rows) {
211
+ const rowId = row.id || row._id || JSON.stringify(row);
212
+ this.persistRow(tableName, rowId, row);
213
+ }
214
+ }
215
+ }
216
+ }
217
+ return {
218
+ rows: result.rows,
219
+ rowCount: result.rows?.length || 0,
220
+ fields: result.fields?.map(f => ({ name: f.name, dataTypeID: f.dataTypeID })),
221
+ };
222
+ }
223
+ /**
224
+ * Execute SQL without returning results
225
+ */
226
+ async exec(sql) {
227
+ await this.query(sql);
228
+ }
229
+ /**
230
+ * Handle HTTP requests to the Durable Object
231
+ */
232
+ async fetch(request) {
233
+ try {
234
+ await this.init();
235
+ const url = new URL(request.url);
236
+ // POST /query - Execute SQL
237
+ if (url.pathname === '/query' && request.method === 'POST') {
238
+ const body = await request.json();
239
+ if (!body.sql) {
240
+ return Response.json({ error: 'Missing sql' }, { status: 400 });
241
+ }
242
+ const result = await this.query(body.sql, body.params);
243
+ return Response.json(result);
244
+ }
245
+ // GET /health - Health check
246
+ if (url.pathname === '/health') {
247
+ return Response.json({
248
+ ok: true,
249
+ initialized: this.initialized,
250
+ id: this.state.id.toString(),
251
+ });
252
+ }
253
+ // GET /tables - List tables
254
+ if (url.pathname === '/tables') {
255
+ const tables = [...this.sql.exec('SELECT name FROM __pg_tables')];
256
+ return Response.json({ tables: tables.map(t => t.name) });
257
+ }
258
+ return Response.json({ error: 'Not found' }, { status: 404 });
259
+ }
260
+ catch (error) {
261
+ return Response.json({ error: error instanceof Error ? error.message : 'Unknown error' }, { status: 500 });
262
+ }
263
+ }
264
+ }
265
+ export default Postgres;
266
+ //# sourceMappingURL=postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/do/postgres.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * SQL Tagged Template & Database Client
3
+ *
4
+ * Execute PostgreSQL queries with a simple API.
5
+ * Automatically routes to the Postgres Durable Object using cloudflare:workers env.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { sql, db } from '@dotdo/postgres'
10
+ *
11
+ * // Tagged template (safe from SQL injection)
12
+ * const posts = await sql`SELECT * FROM posts WHERE id = ${id}`
13
+ *
14
+ * // db.query for dynamic queries
15
+ * const result = await db.query('SELECT * FROM posts')
16
+ * ```
17
+ */
18
+ export interface SqlConfig {
19
+ /** DO binding name (default: 'POSTGRES') */
20
+ binding?: string;
21
+ /** DO instance name (default: 'default') */
22
+ instance?: string;
23
+ }
24
+ export interface SqlResult<T = Record<string, unknown>> {
25
+ rows: T[];
26
+ rowCount: number;
27
+ fields?: {
28
+ name: string;
29
+ dataTypeID: number;
30
+ }[];
31
+ }
32
+ type DOStub = {
33
+ fetch(request: Request): Promise<Response>;
34
+ };
35
+ /**
36
+ * SQL tagged template - safe parameterized queries
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * import { sql } from '@dotdo/postgres'
41
+ *
42
+ * const posts = await sql`SELECT * FROM posts`
43
+ * const post = await sql`SELECT * FROM posts WHERE id = ${id}`
44
+ * const newPost = await sql`INSERT INTO posts (title) VALUES (${title}) RETURNING *`
45
+ * ```
46
+ */
47
+ export declare function sql<T = Record<string, unknown>>(strings: TemplateStringsArray, ...values: unknown[]): Promise<SqlResult<T>>;
48
+ export declare namespace sql {
49
+ var unsafe: <T = Record<string, unknown>>(query: string, params?: unknown[]) => Promise<SqlResult<T>>;
50
+ }
51
+ /**
52
+ * Database client for programmatic access
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * import { db } from '@dotdo/postgres'
57
+ *
58
+ * const result = await db.query('SELECT * FROM posts')
59
+ * await db.exec('CREATE TABLE posts (id SERIAL PRIMARY KEY, title TEXT)')
60
+ * ```
61
+ */
62
+ export declare const db: {
63
+ /**
64
+ * Execute a query and return results
65
+ */
66
+ query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<SqlResult<T>>;
67
+ /**
68
+ * Execute SQL without returning results (DDL, etc.)
69
+ */
70
+ exec(sql: string): Promise<void>;
71
+ /**
72
+ * Get raw access to the DO stub for advanced use cases
73
+ */
74
+ getStub(): Promise<DOStub>;
75
+ };
76
+ /**
77
+ * Create a sql function bound to a specific binding/instance
78
+ */
79
+ export declare function createSql(env: Record<string, unknown>, config?: SqlConfig): {
80
+ <T = Record<string, unknown>>(strings: TemplateStringsArray, ...values: unknown[]): Promise<SqlResult<T>>;
81
+ unsafe<T = Record<string, unknown>>(query: string, params?: unknown[]): Promise<SqlResult<T>>;
82
+ };
83
+ /**
84
+ * Create a db client bound to a specific binding/instance
85
+ */
86
+ export declare function createDb(env: Record<string, unknown>, config?: SqlConfig): {
87
+ query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<SqlResult<T>>;
88
+ exec(sql: string): Promise<void>;
89
+ getStub(): DOStub;
90
+ };
91
+ export default sql;
92
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/do/sql.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,SAAS;IACxB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpD,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAChD;AASD,KAAK,MAAM,GAAG;IACZ,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CAC3C,CAAA;AAwED;;;;;;;;;;;GAWG;AACH,wBAAsB,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnD,OAAO,EAAE,oBAAoB,EAC7B,GAAG,MAAM,EAAE,OAAO,EAAE,GACnB,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAGvB;yBANqB,GAAG;iBAWG,CAAC,mCACpB,MAAM,WACJ,OAAO,EAAE,KACjB,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;AAQxB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,EAAE;IACb;;OAEG;UACS,CAAC,iCAAiC,MAAM,WAAW,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAIhG;;OAEG;cACa,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItC;;OAEG;eACc,OAAO,CAAC,MAAM,CAAC;CAGjC,CAAA;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAE,SAAc;KAWpD,CAAC,qCACd,oBAAoB,aAClB,OAAO,EAAE,GACnB,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;WAiBS,CAAC,mCACzB,MAAM,WACJ,OAAO,EAAE,GACjB,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;EAgBzB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAE,SAAc;UAY7D,CAAC,iCAAiC,MAAM,WAAW,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;cAehF,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;eAI3B,MAAM;EAIpB;AAED,eAAe,GAAG,CAAA"}