@chihqiang/sql-quicktype 0.0.1 → 0.0.2
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/README.md +33 -30
- package/dist/cli.js +689 -752
- package/dist/index.d.mts +48 -61
- package/dist/index.d.ts +48 -61
- package/dist/index.global.js +96 -96
- package/dist/index.js +659 -784
- package/dist/index.mjs +654 -785
- package/package.json +12 -13
package/dist/index.js
CHANGED
|
@@ -5,9 +5,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __esm = (fn, res) => function __init() {
|
|
9
|
-
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
10
|
-
};
|
|
11
8
|
var __export = (target, all) => {
|
|
12
9
|
for (var name in all)
|
|
13
10
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -30,710 +27,32 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
30
27
|
));
|
|
31
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
32
29
|
|
|
33
|
-
// src/generator/TypeScriptGenerator.ts
|
|
34
|
-
var TypeScriptGenerator_exports = {};
|
|
35
|
-
__export(TypeScriptGenerator_exports, {
|
|
36
|
-
TypeScriptGenerator: () => TypeScriptGenerator
|
|
37
|
-
});
|
|
38
|
-
var TypeScriptGenerator;
|
|
39
|
-
var init_TypeScriptGenerator = __esm({
|
|
40
|
-
"src/generator/TypeScriptGenerator.ts"() {
|
|
41
|
-
"use strict";
|
|
42
|
-
init_generator();
|
|
43
|
-
TypeScriptGenerator = class extends AGenerator {
|
|
44
|
-
constructor(options = { language: "typescript" }) {
|
|
45
|
-
super();
|
|
46
|
-
this.options = options;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* 格式化字段名称(使用驼峰命名)
|
|
50
|
-
*/
|
|
51
|
-
formatFieldName(name) {
|
|
52
|
-
return name.split("_").map((part, index) => {
|
|
53
|
-
if (index === 0) {
|
|
54
|
-
return part.toLowerCase();
|
|
55
|
-
}
|
|
56
|
-
return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase();
|
|
57
|
-
}).join("");
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* 生成整个数据库模式的类型定义
|
|
61
|
-
*/
|
|
62
|
-
generateDatabase(database) {
|
|
63
|
-
let result = `// Database: ${database.name}
|
|
64
|
-
`;
|
|
65
|
-
result += `// Dialect: ${database.dialect}
|
|
66
|
-
|
|
67
|
-
`;
|
|
68
|
-
for (const table of database.tables) {
|
|
69
|
-
result += this.generateTable(table);
|
|
70
|
-
result += "\n";
|
|
71
|
-
}
|
|
72
|
-
return result;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* 生成单个表的类型定义
|
|
76
|
-
*/
|
|
77
|
-
generateTable(table) {
|
|
78
|
-
let result = `// ${table.name} \u8868\u7ED3\u6784
|
|
79
|
-
`;
|
|
80
|
-
result += `export interface ${this.formatTypeName(table.name)} {
|
|
81
|
-
`;
|
|
82
|
-
for (const column of table.columns) {
|
|
83
|
-
result += this.generateColumn(column);
|
|
84
|
-
}
|
|
85
|
-
result += "}\n";
|
|
86
|
-
return result;
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* 生成列的类型定义
|
|
90
|
-
*/
|
|
91
|
-
generateColumn(column) {
|
|
92
|
-
const fieldName = this.formatFieldName(column.name);
|
|
93
|
-
const typeName = this.mapSQLType(column.type, column.name);
|
|
94
|
-
const optional = column.nullable ? "?" : "";
|
|
95
|
-
let result = ` ${fieldName}${optional}: ${typeName}`;
|
|
96
|
-
if (column.comment && this.options.generateComments !== false) {
|
|
97
|
-
result += `; // ${column.comment}`;
|
|
98
|
-
}
|
|
99
|
-
result += "\n";
|
|
100
|
-
return result;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* 映射 SQL 类型到 TypeScript 类型
|
|
104
|
-
*/
|
|
105
|
-
mapSQLType(type, columnName) {
|
|
106
|
-
switch (type.kind) {
|
|
107
|
-
case "int":
|
|
108
|
-
case "bigint":
|
|
109
|
-
return "number";
|
|
110
|
-
case "float":
|
|
111
|
-
case "decimal":
|
|
112
|
-
return "number";
|
|
113
|
-
case "varchar":
|
|
114
|
-
case "text":
|
|
115
|
-
return "string";
|
|
116
|
-
case "boolean":
|
|
117
|
-
return "boolean";
|
|
118
|
-
case "date":
|
|
119
|
-
case "datetime":
|
|
120
|
-
return "Date";
|
|
121
|
-
case "json":
|
|
122
|
-
return "unknown";
|
|
123
|
-
case "enum":
|
|
124
|
-
if (type.values && type.values.length > 0) {
|
|
125
|
-
const enumValues = type.values.map((v) => `'${v}'`).join(" | ");
|
|
126
|
-
if (columnName) {
|
|
127
|
-
const fieldName = this.formatFieldName(columnName);
|
|
128
|
-
return `${fieldName}: ${enumValues}`;
|
|
129
|
-
}
|
|
130
|
-
return enumValues;
|
|
131
|
-
}
|
|
132
|
-
return "string";
|
|
133
|
-
default:
|
|
134
|
-
return "string";
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
// src/generator/GolangGenerator.ts
|
|
142
|
-
var GolangGenerator_exports = {};
|
|
143
|
-
__export(GolangGenerator_exports, {
|
|
144
|
-
GolangGenerator: () => GolangGenerator
|
|
145
|
-
});
|
|
146
|
-
var GolangGenerator;
|
|
147
|
-
var init_GolangGenerator = __esm({
|
|
148
|
-
"src/generator/GolangGenerator.ts"() {
|
|
149
|
-
"use strict";
|
|
150
|
-
init_generator();
|
|
151
|
-
GolangGenerator = class extends AGenerator {
|
|
152
|
-
constructor(options = { language: "go" }) {
|
|
153
|
-
super();
|
|
154
|
-
this.options = options;
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* 生成整个数据库模式的类型定义
|
|
158
|
-
*/
|
|
159
|
-
generateDatabase(database) {
|
|
160
|
-
let result = `// Database: ${database.name}
|
|
161
|
-
`;
|
|
162
|
-
result += `// Dialect: ${database.dialect}
|
|
163
|
-
|
|
164
|
-
`;
|
|
165
|
-
if (this.options.namespace) {
|
|
166
|
-
result += `package ${this.options.namespace}
|
|
167
|
-
|
|
168
|
-
`;
|
|
169
|
-
}
|
|
170
|
-
if (this.needsTimeImport(database)) {
|
|
171
|
-
result += `import "time"
|
|
172
|
-
|
|
173
|
-
`;
|
|
174
|
-
}
|
|
175
|
-
for (const table of database.tables) {
|
|
176
|
-
result += this.generateTable(table);
|
|
177
|
-
result += "\n";
|
|
178
|
-
}
|
|
179
|
-
return result;
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* 生成单个表的类型定义
|
|
183
|
-
*/
|
|
184
|
-
generateTable(table) {
|
|
185
|
-
let result = `// ${table.name} \u8868\u7ED3\u6784
|
|
186
|
-
`;
|
|
187
|
-
result += `type ${this.formatTypeName(table.name)} struct {
|
|
188
|
-
`;
|
|
189
|
-
for (const column of table.columns) {
|
|
190
|
-
result += this.generateColumn(column);
|
|
191
|
-
}
|
|
192
|
-
result += "}\n";
|
|
193
|
-
return result;
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* 生成列的类型定义
|
|
197
|
-
*/
|
|
198
|
-
generateColumn(column) {
|
|
199
|
-
const fieldName = this.formatFieldName(column.name);
|
|
200
|
-
const typeName = this.mapSQLType(column.type);
|
|
201
|
-
const tag = this.generateGoTag(column);
|
|
202
|
-
let result = ` ${fieldName} ${typeName} ${tag}`;
|
|
203
|
-
if (column.comment && this.options.generateComments !== false) {
|
|
204
|
-
result += ` // ${column.comment}`;
|
|
205
|
-
}
|
|
206
|
-
result += "\n";
|
|
207
|
-
return result;
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* 映射 SQL 类型到 Go 类型
|
|
211
|
-
*/
|
|
212
|
-
mapSQLType(type) {
|
|
213
|
-
switch (type.kind) {
|
|
214
|
-
case "int":
|
|
215
|
-
return "int";
|
|
216
|
-
case "bigint":
|
|
217
|
-
return "int64";
|
|
218
|
-
case "float":
|
|
219
|
-
return "float64";
|
|
220
|
-
case "decimal":
|
|
221
|
-
return "float64";
|
|
222
|
-
case "varchar":
|
|
223
|
-
case "text":
|
|
224
|
-
return "string";
|
|
225
|
-
case "boolean":
|
|
226
|
-
return "bool";
|
|
227
|
-
case "date":
|
|
228
|
-
case "datetime":
|
|
229
|
-
return "time.Time";
|
|
230
|
-
case "json":
|
|
231
|
-
return "interface{}";
|
|
232
|
-
case "enum":
|
|
233
|
-
return "string";
|
|
234
|
-
default:
|
|
235
|
-
return "string";
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* 生成 Go 结构体标签
|
|
240
|
-
*/
|
|
241
|
-
generateGoTag(column) {
|
|
242
|
-
const tags = [];
|
|
243
|
-
tags.push(`json:"${column.name}"`);
|
|
244
|
-
tags.push(`db:"${column.name}"`);
|
|
245
|
-
return `\`${tags.join(" ")}\``;
|
|
246
|
-
}
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
// src/generator/GormGenerator.ts
|
|
252
|
-
var GormGenerator_exports = {};
|
|
253
|
-
__export(GormGenerator_exports, {
|
|
254
|
-
GormGenerator: () => GormGenerator
|
|
255
|
-
});
|
|
256
|
-
var GormGenerator;
|
|
257
|
-
var init_GormGenerator = __esm({
|
|
258
|
-
"src/generator/GormGenerator.ts"() {
|
|
259
|
-
"use strict";
|
|
260
|
-
init_generator();
|
|
261
|
-
GormGenerator = class extends AGenerator {
|
|
262
|
-
constructor(options = { language: "gorm" }) {
|
|
263
|
-
super();
|
|
264
|
-
this.options = options;
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* 生成整个数据库模式的类型定义
|
|
268
|
-
*/
|
|
269
|
-
generateDatabase(database) {
|
|
270
|
-
let result = `// Database: ${database.name}
|
|
271
|
-
`;
|
|
272
|
-
result += `// Dialect: ${database.dialect}
|
|
273
|
-
|
|
274
|
-
`;
|
|
275
|
-
if (this.options.namespace) {
|
|
276
|
-
result += `package ${this.options.namespace}
|
|
277
|
-
|
|
278
|
-
`;
|
|
279
|
-
}
|
|
280
|
-
if (this.needsTimeImport(database)) {
|
|
281
|
-
result += `import "time"
|
|
282
|
-
|
|
283
|
-
`;
|
|
284
|
-
}
|
|
285
|
-
for (const table of database.tables) {
|
|
286
|
-
result += this.generateTable(table);
|
|
287
|
-
result += "\n";
|
|
288
|
-
}
|
|
289
|
-
return result;
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* 生成单个表的类型定义
|
|
293
|
-
*/
|
|
294
|
-
generateTable(table) {
|
|
295
|
-
let result = `// ${table.name} \u8868\u7ED3\u6784
|
|
296
|
-
`;
|
|
297
|
-
result += `type ${this.formatTypeName(table.name)} struct {
|
|
298
|
-
`;
|
|
299
|
-
for (const column of table.columns) {
|
|
300
|
-
result += this.generateColumn(column);
|
|
301
|
-
}
|
|
302
|
-
result += "}\n";
|
|
303
|
-
return result;
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* 生成列的类型定义
|
|
307
|
-
*/
|
|
308
|
-
generateColumn(column) {
|
|
309
|
-
const fieldName = this.formatFieldName(column.name);
|
|
310
|
-
const typeName = this.mapSQLType(column.type);
|
|
311
|
-
const tag = this.generateGormTag(column);
|
|
312
|
-
let result = ` ${fieldName} ${typeName} ${tag}`;
|
|
313
|
-
if (column.comment && this.options.generateComments !== false) {
|
|
314
|
-
result += ` // ${column.comment}`;
|
|
315
|
-
}
|
|
316
|
-
result += "\n";
|
|
317
|
-
return result;
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* 映射 SQL 类型到 GORM 类型
|
|
321
|
-
*/
|
|
322
|
-
mapSQLType(type) {
|
|
323
|
-
switch (type.kind) {
|
|
324
|
-
case "int":
|
|
325
|
-
return "int";
|
|
326
|
-
case "bigint":
|
|
327
|
-
return "int64";
|
|
328
|
-
case "float":
|
|
329
|
-
return "float64";
|
|
330
|
-
case "decimal":
|
|
331
|
-
return "float64";
|
|
332
|
-
case "varchar":
|
|
333
|
-
case "text":
|
|
334
|
-
return "string";
|
|
335
|
-
case "boolean":
|
|
336
|
-
return "bool";
|
|
337
|
-
case "date":
|
|
338
|
-
case "datetime":
|
|
339
|
-
return "time.Time";
|
|
340
|
-
case "json":
|
|
341
|
-
return "interface{}";
|
|
342
|
-
case "enum":
|
|
343
|
-
return "string";
|
|
344
|
-
default:
|
|
345
|
-
return "string";
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
/**
|
|
349
|
-
* 生成 GORM 结构体标签
|
|
350
|
-
*/
|
|
351
|
-
generateGormTag(column) {
|
|
352
|
-
const tags = [];
|
|
353
|
-
tags.push(`column:${column.name}`);
|
|
354
|
-
let typeTag = "type:";
|
|
355
|
-
switch (column.type.kind) {
|
|
356
|
-
case "int":
|
|
357
|
-
typeTag += "int";
|
|
358
|
-
if (column.type.length) {
|
|
359
|
-
typeTag += `(${column.type.length})`;
|
|
360
|
-
}
|
|
361
|
-
break;
|
|
362
|
-
case "bigint":
|
|
363
|
-
typeTag += "bigint";
|
|
364
|
-
if (column.type.length) {
|
|
365
|
-
typeTag += `(${column.type.length})`;
|
|
366
|
-
}
|
|
367
|
-
break;
|
|
368
|
-
case "float":
|
|
369
|
-
typeTag += "float";
|
|
370
|
-
if (column.type.precision) {
|
|
371
|
-
typeTag += `(${column.type.precision}`;
|
|
372
|
-
if (column.type.scale) {
|
|
373
|
-
typeTag += `,${column.type.scale}`;
|
|
374
|
-
}
|
|
375
|
-
typeTag += ")";
|
|
376
|
-
}
|
|
377
|
-
break;
|
|
378
|
-
case "decimal":
|
|
379
|
-
typeTag += "decimal";
|
|
380
|
-
if (column.type.precision) {
|
|
381
|
-
typeTag += `(${column.type.precision}`;
|
|
382
|
-
if (column.type.scale) {
|
|
383
|
-
typeTag += `,${column.type.scale}`;
|
|
384
|
-
}
|
|
385
|
-
typeTag += ")";
|
|
386
|
-
}
|
|
387
|
-
break;
|
|
388
|
-
case "varchar":
|
|
389
|
-
typeTag += "varchar";
|
|
390
|
-
if (column.type.length) {
|
|
391
|
-
typeTag += `(${column.type.length})`;
|
|
392
|
-
}
|
|
393
|
-
break;
|
|
394
|
-
case "text":
|
|
395
|
-
typeTag += "text";
|
|
396
|
-
break;
|
|
397
|
-
case "boolean":
|
|
398
|
-
typeTag += "bool";
|
|
399
|
-
break;
|
|
400
|
-
case "date":
|
|
401
|
-
typeTag += "date";
|
|
402
|
-
break;
|
|
403
|
-
case "datetime":
|
|
404
|
-
typeTag += "datetime";
|
|
405
|
-
break;
|
|
406
|
-
case "json":
|
|
407
|
-
typeTag += "json";
|
|
408
|
-
break;
|
|
409
|
-
case "enum":
|
|
410
|
-
typeTag += "enum";
|
|
411
|
-
break;
|
|
412
|
-
default:
|
|
413
|
-
typeTag += "string";
|
|
414
|
-
}
|
|
415
|
-
tags.push(typeTag);
|
|
416
|
-
if (column.primaryKey) {
|
|
417
|
-
tags.push("primaryKey");
|
|
418
|
-
}
|
|
419
|
-
if (column.unique) {
|
|
420
|
-
tags.push("unique");
|
|
421
|
-
}
|
|
422
|
-
if (!column.nullable) {
|
|
423
|
-
tags.push("not null");
|
|
424
|
-
}
|
|
425
|
-
if (column.default) {
|
|
426
|
-
tags.push(`default:${column.default}`);
|
|
427
|
-
}
|
|
428
|
-
if (column.generated) {
|
|
429
|
-
tags.push("autoIncrement");
|
|
430
|
-
}
|
|
431
|
-
if (column.comment) {
|
|
432
|
-
tags.push(`comment:${column.comment}`);
|
|
433
|
-
}
|
|
434
|
-
return `\`gorm:"${tags.join(";")}" json:"${column.name}"\``;
|
|
435
|
-
}
|
|
436
|
-
};
|
|
437
|
-
}
|
|
438
|
-
});
|
|
439
|
-
|
|
440
|
-
// src/generator/XormGenerator.ts
|
|
441
|
-
var XormGenerator_exports = {};
|
|
442
|
-
__export(XormGenerator_exports, {
|
|
443
|
-
XormGenerator: () => XormGenerator
|
|
444
|
-
});
|
|
445
|
-
var XormGenerator;
|
|
446
|
-
var init_XormGenerator = __esm({
|
|
447
|
-
"src/generator/XormGenerator.ts"() {
|
|
448
|
-
"use strict";
|
|
449
|
-
init_generator();
|
|
450
|
-
XormGenerator = class extends AGenerator {
|
|
451
|
-
constructor(options = { language: "xorm" }) {
|
|
452
|
-
super();
|
|
453
|
-
this.options = options;
|
|
454
|
-
}
|
|
455
|
-
/**
|
|
456
|
-
* 生成整个数据库模式的类型定义
|
|
457
|
-
*/
|
|
458
|
-
generateDatabase(database) {
|
|
459
|
-
let result = `// Database: ${database.name}
|
|
460
|
-
`;
|
|
461
|
-
result += `// Dialect: ${database.dialect}
|
|
462
|
-
|
|
463
|
-
`;
|
|
464
|
-
if (this.options.namespace) {
|
|
465
|
-
result += `package ${this.options.namespace}
|
|
466
|
-
|
|
467
|
-
`;
|
|
468
|
-
}
|
|
469
|
-
if (this.needsTimeImport(database)) {
|
|
470
|
-
result += `import "time"
|
|
471
|
-
|
|
472
|
-
`;
|
|
473
|
-
}
|
|
474
|
-
for (const table of database.tables) {
|
|
475
|
-
result += this.generateTable(table);
|
|
476
|
-
result += "\n";
|
|
477
|
-
}
|
|
478
|
-
return result;
|
|
479
|
-
}
|
|
480
|
-
/**
|
|
481
|
-
* 生成单个表的类型定义
|
|
482
|
-
*/
|
|
483
|
-
generateTable(table) {
|
|
484
|
-
let result = `// ${table.name} \u8868\u7ED3\u6784
|
|
485
|
-
`;
|
|
486
|
-
result += `type ${this.formatTypeName(table.name)} struct {
|
|
487
|
-
`;
|
|
488
|
-
for (const column of table.columns) {
|
|
489
|
-
result += this.generateColumn(column);
|
|
490
|
-
}
|
|
491
|
-
result += "}\n";
|
|
492
|
-
return result;
|
|
493
|
-
}
|
|
494
|
-
/**
|
|
495
|
-
* 生成列的类型定义
|
|
496
|
-
*/
|
|
497
|
-
generateColumn(column) {
|
|
498
|
-
const fieldName = this.formatFieldName(column.name);
|
|
499
|
-
const typeName = this.mapSQLType(column.type);
|
|
500
|
-
const tag = this.generateXormTag(column);
|
|
501
|
-
let result = ` ${fieldName} ${typeName} ${tag}`;
|
|
502
|
-
if (column.comment && this.options.generateComments !== false) {
|
|
503
|
-
result += ` // ${column.comment}`;
|
|
504
|
-
}
|
|
505
|
-
result += "\n";
|
|
506
|
-
return result;
|
|
507
|
-
}
|
|
508
|
-
/**
|
|
509
|
-
* 映射 SQL 类型到 XORM 类型
|
|
510
|
-
*/
|
|
511
|
-
mapSQLType(type) {
|
|
512
|
-
switch (type.kind) {
|
|
513
|
-
case "int":
|
|
514
|
-
return "int";
|
|
515
|
-
case "bigint":
|
|
516
|
-
return "int64";
|
|
517
|
-
case "float":
|
|
518
|
-
return "float64";
|
|
519
|
-
case "decimal":
|
|
520
|
-
return "float64";
|
|
521
|
-
case "varchar":
|
|
522
|
-
case "text":
|
|
523
|
-
return "string";
|
|
524
|
-
case "boolean":
|
|
525
|
-
return "bool";
|
|
526
|
-
case "date":
|
|
527
|
-
case "datetime":
|
|
528
|
-
return "time.Time";
|
|
529
|
-
case "json":
|
|
530
|
-
return "interface{}";
|
|
531
|
-
case "enum":
|
|
532
|
-
return "string";
|
|
533
|
-
default:
|
|
534
|
-
return "string";
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
/**
|
|
538
|
-
* 生成 XORM 结构体标签
|
|
539
|
-
*/
|
|
540
|
-
generateXormTag(column) {
|
|
541
|
-
const tags = [];
|
|
542
|
-
tags.push(`${column.name}`);
|
|
543
|
-
let typeTag = "";
|
|
544
|
-
switch (column.type.kind) {
|
|
545
|
-
case "int":
|
|
546
|
-
typeTag = "int";
|
|
547
|
-
if (column.type.length) {
|
|
548
|
-
typeTag += `(${column.type.length})`;
|
|
549
|
-
}
|
|
550
|
-
break;
|
|
551
|
-
case "bigint":
|
|
552
|
-
typeTag = "bigint";
|
|
553
|
-
if (column.type.length) {
|
|
554
|
-
typeTag += `(${column.type.length})`;
|
|
555
|
-
}
|
|
556
|
-
break;
|
|
557
|
-
case "float":
|
|
558
|
-
typeTag = "float";
|
|
559
|
-
if (column.type.precision) {
|
|
560
|
-
typeTag += `(${column.type.precision}`;
|
|
561
|
-
if (column.type.scale) {
|
|
562
|
-
typeTag += `,${column.type.scale}`;
|
|
563
|
-
}
|
|
564
|
-
typeTag += ")";
|
|
565
|
-
}
|
|
566
|
-
break;
|
|
567
|
-
case "decimal":
|
|
568
|
-
typeTag = "decimal";
|
|
569
|
-
if (column.type.precision) {
|
|
570
|
-
typeTag += `(${column.type.precision}`;
|
|
571
|
-
if (column.type.scale) {
|
|
572
|
-
typeTag += `,${column.type.scale}`;
|
|
573
|
-
}
|
|
574
|
-
typeTag += ")";
|
|
575
|
-
}
|
|
576
|
-
break;
|
|
577
|
-
case "varchar":
|
|
578
|
-
typeTag = "varchar";
|
|
579
|
-
if (column.type.length) {
|
|
580
|
-
typeTag += `(${column.type.length})`;
|
|
581
|
-
}
|
|
582
|
-
break;
|
|
583
|
-
case "text":
|
|
584
|
-
typeTag = "text";
|
|
585
|
-
break;
|
|
586
|
-
case "boolean":
|
|
587
|
-
typeTag = "bool";
|
|
588
|
-
break;
|
|
589
|
-
case "date":
|
|
590
|
-
typeTag = "date";
|
|
591
|
-
break;
|
|
592
|
-
case "datetime":
|
|
593
|
-
typeTag = "datetime";
|
|
594
|
-
break;
|
|
595
|
-
case "json":
|
|
596
|
-
typeTag = "json";
|
|
597
|
-
break;
|
|
598
|
-
case "enum":
|
|
599
|
-
typeTag = "enum";
|
|
600
|
-
break;
|
|
601
|
-
default:
|
|
602
|
-
typeTag = "string";
|
|
603
|
-
}
|
|
604
|
-
if (typeTag) {
|
|
605
|
-
tags.push(typeTag);
|
|
606
|
-
}
|
|
607
|
-
if (column.primaryKey) {
|
|
608
|
-
tags.push("pk");
|
|
609
|
-
}
|
|
610
|
-
if (column.unique) {
|
|
611
|
-
tags.push("unique");
|
|
612
|
-
}
|
|
613
|
-
if (!column.nullable) {
|
|
614
|
-
tags.push("notnull");
|
|
615
|
-
}
|
|
616
|
-
if (column.default) {
|
|
617
|
-
tags.push(`default(${column.default})`);
|
|
618
|
-
}
|
|
619
|
-
if (column.generated) {
|
|
620
|
-
tags.push("autoincr");
|
|
621
|
-
}
|
|
622
|
-
if (column.comment) {
|
|
623
|
-
tags.push(`comment(${column.comment})`);
|
|
624
|
-
}
|
|
625
|
-
return `\`xorm:"${tags.join(" ")}" json:"${column.name}"\``;
|
|
626
|
-
}
|
|
627
|
-
};
|
|
628
|
-
}
|
|
629
|
-
});
|
|
630
|
-
|
|
631
|
-
// src/generator/generator.ts
|
|
632
|
-
var AGenerator, GeneratorFactory;
|
|
633
|
-
var init_generator = __esm({
|
|
634
|
-
"src/generator/generator.ts"() {
|
|
635
|
-
"use strict";
|
|
636
|
-
AGenerator = class {
|
|
637
|
-
/**
|
|
638
|
-
* 格式化类型名称(如驼峰命名、帕斯卡命名等)
|
|
639
|
-
*/
|
|
640
|
-
formatTypeName(name) {
|
|
641
|
-
return name.split("_").map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase()).join("");
|
|
642
|
-
}
|
|
643
|
-
/**
|
|
644
|
-
* 格式化字段名称
|
|
645
|
-
*/
|
|
646
|
-
formatFieldName(name) {
|
|
647
|
-
return name.split("_").map((part) => {
|
|
648
|
-
return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase();
|
|
649
|
-
}).join("");
|
|
650
|
-
}
|
|
651
|
-
/**
|
|
652
|
-
* 生成默认值
|
|
653
|
-
*/
|
|
654
|
-
generateDefaultValue(column) {
|
|
655
|
-
if (!column.default) {
|
|
656
|
-
return "";
|
|
657
|
-
}
|
|
658
|
-
return column.default;
|
|
659
|
-
}
|
|
660
|
-
/**
|
|
661
|
-
* 检查是否需要导入 time 包
|
|
662
|
-
*/
|
|
663
|
-
needsTimeImport(database) {
|
|
664
|
-
for (const table of database.tables) {
|
|
665
|
-
for (const column of table.columns) {
|
|
666
|
-
if (column.type.kind === "date" || column.type.kind === "datetime") {
|
|
667
|
-
return true;
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
return false;
|
|
672
|
-
}
|
|
673
|
-
};
|
|
674
|
-
GeneratorFactory = class {
|
|
675
|
-
/**
|
|
676
|
-
* 创建语言生成器实例
|
|
677
|
-
* @param language 目标语言
|
|
678
|
-
* @param options 生成器配置选项
|
|
679
|
-
* @returns 语言生成器实例
|
|
680
|
-
*/
|
|
681
|
-
static async createGenerator(language, options = { language }) {
|
|
682
|
-
switch (language) {
|
|
683
|
-
case "typescript":
|
|
684
|
-
const { TypeScriptGenerator: TypeScriptGenerator2 } = await Promise.resolve().then(() => (init_TypeScriptGenerator(), TypeScriptGenerator_exports));
|
|
685
|
-
return new TypeScriptGenerator2(options);
|
|
686
|
-
case "go":
|
|
687
|
-
const { GolangGenerator: GolangGenerator2 } = await Promise.resolve().then(() => (init_GolangGenerator(), GolangGenerator_exports));
|
|
688
|
-
return new GolangGenerator2(options);
|
|
689
|
-
case "gorm":
|
|
690
|
-
const { GormGenerator: GormGenerator2 } = await Promise.resolve().then(() => (init_GormGenerator(), GormGenerator_exports));
|
|
691
|
-
return new GormGenerator2(options);
|
|
692
|
-
case "xorm":
|
|
693
|
-
const { XormGenerator: XormGenerator2 } = await Promise.resolve().then(() => (init_XormGenerator(), XormGenerator_exports));
|
|
694
|
-
return new XormGenerator2(options);
|
|
695
|
-
default:
|
|
696
|
-
throw new Error(`Unsupported language: ${language}`);
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
};
|
|
700
|
-
}
|
|
701
|
-
});
|
|
702
|
-
|
|
703
30
|
// src/index.ts
|
|
704
31
|
var index_exports = {};
|
|
705
32
|
__export(index_exports, {
|
|
706
|
-
|
|
707
|
-
FileReader: () => FileReader,
|
|
33
|
+
BaseGenerator: () => BaseGenerator,
|
|
708
34
|
GeneratorFactory: () => GeneratorFactory,
|
|
709
|
-
|
|
35
|
+
GoGenerator: () => GoGenerator,
|
|
710
36
|
GormGenerator: () => GormGenerator,
|
|
711
|
-
ReaderFactory: () => ReaderFactory,
|
|
712
37
|
SQLParser: () => SQLParser,
|
|
713
|
-
StringReader: () => StringReader,
|
|
714
38
|
TypeScriptGenerator: () => TypeScriptGenerator,
|
|
715
39
|
XormGenerator: () => XormGenerator,
|
|
716
40
|
generateCode: () => generateCode,
|
|
717
|
-
parseSQL: () => parseSQL
|
|
41
|
+
parseSQL: () => parseSQL,
|
|
42
|
+
readSQLFromFile: () => readSQLFromFile,
|
|
43
|
+
readSQLFromString: () => readSQLFromString
|
|
718
44
|
});
|
|
719
45
|
module.exports = __toCommonJS(index_exports);
|
|
720
46
|
|
|
721
47
|
// src/sql-parser.ts
|
|
722
48
|
var import_node_sql_parser = require("node-sql-parser");
|
|
723
|
-
var parserCache = /* @__PURE__ */ new Map();
|
|
724
|
-
function getParser(dialect) {
|
|
725
|
-
if (!parserCache.has(dialect)) {
|
|
726
|
-
parserCache.set(dialect, new import_node_sql_parser.Parser());
|
|
727
|
-
}
|
|
728
|
-
return parserCache.get(dialect);
|
|
729
|
-
}
|
|
730
49
|
function parseSQL(sql, options = { dialect: "mysql" }) {
|
|
731
50
|
if (!sql || typeof sql !== "string") {
|
|
732
51
|
throw new Error("SQL string is required and must be a string");
|
|
733
52
|
}
|
|
734
53
|
try {
|
|
735
|
-
const parser =
|
|
736
|
-
const processedSql = sql.trim().replace(/\s+/g, " ").replace(
|
|
54
|
+
const parser = new import_node_sql_parser.Parser();
|
|
55
|
+
const processedSql = sql.trim().replace(/\s+/g, " ").replace(/;[\s;]*;/g, ";");
|
|
737
56
|
const ast = parser.astify(processedSql, { database: options.dialect });
|
|
738
57
|
if (!ast) {
|
|
739
58
|
throw new Error("Failed to parse SQL: AST is null or undefined");
|
|
@@ -842,7 +161,7 @@ var SQLParser = class {
|
|
|
842
161
|
if (v.value) {
|
|
843
162
|
value = v.value;
|
|
844
163
|
} else if (v.raw) {
|
|
845
|
-
value = v.raw;
|
|
164
|
+
value = String(v.raw);
|
|
846
165
|
} else {
|
|
847
166
|
value = String(v);
|
|
848
167
|
}
|
|
@@ -897,19 +216,18 @@ var SQLParser = class {
|
|
|
897
216
|
db.tables.push(this.parseTable(node));
|
|
898
217
|
}
|
|
899
218
|
}
|
|
900
|
-
db.tablesMap =
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
db.tablesMap[table.name] = table;
|
|
904
|
-
}
|
|
905
|
-
}
|
|
219
|
+
db.tablesMap = Object.fromEntries(
|
|
220
|
+
db.tables.filter((t) => t.name).map((t) => [t.name, t])
|
|
221
|
+
);
|
|
906
222
|
return db;
|
|
907
223
|
}
|
|
908
224
|
/**
|
|
909
225
|
* 类型守卫:判断是否为 CREATE TABLE 语句
|
|
910
226
|
*/
|
|
911
227
|
isCreateTable(node) {
|
|
912
|
-
|
|
228
|
+
if (!node || typeof node !== "object") return false;
|
|
229
|
+
const n = node;
|
|
230
|
+
return n.type === "create" && n.keyword === "table";
|
|
913
231
|
}
|
|
914
232
|
/**
|
|
915
233
|
* 解析单表 AST -> TableSchema
|
|
@@ -1080,137 +398,694 @@ var SQLParser = class {
|
|
|
1080
398
|
* 使用 sqlify 确保函数/表达式被正确序列化
|
|
1081
399
|
*/
|
|
1082
400
|
parseDefault(def) {
|
|
1083
|
-
var _a, _b
|
|
1084
|
-
|
|
401
|
+
var _a, _b;
|
|
402
|
+
const val = def.value;
|
|
403
|
+
if ((val == null ? void 0 : val.type) === "null" || val === null) {
|
|
1085
404
|
return null;
|
|
1086
405
|
}
|
|
1087
406
|
try {
|
|
1088
|
-
return this.parser.sqlify(
|
|
1089
|
-
} catch (
|
|
1090
|
-
if ((
|
|
1091
|
-
|
|
1092
|
-
|
|
407
|
+
return this.parser.sqlify(val);
|
|
408
|
+
} catch (e) {
|
|
409
|
+
if ((val == null ? void 0 : val.type) === "function") {
|
|
410
|
+
const name = val.name;
|
|
411
|
+
const firstName = name == null ? void 0 : name.name;
|
|
412
|
+
if ((_a = firstName == null ? void 0 : firstName[0]) == null ? void 0 : _a.value) {
|
|
413
|
+
return String(firstName[0].value);
|
|
1093
414
|
}
|
|
1094
415
|
}
|
|
1095
|
-
|
|
416
|
+
const inner = val;
|
|
417
|
+
return String((_b = inner == null ? void 0 : inner.value) != null ? _b : val);
|
|
1096
418
|
}
|
|
1097
419
|
}
|
|
1098
420
|
};
|
|
1099
421
|
|
|
1100
|
-
// src/generator/
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
422
|
+
// src/generator/base.ts
|
|
423
|
+
var BaseGenerator = class {
|
|
424
|
+
constructor() {
|
|
425
|
+
this.needsTimeCache = null;
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* 格式化类型名称(如驼峰命名、帕斯卡命名等)
|
|
429
|
+
*/
|
|
430
|
+
formatTypeName(name) {
|
|
431
|
+
return name.split("_").map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase()).join("");
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* 格式化字段名称
|
|
435
|
+
*/
|
|
436
|
+
formatPascalCase(name) {
|
|
437
|
+
return name.split("_").map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase()).join("");
|
|
438
|
+
}
|
|
439
|
+
formatFieldName(name) {
|
|
440
|
+
return this.formatPascalCase(name);
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* 生成默认值
|
|
444
|
+
*/
|
|
445
|
+
generateDefaultValue(column) {
|
|
446
|
+
if (!column.default) {
|
|
447
|
+
return "";
|
|
448
|
+
}
|
|
449
|
+
return column.default;
|
|
450
|
+
}
|
|
451
|
+
needsTimeImport(database) {
|
|
452
|
+
if (this.needsTimeCache !== null) return this.needsTimeCache;
|
|
453
|
+
for (const table of database.tables) {
|
|
454
|
+
for (const column of table.columns) {
|
|
455
|
+
if (column.type.kind === "date" || column.type.kind === "datetime") {
|
|
456
|
+
this.needsTimeCache = true;
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
this.needsTimeCache = false;
|
|
462
|
+
return false;
|
|
463
|
+
}
|
|
464
|
+
};
|
|
465
|
+
var GeneratorFactory = class {
|
|
466
|
+
static register(language, constructor) {
|
|
467
|
+
this.registry[language] = constructor;
|
|
468
|
+
}
|
|
469
|
+
static createGenerator(language, options = { language }) {
|
|
470
|
+
const Generator = this.registry[language];
|
|
471
|
+
if (!Generator) {
|
|
472
|
+
throw new Error(`Unsupported language: ${language}`);
|
|
473
|
+
}
|
|
474
|
+
return new Generator(options);
|
|
475
|
+
}
|
|
476
|
+
};
|
|
477
|
+
GeneratorFactory.registry = {};
|
|
1106
478
|
|
|
1107
|
-
// src/
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
479
|
+
// src/generator/typescript-generator.ts
|
|
480
|
+
var TypeScriptGenerator = class extends BaseGenerator {
|
|
481
|
+
constructor(options = { language: "typescript" }) {
|
|
482
|
+
super();
|
|
483
|
+
this.options = options;
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* 格式化字段名称(使用驼峰命名)
|
|
487
|
+
*/
|
|
488
|
+
formatFieldName(name) {
|
|
489
|
+
return name.split("_").map((part, index) => {
|
|
490
|
+
if (index === 0) {
|
|
491
|
+
return part.toLowerCase();
|
|
492
|
+
}
|
|
493
|
+
return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase();
|
|
494
|
+
}).join("");
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* 生成整个数据库模式的类型定义
|
|
498
|
+
*/
|
|
499
|
+
generateDatabase(database) {
|
|
500
|
+
let result = `// Database: ${database.name}
|
|
501
|
+
`;
|
|
502
|
+
result += `// Dialect: ${database.dialect}
|
|
1125
503
|
|
|
1126
|
-
|
|
1127
|
-
|
|
504
|
+
`;
|
|
505
|
+
for (const table of database.tables) {
|
|
506
|
+
result += this.generateTable(table);
|
|
507
|
+
result += "\n";
|
|
508
|
+
}
|
|
509
|
+
return result;
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* 生成单个表的类型定义
|
|
513
|
+
*/
|
|
514
|
+
generateTable(table) {
|
|
515
|
+
let result = `// ${table.name} \u8868\u7ED3\u6784
|
|
516
|
+
`;
|
|
517
|
+
result += `export interface ${this.formatTypeName(table.name)} {
|
|
518
|
+
`;
|
|
519
|
+
for (const column of table.columns) {
|
|
520
|
+
result += this.generateColumn(column);
|
|
521
|
+
}
|
|
522
|
+
result += "}\n";
|
|
523
|
+
return result;
|
|
524
|
+
}
|
|
1128
525
|
/**
|
|
1129
|
-
*
|
|
1130
|
-
* @param sql SQL 字符串
|
|
526
|
+
* 生成列的类型定义
|
|
1131
527
|
*/
|
|
1132
|
-
|
|
1133
|
-
|
|
528
|
+
generateColumn(column) {
|
|
529
|
+
const fieldName = this.formatFieldName(column.name);
|
|
530
|
+
const typeName = this.mapSQLType(column.type, column.name);
|
|
531
|
+
const optional = column.nullable ? "?" : "";
|
|
532
|
+
let result = ` ${fieldName}${optional}: ${typeName}`;
|
|
533
|
+
if (column.comment && this.options.generateComments !== false) {
|
|
534
|
+
result += `; // ${column.comment}`;
|
|
535
|
+
}
|
|
536
|
+
result += "\n";
|
|
537
|
+
return result;
|
|
1134
538
|
}
|
|
1135
539
|
/**
|
|
1136
|
-
*
|
|
1137
|
-
* @returns Promise<string> SQL 内容
|
|
540
|
+
* 映射 SQL 类型到 TypeScript 类型
|
|
1138
541
|
*/
|
|
1139
|
-
|
|
1140
|
-
|
|
542
|
+
mapSQLType(type, columnName) {
|
|
543
|
+
switch (type.kind) {
|
|
544
|
+
case "int":
|
|
545
|
+
case "bigint":
|
|
546
|
+
return "number";
|
|
547
|
+
case "float":
|
|
548
|
+
case "decimal":
|
|
549
|
+
return "number";
|
|
550
|
+
case "varchar":
|
|
551
|
+
case "text":
|
|
552
|
+
return "string";
|
|
553
|
+
case "boolean":
|
|
554
|
+
return "boolean";
|
|
555
|
+
case "date":
|
|
556
|
+
case "datetime":
|
|
557
|
+
return "Date";
|
|
558
|
+
case "json":
|
|
559
|
+
return "unknown";
|
|
560
|
+
case "enum":
|
|
561
|
+
if (type.values && type.values.length > 0) {
|
|
562
|
+
const enumValues = type.values.map((v) => `'${v}'`).join(" | ");
|
|
563
|
+
if (columnName) {
|
|
564
|
+
const fieldName = this.formatFieldName(columnName);
|
|
565
|
+
return `${fieldName}: ${enumValues}`;
|
|
566
|
+
}
|
|
567
|
+
return enumValues;
|
|
568
|
+
}
|
|
569
|
+
return "string";
|
|
570
|
+
default:
|
|
571
|
+
return "string";
|
|
572
|
+
}
|
|
1141
573
|
}
|
|
1142
574
|
};
|
|
1143
575
|
|
|
1144
|
-
// src/
|
|
1145
|
-
var
|
|
1146
|
-
|
|
576
|
+
// src/generator/go-generator.ts
|
|
577
|
+
var GoGenerator = class extends BaseGenerator {
|
|
578
|
+
constructor(options = { language: "go" }) {
|
|
579
|
+
super();
|
|
580
|
+
this.options = options;
|
|
581
|
+
}
|
|
1147
582
|
/**
|
|
1148
|
-
*
|
|
1149
|
-
* @param filePath SQL 文件路径
|
|
583
|
+
* 生成整个数据库模式的类型定义
|
|
1150
584
|
*/
|
|
1151
|
-
|
|
1152
|
-
|
|
585
|
+
generateDatabase(database) {
|
|
586
|
+
let result = `// Database: ${database.name}
|
|
587
|
+
`;
|
|
588
|
+
result += `// Dialect: ${database.dialect}
|
|
589
|
+
|
|
590
|
+
`;
|
|
591
|
+
if (this.options.namespace) {
|
|
592
|
+
result += `package ${this.options.namespace}
|
|
593
|
+
|
|
594
|
+
`;
|
|
595
|
+
}
|
|
596
|
+
if (this.needsTimeImport(database)) {
|
|
597
|
+
result += `import "time"
|
|
598
|
+
|
|
599
|
+
`;
|
|
600
|
+
}
|
|
601
|
+
for (const table of database.tables) {
|
|
602
|
+
result += this.generateTable(table);
|
|
603
|
+
result += "\n";
|
|
604
|
+
}
|
|
605
|
+
return result;
|
|
1153
606
|
}
|
|
1154
607
|
/**
|
|
1155
|
-
*
|
|
1156
|
-
* @returns Promise<string> SQL 内容
|
|
1157
|
-
* @throws Error 文件不存在或读取失败
|
|
608
|
+
* 生成单个表的类型定义
|
|
1158
609
|
*/
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
610
|
+
generateTable(table) {
|
|
611
|
+
let result = `// ${table.name} \u8868\u7ED3\u6784
|
|
612
|
+
`;
|
|
613
|
+
result += `type ${this.formatTypeName(table.name)} struct {
|
|
614
|
+
`;
|
|
615
|
+
for (const column of table.columns) {
|
|
616
|
+
result += this.generateColumn(column);
|
|
617
|
+
}
|
|
618
|
+
result += "}\n";
|
|
619
|
+
return result;
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* 生成列的类型定义
|
|
623
|
+
*/
|
|
624
|
+
generateColumn(column) {
|
|
625
|
+
const fieldName = this.formatFieldName(column.name);
|
|
626
|
+
const typeName = this.mapSQLType(column.type);
|
|
627
|
+
const tag = this.generateGoTag(column);
|
|
628
|
+
let result = ` ${fieldName} ${typeName} ${tag}`;
|
|
629
|
+
if (column.comment && this.options.generateComments !== false) {
|
|
630
|
+
result += ` // ${column.comment}`;
|
|
631
|
+
}
|
|
632
|
+
result += "\n";
|
|
633
|
+
return result;
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* 映射 SQL 类型到 Go 类型
|
|
637
|
+
*/
|
|
638
|
+
mapSQLType(type) {
|
|
639
|
+
switch (type.kind) {
|
|
640
|
+
case "int":
|
|
641
|
+
return "int";
|
|
642
|
+
case "bigint":
|
|
643
|
+
return "int64";
|
|
644
|
+
case "float":
|
|
645
|
+
return "float64";
|
|
646
|
+
case "decimal":
|
|
647
|
+
return "float64";
|
|
648
|
+
case "varchar":
|
|
649
|
+
case "text":
|
|
650
|
+
return "string";
|
|
651
|
+
case "boolean":
|
|
652
|
+
return "bool";
|
|
653
|
+
case "date":
|
|
654
|
+
case "datetime":
|
|
655
|
+
return "time.Time";
|
|
656
|
+
case "json":
|
|
657
|
+
return "interface{}";
|
|
658
|
+
case "enum":
|
|
659
|
+
return "string";
|
|
660
|
+
default:
|
|
661
|
+
return "string";
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
/**
|
|
665
|
+
* 生成 Go 结构体标签
|
|
666
|
+
*/
|
|
667
|
+
generateGoTag(column) {
|
|
668
|
+
const tags = [];
|
|
669
|
+
tags.push(`json:"${column.name}"`);
|
|
670
|
+
tags.push(`db:"${column.name}"`);
|
|
671
|
+
return `\`${tags.join(" ")}\``;
|
|
672
|
+
}
|
|
673
|
+
};
|
|
674
|
+
|
|
675
|
+
// src/generator/gorm-generator.ts
|
|
676
|
+
var GormGenerator = class extends BaseGenerator {
|
|
677
|
+
constructor(options = { language: "gorm" }) {
|
|
678
|
+
super();
|
|
679
|
+
this.options = options;
|
|
680
|
+
}
|
|
681
|
+
/**
|
|
682
|
+
* 生成整个数据库模式的类型定义
|
|
683
|
+
*/
|
|
684
|
+
generateDatabase(database) {
|
|
685
|
+
let result = `// Database: ${database.name}
|
|
686
|
+
`;
|
|
687
|
+
result += `// Dialect: ${database.dialect}
|
|
688
|
+
|
|
689
|
+
`;
|
|
690
|
+
if (this.options.namespace) {
|
|
691
|
+
result += `package ${this.options.namespace}
|
|
692
|
+
|
|
693
|
+
`;
|
|
694
|
+
}
|
|
695
|
+
if (this.needsTimeImport(database)) {
|
|
696
|
+
result += `import "time"
|
|
697
|
+
|
|
698
|
+
`;
|
|
699
|
+
}
|
|
700
|
+
for (const table of database.tables) {
|
|
701
|
+
result += this.generateTable(table);
|
|
702
|
+
result += "\n";
|
|
703
|
+
}
|
|
704
|
+
return result;
|
|
705
|
+
}
|
|
706
|
+
/**
|
|
707
|
+
* 生成单个表的类型定义
|
|
708
|
+
*/
|
|
709
|
+
generateTable(table) {
|
|
710
|
+
let result = `// ${table.name} \u8868\u7ED3\u6784
|
|
711
|
+
`;
|
|
712
|
+
result += `type ${this.formatTypeName(table.name)} struct {
|
|
713
|
+
`;
|
|
714
|
+
for (const column of table.columns) {
|
|
715
|
+
result += this.generateColumn(column);
|
|
716
|
+
}
|
|
717
|
+
result += "}\n";
|
|
718
|
+
return result;
|
|
719
|
+
}
|
|
720
|
+
/**
|
|
721
|
+
* 生成列的类型定义
|
|
722
|
+
*/
|
|
723
|
+
generateColumn(column) {
|
|
724
|
+
const fieldName = this.formatFieldName(column.name);
|
|
725
|
+
const typeName = this.mapSQLType(column.type);
|
|
726
|
+
const tag = this.generateGormTag(column);
|
|
727
|
+
let result = ` ${fieldName} ${typeName} ${tag}`;
|
|
728
|
+
if (column.comment && this.options.generateComments !== false) {
|
|
729
|
+
result += ` // ${column.comment}`;
|
|
730
|
+
}
|
|
731
|
+
result += "\n";
|
|
732
|
+
return result;
|
|
733
|
+
}
|
|
734
|
+
/**
|
|
735
|
+
* 映射 SQL 类型到 GORM 类型
|
|
736
|
+
*/
|
|
737
|
+
mapSQLType(type) {
|
|
738
|
+
switch (type.kind) {
|
|
739
|
+
case "int":
|
|
740
|
+
return "int";
|
|
741
|
+
case "bigint":
|
|
742
|
+
return "int64";
|
|
743
|
+
case "float":
|
|
744
|
+
return "float64";
|
|
745
|
+
case "decimal":
|
|
746
|
+
return "float64";
|
|
747
|
+
case "varchar":
|
|
748
|
+
case "text":
|
|
749
|
+
return "string";
|
|
750
|
+
case "boolean":
|
|
751
|
+
return "bool";
|
|
752
|
+
case "date":
|
|
753
|
+
case "datetime":
|
|
754
|
+
return "time.Time";
|
|
755
|
+
case "json":
|
|
756
|
+
return "interface{}";
|
|
757
|
+
case "enum":
|
|
758
|
+
return "string";
|
|
759
|
+
default:
|
|
760
|
+
return "string";
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
/**
|
|
764
|
+
* 生成 GORM 结构体标签
|
|
765
|
+
*/
|
|
766
|
+
generateGormTag(column) {
|
|
767
|
+
const tags = [];
|
|
768
|
+
tags.push(`column:${column.name}`);
|
|
769
|
+
let typeTag = "type:";
|
|
770
|
+
switch (column.type.kind) {
|
|
771
|
+
case "int":
|
|
772
|
+
typeTag += "int";
|
|
773
|
+
if (column.type.length) {
|
|
774
|
+
typeTag += `(${column.type.length})`;
|
|
1169
775
|
}
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
776
|
+
break;
|
|
777
|
+
case "bigint":
|
|
778
|
+
typeTag += "bigint";
|
|
779
|
+
if (column.type.length) {
|
|
780
|
+
typeTag += `(${column.type.length})`;
|
|
781
|
+
}
|
|
782
|
+
break;
|
|
783
|
+
case "float":
|
|
784
|
+
typeTag += "float";
|
|
785
|
+
if (column.type.precision) {
|
|
786
|
+
typeTag += `(${column.type.precision}`;
|
|
787
|
+
if (column.type.scale) {
|
|
788
|
+
typeTag += `,${column.type.scale}`;
|
|
789
|
+
}
|
|
790
|
+
typeTag += ")";
|
|
791
|
+
}
|
|
792
|
+
break;
|
|
793
|
+
case "decimal":
|
|
794
|
+
typeTag += "decimal";
|
|
795
|
+
if (column.type.precision) {
|
|
796
|
+
typeTag += `(${column.type.precision}`;
|
|
797
|
+
if (column.type.scale) {
|
|
798
|
+
typeTag += `,${column.type.scale}`;
|
|
799
|
+
}
|
|
800
|
+
typeTag += ")";
|
|
801
|
+
}
|
|
802
|
+
break;
|
|
803
|
+
case "varchar":
|
|
804
|
+
typeTag += "varchar";
|
|
805
|
+
if (column.type.length) {
|
|
806
|
+
typeTag += `(${column.type.length})`;
|
|
807
|
+
}
|
|
808
|
+
break;
|
|
809
|
+
case "text":
|
|
810
|
+
typeTag += "text";
|
|
811
|
+
break;
|
|
812
|
+
case "boolean":
|
|
813
|
+
typeTag += "bool";
|
|
814
|
+
break;
|
|
815
|
+
case "date":
|
|
816
|
+
typeTag += "date";
|
|
817
|
+
break;
|
|
818
|
+
case "datetime":
|
|
819
|
+
typeTag += "datetime";
|
|
820
|
+
break;
|
|
821
|
+
case "json":
|
|
822
|
+
typeTag += "json";
|
|
823
|
+
break;
|
|
824
|
+
case "enum":
|
|
825
|
+
typeTag += "enum";
|
|
826
|
+
break;
|
|
827
|
+
default:
|
|
828
|
+
typeTag += "string";
|
|
829
|
+
}
|
|
830
|
+
tags.push(typeTag);
|
|
831
|
+
if (column.primaryKey) {
|
|
832
|
+
tags.push("primaryKey");
|
|
833
|
+
}
|
|
834
|
+
if (column.unique) {
|
|
835
|
+
tags.push("unique");
|
|
836
|
+
}
|
|
837
|
+
if (!column.nullable) {
|
|
838
|
+
tags.push("not null");
|
|
839
|
+
}
|
|
840
|
+
if (column.default) {
|
|
841
|
+
tags.push(`default:${column.default}`);
|
|
1173
842
|
}
|
|
843
|
+
if (column.generated) {
|
|
844
|
+
tags.push("autoIncrement");
|
|
845
|
+
}
|
|
846
|
+
if (column.comment) {
|
|
847
|
+
tags.push(`comment:${column.comment}`);
|
|
848
|
+
}
|
|
849
|
+
return `\`gorm:"${tags.join(";")}" json:"${column.name}"\``;
|
|
1174
850
|
}
|
|
1175
851
|
};
|
|
1176
852
|
|
|
1177
|
-
// src/
|
|
1178
|
-
var
|
|
853
|
+
// src/generator/xorm-generator.ts
|
|
854
|
+
var XormGenerator = class extends BaseGenerator {
|
|
855
|
+
constructor(options = { language: "xorm" }) {
|
|
856
|
+
super();
|
|
857
|
+
this.options = options;
|
|
858
|
+
}
|
|
859
|
+
/**
|
|
860
|
+
* 生成整个数据库模式的类型定义
|
|
861
|
+
*/
|
|
862
|
+
generateDatabase(database) {
|
|
863
|
+
let result = `// Database: ${database.name}
|
|
864
|
+
`;
|
|
865
|
+
result += `// Dialect: ${database.dialect}
|
|
866
|
+
|
|
867
|
+
`;
|
|
868
|
+
if (this.options.namespace) {
|
|
869
|
+
result += `package ${this.options.namespace}
|
|
870
|
+
|
|
871
|
+
`;
|
|
872
|
+
}
|
|
873
|
+
if (this.needsTimeImport(database)) {
|
|
874
|
+
result += `import "time"
|
|
875
|
+
|
|
876
|
+
`;
|
|
877
|
+
}
|
|
878
|
+
for (const table of database.tables) {
|
|
879
|
+
result += this.generateTable(table);
|
|
880
|
+
result += "\n";
|
|
881
|
+
}
|
|
882
|
+
return result;
|
|
883
|
+
}
|
|
884
|
+
/**
|
|
885
|
+
* 生成单个表的类型定义
|
|
886
|
+
*/
|
|
887
|
+
generateTable(table) {
|
|
888
|
+
let result = `// ${table.name} \u8868\u7ED3\u6784
|
|
889
|
+
`;
|
|
890
|
+
result += `type ${this.formatTypeName(table.name)} struct {
|
|
891
|
+
`;
|
|
892
|
+
for (const column of table.columns) {
|
|
893
|
+
result += this.generateColumn(column);
|
|
894
|
+
}
|
|
895
|
+
result += "}\n";
|
|
896
|
+
return result;
|
|
897
|
+
}
|
|
898
|
+
/**
|
|
899
|
+
* 生成列的类型定义
|
|
900
|
+
*/
|
|
901
|
+
generateColumn(column) {
|
|
902
|
+
const fieldName = this.formatFieldName(column.name);
|
|
903
|
+
const typeName = this.mapSQLType(column.type);
|
|
904
|
+
const tag = this.generateXormTag(column);
|
|
905
|
+
let result = ` ${fieldName} ${typeName} ${tag}`;
|
|
906
|
+
if (column.comment && this.options.generateComments !== false) {
|
|
907
|
+
result += ` // ${column.comment}`;
|
|
908
|
+
}
|
|
909
|
+
result += "\n";
|
|
910
|
+
return result;
|
|
911
|
+
}
|
|
912
|
+
/**
|
|
913
|
+
* 映射 SQL 类型到 XORM 类型
|
|
914
|
+
*/
|
|
915
|
+
mapSQLType(type) {
|
|
916
|
+
switch (type.kind) {
|
|
917
|
+
case "int":
|
|
918
|
+
return "int";
|
|
919
|
+
case "bigint":
|
|
920
|
+
return "int64";
|
|
921
|
+
case "float":
|
|
922
|
+
return "float64";
|
|
923
|
+
case "decimal":
|
|
924
|
+
return "float64";
|
|
925
|
+
case "varchar":
|
|
926
|
+
case "text":
|
|
927
|
+
return "string";
|
|
928
|
+
case "boolean":
|
|
929
|
+
return "bool";
|
|
930
|
+
case "date":
|
|
931
|
+
case "datetime":
|
|
932
|
+
return "time.Time";
|
|
933
|
+
case "json":
|
|
934
|
+
return "interface{}";
|
|
935
|
+
case "enum":
|
|
936
|
+
return "string";
|
|
937
|
+
default:
|
|
938
|
+
return "string";
|
|
939
|
+
}
|
|
940
|
+
}
|
|
1179
941
|
/**
|
|
1180
|
-
*
|
|
1181
|
-
* @param options 读取器选项
|
|
1182
|
-
* @returns Reader 实例
|
|
1183
|
-
* @throws Error 不支持的读取器类型
|
|
942
|
+
* 生成 XORM 结构体标签
|
|
1184
943
|
*/
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
944
|
+
generateXormTag(column) {
|
|
945
|
+
const tags = [];
|
|
946
|
+
tags.push(`${column.name}`);
|
|
947
|
+
let typeTag = "";
|
|
948
|
+
switch (column.type.kind) {
|
|
949
|
+
case "int":
|
|
950
|
+
typeTag = "int";
|
|
951
|
+
if (column.type.length) {
|
|
952
|
+
typeTag += `(${column.type.length})`;
|
|
1190
953
|
}
|
|
1191
|
-
|
|
1192
|
-
case "
|
|
1193
|
-
|
|
1194
|
-
|
|
954
|
+
break;
|
|
955
|
+
case "bigint":
|
|
956
|
+
typeTag = "bigint";
|
|
957
|
+
if (column.type.length) {
|
|
958
|
+
typeTag += `(${column.type.length})`;
|
|
1195
959
|
}
|
|
1196
|
-
|
|
960
|
+
break;
|
|
961
|
+
case "float":
|
|
962
|
+
typeTag = "float";
|
|
963
|
+
if (column.type.precision) {
|
|
964
|
+
typeTag += `(${column.type.precision}`;
|
|
965
|
+
if (column.type.scale) {
|
|
966
|
+
typeTag += `,${column.type.scale}`;
|
|
967
|
+
}
|
|
968
|
+
typeTag += ")";
|
|
969
|
+
}
|
|
970
|
+
break;
|
|
971
|
+
case "decimal":
|
|
972
|
+
typeTag = "decimal";
|
|
973
|
+
if (column.type.precision) {
|
|
974
|
+
typeTag += `(${column.type.precision}`;
|
|
975
|
+
if (column.type.scale) {
|
|
976
|
+
typeTag += `,${column.type.scale}`;
|
|
977
|
+
}
|
|
978
|
+
typeTag += ")";
|
|
979
|
+
}
|
|
980
|
+
break;
|
|
981
|
+
case "varchar":
|
|
982
|
+
typeTag = "varchar";
|
|
983
|
+
if (column.type.length) {
|
|
984
|
+
typeTag += `(${column.type.length})`;
|
|
985
|
+
}
|
|
986
|
+
break;
|
|
987
|
+
case "text":
|
|
988
|
+
typeTag = "text";
|
|
989
|
+
break;
|
|
990
|
+
case "boolean":
|
|
991
|
+
typeTag = "bool";
|
|
992
|
+
break;
|
|
993
|
+
case "date":
|
|
994
|
+
typeTag = "date";
|
|
995
|
+
break;
|
|
996
|
+
case "datetime":
|
|
997
|
+
typeTag = "datetime";
|
|
998
|
+
break;
|
|
999
|
+
case "json":
|
|
1000
|
+
typeTag = "json";
|
|
1001
|
+
break;
|
|
1002
|
+
case "enum":
|
|
1003
|
+
typeTag = "enum";
|
|
1004
|
+
break;
|
|
1197
1005
|
default:
|
|
1198
|
-
|
|
1006
|
+
typeTag = "string";
|
|
1007
|
+
}
|
|
1008
|
+
if (typeTag) {
|
|
1009
|
+
tags.push(typeTag);
|
|
1010
|
+
}
|
|
1011
|
+
if (column.primaryKey) {
|
|
1012
|
+
tags.push("pk");
|
|
1013
|
+
}
|
|
1014
|
+
if (column.unique) {
|
|
1015
|
+
tags.push("unique");
|
|
1199
1016
|
}
|
|
1017
|
+
if (!column.nullable) {
|
|
1018
|
+
tags.push("notnull");
|
|
1019
|
+
}
|
|
1020
|
+
if (column.default) {
|
|
1021
|
+
tags.push(`default(${column.default})`);
|
|
1022
|
+
}
|
|
1023
|
+
if (column.generated) {
|
|
1024
|
+
tags.push("autoincr");
|
|
1025
|
+
}
|
|
1026
|
+
if (column.comment) {
|
|
1027
|
+
tags.push(`comment(${column.comment})`);
|
|
1028
|
+
}
|
|
1029
|
+
return `\`xorm:"${tags.join(" ")}" json:"${column.name}"\``;
|
|
1200
1030
|
}
|
|
1201
1031
|
};
|
|
1032
|
+
|
|
1033
|
+
// src/generator/index.ts
|
|
1034
|
+
GeneratorFactory.register("typescript", TypeScriptGenerator);
|
|
1035
|
+
GeneratorFactory.register("go", GoGenerator);
|
|
1036
|
+
GeneratorFactory.register("gorm", GormGenerator);
|
|
1037
|
+
GeneratorFactory.register("xorm", XormGenerator);
|
|
1038
|
+
|
|
1039
|
+
// src/generate.ts
|
|
1040
|
+
function generateCode(sql, options) {
|
|
1041
|
+
const dbSchema = parseSQL(sql, {
|
|
1042
|
+
dialect: options.dialect || "mysql",
|
|
1043
|
+
dbName: options.dbName || "my_database"
|
|
1044
|
+
});
|
|
1045
|
+
const generatorOptions = {
|
|
1046
|
+
language: options.language,
|
|
1047
|
+
namespace: options.namespace,
|
|
1048
|
+
generateComments: true
|
|
1049
|
+
};
|
|
1050
|
+
const generator = GeneratorFactory.createGenerator(
|
|
1051
|
+
options.language,
|
|
1052
|
+
generatorOptions
|
|
1053
|
+
);
|
|
1054
|
+
return generator.generateDatabase(dbSchema);
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
// src/reader/index.ts
|
|
1058
|
+
var fs = __toESM(require("fs/promises"));
|
|
1059
|
+
async function readSQLFromFile(path) {
|
|
1060
|
+
if (!path) {
|
|
1061
|
+
throw new Error("File path is required");
|
|
1062
|
+
}
|
|
1063
|
+
try {
|
|
1064
|
+
return await fs.readFile(path, "utf-8");
|
|
1065
|
+
} catch (error) {
|
|
1066
|
+
if ((error == null ? void 0 : error.code) === "ENOENT") {
|
|
1067
|
+
throw new Error(`File not found: ${path}`);
|
|
1068
|
+
}
|
|
1069
|
+
throw error;
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
async function readSQLFromString(sql) {
|
|
1073
|
+
if (!sql) {
|
|
1074
|
+
throw new Error("SQL string is required");
|
|
1075
|
+
}
|
|
1076
|
+
return sql;
|
|
1077
|
+
}
|
|
1202
1078
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1203
1079
|
0 && (module.exports = {
|
|
1204
|
-
|
|
1205
|
-
FileReader,
|
|
1080
|
+
BaseGenerator,
|
|
1206
1081
|
GeneratorFactory,
|
|
1207
|
-
|
|
1082
|
+
GoGenerator,
|
|
1208
1083
|
GormGenerator,
|
|
1209
|
-
ReaderFactory,
|
|
1210
1084
|
SQLParser,
|
|
1211
|
-
StringReader,
|
|
1212
1085
|
TypeScriptGenerator,
|
|
1213
1086
|
XormGenerator,
|
|
1214
1087
|
generateCode,
|
|
1215
|
-
parseSQL
|
|
1088
|
+
parseSQL,
|
|
1089
|
+
readSQLFromFile,
|
|
1090
|
+
readSQLFromString
|
|
1216
1091
|
});
|