ormbridge 0.8.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.
Files changed (71) hide show
  1. package/README.md +1 -0
  2. package/dist/cliRunner.js +3 -3
  3. package/dist/cliRunner.js.map +1 -1
  4. package/dist/config.d.ts +3 -2
  5. package/dist/config.js.map +1 -1
  6. package/dist/emitters/efcore.d.ts +40 -0
  7. package/dist/emitters/efcore.js +686 -0
  8. package/dist/emitters/efcore.js.map +1 -0
  9. package/dist/emitters/efcoreColumns.d.ts +75 -0
  10. package/dist/emitters/efcoreColumns.js +492 -0
  11. package/dist/emitters/efcoreColumns.js.map +1 -0
  12. package/dist/emitters/efcoreNames.d.ts +30 -0
  13. package/dist/emitters/efcoreNames.js +268 -0
  14. package/dist/emitters/efcoreNames.js.map +1 -0
  15. package/dist/emitters/efcoreRender.d.ts +2 -0
  16. package/dist/emitters/efcoreRender.js +570 -0
  17. package/dist/emitters/efcoreRender.js.map +1 -0
  18. package/dist/emitters/efcoreTypes.d.ts +114 -0
  19. package/dist/emitters/efcoreTypes.js +2 -0
  20. package/dist/emitters/efcoreTypes.js.map +1 -0
  21. package/dist/formats.d.ts +7 -4
  22. package/dist/formats.js +34 -0
  23. package/dist/formats.js.map +1 -1
  24. package/dist/index.d.ts +4 -0
  25. package/dist/index.js +2 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/io.js +25 -1
  28. package/dist/io.js.map +1 -1
  29. package/dist/parsers/csharpChains.d.ts +36 -0
  30. package/dist/parsers/csharpChains.js +157 -0
  31. package/dist/parsers/csharpChains.js.map +1 -0
  32. package/dist/parsers/csharpDeclarations.d.ts +3 -0
  33. package/dist/parsers/csharpDeclarations.js +293 -0
  34. package/dist/parsers/csharpDeclarations.js.map +1 -0
  35. package/dist/parsers/csharpSyntax.d.ts +130 -0
  36. package/dist/parsers/csharpSyntax.js +339 -0
  37. package/dist/parsers/csharpSyntax.js.map +1 -0
  38. package/dist/parsers/efcore.d.ts +17 -0
  39. package/dist/parsers/efcore.js +265 -0
  40. package/dist/parsers/efcore.js.map +1 -0
  41. package/dist/parsers/efcoreAnnotations.d.ts +19 -0
  42. package/dist/parsers/efcoreAnnotations.js +293 -0
  43. package/dist/parsers/efcoreAnnotations.js.map +1 -0
  44. package/dist/parsers/efcoreBuild.d.ts +13 -0
  45. package/dist/parsers/efcoreBuild.js +523 -0
  46. package/dist/parsers/efcoreBuild.js.map +1 -0
  47. package/dist/parsers/efcoreEntities.d.ts +13 -0
  48. package/dist/parsers/efcoreEntities.js +468 -0
  49. package/dist/parsers/efcoreEntities.js.map +1 -0
  50. package/dist/parsers/efcoreFields.d.ts +22 -0
  51. package/dist/parsers/efcoreFields.js +285 -0
  52. package/dist/parsers/efcoreFields.js.map +1 -0
  53. package/dist/parsers/efcoreFluent.d.ts +47 -0
  54. package/dist/parsers/efcoreFluent.js +375 -0
  55. package/dist/parsers/efcoreFluent.js.map +1 -0
  56. package/dist/parsers/efcoreModel.d.ts +209 -0
  57. package/dist/parsers/efcoreModel.js +2 -0
  58. package/dist/parsers/efcoreModel.js.map +1 -0
  59. package/dist/parsers/efcoreRelations.d.ts +46 -0
  60. package/dist/parsers/efcoreRelations.js +317 -0
  61. package/dist/parsers/efcoreRelations.js.map +1 -0
  62. package/dist/parsers/efcoreSteps.d.ts +89 -0
  63. package/dist/parsers/efcoreSteps.js +793 -0
  64. package/dist/parsers/efcoreSteps.js.map +1 -0
  65. package/dist/parsers/efcoreTypes.d.ts +35 -0
  66. package/dist/parsers/efcoreTypes.js +404 -0
  67. package/dist/parsers/efcoreTypes.js.map +1 -0
  68. package/dist/styles.d.ts +3 -2
  69. package/dist/styles.js +4 -1
  70. package/dist/styles.js.map +1 -1
  71. package/package.json +3 -1
