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.
- package/README.md +1 -0
- package/dist/cliRunner.js +3 -3
- package/dist/cliRunner.js.map +1 -1
- package/dist/config.d.ts +2 -2
- 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 +3 -2
- package/dist/formats.js +34 -0
- 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/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,134 @@
|
|
|
1
|
+
import { formatAnnotation, annotation } from './jpaFormat.js';
|
|
2
|
+
import { classNameOf, javaString, repairedIdentifier, RESERVED_TYPE_NAMES, uniqueName, } from './jpaNames.js';
|
|
3
|
+
import { Imports } from './jpaTypes.js';
|
|
4
|
+
/** Plans and writes the Java enums of the IR enums, and the converters of those whose stored values differ. */
|
|
5
|
+
/** True when a column stores numbers (an enum in it is an ordinal or a converted integer). */
|
|
6
|
+
function isNumericColumn(field) {
|
|
7
|
+
return ((field.type === 'int' || field.type === 'bigInt') &&
|
|
8
|
+
field.arrayDepth === undefined);
|
|
9
|
+
}
|
|
10
|
+
/** Plans every enum of the schema; `typeNames` holds the class names taken so far and receives the new ones. */
|
|
11
|
+
export function planEnums(schema, typeNames, warn) {
|
|
12
|
+
const columns = new Map();
|
|
13
|
+
for (const model of schema.models) {
|
|
14
|
+
for (const field of model.fields) {
|
|
15
|
+
if (field.enumName !== undefined) {
|
|
16
|
+
columns.set(field.enumName, [
|
|
17
|
+
...(columns.get(field.enumName) ?? []),
|
|
18
|
+
field,
|
|
19
|
+
]);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const plans = new Map();
|
|
24
|
+
for (const enumeration of schema.enums) {
|
|
25
|
+
const raw = classNameOf(enumeration.name);
|
|
26
|
+
const typeName = uniqueName(RESERVED_TYPE_NAMES.has(raw) ? `${raw}Enum` : raw, typeNames);
|
|
27
|
+
if (typeName !== raw) {
|
|
28
|
+
warn(`enum ${enumeration.name}: "${raw}" is a name the generated code uses or another type has, so the enum was named "${typeName}".`);
|
|
29
|
+
}
|
|
30
|
+
const used = new Set();
|
|
31
|
+
const members = new Map();
|
|
32
|
+
for (const value of enumeration.values) {
|
|
33
|
+
const name = uniqueName(repairedIdentifier(value.name), used);
|
|
34
|
+
if (name !== value.name) {
|
|
35
|
+
warn(`enum ${enumeration.name}: the member "${value.name}" was written as "${name}".`);
|
|
36
|
+
}
|
|
37
|
+
members.set(value.name, name);
|
|
38
|
+
}
|
|
39
|
+
const users = columns.get(enumeration.name) ?? [];
|
|
40
|
+
const numeric = users.length > 0 &&
|
|
41
|
+
users.every(isNumericColumn) &&
|
|
42
|
+
enumeration.values.every((value) => /^-?\d+$/.test(value.dbValue));
|
|
43
|
+
const namesMatch = enumeration.values.every((value) => members.get(value.name) === value.dbValue);
|
|
44
|
+
const isOrdinal = numeric &&
|
|
45
|
+
enumeration.values.every((value, index) => value.dbValue === String(index));
|
|
46
|
+
let storage = 'converter';
|
|
47
|
+
if (users.length === 0 || (!numeric && namesMatch)) {
|
|
48
|
+
storage = 'names';
|
|
49
|
+
}
|
|
50
|
+
else if (isOrdinal) {
|
|
51
|
+
storage = 'ordinal';
|
|
52
|
+
}
|
|
53
|
+
plans.set(enumeration.name, {
|
|
54
|
+
enumeration,
|
|
55
|
+
typeName,
|
|
56
|
+
members,
|
|
57
|
+
storage,
|
|
58
|
+
numeric,
|
|
59
|
+
converterName: storage === 'converter'
|
|
60
|
+
? uniqueName(`${typeName}Converter`, typeNames)
|
|
61
|
+
: '',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return plans;
|
|
65
|
+
}
|
|
66
|
+
function constantLines(plan) {
|
|
67
|
+
const values = plan.enumeration.values;
|
|
68
|
+
if (plan.storage !== 'converter') {
|
|
69
|
+
return values.map((value, index) => ` ${plan.members.get(value.name) ?? value.name}${index === values.length - 1 ? '' : ','}`);
|
|
70
|
+
}
|
|
71
|
+
return values.map((value, index) => {
|
|
72
|
+
const stored = plan.numeric
|
|
73
|
+
? value.dbValue
|
|
74
|
+
: javaString(value.dbValue);
|
|
75
|
+
return ` ${plan.members.get(value.name) ?? value.name}(${stored})${index === values.length - 1 ? ';' : ','}`;
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/** The text of a Java enum file (without the header and package, which the caller writes). */
|
|
79
|
+
export function renderEnumBody(plan) {
|
|
80
|
+
const lines = [`public enum ${plan.typeName} {`];
|
|
81
|
+
if (plan.storage !== 'converter') {
|
|
82
|
+
lines.push(...constantLines(plan));
|
|
83
|
+
if (plan.enumeration.values.length > 0) {
|
|
84
|
+
lines.push('}');
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
lines.splice(1, 0, ' ;');
|
|
88
|
+
lines.push('}');
|
|
89
|
+
}
|
|
90
|
+
return lines;
|
|
91
|
+
}
|
|
92
|
+
const type = plan.numeric ? 'int' : 'String';
|
|
93
|
+
lines.push(...constantLines(plan));
|
|
94
|
+
if (plan.enumeration.values.length === 0) {
|
|
95
|
+
lines.push(' ;');
|
|
96
|
+
}
|
|
97
|
+
lines.push('', ` private final ${type} value;`, '', ` ${plan.typeName}(${type} value) {`, ' this.value = value;', ' }', '', ` public ${type} getValue() {`, ' return value;', ' }', '}');
|
|
98
|
+
return lines;
|
|
99
|
+
}
|
|
100
|
+
/** The body of the converter file of an enum whose stored values differ from the constant names. */
|
|
101
|
+
export function renderConverterBody(plan, style) {
|
|
102
|
+
const imports = new Imports(style);
|
|
103
|
+
const converter = imports.persistence('Converter');
|
|
104
|
+
const base = imports.persistence('AttributeConverter');
|
|
105
|
+
const stored = plan.numeric ? 'Integer' : 'String';
|
|
106
|
+
const type = plan.typeName;
|
|
107
|
+
const compare = plan.numeric
|
|
108
|
+
? 'item.getValue() == dbData'
|
|
109
|
+
: 'item.getValue().equals(dbData)';
|
|
110
|
+
const lines = [
|
|
111
|
+
...formatAnnotation(annotation(converter), 0),
|
|
112
|
+
`public class ${plan.converterName} implements ${base}<${type}, ${stored}> {`,
|
|
113
|
+
' @Override',
|
|
114
|
+
` public ${stored} convertToDatabaseColumn(${type} attribute) {`,
|
|
115
|
+
' return attribute == null ? null : attribute.getValue();',
|
|
116
|
+
' }',
|
|
117
|
+
'',
|
|
118
|
+
' @Override',
|
|
119
|
+
` public ${type} convertToEntityAttribute(${stored} dbData) {`,
|
|
120
|
+
' if (dbData == null) {',
|
|
121
|
+
' return null;',
|
|
122
|
+
' }',
|
|
123
|
+
` for (${type} item : ${type}.values()) {`,
|
|
124
|
+
` if (${compare}) {`,
|
|
125
|
+
' return item;',
|
|
126
|
+
' }',
|
|
127
|
+
' }',
|
|
128
|
+
` throw new IllegalArgumentException("Unknown ${type} value: " + dbData);`,
|
|
129
|
+
' }',
|
|
130
|
+
'}',
|
|
131
|
+
];
|
|
132
|
+
return { imports, lines };
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=jpaEnums.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jpaEnums.js","sourceRoot":"","sources":["../../src/emitters/jpaEnums.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small model of Java annotations and a printer that lays them out the way google-java-format does: on one line
|
|
3
|
+
* when they fit, otherwise one argument per line (indented by 4), with arrays of nested annotations one item per
|
|
4
|
+
* line (indented by 2 inside the braces).
|
|
5
|
+
*/
|
|
6
|
+
export type AnnotationValue = string | AnnotationNode | AnnotationValue[];
|
|
7
|
+
export interface AnnotationNode {
|
|
8
|
+
/** The simple name, without the `@`. */
|
|
9
|
+
name: string;
|
|
10
|
+
/** Arguments as `[name, value]`; a name of `undefined` is the single `value` argument (`@Id`, `@Lob`). */
|
|
11
|
+
args: [string | undefined, AnnotationValue][];
|
|
12
|
+
}
|
|
13
|
+
/** Builds an annotation node. */
|
|
14
|
+
export declare function annotation(name: string, args?: [string | undefined, AnnotationValue][]): AnnotationNode;
|
|
15
|
+
/** The lines of one annotation placed at `indent` spaces. */
|
|
16
|
+
export declare function formatAnnotation(node: AnnotationNode, indent: number): string[];
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small model of Java annotations and a printer that lays them out the way google-java-format does: on one line
|
|
3
|
+
* when they fit, otherwise one argument per line (indented by 4), with arrays of nested annotations one item per
|
|
4
|
+
* line (indented by 2 inside the braces).
|
|
5
|
+
*/
|
|
6
|
+
const LINE_LIMIT = 100;
|
|
7
|
+
/** Builds an annotation node. */
|
|
8
|
+
export function annotation(name, args = []) {
|
|
9
|
+
return { name, args };
|
|
10
|
+
}
|
|
11
|
+
function isNode(value) {
|
|
12
|
+
return typeof value === 'object' && !Array.isArray(value);
|
|
13
|
+
}
|
|
14
|
+
function inline(value) {
|
|
15
|
+
if (typeof value === 'string') {
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
if (Array.isArray(value)) {
|
|
19
|
+
const items = value.map(inline);
|
|
20
|
+
return items.length === 1 ? (items[0] ?? '') : `{${items.join(', ')}}`;
|
|
21
|
+
}
|
|
22
|
+
if (value.args.length === 0) {
|
|
23
|
+
return `@${value.name}`;
|
|
24
|
+
}
|
|
25
|
+
const args = value.args.map(([key, item]) => key === undefined ? inline(item) : `${key} = ${inline(item)}`);
|
|
26
|
+
return `@${value.name}(${args.join(', ')})`;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Lays out `lead + value + tail` starting at `indent` spaces: `lead` is what precedes the value on its first line
|
|
30
|
+
* (`indexes = `) and `tail` what follows it on its last (`,` or `)`).
|
|
31
|
+
*/
|
|
32
|
+
function layout(value, indent, lead, tail) {
|
|
33
|
+
const pad = ' '.repeat(indent);
|
|
34
|
+
const single = `${pad}${lead}${inline(value)}${tail}`;
|
|
35
|
+
const forceBreak = Array.isArray(value) && value.length > 1 && value.some(isNode);
|
|
36
|
+
if (typeof value === 'string' ||
|
|
37
|
+
(single.length <= LINE_LIMIT && !forceBreak)) {
|
|
38
|
+
return [single];
|
|
39
|
+
}
|
|
40
|
+
if (Array.isArray(value)) {
|
|
41
|
+
if (value.length === 1 && value[0] !== undefined) {
|
|
42
|
+
return layout(value[0], indent, lead, tail);
|
|
43
|
+
}
|
|
44
|
+
const lines = [`${pad}${lead}{`];
|
|
45
|
+
value.forEach((item, position) => {
|
|
46
|
+
lines.push(...layout(item, indent + 2, '', position === value.length - 1 ? '' : ','));
|
|
47
|
+
});
|
|
48
|
+
lines.push(`${pad}}${tail}`);
|
|
49
|
+
return lines;
|
|
50
|
+
}
|
|
51
|
+
const only = value.args.length === 1 ? value.args[0] : undefined;
|
|
52
|
+
if (only?.[0] === undefined && Array.isArray(only?.[1])) {
|
|
53
|
+
// A lone array argument hugs the parentheses: @JoinColumns({ ... })
|
|
54
|
+
const items = only?.[1] ?? [];
|
|
55
|
+
const lines = [`${pad}${lead}@${value.name}({`];
|
|
56
|
+
items.forEach((item, position) => {
|
|
57
|
+
lines.push(...layout(item, indent + 2, '', position === items.length - 1 ? '' : ','));
|
|
58
|
+
});
|
|
59
|
+
lines.push(`${pad}})${tail}`);
|
|
60
|
+
return lines;
|
|
61
|
+
}
|
|
62
|
+
const lines = [`${pad}${lead}@${value.name}(`];
|
|
63
|
+
value.args.forEach(([key, item], position) => {
|
|
64
|
+
const last = position === value.args.length - 1;
|
|
65
|
+
lines.push(...layout(item, indent + 4, key === undefined ? '' : `${key} = `, last ? `)${tail}` : ','));
|
|
66
|
+
});
|
|
67
|
+
return lines;
|
|
68
|
+
}
|
|
69
|
+
/** The lines of one annotation placed at `indent` spaces. */
|
|
70
|
+
export function formatAnnotation(node, indent) {
|
|
71
|
+
return layout(node, indent, '', '');
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=jpaFormat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jpaFormat.js","sourceRoot":"","sources":["../../src/emitters/jpaFormat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,MAAM,UAAU,GAAW,GAAG,CAAC;AAE/B,iCAAiC;AACjC,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,OAAgD,EAAE;IAElD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,MAAM,CAAC,KAAsB;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,MAAM,CAAC,KAAsB;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAa,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACzE,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,GAAa,KAAK,CAAC,IAAI,CAAC,GAAG,CACnC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAwC,EAAE,EAAE,CACrD,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAChE,CAAC;IACF,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,SAAS,MAAM,CACb,KAAsB,EACtB,MAAc,EACd,IAAY,EACZ,IAAY;IAEZ,MAAM,GAAG,GAAW,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAW,GAAG,GAAG,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC;IAC9D,MAAM,UAAU,GACd,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjE,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,MAAM,CAAC,MAAM,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,EAC5C,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YACjD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,KAAK,GAAa,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC,IAAqB,EAAE,QAAgB,EAAE,EAAE;YACxD,KAAK,CAAC,IAAI,CACR,GAAG,MAAM,CACP,IAAI,EACJ,MAAM,GAAG,CAAC,EACV,EAAE,EACF,QAAQ,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CACzC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GACR,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtD,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,oEAAoE;QACpE,MAAM,KAAK,GAAsB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,KAAK,GAAa,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC,IAAqB,EAAE,QAAgB,EAAE,EAAE;YACxD,KAAK,CAAC,IAAI,CACR,GAAG,MAAM,CACP,IAAI,EACJ,MAAM,GAAG,CAAC,EACV,EAAE,EACF,QAAQ,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CACzC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAa,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,OAAO,CAChB,CAAC,CAAC,GAAG,EAAE,IAAI,CAAwC,EAAE,QAAgB,EAAE,EAAE;QACvE,MAAM,IAAI,GAAY,QAAQ,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CACR,GAAG,MAAM,CACP,IAAI,EACJ,MAAM,GAAG,CAAC,EACV,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,EACpC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CACxB,CACF,CAAC;IACJ,CAAC,CACF,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,gBAAgB,CAC9B,IAAoB,EACpB,MAAc;IAEd,OAAO,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { IrField, IrModel, IrRelation } from '../ir.js';
|
|
2
|
+
import { Imports, type IdPart, type JpaStyle } from './jpaTypes.js';
|
|
3
|
+
/** Finds the primary key of a model and writes the `@IdClass` class of a composite one. */
|
|
4
|
+
export type KeyPart = {
|
|
5
|
+
kind: 'field';
|
|
6
|
+
field: IrField;
|
|
7
|
+
} | {
|
|
8
|
+
kind: 'relation';
|
|
9
|
+
relation: IrRelation;
|
|
10
|
+
};
|
|
11
|
+
export interface KeyInfo {
|
|
12
|
+
/** The columns of the primary key, in key order. */
|
|
13
|
+
parts: KeyPart[];
|
|
14
|
+
/** True when the model has no key and one column was chosen to be the identifier. */
|
|
15
|
+
synthesized: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** The column to use as the identifier of a model that has no key: the first required column of a sensible type. */
|
|
18
|
+
export declare function identifierCandidate(model: IrModel): IrField | undefined;
|
|
19
|
+
/** The primary key of a model; `warn` is told about names it cannot resolve and about a missing key. */
|
|
20
|
+
export declare function keyOf(model: IrModel, warn: (message: string) => void): KeyInfo;
|
|
21
|
+
/** The text of an `@IdClass` file body: fields, constructors, `equals` and `hashCode`. */
|
|
22
|
+
export declare function renderIdClass(name: string, parts: readonly IdPart[], style: JpaStyle): {
|
|
23
|
+
imports: Imports;
|
|
24
|
+
lines: string[];
|
|
25
|
+
};
|
|
@@ -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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"}
|