@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/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
- AGenerator: () => AGenerator,
707
- FileReader: () => FileReader,
33
+ BaseGenerator: () => BaseGenerator,
708
34
  GeneratorFactory: () => GeneratorFactory,
709
- GolangGenerator: () => GolangGenerator,
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 = getParser(options.dialect);
736
- const processedSql = sql.trim().replace(/\s+/g, " ").replace(/;\s*;/g, ";");
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
- for (const table of db.tables) {
902
- if (table.name) {
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
- return node.type === "create" && node.keyword === "table";
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, _c, _d, _e, _f, _g;
1084
- if (((_a = def.value) == null ? void 0 : _a.type) === "null" || def.value === null) {
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(def.value);
1089
- } catch (error) {
1090
- if (((_b = def.value) == null ? void 0 : _b.type) === "function") {
1091
- if ((_e = (_d = (_c = def.value.name) == null ? void 0 : _c.name) == null ? void 0 : _d[0]) == null ? void 0 : _e.value) {
1092
- return def.value.name.name[0].value;
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
- return String((_g = (_f = def.value) == null ? void 0 : _f.value) != null ? _g : def.value);
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/index.ts
1101
- init_generator();
1102
- init_TypeScriptGenerator();
1103
- init_GolangGenerator();
1104
- init_GormGenerator();
1105
- init_XormGenerator();
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/utils.ts
1108
- init_generator();
1109
- async function generateCode(sql, options) {
1110
- const dbSchema = parseSQL(sql, {
1111
- dialect: options.dialect || "mysql",
1112
- dbName: options.dbName || "my_database"
1113
- });
1114
- const generatorOptions = {
1115
- language: options.language,
1116
- namespace: options.namespace,
1117
- generateComments: true
1118
- };
1119
- const generator = await GeneratorFactory.createGenerator(
1120
- options.language,
1121
- generatorOptions
1122
- );
1123
- return generator.generateDatabase(dbSchema);
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
- // src/reader/StringReader.ts
1127
- var StringReader = class {
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
- constructor(sql) {
1133
- this.sql = sql;
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
- * 读取 SQL 内容
1137
- * @returns Promise<string> SQL 内容
540
+ * 映射 SQL 类型到 TypeScript 类型
1138
541
  */
1139
- async read() {
1140
- return this.sql;
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/reader/FileReader.ts
1145
- var fs = __toESM(require("fs/promises"));
1146
- var FileReader = class {
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
- constructor(filePath) {
1152
- this.filePath = filePath;
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
- * 读取 SQL 内容
1156
- * @returns Promise<string> SQL 内容
1157
- * @throws Error 文件不存在或读取失败
608
+ * 生成单个表的类型定义
1158
609
  */
1159
- async read() {
1160
- try {
1161
- await fs.access(this.filePath);
1162
- const content = await fs.readFile(this.filePath, "utf-8");
1163
- console.log(`Reading SQL from file: ${this.filePath}`);
1164
- return content;
1165
- } catch (error) {
1166
- if (error instanceof Error) {
1167
- if (error.code === "ENOENT") {
1168
- throw new Error(`File not found: ${this.filePath}`);
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
- throw new Error(`Failed to read file: ${error.message}`);
1171
- }
1172
- throw new Error("Unknown error reading file");
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/reader/ReaderFactory.ts
1178
- var ReaderFactory = class {
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
- * 创建 Reader 实例
1181
- * @param options 读取器选项
1182
- * @returns Reader 实例
1183
- * @throws Error 不支持的读取器类型
942
+ * 生成 XORM 结构体标签
1184
943
  */
1185
- static createReader(options) {
1186
- switch (options.type) {
1187
- case "string":
1188
- if (!options.source) {
1189
- throw new Error("Source is required for string reader");
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
- return new StringReader(options.source);
1192
- case "file":
1193
- if (!options.source) {
1194
- throw new Error("Source is required for file reader");
954
+ break;
955
+ case "bigint":
956
+ typeTag = "bigint";
957
+ if (column.type.length) {
958
+ typeTag += `(${column.type.length})`;
1195
959
  }
1196
- return new FileReader(options.source);
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
- throw new Error(`Unsupported reader type: ${options.type}`);
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
- AGenerator,
1205
- FileReader,
1080
+ BaseGenerator,
1206
1081
  GeneratorFactory,
1207
- GolangGenerator,
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
  });