fdb2 1.0.27 → 1.0.32

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 (76) hide show
  1. package/bin/fdb2.js +29 -2
  2. package/dist/public/.vite/manifest.json +4 -4
  3. package/dist/public/bootstrap.js +6 -5
  4. package/dist/public/explorer.js +318 -193
  5. package/dist/public/index.css +59 -0
  6. package/dist/public/index.js +486 -259
  7. package/dist/public/layout.js +2 -2
  8. package/dist/public/rolldown-runtime.js +8 -1
  9. package/dist/public/vconsole.min.js +0 -26
  10. package/dist/public/vue.js +5238 -5192
  11. package/dist/server/cli/format.d.ts +6 -0
  12. package/dist/server/cli/format.d.ts.map +1 -0
  13. package/dist/server/cli/format.js +130 -0
  14. package/dist/server/cli/format.js.map +1 -0
  15. package/dist/server/cli/format.ts +117 -0
  16. package/dist/server/cli/main.d.ts +3 -0
  17. package/dist/server/cli/main.d.ts.map +1 -0
  18. package/dist/server/cli/main.js +718 -0
  19. package/dist/server/cli/main.js.map +1 -0
  20. package/dist/server/cli/main.ts +755 -0
  21. package/dist/server/cli/parse.d.ts +18 -0
  22. package/dist/server/cli/parse.d.ts.map +1 -0
  23. package/dist/server/cli/parse.js +150 -0
  24. package/dist/server/cli/parse.js.map +1 -0
  25. package/dist/server/cli/parse.ts +148 -0
  26. package/dist/server/core/column-spec.d.ts +29 -0
  27. package/dist/server/core/column-spec.d.ts.map +1 -0
  28. package/dist/server/core/column-spec.js +148 -0
  29. package/dist/server/core/column-spec.js.map +1 -0
  30. package/dist/server/core/column-spec.ts +147 -0
  31. package/dist/server/core/config.d.ts +34 -0
  32. package/dist/server/core/config.d.ts.map +1 -0
  33. package/dist/server/core/config.js +187 -0
  34. package/dist/server/core/config.js.map +1 -0
  35. package/dist/server/core/config.ts +165 -0
  36. package/dist/server/core/db-api.d.ts +171 -0
  37. package/dist/server/core/db-api.d.ts.map +1 -0
  38. package/dist/server/core/db-api.js +1111 -0
  39. package/dist/server/core/db-api.js.map +1 -0
  40. package/dist/server/core/db-api.ts +1213 -0
  41. package/dist/server/core/dialect.d.ts +44 -0
  42. package/dist/server/core/dialect.d.ts.map +1 -0
  43. package/dist/server/core/dialect.js +260 -0
  44. package/dist/server/core/dialect.js.map +1 -0
  45. package/dist/server/core/dialect.ts +293 -0
  46. package/dist/server/core/errors.d.ts +22 -0
  47. package/dist/server/core/errors.d.ts.map +1 -0
  48. package/dist/server/core/errors.js +61 -0
  49. package/dist/server/core/errors.js.map +1 -0
  50. package/dist/server/core/errors.ts +58 -0
  51. package/dist/server/core/filter-dsl.d.ts +39 -0
  52. package/dist/server/core/filter-dsl.d.ts.map +1 -0
  53. package/dist/server/core/filter-dsl.js +167 -0
  54. package/dist/server/core/filter-dsl.js.map +1 -0
  55. package/dist/server/core/filter-dsl.ts +180 -0
  56. package/dist/server/core/guard.d.ts +54 -0
  57. package/dist/server/core/guard.d.ts.map +1 -0
  58. package/dist/server/core/guard.js +207 -0
  59. package/dist/server/core/guard.js.map +1 -0
  60. package/dist/server/core/guard.ts +205 -0
  61. package/dist/server/core/query-builder.d.ts +72 -0
  62. package/dist/server/core/query-builder.d.ts.map +1 -0
  63. package/dist/server/core/query-builder.js +478 -0
  64. package/dist/server/core/query-builder.js.map +1 -0
  65. package/dist/server/core/query-builder.ts +502 -0
  66. package/dist/server/service/connection.service.d.ts.map +1 -1
  67. package/dist/server/service/connection.service.js +7 -3
  68. package/dist/server/service/connection.service.js.map +1 -1
  69. package/dist/server/service/connection.service.ts +5 -3
  70. package/dist/server/utils/data-dir.d.ts.map +1 -1
  71. package/dist/server/utils/data-dir.js +2 -0
  72. package/dist/server/utils/data-dir.js.map +1 -1
  73. package/dist/server/utils/data-dir.ts +2 -0
  74. package/electron/updater.js +12 -66
  75. package/package.json +22 -22
  76. package/server.js +13 -1
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 非 --json 模式下的人类可读输出
3
+ */
4
+ export declare function renderTable(headers: string[], rows: any[][]): string;
5
+ export declare function humanizeResult(cmd: string, data: any): string;
6
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../server/cli/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,MAAM,CAQpE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,CAiG7D"}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderTable = renderTable;
4
+ exports.humanizeResult = humanizeResult;
5
+ /**
6
+ * 非 --json 模式下的人类可读输出
7
+ */
8
+ function renderTable(headers, rows) {
9
+ if (rows.length === 0)
10
+ return '(空)';
11
+ const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => String(r[i] ?? '').length)));
12
+ const pad = (s, w) => String(s ?? '').padEnd(w);
13
+ const line = headers.map((h, i) => pad(h, widths[i])).join(' ');
14
+ const sep = widths.map((w) => '-'.repeat(w)).join(' ');
15
+ const body = rows.map((r) => r.map((c, i) => pad(c, widths[i])).join(' ')).join('\n');
16
+ return `${line}\n${sep}\n${body}`;
17
+ }
18
+ function humanizeResult(cmd, data) {
19
+ const cut = (s, n = 3000) => (s.length > n ? s.slice(0, n) + '...' : s);
20
+ switch (cmd) {
21
+ case 'conn:list': {
22
+ const list = data.connections || [];
23
+ const lines = list.map((c) => {
24
+ const d = c.isDefault ? '*' : ' ';
25
+ return `${d} ${c.name} [${c.type}] ${c.host || ''}${c.port ? ':' + c.port : ''} ${c.database || ''} ${c.enabled === false ? '(禁用)' : ''}`;
26
+ });
27
+ return lines.length ? `默认连接用 * 标记\n${lines.join('\n')}` : '还没有任何连接';
28
+ }
29
+ case 'conn:current':
30
+ return `当前连接: ${data.name} (${data.type})`;
31
+ case 'db:list': {
32
+ const dbs = data.databases || [];
33
+ return dbs.length ? dbs.map((d) => `- ${d}`).join('\n') : '(无数据库)';
34
+ }
35
+ case 'table:list': {
36
+ const tables = data.tables || [];
37
+ const headers = ['name', 'rows', 'size', 'engine', 'comment'];
38
+ const rows = tables.map((t) => [t.name, t.rowCount ?? '', t.size ?? '', t.engine ?? '', t.comment ?? '']);
39
+ return `${data.database} 共 ${tables.length} 张表\n${renderTable(headers, rows)}`;
40
+ }
41
+ case 'table:columns': {
42
+ const cols = (data.table && data.table.columns) || data.columns || [];
43
+ const headers = ['name', 'type', 'null', 'key', 'default', 'comment'];
44
+ const rows = cols.map((c) => [
45
+ c.name,
46
+ c.type + (c.length ? `(${c.length})` : ''),
47
+ c.nullable === false ? 'NO' : 'YES',
48
+ c.isPrimary ? 'PRI' : c.unique ? 'UNI' : '',
49
+ c.defaultValue ?? '',
50
+ c.comment || ''
51
+ ]);
52
+ return renderTable(headers, rows);
53
+ }
54
+ case 'table:indexes':
55
+ case 'index:list': {
56
+ const list = data.indexes || [];
57
+ return renderTable(['name', 'type', 'columns', 'unique'], list.map((x) => [x.name, x.type, (x.columns || []).join(','), x.unique ? 'YES' : 'NO']));
58
+ }
59
+ case 'rows:list':
60
+ case 'rows:get': {
61
+ const rows = data.data || [];
62
+ if (!rows.length)
63
+ return '(无数据)';
64
+ const headers = Object.keys(rows[0]);
65
+ const body = rows.slice(0, 50).map((r) => headers.map((h) => cell(r[h])).join(' '));
66
+ const more = rows.length > 50 ? `\n... 共 ${rows.length} 行,已省略` : '';
67
+ return `${data.table} · ${data.meta ? `${rows.length} 行` : ''}\n${headers.join(' ')}\n${'-'.repeat(40)}\n${body.join('\n')}${more}`;
68
+ }
69
+ case 'rows:count':
70
+ return `${data.table} 符合条件 ${data.count} 行`;
71
+ case 'types':
72
+ return (data.types || []).map((t) => `- ${t.type}${t.label ? ' (' + t.label + ')' : ''}${t.experimental ? ' [experimental]' : ''}`).join('\n');
73
+ case 'ops:logs': {
74
+ const logs = data.logs || [];
75
+ return logs.map((l) => JSON.stringify(l)).join('\n') || '(无日志)';
76
+ }
77
+ case 'audit': {
78
+ const logs = data.logs || [];
79
+ return logs.map((l) => `${l.ts} ${l.action} ${l.conn || ''} ${l.database || ''} ${l.table || ''} ${l.ok ? '' : 'FAILED'}${l.error ? ' ' + l.error : ''}`).join('\n') || '(无审计记录)';
80
+ }
81
+ case 'setup':
82
+ case 'config:show':
83
+ return JSON.stringify(data, null, 2);
84
+ case 'server:status': {
85
+ if (data.running) {
86
+ const lines = [
87
+ `fdb2 Web 服务运行中`,
88
+ ` PID: ${data.pid}`,
89
+ ` 端口: ${data.port}`,
90
+ ` 地址: ${data.url}`
91
+ ];
92
+ if (data.startedAt)
93
+ lines.push(` 启动: ${data.startedAt}`);
94
+ return lines.join('\n');
95
+ }
96
+ return data.message || 'fdb2 Web 服务未启动';
97
+ }
98
+ case 'export:schema': {
99
+ if (data.schema)
100
+ return cut(data.schema);
101
+ return `schema 已导出到 ${data.path}`;
102
+ }
103
+ default: {
104
+ if (data && typeof data === 'object' && (data.sql || data.dryRun !== undefined || data.token)) {
105
+ const parts = [];
106
+ if (data.dryRun)
107
+ parts.push('(dry-run 预演,未执行)');
108
+ if (data.sql)
109
+ parts.push(Array.isArray(data.sql) ? data.sql.join('\n') : data.sql);
110
+ if (data.estimatedRows != null)
111
+ parts.push(`预计影响 ${data.estimatedRows} 行`);
112
+ if (data.token)
113
+ parts.push(`confirmToken: ${data.token}`);
114
+ if (data.result !== undefined)
115
+ parts.push('结果: ' + cut(JSON.stringify(data.result)));
116
+ if (data.dryRun)
117
+ parts.push('\n确认执行请携带: --confirm ' + data.token);
118
+ return parts.join('\n');
119
+ }
120
+ return cut(JSON.stringify(data, null, 2));
121
+ }
122
+ }
123
+ }
124
+ function cell(v) {
125
+ if (v === null || v === undefined)
126
+ return 'NULL';
127
+ const s = typeof v === 'object' ? JSON.stringify(v) : String(v);
128
+ return s.length > 60 ? s.slice(0, 60) + '…' : s;
129
+ }
130
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../server/cli/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * 非 --json 模式下的人类可读输出
3
+ */
4
+ export function renderTable(headers: string[], rows: any[][]): string {
5
+ if (rows.length === 0) return '(空)';
6
+ const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => String(r[i] ?? '').length)));
7
+ const pad = (s: any, w: number) => String(s ?? '').padEnd(w);
8
+ const line = headers.map((h, i) => pad(h, widths[i])).join(' ');
9
+ const sep = widths.map((w) => '-'.repeat(w)).join(' ');
10
+ const body = rows.map((r) => r.map((c, i) => pad(c, widths[i])).join(' ')).join('\n');
11
+ return `${line}\n${sep}\n${body}`;
12
+ }
13
+
14
+ export function humanizeResult(cmd: string, data: any): string {
15
+ const cut = (s: string, n = 3000) => (s.length > n ? s.slice(0, n) + '...' : s);
16
+
17
+ switch (cmd) {
18
+ case 'conn:list': {
19
+ const list = data.connections || [];
20
+ const lines = list.map((c: any) => {
21
+ const d = c.isDefault ? '*' : ' ';
22
+ return `${d} ${c.name} [${c.type}] ${c.host || ''}${c.port ? ':' + c.port : ''} ${c.database || ''} ${c.enabled === false ? '(禁用)' : ''}`;
23
+ });
24
+ return lines.length ? `默认连接用 * 标记\n${lines.join('\n')}` : '还没有任何连接';
25
+ }
26
+ case 'conn:current':
27
+ return `当前连接: ${data.name} (${data.type})`;
28
+ case 'db:list': {
29
+ const dbs = data.databases || [];
30
+ return dbs.length ? dbs.map((d: any) => `- ${d}`).join('\n') : '(无数据库)';
31
+ }
32
+ case 'table:list': {
33
+ const tables = data.tables || [];
34
+ const headers = ['name', 'rows', 'size', 'engine', 'comment'];
35
+ const rows = tables.map((t: any) => [t.name, t.rowCount ?? '', t.size ?? '', t.engine ?? '', t.comment ?? '']);
36
+ return `${data.database} 共 ${tables.length} 张表\n${renderTable(headers, rows)}`;
37
+ }
38
+ case 'table:columns': {
39
+ const cols = (data.table && data.table.columns) || data.columns || [];
40
+ const headers = ['name', 'type', 'null', 'key', 'default', 'comment'];
41
+ const rows = cols.map((c: any) => [
42
+ c.name,
43
+ c.type + (c.length ? `(${c.length})` : ''),
44
+ c.nullable === false ? 'NO' : 'YES',
45
+ c.isPrimary ? 'PRI' : c.unique ? 'UNI' : '',
46
+ c.defaultValue ?? '',
47
+ c.comment || ''
48
+ ]);
49
+ return renderTable(headers, rows);
50
+ }
51
+ case 'table:indexes':
52
+ case 'index:list': {
53
+ const list = data.indexes || [];
54
+ return renderTable(['name', 'type', 'columns', 'unique'], list.map((x: any) => [x.name, x.type, (x.columns || []).join(','), x.unique ? 'YES' : 'NO']));
55
+ }
56
+ case 'rows:list':
57
+ case 'rows:get': {
58
+ const rows = data.data || [];
59
+ if (!rows.length) return '(无数据)';
60
+ const headers = Object.keys(rows[0]);
61
+ const body = rows.slice(0, 50).map((r: any) => headers.map((h) => cell(r[h])).join(' '));
62
+ const more = rows.length > 50 ? `\n... 共 ${rows.length} 行,已省略` : '';
63
+ return `${data.table} · ${data.meta ? `${rows.length} 行` : ''}\n${headers.join(' ')}\n${'-'.repeat(40)}\n${body.join('\n')}${more}`;
64
+ }
65
+ case 'rows:count':
66
+ return `${data.table} 符合条件 ${data.count} 行`;
67
+ case 'types':
68
+ return (data.types || []).map((t: any) => `- ${t.type}${t.label ? ' (' + t.label + ')' : ''}${t.experimental ? ' [experimental]' : ''}`).join('\n');
69
+ case 'ops:logs': {
70
+ const logs = data.logs || [];
71
+ return logs.map((l: any) => JSON.stringify(l)).join('\n') || '(无日志)';
72
+ }
73
+ case 'audit': {
74
+ const logs = data.logs || [];
75
+ return logs.map((l: any) => `${l.ts} ${l.action} ${l.conn || ''} ${l.database || ''} ${l.table || ''} ${l.ok ? '' : 'FAILED'}${l.error ? ' ' + l.error : ''}`).join('\n') || '(无审计记录)';
76
+ }
77
+ case 'setup':
78
+ case 'config:show':
79
+ return JSON.stringify(data, null, 2);
80
+ case 'server:status': {
81
+ if (data.running) {
82
+ const lines = [
83
+ `fdb2 Web 服务运行中`,
84
+ ` PID: ${data.pid}`,
85
+ ` 端口: ${data.port}`,
86
+ ` 地址: ${data.url}`
87
+ ];
88
+ if (data.startedAt) lines.push(` 启动: ${data.startedAt}`);
89
+ return lines.join('\n');
90
+ }
91
+ return data.message || 'fdb2 Web 服务未启动';
92
+ }
93
+ case 'export:schema': {
94
+ if (data.schema) return cut(data.schema);
95
+ return `schema 已导出到 ${data.path}`;
96
+ }
97
+ default: {
98
+ if (data && typeof data === 'object' && (data.sql || data.dryRun !== undefined || data.token)) {
99
+ const parts: string[] = [];
100
+ if (data.dryRun) parts.push('(dry-run 预演,未执行)');
101
+ if (data.sql) parts.push(Array.isArray(data.sql) ? data.sql.join('\n') : data.sql);
102
+ if (data.estimatedRows != null) parts.push(`预计影响 ${data.estimatedRows} 行`);
103
+ if (data.token) parts.push(`confirmToken: ${data.token}`);
104
+ if (data.result !== undefined) parts.push('结果: ' + cut(JSON.stringify(data.result)));
105
+ if (data.dryRun) parts.push('\n确认执行请携带: --confirm ' + data.token);
106
+ return parts.join('\n');
107
+ }
108
+ return cut(JSON.stringify(data, null, 2));
109
+ }
110
+ }
111
+ }
112
+
113
+ function cell(v: any): string {
114
+ if (v === null || v === undefined) return 'NULL';
115
+ const s = typeof v === 'object' ? JSON.stringify(v) : String(v);
116
+ return s.length > 60 ? s.slice(0, 60) + '…' : s;
117
+ }
@@ -0,0 +1,3 @@
1
+ export declare const VERSION = "2.0.0-cli";
2
+ export declare function run(argv: string[]): Promise<number>;
3
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../server/cli/main.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,OAAO,cAAc,CAAC;AA8rBnC,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2CzD"}