Skip to content

Commit b58306d

Browse files
authored
Merge pull request #2968 from SeedCompany/edgedb/qb-implicit-type-or-module
EdgeDB QB implicit default type or named module
2 parents 9f47163 + 12637e7 commit b58306d

File tree

3 files changed

+43
-16
lines changed

3 files changed

+43
-16
lines changed

src/components/authentication/authentication.edgedb.repository.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export class AuthenticationEdgeDBRepository
2020
}
2121

2222
async getRootUserId() {
23-
const query = e.assert_exists(e.select(e.default.RootUser).assert_single());
23+
const query = e.assert_exists(e.select(e.RootUser).assert_single());
2424
const result = await this.db.run(query);
2525
return result.id;
2626
}
@@ -31,7 +31,7 @@ export class AuthenticationEdgeDBRepository
3131
}
3232

3333
async savePasswordHashOnUser(userId: ID, passwordHash: string) {
34-
const user = e.select(e.default.User, () => ({
34+
const user = e.select(e.User, () => ({
3535
filter_single: { id: userId },
3636
}));
3737
const query = e
@@ -61,7 +61,7 @@ export class AuthenticationEdgeDBRepository
6161
async connectSessionToUser(input: LoginInput, session: Session): Promise<ID> {
6262
const user = e.assert_exists(
6363
{ message: 'User not found' },
64-
e.select(e.default.User, () => ({
64+
e.select(e.User, () => ({
6565
filter_single: { email: input.email },
6666
})),
6767
);
@@ -101,7 +101,7 @@ export class AuthenticationEdgeDBRepository
101101
scopedRoles: withScope('global', user.roles),
102102
}),
103103
impersonatee: e.assert_single(
104-
e.select(e.default.User, (user) => ({
104+
e.select(e.User, (user) => ({
105105
scopedRoles: withScope('global', user.roles),
106106
filter: e.op(user.id, '=', impersonateeId ?? e.cast(e.uuid, e.set())),
107107
})),
@@ -116,7 +116,7 @@ export class AuthenticationEdgeDBRepository
116116
}
117117

118118
async rolesForUser(userId: ID) {
119-
const query = e.select(e.default.User, (user) => ({
119+
const query = e.select(e.User, (user) => ({
120120
scopedRoles: withScope('global', user.roles),
121121
filter_single: { id: userId },
122122
}));
@@ -145,7 +145,7 @@ export class AuthenticationEdgeDBRepository
145145
}
146146

147147
async userByEmail(email: string) {
148-
const query = e.select(e.default.User, () => ({
148+
const query = e.select(e.User, () => ({
149149
filter_single: { email },
150150
}));
151151
const result = await this.db.run(query);

src/components/user/user.edgedb.repository.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { e, EdgeDB, isExclusivityViolation } from '~/core/edgedb';
1111
import { CreatePerson, User, UserListInput } from './dto';
1212
import { UserRepository } from './user.repository';
1313

14-
const hydrate = e.shape(e.default.User, (user) => ({
14+
const hydrate = e.shape(e.User, (user) => ({
1515
...user['*'],
1616
// Other links if needed
1717
}));
@@ -23,7 +23,7 @@ export class UserEdgedbRepository extends UserRepository {
2323
}
2424

2525
async readOne(id: ID, _session: Session | ID) {
26-
const query = e.select(e.default.User, (user) => ({
26+
const query = e.select(e.User, (user) => ({
2727
...hydrate(user),
2828
filter_single: { id },
2929
}));
@@ -36,7 +36,7 @@ export class UserEdgedbRepository extends UserRepository {
3636

3737
async readMany(ids: readonly ID[], _session: Session | ID) {
3838
const query = e.params({ ids: e.array(e.uuid) }, ({ ids }) =>
39-
e.select(e.default.User, (user) => ({
39+
e.select(e.User, (user) => ({
4040
...hydrate(user),
4141
filter: e.op(user.id, 'in', e.array_unpack(ids)),
4242
})),
@@ -46,16 +46,16 @@ export class UserEdgedbRepository extends UserRepository {
4646
}
4747

4848
async doesEmailAddressExist(email: string) {
49-
const query = e.select(e.default.User, () => ({
49+
const query = e.select(e.User, () => ({
5050
filter_single: { email },
5151
}));
5252
const result = await this.edgedb.run(query);
5353
return !!result;
5454
}
5555

5656
async list(input: UserListInput, _session: Session) {
57-
const sortKey = input.sort as keyof (typeof e.default.User)['*'];
58-
const all = e.select(e.default.User, (user) => ({
57+
const sortKey = input.sort as keyof (typeof e.User)['*'];
58+
const all = e.select(e.User, (user) => ({
5959
filter: e.all(
6060
input.filter.pinned != null
6161
? e.op(user.pinned, '=', input.filter.pinned)
@@ -83,7 +83,7 @@ export class UserEdgedbRepository extends UserRepository {
8383
}
8484

8585
async create(input: CreatePerson) {
86-
const query = e.insert(e.default.User, { ...input });
86+
const query = e.insert(e.User, { ...input });
8787
try {
8888
const result = await this.edgedb.run(query);
8989
return result.id;
@@ -103,7 +103,7 @@ export class UserEdgedbRepository extends UserRepository {
103103
user: User,
104104
email: string | null | undefined,
105105
): Promise<void> {
106-
const query = e.update(e.default.User, () => ({
106+
const query = e.update(e.User, () => ({
107107
filter_single: { id: user.id },
108108
set: { email },
109109
}));
@@ -122,15 +122,15 @@ export class UserEdgedbRepository extends UserRepository {
122122
}
123123

124124
async updateRoles(user: User, roles: Role[]): Promise<void> {
125-
const query = e.update(e.default.User, () => ({
125+
const query = e.update(e.User, () => ({
126126
filter_single: { id: user.id },
127127
set: { roles },
128128
}));
129129
await this.edgedb.run(query);
130130
}
131131

132132
async delete(id: ID, _session: Session, _object: User): Promise<void> {
133-
const query = e.delete(e.default.User, () => ({
133+
const query = e.delete(e.User, () => ({
134134
filter_single: { id },
135135
}));
136136
try {

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export async function generateQueryBuilder({
2424
changeCustomScalars(qbDir);
2525
changeImplicitIDType(qbDir);
2626
allowOrderingByEnums(qbDir);
27+
mergeDefaultTypesWithModuleNames(qbDir);
2728
}
2829

2930
function addJsExtensionDeepPathsOfEdgedbLibrary(qbDir: Directory) {
@@ -72,3 +73,29 @@ function allowOrderingByEnums(qbDir: Directory) {
7273
.setType('TypeSet<EnumType | ScalarType | ObjectType>');
7374
file.fixMissingImports();
7475
}
76+
77+
function mergeDefaultTypesWithModuleNames(qbDir: Directory) {
78+
const file = qbDir.getSourceFileOrThrow('index.ts');
79+
const st = file.getVariableDeclarationOrThrow('ExportDefault');
80+
const typeText = st.getTypeNodeOrThrow().getFullText();
81+
const value = st.getInitializerIfKindOrThrow(
82+
SyntaxKind.ObjectLiteralExpression,
83+
);
84+
// Regex is faster here than ts-morph type parsing
85+
const conflicting = (
86+
typeText.match(/Omit<typeof _default, (.+)>/)?.[1].split(/ \| /g) ?? []
87+
).map((s) => s.slice(1, -1));
88+
let newTypeText = typeText;
89+
for (const name of conflicting) {
90+
newTypeText = newTypeText.replace(
91+
`typeof _${name}`,
92+
`typeof _${name} & typeof _default.${name}`,
93+
);
94+
value
95+
.getPropertyOrThrow(`"${name}"`)
96+
.asKindOrThrow(SyntaxKind.PropertyAssignment)
97+
.getInitializerOrThrow()
98+
.replaceWithText(`{ ..._${name}, ..._default.${name} }`);
99+
}
100+
st.setType(newTypeText);
101+
}

0 commit comments

Comments
 (0)