Created
February 6, 2025 10:11
-
-
Save stayradiated/ad049707f7fc07a6466e789f76eeee06 to your computer and use it in GitHub Desktop.
Experimental patch for https://github.com/kristiandupont/kanel/issues/571
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/build/generators/resolveType.js b/build/generators/resolveType.js | |
index c5f92edb607ed6d5a71b0485ce85134e82c487b3..7982b8e3bb9028509ee8ed01e9d3d25f2ea09b6f 100644 | |
--- a/build/generators/resolveType.js | |
+++ b/build/generators/resolveType.js | |
@@ -45,7 +45,7 @@ const getColumnFromReference = (reference, schemas) => { | |
return { column, details: target }; | |
} | |
}; | |
-const getTypeFromReferences = (c, config, visited = new Set()) => { | |
+const getTypeFromReferences = (c, config, visited) => { | |
const references = c | |
.references; | |
const referencedTypes = references.map((reference) => { | |
@@ -54,10 +54,6 @@ const getTypeFromReferences = (c, config, visited = new Set()) => { | |
console.warn("Could not resolve reference", reference); | |
return "unknown"; | |
} | |
- if (visited.has(column)) { | |
- console.warn("Could not resolve circular reference", reference); | |
- return "unknown"; | |
- } | |
return resolveType(column, details, config, visited); | |
}); | |
const seenTypeNames = new Set(); | |
@@ -90,8 +86,17 @@ const getTypeFromReferences = (c, config, visited = new Set()) => { | |
}; | |
} | |
}; | |
-const resolveType = (c, d, config, visited = new Set()) => { | |
- visited.add(c); | |
+const resolveType = (c, d, config, visited = new Map()) => { | |
+ if (visited.has(c)) { | |
+ const { state, value } = visited.get(c); | |
+ if (state === "pending") { | |
+ console.warn("Circular reference detected", c); | |
+ return "unknown"; | |
+ } | |
+ return value; | |
+ } | |
+ visited.set(c, { state: "pending", value: undefined }); | |
+ const type = (() => { | |
// 1) Check for a @type tag. | |
const typeFromComment = resolveTypeFromComment(c.comment); | |
if (typeFromComment) { | |
@@ -209,5 +214,8 @@ const resolveType = (c, d, config, visited = new Set()) => { | |
// 7) If not found, set to unknown and print a warning. | |
console.warn(`Could not resolve type ${c.type.fullName} referenced in ${d.schemaName}.${c.name}`); | |
return "unknown"; | |
+ })(); | |
+ visited.set(c, { state: "resolved", value: type }); | |
+ return type; | |
}; | |
exports.default = resolveType; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment