@querypanel/node-sdk 1.0.8 → 1.0.9

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 (70) hide show
  1. package/README.md +174 -0
  2. package/dist/cjs/adapters/clickhouse.d.ts +36 -0
  3. package/dist/cjs/adapters/clickhouse.d.ts.map +1 -0
  4. package/dist/cjs/adapters/clickhouse.js +256 -0
  5. package/dist/cjs/adapters/clickhouse.js.map +1 -0
  6. package/dist/cjs/adapters/introspection.spec.d.ts +2 -0
  7. package/dist/cjs/adapters/introspection.spec.d.ts.map +1 -0
  8. package/dist/cjs/adapters/introspection.spec.js +201 -0
  9. package/dist/cjs/adapters/introspection.spec.js.map +1 -0
  10. package/dist/cjs/adapters/postgres.d.ts +29 -0
  11. package/dist/cjs/adapters/postgres.d.ts.map +1 -0
  12. package/dist/cjs/adapters/postgres.js +384 -0
  13. package/dist/cjs/adapters/postgres.js.map +1 -0
  14. package/dist/cjs/adapters/types.d.ts +34 -0
  15. package/dist/cjs/adapters/types.d.ts.map +1 -0
  16. package/dist/cjs/adapters/types.js +3 -0
  17. package/dist/cjs/adapters/types.js.map +1 -0
  18. package/dist/cjs/anonymize.spec.d.ts +2 -0
  19. package/dist/cjs/anonymize.spec.d.ts.map +1 -0
  20. package/dist/cjs/anonymize.spec.js +80 -0
  21. package/dist/cjs/anonymize.spec.js.map +1 -0
  22. package/dist/cjs/clickhouseClient.spec.d.ts +2 -0
  23. package/dist/cjs/clickhouseClient.spec.d.ts.map +1 -0
  24. package/dist/cjs/clickhouseClient.spec.js +286 -0
  25. package/dist/cjs/clickhouseClient.spec.js.map +1 -0
  26. package/dist/cjs/index.d.ts +46 -1
  27. package/dist/cjs/index.d.ts.map +1 -1
  28. package/dist/cjs/index.js +221 -53
  29. package/dist/cjs/index.js.map +1 -1
  30. package/dist/cjs/index.test.js +34 -7
  31. package/dist/cjs/index.test.js.map +1 -1
  32. package/dist/cjs/multidb.spec.d.ts +2 -0
  33. package/dist/cjs/multidb.spec.d.ts.map +1 -0
  34. package/dist/cjs/multidb.spec.js +76 -0
  35. package/dist/cjs/multidb.spec.js.map +1 -0
  36. package/dist/esm/adapters/clickhouse.d.ts +36 -0
  37. package/dist/esm/adapters/clickhouse.d.ts.map +1 -0
  38. package/dist/esm/adapters/clickhouse.js +252 -0
  39. package/dist/esm/adapters/clickhouse.js.map +1 -0
  40. package/dist/esm/adapters/introspection.spec.d.ts +2 -0
  41. package/dist/esm/adapters/introspection.spec.d.ts.map +1 -0
  42. package/dist/esm/adapters/introspection.spec.js +199 -0
  43. package/dist/esm/adapters/introspection.spec.js.map +1 -0
  44. package/dist/esm/adapters/postgres.d.ts +29 -0
  45. package/dist/esm/adapters/postgres.d.ts.map +1 -0
  46. package/dist/esm/adapters/postgres.js +380 -0
  47. package/dist/esm/adapters/postgres.js.map +1 -0
  48. package/dist/esm/adapters/types.d.ts +34 -0
  49. package/dist/esm/adapters/types.d.ts.map +1 -0
  50. package/dist/esm/adapters/types.js +2 -0
  51. package/dist/esm/adapters/types.js.map +1 -0
  52. package/dist/esm/anonymize.spec.d.ts +2 -0
  53. package/dist/esm/anonymize.spec.d.ts.map +1 -0
  54. package/dist/esm/anonymize.spec.js +78 -0
  55. package/dist/esm/anonymize.spec.js.map +1 -0
  56. package/dist/esm/clickhouseClient.spec.d.ts +2 -0
  57. package/dist/esm/clickhouseClient.spec.d.ts.map +1 -0
  58. package/dist/esm/clickhouseClient.spec.js +281 -0
  59. package/dist/esm/clickhouseClient.spec.js.map +1 -0
  60. package/dist/esm/index.d.ts +46 -1
  61. package/dist/esm/index.d.ts.map +1 -1
  62. package/dist/esm/index.js +220 -53
  63. package/dist/esm/index.js.map +1 -1
  64. package/dist/esm/index.test.js +34 -7
  65. package/dist/esm/index.test.js.map +1 -1
  66. package/dist/esm/multidb.spec.d.ts +2 -0
  67. package/dist/esm/multidb.spec.d.ts.map +1 -0
  68. package/dist/esm/multidb.spec.js +74 -0
  69. package/dist/esm/multidb.spec.js.map +1 -0
  70. package/package.json +5 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multidb.spec.js","sourceRoot":"","sources":["../../src/multidb.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { ClickHouseSettings, QueryParams, Row } from "@clickhouse/client";
