fdb2 1.0.36 → 1.0.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +41 -0
  2. package/dist/public/explorer.css +533 -485
  3. package/dist/public/explorer.js +1277 -868
  4. package/dist/public/index.css +172 -34
  5. package/dist/public/index.js +103 -49
  6. package/dist/public/layout.js +3 -3
  7. package/dist/public/vue.js +1 -1
  8. package/dist/server/core/schema/__tests__/canonical.test.ts +195 -0
  9. package/dist/server/core/schema/__tests__/ddl-emitter.test.ts +456 -0
  10. package/dist/server/core/schema/__tests__/diff.test.ts +242 -0
  11. package/dist/server/core/schema/__tests__/roundtrip.property.test.ts +403 -0
  12. package/dist/server/core/schema/canonical.d.ts +50 -0
  13. package/dist/server/core/schema/canonical.d.ts.map +1 -0
  14. package/dist/server/core/schema/canonical.js +212 -0
  15. package/dist/server/core/schema/canonical.js.map +1 -0
  16. package/dist/server/core/schema/canonical.ts +223 -0
  17. package/dist/server/core/schema/ddl-emitter.d.ts +68 -0
  18. package/dist/server/core/schema/ddl-emitter.d.ts.map +1 -0
  19. package/dist/server/core/schema/ddl-emitter.js +813 -0
  20. package/dist/server/core/schema/ddl-emitter.js.map +1 -0
  21. package/dist/server/core/schema/ddl-emitter.ts +925 -0
  22. package/dist/server/core/schema/diff.d.ts +16 -0
  23. package/dist/server/core/schema/diff.d.ts.map +1 -0
  24. package/dist/server/core/schema/diff.js +115 -0
  25. package/dist/server/core/schema/diff.js.map +1 -0
  26. package/dist/server/core/schema/diff.ts +134 -0
  27. package/dist/server/core/schema/type-defaults.d.ts +27 -0
  28. package/dist/server/core/schema/type-defaults.d.ts.map +1 -0
  29. package/dist/server/core/schema/type-defaults.js +61 -0
  30. package/dist/server/core/schema/type-defaults.js.map +1 -0
  31. package/dist/server/core/schema/type-defaults.ts +79 -0
  32. package/dist/server/index.d.ts +1 -1
  33. package/dist/server/index.d.ts.map +1 -1
  34. package/dist/server/index.js +347 -124
  35. package/dist/server/index.js.map +1 -1
  36. package/dist/server/index.ts +336 -161
  37. package/dist/server/model/ddl-spec.d.ts +163 -0
  38. package/dist/server/model/ddl-spec.d.ts.map +1 -0
  39. package/dist/server/model/ddl-spec.js +32 -0
  40. package/dist/server/model/ddl-spec.js.map +1 -0
  41. package/dist/server/model/ddl-spec.ts +175 -0
  42. package/dist/server/service/connection.service.d.ts +20 -0
  43. package/dist/server/service/connection.service.d.ts.map +1 -1
  44. package/dist/server/service/connection.service.js +99 -25
  45. package/dist/server/service/connection.service.js.map +1 -1
  46. package/dist/server/service/connection.service.ts +104 -25
  47. package/dist/server/service/database/base.service.d.ts +0 -4
  48. package/dist/server/service/database/base.service.d.ts.map +1 -1
  49. package/dist/server/service/database/base.service.js.map +1 -1
  50. package/dist/server/service/database/base.service.ts +0 -5
  51. package/dist/server/service/database/clickhouse.service.d.ts +0 -5
  52. package/dist/server/service/database/clickhouse.service.d.ts.map +1 -1
  53. package/dist/server/service/database/clickhouse.service.js +0 -49
  54. package/dist/server/service/database/clickhouse.service.js.map +1 -1
  55. package/dist/server/service/database/clickhouse.service.ts +0 -52
  56. package/dist/server/service/database/cockroachdb.service.d.ts +0 -5
  57. package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -1
  58. package/dist/server/service/database/cockroachdb.service.js +11 -142
  59. package/dist/server/service/database/cockroachdb.service.js.map +1 -1
  60. package/dist/server/service/database/cockroachdb.service.ts +11 -161
  61. package/dist/server/service/database/database.service.d.ts +55 -2
  62. package/dist/server/service/database/database.service.d.ts.map +1 -1
  63. package/dist/server/service/database/database.service.js +246 -4
  64. package/dist/server/service/database/database.service.js.map +1 -1
  65. package/dist/server/service/database/database.service.ts +295 -7
  66. package/dist/server/service/database/mongodb.service.d.ts +0 -6
  67. package/dist/server/service/database/mongodb.service.d.ts.map +1 -1
  68. package/dist/server/service/database/mongodb.service.js +0 -8
  69. package/dist/server/service/database/mongodb.service.js.map +1 -1
  70. package/dist/server/service/database/mongodb.service.ts +0 -8
  71. package/dist/server/service/database/mssql.service.d.ts +8 -4
  72. package/dist/server/service/database/mssql.service.d.ts.map +1 -1
  73. package/dist/server/service/database/mssql.service.js +27 -132
  74. package/dist/server/service/database/mssql.service.js.map +1 -1
  75. package/dist/server/service/database/mssql.service.ts +34 -156
  76. package/dist/server/service/database/mysql.service.d.ts +0 -4
  77. package/dist/server/service/database/mysql.service.d.ts.map +1 -1
  78. package/dist/server/service/database/mysql.service.js +11 -155
  79. package/dist/server/service/database/mysql.service.js.map +1 -1
  80. package/dist/server/service/database/mysql.service.ts +17 -184
  81. package/dist/server/service/database/oracle.service.d.ts +0 -4
  82. package/dist/server/service/database/oracle.service.d.ts.map +1 -1
  83. package/dist/server/service/database/oracle.service.js +11 -141
  84. package/dist/server/service/database/oracle.service.js.map +1 -1
  85. package/dist/server/service/database/oracle.service.ts +17 -166
  86. package/dist/server/service/database/postgres.service.d.ts +0 -4
  87. package/dist/server/service/database/postgres.service.d.ts.map +1 -1
  88. package/dist/server/service/database/postgres.service.js +11 -150
  89. package/dist/server/service/database/postgres.service.js.map +1 -1
  90. package/dist/server/service/database/postgres.service.ts +17 -174
  91. package/dist/server/service/database/sap.service.d.ts +0 -4
  92. package/dist/server/service/database/sap.service.d.ts.map +1 -1
  93. package/dist/server/service/database/sap.service.js +11 -137
  94. package/dist/server/service/database/sap.service.js.map +1 -1
  95. package/dist/server/service/database/sap.service.ts +11 -158
  96. package/dist/server/service/database/sql-type.helper.d.ts +28 -0
  97. package/dist/server/service/database/sql-type.helper.d.ts.map +1 -0
  98. package/dist/server/service/database/sql-type.helper.js +113 -0
  99. package/dist/server/service/database/sql-type.helper.js.map +1 -0
  100. package/dist/server/service/database/sql-type.helper.ts +115 -0
  101. package/dist/server/service/database/sqlite.service.d.ts +0 -5
  102. package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
  103. package/dist/server/service/database/sqlite.service.js +11 -156
  104. package/dist/server/service/database/sqlite.service.js.map +1 -1
  105. package/dist/server/service/database/sqlite.service.ts +17 -183
  106. package/package.json +1 -1
  107. package/server.js +1 -1
