tuimon 0.1.0 → 0.3.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 (139) hide show
  1. package/AI.md +191 -0
  2. package/README.md +240 -94
  3. package/dist/browser.d.ts.map +1 -1
  4. package/dist/browser.js +3 -0
  5. package/dist/browser.js.map +1 -1
  6. package/dist/cli.js +224 -3
  7. package/dist/cli.js.map +1 -1
  8. package/dist/config.d.ts +17 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/config.js +106 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/fkeybar.d.ts.map +1 -1
  13. package/dist/fkeybar.js +13 -0
  14. package/dist/fkeybar.js.map +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +148 -18
  17. package/dist/index.js.map +1 -1
  18. package/dist/layout/generator-css.d.ts +3 -0
  19. package/dist/layout/generator-css.d.ts.map +1 -0
  20. package/dist/layout/generator-css.js +202 -0
  21. package/dist/layout/generator-css.js.map +1 -0
  22. package/dist/layout/generator-js.d.ts +3 -0
  23. package/dist/layout/generator-js.d.ts.map +1 -0
  24. package/dist/layout/generator-js.js +353 -0
  25. package/dist/layout/generator-js.js.map +1 -0
  26. package/dist/layout/generator.d.ts +4 -0
  27. package/dist/layout/generator.d.ts.map +1 -0
  28. package/dist/layout/generator.js +124 -0
  29. package/dist/layout/generator.js.map +1 -0
  30. package/dist/layout/theme.d.ts +4 -0
  31. package/dist/layout/theme.d.ts.map +1 -0
  32. package/dist/layout/theme.js +28 -0
  33. package/dist/layout/theme.js.map +1 -0
  34. package/dist/layout/types.d.ts +68 -0
  35. package/dist/layout/types.d.ts.map +1 -0
  36. package/dist/layout/types.js +3 -0
  37. package/dist/layout/types.js.map +1 -0
  38. package/dist/quick/auto-layout.d.ts +5 -0
  39. package/dist/quick/auto-layout.d.ts.map +1 -0
  40. package/dist/quick/auto-layout.js +262 -0
  41. package/dist/quick/auto-layout.js.map +1 -0
  42. package/dist/quick/db/detect.d.ts +16 -0
  43. package/dist/quick/db/detect.d.ts.map +1 -0
  44. package/dist/quick/db/detect.js +131 -0
  45. package/dist/quick/db/detect.js.map +1 -0
  46. package/dist/quick/db/mongo.d.ts +10 -0
  47. package/dist/quick/db/mongo.d.ts.map +1 -0
  48. package/dist/quick/db/mongo.js +81 -0
  49. package/dist/quick/db/mongo.js.map +1 -0
  50. package/dist/quick/db/mysql.d.ts +8 -0
  51. package/dist/quick/db/mysql.d.ts.map +1 -0
  52. package/dist/quick/db/mysql.js +43 -0
  53. package/dist/quick/db/mysql.js.map +1 -0
  54. package/dist/quick/db/postgres.d.ts +8 -0
  55. package/dist/quick/db/postgres.d.ts.map +1 -0
  56. package/dist/quick/db/postgres.js +47 -0
  57. package/dist/quick/db/postgres.js.map +1 -0
  58. package/dist/quick/db/sqlite.d.ts +8 -0
  59. package/dist/quick/db/sqlite.d.ts.map +1 -0
  60. package/dist/quick/db/sqlite.js +43 -0
  61. package/dist/quick/db/sqlite.js.map +1 -0
  62. package/dist/quick/db-mode.d.ts +13 -0
  63. package/dist/quick/db-mode.d.ts.map +1 -0
  64. package/dist/quick/db-mode.js +159 -0
  65. package/dist/quick/db-mode.js.map +1 -0
  66. package/dist/quick/detect.d.ts +4 -0
  67. package/dist/quick/detect.d.ts.map +1 -0
  68. package/dist/quick/detect.js +76 -0
  69. package/dist/quick/detect.js.map +1 -0
  70. package/dist/quick/file-mode.d.ts +5 -0
  71. package/dist/quick/file-mode.d.ts.map +1 -0
  72. package/dist/quick/file-mode.js +158 -0
  73. package/dist/quick/file-mode.js.map +1 -0
  74. package/dist/quick/parsers/csv.d.ts +3 -0
  75. package/dist/quick/parsers/csv.d.ts.map +1 -0
  76. package/dist/quick/parsers/csv.js +145 -0
  77. package/dist/quick/parsers/csv.js.map +1 -0
  78. package/dist/quick/parsers/detect-meta.d.ts +7 -0
  79. package/dist/quick/parsers/detect-meta.d.ts.map +1 -0
  80. package/dist/quick/parsers/detect-meta.js +35 -0
  81. package/dist/quick/parsers/detect-meta.js.map +1 -0
  82. package/dist/quick/parsers/json.d.ts +3 -0
  83. package/dist/quick/parsers/json.d.ts.map +1 -0
  84. package/dist/quick/parsers/json.js +74 -0
  85. package/dist/quick/parsers/json.js.map +1 -0
  86. package/dist/quick/parsers/log.d.ts +3 -0
  87. package/dist/quick/parsers/log.d.ts.map +1 -0
  88. package/dist/quick/parsers/log.js +185 -0
  89. package/dist/quick/parsers/log.js.map +1 -0
  90. package/dist/quick/parsers/modsec.d.ts +3 -0
  91. package/dist/quick/parsers/modsec.d.ts.map +1 -0
  92. package/dist/quick/parsers/modsec.js +338 -0
  93. package/dist/quick/parsers/modsec.js.map +1 -0
  94. package/dist/quick/presets/coverage.d.ts +3 -0
  95. package/dist/quick/presets/coverage.d.ts.map +1 -0
  96. package/dist/quick/presets/coverage.js +362 -0
  97. package/dist/quick/presets/coverage.js.map +1 -0
  98. package/dist/quick/presets/deps.d.ts +3 -0
  99. package/dist/quick/presets/deps.d.ts.map +1 -0
  100. package/dist/quick/presets/deps.js +194 -0
  101. package/dist/quick/presets/deps.js.map +1 -0
  102. package/dist/quick/presets/docker.d.ts +3 -0
  103. package/dist/quick/presets/docker.d.ts.map +1 -0
  104. package/dist/quick/presets/docker.js +100 -0
  105. package/dist/quick/presets/docker.js.map +1 -0
  106. package/dist/quick/presets/git.d.ts +3 -0
  107. package/dist/quick/presets/git.d.ts.map +1 -0
  108. package/dist/quick/presets/git.js +116 -0
  109. package/dist/quick/presets/git.js.map +1 -0
  110. package/dist/quick/presets/ps.d.ts +3 -0
  111. package/dist/quick/presets/ps.d.ts.map +1 -0
  112. package/dist/quick/presets/ps.js +168 -0
  113. package/dist/quick/presets/ps.js.map +1 -0
  114. package/dist/quick/presets/runner.d.ts +3 -0
  115. package/dist/quick/presets/runner.d.ts.map +1 -0
  116. package/dist/quick/presets/runner.js +20 -0
  117. package/dist/quick/presets/runner.js.map +1 -0
  118. package/dist/quick/presets/types.d.ts +7 -0
  119. package/dist/quick/presets/types.d.ts.map +1 -0
  120. package/dist/quick/presets/types.js +2 -0
  121. package/dist/quick/presets/types.js.map +1 -0
  122. package/dist/quick/types.d.ts +90 -0
  123. package/dist/quick/types.d.ts.map +1 -0
  124. package/dist/quick/types.js +3 -0
  125. package/dist/quick/types.js.map +1 -0
  126. package/dist/quick/watch-mode.d.ts +3 -0
  127. package/dist/quick/watch-mode.d.ts.map +1 -0
  128. package/dist/quick/watch-mode.js +156 -0
  129. package/dist/quick/watch-mode.js.map +1 -0
  130. package/dist/server.js +2 -2
  131. package/dist/server.js.map +1 -1
  132. package/dist/types.d.ts +9 -2
  133. package/dist/types.d.ts.map +1 -1
  134. package/examples/demo.ts +134 -0
  135. package/examples/generate-access-log.ts +42 -0
  136. package/examples/screenshot-test.ts +105 -0
  137. package/examples/screenshot.png +0 -0
  138. package/frame-log.txt +830 -0
  139. package/package.json +10 -5
