ormbridge 0.8.0 → 0.10.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 +3 -3
- package/dist/cliRunner.js.map +1 -1
- package/dist/config.d.ts +3 -2
- 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/jpa.d.ts +36 -0
- package/dist/emitters/jpa.js +253 -0
- package/dist/emitters/jpa.js.map +1 -0
- package/dist/emitters/jpaColumns.d.ts +25 -0
- package/dist/emitters/jpaColumns.js +341 -0
- package/dist/emitters/jpaColumns.js.map +1 -0
- package/dist/emitters/jpaDefaults.d.ts +24 -0
- package/dist/emitters/jpaDefaults.js +223 -0
- package/dist/emitters/jpaDefaults.js.map +1 -0
- package/dist/emitters/jpaEnums.d.ts +11 -0
- package/dist/emitters/jpaEnums.js +134 -0
- package/dist/emitters/jpaEnums.js.map +1 -0
- package/dist/emitters/jpaFormat.d.ts +16 -0
- package/dist/emitters/jpaFormat.js +73 -0
- package/dist/emitters/jpaFormat.js.map +1 -0
- package/dist/emitters/jpaKeys.d.ts +25 -0
- package/dist/emitters/jpaKeys.js +110 -0
- package/dist/emitters/jpaKeys.js.map +1 -0
- package/dist/emitters/jpaNames.d.ts +26 -0
- package/dist/emitters/jpaNames.js +234 -0
- package/dist/emitters/jpaNames.js.map +1 -0
- package/dist/emitters/jpaRelations.d.ts +41 -0
- package/dist/emitters/jpaRelations.js +304 -0
- package/dist/emitters/jpaRelations.js.map +1 -0
- package/dist/emitters/jpaRender.d.ts +10 -0
- package/dist/emitters/jpaRender.js +81 -0
- package/dist/emitters/jpaRender.js.map +1 -0
- package/dist/emitters/jpaScalars.d.ts +32 -0
- package/dist/emitters/jpaScalars.js +188 -0
- package/dist/emitters/jpaScalars.js.map +1 -0
- package/dist/emitters/jpaTable.d.ts +10 -0
- package/dist/emitters/jpaTable.js +109 -0
- package/dist/emitters/jpaTable.js.map +1 -0
- package/dist/emitters/jpaTypes.d.ts +85 -0
- package/dist/emitters/jpaTypes.js +36 -0
- package/dist/emitters/jpaTypes.js.map +1 -0
- package/dist/formats.d.ts +8 -4
- package/dist/formats.js +68 -0
- package/dist/formats.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/io.js +51 -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/javaSyntax.d.ts +120 -0
- package/dist/parsers/javaSyntax.js +304 -0
- package/dist/parsers/javaSyntax.js.map +1 -0
- package/dist/parsers/javaValues.d.ts +5 -0
- package/dist/parsers/javaValues.js +187 -0
- package/dist/parsers/javaValues.js.map +1 -0
- package/dist/parsers/jpa.d.ts +17 -0
- package/dist/parsers/jpa.js +131 -0
- package/dist/parsers/jpa.js.map +1 -0
- package/dist/parsers/jpaAnnotations.d.ts +46 -0
- package/dist/parsers/jpaAnnotations.js +156 -0
- package/dist/parsers/jpaAnnotations.js.map +1 -0
- package/dist/parsers/jpaBuild.d.ts +4 -0
- package/dist/parsers/jpaBuild.js +297 -0
- package/dist/parsers/jpaBuild.js.map +1 -0
- package/dist/parsers/jpaClasses.d.ts +27 -0
- package/dist/parsers/jpaClasses.js +257 -0
- package/dist/parsers/jpaClasses.js.map +1 -0
- package/dist/parsers/jpaCollections.d.ts +12 -0
- package/dist/parsers/jpaCollections.js +106 -0
- package/dist/parsers/jpaCollections.js.map +1 -0
- package/dist/parsers/jpaColumns.d.ts +26 -0
- package/dist/parsers/jpaColumns.js +361 -0
- package/dist/parsers/jpaColumns.js.map +1 -0
- package/dist/parsers/jpaEntities.d.ts +9 -0
- package/dist/parsers/jpaEntities.js +181 -0
- package/dist/parsers/jpaEntities.js.map +1 -0
- package/dist/parsers/jpaIndexes.d.ts +12 -0
- package/dist/parsers/jpaIndexes.js +87 -0
- package/dist/parsers/jpaIndexes.js.map +1 -0
- package/dist/parsers/jpaJoins.d.ts +68 -0
- package/dist/parsers/jpaJoins.js +131 -0
- package/dist/parsers/jpaJoins.js.map +1 -0
- package/dist/parsers/jpaModel.d.ts +73 -0
- package/dist/parsers/jpaModel.js +2 -0
- package/dist/parsers/jpaModel.js.map +1 -0
- package/dist/parsers/jpaNotes.d.ts +20 -0
- package/dist/parsers/jpaNotes.js +138 -0
- package/dist/parsers/jpaNotes.js.map +1 -0
- package/dist/parsers/jpaRelations.d.ts +4 -0
- package/dist/parsers/jpaRelations.js +242 -0
- package/dist/parsers/jpaRelations.js.map +1 -0
- package/dist/parsers/jpaTypes.d.ts +23 -0
- package/dist/parsers/jpaTypes.js +232 -0
- package/dist/parsers/jpaTypes.js.map +1 -0
- package/dist/styles.d.ts +4 -2
- package/dist/styles.js +7 -1
- package/dist/styles.js.map +1 -1
- package/package.json +10 -1
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { toCamelCase, toSnakeCase } from '../naming.js';
|
|
2
|
+
import { cleanIdentifier, columnNameOf, irFieldName } from './jpaColumns.js';
|
|
3
|
+
import { cascadeNote, constraintName, joinColumnsOf, joinPairs, modelOwner, onDeleteOf, relationAnnotation, tableNameOf, targetOf, } from './jpaJoins.js';
|
|
4
|
+
import { decapitalize } from './jpaTypes.js';
|
|
5
|
+
/** Resolves the relationship attributes of one model. */
|
|
6
|
+
export function resolveRelations(model, members, resolver) {
|
|
7
|
+
const output = {
|
|
8
|
+
relations: [],
|
|
9
|
+
composite: [],
|
|
10
|
+
extraFields: [],
|
|
11
|
+
consumed: new Map(),
|
|
12
|
+
foreign: [],
|
|
13
|
+
inverse: [],
|
|
14
|
+
};
|
|
15
|
+
members.forEach((member, order) => {
|
|
16
|
+
if (member.kind !== 'relation') {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const annotation = relationAnnotation(member);
|
|
20
|
+
const place = `${model.name}.${member.path.join('.')}`;
|
|
21
|
+
const target = targetOf(member, annotation, resolver);
|
|
22
|
+
if (target === undefined) {
|
|
23
|
+
resolver.warn(`${place}: the target type ${member.attr.type.args[0]?.name ?? member.attr.type.name} of @${annotation.name} is not an entity in the input; the relationship was skipped.`);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
cascadeNote(member, annotation, place, resolver);
|
|
27
|
+
const mappedBy = annotation.string('mappedBy');
|
|
28
|
+
if (mappedBy !== undefined && mappedBy !== '') {
|
|
29
|
+
output.inverse.push({
|
|
30
|
+
model: modelOwner(target),
|
|
31
|
+
attribute: mappedBy.split('.').pop() ?? mappedBy,
|
|
32
|
+
relatedName: member.attr.name,
|
|
33
|
+
});
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (annotation.name === 'ManyToMany') {
|
|
37
|
+
manyToMany(model, member, target, order, output, resolver, place);
|
|
38
|
+
}
|
|
39
|
+
else if (annotation.name === 'OneToMany') {
|
|
40
|
+
oneToMany(model, member, target, order, output, resolver, place);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
toOne(model, member, annotation, target, order, output, resolver, place);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return output;
|
|
47
|
+
}
|
|
48
|
+
function toOne(model, member, annotation, target, order, output, resolver, place) {
|
|
49
|
+
const pairs = joinPairs(member, target, resolver, place);
|
|
50
|
+
if (pairs === undefined) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const targetModel = modelOwner(target);
|
|
54
|
+
const isOneToOne = annotation.name === 'OneToOne';
|
|
55
|
+
const optional = annotation.boolean('optional') !== false;
|
|
56
|
+
const mapsId = member.attr.notes.get('MapsId');
|
|
57
|
+
// The older way to share a key: @PrimaryKeyJoinColumn makes the id column the foreign key.
|
|
58
|
+
const sharesKey = mapsId !== undefined || member.attr.notes.has('PrimaryKeyJoinColumn');
|
|
59
|
+
const declaredNotNull = member.attr.notes.has('NotNull');
|
|
60
|
+
const nullable = optional &&
|
|
61
|
+
!declaredNotNull &&
|
|
62
|
+
pairs.every((pair) => pair.nullable !== false) &&
|
|
63
|
+
!member.isId &&
|
|
64
|
+
!sharesKey;
|
|
65
|
+
const name = irFieldName(member);
|
|
66
|
+
const onDelete = onDeleteOf(member, place, resolver);
|
|
67
|
+
const unique = isOneToOne || pairs.some((pair) => pair.unique);
|
|
68
|
+
const kind = unique ? 'oneToOne' : 'foreignKey';
|
|
69
|
+
const constraint = constraintName(pairs[0], member, place, resolver);
|
|
70
|
+
const first = pairs[0];
|
|
71
|
+
if (first === undefined) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// A shared key: @MapsId makes the foreign key the primary key (or a part of the embedded id).
|
|
75
|
+
let columnName = first.columnName;
|
|
76
|
+
let isKey = member.isId;
|
|
77
|
+
if (sharesKey) {
|
|
78
|
+
const part = mapsId?.string('value');
|
|
79
|
+
const idMembers = model.members.filter((item) => item.isId);
|
|
80
|
+
const mapped = part === undefined || part === ''
|
|
81
|
+
? idMembers[0]
|
|
82
|
+
: idMembers.find((item) => item.path[item.path.length - 1] === part);
|
|
83
|
+
if (mapped !== undefined) {
|
|
84
|
+
output.consumed.set(mapped.path.join('.'), name);
|
|
85
|
+
isKey = true;
|
|
86
|
+
if (mapsId === undefined) {
|
|
87
|
+
columnName = columnNameOf(mapped);
|
|
88
|
+
resolver.warn(`${place}: @PrimaryKeyJoinColumn shares the primary key, but Hibernate creates no foreign key constraint for it; it was read as a one-to-one primary key relation, so writers will add the constraint (@MapsId creates it in Hibernate, too).`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
resolver.warn(`${place}: the shared key names "${part ?? ''}", which is not an id attribute of ${model.name}.`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (pairs.length > 1) {
|
|
96
|
+
compositeKey(model, member, pairs, targetModel, kind, nullable, onDelete, output, resolver);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const referencedKey = resolver.keyOf(target);
|
|
100
|
+
const isPrimaryReference = referencedKey.length === 1 &&
|
|
101
|
+
referencedKey[0]?.columnName === first.target.columnName;
|
|
102
|
+
const relation = {
|
|
103
|
+
name,
|
|
104
|
+
kind,
|
|
105
|
+
targetModel: targetModel.name,
|
|
106
|
+
columnName,
|
|
107
|
+
isNullable: isKey ? false : nullable,
|
|
108
|
+
onDelete,
|
|
109
|
+
...(isPrimaryReference ? {} : { toField: first.target.name }),
|
|
110
|
+
...(isKey ? { isPrimaryKey: true } : {}),
|
|
111
|
+
...(constraint === undefined ? {} : { constraintName: constraint }),
|
|
112
|
+
};
|
|
113
|
+
output.relations.push({ order, relation });
|
|
114
|
+
const mirror = scalarOnColumn(model, columnName);
|
|
115
|
+
if (mirror !== undefined) {
|
|
116
|
+
output.consumed.set(mirror, name);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** The path of a scalar member of the model that maps the same column (a read-only copy of the key). */
|
|
120
|
+
function scalarOnColumn(model, columnName) {
|
|
121
|
+
const found = model.members.find((member) => member.kind === 'basic' &&
|
|
122
|
+
!member.isId &&
|
|
123
|
+
columnNameOf(member).toLowerCase() === columnName.toLowerCase());
|
|
124
|
+
return found?.path.join('.');
|
|
125
|
+
}
|
|
126
|
+
function compositeKey(model, member, pairs, target, kind, nullable, onDelete, output, resolver) {
|
|
127
|
+
const targetFields = resolver.fieldsOf(target);
|
|
128
|
+
const local = [];
|
|
129
|
+
for (const pair of pairs) {
|
|
130
|
+
const existing = model.members.find((item) => item.kind === 'basic' &&
|
|
131
|
+
columnNameOf(item).toLowerCase() === pair.columnName.toLowerCase());
|
|
132
|
+
if (existing !== undefined) {
|
|
133
|
+
local.push(irFieldName(existing));
|
|
134
|
+
output.consumed.delete(existing.path.join('.'));
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const referenced = targetFields.find((item) => item.field.name === pair.target.name);
|
|
138
|
+
const name = toCamelCase(pair.columnName);
|
|
139
|
+
output.extraFields.push({
|
|
140
|
+
name,
|
|
141
|
+
columnName: pair.columnName,
|
|
142
|
+
type: referenced?.field.type ?? 'unsupported',
|
|
143
|
+
isPrimaryKey: false,
|
|
144
|
+
isUnique: false,
|
|
145
|
+
isNullable: nullable,
|
|
146
|
+
isAutoUpdated: false,
|
|
147
|
+
...(referenced?.field.maxLength === undefined
|
|
148
|
+
? {}
|
|
149
|
+
: { maxLength: referenced.field.maxLength }),
|
|
150
|
+
...(referenced?.field.maxDigits === undefined
|
|
151
|
+
? {}
|
|
152
|
+
: { maxDigits: referenced.field.maxDigits }),
|
|
153
|
+
...(referenced?.field.decimalPlaces === undefined
|
|
154
|
+
? {}
|
|
155
|
+
: { decimalPlaces: referenced.field.decimalPlaces }),
|
|
156
|
+
});
|
|
157
|
+
local.push(name);
|
|
158
|
+
}
|
|
159
|
+
output.composite.push({
|
|
160
|
+
name: irFieldName(member),
|
|
161
|
+
targetModel: target.name,
|
|
162
|
+
fields: local,
|
|
163
|
+
references: pairs.map((pair) => pair.target.name),
|
|
164
|
+
kind,
|
|
165
|
+
isNullable: nullable,
|
|
166
|
+
onDelete,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
function oneToMany(model, member, target, order, output, resolver, place) {
|
|
170
|
+
const targetModel = modelOwner(target);
|
|
171
|
+
if (joinColumnsOf(member).length === 0) {
|
|
172
|
+
// Without a join column Hibernate stores the link in a join table, like a many-to-many with a unique target.
|
|
173
|
+
resolver.warn(`${place}: a unidirectional @OneToMany without @JoinColumn uses a join table; it was read as a many-to-many relation (that each ${target.name} belongs to one ${model.name} is not represented).`);
|
|
174
|
+
manyToMany(model, member, target, order, output, resolver, place);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
// @OneToMany with @JoinColumn: the foreign key is a column of the target's table.
|
|
178
|
+
const ownerKeys = resolver.keyOf(model);
|
|
179
|
+
const columns = joinColumnsOf(member);
|
|
180
|
+
const first = columns[0];
|
|
181
|
+
const key = ownerKeys[0];
|
|
182
|
+
if (first === undefined || key === undefined || columns.length > 1) {
|
|
183
|
+
resolver.warn(`${place}: a @OneToMany with several join columns (or an owner without a key) is not supported; the relationship was skipped.`);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const given = first.string('name');
|
|
187
|
+
const columnName = given === undefined || given === ''
|
|
188
|
+
? `${member.attr.name}_${key.columnName}`
|
|
189
|
+
: cleanIdentifier(given);
|
|
190
|
+
const name = decapitalize(model.name);
|
|
191
|
+
output.foreign.push({
|
|
192
|
+
model: targetModel,
|
|
193
|
+
relation: {
|
|
194
|
+
name,
|
|
195
|
+
kind: 'foreignKey',
|
|
196
|
+
targetModel: modelOwner(model).name,
|
|
197
|
+
columnName,
|
|
198
|
+
isNullable: first.boolean('nullable') !== false,
|
|
199
|
+
onDelete: onDeleteOf(member, place, resolver),
|
|
200
|
+
relatedName: member.attr.name,
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
function manyToMany(model, member, target, order, output, resolver, place) {
|
|
205
|
+
const name = irFieldName(member);
|
|
206
|
+
const relation = {
|
|
207
|
+
name,
|
|
208
|
+
kind: 'manyToMany',
|
|
209
|
+
targetModel: modelOwner(target).name,
|
|
210
|
+
columnName: `${toSnakeCase(name)}_id`,
|
|
211
|
+
isNullable: false,
|
|
212
|
+
onDelete: 'cascade',
|
|
213
|
+
};
|
|
214
|
+
output.relations.push({ order, relation });
|
|
215
|
+
joinTableNote(model, member, target, relation, resolver, place);
|
|
216
|
+
}
|
|
217
|
+
/** Warns when the join table or its columns differ from the names the other formats will derive. */
|
|
218
|
+
function joinTableNote(model, member, target, relation, resolver, place) {
|
|
219
|
+
const join = member.attr.notes.get('JoinTable');
|
|
220
|
+
const ownerKey = resolver.keyOf(model)[0];
|
|
221
|
+
const targetKey = resolver.keyOf(target)[0];
|
|
222
|
+
const ownerTable = tableNameOf(modelOwner(model));
|
|
223
|
+
const targetTable = tableNameOf(modelOwner(target));
|
|
224
|
+
const actualTable = join?.string('name') || `${ownerTable}_${targetTable}`;
|
|
225
|
+
const left = join?.annotations('joinColumns')[0];
|
|
226
|
+
const right = join?.annotations('inverseJoinColumns')[0];
|
|
227
|
+
const actualLeft = left?.string('name') ||
|
|
228
|
+
`${model.entityName}_${ownerKey?.columnName ?? 'id'}`;
|
|
229
|
+
const actualRight = right?.string('name') ||
|
|
230
|
+
`${member.attr.name}_${targetKey?.columnName ?? 'id'}`;
|
|
231
|
+
const isSelf = model.name === target.name;
|
|
232
|
+
const expectedTable = `${ownerTable}_${relation.name}`;
|
|
233
|
+
const expectedLeft = `${isSelf ? 'from_' : ''}${toSnakeCase(model.name)}_id`;
|
|
234
|
+
const expectedRight = `${isSelf ? 'to_' : ''}${toSnakeCase(target.name)}_id`;
|
|
235
|
+
if (actualTable !== expectedTable ||
|
|
236
|
+
actualLeft !== expectedLeft ||
|
|
237
|
+
actualRight !== expectedRight) {
|
|
238
|
+
resolver.warn(`${place}: the join table "${actualTable}" (columns ${actualLeft}, ${actualRight}) is not preserved by name; ` +
|
|
239
|
+
`formats that derive join tables will use "${expectedTable}" (columns ${expectedLeft}, ${expectedRight}).`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=jpaRelations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jpaRelations.js","sourceRoot":"","sources":["../../src/parsers/jpaRelations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { IrOnDelete } from '../ir.js';
|
|
2
|
+
import type { JavaType } from './javaSyntax.js';
|
|
3
|
+
import type { ColumnShape } from './efcoreTypes.js';
|
|
4
|
+
export declare function isPrimitive(type: JavaType): boolean;
|
|
5
|
+
/** True for the integer types an identity or sequence key can have. */
|
|
6
|
+
export declare function isIntegerType(type: JavaType): boolean;
|
|
7
|
+
export declare function isCollectionType(type: JavaType): boolean;
|
|
8
|
+
export declare function isMapType(type: JavaType): boolean;
|
|
9
|
+
/** The element type of a collection or array, or undefined for other types. */
|
|
10
|
+
export declare function elementOf(type: JavaType): JavaType | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* The column a Java type maps to by default, or undefined when JPA has no default for it (a class of your own,
|
|
13
|
+
* `Object`, a `Map`). `imports` tells `java.sql.Date` from `java.util.Date`.
|
|
14
|
+
*/
|
|
15
|
+
export declare function javaColumn(type: JavaType, imports: readonly string[]): ColumnShape | undefined;
|
|
16
|
+
/** The column type `@Temporal` selects. */
|
|
17
|
+
export declare function temporalColumn(kind: string): ColumnShape | undefined;
|
|
18
|
+
/** The IR type for a `SqlTypes.*` constant of `@JdbcTypeCode`; undefined when it is not one the model knows. */
|
|
19
|
+
export declare function jdbcTypeColumn(name: string): ColumnShape | undefined;
|
|
20
|
+
/** Maps a Hibernate `OnDeleteAction` constant to the referential action. */
|
|
21
|
+
export declare function onDeleteAction(name: string): IrOnDelete | undefined;
|
|
22
|
+
/** Lower-cases the first letter: `Post` is `post`, `URL` stays `URL`. */
|
|
23
|
+
export declare function decapitalize(name: string): string;
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/** Java types that are not objects: their columns are NOT NULL. */
|
|
2
|
+
const PRIMITIVES = new Set([
|
|
3
|
+
'int',
|
|
4
|
+
'long',
|
|
5
|
+
'short',
|
|
6
|
+
'byte',
|
|
7
|
+
'boolean',
|
|
8
|
+
'float',
|
|
9
|
+
'double',
|
|
10
|
+
'char',
|
|
11
|
+
]);
|
|
12
|
+
export function isPrimitive(type) {
|
|
13
|
+
return type.arrayDepth === 0 && PRIMITIVES.has(type.name);
|
|
14
|
+
}
|
|
15
|
+
const INTEGER_TYPES = new Set([
|
|
16
|
+
'int',
|
|
17
|
+
'Integer',
|
|
18
|
+
'short',
|
|
19
|
+
'Short',
|
|
20
|
+
'byte',
|
|
21
|
+
'Byte',
|
|
22
|
+
'long',
|
|
23
|
+
'Long',
|
|
24
|
+
]);
|
|
25
|
+
/** True for the integer types an identity or sequence key can have. */
|
|
26
|
+
export function isIntegerType(type) {
|
|
27
|
+
return type.arrayDepth === 0 && INTEGER_TYPES.has(type.name);
|
|
28
|
+
}
|
|
29
|
+
const COLLECTIONS = new Set([
|
|
30
|
+
'List',
|
|
31
|
+
'Set',
|
|
32
|
+
'Collection',
|
|
33
|
+
'SortedSet',
|
|
34
|
+
'NavigableSet',
|
|
35
|
+
'ArrayList',
|
|
36
|
+
'LinkedList',
|
|
37
|
+
'HashSet',
|
|
38
|
+
'LinkedHashSet',
|
|
39
|
+
'TreeSet',
|
|
40
|
+
'Iterable',
|
|
41
|
+
]);
|
|
42
|
+
export function isCollectionType(type) {
|
|
43
|
+
return type.arrayDepth === 0 && COLLECTIONS.has(type.name);
|
|
44
|
+
}
|
|
45
|
+
export function isMapType(type) {
|
|
46
|
+
return (type.arrayDepth === 0 &&
|
|
47
|
+
/^(Map|HashMap|LinkedHashMap|TreeMap|SortedMap|SortedMap)$/.test(type.name));
|
|
48
|
+
}
|
|
49
|
+
/** The element type of a collection or array, or undefined for other types. */
|
|
50
|
+
export function elementOf(type) {
|
|
51
|
+
if (type.arrayDepth > 0) {
|
|
52
|
+
return { ...type, arrayDepth: type.arrayDepth - 1 };
|
|
53
|
+
}
|
|
54
|
+
return isCollectionType(type) ? type.args[0] : undefined;
|
|
55
|
+
}
|
|
56
|
+
const SIMPLE_SHAPES = {
|
|
57
|
+
String: { type: 'string', maxLength: 255 },
|
|
58
|
+
char: { type: 'string', maxLength: 1 },
|
|
59
|
+
Character: { type: 'string', maxLength: 1 },
|
|
60
|
+
int: { type: 'int' },
|
|
61
|
+
Integer: { type: 'int' },
|
|
62
|
+
short: { type: 'int' },
|
|
63
|
+
Short: { type: 'int' },
|
|
64
|
+
byte: { type: 'int' },
|
|
65
|
+
Byte: { type: 'int' },
|
|
66
|
+
long: { type: 'bigInt' },
|
|
67
|
+
Long: { type: 'bigInt' },
|
|
68
|
+
BigInteger: { type: 'decimal', maxDigits: 38, decimalPlaces: 0 },
|
|
69
|
+
BigDecimal: { type: 'decimal', maxDigits: 38, decimalPlaces: 2 },
|
|
70
|
+
float: { type: 'float' },
|
|
71
|
+
Float: { type: 'float' },
|
|
72
|
+
double: { type: 'float' },
|
|
73
|
+
Double: { type: 'float' },
|
|
74
|
+
boolean: { type: 'boolean' },
|
|
75
|
+
Boolean: { type: 'boolean' },
|
|
76
|
+
LocalDate: { type: 'date' },
|
|
77
|
+
LocalTime: { type: 'time' },
|
|
78
|
+
OffsetTime: { type: 'time' },
|
|
79
|
+
LocalDateTime: { type: 'dateTime' },
|
|
80
|
+
OffsetDateTime: { type: 'dateTime' },
|
|
81
|
+
ZonedDateTime: { type: 'dateTime' },
|
|
82
|
+
Instant: { type: 'dateTime' },
|
|
83
|
+
Timestamp: { type: 'dateTime' },
|
|
84
|
+
Calendar: { type: 'dateTime' },
|
|
85
|
+
GregorianCalendar: { type: 'dateTime' },
|
|
86
|
+
Duration: { type: 'duration' },
|
|
87
|
+
UUID: { type: 'uuid' },
|
|
88
|
+
Blob: { type: 'bytes' },
|
|
89
|
+
Clob: { type: 'text' },
|
|
90
|
+
NClob: { type: 'text' },
|
|
91
|
+
Locale: { type: 'string', maxLength: 255 },
|
|
92
|
+
Currency: { type: 'string', maxLength: 255 },
|
|
93
|
+
TimeZone: { type: 'string', maxLength: 255 },
|
|
94
|
+
ZoneId: { type: 'string', maxLength: 255 },
|
|
95
|
+
URL: { type: 'string', maxLength: 255 },
|
|
96
|
+
Class: { type: 'string', maxLength: 255 },
|
|
97
|
+
InetAddress: { type: 'ipAddress' },
|
|
98
|
+
JsonNode: { type: 'json' },
|
|
99
|
+
ObjectNode: { type: 'json' },
|
|
100
|
+
ArrayNode: { type: 'json' },
|
|
101
|
+
JsonObject: { type: 'json' },
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* The column a Java type maps to by default, or undefined when JPA has no default for it (a class of your own,
|
|
105
|
+
* `Object`, a `Map`). `imports` tells `java.sql.Date` from `java.util.Date`.
|
|
106
|
+
*/
|
|
107
|
+
export function javaColumn(type, imports) {
|
|
108
|
+
if (type.arrayDepth === 1 && /^(byte|Byte)$/.test(type.name)) {
|
|
109
|
+
return { type: 'bytes' };
|
|
110
|
+
}
|
|
111
|
+
if (type.arrayDepth === 1 && type.name === 'char') {
|
|
112
|
+
return { type: 'string', maxLength: 255 };
|
|
113
|
+
}
|
|
114
|
+
if (type.arrayDepth > 0) {
|
|
115
|
+
const inner = javaColumn({ ...type, arrayDepth: 0 }, imports);
|
|
116
|
+
return inner === undefined
|
|
117
|
+
? undefined
|
|
118
|
+
: { ...inner, arrayDepth: type.arrayDepth };
|
|
119
|
+
}
|
|
120
|
+
if (type.name === 'Date') {
|
|
121
|
+
return imports.includes('java.sql.Date') || type.text === 'java.sql.Date'
|
|
122
|
+
? { type: 'date' }
|
|
123
|
+
: { type: 'dateTime' };
|
|
124
|
+
}
|
|
125
|
+
if (type.name === 'Time') {
|
|
126
|
+
return { type: 'time' };
|
|
127
|
+
}
|
|
128
|
+
const shape = SIMPLE_SHAPES[type.name];
|
|
129
|
+
if (shape !== undefined) {
|
|
130
|
+
return shape;
|
|
131
|
+
}
|
|
132
|
+
if (isCollectionType(type) && type.args.length === 1) {
|
|
133
|
+
const inner = type.args[0];
|
|
134
|
+
const column = inner === undefined ? undefined : javaColumn(inner, imports);
|
|
135
|
+
return column === undefined || column.arrayDepth !== undefined
|
|
136
|
+
? undefined
|
|
137
|
+
: { ...column, arrayDepth: 1 };
|
|
138
|
+
}
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
/** The column type `@Temporal` selects. */
|
|
142
|
+
export function temporalColumn(kind) {
|
|
143
|
+
switch (kind) {
|
|
144
|
+
case 'DATE':
|
|
145
|
+
return { type: 'date' };
|
|
146
|
+
case 'TIME':
|
|
147
|
+
return { type: 'time' };
|
|
148
|
+
case 'TIMESTAMP':
|
|
149
|
+
return { type: 'dateTime' };
|
|
150
|
+
default:
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/** The IR type for a `SqlTypes.*` constant of `@JdbcTypeCode`; undefined when it is not one the model knows. */
|
|
155
|
+
export function jdbcTypeColumn(name) {
|
|
156
|
+
switch (name) {
|
|
157
|
+
case 'JSON':
|
|
158
|
+
case 'JSON_ARRAY':
|
|
159
|
+
return { type: 'json' };
|
|
160
|
+
case 'UUID':
|
|
161
|
+
return { type: 'uuid' };
|
|
162
|
+
case 'BLOB':
|
|
163
|
+
case 'BINARY':
|
|
164
|
+
case 'VARBINARY':
|
|
165
|
+
case 'LONGVARBINARY':
|
|
166
|
+
case 'LONG32VARBINARY':
|
|
167
|
+
return { type: 'bytes' };
|
|
168
|
+
case 'CLOB':
|
|
169
|
+
case 'NCLOB':
|
|
170
|
+
case 'LONGVARCHAR':
|
|
171
|
+
case 'LONGNVARCHAR':
|
|
172
|
+
case 'LONG32VARCHAR':
|
|
173
|
+
case 'LONG32NVARCHAR':
|
|
174
|
+
return { type: 'text' };
|
|
175
|
+
case 'VARCHAR':
|
|
176
|
+
case 'NVARCHAR':
|
|
177
|
+
case 'CHAR':
|
|
178
|
+
case 'NCHAR':
|
|
179
|
+
return { type: 'string', maxLength: 255 };
|
|
180
|
+
case 'INTEGER':
|
|
181
|
+
case 'SMALLINT':
|
|
182
|
+
case 'TINYINT':
|
|
183
|
+
return { type: 'int' };
|
|
184
|
+
case 'BIGINT':
|
|
185
|
+
return { type: 'bigInt' };
|
|
186
|
+
case 'BOOLEAN':
|
|
187
|
+
case 'BIT':
|
|
188
|
+
return { type: 'boolean' };
|
|
189
|
+
case 'DECIMAL':
|
|
190
|
+
case 'NUMERIC':
|
|
191
|
+
return { type: 'decimal', maxDigits: 38, decimalPlaces: 2 };
|
|
192
|
+
case 'FLOAT':
|
|
193
|
+
case 'REAL':
|
|
194
|
+
case 'DOUBLE':
|
|
195
|
+
return { type: 'float' };
|
|
196
|
+
case 'DATE':
|
|
197
|
+
return { type: 'date' };
|
|
198
|
+
case 'TIME':
|
|
199
|
+
return { type: 'time' };
|
|
200
|
+
case 'TIMESTAMP':
|
|
201
|
+
case 'TIMESTAMP_WITH_TIMEZONE':
|
|
202
|
+
case 'TIMESTAMP_UTC':
|
|
203
|
+
return { type: 'dateTime' };
|
|
204
|
+
case 'INTERVAL_SECOND':
|
|
205
|
+
return { type: 'duration' };
|
|
206
|
+
case 'INET':
|
|
207
|
+
return { type: 'ipAddress' };
|
|
208
|
+
default:
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const ON_DELETE = {
|
|
213
|
+
CASCADE: 'cascade',
|
|
214
|
+
SET_NULL: 'setNull',
|
|
215
|
+
SET_DEFAULT: 'setDefault',
|
|
216
|
+
RESTRICT: 'restrict',
|
|
217
|
+
NO_ACTION: 'noAction',
|
|
218
|
+
};
|
|
219
|
+
/** Maps a Hibernate `OnDeleteAction` constant to the referential action. */
|
|
220
|
+
export function onDeleteAction(name) {
|
|
221
|
+
return ON_DELETE[name];
|
|
222
|
+
}
|
|
223
|
+
/** Lower-cases the first letter: `Post` is `post`, `URL` stays `URL`. */
|
|
224
|
+
export function decapitalize(name) {
|
|
225
|
+
if (name.length > 1 && name[0] === name[0]?.toUpperCase()) {
|
|
226
|
+
if (name[1] === name[1]?.toUpperCase() && /[A-Za-z]/.test(name[1] ?? '')) {
|
|
227
|
+
return name;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return name.charAt(0).toLowerCase() + name.slice(1);
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=jpaTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jpaTypes.js","sourceRoot":"","sources":["../../src/parsers/jpaTypes.ts"],"names":[],"mappings":"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"}
|
package/dist/styles.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { type EfcoreStyle } from './emitters/efcore.js';
|
|
2
|
+
import { type JpaStyle } from './emitters/jpa.js';
|
|
1
3
|
import { type SequelizeStyle } from './emitters/sequelize.js';
|
|
2
4
|
import { type SqlAlchemyStyle } from './emitters/sqlalchemy.js';
|
|
3
5
|
import { type Result } from './result.js';
|
|
4
6
|
/** Every value `--style` accepts; which ones apply depends on the target format. */
|
|
5
|
-
export type OutputStyle = SqlAlchemyStyle | SequelizeStyle;
|
|
7
|
+
export type OutputStyle = SqlAlchemyStyle | SequelizeStyle | EfcoreStyle | JpaStyle;
|
|
6
8
|
/** Every style of every format, in the order the help lists them. */
|
|
7
9
|
export declare const OUTPUT_STYLES: readonly OutputStyle[];
|
|
8
10
|
/** True when a value is a style of some format. */
|
|
@@ -11,7 +13,7 @@ export declare function isOutputStyle(value: string): value is OutputStyle;
|
|
|
11
13
|
export declare function stylesOf(format: string): readonly OutputStyle[] | undefined;
|
|
12
14
|
/**
|
|
13
15
|
* Checks a `--style` value against the target format. A format with styles accepts only its own
|
|
14
|
-
* (`sqlalchemy`, `sqlmodel` for SQLAlchemy; `init`, `define` for Sequelize). Any other format
|
|
16
|
+
* (`sqlalchemy`, `sqlmodel` for SQLAlchemy; `init`, `define` for Sequelize; `annotations`, `fluent` for EF Core; `jakarta`, `javax` for JPA). Any other format
|
|
15
17
|
* ignores the option, so it accepts every known style but still rejects values nobody knows.
|
|
16
18
|
*/
|
|
17
19
|
export declare function checkStyle(format: string, value: string, label?: string): Result<OutputStyle>;
|
package/dist/styles.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { EFCORE_STYLES } from './emitters/efcore.js';
|
|
2
|
+
import { JPA_STYLES } from './emitters/jpa.js';
|
|
1
3
|
import { SEQUELIZE_STYLES } from './emitters/sequelize.js';
|
|
2
4
|
import { SQLALCHEMY_STYLES, } from './emitters/sqlalchemy.js';
|
|
3
5
|
import { err, ok } from './result.js';
|
|
@@ -5,11 +7,15 @@ import { err, ok } from './result.js';
|
|
|
5
7
|
const STYLES_BY_FORMAT = {
|
|
6
8
|
sqlalchemy: SQLALCHEMY_STYLES,
|
|
7
9
|
sequelize: SEQUELIZE_STYLES,
|
|
10
|
+
efcore: EFCORE_STYLES,
|
|
11
|
+
jpa: JPA_STYLES,
|
|
8
12
|
};
|
|
9
13
|
/** Every style of every format, in the order the help lists them. */
|
|
10
14
|
export const OUTPUT_STYLES = [
|
|
11
15
|
...SQLALCHEMY_STYLES,
|
|
12
16
|
...SEQUELIZE_STYLES,
|
|
17
|
+
...EFCORE_STYLES,
|
|
18
|
+
...JPA_STYLES,
|
|
13
19
|
];
|
|
14
20
|
/** True when a value is a style of some format. */
|
|
15
21
|
export function isOutputStyle(value) {
|
|
@@ -21,7 +27,7 @@ export function stylesOf(format) {
|
|
|
21
27
|
}
|
|
22
28
|
/**
|
|
23
29
|
* Checks a `--style` value against the target format. A format with styles accepts only its own
|
|
24
|
-
* (`sqlalchemy`, `sqlmodel` for SQLAlchemy; `init`, `define` for Sequelize). Any other format
|
|
30
|
+
* (`sqlalchemy`, `sqlmodel` for SQLAlchemy; `init`, `define` for Sequelize; `annotations`, `fluent` for EF Core; `jakarta`, `javax` for JPA). Any other format
|
|
25
31
|
* ignores the option, so it accepts every known style but still rejects values nobody knows.
|
|
26
32
|
*/
|
|
27
33
|
export function checkStyle(format, value, label = '--style value') {
|
package/dist/styles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAuB,MAAM,yBAAyB,CAAC;AAChF,OAAO,EACL,iBAAiB,GAElB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAoB,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAiB,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAuB,MAAM,yBAAyB,CAAC;AAChF,OAAO,EACL,iBAAiB,GAElB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,aAAa,CAAC;AAMnD,sEAAsE;AACtE,MAAM,gBAAgB,GAAqD;IACzE,UAAU,EAAE,iBAAiB;IAC7B,SAAS,EAAE,gBAAgB;IAC3B,MAAM,EAAE,aAAa;IACrB,GAAG,EAAE,UAAU;CAChB,CAAC;AAEF,qEAAqE;AACrE,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,GAAG,iBAAiB;IACpB,GAAG,gBAAgB;IACnB,GAAG,aAAa;IAChB,GAAG,UAAU;CACd,CAAC;AAEF,mDAAmD;AACnD,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAQ,aAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,MAAc,EACd,KAAa,EACb,QAAgB,eAAe;IAE/B,MAAM,GAAG,GAAuC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjE,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAoB,CAAC;YACvC,CAAC,CAAC,EAAE,CAAC,KAAoB,CAAC;YAC1B,CAAC,CAAC,GAAG,CACD,gBAAgB,EAChB,WAAW,KAAK,KAAK,KAAK,aAAa,MAAM,6BAA6B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC5F,CAAC;IACR,CAAC;IACD,OAAO,aAAa,CAAC,KAAK,CAAC;QACzB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACX,CAAC,CAAC,GAAG,CACD,gBAAgB,EAChB,WAAW,KAAK,KAAK,KAAK,uBAAuB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,OAAO,CAC1F,gBAAgB,CACjB;aACE,GAAG,CACF,CAAC,CAAC,IAAI,EAAE,MAAM,CAAmC,EAAE,EAAE,CACnD,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CACrC;aACA,IAAI,CAAC,IAAI,CAAC,IAAI,CAClB,CAAC;AACR,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ormbridge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Convert ORM models between frameworks and languages (Django, Prisma, TypeORM, Doctrine, Laravel). Define your data model once and share typed schemas across your stack.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Richard McQuiston",
|
|
@@ -54,6 +54,11 @@
|
|
|
54
54
|
"typeorm",
|
|
55
55
|
"drizzle",
|
|
56
56
|
"sequelize",
|
|
57
|
+
"efcore",
|
|
58
|
+
"hibernate",
|
|
59
|
+
"jpa",
|
|
60
|
+
"java",
|
|
61
|
+
"entity-framework",
|
|
57
62
|
"graphene",
|
|
58
63
|
"doctrine",
|
|
59
64
|
"laravel",
|
|
@@ -85,5 +90,9 @@
|
|
|
85
90
|
"homepage": "https://github.com/RichardMcQuiston01/ormbridge#readme",
|
|
86
91
|
"bugs": {
|
|
87
92
|
"url": "https://github.com/RichardMcQuiston01/ormbridge/issues"
|
|
93
|
+
},
|
|
94
|
+
"funding": {
|
|
95
|
+
"type": "individual",
|
|
96
|
+
"url": "https://donate.stripe.com/00w5kD3Gj1Xo9v7gVOcs800"
|
|
88
97
|
}
|
|
89
98
|
}
|