@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
package/dist/do/sql.js ADDED
@@ -0,0 +1,204 @@
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
+ /**
19
+ * Build a parameterized SQL query from template literals
20
+ */
21
+ function buildQuery(strings, values) {
22
+ let sql = '';
23
+ const params = [];
24
+ for (let i = 0; i < strings.length; i++) {
25
+ sql += strings[i];
26
+ if (i < values.length) {
27
+ params.push(values[i]);
28
+ sql += `$${params.length}`;
29
+ }
30
+ }
31
+ return { sql, params };
32
+ }
33
+ // Cached env and stub
34
+ let cachedEnv = null;
35
+ let cachedStub = null;
36
+ async function getStub(config = {}) {
37
+ if (cachedStub)
38
+ return cachedStub;
39
+ if (!cachedEnv) {
40
+ try {
41
+ const mod = await import('cloudflare:workers');
42
+ cachedEnv = mod.env;
43
+ }
44
+ catch {
45
+ throw new Error('Could not import cloudflare:workers. ' +
46
+ 'Ensure you are running in Cloudflare Workers with nodejs_compat.');
47
+ }
48
+ }
49
+ const binding = config.binding || 'POSTGRES';
50
+ const instance = config.instance || 'default';
51
+ const namespace = cachedEnv[binding];
52
+ if (!namespace) {
53
+ throw new Error(`Postgres binding "${binding}" not found. Add it to wrangler.toml.`);
54
+ }
55
+ cachedStub = namespace.get(namespace.idFromName(instance));
56
+ return cachedStub;
57
+ }
58
+ async function executeQuery(sql, params) {
59
+ const stub = await getStub();
60
+ const response = await stub.fetch(new Request('http://do/query', {
61
+ method: 'POST',
62
+ headers: { 'Content-Type': 'application/json' },
63
+ body: JSON.stringify({ sql, params }),
64
+ }));
65
+ if (!response.ok) {
66
+ const error = await response.json();
67
+ throw new Error(error.error || 'Query failed');
68
+ }
69
+ return response.json();
70
+ }
71
+ // =============================================================================
72
+ // sql - Tagged Template API
73
+ // =============================================================================
74
+ /**
75
+ * SQL tagged template - safe parameterized queries
76
+ *
77
+ * @example
78
+ * ```typescript
79
+ * import { sql } from '@dotdo/postgres'
80
+ *
81
+ * const posts = await sql`SELECT * FROM posts`
82
+ * const post = await sql`SELECT * FROM posts WHERE id = ${id}`
83
+ * const newPost = await sql`INSERT INTO posts (title) VALUES (${title}) RETURNING *`
84
+ * ```
85
+ */
86
+ export async function sql(strings, ...values) {
87
+ const { sql: query, params } = buildQuery(strings, values);
88
+ return executeQuery(query, params);
89
+ }
90
+ /**
91
+ * Execute raw SQL (use with caution - ensure input is sanitized)
92
+ */
93
+ sql.unsafe = async function (query, params) {
94
+ return executeQuery(query, params);
95
+ };
96
+ // =============================================================================
97
+ // db - Database Client API
98
+ // =============================================================================
99
+ /**
100
+ * Database client for programmatic access
101
+ *
102
+ * @example
103
+ * ```typescript
104
+ * import { db } from '@dotdo/postgres'
105
+ *
106
+ * const result = await db.query('SELECT * FROM posts')
107
+ * await db.exec('CREATE TABLE posts (id SERIAL PRIMARY KEY, title TEXT)')
108
+ * ```
109
+ */
110
+ export const db = {
111
+ /**
112
+ * Execute a query and return results
113
+ */
114
+ async query(sql, params) {
115
+ return executeQuery(sql, params);
116
+ },
117
+ /**
118
+ * Execute SQL without returning results (DDL, etc.)
119
+ */
120
+ async exec(sql) {
121
+ await executeQuery(sql);
122
+ },
123
+ /**
124
+ * Get raw access to the DO stub for advanced use cases
125
+ */
126
+ async getStub() {
127
+ return getStub();
128
+ },
129
+ };
130
+ // =============================================================================
131
+ // Factory Functions (for custom binding/instance)
132
+ // =============================================================================
133
+ /**
134
+ * Create a sql function bound to a specific binding/instance
135
+ */
136
+ export function createSql(env, config = {}) {
137
+ const binding = config.binding || 'POSTGRES';
138
+ const instance = config.instance || 'default';
139
+ const namespace = env[binding];
140
+ if (!namespace) {
141
+ throw new Error(`Postgres binding "${binding}" not found in env.`);
142
+ }
143
+ const stub = namespace.get(namespace.idFromName(instance));
144
+ async function boundSql(strings, ...values) {
145
+ const { sql: query, params } = buildQuery(strings, values);
146
+ const response = await stub.fetch(new Request('http://do/query', {
147
+ method: 'POST',
148
+ headers: { 'Content-Type': 'application/json' },
149
+ body: JSON.stringify({ sql: query, params }),
150
+ }));
151
+ if (!response.ok) {
152
+ const error = await response.json();
153
+ throw new Error(error.error || 'Query failed');
154
+ }
155
+ return response.json();
156
+ }
157
+ boundSql.unsafe = async function (query, params) {
158
+ const response = await stub.fetch(new Request('http://do/query', {
159
+ method: 'POST',
160
+ headers: { 'Content-Type': 'application/json' },
161
+ body: JSON.stringify({ sql: query, params }),
162
+ }));
163
+ if (!response.ok) {
164
+ const error = await response.json();
165
+ throw new Error(error.error || 'Query failed');
166
+ }
167
+ return response.json();
168
+ };
169
+ return boundSql;
170
+ }
171
+ /**
172
+ * Create a db client bound to a specific binding/instance
173
+ */
174
+ export function createDb(env, config = {}) {
175
+ const binding = config.binding || 'POSTGRES';
176
+ const instance = config.instance || 'default';
177
+ const namespace = env[binding];
178
+ if (!namespace) {
179
+ throw new Error(`Postgres binding "${binding}" not found in env.`);
180
+ }
181
+ const stub = namespace.get(namespace.idFromName(instance));
182
+ return {
183
+ async query(sql, params) {
184
+ const response = await stub.fetch(new Request('http://do/query', {
185
+ method: 'POST',
186
+ headers: { 'Content-Type': 'application/json' },
187
+ body: JSON.stringify({ sql, params }),
188
+ }));
189
+ if (!response.ok) {
190
+ const error = await response.json();
191
+ throw new Error(error.error || 'Query failed');
192
+ }
193
+ return response.json();
194
+ },
195
+ async exec(sql) {
196
+ await this.query(sql);
197
+ },
198
+ getStub() {
199
+ return stub;
200
+ },
201
+ };
202
+ }
203
+ export default sql;
204
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/do/sql.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,50 +1,45 @@
1
1
  /**
2
2
  * @module @dotdo/postgres
3
3
  *
4
- * PostgreSQL server for Cloudflare Workers/DOs with PGLite WASM and tiered storage.
4
+ * PostgreSQL for Cloudflare Workers - Simple, Persistent, Powerful.
5
5
  *
6
- * This package provides a complete PostgreSQL-compatible database solution
7
- * optimized for Cloudflare's edge infrastructure:
8
- *
9
- * - **Worker Module**: PostgresDO Durable Object with HTTP/WebSocket APIs
10
- * - **PGLite Module**: Tiered storage system (Cache/DO/R2) for PGLite
11
- * - **Extensions Module**: PGLite extension management and pgvector support
12
- * - **Routing Module**: Intelligent query routing based on CPU cost estimation
13
- * - **Read-Only Module**: Security-focused read-only deployment mode
14
- * - **Middleware Module**: Rate limiting with sliding window and token bucket algorithms
15
- *
16
- * @example
6
+ * @example Minimal API
17
7
  * ```typescript
18
- * import {
19
- * PostgresDO,
20
- * createRoutes,
21
- * WebSocketHandler,
22
- * } from '@dotdo/postgres'
23
- *
24
- * // Export the Durable Object
25
- * export { PostgresDO }
26
- *
27
- * // Create Hono routes
28
- * const app = new Hono()
29
- * app.route('/api/sql', createRoutes(env))
8
+ * import { sql, Postgres } from '@dotdo/postgres'
9
+ * export { Postgres }
30
10
  *
31
11
  * export default {
32
- * fetch: app.fetch,
12
+ * fetch: () => Response.json(await sql`SELECT * FROM posts`)
33
13
  * }
34
14
  * ```
35
15
  *
36
- * @example
16
+ * @example With Hono
37
17
  * ```typescript
38
- * // Use tiered storage for PGLite
39
- * import { createDOVFS, TieredVFS, CacheLayer } from '@dotdo/postgres/pglite'
18
+ * import { Hono } from 'hono'
19
+ * import { sql, Postgres } from '@dotdo/postgres'
20
+ * export { Postgres }
40
21
  *
41
- * const vfs = createDOVFS(ctx.storage)
42
- * const pglite = await PGlite.create({ vfs })
22
+ * const app = new Hono()
23
+ * app.get('/posts', c => sql`SELECT * FROM posts`.then(r => c.json(r)))
24
+ * app.get('/posts/:id', c => sql`SELECT * FROM posts WHERE id = ${c.req.param('id')}`.then(r => c.json(r)))
25
+ *
26
+ * export default app
43
27
  * ```
28
+ *
29
+ * The Postgres Durable Object provides:
30
+ * - Full PostgreSQL via PGLite WASM
31
+ * - Automatic persistence via DO SQLite
32
+ * - Safe parameterized queries via tagged templates
33
+ *
34
+ * For advanced features (tiered storage, migrations, observability), see submodules.
44
35
  */
