ormbridge 0.10.0 → 0.12.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 (87) hide show
  1. package/README.md +26 -19
  2. package/dist/cliRunner.js +2 -2
  3. package/dist/cliRunner.js.map +1 -1
  4. package/dist/convert.js +30 -1
  5. package/dist/convert.js.map +1 -1
  6. package/dist/emitters/cockroach.d.ts +33 -0
  7. package/dist/emitters/cockroach.js +81 -0
  8. package/dist/emitters/cockroach.js.map +1 -0
  9. package/dist/emitters/doctrine.js +11 -0
  10. package/dist/emitters/doctrine.js.map +1 -1
  11. package/dist/emitters/drizzle.js +39 -4
  12. package/dist/emitters/drizzle.js.map +1 -1
  13. package/dist/emitters/efcore.js +18 -1
  14. package/dist/emitters/efcore.js.map +1 -1
  15. package/dist/emitters/efcoreColumns.js +23 -2
  16. package/dist/emitters/efcoreColumns.js.map +1 -1
  17. package/dist/emitters/gorm.js +20 -1
  18. package/dist/emitters/gorm.js.map +1 -1
  19. package/dist/emitters/jpa.js +9 -0
  20. package/dist/emitters/jpa.js.map +1 -1
  21. package/dist/emitters/jpaColumns.d.ts +2 -0
  22. package/dist/emitters/jpaColumns.js +1 -0
  23. package/dist/emitters/jpaColumns.js.map +1 -1
  24. package/dist/emitters/jpaScalars.js +14 -1
  25. package/dist/emitters/jpaScalars.js.map +1 -1
  26. package/dist/emitters/laravel.js +11 -0
  27. package/dist/emitters/laravel.js.map +1 -1
  28. package/dist/emitters/neo4j.d.ts +28 -0
  29. package/dist/emitters/neo4j.js +211 -0
  30. package/dist/emitters/neo4j.js.map +1 -0
  31. package/dist/emitters/neo4jGraph.d.ts +57 -0
  32. package/dist/emitters/neo4jGraph.js +311 -0
  33. package/dist/emitters/neo4jGraph.js.map +1 -0
  34. package/dist/emitters/neo4jNames.d.ts +25 -0
  35. package/dist/emitters/neo4jNames.js +58 -0
  36. package/dist/emitters/neo4jNames.js.map +1 -0
  37. package/dist/emitters/neo4jRelationships.d.ts +15 -0
  38. package/dist/emitters/neo4jRelationships.js +240 -0
  39. package/dist/emitters/neo4jRelationships.js.map +1 -0
  40. package/dist/emitters/neo4jStatements.d.ts +41 -0
  41. package/dist/emitters/neo4jStatements.js +92 -0
  42. package/dist/emitters/neo4jStatements.js.map +1 -0
  43. package/dist/emitters/neo4jTypes.d.ts +31 -0
  44. package/dist/emitters/neo4jTypes.js +116 -0
  45. package/dist/emitters/neo4jTypes.js.map +1 -0
  46. package/dist/emitters/prisma.d.ts +1 -1
  47. package/dist/emitters/prisma.js +47 -5
  48. package/dist/emitters/prisma.js.map +1 -1
  49. package/dist/emitters/sequelize.js +82 -6
  50. package/dist/emitters/sequelize.js.map +1 -1
  51. package/dist/emitters/sqlClickhouse.d.ts +43 -0
  52. package/dist/emitters/sqlClickhouse.js +265 -0
  53. package/dist/emitters/sqlClickhouse.js.map +1 -0
  54. package/dist/emitters/sqlClickhouseIndexes.d.ts +3 -0
  55. package/dist/emitters/sqlClickhouseIndexes.js +98 -0
  56. package/dist/emitters/sqlClickhouseIndexes.js.map +1 -0
  57. package/dist/emitters/sqlClickhouseTypes.d.ts +39 -0
  58. package/dist/emitters/sqlClickhouseTypes.js +360 -0
  59. package/dist/emitters/sqlClickhouseTypes.js.map +1 -0
  60. package/dist/emitters/sqlDdl.d.ts +29 -1
  61. package/dist/emitters/sqlDdl.js +141 -21
  62. package/dist/emitters/sqlDdl.js.map +1 -1
  63. package/dist/emitters/sqlalchemy.d.ts +7 -1
  64. package/dist/emitters/sqlalchemy.js +39 -0
  65. package/dist/emitters/sqlalchemy.js.map +1 -1
  66. package/dist/emitters/typeorm.js +44 -9
  67. package/dist/emitters/typeorm.js.map +1 -1
  68. package/dist/formats.d.ts +2 -0
  69. package/dist/formats.js +26 -1
  70. package/dist/formats.js.map +1 -1
  71. package/dist/index.d.ts +2 -0
  72. package/dist/index.js +1 -0
  73. package/dist/index.js.map +1 -1
  74. package/dist/parsers/prisma.js +9 -1
  75. package/dist/parsers/prisma.js.map +1 -1
  76. package/dist/parsers/sqlDdl.js +40 -2
  77. package/dist/parsers/sqlDdl.js.map +1 -1
  78. package/dist/parsers/sqlSyntax.js +15 -1
  79. package/dist/parsers/sqlSyntax.js.map +1 -1
  80. package/dist/parsers/sqlTypes.js +37 -2
  81. package/dist/parsers/sqlTypes.js.map +1 -1
  82. package/dist/parsers/typeorm.js +2 -0
  83. package/dist/parsers/typeorm.js.map +1 -1
  84. package/dist/styles.d.ts +3 -2
  85. package/dist/styles.js +4 -1
  86. package/dist/styles.js.map +1 -1
  87. package/package.json +1 -1
