feat: prisma typed select (#347)

* feat: wip prisma gql select

* feat: stronger api using decorator

* feat: add PrismaSelect everywhere

* fix: remove unused

* fix: remove seed debug
This commit is contained in:
Jérémy M
2023-06-22 11:17:31 +02:00
committed by GitHub
parent eb9be6894e
commit ca283a2196
35 changed files with 1081 additions and 578 deletions

View File

@ -0,0 +1,56 @@
import { PrismaSelect as PalJSPrismaSelect } from '@paljs/plugins';
import { DMMF } from '@prisma/client/runtime';
import { GraphQLResolveInfo } from 'graphql';
import { ModelSelectMap } from './model-select-map';
export type DefaultFieldsMap = {
readonly [K in keyof ModelSelectMap]?:
| ModelSelectMap[K]
| ((select: any) => ModelSelectMap[K]);
};
export { ModelSelectMap };
export class PrismaSelect<
K extends keyof ModelSelectMap,
> extends PalJSPrismaSelect {
private modelName: K;
constructor(
modelName: K,
info: GraphQLResolveInfo,
options?: {
readonly defaultFields?: DefaultFieldsMap;
readonly dmmf?: readonly Pick<DMMF.Document, 'datamodel'>[];
},
) {
super(info, options as any);
this.modelName = modelName;
}
get value(): ModelSelectMap[K] {
return super.value;
}
valueOf(field: string, mergeObject?: any): ModelSelectMap[K];
valueOf<SubKey extends keyof ModelSelectMap>(
field: string,
filterBy: SubKey,
mergeObject?: any,
): ModelSelectMap[SubKey];
valueOf(
field: string,
filterByOrMergeObject?: keyof ModelSelectMap | any,
mergeObject?: any,
) {
if (typeof filterByOrMergeObject === 'string') {
return super.valueOf(field, filterByOrMergeObject, mergeObject);
} else {
return super.valueOf(field, this.modelName, filterByOrMergeObject);
}
}
valueWithFilter(modelName: K): ModelSelectMap[K] {
return super.valueWithFilter(modelName).select;
}
}

View File

@ -0,0 +1,17 @@
// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
import { Prisma } from '@prisma/client';
export type ModelSelectMap = {
User: Prisma.UserSelect;
Workspace: Prisma.WorkspaceSelect;
WorkspaceMember: Prisma.WorkspaceMemberSelect;
Company: Prisma.CompanySelect;
Person: Prisma.PersonSelect;
RefreshToken: Prisma.RefreshTokenSelect;
CommentThread: Prisma.CommentThreadSelect;
Comment: Prisma.CommentSelect;
CommentThreadTarget: Prisma.CommentThreadTargetSelect;
Pipeline: Prisma.PipelineSelect;
PipelineStage: Prisma.PipelineStageSelect;
PipelineProgress: Prisma.PipelineProgressSelect;
};