@chihqiang/sql-quicktype 0.0.1

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