36
+ export { sql, db, createSql, createDb, Postgres } from './do';
37
+ export type { SqlConfig, SqlResult, PostgresEnv, QueryResult } from './do';
45
38
  export * from './config';
46
39
  export { createTenantId, createPageNumber, createMigrationVersion, createQueryId, createSnapshotId, createBlockId, createShardId, createIngestId, createReplicaId, createBatchId, isTenantId, isPageNumber, isMigrationVersion, isQueryId, isSnapshotId, isBlockId, isShardId, isIngestId, isReplicaId, isBatchId, unwrap, unsafeTenantId, unsafePageNumber, unsafeMigrationVersion, unsafeQueryId, unsafeSnapshotId, unsafeBlockId, unsafeShardId, unsafeIngestId, unsafeReplicaId, unsafeBatchId, TENANT_ID_MAX_LENGTH, TENANT_ID_PATTERN, MAX_PAGE_NUMBER, QUERY_ID_PATTERN, SNAPSHOT_ID_PATTERN, MAX_SNAPSHOT_ID, BLOCK_ID_PATTERN, SHARD_ID_PATTERN, SHARD_ID_MAX_LENGTH, INGEST_ID_PATTERN, INGEST_ID_MAX_LENGTH, REPLICA_ID_PATTERN, REPLICA_ID_MAX_LENGTH, BATCH_ID_PATTERN, BATCH_ID_MAX_LENGTH, } from './types/branded';
