@mikro-orm/entity-generator 7.0.0-dev.166 → 7.0.0-dev.168
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/EntityGenerator.d.ts +1 -0
- package/EntityGenerator.js +65 -0
- package/SourceFile.js +2 -2
- package/package.json +3 -3
- package/tsconfig.build.tsbuildinfo +1 -1
package/EntityGenerator.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export declare class EntityGenerator {
|
|
|
14
14
|
static register(orm: MikroORM): void;
|
|
15
15
|
generate(options?: GenerateOptions): Promise<string[]>;
|
|
16
16
|
private getEntityMetadata;
|
|
17
|
+
private cleanUpReferentialIntegrityRules;
|
|
17
18
|
private matchName;
|
|
18
19
|
private detectManyToManyRelations;
|
|
19
20
|
private generateBidirectionalRelations;
|
package/EntityGenerator.js
CHANGED
|
@@ -119,6 +119,7 @@ export class EntityGenerator {
|
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
this.detectManyToManyRelations(metadata, options.onlyPurePivotTables, options.readOnlyPivotTables, options.outputPurePivotTables);
|
|
122
|
+
this.cleanUpReferentialIntegrityRules(metadata);
|
|
122
123
|
if (options.bidirectionalRelations) {
|
|
123
124
|
this.generateBidirectionalRelations(metadata, options.outputPurePivotTables);
|
|
124
125
|
}
|
|
@@ -134,6 +135,60 @@ export class EntityGenerator {
|
|
|
134
135
|
await options.onProcessedMetadata?.(metadata, this.platform);
|
|
135
136
|
return metadata;
|
|
136
137
|
}
|
|
138
|
+
cleanUpReferentialIntegrityRules(metadata) {
|
|
139
|
+
// Clear FK rules that match defaults for:
|
|
140
|
+
// 1. FK-as-PK entities (all PKs are FKs) - cascade for both update and delete
|
|
141
|
+
// 2. Fixed-order pivot tables (autoincrement id + 2 FK relations only) - cascade for both
|
|
142
|
+
// 3. Relations to composite PK targets - cascade for update
|
|
143
|
+
for (const meta of metadata) {
|
|
144
|
+
const pks = meta.getPrimaryProps();
|
|
145
|
+
const fkPks = pks.filter(pk => pk.kind !== ReferenceKind.SCALAR);
|
|
146
|
+
// Case 1: All PKs are FKs - default is cascade for both update and delete
|
|
147
|
+
if (fkPks.length > 0 && fkPks.length === pks.length) {
|
|
148
|
+
for (const pk of fkPks) {
|
|
149
|
+
if (pk.deleteRule === 'cascade') {
|
|
150
|
+
delete pk.deleteRule;
|
|
151
|
+
}
|
|
152
|
+
if (pk.updateRule === 'cascade') {
|
|
153
|
+
delete pk.updateRule;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Case 2: Fixed-order pivot table (single autoincrement id PK + exactly 2 M:1 relations)
|
|
158
|
+
const hasAutoIncrementPk = pks.length === 1 && pks[0].autoincrement;
|
|
159
|
+
const m2oRelations = meta.relations.filter(r => r.kind === ReferenceKind.MANY_TO_ONE);
|
|
160
|
+
if (hasAutoIncrementPk && m2oRelations.length === 2) {
|
|
161
|
+
// Check if all columns are either the PK or FK columns
|
|
162
|
+
const fkColumns = new Set(m2oRelations.flatMap(r => r.fieldNames));
|
|
163
|
+
const pkColumns = new Set(pks.flatMap(p => p.fieldNames));
|
|
164
|
+
const allColumns = new Set(meta.props.filter(p => p.persist !== false).flatMap(p => p.fieldNames));
|
|
165
|
+
const isPivotLike = [...allColumns].every(col => fkColumns.has(col) || pkColumns.has(col));
|
|
166
|
+
if (isPivotLike) {
|
|
167
|
+
for (const rel of m2oRelations) {
|
|
168
|
+
if (rel.updateRule === 'cascade') {
|
|
169
|
+
delete rel.updateRule;
|
|
170
|
+
}
|
|
171
|
+
if (rel.deleteRule === 'cascade') {
|
|
172
|
+
delete rel.deleteRule;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Case 3: Relations to composite PK targets - default is cascade for update
|
|
178
|
+
// Case 4: Nullable relations - default is set null for delete
|
|
179
|
+
for (const rel of meta.relations) {
|
|
180
|
+
if ([ReferenceKind.MANY_TO_ONE, ReferenceKind.ONE_TO_ONE].includes(rel.kind)) {
|
|
181
|
+
const targetMeta = metadata.find(m => m.className === rel.type);
|
|
182
|
+
if (targetMeta?.compositePK && rel.updateRule === 'cascade') {
|
|
183
|
+
delete rel.updateRule;
|
|
184
|
+
}
|
|
185
|
+
if (rel.nullable && rel.deleteRule === 'set null') {
|
|
186
|
+
delete rel.deleteRule;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
137
192
|
matchName(name, nameToMatch) {
|
|
138
193
|
return typeof nameToMatch === 'string'
|
|
139
194
|
? name.toLocaleLowerCase() === nameToMatch.toLocaleLowerCase()
|
|
@@ -204,6 +259,16 @@ export class EntityGenerator {
|
|
|
204
259
|
}
|
|
205
260
|
}
|
|
206
261
|
meta.pivotTable = true;
|
|
262
|
+
// Clear FK rules that match the default for pivot tables (cascade)
|
|
263
|
+
// so they don't get output explicitly in generated code
|
|
264
|
+
for (const rel of meta.relations) {
|
|
265
|
+
if (rel.updateRule === 'cascade') {
|
|
266
|
+
delete rel.updateRule;
|
|
267
|
+
}
|
|
268
|
+
if (rel.deleteRule === 'cascade') {
|
|
269
|
+
delete rel.deleteRule;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
207
272
|
const owner = metadata.find(m => m.className === meta.relations[0].type);
|
|
208
273
|
const name = this.namingStrategy.columnNameToProperty(meta.tableName.replace(new RegExp('^' + owner.tableName + '_'), ''));
|
|
209
274
|
const ownerProp = {
|
package/SourceFile.js
CHANGED
|
@@ -791,10 +791,10 @@ export class SourceFile {
|
|
|
791
791
|
if (prop.ownColumns && prop.ownColumns.length !== prop.fieldNames.length) {
|
|
792
792
|
options.referencedColumnNames = prop.referencedColumnNames.map(fieldName => this.quote(fieldName));
|
|
793
793
|
}
|
|
794
|
-
if (
|
|
794
|
+
if (prop.updateRule) {
|
|
795
795
|
options.updateRule = this.quote(prop.updateRule);
|
|
796
796
|
}
|
|
797
|
-
if (
|
|
797
|
+
if (prop.deleteRule) {
|
|
798
798
|
options.deleteRule = this.quote(prop.deleteRule);
|
|
799
799
|
}
|
|
800
800
|
if (prop.primary) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mikro-orm/entity-generator",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "7.0.0-dev.
|
|
4
|
+
"version": "7.0.0-dev.168",
|
|
5
5
|
"description": "TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JavaScript.",
|
|
6
6
|
"exports": {
|
|
7
7
|
"./package.json": "./package.json",
|
|
@@ -50,12 +50,12 @@
|
|
|
50
50
|
"access": "public"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@mikro-orm/sql": "7.0.0-dev.
|
|
53
|
+
"@mikro-orm/sql": "7.0.0-dev.168"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@mikro-orm/core": "^6.6.4"
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
|
-
"@mikro-orm/core": "7.0.0-dev.
|
|
59
|
+
"@mikro-orm/core": "7.0.0-dev.168"
|
|
60
60
|
}
|
|
61
61
|
}
|