ormbridge 0.9.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.
Files changed (97) 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 +2 -2
  5. package/dist/emitters/jpa.d.ts +36 -0
  6. package/dist/emitters/jpa.js +253 -0
  7. package/dist/emitters/jpa.js.map +1 -0
  8. package/dist/emitters/jpaColumns.d.ts +25 -0
  9. package/dist/emitters/jpaColumns.js +341 -0
  10. package/dist/emitters/jpaColumns.js.map +1 -0
  11. package/dist/emitters/jpaDefaults.d.ts +24 -0
  12. package/dist/emitters/jpaDefaults.js +223 -0
  13. package/dist/emitters/jpaDefaults.js.map +1 -0
  14. package/dist/emitters/jpaEnums.d.ts +11 -0
  15. package/dist/emitters/jpaEnums.js +134 -0
  16. package/dist/emitters/jpaEnums.js.map +1 -0
  17. package/dist/emitters/jpaFormat.d.ts +16 -0
  18. package/dist/emitters/jpaFormat.js +73 -0
  19. package/dist/emitters/jpaFormat.js.map +1 -0
  20. package/dist/emitters/jpaKeys.d.ts +25 -0
  21. package/dist/emitters/jpaKeys.js +110 -0
  22. package/dist/emitters/jpaKeys.js.map +1 -0
  23. package/dist/emitters/jpaNames.d.ts +26 -0
  24. package/dist/emitters/jpaNames.js +234 -0
  25. package/dist/emitters/jpaNames.js.map +1 -0
  26. package/dist/emitters/jpaRelations.d.ts +41 -0
  27. package/dist/emitters/jpaRelations.js +304 -0
  28. package/dist/emitters/jpaRelations.js.map +1 -0
  29. package/dist/emitters/jpaRender.d.ts +10 -0
  30. package/dist/emitters/jpaRender.js +81 -0
  31. package/dist/emitters/jpaRender.js.map +1 -0
  32. package/dist/emitters/jpaScalars.d.ts +32 -0
  33. package/dist/emitters/jpaScalars.js +188 -0
  34. package/dist/emitters/jpaScalars.js.map +1 -0
  35. package/dist/emitters/jpaTable.d.ts +10 -0
  36. package/dist/emitters/jpaTable.js +109 -0
  37. package/dist/emitters/jpaTable.js.map +1 -0
  38. package/dist/emitters/jpaTypes.d.ts +85 -0
  39. package/dist/emitters/jpaTypes.js +36 -0
  40. package/dist/emitters/jpaTypes.js.map +1 -0
  41. package/dist/formats.d.ts +3 -2
  42. package/dist/formats.js +34 -0
  43. package/dist/formats.js.map +1 -1
  44. package/dist/index.d.ts +4 -0
  45. package/dist/index.js +2 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/io.js +27 -1
  48. package/dist/io.js.map +1 -1
  49. package/dist/parsers/javaSyntax.d.ts +120 -0
  50. package/dist/parsers/javaSyntax.js +304 -0
  51. package/dist/parsers/javaSyntax.js.map +1 -0
  52. package/dist/parsers/javaValues.d.ts +5 -0
  53. package/dist/parsers/javaValues.js +187 -0
  54. package/dist/parsers/javaValues.js.map +1 -0
  55. package/dist/parsers/jpa.d.ts +17 -0
  56. package/dist/parsers/jpa.js +131 -0
  57. package/dist/parsers/jpa.js.map +1 -0
  58. package/dist/parsers/jpaAnnotations.d.ts +46 -0
  59. package/dist/parsers/jpaAnnotations.js +156 -0
  60. package/dist/parsers/jpaAnnotations.js.map +1 -0
  61. package/dist/parsers/jpaBuild.d.ts +4 -0
  62. package/dist/parsers/jpaBuild.js +297 -0
  63. package/dist/parsers/jpaBuild.js.map +1 -0
  64. package/dist/parsers/jpaClasses.d.ts +27 -0
  65. package/dist/parsers/jpaClasses.js +257 -0
  66. package/dist/parsers/jpaClasses.js.map +1 -0
  67. package/dist/parsers/jpaCollections.d.ts +12 -0
  68. package/dist/parsers/jpaCollections.js +106 -0
  69. package/dist/parsers/jpaCollections.js.map +1 -0
  70. package/dist/parsers/jpaColumns.d.ts +26 -0
  71. package/dist/parsers/jpaColumns.js +361 -0
  72. package/dist/parsers/jpaColumns.js.map +1 -0
  73. package/dist/parsers/jpaEntities.d.ts +9 -0
  74. package/dist/parsers/jpaEntities.js +181 -0
  75. package/dist/parsers/jpaEntities.js.map +1 -0
  76. package/dist/parsers/jpaIndexes.d.ts +12 -0
  77. package/dist/parsers/jpaIndexes.js +87 -0
  78. package/dist/parsers/jpaIndexes.js.map +1 -0
  79. package/dist/parsers/jpaJoins.d.ts +68 -0
  80. package/dist/parsers/jpaJoins.js +131 -0
  81. package/dist/parsers/jpaJoins.js.map +1 -0
  82. package/dist/parsers/jpaModel.d.ts +73 -0
  83. package/dist/parsers/jpaModel.js +2 -0
  84. package/dist/parsers/jpaModel.js.map +1 -0
  85. package/dist/parsers/jpaNotes.d.ts +20 -0
  86. package/dist/parsers/jpaNotes.js +138 -0
  87. package/dist/parsers/jpaNotes.js.map +1 -0
  88. package/dist/parsers/jpaRelations.d.ts +4 -0
  89. package/dist/parsers/jpaRelations.js +242 -0
  90. package/dist/parsers/jpaRelations.js.map +1 -0
  91. package/dist/parsers/jpaTypes.d.ts +23 -0
  92. package/dist/parsers/jpaTypes.js +232 -0
  93. package/dist/parsers/jpaTypes.js.map +1 -0
  94. package/dist/styles.d.ts +3 -2
  95. package/dist/styles.js +4 -1
  96. package/dist/styles.js.map +1 -1
  97. package/package.json +8 -1
