Skip to content

Commit 086435f

Browse files
authored
Merge pull request #3077 from SeedCompany/edgedb/tweak-resource-types
2 parents 5fff1d7 + 868d81c commit 086435f

File tree

2 files changed

+24
-10
lines changed

2 files changed

+24
-10
lines changed

src/common/resource.dto.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { DateTime } from 'luxon';
55
import { keys as keysOf } from 'ts-transformer-keys';
66
import { inspect } from 'util';
77
import type { ResourceDBMap, ResourceMap } from '~/core';
8-
import { $ } from '~/core/edgedb/reexports';
8+
import { $, e } from '~/core/edgedb/reexports';
99
import { ScopedRole } from '../components/authorization';
1010
import { CalculatedSymbol } from './calculated.decorator';
1111
import { DataObject } from './data-object';
@@ -249,7 +249,7 @@ export class EnhancedResource<T extends ResourceShape<any>> {
249249
return type as any;
250250
}
251251

252-
get dbFQN(): DBType<T>['__element__']['__name__'] {
252+
get dbFQN(): ResourceShape<any> extends T ? string : DBName<DBType<T>> {
253253
return this.db.__element__.__name__ as any;
254254
}
255255

@@ -297,12 +297,16 @@ export type ResourceName<TResourceStatic extends ResourceShape<any>> =
297297
string;
298298

299299
export type DBType<TResourceStatic extends ResourceShape<any>> =
300-
ResourceName<TResourceStatic> extends keyof ResourceDBMap
300+
ResourceShape<any> extends TResourceStatic
301+
? typeof e.Resource // short-circuit non-specific types
302+
: ResourceName<TResourceStatic> extends keyof ResourceDBMap
301303
? ResourceDBMap[ResourceName<TResourceStatic>] extends infer T extends $.$expr_PathNode
302304
? T
303305
: never
304306
: never;
305307

308+
export type DBName<T extends $.TypeSet> = T['__element__']['__name__'];
309+
306310
export type MaybeUnsecuredInstance<TResourceStatic extends ResourceShape<any>> =
307311
MaybeSecured<InstanceType<TResourceStatic>>;
308312

src/core/resources/resources.host.ts

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ import { GraphQLSchemaHost } from '@nestjs/graphql';
33
import { CachedByArg, mapKeys } from '@seedcompany/common';
44
import { isObjectType } from 'graphql';
55
import { mapValues } from 'lodash';
6-
import { LiteralUnion, ValueOf } from 'type-fest';
6+
import { ConditionalKeys, LiteralUnion, ValueOf } from 'type-fest';
77
import {
8+
DBName,
89
EnhancedResource,
910
InvalidIdForTypeException,
1011
ResourceShape,
1112
ServerException,
1213
} from '~/common';
13-
import { ResourceMap } from './map';
14+
import { ResourceDBMap, ResourceMap } from './map';
1415
import { __privateDontUseThis } from './resource-map-holder';
1516

1617
export type EnhancedResourceMap = {
@@ -24,6 +25,10 @@ export type ResourceLike =
2425
| EnhancedResource<any>
2526
| LooseResourceName;
2627

28+
type ResourceNameFromDBName<K extends DBName<ValueOf<ResourceDBMap>>> =
29+
// eslint-disable-next-line @typescript-eslint/naming-convention
30+
ConditionalKeys<ResourceDBMap, { __element__: { __name__: K } }>;
31+
2732
@Injectable()
2833
export class ResourcesHost {
2934
constructor(private readonly gqlSchema: GraphQLSchemaHost) {}
@@ -61,13 +66,18 @@ export class ResourcesHost {
6166
return resource;
6267
}
6368

64-
getByDynamicName(
65-
name: LooseResourceName,
66-
): EnhancedResource<ValueOf<ResourceMap>> {
69+
getByDynamicName(name: LooseResourceName): EnhancedResource<any> {
6770
return this.getByName(name as any);
6871
}
6972

70-
getByEdgeDB(name: string): EnhancedResource<ValueOf<ResourceMap>> {
73+
getByEdgeDB<K extends keyof ResourceMap>(
74+
name: K,
75+
): EnhancedResource<ValueOf<Pick<ResourceMap, K>>>;
76+
getByEdgeDB<K extends DBName<ValueOf<ResourceDBMap>>>(
77+
name: K,
78+
): EnhancedResource<ValueOf<Pick<ResourceMap, ResourceNameFromDBName<K>>>>;
79+
getByEdgeDB(name: string): EnhancedResource<any>;
80+
getByEdgeDB(name: string) {
7181
const fqnMap = this.edgeDBFQNMap();
7282
const resByFQN = fqnMap.get(
7383
name.includes('::') ? name : `default::${name}`,
@@ -92,7 +102,7 @@ export class ResourcesHost {
92102
map as Record<string, EnhancedResource<any>>,
93103
(_, r, { SKIP }) => {
94104
try {
95-
return r.dbFQN as string;
105+
return r.dbFQN;
96106
} catch (e) {
97107
return SKIP;
98108
}

0 commit comments

Comments
 (0)