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,187 @@
1
+ import { parseTypeText, readAnnotation, } from './javaSyntax.js';
2
+ // ---------------------------------------------------------------------------
3
+ // Literals and expressions
4
+ // ---------------------------------------------------------------------------
5
+ function unescapeJava(body) {
6
+ return body.replace(/\\(?:u+([0-9a-fA-F]{4})|([0-7]{1,3})|([\s\S]))/g, (_whole, unicode, octal, single) => {
7
+ if (unicode !== undefined) {
8
+ return String.fromCharCode(parseInt(unicode, 16));
9
+ }
10
+ if (octal !== undefined) {
11
+ return String.fromCharCode(parseInt(octal, 8));
12
+ }
13
+ switch (single) {
14
+ case 'n':
15
+ return '\n';
16
+ case 't':
17
+ return '\t';
18
+ case 'r':
19
+ return '\r';
20
+ case 'b':
21
+ return '\b';
22
+ case 'f':
23
+ return '\f';
24
+ case 's':
25
+ return ' ';
26
+ default:
27
+ return single ?? '';
28
+ }
29
+ });
30
+ }
31
+ /** Decodes the text of a regular string literal or text block. */
32
+ export function unquoteJavaString(literal) {
33
+ if (literal.startsWith('"""')) {
34
+ return unescapeJava(literal
35
+ .replace(/^"""[ \t]*\r?\n?/, '')
36
+ .replace(/[ \t]*"""$/, '')
37
+ .replace(/^[ \t]+/gm, ''));
38
+ }
39
+ if (literal.startsWith('"') && literal.endsWith('"') && literal.length >= 2) {
40
+ return unescapeJava(literal.slice(1, -1));
41
+ }
42
+ return literal;
43
+ }
44
+ function parseNumber(text) {
45
+ const cleaned = text.replace(/_/g, '');
46
+ if (/^0[xX][0-9a-fA-F]+[lL]?$/.test(cleaned)) {
47
+ return parseInt(cleaned.replace(/[lL]$/, ''), 16);
48
+ }
49
+ if (/^0[bB][01]+[lL]?$/.test(cleaned)) {
50
+ return parseInt(cleaned.slice(2).replace(/[lL]$/, ''), 2);
51
+ }
52
+ const plain = cleaned.replace(/[lLfFdD]$/, '');
53
+ const value = Number(plain);
54
+ return Number.isNaN(value) ? undefined : value;
55
+ }
56
+ const MAX_EVAL_DEPTH = 12;
57
+ /** The dotted path of a name or field access (`GenerationType.IDENTITY`), or undefined for other expressions. */
58
+ function memberPath(node) {
59
+ if (node.type === 'identifier' || node.type === 'type_identifier') {
60
+ return [node.text];
61
+ }
62
+ if (node.type === 'field_access' || node.type === 'scoped_identifier') {
63
+ const owner = node.childForFieldName('object') ?? node.childForFieldName('scope');
64
+ const name = node.childForFieldName('field') ?? node.childForFieldName('name');
65
+ if (owner === null || name === null) {
66
+ return undefined;
67
+ }
68
+ const prefix = memberPath(owner);
69
+ return prefix === undefined ? undefined : [...prefix, name.text];
70
+ }
71
+ return undefined;
72
+ }
73
+ /** Evaluates an annotation argument or field initializer without running any code. */
74
+ export function evaluate(node, lookup, depth = 0) {
75
+ if (depth > MAX_EVAL_DEPTH) {
76
+ return { kind: 'other', text: node.text };
77
+ }
78
+ switch (node.type) {
79
+ case 'string_literal':
80
+ return { kind: 'string', value: unquoteJavaString(node.text) };
81
+ case 'character_literal':
82
+ return { kind: 'string', value: unescapeJava(node.text.slice(1, -1)) };
83
+ case 'decimal_integer_literal':
84
+ case 'hex_integer_literal':
85
+ case 'octal_integer_literal':
86
+ case 'binary_integer_literal':
87
+ case 'decimal_floating_point_literal':
88
+ case 'hex_floating_point_literal': {
89
+ const value = parseNumber(node.text);
90
+ return value === undefined
91
+ ? { kind: 'other', text: node.text }
92
+ : { kind: 'number', value, text: node.text };
93
+ }
94
+ case 'true':
95
+ return { kind: 'bool', value: true };
96
+ case 'false':
97
+ return { kind: 'bool', value: false };
98
+ case 'null_literal':
99
+ return { kind: 'null' };
100
+ case 'parenthesized_expression': {
101
+ const inner = node.namedChild(0);
102
+ return inner === null
103
+ ? { kind: 'other', text: node.text }
104
+ : evaluate(inner, lookup, depth + 1);
105
+ }
106
+ case 'unary_expression': {
107
+ const operand = node.childForFieldName('operand');
108
+ const value = operand === null ? undefined : evaluate(operand, lookup, depth + 1);
109
+ if (value?.kind === 'number' && node.text.startsWith('-')) {
110
+ return { kind: 'number', value: -value.value, text: node.text };
111
+ }
112
+ return { kind: 'other', text: node.text };
113
+ }
114
+ case 'binary_expression': {
115
+ const left = node.childForFieldName('left');
116
+ const right = node.childForFieldName('right');
117
+ if (left === null || right === null) {
118
+ return { kind: 'other', text: node.text };
119
+ }
120
+ const first = evaluate(left, lookup, depth + 1);
121
+ const second = evaluate(right, lookup, depth + 1);
122
+ const operator = node.text.slice(left.endIndex - node.startIndex, right.startIndex - node.startIndex);
123
+ if (operator.trim() === '+') {
124
+ if (first.kind === 'number' && second.kind === 'number') {
125
+ return {
126
+ kind: 'number',
127
+ value: first.value + second.value,
128
+ text: node.text,
129
+ };
130
+ }
131
+ const a = scalarText(first);
132
+ const b = scalarText(second);
133
+ if (a !== undefined && b !== undefined) {
134
+ return { kind: 'string', value: a + b };
135
+ }
136
+ }
137
+ return { kind: 'other', text: node.text };
138
+ }
139
+ case 'element_value_array_initializer':
140
+ case 'array_initializer':
141
+ return {
142
+ kind: 'array',
143
+ items: node.namedChildren
144
+ .filter((child) => !child.type.includes('comment'))
145
+ .map((child) => evaluate(child, lookup, depth + 1)),
146
+ };
147
+ case 'annotation':
148
+ case 'marker_annotation': {
149
+ const annotation = readAnnotation(node);
150
+ return { kind: 'annotation', annotation };
151
+ }
152
+ case 'class_literal': {
153
+ const target = node.namedChild(0);
154
+ return {
155
+ kind: 'class',
156
+ type: target === null ? node.text : parseTypeText(target.text).name,
157
+ };
158
+ }
159
+ case 'identifier':
160
+ case 'field_access': {
161
+ const path = memberPath(node);
162
+ if (path === undefined) {
163
+ return { kind: 'other', text: node.text };
164
+ }
165
+ const constant = lookup(path);
166
+ if (constant !== undefined) {
167
+ return evaluate(constant, lookup, depth + 1);
168
+ }
169
+ return { kind: 'member', path };
170
+ }
171
+ default:
172
+ return { kind: 'other', text: node.text };
173
+ }
174
+ }
175
+ function scalarText(value) {
176
+ switch (value.kind) {
177
+ case 'string':
178
+ return value.value;
179
+ case 'number':
180
+ return String(value.value);
181
+ case 'bool':
182
+ return String(value.value);
183
+ default:
184
+ return undefined;
185
+ }
186
+ }
187
+ //# sourceMappingURL=javaValues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javaValues.js","sourceRoot":"","sources":["../../src/parsers/javaValues.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { IrSchema } from '../ir.js';
2
+ import { type Result } from '../result.js';
3
+ export interface JpaSourceFile {
4
+ path: string;
5
+ text: string;
6
+ }
7
+ export interface JpaParseOptions {
8
+ /** App label stored on each model (JPA has no equivalent). */
9
+ appLabel: string;
10
+ }
11
+ /** True for build output, tests, generated metamodel classes, `module-info.java`, `package-info.java` and migrations. */
12
+ export declare function isSkippedJpaPath(path: string): boolean;
13
+ /**
14
+ * Parses Hibernate / JPA entities (Java) into the shared IR using tree-sitter. The source is only read: nothing is
15
+ * compiled or run, and `persistence.xml` and `orm.xml` are not read.
16
+ */
17
+ export declare function parseJpa(sources: JpaSourceFile[], options: JpaParseOptions): Promise<Result<IrSchema>>;
@@ -0,0 +1,131 @@
1
+ import { describeThrown, err, ok } from '../result.js';
2
+ import { getJavaParser, readJavaFile, } from './javaSyntax.js';
3
+ import { Annotated } from './jpaAnnotations.js';
4
+ import { buildSchema } from './jpaBuild.js';
5
+ import { discoverEntities } from './jpaEntities.js';
6
+ /**
7
+ * Paths of files that are not the model: build output, test sources, generated metamodels, module descriptors and
8
+ * database migrations.
9
+ */
10
+ const SKIPPED_PATH = /(?:^|[\\/])(?:target|build|out|\.gradle|node_modules|\.git)[\\/]|(?:^|[\\/])src[\\/]test[\\/]|(?:^|[\\/])db[\\/]migrations?[\\/]|(?:Tests?|_)\.java$|(?:^|[\\/])(?:module|package)-info\.java$/;
11
+ /** True for build output, tests, generated metamodel classes, `module-info.java`, `package-info.java` and migrations. */
12
+ export function isSkippedJpaPath(path) {
13
+ return SKIPPED_PATH.test(path);
14
+ }
15
+ /**
16
+ * Parses Hibernate / JPA entities (Java) into the shared IR using tree-sitter. The source is only read: nothing is
17
+ * compiled or run, and `persistence.xml` and `orm.xml` are not read.
18
+ */
19
+ export async function parseJpa(sources, options) {
20
+ const parserResult = await getJavaParser();
21
+ if (!parserResult.ok) {
22
+ return parserResult;
23
+ }
24
+ const trees = [];
25
+ try {
26
+ return readJpa(parserResult.value, sources, options, trees);
27
+ }
28
+ catch (thrown) {
29
+ return err('PARSE_FAILED', `Failed to read Hibernate / JPA entities from ${sources.map((source) => source.path).join(', ')}. ` +
30
+ `Underlying error: ${describeThrown(thrown)}`);
31
+ }
32
+ finally {
33
+ for (const tree of trees) {
34
+ tree.delete();
35
+ }
36
+ }
37
+ }
38
+ function readJpa(parser, sources, options, trees) {
39
+ const warnings = [];
40
+ const classes = new Map();
41
+ const enums = new Map();
42
+ const files = [];
43
+ for (const source of sources) {
44
+ if (isSkippedJpaPath(source.path)) {
45
+ warnings.push(`${source.path}: skipped (build output, tests, generated metamodels, module descriptors and migrations are not the model).`);
46
+ continue;
47
+ }
48
+ const tree = parser.parse(source.text);
49
+ trees.push(tree);
50
+ const file = readJavaFile(tree.rootNode, source.path);
51
+ files.push(file);
52
+ if (file.hasErrors) {
53
+ warnings.push(`${source.path}: the file contains Java syntax errors; some classes or fields may be missing from the output.`);
54
+ }
55
+ for (const cls of file.classes) {
56
+ const target = cls.kind === 'enum' ? enums : classes;
57
+ const existing = target.get(cls.name);
58
+ if (existing === undefined) {
59
+ target.set(cls.name, cls);
60
+ }
61
+ else if (existing.path !== cls.path || existing.outer !== cls.outer) {
62
+ warnings.push(`Duplicate type name "${cls.name}" (${cls.path}); only the first definition (${existing.path}) was read.`);
63
+ }
64
+ }
65
+ }
66
+ const lookup = (path) => {
67
+ const name = path[path.length - 1];
68
+ if (name === undefined) {
69
+ return undefined;
70
+ }
71
+ const owner = path[path.length - 2];
72
+ const candidates = owner === undefined
73
+ ? [...classes.values(), ...enums.values()]
74
+ : [classes.get(owner), enums.get(owner)].flatMap((item) => item === undefined ? [] : [item]);
75
+ for (const cls of candidates) {
76
+ const field = cls.fields.find((item) => item.name === name &&
77
+ item.modifiers.includes('static') &&
78
+ item.modifiers.includes('final'));
79
+ if (field?.initializer !== undefined) {
80
+ return field.initializer;
81
+ }
82
+ }
83
+ return undefined;
84
+ };
85
+ const project = {
86
+ classes,
87
+ enums,
88
+ converters: new Map(),
89
+ lookup,
90
+ warnings,
91
+ appLabel: options.appLabel,
92
+ };
93
+ findConverters(project);
94
+ const warn = (message) => {
95
+ warnings.push(message);
96
+ };
97
+ const entities = discoverEntities(project, warn).filter((entity) => {
98
+ if (entity.notes.has('Subselect', true)) {
99
+ warn(`${entity.name}: @Subselect maps a SQL query, not a table; the entity was skipped.`);
100
+ return false;
101
+ }
102
+ return true;
103
+ });
104
+ if (entities.length === 0) {
105
+ return err('NO_MODELS_FOUND', `No JPA entities were found in: ${sources.map((source) => source.path).join(', ')}. ` +
106
+ `An entity is a class annotated with @Entity (jakarta.persistence or javax.persistence). ` +
107
+ `Mapping in orm.xml or persistence.xml is not read.`);
108
+ }
109
+ return ok(buildSchema(project, entities));
110
+ }
111
+ /** Finds `AttributeConverter<X, Y>` classes so `@Convert` can say which column type they produce. */
112
+ function findConverters(project) {
113
+ for (const cls of project.classes.values()) {
114
+ const base = cls.interfaces.find((item) => item.name === 'AttributeConverter');
115
+ const attributeType = base?.args[0];
116
+ const columnType = base?.args[1];
117
+ if (attributeType === undefined || columnType === undefined) {
118
+ continue;
119
+ }
120
+ const info = {
121
+ name: cls.name,
122
+ attributeType,
123
+ columnType,
124
+ autoApply: new Annotated(cls.annotations, project.lookup, cls.imports)
125
+ .get('Converter')
126
+ ?.boolean('autoApply') === true,
127
+ };
128
+ project.converters.set(cls.name, info);
129
+ }
130
+ }
131
+ //# sourceMappingURL=jpa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jpa.js","sourceRoot":"","sources":["../../src/parsers/jpa.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { ConstLookup, JavaAnnotation, JavaValue } from './javaSyntax.js';
2
+ /** Reads the arguments of one annotation as typed values, evaluating constants on demand. */
3
+ export declare class Ann {
4
+ readonly raw: JavaAnnotation;
5
+ private readonly lookup;
6
+ constructor(raw: JavaAnnotation, lookup: ConstLookup);
7
+ get name(): string;
8
+ has(key: string): boolean;
9
+ value(key: string): JavaValue | undefined;
10
+ /** The text of a string argument, or undefined when it is absent or not a constant string. */
11
+ string(key: string): string | undefined;
12
+ boolean(key: string): boolean | undefined;
13
+ number(key: string): number | undefined;
14
+ /** The last segment of an enum constant argument: `GenerationType.IDENTITY` is `IDENTITY`. */
15
+ member(key: string): string | undefined;
16
+ /** The enum constants of an array (or single) argument, by last segment. */
17
+ members(key: string): string[];
18
+ strings(key: string): string[];
19
+ /** The class named by `Foo.class`. */
20
+ className(key: string): string | undefined;
21
+ classNames(key: string): string[];
22
+ /** Nested annotations of an array (or single) argument, such as `uniqueConstraints`. */
23
+ annotations(key: string): Ann[];
24
+ /** The first nested annotation of an argument (`foreignKey = @ForeignKey(...)`). */
25
+ annotation(key: string): Ann | undefined;
26
+ private items;
27
+ }
28
+ /** The annotations of one class, field or method, looked up by simple name. */
29
+ export declare class Annotated {
30
+ private readonly list;
31
+ private readonly lookup;
32
+ private readonly imports;
33
+ constructor(list: readonly JavaAnnotation[], lookup: ConstLookup, imports?: readonly string[]);
34
+ private matches;
35
+ /** True when a clashing name is the Hibernate annotation, judging by its qualifier and the imports. */
36
+ private isHibernate;
37
+ /** The first annotation with this simple name. `hibernate` selects the Hibernate one of a clashing name. */
38
+ get(name: string, hibernate?: boolean): Ann | undefined;
39
+ has(name: string, hibernate?: boolean): boolean;
40
+ /**
41
+ * Every use of a repeatable annotation: written several times, or inside its container
42
+ * (`@JoinColumns({@JoinColumn(...)})`).
43
+ */
44
+ repeated(name: string, container: string): Ann[];
45
+ names(): string[];
46
+ }
@@ -0,0 +1,156 @@
1
+ import { evaluate } from './javaValues.js';
2
+ /**
3
+ * Annotation names that exist both in JPA and in Hibernate (`org.hibernate.annotations.Table`, `Check`, ...). A
4
+ * lookup for the JPA one skips an annotation that is written, or imported, from the Hibernate package.
5
+ */
6
+ const CLASHING_NAMES = new Set([
7
+ 'Table',
8
+ 'Index',
9
+ 'Check',
10
+ 'ForeignKey',
11
+ 'Type',
12
+ 'Filter',
13
+ 'Cache',
14
+ 'Cascade',
15
+ ]);
16
+ /** The clashing names that only Hibernate has. */
17
+ const HIBERNATE_ONLY = new Set([
18
+ 'Check',
19
+ 'Type',
20
+ 'Filter',
21
+ 'Cache',
22
+ 'Cascade',
23
+ ]);
24
+ /** The full name of an annotation written as a simple name, from the imports of its file. */
25
+ function resolveName(annotation, imports) {
26
+ if (annotation.qualifier !== undefined) {
27
+ return `${annotation.qualifier}.${annotation.name}`;
28
+ }
29
+ const exact = imports.find((item) => item.endsWith(`.${annotation.name}`));
30
+ return exact;
31
+ }
32
+ /** Reads the arguments of one annotation as typed values, evaluating constants on demand. */
33
+ export class Ann {
34
+ raw;
35
+ lookup;
36
+ constructor(raw, lookup) {
37
+ this.raw = raw;
38
+ this.lookup = lookup;
39
+ }
40
+ get name() {
41
+ return this.raw.name;
42
+ }
43
+ has(key) {
44
+ return this.raw.args.has(key);
45
+ }
46
+ value(key) {
47
+ const node = this.raw.args.get(key);
48
+ return node === undefined ? undefined : evaluate(node, this.lookup);
49
+ }
50
+ /** The text of a string argument, or undefined when it is absent or not a constant string. */
51
+ string(key) {
52
+ const value = this.value(key);
53
+ return value?.kind === 'string' ? value.value : undefined;
54
+ }
55
+ boolean(key) {
56
+ const value = this.value(key);
57
+ return value?.kind === 'bool' ? value.value : undefined;
58
+ }
59
+ number(key) {
60
+ const value = this.value(key);
61
+ return value?.kind === 'number' ? value.value : undefined;
62
+ }
63
+ /** The last segment of an enum constant argument: `GenerationType.IDENTITY` is `IDENTITY`. */
64
+ member(key) {
65
+ const value = this.value(key);
66
+ return value?.kind === 'member'
67
+ ? value.path[value.path.length - 1]
68
+ : undefined;
69
+ }
70
+ /** The enum constants of an array (or single) argument, by last segment. */
71
+ members(key) {
72
+ return this.items(key).flatMap((item) => item.kind === 'member' ? [item.path[item.path.length - 1] ?? ''] : []);
73
+ }
74
+ strings(key) {
75
+ return this.items(key).flatMap((item) => item.kind === 'string' ? [item.value] : []);
76
+ }
77
+ /** The class named by `Foo.class`. */
78
+ className(key) {
79
+ const value = this.value(key);
80
+ return value?.kind === 'class' ? value.type : undefined;
81
+ }
82
+ classNames(key) {
83
+ return this.items(key).flatMap((item) => item.kind === 'class' ? [item.type] : []);
84
+ }
85
+ /** Nested annotations of an array (or single) argument, such as `uniqueConstraints`. */
86
+ annotations(key) {
87
+ return this.items(key).flatMap((item) => item.kind === 'annotation' ? [new Ann(item.annotation, this.lookup)] : []);
88
+ }
89
+ /** The first nested annotation of an argument (`foreignKey = @ForeignKey(...)`). */
90
+ annotation(key) {
91
+ return this.annotations(key)[0];
92
+ }
93
+ items(key) {
94
+ const value = this.value(key);
95
+ if (value === undefined) {
96
+ return [];
97
+ }
98
+ return value.kind === 'array' ? value.items : [value];
99
+ }
100
+ }
101
+ /** The annotations of one class, field or method, looked up by simple name. */
102
+ export class Annotated {
103
+ list;
104
+ lookup;
105
+ imports;
106
+ constructor(list, lookup, imports = []) {
107
+ this.list = list;
108
+ this.lookup = lookup;
109
+ this.imports = imports;
110
+ }
111
+ matches(annotation, hibernate) {
112
+ if (!CLASHING_NAMES.has(annotation.name)) {
113
+ return true;
114
+ }
115
+ return this.isHibernate(annotation) === hibernate;
116
+ }
117
+ /** True when a clashing name is the Hibernate annotation, judging by its qualifier and the imports. */
118
+ isHibernate(annotation) {
119
+ const full = resolveName(annotation, this.imports);
120
+ if (full !== undefined) {
121
+ return full.startsWith('org.hibernate.');
122
+ }
123
+ if (HIBERNATE_ONLY.has(annotation.name)) {
124
+ return true;
125
+ }
126
+ // Only a wildcard import tells the two apart: `import org.hibernate.annotations.*;` without the JPA package.
127
+ const fromHibernate = this.imports.includes('org.hibernate.annotations.*');
128
+ const fromJpa = this.imports.some((item) => /^(?:jakarta|javax)\.persistence\.\*$/.test(item));
129
+ return fromHibernate && !fromJpa;
130
+ }
131
+ /** The first annotation with this simple name. `hibernate` selects the Hibernate one of a clashing name. */
132
+ get(name, hibernate = false) {
133
+ const found = this.list.find((annotation) => annotation.name === name && this.matches(annotation, hibernate));
134
+ return found === undefined ? undefined : new Ann(found, this.lookup);
135
+ }
136
+ has(name, hibernate = false) {
137
+ return this.get(name, hibernate) !== undefined;
138
+ }
139
+ /**
140
+ * Every use of a repeatable annotation: written several times, or inside its container
141
+ * (`@JoinColumns({@JoinColumn(...)})`).
142
+ */
143
+ repeated(name, container) {
144
+ const direct = this.list
145
+ .filter((annotation) => annotation.name === name)
146
+ .map((annotation) => new Ann(annotation, this.lookup));
147
+ const nested = this.list
148
+ .filter((annotation) => annotation.name === container)
149
+ .flatMap((annotation) => new Ann(annotation, this.lookup).annotations('value'));
150
+ return [...direct, ...nested];
151
+ }
152
+ names() {
153
+ return this.list.map((annotation) => annotation.name);
154
+ }
155
+ }
156
+ //# sourceMappingURL=jpaAnnotations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jpaAnnotations.js","sourceRoot":"","sources":["../../src/parsers/jpaAnnotations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { IrSchema } from '../ir.js';
2
+ import type { EntityInfo, Project } from './jpaModel.js';
3
+ /** Assembles the IR from the entities of the input. */
4
+ export declare function buildSchema(project: Project, entities: readonly EntityInfo[]): IrSchema;