ormbridge 0.9.0 → 0.11.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 +19 -18
- package/dist/cliRunner.js +4 -4
- package/dist/cliRunner.js.map +1 -1
- package/dist/config.d.ts +2 -2
- package/dist/convert.js +30 -1
- package/dist/convert.js.map +1 -1
- package/dist/emitters/cockroach.d.ts +33 -0
- package/dist/emitters/cockroach.js +81 -0
- package/dist/emitters/cockroach.js.map +1 -0
- package/dist/emitters/doctrine.js +11 -0
- package/dist/emitters/doctrine.js.map +1 -1
- package/dist/emitters/drizzle.js +39 -4
- package/dist/emitters/drizzle.js.map +1 -1
- package/dist/emitters/efcore.js +18 -1
- package/dist/emitters/efcore.js.map +1 -1
- package/dist/emitters/efcoreColumns.js +23 -2
- package/dist/emitters/efcoreColumns.js.map +1 -1
- package/dist/emitters/gorm.js +20 -1
- package/dist/emitters/gorm.js.map +1 -1
- package/dist/emitters/jpa.d.ts +36 -0
- package/dist/emitters/jpa.js +262 -0
- package/dist/emitters/jpa.js.map +1 -0
- package/dist/emitters/jpaColumns.d.ts +27 -0
- package/dist/emitters/jpaColumns.js +342 -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 +201 -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/emitters/laravel.js +11 -0
- package/dist/emitters/laravel.js.map +1 -1
- package/dist/emitters/prisma.d.ts +1 -1
- package/dist/emitters/prisma.js +47 -5
- package/dist/emitters/prisma.js.map +1 -1
- package/dist/emitters/sequelize.js +82 -6
- package/dist/emitters/sequelize.js.map +1 -1
- package/dist/emitters/sqlClickhouse.d.ts +43 -0
- package/dist/emitters/sqlClickhouse.js +265 -0
- package/dist/emitters/sqlClickhouse.js.map +1 -0
- package/dist/emitters/sqlClickhouseIndexes.d.ts +3 -0
- package/dist/emitters/sqlClickhouseIndexes.js +98 -0
- package/dist/emitters/sqlClickhouseIndexes.js.map +1 -0
- package/dist/emitters/sqlClickhouseTypes.d.ts +39 -0
- package/dist/emitters/sqlClickhouseTypes.js +360 -0
- package/dist/emitters/sqlClickhouseTypes.js.map +1 -0
- package/dist/emitters/sqlDdl.d.ts +29 -1
- package/dist/emitters/sqlDdl.js +141 -21
- package/dist/emitters/sqlDdl.js.map +1 -1
- package/dist/emitters/sqlalchemy.d.ts +7 -1
- package/dist/emitters/sqlalchemy.js +39 -0
- package/dist/emitters/sqlalchemy.js.map +1 -1
- package/dist/emitters/typeorm.js +44 -9
- package/dist/emitters/typeorm.js.map +1 -1
- package/dist/formats.d.ts +5 -2
- package/dist/formats.js +36 -1
- package/dist/formats.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/io.js +27 -1
- package/dist/io.js.map +1 -1
- 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/parsers/prisma.js +9 -1
- package/dist/parsers/prisma.js.map +1 -1
- package/dist/parsers/sqlDdl.js +40 -2
- package/dist/parsers/sqlDdl.js.map +1 -1
- package/dist/parsers/sqlSyntax.js +15 -1
- package/dist/parsers/sqlSyntax.js.map +1 -1
- package/dist/parsers/sqlTypes.js +37 -2
- package/dist/parsers/sqlTypes.js.map +1 -1
- package/dist/parsers/typeorm.js +2 -0
- package/dist/parsers/typeorm.js.map +1 -1
- package/dist/styles.d.ts +3 -2
- package/dist/styles.js +4 -1
- package/dist/styles.js.map +1 -1
- package/package.json +8 -1
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Imports } from './jpaTypes.js';
|
|
2
|
+
function findField(model, name) {
|
|
3
|
+
return (model.fields.find((field) => field.name === name) ??
|
|
4
|
+
model.fields.find((field) => field.columnName === name));
|
|
5
|
+
}
|
|
6
|
+
function findRelation(model, name) {
|
|
7
|
+
return model.relations.find((relation) => relation.kind !== 'manyToMany' &&
|
|
8
|
+
(relation.name === name || relation.columnName === name));
|
|
9
|
+
}
|
|
10
|
+
/** Column types that make a poor identifier: large or approximate values. */
|
|
11
|
+
const POOR_KEYS = new Set([
|
|
12
|
+
'text',
|
|
13
|
+
'json',
|
|
14
|
+
'bytes',
|
|
15
|
+
'float',
|
|
16
|
+
'boolean',
|
|
17
|
+
'hstore',
|
|
18
|
+
'range',
|
|
19
|
+
'unsupported',
|
|
20
|
+
]);
|
|
21
|
+
/** The column to use as the identifier of a model that has no key: the first required column of a sensible type. */
|
|
22
|
+
export function identifierCandidate(model) {
|
|
23
|
+
const required = model.fields.filter((field) => !field.isNullable && field.arrayDepth === undefined);
|
|
24
|
+
return (required.find((field) => !POOR_KEYS.has(field.type)) ??
|
|
25
|
+
required[0] ??
|
|
26
|
+
model.fields[0]);
|
|
27
|
+
}
|
|
28
|
+
/** The primary key of a model; `warn` is told about names it cannot resolve and about a missing key. */
|
|
29
|
+
export function keyOf(model, warn) {
|
|
30
|
+
const parts = [];
|
|
31
|
+
if (model.compositePrimaryKey !== undefined) {
|
|
32
|
+
for (const name of model.compositePrimaryKey) {
|
|
33
|
+
const field = findField(model, name);
|
|
34
|
+
const relation = field === undefined ? findRelation(model, name) : undefined;
|
|
35
|
+
if (field !== undefined) {
|
|
36
|
+
parts.push({ kind: 'field', field });
|
|
37
|
+
}
|
|
38
|
+
else if (relation !== undefined) {
|
|
39
|
+
parts.push({ kind: 'relation', relation });
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
warn(`${model.name}: the primary key column "${name}" is neither a field nor a relation of the model, so it was left out of the key.`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
for (const field of model.fields) {
|
|
48
|
+
if (field.isPrimaryKey) {
|
|
49
|
+
parts.push({ kind: 'field', field });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
for (const relation of model.relations) {
|
|
53
|
+
if (relation.kind !== 'manyToMany' && relation.isPrimaryKey === true) {
|
|
54
|
+
parts.push({ kind: 'relation', relation });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (parts.length > 0) {
|
|
59
|
+
return { parts, synthesized: false };
|
|
60
|
+
}
|
|
61
|
+
const chosen = identifierCandidate(model);
|
|
62
|
+
if (chosen === undefined) {
|
|
63
|
+
return { parts, synthesized: false };
|
|
64
|
+
}
|
|
65
|
+
warn(`${model.name}: ${model.isView === true ? 'a database view' : 'the table'} has no primary key, but a JPA entity needs an identifier; the column "${chosen.columnName}" was written as the @Id (Hibernate would create a primary key on it).`);
|
|
66
|
+
return { parts: [{ kind: 'field', field: chosen }], synthesized: true };
|
|
67
|
+
}
|
|
68
|
+
/** The text of an `@IdClass` file body: fields, constructors, `equals` and `hashCode`. */
|
|
69
|
+
export function renderIdClass(name, parts, style) {
|
|
70
|
+
const imports = new Imports(style);
|
|
71
|
+
imports.use('java.io.Serializable');
|
|
72
|
+
imports.use('java.util.Objects');
|
|
73
|
+
for (const part of parts) {
|
|
74
|
+
imports.merge(part.imports);
|
|
75
|
+
}
|
|
76
|
+
const lines = [
|
|
77
|
+
`public class ${name} implements Serializable {`,
|
|
78
|
+
' private static final long serialVersionUID = 1L;',
|
|
79
|
+
'',
|
|
80
|
+
...parts.map((part) => ` private ${part.type} ${part.name};`),
|
|
81
|
+
'',
|
|
82
|
+
` public ${name}() {}`,
|
|
83
|
+
'',
|
|
84
|
+
` public ${name}(${parts.map((part) => `${part.type} ${part.name}`).join(', ')}) {`,
|
|
85
|
+
...parts.map((part) => ` this.${part.name} = ${part.name};`),
|
|
86
|
+
' }',
|
|
87
|
+
'',
|
|
88
|
+
' @Override',
|
|
89
|
+
' public boolean equals(Object other) {',
|
|
90
|
+
' if (this == other) {',
|
|
91
|
+
' return true;',
|
|
92
|
+
' }',
|
|
93
|
+
` if (!(other instanceof ${name})) {`,
|
|
94
|
+
' return false;',
|
|
95
|
+
' }',
|
|
96
|
+
` ${name} that = (${name}) other;`,
|
|
97
|
+
` return ${parts
|
|
98
|
+
.map((part) => `Objects.equals(${part.name}, that.${part.name})`)
|
|
99
|
+
.join(' && ')};`,
|
|
100
|
+
' }',
|
|
101
|
+
'',
|
|
102
|
+
' @Override',
|
|
103
|
+
' public int hashCode() {',
|
|
104
|
+
` return Objects.hash(${parts.map((part) => part.name).join(', ')});`,
|
|
105
|
+
' }',
|
|
106
|
+
'}',
|
|
107
|
+
];
|
|
108
|
+
return { imports, lines };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=jpaKeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jpaKeys.js","sourceRoot":"","sources":["../../src/emitters/jpaKeys.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Name and literal helpers of the Hibernate / JPA emitter. */
|
|
2
|
+
/** The Java package of the generated classes when none is given. */
|
|
3
|
+
export declare const DEFAULT_JPA_PACKAGE: string;
|
|
4
|
+
/**
|
|
5
|
+
* Simple names of the types the generated code imports or refers to. A class of the same name in the package
|
|
6
|
+
* would be hidden by the import (or collide with `java.lang`), so a model or enum with one of these names is renamed.
|
|
7
|
+
*/
|
|
8
|
+
export declare const RESERVED_TYPE_NAMES: ReadonlySet<string>;
|
|
9
|
+
/** True for a valid Java identifier that is not a keyword. */
|
|
10
|
+
export declare function isJavaIdentifier(value: string): boolean;
|
|
11
|
+
/** True for a dotted Java package name such as `app.models`. */
|
|
12
|
+
export declare function isValidJavaPackage(value: string): boolean;
|
|
13
|
+
/** Keeps a name that is already a valid identifier and repairs one that is not. */
|
|
14
|
+
export declare function repairedIdentifier(raw: string): string;
|
|
15
|
+
/** A class name: PascalCase, singular when the model was named after a table (`blog_posts`). */
|
|
16
|
+
export declare function classNameOf(modelName: string): string;
|
|
17
|
+
/** An attribute name: camelCase, with a trailing underscore when the word is reserved in Java. */
|
|
18
|
+
export declare function attributeNameOf(raw: string): string;
|
|
19
|
+
/** Reserves `base` in `used`, appending a number when the name is taken. */
|
|
20
|
+
export declare function uniqueName(base: string, used: Set<string>): string;
|
|
21
|
+
/** Upper-cases the first letter: `viewCount` is `ViewCount`. */
|
|
22
|
+
export declare function capitalize(name: string): string;
|
|
23
|
+
/** A Java string literal. */
|
|
24
|
+
export declare function javaString(value: string): string;
|
|
25
|
+
/** A SQL string literal (single quotes doubled), for `@ColumnDefault` and `columnDefinition`. */
|
|
26
|
+
export declare function sqlString(value: string): string;
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { singularize, toCamelCase, toPascalCase } from '../naming.js';
|
|
2
|
+
/** Name and literal helpers of the Hibernate / JPA emitter. */
|
|
3
|
+
/** The Java package of the generated classes when none is given. */
|
|
4
|
+
export const DEFAULT_JPA_PACKAGE = 'app.models';
|
|
5
|
+
const IDENTIFIER_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
6
|
+
/** Java keywords and literals: an identifier with one of these names does not compile. */
|
|
7
|
+
const KEYWORDS = new Set([
|
|
8
|
+
'abstract',
|
|
9
|
+
'assert',
|
|
10
|
+
'boolean',
|
|
11
|
+
'break',
|
|
12
|
+
'byte',
|
|
13
|
+
'case',
|
|
14
|
+
'catch',
|
|
15
|
+
'char',
|
|
16
|
+
'class',
|
|
17
|
+
'const',
|
|
18
|
+
'continue',
|
|
19
|
+
'default',
|
|
20
|
+
'do',
|
|
21
|
+
'double',
|
|
22
|
+
'else',
|
|
23
|
+
'enum',
|
|
24
|
+
'extends',
|
|
25
|
+
'false',
|
|
26
|
+
'final',
|
|
27
|
+
'finally',
|
|
28
|
+
'float',
|
|
29
|
+
'for',
|
|
30
|
+
'goto',
|
|
31
|
+
'if',
|
|
32
|
+
'implements',
|
|
33
|
+
'import',
|
|
34
|
+
'instanceof',
|
|
35
|
+
'int',
|
|
36
|
+
'interface',
|
|
37
|
+
'long',
|
|
38
|
+
'native',
|
|
39
|
+
'new',
|
|
40
|
+
'non-sealed',
|
|
41
|
+
'null',
|
|
42
|
+
'package',
|
|
43
|
+
'private',
|
|
44
|
+
'protected',
|
|
45
|
+
'public',
|
|
46
|
+
'return',
|
|
47
|
+
'short',
|
|
48
|
+
'static',
|
|
49
|
+
'strictfp',
|
|
50
|
+
'super',
|
|
51
|
+
'switch',
|
|
52
|
+
'synchronized',
|
|
53
|
+
'this',
|
|
54
|
+
'throw',
|
|
55
|
+
'throws',
|
|
56
|
+
'transient',
|
|
57
|
+
'true',
|
|
58
|
+
'try',
|
|
59
|
+
'void',
|
|
60
|
+
'volatile',
|
|
61
|
+
'while',
|
|
62
|
+
'_',
|
|
63
|
+
]);
|
|
64
|
+
/**
|
|
65
|
+
* Simple names of the types the generated code imports or refers to. A class of the same name in the package
|
|
66
|
+
* would be hidden by the import (or collide with `java.lang`), so a model or enum with one of these names is renamed.
|
|
67
|
+
*/
|
|
68
|
+
export const RESERVED_TYPE_NAMES = new Set([
|
|
69
|
+
'ArrayList',
|
|
70
|
+
'Arrays',
|
|
71
|
+
'AttributeConverter',
|
|
72
|
+
'BigDecimal',
|
|
73
|
+
'BigInteger',
|
|
74
|
+
'Boolean',
|
|
75
|
+
'Byte',
|
|
76
|
+
'Character',
|
|
77
|
+
'Class',
|
|
78
|
+
'Collection',
|
|
79
|
+
'Column',
|
|
80
|
+
'ColumnDefault',
|
|
81
|
+
'ConstraintMode',
|
|
82
|
+
'Convert',
|
|
83
|
+
'Converter',
|
|
84
|
+
'CreationTimestamp',
|
|
85
|
+
'Double',
|
|
86
|
+
'Duration',
|
|
87
|
+
'DynamicInsert',
|
|
88
|
+
'Entity',
|
|
89
|
+
'Enum',
|
|
90
|
+
'EnumType',
|
|
91
|
+
'Enumerated',
|
|
92
|
+
'FetchType',
|
|
93
|
+
'Float',
|
|
94
|
+
'ForeignKey',
|
|
95
|
+
'GeneratedColumn',
|
|
96
|
+
'GeneratedValue',
|
|
97
|
+
'GenerationType',
|
|
98
|
+
'GenericGenerator',
|
|
99
|
+
'HashSet',
|
|
100
|
+
'Id',
|
|
101
|
+
'IdClass',
|
|
102
|
+
'Immutable',
|
|
103
|
+
'Index',
|
|
104
|
+
'InetAddress',
|
|
105
|
+
'Instant',
|
|
106
|
+
'Integer',
|
|
107
|
+
'Iterable',
|
|
108
|
+
'JdbcTypeCode',
|
|
109
|
+
'JoinColumn',
|
|
110
|
+
'JoinColumns',
|
|
111
|
+
'JoinTable',
|
|
112
|
+
'List',
|
|
113
|
+
'LocalDate',
|
|
114
|
+
'LocalDateTime',
|
|
115
|
+
'LocalTime',
|
|
116
|
+
'Lob',
|
|
117
|
+
'Long',
|
|
118
|
+
'ManyToMany',
|
|
119
|
+
'ManyToOne',
|
|
120
|
+
'Map',
|
|
121
|
+
'Math',
|
|
122
|
+
'Number',
|
|
123
|
+
'Object',
|
|
124
|
+
'OffsetDateTime',
|
|
125
|
+
'OnDelete',
|
|
126
|
+
'OnDeleteAction',
|
|
127
|
+
'OneToMany',
|
|
128
|
+
'OneToOne',
|
|
129
|
+
'Objects',
|
|
130
|
+
'Override',
|
|
131
|
+
'Record',
|
|
132
|
+
'Serializable',
|
|
133
|
+
'Set',
|
|
134
|
+
'Short',
|
|
135
|
+
'SqlTypes',
|
|
136
|
+
'String',
|
|
137
|
+
'System',
|
|
138
|
+
'Table',
|
|
139
|
+
'Thread',
|
|
140
|
+
'UUID',
|
|
141
|
+
'UniqueConstraint',
|
|
142
|
+
'UpdateTimestamp',
|
|
143
|
+
'UuidGenerator',
|
|
144
|
+
'Void',
|
|
145
|
+
]);
|
|
146
|
+
/** True for a valid Java identifier that is not a keyword. */
|
|
147
|
+
export function isJavaIdentifier(value) {
|
|
148
|
+
return IDENTIFIER_PATTERN.test(value) && !KEYWORDS.has(value);
|
|
149
|
+
}
|
|
150
|
+
/** True for a dotted Java package name such as `app.models`. */
|
|
151
|
+
export function isValidJavaPackage(value) {
|
|
152
|
+
return (value.length > 0 &&
|
|
153
|
+
value.split('.').every((part) => isJavaIdentifier(part)));
|
|
154
|
+
}
|
|
155
|
+
/** Keeps a name that is already a valid identifier and repairs one that is not. */
|
|
156
|
+
export function repairedIdentifier(raw) {
|
|
157
|
+
const replaced = raw.replace(/[^A-Za-z0-9_]/g, '_');
|
|
158
|
+
const prefixed = /^[0-9]/.test(replaced) ? `_${replaced}` : replaced;
|
|
159
|
+
const named = prefixed === '' || /^_+$/.test(prefixed) ? 'value' : prefixed;
|
|
160
|
+
return KEYWORDS.has(named) ? `${named}_` : named;
|
|
161
|
+
}
|
|
162
|
+
/** A class name: PascalCase, singular when the model was named after a table (`blog_posts`). */
|
|
163
|
+
export function classNameOf(modelName) {
|
|
164
|
+
if (/^[A-Z][A-Za-z0-9]*$/.test(modelName)) {
|
|
165
|
+
return modelName;
|
|
166
|
+
}
|
|
167
|
+
const words = /[_\s-]/.test(modelName)
|
|
168
|
+
? singularize(modelName.toLowerCase().replace(/[\s-]+/g, '_'))
|
|
169
|
+
: modelName;
|
|
170
|
+
const pascal = toPascalCase(words);
|
|
171
|
+
if (pascal === '') {
|
|
172
|
+
return 'Entity';
|
|
173
|
+
}
|
|
174
|
+
return /^[0-9]/.test(pascal) ? `_${pascal}` : pascal;
|
|
175
|
+
}
|
|
176
|
+
/** An attribute name: camelCase, with a trailing underscore when the word is reserved in Java. */
|
|
177
|
+
export function attributeNameOf(raw) {
|
|
178
|
+
const camel = toCamelCase(raw);
|
|
179
|
+
if (camel === '') {
|
|
180
|
+
return 'value';
|
|
181
|
+
}
|
|
182
|
+
const named = /^[0-9]/.test(camel) ? `_${camel}` : camel;
|
|
183
|
+
return KEYWORDS.has(named) || named === 'class' ? `${named}_` : named;
|
|
184
|
+
}
|
|
185
|
+
/** Reserves `base` in `used`, appending a number when the name is taken. */
|
|
186
|
+
export function uniqueName(base, used) {
|
|
187
|
+
let candidate = base;
|
|
188
|
+
let suffix = 2;
|
|
189
|
+
while (used.has(candidate)) {
|
|
190
|
+
candidate = `${base}${suffix}`;
|
|
191
|
+
suffix += 1;
|
|
192
|
+
}
|
|
193
|
+
used.add(candidate);
|
|
194
|
+
return candidate;
|
|
195
|
+
}
|
|
196
|
+
/** Upper-cases the first letter: `viewCount` is `ViewCount`. */
|
|
197
|
+
export function capitalize(name) {
|
|
198
|
+
return name.charAt(0).toUpperCase() + name.slice(1);
|
|
199
|
+
}
|
|
200
|
+
/** A Java string literal. */
|
|
201
|
+
export function javaString(value) {
|
|
202
|
+
let escaped = '';
|
|
203
|
+
for (const character of value) {
|
|
204
|
+
const code = character.codePointAt(0) ?? 0;
|
|
205
|
+
switch (character) {
|
|
206
|
+
case '\\':
|
|
207
|
+
escaped += '\\\\';
|
|
208
|
+
break;
|
|
209
|
+
case '"':
|
|
210
|
+
escaped += '\\"';
|
|
211
|
+
break;
|
|
212
|
+
case '\n':
|
|
213
|
+
escaped += '\\n';
|
|
214
|
+
break;
|
|
215
|
+
case '\r':
|
|
216
|
+
escaped += '\\r';
|
|
217
|
+
break;
|
|
218
|
+
case '\t':
|
|
219
|
+
escaped += '\\t';
|
|
220
|
+
break;
|
|
221
|
+
default:
|
|
222
|
+
escaped +=
|
|
223
|
+
code < 0x20 || code === 0x7f
|
|
224
|
+
? `\\u${code.toString(16).padStart(4, '0')}`
|
|
225
|
+
: character;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return `"${escaped}"`;
|
|
229
|
+
}
|
|
230
|
+
/** A SQL string literal (single quotes doubled), for `@ColumnDefault` and `columnDefinition`. */
|
|
231
|
+
export function sqlString(value) {
|
|
232
|
+
return `'${value.replace(/'/g, "''")}'`;
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=jpaNames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jpaNames.js","sourceRoot":"","sources":["../../src/emitters/jpaNames.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { IrField, IrModel, IrRelation, IrSchema } from '../ir.js';
|
|
2
|
+
import type { KeyInfo } from './jpaKeys.js';
|
|
3
|
+
import { Imports, type JpaStyle, type ModelPlan } from './jpaTypes.js';
|
|
4
|
+
/** Writes the relations of the models: the owning side with its join columns, the inverse side and the join tables. */
|
|
5
|
+
/** An inverse side to add to the target of a relation once every owning side is named. */
|
|
6
|
+
export interface InverseLink {
|
|
7
|
+
owner: ModelPlan;
|
|
8
|
+
target: ModelPlan;
|
|
9
|
+
kind: 'oneToMany' | 'oneToOne' | 'manyToMany';
|
|
10
|
+
/** The attribute of the owner the inverse side maps. */
|
|
11
|
+
mappedBy: string;
|
|
12
|
+
relatedName: string;
|
|
13
|
+
}
|
|
14
|
+
export interface RelationContext {
|
|
15
|
+
style: JpaStyle;
|
|
16
|
+
schema: IrSchema;
|
|
17
|
+
plans: ReadonlyMap<string, ModelPlan>;
|
|
18
|
+
keys: ReadonlyMap<string, KeyInfo>;
|
|
19
|
+
/** The boxed Java type of the single-column key of each model, with its imports. */
|
|
20
|
+
keyTypes: ReadonlyMap<string, {
|
|
21
|
+
type: string;
|
|
22
|
+
imports: Imports;
|
|
23
|
+
}>;
|
|
24
|
+
inverses: InverseLink[];
|
|
25
|
+
warn: (message: string) => void;
|
|
26
|
+
}
|
|
27
|
+
/** A relation that is part of a primary key: its attribute name and the type of the key it points at. */
|
|
28
|
+
export interface KeyRelation {
|
|
29
|
+
attribute: string;
|
|
30
|
+
type: string;
|
|
31
|
+
imports: Imports;
|
|
32
|
+
}
|
|
33
|
+
/** The column and Java type of the single-column key of a model, or undefined when it has none. */
|
|
34
|
+
export declare function singleKey(ctx: RelationContext, model: IrModel): {
|
|
35
|
+
column: string;
|
|
36
|
+
field?: IrField;
|
|
37
|
+
} | undefined;
|
|
38
|
+
/** Adds the owning side of every relation of one model; returns the relations that are part of its key. */
|
|
39
|
+
export declare function addOwningRelations(ctx: RelationContext, plan: ModelPlan): Map<IrRelation, KeyRelation>;
|
|
40
|
+
/** Adds the inverse side (`mappedBy`) of every relation that names one. */
|
|
41
|
+
export declare function addInverseRelations(ctx: RelationContext): void;
|