@uql/core 3.7.13 → 3.8.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.
Files changed (210) hide show
  1. package/CHANGELOG.md +11 -2
  2. package/README.md +16 -8
  3. package/dist/browser/uql-browser.min.js +16 -15
  4. package/dist/browser/uql-browser.min.js.map +1 -1
  5. package/dist/dialect/abstractDialect.d.ts +7 -2
  6. package/dist/dialect/abstractDialect.d.ts.map +1 -1
  7. package/dist/dialect/abstractDialect.js +9 -1
  8. package/dist/dialect/abstractDialect.js.map +1 -1
  9. package/dist/dialect/abstractSqlDialect.d.ts +5 -6
  10. package/dist/dialect/abstractSqlDialect.d.ts.map +1 -1
  11. package/dist/dialect/abstractSqlDialect.js +14 -13
  12. package/dist/dialect/abstractSqlDialect.js.map +1 -1
  13. package/dist/dialect/dialectConfig.d.ts +17 -0
  14. package/dist/dialect/dialectConfig.d.ts.map +1 -0
  15. package/dist/dialect/dialectConfig.js +71 -0
  16. package/dist/dialect/dialectConfig.js.map +1 -0
  17. package/dist/dialect/index.d.ts +1 -0
  18. package/dist/dialect/index.d.ts.map +1 -1
  19. package/dist/dialect/index.js +1 -0
  20. package/dist/dialect/index.js.map +1 -1
  21. package/dist/entity/decorator/definition.d.ts.map +1 -1
  22. package/dist/entity/decorator/definition.js +2 -1
  23. package/dist/entity/decorator/definition.js.map +1 -1
  24. package/dist/entity/decorator/index-decorator.d.ts +36 -0
  25. package/dist/entity/decorator/index-decorator.d.ts.map +1 -0
  26. package/dist/entity/decorator/index-decorator.js +51 -0
  27. package/dist/entity/decorator/index-decorator.js.map +1 -0
  28. package/dist/entity/decorator/index.d.ts +1 -0
  29. package/dist/entity/decorator/index.d.ts.map +1 -1
  30. package/dist/entity/decorator/index.js +1 -0
  31. package/dist/entity/decorator/index.js.map +1 -1
  32. package/dist/maria/mariaDialect.d.ts +2 -1
  33. package/dist/maria/mariaDialect.d.ts.map +1 -1
  34. package/dist/maria/mariaDialect.js +3 -0
  35. package/dist/maria/mariaDialect.js.map +1 -1
  36. package/dist/migrate/builder/columnBuilder.d.ts +75 -0
  37. package/dist/migrate/builder/columnBuilder.d.ts.map +1 -0
  38. package/dist/migrate/builder/columnBuilder.js +149 -0
  39. package/dist/migrate/builder/columnBuilder.js.map +1 -0
  40. package/dist/migrate/builder/expressions.d.ts +87 -0
  41. package/dist/migrate/builder/expressions.d.ts.map +1 -0
  42. package/dist/migrate/builder/expressions.js +150 -0
  43. package/dist/migrate/builder/expressions.js.map +1 -0
  44. package/dist/migrate/builder/index.d.ts +6 -0
  45. package/dist/migrate/builder/index.d.ts.map +1 -0
  46. package/dist/migrate/builder/index.js +6 -0
  47. package/dist/migrate/builder/index.js.map +1 -0
  48. package/dist/migrate/builder/migrationBuilder.d.ts +73 -0
  49. package/dist/migrate/builder/migrationBuilder.d.ts.map +1 -0
  50. package/dist/migrate/builder/migrationBuilder.js +326 -0
  51. package/dist/migrate/builder/migrationBuilder.js.map +1 -0
  52. package/dist/migrate/builder/tableBuilder.d.ts +51 -0
  53. package/dist/migrate/builder/tableBuilder.d.ts.map +1 -0
  54. package/dist/migrate/builder/tableBuilder.js +278 -0
  55. package/dist/migrate/builder/tableBuilder.js.map +1 -0
  56. package/dist/migrate/builder/types.d.ts +462 -0
  57. package/dist/migrate/builder/types.d.ts.map +1 -0
  58. package/dist/migrate/builder/types.js +8 -0
  59. package/dist/migrate/builder/types.js.map +1 -0
  60. package/dist/migrate/cli.d.ts +4 -6
  61. package/dist/migrate/cli.d.ts.map +1 -1
  62. package/dist/migrate/cli.js +166 -23
  63. package/dist/migrate/cli.js.map +1 -1
  64. package/dist/migrate/codegen/entityCodeGenerator.d.ts +137 -0
  65. package/dist/migrate/codegen/entityCodeGenerator.d.ts.map +1 -0
  66. package/dist/migrate/codegen/entityCodeGenerator.js +401 -0
  67. package/dist/migrate/codegen/entityCodeGenerator.js.map +1 -0
  68. package/dist/migrate/codegen/entityMerger.d.ts +111 -0
  69. package/dist/migrate/codegen/entityMerger.d.ts.map +1 -0
  70. package/dist/migrate/codegen/entityMerger.js +291 -0
  71. package/dist/migrate/codegen/entityMerger.js.map +1 -0
  72. package/dist/migrate/codegen/index.d.ts +10 -0
  73. package/dist/migrate/codegen/index.d.ts.map +1 -0
  74. package/dist/migrate/codegen/index.js +14 -0
  75. package/dist/migrate/codegen/index.js.map +1 -0
  76. package/dist/migrate/codegen/migrationCodeGenerator.d.ts +62 -0
  77. package/dist/migrate/codegen/migrationCodeGenerator.d.ts.map +1 -0
  78. package/dist/migrate/codegen/migrationCodeGenerator.js +356 -0
  79. package/dist/migrate/codegen/migrationCodeGenerator.js.map +1 -0
  80. package/dist/migrate/codegen/smartRelationDetector.d.ts +48 -0
  81. package/dist/migrate/codegen/smartRelationDetector.d.ts.map +1 -0
  82. package/dist/migrate/codegen/smartRelationDetector.js +135 -0
  83. package/dist/migrate/codegen/smartRelationDetector.js.map +1 -0
  84. package/dist/migrate/drift/driftDetector.d.ts +81 -0
  85. package/dist/migrate/drift/driftDetector.d.ts.map +1 -0
  86. package/dist/migrate/drift/driftDetector.js +248 -0
  87. package/dist/migrate/drift/driftDetector.js.map +1 -0
  88. package/dist/migrate/drift/index.d.ts +7 -0
  89. package/dist/migrate/drift/index.d.ts.map +1 -0
  90. package/dist/migrate/drift/index.js +7 -0
  91. package/dist/migrate/drift/index.js.map +1 -0
  92. package/dist/migrate/generator/index.d.ts +1 -3
  93. package/dist/migrate/generator/index.d.ts.map +1 -1
  94. package/dist/migrate/generator/index.js +1 -3
  95. package/dist/migrate/generator/index.js.map +1 -1
  96. package/dist/migrate/generator/mongoSchemaGenerator.d.ts +29 -3
  97. package/dist/migrate/generator/mongoSchemaGenerator.d.ts.map +1 -1
  98. package/dist/migrate/generator/mongoSchemaGenerator.js +86 -4
  99. package/dist/migrate/generator/mongoSchemaGenerator.js.map +1 -1
  100. package/dist/migrate/index.d.ts +7 -8
  101. package/dist/migrate/index.d.ts.map +1 -1
  102. package/dist/migrate/index.js +11 -9
  103. package/dist/migrate/index.js.map +1 -1
  104. package/dist/migrate/introspection/baseSqlIntrospector.d.ts +28 -0
  105. package/dist/migrate/introspection/baseSqlIntrospector.d.ts.map +1 -0
  106. package/dist/migrate/introspection/baseSqlIntrospector.js +135 -0
  107. package/dist/migrate/introspection/baseSqlIntrospector.js.map +1 -0
  108. package/dist/migrate/introspection/mongoIntrospector.d.ts +6 -0
  109. package/dist/migrate/introspection/mongoIntrospector.d.ts.map +1 -1
  110. package/dist/migrate/introspection/mongoIntrospector.js +54 -0
  111. package/dist/migrate/introspection/mongoIntrospector.js.map +1 -1
  112. package/dist/migrate/introspection/mysqlIntrospector.d.ts +2 -1
  113. package/dist/migrate/introspection/mysqlIntrospector.d.ts.map +1 -1
  114. package/dist/migrate/introspection/mysqlIntrospector.js +8 -6
  115. package/dist/migrate/introspection/mysqlIntrospector.js.map +1 -1
  116. package/dist/migrate/introspection/postgresIntrospector.d.ts +2 -1
  117. package/dist/migrate/introspection/postgresIntrospector.d.ts.map +1 -1
  118. package/dist/migrate/introspection/postgresIntrospector.js +3 -1
  119. package/dist/migrate/introspection/postgresIntrospector.js.map +1 -1
  120. package/dist/migrate/introspection/sqliteIntrospector.d.ts +2 -2
  121. package/dist/migrate/introspection/sqliteIntrospector.d.ts.map +1 -1
  122. package/dist/migrate/introspection/sqliteIntrospector.js +3 -4
  123. package/dist/migrate/introspection/sqliteIntrospector.js.map +1 -1
  124. package/dist/migrate/migrator.d.ts +29 -0
  125. package/dist/migrate/migrator.d.ts.map +1 -1
  126. package/dist/migrate/migrator.js +31 -23
  127. package/dist/migrate/migrator.js.map +1 -1
  128. package/dist/migrate/schemaGenerator.d.ts +72 -22
  129. package/dist/migrate/schemaGenerator.d.ts.map +1 -1
  130. package/dist/migrate/schemaGenerator.js +385 -153
  131. package/dist/migrate/schemaGenerator.js.map +1 -1
  132. package/dist/migrate/sync/index.d.ts +7 -0
  133. package/dist/migrate/sync/index.d.ts.map +1 -0
  134. package/dist/migrate/sync/index.js +7 -0
  135. package/dist/migrate/sync/index.js.map +1 -0
  136. package/dist/migrate/sync/schemaSync.d.ts +132 -0
  137. package/dist/migrate/sync/schemaSync.d.ts.map +1 -0
  138. package/dist/migrate/sync/schemaSync.js +260 -0
  139. package/dist/migrate/sync/schemaSync.js.map +1 -0
  140. package/dist/mongo/mongoDialect.d.ts +2 -1
  141. package/dist/mongo/mongoDialect.d.ts.map +1 -1
  142. package/dist/mongo/mongoDialect.js +3 -0
  143. package/dist/mongo/mongoDialect.js.map +1 -1
  144. package/dist/mysql/mysqlDialect.d.ts +2 -0
  145. package/dist/mysql/mysqlDialect.d.ts.map +1 -1
  146. package/dist/mysql/mysqlDialect.js +3 -0
  147. package/dist/mysql/mysqlDialect.js.map +1 -1
  148. package/dist/postgres/postgresDialect.js +1 -1
  149. package/dist/postgres/postgresDialect.js.map +1 -1
  150. package/dist/schema/canonicalType.d.ts +42 -0
  151. package/dist/schema/canonicalType.d.ts.map +1 -0
  152. package/dist/schema/canonicalType.js +524 -0
  153. package/dist/schema/canonicalType.js.map +1 -0
  154. package/dist/schema/index.d.ts +28 -0
  155. package/dist/schema/index.d.ts.map +1 -0
  156. package/dist/schema/index.js +29 -0
  157. package/dist/schema/index.js.map +1 -0
  158. package/dist/schema/schemaAST.d.ts +155 -0
  159. package/dist/schema/schemaAST.d.ts.map +1 -0
  160. package/dist/schema/schemaAST.js +496 -0
  161. package/dist/schema/schemaAST.js.map +1 -0
  162. package/dist/schema/schemaASTBuilder.d.ts +58 -0
  163. package/dist/schema/schemaASTBuilder.d.ts.map +1 -0
  164. package/dist/schema/schemaASTBuilder.js +193 -0
  165. package/dist/schema/schemaASTBuilder.js.map +1 -0
  166. package/dist/schema/schemaASTDiffer.d.ts +84 -0
  167. package/dist/schema/schemaASTDiffer.d.ts.map +1 -0
  168. package/dist/schema/schemaASTDiffer.js +431 -0
  169. package/dist/schema/schemaASTDiffer.js.map +1 -0
  170. package/dist/schema/types.d.ts +347 -0
  171. package/dist/schema/types.d.ts.map +1 -0
  172. package/dist/schema/types.js +11 -0
  173. package/dist/schema/types.js.map +1 -0
  174. package/dist/sqlite/sqliteDialect.js +1 -1
  175. package/dist/sqlite/sqliteDialect.js.map +1 -1
  176. package/dist/sqlite/sqliteQuerierPool.js.map +1 -1
  177. package/dist/type/config.d.ts +6 -0
  178. package/dist/type/config.d.ts.map +1 -1
  179. package/dist/type/entity.d.ts +24 -0
  180. package/dist/type/entity.d.ts.map +1 -1
  181. package/dist/type/migration.d.ts +50 -4
  182. package/dist/type/migration.d.ts.map +1 -1
  183. package/dist/util/field.util.d.ts +0 -1
  184. package/dist/util/field.util.d.ts.map +1 -1
  185. package/dist/util/field.util.js +8 -2
  186. package/dist/util/field.util.js.map +1 -1
  187. package/dist/util/logger.d.ts.map +1 -1
  188. package/dist/util/logger.js +2 -1
  189. package/dist/util/logger.js.map +1 -1
  190. package/dist/util/string.util.d.ts +24 -0
  191. package/dist/util/string.util.d.ts.map +1 -1
  192. package/dist/util/string.util.js +57 -0
  193. package/dist/util/string.util.js.map +1 -1
  194. package/package.json +2 -2
  195. package/dist/migrate/generator/mysqlSchemaGenerator.d.ts +0 -15
  196. package/dist/migrate/generator/mysqlSchemaGenerator.d.ts.map +0 -1
  197. package/dist/migrate/generator/mysqlSchemaGenerator.js +0 -88
  198. package/dist/migrate/generator/mysqlSchemaGenerator.js.map +0 -1
  199. package/dist/migrate/generator/postgresSchemaGenerator.d.ts +0 -19
  200. package/dist/migrate/generator/postgresSchemaGenerator.d.ts.map +0 -1
  201. package/dist/migrate/generator/postgresSchemaGenerator.js +0 -115
  202. package/dist/migrate/generator/postgresSchemaGenerator.js.map +0 -1
  203. package/dist/migrate/generator/sqliteSchemaGenerator.d.ts +0 -16
  204. package/dist/migrate/generator/sqliteSchemaGenerator.d.ts.map +0 -1
  205. package/dist/migrate/generator/sqliteSchemaGenerator.js +0 -74
  206. package/dist/migrate/generator/sqliteSchemaGenerator.js.map +0 -1
  207. package/dist/migrate/type.d.ts +0 -2
  208. package/dist/migrate/type.d.ts.map +0 -1
  209. package/dist/migrate/type.js +0 -2
  210. package/dist/migrate/type.js.map +0 -1
