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,44 @@
1
+ /**
2
+ * 数据库方言元数据
3
+ * CLI 层根据连接类型决定:标识符引用方式、参数占位符风格、能力集。
4
+ * 与前端 getSupportedDatabaseTypes 保持一致。
5
+ */
6
+ export type DialectKind = 'mysql' | 'postgres' | 'sqlite' | 'oracle' | 'mssql' | 'cockroachdb' | 'mongodb' | 'sap';
7
+ export interface DialectFeature {
8
+ supportSchemas: boolean;
9
+ supportProcedures: boolean;
10
+ supportViews: boolean;
11
+ supportTriggers: boolean;
12
+ supportFullTextSearch: boolean;
13
+ supportJson: boolean;
14
+ }
15
+ export interface DialectInfo {
16
+ /** 规范化类型名(小写) */
17
+ type: string;
18
+ /** CLI 内部方言族 */
19
+ kind: DialectKind;
20
+ label: string;
21
+ defaultPort: number | null;
22
+ /** 参数占位符风格:'?' / '$' / 'inline'(不支持参数绑定,值内联转义) */
23
+ paramStyle: '?' | '$' | 'inline';
24
+ experimental?: boolean;
25
+ features: DialectFeature;
26
+ /** 对应方言 service 文件名(不含 .service.ts) */
27
+ serviceFile: string;
28
+ serviceClass: string;
29
+ }
30
+ export declare function normalizeDialectType(type: string): string | null;
31
+ export declare function isDialectSupported(type: string): boolean;
32
+ export declare function getDialectInfo(type: string): DialectInfo;
33
+ /** 标识符加引号 */
34
+ export declare function quoteIdentifier(type: string, identifier: string): string;
35
+ /** 参数占位符风格 */
36
+ export declare function paramStyleOf(type: string): '?' | '$' | 'inline';
37
+ /** 全部支持的数据库类型(供 fdb2 types 输出) */
38
+ export declare function listDialects(): Array<{
39
+ type: string;
40
+ label: string;
41
+ defaultPort: number | null;
42
+ experimental: boolean;
43
+ }>;
44
+ //# sourceMappingURL=dialect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../../../server/core/dialect.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,WAAW,GACnB,OAAO,GACP,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,aAAa,GACb,SAAS,GACT,KAAK,CAAC;AAEV,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kDAAkD;IAClD,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,QAAQ,CAAC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,cAAc,CAAC;IACzB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AA2ID,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKhE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAqBxD;AAwDD,aAAa;AACb,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAMxE;AAED,cAAc;AACd,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,QAAQ,CAE/D;AAED,kCAAkC;AAClC,wBAAgB,YAAY,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAAC,CAWxH"}
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ /**
3
+ * 数据库方言元数据
4
+ * CLI 层根据连接类型决定:标识符引用方式、参数占位符风格、能力集。
5
+ * 与前端 getSupportedDatabaseTypes 保持一致。
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.normalizeDialectType = normalizeDialectType;
9
+ exports.isDialectSupported = isDialectSupported;
10
+ exports.getDialectInfo = getDialectInfo;
11
+ exports.quoteIdentifier = quoteIdentifier;
12
+ exports.paramStyleOf = paramStyleOf;
13
+ exports.listDialects = listDialects;
14
+ const DIALECTS = {
15
+ mysql: {
16
+ type: 'mysql',
17
+ label: 'MySQL',
18
+ defaultPort: 3306,
19
+ features: {
20
+ supportSchemas: false,
21
+ supportProcedures: true,
22
+ supportViews: true,
23
+ supportTriggers: true,
24
+ supportFullTextSearch: true,
25
+ supportJson: true
26
+ },
27
+ serviceFile: 'mysql',
28
+ serviceClass: 'MySQLService'
29
+ },
30
+ 'aurora-mysql': { type: 'mysql' },
31
+ auroramysql: { type: 'mysql' },
32
+ postgres: {
33
+ type: 'postgres',
34
+ label: 'PostgreSQL',
35
+ defaultPort: 5432,
36
+ features: {
37
+ supportSchemas: true,
38
+ supportProcedures: true,
39
+ supportViews: true,
40
+ supportTriggers: true,
41
+ supportFullTextSearch: true,
42
+ supportJson: true
43
+ },
44
+ serviceFile: 'postgres',
45
+ serviceClass: 'PostgreSQLService'
46
+ },
47
+ postgresql: { type: 'postgres' },
48
+ 'aurora-postgres': { type: 'postgres' },
49
+ aurorapostgres: { type: 'postgres' },
50
+ 'aurora-postgresql': { type: 'postgres' },
51
+ sqlite: {
52
+ type: 'sqlite',
53
+ label: 'SQLite',
54
+ defaultPort: null,
55
+ features: {
56
+ supportSchemas: false,
57
+ supportProcedures: false,
58
+ supportViews: true,
59
+ supportTriggers: true,
60
+ supportFullTextSearch: true,
61
+ supportJson: false
62
+ },
63
+ serviceFile: 'sqlite',
64
+ serviceClass: 'SQLiteService'
65
+ },
66
+ 'better-sqlite3': { type: 'sqlite' },
67
+ bettersqlite3: { type: 'sqlite' },
68
+ oracle: {
69
+ type: 'oracle',
70
+ label: 'Oracle',
71
+ defaultPort: 1521,
72
+ features: {
73
+ supportSchemas: true,
74
+ supportProcedures: true,
75
+ supportViews: true,
76
+ supportTriggers: true,
77
+ supportFullTextSearch: true,
78
+ supportJson: false
79
+ },
80
+ serviceFile: 'oracle',
81
+ serviceClass: 'OracleService'
82
+ },
83
+ mssql: {
84
+ type: 'mssql',
85
+ label: 'SQL Server',
86
+ defaultPort: 1433,
87
+ features: {
88
+ supportSchemas: false,
89
+ supportProcedures: true,
90
+ supportViews: true,
91
+ supportTriggers: true,
92
+ supportFullTextSearch: true,
93
+ supportJson: true
94
+ },
95
+ serviceFile: 'mssql',
96
+ serviceClass: 'SQLServerService'
97
+ },
98
+ sqlserver: { type: 'mssql' },
99
+ cockroachdb: {
100
+ type: 'cockroachdb',
101
+ label: 'CockroachDB',
102
+ defaultPort: 26257,
103
+ features: {
104
+ supportSchemas: true,
105
+ supportProcedures: true,
106
+ supportViews: true,
107
+ supportTriggers: true,
108
+ supportFullTextSearch: true,
109
+ supportJson: true
110
+ },
111
+ serviceFile: 'cockroachdb',
112
+ serviceClass: 'CockroachDBService'
113
+ },
114
+ cockroach: { type: 'cockroachdb' },
115
+ mongodb: {
116
+ type: 'mongodb',
117
+ label: 'MongoDB',
118
+ defaultPort: 27017,
119
+ experimental: true,
120
+ features: {
121
+ supportSchemas: false,
122
+ supportProcedures: false,
123
+ supportViews: false,
124
+ supportTriggers: false,
125
+ supportFullTextSearch: true,
126
+ supportJson: true
127
+ },
128
+ serviceFile: 'mongodb',
129
+ serviceClass: 'MongoDBService'
130
+ },
131
+ mongo: { type: 'mongodb' },
132
+ sap: {
133
+ type: 'sap',
134
+ label: 'SAP HANA',
135
+ defaultPort: 39013,
136
+ features: {
137
+ supportSchemas: true,
138
+ supportProcedures: true,
139
+ supportViews: true,
140
+ supportTriggers: true,
141
+ supportFullTextSearch: true,
142
+ supportJson: true
143
+ },
144
+ serviceFile: 'sap',
145
+ serviceClass: 'SAPHANADatabaseService'
146
+ },
147
+ 'sap-hana': { type: 'sap' },
148
+ saphana: { type: 'sap' }
149
+ };
150
+ function normalizeDialectType(type) {
151
+ if (!type)
152
+ return null;
153
+ const entry = DIALECTS[type.toLowerCase()];
154
+ if (!entry)
155
+ return null;
156
+ return entry.type || type.toLowerCase();
157
+ }
158
+ function isDialectSupported(type) {
159
+ return normalizeDialectType(type) !== null;
160
+ }
161
+ function getDialectInfo(type) {
162
+ const normalized = normalizeDialectType(type) || type.toLowerCase();
163
+ const full = DIALECTS[normalized];
164
+ return {
165
+ type: normalized,
166
+ kind: full && full.serviceFile ? normalized : resolveKind(normalized),
167
+ label: (full && full.label) || normalized.toUpperCase(),
168
+ defaultPort: (full && full.defaultPort) ?? null,
169
+ paramStyle: (full && full.paramStyle) || kindParamStyle(normalized),
170
+ experimental: (full && full.experimental) || false,
171
+ features: (full && full.features) || {
172
+ supportSchemas: false,
173
+ supportProcedures: true,
174
+ supportViews: true,
175
+ supportTriggers: false,
176
+ supportFullTextSearch: false,
177
+ supportJson: false
178
+ },
179
+ serviceFile: (full && full.serviceFile) || resolveServiceFile(normalized),
180
+ serviceClass: (full && full.serviceClass) || resolveServiceClass(normalized)
181
+ };
182
+ }
183
+ function kindParamStyle(type) {
184
+ switch (type) {
185
+ case 'postgres':
186
+ case 'cockroachdb':
187
+ return '$';
188
+ case 'oracle':
189
+ case 'mssql':
190
+ case 'mongodb':
191
+ case 'sap':
192
+ return 'inline';
193
+ default:
194
+ return '?';
195
+ }
196
+ }
197
+ function resolveKind(type) {
198
+ switch (type) {
199
+ case 'postgres': return 'postgres';
200
+ case 'sqlite': return 'sqlite';
201
+ case 'oracle': return 'oracle';
202
+ case 'mssql': return 'mssql';
203
+ case 'cockroachdb': return 'cockroachdb';
204
+ case 'mongodb': return 'mongodb';
205
+ case 'sap': return 'sap';
206
+ default: return 'mysql';
207
+ }
208
+ }
209
+ function resolveServiceFile(type) {
210
+ switch (type) {
211
+ case 'postgres': return 'postgres';
212
+ case 'sqlite': return 'sqlite';
213
+ case 'oracle': return 'oracle';
214
+ case 'mssql': return 'mssql';
215
+ case 'cockroachdb': return 'cockroachdb';
216
+ case 'mongodb': return 'mongodb';
217
+ case 'sap': return 'sap';
218
+ default: return 'mysql';
219
+ }
220
+ }
221
+ function resolveServiceClass(type) {
222
+ switch (type) {
223
+ case 'postgres': return 'PostgreSQLService';
224
+ case 'sqlite': return 'SQLiteService';
225
+ case 'oracle': return 'OracleService';
226
+ case 'mssql': return 'SQLServerService';
227
+ case 'cockroachdb': return 'CockroachDBService';
228
+ case 'mongodb': return 'MongoDBService';
229
+ case 'sap': return 'SAPHANADatabaseService';
230
+ default: return 'MySQLService';
231
+ }
232
+ }
233
+ /** 标识符加引号 */
234
+ function quoteIdentifier(type, identifier) {
235
+ const kind = getDialectInfo(type).kind;
236
+ if (kind === 'mysql') {
237
+ return '`' + String(identifier).replace(/`/g, '``') + '`';
238
+ }
239
+ return '"' + String(identifier).replace(/"/g, '""') + '"';
240
+ }
241
+ /** 参数占位符风格 */
242
+ function paramStyleOf(type) {
243
+ return getDialectInfo(type).paramStyle;
244
+ }
245
+ /** 全部支持的数据库类型(供 fdb2 types 输出) */
246
+ function listDialects() {
247
+ const seen = {};
248
+ const result = [];
249
+ for (const key of Object.keys(DIALECTS)) {
250
+ const info = getDialectInfo(key);
251
+ if (info.type !== key)
252
+ continue; // 别名跳过
253
+ if (seen[info.type])
254
+ continue;
255
+ seen[info.type] = true;
256
+ result.push({ type: info.type, label: info.label, defaultPort: info.defaultPort, experimental: info.experimental || false });
257
+ }
258
+ return result;
259
+ }
260
+ //# sourceMappingURL=dialect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialect.js","sourceRoot":"","sources":["../../../server/core/dialect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,293 @@
1
+ /**
2
+ * 数据库方言元数据
3
+ * CLI 层根据连接类型决定:标识符引用方式、参数占位符风格、能力集。
4
+ * 与前端 getSupportedDatabaseTypes 保持一致。
5
+ */
6
+
7
+ export type DialectKind =
8
+ | 'mysql'
9
+ | 'postgres'
10
+ | 'sqlite'
11
+ | 'oracle'
12
+ | 'mssql'
13
+ | 'cockroachdb'
14
+ | 'mongodb'
15
+ | 'sap';
16
+
17
+ export interface DialectFeature {
18
+ supportSchemas: boolean;
19
+ supportProcedures: boolean;
20
+ supportViews: boolean;
21
+ supportTriggers: boolean;
22
+ supportFullTextSearch: boolean;
23
+ supportJson: boolean;
24
+ }
25
+
26
+ export interface DialectInfo {
27
+ /** 规范化类型名(小写) */
28
+ type: string;
29
+ /** CLI 内部方言族 */
30
+ kind: DialectKind;
31
+ label: string;
32
+ defaultPort: number | null;
33
+ /** 参数占位符风格:'?' / '$' / 'inline'(不支持参数绑定,值内联转义) */
34
+ paramStyle: '?' | '$' | 'inline';
35
+ experimental?: boolean;
36
+ features: DialectFeature;
37
+ /** 对应方言 service 文件名(不含 .service.ts) */
38
+ serviceFile: string;
39
+ serviceClass: string;
40
+ }
41
+
42
+ const DIALECTS: Record<string, Partial<DialectInfo> & { type: string }> = {
43
+ mysql: {
44
+ type: 'mysql',
45
+ label: 'MySQL',
46
+ defaultPort: 3306,
47
+ features: {
48
+ supportSchemas: false,
49
+ supportProcedures: true,
50
+ supportViews: true,
51
+ supportTriggers: true,
52
+ supportFullTextSearch: true,
53
+ supportJson: true
54
+ },
55
+ serviceFile: 'mysql',
56
+ serviceClass: 'MySQLService'
57
+ },
58
+ 'aurora-mysql': { type: 'mysql' },
59
+ auroramysql: { type: 'mysql' },
60
+ postgres: {
61
+ type: 'postgres',
62
+ label: 'PostgreSQL',
63
+ defaultPort: 5432,
64
+ features: {
65
+ supportSchemas: true,
66
+ supportProcedures: true,
67
+ supportViews: true,
68
+ supportTriggers: true,
69
+ supportFullTextSearch: true,
70
+ supportJson: true
71
+ },
72
+ serviceFile: 'postgres',
73
+ serviceClass: 'PostgreSQLService'
74
+ },
75
+ postgresql: { type: 'postgres' },
76
+ 'aurora-postgres': { type: 'postgres' },
77
+ aurorapostgres: { type: 'postgres' },
78
+ 'aurora-postgresql': { type: 'postgres' },
79
+ sqlite: {
80
+ type: 'sqlite',
81
+ label: 'SQLite',
82
+ defaultPort: null,
83
+ features: {
84
+ supportSchemas: false,
85
+ supportProcedures: false,
86
+ supportViews: true,
87
+ supportTriggers: true,
88
+ supportFullTextSearch: true,
89
+ supportJson: false
90
+ },
91
+ serviceFile: 'sqlite',
92
+ serviceClass: 'SQLiteService'
93
+ },
94
+ 'better-sqlite3': { type: 'sqlite' },
95
+ bettersqlite3: { type: 'sqlite' },
96
+ oracle: {
97
+ type: 'oracle',
98
+ label: 'Oracle',
99
+ defaultPort: 1521,
100
+ features: {
101
+ supportSchemas: true,
102
+ supportProcedures: true,
103
+ supportViews: true,
104
+ supportTriggers: true,
105
+ supportFullTextSearch: true,
106
+ supportJson: false
107
+ },
108
+ serviceFile: 'oracle',
109
+ serviceClass: 'OracleService'
110
+ },
111
+ mssql: {
112
+ type: 'mssql',
113
+ label: 'SQL Server',
114
+ defaultPort: 1433,
115
+ features: {
116
+ supportSchemas: false,
117
+ supportProcedures: true,
118
+ supportViews: true,
119
+ supportTriggers: true,
120
+ supportFullTextSearch: true,
121
+ supportJson: true
122
+ },
123
+ serviceFile: 'mssql',
124
+ serviceClass: 'SQLServerService'
125
+ },
126
+ sqlserver: { type: 'mssql' },
127
+ cockroachdb: {
128
+ type: 'cockroachdb',
129
+ label: 'CockroachDB',
130
+ defaultPort: 26257,
131
+ features: {
132
+ supportSchemas: true,
133
+ supportProcedures: true,
134
+ supportViews: true,
135
+ supportTriggers: true,
136
+ supportFullTextSearch: true,
137
+ supportJson: true
138
+ },
139
+ serviceFile: 'cockroachdb',
140
+ serviceClass: 'CockroachDBService'
141
+ },
142
+ cockroach: { type: 'cockroachdb' },
143
+ mongodb: {
144
+ type: 'mongodb',
145
+ label: 'MongoDB',
146
+ defaultPort: 27017,
147
+ experimental: true,
148
+ features: {
149
+ supportSchemas: false,
150
+ supportProcedures: false,
151
+ supportViews: false,
152
+ supportTriggers: false,
153
+ supportFullTextSearch: true,
154
+ supportJson: true
155
+ },
156
+ serviceFile: 'mongodb',
157
+ serviceClass: 'MongoDBService'
158
+ },
159
+ mongo: { type: 'mongodb' },
160
+ sap: {
161
+ type: 'sap',
162
+ label: 'SAP HANA',
163
+ defaultPort: 39013,
164
+ features: {
165
+ supportSchemas: true,
166
+ supportProcedures: true,
167
+ supportViews: true,
168
+ supportTriggers: true,
169
+ supportFullTextSearch: true,
170
+ supportJson: true
171
+ },
172
+ serviceFile: 'sap',
173
+ serviceClass: 'SAPHANADatabaseService'
174
+ },
175
+ 'sap-hana': { type: 'sap' },
176
+ saphana: { type: 'sap' }
177
+ };
178
+
179
+ export function normalizeDialectType(type: string): string | null {
180
+ if (!type) return null;
181
+ const entry = DIALECTS[type.toLowerCase()];
182
+ if (!entry) return null;
183
+ return entry.type || type.toLowerCase();
184
+ }
185
+
186
+ export function isDialectSupported(type: string): boolean {
187
+ return normalizeDialectType(type) !== null;
188
+ }
189
+
190
+ export function getDialectInfo(type: string): DialectInfo {
191
+ const normalized = normalizeDialectType(type) || type.toLowerCase();
192
+ const full = (DIALECTS as any)[normalized];
193
+ return {
194
+ type: normalized,
195
+ kind: full && full.serviceFile ? (normalized as DialectKind) : resolveKind(normalized),
196
+ label: (full && full.label) || normalized.toUpperCase(),
197
+ defaultPort: (full && full.defaultPort) ?? null,
198
+ paramStyle: (full && full.paramStyle) || kindParamStyle(normalized),
199
+ experimental: (full && full.experimental) || false,
200
+ features: (full && full.features) || {
201
+ supportSchemas: false,
202
+ supportProcedures: true,
203
+ supportViews: true,
204
+ supportTriggers: false,
205
+ supportFullTextSearch: false,
206
+ supportJson: false
207
+ },
208
+ serviceFile: (full && full.serviceFile) || resolveServiceFile(normalized),
209
+ serviceClass: (full && full.serviceClass) || resolveServiceClass(normalized)
210
+ };
211
+ }
212
+
213
+ function kindParamStyle(type: string): '?' | '$' | 'inline' {
214
+ switch (type) {
215
+ case 'postgres':
216
+ case 'cockroachdb':
217
+ return '$';
218
+ case 'oracle':
219
+ case 'mssql':
220
+ case 'mongodb':
221
+ case 'sap':
222
+ return 'inline';
223
+ default:
224
+ return '?';
225
+ }
226
+ }
227
+
228
+ function resolveKind(type: string): DialectKind {
229
+ switch (type) {
230
+ case 'postgres': return 'postgres';
231
+ case 'sqlite': return 'sqlite';
232
+ case 'oracle': return 'oracle';
233
+ case 'mssql': return 'mssql';
234
+ case 'cockroachdb': return 'cockroachdb';
235
+ case 'mongodb': return 'mongodb';
236
+ case 'sap': return 'sap';
237
+ default: return 'mysql';
238
+ }
239
+ }
240
+
241
+ function resolveServiceFile(type: string): string {
242
+ switch (type) {
243
+ case 'postgres': return 'postgres';
244
+ case 'sqlite': return 'sqlite';
245
+ case 'oracle': return 'oracle';
246
+ case 'mssql': return 'mssql';
247
+ case 'cockroachdb': return 'cockroachdb';
248
+ case 'mongodb': return 'mongodb';
249
+ case 'sap': return 'sap';
250
+ default: return 'mysql';
251
+ }
252
+ }
253
+
254
+ function resolveServiceClass(type: string): string {
255
+ switch (type) {
256
+ case 'postgres': return 'PostgreSQLService';
257
+ case 'sqlite': return 'SQLiteService';
258
+ case 'oracle': return 'OracleService';
259
+ case 'mssql': return 'SQLServerService';
260
+ case 'cockroachdb': return 'CockroachDBService';
261
+ case 'mongodb': return 'MongoDBService';
262
+ case 'sap': return 'SAPHANADatabaseService';
263
+ default: return 'MySQLService';
264
+ }
265
+ }
266
+
267
+ /** 标识符加引号 */
268
+ export function quoteIdentifier(type: string, identifier: string): string {
269
+ const kind = getDialectInfo(type).kind;
270
+ if (kind === 'mysql') {
271
+ return '`' + String(identifier).replace(/`/g, '``') + '`';
272
+ }
273
+ return '"' + String(identifier).replace(/"/g, '""') + '"';
274
+ }
275
+
276
+ /** 参数占位符风格 */
277
+ export function paramStyleOf(type: string): '?' | '$' | 'inline' {
278
+ return getDialectInfo(type).paramStyle;
279
+ }
280
+
281
+ /** 全部支持的数据库类型(供 fdb2 types 输出) */
282
+ export function listDialects(): Array<{ type: string; label: string; defaultPort: number | null; experimental: boolean }> {
283
+ const seen: Record<string, boolean> = {};
284
+ const result: Array<{ type: string; label: string; defaultPort: number | null; experimental: boolean }> = [];
285
+ for (const key of Object.keys(DIALECTS)) {
286
+ const info = getDialectInfo(key);
287
+ if (info.type !== key) continue; // 别名跳过
288
+ if (seen[info.type]) continue;
289
+ seen[info.type] = true;
290
+ result.push({ type: info.type, label: info.label, defaultPort: info.defaultPort, experimental: info.experimental || false });
291
+ }
292
+ return result;
293
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * CLI 统一错误码与错误类型
3
+ * 退出码:
4
+ * 0 成功
5
+ * 1 通用错误(GENERIC)
6
+ * 2 参数/用法错误(PARAM_ERROR、UNKNOWN_COMMAND、INVALID_FILTER)
7
+ * 3 连接不存在(CONN_NOT_FOUND、NO_DEFAULT_CONN)
8
+ * 4 未就绪(NOT_READY)
9
+ * 5 需确认/预演(REQUIRE_DRYRUN、CONFIRM_REQUIRED、CONFIRM_EXPIRED、FORCE_REQUIRED、WRITE_BLOCKED、MULTI_STATEMENT_BLOCKED)
10
+ * 6 SQL/数据库错误(SQL_ERROR、DB_NOT_FOUND、TABLE_NOT_FOUND、COLUMN_NOT_FOUND、UNSUPPORTED、DRIVER_UNAVAILABLE)
11
+ */
12
+ export declare class AppError extends Error {
13
+ code: string;
14
+ hint?: string;
15
+ details?: any;
16
+ constructor(code: string, message: string, opts?: {
17
+ hint?: string;
18
+ details?: any;
19
+ });
20
+ }
21
+ export declare function exitCodeOf(code: string): number;
22
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../server/core/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,GAAG,CAAC;gBAEF,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,GAAG,CAAA;KAAE;CAMnF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgC/C"}