joist-codegen 1.168.2 → 1.169.1
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/build/EntityDbMetadata.d.ts +10 -2
- package/build/EntityDbMetadata.d.ts.map +1 -1
- package/build/EntityDbMetadata.js +18 -3
- package/build/EntityDbMetadata.js.map +1 -1
- package/build/config.d.ts +5 -0
- package/build/config.d.ts.map +1 -1
- package/build/config.js +6 -3
- package/build/config.js.map +1 -1
- package/build/foreignKeyOrdering.d.ts +3 -0
- package/build/foreignKeyOrdering.d.ts.map +1 -0
- package/build/foreignKeyOrdering.js +66 -0
- package/build/foreignKeyOrdering.js.map +1 -0
- package/build/generate.d.ts.map +1 -1
- package/build/generate.js +1 -8
- package/build/generate.js.map +1 -1
- package/build/generateEntityCodegenFile.js +2 -2
- package/build/generateEntityCodegenFile.js.map +1 -1
- package/build/generateFlushFunction.d.ts.map +1 -1
- package/build/generateFlushFunction.js +19 -4
- package/build/generateFlushFunction.js.map +1 -1
- package/build/generateMetadataFile.d.ts.map +1 -1
- package/build/generateMetadataFile.js +2 -0
- package/build/generateMetadataFile.js.map +1 -1
- package/build/index.d.ts +0 -5
- package/build/index.d.ts.map +1 -1
- package/build/index.js +14 -187
- package/build/index.js.map +1 -1
- package/build/inheritance.d.ts +10 -0
- package/build/inheritance.d.ts.map +1 -0
- package/build/inheritance.js +185 -0
- package/build/inheritance.js.map +1 -0
- package/build/sortForeignKeys.d.ts +32 -0
- package/build/sortForeignKeys.d.ts.map +1 -0
- package/build/sortForeignKeys.js +128 -0
- package/build/sortForeignKeys.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getStiEntities = exports.applyInheritanceUpdates = void 0;
|
|
4
|
+
const EntityDbMetadata_1 = require("./EntityDbMetadata");
|
|
5
|
+
const utils_1 = require("./utils");
|
|
6
|
+
function applyInheritanceUpdates(config, db) {
|
|
7
|
+
const { entities, entitiesByName } = db;
|
|
8
|
+
setClassTableInheritance(entities, entitiesByName);
|
|
9
|
+
expandSingleTableInheritance(config, entities);
|
|
10
|
+
rewriteSingleTableForeignKeys(config, entities);
|
|
11
|
+
}
|
|
12
|
+
exports.applyInheritanceUpdates = applyInheritanceUpdates;
|
|
13
|
+
/**
|
|
14
|
+
* Ensure CTI base types have their inheritanceType set.
|
|
15
|
+
*
|
|
16
|
+
* (We automatically set `inheritanceType` for STI tables when we see their config
|
|
17
|
+
* setup, see `expandSingleTableInheritance`.)
|
|
18
|
+
*/
|
|
19
|
+
function setClassTableInheritance(entities, entitiesByName) {
|
|
20
|
+
const ctiBaseNames = [];
|
|
21
|
+
for (const entity of entities) {
|
|
22
|
+
if (entity.baseClassName) {
|
|
23
|
+
ctiBaseNames.push(entity.baseClassName);
|
|
24
|
+
entitiesByName[entity.baseClassName].subTypes.push(entity);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
for (const entity of entities) {
|
|
28
|
+
if (ctiBaseNames.includes(entity.name))
|
|
29
|
+
entity.inheritanceType = "cti";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Expands STI tables into multiple entities, so they get separate `SubTypeCodegen.ts` & `SubType.ts` files. */
|
|
33
|
+
function expandSingleTableInheritance(config, entities) {
|
|
34
|
+
for (const entity of entities) {
|
|
35
|
+
const [fieldName, stiField] = Object.entries(config.entities[entity.name]?.fields || {}).find(([, f]) => !!f.stiDiscriminator) ?? [];
|
|
36
|
+
if (fieldName && stiField && stiField.stiDiscriminator) {
|
|
37
|
+
entity.inheritanceType = "sti";
|
|
38
|
+
// Ensure we have an enum field so that we can bake the STI discriminators into the metadata.ts file
|
|
39
|
+
const enumField = entity.enums.find((e) => e.fieldName === fieldName) ??
|
|
40
|
+
(0, utils_1.fail)(`No enum column found for ${entity.name}.${fieldName}, which is required to use singleTableInheritance`);
|
|
41
|
+
entity.stiDiscriminatorField = enumField.fieldName;
|
|
42
|
+
for (const [enumCode, subTypeName] of Object.entries(stiField.stiDiscriminator)) {
|
|
43
|
+
// Find all the base entity's fields that belong to us
|
|
44
|
+
const subTypeFields = [
|
|
45
|
+
...Object.entries(config.entities[entity.name]?.fields ?? {}),
|
|
46
|
+
...Object.entries(config.entities[entity.name]?.relations ?? {}),
|
|
47
|
+
].filter(([, f]) => f.stiType === subTypeName);
|
|
48
|
+
const subTypeFieldNames = subTypeFields.map(([name]) => name);
|
|
49
|
+
// Make fields as required
|
|
50
|
+
function maybeRequired(field) {
|
|
51
|
+
const config = subTypeFields.find(([name]) => name === field.fieldName)?.[1];
|
|
52
|
+
if (config.stiNotNull)
|
|
53
|
+
field.notNull = true;
|
|
54
|
+
return field;
|
|
55
|
+
}
|
|
56
|
+
// Synthesize an entity for this STI sub-entity
|
|
57
|
+
const subEntity = {
|
|
58
|
+
name: subTypeName,
|
|
59
|
+
entity: (0, EntityDbMetadata_1.makeEntity)(subTypeName),
|
|
60
|
+
tableName: entity.tableName,
|
|
61
|
+
primaryKey: entity.primaryKey,
|
|
62
|
+
primitives: entity.primitives.filter((f) => subTypeFieldNames.includes(f.fieldName)).map(maybeRequired),
|
|
63
|
+
enums: entity.enums.filter((f) => subTypeFieldNames.includes(f.fieldName)).map(maybeRequired),
|
|
64
|
+
pgEnums: entity.pgEnums.filter((f) => subTypeFieldNames.includes(f.fieldName)).map(maybeRequired),
|
|
65
|
+
manyToOnes: entity.manyToOnes.filter((f) => subTypeFieldNames.includes(f.fieldName)).map(maybeRequired),
|
|
66
|
+
oneToManys: entity.oneToManys.filter((f) => subTypeFieldNames.includes(f.fieldName)),
|
|
67
|
+
largeOneToManys: entity.largeOneToManys.filter((f) => subTypeFieldNames.includes(f.fieldName)),
|
|
68
|
+
oneToOnes: entity.oneToOnes.filter((f) => subTypeFieldNames.includes(f.fieldName)),
|
|
69
|
+
manyToManys: entity.manyToManys.filter((f) => subTypeFieldNames.includes(f.fieldName)),
|
|
70
|
+
largeManyToManys: entity.largeManyToManys.filter((f) => subTypeFieldNames.includes(f.fieldName)),
|
|
71
|
+
polymorphics: entity.polymorphics.filter((f) => subTypeFieldNames.includes(f.fieldName)),
|
|
72
|
+
tagName: entity.tagName,
|
|
73
|
+
createdAt: undefined,
|
|
74
|
+
updatedAt: undefined,
|
|
75
|
+
deletedAt: undefined,
|
|
76
|
+
baseClassName: entity.name,
|
|
77
|
+
subTypes: [],
|
|
78
|
+
inheritanceType: "sti",
|
|
79
|
+
stiDiscriminatorValue: (enumField.enumRows.find((r) => r.code === enumCode) ??
|
|
80
|
+
(0, utils_1.fail)(`No enum row found for ${entity.name}.${fieldName}.${enumCode}`)).id,
|
|
81
|
+
abstract: false,
|
|
82
|
+
nonDeferredFkOrder: entity.nonDeferredFkOrder,
|
|
83
|
+
get nonDeferredFks() {
|
|
84
|
+
return [
|
|
85
|
+
...this.manyToOnes.filter((r) => !r.isDeferredAndDeferrable),
|
|
86
|
+
...this.polymorphics.flatMap((p) => p.components).filter((c) => !c.isDeferredAndDeferrable),
|
|
87
|
+
];
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
// Now strip all the subclass fields from the base class
|
|
91
|
+
entity.primitives = entity.primitives.filter((f) => !subTypeFieldNames.includes(f.fieldName));
|
|
92
|
+
entity.enums = entity.enums.filter((f) => !subTypeFieldNames.includes(f.fieldName));
|
|
93
|
+
entity.pgEnums = entity.pgEnums.filter((f) => !subTypeFieldNames.includes(f.fieldName));
|
|
94
|
+
entity.manyToOnes = entity.manyToOnes.filter((f) => !subTypeFieldNames.includes(f.fieldName));
|
|
95
|
+
entity.oneToManys = entity.oneToManys.filter((f) => !subTypeFieldNames.includes(f.fieldName));
|
|
96
|
+
entity.largeOneToManys = entity.largeOneToManys.filter((f) => !subTypeFieldNames.includes(f.fieldName));
|
|
97
|
+
entity.oneToOnes = entity.oneToOnes.filter((f) => !subTypeFieldNames.includes(f.fieldName));
|
|
98
|
+
entity.manyToManys = entity.manyToManys.filter((f) => !subTypeFieldNames.includes(f.fieldName));
|
|
99
|
+
entity.largeManyToManys = entity.largeManyToManys.filter((f) => !subTypeFieldNames.includes(f.fieldName));
|
|
100
|
+
entity.polymorphics = entity.polymorphics.filter((f) => !subTypeFieldNames.includes(f.fieldName));
|
|
101
|
+
entities.push(subEntity);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
let stiEntities;
|
|
107
|
+
function getStiEntities(entities) {
|
|
108
|
+
if (stiEntities)
|
|
109
|
+
return stiEntities;
|
|
110
|
+
stiEntities = new Map();
|
|
111
|
+
for (const entity of entities) {
|
|
112
|
+
if (entity.inheritanceType === "sti" && entity.stiDiscriminatorField) {
|
|
113
|
+
const base = entity;
|
|
114
|
+
const subTypes = entities.filter((s) => s.baseClassName === entity.name && s !== entity);
|
|
115
|
+
stiEntities.set(entity.name, { base, subTypes });
|
|
116
|
+
// Allow looking up by subType name
|
|
117
|
+
for (const subType of subTypes) {
|
|
118
|
+
stiEntities.set(subType.name, { base, subTypes: [] });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return stiEntities;
|
|
123
|
+
}
|
|
124
|
+
exports.getStiEntities = getStiEntities;
|
|
125
|
+
/** Finds FKs pointing to the base table and, if configured, rewrites them to point to the sub-tables. */
|
|
126
|
+
function rewriteSingleTableForeignKeys(config, entities) {
|
|
127
|
+
// See if we even have any STI tables
|
|
128
|
+
const stiEntities = getStiEntities(entities);
|
|
129
|
+
if (stiEntities.size === 0)
|
|
130
|
+
return;
|
|
131
|
+
// Scan for other entities/relations that point to the STI table
|
|
132
|
+
for (const entity of entities) {
|
|
133
|
+
// m2os -- Look for `entity.task_id` FKs pointing at `Task` and, if configured, rewrite them to point at `TaskOld`
|
|
134
|
+
for (const m2o of entity.manyToOnes) {
|
|
135
|
+
const target = stiEntities.get(m2o.otherEntity.name);
|
|
136
|
+
const base = target?.base.entity.name;
|
|
137
|
+
// See if the user has pushed `Task.entities` down to a subtype
|
|
138
|
+
const stiType = base && config.entities[base]?.relations?.[m2o.otherFieldName]?.stiType;
|
|
139
|
+
if (target && stiType) {
|
|
140
|
+
const { subTypes } = target;
|
|
141
|
+
m2o.otherEntity = (subTypes.find((s) => s.name === stiType) ??
|
|
142
|
+
(0, utils_1.fail)(`Could not find STI type '${stiType}' in ${subTypes.map((s) => s.name)}`)).entity;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// polys -- Look for `entity.parent_task_id` FKs pointing at `Task` and, if configured, rewrite them to point at `TaskOld`
|
|
146
|
+
for (const poly of entity.polymorphics) {
|
|
147
|
+
for (const comp of poly.components) {
|
|
148
|
+
const target = stiEntities.get(comp.otherEntity.name);
|
|
149
|
+
const base = target?.base.entity.name;
|
|
150
|
+
// See if the user has pushed `Task.entities` down to a subtype
|
|
151
|
+
const stiType = base && config.entities[base]?.relations?.[comp.otherFieldName]?.stiType;
|
|
152
|
+
if (target && stiType) {
|
|
153
|
+
const { subTypes } = target;
|
|
154
|
+
comp.otherEntity = (subTypes.find((s) => s.name === stiType) ??
|
|
155
|
+
(0, utils_1.fail)(`Could not find STI type '${stiType}' in ${subTypes.map((s) => s.name)}`)).entity;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// o2ms -- Look for `entity.tasks` collections loading `task.entity_id`, but entity has been pushed down to `TaskOld`
|
|
160
|
+
for (const o2m of entity.oneToManys) {
|
|
161
|
+
const target = stiEntities.get(o2m.otherEntity.name);
|
|
162
|
+
if (target && target.base.inheritanceType === "sti") {
|
|
163
|
+
// Ensure the incoming FK is not in the base type, and find the 1st subtype (eventually N subtypes?)
|
|
164
|
+
const otherField = target.subTypes.find((st) => !target.base.manyToOnes.some((m) => m.fieldName === o2m.otherFieldName) &&
|
|
165
|
+
st.manyToOnes.some((m) => m.fieldName === o2m.otherFieldName));
|
|
166
|
+
if (otherField) {
|
|
167
|
+
o2m.otherEntity = otherField.entity;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// m2ms -- Look for `entity.tasks` collections loading m2m rows, but `entity` has been pushed down to `TaskOld`
|
|
172
|
+
for (const m2m of entity.manyToManys) {
|
|
173
|
+
const target = stiEntities.get(m2m.otherEntity.name);
|
|
174
|
+
if (target && target.base.inheritanceType === "sti") {
|
|
175
|
+
// Ensure the incoming FK is not in the base type, and find the 1st subtype (eventually N subtypes?)
|
|
176
|
+
const otherField = target.subTypes.find((st) => !target.base.manyToManys.some((m) => m.fieldName === m2m.otherFieldName) &&
|
|
177
|
+
st.manyToManys.some((m) => m.fieldName === m2m.otherFieldName));
|
|
178
|
+
if (otherField) {
|
|
179
|
+
m2m.otherEntity = otherField.entity;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=inheritance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inheritance.js","sourceRoot":"","sources":["../src/inheritance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { EntityDbMetadata } from "./EntityDbMetadata";
|
|
2
|
+
/**
|
|
3
|
+
* Sorts entities by non-deferred foreign key order.
|
|
4
|
+
*
|
|
5
|
+
* Ideally databases/schemas will support/enable deferred FKs, which let us insert/delete rows
|
|
6
|
+
* in any arbitrary order, and the FK checks will not be applied until txn commit.
|
|
7
|
+
*
|
|
8
|
+
* However, if not enabled/support, we have to worry about two things:
|
|
9
|
+
*
|
|
10
|
+
* 1. Inserting "parents" before their children
|
|
11
|
+
* - And if the parent has a circular reference to not-yet-inserted cycle
|
|
12
|
+
* 2. Deleting "children" before their parents
|
|
13
|
+
* - Again if the parent has a circular reference to the child
|
|
14
|
+
*
|
|
15
|
+
* For both of these, we can just look at the FK ordering to "put the parent first",
|
|
16
|
+
* but run into two problems:
|
|
17
|
+
*
|
|
18
|
+
* - If there is a cycle for not-null FKs, that breaks both INSERTs and DELETEs, so we
|
|
19
|
+
* must warn the user about these to fix.
|
|
20
|
+
* - If there is a cycle with nullable FKs, we can work around that by using NULL as a
|
|
21
|
+
* transient/dummy value, for the initial insert, do the 2nd insert, and then "fixup" the
|
|
22
|
+
* first insert with a UPDATE to the actual column value.
|
|
23
|
+
*
|
|
24
|
+
* Given ^, we set the `entity.nonDeferredFkOrder` of each entity, and then also return
|
|
25
|
+
* two arrays of all soft-cycle (nullable, fixup-able) and hard-cycle (not-nullable, blocking)
|
|
26
|
+
* keys.
|
|
27
|
+
*/
|
|
28
|
+
export declare function sortByNonDeferredForeignKeys(entities: EntityDbMetadata[]): {
|
|
29
|
+
nullableCycles: string[];
|
|
30
|
+
notNullCycles: string[];
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=sortForeignKeys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sortForeignKeys.d.ts","sourceRoot":"","sources":["../src/sortForeignKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA6C,MAAM,oBAAoB,CAAC;AAEjG;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG;IAC1E,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB,CAiEA"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sortByNonDeferredForeignKeys = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Sorts entities by non-deferred foreign key order.
|
|
6
|
+
*
|
|
7
|
+
* Ideally databases/schemas will support/enable deferred FKs, which let us insert/delete rows
|
|
8
|
+
* in any arbitrary order, and the FK checks will not be applied until txn commit.
|
|
9
|
+
*
|
|
10
|
+
* However, if not enabled/support, we have to worry about two things:
|
|
11
|
+
*
|
|
12
|
+
* 1. Inserting "parents" before their children
|
|
13
|
+
* - And if the parent has a circular reference to not-yet-inserted cycle
|
|
14
|
+
* 2. Deleting "children" before their parents
|
|
15
|
+
* - Again if the parent has a circular reference to the child
|
|
16
|
+
*
|
|
17
|
+
* For both of these, we can just look at the FK ordering to "put the parent first",
|
|
18
|
+
* but run into two problems:
|
|
19
|
+
*
|
|
20
|
+
* - If there is a cycle for not-null FKs, that breaks both INSERTs and DELETEs, so we
|
|
21
|
+
* must warn the user about these to fix.
|
|
22
|
+
* - If there is a cycle with nullable FKs, we can work around that by using NULL as a
|
|
23
|
+
* transient/dummy value, for the initial insert, do the 2nd insert, and then "fixup" the
|
|
24
|
+
* first insert with a UPDATE to the actual column value.
|
|
25
|
+
*
|
|
26
|
+
* Given ^, we set the `entity.nonDeferredFkOrder` of each entity, and then also return
|
|
27
|
+
* two arrays of all soft-cycle (nullable, fixup-able) and hard-cycle (not-nullable, blocking)
|
|
28
|
+
* keys.
|
|
29
|
+
*/
|
|
30
|
+
function sortByNonDeferredForeignKeys(entities) {
|
|
31
|
+
// Kahn's algorithm, O(V + E)
|
|
32
|
+
const graph = Object.fromEntries(entities.map((e) => [
|
|
33
|
+
e.name,
|
|
34
|
+
{
|
|
35
|
+
entity: e,
|
|
36
|
+
upstreamFks: new Set(),
|
|
37
|
+
downstreamFks: new Set(),
|
|
38
|
+
},
|
|
39
|
+
]));
|
|
40
|
+
// Add all not-null deps first, as they are most important, cannot be fixed up.
|
|
41
|
+
// - Failures here are fatal-ish
|
|
42
|
+
// Then add nullable deps next, as they can be fixed-up
|
|
43
|
+
const nullableCycles = [];
|
|
44
|
+
const notNullCycles = [];
|
|
45
|
+
// If we see `books.author_id`, mark `author.inDegree++`
|
|
46
|
+
entities.forEach((entity) => {
|
|
47
|
+
entity.nonDeferredFks
|
|
48
|
+
.filter((m2o) => m2o.notNull)
|
|
49
|
+
.forEach((m2o) => {
|
|
50
|
+
const added = addDependency(graph, entity, m2o);
|
|
51
|
+
if (Array.isArray(added))
|
|
52
|
+
notNullCycles.push(added.join(" -> "));
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
// Do it again for nullable
|
|
56
|
+
entities.forEach((entity) => {
|
|
57
|
+
entity.nonDeferredFks
|
|
58
|
+
.filter((m2o) => !m2o.notNull)
|
|
59
|
+
.forEach((m2o) => {
|
|
60
|
+
const added = addDependency(graph, entity, m2o);
|
|
61
|
+
if (Array.isArray(added))
|
|
62
|
+
nullableCycles.push(added.join(" -> "));
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
// Topological Sort
|
|
66
|
+
// Enqueue entities with 0 out-degree (reverse Kahn), i.e. `authors`, they'll be at the top of the tree
|
|
67
|
+
let queue = Object.values(graph).filter((n) => n.upstreamFks.size === 0);
|
|
68
|
+
let level = 1;
|
|
69
|
+
while (queue.length > 0) {
|
|
70
|
+
// console.log(`Queue: ${queue.map((n) => n.entity.name)}`);
|
|
71
|
+
const nextLevel = [];
|
|
72
|
+
for (const current of queue) {
|
|
73
|
+
current.entity.nonDeferredFkOrder = level;
|
|
74
|
+
current.downstreamFks.forEach((node) => {
|
|
75
|
+
if (node.upstreamFks.delete(current) && node.upstreamFks.size === 0) {
|
|
76
|
+
nextLevel.push(node);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
queue = nextLevel;
|
|
81
|
+
level++;
|
|
82
|
+
}
|
|
83
|
+
// Anything left with a -1 value means there is a cycle
|
|
84
|
+
// Use a marker value for "cyclic"
|
|
85
|
+
entities.filter((e) => e.nonDeferredFkOrder === -1).forEach((e) => (e.nonDeferredFkOrder = 100_000));
|
|
86
|
+
return { nullableCycles, notNullCycles: notNullCycles };
|
|
87
|
+
}
|
|
88
|
+
exports.sortByNonDeferredForeignKeys = sortByNonDeferredForeignKeys;
|
|
89
|
+
function addDependency(graph, entity, m2o) {
|
|
90
|
+
const from = graph[entity.name]; // i.e. books
|
|
91
|
+
const to = graph[m2o.otherEntity.name]; // i.e. authors
|
|
92
|
+
const cycle = willCreateCycle(graph, from, to);
|
|
93
|
+
if (cycle) {
|
|
94
|
+
// console.log(`Skipped ${entity.name}.${m2o.columnName} -> ${m2o.otherEntity.name}`);
|
|
95
|
+
return cycle;
|
|
96
|
+
}
|
|
97
|
+
// console.log(`Added ${entity.name}.${m2o.columnName} -> ${m2o.otherEntity.name}`);
|
|
98
|
+
from.upstreamFks.add(to);
|
|
99
|
+
to.downstreamFks.add(from);
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
function willCreateCycle(graph, from, to) {
|
|
103
|
+
const visited = new Set();
|
|
104
|
+
const stack = new Set();
|
|
105
|
+
const path = [];
|
|
106
|
+
// If `from=books[.author_id]` pointing at `to=authors`, we want to do `to.downstreamFks.add(from)`,
|
|
107
|
+
// but first make sure that none of from's dowstreams are to, because if so it would make a cycle.
|
|
108
|
+
return dfs(graph, visited, stack, path, from, to);
|
|
109
|
+
}
|
|
110
|
+
function dfs(graph, visited, stack, path, current, target) {
|
|
111
|
+
visited.add(current);
|
|
112
|
+
stack.add(current);
|
|
113
|
+
path.push(current);
|
|
114
|
+
for (const neighbor of current.downstreamFks) {
|
|
115
|
+
if (neighbor === target) {
|
|
116
|
+
return [...path, neighbor].map((n) => n.entity.name);
|
|
117
|
+
}
|
|
118
|
+
if (!visited.has(neighbor)) {
|
|
119
|
+
const cycle = dfs(graph, visited, stack, path, neighbor, target);
|
|
120
|
+
if (cycle)
|
|
121
|
+
return cycle;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
stack.delete(current);
|
|
125
|
+
path.pop();
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=sortForeignKeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sortForeignKeys.js","sourceRoot":"","sources":["../src/sortForeignKeys.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "joist-codegen",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.169.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"change-case": "^4.1.2",
|
|
26
26
|
"fast-glob": "^3.3.2",
|
|
27
27
|
"inquirer": "^8.2.6",
|
|
28
|
-
"joist-utils": "1.
|
|
28
|
+
"joist-utils": "1.169.1",
|
|
29
29
|
"jscodeshift": "^0.15.2",
|
|
30
30
|
"knex": "^3.1.0",
|
|
31
31
|
"pg": "^8.11.5",
|