@@ -0,0 +1,401 @@
1
+ /**
2
+ * Entity Code Generator
3
+ *
4
+ * Generates TypeScript entity files from SchemaAST.
5
+ * Supports:
6
+ * - ES Module syntax
7
+ * - TypeScript types
8
+ * - Relations with proper decorators
9
+ * - Indexes
10
+ * - JSDoc comments for sync-added fields
11
+ */
12
+ import { canonicalToColumnType, canonicalToTypeScript } from '../../schema/canonicalType.js';
13
+ import { camelCase, pascalCase, singularize } from '../../util/string.util.js';
14
+ /**
15
+ * Generates TypeScript entity code from SchemaAST.
16
+ */
17
+ export class EntityCodeGenerator {
18
+ ast;
19
+ options;
20
+ constructor(ast, options = {}) {
21
+ this.ast = ast;
22
+ this.options = {
23
+ uqlImportPath: options.uqlImportPath ?? '@uql/core',
24
+ addSyncComments: options.addSyncComments ?? true,
25
+ classNameTransformer: options.classNameTransformer ?? this.defaultClassNameTransformer.bind(this),
26
+ propertyNameTransformer: options.propertyNameTransformer ?? this.defaultPropertyNameTransformer.bind(this),
27
+ includeRelations: options.includeRelations ?? true,
28
+ includeIndexes: options.includeIndexes ?? true,
29
+ singularize: options.singularize ?? this.defaultSingularize.bind(this),
30
+ };
31
+ }
32
+ /**
33
+ * Generate entities for all tables in the AST.
34
+ */
35
+ generateAll() {
36
+ const entities = [];
37
+ for (const table of this.ast.tables.values()) {
38
+ entities.push(this.generateEntity(table));
39
+ }
40
+ return entities;
41
+ }
42
+ /**
43
+ * Generate entity for a specific table.
44
+ */
45
+ generateForTable(tableName) {
46
+ const table = this.ast.getTable(tableName);
47
+ if (!table)
48
+ return undefined;
49
+ return this.generateEntity(table);
50
+ }
51
+ /**
52
+ * Generate entity code for a table.
53
+ */
54
+ generateEntity(table) {
55
+ const className = this.options.classNameTransformer(table.name);
56
+ const fileName = `${className}.ts`;
57
+ const imports = this.buildImports(table);
58
+ const decorators = this.buildEntityDecorators(table);
59
+ const fields = this.buildFields(table);
60
+ const relations = this.options.includeRelations ? this.buildRelations(table) : '';
61
+ const code = [imports, '', decorators, `export class ${className} {`, fields, relations, '}', ''].join('\n');
62
+ return {
63
+ className,
64
+ tableName: table.name,
65
+ code,
66
+ fileName,
67
+ };
68
+ }
69
+ /**
70
+ * Build import statements.
71
+ */
72
+ buildImports(table) {
73
+ const uqlImports = new Set(['Entity', 'Field']);
74
+ const relatedImports = [];
75
+ // Check for Id decorator
76
+ for (const col of table.columns.values()) {
77
+ if (col.isPrimaryKey) {
78
+ uqlImports.add('Id');
79
+ }
80
+ }
81
+ // Check for relation decorators
82
+ if (this.options.includeRelations) {
83
+ for (const rel of [...table.incomingRelations, ...table.outgoingRelations]) {
84
+ uqlImports.add(this.getRelationDecoratorName(rel.type));
85
+ uqlImports.add('Relation');
86
+ // Add import for related entity
87
+ const relatedTable = rel.from.table === table ? rel.to.table : rel.from.table;
88
+ const relatedClassName = this.options.classNameTransformer(relatedTable.name);
89
+ if (!relatedImports.includes(relatedClassName)) {
90
+ relatedImports.push(relatedClassName);
91
+ }
92
+ }
93
+ }
94
+ // Sort imports
95
+ const sortedUqlImports = Array.from(uqlImports).sort();
96
+ let code = `import { ${sortedUqlImports.join(', ')} } from '${this.options.uqlImportPath}';\n`;
97
+ // Add related entity imports
98
+ for (const className of relatedImports) {
99
+ code += `import type { ${className} } from './${className}.js';\n`;
100
+ }
101
+ return code;
102
+ }
103
+ /**
104
+ * Build entity decorators.
105
+ */
106
+ buildEntityDecorators(table) {
107
+ const lines = [];
108
+ // Add composite index decorators
109
+ if (this.options.includeIndexes) {
110
+ const compositeIndexes = this.ast.getTableIndexes(table.name).filter((idx) => idx.columns.length > 1);
111
+ for (const idx of compositeIndexes) {
112
+ const columnNames = idx.columns.map((c) => `'${c.name}'`).join(', ');
113
+ const options = [];
114
+ if (idx.name)
115
+ options.push(`name: '${idx.name}'`);
116
+ if (idx.unique)
117
+ options.push('unique: true');
118
+ const optStr = options.length > 0 ? `, { ${options.join(', ')} }` : '';
119
+ lines.push(`// @Index([${columnNames}]${optStr})`);
120
+ }
121
+ }
122
+ // Entity decorator
123
+ lines.push(`@Entity({ name: '${table.name}' })`);
124
+ return lines.join('\n');
125
+ }
126
+ /**
127
+ * Build field definitions.
128
+ */
129
+ buildFields(table) {
130
+ const lines = [];
131
+ for (const col of table.columns.values()) {
132
+ const fieldCode = this.buildField(col);
133
+ lines.push(fieldCode);
134
+ }
135
+ return lines.join('\n\n');
136
+ }
137
+ /**
138
+ * Build a single field definition.
139
+ */
140
+ buildField(col) {
141
+ const lines = [];
142
+ const propertyName = this.options.propertyNameTransformer(col.name);
143
+ const tsType = canonicalToTypeScript(col.type);
144
+ // JSDoc comment if enabled
145
+ if (this.options.addSyncComments) {
146
+ lines.push(' /**');
147
+ lines.push(` * @sync-added ${new Date().toISOString().split('T')[0]}`);
148
+ lines.push(` * Column: ${col.name} (${this.formatTypeDescription(col.type)})`);
149
+ if (col.comment) {
150
+ lines.push(` * ${col.comment}`);
151
+ }
152
+ lines.push(' */');
153
+ }
154
+ // Decorator
155
+ if (col.isPrimaryKey) {
156
+ const idOptions = this.buildIdOptions(col);
157
+ lines.push(` @Id(${idOptions})`);
158
+ }
159
+ else {
160
+ const fieldOptions = this.buildFieldOptions(col);
161
+ lines.push(` @Field(${fieldOptions})`);
162
+ }
163
+ // Property
164
+ const nullable = col.nullable ? '?' : '';
165
+ lines.push(` ${propertyName}${nullable}: ${tsType};`);
166
+ return lines.join('\n');
167
+ }
168
+ /**
169
+ * Build Id decorator options.
170
+ */
171
+ buildIdOptions(col) {
172
+ const options = [];
173
+ if (col.name !== 'id') {
174
+ options.push(`name: '${col.name}'`);
175
+ }
176
+ return options.length > 0 ? `{ ${options.join(', ')} }` : '';
177
+ }
178
+ /**
179
+ * Build Field decorator options.
180
+ */
181
+ buildFieldOptions(col) {
182
+ const options = [];
183
+ // Column type
184
+ const columnType = canonicalToColumnType(col.type);
185
+ if (columnType) {
186
+ options.push(`columnType: '${columnType}'`);
187
+ }
188
+ // Length
189
+ if (col.type.length && col.type.category === 'string') {
190
+ options.push(`length: ${col.type.length}`);
191
+ }
192
+ // Precision and scale
193
+ if (col.type.precision) {
194
+ options.push(`precision: ${col.type.precision}`);
195
+ if (col.type.scale) {
196
+ options.push(`scale: ${col.type.scale}`);
197
+ }
198
+ }
199
+ // Nullable
200
+ if (col.nullable) {
201
+ options.push('nullable: true');
202
+ }
203
+ // Unique
204
+ if (col.isUnique) {
205
+ options.push('unique: true');
206
+ }
207
+ // Default value
208
+ if (col.defaultValue !== undefined) {
209
+ options.push(`defaultValue: ${this.formatDefaultValue(col.defaultValue)}`);
210
+ }
211
+ // Index (single column)
212
+ if (this.options.includeIndexes) {
213
+ const indexes = this.ast.getTableIndexes(col.table.name);
214
+ const singleColIndex = indexes.find((idx) => idx.columns.length === 1 && idx.columns[0].name === col.name);
215
+ if (singleColIndex) {
216
+ options.push(`index: '${singleColIndex.name}'`);
217
+ }
218
+ }
219
+ return options.length > 0 ? `{ ${options.join(', ')} }` : '';
220
+ }
221
+ /**
222
+ * Build relation definitions.
223
+ */
224
+ buildRelations(table) {
225
+ const lines = [];
226
+ // Outgoing relations (this table has FK)
227
+ for (const rel of table.outgoingRelations) {
228
+ const relCode = this.buildOutgoingRelation(rel, table);
229
+ lines.push(relCode);
230
+ }
231
+ // Incoming relations (other tables have FK to this)
232
+ for (const rel of table.incomingRelations) {
233
+ const relCode = this.buildIncomingRelation(rel, table);
234
+ lines.push(relCode);
235
+ }
236
+ if (lines.length > 0) {
237
+ return '\n' + lines.join('\n\n');
238
+ }
239
+ return '';
240
+ }
241
+ /**
242
+ * Build outgoing relation (ManyToOne or OneToOne where this table has FK).
243
+ */
244
+ buildOutgoingRelation(rel, table) {
245
+ const lines = [];
246
+ const relatedClassName = this.options.classNameTransformer(rel.to.table.name);
247
+ // Try to derive property name from FK column name (e.g., author_id -> author)
248
+ let propertyName = '';
249
+ const firstCol = rel.from.columns[0]?.name;
250
+ if (firstCol && (firstCol.toLowerCase().endsWith('_id') || firstCol.toLowerCase().endsWith('id'))) {
251
+ const baseName = firstCol.replace(/_?id$/i, '');
252
+ propertyName = this.options.propertyNameTransformer(baseName);
253
+ }
254
+ else {
255
+ propertyName = this.options.propertyNameTransformer(this.options.singularize(rel.to.table.name));
256
+ }
257
+ const decoratorName = this.getRelationDecoratorName(rel.type);
258
+ // JSDoc
259
+ if (this.options.addSyncComments) {
260
+ lines.push(' /**');
261
+ lines.push(` * @sync-added ${new Date().toISOString().split('T')[0]}`);
262
+ lines.push(` * Relation to ${rel.to.table.name} via ${rel.from.columns.map((c) => c.name).join(', ')}`);
263
+ if (rel.confidence !== undefined && rel.confidence < 1.0) {
264
+ lines.push(` * Inferred (${(rel.confidence * 100).toFixed(0)}% confidence)`);
265
+ }
266
+ lines.push(' */');
267
+ }
268
+ // Decorator
269
+ lines.push(` @${decoratorName}({ entity: () => ${relatedClassName} })`);
270
+ // Property
271
+ lines.push(` ${propertyName}?: Relation<${relatedClassName}>;`);
272
+ return lines.join('\n');
273
+ }
274
+ /**
275
+ * Build incoming relation (OneToMany where other tables have FK to this).
276
+ */
277
+ buildIncomingRelation(rel, table) {
278
+ const lines = [];
279
+ const relatedClassName = this.options.classNameTransformer(rel.from.table.name);
280
+ const propertyName = this.options.propertyNameTransformer(rel.from.table.name);
281
+ const inverseType = this.ast.getInverseRelationType(rel.type);
282
+ const decoratorName = this.getRelationDecoratorName(inverseType);
283
+ // JSDoc
284
+ if (this.options.addSyncComments) {
285
+ lines.push(' /**');
286
+ lines.push(` * @sync-added ${new Date().toISOString().split('T')[0]}`);
287
+ lines.push(` * Inverse relation from ${rel.from.table.name}`);
288
+ lines.push(' */');
289
+ }
290
+ // Decorator - includes references to property name
291
+ const inverseProp = this.options.propertyNameTransformer(this.options.singularize(table.name));
292
+ lines.push(` @${decoratorName}({ entity: () => ${relatedClassName}, references: '${inverseProp}' })`);
293
+ // Property
294
+ if (inverseType === 'OneToMany' || inverseType === 'ManyToMany') {
295
+ lines.push(` ${propertyName}?: Relation<${relatedClassName}[]>;`);
296
+ }
297
+ else {
298
+ lines.push(` ${propertyName}?: Relation<${relatedClassName}>;`);
299
+ }
300
+ return lines.join('\n');
301
+ }
302
+ // ============================================================================
303
+ // Helper Methods
304
+ // ============================================================================
305
+ /**
306
+ * Get decorator name for relation type.
307
+ */
308
+ getRelationDecoratorName(type) {
309
+ switch (type) {
310
+ case 'OneToOne':
311
+ return 'OneToOne';
312
+ case 'OneToMany':
313
+ return 'OneToMany';
314
+ case 'ManyToOne':
315
+ return 'ManyToOne';
316
+ case 'ManyToMany':
317
+ return 'ManyToMany';
318
+ }
319
+ }
320
+ /**
321
+ * Format type for description.
322
+ */
323
+ formatTypeDescription(type) {
324
+ let desc = type.category.toUpperCase();
325
+ if (type.size)
326
+ desc = `${type.size.toUpperCase()}${desc}`;
327
+ if (type.length)
328
+ desc += `(${type.length})`;
329
+ if (type.precision) {
330
+ desc += `(${type.precision}`;
331
+ if (type.scale)
332
+ desc += `,${type.scale}`;
333
+ desc += ')';
334
+ }
335
+ if (type.unsigned)
336
+ desc += ' UNSIGNED';
337
+ return desc;
338
+ }
339
+ /**
340
+ * Format default value for code.
341
+ */
342
+ formatDefaultValue(value) {
343
+ if (typeof value === 'string') {
344
+ // Check for SQL expressions
345
+ if (value.includes('(') ||
346
+ value.toUpperCase() === 'CURRENT_TIMESTAMP' ||
347
+ value.toUpperCase().includes('NEXTVAL')) {
348
+ return `'${value}'`; // Keep as string for expressions
349
+ }
350
+ return `'${value.replace(/'/g, "\\'")}'`;
351
+ }
352
+ if (typeof value === 'boolean') {
353
+ return value.toString();
354
+ }
355
+ if (typeof value === 'number') {
356
+ return value.toString();
357
+ }
358
+ if (value === null) {
359
+ return 'null';
360
+ }
361
+ return JSON.stringify(value);
362
+ }
363
+ /**
364
+ * Default class name transformer: table_name -> TableName (PascalCase, singular).
365
+ */
366
+ defaultClassNameTransformer(tableName) {
367
+ const singular = this.options.singularize(tableName);
368
+ return this.toPascalCase(singular);
369
+ }
370
+ /**
371
+ * Default property name transformer: column_name -> columnName (camelCase).
372
+ */
373
+ defaultPropertyNameTransformer(name) {
374
+ return this.toCamelCase(name);
375
+ }
376
+ /**
377
+ * Convert to PascalCase (delegates to shared utility).
378
+ */
379
+ toPascalCase(str) {
380
+ return pascalCase(str);
381
+ }
382
+ /**
383
+ * Convert to camelCase (delegates to shared utility).
384
+ */
385
+ toCamelCase(str) {
386
+ return camelCase(str);
387
+ }
388
+ /**
389
+ * Default singularize function (delegates to shared utility).
390
+ */
391
+ defaultSingularize(name) {
392
+ return singularize(name);
393
+ }
394
+ }
395
+ /**
396
+ * Create an EntityCodeGenerator from SchemaAST.
397
+ */
398
+ export function createEntityCodeGenerator(ast, options) {
399
+ return new EntityCodeGenerator(ast, options);
400
+ }
401
+ //# sourceMappingURL=entityCodeGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entityCodeGenerator.js","sourceRoot":"","sources":["../../../src/migrate/codegen/entityCodeGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Entity Merger
3
+ *
4
+ * Merges generated entity code with existing TypeScript entity files.
5
+ * Uses string-based parsing to add new fields with JSDoc comments.
6
+ */
7
+ import type { ColumnNode, RelationshipNode } from '../../schema/types.js';
8
+ /**
9
+ * Options for entity merging.
10
+ */
11
+ export interface EntityMergerOptions {
12
+ /** Add JSDoc @sync-added comments to new fields */
13
+ addSyncComments?: boolean;
14
+ /** Mark removed fields with @deprecated instead of deleting */
15
+ markRemovedAsDeprecated?: boolean;
16
+ /** Custom property name transformer */
17
+ propertyNameTransformer?: (columnName: string) => string;
18
+ }
19
+ /**
20
+ * Represents a field to add to an entity.
21
+ */
22
+ export interface FieldToAdd {
23
+ column: ColumnNode;
24
+ propertyName: string;
25
+ isRelation?: boolean;
26
+ relation?: RelationshipNode;
27
+ }
28
+ /**
29
+ * Represents a field to mark as deprecated.
30
+ */
31
+ export interface FieldToDeprecate {
32
+ propertyName: string;
33
+ reason: string;
34
+ }
35
+ /**
36
+ * Result of entity merge operation.
37
+ */
38
+ export interface MergeResult {
39
+ /** The merged source code */
40
+ code: string;
41
+ /** Number of fields added */
42
+ fieldsAdded: number;
43
+ /** Number of fields marked deprecated */
44
+ fieldsDeprecated: number;
45
+ /** Whether the file was modified */
46
+ modified: boolean;
47
+ }
48
+ /**
49
+ * Merges new fields from database schema into existing entity files.
50
+ */
51
+ export declare class EntityMerger {
52
+ private readonly options;
53
+ constructor(options?: EntityMergerOptions);
54
+ /**
55
+ * Merge new fields into existing entity source code.
56
+ */
57
+ merge(existingCode: string, fieldsToAdd: FieldToAdd[], fieldsToDeprecate?: FieldToDeprecate[]): MergeResult;
58
+ /**
59
+ * Extract existing property names from entity code.
60
+ */
61
+ private extractPropertyNames;
62
+ /**
63
+ * Find the position to insert new fields (before the last closing brace).
64
+ */
65
+ private findInsertPosition;
66
+ /**
67
+ * Generate code for new fields.
68
+ */
69
+ private generateFieldsCode;
70
+ /**
71
+ * Generate code for a column field.
72
+ */
73
+ private generateColumnField;
74
+ /**
75
+ * Generate code for a relation field.
76
+ */
77
+ private generateRelationField;
78
+ /**
79
+ * Mark a field as deprecated in the source code.
80
+ */
81
+ private markFieldAsDeprecated;
82
+ /**
83
+ * Build Field decorator options string.
84
+ */
85
+ private buildFieldOptions;
86
+ /**
87
+ * Format type for description.
88
+ */
89
+ private formatTypeDescription;
90
+ /**
91
+ * Get relation decorator name.
92
+ */
93
+ private getRelationDecoratorName;
94
+ /**
95
+ * Default property name transformer (delegates to shared utility).
96
+ */
97
+ private defaultPropertyNameTransformer;
98
+ /**
99
+ * Convert to PascalCase (delegates to shared utility).
100
+ */
101
+ private toPascalCase;
102
+ /**
103
+ * Singularize (delegates to shared utility).
104
+ */
105
+ private singularize;
106
+ }
107
+ /**
108
+ * Create an EntityMerger instance.
109
+ */
110
+ export declare function createEntityMerger(options?: EntityMergerOptions): EntityMerger;
111
+ //# sourceMappingURL=entityMerger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entityMerger.d.ts","sourceRoot":"","sources":["../../../src/migrate/codegen/entityMerger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAiB,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,+DAA+D;IAC/D,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,uCAAuC;IACvC,uBAAuB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;CAC1D;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oCAAoC;IACpC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;gBAE5C,OAAO,GAAE,mBAAwB;IAQ7C;;OAEG;IACH,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,iBAAiB,GAAE,gBAAgB,EAAO,GAAG,WAAW;IA6C/G;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6C1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA6B3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA+B7B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAwB7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2BzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAY7B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAQhC;;OAEG;IACH,OAAO,CAAC,8BAA8B;IAItC;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,OAAO,CAAC,WAAW;CAGpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,YAAY,CAE9E"}