Skip to content

Instantly share code, notes, and snippets.

@stayradiated
Created February 6, 2025 10:11
Show Gist options
  • Save stayradiated/ad049707f7fc07a6466e789f76eeee06 to your computer and use it in GitHub Desktop.
Save stayradiated/ad049707f7fc07a6466e789f76eeee06 to your computer and use it in GitHub Desktop.
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