Skip to content

Commit 868d81c

Browse files
committed
Adjust ResourcesHost.getByEdgeDB to give strict resource types from strict keys
1 parent 9dbeb0c commit 868d81c

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

src/common/resource.dto.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -249,9 +249,7 @@ export class EnhancedResource<T extends ResourceShape<any>> {
249249
return type as any;
250250
}
251251

252-
get dbFQN(): ResourceShape<any> extends T
253-
? string
254-
: DBType<T>['__element__']['__name__'] {
252+
get dbFQN(): ResourceShape<any> extends T ? string : DBName<DBType<T>> {
255253
return this.db.__element__.__name__ as any;
256254
}
257255

@@ -307,6 +305,8 @@ export type DBType<TResourceStatic extends ResourceShape<any>> =
307305
: never
308306
: never;
309307

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

src/core/resources/resources.host.ts

Lines changed: 15 additions & 3 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) {}
@@ -65,7 +70,14 @@ export class ResourcesHost {
6570
return this.getByName(name as any);
6671
}
6772

68-
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) {
6981
const fqnMap = this.edgeDBFQNMap();
7082
const resByFQN = fqnMap.get(
7183
name.includes('::') ? name : `default::${name}`,

0 commit comments

Comments
 (0)