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,382 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * DBGraph CLI
5
+ *
6
+ * Command-line interface for the database knowledge graph.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ const path = __importStar(require("path"));
43
+ const fs = __importStar(require("fs"));
44
+ const commander_1 = require("commander");
45
+ const index_1 = require("../index");
46
+ const config_1 = require("../config");
47
+ const formatter_1 = require("../context/formatter");
48
+ const introspect_1 = require("../introspect");
49
+ const mcp_1 = require("../mcp");
50
+ const program = new commander_1.Command();
51
+ program
52
+ .name('dbgraph')
53
+ .description('Database knowledge graph for LLM-powered SQL generation')
54
+ .version('0.1.0');
55
+ // ===========================================================================
56
+ // init
57
+ // ===========================================================================
58
+ program
59
+ .command('init')
60
+ .description('Initialize a .dbgraph project (create directory + config + optional index)')
61
+ .argument('[directory]', 'Project root directory', '.')
62
+ .option('-c, --config <path>', 'Path to dbgraph-db.json config file')
63
+ .option('--index', 'Run initial indexing after init')
64
+ .action(async (directory, opts) => {
65
+ const projectRoot = path.resolve(directory);
66
+ // Check not already initialized
67
+ if (index_1.DBGraph.isInitialized(projectRoot)) {
68
+ console.error(`DBGraph already initialized in ${projectRoot}`);
69
+ process.exit(1);
70
+ }
71
+ // Check if config exists or needs to be created
72
+ const configPath = opts.config || path.join(projectRoot, config_1.CONFIG_FILENAME);
73
+ if (!fs.existsSync(configPath)) {
74
+ console.log(`No ${config_1.CONFIG_FILENAME} found. Creating default config...`);
75
+ fs.writeFileSync(configPath, (0, config_1.generateDefaultConfig)(), 'utf-8');
76
+ console.log(`Created ${configPath}`);
77
+ console.log('Edit this file to add your database connections, then run: dbgraph index');
78
+ }
79
+ console.log(`Initializing DBGraph in ${projectRoot}...`);
80
+ const cg = await index_1.DBGraph.init(projectRoot, {
81
+ config: configPath,
82
+ index: opts.index,
83
+ onProgress: (msg, current, total) => {
84
+ process.stdout.write(`\r${msg} [${current}/${total}]`);
85
+ if (current >= total)
86
+ process.stdout.write('\n');
87
+ },
88
+ });
89
+ console.log('Done.');
90
+ console.log(`Data directory: ${projectRoot}${path.sep}.dbgraph`);
91
+ cg.close();
92
+ });
93
+ // ===========================================================================
94
+ // index
95
+ // ===========================================================================
96
+ program
97
+ .command('index')
98
+ .description('Run database introspection to populate the knowledge graph')
99
+ .argument('[directory]', 'Project root directory', '.')
100
+ .option('-c, --config <path>', 'Path to dbgraph-db.json config file')
101
+ .action(async (directory, opts) => {
102
+ const projectRoot = path.resolve(directory);
103
+ if (!index_1.DBGraph.isInitialized(projectRoot)) {
104
+ console.error(`DBGraph not initialized in ${projectRoot}. Run 'dbgraph init' first.`);
105
+ process.exit(1);
106
+ }
107
+ const cg = await index_1.DBGraph.open(projectRoot);
108
+ // Override config if specified
109
+ if (opts.config) {
110
+ cg.setConfig((0, config_1.loadConfig)(opts.config));
111
+ }
112
+ if (!cg.getConfig()) {
113
+ // Try auto-discovering config
114
+ const configPath = (0, config_1.findConfigFile)(projectRoot);
115
+ if (configPath) {
116
+ cg.setConfig((0, config_1.loadConfig)(configPath));
117
+ }
118
+ else {
119
+ console.error('No database configuration found.');
120
+ console.error(`Create a ${config_1.CONFIG_FILENAME} file or pass --config.`);
121
+ process.exit(1);
122
+ }
123
+ }
124
+ const config = cg.getConfig();
125
+ console.log(`Found ${config.databases.length} database(s) configured:\n`);
126
+ for (const db of config.databases) {
127
+ const hostPort = db.host ? `${db.host}:${db.port || 'default'}` : 'local';
128
+ const schemas = db.schemas?.length ? ` (schemas: ${db.schemas.join(', ')})` : '';
129
+ console.log(` ${db.alias.padEnd(20)} ${db.engine.padEnd(12)} ${hostPort}/${db.database}${schemas}`);
130
+ }
131
+ console.log('\nRunning introspection...\n');
132
+ const result = await cg.indexAll({
133
+ onProgress: (msg, current, total) => {
134
+ process.stdout.write(`\r${msg} [${current}/${total}]`);
135
+ if (current >= total)
136
+ process.stdout.write('\n');
137
+ },
138
+ });
139
+ console.log('\nIndexing complete:');
140
+ console.log(` Sources indexed: ${result.sourcesIndexed}`);
141
+ console.log(` Nodes created: ${result.nodesCreated}`);
142
+ console.log(` Edges created: ${result.edgesCreated}`);
143
+ if (result.errors.length > 0) {
144
+ console.log('\nErrors:');
145
+ for (const err of result.errors) {
146
+ console.log(` ⚠ ${err}`);
147
+ }
148
+ }
149
+ cg.close();
150
+ });
151
+ // ===========================================================================
152
+ // serve (MCP)
153
+ // ===========================================================================
154
+ program
155
+ .command('serve')
156
+ .description('Start the MCP server (stdio mode for AI agents)')
157
+ .argument('[directory]', 'Project root directory', '.')
158
+ .option('--mcp', 'Start in MCP mode (default)', true)
159
+ .option('--daemon', 'Start as a background daemon process')
160
+ .option('--path <path>', 'Explicit project path (for agents that don\'t set rootUri)')
161
+ .option('--auto-refresh', 'Check & re-index database schemas on each MCP tool call', false)
162
+ .action(async (directory, opts) => {
163
+ const projectRoot = path.resolve(directory);
164
+ // Don't crash if not initialized — MCP engine handles this gracefully
165
+ // via background init + lazy retry. Tool calls will return proper errors
166
+ // until the user runs `dbgraph init`.
167
+ const server = new mcp_1.MCPServer({
168
+ projectPath: opts.path || projectRoot,
169
+ autoRefresh: opts.autoRefresh,
170
+ });
171
+ if (opts.daemon) {
172
+ console.error('Starting DBGraph daemon...');
173
+ await server.startDaemon(projectRoot);
174
+ }
175
+ else {
176
+ server.start();
177
+ }
178
+ });
179
+ // ===========================================================================
180
+ // query / search
181
+ // ===========================================================================
182
+ program
183
+ .command('query')
184
+ .description('Search the database knowledge graph')
185
+ .argument('<query>', 'Search term')
186
+ .argument('[directory]', 'Project root directory', '.')
187
+ .option('-k, --kind <kind>', 'Filter by node kind (table, column, view, index, constraint)')
188
+ .option('-l, --limit <number>', 'Maximum results', '20')
189
+ .option('--json', 'Output as JSON')
190
+ .action(async (query, directory, opts) => {
191
+ const projectRoot = path.resolve(directory);
192
+ if (!index_1.DBGraph.isInitialized(projectRoot)) {
193
+ console.error(`DBGraph not initialized in ${projectRoot}. Run 'dbgraph init' first.`);
194
+ process.exit(1);
195
+ }
196
+ const cg = index_1.DBGraph.openSync(projectRoot);
197
+ const limit = parseInt(opts.limit || '20', 10);
198
+ const results = cg.searchNodes(query, {
199
+ kinds: opts.kind ? [opts.kind] : undefined,
200
+ limit,
201
+ });
202
+ if (opts.json) {
203
+ console.log(JSON.stringify(results, null, 2));
204
+ }
205
+ else {
206
+ const formatter = new formatter_1.SchemaFormatter();
207
+ console.log(formatter.formatSearchResults(results));
208
+ }
209
+ cg.close();
210
+ });
211
+ // ===========================================================================
212
+ // context
213
+ // ===========================================================================
214
+ program
215
+ .command('context')
216
+ .description('Show full schema context for a table')
217
+ .argument('<name>', 'Table name or qualified name')
218
+ .argument('[directory]', 'Project root directory', '.')
219
+ .action(async (name, directory) => {
220
+ const projectRoot = path.resolve(directory);
221
+ if (!index_1.DBGraph.isInitialized(projectRoot)) {
222
+ console.error(`DBGraph not initialized in ${projectRoot}. Run 'dbgraph init' first.`);
223
+ process.exit(1);
224
+ }
225
+ const cg = index_1.DBGraph.openSync(projectRoot);
226
+ const context = await cg.buildContext(name);
227
+ console.log(context);
228
+ cg.close();
229
+ });
230
+ // ===========================================================================
231
+ // status
232
+ // ===========================================================================
233
+ program
234
+ .command('status')
235
+ .description('Show DBGraph status and statistics')
236
+ .argument('[directory]', 'Project root directory', '.')
237
+ .action(async (directory) => {
238
+ const projectRoot = path.resolve(directory);
239
+ if (!index_1.DBGraph.isInitialized(projectRoot)) {
240
+ console.error(`DBGraph not initialized in ${projectRoot}. Run 'dbgraph init' first.`);
241
+ process.exit(1);
242
+ }
243
+ const cg = index_1.DBGraph.openSync(projectRoot);
244
+ const stats = cg.getStats();
245
+ const sources = cg.getSources();
246
+ const configPath = (0, config_1.findConfigFile)(projectRoot);
247
+ console.log('\n=== DBGraph Status ===\n');
248
+ if (configPath) {
249
+ console.log(`Config: ${configPath}`);
250
+ }
251
+ console.log(`Project root: ${projectRoot}`);
252
+ console.log(`DBGraph dir: ${projectRoot}${path.sep}.dbgraph`);
253
+ const journalMode = cg.getJournalMode();
254
+ console.log(`Journal mode: ${journalMode}\n`);
255
+ console.log('Graph Statistics:');
256
+ console.log(` Node count: ${stats.nodeCount.toLocaleString()}`);
257
+ console.log(` Edge count: ${stats.edgeCount.toLocaleString()}`);
258
+ console.log(` Databases: ${stats.dbCount}`);
259
+ console.log(` DB size: ${(stats.dbSizeBytes / 1024).toFixed(1)} KB\n`);
260
+ if (Object.keys(stats.nodesByKind).length > 0) {
261
+ console.log('Nodes by kind:');
262
+ for (const [kind, count] of Object.entries(stats.nodesByKind).sort((a, b) => b[1] - a[1])) {
263
+ console.log(` ${kind.padEnd(16)} ${count}`);
264
+ }
265
+ console.log('');
266
+ }
267
+ if (sources.length > 0) {
268
+ console.log('Database sources:');
269
+ for (const src of sources) {
270
+ const time = new Date(src.indexedAt).toLocaleString();
271
+ console.log(` ${src.alias.padEnd(16)} ${src.engine.padEnd(10)} ${src.displayUri}`);
272
+ console.log(` ${''.padEnd(16)} Indexed: ${time}, Nodes: ${src.nodeCount}`);
273
+ }
274
+ }
275
+ else {
276
+ console.log('No databases indexed yet. Run: dbgraph index');
277
+ }
278
+ cg.close();
279
+ });
280
+ // ===========================================================================
281
+ // sources
282
+ // ===========================================================================
283
+ program
284
+ .command('sources')
285
+ .description('List configured database sources')
286
+ .argument('[directory]', 'Project root directory', '.')
287
+ .option('--json', 'Output as JSON')
288
+ .action(async (directory, opts) => {
289
+ const projectRoot = path.resolve(directory);
290
+ if (!index_1.DBGraph.isInitialized(projectRoot)) {
291
+ console.error(`DBGraph not initialized in ${projectRoot}. Run 'dbgraph init' first.`);
292
+ process.exit(1);
293
+ }
294
+ const cg = index_1.DBGraph.openSync(projectRoot);
295
+ const sources = cg.getSources();
296
+ if (opts.json) {
297
+ console.log(JSON.stringify(sources, null, 2));
298
+ }
299
+ else {
300
+ const formatter = new formatter_1.SchemaFormatter();
301
+ const stats = cg.getStats();
302
+ console.log(formatter.formatDatabaseOverview(sources, stats));
303
+ }
304
+ cg.close();
305
+ });
306
+ // ===========================================================================
307
+ // test
308
+ // ===========================================================================
309
+ program
310
+ .command('test')
311
+ .description('Test connections to all configured databases')
312
+ .argument('[directory]', 'Project root directory', '.')
313
+ .option('-c, --config <path>', 'Path to dbgraph-db.json config file')
314
+ .action(async (directory, opts) => {
315
+ const projectRoot = path.resolve(directory);
316
+ // Load config
317
+ const configPath = opts.config || (0, config_1.findConfigFile)(projectRoot);
318
+ if (!configPath) {
319
+ console.error(`No ${config_1.CONFIG_FILENAME} found.`);
320
+ process.exit(1);
321
+ }
322
+ const config = (0, config_1.loadConfig)(configPath);
323
+ console.log(`Testing ${config.databases.length} database(s)...\n`);
324
+ let allOk = true;
325
+ for (const db of config.databases) {
326
+ process.stdout.write(` ${db.alias} (${db.engine})... `);
327
+ try {
328
+ const introspector = (0, introspect_1.createIntrospector)(db);
329
+ const ok = await introspector.testConnection();
330
+ if (ok) {
331
+ console.log('✅ OK');
332
+ }
333
+ else {
334
+ console.log('❌ FAILED (connection returned false)');
335
+ allOk = false;
336
+ }
337
+ }
338
+ catch (err) {
339
+ console.log(`❌ FAILED`);
340
+ console.log(` ${err instanceof Error ? err.message : String(err)}`);
341
+ allOk = false;
342
+ }
343
+ }
344
+ console.log(allOk ? '\nAll connections successful!' : '\nSome connections failed.');
345
+ process.exit(allOk ? 0 : 1);
346
+ });
347
+ // ===========================================================================
348
+ // config
349
+ // ===========================================================================
350
+ program
351
+ .command('config')
352
+ .description('Show or edit the dbgraph-db.json configuration')
353
+ .argument('[directory]', 'Project root directory', '.')
354
+ .option('--show', 'Display the config file contents')
355
+ .option('--init', 'Create a default config file')
356
+ .action(async (directory, opts) => {
357
+ const projectRoot = path.resolve(directory);
358
+ const configPath = (0, config_1.findConfigFile)(projectRoot) || path.join(projectRoot, config_1.CONFIG_FILENAME);
359
+ if (opts.init) {
360
+ if (fs.existsSync(configPath)) {
361
+ console.error(`${configPath} already exists.`);
362
+ process.exit(1);
363
+ }
364
+ fs.writeFileSync(configPath, (0, config_1.generateDefaultConfig)(), 'utf-8');
365
+ console.log(`Created ${configPath}`);
366
+ console.log('Edit this file to add your database connections, then run: dbgraph index');
367
+ return;
368
+ }
369
+ if (!fs.existsSync(configPath)) {
370
+ console.error(`No ${config_1.CONFIG_FILENAME} found. Use --init to create one.`);
371
+ process.exit(1);
372
+ }
373
+ if (opts.show) {
374
+ const raw = fs.readFileSync(configPath, 'utf-8');
375
+ console.log(raw);
376
+ }
377
+ });
378
+ // ===========================================================================
379
+ // Parse
380
+ // ===========================================================================
381
+ program.parse(process.argv);
382
+ //# sourceMappingURL=dbgraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dbgraph.js","sourceRoot":"","sources":["../../src/bin/dbgraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * DBGraph Configuration
3
+ *
4
+ * Loads and validates the dbgraph-db.json configuration file
5
+ * which specifies which databases to introspect.
6
+ */
7
+ import { DbConnectionConfig } from './types';
8
+ export declare const CONFIG_FILENAME = "dbgraph-db.json";
9
+ export interface DBGraphConfig {
10
+ /** List of database connections to introspect */
11
+ databases: DbConnectionConfig[];
12
+ }
13
+ /**
14
+ * Find the config file by walking up from startPath
15
+ */
16
+ export declare function findConfigFile(startPath: string): string | null;
17
+ /**
18
+ * Load configuration from a file
19
+ */
20
+ export declare function loadConfig(configPath: string): DBGraphConfig;
21
+ /**
22
+ * Generate a default config file content
23
+ */
24
+ export declare function generateDefaultConfig(): string;
25
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,kBAAkB,EAAY,MAAM,SAAS,CAAC;AAGvD,eAAO,MAAM,eAAe,oBAAoB,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,SAAS,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe/D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAiE5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CA2B9C"}
package/dist/config.js ADDED
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ /**
3
+ * DBGraph Configuration
4
+ *
5
+ * Loads and validates the dbgraph-db.json configuration file
6
+ * which specifies which databases to introspect.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.CONFIG_FILENAME = void 0;
43
+ exports.findConfigFile = findConfigFile;
44
+ exports.loadConfig = loadConfig;
45
+ exports.generateDefaultConfig = generateDefaultConfig;
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ const errors_1 = require("./errors");
49
+ exports.CONFIG_FILENAME = 'dbgraph-db.json';
50
+ /**
51
+ * Find the config file by walking up from startPath
52
+ */
53
+ function findConfigFile(startPath) {
54
+ let current = path.resolve(startPath);
55
+ const root = path.parse(current).root;
56
+ while (current !== root) {
57
+ const candidate = path.join(current, exports.CONFIG_FILENAME);
58
+ if (fs.existsSync(candidate)) {
59
+ return candidate;
60
+ }
61
+ const parent = path.dirname(current);
62
+ if (parent === current)
63
+ break;
64
+ current = parent;
65
+ }
66
+ return null;
67
+ }
68
+ /**
69
+ * Load configuration from a file
70
+ */
71
+ function loadConfig(configPath) {
72
+ if (!fs.existsSync(configPath)) {
73
+ throw new errors_1.ConfigError(`Configuration file not found: ${configPath}`);
74
+ }
75
+ const raw = fs.readFileSync(configPath, 'utf-8');
76
+ let parsed;
77
+ // Try JSONC first (with comments), fallback to JSON
78
+ try {
79
+ const jsonc = require('jsonc-parser');
80
+ const errors = [];
81
+ parsed = jsonc.parse(raw, errors);
82
+ if (errors.length > 0) {
83
+ // jsonc-parser is lenient; fall back to JSON for strict validation
84
+ parsed = JSON.parse(raw);
85
+ }
86
+ }
87
+ catch {
88
+ parsed = JSON.parse(raw);
89
+ }
90
+ if (!parsed || typeof parsed !== 'object') {
91
+ throw new errors_1.ConfigError('Configuration must be a JSON object');
92
+ }
93
+ const databases = parsed.databases;
94
+ if (!Array.isArray(databases)) {
95
+ throw new errors_1.ConfigError('Configuration must contain a "databases" array');
96
+ }
97
+ if (databases.length === 0) {
98
+ throw new errors_1.ConfigError('At least one database must be configured');
99
+ }
100
+ const validEngines = ['postgresql', 'mysql', 'mariadb', 'mssql', 'sqlite', 'oracle', 'mongodb'];
101
+ const validated = [];
102
+ for (let i = 0; i < databases.length; i++) {
103
+ const db = databases[i];
104
+ if (!db.alias)
105
+ throw new errors_1.ConfigError(`Database at index ${i} is missing "alias"`);
106
+ if (!db.engine)
107
+ throw new errors_1.ConfigError(`Database "${db.alias}" is missing "engine"`);
108
+ if (!validEngines.includes(db.engine)) {
109
+ throw new errors_1.ConfigError(`Database "${db.alias}" has unsupported engine "${db.engine}"`);
110
+ }
111
+ if (db.engine === 'sqlite' && !db.path) {
112
+ throw new errors_1.ConfigError(`SQLite database "${db.alias}" must specify "path"`);
113
+ }
114
+ if (db.engine !== 'sqlite' && !db.database) {
115
+ throw new errors_1.ConfigError(`Database "${db.alias}" is missing "database"`);
116
+ }
117
+ validated.push({
118
+ alias: db.alias,
119
+ engine: db.engine,
120
+ host: db.host,
121
+ port: db.port,
122
+ database: db.database ?? path.basename(db.path ?? ''),
123
+ schemas: db.schemas,
124
+ path: db.path,
125
+ auth: db.auth,
126
+ ssl: db.ssl,
127
+ });
128
+ }
129
+ return { databases: validated };
130
+ }
131
+ /**
132
+ * Generate a default config file content
133
+ */
134
+ function generateDefaultConfig() {
135
+ return JSON.stringify({
136
+ $schema: 'https://raw.githubusercontent.com/colbymchenry/dbgraph/main/dbgraph-db.schema.json',
137
+ databases: [
138
+ {
139
+ alias: 'local',
140
+ engine: 'postgresql',
141
+ host: 'localhost',
142
+ port: 5432,
143
+ database: 'mydb',
144
+ schemas: ['public'],
145
+ auth: 'user:password',
146
+ },
147
+ {
148
+ alias: 'analytics',
149
+ engine: 'mysql',
150
+ host: 'localhost',
151
+ port: 3306,
152
+ database: 'analytics',
153
+ auth: 'user:password',
154
+ },
155
+ ],
156
+ }, null, 2);
157
+ }
158
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}