@@ -0,0 +1,570 @@
1
+ import { csString, verbatim } from './efcoreNames.js';
2
+ /** Turns the plan of the EF Core emitter into C# files. */
3
+ const INDENT = ' ';
4
+ const MAX_LINE_WIDTH = 100;
5
+ /** The namespaces the generated code can use, by what in the text asks for them. */
6
+ const USINGS = [
7
+ [
8
+ /\b(Guid|DateTime|DateOnly|TimeOnly|TimeSpan|Array|ArgumentOutOfRangeException)\b/,
9
+ 'System',
10
+ ],
11
+ [/\b(ICollection|List|Dictionary)</, 'System.Collections.Generic'],
12
+ [/\[(Key|MaxLength)\b/, 'System.ComponentModel.DataAnnotations'],
13
+ [
14
+ /\[(Table|Column|ForeignKey|InverseProperty|DatabaseGenerated)\b/,
15
+ 'System.ComponentModel.DataAnnotations.Schema',
16
+ ],
17
+ [/\bIPAddress\b/, 'System.Net'],
18
+ [/\bCancellationToken\b/, 'System.Threading'],
19
+ [/\bTask</, 'System.Threading.Tasks'],
20
+ [
21
+ /\[(Index|PrimaryKey|Precision|Keyless)\b|\b(DbContext|DbContextOptions|DbSet|ModelBuilder|DeleteBehavior|EntityState|IEntityTypeConfiguration)\b/,
22
+ 'Microsoft.EntityFrameworkCore',
23
+ ],
24
+ [/\bEntityTypeBuilder\b/, 'Microsoft.EntityFrameworkCore.Metadata.Builders'],
25
+ [
26
+ /\bValueConverter\b/,
27
+ 'Microsoft.EntityFrameworkCore.Storage.ValueConversion',
28
+ ],
29
+ [/\bPropertySaveBehavior\b/, 'Microsoft.EntityFrameworkCore.Metadata'],
30
+ [/\bGuidValueGenerator\b/, 'Microsoft.EntityFrameworkCore.ValueGeneration'],
31
+ [/\bNpgsqlRange\b/, 'NpgsqlTypes'],
32
+ ];
33
+ function usingsOf(text) {
34
+ const code = text.replace(/"(?:[^"\\]|\\.)*"/g, '""');
35
+ return USINGS.filter(([pattern]) => pattern.test(code))
36
+ .map(([, name]) => name)
37
+ .sort((first, second) => {
38
+ const a = first.startsWith('System') ? 0 : 1;
39
+ const b = second.startsWith('System') ? 0 : 1;
40
+ return a !== b ? a - b : first < second ? -1 : first > second ? 1 : 0;
41
+ });
42
+ }
43
+ function fileText(plan, body) {
44
+ const usings = usingsOf(body.join('\n'));
45
+ const lines = [];
46
+ if (plan.header) {
47
+ lines.push('// <auto-generated>', '// Generated by ormbridge. Review the output before use.', '// </auto-generated>');
48
+ }
49
+ lines.push('#nullable enable');
50
+ lines.push(...usings.map((name) => `using ${name};`));
51
+ lines.push('', `namespace ${plan.namespace};`, '', ...body, '');
52
+ return lines.join('\n');
53
+ }
54
+ function indent(lines, levels = 1) {
55
+ const prefix = INDENT.repeat(levels);
56
+ return lines.map((line) => (line === '' ? line : `${prefix}${line}`));
57
+ }
58
+ /** Joins blocks of lines with a blank line between them. */
59
+ function separated(blocks) {
60
+ const lines = [];
61
+ for (const block of blocks) {
62
+ if (block.length === 0) {
63
+ continue;
64
+ }
65
+ if (lines.length > 0) {
66
+ lines.push('');
67
+ }
68
+ lines.push(...block);
69
+ }
70
+ return lines;
71
+ }
72
+ /** `head.a().b();` on one line when it fits, otherwise one call per line. */
73
+ function chain(head, calls) {
74
+ const single = `${head}${calls.map((call) => `.${call}`).join('')};`;
75
+ if (calls.length <= 1 ||
76
+ single.length + 3 * INDENT.length <= MAX_LINE_WIDTH) {
77
+ return [single];
78
+ }
79
+ return [
80
+ head,
81
+ ...calls.map((call, position) => `${INDENT}.${call}${position === calls.length - 1 ? ';' : ''}`),
82
+ ];
83
+ }
84
+ function nameofList(names) {
85
+ return names.map((name) => `nameof(${name})`).join(', ');
86
+ }
87
+ // ---------------------------------------------------------------------------
88
+ // Properties
89
+ // ---------------------------------------------------------------------------
90
+ function isConventionalKey(model, member) {
91
+ return (member.relationName === undefined &&
92
+ (member.property === 'Id' || member.property === `${model.className}Id`));
93
+ }
94
+ /** The data annotations of a column. */
95
+ function columnAttributes(model, member) {
96
+ const spec = member.spec;
97
+ const attributes = [];
98
+ if (member.isKey &&
99
+ model.keyProps.length === 1 &&
100
+ !isConventionalKey(model, member)) {
101
+ attributes.push('[Key]');
102
+ }
103
+ if (spec.generated !== undefined) {
104
+ attributes.push(`[DatabaseGenerated(DatabaseGeneratedOption.${spec.generated === 'identity' ? 'Identity' : 'None'})]`);
105
+ }
106
+ const renamed = spec.columnName !== member.property;
107
+ if (renamed || spec.columnType !== undefined) {
108
+ const parts = [];
109
+ if (renamed) {
110
+ parts.push(csString(spec.columnName));
111
+ }
112
+ if (spec.columnType !== undefined) {
113
+ parts.push(`TypeName = ${csString(spec.columnType)}`);
114
+ }
115
+ attributes.push(`[Column(${parts.join(', ')})]`);
116
+ }
117
+ if (spec.maxLength !== undefined && spec.conversion === undefined) {
118
+ attributes.push(`[MaxLength(${spec.maxLength})]`);
119
+ }
120
+ if (spec.precision !== undefined) {
121
+ attributes.push(`[Precision(${spec.precision.precision}, ${spec.precision.scale})]`);
122
+ }
123
+ return attributes;
124
+ }
125
+ /**
126
+ * The fluent calls on `Property(...)` for a column. With `onlyBeyondAnnotations` the calls that data annotations
127
+ * already express (column name and type, length, precision, generation of keys) are left out.
128
+ */
129
+ function propertyCalls(member, onlyBeyondAnnotations) {
130
+ const spec = member.spec;
131
+ const calls = [];
132
+ if (!onlyBeyondAnnotations) {
133
+ if (spec.columnName !== member.property) {
134
+ calls.push(`HasColumnName(${csString(spec.columnName)})`);
135
+ }
136
+ if (spec.columnType !== undefined) {
137
+ calls.push(`HasColumnType(${csString(spec.columnType)})`);
138
+ }
139
+ }
140
+ if (spec.maxLength !== undefined &&
141
+ (!onlyBeyondAnnotations || spec.conversion !== undefined)) {
142
+ calls.push(`HasMaxLength(${spec.maxLength})`);
143
+ }
144
+ if (!onlyBeyondAnnotations && spec.precision !== undefined) {
145
+ calls.push(`HasPrecision(${spec.precision.precision}, ${spec.precision.scale})`);
146
+ }
147
+ if (spec.conversion?.kind === 'string') {
148
+ calls.push('HasConversion<string>()');
149
+ }
150
+ else if (spec.conversion?.kind === 'converter') {
151
+ calls.push(`HasConversion(new ${spec.conversion.className}())`);
152
+ }
153
+ if (spec.computed !== undefined) {
154
+ calls.push(`HasComputedColumnSql(${csString(spec.computed.sql)}, ${spec.computed.stored})`);
155
+ }
156
+ if (spec.defaultValue !== undefined) {
157
+ calls.push(`HasDefaultValue(${spec.defaultValue})`);
158
+ }
159
+ if (spec.defaultSql !== undefined) {
160
+ calls.push(`HasDefaultValueSql(${csString(spec.defaultSql)})`);
161
+ }
162
+ if (spec.autoUpdated) {
163
+ calls.push('ValueGeneratedOnAddOrUpdate()');
164
+ }
165
+ else if (spec.clientGuid) {
166
+ // EF Core only generates the values of keys by itself; any other column needs the generator named.
167
+ calls.push('ValueGeneratedOnAdd()', 'HasValueGenerator<GuidValueGenerator>()');
168
+ }
169
+ if (!onlyBeyondAnnotations && spec.generated !== undefined) {
170
+ calls.push(spec.generated === 'identity'
171
+ ? 'ValueGeneratedOnAdd()'
172
+ : 'ValueGeneratedNever()');
173
+ }
174
+ return calls;
175
+ }
176
+ function columnBlock(plan, model, member) {
177
+ const spec = member.spec;
178
+ const type = `${spec.clrType}${spec.nullable ? '?' : ''}`;
179
+ const initializer = spec.initializer === undefined ? '' : ` = ${spec.initializer};`;
180
+ return [
181
+ ...(plan.style === 'annotations' ? columnAttributes(model, member) : []),
182
+ `public ${type} ${verbatim(member.property)} { get; set; }${initializer}`,
183
+ ];
184
+ }
185
+ function navBlock(plan, nav, fluentNavs, className) {
186
+ const lines = [];
187
+ if (plan.style === 'annotations' &&
188
+ !fluentNavs.has(`${className}.${nav.property}`)) {
189
+ if (nav.foreignKeys !== undefined) {
190
+ lines.push(`[ForeignKey(${nav.foreignKeys.length === 1
191
+ ? nameofList(nav.foreignKeys)
192
+ : csString(nav.foreignKeys.join(','))})]`);
193
+ }
194
+ if (nav.inverseOf !== undefined) {
195
+ lines.push(`[InverseProperty(nameof(${nav.inverseOf.className}.${nav.inverseOf.property}))]`);
196
+ }
197
+ }
198
+ if (nav.collection) {
199
+ lines.push(`public ICollection<${nav.typeName}> ${verbatim(nav.property)} { get; set; } = new List<${nav.typeName}>();`);
200
+ }
201
+ else if (nav.nullable) {
202
+ lines.push(`public ${nav.typeName}? ${verbatim(nav.property)} { get; set; }`);
203
+ }
204
+ else {
205
+ lines.push(`public ${nav.typeName} ${verbatim(nav.property)} { get; set; } = null!;`);
206
+ }
207
+ return lines;
208
+ }
209
+ // ---------------------------------------------------------------------------
210
+ // Entity configuration statements
211
+ // ---------------------------------------------------------------------------
212
+ function lambdaOf(properties) {
213
+ const first = properties[0];
214
+ return properties.length === 1 && first !== undefined
215
+ ? `e => e.${first}`
216
+ : `e => new { ${properties.map((name) => `e.${name}`).join(', ')} }`;
217
+ }
218
+ function relationLambda(properties) {
219
+ const first = properties[0];
220
+ return properties.length === 1 && first !== undefined
221
+ ? `r => r.${first}`
222
+ : `r => new { ${properties.map((name) => `r.${name}`).join(', ')} }`;
223
+ }
224
+ /** True when data annotations cannot say everything about a relationship. */
225
+ function needsFluent(link) {
226
+ return (link.behavior !== undefined ||
227
+ link.principalKeys !== undefined ||
228
+ link.constraintName !== undefined ||
229
+ link.composite !== undefined);
230
+ }
231
+ function linkStatement(link, receiver) {
232
+ const calls = [`HasOne(e => e.${link.nav})`];
233
+ calls.push(link.inverse === undefined
234
+ ? link.oneToOne
235
+ ? 'WithOne()'
236
+ : 'WithMany()'
237
+ : `${link.oneToOne ? 'WithOne' : 'WithMany'}(r => r.${link.inverse})`);
238
+ const typeArgument = link.oneToOne ? `<${link.owner.className}>` : '';
239
+ calls.push(`HasForeignKey${typeArgument}(${lambdaOf(link.foreignKeys)})`);
240
+ if (link.principalKeys !== undefined) {
241
+ calls.push(`HasPrincipalKey${link.oneToOne ? `<${link.target.className}>` : ''}(${relationLambda(link.principalKeys)})`);
242
+ }
243
+ if (link.constraintName !== undefined) {
244
+ calls.push(`HasConstraintName(${csString(link.constraintName)})`);
245
+ }
246
+ if (link.behavior !== undefined) {
247
+ calls.push(`OnDelete(DeleteBehavior.${link.behavior})`);
248
+ }
249
+ return chain(receiver, calls);
250
+ }
251
+ function manyToManyStatement(join, receiver) {
252
+ const schemaArgument = join.owner.schema === undefined ? '' : `, ${csString(join.owner.schema)}`;
253
+ return [
254
+ receiver,
255
+ `${INDENT}.HasMany(e => e.${join.nav})`,
256
+ `${INDENT}.WithMany(${join.inverse === undefined ? '' : `r => r.${join.inverse}`})`,
257
+ `${INDENT}.UsingEntity<Dictionary<string, object>>(`,
258
+ `${INDENT}${INDENT}${csString(join.joinTable)},`,
259
+ `${INDENT}${INDENT}right => right.HasOne<${join.target.className}>().WithMany().HasForeignKey(${csString(join.targetColumn)}),`,
260
+ `${INDENT}${INDENT}left => left.HasOne<${join.owner.className}>().WithMany().HasForeignKey(${csString(join.ownerColumn)}),`,
261
+ `${INDENT}${INDENT}join => join.ToTable(${csString(join.joinTable)}${schemaArgument}));`,
262
+ ];
263
+ }
264
+ function indexStatement(index, receiver) {
265
+ const calls = [`HasIndex(${lambdaOf(index.properties)})`];
266
+ if (index.unique) {
267
+ calls.push('IsUnique()');
268
+ }
269
+ if (index.name !== undefined) {
270
+ calls.push(`HasDatabaseName(${csString(index.name)})`);
271
+ }
272
+ if (index.descending.some((flag) => flag)) {
273
+ calls.push(`IsDescending(${index.descending.join(', ')})`);
274
+ }
275
+ if (index.method !== undefined) {
276
+ calls.push(`HasMethod(${csString(index.method)})`);
277
+ }
278
+ return chain(receiver, calls);
279
+ }
280
+ function indexAttribute(index) {
281
+ const parts = [nameofList(index.properties)];
282
+ if (index.unique) {
283
+ parts.push('IsUnique = true');
284
+ }
285
+ if (index.name !== undefined) {
286
+ parts.push(`Name = ${csString(index.name)}`);
287
+ }
288
+ if (index.descending.some((flag) => flag)) {
289
+ parts.push(`IsDescending = new[] { ${index.descending.join(', ')} }`);
290
+ }
291
+ return `[Index(${parts.join(', ')})]`;
292
+ }
293
+ function tableCall(model) {
294
+ const schema = model.schema === undefined ? '' : `, ${csString(model.schema)}`;
295
+ return `${model.isView ? 'ToView' : 'ToTable'}(${csString(model.tableName)}${schema})`;
296
+ }
297
+ /**
298
+ * The configuration statements of one entity. In the `fluent` style that is all of the mapping; in the
299
+ * `annotations` style only what data annotations cannot say.
300
+ */
301
+ function entityStatements(plan, model, receiver) {
302
+ const fluent = plan.style === 'fluent';
303
+ const statements = [];
304
+ if (fluent &&
305
+ (model.needsTable || model.schema !== undefined || model.isView)) {
306
+ statements.push(chain(receiver, [tableCall(model)]));
307
+ }
308
+ else if (!fluent && model.isView) {
309
+ statements.push(chain(receiver, [tableCall(model)]));
310
+ }
311
+ if (model.keyProps.length > 0) {
312
+ const key = [`HasKey(${lambdaOf(model.keyProps)})`];
313
+ if (model.keyName !== undefined) {
314
+ key.push(`HasName(${csString(model.keyName)})`);
315
+ }
316
+ if (fluent || model.keyName !== undefined) {
317
+ statements.push(chain(receiver, key));
318
+ }
319
+ }
320
+ else if (fluent && model.keyless) {
321
+ statements.push(chain(receiver, ['HasNoKey()']));
322
+ }
323
+ for (const key of model.alternateKeys) {
324
+ statements.push(chain(receiver, [`HasAlternateKey(${lambdaOf(key)})`]));
325
+ }
326
+ for (const member of model.columns) {
327
+ const calls = propertyCalls(member, !fluent);
328
+ if (calls.length > 0) {
329
+ statements.push(chain(receiver, [`Property(e => e.${member.property})`, ...calls]));
330
+ }
331
+ if (member.spec.autoUpdated) {
332
+ // EF Core ignores a value the application sets for a column the database is expected to generate, unless
333
+ // it is allowed to save it; SaveChanges of the context sets these columns.
334
+ for (const behavior of [
335
+ 'SetBeforeSaveBehavior',
336
+ 'SetAfterSaveBehavior',
337
+ ]) {
338
+ statements.push(chain(receiver, [
339
+ `Property(e => e.${member.property})`,
340
+ `Metadata.${behavior}(PropertySaveBehavior.Save)`,
341
+ ]));
342
+ }
343
+ }
344
+ }
345
+ for (const index of model.indexes) {
346
+ if (fluent || index.method !== undefined) {
347
+ statements.push(indexStatement(index, receiver));
348
+ }
349
+ }
350
+ for (const link of model.links) {
351
+ if (fluent || needsFluent(link)) {
352
+ statements.push(linkStatement(link, receiver));
353
+ }
354
+ }
355
+ for (const join of model.manyToMany) {
356
+ statements.push(manyToManyStatement(join, receiver));
357
+ }
358
+ return statements;
359
+ }
360
+ /** The navigations (`Class.Property`) that a fluent relationship already describes. */
361
+ function fluentNavigations(plan) {
362
+ const names = new Set();
363
+ for (const model of plan.models) {
364
+ for (const link of model.links) {
365
+ if (plan.style === 'fluent' || needsFluent(link)) {
366
+ names.add(`${link.owner.className}.${link.nav}`);
367
+ if (link.inverse !== undefined) {
368
+ names.add(`${link.target.className}.${link.inverse}`);
369
+ }
370
+ }
371
+ }
372
+ }
373
+ return names;
374
+ }
375
+ // ---------------------------------------------------------------------------
376
+ // Files
377
+ // ---------------------------------------------------------------------------
378
+ function classAttributes(plan, model) {
379
+ if (plan.style !== 'annotations') {
380
+ return [];
381
+ }
382
+ const attributes = [];
383
+ if (!model.isView && (model.needsTable || model.schema !== undefined)) {
384
+ attributes.push(model.schema === undefined
385
+ ? `[Table(${csString(model.tableName)})]`
386
+ : `[Table(${csString(model.tableName)}, Schema = ${csString(model.schema)})]`);
387
+ }
388
+ if (model.keyProps.length > 1) {
389
+ attributes.push(`[PrimaryKey(${nameofList(model.keyProps)})]`);
390
+ }
391
+ if (model.keyless) {
392
+ attributes.push('[Keyless]');
393
+ }
394
+ for (const index of model.indexes) {
395
+ if (index.method === undefined) {
396
+ attributes.push(indexAttribute(index));
397
+ }
398
+ }
399
+ return attributes;
400
+ }
401
+ function entityFile(plan, model, fluentNavs) {
402
+ const members = [
403
+ ...model.columns.map((member) => columnBlock(plan, model, member)),
404
+ ...model.navs.map((nav) => navBlock(plan, nav, fluentNavs, model.className)),
405
+ ];
406
+ const body = [
407
+ ...classAttributes(plan, model),
408
+ `public class ${verbatim(model.className)}`,
409
+ '{',
410
+ ...indent(separated(members)),
411
+ '}',
412
+ ];
413
+ return fileText(plan, body);
414
+ }
415
+ function enumFile(plan, enumPlan) {
416
+ const values = enumPlan.enumeration.values;
417
+ const members = values.map((value) => {
418
+ const name = verbatim(enumPlan.members.get(value.name) ?? value.name);
419
+ return enumPlan.numeric
420
+ ? `${name} = ${Number(value.dbValue)},`
421
+ : `${name},`;
422
+ });
423
+ const body = [
424
+ `public enum ${enumPlan.typeName}`,
425
+ '{',
426
+ ...indent(members),
427
+ '}',
428
+ ];
429
+ if (enumPlan.converter !== undefined) {
430
+ const type = enumPlan.typeName;
431
+ const toDatabase = values.map((value) => `${type}.${verbatim(enumPlan.members.get(value.name) ?? value.name)} => ${csString(value.dbValue)},`);
432
+ const fromDatabase = values.map((value) => `${csString(value.dbValue)} => ${type}.${verbatim(enumPlan.members.get(value.name) ?? value.name)},`);
433
+ body.push('', '/// <summary>Stores the enum as the values the schema was written with.</summary>', `public class ${enumPlan.converter} : ValueConverter<${type}, string>`, '{', ...indent([
434
+ `public ${enumPlan.converter}()`,
435
+ `${INDENT}: base(value => ToDatabase(value), value => FromDatabase(value))`,
436
+ '{',
437
+ '}',
438
+ '',
439
+ `private static string ToDatabase(${type} value) => value switch`,
440
+ '{',
441
+ ...indent(toDatabase),
442
+ `${INDENT}_ => throw new ArgumentOutOfRangeException(nameof(value), value, null),`,
443
+ '};',
444
+ '',
445
+ `private static ${type} FromDatabase(string value) => value switch`,
446
+ '{',
447
+ ...indent(fromDatabase),
448
+ `${INDENT}_ => throw new ArgumentOutOfRangeException(nameof(value), value, null),`,
449
+ '};',
450
+ ]), '}');
451
+ }
452
+ return fileText(plan, body);
453
+ }
454
+ function configurationFile(plan, model) {
455
+ const statements = entityStatements(plan, model, 'builder');
456
+ const body = [
457
+ `public class ${model.className}Configuration : IEntityTypeConfiguration<${model.className}>`,
458
+ '{',
459
+ ...indent([
460
+ `public void Configure(EntityTypeBuilder<${model.className}> builder)`,
461
+ '{',
462
+ ...indent(statements.flat()),
463
+ '}',
464
+ ]),
465
+ '}',
466
+ ];
467
+ return fileText(plan, body);
468
+ }
469
+ function autoUpdateMembers(plan) {
470
+ const updated = plan.models.filter((model) => model.autoUpdated.length > 0);
471
+ if (updated.length === 0) {
472
+ return [];
473
+ }
474
+ const entries = updated.flatMap((model) => [
475
+ `foreach (var entry in ChangeTracker.Entries<${model.className}>())`,
476
+ '{',
477
+ ...indent([
478
+ 'if (entry.State is EntityState.Added or EntityState.Modified)',
479
+ '{',
480
+ ...indent(model.autoUpdated.map((property) => `entry.Property(e => e.${property}).CurrentValue = now;`)),
481
+ '}',
482
+ ]),
483
+ '}',
484
+ ]);
485
+ return [
486
+ '',
487
+ 'public override int SaveChanges(bool acceptAllChangesOnSuccess)',
488
+ '{',
489
+ `${INDENT}ApplyAutoUpdatedColumns();`,
490
+ `${INDENT}return base.SaveChanges(acceptAllChangesOnSuccess);`,
491
+ '}',
492
+ '',
493
+ 'public override Task<int> SaveChangesAsync(',
494
+ `${INDENT}bool acceptAllChangesOnSuccess,`,
495
+ `${INDENT}CancellationToken cancellationToken = default)`,
496
+ '{',
497
+ `${INDENT}ApplyAutoUpdatedColumns();`,
498
+ `${INDENT}return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);`,
499
+ '}',
500
+ '',
501
+ '// The database does not refresh these columns on its own: the context sets them when a row is added or changed.',
502
+ 'private void ApplyAutoUpdatedColumns()',
503
+ '{',
504
+ `${INDENT}var now = DateTime.UtcNow;`,
505
+ ...indent(entries),
506
+ '}',
507
+ ];
508
+ }
509
+ function contextFile(plan) {
510
+ const sets = plan.models.flatMap((model, position) => [
511
+ ...(position === 0 ? [] : ['']),
512
+ `public DbSet<${model.className}> ${verbatim(model.dbSet)} => Set<${model.className}>();`,
513
+ ]);
514
+ const configure = [];
515
+ if (plan.style === 'fluent') {
516
+ for (const model of plan.models) {
517
+ configure.push(`modelBuilder.ApplyConfiguration(new ${model.className}Configuration());`);
518
+ }
519
+ }
520
+ else {
521
+ for (const model of plan.models) {
522
+ const statements = entityStatements(plan, model, 'entity');
523
+ if (statements.length === 0) {
524
+ continue;
525
+ }
526
+ if (configure.length > 0) {
527
+ configure.push('');
528
+ }
529
+ configure.push(`modelBuilder.Entity<${model.className}>(entity =>`, '{', ...indent(statements.flat()), '});');
530
+ }
531
+ }
532
+ const body = [
533
+ 'public class AppDbContext : DbContext',
534
+ '{',
535
+ ...indent([
536
+ 'public AppDbContext(DbContextOptions<AppDbContext> options)',
537
+ `${INDENT}: base(options)`,
538
+ '{',
539
+ '}',
540
+ '',
541
+ ...sets,
542
+ '',
543
+ 'protected override void OnModelCreating(ModelBuilder modelBuilder)',
544
+ '{',
545
+ `${INDENT}base.OnModelCreating(modelBuilder);`,
546
+ ...(configure.length === 0 ? [] : ['', ...indent(configure)]),
547
+ '}',
548
+ ...autoUpdateMembers(plan),
549
+ ]),
550
+ '}',
551
+ ];
552
+ return fileText(plan, body);
553
+ }
554
+ export function renderFiles(plan) {
555
+ const files = {};
556
+ const fluentNavs = fluentNavigations(plan);
557
+ for (const enumPlan of plan.enums) {
558
+ files[`Models/${enumPlan.typeName}.cs`] = enumFile(plan, enumPlan);
559
+ }
560
+ for (const model of plan.models) {
561
+ files[`Models/${model.className}.cs`] = entityFile(plan, model, fluentNavs);
562
+ if (plan.style === 'fluent') {
563
+ files[`Configurations/${model.className}Configuration.cs`] =
564
+ configurationFile(plan, model);
565
+ }
566
+ }
567
+ files['AppDbContext.cs'] = contextFile(plan);
568
+ return files;
569
+ }
570
+ //# sourceMappingURL=efcoreRender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"efcoreRender.js","sourceRoot":"","sources":["../../src/emitters/efcoreRender.ts"],"names":[],"mappings":"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"}