Skip to content

Commit 73eb669

Browse files
authored
[EdgeDB] Workaround QB typing overloads from ancestors (#3230)
1 parent b0a2a10 commit 73eb669

File tree

1 file changed

+34
-1
lines changed

1 file changed

+34
-1
lines changed

src/core/edgedb/generator/query-builder.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { generateQueryBuilder as runQueryBuilderGenerator } from '@edgedb/generate/dist/edgeql-js.js';
2-
import { groupBy } from '@seedcompany/common';
2+
import { groupBy, many, Many } from '@seedcompany/common';
33
import type { ts } from '@ts-morph/common';
44
import { Directory, Node } from 'ts-morph';
55
import { codecs } from '../codecs';
@@ -30,6 +30,13 @@ export async function generateQueryBuilder({
3030
changeImplicitIDType(qbDir);
3131
adjustToImmutableTypes(qbDir);
3232
addTypeNarrowingToStdScalars(qbDir);
33+
fixAncestorOverloads(qbDir, {
34+
'default::LanguageEngagement': 'project',
35+
'default::InternshipEngagement': 'project',
36+
'default::ProgressReport': ['container', 'engagement'],
37+
'ProgressReport::CommunityStory': 'container',
38+
'ProgressReport::Highlight': 'container',
39+
});
3340
}
3441

3542
function addJsExtensionDeepPathsOfEdgedbLibrary(qbDir: Directory) {
@@ -142,6 +149,32 @@ function addTypeNarrowingToStdScalars(qbDir: Directory) {
142149
});
143150
}
144151

152+
/**
153+
* Fixes shapes of types that have overloaded a pointer from an ancestor/grandparent.
154+
* Currently, the QB only works with overloaded pointers of a direct parent.
155+
*/
156+
function fixAncestorOverloads(
157+
qbDir: Directory,
158+
fqnTypePointerMap: Record<string, Many<string>>,
159+
) {
160+
for (const [fqn, pointers] of Object.entries(fqnTypePointerMap)) {
161+
const module = qbDir.addSourceFileAtPath(
162+
`modules/${fqn.split('::').slice(0, -1).join('/')}.ts`,
163+
);
164+
const type = fqn.split('::').pop()!;
165+
const pointerStr = many(pointers)
166+
.map((p) => `"${p}"`)
167+
.join(' | ');
168+
const shape = module.getTypeAliasOrThrow(`$${type}λShape`);
169+
replaceText(shape, (prev) =>
170+
prev.replaceAll(
171+
/(?<==.+)[\w._$]+λShape/g,
172+
(parent) => `Omit<${parent}, ${pointerStr}>`,
173+
),
174+
);
175+
}
176+
}
177+
145178
const replaceText = <N extends ts.Node>(
146179
node: Node<N>,
147180
replacer: (prevText: string) => string,

0 commit comments

Comments
 (0)