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,285 @@
1
+ import { toCamelCase } from '../naming.js';
2
+ import { parseTypeText, } from './csharpSyntax.js';
3
+ import { isNullableMember } from './efcoreRelations.js';
4
+ import { clrColumn, sqlColumn, sqlDefault, } from './efcoreTypes.js';
5
+ const INTEGER_TYPES = new Set([
6
+ 'int',
7
+ 'Int32',
8
+ 'uint',
9
+ 'UInt32',
10
+ 'short',
11
+ 'Int16',
12
+ 'ushort',
13
+ 'UInt16',
14
+ 'byte',
15
+ 'Byte',
16
+ 'sbyte',
17
+ 'SByte',
18
+ 'long',
19
+ 'Int64',
20
+ 'ulong',
21
+ 'UInt64',
22
+ ]);
23
+ /** The IR name of a mapped property: `PublicId` is `publicId`, an owned `Address.Street` is `addressStreet`. */
24
+ export function irFieldName(member) {
25
+ return toCamelCase(member.path.replace(/\./g, '_'));
26
+ }
27
+ /** The database column name: the configured name, or the property name with owned prefixes (`Address_Street`). */
28
+ export function columnNameOf(member) {
29
+ return (member.config.column ?? `${member.prefix.replace(/\./g, '_')}${member.name}`);
30
+ }
31
+ function buildEnum(definition, stringStored, stored = new Map()) {
32
+ const values = definition.members.map((value, index) => ({
33
+ name: value.name,
34
+ dbValue: stringStored
35
+ ? (stored.get(value.name) ?? value.name)
36
+ : String(value.value ?? index),
37
+ }));
38
+ return { name: definition.name, values };
39
+ }
40
+ /**
41
+ * Reads the stored values of an enum from a value converter class of the input: a `ValueConverter<TEnum, string>`
42
+ * whose conversion is written as switch arms (`"draft" => PostStatus.Draft`), the shape ormbridge writes.
43
+ * Returns the stored string by member name, or undefined when the class is not such a converter.
44
+ */
45
+ function converterValues(project, className, definition) {
46
+ const converter = project.classes.get(className);
47
+ const isEnumConverter = converter?.bases.some((base) => base.name === 'ValueConverter' &&
48
+ base.args[0]?.name === definition.name &&
49
+ base.args[1]?.name === 'string') ?? false;
50
+ if (converter === undefined || !isEnumConverter) {
51
+ return undefined;
52
+ }
53
+ const stored = new Map();
54
+ const arm = /"((?:[^"\\]|\\.)*)"\s*=>\s*(?:\w+\.)*(\w+)\s*[,;]/g;
55
+ for (const method of converter.methods) {
56
+ for (const match of method.node.text.matchAll(arm)) {
57
+ const value = (match[1] ?? '').replace(/\\(.)/g, '$1');
58
+ const member = match[2] ?? '';
59
+ if (definition.members.some((item) => item.name === member)) {
60
+ stored.set(member, value);
61
+ }
62
+ }
63
+ }
64
+ return definition.members.every((item) => stored.has(item.name))
65
+ ? stored
66
+ : undefined;
67
+ }
68
+ /** Maps a configured default (HasDefaultValue) to an IR default, with a warning when it cannot be read. */
69
+ function valueDefault(value, type, definition, stringStored, place, warn) {
70
+ switch (value.kind) {
71
+ case 'string':
72
+ if (definition !== undefined) {
73
+ return definition.members.some((item) => item.name === value.value)
74
+ ? { kind: 'enumValue', value: value.value }
75
+ : { kind: 'literal', value: value.value };
76
+ }
77
+ return { kind: 'literal', value: value.value };
78
+ case 'number': {
79
+ if (definition !== undefined && !stringStored) {
80
+ const member = definition.members.find((item) => item.value === value.value);
81
+ if (member !== undefined) {
82
+ return { kind: 'enumValue', value: member.name };
83
+ }
84
+ }
85
+ return { kind: 'literal', value: value.value };
86
+ }
87
+ case 'bool':
88
+ return { kind: 'literal', value: value.value };
89
+ case 'null':
90
+ return undefined;
91
+ case 'member': {
92
+ const last = value.path[value.path.length - 1] ?? '';
93
+ if (definition !== undefined) {
94
+ return definition.members.some((item) => item.name === last)
95
+ ? { kind: 'enumValue', value: last }
96
+ : undefined;
97
+ }
98
+ if (value.path.length >= 2 &&
99
+ /^(DateTime|DateTimeOffset|DateOnly)$/.test(value.path[value.path.length - 2] ?? '') &&
100
+ /^(Now|UtcNow|Today)$/.test(last)) {
101
+ return { kind: 'now' };
102
+ }
103
+ break;
104
+ }
105
+ case 'other':
106
+ if (/Guid\.NewGuid\(\)/.test(value.text) && type === 'uuid') {
107
+ return { kind: 'uuid' };
108
+ }
109
+ if (/^(DateTime|DateTimeOffset)\.(UtcNow|Now)$/.test(value.text)) {
110
+ return { kind: 'now' };
111
+ }
112
+ break;
113
+ default:
114
+ break;
115
+ }
116
+ warn(`${place}: the default value expression "${value.kind === 'other' ? value.text : value.kind}" cannot be evaluated statically and was dropped.`);
117
+ return undefined;
118
+ }
119
+ /** Builds the IR field of one mapped column. */
120
+ export function buildField(member, ctx, enumDefinitions) {
121
+ const place = `${ctx.info.name}.${member.path}`;
122
+ const config = member.config;
123
+ const type = member.type;
124
+ const definition = enumDefinitions.get(type.name);
125
+ const enumNames = new Set(enumDefinitions.keys());
126
+ const isKey = ctx.keyNames.includes(member.path);
127
+ let shape;
128
+ let enumDefinition;
129
+ let stringStored = false;
130
+ let conversion = config.conversion;
131
+ let storedValues;
132
+ if (config.customConversion === true &&
133
+ config.converterClass !== undefined &&
134
+ definition !== undefined &&
135
+ type.arrayDepth === 0) {
136
+ storedValues = converterValues(ctx.project, config.converterClass, definition);
137
+ if (storedValues !== undefined) {
138
+ conversion = 'string';
139
+ }
140
+ }
141
+ if (config.customConversion === true && storedValues === undefined) {
142
+ ctx.warn(`${place}: a custom value converter is not evaluated; the column was read from the property type ${type.text}.`);
143
+ }
144
+ if (definition !== undefined && type.arrayDepth === 0) {
145
+ stringStored = conversion === 'string';
146
+ if (conversion !== undefined && conversion !== 'string') {
147
+ shape = clrColumn(parseTypeText(conversion));
148
+ }
149
+ const integerType = shape?.type === 'bigInt' ? 'bigInt' : 'int';
150
+ shape = stringStored ? { type: 'string' } : { type: integerType };
151
+ enumDefinition = buildEnum(definition, stringStored, storedValues);
152
+ if (!stringStored) {
153
+ ctx.warn(`${place}: the enum ${definition.name} is stored as an integer by EF Core; it is read as an enum with the numbers as values, and writers that create enum types will store text instead. Add HasConversion<string>() to store the names.`);
154
+ }
155
+ }
156
+ else if (conversion !== undefined && !(conversion === type.name)) {
157
+ shape = clrColumn(parseTypeText(conversion));
158
+ ctx.warn(`${place}: the value converter stores ${type.text} as ${conversion}; the column was read as ${conversion}.`);
159
+ }
160
+ else {
161
+ shape = clrColumn(type);
162
+ }
163
+ if (config.columnType !== undefined) {
164
+ const fromSql = sqlColumn(config.columnType);
165
+ if (fromSql === undefined) {
166
+ ctx.warn(`${place}: the column type "${config.columnType}" is not recognised; the column was read from the property type ${type.text}.`);
167
+ }
168
+ else if (definition === undefined) {
169
+ shape = {
170
+ ...fromSql,
171
+ ...(shape?.arrayDepth === undefined || fromSql.arrayDepth !== undefined
172
+ ? {}
173
+ : { arrayDepth: shape.arrayDepth }),
174
+ };
175
+ }
176
+ }
177
+ if (type.name === 'Dictionary' || type.name === 'IDictionary') {
178
+ ctx.warn(`${place}: a ${type.name} property maps to a PostgreSQL hstore column (Npgsql only); it was read as an hstore column.`);
179
+ }
180
+ if (member.isJson === true) {
181
+ shape = { type: 'json' };
182
+ }
183
+ if (shape === undefined) {
184
+ shape = { type: 'unsupported', unsupportedType: type.text };
185
+ ctx.warn(`${place}: the type ${type.text} has no column type in the shared model; the column is read as unsupported (${type.text}).`);
186
+ }
187
+ // Lengths and precision -------------------------------------------------------------------
188
+ let irType = shape.type;
189
+ let maxLength = shape.maxLength;
190
+ if (config.maxLength !== undefined &&
191
+ (irType === 'text' || irType === 'string')) {
192
+ irType = 'string';
193
+ maxLength = config.maxLength;
194
+ }
195
+ let maxDigits = shape.maxDigits;
196
+ let decimalPlaces = shape.decimalPlaces;
197
+ if (irType === 'decimal' && config.precision !== undefined) {
198
+ maxDigits = config.precision;
199
+ decimalPlaces = config.scale ?? 0;
200
+ }
201
+ // Nullability -------------------------------------------------------------------------------
202
+ let isNullable = isNullableMember(member, ctx.info.nullableRefs, enumNames);
203
+ if (member.forceNullable) {
204
+ isNullable = true;
205
+ }
206
+ if (isKey) {
207
+ isNullable = false;
208
+ }
209
+ // Defaults and generated values ---------------------------------------------------------------
210
+ let defaultValue;
211
+ let generated;
212
+ let isAutoUpdated = false;
213
+ if (config.computedSql !== undefined) {
214
+ generated = {
215
+ expression: config.computedSql,
216
+ isStored: config.computedStored === true,
217
+ };
218
+ }
219
+ else if (config.generated === 'onAddOrUpdate' && irType !== 'dateTime') {
220
+ ctx.warn(`${place}: the column is computed or generated on update by the database, but no expression was given; it was read as an ordinary column.`);
221
+ }
222
+ if (config.generated === 'onAddOrUpdate' && irType === 'dateTime') {
223
+ isAutoUpdated = config.computedSql === undefined;
224
+ }
225
+ if (generated === undefined) {
226
+ if (config.defaultValue !== undefined) {
227
+ defaultValue = valueDefault(config.defaultValue, irType, definition, stringStored, place, ctx.warn);
228
+ }
229
+ else if (config.defaultSql !== undefined) {
230
+ defaultValue = sqlDefault(config.defaultSql, irType);
231
+ if (definition !== undefined &&
232
+ defaultValue.kind === 'literal' &&
233
+ typeof defaultValue.value === 'string') {
234
+ const text = defaultValue.value;
235
+ const found = enumDefinition?.values.find((item) => item.dbValue === text);
236
+ defaultValue =
237
+ found === undefined
238
+ ? defaultValue
239
+ : { kind: 'enumValue', value: found.name };
240
+ }
241
+ }
242
+ }
243
+ const isInteger = (irType === 'int' || irType === 'bigInt') &&
244
+ INTEGER_TYPES.has(type.name) &&
245
+ shape.arrayDepth === undefined;
246
+ if (defaultValue === undefined && generated === undefined) {
247
+ const isOnlyKey = isKey && ctx.keyNames.length === 1;
248
+ if (isInteger && config.generated !== 'never') {
249
+ if (config.generated === 'onAdd' || isOnlyKey) {
250
+ defaultValue = { kind: 'autoIncrement' };
251
+ }
252
+ }
253
+ else if (irType === 'uuid' && isOnlyKey && config.generated !== 'never') {
254
+ // EF Core generates Guid keys on the client.
255
+ defaultValue = { kind: 'uuid' };
256
+ }
257
+ }
258
+ const field = {
259
+ name: irFieldName(member),
260
+ columnName: columnNameOf(member),
261
+ type: irType,
262
+ isPrimaryKey: isKey && ctx.keyNames.length === 1,
263
+ isUnique: false,
264
+ isNullable,
265
+ isAutoUpdated,
266
+ ...(defaultValue === undefined ? {} : { default: defaultValue }),
267
+ ...(maxLength === undefined || irType !== 'string' ? {} : { maxLength }),
268
+ ...(irType === 'decimal' && maxDigits !== undefined ? { maxDigits } : {}),
269
+ ...(irType === 'decimal' && decimalPlaces !== undefined
270
+ ? { decimalPlaces }
271
+ : {}),
272
+ ...(shape.arrayDepth === undefined ? {} : { arrayDepth: shape.arrayDepth }),
273
+ ...(enumDefinition === undefined ? {} : { enumName: enumDefinition.name }),
274
+ ...(irType === 'unsupported' && shape.unsupportedType !== undefined
275
+ ? { unsupportedType: shape.unsupportedType }
276
+ : {}),
277
+ ...(generated === undefined ? {} : { generated }),
278
+ };
279
+ return {
280
+ field,
281
+ member,
282
+ ...(enumDefinition === undefined ? {} : { enumDefinition }),
283
+ };
284
+ }
285
+ //# sourceMappingURL=efcoreFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"efcoreFields.js","sourceRoot":"","sources":["../../src/parsers/efcoreFields.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EACL,aAAa,GAKd,MAAM,mBAAmB,CAAC;AAO3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EACL,SAAS,EACT,SAAS,EACT,UAAU,GAEX,MAAM,kBAAkB,CAAC;AAiB1B,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAC;IACjD,KAAK;IACL,OAAO;IACP,MAAM;IACN,QAAQ;IACR,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;CACT,CAAC,CAAC;AAEH,gHAAgH;AAChH,MAAM,UAAU,WAAW,CAAC,MAAoB;IAC9C,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,OAAO,CACL,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAC7E,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAChB,UAAkB,EAClB,YAAqB,EACrB,SAAsC,IAAI,GAAG,EAAE;IAE/C,MAAM,MAAM,GAAkB,UAAU,CAAC,OAAO,CAAC,GAAG,CAClD,CAAC,KAAK,EAAE,KAAK,EAAe,EAAE,CAAC,CAAC;QAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,YAAY;YACnB,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;YACxC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;KACjC,CAAC,CACH,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CACtB,OAAgB,EAChB,SAAiB,EACjB,UAAkB;IAElB,MAAM,SAAS,GAAwB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtE,MAAM,eAAe,GACnB,SAAS,EAAE,KAAK,CAAC,IAAI,CACnB,CAAC,IAAY,EAAE,EAAE,CACf,IAAI,CAAC,IAAI,KAAK,gBAAgB;QAC9B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,UAAU,CAAC,IAAI;QACtC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,CAClC,IAAI,KAAK,CAAC;IACb,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,eAAe,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC9C,MAAM,GAAG,GAAW,oDAAoD,CAAC;IACzE,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QACvC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,MAAM,KAAK,GAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAW,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;gBAC5D,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,2GAA2G;AAC3G,SAAS,YAAY,CACnB,KAAc,EACd,IAAkB,EAClB,UAA8B,EAC9B,YAAqB,EACrB,KAAa,EACb,IAA+B;IAE/B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC;oBACjE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;oBAC3C,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;YAC9C,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QACjD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CACpC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CACrC,CAAC;gBACF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;gBACnD,CAAC;YACH,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QACjD,CAAC;QACD,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QACjD,KAAK,MAAM;YACT,OAAO,SAAS,CAAC;QACnB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,IAAI,GAAW,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;oBAC1D,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE;oBACpC,CAAC,CAAC,SAAS,CAAC;YAChB,CAAC;YACD,IACE,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC;gBACtB,sCAAsC,CAAC,IAAI,CACzC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CACxC;gBACD,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EACjC,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACzB,CAAC;YACD,MAAM;QACR,CAAC;QACD,KAAK,OAAO;YACV,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC1B,CAAC;YACD,IAAI,2CAA2C,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACzB,CAAC;YACD,MAAM;QACR;YACE,MAAM;IACV,CAAC;IACD,IAAI,CACF,GAAG,KAAK,mCAAmC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,mDAAmD,CAC/I,CAAC;IACF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,UAAU,CACxB,MAAoB,EACpB,GAAiB,EACjB,eAA4C;IAE5C,MAAM,KAAK,GAAW,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;IACxD,MAAM,MAAM,GAAe,MAAM,CAAC,MAAM,CAAC;IACzC,MAAM,IAAI,GAAW,MAAM,CAAC,IAAI,CAAC;IACjC,MAAM,UAAU,GAAuB,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,SAAS,GAAwB,IAAI,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,MAAM,KAAK,GAAY,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAE1D,IAAI,KAA8B,CAAC;IACnC,IAAI,cAAkC,CAAC;IACvC,IAAI,YAAY,GAAY,KAAK,CAAC;IAClC,IAAI,UAAU,GAAuB,MAAM,CAAC,UAAU,CAAC;IACvD,IAAI,YAA6C,CAAC;IAClD,IACE,MAAM,CAAC,gBAAgB,KAAK,IAAI;QAChC,MAAM,CAAC,cAAc,KAAK,SAAS;QACnC,UAAU,KAAK,SAAS;QACxB,IAAI,CAAC,UAAU,KAAK,CAAC,EACrB,CAAC;QACD,YAAY,GAAG,eAAe,CAC5B,GAAG,CAAC,OAAO,EACX,MAAM,CAAC,cAAc,EACrB,UAAU,CACX,CAAC;QACF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,UAAU,GAAG,QAAQ,CAAC;QACxB,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,gBAAgB,KAAK,IAAI,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QACnE,GAAG,CAAC,IAAI,CACN,GAAG,KAAK,2FAA2F,IAAI,CAAC,IAAI,GAAG,CAChH,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QACtD,YAAY,GAAG,UAAU,KAAK,QAAQ,CAAC;QACvC,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YACxD,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,WAAW,GACf,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9C,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QAClE,cAAc,GAAG,SAAS,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QACnE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,CACN,GAAG,KAAK,cAAc,UAAU,CAAC,IAAI,oMAAoM,CAC1O,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7C,GAAG,CAAC,IAAI,CACN,GAAG,KAAK,gCAAgC,IAAI,CAAC,IAAI,OAAO,UAAU,4BAA4B,UAAU,GAAG,CAC5G,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,OAAO,GAA4B,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACtE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,GAAG,CAAC,IAAI,CACN,GAAG,KAAK,sBAAsB,MAAM,CAAC,UAAU,mEAAmE,IAAI,CAAC,IAAI,GAAG,CAC/H,CAAC;QACJ,CAAC;aAAM,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,KAAK,GAAG;gBACN,GAAG,OAAO;gBACV,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;oBACrE,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;aACtC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAC9D,GAAG,CAAC,IAAI,CACN,GAAG,KAAK,OAAO,IAAI,CAAC,IAAI,8FAA8F,CACvH,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5D,GAAG,CAAC,IAAI,CACN,GAAG,KAAK,cAAc,IAAI,CAAC,IAAI,+EAA+E,IAAI,CAAC,IAAI,IAAI,CAC5H,CAAC;IACJ,CAAC;IAED,4FAA4F;IAC5F,IAAI,MAAM,GAAiB,KAAK,CAAC,IAAI,CAAC;IACtC,IAAI,SAAS,GAAuB,KAAK,CAAC,SAAS,CAAC;IACpD,IACE,MAAM,CAAC,SAAS,KAAK,SAAS;QAC9B,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ,CAAC,EAC1C,CAAC;QACD,MAAM,GAAG,QAAQ,CAAC;QAClB,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC;IACD,IAAI,SAAS,GAAuB,KAAK,CAAC,SAAS,CAAC;IACpD,IAAI,aAAa,GAAuB,KAAK,CAAC,aAAa,CAAC;IAC5D,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC3D,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAC7B,aAAa,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,8FAA8F;IAC9F,IAAI,UAAU,GAAY,gBAAgB,CACxC,MAAM,EACN,GAAG,CAAC,IAAI,CAAC,YAAY,EACrB,SAAS,CACV,CAAC;IACF,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACV,UAAU,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,gGAAgG;IAChG,IAAI,YAAmC,CAAC;IACxC,IAAI,SAA+B,CAAC;IACpC,IAAI,aAAa,GAAY,KAAK,CAAC;IACnC,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,SAAS,GAAG;YACV,UAAU,EAAE,MAAM,CAAC,WAAW;YAC9B,QAAQ,EAAE,MAAM,CAAC,cAAc,KAAK,IAAI;SACzC,CAAC;IACJ,CAAC;SAAM,IAAI,MAAM,CAAC,SAAS,KAAK,eAAe,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QACzE,GAAG,CAAC,IAAI,CACN,GAAG,KAAK,kIAAkI,CAC3I,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,KAAK,eAAe,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAClE,aAAa,GAAG,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC;IACnD,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACtC,YAAY,GAAG,YAAY,CACzB,MAAM,CAAC,YAAY,EACnB,MAAM,EACN,UAAU,EACV,YAAY,EACZ,KAAK,EACL,GAAG,CAAC,IAAI,CACT,CAAC;QACJ,CAAC;aAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3C,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACrD,IACE,UAAU,KAAK,SAAS;gBACxB,YAAY,CAAC,IAAI,KAAK,SAAS;gBAC/B,OAAO,YAAY,CAAC,KAAK,KAAK,QAAQ,EACtC,CAAC;gBACD,MAAM,IAAI,GAAW,YAAY,CAAC,KAAK,CAAC;gBACxC,MAAM,KAAK,GAA4B,cAAc,EAAE,MAAM,CAAC,IAAI,CAChE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAChC,CAAC;gBACF,YAAY;oBACV,KAAK,KAAK,SAAS;wBACjB,CAAC,CAAC,YAAY;wBACd,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GACb,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,CAAC;QACzC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC;IACjC,IAAI,YAAY,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC1D,MAAM,SAAS,GAAY,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;QAC9D,IAAI,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YAC9C,IAAI,MAAM,CAAC,SAAS,KAAK,OAAO,IAAI,SAAS,EAAE,CAAC;gBAC9C,YAAY,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;YAC3C,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,KAAK,MAAM,IAAI,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1E,6CAA6C;YAC7C,YAAY,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAY;QACrB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC;QACzB,UAAU,EAAE,YAAY,CAAC,MAAM,CAAC;QAChC,IAAI,EAAE,MAAM;QACZ,YAAY,EAAE,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAChD,QAAQ,EAAE,KAAK;QACf,UAAU;QACV,aAAa;QACb,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAChE,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACxE,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS;YACrD,CAAC,CAAC,EAAE,aAAa,EAAE;YACnB,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;QAC3E,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC;QAC1E,GAAG,CAAC,MAAM,KAAK,aAAa,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS;YACjE,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE;YAC5C,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;KAClD,CAAC;IACF,OAAO;QACL,KAAK;QACL,MAAM;QACN,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { type ConstLookup, type CsClass } from './csharpSyntax.js';
2
+ import { type CsLambda } from './csharpChains.js';
3
+ import type { EntityConfig, Project } from './efcoreModel.js';
4
+ import { FluentSteps, type Target } from './efcoreSteps.js';
5
+ /** The entity configurations of a project, built from data annotations and then the fluent API. */
6
+ export declare class ConfigStore extends FluentSteps {
7
+ readonly project: Project;
8
+ readonly consts: ConstLookup;
9
+ readonly chainOf: (cls: CsClass) => CsClass[];
10
+ readonly entities: Map<string, EntityConfig>;
11
+ /** Entity names in the order they were discovered. */
12
+ readonly entityOrder: string[];
13
+ /** Set by a loop that assigns `DeleteBehavior` to every foreign key. */
14
+ globalDeleteBehavior: string | undefined;
15
+ private readonly applied;
16
+ private readonly unknown;
17
+ private callDepth;
18
+ private navigationNameCache;
19
+ constructor(project: Project, consts: ConstLookup, chainOf: (cls: CsClass) => CsClass[]);
20
+ warn(message: string): void;
21
+ /** Reports a fluent call that is not interpreted, once per call name and place. */
22
+ unknownCall(name: string, place: string, detail?: string): void;
23
+ /** The configuration of an entity, created from its data annotations on first use. */
24
+ entity(name: string): EntityConfig | undefined;
25
+ /** Adds an entity that was found by a convention (a DbSet, an annotation or a navigation). */
26
+ addEntity(name: string): EntityConfig | undefined;
27
+ has(name: string): boolean;
28
+ /** Reads `OnModelCreating` of a context. */
29
+ runContext(context: CsClass): void;
30
+ /** Reads the `Configure` method of an IEntityTypeConfiguration<T> class. */
31
+ runConfiguration(cls: CsClass, entityName: string): void;
32
+ /** Applies the configuration classes that no context applied explicitly (ApplyConfigurationsFromAssembly). */
33
+ applyAllConfigurations(): void;
34
+ /** The configuration classes that were never applied. */
35
+ unappliedConfigurations(): CsClass[];
36
+ /** The navigation names the fluent API configures (HasOne / HasMany / WithOne / WithMany arguments). */
37
+ navigationNames(): ReadonlySet<string>;
38
+ protected entityTarget(config: EntityConfig): Target;
39
+ private runStatements;
40
+ private runStatement;
41
+ private readLoop;
42
+ private runExpression;
43
+ private findExtension;
44
+ private callUserMethod;
45
+ private invoke;
46
+ protected runLambda(lambda: CsLambda, target: Target, bindings: Map<string, Target>, place: string, owner: CsClass): void;
47
+ }