47
40
  export type { TenantId, PageNumber, MigrationVersion, QueryId, SnapshotId, BlockId, ShardId, IngestId, ReplicaId, BatchId, Branded, } from './types/branded';
48
41
  export { isDefined, isString, isNumber, isBoolean, isPlainObject, isArray, isFunction, isPromise, isError, assertDefined, assert, assertNever, success, failure, isSuccess, isFailure, toBodyInit, toArrayBuffer, isArrayBufferView, isUint8Array, narrowStorageValue, assertStorageValue, createDiscriminatorGuard, unsafeCast, safeCast, getProperty, hasProperty, hasProperties, } from './types/utilities';
49
42
  export type { Nullable, Optional, Maybe, NonNullish, Constructor, ConstructorWithArgs, AbstractConstructor, Success, Failure, Result, AsyncResult, DeepPartial, DeepRequired, DeepReadonly, DeepMutable, Awaited, MaybePromise, Awaitable, AsyncFunction, StringRecord, KeysOfType, PickByType, OmitByType, RequireKeys, OptionalKeys, ValueOf, AnyFunction, VoidFunction, Thunk, Predicate, TypeGuard, FirstParameter, LastParameter, Capitalize, Uncapitalize, Join, Head, Tail, Last, Length, DiscriminatedMessage, } from './types/utilities';