2
+ import type { IntrospectOptions, SchemaIntrospection } from "../schema/types.js";
3
+ import type { DatabaseAdapter, DatabaseExecutionResult } from "./types.js";
4
+ export interface ClickHouseAdapterOptions {
5
+ /** Optional logical database name used in introspection metadata. */
6
+ database?: string;
7
+ /** Override the default response format used for query execution. */
8
+ defaultFormat?: QueryParams["format"];
9
+ /**
10
+ * Optional database kind label. Defaults to "clickhouse" but allows
11
+ * sub-classing/custom branding if needed.
12
+ */
13
+ kind?: SchemaIntrospection["db"]["kind"];
14
+ }
15
+ export type ClickHouseQueryResult = {
16
+ json: () => Promise<unknown>;
17
+ };
18
+ export type ClickHouseClientFn = (params: QueryParams & {
19
+ query_params?: Record<string, unknown>;
20
+ clickhouse_settings?: ClickHouseSettings;
21
+ }) => Promise<ClickHouseQueryResult | Array<Record<string, unknown>> | Row[]>;
22
+ export declare class ClickHouseAdapter implements DatabaseAdapter {
23
+ private readonly clientFn;
24
+ private readonly databaseName;
25
+ private readonly defaultFormat;
26
+ private readonly kind;
27
+ constructor(clientFn: ClickHouseClientFn, options?: ClickHouseAdapterOptions);
28
+ execute(sql: string): Promise<DatabaseExecutionResult>;
29
+ validate(sql: string): Promise<void>;
30
+ getDialect(): "clickhouse";
31
+ introspect(options?: IntrospectOptions): Promise<SchemaIntrospection>;
32
+ close(): Promise<void>;
33
+ private query;
34
+ private extractRows;
35
+ }
36
+ //# sourceMappingURL=clickhouse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clickhouse.d.ts","sourceRoot":"","sources":["../../../src/adapters/clickhouse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,KAAK,EAEV,iBAAiB,EACjB,mBAAmB,EAEpB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,WAAW,wBAAwB;IACvC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,aAAa,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IACtC;;;OAGG;IACH,IAAI,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,MAAM,qBAAqB,GAAG;IAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,kBAAkB,GAAG,CAC/B,MAAM,EAAE,WAAW,GAAG;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,mBAAmB,CAAC,EAAE,kBAAkB,CAAC;CAC1C,KACE,OAAO,CAAC,qBAAqB,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;AAkC7E,qBAAa,iBAAkB,YAAW,eAAe;IAMrD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;gBAGtC,QAAQ,EAAE,kBAAkB,EAC7C,OAAO,GAAE,wBAA6B;IAOlC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAQtD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,UAAU,IACD,YAAY;IAGf,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAyGrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAId,KAAK;YAyBL,WAAW;CAiB1B"}
@@ -0,0 +1,252 @@
1
+ import { extractFixedStringLength, extractPrecisionScale, isNullableType, parseKeyExpression, unwrapTypeModifiers, } from "../utils/clickhouse.js";
2
+ export class ClickHouseAdapter {
3
+ constructor(clientFn, options = {}) {
4
+ this.clientFn = clientFn;
5
+ this.databaseName = options.database ?? "default";
6
+ this.defaultFormat = options.defaultFormat ?? "JSONEachRow";
7
+ this.kind = options.kind ?? "clickhouse";
8
+ }
9
+ async execute(sql) {
10
+ const rows = await this.query(sql, {
11
+ format: this.defaultFormat,
12
+ });
13
+ const fields = rows.length > 0 ? Object.keys(rows[0] ?? {}) : [];
14
+ return { fields, rows };
15
+ }
16
+ async validate(sql) {
17
+ await this.query(`EXPLAIN ${sql}`, { format: this.defaultFormat });
18
+ }
19
+ getDialect() {
20
+ return "clickhouse";
21
+ }
22
+ async introspect(options) {
23
+ const allowTables = normalizeTableFilter(options?.tables);
24
+ const hasFilter = allowTables.length > 0;
25
+ const queryParams = {
26
+ db: this.databaseName,
27
+ };
28
+ if (hasFilter) {
29
+ queryParams.tables = allowTables;
30
+ }
31
+ const filterClause = hasFilter ? " AND name IN {tables:Array(String)}" : "";
32
+ const tables = await this.query(`SELECT name, engine, comment, total_rows, total_bytes, is_view, primary_key, sorting_key
33
+ FROM system.tables
34
+ WHERE database = {db:String}${filterClause}
35
+ ORDER BY name`, { params: queryParams });
36
+ const columnFilterClause = hasFilter
37
+ ? " AND table IN {tables:Array(String)}"
38
+ : "";
39
+ const columns = await this.query(`SELECT table, name, type, position, default_kind, default_expression, comment,
40
+ codec_expression, ttl_expression, is_in_primary_key,
41
+ data_compressed_bytes, data_uncompressed_bytes
42
+ FROM system.columns
43
+ WHERE database = {db:String}${columnFilterClause}
44
+ ORDER BY table, position`, { params: queryParams });
45
+ const columnsByTable = new Map();
46
+ for (const rawColumn of columns) {
47
+ const list = columnsByTable.get(rawColumn.table) ?? [];
48
+ list.push(transformColumnRow(rawColumn));
49
+ columnsByTable.set(rawColumn.table, list);
50
+ }
51
+ const tableSchemas = tables.map((table) => {
52
+ const tableColumns = columnsByTable.get(table.name) ?? [];
53
+ const primaryKeyColumns = parseKeyExpression(table.primary_key);
54
+ const totalRows = toNumber(table.total_rows);
55
+ const totalBytes = toNumber(table.total_bytes);
56
+ for (const column of tableColumns) {
57
+ column.isPrimaryKey =
58
+ column.isPrimaryKey || primaryKeyColumns.includes(column.name);
59
+ }
60
+ const indexes = primaryKeyColumns.length
61
+ ? [
62
+ {
63
+ name: "primary_key",
64
+ columns: primaryKeyColumns,
65
+ unique: true,
66
+ type: "PRIMARY KEY",
67
+ ...(table.primary_key ? { definition: table.primary_key } : {}),
68
+ },
69
+ ]
70
+ : [];
71
+ const constraints = primaryKeyColumns.length
72
+ ? [
73
+ {
74
+ name: "primary_key",
75
+ type: "PRIMARY KEY",
76
+ columns: primaryKeyColumns,
77
+ },
78
+ ]
79
+ : [];
80
+ const base = {
81
+ name: table.name,
82
+ schema: this.databaseName,
83
+ type: asTableType(table.is_view),
84
+ engine: table.engine,
85
+ columns: tableColumns,
86
+ indexes,
87
+ constraints,
88
+ };
89
+ const comment = sanitize(table.comment);
90
+ if (comment !== undefined) {
91
+ base.comment = comment;
92
+ }
93
+ const statistics = buildTableStatistics(totalRows, totalBytes);
94
+ if (statistics) {
95
+ base.statistics = statistics;
96
+ }
97
+ return base;
98
+ });
99
+ return {
100
+ db: {
101
+ kind: this.kind,
102
+ name: this.databaseName,
103
+ },
104
+ tables: tableSchemas,
105
+ introspectedAt: new Date().toISOString(),
106
+ };
107
+ }
108
+ async close() {
109
+ // No-op: lifecycle of the underlying client is controlled by the caller.
110
+ }
111
+ async query(sql, options) {
112
+ const params = {
113
+ query: sql,
114
+ };
115
+ const format = options?.format ?? this.defaultFormat;
116
+ if (format !== undefined) {
117
+ params.format = format;
118
+ }
119
+ if (options?.params) {
120
+ params.query_params = options.params;
121
+ }
122
+ if (options?.settings) {
123
+ params.clickhouse_settings = options.settings;
124
+ }
125
+ const result = await this.clientFn(params);
126
+ return this.extractRows(result);
127
+ }
128
+ async extractRows(result) {
129
+ if (Array.isArray(result)) {
130
+ return result;
131
+ }
132
+ if (result &&
133
+ typeof result.json === "function") {
134
+ const payload = await result.json();
135
+ return normalizePayload(payload);
136
+ }
137
+ return [];
138
+ }
139
+ }
140
+ function normalizePayload(payload) {
141
+ if (Array.isArray(payload)) {
142
+ return payload;
143
+ }
144
+ if (payload && typeof payload === "object") {
145
+ const maybeData = payload.data;
146
+ if (Array.isArray(maybeData)) {
147
+ return maybeData;
148
+ }
149
+ }
150
+ return [];
151
+ }
152
+ function normalizeTableFilter(tables) {
153
+ if (!tables?.length)
154
+ return [];
155
+ const seen = new Set();
156
+ const normalized = [];
157
+ for (const table of tables) {
158
+ if (!table)
159
+ continue;
160
+ const trimmed = table.trim();
161
+ if (!trimmed)
162
+ continue;
163
+ const parts = trimmed.split(".");
164
+ const tableName = parts[parts.length - 1];
165
+ if (!tableName || seen.has(tableName))
166
+ continue;
167
+ seen.add(tableName);
168
+ normalized.push(tableName);
169
+ }
170
+ return normalized;
171
+ }
172
+ function transformColumnRow(row) {
173
+ const nullable = isNullableType(row.type);
174
+ const unwrappedType = unwrapTypeModifiers(row.type);
175
+ const { precision, scale } = extractPrecisionScale(row.type);
176
+ const maxLength = extractFixedStringLength(row.type);
177
+ const compressedBytes = toNumber(row.data_compressed_bytes);
178
+ const uncompressedBytes = toNumber(row.data_uncompressed_bytes);
179
+ const column = {
180
+ name: row.name,
181
+ type: unwrappedType,
182
+ rawType: row.type,
183
+ nullable,
184
+ isPrimaryKey: Boolean(toNumber(row.is_in_primary_key)),
185
+ isForeignKey: false,
186
+ };
187
+ const defaultKind = sanitize(row.default_kind);
188
+ if (defaultKind !== undefined)
189
+ column.defaultKind = defaultKind;
190
+ const defaultExpression = sanitize(row.default_expression);
191
+ if (defaultExpression !== undefined) {
192
+ column.defaultExpression = defaultExpression;
193
+ }
194
+ const comment = sanitize(row.comment);
195
+ if (comment !== undefined)
196
+ column.comment = comment;
197
+ const codec = sanitize(row.codec_expression);
198
+ if (codec !== undefined)
199
+ column.codec = codec;
200
+ const ttlExpression = sanitize(row.ttl_expression);
201
+ if (ttlExpression !== undefined)
202
+ column.ttlExpression = ttlExpression;
203
+ if (maxLength !== undefined)
204
+ column.maxLength = maxLength;
205
+ if (precision !== undefined)
206
+ column.precision = precision;
207
+ if (scale !== undefined)
208
+ column.scale = scale;
209
+ if (compressedBytes !== undefined || uncompressedBytes !== undefined) {
210
+ column.statistics = {};
211
+ if (compressedBytes !== undefined)
212
+ column.statistics.compressedBytes = compressedBytes;
213
+ if (uncompressedBytes !== undefined)
214
+ column.statistics.uncompressedBytes = uncompressedBytes;
215
+ }
216
+ return column;
217
+ }
218
+ function asTableType(isView) {
219
+ if (typeof isView === "number") {
220
+ return isView > 0 ? "view" : "table";
221
+ }
222
+ if (typeof isView === "string") {
223
+ const normalized = isView.toLowerCase();
224
+ return normalized === "1" || normalized === "true" ? "view" : "table";
225
+ }
226
+ return "table";
227
+ }
228
+ function buildTableStatistics(totalRows, totalBytes) {
229
+ if (totalRows === undefined && totalBytes === undefined)
230
+ return undefined;
231
+ const stats = {};
232
+ if (totalRows !== undefined)
233
+ stats.totalRows = totalRows;
234
+ if (totalBytes !== undefined)
235
+ stats.totalBytes = totalBytes;
236
+ return stats;
237
+ }
238
+ function sanitize(value) {
239
+ if (value === null || value === undefined)
240
+ return undefined;
241
+ const trimmed = String(value).trim();
242
+ return trimmed.length ? trimmed : undefined;
243
+ }
244
+ function toNumber(value) {
245
+ if (value === null || value === undefined)
246
+ return undefined;
247
+ if (typeof value === "number")
248
+ return value;
249
+ const parsed = Number.parseFloat(String(value));
250
+ return Number.isNaN(parsed) ? undefined : parsed;
251
+ }
252
+ //# sourceMappingURL=clickhouse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clickhouse.js","sourceRoot":"","sources":["../../../src/adapters/clickhouse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=introspection.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspection.spec.d.ts","sourceRoot":"","sources":["../../../src/adapters/introspection.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,199 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { ClickHouseAdapter, } from "./clickhouse.js";
3
+ import { PostgresAdapter, } from "./postgres.js";
4
+ function createClickHouseResponse(rows) {
5
+ return {
6
+ json: async () => rows,
7
+ };
8
+ }
9
+ describe("Database adapter introspection", () => {
10
+ it("introspects ClickHouse tables", async () => {
11
+ const clientFn = vi.fn(async ({ query }) => {
12
+ if (query.includes("FROM system.tables")) {
13
+ return createClickHouseResponse([
14
+ {
15
+ name: "events",
16
+ engine: "MergeTree",
17
+ comment: "Main events table",
18
+ total_rows: "1000",
19
+ total_bytes: "2048",
20
+ is_view: "0",
21
+ primary_key: "(id)",
22
+ sorting_key: null,
23
+ },
24
+ ]);
25
+ }
26
+ if (query.includes("FROM system.columns")) {
27
+ return createClickHouseResponse([
28
+ {
29
+ table: "events",
30
+ name: "id",
31
+ type: "UInt64",
32
+ position: 1,
33
+ default_kind: null,
34
+ default_expression: null,
35
+ comment: "Primary identifier",
36
+ codec_expression: null,
37
+ ttl_expression: null,
38
+ is_in_primary_key: "1",
39
+ data_compressed_bytes: "128",
40
+ data_uncompressed_bytes: "256",
41
+ },
42
+ {
43
+ table: "events",
44
+ name: "name",
45
+ type: "Nullable(String)",
46
+ position: 2,
47
+ default_kind: null,
48
+ default_expression: null,
49
+ comment: null,
50
+ codec_expression: null,
51
+ ttl_expression: null,
52
+ is_in_primary_key: "0",
53
+ data_compressed_bytes: null,
54
+ data_uncompressed_bytes: null,
55
+ },
56
+ ]);
57
+ }
58
+ return createClickHouseResponse([]);
59
+ });
60
+ const adapter = new ClickHouseAdapter(clientFn, {
61
+ database: "analytics",
62
+ });
63
+ const result = await adapter.introspect();
64
+ expect(result.db.name).toBe("analytics");
65
+ expect(result.tables).toHaveLength(1);
66
+ const table = result.tables[0];
67
+ if (!table)
68
+ throw new Error("missing table");
69
+ expect(table.columns.map((c) => c.name)).toEqual(["id", "name"]);
70
+ const idColumn = table.columns.find((c) => c.name === "id");
71
+ expect(idColumn?.isPrimaryKey).toBe(true);
72
+ expect(table.indexes[0]?.name).toBe("primary_key");
73
+ });
74
+ it("introspects Postgres tables", async () => {
75
+ const responses = new Map();
76
+ responses.set("tables", () => ({
77
+ rows: [
78
+ {
79
+ table_name: "users",
80
+ schema_name: "public",
81
+ table_type: "BASE TABLE",
82
+ comment: "application users",
83
+ total_rows: 200,
84
+ total_bytes: 4096,
85
+ },
86
+ ],
87
+ fields: [],
88
+ }));
89
+ responses.set("columns", () => ({
90
+ rows: [
91
+ {
92
+ table_name: "users",
93
+ table_schema: "public",
94
+ column_name: "id",
95
+ data_type: "integer",
96
+ udt_name: "int4",
97
+ is_nullable: "NO",
98
+ column_default: "nextval('users_id_seq'::regclass)",
99
+ character_maximum_length: null,
100
+ numeric_precision: 32,
101
+ numeric_scale: 0,
102
+ ordinal_position: 1,
103
+ description: "primary key",
104
+ },
105
+ {
106
+ table_name: "users",
107
+ table_schema: "public",
108
+ column_name: "role_id",
109
+ data_type: "integer",
110
+ udt_name: "int4",
111
+ is_nullable: "YES",
112
+ column_default: null,
113
+ character_maximum_length: null,
114
+ numeric_precision: 32,
115
+ numeric_scale: 0,
116
+ ordinal_position: 2,
117
+ description: null,
118
+ },
119
+ ],
120
+ fields: [],
121
+ }));
122
+ responses.set("constraints", () => ({
123
+ rows: [
124
+ {
125
+ table_schema: "public",
126
+ table_name: "users",
127
+ constraint_name: "users_pkey",
128
+ constraint_type: "PRIMARY KEY",
129
+ column_name: "id",
130
+ foreign_table_schema: null,
131
+ foreign_table_name: null,
132
+ foreign_column_name: null,
133
+ },
134
+ {
135
+ table_schema: "public",
136
+ table_name: "users",
137
+ constraint_name: "users_role_id_fkey",
138
+ constraint_type: "FOREIGN KEY",
139
+ column_name: "role_id",
140
+ foreign_table_schema: "public",
141
+ foreign_table_name: "roles",
142
+ foreign_column_name: "id",
143
+ },
144
+ ],
145
+ fields: [],
146
+ }));
147
+ responses.set("indexes", () => ({
148
+ rows: [
149
+ {
150
+ schema_name: "public",
151
+ table_name: "users",
152
+ index_name: "users_pkey",
153
+ indisunique: true,
154
+ column_names: ["id"],
155
+ definition: "CREATE UNIQUE INDEX users_pkey ON public.users USING btree (id)",
156
+ },
157
+ ],
158
+ fields: [],
159
+ }));
160
+ let indexQuerySql = null;
161
+ let lastSql = null;
162
+ const clientFn = vi.fn(async (sql) => {
163
+ lastSql = sql;
164
+ if (/pg_index\s+idx/.test(sql)) {
165
+ indexQuerySql = sql;
166
+ return responses.get("indexes")?.() ?? { rows: [], fields: [] };
167
+ }
168
+ if (sql.includes("FROM pg_class c")) {
169
+ return responses.get("tables")?.() ?? { rows: [], fields: [] };
170
+ }
171
+ if (sql.includes("information_schema.columns")) {
172
+ return responses.get("columns")?.() ?? { rows: [], fields: [] };
173
+ }
174
+ if (sql.includes("table_constraints")) {
175
+ return responses.get("constraints")?.() ?? { rows: [], fields: [] };
176
+ }
177
+ return { rows: [], fields: [] };
178
+ });
179
+ const adapter = new PostgresAdapter(clientFn, {
180
+ database: "app",
181
+ defaultSchema: "public",
182
+ });
183
+ const result = await adapter.introspect();
184
+ if (!indexQuerySql) {
185
+ throw new Error(`index query not executed. last sql: ${lastSql}`);
186
+ }
187
+ expect(result.db.name).toBe("app");
188
+ const table = result.tables[0];
189
+ if (!table)
190
+ throw new Error("expected table");
191
+ expect(table.constraints).toHaveLength(2);
192
+ const fk = table.constraints.find((c) => c.type === "FOREIGN KEY");
193
+ expect(fk?.referencedTable).toBe("public.roles");
194
+ const roleColumn = table.columns.find((c) => c.name === "role_id");
195
+ expect(roleColumn?.isForeignKey).toBe(true);
196
+ expect(table.indexes[0]?.columns).toEqual(["id"]);
197
+ });
198
+ });
199
+ //# sourceMappingURL=introspection.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspection.spec.js","sourceRoot":"","sources":["../../../src/adapters/introspection.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { IntrospectOptions, SchemaIntrospection } from "../schema/types.js";
2
+ import type { DatabaseAdapter, DatabaseExecutionResult } from "./types.js";
3
+ export interface PostgresQueryResult {
4
+ rows: Array<Record<string, unknown>>;
5
+ fields: Array<{
6
+ name: string;
7
+ }>;
8
+ }
9
+ export type PostgresClientFn = (sql: string) => Promise<PostgresQueryResult>;
10
+ export interface PostgresAdapterOptions {
11
+ /** Logical database name used in introspection metadata. */
12
+ database?: string;
13
+ /** Schema to assume when a table is provided without qualification. */
14
+ defaultSchema?: string;
15
+ /** Optional database kind label. Defaults to "postgres". */
16
+ kind?: SchemaIntrospection["db"]["kind"];
17
+ }
18
+ export declare class PostgresAdapter implements DatabaseAdapter {
19
+ private readonly clientFn;
20
+ private readonly databaseName;
21
+ private readonly defaultSchema;
22
+ private readonly kind;
23
+ constructor(clientFn: PostgresClientFn, options?: PostgresAdapterOptions);
24
+ execute(sql: string): Promise<DatabaseExecutionResult>;
25
+ validate(sql: string): Promise<void>;
26
+ getDialect(): "postgres";
27
+ introspect(options?: IntrospectOptions): Promise<SchemaIntrospection>;
28
+ }
29
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../../src/adapters/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,iBAAiB,EACjB,mBAAmB,EAEpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAE7E,MAAM,WAAW,sBAAsB;IACrC,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;CAC1C;AAmDD,qBAAa,eAAgB,YAAW,eAAe;IAMnD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;gBAGtC,QAAQ,EAAE,gBAAgB,EAC3C,OAAO,GAAE,sBAA2B;IAOhC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAMtD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,UAAU,IACD,UAAU;IAGb,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CA0K5E"}