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,341 @@
1
+ import { defaultOf, isPostgres } from './jpaDefaults.js';
2
+ import { annotation, } from './jpaFormat.js';
3
+ import { javaString } from './jpaNames.js';
4
+ import { scalarOf, withNativeFacets, } from './jpaScalars.js';
5
+ import { Imports, } from './jpaTypes.js';
6
+ /** Python expressions of Django generated columns: not SQL, so they cannot be written to the database. */
7
+ const PYTHON_EXPRESSION = /\b(F|Value|ExpressionWrapper|Func|Cast)\(/;
8
+ /** Columns that record when the row was created: Hibernate fills them in, whatever the application set. */
9
+ function isCreationColumn(field) {
10
+ return /^(created(at)?|datecreated|creationdate|creationtime)$/.test(field.columnName.replace(/_/g, '').toLowerCase());
11
+ }
12
+ function isInteger(field) {
13
+ return ((field.type === 'int' || field.type === 'bigInt') &&
14
+ field.arrayDepth === undefined &&
15
+ field.enumName === undefined);
16
+ }
17
+ /** How an array column is written: a Java array on PostgreSQL, JSON elsewhere, large text for Hibernate 5. */
18
+ function arrayOf(context, label, field, element) {
19
+ const { imports } = context;
20
+ const depth = field.arrayDepth ?? 1;
21
+ if (depth > 1) {
22
+ context.warn(`${label}: Hibernate maps one-dimensional arrays only; the ${depth}-dimensional array was written as a one-dimensional one.`);
23
+ }
24
+ if (context.style === 'javax') {
25
+ context.warn(`${label}: Hibernate 5 cannot map arrays; the column was written as a String with the column definition ${element.columnDefinition ?? 'text'}[].`);
26
+ return {
27
+ boxed: imports.use('java.lang.String'),
28
+ columnDefinition: `${element.columnDefinition ?? sqlNameOf(field)}[]`,
29
+ extra: [],
30
+ };
31
+ }
32
+ if (isPostgres(context.provider)) {
33
+ return {
34
+ boxed: `${element.boxed}[]`,
35
+ extra: element.extra.filter((item) => item.name !== 'Lob'),
36
+ ...(element.length === undefined ? {} : { length: element.length }),
37
+ ...(element.precision === undefined
38
+ ? {}
39
+ : { precision: element.precision }),
40
+ };
41
+ }
42
+ context.warn(`${label}: ${context.provider} has no array type; the column was written as a JSON array.`);
43
+ imports.use('java.util.List');
44
+ return {
45
+ boxed: `List<${element.boxed}>`,
46
+ extra: [
47
+ annotation(imports.hibernate('JdbcTypeCode'), [
48
+ [undefined, `${imports.use('org.hibernate.type.SqlTypes')}.JSON`],
49
+ ]),
50
+ ],
51
+ };
52
+ }
53
+ /** The SQL type name of an array element, for a Hibernate 5 column definition. */
54
+ function sqlNameOf(field) {
55
+ switch (field.type) {
56
+ case 'int':
57
+ return 'integer';
58
+ case 'bigInt':
59
+ return 'bigint';
60
+ case 'float':
61
+ return 'double precision';
62
+ case 'boolean':
63
+ return 'boolean';
64
+ case 'decimal':
65
+ return 'numeric';
66
+ case 'dateTime':
67
+ return 'timestamp';
68
+ case 'date':
69
+ return 'date';
70
+ case 'time':
71
+ return 'time';
72
+ case 'uuid':
73
+ return 'uuid';
74
+ case 'string':
75
+ return field.maxLength === undefined
76
+ ? 'text'
77
+ : `varchar(${field.maxLength})`;
78
+ default:
79
+ return 'text';
80
+ }
81
+ }
82
+ /** The annotations that store an enum, and the Java type. */
83
+ function enumScalar(context, field, plan) {
84
+ const { imports } = context;
85
+ const extra = [];
86
+ if (plan.storage === 'converter') {
87
+ extra.push(annotation(imports.persistence('Convert'), [
88
+ ['converter', `${plan.converterName}.class`],
89
+ ]));
90
+ }
91
+ else {
92
+ const enumType = imports.persistence('EnumType');
93
+ extra.push(annotation(imports.persistence('Enumerated'), [
94
+ [
95
+ undefined,
96
+ `${enumType}.${plan.storage === 'ordinal' ? 'ORDINAL' : 'STRING'}`,
97
+ ],
98
+ ]));
99
+ }
100
+ const stringStored = plan.storage !== 'ordinal' && !plan.numeric;
101
+ return {
102
+ boxed: plan.typeName,
103
+ extra,
104
+ ...(stringStored && field.maxLength !== undefined
105
+ ? { length: field.maxLength }
106
+ : {}),
107
+ };
108
+ }
109
+ function columnArguments(field, scalar, nullable, role, readOnly) {
110
+ const args = [
111
+ ['name', javaString(field.columnName)],
112
+ ];
113
+ if (!nullable && !role.isKey) {
114
+ args.push(['nullable', 'false']);
115
+ }
116
+ if (field.isUnique && !role.isKey && field.uniqueName === undefined) {
117
+ args.push(['unique', 'true']);
118
+ }
119
+ if (scalar.length !== undefined) {
120
+ args.push(['length', String(scalar.length)]);
121
+ }
122
+ if (scalar.precision !== undefined) {
123
+ args.push(['precision', String(scalar.precision.precision)]);
124
+ args.push(['scale', String(scalar.precision.scale)]);
125
+ }
126
+ if (scalar.columnDefinition !== undefined) {
127
+ args.push(['columnDefinition', javaString(scalar.columnDefinition)]);
128
+ }
129
+ if (readOnly) {
130
+ args.push(['insertable', 'false'], ['updatable', 'false']);
131
+ }
132
+ return args;
133
+ }
134
+ /** The generator annotations of a key column; `undefined` when the key is assigned by the application. */
135
+ function keyGenerator(context, label, field, imports, defaults) {
136
+ const generated = imports.persistence('GeneratedValue');
137
+ const nodes = [];
138
+ if (field.default?.kind === 'autoIncrement') {
139
+ if (!isInteger(field)) {
140
+ context.warn(`${label}: an auto-increment default on a ${field.type} column cannot be written; the key is assigned by the application.`);
141
+ return nodes;
142
+ }
143
+ const strategy = imports.persistence('GenerationType');
144
+ nodes.push(annotation(generated, [['strategy', `${strategy}.IDENTITY`]]));
145
+ return nodes;
146
+ }
147
+ if (field.type === 'uuid' && (defaults.uuid === true || defaults.sql)) {
148
+ if (context.style === 'jakarta') {
149
+ const strategy = imports.persistence('GenerationType');
150
+ nodes.push(annotation(generated, [['strategy', `${strategy}.UUID`]]));
151
+ }
152
+ else {
153
+ nodes.push(annotation(generated, [['generator', javaString('uuid2')]]), annotation(imports.hibernate('GenericGenerator'), [
154
+ ['name', javaString('uuid2')],
155
+ ['strategy', javaString('uuid2')],
156
+ ]));
157
+ }
158
+ }
159
+ return nodes;
160
+ }
161
+ const NOW_TYPES = new Set([
162
+ 'LocalDateTime',
163
+ 'OffsetDateTime',
164
+ 'LocalDate',
165
+ 'LocalTime',
166
+ ]);
167
+ /**
168
+ * The initializer of a column that has a default: the literal itself, `now()` for a "now" default, and an empty
169
+ * map for the JSON default `{}`. Without one, a property that is NOT NULL would be rejected by Hibernate's
170
+ * nullability check before the database could fill in its default.
171
+ */
172
+ function initializerOf(context, imports, field, scalar, defaults) {
173
+ if (defaults.initializer !== undefined) {
174
+ for (const name of defaults.initializerImports ?? []) {
175
+ imports.use(name);
176
+ }
177
+ return defaults.initializer;
178
+ }
179
+ if (field.default?.kind === 'now' && NOW_TYPES.has(scalar.boxed)) {
180
+ return `${scalar.boxed}.now()`;
181
+ }
182
+ if (field.type === 'json' && field.default?.kind === 'literal') {
183
+ if (context.style === 'javax') {
184
+ return javaString(String(field.default.value));
185
+ }
186
+ if (String(field.default.value).replace(/\s+/g, '') === '{}') {
187
+ imports.use('java.util.HashMap');
188
+ return 'new HashMap<>()';
189
+ }
190
+ }
191
+ return undefined;
192
+ }
193
+ /** Builds the Java attribute of an IR field. `name` is the attribute name chosen for it. */
194
+ export function buildColumn(context, label, source, name, role) {
195
+ const field = withNativeFacets(source);
196
+ const imports = new Imports(context.style);
197
+ const scalarContext = {
198
+ style: context.style,
199
+ provider: context.provider,
200
+ imports,
201
+ warn: context.warn,
202
+ };
203
+ const plan = field.enumName === undefined
204
+ ? undefined
205
+ : context.enums.get(field.enumName);
206
+ if (field.enumName !== undefined && plan === undefined) {
207
+ context.warn(`${label}: the enum "${field.enumName}" does not exist; the column was written as its stored type.`);
208
+ }
209
+ const depth = field.arrayDepth ?? 0;
210
+ let scalar;
211
+ if (plan !== undefined && depth === 0) {
212
+ scalar = enumScalar(scalarContext, field, plan);
213
+ }
214
+ else {
215
+ if (plan !== undefined) {
216
+ context.warn(`${label}: an array of the enum ${plan.typeName} is stored as an array of its stored values, not as an enum.`);
217
+ }
218
+ const elementField = { ...field };
219
+ delete elementField.arrayDepth;
220
+ const element = scalarOf(scalarContext, label, elementField);
221
+ scalar =
222
+ depth > 0 ? arrayOf(scalarContext, label, field, element) : element;
223
+ }
224
+ // Generated (computed) column ----------------------------------------------------------------
225
+ let generatedSql;
226
+ if (field.generated !== undefined) {
227
+ if (PYTHON_EXPRESSION.test(field.generated.expression)) {
228
+ context.warn(`${label}: the generated column expression ${field.generated.expression} is Python, not SQL; the column was written as a regular column.`);
229
+ }
230
+ else if (context.style === 'javax') {
231
+ context.warn(`${label}: Hibernate 5 has no generated column mapping; the column was written as a regular column.`);
232
+ }
233
+ else {
234
+ generatedSql = field.generated.expression;
235
+ }
236
+ }
237
+ // Defaults ---------------------------------------------------------------------------------
238
+ const defaults = generatedSql !== undefined
239
+ ? {}
240
+ : defaultOf({ provider: context.provider, warn: context.warn }, label, field, plan);
241
+ const singleKey = role.isKey && role.singleKey;
242
+ let sqlDefault = defaults.sql;
243
+ let uuidGenerator = false;
244
+ const generators = singleKey
245
+ ? keyGenerator(context, label, field, imports, defaults)
246
+ : [];
247
+ if (role.isKey && !role.singleKey && field.default !== undefined) {
248
+ if (field.default.kind === 'autoIncrement' || defaults.uuid === true) {
249
+ context.warn(`${label}: JPA cannot generate one column of a composite key; the value is assigned by the application.`);
250
+ }
251
+ }
252
+ if (!role.isKey && field.default?.kind === 'autoIncrement') {
253
+ context.warn(`${label}: JPA generates identifiers only, so an auto-increment column that is not the key is a plain column; the database fills it only if it is created with an identity by hand.`);
254
+ }
255
+ if (defaults.uuid === true && !role.isKey) {
256
+ if (context.style === 'jakarta') {
257
+ generators.push(annotation(imports.hibernate('UuidGenerator')));
258
+ uuidGenerator = true;
259
+ }
260
+ else if (isPostgres(context.provider)) {
261
+ sqlDefault = 'gen_random_uuid()';
262
+ context.warn(`${label}: Hibernate 5 generates identifiers only; the UUID is generated by the database (gen_random_uuid()).`);
263
+ }
264
+ else {
265
+ context.warn(`${label}: Hibernate 5 generates identifiers only, so the UUID default was dropped and the application must set the value.`);
266
+ }
267
+ }
268
+ const keyGenerated = generators.length > 0 && singleKey;
269
+ // Timestamps ---------------------------------------------------------------------------------
270
+ const timestamps = [];
271
+ if (defaults.creationTimestamp === true &&
272
+ isCreationColumn(field) &&
273
+ !role.isKey &&
274
+ generatedSql === undefined) {
275
+ timestamps.push(annotation(imports.hibernate('CreationTimestamp')));
276
+ }
277
+ if (field.isAutoUpdated) {
278
+ if (field.type === 'dateTime' && depth === 0 && !role.isKey) {
279
+ timestamps.push(annotation(imports.hibernate('UpdateTimestamp')));
280
+ }
281
+ else {
282
+ context.warn(`${label}: Hibernate can refresh a date-time column only; the ${field.type} column was written as an ordinary column.`);
283
+ }
284
+ }
285
+ // Initializer: a new object already shows the default, and Hibernate has a value to insert -----
286
+ const initializer = generatedSql === undefined &&
287
+ depth === 0 &&
288
+ !role.isKey &&
289
+ !uuidGenerator &&
290
+ !timestamps.some((item) => item.name === 'CreationTimestamp')
291
+ ? initializerOf(context, imports, field, scalar, defaults)
292
+ : undefined;
293
+ // Types ----------------------------------------------------------------------------------------
294
+ const nullable = role.isKey ? false : field.isNullable;
295
+ const hasDatabaseDefault = sqlDefault !== undefined &&
296
+ initializer === undefined &&
297
+ !timestamps.some((item) => item.name === 'CreationTimestamp');
298
+ const usePrimitive = scalar.primitive !== undefined &&
299
+ !nullable &&
300
+ !role.isKey &&
301
+ depth === 0 &&
302
+ plan === undefined &&
303
+ !hasDatabaseDefault &&
304
+ !uuidGenerator &&
305
+ generatedSql === undefined &&
306
+ timestamps.length === 0;
307
+ const type = usePrimitive
308
+ ? (scalar.primitive ?? scalar.boxed)
309
+ : scalar.boxed;
310
+ const annotations = [];
311
+ if (role.isKey) {
312
+ annotations.push(annotation(imports.persistence('Id')));
313
+ }
314
+ annotations.push(...generators, ...scalar.extra);
315
+ annotations.push(annotation(imports.persistence('Column'), columnArguments(field, scalar, nullable, role, generatedSql !== undefined)));
316
+ if (sqlDefault !== undefined && generatedSql === undefined) {
317
+ annotations.push(annotation(imports.hibernate('ColumnDefault'), [
318
+ [undefined, javaString(sqlDefault)],
319
+ ]));
320
+ }
321
+ annotations.push(...timestamps);
322
+ if (generatedSql !== undefined) {
323
+ annotations.push(annotation(imports.hibernate('GeneratedColumn'), [
324
+ [undefined, javaString(generatedSql)],
325
+ ]));
326
+ }
327
+ const attribute = {
328
+ name,
329
+ type,
330
+ annotations,
331
+ imports,
332
+ ...(initializer === undefined ? {} : { initializer }),
333
+ ...(type === 'boolean' ? { isPrimitiveBoolean: true } : {}),
334
+ };
335
+ return {
336
+ attribute,
337
+ boxedType: scalar.boxed,
338
+ dynamicInsert: hasDatabaseDefault && !keyGenerated,
339
+ };
340
+ }
341
+ //# sourceMappingURL=jpaColumns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jpaColumns.js","sourceRoot":"","sources":["../../src/emitters/jpaColumns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { IrField } from '../ir.js';
2
+ import type { EnumPlan } from './jpaTypes.js';
3
+ import type { PrismaProvider } from './prisma.js';
4
+ /** Turns the default of an IR field into what Hibernate can say: `@ColumnDefault` SQL or a generator. */
5
+ /** PostgreSQL and the databases that speak its types (MongoDB is written like PostgreSQL, with a warning). */
6
+ export declare function isPostgres(provider: PrismaProvider): boolean;
7
+ export interface DefaultSpec {
8
+ /** The text of `@ColumnDefault`. */
9
+ sql?: string;
10
+ /** True when the value is a UUID the application generates (`@UuidGenerator` or the id generator). */
11
+ uuid?: boolean;
12
+ /** True for a date-time "now" default, which `@CreationTimestamp` fills in. */
13
+ creationTimestamp?: boolean;
14
+ /** A Java expression with the same value, for the field initializer (so a new object already shows the default). */
15
+ initializer?: string;
16
+ /** The classes the initializer needs imported. */
17
+ initializerImports?: string[];
18
+ }
19
+ export interface DefaultContext {
20
+ provider: PrismaProvider;
21
+ warn: (message: string) => void;
22
+ }
23
+ /** Works out the default of a field; `isKey` is true for the single column of a primary key. */
24
+ export declare function defaultOf(context: DefaultContext, label: string, field: IrField, enumPlan: EnumPlan | undefined): DefaultSpec;
@@ -0,0 +1,223 @@
1
+ import { javaString, sqlString } from './jpaNames.js';
2
+ /** Turns the default of an IR field into what Hibernate can say: `@ColumnDefault` SQL or a generator. */
3
+ /** PostgreSQL and the databases that speak its types (MongoDB is written like PostgreSQL, with a warning). */
4
+ export function isPostgres(provider) {
5
+ return (provider === 'postgresql' ||
6
+ provider === 'cockroachdb' ||
7
+ provider === 'mongodb');
8
+ }
9
+ /** SQLite and MySQL accept an expression as a default only in parentheses: `DEFAULT (uuid())`. */
10
+ const PLAIN_DEFAULT = /^(current_(timestamp|date|time)(\(\d*\))?|localtimestamp|now\(\)|null|true|false|-?\d+(\.\d+)?|'(?:[^']|'')*')$/i;
11
+ function wrapExpression(provider, expression) {
12
+ const trimmed = expression.trim();
13
+ const needsParentheses = (provider === 'sqlite' || provider === 'mysql') &&
14
+ !PLAIN_DEFAULT.test(trimmed) &&
15
+ !/^\(.*\)$/s.test(trimmed);
16
+ return needsParentheses ? `(${trimmed})` : trimmed;
17
+ }
18
+ /** The SQL that stands for "now" in a column type. */
19
+ function nowSql(provider, type) {
20
+ if (provider === 'sqlserver' && type === 'dateTime') {
21
+ return 'GETUTCDATE()';
22
+ }
23
+ if (type === 'date') {
24
+ return provider === 'mysql' ? '(CURRENT_DATE)' : 'CURRENT_DATE';
25
+ }
26
+ if (type === 'time') {
27
+ return provider === 'mysql' ? '(CURRENT_TIME)' : 'CURRENT_TIME';
28
+ }
29
+ return 'CURRENT_TIMESTAMP';
30
+ }
31
+ /** The enum member a default value names, by member name or by stored value. */
32
+ function enumMember(plan, raw) {
33
+ return (plan.enumeration.values.find((value) => value.name === raw) ??
34
+ plan.enumeration.values.find((value) => value.dbValue === raw));
35
+ }
36
+ /** The stored value of an enum member as SQL: a number in a numeric column, quoted text otherwise. */
37
+ function enumSql(field, member) {
38
+ return (field.type === 'int' || field.type === 'bigInt') &&
39
+ /^-?\d+$/.test(member.dbValue)
40
+ ? member.dbValue
41
+ : sqlString(member.dbValue);
42
+ }
43
+ function enumConstant(plan, member) {
44
+ return `${plan.typeName}.${plan.members.get(member.name) ?? member.name}`;
45
+ }
46
+ /** The Java literal of a number for a column type, or undefined when it does not fit. */
47
+ function numberInitializer(field, value) {
48
+ if (!Number.isFinite(value)) {
49
+ return undefined;
50
+ }
51
+ switch (field.type) {
52
+ case 'int':
53
+ return Number.isInteger(value) ? String(value) : undefined;
54
+ case 'bigInt':
55
+ return Number.isInteger(value) ? `${value}L` : undefined;
56
+ case 'float': {
57
+ const text = String(value);
58
+ return /^-?\d+$/.test(text) ? `${text}.0` : text;
59
+ }
60
+ case 'decimal': {
61
+ const text = numberSql(value);
62
+ return text === undefined
63
+ ? undefined
64
+ : `new BigDecimal(${javaString(text)})`;
65
+ }
66
+ default:
67
+ return undefined;
68
+ }
69
+ }
70
+ function numberSql(value) {
71
+ if (!Number.isFinite(value)) {
72
+ return undefined;
73
+ }
74
+ return /e/i.test(String(value))
75
+ ? value.toFixed(20).replace(/\.?0+$/, '')
76
+ : String(value);
77
+ }
78
+ function booleanSql(provider, value) {
79
+ return provider === 'mysql' ||
80
+ provider === 'sqlite' ||
81
+ provider === 'sqlserver'
82
+ ? value
83
+ ? '1'
84
+ : '0'
85
+ : String(value);
86
+ }
87
+ function literalSql(context, label, field, value, enumPlan) {
88
+ const drop = (reason) => {
89
+ context.warn(`${label}: ${reason}; the default was dropped.`);
90
+ return {};
91
+ };
92
+ const asText = String(value);
93
+ if (enumPlan !== undefined) {
94
+ const found = enumMember(enumPlan, asText);
95
+ if (found === undefined) {
96
+ return drop(`the enum default "${asText}" matches no member`);
97
+ }
98
+ return {
99
+ sql: enumSql(field, found),
100
+ initializer: enumConstant(enumPlan, found),
101
+ };
102
+ }
103
+ if (field.arrayDepth !== undefined) {
104
+ return drop('an array default cannot be written');
105
+ }
106
+ switch (field.type) {
107
+ case 'boolean': {
108
+ const truth = typeof value === 'boolean'
109
+ ? value
110
+ : /^(1|true)$/i.test(asText)
111
+ ? true
112
+ : /^(0|false)$/i.test(asText)
113
+ ? false
114
+ : undefined;
115
+ if (truth !== undefined) {
116
+ return {
117
+ sql: booleanSql(context.provider, truth),
118
+ initializer: String(truth),
119
+ };
120
+ }
121
+ return drop(`"${asText}" is not a boolean`);
122
+ }
123
+ case 'int':
124
+ case 'bigInt':
125
+ case 'float':
126
+ case 'decimal': {
127
+ const numeric = typeof value === 'number' ? value : Number(value);
128
+ const number = numberSql(numeric);
129
+ const initializer = numberInitializer(field, numeric);
130
+ return number === undefined
131
+ ? drop(`"${asText}" is not a number this column can hold`)
132
+ : {
133
+ sql: number,
134
+ ...(initializer === undefined ? {} : { initializer }),
135
+ ...(field.type === 'decimal'
136
+ ? { initializerImports: ['java.math.BigDecimal'] }
137
+ : {}),
138
+ };
139
+ }
140
+ case 'json':
141
+ case 'text':
142
+ // MySQL does not accept a plain literal as the default of a TEXT or JSON column; an expression does.
143
+ return {
144
+ sql: context.provider === 'mysql'
145
+ ? `(${sqlString(asText)})`
146
+ : sqlString(asText),
147
+ ...(field.type === 'text' ? { initializer: javaString(asText) } : {}),
148
+ };
149
+ case 'string':
150
+ return { sql: sqlString(asText), initializer: javaString(asText) };
151
+ case 'uuid':
152
+ return {
153
+ sql: sqlString(asText),
154
+ ...(/^[0-9a-f-]{36}$/i.test(asText)
155
+ ? {
156
+ initializer: `UUID.fromString(${javaString(asText)})`,
157
+ initializerImports: ['java.util.UUID'],
158
+ }
159
+ : {}),
160
+ };
161
+ case 'date':
162
+ case 'time':
163
+ case 'dateTime':
164
+ case 'duration':
165
+ case 'ipAddress':
166
+ return { sql: sqlString(asText) };
167
+ default:
168
+ return drop(`a literal default on a ${field.type} column cannot be written`);
169
+ }
170
+ }
171
+ /** Works out the default of a field; `isKey` is true for the single column of a primary key. */
172
+ export function defaultOf(context, label, field, enumPlan) {
173
+ const value = field.default;
174
+ if (value === undefined) {
175
+ return {};
176
+ }
177
+ switch (value.kind) {
178
+ case 'autoIncrement':
179
+ return {};
180
+ case 'now':
181
+ if (field.type !== 'dateTime' &&
182
+ field.type !== 'date' &&
183
+ field.type !== 'time') {
184
+ context.warn(`${label}: the "now" default applies to date and time columns only; the default was dropped.`);
185
+ return {};
186
+ }
187
+ return {
188
+ sql: nowSql(context.provider, field.type),
189
+ ...(field.type === 'dateTime' ? { creationTimestamp: true } : {}),
190
+ };
191
+ case 'uuid':
192
+ if (field.type !== 'uuid') {
193
+ context.warn(`${label}: a UUID default on a ${field.type} column cannot be written; the default was dropped.`);
194
+ return {};
195
+ }
196
+ return { uuid: true };
197
+ case 'enumValue': {
198
+ const found = enumPlan === undefined ? undefined : enumMember(enumPlan, value.value);
199
+ if (enumPlan === undefined || found === undefined) {
200
+ context.warn(`${label}: the enum default "${value.value}" matches no enum member; the default was dropped.`);
201
+ return {};
202
+ }
203
+ return {
204
+ sql: enumSql(field, found),
205
+ initializer: enumConstant(enumPlan, found),
206
+ };
207
+ }
208
+ case 'literal':
209
+ return literalSql(context, label, field, value.value, enumPlan);
210
+ case 'dbExpression':
211
+ if (value.isFunction === true) {
212
+ context.warn(`${label}: the Prisma function ${value.expression} is not a database expression; the default was dropped.`);
213
+ return {};
214
+ }
215
+ return { sql: wrapExpression(context.provider, value.expression) };
216
+ case 'clientGenerated':
217
+ context.warn(`${label}: the ${value.generator}() default is generated by Prisma Client; JPA has no equivalent and the default was dropped.`);
218
+ return {};
219
+ default:
220
+ return {};
221
+ }
222
+ }
223
+ //# sourceMappingURL=jpaDefaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jpaDefaults.js","sourceRoot":"","sources":["../../src/emitters/jpaDefaults.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { IrSchema } from '../ir.js';
2
+ import { Imports, type EnumPlan, type JpaStyle } from './jpaTypes.js';
3
+ /** Plans every enum of the schema; `typeNames` holds the class names taken so far and receives the new ones. */
4
+ export declare function planEnums(schema: IrSchema, typeNames: Set<string>, warn: (message: string) => void): Map<string, EnumPlan>;
5
+ /** The text of a Java enum file (without the header and package, which the caller writes). */
6
+ export declare function renderEnumBody(plan: EnumPlan): string[];
7
+ /** The body of the converter file of an enum whose stored values differ from the constant names. */
8
+ export declare function renderConverterBody(plan: EnumPlan, style: JpaStyle): {
9
+ imports: Imports;
10
+ lines: string[];
11
+ };