ormbridge 0.7.0 → 0.9.0
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/README.md +2 -0
- package/dist/cliRunner.js +9 -7
- package/dist/cliRunner.js.map +1 -1
- package/dist/config.d.ts +8 -4
- package/dist/config.js +3 -3
- package/dist/config.js.map +1 -1
- package/dist/emitters/efcore.d.ts +40 -0
- package/dist/emitters/efcore.js +686 -0
- package/dist/emitters/efcore.js.map +1 -0
- package/dist/emitters/efcoreColumns.d.ts +75 -0
- package/dist/emitters/efcoreColumns.js +492 -0
- package/dist/emitters/efcoreColumns.js.map +1 -0
- package/dist/emitters/efcoreNames.d.ts +30 -0
- package/dist/emitters/efcoreNames.js +268 -0
- package/dist/emitters/efcoreNames.js.map +1 -0
- package/dist/emitters/efcoreRender.d.ts +2 -0
- package/dist/emitters/efcoreRender.js +570 -0
- package/dist/emitters/efcoreRender.js.map +1 -0
- package/dist/emitters/efcoreTypes.d.ts +114 -0
- package/dist/emitters/efcoreTypes.js +2 -0
- package/dist/emitters/efcoreTypes.js.map +1 -0
- package/dist/emitters/sequelize.d.ts +35 -0
- package/dist/emitters/sequelize.js +1276 -0
- package/dist/emitters/sequelize.js.map +1 -0
- package/dist/formats.d.ts +12 -8
- package/dist/formats.js +72 -4
- package/dist/formats.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/io.js +53 -1
- package/dist/io.js.map +1 -1
- package/dist/parsers/csharpChains.d.ts +36 -0
- package/dist/parsers/csharpChains.js +157 -0
- package/dist/parsers/csharpChains.js.map +1 -0
- package/dist/parsers/csharpDeclarations.d.ts +3 -0
- package/dist/parsers/csharpDeclarations.js +293 -0
- package/dist/parsers/csharpDeclarations.js.map +1 -0
- package/dist/parsers/csharpSyntax.d.ts +130 -0
- package/dist/parsers/csharpSyntax.js +339 -0
- package/dist/parsers/csharpSyntax.js.map +1 -0
- package/dist/parsers/efcore.d.ts +17 -0
- package/dist/parsers/efcore.js +265 -0
- package/dist/parsers/efcore.js.map +1 -0
- package/dist/parsers/efcoreAnnotations.d.ts +19 -0
- package/dist/parsers/efcoreAnnotations.js +293 -0
- package/dist/parsers/efcoreAnnotations.js.map +1 -0
- package/dist/parsers/efcoreBuild.d.ts +13 -0
- package/dist/parsers/efcoreBuild.js +523 -0
- package/dist/parsers/efcoreBuild.js.map +1 -0
- package/dist/parsers/efcoreEntities.d.ts +13 -0
- package/dist/parsers/efcoreEntities.js +468 -0
- package/dist/parsers/efcoreEntities.js.map +1 -0
- package/dist/parsers/efcoreFields.d.ts +22 -0
- package/dist/parsers/efcoreFields.js +285 -0
- package/dist/parsers/efcoreFields.js.map +1 -0
- package/dist/parsers/efcoreFluent.d.ts +47 -0
- package/dist/parsers/efcoreFluent.js +375 -0
- package/dist/parsers/efcoreFluent.js.map +1 -0
- package/dist/parsers/efcoreModel.d.ts +209 -0
- package/dist/parsers/efcoreModel.js +2 -0
- package/dist/parsers/efcoreModel.js.map +1 -0
- package/dist/parsers/efcoreRelations.d.ts +46 -0
- package/dist/parsers/efcoreRelations.js +317 -0
- package/dist/parsers/efcoreRelations.js.map +1 -0
- package/dist/parsers/efcoreSteps.d.ts +89 -0
- package/dist/parsers/efcoreSteps.js +793 -0
- package/dist/parsers/efcoreSteps.js.map +1 -0
- package/dist/parsers/efcoreTypes.d.ts +35 -0
- package/dist/parsers/efcoreTypes.js +404 -0
- package/dist/parsers/efcoreTypes.js.map +1 -0
- package/dist/parsers/sequelize.d.ts +15 -0
- package/dist/parsers/sequelize.js +906 -0
- package/dist/parsers/sequelize.js.map +1 -0
- package/dist/parsers/sequelizeAssociations.d.ts +45 -0
- package/dist/parsers/sequelizeAssociations.js +449 -0
- package/dist/parsers/sequelizeAssociations.js.map +1 -0
- package/dist/parsers/sequelizeCollect.d.ts +33 -0
- package/dist/parsers/sequelizeCollect.js +1298 -0
- package/dist/parsers/sequelizeCollect.js.map +1 -0
- package/dist/parsers/sequelizeInflection.d.ts +14 -0
- package/dist/parsers/sequelizeInflection.js +451 -0
- package/dist/parsers/sequelizeInflection.js.map +1 -0
- package/dist/parsers/sequelizeModel.d.ts +185 -0
- package/dist/parsers/sequelizeModel.js +2 -0
- package/dist/parsers/sequelizeModel.js.map +1 -0
- package/dist/parsers/sequelizeTypes.d.ts +24 -0
- package/dist/parsers/sequelizeTypes.js +248 -0
- package/dist/parsers/sequelizeTypes.js.map +1 -0
- package/dist/styles.d.ts +18 -0
- package/dist/styles.js +43 -0
- package/dist/styles.js.map +1 -0
- package/package.json +4 -1
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
import { toCamelCase, toSnakeCase } from '../naming.js';
|
|
2
|
+
import { scalarsOf } from './efcoreEntities.js';
|
|
3
|
+
import { buildField, columnNameOf, irFieldName, } from './efcoreFields.js';
|
|
4
|
+
import { findScalar, isNullableMember, keyOf, } from './efcoreRelations.js';
|
|
5
|
+
import { deleteBehavior } from './efcoreTypes.js';
|
|
6
|
+
const INDEX_METHODS = {
|
|
7
|
+
btree: 'BTree',
|
|
8
|
+
hash: 'Hash',
|
|
9
|
+
gin: 'Gin',
|
|
10
|
+
gist: 'Gist',
|
|
11
|
+
spgist: 'SpGist',
|
|
12
|
+
brin: 'BRIN',
|
|
13
|
+
};
|
|
14
|
+
/** Merges the derived entities of a table-per-hierarchy into their root, making their columns nullable. */
|
|
15
|
+
export function mergeHierarchies(infos, warn) {
|
|
16
|
+
const byName = new Map(infos.map((info) => [info.name, info]));
|
|
17
|
+
const roots = [];
|
|
18
|
+
for (const info of infos) {
|
|
19
|
+
if (info.root !== info.name) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (info.derived.length === 0) {
|
|
23
|
+
roots.push(info);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const members = [...info.members];
|
|
27
|
+
for (const name of info.derived) {
|
|
28
|
+
const derived = byName.get(name);
|
|
29
|
+
if (derived === undefined) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
for (const member of derived.members) {
|
|
33
|
+
if (member.kind === 'scalar') {
|
|
34
|
+
if (!members.some((item) => item.kind === 'scalar' && item.path === member.path)) {
|
|
35
|
+
members.push({ ...member, forceNullable: true });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (!members.some((item) => item.kind === 'nav' && item.name === member.name)) {
|
|
39
|
+
members.push(member);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
warn(`${info.name}: ${info.derived.join(', ')} derive${info.derived.length === 1 ? 's' : ''} from ${info.name} in one table (table per hierarchy). The hierarchy was read as a single model with the columns of every type (those of the derived types nullable) and a discriminator column; derived types are not separate models.`);
|
|
44
|
+
roots.push({ ...info, members });
|
|
45
|
+
}
|
|
46
|
+
return roots;
|
|
47
|
+
}
|
|
48
|
+
function stripKeySuffix(name) {
|
|
49
|
+
const stripped = name.replace(/(?:Id|ID|_id)$/, '');
|
|
50
|
+
return stripped === '' ? name : stripped;
|
|
51
|
+
}
|
|
52
|
+
/** Default join table and column names EF Core uses for a skip navigation, to compare with the IR convention. */
|
|
53
|
+
function joinNames(link) {
|
|
54
|
+
const join = link.join;
|
|
55
|
+
const leftKey = keyOf(link.left)[0] ?? 'Id';
|
|
56
|
+
const rightKey = keyOf(link.right)[0] ?? 'Id';
|
|
57
|
+
const sorted = link.left.name <= link.right.name
|
|
58
|
+
? [link.left.name, link.right.name]
|
|
59
|
+
: [link.right.name, link.left.name];
|
|
60
|
+
return {
|
|
61
|
+
table: join?.table ?? join?.entityName ?? `${sorted[0]}${sorted[1]}`,
|
|
62
|
+
left: join?.leftColumn ?? `${link.rightNav?.name ?? link.left.name}${leftKey}`,
|
|
63
|
+
right: join?.rightColumn ??
|
|
64
|
+
`${link.leftNav?.name ?? link.right.name}${rightKey}`,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/** Assembles the IR from the entities and their relationships. */
|
|
68
|
+
export function buildSchema(infos, relationships, store, project, options) {
|
|
69
|
+
const warnings = project.warnings;
|
|
70
|
+
const warn = (message) => {
|
|
71
|
+
warnings.push(message);
|
|
72
|
+
};
|
|
73
|
+
const usedEnums = new Map();
|
|
74
|
+
const models = [];
|
|
75
|
+
for (const info of infos) {
|
|
76
|
+
const config = info.config;
|
|
77
|
+
const place = info.name;
|
|
78
|
+
const keyNames = keyOf(info);
|
|
79
|
+
const scalars = scalarsOf(info);
|
|
80
|
+
const fieldContext = {
|
|
81
|
+
project,
|
|
82
|
+
info,
|
|
83
|
+
keyNames,
|
|
84
|
+
warn,
|
|
85
|
+
};
|
|
86
|
+
// Columns ------------------------------------------------------------------------
|
|
87
|
+
const built = scalars.map((member) => buildField(member, fieldContext, project.enums));
|
|
88
|
+
for (const item of built) {
|
|
89
|
+
const definition = item.enumDefinition;
|
|
90
|
+
if (definition === undefined) {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const known = usedEnums.get(definition.name);
|
|
94
|
+
if (known === undefined) {
|
|
95
|
+
usedEnums.set(definition.name, definition);
|
|
96
|
+
}
|
|
97
|
+
else if (known.values.some((value, position) => value.dbValue !== definition.values[position]?.dbValue)) {
|
|
98
|
+
// One C# enum stored as text in one column and as a number in another: the IR has one enum per name.
|
|
99
|
+
warn(`${place}.${item.member.name}: the enum ${definition.name} is stored differently in different columns (text and integer); the IR keeps one definition, with the text values.`);
|
|
100
|
+
if (definition.values.every((value) => value.dbValue === value.name)) {
|
|
101
|
+
usedEnums.set(definition.name, definition);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Table-per-hierarchy discriminator ----------------------------------------------------
|
|
106
|
+
if (info.derived.length > 0) {
|
|
107
|
+
const discriminator = config.discriminator;
|
|
108
|
+
const column = discriminator?.column ?? 'Discriminator';
|
|
109
|
+
const exists = built.some((item) => item.member.path.toLowerCase() === column.toLowerCase());
|
|
110
|
+
if (!exists) {
|
|
111
|
+
const isInteger = /^(int|Int32|long|byte|short)$/.test(discriminator?.type ?? '');
|
|
112
|
+
built.push({
|
|
113
|
+
member: {
|
|
114
|
+
kind: 'scalar',
|
|
115
|
+
path: column,
|
|
116
|
+
name: column,
|
|
117
|
+
type: {
|
|
118
|
+
name: 'string',
|
|
119
|
+
text: 'string',
|
|
120
|
+
args: [],
|
|
121
|
+
nullable: false,
|
|
122
|
+
arrayDepth: 0,
|
|
123
|
+
},
|
|
124
|
+
config: {},
|
|
125
|
+
declaredIn: info.name,
|
|
126
|
+
prefix: '',
|
|
127
|
+
forceNullable: false,
|
|
128
|
+
},
|
|
129
|
+
field: {
|
|
130
|
+
name: toCamelCase(column),
|
|
131
|
+
columnName: column,
|
|
132
|
+
type: isInteger ? 'int' : 'text',
|
|
133
|
+
isPrimaryKey: false,
|
|
134
|
+
isUnique: false,
|
|
135
|
+
isNullable: false,
|
|
136
|
+
isAutoUpdated: false,
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Relationships ---------------------------------------------------------------------
|
|
142
|
+
const irNames = new Map(built.map((item) => [
|
|
143
|
+
item.member.path,
|
|
144
|
+
item.field.name,
|
|
145
|
+
]));
|
|
146
|
+
const orderedRelations = [];
|
|
147
|
+
const compositeKeys = [];
|
|
148
|
+
const consumed = new Set();
|
|
149
|
+
const relationNameOf = new Map();
|
|
150
|
+
const takenNames = new Set(built.map((item) => item.field.name));
|
|
151
|
+
const memberOrder = (nav) => nav === undefined
|
|
152
|
+
? info.members.length + orderedRelations.length
|
|
153
|
+
: info.members.findIndex((member) => member === nav);
|
|
154
|
+
const unique = uniqueColumns(config);
|
|
155
|
+
for (const link of relationships.links) {
|
|
156
|
+
if (link.dependent !== info) {
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
const principal = link.principal;
|
|
160
|
+
const members = link.foreignKey.map((name) => findScalar(info, name));
|
|
161
|
+
const location = `${info.name}.${link.dependentNav?.name ?? link.foreignKey.join('+')}`;
|
|
162
|
+
const baseName = link.dependentNav !== undefined
|
|
163
|
+
? toCamelCase(link.dependentNav.name)
|
|
164
|
+
: toCamelCase(link.isShadow || members[0] === undefined
|
|
165
|
+
? principal.name
|
|
166
|
+
: stripKeySuffix(members[0].name));
|
|
167
|
+
let relationName = baseName;
|
|
168
|
+
while (takenNames.has(relationName) &&
|
|
169
|
+
!(members.length === 1 &&
|
|
170
|
+
irNames.get(members[0]?.path ?? '') === relationName)) {
|
|
171
|
+
relationName = `${relationName}Ref`;
|
|
172
|
+
}
|
|
173
|
+
const principalKeyMembers = link.principalKey.map((name) => findScalar(principal, name));
|
|
174
|
+
const required = isRequiredLink(link, members, info, project);
|
|
175
|
+
const requestedAction = link.onDelete;
|
|
176
|
+
// EF Core's default is Cascade for a required relationship and ClientSetNull for an optional one.
|
|
177
|
+
let onDelete = required ? 'cascade' : 'noAction';
|
|
178
|
+
if (requestedAction !== undefined) {
|
|
179
|
+
const mapped = deleteBehavior(requestedAction);
|
|
180
|
+
if (mapped === undefined) {
|
|
181
|
+
warn(`${location}: the delete behavior ${requestedAction} is not known; the default for ${required ? 'a required' : 'an optional'} relationship was used.`);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
onDelete = mapped;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const relatedName = link.principalNav === undefined
|
|
188
|
+
? undefined
|
|
189
|
+
: toCamelCase(link.principalNav.name);
|
|
190
|
+
const firstKey = members[0];
|
|
191
|
+
const fkIsKey = members.length === 1 &&
|
|
192
|
+
firstKey !== undefined &&
|
|
193
|
+
keyNames.length === 1 &&
|
|
194
|
+
keyNames[0] === firstKey.path;
|
|
195
|
+
const isUnique = link.isOneToOne ||
|
|
196
|
+
fkIsKey ||
|
|
197
|
+
(members.length === 1 &&
|
|
198
|
+
firstKey !== undefined &&
|
|
199
|
+
unique.has(firstKey.path));
|
|
200
|
+
const kind = isUnique
|
|
201
|
+
? 'oneToOne'
|
|
202
|
+
: 'foreignKey';
|
|
203
|
+
const constraintName = link.constraintName;
|
|
204
|
+
if (members.length > 1) {
|
|
205
|
+
const missing = members.some((member) => member === undefined) || link.isShadow;
|
|
206
|
+
if (missing) {
|
|
207
|
+
warn(`${location}: a composite foreign key made of shadow properties cannot be represented; the relationship was skipped.`);
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
compositeKeys.push({
|
|
211
|
+
name: relationName,
|
|
212
|
+
targetModel: principal.name,
|
|
213
|
+
fields: members.map((member) => irNames.get(member?.path ?? '') ?? ''),
|
|
214
|
+
references: principalKeyMembers.map((member, index) => member === undefined
|
|
215
|
+
? toCamelCase(link.principalKey[index] ?? '')
|
|
216
|
+
: irFieldName(member)),
|
|
217
|
+
kind,
|
|
218
|
+
isNullable: !required,
|
|
219
|
+
onDelete,
|
|
220
|
+
...(relatedName === undefined ? {} : { relatedName }),
|
|
221
|
+
...(constraintName === undefined ? {} : { constraintName }),
|
|
222
|
+
});
|
|
223
|
+
takenNames.add(relationName);
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
const columnName = firstKey === undefined
|
|
227
|
+
? (link.foreignKey[0] ?? relationName)
|
|
228
|
+
: columnNameOf(firstKey);
|
|
229
|
+
const principalIsKey = link.principalKey.length === keyOf(principal).length &&
|
|
230
|
+
link.principalKey.every((name, index) => keyOf(principal)[index] === name);
|
|
231
|
+
const referenced = principalKeyMembers[0];
|
|
232
|
+
const relation = {
|
|
233
|
+
name: relationName,
|
|
234
|
+
kind,
|
|
235
|
+
targetModel: principal.name,
|
|
236
|
+
columnName,
|
|
237
|
+
isNullable: fkIsKey ? false : !required,
|
|
238
|
+
onDelete,
|
|
239
|
+
...(relatedName === undefined ? {} : { relatedName }),
|
|
240
|
+
...(principalIsKey || referenced === undefined
|
|
241
|
+
? {}
|
|
242
|
+
: { toField: columnNameOf(referenced) }),
|
|
243
|
+
...(fkIsKey ? { isPrimaryKey: true } : {}),
|
|
244
|
+
...(constraintName === undefined ? {} : { constraintName }),
|
|
245
|
+
};
|
|
246
|
+
orderedRelations.push({
|
|
247
|
+
order: memberOrder(link.dependentNav),
|
|
248
|
+
value: relation,
|
|
249
|
+
});
|
|
250
|
+
takenNames.add(relationName);
|
|
251
|
+
if (firstKey !== undefined) {
|
|
252
|
+
consumed.add(firstKey.path);
|
|
253
|
+
relationNameOf.set(firstKey.path, relationName);
|
|
254
|
+
}
|
|
255
|
+
else if (link.foreignKey[0] !== undefined) {
|
|
256
|
+
relationNameOf.set(link.foreignKey[0], relationName);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// Many-to-many ---------------------------------------------------------------------------
|
|
260
|
+
for (const link of relationships.manyToMany) {
|
|
261
|
+
if (link.left !== info) {
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
const nav = link.leftNav;
|
|
265
|
+
if (link.join?.entityClass !== undefined) {
|
|
266
|
+
warn(`${info.name}.${nav?.name ?? '?'}: the skip navigation through the join entity ${link.join.entityClass} is read as that entity and its relationships; no separate many-to-many relation was added.`);
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
const relationName = toCamelCase(nav?.name ?? `${link.right.name}s`);
|
|
270
|
+
const relation = {
|
|
271
|
+
name: relationName,
|
|
272
|
+
kind: 'manyToMany',
|
|
273
|
+
targetModel: link.right.name,
|
|
274
|
+
columnName: `${toSnakeCase(relationName)}_id`,
|
|
275
|
+
isNullable: false,
|
|
276
|
+
onDelete: 'cascade',
|
|
277
|
+
...(link.rightNav === undefined
|
|
278
|
+
? {}
|
|
279
|
+
: { relatedName: toCamelCase(link.rightNav.name) }),
|
|
280
|
+
};
|
|
281
|
+
orderedRelations.push({ order: memberOrder(nav), value: relation });
|
|
282
|
+
takenNames.add(relationName);
|
|
283
|
+
const actual = joinNames(link);
|
|
284
|
+
const isSelf = link.left === link.right;
|
|
285
|
+
const expectedTable = `${tableNameOf(info, store)}_${relationName}`;
|
|
286
|
+
const expectedLeft = `${isSelf ? 'from_' : ''}${toSnakeCase(link.left.name)}_id`;
|
|
287
|
+
const expectedRight = `${isSelf ? 'to_' : ''}${toSnakeCase(link.right.name)}_id`;
|
|
288
|
+
if (actual.table !== expectedTable ||
|
|
289
|
+
actual.left !== expectedLeft ||
|
|
290
|
+
actual.right !== expectedRight) {
|
|
291
|
+
warn(`${info.name}.${nav?.name ?? '?'}: the join table "${actual.table}" (columns ${actual.left}, ${actual.right}) is not preserved by name; ` +
|
|
292
|
+
`formats that derive join tables will use "${expectedTable}" (columns ${expectedLeft}, ${expectedRight}).`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// Fields ---------------------------------------------------------------------------------
|
|
296
|
+
const fields = built
|
|
297
|
+
.filter((item) => !consumed.has(item.member.path))
|
|
298
|
+
.map((item) => item.field);
|
|
299
|
+
const fieldOf = (path) => {
|
|
300
|
+
const item = built.find((candidate) => candidate.member.path === path);
|
|
301
|
+
return item === undefined
|
|
302
|
+
? undefined
|
|
303
|
+
: fields.find((field) => field === item.field);
|
|
304
|
+
};
|
|
305
|
+
const irNameFor = (path) => {
|
|
306
|
+
const relationName = relationNameOf.get(path);
|
|
307
|
+
if (relationName !== undefined) {
|
|
308
|
+
return relationName;
|
|
309
|
+
}
|
|
310
|
+
return irNames.get(path);
|
|
311
|
+
};
|
|
312
|
+
// Primary key ------------------------------------------------------------------------------
|
|
313
|
+
let compositePrimaryKey;
|
|
314
|
+
if (keyNames.length === 0) {
|
|
315
|
+
if (config.keyless || config.viewName !== undefined) {
|
|
316
|
+
if (config.viewName === undefined) {
|
|
317
|
+
warn(`${place}: the entity has no key (HasNoKey); other formats expect every model to have a primary key.`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
warn(`${place}: the entity has no primary key (EF Core looks for a property called Id or ${info.name}Id, or a [Key] / HasKey); other formats expect every model to have one.`);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
for (const name of keyNames) {
|
|
326
|
+
if (findScalar(info, name) === undefined) {
|
|
327
|
+
warn(`${place}: the key property "${name}" is not a mapped property of the entity.`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (keyNames.length > 1) {
|
|
331
|
+
compositePrimaryKey = keyNames
|
|
332
|
+
.map((name) => irNameFor(name) ?? toCamelCase(name))
|
|
333
|
+
.filter((name) => name !== '');
|
|
334
|
+
for (const name of keyNames) {
|
|
335
|
+
const field = fieldOf(name);
|
|
336
|
+
if (field !== undefined) {
|
|
337
|
+
field.isPrimaryKey = false;
|
|
338
|
+
field.isUnique = false;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
for (const relation of orderedRelations) {
|
|
342
|
+
delete relation.value.isPrimaryKey;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Indexes ---------------------------------------------------------------------------------
|
|
347
|
+
const irIndexes = [];
|
|
348
|
+
const seen = new Set();
|
|
349
|
+
for (const index of allIndexes(info, store)) {
|
|
350
|
+
const names = [];
|
|
351
|
+
let skip = false;
|
|
352
|
+
for (const member of index.members) {
|
|
353
|
+
const name = irNameFor(member);
|
|
354
|
+
if (name === undefined) {
|
|
355
|
+
warn(`${place}: the index${index.name === undefined ? '' : ` "${index.name}"`} refers to "${member}", which is not a mapped property; it was skipped.`);
|
|
356
|
+
skip = true;
|
|
357
|
+
break;
|
|
358
|
+
}
|
|
359
|
+
names.push(name);
|
|
360
|
+
}
|
|
361
|
+
if (skip || names.length === 0) {
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
const signature = `${index.unique ? 'u' : 'i'}|${names.join(',')}|${index.name ?? ''}`;
|
|
365
|
+
if (seen.has(signature)) {
|
|
366
|
+
continue;
|
|
367
|
+
}
|
|
368
|
+
seen.add(signature);
|
|
369
|
+
const label = index.name === undefined ? '' : ` "${index.name}"`;
|
|
370
|
+
if (index.hasFilter) {
|
|
371
|
+
warn(`${place}: the index${label} has a filter (a partial index), which is not preserved; it was read as a full index.`);
|
|
372
|
+
}
|
|
373
|
+
if (index.hasInclude) {
|
|
374
|
+
warn(`${place}: the index${label} includes extra columns (IncludeProperties), which are not preserved.`);
|
|
375
|
+
}
|
|
376
|
+
const method = index.method === undefined
|
|
377
|
+
? undefined
|
|
378
|
+
: INDEX_METHODS[index.method.toLowerCase()];
|
|
379
|
+
if (index.method !== undefined && method === undefined) {
|
|
380
|
+
warn(`${place}: the index method "${index.method}" has no equivalent and was ignored.`);
|
|
381
|
+
}
|
|
382
|
+
const fieldOptions = {};
|
|
383
|
+
index.descending.forEach((flag, position) => {
|
|
384
|
+
const name = names[position];
|
|
385
|
+
if (flag && name !== undefined) {
|
|
386
|
+
fieldOptions[name] = { sort: 'desc' };
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
const only = names[0];
|
|
390
|
+
if (names.length === 1 &&
|
|
391
|
+
only !== undefined &&
|
|
392
|
+
index.unique &&
|
|
393
|
+
index.name === undefined &&
|
|
394
|
+
method === undefined &&
|
|
395
|
+
Object.keys(fieldOptions).length === 0) {
|
|
396
|
+
const member = index.members[0];
|
|
397
|
+
const field = member === undefined ? undefined : fieldOf(member);
|
|
398
|
+
if (field !== undefined) {
|
|
399
|
+
if (!field.isPrimaryKey) {
|
|
400
|
+
field.isUnique = true;
|
|
401
|
+
}
|
|
402
|
+
continue;
|
|
403
|
+
}
|
|
404
|
+
if (member !== undefined && consumed.has(member)) {
|
|
405
|
+
// The unique key is a foreign key: the relation is one-to-one.
|
|
406
|
+
continue;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
irIndexes.push({
|
|
410
|
+
fields: names,
|
|
411
|
+
isUnique: index.unique,
|
|
412
|
+
...(index.name === undefined ? {} : { name: index.name }),
|
|
413
|
+
...(method === undefined ? {} : { method }),
|
|
414
|
+
...(Object.keys(fieldOptions).length === 0 ? {} : { fieldOptions }),
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
// Settings that have no equivalent ---------------------------------------------------------
|
|
418
|
+
const comments = [];
|
|
419
|
+
if (config.comment !== undefined) {
|
|
420
|
+
comments.push('the table');
|
|
421
|
+
}
|
|
422
|
+
const nonUnicode = [];
|
|
423
|
+
for (const item of built) {
|
|
424
|
+
if (item.member.config.isUnicode === false) {
|
|
425
|
+
nonUnicode.push(item.member.name);
|
|
426
|
+
}
|
|
427
|
+
if (item.member.config.comment !== undefined) {
|
|
428
|
+
comments.push(item.member.name);
|
|
429
|
+
}
|
|
430
|
+
if (item.member.config.isRowVersion === true ||
|
|
431
|
+
item.member.config.isConcurrencyToken === true) {
|
|
432
|
+
warn(`${place}.${item.member.name}: the ${item.member.config.isRowVersion === true ? 'row version ([Timestamp] / IsRowVersion)' : 'concurrency token'} has no equivalent in the shared model; it was read as an ordinary column.`);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
if (nonUnicode.length > 0) {
|
|
436
|
+
warn(`${place}: the columns ${nonUnicode.join(', ')} are not Unicode (varchar instead of nvarchar); the shared model does not tell the two apart.`);
|
|
437
|
+
}
|
|
438
|
+
if (comments.length > 0) {
|
|
439
|
+
warn(`${place}: comments (${comments.join(', ')}) are not preserved.`);
|
|
440
|
+
}
|
|
441
|
+
for (const constraint of config.checkConstraints) {
|
|
442
|
+
warn(`${place}: the check constraint "${constraint}" has no equivalent in the shared model and was dropped.`);
|
|
443
|
+
}
|
|
444
|
+
if (config.hasData) {
|
|
445
|
+
warn(`${place}: seed data (HasData) is not preserved.`);
|
|
446
|
+
}
|
|
447
|
+
if (config.hasQueryFilter) {
|
|
448
|
+
warn(`${place}: the global query filter (HasQueryFilter) is not schema and was ignored.`);
|
|
449
|
+
}
|
|
450
|
+
for (const derived of info.derived) {
|
|
451
|
+
const derivedConfig = store.entity(derived);
|
|
452
|
+
if (derivedConfig?.hasData === true) {
|
|
453
|
+
warn(`${derived}: seed data (HasData) is not preserved.`);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
const relations = [...orderedRelations]
|
|
457
|
+
.sort((first, second) => first.order - second.order)
|
|
458
|
+
.map((entry) => entry.value);
|
|
459
|
+
const isView = config.viewName !== undefined;
|
|
460
|
+
const schema = config.schema ?? store.defaultSchema;
|
|
461
|
+
models.push({
|
|
462
|
+
name: info.name,
|
|
463
|
+
tableName: tableNameOf(info, store),
|
|
464
|
+
appLabel: options.appLabel,
|
|
465
|
+
fields,
|
|
466
|
+
relations,
|
|
467
|
+
indexes: irIndexes,
|
|
468
|
+
...(compositePrimaryKey === undefined ? {} : { compositePrimaryKey }),
|
|
469
|
+
...(compositeKeys.length === 0
|
|
470
|
+
? {}
|
|
471
|
+
: { compositeForeignKeys: compositeKeys }),
|
|
472
|
+
...(isView ? { isView: true } : {}),
|
|
473
|
+
...(schema === undefined ? {} : { schema }),
|
|
474
|
+
...(config.keyName === undefined
|
|
475
|
+
? {}
|
|
476
|
+
: { primaryKeyName: config.keyName }),
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
return { models, enums: [...usedEnums.values()], warnings };
|
|
480
|
+
}
|
|
481
|
+
/** The table (or view) name: ToTable / [Table], else the DbSet property name, else the type name. */
|
|
482
|
+
export function tableNameOf(info, store) {
|
|
483
|
+
return (info.config.viewName ??
|
|
484
|
+
info.config.table ??
|
|
485
|
+
store.project.dbSets.get(info.name) ??
|
|
486
|
+
info.name);
|
|
487
|
+
}
|
|
488
|
+
/** The paths of single properties that carry a unique index or alternate key without a name. */
|
|
489
|
+
function uniqueColumns(config) {
|
|
490
|
+
const paths = new Set();
|
|
491
|
+
for (const index of config.indexes) {
|
|
492
|
+
const only = index.members[0];
|
|
493
|
+
if (index.unique && index.members.length === 1 && only !== undefined) {
|
|
494
|
+
paths.add(only);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
return paths;
|
|
498
|
+
}
|
|
499
|
+
/** The indexes of an entity and of the entities merged into it. */
|
|
500
|
+
function allIndexes(info, store) {
|
|
501
|
+
const configs = [
|
|
502
|
+
info.config,
|
|
503
|
+
...info.derived.map((name) => store.entity(name)),
|
|
504
|
+
];
|
|
505
|
+
return configs.flatMap((config) => config?.indexes ?? []);
|
|
506
|
+
}
|
|
507
|
+
/** Whether the relationship is required: configured, or implied by the foreign key and navigation nullability. */
|
|
508
|
+
function isRequiredLink(link, members, info, project) {
|
|
509
|
+
if (link.required !== undefined) {
|
|
510
|
+
return link.required;
|
|
511
|
+
}
|
|
512
|
+
const enumNames = new Set(project.enums.keys());
|
|
513
|
+
if (!link.isShadow) {
|
|
514
|
+
return members.every((member) => member !== undefined &&
|
|
515
|
+
!isNullableMember(member, info.nullableRefs, enumNames));
|
|
516
|
+
}
|
|
517
|
+
const nav = link.dependentNav;
|
|
518
|
+
if (nav === undefined) {
|
|
519
|
+
return false;
|
|
520
|
+
}
|
|
521
|
+
return nav.requiredAttr || (info.nullableRefs && !nav.nullable);
|
|
522
|
+
}
|
|
523
|
+
//# sourceMappingURL=efcoreBuild.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"efcoreBuild.js","sourceRoot":"","sources":["../../src/parsers/efcoreBuild.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type CsClass } from './csharpSyntax.js';
|
|
2
|
+
import type { ConfigStore } from './efcoreFluent.js';
|
|
3
|
+
import type { EntityInfo, NavMember, Project, ScalarMember } from './efcoreModel.js';
|
|
4
|
+
/** A class and its ancestors in the input, base first. */
|
|
5
|
+
export declare function classChain(cls: CsClass, project: Project): CsClass[];
|
|
6
|
+
/** Adds the navigation targets of every entity to the store until no new entity appears. */
|
|
7
|
+
export declare function expandEntities(store: ConfigStore, project: Project, enumNames: ReadonlySet<string>): void;
|
|
8
|
+
/** Reads the mapped members of every entity and groups table-per-hierarchy inheritance under its root. */
|
|
9
|
+
export declare function buildEntities(store: ConfigStore, project: Project, enumNames: ReadonlySet<string>): EntityInfo[];
|
|
10
|
+
/** Names the mapped scalar members of an entity. */
|
|
11
|
+
export declare function scalarsOf(info: EntityInfo): ScalarMember[];
|
|
12
|
+
/** Names the navigations of an entity. */
|
|
13
|
+
export declare function navsOf(info: EntityInfo): NavMember[];
|