43
+ export { PostgresClient, createPostgresClient, } from './client';
44
+ export type { PostgresClientConfig, PostgresDORpcApi, RpcQueryResult, RpcBatchQuery, RpcBatchResult, RpcTransactionOptions, TransactionApi, ColumnInfo, DatabaseStats, ConnectionState, } from './client';
50
45
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAMH,cAAc,UAAU,CAAA;AAMxB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,aAAa,EACb,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,SAAS,EACT,YAAY,EACZ,SAAS,EACT,SAAS,EACT,UAAU,EACV,WAAW,EACX,SAAS,EACT,MAAM,EACN,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AAExB,YAAY,EACV,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,OAAO,EACP,OAAO,GACR,MAAM,iBAAiB,CAAA;AAMxB,OAAO,EAEL,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,aAAa,EACb,OAAO,EACP,UAAU,EACV,SAAS,EACT,OAAO,EACP,aAAa,EACb,MAAM,EACN,WAAW,EACX,OAAO,EACP,OAAO,EACP,SAAS,EACT,SAAS,EAET,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,YAAY,EAEZ,kBAAkB,EAClB,kBAAkB,EAElB,wBAAwB,EAExB,UAAU,EACV,QAAQ,EAER,WAAW,EACX,WAAW,EACX,aAAa,GACd,MAAM,mBAAmB,CAAA;AAE1B,YAAY,EAEV,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,UAAU,EAEV,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EAEnB,OAAO,EACP,OAAO,EACP,MAAM,EACN,WAAW,EAEX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EAEX,OAAO,EACP,YAAY,EACZ,SAAS,EACT,aAAa,EAEb,YAAY,EACZ,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,OAAO,EAEP,WAAW,EACX,YAAY,EACZ,KAAK,EACL,SAAS,EACT,SAAS,EACT,cAAc,EACd,aAAa,EAEb,UAAU,EACV,YAAY,EACZ,IAAI,EAEJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,MAAM,EAEN,oBAAoB,GACrB,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAMH,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAC7D,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAM1E,cAAc,UAAU,CAAA;AAMxB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,aAAa,EACb,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,SAAS,EACT,YAAY,EACZ,SAAS,EACT,SAAS,EACT,UAAU,EACV,WAAW,EACX,SAAS,EACT,MAAM,EACN,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AAExB,YAAY,EACV,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,OAAO,EACP,OAAO,GACR,MAAM,iBAAiB,CAAA;AAMxB,OAAO,EAEL,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,aAAa,EACb,OAAO,EACP,UAAU,EACV,SAAS,EACT,OAAO,EACP,aAAa,EACb,MAAM,EACN,WAAW,EACX,OAAO,EACP,OAAO,EACP,SAAS,EACT,SAAS,EAET,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,YAAY,EAEZ,kBAAkB,EAClB,kBAAkB,EAElB,wBAAwB,EAExB,UAAU,EACV,QAAQ,EAER,WAAW,EACX,WAAW,EACX,aAAa,GACd,MAAM,mBAAmB,CAAA;AAE1B,YAAY,EAEV,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,UAAU,EAEV,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EAEnB,OAAO,EACP,OAAO,EACP,MAAM,EACN,WAAW,EAEX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EAEX,OAAO,EACP,YAAY,EACZ,SAAS,EACT,aAAa,EAEb,YAAY,EACZ,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,OAAO,EAEP,WAAW,EACX,YAAY,EACZ,KAAK,EACL,SAAS,EACT,SAAS,EACT,cAAc,EACd,aAAa,EAEb,UAAU,EACV,YAAY,EACZ,IAAI,EAEJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,MAAM,EAEN,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAM1B,OAAO,EACL,cAAc,EACd,oBAAoB,GACrB,MAAM,UAAU,CAAA;AAEjB,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,UAAU,EACV,aAAa,EACb,eAAe,GAChB,MAAM,UAAU,CAAA"}
package/dist/index.js CHANGED
@@ -1,48 +1,43 @@
1
1
  /**
2
2
  * @module @dotdo/postgres
3
3
  *
4
- * PostgreSQL server for Cloudflare Workers/DOs with PGLite WASM and tiered storage.
4
+ * PostgreSQL for Cloudflare Workers - Simple, Persistent, Powerful.
5
5
  *
6
- * This package provides a complete PostgreSQL-compatible database solution
7
- * optimized for Cloudflare's edge infrastructure:
8
- *
9
- * - **Worker Module**: PostgresDO Durable Object with HTTP/WebSocket APIs
10
- * - **PGLite Module**: Tiered storage system (Cache/DO/R2) for PGLite
11
- * - **Extensions Module**: PGLite extension management and pgvector support
12
- * - **Routing Module**: Intelligent query routing based on CPU cost estimation
13
- * - **Read-Only Module**: Security-focused read-only deployment mode
14
- * - **Middleware Module**: Rate limiting with sliding window and token bucket algorithms
15
- *
16
- * @example
6
+ * @example Minimal API
17
7
  * ```typescript
18
- * import {
19
- * PostgresDO,
20
- * createRoutes,
21
- * WebSocketHandler,
22
- * } from '@dotdo/postgres'
23
- *
24
- * // Export the Durable Object
25
- * export { PostgresDO }
26
- *
27
- * // Create Hono routes
28
- * const app = new Hono()
29
- * app.route('/api/sql', createRoutes(env))
8
+ * import { sql, Postgres } from '@dotdo/postgres'
9
+ * export { Postgres }
30
10
  *
31
11
  * export default {
32
- * fetch: app.fetch,
12
+ * fetch: () => Response.json(await sql`SELECT * FROM posts`)
33
13
  * }
34
14
  * ```
35
15
  *
36
- * @example
16
+ * @example With Hono
37
17
  * ```typescript
38
- * // Use tiered storage for PGLite
39
- * import { createDOVFS, TieredVFS, CacheLayer } from '@dotdo/postgres/pglite'
18
+ * import { Hono } from 'hono'
19
+ * import { sql, Postgres } from '@dotdo/postgres'
20
+ * export { Postgres }
21
+ *
22
+ * const app = new Hono()
23
+ * app.get('/posts', c => sql`SELECT * FROM posts`.then(r => c.json(r)))
24
+ * app.get('/posts/:id', c => sql`SELECT * FROM posts WHERE id = ${c.req.param('id')}`.then(r => c.json(r)))
40
25
  *
41
- * const vfs = createDOVFS(ctx.storage)
42
- * const pglite = await PGlite.create({ vfs })
26
+ * export default app
43
27
  * ```
28
+ *
29
+ * The Postgres Durable Object provides:
30
+ * - Full PostgreSQL via PGLite WASM
31
+ * - Automatic persistence via DO SQLite
32
+ * - Safe parameterized queries via tagged templates
33
+ *
34
+ * For advanced features (tiered storage, migrations, observability), see submodules.
44
35
  */