@@ -0,0 +1,262 @@
1
+ function titleFromFilename(filePath) {
2
+ const name = filePath.split('/').pop()?.split('\\').pop() ?? 'Data';
3
+ const base = name.replace(/\.[^.]+$/, '');
4
+ return base
5
+ .replace(/[-_]/g, ' ')
6
+ .replace(/\b\w/g, (c) => c.toUpperCase());
7
+ }
8
+ export function autoLayout(data, filePath) {
9
+ const title = filePath ? titleFromFilename(filePath) : 'TuiMon';
10
+ switch (data.type) {
11
+ case 'table':
12
+ return tableLayout(data, title);
13
+ case 'log':
14
+ return logLayout(data, title);
15
+ case 'modsec':
16
+ return modsecLayout(data, title);
17
+ case 'live':
18
+ return liveLayout(title);
19
+ }
20
+ }
21
+ // ─── Table layout (JSON/CSV) ─────────────────────────────────────────────────
22
+ function tableLayout(data, title) {
23
+ const stats = [
24
+ { id: '_rows', label: 'Total Rows', type: 'stat' },
25
+ { id: '_cols', label: 'Columns', type: 'stat' },
26
+ ];
27
+ // Add numeric column summaries (max 2 more stat cards)
28
+ for (const col of data.meta.numericColumns.slice(0, 2)) {
29
+ stats.push({ id: `_avg_${col}`, label: `Avg ${col}`, type: 'stat' });
30
+ }
31
+ const panels = [
32
+ { id: '_table', label: 'Data', type: 'table', span: 2 },
33
+ ];
34
+ // Bar chart for first numeric column grouped by first categorical
35
+ if (data.meta.numericColumns.length > 0 && data.meta.categoricalColumns.length > 0) {
36
+ panels.push({
37
+ id: '_chart_bar',
38
+ label: `${data.meta.numericColumns[0]} by ${data.meta.categoricalColumns[0]}`,
39
+ type: 'bar',
40
+ });
41
+ }
42
+ // Doughnut for first boolean column
43
+ if (data.meta.booleanColumns.length > 0) {
44
+ panels.push({
45
+ id: `_chart_bool`,
46
+ label: `${data.meta.booleanColumns[0]} Distribution`,
47
+ type: 'doughnut',
48
+ });
49
+ }
50
+ // Doughnut for first categorical column
51
+ if (data.meta.categoricalColumns.length > 0) {
52
+ panels.push({
53
+ id: '_chart_cat',
54
+ label: `${data.meta.categoricalColumns[0]} Distribution`,
55
+ type: 'doughnut',
56
+ });
57
+ }
58
+ return { title, stats, panels };
59
+ }
60
+ // ─── Log layouts ─────────────────────────────────────────────────────────────
61
+ function logLayout(data, title) {
62
+ switch (data.format) {
63
+ case 'nginx':
64
+ return nginxLayout(data, title);
65
+ case 'json':
66
+ return jsonLogLayout(data, title);
67
+ case 'plain':
68
+ default:
69
+ return plainLogLayout(data, title);
70
+ }
71
+ }
72
+ function nginxLayout(data, title) {
73
+ const stats = [
74
+ { id: '_requests', label: 'Total Requests', type: 'stat' },
75
+ { id: '_errors', label: 'Errors (4xx/5xx)', type: 'stat' },
76
+ { id: '_uniqueIPs', label: 'Unique IPs', type: 'stat' },
77
+ ];
78
+ const panels = [
79
+ { id: '_table', label: 'Request Log', type: 'table', span: 2 },
80
+ { id: '_statusCodes', label: 'Status Codes', type: 'doughnut' },
81
+ { id: '_methods', label: 'HTTP Methods', type: 'bar' },
82
+ ];
83
+ return { title: title || 'Access Log', stats, panels };
84
+ }
85
+ function jsonLogLayout(data, title) {
86
+ const stats = [
87
+ { id: '_total', label: 'Total Entries', type: 'stat' },
88
+ { id: '_errors', label: 'Errors', type: 'stat' },
89
+ { id: '_warnings', label: 'Warnings', type: 'stat' },
90
+ ];
91
+ const panels = [
92
+ { id: '_levelDist', label: 'Level Distribution', type: 'doughnut' },
93
+ { id: '_latestEntries', label: 'Latest Entries', type: 'event-log', span: 2 },
94
+ ];
95
+ return { title: title || 'Application Log', stats, panels };
96
+ }
97
+ function plainLogLayout(_data, title) {
98
+ const stats = [
99
+ { id: '_lines', label: 'Total Lines', type: 'stat' },
100
+ ];
101
+ const panels = [
102
+ { id: '_log', label: 'Log Output', type: 'event-log', span: 2 },
103
+ ];
104
+ return { title: title || 'Log', stats, panels };
105
+ }
106
+ // ─── ModSecurity layout ──────────────────────────────────────────────────────
107
+ function modsecLayout(data, title) {
108
+ const stats = [
109
+ { id: '_events', label: 'Security Events', type: 'stat' },
110
+ { id: '_blocked', label: 'Blocked', type: 'gauge' },
111
+ { id: '_attackers', label: 'Unique Attackers', type: 'stat' },
112
+ { id: '_critical', label: 'Critical', type: 'stat' },
113
+ ];
114
+ const panels = [
115
+ { id: '_severityDist', label: 'Severity Distribution', type: 'doughnut' },
116
+ { id: '_categories', label: 'Attack Categories', type: 'doughnut' },
117
+ { id: '_topRules', label: 'Top Rules Triggered', type: 'bar' },
118
+ { id: '_topIPs', label: 'Top Attacker IPs', type: 'bar' },
119
+ { id: '_latestEvents', label: 'Latest Events', type: 'event-log', span: 2 },
120
+ ];
121
+ return { title: title || 'ModSecurity', stats, panels };
122
+ }
123
+ // ─── Live data layout (auto-detect from first data call) ─────────────────────
124
+ function liveLayout(title) {
125
+ // Placeholder with a single stat so validateLayout doesn't throw
126
+ return { title, stats: [{ id: '_status', label: 'Status', type: 'stat' }] };
127
+ }
128
+ // ─── Convert parsed data to render-ready widget data ─────────────────────────
129
+ export function dataToWidgetData(data) {
130
+ switch (data.type) {
131
+ case 'table':
132
+ return tableToWidgetData(data);
133
+ case 'log':
134
+ return logToWidgetData(data);
135
+ case 'modsec':
136
+ return modsecToWidgetData(data);
137
+ case 'live':
138
+ return {};
139
+ }
140
+ }
141
+ function tableToWidgetData(data) {
142
+ const result = {
143
+ _rows: data.meta.totalRows,
144
+ _cols: data.columns.length,
145
+ _table: { columns: data.columns, rows: data.rows },
146
+ };
147
+ // Numeric column averages
148
+ for (const col of data.meta.numericColumns.slice(0, 2)) {
149
+ const values = data.rows.map((r) => Number(r[col])).filter((v) => !isNaN(v));
150
+ const avg = values.length > 0 ? Math.round((values.reduce((a, b) => a + b, 0) / values.length) * 100) / 100 : 0;
151
+ result[`_avg_${col}`] = avg;
152
+ }
153
+ // Bar chart: first numeric by first categorical
154
+ if (data.meta.numericColumns.length > 0 && data.meta.categoricalColumns.length > 0) {
155
+ const numCol = data.meta.numericColumns[0];
156
+ const catCol = data.meta.categoricalColumns[0];
157
+ const grouped = {};
158
+ for (const row of data.rows) {
159
+ const cat = String(row[catCol] ?? 'unknown');
160
+ const val = Number(row[numCol] ?? 0);
161
+ grouped[cat] = (grouped[cat] ?? 0) + val;
162
+ }
163
+ result['_chart_bar'] = grouped;
164
+ }
165
+ // Boolean distribution
166
+ if (data.meta.booleanColumns.length > 0) {
167
+ const col = data.meta.booleanColumns[0];
168
+ let trueCount = 0;
169
+ let falseCount = 0;
170
+ for (const row of data.rows) {
171
+ if (row[col])
172
+ trueCount++;
173
+ else
174
+ falseCount++;
175
+ }
176
+ result['_chart_bool'] = { True: trueCount, False: falseCount };
177
+ }
178
+ // Categorical distribution
179
+ if (data.meta.categoricalColumns.length > 0) {
180
+ const col = data.meta.categoricalColumns[0];
181
+ const counts = {};
182
+ for (const row of data.rows) {
183
+ const val = String(row[col] ?? 'unknown');
184
+ counts[val] = (counts[val] ?? 0) + 1;
185
+ }
186
+ result['_chart_cat'] = counts;
187
+ }
188
+ return result;
189
+ }
190
+ function logToWidgetData(data) {
191
+ const result = {};
192
+ if (data.format === 'nginx') {
193
+ result['_requests'] = data.stats.totalLines;
194
+ result['_errors'] = data.stats.errorCount ?? 0;
195
+ result['_uniqueIPs'] = data.stats.topIPs ? Object.keys(data.stats.topIPs).length : 0;
196
+ result['_statusCodes'] = data.stats.statusCodes ?? {};
197
+ result['_methods'] = data.stats.methods ?? {};
198
+ // Table with all parsed entries
199
+ result['_table'] = {
200
+ columns: ['Timestamp', 'IP', 'Method', 'Path', 'Status', 'Bytes'],
201
+ rows: data.entries.map((e) => ({
202
+ Timestamp: e.timestamp ?? '',
203
+ IP: e.ip ?? '',
204
+ Method: e.method ?? '',
205
+ Path: e.path ?? '',
206
+ Status: e.status ?? 0,
207
+ Bytes: e.bytes ?? 0,
208
+ })),
209
+ };
210
+ }
211
+ else if (data.format === 'json') {
212
+ const levels = {};
213
+ let errors = 0;
214
+ let warnings = 0;
215
+ for (const e of data.entries) {
216
+ const level = (e.level ?? 'info').toLowerCase();
217
+ levels[level] = (levels[level] ?? 0) + 1;
218
+ if (level === 'error')
219
+ errors++;
220
+ if (level === 'warn' || level === 'warning')
221
+ warnings++;
222
+ }
223
+ result['_total'] = data.stats.totalLines;
224
+ result['_errors'] = errors;
225
+ result['_warnings'] = warnings;
226
+ result['_levelDist'] = levels;
227
+ result['_latestEntries'] = data.entries.slice(-20).reverse().map((e) => {
228
+ const level = (e.level ?? 'info').toLowerCase();
229
+ const type = level === 'error' ? 'error' : level.startsWith('warn') ? 'warning' : 'info';
230
+ return { text: e.message ?? e.raw, type, time: e.timestamp ?? '' };
231
+ });
232
+ }
233
+ else {
234
+ result['_lines'] = data.stats.totalLines;
235
+ result['_log'] = data.entries.slice(-30).reverse().map((e) => e.raw);
236
+ }
237
+ return result;
238
+ }
239
+ function modsecToWidgetData(data) {
240
+ const total = data.stats.totalEvents;
241
+ return {
242
+ _events: total,
243
+ _blocked: total > 0 ? { value: data.stats.blockedRequests, max: total } : 0,
244
+ _attackers: data.stats.uniqueIPs,
245
+ _critical: data.stats.severityCounts['CRITICAL'] ?? 0,
246
+ _severityDist: data.stats.severityCounts,
247
+ _categories: data.stats.attackCategories,
248
+ _topRules: data.stats.topRules,
249
+ _topIPs: data.stats.topIPs,
250
+ _latestEvents: data.events.slice(-20).reverse().map((e) => {
251
+ const sev = e.messages[0]?.severity?.toUpperCase() ?? 'NOTICE';
252
+ const type = sev === 'CRITICAL' || sev === 'ERROR' ? 'error'
253
+ : sev === 'WARNING' ? 'warning'
254
+ : sev === 'NOTICE' ? 'success'
255
+ : 'info';
256
+ const ruleId = e.messages[0]?.id ?? '?';
257
+ const msg = e.messages[0]?.msg ?? 'No message';
258
+ return { text: `[${ruleId}] ${e.clientIp} ${e.method} ${e.uri} — ${msg}`, type, time: e.timestamp };
259
+ }),
260
+ };
261
+ }
262
+ //# sourceMappingURL=auto-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-layout.js","sourceRoot":"","sources":["../../src/quick/auto-layout.ts"],"names":[],"mappings":"AAGA,SAAS,iBAAiB,CAAC,QAAgB;IACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,CAAA;IACnE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IACzC,OAAO,IAAI;SACR,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAgB,EAAE,QAAiB;IAC5D,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IAE/D,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACjC,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAC/B,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAClC,KAAK,MAAM;YACT,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,SAAS,WAAW,CAAC,IAAe,EAAE,KAAa;IACjD,MAAM,KAAK,GAAmB;QAC5B,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE;QAClD,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;KAChD,CAAA;IAED,uDAAuD;IACvD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IACtE,CAAC;IAED,MAAM,MAAM,GAAmB;QAC7B,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAA+B,EAAE,IAAI,EAAE,CAAC,EAAE;KAChF,CAAA;IAED,kEAAkE;IAClE,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnF,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,YAAY;YAChB,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE;YAC7E,IAAI,EAAE,KAAK;SACZ,CAAC,CAAA;IACJ,CAAC;IAED,oCAAoC;IACpC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,aAAa;YACjB,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe;YACpD,IAAI,EAAE,UAAU;SACjB,CAAC,CAAA;IACJ,CAAC;IAED,wCAAwC;IACxC,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,YAAY;YAChB,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,eAAe;YACxD,IAAI,EAAE,UAAU;SACjB,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AACjC,CAAC;AAED,gFAAgF;AAEhF,SAAS,SAAS,CAAC,IAAa,EAAE,KAAa;IAC7C,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACjC,KAAK,MAAM;YACT,OAAO,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACnC,KAAK,OAAO,CAAC;QACb;YACE,OAAO,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACtC,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAa,EAAE,KAAa;IAC/C,MAAM,KAAK,GAAmB;QAC5B,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE;QAC1D,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE;QAC1D,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE;KACxD,CAAA;IAED,MAAM,MAAM,GAAmB;QAC7B,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,OAA+B,EAAE,IAAI,EAAE,CAAC,EAAE;QACtF,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE;QAC/D,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE;KACvD,CAAA;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AACxD,CAAC;AAED,SAAS,aAAa,CAAC,IAAa,EAAE,KAAa;IACjD,MAAM,KAAK,GAAmB;QAC5B,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE;QACtD,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;QAChD,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE;KACrD,CAAA;IAED,MAAM,MAAM,GAAmB;QAC7B,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,UAAU,EAAE;QACnE,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE;KAC9E,CAAA;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AAC7D,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,KAAa;IACnD,MAAM,KAAK,GAAmB;QAC5B,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE;KACrD,CAAA;IAED,MAAM,MAAM,GAAmB;QAC7B,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE;KAChE,CAAA;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AACjD,CAAC;AAED,gFAAgF;AAEhF,SAAS,YAAY,CAAC,IAAgB,EAAE,KAAa;IACnD,MAAM,KAAK,GAAmB;QAC5B,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE;QACzD,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;QACnD,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE;QAC7D,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE;KACrD,CAAA;IAED,MAAM,MAAM,GAAmB;QAC7B,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,UAAU,EAAE;QACzE,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,UAAU,EAAE;QACnE,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,qBAAqB,EAAE,IAAI,EAAE,KAAK,EAAE;QAC9D,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE;QACzD,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE;KAC5E,CAAA;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AACzD,CAAC;AAED,gFAAgF;AAEhF,SAAS,UAAU,CAAC,KAAa;IAC/B,iEAAiE;IACjE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;AAC7E,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC/C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAA;QAChC,KAAK,KAAK;YACR,OAAO,eAAe,CAAC,IAAI,CAAC,CAAA;QAC9B,KAAK,QAAQ;YACX,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACjC,KAAK,MAAM;YACT,OAAO,EAAE,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAe;IACxC,MAAM,MAAM,GAA4B;QACtC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;QAC1B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;QAC1B,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;KACnD,CAAA;IAED,0BAA0B;IAC1B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5E,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/G,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,GAAG,CAAA;IAC7B,CAAC;IAED,gDAAgD;IAChD,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAE,CAAA;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAE,CAAA;QAC/C,MAAM,OAAO,GAA2B,EAAE,CAAA;QAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,CAAA;YAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;YACpC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAA;QAC1C,CAAC;QACD,MAAM,CAAC,YAAY,CAAC,GAAG,OAAO,CAAA;IAChC,CAAC;IAED,uBAAuB;IACvB,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAE,CAAA;QACxC,IAAI,SAAS,GAAG,CAAC,CAAA;QACjB,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS,EAAE,CAAA;;gBACpB,UAAU,EAAE,CAAA;QACnB,CAAC;QACD,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;IAChE,CAAC;IAED,2BAA2B;IAC3B,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAE,CAAA;QAC5C,MAAM,MAAM,GAA2B,EAAE,CAAA;QACzC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAA;YACzC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACtC,CAAC;QACD,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAA;IAC/B,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,MAAM,MAAM,GAA4B,EAAE,CAAA;IAE1C,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAA;QAC3C,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,CAAA;QAC9C,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACpF,MAAM,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAA;QACrD,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAA;QAC7C,gCAAgC;QAChC,MAAM,CAAC,QAAQ,CAAC,GAAG;YACjB,OAAO,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC;YACjE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;gBAC5B,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE;gBACd,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE;gBACtB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;gBAClB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;gBACrB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;aACpB,CAAC,CAAC;SACJ,CAAA;IACH,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAClC,MAAM,MAAM,GAA2B,EAAE,CAAA;QACzC,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;YAC/C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;YACxC,IAAI,KAAK,KAAK,OAAO;gBAAE,MAAM,EAAE,CAAA;YAC/B,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS;gBAAE,QAAQ,EAAE,CAAA;QACzD,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAA;QACxC,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAA;QAC1B,MAAM,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAA;QAC9B,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAA;QAC7B,MAAM,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACrE,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;YAC/C,MAAM,IAAI,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAkB,CAAC,CAAC,CAAC,MAAe,CAAA;YACnH,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,CAAA;QACpE,CAAC,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACtE,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAgB;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAA;IACpC,OAAO;QACL,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3E,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;QAChC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC;QACrD,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;QACxC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB;QACxC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;QAC9B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;QAC1B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACxD,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,QAAQ,CAAA;YAC9D,MAAM,IAAI,GAAG,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,OAAgB;gBACnE,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAkB;oBACxC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAkB;wBACvC,CAAC,CAAC,MAAe,CAAA;YACnB,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,GAAG,CAAA;YACvC,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,YAAY,CAAA;YAC9C,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAA;QACrG,CAAC,CAAC;KACH,CAAA;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type DbType = 'mongodb' | 'postgres' | 'mysql' | 'sqlite';
2
+ export interface DbConnection {
3
+ type: DbType;
4
+ uri: string;
5
+ driverPath: string;
6
+ }
7
+ export declare function parseEnvFile(filePath: string): Map<string, string>;
8
+ export declare function detectDbType(uri: string): DbType;
9
+ export declare function findDriver(type: DbType): string | null;
10
+ export declare function detectDbConnection(opts: {
11
+ uri?: string | undefined;
12
+ envVarName?: string | undefined;
13
+ configEnvVar?: string | null;
14
+ configUri?: string | null;
15
+ }): DbConnection;
16
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../src/quick/db/detect.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEhE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;CACnB;AAaD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA+BlE;AAID,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAchD;AAWD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAatD;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B,GAAG,YAAY,CA0Df"}
@@ -0,0 +1,131 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { join } from 'node:path';
4
+ // ─── Known env var names per database type ───────────────────────────────────
5
+ const MONGO_VARS = ['MONGODB_URI', 'MONGO_URI', 'MONGO_URL', 'MONGODB_URL'];
6
+ const PG_VARS = ['DATABASE_URL', 'POSTGRES_URL', 'POSTGRES_URI', 'PG_URI', 'PG_URL'];
7
+ const MYSQL_VARS = ['MYSQL_URL', 'MYSQL_URI', 'DB_URL', 'DB_URI'];
8
+ const GENERIC_VARS = ['DB_CONNECTION', 'DB_CONNECTION_STRING'];
9
+ const ALL_KNOWN_VARS = [...MONGO_VARS, ...PG_VARS, ...MYSQL_VARS, ...GENERIC_VARS];
10
+ // ─── .env parsing ────────────────────────────────────────────────────────────
11
+ export function parseEnvFile(filePath) {
12
+ const result = new Map();
13
+ let content;
14
+ try {
15
+ content = readFileSync(filePath, 'utf-8');
16
+ }
17
+ catch {
18
+ return result;
19
+ }
20
+ for (const line of content.split('\n')) {
21
+ const trimmed = line.trim();
22
+ if (trimmed === '' || trimmed.startsWith('#'))
23
+ continue;
24
+ const eqIndex = trimmed.indexOf('=');
25
+ if (eqIndex === -1)
26
+ continue;
27
+ const key = trimmed.slice(0, eqIndex).trim();
28
+ let value = trimmed.slice(eqIndex + 1).trim();
29
+ // Strip surrounding quotes (single or double)
30
+ if ((value.startsWith('"') && value.endsWith('"')) ||
31
+ (value.startsWith("'") && value.endsWith("'"))) {
32
+ value = value.slice(1, -1);
33
+ }
34
+ result.set(key, value);
35
+ }
36
+ return result;
37
+ }
38
+ // ─── Type detection from URI ─────────────────────────────────────────────────
39
+ export function detectDbType(uri) {
40
+ if (uri.startsWith('mongodb://') || uri.startsWith('mongodb+srv://')) {
41
+ return 'mongodb';
42
+ }
43
+ if (uri.startsWith('postgresql://') || uri.startsWith('postgres://')) {
44
+ return 'postgres';
45
+ }
46
+ if (uri.startsWith('mysql://')) {
47
+ return 'mysql';
48
+ }
49
+ if (uri.endsWith('.sqlite') || uri.endsWith('.sqlite3') || uri.endsWith('.db')) {
50
+ return 'sqlite';
51
+ }
52
+ throw new Error(`Cannot detect database type from URI: ${uri}`);
53
+ }
54
+ // ─── Driver resolution ───────────────────────────────────────────────────────
55
+ const DRIVER_MAP = {
56
+ mongodb: ['mongodb'],
57
+ postgres: ['pg'],
58
+ mysql: ['mysql2'],
59
+ sqlite: ['better-sqlite3', 'sqlite3'],
60
+ };
61
+ export function findDriver(type) {
62
+ const candidates = DRIVER_MAP[type];
63
+ const require = createRequire(join(process.cwd(), 'package.json'));
64
+ for (const mod of candidates) {
65
+ try {
66
+ return require.resolve(mod);
67
+ }
68
+ catch {
69
+ // Module not found, try next
70
+ }
71
+ }
72
+ return null;
73
+ }
74
+ // ─── Main detection ──────────────────────────────────────────────────────────
75
+ export function detectDbConnection(opts) {
76
+ // 1. Explicit URI
77
+ if (opts.uri) {
78
+ return buildConnection(opts.uri);
79
+ }
80
+ const envPath = join(process.cwd(), '.env');
81
+ // 2. Specific env var name from --env flag
82
+ if (opts.envVarName) {
83
+ const env = parseEnvFile(envPath);
84
+ const value = env.get(opts.envVarName);
85
+ if (value) {
86
+ return buildConnection(value);
87
+ }
88
+ throw new Error(`Environment variable "${opts.envVarName}" not found in .env file at ${envPath}`);
89
+ }
90
+ // 3. Config-specified env var
91
+ if (opts.configEnvVar) {
92
+ const env = parseEnvFile(envPath);
93
+ const value = env.get(opts.configEnvVar);
94
+ if (value) {
95
+ return buildConnection(value);
96
+ }
97
+ throw new Error(`Config environment variable "${opts.configEnvVar}" not found in .env file at ${envPath}`);
98
+ }
99
+ // 4. Config-specified URI
100
+ if (opts.configUri) {
101
+ return buildConnection(opts.configUri);
102
+ }
103
+ // 5. Auto-scan .env for known variable names
104
+ const env = parseEnvFile(envPath);
105
+ for (const varName of ALL_KNOWN_VARS) {
106
+ const value = env.get(varName);
107
+ if (value) {
108
+ return buildConnection(value);
109
+ }
110
+ }
111
+ // 6. Nothing found
112
+ throw new Error([
113
+ 'No database connection found. Tried:',
114
+ ' - No --uri flag provided',
115
+ ' - No --env flag provided',
116
+ ' - No database config in tuimon config',
117
+ ` - Auto-scanned .env for: ${ALL_KNOWN_VARS.join(', ')}`,
118
+ '',
119
+ 'Provide a connection string with --uri or set one of the above variables in .env',
120
+ ].join('\n'));
121
+ }
122
+ function buildConnection(uri) {
123
+ const type = detectDbType(uri);
124
+ const driverPath = findDriver(type);
125
+ if (!driverPath) {
126
+ const pkgName = DRIVER_MAP[type].join(' or ');
127
+ throw new Error(`Database driver not found. Install the driver:\n npm install ${pkgName}`);
128
+ }
129
+ return { type, uri, driverPath };
130
+ }
131
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/quick/db/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { TableData } from '../types.js';
2
+ export interface MongoQueryOpts {
3
+ uri: string;
4
+ collection: string;
5
+ filter?: string | undefined;
6
+ sort?: string | undefined;
7
+ limit: number;
8
+ }
9
+ export declare function queryMongo(opts: MongoQueryOpts): Promise<TableData>;
10
+ //# sourceMappingURL=mongo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.d.ts","sourceRoot":"","sources":["../../../src/quick/db/mongo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAK5C,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;CACd;AA2CD,wBAAsB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAyDzE"}
@@ -0,0 +1,81 @@
1
+ import { createRequire } from 'node:module';
2
+ import { join } from 'node:path';
3
+ import { detectMeta } from '../parsers/detect-meta.js';
4
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
5
+ function isObjectId(value) {
6
+ return (value !== null &&
7
+ typeof value === 'object' &&
8
+ typeof value['toHexString'] === 'function');
9
+ }
10
+ function flattenObject(obj, prefix, depth) {
11
+ const result = {};
12
+ for (const [key, value] of Object.entries(obj)) {
13
+ const fullKey = prefix ? `${prefix}.${key}` : key;
14
+ if (isObjectId(value)) {
15
+ result[fullKey] = String(value);
16
+ }
17
+ else if (value instanceof Date) {
18
+ result[fullKey] = value.toISOString();
19
+ }
20
+ else if (depth < 2 &&
21
+ value !== null &&
22
+ typeof value === 'object' &&
23
+ !Array.isArray(value)) {
24
+ Object.assign(result, flattenObject(value, fullKey, depth + 1));
25
+ }
26
+ else {
27
+ result[fullKey] = value;
28
+ }
29
+ }
30
+ return result;
31
+ }
32
+ // ─── Query ───────────────────────────────────────────────────────────────────
33
+ export async function queryMongo(opts) {
34
+ const require = createRequire(join(process.cwd(), 'package.json'));
35
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
36
+ const mongodb = require('mongodb');
37
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
38
+ const client = new mongodb.MongoClient(opts.uri, {
39
+ serverSelectionTimeoutMS: 10000,
40
+ });
41
+ try {
42
+ await client.connect();
43
+ // Extract db name from URI path
44
+ const url = new URL(opts.uri.replace('mongodb+srv://', 'https://').replace('mongodb://', 'https://'));
45
+ const dbName = url.pathname.slice(1).split('?')[0];
46
+ if (!dbName) {
47
+ throw new Error('No database name found in MongoDB URI. Include it in the URI path.');
48
+ }
49
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
50
+ const db = client.db(dbName);
51
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
52
+ const collection = db.collection(opts.collection);
53
+ const filter = opts.filter ? JSON.parse(opts.filter) : {};
54
+ const sort = opts.sort ? JSON.parse(opts.sort) : {};
55
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
56
+ const docs = await collection.find(filter).sort(sort).limit(opts.limit).toArray();
57
+ const rows = docs.map((doc) => flattenObject(doc, '', 0));
58
+ // Collect all unique columns across all rows
59
+ const columnSet = new Set();
60
+ for (const row of rows) {
61
+ for (const key of Object.keys(row)) {
62
+ columnSet.add(key);
63
+ }
64
+ }
65
+ const columns = [...columnSet];
66
+ const meta = detectMeta(columns, rows);
67
+ return {
68
+ type: 'table',
69
+ columns,
70
+ rows,
71
+ meta: {
72
+ totalRows: rows.length,
73
+ ...meta,
74
+ },
75
+ };
76
+ }
77
+ finally {
78
+ await client.close();
79
+ }
80
+ }
81
+ //# sourceMappingURL=mongo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.js","sourceRoot":"","sources":["../../../src/quick/db/mongo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { TableData } from '../types.js';
2
+ export interface MysqlQueryOpts {
3
+ uri: string;
4
+ query: string;
5
+ limit: number;
6
+ }
7
+ export declare function queryMysql(opts: MysqlQueryOpts): Promise<TableData>;
8
+ //# sourceMappingURL=mysql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../../src/quick/db/mysql.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAK5C,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAYD,wBAAsB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAyCzE"}
@@ -0,0 +1,43 @@
1
+ import { createRequire } from 'node:module';
2
+ import { join } from 'node:path';
3
+ import { detectMeta } from '../parsers/detect-meta.js';
4
+ // ─── Table name validation ───────────────────────────────────────────────────
5
+ const TABLE_NAME_RE = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
6
+ function isTableName(query) {
7
+ return !query.includes(' ') && TABLE_NAME_RE.test(query);
8
+ }
9
+ // ─── Query ───────────────────────────────────────────────────────────────────
10
+ export async function queryMysql(opts) {
11
+ const require = createRequire(join(process.cwd(), 'package.json'));
12
+ const mysql = require('mysql2/promise');
13
+ let sql;
14
+ if (isTableName(opts.query)) {
15
+ if (!TABLE_NAME_RE.test(opts.query)) {
16
+ throw new Error(`Invalid table name: "${opts.query}". Table names must match /^[a-zA-Z_][a-zA-Z0-9_]*$/`);
17
+ }
18
+ sql = `SELECT * FROM ${opts.query} LIMIT ${opts.limit}`;
19
+ }
20
+ else {
21
+ sql = opts.query;
22
+ }
23
+ const conn = await mysql.createConnection(opts.uri);
24
+ try {
25
+ const [rows, fields] = await conn.execute(sql);
26
+ const columns = fields.map((f) => f.name);
27
+ const typedRows = rows;
28
+ const meta = detectMeta(columns, typedRows);
29
+ return {
30
+ type: 'table',
31
+ columns,
32
+ rows: typedRows,
33
+ meta: {
34
+ totalRows: typedRows.length,
35
+ ...meta,
36
+ },
37
+ };
38
+ }
39
+ finally {
40
+ await conn.end();
41
+ }
42
+ }
43
+ //# sourceMappingURL=mysql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../src/quick/db/mysql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAUtD,gFAAgF;AAEhF,MAAM,aAAa,GAAG,0BAA0B,CAAA;AAEhD,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC1D,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAoB;IACnD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC,CAAA;IAClE,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAKrC,CAAA;IAED,IAAI,GAAW,CAAA;IAEf,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,KAAK,sDAAsD,CAAC,CAAA;QAC3G,CAAC;QACD,GAAG,GAAG,iBAAiB,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,EAAE,CAAA;IACzD,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,IAAI,CAAC,KAAK,CAAA;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEnD,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAE9C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,SAAS,GAAG,IAAiC,CAAA;QACnD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QAE3C,OAAO;YACL,IAAI,EAAE,OAAO;YACb,OAAO;YACP,IAAI,EAAE,SAAS;YACf,IAAI,EAAE;gBACJ,SAAS,EAAE,SAAS,CAAC,MAAM;gBAC3B,GAAG,IAAI;aACR;SACF,CAAA;IACH,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAA;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { TableData } from '../types.js';
2
+ export interface PgQueryOpts {
3
+ uri: string;
4
+ query: string;
5
+ limit: number;
6
+ }
7
+ export declare function queryPostgres(opts: PgQueryOpts): Promise<TableData>;
8
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../../src/quick/db/postgres.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAK5C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAYD,wBAAsB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CA4CzE"}