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.
Files changed (93) hide show
  1. package/README.md +2 -0
  2. package/dist/cliRunner.js +9 -7
  3. package/dist/cliRunner.js.map +1 -1
  4. package/dist/config.d.ts +8 -4
  5. package/dist/config.js +3 -3
  6. package/dist/config.js.map +1 -1
  7. package/dist/emitters/efcore.d.ts +40 -0
  8. package/dist/emitters/efcore.js +686 -0
  9. package/dist/emitters/efcore.js.map +1 -0
  10. package/dist/emitters/efcoreColumns.d.ts +75 -0
  11. package/dist/emitters/efcoreColumns.js +492 -0
  12. package/dist/emitters/efcoreColumns.js.map +1 -0
  13. package/dist/emitters/efcoreNames.d.ts +30 -0
  14. package/dist/emitters/efcoreNames.js +268 -0
  15. package/dist/emitters/efcoreNames.js.map +1 -0
  16. package/dist/emitters/efcoreRender.d.ts +2 -0
  17. package/dist/emitters/efcoreRender.js +570 -0
  18. package/dist/emitters/efcoreRender.js.map +1 -0
  19. package/dist/emitters/efcoreTypes.d.ts +114 -0
  20. package/dist/emitters/efcoreTypes.js +2 -0
  21. package/dist/emitters/efcoreTypes.js.map +1 -0
  22. package/dist/emitters/sequelize.d.ts +35 -0
  23. package/dist/emitters/sequelize.js +1276 -0
  24. package/dist/emitters/sequelize.js.map +1 -0
  25. package/dist/formats.d.ts +12 -8
  26. package/dist/formats.js +72 -4
  27. package/dist/formats.js.map +1 -1
  28. package/dist/index.d.ts +10 -0
  29. package/dist/index.js +5 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/io.js +53 -1
  32. package/dist/io.js.map +1 -1
  33. package/dist/parsers/csharpChains.d.ts +36 -0
  34. package/dist/parsers/csharpChains.js +157 -0
  35. package/dist/parsers/csharpChains.js.map +1 -0
  36. package/dist/parsers/csharpDeclarations.d.ts +3 -0
  37. package/dist/parsers/csharpDeclarations.js +293 -0
  38. package/dist/parsers/csharpDeclarations.js.map +1 -0
  39. package/dist/parsers/csharpSyntax.d.ts +130 -0
  40. package/dist/parsers/csharpSyntax.js +339 -0
  41. package/dist/parsers/csharpSyntax.js.map +1 -0
  42. package/dist/parsers/efcore.d.ts +17 -0
  43. package/dist/parsers/efcore.js +265 -0
  44. package/dist/parsers/efcore.js.map +1 -0
  45. package/dist/parsers/efcoreAnnotations.d.ts +19 -0
  46. package/dist/parsers/efcoreAnnotations.js +293 -0
  47. package/dist/parsers/efcoreAnnotations.js.map +1 -0
  48. package/dist/parsers/efcoreBuild.d.ts +13 -0
  49. package/dist/parsers/efcoreBuild.js +523 -0
  50. package/dist/parsers/efcoreBuild.js.map +1 -0
  51. package/dist/parsers/efcoreEntities.d.ts +13 -0
  52. package/dist/parsers/efcoreEntities.js +468 -0
  53. package/dist/parsers/efcoreEntities.js.map +1 -0
  54. package/dist/parsers/efcoreFields.d.ts +22 -0
  55. package/dist/parsers/efcoreFields.js +285 -0
  56. package/dist/parsers/efcoreFields.js.map +1 -0
  57. package/dist/parsers/efcoreFluent.d.ts +47 -0
  58. package/dist/parsers/efcoreFluent.js +375 -0
  59. package/dist/parsers/efcoreFluent.js.map +1 -0
  60. package/dist/parsers/efcoreModel.d.ts +209 -0
  61. package/dist/parsers/efcoreModel.js +2 -0
  62. package/dist/parsers/efcoreModel.js.map +1 -0
  63. package/dist/parsers/efcoreRelations.d.ts +46 -0
  64. package/dist/parsers/efcoreRelations.js +317 -0
  65. package/dist/parsers/efcoreRelations.js.map +1 -0
  66. package/dist/parsers/efcoreSteps.d.ts +89 -0
  67. package/dist/parsers/efcoreSteps.js +793 -0
  68. package/dist/parsers/efcoreSteps.js.map +1 -0
  69. package/dist/parsers/efcoreTypes.d.ts +35 -0
  70. package/dist/parsers/efcoreTypes.js +404 -0
  71. package/dist/parsers/efcoreTypes.js.map +1 -0
  72. package/dist/parsers/sequelize.d.ts +15 -0
  73. package/dist/parsers/sequelize.js +906 -0
  74. package/dist/parsers/sequelize.js.map +1 -0
  75. package/dist/parsers/sequelizeAssociations.d.ts +45 -0
  76. package/dist/parsers/sequelizeAssociations.js +449 -0
  77. package/dist/parsers/sequelizeAssociations.js.map +1 -0
  78. package/dist/parsers/sequelizeCollect.d.ts +33 -0
  79. package/dist/parsers/sequelizeCollect.js +1298 -0
  80. package/dist/parsers/sequelizeCollect.js.map +1 -0
  81. package/dist/parsers/sequelizeInflection.d.ts +14 -0
  82. package/dist/parsers/sequelizeInflection.js +451 -0
  83. package/dist/parsers/sequelizeInflection.js.map +1 -0
  84. package/dist/parsers/sequelizeModel.d.ts +185 -0
  85. package/dist/parsers/sequelizeModel.js +2 -0
  86. package/dist/parsers/sequelizeModel.js.map +1 -0
  87. package/dist/parsers/sequelizeTypes.d.ts +24 -0
  88. package/dist/parsers/sequelizeTypes.js +248 -0
  89. package/dist/parsers/sequelizeTypes.js.map +1 -0
  90. package/dist/styles.d.ts +18 -0
  91. package/dist/styles.js +43 -0
  92. package/dist/styles.js.map +1 -0
  93. package/package.json +4 -1