@@ -0,0 +1,211 @@
1
+ import { buildGraph, primaryKeyNamesOf, } from './neo4jGraph.js';
2
+ import { oneLine, quoteIdentifier } from './neo4jNames.js';
3
+ import { writeRelationships } from './neo4jRelationships.js';
4
+ import { nodeTarget, StatementWriter, } from './neo4jStatements.js';
5
+ export { isNeo4jStyle, NEO4J_STYLES } from './neo4jTypes.js';
6
+ export function emitNeo4j(schema, options) {
7
+ const style = options.style ?? 'community';
8
+ const warnings = schemaWarnings(schema);
9
+ if (schema.models.length === 0) {
10
+ return { text: '', warnings };
11
+ }
12
+ const graph = buildGraph(schema, { camelFields: options.camelFields }, warnings);
13
+ const writer = new StatementWriter(style);
14
+ const sections = [];
15
+ if (options.header !== false) {
16
+ sections.push(headerLines(graph, style));
17
+ }
18
+ for (const node of graph.nodes) {
19
+ sections.push(nodeSection(node, writer, warnings));
20
+ }
21
+ const relationships = writeRelationships(schema, graph, writer, warnings);
22
+ if (relationships.lines.length > 0) {
23
+ sections.push([
24
+ ...banner('Relationships (documentation; Neo4j keeps no relationship schema)'),
25
+ ...relationships.lines,
26
+ ]);
27
+ }
28
+ return {
29
+ text: `${sections.map((lines) => lines.join('\n')).join('\n\n')}\n`,
30
+ warnings,
31
+ };
32
+ }
33
+ // ---------------------------------------------------------------------------
34
+ // Warnings for constructs Neo4j has no place for
35
+ // ---------------------------------------------------------------------------
36
+ function schemaWarnings(schema) {
37
+ const warnings = [];
38
+ for (const enumDefinition of schema.enums) {
39
+ if (enumDefinition.schema !== undefined) {
40
+ warnings.push(`enum ${enumDefinition.name}: the database schema "${enumDefinition.schema}" (@@schema) was ignored.`);
41
+ }
42
+ }
43
+ for (const model of schema.models) {
44
+ if (model.isView === true) {
45
+ warnings.push(`${model.name}: this is a database view; it was written as a node label like any other model.`);
46
+ }
47
+ if (model.schema !== undefined) {
48
+ warnings.push(`${model.name}: the database schema "${model.schema}" (@@schema) was ignored.`);
49
+ }
50
+ }
51
+ return warnings;
52
+ }
53
+ // ---------------------------------------------------------------------------
54
+ // Comments
55
+ // ---------------------------------------------------------------------------
56
+ const RULE = `// ${'-'.repeat(75)}`;
57
+ function banner(title) {
58
+ return [RULE, `// ${title}`, RULE];
59
+ }
60
+ function headerLines(graph, style) {
61
+ const lines = [
62
+ '// Neo4j schema (Cypher, Neo4j 5) generated by ormbridge.',
63
+ style === 'enterprise'
64
+ ? '// Style: enterprise. Needs Neo4j Enterprise Edition 5.9 or later (IS NOT NULL, NODE KEY and type constraints).'
65
+ : '// Style: community. IS NOT NULL, NODE KEY and type constraints need Enterprise Edition; use --style enterprise to add them.',
66
+ '// Every statement uses IF NOT EXISTS, so the script can run again (cypher-shell -f schema.cypher).',
67
+ '//',
68
+ '// The graph model is derived: each model is a node label and each foreign key or join table is',
69
+ '// documented below as a relationship. Neo4j keeps no relationship schema, so the foreign key',
70
+ '// columns stay as plain properties. Load the nodes first, then create the relationships with the',
71
+ '// MATCH ... MERGE queries in the relationship comments.',
72
+ ];
73
+ const foreignKeys = graph.nodes.flatMap((node) => node.foreignKeys.map((property) => `${node.label}.${property.key}`));
74
+ if (foreignKeys.length > 0) {
75
+ lines.push('//', `// Foreign key properties kept: ${foreignKeys.join(', ')}`);
76
+ }
77
+ return lines;
78
+ }
79
+ function describeProperty(property) {
80
+ const notes = [
81
+ property.required ? 'required' : 'optional',
82
+ ...property.notes,
83
+ ];
84
+ return `// ${quoteIdentifier(property.key)}: ${property.type.name} (${notes.join('; ')})`;
85
+ }
86
+ // ---------------------------------------------------------------------------
87
+ // One node label
88
+ // ---------------------------------------------------------------------------
89
+ function resolveKeys(node, names) {
90
+ const keys = [];
91
+ for (const name of names) {
92
+ const key = node.keys.get(name);
93
+ if (key === undefined) {
94
+ return undefined;
95
+ }
96
+ keys.push(key);
97
+ }
98
+ return keys;
99
+ }
100
+ function pushAll(target, statement) {
101
+ if (statement !== undefined) {
102
+ target.push(statement);
103
+ }
104
+ }
105
+ function nodeSection(node, writer, warnings) {
106
+ const model = node.model;
107
+ const target = nodeTarget(node.label);
108
+ const lines = banner(`:${quoteIdentifier(node.label)} (model ${oneLine(model.name)}, table ${oneLine(model.tableName)})`);
109
+ const constraints = [];
110
+ const typing = [];
111
+ const indexes = [];
112
+ const notes = [];
113
+ const keyed = new Set();
114
+ // Primary key.
115
+ const keyNames = primaryKeyNamesOf(model);
116
+ const keyProperties = resolveKeys(node, keyNames);
117
+ if (keyNames.length > 0 && keyProperties === undefined) {
118
+ warnings.push(`${model.name}: the primary key (${keyNames.join(', ')}) names a column that does not exist, so it was dropped.`);
119
+ }
120
+ else if (keyProperties !== undefined && keyProperties.length === 1) {
121
+ pushAll(constraints, writer.unique(target, keyProperties));
122
+ }
123
+ else if (keyProperties !== undefined && keyProperties.length > 1) {
124
+ if (writer.style === 'enterprise') {
125
+ pushAll(constraints, writer.nodeKey(target, keyProperties));
126
+ keyProperties.forEach((key) => keyed.add(key));
127
+ }
128
+ else {
129
+ constraints.push(`// Composite primary key (${keyProperties.join(', ')}): NODE KEY needs Enterprise Edition, so a uniqueness constraint is used.`);
130
+ pushAll(constraints, writer.unique(target, keyProperties));
131
+ }
132
+ }
133
+ // Unique columns and one-to-one foreign keys.
134
+ for (const field of model.fields) {
135
+ const key = node.keys.get(field.name);
136
+ if (field.isUnique && key !== undefined) {
137
+ pushAll(constraints, writer.unique(target, [key]));
138
+ }
139
+ }
140
+ for (const relation of model.relations) {
141
+ const key = node.keys.get(relation.name);
142
+ if (relation.kind === 'oneToOne' && key !== undefined) {
143
+ pushAll(constraints, writer.unique(target, [key]));
144
+ }
145
+ }
146
+ // Indexes. Uniqueness constraints go first: Neo4j refuses one when a plain index over the same
147
+ // properties already exists.
148
+ const ordered = [
149
+ ...model.indexes.filter(isUniqueIndex),
150
+ ...model.indexes.filter((index) => !isUniqueIndex(index)),
151
+ ];
152
+ for (const index of ordered) {
153
+ writeIndex(node, index, writer, target, constraints, indexes, warnings);
154
+ }
155
+ // Enterprise: existence and type constraints.
156
+ const required = [];
157
+ for (const property of node.properties) {
158
+ if (property.required && !keyed.has(property.key)) {
159
+ required.push(property.key);
160
+ }
161
+ }
162
+ if (writer.style === 'enterprise') {
163
+ for (const key of required) {
164
+ pushAll(constraints, writer.required(target, key));
165
+ }
166
+ for (const property of node.properties) {
167
+ if (property.type.constrainable) {
168
+ pushAll(typing, writer.typed(target, property.key, property.type));
169
+ }
170
+ }
171
+ }
172
+ else if (required.length > 0) {
173
+ notes.push(`// Required properties (IS NOT NULL needs Enterprise Edition): ${required.join(', ')}`);
174
+ }
175
+ lines.push(...constraints, ...typing, ...indexes, ...notes);
176
+ lines.push('//', `// Properties of :${quoteIdentifier(node.label)} and their Neo4j types:`);
177
+ lines.push(...node.properties.map(describeProperty));
178
+ return lines;
179
+ }
180
+ function isUniqueIndex(index) {
181
+ return index.isUnique && index.kind !== 'fulltext';
182
+ }
183
+ /** Writes one IR index as a constraint or an index, or drops it with a warning. */
184
+ function writeIndex(node, index, writer, target, constraints, indexes, warnings) {
185
+ const label = `${node.model.name} index (${index.fields.join(', ')})`;
186
+ const keys = resolveKeys(node, index.fields);
187
+ if (keys === undefined || keys.length === 0) {
188
+ warnings.push(`${label}: it names a column that does not exist and was dropped.`);
189
+ return;
190
+ }
191
+ if (index.method !== undefined && index.method.toLowerCase() !== 'btree') {
192
+ warnings.push(`${label}: Neo4j has no ${index.method} index method; the index was dropped.`);
193
+ return;
194
+ }
195
+ const hasOptions = index.clustered !== undefined ||
196
+ (index.fieldOptions !== undefined &&
197
+ Object.keys(index.fieldOptions).length > 0);
198
+ if (hasOptions) {
199
+ warnings.push(`${label}: clustering, sort order, prefix length and operator class options have no Neo4j equivalent and were dropped.`);
200
+ }
201
+ if (index.kind === 'fulltext') {
202
+ pushAll(indexes, writer.fulltext(target, keys));
203
+ }
204
+ else if (index.isUnique) {
205
+ pushAll(constraints, writer.unique(target, keys));
206
+ }
207
+ else {
208
+ pushAll(indexes, writer.index(target, keys));
209
+ }
210
+ }
211
+ //# sourceMappingURL=neo4j.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neo4j.js","sourceRoot":"","sources":["../../src/emitters/neo4j.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { IrField, IrModel, IrRelation, IrSchema } from '../ir.js';
2
+ import { type Neo4jType } from './neo4jTypes.js';
3
+ /**
4
+ * The graph model derived from the IR: one node per model, except pure join tables, which become a
5
+ * single relationship. The statement and comment writers read this model and never the IR directly.
6
+ */
7
+ /** A property of a node (or of a relationship, for the extra columns of a join table). */
8
+ export interface GraphProperty {
9
+ /** The property key as written in Cypher (before quoting). */
10
+ key: string;
11
+ /** The IR field name, or the relation name for a foreign key column. */
12
+ irName: string;
13
+ type: Neo4jType;
14
+ required: boolean;
15
+ /** Short remarks shown in the property comment block, for example `primary key`. */
16
+ notes: string[];
17
+ }
18
+ export interface GraphNode {
19
+ model: IrModel;
20
+ label: string;
21
+ properties: GraphProperty[];
22
+ /** IR field name, relation name and column name to property key. */
23
+ keys: Map<string, string>;
24
+ /** The foreign key properties (a subset of `properties`). */
25
+ foreignKeys: GraphProperty[];
26
+ }
27
+ /** A join table written as one relationship. */
28
+ export interface GraphJoin {
29
+ model: IrModel;
30
+ from: IrRelation;
31
+ to: IrRelation;
32
+ type: string;
33
+ /** The surrogate key column that was dropped, if the table had one. */
34
+ surrogateKey?: IrField;
35
+ /** Columns beyond the two foreign keys; they become relationship properties. */
36
+ extras: GraphProperty[];
37
+ /** Property keys of the two foreign keys on the join table, in `from`, `to` order. */
38
+ pairColumns: [string, string];
39
+ keys: Map<string, string>;
40
+ }
41
+ export interface Graph {
42
+ nodes: GraphNode[];
43
+ joins: GraphJoin[];
44
+ byModel: Map<string, GraphNode>;
45
+ }
46
+ export interface GraphOptions {
47
+ camelFields: boolean;
48
+ }
49
+ /** IR names (fields and relations) that make up the primary key of a model. */
50
+ export declare function primaryKeyNamesOf(model: IrModel): string[];
51
+ /** The field a foreign key points at: `toField`, or the single primary key field of the target. */
52
+ export declare function referencedField(schema: IrSchema, relation: IrRelation): IrField | undefined;
53
+ /**
54
+ * Derives the graph model. Warnings for dropped or approximated details are added to `warnings`
55
+ * in model order.
56
+ */
57
+ export declare function buildGraph(schema: IrSchema, options: GraphOptions, warnings: string[]): Graph;
@@ -0,0 +1,311 @@
1
+ import { findModel } from '../ir.js';
2
+ import { enumValuesOf, mapFieldType, } from './neo4jTypes.js';
3
+ import { labelOf, NameRegistry, oneLine, propertyKeyOf, relationshipTypeOf, } from './neo4jNames.js';
4
+ /** IR names (fields and relations) that make up the primary key of a model. */
5
+ export function primaryKeyNamesOf(model) {
6
+ if (model.compositePrimaryKey !== undefined &&
7
+ model.compositePrimaryKey.length > 0) {
8
+ return model.compositePrimaryKey;
9
+ }
10
+ return [
11
+ ...model.fields
12
+ .filter((field) => field.isPrimaryKey)
13
+ .map((field) => field.name),
14
+ ...model.relations
15
+ .filter((relation) => relation.isPrimaryKey === true)
16
+ .map((relation) => relation.name),
17
+ ];
18
+ }
19
+ /** The field a foreign key points at: `toField`, or the single primary key field of the target. */
20
+ export function referencedField(schema, relation) {
21
+ const target = findModel(schema, relation.targetModel);
22
+ if (target === undefined) {
23
+ return undefined;
24
+ }
25
+ if (relation.toField !== undefined) {
26
+ return target.fields.find((field) => field.name === relation.toField || field.columnName === relation.toField);
27
+ }
28
+ const keys = target.fields.filter((field) => field.isPrimaryKey);
29
+ return keys.length === 1 ? keys[0] : undefined;
30
+ }
31
+ function describeDefault(field) {
32
+ const value = field.default;
33
+ if (value === undefined) {
34
+ return undefined;
35
+ }
36
+ switch (value.kind) {
37
+ case 'literal':
38
+ return `the default ${JSON.stringify(value.value)}`;
39
+ case 'autoIncrement':
40
+ return undefined;
41
+ case 'now':
42
+ return 'the default of the current time';
43
+ case 'uuid':
44
+ return 'the default of a generated UUID';
45
+ case 'enumValue':
46
+ return `the default "${value.value}"`;
47
+ case 'clientGenerated':
48
+ return `the ${value.generator}() default`;
49
+ case 'dbExpression':
50
+ return `the database default ${oneLine(value.expression)}`;
51
+ }
52
+ }
53
+ function fieldWarnings(context, model, field, mapping) {
54
+ const label = `${model.name}.${field.name}`;
55
+ if (mapping.warning !== undefined) {
56
+ context.warnings.push(`${label}: ${mapping.warning}`);
57
+ }
58
+ const defaultText = describeDefault(field);
59
+ if (defaultText !== undefined) {
60
+ context.warnings.push(`${label}: ${defaultText} has no Neo4j schema representation and was dropped; set the value when you create the node.`);
61
+ }
62
+ if (field.default?.kind === 'autoIncrement') {
63
+ context.warnings.push(`${label}: auto-increment has no Neo4j equivalent; supply the value yourself (or use randomUUID() and a STRING key).`);
64
+ }
65
+ if (field.generated !== undefined) {
66
+ context.warnings.push(`${label}: the generated column expression (${oneLine(field.generated.expression)}) is not computed by Neo4j; the property is a plain value.`);
67
+ }
68
+ if (field.isAutoUpdated) {
69
+ context.warnings.push(`${label}: the value is refreshed on every save in the source; Neo4j has no such feature, so set it in your queries.`);
70
+ }
71
+ }
72
+ function fieldProperty(context, model, field) {
73
+ const mapping = mapFieldType(field);
74
+ fieldWarnings(context, model, field, mapping);
75
+ const notes = [];
76
+ if (field.isPrimaryKey) {
77
+ notes.push('primary key');
78
+ }
79
+ else if (field.isUnique) {
80
+ notes.push('unique');
81
+ }
82
+ const values = enumValuesOf(field, context.schema.enums);
83
+ if (values.length > 0) {
84
+ notes.push(`one of: ${values.map((value) => `"${oneLine(value)}"`).join(', ')}`);
85
+ }
86
+ if (field.type === 'decimal' && field.maxDigits !== undefined) {
87
+ notes.push(`decimal with ${field.maxDigits} digits${field.decimalPlaces === undefined
88
+ ? ''
89
+ : `, ${field.decimalPlaces} after the point`}`);
90
+ }
91
+ return {
92
+ key: propertyKeyOf(field.columnName, context.options.camelFields),
93
+ irName: field.name,
94
+ type: mapping.type,
95
+ required: !field.isNullable,
96
+ notes,
97
+ };
98
+ }
99
+ /** Maps a foreign key to a property typed like the column it references. */
100
+ function foreignKeyProperty(context, relation, targetKey) {
101
+ const referenced = referencedField(context.schema, relation);
102
+ const type = referenced === undefined
103
+ ? { name: 'INTEGER', constrainable: true }
104
+ : mapFieldType({ ...referenced, arrayDepth: undefined }).type;
105
+ const notes = [
106
+ `foreign key to ${relation.targetModel}${targetKey === undefined ? '' : `.${targetKey}`}`,
107
+ ];
108
+ if (relation.isPrimaryKey === true) {
109
+ notes.unshift('primary key');
110
+ }
111
+ return {
112
+ key: propertyKeyOf(relation.columnName, context.options.camelFields),
113
+ irName: relation.name,
114
+ type,
115
+ required: !relation.isNullable,
116
+ notes,
117
+ };
118
+ }
119
+ function targetKeyName(context, relation) {
120
+ const referenced = referencedField(context.schema, relation);
121
+ return referenced === undefined
122
+ ? undefined
123
+ : propertyKeyOf(referenced.columnName, context.options.camelFields);
124
+ }
125
+ /** Properties of a model: its columns, then one property per foreign key column. */
126
+ function buildProperties(context, model) {
127
+ const properties = [];
128
+ const keys = new Map();
129
+ const foreignKeys = [];
130
+ const taken = new Set();
131
+ for (const field of model.fields) {
132
+ const property = fieldProperty(context, model, field);
133
+ keys.set(field.name, property.key);
134
+ keys.set(field.columnName, property.key);
135
+ if (!taken.has(property.key)) {
136
+ taken.add(property.key);
137
+ properties.push(property);
138
+ }
139
+ }
140
+ for (const relation of model.relations) {
141
+ if (relation.kind === 'manyToMany') {
142
+ continue;
143
+ }
144
+ const property = foreignKeyProperty(context, relation, targetKeyName(context, relation));
145
+ keys.set(relation.name, property.key);
146
+ keys.set(relation.columnName, property.key);
147
+ if (!taken.has(property.key)) {
148
+ taken.add(property.key);
149
+ properties.push(property);
150
+ foreignKeys.push(property);
151
+ }
152
+ }
153
+ return { properties, keys, foreignKeys };
154
+ }
155
+ function maxLengthWarning(model) {
156
+ const names = model.fields
157
+ .filter((field) => field.maxLength !== undefined)
158
+ .map((field) => field.name);
159
+ return names.length === 0
160
+ ? undefined
161
+ : `${model.name}: the maximum length of ${names.join(', ')} has no Neo4j schema representation and was dropped.`;
162
+ }
163
+ function referencedElsewhere(schema, model) {
164
+ return schema.models.some((other) => other.relations.some((relation) => relation.targetModel === model.name) ||
165
+ (other.compositeForeignKeys ?? []).some((key) => key.targetModel === model.name));
166
+ }
167
+ function relationMatches(relation, name) {
168
+ return relation.name === name || relation.columnName === name;
169
+ }
170
+ function hasUniquePair(model, a, b) {
171
+ return model.indexes.some((index) => index.isUnique &&
172
+ index.kind === undefined &&
173
+ index.fields.length === 2 &&
174
+ index.fields.some((name) => relationMatches(a, name)) &&
175
+ index.fields.some((name) => relationMatches(b, name)));
176
+ }
177
+ /**
178
+ * A pure join table has exactly two required foreign keys, nothing else refers to it, and either the
179
+ * two keys together are its primary key or a surrogate key column is paired with a unique pair of
180
+ * the two keys (the table Django and Prisma write for a many-to-many field).
181
+ */
182
+ function joinCandidate(schema, model) {
183
+ if (model.isView === true ||
184
+ (model.compositeForeignKeys ?? []).length > 0 ||
185
+ model.relations.length !== 2 ||
186
+ referencedElsewhere(schema, model)) {
187
+ return undefined;
188
+ }
189
+ const [from, to] = model.relations;
190
+ if (from === undefined ||
191
+ to === undefined ||
192
+ from.kind !== 'foreignKey' ||
193
+ to.kind !== 'foreignKey' ||
194
+ from.isNullable ||
195
+ to.isNullable) {
196
+ return undefined;
197
+ }
198
+ const keyNames = primaryKeyNamesOf(model);
199
+ const keyIsPair = keyNames.length === 2 &&
200
+ keyNames.every((name) => relationMatches(from, name) || relationMatches(to, name));
201
+ if (keyIsPair) {
202
+ return { model, from, to };
203
+ }
204
+ const surrogate = keyNames.length === 1
205
+ ? model.fields.find((field) => field.name === keyNames[0])
206
+ : undefined;
207
+ if (surrogate !== undefined &&
208
+ (model.isJoinTable === true || hasUniquePair(model, from, to))) {
209
+ return { model, from, to, surrogateKey: surrogate };
210
+ }
211
+ return undefined;
212
+ }
213
+ function joinType(join) {
214
+ return relationshipTypeOf(join.from.relatedName ?? join.to.name);
215
+ }
216
+ /**
217
+ * Derives the graph model. Warnings for dropped or approximated details are added to `warnings`
218
+ * in model order.
219
+ */
220
+ export function buildGraph(schema, options, warnings) {
221
+ const context = { schema, options, warnings };
222
+ const candidates = new Map();
223
+ for (const model of schema.models) {
224
+ const candidate = joinCandidate(schema, model);
225
+ if (candidate !== undefined) {
226
+ candidates.set(model.name, candidate);
227
+ }
228
+ }
229
+ // A join table that points at another join table stays an ordinary node, so both ends exist.
230
+ for (const [name, candidate] of [...candidates]) {
231
+ if (candidates.has(candidate.from.targetModel) ||
232
+ candidates.has(candidate.to.targetModel) ||
233
+ findModel(schema, candidate.from.targetModel) === undefined ||
234
+ findModel(schema, candidate.to.targetModel) === undefined) {
235
+ candidates.delete(name);
236
+ }
237
+ }
238
+ const labels = new NameRegistry();
239
+ const nodes = [];
240
+ const joins = [];
241
+ const byModel = new Map();
242
+ for (const model of schema.models) {
243
+ const candidate = candidates.get(model.name);
244
+ if (candidate !== undefined) {
245
+ continue;
246
+ }
247
+ const wanted = labelOf(model.name);
248
+ const label = labels.claim(wanted);
249
+ if (label !== wanted) {
250
+ warnings.push(`${model.name}: the label ${wanted} is already used by another model; this model uses ${label}.`);
251
+ }
252
+ const built = buildProperties(context, model);
253
+ const node = {
254
+ model,
255
+ label,
256
+ properties: built.properties,
257
+ keys: built.keys,
258
+ foreignKeys: built.foreignKeys,
259
+ };
260
+ nodes.push(node);
261
+ byModel.set(model.name, node);
262
+ const lengths = maxLengthWarning(model);
263
+ if (lengths !== undefined) {
264
+ warnings.push(lengths);
265
+ }
266
+ }
267
+ for (const model of schema.models) {
268
+ const candidate = candidates.get(model.name);
269
+ if (candidate === undefined) {
270
+ continue;
271
+ }
272
+ joins.push(buildJoin(context, candidate));
273
+ }
274
+ return { nodes, joins, byModel };
275
+ }
276
+ function buildJoin(context, candidate) {
277
+ const { model, from, to, surrogateKey } = candidate;
278
+ const extras = model.fields
279
+ .filter((field) => field !== surrogateKey)
280
+ .map((field) => fieldProperty(context, model, field));
281
+ const keys = new Map();
282
+ for (const field of model.fields) {
283
+ keys.set(field.name, propertyKeyOf(field.columnName, context.options.camelFields));
284
+ }
285
+ if (surrogateKey !== undefined) {
286
+ context.warnings.push(`${model.name}: the join table became a relationship, so its surrogate key ${surrogateKey.name} was dropped.`);
287
+ }
288
+ const lengths = maxLengthWarning(model);
289
+ if (lengths !== undefined) {
290
+ context.warnings.push(lengths);
291
+ }
292
+ const pairColumns = [
293
+ propertyKeyOf(from.columnName, context.options.camelFields),
294
+ propertyKeyOf(to.columnName, context.options.camelFields),
295
+ ];
296
+ keys.set(from.name, pairColumns[0]);
297
+ keys.set(from.columnName, pairColumns[0]);
298
+ keys.set(to.name, pairColumns[1]);
299
+ keys.set(to.columnName, pairColumns[1]);
300
+ return {
301
+ model,
302
+ from,
303
+ to,
304
+ type: joinType(candidate),
305
+ ...(surrogateKey === undefined ? {} : { surrogateKey }),
306
+ extras,
307
+ pairColumns,
308
+ keys,
309
+ };
310
+ }
311
+ //# sourceMappingURL=neo4jGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neo4jGraph.js","sourceRoot":"","sources":["../../src/emitters/neo4jGraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Writes a label, relationship type, property key or constraint name. Names that are not plain
3
+ * identifiers are wrapped in backticks, and a backtick inside the name is doubled.
4
+ */
5
+ export declare function quoteIdentifier(name: string): string;
6
+ /** Collapses line breaks and runs of whitespace so text can sit safely inside a one-line `//` comment. */
7
+ export declare function oneLine(text: string): string;
8
+ /** Node label of a model: PascalCase and singular (`blog_posts` and `BlogPosts` both give `BlogPost`). */
9
+ export declare function labelOf(modelName: string): string;
10
+ /** Relationship type of a relation field: UPPER_SNAKE_CASE (`edited_by` and `editedBy` give `EDITED_BY`). */
11
+ export declare function relationshipTypeOf(relationName: string): string;
12
+ /**
13
+ * Property key of a column. The `preserve` naming mode keeps the column name; `normalize` uses
14
+ * camelCase, the Neo4j convention. A name with no letters or digits is kept as it is.
15
+ */
16
+ export declare function propertyKeyOf(columnName: string, camelCase: boolean): string;
17
+ /** Hands out names that are unique within one namespace (labels, or constraint and index names). */
18
+ export declare class NameRegistry {
19
+ private readonly used;
20
+ /** Reserves `base`, or `base2`, `base3`, ... when it is taken, and returns the name reserved. */
21
+ claim(base: string): string;
22
+ has(name: string): boolean;
23
+ }
24
+ /** snake_case words for a constraint or index name (`x` when the text has no letters or digits). */
25
+ export declare function nameWords(text: string): string;