@calltelemetry/cli 0.3.3 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/lib/log.d.ts +13 -5
- package/dist/lib/log.d.ts.map +1 -1
- package/dist/lib/log.js +34 -10
- package/dist/lib/log.js.map +1 -1
- package/dist/lib/rpc.d.ts +7 -0
- package/dist/lib/rpc.d.ts.map +1 -1
- package/dist/lib/rpc.js +21 -0
- package/dist/lib/rpc.js.map +1 -1
- package/dist/lib/system.d.ts +20 -0
- package/dist/lib/system.d.ts.map +1 -1
- package/dist/lib/system.js +44 -1
- package/dist/lib/system.js.map +1 -1
- package/dist/ui/components/AppShell.d.ts +4 -1
- package/dist/ui/components/AppShell.d.ts.map +1 -1
- package/dist/ui/components/AppShell.js +4 -3
- package/dist/ui/components/AppShell.js.map +1 -1
- package/dist/ui/components/LogLevelBadge.d.ts +7 -0
- package/dist/ui/components/LogLevelBadge.d.ts.map +1 -0
- package/dist/ui/components/LogLevelBadge.js +14 -0
- package/dist/ui/components/LogLevelBadge.js.map +1 -0
- package/dist/ui/components/MeterBar.d.ts +15 -0
- package/dist/ui/components/MeterBar.d.ts.map +1 -0
- package/dist/ui/components/MeterBar.js +17 -0
- package/dist/ui/components/MeterBar.js.map +1 -0
- package/dist/ui/components/StepList.d.ts.map +1 -1
- package/dist/ui/components/StepList.js +5 -1
- package/dist/ui/components/StepList.js.map +1 -1
- package/dist/ui/components/index.d.ts +2 -0
- package/dist/ui/components/index.d.ts.map +1 -1
- package/dist/ui/components/index.js +2 -0
- package/dist/ui/components/index.js.map +1 -1
- package/dist/ui/hooks/index.d.ts +1 -0
- package/dist/ui/hooks/index.d.ts.map +1 -1
- package/dist/ui/hooks/index.js +1 -0
- package/dist/ui/hooks/index.js.map +1 -1
- package/dist/ui/hooks/useLogLevel.d.ts +12 -0
- package/dist/ui/hooks/useLogLevel.d.ts.map +1 -0
- package/dist/ui/hooks/useLogLevel.js +19 -0
- package/dist/ui/hooks/useLogLevel.js.map +1 -0
- package/dist/ui/views/DbSizeView.d.ts.map +1 -1
- package/dist/ui/views/DbSizeView.js +4 -3
- package/dist/ui/views/DbSizeView.js.map +1 -1
- package/dist/ui/views/DbTablesView.d.ts.map +1 -1
- package/dist/ui/views/DbTablesView.js +7 -4
- package/dist/ui/views/DbTablesView.js.map +1 -1
- package/dist/ui/views/DiagDatabaseView.d.ts.map +1 -1
- package/dist/ui/views/DiagDatabaseView.js +12 -6
- package/dist/ui/views/DiagDatabaseView.js.map +1 -1
- package/dist/ui/views/DockerStatusView.d.ts.map +1 -1
- package/dist/ui/views/DockerStatusView.js +12 -5
- package/dist/ui/views/DockerStatusView.js.map +1 -1
- package/dist/ui/views/MainMenu.d.ts.map +1 -1
- package/dist/ui/views/MainMenu.js +26 -10
- package/dist/ui/views/MainMenu.js.map +1 -1
- package/dist/ui/views/MigrateHistoryView.d.ts.map +1 -1
- package/dist/ui/views/MigrateHistoryView.js +7 -4
- package/dist/ui/views/MigrateHistoryView.js.map +1 -1
- package/dist/ui/views/UpdateView.js +8 -8
- package/dist/ui/views/UpdateView.js.map +1 -1
- package/dist/utils/parseDocker.d.ts +17 -0
- package/dist/utils/parseDocker.d.ts.map +1 -0
- package/dist/utils/parseDocker.js +67 -0
- package/dist/utils/parseDocker.js.map +1 -0
- package/dist/utils/parsePsql.d.ts +30 -0
- package/dist/utils/parsePsql.d.ts.map +1 -0
- package/dist/utils/parsePsql.js +75 -0
- package/dist/utils/parsePsql.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse docker `--format table` or `docker compose ps` output into
|
|
3
|
+
* DataTable-compatible structure.
|
|
4
|
+
*
|
|
5
|
+
* Docker table output uses 2+ spaces (or tabs) between columns:
|
|
6
|
+
* NAME STATUS PORTS
|
|
7
|
+
* ct-web running 0.0.0.0:443->443/tcp
|
|
8
|
+
*/
|
|
9
|
+
export function parseDockerTable(raw) {
|
|
10
|
+
const lines = raw.split('\n').filter(l => l.trim() !== '');
|
|
11
|
+
if (lines.length === 0)
|
|
12
|
+
return { columns: [], rows: [] };
|
|
13
|
+
// Detect column boundaries from the header line.
|
|
14
|
+
// Docker formats headers with 2+ spaces between columns.
|
|
15
|
+
const headerLine = lines[0];
|
|
16
|
+
const boundaries = detectColumnBoundaries(headerLine);
|
|
17
|
+
const columns = boundaries.map(({ start, end }) => {
|
|
18
|
+
const label = headerLine.slice(start, end).trim();
|
|
19
|
+
return {
|
|
20
|
+
key: label.toLowerCase().replace(/\s+/g, '_'),
|
|
21
|
+
label,
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
const rows = [];
|
|
25
|
+
for (let i = 1; i < lines.length; i++) {
|
|
26
|
+
const line = lines[i];
|
|
27
|
+
const row = {};
|
|
28
|
+
for (let c = 0; c < boundaries.length; c++) {
|
|
29
|
+
const { start, end } = boundaries[c];
|
|
30
|
+
row[columns[c].key] = line.slice(start, end).trim();
|
|
31
|
+
}
|
|
32
|
+
rows.push(row);
|
|
33
|
+
}
|
|
34
|
+
return { columns, rows };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Detect column start/end positions from a header line.
|
|
38
|
+
* Columns are separated by 2+ consecutive spaces.
|
|
39
|
+
*/
|
|
40
|
+
function detectColumnBoundaries(header) {
|
|
41
|
+
const boundaries = [];
|
|
42
|
+
let i = 0;
|
|
43
|
+
while (i < header.length) {
|
|
44
|
+
// Skip leading whitespace
|
|
45
|
+
while (i < header.length && header[i] === ' ')
|
|
46
|
+
i++;
|
|
47
|
+
if (i >= header.length)
|
|
48
|
+
break;
|
|
49
|
+
const start = i;
|
|
50
|
+
// Find end of this column header text (look for 2+ spaces or end of line)
|
|
51
|
+
while (i < header.length) {
|
|
52
|
+
if (header[i] === ' ' && i + 1 < header.length && header[i + 1] === ' ')
|
|
53
|
+
break;
|
|
54
|
+
i++;
|
|
55
|
+
}
|
|
56
|
+
boundaries.push({ start, end: i });
|
|
57
|
+
// Skip the gap (2+ spaces)
|
|
58
|
+
while (i < header.length && header[i] === ' ')
|
|
59
|
+
i++;
|
|
60
|
+
}
|
|
61
|
+
// Extend last column to end of longest line
|
|
62
|
+
if (boundaries.length > 0) {
|
|
63
|
+
boundaries[boundaries.length - 1].end = Infinity;
|
|
64
|
+
}
|
|
65
|
+
return boundaries;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=parseDocker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseDocker.js","sourceRoot":"","sources":["../../src/utils/parseDocker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface ParsedTable {
|
|
2
|
+
columns: Array<{
|
|
3
|
+
key: string;
|
|
4
|
+
label: string;
|
|
5
|
+
}>;
|
|
6
|
+
rows: Array<Record<string, string>>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Parse psql tabular output into DataTable-compatible structure.
|
|
10
|
+
*
|
|
11
|
+
* Handles standard psql output:
|
|
12
|
+
* column_a | column_b
|
|
13
|
+
* -----------+----------
|
|
14
|
+
* value_1 | value_2
|
|
15
|
+
* (2 rows)
|
|
16
|
+
*/
|
|
17
|
+
export declare function parsePsqlTable(raw: string): ParsedTable;
|
|
18
|
+
/**
|
|
19
|
+
* Parse a single-value psql result.
|
|
20
|
+
*
|
|
21
|
+
* Handles output like:
|
|
22
|
+
* database_size
|
|
23
|
+
* ---------------
|
|
24
|
+
* 23 GB
|
|
25
|
+
* (1 row)
|
|
26
|
+
*
|
|
27
|
+
* Returns the trimmed scalar value (e.g. "23 GB").
|
|
28
|
+
*/
|
|
29
|
+
export declare function parsePsqlScalar(raw: string): string;
|
|
30
|
+
//# sourceMappingURL=parsePsql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsePsql.d.ts","sourceRoot":"","sources":["../../src/utils/parsePsql.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrC;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAwCvD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAcnD"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse psql tabular output into DataTable-compatible structure.
|
|
3
|
+
*
|
|
4
|
+
* Handles standard psql output:
|
|
5
|
+
* column_a | column_b
|
|
6
|
+
* -----------+----------
|
|
7
|
+
* value_1 | value_2
|
|
8
|
+
* (2 rows)
|
|
9
|
+
*/
|
|
10
|
+
export function parsePsqlTable(raw) {
|
|
11
|
+
const lines = raw.split('\n').filter(l => l.trim() !== '');
|
|
12
|
+
if (lines.length === 0)
|
|
13
|
+
return { columns: [], rows: [] };
|
|
14
|
+
// Find header line (first non-empty line)
|
|
15
|
+
const headerLine = lines[0];
|
|
16
|
+
const labels = headerLine.split('|').map(s => s.trim());
|
|
17
|
+
const columns = labels.map(label => ({
|
|
18
|
+
key: label.toLowerCase().replace(/\s+/g, '_'),
|
|
19
|
+
label,
|
|
20
|
+
}));
|
|
21
|
+
// Find separator line index (contains ----+---- pattern)
|
|
22
|
+
let sepIdx = -1;
|
|
23
|
+
for (let i = 1; i < lines.length; i++) {
|
|
24
|
+
if (/^[-+\s]+$/.test(lines[i])) {
|
|
25
|
+
sepIdx = i;
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Data rows start after separator, end before (N rows) footer
|
|
30
|
+
const dataStart = sepIdx >= 0 ? sepIdx + 1 : 1;
|
|
31
|
+
const rows = [];
|
|
32
|
+
for (let i = dataStart; i < lines.length; i++) {
|
|
33
|
+
const line = lines[i];
|
|
34
|
+
// Stop at footer like "(10 rows)" or "(1 row)"
|
|
35
|
+
if (/^\(\d+ rows?\)$/.test(line.trim()))
|
|
36
|
+
break;
|
|
37
|
+
const values = line.split('|').map(s => s.trim());
|
|
38
|
+
const row = {};
|
|
39
|
+
for (let c = 0; c < columns.length; c++) {
|
|
40
|
+
row[columns[c].key] = values[c] ?? '';
|
|
41
|
+
}
|
|
42
|
+
rows.push(row);
|
|
43
|
+
}
|
|
44
|
+
return { columns, rows };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Parse a single-value psql result.
|
|
48
|
+
*
|
|
49
|
+
* Handles output like:
|
|
50
|
+
* database_size
|
|
51
|
+
* ---------------
|
|
52
|
+
* 23 GB
|
|
53
|
+
* (1 row)
|
|
54
|
+
*
|
|
55
|
+
* Returns the trimmed scalar value (e.g. "23 GB").
|
|
56
|
+
*/
|
|
57
|
+
export function parsePsqlScalar(raw) {
|
|
58
|
+
const lines = raw.split('\n').filter(l => l.trim() !== '');
|
|
59
|
+
// Skip header (line 0) and separator (line 1), take first data line
|
|
60
|
+
for (let i = 0; i < lines.length; i++) {
|
|
61
|
+
const line = lines[i].trim();
|
|
62
|
+
// Skip header and separator lines
|
|
63
|
+
if (i === 0)
|
|
64
|
+
continue;
|
|
65
|
+
if (/^[-+\s]+$/.test(line))
|
|
66
|
+
continue;
|
|
67
|
+
// Skip footer
|
|
68
|
+
if (/^\(\d+ rows?\)$/.test(line))
|
|
69
|
+
continue;
|
|
70
|
+
// First data line is the scalar
|
|
71
|
+
return line;
|
|
72
|
+
}
|
|
73
|
+
return raw.trim();
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=parsePsql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsePsql.js","sourceRoot":"","sources":["../../src/utils/parsePsql.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAEzD,0CAA0C;IAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnC,GAAG,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;QAC7C,KAAK;KACN,CAAC,CAAC,CAAC;IAEJ,yDAAyD;IACzD,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,CAAC,CAAC;YACX,MAAM;QACR,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAkC,EAAE,CAAC;IAE/C,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,+CAA+C;QAC/C,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAAE,MAAM;QAE/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,oEAAoE;IACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAC9B,kCAAkC;QAClC,IAAI,CAAC,KAAK,CAAC;YAAE,SAAS;QACtB,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACrC,cAAc;QACd,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAC3C,gCAAgC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
|