@@ -0,0 +1,317 @@
1
+ import { navsOf, scalarsOf } from './efcoreEntities.js';
2
+ import { isValueType } from './efcoreTypes.js';
3
+ /** Finds a scalar member of an entity by property name, ignoring case. */
4
+ export function findScalar(info, name) {
5
+ const scalars = scalarsOf(info).filter((member) => member.prefix === '');
6
+ return (scalars.find((member) => member.name === name) ??
7
+ scalars.find((member) => member.name.toLowerCase() === name.toLowerCase()));
8
+ }
9
+ /** The primary key property names of an entity: explicit, or `Id` / `<Type>Id` by convention. */
10
+ export function keyOf(info) {
11
+ if (info.config.key !== undefined) {
12
+ return info.config.key;
13
+ }
14
+ if (info.config.keyless) {
15
+ return [];
16
+ }
17
+ const byId = findScalar(info, 'Id');
18
+ if (byId !== undefined) {
19
+ return [byId.name];
20
+ }
21
+ const byTypeId = findScalar(info, `${info.name}Id`);
22
+ return byTypeId === undefined ? [] : [byTypeId.name];
23
+ }
24
+ /** Whether the property can hold null, before the key and relationship rules adjust it. */
25
+ export function isNullableMember(member, nullableRefs, enumNames) {
26
+ if (member.config.required !== undefined) {
27
+ return !member.config.required;
28
+ }
29
+ if (member.type.nullable) {
30
+ return true;
31
+ }
32
+ if (isValueType(member.type, enumNames)) {
33
+ return false;
34
+ }
35
+ return !nullableRefs;
36
+ }
37
+ function splitNames(text) {
38
+ return (text ?? '')
39
+ .split(',')
40
+ .map((part) => part.trim())
41
+ .filter((part) => part !== '');
42
+ }
43
+ /** Foreign key property names the conventions would pick, or undefined when none match. */
44
+ function conventionKey(dependent, navigation, principal, keyNames, allowKeyName) {
45
+ const prefixes = [];
46
+ if (navigation !== undefined) {
47
+ prefixes.push(navigation);
48
+ }
49
+ prefixes.push(principal.name);
50
+ const patterns = [];
51
+ for (const prefix of prefixes) {
52
+ patterns.push((key) => `${prefix}${key}`);
53
+ patterns.push(() => `${prefix}Id`);
54
+ }
55
+ if (allowKeyName) {
56
+ patterns.push((key) => key);
57
+ }
58
+ for (const pattern of patterns) {
59
+ const names = keyNames.map(pattern);
60
+ if (keyNames.length > 1 && new Set(names).size !== names.length) {
61
+ continue;
62
+ }
63
+ const found = [];
64
+ for (const name of names) {
65
+ const member = findScalar(dependent, name);
66
+ if (member !== undefined) {
67
+ found.push(member);
68
+ }
69
+ }
70
+ if (found.length === names.length && found.length > 0) {
71
+ return found.map((member) => member.name);
72
+ }
73
+ }
74
+ return undefined;
75
+ }
76
+ /** Foreign key names from [ForeignKey] attributes on either navigation or on a scalar property. */
77
+ function attributeKey(dependent, dependentNav, principalNav) {
78
+ const fromNav = splitNames(dependentNav?.foreignKeyAttr ?? principalNav?.foreignKeyAttr);
79
+ if (fromNav.length > 0) {
80
+ return fromNav;
81
+ }
82
+ if (dependentNav !== undefined) {
83
+ const marked = scalarsOf(dependent).filter((member) => member.foreignKeyNav === dependentNav.name);
84
+ if (marked.length > 0) {
85
+ return marked.map((member) => member.name);
86
+ }
87
+ }
88
+ return undefined;
89
+ }
90
+ /** Reads the relationships of the entities from the fluent API, [ForeignKey], [InverseProperty] and conventions. */
91
+ export function resolveRelationships(infos, store, resolve, warn) {
92
+ const links = [];
93
+ const manyToMany = [];
94
+ const consumed = new Set();
95
+ const navNamed = (info, name) => info === undefined || name === undefined
96
+ ? undefined
97
+ : navsOf(info).find((member) => member.name === name);
98
+ const addLink = (dependent, principal, dependentNav, principalNav, isOneToOne, fluent) => {
99
+ const keyNames = fluent?.principalKey !== undefined && fluent.principalKey.length > 0
100
+ ? fluent.principalKey
101
+ : keyOf(principal);
102
+ if (keyNames.length === 0) {
103
+ warn(`${dependent.name}${dependentNav === undefined ? '' : `.${dependentNav.name}`}: the relationship to ${principal.name} was skipped because ${principal.name} has no primary key to reference.`);
104
+ return;
105
+ }
106
+ const explicit = fluent?.foreignKey !== undefined && fluent.foreignKey.length > 0
107
+ ? fluent.foreignKey
108
+ : attributeKey(dependent, dependentNav, principalNav);
109
+ const foreignKey = explicit ??
110
+ conventionKey(dependent, dependentNav?.name, principal, keyNames, isOneToOne);
111
+ const shadow = keyNames.map((key) => `${dependentNav?.name ?? principal.name}${key}`);
112
+ const names = foreignKey ?? shadow;
113
+ const isShadow = names.some((name) => findScalar(dependent, name) === undefined);
114
+ links.push({
115
+ dependent,
116
+ principal,
117
+ ...(dependentNav === undefined ? {} : { dependentNav }),
118
+ ...(principalNav === undefined ? {} : { principalNav }),
119
+ foreignKey: names.map((name) => findScalar(dependent, name)?.name ?? name),
120
+ isShadow,
121
+ principalKey: keyNames,
122
+ isOneToOne,
123
+ required: fluent?.required,
124
+ onDelete: fluent?.onDelete ?? store.globalDeleteBehavior,
125
+ constraintName: fluent?.constraintName,
126
+ });
127
+ if (dependentNav !== undefined) {
128
+ consumed.add(dependentNav);
129
+ }
130
+ if (principalNav !== undefined) {
131
+ consumed.add(principalNav);
132
+ }
133
+ };
134
+ // Relationships configured with the fluent API ---------------------------------------------
135
+ const configs = [...store.entities.values()];
136
+ for (const config of configs) {
137
+ for (const rel of config.relations) {
138
+ const owner = resolve(rel.owner);
139
+ const ownerNav = navNamed(owner, rel.ownerNav);
140
+ const targetName = ownerNav?.target ?? rel.target;
141
+ const target = targetName === undefined ? undefined : resolve(targetName);
142
+ const place = `${rel.owner}.${rel.ownerNav ?? `${rel.ownerMany ? 'HasMany' : 'HasOne'}<${rel.target ?? '?'}>`}`;
143
+ if (!rel.complete) {
144
+ warn(`${place}: the relationship has no WithOne / WithMany call and was ignored.`);
145
+ continue;
146
+ }
147
+ if (owner === undefined || target === undefined) {
148
+ warn(`${place}: the relationship points to ${targetName ?? 'an unknown type'}, which is not an entity in the input; it was skipped.`);
149
+ continue;
150
+ }
151
+ const inverseNav = navNamed(target, rel.inverseNav);
152
+ if (rel.ownerMany && rel.inverseMany) {
153
+ manyToMany.push({
154
+ left: owner,
155
+ right: target,
156
+ leftNav: ownerNav,
157
+ rightNav: inverseNav,
158
+ join: rel.join,
159
+ });
160
+ if (ownerNav !== undefined) {
161
+ consumed.add(ownerNav);
162
+ }
163
+ if (inverseNav !== undefined) {
164
+ consumed.add(inverseNav);
165
+ }
166
+ continue;
167
+ }
168
+ if (!rel.ownerMany && rel.inverseMany) {
169
+ addLink(owner, target, ownerNav, inverseNav, false, rel);
170
+ }
171
+ else if (rel.ownerMany) {
172
+ addLink(target, owner, inverseNav, ownerNav, false, rel);
173
+ }
174
+ else {
175
+ // One to one: the entity that holds the foreign key is the dependent.
176
+ const named = rel.foreignKeyEntity === undefined
177
+ ? undefined
178
+ : resolve(rel.foreignKeyEntity);
179
+ const keyed = rel.foreignKey ?? [];
180
+ const holds = (side, sideNav, other, allowKeyName) => named !== undefined
181
+ ? named === side
182
+ : keyed.length > 0
183
+ ? keyed.every((name) => findScalar(side, name) !== undefined)
184
+ : conventionKey(side, sideNav?.name, other, keyOf(other), allowKeyName) !== undefined;
185
+ let ownerHolds = holds(owner, ownerNav, target, false);
186
+ let targetHolds = holds(target, inverseNav, owner, false);
187
+ if (!ownerHolds && !targetHolds) {
188
+ ownerHolds = holds(owner, ownerNav, target, true);
189
+ targetHolds = holds(target, inverseNav, owner, true);
190
+ }
191
+ if (ownerHolds || !targetHolds) {
192
+ if (!ownerHolds && !targetHolds) {
193
+ warn(`${place}: the dependent side of the one-to-one relationship is not named (HasForeignKey) and no foreign key property was found; ${owner.name} was assumed.`);
194
+ }
195
+ addLink(owner, target, ownerNav, inverseNav, true, rel);
196
+ }
197
+ else {
198
+ addLink(target, owner, inverseNav, ownerNav, true, rel);
199
+ }
200
+ }
201
+ }
202
+ }
203
+ // Relationships found by convention, [ForeignKey] and [InverseProperty] --------------------
204
+ for (const info of infos) {
205
+ for (const nav of navsOf(info)) {
206
+ if (consumed.has(nav)) {
207
+ continue;
208
+ }
209
+ const place = `${info.name}.${nav.name}`;
210
+ const target = resolve(nav.target);
211
+ if (target === undefined) {
212
+ warn(`${place}: ${nav.target} is not an entity in the input; the navigation was skipped.`);
213
+ consumed.add(nav);
214
+ continue;
215
+ }
216
+ const candidates = navsOf(target).filter((other) => other !== nav &&
217
+ !consumed.has(other) &&
218
+ resolve(other.target) === info);
219
+ let inverse;
220
+ if (nav.inverseAttr !== undefined) {
221
+ inverse = candidates.find((other) => other.name === nav.inverseAttr);
222
+ }
223
+ else {
224
+ const pointing = candidates.filter((other) => other.inverseAttr === nav.name);
225
+ const free = pointing.length > 0
226
+ ? pointing
227
+ : candidates.filter((other) => other.inverseAttr === undefined);
228
+ if (free.length === 1) {
229
+ inverse = free[0];
230
+ }
231
+ else if (free.length > 1) {
232
+ warn(`${place}: ${target.name} has several navigations back to ${info.name} (${free
233
+ .map((other) => other.name)
234
+ .join(', ')}); add [InverseProperty] or WithMany(...) to pair them. The navigation was skipped.`);
235
+ consumed.add(nav);
236
+ continue;
237
+ }
238
+ }
239
+ if (inverse !== undefined && nav.inverseAttr === undefined) {
240
+ // Another navigation of this entity that also points to the target competes for the same inverse.
241
+ const competitors = navsOf(info).filter((other) => other !== nav &&
242
+ other !== inverse &&
243
+ !consumed.has(other) &&
244
+ other.inverseAttr === undefined &&
245
+ resolve(other.target) === target);
246
+ if (competitors.length > 0) {
247
+ warn(`${place}: ${info.name} has several navigations to ${target.name} (${[
248
+ nav,
249
+ ...competitors,
250
+ ]
251
+ .map((other) => other.name)
252
+ .join(', ')}) and ${target.name}.${inverse.name} could belong to any of them; add [InverseProperty] or WithMany(...) to pair them. The navigations were skipped.`);
253
+ consumed.add(nav);
254
+ for (const other of competitors) {
255
+ consumed.add(other);
256
+ }
257
+ continue;
258
+ }
259
+ }
260
+ if (nav.many && inverse?.many === true) {
261
+ manyToMany.push({
262
+ left: info,
263
+ right: target,
264
+ leftNav: nav,
265
+ rightNav: inverse,
266
+ join: undefined,
267
+ });
268
+ consumed.add(nav);
269
+ consumed.add(inverse);
270
+ continue;
271
+ }
272
+ if (nav.many) {
273
+ addLink(target, info, inverse, nav, false, undefined);
274
+ consumed.add(nav);
275
+ continue;
276
+ }
277
+ if (inverse?.many === true) {
278
+ addLink(info, target, nav, inverse, false, undefined);
279
+ consumed.add(nav);
280
+ continue;
281
+ }
282
+ if (inverse === undefined) {
283
+ addLink(info, target, nav, undefined, false, undefined);
284
+ consumed.add(nav);
285
+ continue;
286
+ }
287
+ // Single to single: a one-to-one. The dependent is the side that has the foreign key.
288
+ const keyOn = (side, sideNav, other, otherNav, allowKeyName) => {
289
+ // A [ForeignKey] on either navigation names the key, but only the side that has those properties holds it.
290
+ const named = attributeKey(side, sideNav, otherNav);
291
+ if (named !== undefined) {
292
+ return named.every((name) => findScalar(side, name) !== undefined);
293
+ }
294
+ return (conventionKey(side, sideNav.name, other, keyOf(other), allowKeyName) !== undefined);
295
+ };
296
+ let keyOnInfo = keyOn(info, nav, target, inverse, false);
297
+ let keyOnTarget = keyOn(target, inverse, info, nav, false);
298
+ if (!keyOnInfo && !keyOnTarget) {
299
+ keyOnInfo = keyOn(info, nav, target, inverse, true);
300
+ keyOnTarget = keyOn(target, inverse, info, nav, true);
301
+ }
302
+ if (keyOnInfo || !keyOnTarget) {
303
+ if (!keyOnInfo && !keyOnTarget) {
304
+ warn(`${place}: neither side of the one-to-one relationship with ${target.name} has a foreign key property; EF Core needs HasForeignKey. ${info.name} was assumed to be the dependent.`);
305
+ }
306
+ addLink(info, target, nav, inverse, true, undefined);
307
+ }
308
+ else {
309
+ addLink(target, info, inverse, nav, true, undefined);
310
+ }
311
+ consumed.add(nav);
312
+ consumed.add(inverse);
313
+ }
314
+ }
315
+ return { links, manyToMany };
316
+ }
317
+ //# sourceMappingURL=efcoreRelations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"efcoreRelations.js","sourceRoot":"","sources":["../../src/parsers/efcoreRelations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { type ConstLookup, type CsClass } from './csharpSyntax.js';
2
+ import { type CsCall, type CsLambda } from './csharpChains.js';
3
+ import type { ConfigIndex, EntityConfig, FluentRelation, JoinConfig, OwnedConfig, PropConfig, Project, Scope } from './efcoreModel.js';
4
+ /** What a builder variable stands for while the fluent calls are read. */
5
+ export type Target = {
6
+ kind: 'model';
7
+ } | {
8
+ kind: 'entity';
9
+ entity: string;
10
+ config: EntityConfig;
11
+ scope: Scope;
12
+ /** Dotted prefix of the owned navigation path, '' for the entity itself. */
13
+ prefix: string;
14
+ owned?: OwnedConfig;
15
+ } | {
16
+ kind: 'property';
17
+ cfg: PropConfig;
18
+ name: string;
19
+ } | {
20
+ kind: 'index';
21
+ index: ConfigIndex;
22
+ } | {
23
+ kind: 'key';
24
+ config: EntityConfig;
25
+ } | {
26
+ kind: 'relation';
27
+ rel: FluentRelation;
28
+ } | {
29
+ kind: 'table';
30
+ config: EntityConfig;
31
+ } | {
32
+ kind: 'discriminator';
33
+ config: EntityConfig;
34
+ } | {
35
+ kind: 'join';
36
+ join: JoinConfig;
37
+ } | {
38
+ kind: 'joinSide';
39
+ join: JoinConfig;
40
+ owner: string;
41
+ target: string;
42
+ side?: 'left' | 'right';
43
+ } | {
44
+ kind: 'none';
45
+ };
46
+ export declare const NONE: Target;
47
+ /**
48
+ * The interpretation of fluent calls: what each builder method does to the configuration of an entity, a
49
+ * property, an index or a relationship. `ConfigStore` adds the registry of entities and the code that walks
50
+ * statements and finds the calls.
51
+ */
52
+ export declare abstract class FluentSteps {
53
+ abstract readonly project: Project;
54
+ abstract readonly consts: ConstLookup;
55
+ readonly ownedTypes: Set<string>;
56
+ readonly ignoredEntities: Set<string>;
57
+ defaultSchema: string | undefined;
58
+ abstract warn(message: string): void;
59
+ abstract unknownCall(name: string, place: string, detail?: string): void;
60
+ abstract entity(name: string): EntityConfig | undefined;
61
+ abstract runConfiguration(cls: CsClass, entityName: string): void;
62
+ abstract applyAllConfigurations(): void;
63
+ protected abstract entityTarget(config: EntityConfig): Target;
64
+ protected abstract runLambda(lambda: CsLambda, target: Target, bindings: Map<string, Target>, place: string, owner: CsClass): void;
65
+ protected step(target: Target, call: CsCall, bindings: Map<string, Target>, place: string, owner: CsClass): Target;
66
+ /** The first argument from `from` on that is a lambda. */
67
+ private lambdaArg;
68
+ private stringAt;
69
+ private boolAt;
70
+ private numberAt;
71
+ /** The property names selected by every argument of a call (lambdas, strings, nameof, arrays). */
72
+ private members;
73
+ private memberAt;
74
+ private entityNameOf;
75
+ private stepModel;
76
+ private stepEntity;
77
+ /** Finds the scope and property name for a possibly dotted member path. */
78
+ private resolveScope;
79
+ private prefixed;
80
+ private stepProperty;
81
+ private stepKey;
82
+ private stepIndex;
83
+ private stepRelation;
84
+ private readUsingEntity;
85
+ private stepJoin;
86
+ private stepJoinSide;
87
+ private stepTable;
88
+ private stepDiscriminator;
89
+ }