@@ -0,0 +1,106 @@
1
+ import { buildField, cleanIdentifier } from './jpaColumns.js';
2
+ import { modelOwner } from './jpaJoins.js';
3
+ import { decapitalize, elementOf, isMapType } from './jpaTypes.js';
4
+ function capitalize(name) {
5
+ return name.charAt(0).toUpperCase() + name.slice(1);
6
+ }
7
+ /**
8
+ * Reads an `@ElementCollection` of basic values (`List<String>`, `Set<Role>`) as the child table Hibernate creates:
9
+ * the owner's key as a foreign key plus the value column. Collections of embeddables and maps are skipped.
10
+ */
11
+ export function buildCollection(owner, member, project, resolver, taken) {
12
+ const place = `${owner.name}.${member.path.join('.')}`;
13
+ const type = member.attr.type;
14
+ const element = elementOf(type);
15
+ if (isMapType(type) || element === undefined) {
16
+ resolver.warn(`${place}: an @ElementCollection that is not a List, Set or array of basic values (a Map, for example) is not read; its table was skipped.`);
17
+ return undefined;
18
+ }
19
+ const embeddable = project.classes.get(element.name);
20
+ if (embeddable !== undefined &&
21
+ embeddable.annotations.some((item) => item.name === 'Embeddable')) {
22
+ resolver.warn(`${place}: an @ElementCollection of the embeddable ${element.name} is stored in its own table, which is not read; the attribute was skipped.`);
23
+ return undefined;
24
+ }
25
+ const keys = resolver.keyOf(owner);
26
+ const key = keys[0];
27
+ if (key === undefined || keys.length > 1) {
28
+ resolver.warn(`${place}: the owner ${owner.name} needs a single-column key for the table of the @ElementCollection; the attribute was skipped.`);
29
+ return undefined;
30
+ }
31
+ const notes = member.attr.notes;
32
+ const collectionTable = notes.get('CollectionTable');
33
+ const joinColumn = collectionTable?.annotations('joinColumns')[0];
34
+ const attributeName = member.attr.name;
35
+ const tableName = collectionTable?.string('name') || `${owner.entityName}_${attributeName}`;
36
+ const ownerColumn = joinColumn?.string('name') || `${owner.entityName}_${key.columnName}`;
37
+ // The value column: the @Column of the attribute describes it.
38
+ const valueMember = {
39
+ ...member,
40
+ attr: { ...member.attr, type: element },
41
+ isId: false,
42
+ kind: 'basic',
43
+ };
44
+ const built = buildField(valueMember, { project, entity: owner, warn: resolver.warn }, false);
45
+ const isSet = /Set$/.test(type.name);
46
+ const order = notes.get('OrderColumn');
47
+ const fields = [
48
+ {
49
+ ...built.field,
50
+ isNullable: built.field.isNullable,
51
+ },
52
+ ];
53
+ const relationName = decapitalize(owner.name);
54
+ const onDeleteName = notes
55
+ .get('OnDelete', true)
56
+ ?.member('action');
57
+ const relation = {
58
+ name: relationName,
59
+ kind: 'foreignKey',
60
+ targetModel: modelOwner(owner).name,
61
+ columnName: cleanIdentifier(ownerColumn),
62
+ isNullable: false,
63
+ onDelete: onDeleteName === 'CASCADE' ? 'cascade' : 'noAction',
64
+ };
65
+ let compositePrimaryKey;
66
+ if (order !== undefined) {
67
+ const orderField = {
68
+ name: `${attributeName}Order`,
69
+ columnName: order.string('name') || `${attributeName}_ORDER`,
70
+ type: 'int',
71
+ isPrimaryKey: false,
72
+ isUnique: false,
73
+ isNullable: false,
74
+ isAutoUpdated: false,
75
+ };
76
+ fields.push(orderField);
77
+ compositePrimaryKey = [relationName, orderField.name];
78
+ }
79
+ else if (isSet && !built.field.isNullable) {
80
+ compositePrimaryKey = [relationName, built.field.name];
81
+ }
82
+ let name = `${owner.name}${capitalize(attributeName)}`;
83
+ while (taken.has(name)) {
84
+ name = `${name}Item`;
85
+ }
86
+ resolver.warn(`${place}: the @ElementCollection is stored in the child table "${tableName}"; it was read as the model ${name}, with a foreign key to ${owner.name}` +
87
+ (compositePrimaryKey === undefined
88
+ ? ' and no primary key (as in Hibernate: a Set has one only when its column is NOT NULL, a List only with @OrderColumn; other formats expect one).'
89
+ : '.'));
90
+ const model = {
91
+ name,
92
+ tableName: cleanIdentifier(tableName),
93
+ appLabel: project.appLabel,
94
+ fields,
95
+ relations: [relation],
96
+ indexes: [],
97
+ ...(compositePrimaryKey === undefined ? {} : { compositePrimaryKey }),
98
+ };
99
+ return {
100
+ model,
101
+ ...(built.enumDefinition === undefined
102
+ ? {}
103
+ : { enumDefinition: built.enumDefinition }),
104
+ };
105
+ }
106
+ //# sourceMappingURL=jpaCollections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jpaCollections.js","sourceRoot":"","sources":["../../src/parsers/jpaCollections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { IrEnum, IrField } from '../ir.js';
2
+ import type { EntityInfo, Member, Project } from './jpaModel.js';
3
+ /** What building a column needs to know. */
4
+ export interface ColumnContext {
5
+ project: Project;
6
+ entity: EntityInfo;
7
+ warn: (message: string) => void;
8
+ }
9
+ /** An IR field with the member it came from. */
10
+ export interface BuiltField {
11
+ field: IrField;
12
+ member: Member;
13
+ enumDefinition?: IrEnum;
14
+ /** True when the attribute is part of the natural id (`@NaturalId`). */
15
+ naturalId: boolean;
16
+ /** True for `@Column(insertable = false, updatable = false)`: a second mapping of a column. */
17
+ readOnly: boolean;
18
+ }
19
+ /** The IR name of a member: `address.street` is `addressStreet`. */
20
+ export declare function irFieldName(member: Member): string;
21
+ /** Removes the backticks and quotes that make an identifier case-sensitive: `` `Order` `` is `Order`. */
22
+ export declare function cleanIdentifier(name: string): string;
23
+ /** The database column name: `@Column(name)`, else the attribute name. */
24
+ export declare function columnNameOf(member: Member): string;
25
+ /** Builds the IR field for one mapped column. */
26
+ export declare function buildField(member: Member, ctx: ColumnContext, singleKey: boolean): BuiltField;
@@ -0,0 +1,361 @@
1
+ import { toCamelCase } from '../naming.js';
2
+ import { sqlColumn, sqlDefault } from './efcoreTypes.js';
3
+ import { isIntegerType, isPrimitive, javaColumn, jdbcTypeColumn, temporalColumn, } from './jpaTypes.js';
4
+ import { evaluate } from './javaValues.js';
5
+ /** The IR name of a member: `address.street` is `addressStreet`. */
6
+ export function irFieldName(member) {
7
+ return toCamelCase(member.path.join('_'));
8
+ }
9
+ /** Removes the backticks and quotes that make an identifier case-sensitive: `` `Order` `` is `Order`. */
10
+ export function cleanIdentifier(name) {
11
+ return name.replace(/^[`"[]|[`"\]]$/g, '');
12
+ }
13
+ /** The database column name: `@Column(name)`, else the attribute name. */
14
+ export function columnNameOf(member) {
15
+ const given = member.column?.string('name');
16
+ return given === undefined || given === ''
17
+ ? (member.path[member.path.length - 1] ?? member.attr.name)
18
+ : cleanIdentifier(given);
19
+ }
20
+ function converterFor(member, ctx) {
21
+ const notes = member.attr.notes;
22
+ const convert = notes.get('Convert');
23
+ if (convert?.boolean('disableConversion') === true) {
24
+ return undefined;
25
+ }
26
+ const named = convert?.className('converter');
27
+ if (named !== undefined) {
28
+ return (ctx.project.converters.get(named) ?? {
29
+ name: named,
30
+ attributeType: member.attr.type,
31
+ columnType: { name: '', text: '', args: [], arrayDepth: 0 },
32
+ autoApply: false,
33
+ });
34
+ }
35
+ if (notes.has('Id') || notes.has('Version') || notes.has('Enumerated')) {
36
+ return undefined;
37
+ }
38
+ for (const converter of ctx.project.converters.values()) {
39
+ if (converter.autoApply &&
40
+ converter.attributeType.name === member.attr.type.name &&
41
+ converter.attributeType.arrayDepth === member.attr.type.arrayDepth) {
42
+ return converter;
43
+ }
44
+ }
45
+ return undefined;
46
+ }
47
+ function enumDefinition(definition, stringStored) {
48
+ return {
49
+ name: definition.name,
50
+ values: definition.enumConstants.map((constant, index) => ({
51
+ name: constant.name,
52
+ dbValue: stringStored ? constant.name : String(index),
53
+ })),
54
+ };
55
+ }
56
+ /**
57
+ * Reads an enum that an `AttributeConverter<Enum, String|Integer>` stores under other values than its names, the
58
+ * way ormbridge writes it: every constant carries its stored value as the only constructor argument. The converter
59
+ * is not run, so any other shape (a converter that computes the value) is not understood and returns undefined.
60
+ */
61
+ function convertedEnum(member, definition, ctx) {
62
+ const named = member.attr.notes
63
+ .get('Convert')
64
+ ?.className('converter');
65
+ const converter = named === undefined ? undefined : ctx.project.converters.get(named);
66
+ if (converter === undefined ||
67
+ converter.attributeType.name !== definition.name) {
68
+ return undefined;
69
+ }
70
+ const numeric = /^(int|Integer|long|Long|short|Short)$/.test(converter.columnType.name);
71
+ if (!numeric && converter.columnType.name !== 'String') {
72
+ return undefined;
73
+ }
74
+ const values = [];
75
+ for (const constant of definition.enumConstants) {
76
+ const only = constant.args.length === 1 ? constant.args[0] : undefined;
77
+ const value = only === undefined ? undefined : evaluate(only, ctx.project.lookup);
78
+ if (numeric && value?.kind === 'number') {
79
+ values.push(String(value.value));
80
+ }
81
+ else if (!numeric && value?.kind === 'string') {
82
+ values.push(value.value);
83
+ }
84
+ else {
85
+ return undefined;
86
+ }
87
+ }
88
+ return { values, numeric };
89
+ }
90
+ /** Reads `default ...` out of a `columnDefinition` such as `varchar(20) not null default 'x'`. */
91
+ function definitionParts(definition) {
92
+ const defaultMatch = definition.match(/\bdefault\s+('(?:[^']|'')*'|\([^)]*\)|[^\s,]+)/i);
93
+ const type = definition
94
+ .replace(/\bdefault\s+('(?:[^']|'')*'|\([^)]*\)|[^\s,]+)/gi, ' ')
95
+ .replace(/\b(not null|null|unique|primary key|auto_increment|autoincrement|check\s*\(.*\)|generated\b.*|comment\s+'[^']*')/gi, ' ')
96
+ .replace(/\s+/g, ' ')
97
+ .trim();
98
+ return {
99
+ type,
100
+ ...(defaultMatch?.[1] === undefined
101
+ ? {}
102
+ : { defaultText: defaultMatch[1] }),
103
+ notNull: /\bnot\s+null\b/i.test(definition),
104
+ unique: /\bunique\b/i.test(definition),
105
+ };
106
+ }
107
+ /** Bean Validation hints, in the order Hibernate applies them: `@Size`/`@Length` for the length, `@NotNull` for nullability. */
108
+ function validationLength(notes) {
109
+ const size = notes.get('Size')?.number('max');
110
+ const length = notes.get('Length', true)?.number('max');
111
+ const found = size ?? length;
112
+ return found !== undefined && found < 2_000_000_000 ? found : undefined;
113
+ }
114
+ function isDeclaredNotNull(notes) {
115
+ // Hibernate turns @NotNull into NOT NULL; @NotEmpty and @NotBlank add nothing to the DDL (checked against 6.4).
116
+ return (notes.has('NotNull') || notes.get('Basic')?.boolean('optional') === false);
117
+ }
118
+ /** Builds the IR field for one mapped column. */
119
+ export function buildField(member, ctx, singleKey) {
120
+ const attribute = member.attr;
121
+ const notes = attribute.notes;
122
+ const type = attribute.type;
123
+ const column = member.column;
124
+ const place = `${ctx.entity.name}.${member.path.join('.')}`;
125
+ const definitionText = column?.string('columnDefinition');
126
+ const definition = definitionText === undefined || definitionText === ''
127
+ ? undefined
128
+ : definitionParts(definitionText);
129
+ let shape;
130
+ let enumDef;
131
+ let fromJavaType = false;
132
+ const enumClass = type.arrayDepth === 0 ? ctx.project.enums.get(type.name) : undefined;
133
+ const converter = enumClass === undefined ? converterFor(member, ctx) : undefined;
134
+ const converted = enumClass === undefined ? undefined : convertedEnum(member, enumClass, ctx);
135
+ const jdbc = notes.get('JdbcTypeCode', true);
136
+ const hibernateType = notes.get('Type', true);
137
+ if (converter !== undefined) {
138
+ const target = converter.columnType;
139
+ shape =
140
+ target.name === '' ? undefined : javaColumn(target, attribute.imports);
141
+ ctx.warn(`${place}: the converter ${converter.name} is not run; ${shape === undefined
142
+ ? 'its column type is not known'
143
+ : `the column was read as ${target.name}`}.`);
144
+ }
145
+ else if (enumClass !== undefined && converted !== undefined) {
146
+ enumDef = {
147
+ name: enumClass.name,
148
+ values: enumClass.enumConstants.map((constant, index) => ({
149
+ name: constant.name,
150
+ dbValue: converted.values[index] ?? constant.name,
151
+ })),
152
+ };
153
+ shape = converted.numeric
154
+ ? { type: 'int' }
155
+ : { type: 'string', maxLength: 255 };
156
+ }
157
+ else if (enumClass !== undefined) {
158
+ const mode = notes.get('Enumerated')?.member('value');
159
+ const stringStored = mode === 'STRING';
160
+ enumDef = enumDefinition(enumClass, stringStored);
161
+ shape = stringStored ? { type: 'string', maxLength: 255 } : { type: 'int' };
162
+ if (!stringStored) {
163
+ ctx.warn(`${place}: the enum ${enumClass.name} is stored as its ordinal number (the default of @Enumerated); it was read as an enum with the numbers as values, and writers that create enum types will store text instead. Use @Enumerated(EnumType.STRING) to store the names.`);
164
+ }
165
+ }
166
+ else if (jdbc !== undefined) {
167
+ const code = jdbc.member('value');
168
+ shape = code === undefined ? undefined : jdbcTypeColumn(code);
169
+ if (shape === undefined) {
170
+ ctx.warn(`${place}: @JdbcTypeCode(${code ?? '?'}) is not one the model knows; the column was read from the Java type ${type.text}.`);
171
+ }
172
+ }
173
+ else if (hibernateType !== undefined) {
174
+ const named = hibernateType.className('value') ?? '';
175
+ if (/json/i.test(named)) {
176
+ shape = { type: 'json' };
177
+ }
178
+ else {
179
+ ctx.warn(`${place}: @Type(${named}) is a custom type and is not run; the column was read from the Java type ${type.text}.`);
180
+ }
181
+ }
182
+ if (shape === undefined && notes.has('Lob')) {
183
+ if (/^(byte|Byte)$/.test(type.name) || type.name === 'Blob') {
184
+ shape = { type: 'bytes' };
185
+ }
186
+ else if (type.name === 'String' ||
187
+ /^(char|Character|Clob)$/.test(type.name)) {
188
+ shape = { type: 'text' };
189
+ }
190
+ else {
191
+ shape = { type: 'bytes' };
192
+ }
193
+ }
194
+ if (shape === undefined &&
195
+ enumClass === undefined &&
196
+ converter === undefined) {
197
+ const temporal = notes.get('Temporal')?.member('value');
198
+ if (temporal !== undefined && /^(Date|Calendar)$/.test(type.name)) {
199
+ shape = temporalColumn(temporal);
200
+ }
201
+ if (shape === undefined) {
202
+ shape = javaColumn(type, attribute.imports);
203
+ fromJavaType = shape !== undefined;
204
+ }
205
+ }
206
+ if (definition !== undefined &&
207
+ definition.type !== '' &&
208
+ enumClass === undefined) {
209
+ const fromSql = sqlColumn(definition.type);
210
+ if (fromSql === undefined) {
211
+ ctx.warn(`${place}: the columnDefinition "${definitionText ?? ''}" was not understood; the column was read from the Java type ${type.text}.`);
212
+ }
213
+ else {
214
+ shape = fromSql;
215
+ }
216
+ }
217
+ if (shape === undefined) {
218
+ shape = { type: 'unsupported', unsupportedType: type.text };
219
+ ctx.warn(`${place}: the type ${type.text} has no column type in the shared model (add @Convert, @JdbcTypeCode or @Embedded); the column is read as unsupported (${type.text}).`);
220
+ }
221
+ // Lengths, precision and scale ---------------------------------------------------------------
222
+ let irType = shape.type;
223
+ let maxLength = shape.maxLength;
224
+ const declaredLength = column?.number('length');
225
+ const hinted = validationLength(notes);
226
+ if (irType === 'string') {
227
+ if (declaredLength !== undefined) {
228
+ maxLength = declaredLength;
229
+ }
230
+ else if (shape.maxLength === 255 || shape.maxLength === undefined) {
231
+ maxLength = definition !== undefined ? shape.maxLength : (hinted ?? 255);
232
+ }
233
+ }
234
+ if (irType === 'text' && declaredLength !== undefined && !notes.has('Lob')) {
235
+ irType = 'string';
236
+ maxLength = declaredLength;
237
+ }
238
+ let maxDigits = shape.maxDigits;
239
+ let decimalPlaces = shape.decimalPlaces;
240
+ if (irType === 'decimal' && fromJavaType) {
241
+ const precision = column?.number('precision');
242
+ const scale = column?.number('scale');
243
+ const digits = notes.get('Digits');
244
+ if (precision !== undefined && precision > 0) {
245
+ maxDigits = precision;
246
+ decimalPlaces = scale ?? 0;
247
+ }
248
+ else if (scale !== undefined && scale > 0) {
249
+ decimalPlaces = scale;
250
+ }
251
+ else if (digits !== undefined) {
252
+ const whole = digits.number('integer') ?? 0;
253
+ const fraction = digits.number('fraction') ?? 0;
254
+ maxDigits = whole + fraction;
255
+ decimalPlaces = fraction;
256
+ }
257
+ }
258
+ // Nullability ----------------------------------------------------------------------------
259
+ let isNullable = true;
260
+ if (isPrimitive(type)) {
261
+ isNullable = false;
262
+ }
263
+ if (isDeclaredNotNull(notes) || definition?.notNull === true) {
264
+ isNullable = false;
265
+ }
266
+ const explicitNullable = column?.boolean('nullable');
267
+ if (explicitNullable === false) {
268
+ isNullable = false;
269
+ }
270
+ else if (explicitNullable === true && !isPrimitive(type)) {
271
+ isNullable = true;
272
+ }
273
+ const isKey = member.isId;
274
+ if (isKey) {
275
+ isNullable = false;
276
+ }
277
+ // Defaults and generated values -------------------------------------------------------------
278
+ let defaultValue;
279
+ const columnDefault = notes.get('ColumnDefault', true)?.string('value') ??
280
+ definition?.defaultText;
281
+ if (columnDefault !== undefined) {
282
+ defaultValue = sqlDefault(columnDefault, irType);
283
+ if (enumDef !== undefined &&
284
+ defaultValue.kind === 'literal' &&
285
+ typeof defaultValue.value === 'string') {
286
+ const text = defaultValue.value;
287
+ const found = enumDef.values.find((item) => item.dbValue === text);
288
+ if (found !== undefined) {
289
+ defaultValue = { kind: 'enumValue', value: found.name };
290
+ }
291
+ }
292
+ }
293
+ let isAutoUpdated = false;
294
+ const created = notes.has('CreationTimestamp', true) || notes.has('CreatedDate');
295
+ const updated = notes.has('UpdateTimestamp', true) || notes.has('LastModifiedDate');
296
+ if (created && defaultValue === undefined && irType === 'dateTime') {
297
+ defaultValue = { kind: 'now' };
298
+ }
299
+ if (updated && irType === 'dateTime') {
300
+ isAutoUpdated = true;
301
+ }
302
+ if (defaultValue === undefined && notes.has('UuidGenerator', true)) {
303
+ defaultValue = { kind: 'uuid' };
304
+ }
305
+ const generatedValue = notes.get('GeneratedValue');
306
+ if (generatedValue !== undefined && defaultValue === undefined) {
307
+ const strategy = generatedValue.member('strategy') ?? 'AUTO';
308
+ if (irType === 'uuid' && /^(AUTO|UUID)$/.test(strategy)) {
309
+ defaultValue = { kind: 'uuid' };
310
+ }
311
+ else if (isIntegerType(type)) {
312
+ defaultValue = { kind: 'autoIncrement' };
313
+ if (strategy === 'SEQUENCE' || strategy === 'TABLE') {
314
+ ctx.warn(`${place}: the key is generated from ${strategy === 'TABLE' ? 'a table' : 'a sequence'} (@GeneratedValue(strategy = ${strategy})); it was read as an auto-increment column.`);
315
+ }
316
+ }
317
+ }
318
+ const computed = notes.get('GeneratedColumn', true);
319
+ const expression = computed?.string('value');
320
+ if (notes.has('Version')) {
321
+ ctx.warn(`${place}: the @Version attribute is Hibernate's optimistic-locking counter; it was read as an ordinary column.`);
322
+ }
323
+ if (notes.has('Convert') &&
324
+ converter === undefined &&
325
+ converted === undefined) {
326
+ ctx.warn(`${place}: @Convert(disableConversion = true) was ignored.`);
327
+ }
328
+ const unique = (column?.boolean('unique') ?? false) || (definition?.unique ?? false);
329
+ const field = {
330
+ name: irFieldName(member),
331
+ columnName: columnNameOf(member),
332
+ type: irType,
333
+ isPrimaryKey: isKey && singleKey,
334
+ isUnique: unique && !(isKey && singleKey),
335
+ isNullable,
336
+ isAutoUpdated,
337
+ ...(defaultValue === undefined ? {} : { default: defaultValue }),
338
+ ...(irType === 'string' && maxLength !== undefined ? { maxLength } : {}),
339
+ ...(irType === 'decimal' && maxDigits !== undefined ? { maxDigits } : {}),
340
+ ...(irType === 'decimal' && decimalPlaces !== undefined
341
+ ? { decimalPlaces }
342
+ : {}),
343
+ ...(shape.arrayDepth === undefined ? {} : { arrayDepth: shape.arrayDepth }),
344
+ ...(enumDef === undefined ? {} : { enumName: enumDef.name }),
345
+ ...(irType === 'unsupported' && shape.unsupportedType !== undefined
346
+ ? { unsupportedType: shape.unsupportedType }
347
+ : {}),
348
+ ...(expression === undefined
349
+ ? {}
350
+ : { generated: { expression, isStored: false } }),
351
+ };
352
+ return {
353
+ field,
354
+ member,
355
+ ...(enumDef === undefined ? {} : { enumDefinition: enumDef }),
356
+ naturalId: notes.has('NaturalId', true),
357
+ readOnly: column?.boolean('insertable') === false &&
358
+ column.boolean('updatable') === false,
359
+ };
360
+ }
361
+ //# sourceMappingURL=jpaColumns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jpaColumns.js","sourceRoot":"","sources":["../../src/parsers/jpaColumns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { EntityInfo, Member, Project } from './jpaModel.js';
2
+ /** Finds the entity classes of the input and arranges them into hierarchies. */
3
+ export declare function discoverEntities(project: Project, warn: (message: string) => void): EntityInfo[];
4
+ /**
5
+ * The members that make up an entity's table. Mapped superclasses come first. With single-table inheritance the
6
+ * root also takes the members of every subclass (they must allow null); with joined inheritance a subclass takes
7
+ * only what it declares itself; with table-per-class every class of the chain contributes.
8
+ */
9
+ export declare function entityMembers(project: Project, info: EntityInfo, warn: (message: string) => void): Member[];