@humbdb/postgres 0.0.1

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Humb contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,6 @@
1
+ # @humbdb/postgres
2
+
3
+ PostgreSQL driver for Humb. Implements the `DatabaseAdapter` contract from `@humbdb/driver-contract`.
4
+
5
+ Read-only by policy: `runReadOnlyQuery` rejects non-SELECT statements (see `read-only.ts` and
6
+ [`docs/SECURITY.md`](../../../docs/SECURITY.md)).
@@ -0,0 +1,30 @@
1
+ import { ConnectionTarget, DatabaseOverview, TableMetadata, RowPage } from '@humbdb/core';
2
+ import { DatabaseAdapter, AdapterFactory } from '@humbdb/driver-contract';
3
+ export { ReadOnlyViolationError, assertReadOnly } from '@humbdb/driver-contract';
4
+
5
+ /**
6
+ * PostgreSQL driver for Humb.
7
+ *
8
+ * Implements the engine-agnostic {@link DatabaseAdapter} contract from `@humbdb/driver-contract`.
9
+ * All Postgres-specific SQL and introspection lives here. See ARCHITECTURE.md.
10
+ */
11
+
12
+ declare class PostgresAdapter implements DatabaseAdapter {
13
+ private readonly target;
14
+ readonly engine = "postgres";
15
+ private pool;
16
+ constructor(target: ConnectionTarget);
17
+ private getPool;
18
+ connect(): Promise<void>;
19
+ disconnect(): Promise<void>;
20
+ ping(): Promise<boolean>;
21
+ getVersion(): Promise<string>;
22
+ getOverview(): Promise<DatabaseOverview>;
23
+ getTable(schema: string, table: string): Promise<TableMetadata>;
24
+ getRows(schema: string, table: string, page: number, pageSize: number): Promise<RowPage>;
25
+ runReadOnlyQuery(sql: string): Promise<RowPage>;
26
+ }
27
+ /** Factory that creates {@link PostgresAdapter} instances for Postgres targets. */
28
+ declare const postgresAdapterFactory: AdapterFactory;
29
+
30
+ export { PostgresAdapter, postgresAdapterFactory };
package/dist/index.js ADDED
@@ -0,0 +1,196 @@
1
+ // src/index.ts
2
+ import { assertReadOnly, resolvePageRequest } from "@humbdb/driver-contract";
3
+ import { Pool } from "pg";
4
+ import { assertReadOnly as assertReadOnly2, ReadOnlyViolationError } from "@humbdb/driver-contract";
5
+ var SYSTEM_SCHEMAS = ["pg_catalog", "information_schema", "pg_toast"];
6
+ function quoteIdent(name) {
7
+ return `"${name.replace(/"/g, '""')}"`;
8
+ }
9
+ async function fetchIndexes(pool, schema, table) {
10
+ const result = await pool.query(
11
+ `SELECT
12
+ ic.relname AS index_name,
13
+ ix.indisunique AS is_unique,
14
+ ix.indisprimary AS is_primary,
15
+ array_agg(a.attname::text ORDER BY array_position(ix.indkey, a.attnum)) AS columns
16
+ FROM pg_index ix
17
+ JOIN pg_class ic ON ic.oid = ix.indexrelid
18
+ JOIN pg_class tc ON tc.oid = ix.indrelid
19
+ JOIN pg_namespace n ON n.oid = tc.relnamespace
20
+ JOIN pg_attribute a ON a.attrelid = tc.oid AND a.attnum = ANY(ix.indkey)
21
+ WHERE n.nspname = $1 AND tc.relname = $2
22
+ GROUP BY ic.relname, ix.indisunique, ix.indisprimary
23
+ ORDER BY ic.relname`,
24
+ [schema, table]
25
+ );
26
+ return result.rows.map((row) => ({
27
+ name: row.index_name,
28
+ columns: row.columns,
29
+ unique: row.is_unique,
30
+ primary: row.is_primary
31
+ }));
32
+ }
33
+ async function fetchRowCountEstimate(pool, schema, table) {
34
+ const result = await pool.query(
35
+ `SELECT reltuples::bigint AS estimate
36
+ FROM pg_class c
37
+ JOIN pg_namespace n ON n.oid = c.relnamespace
38
+ WHERE n.nspname = $1 AND c.relname = $2`,
39
+ [schema, table]
40
+ );
41
+ const estimate = result.rows[0]?.estimate;
42
+ if (estimate == null) {
43
+ return void 0;
44
+ }
45
+ const parsed = Number(estimate);
46
+ if (parsed >= 0) {
47
+ return parsed;
48
+ }
49
+ const exact = await pool.query(
50
+ `SELECT COUNT(*) AS count FROM ${quoteIdent(schema)}.${quoteIdent(table)}`
51
+ );
52
+ return Number(exact.rows[0]?.count ?? 0);
53
+ }
54
+ var PostgresAdapter = class {
55
+ constructor(target) {
56
+ this.target = target;
57
+ }
58
+ target;
59
+ engine = "postgres";
60
+ pool;
61
+ getPool() {
62
+ if (!this.pool) {
63
+ throw new Error("PostgresAdapter is not connected. Call connect() first.");
64
+ }
65
+ return this.pool;
66
+ }
67
+ async connect() {
68
+ this.pool = new Pool({ connectionString: this.target.raw });
69
+ this.pool.on("error", (error) => {
70
+ console.error("Postgres pool error (connection dropped):", error.message);
71
+ });
72
+ }
73
+ async disconnect() {
74
+ await this.pool?.end();
75
+ this.pool = void 0;
76
+ }
77
+ async ping() {
78
+ const result = await this.getPool().query("SELECT 1 AS ok");
79
+ return result.rows[0]?.ok === 1;
80
+ }
81
+ async getVersion() {
82
+ const result = await this.getPool().query("SELECT version() AS version");
83
+ const raw = result.rows[0]?.version ?? "";
84
+ const match = /^(\S+)\s+(\S+)/.exec(raw);
85
+ return match ? `${match[1]} ${match[2]}` : raw;
86
+ }
87
+ async getOverview() {
88
+ const result = await this.getPool().query(
89
+ `SELECT table_schema, table_name
90
+ FROM information_schema.tables
91
+ WHERE table_schema <> ALL($1::text[])
92
+ ORDER BY table_schema, table_name`,
93
+ [SYSTEM_SCHEMAS]
94
+ );
95
+ const bySchema = /* @__PURE__ */ new Map();
96
+ for (const row of result.rows) {
97
+ const tables = bySchema.get(row.table_schema) ?? [];
98
+ tables.push(row.table_name);
99
+ bySchema.set(row.table_schema, tables);
100
+ }
101
+ const schemas = [...bySchema.entries()].map(([name, tables]) => ({
102
+ name,
103
+ tables
104
+ }));
105
+ return { engine: "postgres", schemas };
106
+ }
107
+ async getTable(schema, table) {
108
+ const columnsResult = await this.getPool().query(
109
+ `SELECT column_name, data_type, is_nullable
110
+ FROM information_schema.columns
111
+ WHERE table_schema = $1 AND table_name = $2
112
+ ORDER BY ordinal_position`,
113
+ [schema, table]
114
+ );
115
+ const pkResult = await this.getPool().query(
116
+ `SELECT kcu.column_name
117
+ FROM information_schema.table_constraints tc
118
+ JOIN information_schema.key_column_usage kcu
119
+ ON tc.constraint_name = kcu.constraint_name
120
+ AND tc.table_schema = kcu.table_schema
121
+ WHERE tc.constraint_type = 'PRIMARY KEY'
122
+ AND tc.table_schema = $1 AND tc.table_name = $2`,
123
+ [schema, table]
124
+ );
125
+ const primaryKeys = new Set(pkResult.rows.map((row) => row.column_name));
126
+ const fkResult = await this.getPool().query(
127
+ `SELECT kcu.column_name
128
+ FROM information_schema.table_constraints tc
129
+ JOIN information_schema.key_column_usage kcu
130
+ ON tc.constraint_name = kcu.constraint_name
131
+ AND tc.table_schema = kcu.table_schema
132
+ WHERE tc.constraint_type = 'FOREIGN KEY'
133
+ AND tc.table_schema = $1 AND tc.table_name = $2`,
134
+ [schema, table]
135
+ );
136
+ const foreignKeys = new Set(fkResult.rows.map((row) => row.column_name));
137
+ const columns = columnsResult.rows.map((row) => ({
138
+ name: row.column_name,
139
+ dataType: row.data_type,
140
+ nullable: row.is_nullable === "YES",
141
+ isPrimaryKey: primaryKeys.has(row.column_name),
142
+ isForeignKey: foreignKeys.has(row.column_name)
143
+ }));
144
+ const [indexes, rowCount] = await Promise.all([
145
+ fetchIndexes(this.getPool(), schema, table),
146
+ fetchRowCountEstimate(this.getPool(), schema, table)
147
+ ]);
148
+ return { schema, name: table, columns, indexes, rowCount };
149
+ }
150
+ async getRows(schema, table, page, pageSize) {
151
+ const { page: safePage, pageSize: safePageSize, offset } = resolvePageRequest(page, pageSize);
152
+ const result = await this.getPool().query(
153
+ `SELECT * FROM ${quoteIdent(schema)}.${quoteIdent(table)} LIMIT $1 OFFSET $2`,
154
+ [safePageSize, offset]
155
+ );
156
+ return {
157
+ columns: result.fields.map((field) => field.name),
158
+ rows: result.rows,
159
+ page: safePage,
160
+ pageSize: safePageSize
161
+ };
162
+ }
163
+ async runReadOnlyQuery(sql) {
164
+ assertReadOnly(sql);
165
+ const client = await this.getPool().connect();
166
+ try {
167
+ await client.query("BEGIN TRANSACTION READ ONLY");
168
+ const result = await client.query(sql);
169
+ await client.query("COMMIT");
170
+ return {
171
+ columns: result.fields.map((field) => field.name),
172
+ rows: result.rows,
173
+ page: 0,
174
+ pageSize: result.rows.length
175
+ };
176
+ } catch (error) {
177
+ await client.query("ROLLBACK").catch(() => {
178
+ });
179
+ throw error;
180
+ } finally {
181
+ client.release();
182
+ }
183
+ }
184
+ };
185
+ var postgresAdapterFactory = {
186
+ engine: "postgres",
187
+ supports: (target) => target.engine === "postgres",
188
+ create: (target) => new PostgresAdapter(target)
189
+ };
190
+ export {
191
+ PostgresAdapter,
192
+ ReadOnlyViolationError,
193
+ assertReadOnly2 as assertReadOnly,
194
+ postgresAdapterFactory
195
+ };
196
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * PostgreSQL driver for Humb.\n *\n * Implements the engine-agnostic {@link DatabaseAdapter} contract from `@humbdb/driver-contract`.\n * All Postgres-specific SQL and introspection lives here. See ARCHITECTURE.md.\n */\nimport type {\n ColumnMetadata,\n ConnectionTarget,\n DatabaseOverview,\n IndexMetadata,\n RowPage,\n SchemaMetadata,\n TableMetadata\n} from \"@humbdb/core\";\nimport { assertReadOnly, resolvePageRequest } from \"@humbdb/driver-contract\";\nimport type { AdapterFactory, DatabaseAdapter } from \"@humbdb/driver-contract\";\nimport { Pool } from \"pg\";\n\nexport { assertReadOnly, ReadOnlyViolationError } from \"@humbdb/driver-contract\";\n\nconst SYSTEM_SCHEMAS = [\"pg_catalog\", \"information_schema\", \"pg_toast\"];\n\n/** Quote a SQL identifier safely. */\nfunction quoteIdent(name: string): string {\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\n}\n\n/** Fetch index metadata for a table via Postgres's system catalogs. */\nasync function fetchIndexes(pool: Pool, schema: string, table: string): Promise<IndexMetadata[]> {\n const result = await pool.query<{\n index_name: string;\n is_unique: boolean;\n is_primary: boolean;\n columns: string[];\n }>(\n `SELECT\n ic.relname AS index_name,\n ix.indisunique AS is_unique,\n ix.indisprimary AS is_primary,\n array_agg(a.attname::text ORDER BY array_position(ix.indkey, a.attnum)) AS columns\n FROM pg_index ix\n JOIN pg_class ic ON ic.oid = ix.indexrelid\n JOIN pg_class tc ON tc.oid = ix.indrelid\n JOIN pg_namespace n ON n.oid = tc.relnamespace\n JOIN pg_attribute a ON a.attrelid = tc.oid AND a.attnum = ANY(ix.indkey)\n WHERE n.nspname = $1 AND tc.relname = $2\n GROUP BY ic.relname, ix.indisunique, ix.indisprimary\n ORDER BY ic.relname`,\n [schema, table]\n );\n\n return result.rows.map((row) => ({\n name: row.index_name,\n columns: row.columns,\n unique: row.is_unique,\n primary: row.is_primary\n }));\n}\n\n/** Approximate row count from Postgres's planner statistics (fast; avoids a full table scan). */\nasync function fetchRowCountEstimate(\n pool: Pool,\n schema: string,\n table: string\n): Promise<number | undefined> {\n const result = await pool.query<{ estimate: string | null }>(\n `SELECT reltuples::bigint AS estimate\n FROM pg_class c\n JOIN pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = $1 AND c.relname = $2`,\n [schema, table]\n );\n\n const estimate = result.rows[0]?.estimate;\n if (estimate == null) {\n return undefined;\n }\n\n // reltuples is -1 for a table that has never been ANALYZEd (common right after creation).\n // Fall back to an exact count rather than surface a nonsensical negative number.\n const parsed = Number(estimate);\n if (parsed >= 0) {\n return parsed;\n }\n\n const exact = await pool.query<{ count: string }>(\n `SELECT COUNT(*) AS count FROM ${quoteIdent(schema)}.${quoteIdent(table)}`\n );\n return Number(exact.rows[0]?.count ?? 0);\n}\n\nexport class PostgresAdapter implements DatabaseAdapter {\n public readonly engine = \"postgres\";\n private pool: Pool | undefined;\n\n constructor(private readonly target: ConnectionTarget) {}\n\n private getPool(): Pool {\n if (!this.pool) {\n throw new Error(\"PostgresAdapter is not connected. Call connect() first.\");\n }\n return this.pool;\n }\n\n async connect(): Promise<void> {\n this.pool = new Pool({ connectionString: this.target.raw });\n // pg emits \"error\" on the pool when an idle client's connection is dropped by the\n // database (restart, network blip, admin kill). Without a listener, Node treats that as an\n // unhandled error and crashes the whole process - the opposite of what /api/health is for.\n this.pool.on(\"error\", (error) => {\n console.error(\"Postgres pool error (connection dropped):\", error.message);\n });\n }\n\n async disconnect(): Promise<void> {\n await this.pool?.end();\n this.pool = undefined;\n }\n\n async ping(): Promise<boolean> {\n const result = await this.getPool().query(\"SELECT 1 AS ok\");\n return result.rows[0]?.ok === 1;\n }\n\n async getVersion(): Promise<string> {\n const result = await this.getPool().query<{ version: string }>(\"SELECT version() AS version\");\n const raw = result.rows[0]?.version ?? \"\";\n // e.g. \"PostgreSQL 16.4 (Debian 16.4-1.pgdg120+1) on x86_64-pc-linux-gnu, ...\" -> \"PostgreSQL 16.4\".\n const match = /^(\\S+)\\s+(\\S+)/.exec(raw);\n return match ? `${match[1]} ${match[2]}` : raw;\n }\n\n async getOverview(): Promise<DatabaseOverview> {\n const result = await this.getPool().query<{ table_schema: string; table_name: string }>(\n `SELECT table_schema, table_name\n FROM information_schema.tables\n WHERE table_schema <> ALL($1::text[])\n ORDER BY table_schema, table_name`,\n [SYSTEM_SCHEMAS]\n );\n\n const bySchema = new Map<string, string[]>();\n for (const row of result.rows) {\n const tables = bySchema.get(row.table_schema) ?? [];\n tables.push(row.table_name);\n bySchema.set(row.table_schema, tables);\n }\n\n const schemas: SchemaMetadata[] = [...bySchema.entries()].map(([name, tables]) => ({\n name,\n tables\n }));\n\n return { engine: \"postgres\", schemas };\n }\n\n async getTable(schema: string, table: string): Promise<TableMetadata> {\n const columnsResult = await this.getPool().query<{\n column_name: string;\n data_type: string;\n is_nullable: \"YES\" | \"NO\";\n }>(\n `SELECT column_name, data_type, is_nullable\n FROM information_schema.columns\n WHERE table_schema = $1 AND table_name = $2\n ORDER BY ordinal_position`,\n [schema, table]\n );\n\n const pkResult = await this.getPool().query<{ column_name: string }>(\n `SELECT kcu.column_name\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n WHERE tc.constraint_type = 'PRIMARY KEY'\n AND tc.table_schema = $1 AND tc.table_name = $2`,\n [schema, table]\n );\n const primaryKeys = new Set(pkResult.rows.map((row) => row.column_name));\n\n const fkResult = await this.getPool().query<{ column_name: string }>(\n `SELECT kcu.column_name\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.table_schema = $1 AND tc.table_name = $2`,\n [schema, table]\n );\n const foreignKeys = new Set(fkResult.rows.map((row) => row.column_name));\n\n const columns: ColumnMetadata[] = columnsResult.rows.map((row) => ({\n name: row.column_name,\n dataType: row.data_type,\n nullable: row.is_nullable === \"YES\",\n isPrimaryKey: primaryKeys.has(row.column_name),\n isForeignKey: foreignKeys.has(row.column_name)\n }));\n\n const [indexes, rowCount] = await Promise.all([\n fetchIndexes(this.getPool(), schema, table),\n fetchRowCountEstimate(this.getPool(), schema, table)\n ]);\n\n return { schema, name: table, columns, indexes, rowCount };\n }\n\n async getRows(schema: string, table: string, page: number, pageSize: number): Promise<RowPage> {\n const { page: safePage, pageSize: safePageSize, offset } = resolvePageRequest(page, pageSize);\n\n const result = await this.getPool().query(\n `SELECT * FROM ${quoteIdent(schema)}.${quoteIdent(table)} LIMIT $1 OFFSET $2`,\n [safePageSize, offset]\n );\n\n return {\n columns: result.fields.map((field) => field.name),\n rows: result.rows as Array<Record<string, unknown>>,\n page: safePage,\n pageSize: safePageSize\n };\n }\n\n async runReadOnlyQuery(sql: string): Promise<RowPage> {\n assertReadOnly(sql);\n\n // assertReadOnly is a heuristic string check and can be bypassed (e.g. a writable CTE like\n // `WITH x AS (DELETE FROM t RETURNING *) SELECT * FROM x` starts with the allowed \"with\"\n // keyword). Running inside a real Postgres READ ONLY transaction is the authoritative\n // guarantee: Postgres itself refuses any data-modifying statement here, regardless of what the\n // string check missed.\n const client = await this.getPool().connect();\n try {\n await client.query(\"BEGIN TRANSACTION READ ONLY\");\n const result = await client.query(sql);\n await client.query(\"COMMIT\");\n return {\n columns: result.fields.map((field) => field.name),\n rows: result.rows as Array<Record<string, unknown>>,\n page: 0,\n pageSize: result.rows.length\n };\n } catch (error) {\n await client.query(\"ROLLBACK\").catch(() => {});\n throw error;\n } finally {\n client.release();\n }\n }\n}\n\n/** Factory that creates {@link PostgresAdapter} instances for Postgres targets. */\nexport const postgresAdapterFactory: AdapterFactory = {\n engine: \"postgres\",\n supports: (target) => target.engine === \"postgres\",\n create: (target) => new PostgresAdapter(target)\n};\n"],"mappings":"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","names":["assertReadOnly"]}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@humbdb/postgres",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "description": "PostgreSQL adapter for Humb.",
6
+ "license": "MIT",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
+ }
12
+ },
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "dependencies": {
19
+ "pg": "^8.13.1",
20
+ "@humbdb/core": "0.0.1",
21
+ "@humbdb/driver-contract": "0.0.1"
22
+ },
23
+ "devDependencies": {
24
+ "@types/pg": "^8.11.10",
25
+ "@humbdb/testing": "0.0.0",
26
+ "@humbdb/config": "0.0.0"
27
+ },
28
+ "scripts": {
29
+ "build": "tsup",
30
+ "dev": "tsup --watch",
31
+ "typecheck": "tsc --noEmit",
32
+ "test": "vitest run",
33
+ "clean": "rimraf dist .turbo"
34
+ }
35
+ }