45
36
  // ============================================================================
37
+ // Core API - The Minimal Interface
38
+ // ============================================================================
39
+ export { sql, db, createSql, createDb, Postgres } from './do';
40
+ // ============================================================================
46
41
  // Configuration Module - Centralized Constants
47
42
  // ============================================================================
48
43
  export * from './config';
@@ -66,4 +61,8 @@ createDiscriminatorGuard,
66
61
  unsafeCast, safeCast,
67
62
  // Object property helpers
68
63
  getProperty, hasProperty, hasProperties, } from './types/utilities';
64
+ // ============================================================================
65
+ // Client Module - WebSocket client with rpc.do integration
66
+ // ============================================================================
67
+ export { PostgresClient, createPostgresClient, } from './client';
69
68
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,+EAA+E;AAC/E,+CAA+C;AAC/C,+EAA+E;AAE/E,cAAc,UAAU,CAAA;AAExB,+EAA+E;AAC/E,4CAA4C;AAC5C,+EAA+E;AAE/E,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,aAAa,EACb,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,SAAS,EACT,YAAY,EACZ,SAAS,EACT,SAAS,EACT,UAAU,EACV,WAAW,EACX,SAAS,EACT,MAAM,EACN,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AAgBxB,+EAA+E;AAC/E,0CAA0C;AAC1C,+EAA+E;AAE/E,OAAO;AACL,oBAAoB;AACpB,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,aAAa,EACb,OAAO,EACP,UAAU,EACV,SAAS,EACT,OAAO,EACP,aAAa,EACb,MAAM,EACN,WAAW,EACX,OAAO,EACP,OAAO,EACP,SAAS,EACT,SAAS;AACT,kBAAkB;AAClB,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,YAAY;AACZ,kBAAkB;AAClB,kBAAkB,EAClB,kBAAkB;AAClB,8BAA8B;AAC9B,wBAAwB;AACxB,yBAAyB;AACzB,UAAU,EACV,QAAQ;AACR,0BAA0B;AAC1B,WAAW,EACX,WAAW,EACX,aAAa,GACd,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,+EAA+E;AAC/E,mCAAmC;AACnC,+EAA+E;AAE/E,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAG7D,+EAA+E;AAC/E,+CAA+C;AAC/C,+EAA+E;AAE/E,cAAc,UAAU,CAAA;AAExB,+EAA+E;AAC/E,4CAA4C;AAC5C,+EAA+E;AAE/E,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,aAAa,EACb,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,SAAS,EACT,YAAY,EACZ,SAAS,EACT,SAAS,EACT,UAAU,EACV,WAAW,EACX,SAAS,EACT,MAAM,EACN,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AAgBxB,+EAA+E;AAC/E,0CAA0C;AAC1C,+EAA+E;AAE/E,OAAO;AACL,oBAAoB;AACpB,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,aAAa,EACb,OAAO,EACP,UAAU,EACV,SAAS,EACT,OAAO,EACP,aAAa,EACb,MAAM,EACN,WAAW,EACX,OAAO,EACP,OAAO,EACP,SAAS,EACT,SAAS;AACT,kBAAkB;AAClB,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,YAAY;AACZ,kBAAkB;AAClB,kBAAkB,EAClB,kBAAkB;AAClB,8BAA8B;AAC9B,wBAAwB;AACxB,yBAAyB;AACzB,UAAU,EACV,QAAQ;AACR,0BAA0B;AAC1B,WAAW,EACX,WAAW,EACX,aAAa,GACd,MAAM,mBAAmB,CAAA;AAwD1B,+EAA+E;AAC/E,2DAA2D;AAC3D,+EAA+E;AAE/E,OAAO,EACL,cAAc,EACd,oBAAoB,GACrB,MAAM,UAAU,CAAA"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * PostgreSQL Binding for MCP Do Tool
3
+ *
4
+ * Creates the `pg` binding that is available in the sandboxed code execution
5
+ * environment. Wraps PostgresDO RPC calls in a clean API.
6
+ */
7
+ import type { PGBinding } from './types.js';
8
+ /**
9
+ * Interface for the query executor (PostgresDO stub)
10
+ */
11
+ export interface QueryExecutor {
12
+ rpcQuery(sql: string, params?: unknown[]): Promise<{
13
+ rows: Record<string, unknown>[];
14
+ fields: Array<{
15
+ name: string;
16
+ dataTypeID: number;
17
+ }>;
18
+ rowCount: number;
19
+ }>;
20
+ rpcBatchTransaction(queries: Array<{
21
+ sql: string;
22
+ params?: unknown[];
23
+ }>): Promise<{
24
+ results: Array<{
25
+ rows: Record<string, unknown>[];
26
+ fields: Array<{
27
+ name: string;
28
+ dataTypeID: number;
29
+ }>;
30
+ rowCount: number;
31
+ }>;
32
+ success: boolean;
33
+ }>;
34
+ }
35
+ /**
36
+ * Create the pg binding for the do tool
37
+ *
38
+ * @param executor - Query executor (PostgresDO stub)
39
+ * @returns The pg binding object
40
+ */
41
+ export declare function createPGBinding(executor: QueryExecutor): PGBinding;
42
+ /**
43
+ * TypeScript type definitions for the pg binding
44
+ * Used by the do tool to provide type information to LLMs
45
+ */
46
+ export declare const PG_BINDING_TYPES = "\ninterface QueryResult<T = Record<string, unknown>> {\n rows: T[]\n rowCount: number\n fields: Array<{ name: string; dataTypeID: number }>\n}\n\ninterface TableInfo {\n name: string\n schema: string\n type: 'table' | 'view' | 'materialized_view'\n}\n\ninterface ColumnInfo {\n name: string\n type: string\n nullable: boolean\n default?: string\n primaryKey: boolean\n}\n\ninterface PGTransaction {\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<QueryResult<T>>\n execute(sql: string, params?: unknown[]): Promise<{ rowCount: number }>\n}\n\ndeclare const pg: {\n /**\n * Execute a SQL query with optional parameters\n * @example\n * const users = await pg.query('SELECT * FROM users WHERE age > $1', [18])\n * console.log(users.rows)\n */\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<QueryResult<T>>\n\n /**\n * Execute a SQL statement (INSERT, UPDATE, DELETE)\n * @example\n * const result = await pg.execute('UPDATE users SET active = true WHERE id = $1', [1])\n * console.log(result.rowCount)\n */\n execute(sql: string, params?: unknown[]): Promise<{ rowCount: number }>\n\n /**\n * Execute multiple statements in a transaction\n * @example\n * await pg.transaction(async (tx) => {\n * await tx.execute('INSERT INTO orders (user_id) VALUES ($1)', [1])\n * await tx.execute('UPDATE users SET order_count = order_count + 1 WHERE id = $1', [1])\n * })\n */\n transaction<T>(fn: (tx: PGTransaction) => Promise<T>): Promise<T>\n\n /**\n * List all tables in the database\n * @example\n * const tables = await pg.tables()\n * tables.forEach(t => console.log(t.name))\n */\n tables(): Promise<TableInfo[]>\n\n /**\n * Get schema information for a table\n * @example\n * const columns = await pg.schema('users')\n * columns.forEach(c => console.log(`${c.name}: ${c.type}`))\n */\n schema(tableName: string): Promise<ColumnInfo[]>\n}\n";
47
+ //# sourceMappingURL=binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../src/mcp/binding.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,SAAS,EAKV,MAAM,YAAY,CAAA;AAEnB;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QACjD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;QAC/B,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QACnD,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAC,CAAA;IACF,mBAAmB,CACjB,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,GAClD,OAAO,CAAC;QACT,OAAO,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;YAC/B,MAAM,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,UAAU,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;YACnD,QAAQ,EAAE,MAAM,CAAA;SACjB,CAAC,CAAA;QACF,OAAO,EAAE,OAAO,CAAA;KACjB,CAAC,CAAA;CACH;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,SAAS,CAsHlE;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,+7DAqE5B,CAAA"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * PostgreSQL Binding for MCP Do Tool
3
+ *
4
+ * Creates the `pg` binding that is available in the sandboxed code execution
5
+ * environment. Wraps PostgresDO RPC calls in a clean API.
6
+ */
7
+ /**
8
+ * Create the pg binding for the do tool
9
+ *
10
+ * @param executor - Query executor (PostgresDO stub)
11
+ * @returns The pg binding object
12
+ */
13
+ export function createPGBinding(executor) {
14
+ return {
15
+ async query(sql, params) {
16
+ const result = await executor.rpcQuery(sql, params);
17
+ return {
18
+ rows: result.rows,
19
+ rowCount: result.rowCount,
20
+ fields: result.fields,
21
+ };
22
+ },
23
+ async execute(sql, params) {
24
+ const result = await executor.rpcQuery(sql, params);
25
+ return { rowCount: result.rowCount };
26
+ },
27
+ async transaction(fn) {
28
+ // Execute BEGIN, run function with transaction context, execute COMMIT/ROLLBACK
29
+ await executor.rpcQuery('BEGIN');
30
+ try {
31
+ const result = await fn({
32
+ async query(sql, params) {
33
+ const res = await executor.rpcQuery(sql, params);
34
+ return {
35
+ rows: res.rows,
36
+ rowCount: res.rowCount,
37
+ fields: res.fields,
38
+ };
39
+ },
40
+ async execute(sql, params) {
41
+ const res = await executor.rpcQuery(sql, params);
42
+ return { rowCount: res.rowCount };
43
+ },
44
+ });
45
+ await executor.rpcQuery('COMMIT');
46
+ return result;
47
+ }
48
+ catch (error) {
49
+ await executor.rpcQuery('ROLLBACK');
50
+ throw error;
51
+ }
52
+ },
53
+ async tables() {
54
+ const result = await executor.rpcQuery(`
55
+ SELECT
56
+ table_name as name,
57
+ table_schema as schema,
58
+ CASE table_type
59
+ WHEN 'BASE TABLE' THEN 'table'
60
+ WHEN 'VIEW' THEN 'view'
61
+ ELSE 'table'
62
+ END as type
63
+ FROM information_schema.tables
64
+ WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
65
+ ORDER BY table_schema, table_name
66
+ `);
67
+ return result.rows.map((row) => ({
68
+ name: row.name,
69
+ schema: row.schema,
70
+ type: row.type,
71
+ }));
72
+ },
73
+ async schema(tableName) {
74
+ // Validate table name to prevent SQL injection
75
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(tableName)) {
76
+ throw new Error('Invalid table name');
77
+ }
78
+ const result = await executor.rpcQuery(`
79
+ SELECT
80
+ c.column_name as name,
81
+ c.data_type as type,
82
+ c.is_nullable = 'YES' as nullable,
83
+ c.column_default as "default",
84
+ COALESCE(
85
+ (SELECT true FROM information_schema.key_column_usage kcu
86
+ JOIN information_schema.table_constraints tc
87
+ ON kcu.constraint_name = tc.constraint_name
88
+ WHERE tc.constraint_type = 'PRIMARY KEY'
89
+ AND kcu.table_name = c.table_name
90
+ AND kcu.column_name = c.column_name
91
+ LIMIT 1),
92
+ false
93
+ ) as "primaryKey"
94
+ FROM information_schema.columns c
95
+ WHERE c.table_name = $1
96
+ AND c.table_schema NOT IN ('pg_catalog', 'information_schema')
97
+ ORDER BY c.ordinal_position
98
+ `, [tableName]);
99
+ return result.rows.map((row) => ({
100
+ name: row.name,
101
+ type: row.type,
102
+ nullable: Boolean(row.nullable),
103
+ ...(row.default !== null && { default: row.default }),
104
+ primaryKey: Boolean(row.primaryKey),
105
+ }));
106
+ },
107
+ };
108
+ }
109
+ /**
110
+ * TypeScript type definitions for the pg binding
111
+ * Used by the do tool to provide type information to LLMs
112
+ */
113
+ export const PG_BINDING_TYPES = `
114
+ interface QueryResult<T = Record<string, unknown>> {
115
+ rows: T[]
116
+ rowCount: number
117
+ fields: Array<{ name: string; dataTypeID: number }>
118
+ }
119
+
120
+ interface TableInfo {
121
+ name: string
122
+ schema: string
123
+ type: 'table' | 'view' | 'materialized_view'
124
+ }
125
+
126
+ interface ColumnInfo {
127
+ name: string
128
+ type: string
129
+ nullable: boolean
130
+ default?: string
131
+ primaryKey: boolean
132
+ }
133
+
134
+ interface PGTransaction {
135
+ query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<QueryResult<T>>
136
+ execute(sql: string, params?: unknown[]): Promise<{ rowCount: number }>
137
+ }
138
+
139
+ declare const pg: {
140
+ /**
141
+ * Execute a SQL query with optional parameters
142
+ * @example
143
+ * const users = await pg.query('SELECT * FROM users WHERE age > $1', [18])
144
+ * console.log(users.rows)
145
+ */
146
+ query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<QueryResult<T>>
147
+
148
+ /**
149
+ * Execute a SQL statement (INSERT, UPDATE, DELETE)
150
+ * @example
151
+ * const result = await pg.execute('UPDATE users SET active = true WHERE id = $1', [1])
152
+ * console.log(result.rowCount)
153
+ */
154
+ execute(sql: string, params?: unknown[]): Promise<{ rowCount: number }>
155
+
156
+ /**
157
+ * Execute multiple statements in a transaction
158
+ * @example
159
+ * await pg.transaction(async (tx) => {
160
+ * await tx.execute('INSERT INTO orders (user_id) VALUES ($1)', [1])
161
+ * await tx.execute('UPDATE users SET order_count = order_count + 1 WHERE id = $1', [1])
162
+ * })
163
+ */
164
+ transaction<T>(fn: (tx: PGTransaction) => Promise<T>): Promise<T>
165
+
166
+ /**
167
+ * List all tables in the database
168
+ * @example
169
+ * const tables = await pg.tables()
170
+ * tables.forEach(t => console.log(t.name))
171
+ */
172
+ tables(): Promise<TableInfo[]>
173
+
174
+ /**
175
+ * Get schema information for a table
176
+ * @example
177
+ * const columns = await pg.schema('users')
178
+ * columns.forEach(c => console.log(\`\${c.name}: \${c.type}\`))
179
+ */
180
+ schema(tableName: string): Promise<ColumnInfo[]>
181
+ }
182
+ `;
183
+ //# sourceMappingURL=binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding.js","sourceRoot":"","sources":["../../src/mcp/binding.ts"],"names":[],"mappings":"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"}