@@ -0,0 +1,16 @@
1
+ /**
2
+ * 结构化差异:reconcile(canonical(原始态), canonical(目标态)) → TableChangeSet
3
+ *
4
+ * 单归属(与前端旧实现的关键差异):
5
+ * - 改名且同时改定义的列,只出现在 renamed 桶(携带 modifiedFields),
6
+ * 不再像旧前端那样同时进 renamedColumns + modifiedColumns 双重记账;
7
+ * - 主键不参与列级比较,独立成桶;纯重命名主键列不构成主键变更(先做改名映射);
8
+ * - added / dropped / renamed / modified 按列名互斥。
9
+ *
10
+ * 幂等保证:diffTable(c, c) 为空 ChangeSet;任何往返操作后终态==初态 ⟹ 空 ChangeSet。
11
+ * 重命名检测沿用前端既有启发式(前缀关系 / 少量编辑),行为不回退。
12
+ */
13
+ import type { CanonicalTable, TableChangeSet } from '../../model/ddl-spec';
14
+ /** 表结构 diff:输入两侧均为归一化后的 CanonicalTable */
15
+ export declare function diffTable(original: CanonicalTable, desired: CanonicalTable): TableChangeSet;
16
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../../server/core/schema/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAmB,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA4C5F,0CAA0C;AAC1C,wBAAgB,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,GAAG,cAAc,CA4E3F"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.diffTable = diffTable;
4
+ const canonical_1 = require("./canonical");
5
+ const query_builder_1 = require("../query-builder");
6
+ /** 两个列名是否可能属于同一次重命名:前缀关系 3 分,少量编辑 1 分,否则 0 */
7
+ function renameNameScore(oldName, newName) {
8
+ const a = String(oldName || '').trim().toLowerCase();
9
+ const b = String(newName || '').trim().toLowerCase();
10
+ if (!a || !b || a === b)
11
+ return 0;
12
+ if (a.startsWith(b) || b.startsWith(a))
13
+ return 3;
14
+ const maxLen = Math.max(a.length, b.length);
15
+ if (maxLen > 0 && (0, query_builder_1.levenshtein)(a, b) <= Math.max(1, Math.floor(maxLen / 3)))
16
+ return 1;
17
+ return 0;
18
+ }
19
+ /** 把新增列与删除列中名称相近的配对(否则改名会被当成 DROP+ADD,导致数据丢失) */
20
+ function matchRenamedColumns(added, dropped) {
21
+ const pairs = [];
22
+ const usedOld = new Set();
23
+ added.forEach((newCol, newIndex) => {
24
+ let bestScore = 0;
25
+ let bestOldIndex = -1;
26
+ dropped.forEach((oldCol, oldIndex) => {
27
+ if (usedOld.has(oldIndex))
28
+ return;
29
+ const score = renameNameScore(oldCol.name, newCol.name);
30
+ if (score === 0)
31
+ return;
32
+ const total = score + (oldIndex === newIndex ? 0.1 : 0); // 顺序位置一致的候选优先
33
+ if (total > bestScore) {
34
+ bestScore = total;
35
+ bestOldIndex = oldIndex;
36
+ }
37
+ });
38
+ if (bestOldIndex >= 0) {
39
+ usedOld.add(bestOldIndex);
40
+ const oldCol = dropped[bestOldIndex];
41
+ if (oldCol)
42
+ pairs.push({ oldColumn: oldCol, newColumn: newCol });
43
+ }
44
+ });
45
+ return pairs;
46
+ }
47
+ /** 表结构 diff:输入两侧均为归一化后的 CanonicalTable */
48
+ function diffTable(original, desired) {
49
+ const rename = original.name !== desired.name ? { from: original.name, to: desired.name } : null;
50
+ const comment = original.comment !== desired.comment
51
+ ? { from: original.comment, to: desired.comment }
52
+ : null;
53
+ const originalMap = new Map(original.columns.map((c) => [c.name, c]));
54
+ const desiredNames = new Set(desired.columns.map((c) => c.name));
55
+ const added = desired.columns.filter((c) => !originalMap.has(c.name));
56
+ const dropped = original.columns.filter((c) => !desiredNames.has(c.name));
57
+ // 重命名检测
58
+ const renamedPairs = matchRenamedColumns(added, dropped);
59
+ const renamedSet = new Set(renamedPairs.map((p) => p.newColumn.name));
60
+ const droppedSet = new Set(dropped.map((c) => c.name));
61
+ const renamedFromSet = new Set(renamedPairs.map((p) => p.oldColumn.name));
62
+ const realAdded = added.filter((c) => !renamedSet.has(c.name));
63
+ const realDroppedNames = dropped.map((c) => c.name).filter((n) => !renamedFromSet.has(n));
64
+ const renamed = renamedPairs.map(({ oldColumn, newColumn }) => {
65
+ const fields = (0, canonical_1.diffColumnFields)(oldColumn, newColumn);
66
+ return {
67
+ from: oldColumn.name,
68
+ to: newColumn.name,
69
+ definitionChanged: fields.length > 0,
70
+ modifiedFields: fields
71
+ };
72
+ });
73
+ // 列级修改:同名且定义变化(不含主键——主键在表级)
74
+ const modified = desired.columns
75
+ .filter((c) => originalMap.has(c.name) && !renamedSet.has(c.name))
76
+ .map((c) => {
77
+ const before = originalMap.get(c.name);
78
+ if (!before)
79
+ throw new Error(`diff 内部错误:列 ${c.name} 应存在于原始侧`);
80
+ const fields = (0, canonical_1.diffColumnFields)(before, c);
81
+ return { name: c.name, fields, before, after: c };
82
+ })
83
+ .filter((m) => m.fields.length > 0);
84
+ // 幸存列(含改名后的新名)的相对顺序是否变化
85
+ const renameMap = new Map(renamedPairs.map((p) => [p.oldColumn.name, p.newColumn.name]));
86
+ const survivorSet = new Set([
87
+ ...original.columns.filter((c) => !droppedSet.has(c.name)).map((c) => renameMap.get(c.name) ?? c.name),
88
+ ...renamedSet
89
+ ]);
90
+ const originalSurviving = original.columns
91
+ .map((c) => renameMap.get(c.name) ?? c.name)
92
+ .filter((n) => survivorSet.has(n));
93
+ const desiredSurviving = desired.columns
94
+ .map((c) => c.name)
95
+ .filter((n) => survivorSet.has(n));
96
+ const orderChanged = originalSurviving.join(',') !== desiredSurviving.join(',');
97
+ // 主键比较:先把改名映射应用到原侧——纯重命名主键列不是主键变更
98
+ const pkRenameMap = renameMap;
99
+ const originalPkMapped = original.primaryKey.map((n) => pkRenameMap.get(n) ?? n);
100
+ const primaryKey = originalPkMapped.join(',') !== desired.primaryKey.join(',')
101
+ ? { from: original.primaryKey, to: desired.primaryKey }
102
+ : null;
103
+ return {
104
+ rename,
105
+ comment,
106
+ added: realAdded,
107
+ dropped: realDroppedNames,
108
+ renamed,
109
+ modified,
110
+ orderChanged,
111
+ columnOrder: desired.columns.map((c) => c.name),
112
+ primaryKey
113
+ };
114
+ }
115
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../../server/core/schema/diff.ts"],"names":[],"mappings":";;AAyDA,8BA4EC;AAxHD,2CAA+C;AAC/C,oDAA+C;AAE/C,8CAA8C;AAC9C,SAAS,eAAe,CAAC,OAAe,EAAE,OAAe;IACvD,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrD,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,MAAM,GAAG,CAAC,IAAI,IAAA,2BAAW,EAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACrF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,iDAAiD;AACjD,SAAS,mBAAmB,CAC1B,KAAwB,EACxB,OAA0B;IAE1B,MAAM,KAAK,GAAsE,EAAE,CAAC;IACpF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;QACjC,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;QACtB,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YACnC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,OAAO;YAClC,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACxD,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO;YACxB,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc;YACvE,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;gBACtB,SAAS,GAAG,KAAK,CAAC;gBAClB,YAAY,GAAG,QAAQ,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;YACrC,IAAI,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,0CAA0C;AAC1C,SAAgB,SAAS,CAAC,QAAwB,EAAE,OAAuB;IACzE,MAAM,MAAM,GACV,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACpF,MAAM,OAAO,GACX,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;QAClC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE;QACjD,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEjE,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAE1E,QAAQ;IACR,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1F,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;QAC5D,MAAM,MAAM,GAAG,IAAA,4BAAgB,EAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACtD,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,EAAE,EAAE,SAAS,CAAC,IAAI;YAClB,iBAAiB,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC;YACpC,cAAc,EAAE,MAAM;SACvB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACjE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAA,4BAAgB,EAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC3C,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACpD,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEtC,wBAAwB;IACxB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS;QAClC,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;QACtG,GAAG,UAAU;KACd,CAAC,CAAC;IACH,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO;SACvC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;SAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO;SACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEhF,kCAAkC;IAClC,MAAM,WAAW,GAAG,SAAS,CAAC;IAC9B,MAAM,gBAAgB,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjF,MAAM,UAAU,GACd,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;QACzD,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,UAAU,EAAE;QACvD,CAAC,CAAC,IAAI,CAAC;IAEX,OAAO;QACL,MAAM;QACN,OAAO;QACP,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,gBAAgB;QACzB,OAAO;QACP,QAAQ;QACR,YAAY;QACZ,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/C,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * 结构化差异:reconcile(canonical(原始态), canonical(目标态)) → TableChangeSet
3
+ *
4
+ * 单归属(与前端旧实现的关键差异):
5
+ * - 改名且同时改定义的列,只出现在 renamed 桶(携带 modifiedFields),
6
+ * 不再像旧前端那样同时进 renamedColumns + modifiedColumns 双重记账;
7
+ * - 主键不参与列级比较,独立成桶;纯重命名主键列不构成主键变更(先做改名映射);
8
+ * - added / dropped / renamed / modified 按列名互斥。
9
+ *
10
+ * 幂等保证:diffTable(c, c) 为空 ChangeSet;任何往返操作后终态==初态 ⟹ 空 ChangeSet。
11
+ * 重命名检测沿用前端既有启发式(前缀关系 / 少量编辑),行为不回退。
12
+ */
13
+ import type { CanonicalColumn, CanonicalTable, TableChangeSet } from '../../model/ddl-spec';
14
+ import { diffColumnFields } from './canonical';
15
+ import { levenshtein } from '../query-builder';
16
+
17
+ /** 两个列名是否可能属于同一次重命名:前缀关系 3 分,少量编辑 1 分,否则 0 */
18
+ function renameNameScore(oldName: string, newName: string): number {
19
+ const a = String(oldName || '').trim().toLowerCase();
20
+ const b = String(newName || '').trim().toLowerCase();
21
+ if (!a || !b || a === b) return 0;
22
+ if (a.startsWith(b) || b.startsWith(a)) return 3;
23
+ const maxLen = Math.max(a.length, b.length);
24
+ if (maxLen > 0 && levenshtein(a, b) <= Math.max(1, Math.floor(maxLen / 3))) return 1;
25
+ return 0;
26
+ }
27
+
28
+ /** 把新增列与删除列中名称相近的配对(否则改名会被当成 DROP+ADD,导致数据丢失) */
29
+ function matchRenamedColumns(
30
+ added: CanonicalColumn[],
31
+ dropped: CanonicalColumn[]
32
+ ): Array<{ oldColumn: CanonicalColumn; newColumn: CanonicalColumn }> {
33
+ const pairs: Array<{ oldColumn: CanonicalColumn; newColumn: CanonicalColumn }> = [];
34
+ const usedOld = new Set<number>();
35
+ added.forEach((newCol, newIndex) => {
36
+ let bestScore = 0;
37
+ let bestOldIndex = -1;
38
+ dropped.forEach((oldCol, oldIndex) => {
39
+ if (usedOld.has(oldIndex)) return;
40
+ const score = renameNameScore(oldCol.name, newCol.name);
41
+ if (score === 0) return;
42
+ const total = score + (oldIndex === newIndex ? 0.1 : 0); // 顺序位置一致的候选优先
43
+ if (total > bestScore) {
44
+ bestScore = total;
45
+ bestOldIndex = oldIndex;
46
+ }
47
+ });
48
+ if (bestOldIndex >= 0) {
49
+ usedOld.add(bestOldIndex);
50
+ const oldCol = dropped[bestOldIndex];
51
+ if (oldCol) pairs.push({ oldColumn: oldCol, newColumn: newCol });
52
+ }
53
+ });
54
+ return pairs;
55
+ }
56
+
57
+ /** 表结构 diff:输入两侧均为归一化后的 CanonicalTable */
58
+ export function diffTable(original: CanonicalTable, desired: CanonicalTable): TableChangeSet {
59
+ const rename =
60
+ original.name !== desired.name ? { from: original.name, to: desired.name } : null;
61
+ const comment =
62
+ original.comment !== desired.comment
63
+ ? { from: original.comment, to: desired.comment }
64
+ : null;
65
+
66
+ const originalMap = new Map(original.columns.map((c) => [c.name, c]));
67
+ const desiredNames = new Set(desired.columns.map((c) => c.name));
68
+
69
+ const added = desired.columns.filter((c) => !originalMap.has(c.name));
70
+ const dropped = original.columns.filter((c) => !desiredNames.has(c.name));
71
+
72
+ // 重命名检测
73
+ const renamedPairs = matchRenamedColumns(added, dropped);
74
+ const renamedSet = new Set(renamedPairs.map((p) => p.newColumn.name));
75
+ const droppedSet = new Set(dropped.map((c) => c.name));
76
+ const renamedFromSet = new Set(renamedPairs.map((p) => p.oldColumn.name));
77
+ const realAdded = added.filter((c) => !renamedSet.has(c.name));
78
+ const realDroppedNames = dropped.map((c) => c.name).filter((n) => !renamedFromSet.has(n));
79
+
80
+ const renamed = renamedPairs.map(({ oldColumn, newColumn }) => {
81
+ const fields = diffColumnFields(oldColumn, newColumn);
82
+ return {
83
+ from: oldColumn.name,
84
+ to: newColumn.name,
85
+ definitionChanged: fields.length > 0,
86
+ modifiedFields: fields
87
+ };
88
+ });
89
+
90
+ // 列级修改:同名且定义变化(不含主键——主键在表级)
91
+ const modified = desired.columns
92
+ .filter((c) => originalMap.has(c.name) && !renamedSet.has(c.name))
93
+ .map((c) => {
94
+ const before = originalMap.get(c.name);
95
+ if (!before) throw new Error(`diff 内部错误:列 ${c.name} 应存在于原始侧`);
96
+ const fields = diffColumnFields(before, c);
97
+ return { name: c.name, fields, before, after: c };
98
+ })
99
+ .filter((m) => m.fields.length > 0);
100
+
101
+ // 幸存列(含改名后的新名)的相对顺序是否变化
102
+ const renameMap = new Map(renamedPairs.map((p) => [p.oldColumn.name, p.newColumn.name]));
103
+ const survivorSet = new Set<string>([
104
+ ...original.columns.filter((c) => !droppedSet.has(c.name)).map((c) => renameMap.get(c.name) ?? c.name),
105
+ ...renamedSet
106
+ ]);
107
+ const originalSurviving = original.columns
108
+ .map((c) => renameMap.get(c.name) ?? c.name)
109
+ .filter((n) => survivorSet.has(n));
110
+ const desiredSurviving = desired.columns
111
+ .map((c) => c.name)
112
+ .filter((n) => survivorSet.has(n));
113
+ const orderChanged = originalSurviving.join(',') !== desiredSurviving.join(',');
114
+
115
+ // 主键比较:先把改名映射应用到原侧——纯重命名主键列不是主键变更
116
+ const pkRenameMap = renameMap;
117
+ const originalPkMapped = original.primaryKey.map((n) => pkRenameMap.get(n) ?? n);
118
+ const primaryKey =
119
+ originalPkMapped.join(',') !== desired.primaryKey.join(',')
120
+ ? { from: original.primaryKey, to: desired.primaryKey }
121
+ : null;
122
+
123
+ return {
124
+ rename,
125
+ comment,
126
+ added: realAdded,
127
+ dropped: realDroppedNames,
128
+ renamed,
129
+ modified,
130
+ orderChanged,
131
+ columnOrder: desired.columns.map((c) => c.name),
132
+ primaryKey
133
+ };
134
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 「缺参即非法」的列类型在各方言下的默认参数。
3
+ *
4
+ * 背景:前端表单允许只填基础类型名(如 VARCHAR)而不填长度/精度,直接拼接会生成
5
+ * 非法 SQL——MySQL 的 `VARCHAR` 必须带长度、`DECIMAL` 必须带精度,否则报
6
+ * ER_PARSE_ERROR。缺参时按本表补齐,保证生成的 DDL 合法。
7
+ *
8
+ * 刻意不列默认的情况:
9
+ * - SQLite:VARCHAR/DECIMAL 不带长度同样合法,保持原样输出(避免无意义的类型膨胀);
10
+ * - ClickHouse / SAP / MongoDB:类型体系不要求长度,或改表本就不支持。
11
+ *
12
+ * 这是全项目唯一的默认参数来源;service 层的 sql-type.helper 已改为复用本表,
13
+ * 避免两处参数漂移。
14
+ */
15
+ import type { DialectKind } from '../dialect';
16
+ export interface TypeParamDefault {
17
+ length?: number;
18
+ precision?: number;
19
+ scale?: number;
20
+ }
21
+ export declare const TYPE_PARAM_DEFAULTS: Record<DialectKind, Record<string, TypeParamDefault>>;
22
+ /**
23
+ * 取某方言下某类型的默认参数;无默认值返回 undefined(即该类型允许裸写)。
24
+ * 比较按基础类型名的小写形式,与 canonical 化后的大小写无关。
25
+ */
26
+ export declare function typeParamDefault(kind: DialectKind, baseType: string): TypeParamDefault | undefined;
27
+ //# sourceMappingURL=type-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-defaults.d.ts","sourceRoot":"","sources":["../../../../server/core/schema/type-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAYD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAqCrF,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAGlG"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TYPE_PARAM_DEFAULTS = void 0;
4
+ exports.typeParamDefault = typeParamDefault;
5
+ /** PostgreSQL 与 CockroachDB 共用同一套数值/字符默认值 */
6
+ const PG_DEFAULTS = {
7
+ decimal: { precision: 10, scale: 2 },
8
+ numeric: { precision: 10, scale: 2 },
9
+ 'character varying': { length: 255 },
10
+ varchar: { length: 255 },
11
+ character: { length: 1 },
12
+ char: { length: 1 }
13
+ };
14
+ exports.TYPE_PARAM_DEFAULTS = {
15
+ mysql: {
16
+ // 整数刻意不设默认:MySQL 的 INT/TINYINT 等裸写合法,括号里的"显示宽度"自 8.0.17 起
17
+ // 已废弃,补成 INT(11) 既是无意义噪音,也会与实时结构里的 `int` 产生假差异。
18
+ decimal: { precision: 10, scale: 2 },
19
+ float: { precision: 10, scale: 2 },
20
+ double: { precision: 16, scale: 4 },
21
+ bit: { length: 1 },
22
+ char: { length: 1 },
23
+ varchar: { length: 255 },
24
+ binary: { length: 1 },
25
+ varbinary: { length: 255 }
26
+ },
27
+ postgres: PG_DEFAULTS,
28
+ cockroachdb: PG_DEFAULTS,
29
+ sqlite: {},
30
+ oracle: {
31
+ char: { length: 1 },
32
+ nchar: { length: 1 },
33
+ varchar2: { length: 4000 },
34
+ nvarchar2: { length: 2000 },
35
+ raw: { length: 2000 }
36
+ },
37
+ mssql: {
38
+ decimal: { precision: 18, scale: 0 },
39
+ numeric: { precision: 18, scale: 0 },
40
+ float: { precision: 53 },
41
+ char: { length: 1 },
42
+ varchar: { length: 255 },
43
+ nchar: { length: 1 },
44
+ nvarchar: { length: 255 },
45
+ binary: { length: 1 },
46
+ varbinary: { length: 255 }
47
+ },
48
+ mongodb: {},
49
+ sap: {},
50
+ clickhouse: {}
51
+ };
52
+ /**
53
+ * 取某方言下某类型的默认参数;无默认值返回 undefined(即该类型允许裸写)。
54
+ * 比较按基础类型名的小写形式,与 canonical 化后的大小写无关。
55
+ */
56
+ function typeParamDefault(kind, baseType) {
57
+ if (!baseType)
58
+ return undefined;
59
+ return exports.TYPE_PARAM_DEFAULTS[kind]?.[String(baseType).trim().toLowerCase()];
60
+ }
61
+ //# sourceMappingURL=type-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-defaults.js","sourceRoot":"","sources":["../../../../server/core/schema/type-defaults.ts"],"names":[],"mappings":";;;AA2EA,4CAGC;AAxDD,6CAA6C;AAC7C,MAAM,WAAW,GAAqC;IACpD,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;IACpC,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;IACpC,mBAAmB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;IACpC,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;IACxB,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;IACxB,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;CACpB,CAAC;AAEW,QAAA,mBAAmB,GAA0D;IACxF,KAAK,EAAE;QACL,0DAA0D;QAC1D,gDAAgD;QAChD,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;QACpC,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;QAClC,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;QACnC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;QAClB,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;QACnB,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;QACxB,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;QACrB,SAAS,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;KAC3B;IACD,QAAQ,EAAE,WAAW;IACrB,WAAW,EAAE,WAAW;IACxB,MAAM,EAAE,EAAE;IACV,MAAM,EAAE;QACN,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;QACnB,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;QACpB,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QAC1B,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QAC3B,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;KACtB;IACD,KAAK,EAAE;QACL,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;QACpC,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;QACpC,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACxB,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;QACnB,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;QACxB,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;QACpB,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;QACzB,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;QACrB,SAAS,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;KAC3B;IACD,OAAO,EAAE,EAAE;IACX,GAAG,EAAE,EAAE;IACP,UAAU,EAAE,EAAE;CACf,CAAC;AAEF;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,IAAiB,EAAE,QAAgB;IAClE,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,2BAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * 「缺参即非法」的列类型在各方言下的默认参数。
3
+ *
4
+ * 背景:前端表单允许只填基础类型名(如 VARCHAR)而不填长度/精度,直接拼接会生成
5
+ * 非法 SQL——MySQL 的 `VARCHAR` 必须带长度、`DECIMAL` 必须带精度,否则报
6
+ * ER_PARSE_ERROR。缺参时按本表补齐,保证生成的 DDL 合法。
7
+ *
8
+ * 刻意不列默认的情况:
9
+ * - SQLite:VARCHAR/DECIMAL 不带长度同样合法,保持原样输出(避免无意义的类型膨胀);
10
+ * - ClickHouse / SAP / MongoDB:类型体系不要求长度,或改表本就不支持。
11
+ *
12
+ * 这是全项目唯一的默认参数来源;service 层的 sql-type.helper 已改为复用本表,
13
+ * 避免两处参数漂移。
14
+ */
15
+ import type { DialectKind } from '../dialect';
16
+
17
+ export interface TypeParamDefault {
18
+ length?: number;
19
+ precision?: number;
20
+ scale?: number;
21
+ }
22
+
23
+ /** PostgreSQL 与 CockroachDB 共用同一套数值/字符默认值 */
24
+ const PG_DEFAULTS: Record<string, TypeParamDefault> = {
25
+ decimal: { precision: 10, scale: 2 },
26
+ numeric: { precision: 10, scale: 2 },
27
+ 'character varying': { length: 255 },
28
+ varchar: { length: 255 },
29
+ character: { length: 1 },
30
+ char: { length: 1 }
31
+ };
32
+
33
+ export const TYPE_PARAM_DEFAULTS: Record<DialectKind, Record<string, TypeParamDefault>> = {
34
+ mysql: {
35
+ // 整数刻意不设默认:MySQL 的 INT/TINYINT 等裸写合法,括号里的"显示宽度"自 8.0.17 起
36
+ // 已废弃,补成 INT(11) 既是无意义噪音,也会与实时结构里的 `int` 产生假差异。
37
+ decimal: { precision: 10, scale: 2 },
38
+ float: { precision: 10, scale: 2 },
39
+ double: { precision: 16, scale: 4 },
40
+ bit: { length: 1 },
41
+ char: { length: 1 },
42
+ varchar: { length: 255 },
43
+ binary: { length: 1 },
44
+ varbinary: { length: 255 }
45
+ },
46
+ postgres: PG_DEFAULTS,
47
+ cockroachdb: PG_DEFAULTS,
48
+ sqlite: {},
49
+ oracle: {
50
+ char: { length: 1 },
51
+ nchar: { length: 1 },
52
+ varchar2: { length: 4000 },
53
+ nvarchar2: { length: 2000 },
54
+ raw: { length: 2000 }
55
+ },
56
+ mssql: {
57
+ decimal: { precision: 18, scale: 0 },
58
+ numeric: { precision: 18, scale: 0 },
59
+ float: { precision: 53 },
60
+ char: { length: 1 },
61
+ varchar: { length: 255 },
62
+ nchar: { length: 1 },
63
+ nvarchar: { length: 255 },
64
+ binary: { length: 1 },
65
+ varbinary: { length: 255 }
66
+ },
67
+ mongodb: {},
68
+ sap: {},
69
+ clickhouse: {}
70
+ };
71
+
72
+ /**
73
+ * 取某方言下某类型的默认参数;无默认值返回 undefined(即该类型允许裸写)。
74
+ * 比较按基础类型名的小写形式,与 canonical 化后的大小写无关。
75
+ */
76
+ export function typeParamDefault(kind: DialectKind, baseType: string): TypeParamDefault | undefined {
77
+ if (!baseType) return undefined;
78
+ return TYPE_PARAM_DEFAULTS[kind]?.[String(baseType).trim().toLowerCase()];
79
+ }
@@ -1,2 +1,2 @@
1
- export declare function handleDatabaseRoutes(pathname: string, body: any): Promise<any>;
1
+ export declare function handleDatabaseRoutes(pathname: string, body: any, headers?: any): Promise<any>;
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":"AAUA,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,gBA4ZrE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":"AAuQA,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,gBA8dpF"}