dbgraph 0.1.0

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 (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +347 -0
  3. package/dist/bin/dbgraph.d.ts +8 -0
  4. package/dist/bin/dbgraph.d.ts.map +1 -0
  5. package/dist/bin/dbgraph.js +382 -0
  6. package/dist/bin/dbgraph.js.map +1 -0
  7. package/dist/config.d.ts +25 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +158 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/context/formatter.d.ts +94 -0
  12. package/dist/context/formatter.d.ts.map +1 -0
  13. package/dist/context/formatter.js +288 -0
  14. package/dist/context/formatter.js.map +1 -0
  15. package/dist/context/index.d.ts +77 -0
  16. package/dist/context/index.d.ts.map +1 -0
  17. package/dist/context/index.js +458 -0
  18. package/dist/context/index.js.map +1 -0
  19. package/dist/db/index.d.ts +26 -0
  20. package/dist/db/index.d.ts.map +1 -0
  21. package/dist/db/index.js +127 -0
  22. package/dist/db/index.js.map +1 -0
  23. package/dist/db/migrations.d.ts +8 -0
  24. package/dist/db/migrations.d.ts.map +1 -0
  25. package/dist/db/migrations.js +39 -0
  26. package/dist/db/migrations.js.map +1 -0
  27. package/dist/db/queries.d.ts +46 -0
  28. package/dist/db/queries.d.ts.map +1 -0
  29. package/dist/db/queries.js +436 -0
  30. package/dist/db/queries.js.map +1 -0
  31. package/dist/db/schema.sql +113 -0
  32. package/dist/db/sqlite-adapter.d.ts +30 -0
  33. package/dist/db/sqlite-adapter.d.ts.map +1 -0
  34. package/dist/db/sqlite-adapter.js +78 -0
  35. package/dist/db/sqlite-adapter.js.map +1 -0
  36. package/dist/directory.d.ts +37 -0
  37. package/dist/directory.d.ts.map +1 -0
  38. package/dist/directory.js +160 -0
  39. package/dist/directory.js.map +1 -0
  40. package/dist/errors.d.ts +46 -0
  41. package/dist/errors.d.ts.map +1 -0
  42. package/dist/errors.js +90 -0
  43. package/dist/errors.js.map +1 -0
  44. package/dist/graph/traversal.d.ts +157 -0
  45. package/dist/graph/traversal.d.ts.map +1 -0
  46. package/dist/graph/traversal.js +531 -0
  47. package/dist/graph/traversal.js.map +1 -0
  48. package/dist/index.d.ts +183 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +435 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/introspect/base.d.ts +62 -0
  53. package/dist/introspect/base.d.ts.map +1 -0
  54. package/dist/introspect/base.js +107 -0
  55. package/dist/introspect/base.js.map +1 -0
  56. package/dist/introspect/connection.d.ts +30 -0
  57. package/dist/introspect/connection.d.ts.map +1 -0
  58. package/dist/introspect/connection.js +232 -0
  59. package/dist/introspect/connection.js.map +1 -0
  60. package/dist/introspect/index.d.ts +23 -0
  61. package/dist/introspect/index.d.ts.map +1 -0
  62. package/dist/introspect/index.js +46 -0
  63. package/dist/introspect/index.js.map +1 -0
  64. package/dist/introspect/mysql.d.ts +64 -0
  65. package/dist/introspect/mysql.d.ts.map +1 -0
  66. package/dist/introspect/mysql.js +360 -0
  67. package/dist/introspect/mysql.js.map +1 -0
  68. package/dist/introspect/postgres.d.ts +55 -0
  69. package/dist/introspect/postgres.d.ts.map +1 -0
  70. package/dist/introspect/postgres.js +372 -0
  71. package/dist/introspect/postgres.js.map +1 -0
  72. package/dist/introspect/sqlite.d.ts +33 -0
  73. package/dist/introspect/sqlite.d.ts.map +1 -0
  74. package/dist/introspect/sqlite.js +207 -0
  75. package/dist/introspect/sqlite.js.map +1 -0
  76. package/dist/mcp/engine.d.ts +92 -0
  77. package/dist/mcp/engine.d.ts.map +1 -0
  78. package/dist/mcp/engine.js +261 -0
  79. package/dist/mcp/engine.js.map +1 -0
  80. package/dist/mcp/index.d.ts +33 -0
  81. package/dist/mcp/index.d.ts.map +1 -0
  82. package/dist/mcp/index.js +119 -0
  83. package/dist/mcp/index.js.map +1 -0
  84. package/dist/mcp/server-instructions.d.ts +9 -0
  85. package/dist/mcp/server-instructions.d.ts.map +1 -0
  86. package/dist/mcp/server-instructions.js +71 -0
  87. package/dist/mcp/server-instructions.js.map +1 -0
  88. package/dist/mcp/session.d.ts +35 -0
  89. package/dist/mcp/session.d.ts.map +1 -0
  90. package/dist/mcp/session.js +140 -0
  91. package/dist/mcp/session.js.map +1 -0
  92. package/dist/mcp/tools.d.ts +99 -0
  93. package/dist/mcp/tools.d.ts.map +1 -0
  94. package/dist/mcp/tools.js +499 -0
  95. package/dist/mcp/tools.js.map +1 -0
  96. package/dist/mcp/transport.d.ts +78 -0
  97. package/dist/mcp/transport.d.ts.map +1 -0
  98. package/dist/mcp/transport.js +182 -0
  99. package/dist/mcp/transport.js.map +1 -0
  100. package/dist/search/query-parser.d.ts +66 -0
  101. package/dist/search/query-parser.d.ts.map +1 -0
  102. package/dist/search/query-parser.js +163 -0
  103. package/dist/search/query-parser.js.map +1 -0
  104. package/dist/search/query-utils.d.ts +78 -0
  105. package/dist/search/query-utils.d.ts.map +1 -0
  106. package/dist/search/query-utils.js +203 -0
  107. package/dist/search/query-utils.js.map +1 -0
  108. package/dist/types.d.ts +279 -0
  109. package/dist/types.d.ts.map +1 -0
  110. package/dist/types.js +47 -0
  111. package/dist/types.js.map +1 -0
  112. package/dist/utils.d.ts +40 -0
  113. package/dist/utils.d.ts.map +1 -0
  114. package/dist/utils.js +190 -0
  115. package/dist/utils.js.map +1 -0
  116. package/package.json +54 -0
@@ -0,0 +1,360 @@
1
+ "use strict";
2
+ /**
3
+ * MySQL / MariaDB Introspector
4
+ *
5
+ * Extracts schemas (databases), tables, columns, primary keys,
6
+ * foreign keys, indexes, and views from a MySQL or MariaDB
7
+ * database using `information_schema` queries.
8
+ *
9
+ * Connection: uses `connection.ts` which wraps the `mysql2` package.
10
+ * The driver import is guarded so a missing `mysql2` is reported at
11
+ * connect() time, not at module load time.
12
+ *
13
+ * MySQL-specific metadata extracted:
14
+ * - ENGINE (InnoDB, MyISAM, …)
15
+ * - AUTO_INCREMENT value
16
+ * - CHARACTER_SET_NAME / COLLATION_NAME
17
+ * - COLUMN_TYPE (full type string, e.g. "varchar(255)")
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.MySQLIntrospector = void 0;
21
+ const base_1 = require("./base");
22
+ const connection_1 = require("./connection");
23
+ const utils_1 = require("../utils");
24
+ // =============================================================================
25
+ // MySQLIntrospector
26
+ // =============================================================================
27
+ class MySQLIntrospector extends base_1.BaseIntrospector {
28
+ /** The database/schema name to introspect */
29
+ dbName;
30
+ constructor(config) {
31
+ super(config);
32
+ this.dbName = config.database;
33
+ }
34
+ /**
35
+ * Full schema introspection pipeline.
36
+ *
37
+ * 1. Connect to the MySQL database
38
+ * 2. Query all structural metadata
39
+ * 3. Build Node[] + Edge[]
40
+ * 4. Close connection and return the result
41
+ */
42
+ async extractAll() {
43
+ const startTime = Date.now();
44
+ const errors = [];
45
+ const nodes = [];
46
+ const edges = [];
47
+ let conn;
48
+ try {
49
+ conn = await (0, connection_1.createConnection)(this.config);
50
+ }
51
+ catch (err) {
52
+ return {
53
+ nodes: [],
54
+ edges: [],
55
+ durationMs: Date.now() - startTime,
56
+ errors: [err.message],
57
+ };
58
+ }
59
+ try {
60
+ // MySQL's "schema" == "database". We always introspect the connected
61
+ // database. The `schemas` config filter is applied as a TABLE_SCHEMA
62
+ // filter if the user specified one; otherwise we use `DATABASE()`.
63
+ // ----- 1. Fetch all raw metadata in parallel -----
64
+ const [tables, columns, pks, fks, indexes, views] = await Promise.all([
65
+ this.queryTables(conn),
66
+ this.queryColumns(conn),
67
+ this.queryPrimaryKeys(conn),
68
+ this.queryForeignKeys(conn),
69
+ this.queryIndexes(conn),
70
+ this.queryViews(conn),
71
+ ]);
72
+ // ----- 2. Build a single "schema" node for this database -----
73
+ const schemaName = this.dbName;
74
+ const schemaQual = this.qn(schemaName);
75
+ const schemaFp = this.schemaFilePath(schemaName);
76
+ const schemaNode = this.makeNode('schema', schemaName, schemaQual, schemaFp);
77
+ nodes.push(schemaNode);
78
+ // ----- 3. Build table nodes + contains edges (schema → table) -----
79
+ const tableNodeByKey = new Map(); // key = table_name
80
+ for (const t of tables) {
81
+ const kind = t.table_type === 'VIEW' ? 'view' : 'table';
82
+ const qual = this.qn(schemaName, t.table_name);
83
+ const fp = this.schemaFilePath(schemaName);
84
+ const node = this.makeNode(kind, t.table_name, qual, fp, {
85
+ docstring: t.table_comment || undefined,
86
+ metadata: {
87
+ engine: t.engine,
88
+ autoIncrement: t.auto_increment ?? null,
89
+ collation: t.table_collation ?? null,
90
+ },
91
+ });
92
+ nodes.push(node);
93
+ tableNodeByKey.set(t.table_name, node);
94
+ edges.push(this.containEdge(schemaNode.id, node.id));
95
+ }
96
+ // ----- 4. Build column nodes + contains edges (table → column) -----
97
+ const columnNodeByKey = new Map(); // key = table.column
98
+ for (const c of columns) {
99
+ const tableNode = tableNodeByKey.get(c.table_name);
100
+ if (!tableNode)
101
+ continue;
102
+ const colKey = `${c.table_name}.${c.column_name}`;
103
+ const qual = this.qn(schemaName, c.table_name, c.column_name);
104
+ const fp = this.schemaFilePath(schemaName);
105
+ const autoIncrement = c.extra?.toLowerCase().includes('auto_increment');
106
+ const node = this.makeNode('column', c.column_name, qual, fp, {
107
+ startLine: c.ordinal_position ?? 0,
108
+ metadata: {
109
+ dataType: c.data_type,
110
+ columnType: c.column_type,
111
+ isNullable: c.is_nullable === 'YES',
112
+ defaultValue: c.column_default ?? null,
113
+ maxLength: c.character_maximum_length ?? null,
114
+ numericPrecision: c.numeric_precision ?? null,
115
+ numericScale: c.numeric_scale ?? null,
116
+ charSet: c.character_set_name ?? null,
117
+ collation: c.collation_name ?? null,
118
+ autoIncrement: autoIncrement ?? false,
119
+ },
120
+ docstring: c.column_comment || undefined,
121
+ });
122
+ nodes.push(node);
123
+ columnNodeByKey.set(colKey, node);
124
+ edges.push(this.containEdge(tableNode.id, node.id));
125
+ }
126
+ // ----- 5. Primary key edges (table → column) -----
127
+ for (const pk of pks) {
128
+ const colKey = `${pk.table_name}.${pk.column_name}`;
129
+ const colNode = columnNodeByKey.get(colKey);
130
+ const tableNode = tableNodeByKey.get(pk.table_name);
131
+ if (colNode && tableNode) {
132
+ edges.push(this.makeEdge(tableNode.id, colNode.id, 'primary_key', {
133
+ constraintName: pk.constraint_name,
134
+ }));
135
+ }
136
+ }
137
+ // ----- 6. Foreign key references edges (column → referenced column) -----
138
+ // Note: for cross-database FKs, the ref_table_schema may differ.
139
+ // We still create the edge if we have both nodes; cross-DB refs
140
+ // where the target isn't introspected will have a dangling target
141
+ // (the edge's target still exists as a node id, but the node may
142
+ // not be present in this result).
143
+ for (const fk of fks) {
144
+ // MySQL KEY_COLUMN_USAGE has REFERENCED_TABLE_SCHEMA
145
+ const fromKey = `${fk.table_name}.${fk.column_name}`;
146
+ const toKey = fk.ref_table_schema === this.dbName
147
+ ? `${fk.ref_table_name}.${fk.ref_column_name}`
148
+ : null;
149
+ const fromNode = columnNodeByKey.get(fromKey);
150
+ const toNode = toKey ? columnNodeByKey.get(toKey) : undefined;
151
+ if (fromNode && toNode) {
152
+ edges.push(this.makeEdge(fromNode.id, toNode.id, 'references', {
153
+ constraintName: fk.constraint_name,
154
+ onUpdate: fk.update_rule,
155
+ onDelete: fk.delete_rule,
156
+ }));
157
+ }
158
+ else if (fromNode) {
159
+ // Cross-database FK reference — still emit the edge but note in metadata
160
+ edges.push(this.makeEdge(fromNode.id, (0, utils_1.hashString)(`${fk.ref_table_schema}.${fk.ref_table_name}.${fk.ref_column_name}`), 'references', {
161
+ constraintName: fk.constraint_name,
162
+ onUpdate: fk.update_rule,
163
+ onDelete: fk.delete_rule,
164
+ refDatabase: fk.ref_table_schema,
165
+ refTable: fk.ref_table_name,
166
+ refColumn: fk.ref_column_name,
167
+ unresolved: true,
168
+ }));
169
+ }
170
+ }
171
+ // ----- 7. Index nodes + indexed_by edges -----
172
+ // Group index rows to collect column lists
173
+ const indexGroups = new Map();
174
+ for (const idx of indexes) {
175
+ const indexKey = `${idx.table_name}.${idx.index_name}`;
176
+ if (!indexGroups.has(indexKey)) {
177
+ indexGroups.set(indexKey, {
178
+ table: idx.table_name,
179
+ indexName: idx.index_name,
180
+ unique: idx.non_unique === 0,
181
+ indexType: idx.index_type,
182
+ columns: [],
183
+ });
184
+ }
185
+ indexGroups.get(indexKey).columns.push(idx.column_name);
186
+ }
187
+ for (const [, grp] of indexGroups) {
188
+ const tableNode = tableNodeByKey.get(grp.table);
189
+ if (!tableNode)
190
+ continue;
191
+ if (grp.indexName === 'PRIMARY')
192
+ continue; // PK already handled
193
+ const qual = this.qn(schemaName, grp.table, grp.indexName);
194
+ const fp = this.schemaFilePath(schemaName);
195
+ const node = this.makeNode('index', grp.indexName, qual, fp, {
196
+ metadata: {
197
+ unique: grp.unique,
198
+ indexType: grp.indexType,
199
+ columns: grp.columns,
200
+ },
201
+ });
202
+ nodes.push(node);
203
+ edges.push(this.containEdge(tableNode.id, node.id));
204
+ edges.push(this.makeEdge(tableNode.id, node.id, 'indexed_by'));
205
+ }
206
+ // ----- 8. Attach view definitions -----
207
+ const viewDefs = new Map();
208
+ for (const v of views) {
209
+ if (v.view_definition)
210
+ viewDefs.set(v.table_name, v.view_definition);
211
+ }
212
+ for (const node of nodes) {
213
+ if (node.kind === 'view') {
214
+ const def = viewDefs.get(node.name);
215
+ if (def)
216
+ node.signature = def;
217
+ }
218
+ }
219
+ }
220
+ catch (err) {
221
+ errors.push(`Introspection error: ${err.message}`);
222
+ }
223
+ finally {
224
+ await conn.close();
225
+ }
226
+ return {
227
+ nodes,
228
+ edges,
229
+ durationMs: Date.now() - startTime,
230
+ errors,
231
+ };
232
+ }
233
+ // ===========================================================================
234
+ // Query Methods
235
+ //
236
+ // MySQL information_schema uses uppercase column names by convention.
237
+ // All queries filter by TABLE_SCHEMA = the connected database name.
238
+ // ===========================================================================
239
+ /**
240
+ * Query: tables and views in the current database.
241
+ */
242
+ async queryTables(conn) {
243
+ return (await conn.query(`-- Tables & views with MySQL-specific metadata
244
+ SELECT t.TABLE_NAME AS table_name,
245
+ t.TABLE_TYPE AS table_type,
246
+ t.TABLE_COMMENT AS table_comment,
247
+ t.ENGINE AS engine,
248
+ t.AUTO_INCREMENT AS auto_increment,
249
+ t.TABLE_COLLATION AS table_collation
250
+ FROM information_schema.TABLES t
251
+ WHERE t.TABLE_SCHEMA = ?
252
+ AND t.TABLE_TYPE IN ('BASE TABLE', 'VIEW')
253
+ ORDER BY t.TABLE_NAME`, [this.dbName]));
254
+ }
255
+ /**
256
+ * Query: columns with MySQL-specific type info.
257
+ */
258
+ async queryColumns(conn) {
259
+ return (await conn.query(`-- Columns with MySQL-specific metadata
260
+ SELECT c.TABLE_NAME AS table_name,
261
+ c.COLUMN_NAME AS column_name,
262
+ c.DATA_TYPE AS data_type,
263
+ c.COLUMN_TYPE AS column_type,
264
+ c.IS_NULLABLE AS is_nullable,
265
+ c.COLUMN_DEFAULT AS column_default,
266
+ c.CHARACTER_MAXIMUM_LENGTH AS character_maximum_length,
267
+ c.NUMERIC_PRECISION AS numeric_precision,
268
+ c.NUMERIC_SCALE AS numeric_scale,
269
+ c.ORDINAL_POSITION AS ordinal_position,
270
+ c.EXTRA AS extra,
271
+ c.COLUMN_COMMENT AS column_comment,
272
+ c.CHARACTER_SET_NAME AS character_set_name,
273
+ c.COLLATION_NAME AS collation_name
274
+ FROM information_schema.COLUMNS c
275
+ WHERE c.TABLE_SCHEMA = ?
276
+ ORDER BY c.TABLE_NAME, c.ORDINAL_POSITION`, [this.dbName]));
277
+ }
278
+ /**
279
+ * Query: primary key columns.
280
+ */
281
+ async queryPrimaryKeys(conn) {
282
+ return (await conn.query(`-- Primary key columns
283
+ SELECT tc.TABLE_NAME AS table_name,
284
+ tc.CONSTRAINT_NAME AS constraint_name,
285
+ kcu.COLUMN_NAME AS column_name
286
+ FROM information_schema.TABLE_CONSTRAINTS tc
287
+ JOIN information_schema.KEY_COLUMN_USAGE kcu
288
+ ON tc.CONSTRAINT_CATALOG = kcu.CONSTRAINT_CATALOG
289
+ AND tc.CONSTRAINT_SCHEMA = kcu.CONSTRAINT_SCHEMA
290
+ AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
291
+ AND tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA
292
+ AND tc.TABLE_NAME = kcu.TABLE_NAME
293
+ WHERE tc.TABLE_SCHEMA = ?
294
+ AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
295
+ ORDER BY tc.TABLE_NAME, kcu.ORDINAL_POSITION`, [this.dbName]));
296
+ }
297
+ /**
298
+ * Query: foreign key columns with referential actions.
299
+ *
300
+ * MySQL's KEY_COLUMN_USAGE table directly exposes the referenced
301
+ * schema/table/column columns, making it simpler than Postgres.
302
+ */
303
+ async queryForeignKeys(conn) {
304
+ return (await conn.query(`-- Foreign keys (MySQL's KEY_COLUMN_USAGE has REFERENCED_* columns directly)
305
+ SELECT tc.TABLE_NAME AS table_name,
306
+ tc.CONSTRAINT_NAME AS constraint_name,
307
+ kcu.COLUMN_NAME AS column_name,
308
+ kcu.REFERENCED_TABLE_SCHEMA AS ref_table_schema,
309
+ kcu.REFERENCED_TABLE_NAME AS ref_table_name,
310
+ kcu.REFERENCED_COLUMN_NAME AS ref_column_name,
311
+ rc.UPDATE_RULE AS update_rule,
312
+ rc.DELETE_RULE AS delete_rule
313
+ FROM information_schema.TABLE_CONSTRAINTS tc
314
+ JOIN information_schema.KEY_COLUMN_USAGE kcu
315
+ ON tc.CONSTRAINT_CATALOG = kcu.CONSTRAINT_CATALOG
316
+ AND tc.CONSTRAINT_SCHEMA = kcu.CONSTRAINT_SCHEMA
317
+ AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
318
+ AND tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA
319
+ AND tc.TABLE_NAME = kcu.TABLE_NAME
320
+ JOIN information_schema.REFERENTIAL_CONSTRAINTS rc
321
+ ON rc.CONSTRAINT_CATALOG = tc.CONSTRAINT_CATALOG
322
+ AND rc.CONSTRAINT_SCHEMA = tc.CONSTRAINT_SCHEMA
323
+ AND rc.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
324
+ WHERE tc.TABLE_SCHEMA = ?
325
+ AND tc.CONSTRAINT_TYPE = 'FOREIGN KEY'
326
+ ORDER BY tc.TABLE_NAME, tc.CONSTRAINT_NAME, kcu.ORDINAL_POSITION`, [this.dbName]));
327
+ }
328
+ /**
329
+ * Query: index columns from STATISTICS table.
330
+ *
331
+ * STATISTICS has one row per (index, column), so we group by
332
+ * index_name + seq_in_index to build the column list later.
333
+ */
334
+ async queryIndexes(conn) {
335
+ return (await conn.query(`-- Index columns (one row per index × column)
336
+ SELECT s.TABLE_NAME AS table_name,
337
+ s.INDEX_NAME AS index_name,
338
+ s.COLUMN_NAME AS column_name,
339
+ s.NON_UNIQUE AS non_unique,
340
+ s.INDEX_TYPE AS index_type,
341
+ s.SEQ_IN_INDEX AS seq_in_index
342
+ FROM information_schema.STATISTICS s
343
+ WHERE s.TABLE_SCHEMA = ?
344
+ ORDER BY s.TABLE_NAME, s.INDEX_NAME, s.SEQ_IN_INDEX`, [this.dbName]));
345
+ }
346
+ /**
347
+ * Query: view definitions.
348
+ */
349
+ async queryViews(conn) {
350
+ return (await conn.query(`-- View definitions
351
+ SELECT v.TABLE_NAME AS table_name,
352
+ v.VIEW_DEFINITION AS view_definition
353
+ FROM information_schema.VIEWS v
354
+ WHERE v.TABLE_SCHEMA = ?
355
+ ORDER BY v.TABLE_NAME`, [this.dbName]));
356
+ }
357
+ }
358
+ exports.MySQLIntrospector = MySQLIntrospector;
359
+ // =============================================================================
360
+ //# sourceMappingURL=mysql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../src/introspect/mysql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * PostgreSQL Introspector
3
+ *
4
+ * Extracts schemas, tables, columns, primary keys, foreign keys,
5
+ * indexes, and views from a PostgreSQL database using
6
+ * `information_schema` + `pg_catalog` queries.
7
+ *
8
+ * Connection: uses `connection.ts` which wraps the `pg` package.
9
+ * The driver import is guarded so a missing `pg` is reported at
10
+ * connect() time, not at module load time.
11
+ */
12
+ import { IntrospectResult, DbConnectionConfig } from '../types';
13
+ import { BaseIntrospector } from './base';
14
+ export declare class PostgresIntrospector extends BaseIntrospector {
15
+ constructor(config: DbConnectionConfig);
16
+ /**
17
+ * Full schema introspection pipeline.
18
+ *
19
+ * 1. Connect to DB
20
+ * 2. Query schemas, tables, columns, PKs, FKs, indexes, views in batch
21
+ * 3. Build Node[] and Edge[] from the raw data
22
+ * 4. Close connection and return IntrospectResult
23
+ */
24
+ extractAll(): Promise<IntrospectResult>;
25
+ /**
26
+ * Query: non-system schemas.
27
+ */
28
+ private querySchemas;
29
+ /**
30
+ * Query: tables and views (BASE TABLE or VIEW) with optional pg_catalog
31
+ * comment.
32
+ */
33
+ private queryTables;
34
+ /**
35
+ * Query: column metadata + pg_catalog column description.
36
+ */
37
+ private queryColumns;
38
+ /**
39
+ * Query: columns that are part of a PRIMARY KEY constraint.
40
+ */
41
+ private queryPrimaryKeys;
42
+ /**
43
+ * Query: foreign key columns + referenced table/column + referential actions.
44
+ */
45
+ private queryForeignKeys;
46
+ /**
47
+ * Query: index definitions from pg_indexes.
48
+ */
49
+ private queryIndexes;
50
+ /**
51
+ * Query: view definitions.
52
+ */
53
+ private queryViews;
54
+ }
55
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/introspect/postgres.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAKnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAuE1C,qBAAa,oBAAqB,SAAQ,gBAAgB;gBAC5C,MAAM,EAAE,kBAAkB;IAItC;;;;;;;OAOG;IACG,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAwO7C;;OAEG;YACW,YAAY;IAW1B;;;OAGG;YACW,WAAW;IAqBzB;;OAEG;YACW,YAAY;IA8B1B;;OAEG;YACW,gBAAgB;IAsB9B;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,YAAY;IAiB1B;;OAEG;YACW,UAAU;CAezB"}