@pothos/plugin-prisma 3.0.0 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +31 -21
  3. package/esm/field-builder.d.ts.map +1 -1
  4. package/esm/field-builder.js +14 -1
  5. package/esm/field-builder.js.map +1 -1
  6. package/esm/generator.js +16 -1
  7. package/esm/generator.js.map +1 -1
  8. package/esm/index.js +4 -4
  9. package/esm/index.js.map +1 -1
  10. package/esm/prisma-field-builder.d.ts.map +1 -1
  11. package/esm/prisma-field-builder.js +1 -0
  12. package/esm/prisma-field-builder.js.map +1 -1
  13. package/esm/types.d.ts +1 -0
  14. package/esm/types.d.ts.map +1 -1
  15. package/esm/util/cursors.d.ts +4 -4
  16. package/esm/util/cursors.d.ts.map +1 -1
  17. package/esm/util/cursors.js.map +1 -1
  18. package/esm/util/map-query.js +6 -4
  19. package/esm/util/map-query.js.map +1 -1
  20. package/lib/field-builder.d.ts.map +1 -1
  21. package/lib/field-builder.js +14 -1
  22. package/lib/field-builder.js.map +1 -1
  23. package/lib/generator.js +15 -0
  24. package/lib/generator.js.map +1 -1
  25. package/lib/index.js +4 -4
  26. package/lib/index.js.map +1 -1
  27. package/lib/prisma-field-builder.d.ts.map +1 -1
  28. package/lib/prisma-field-builder.js +1 -0
  29. package/lib/prisma-field-builder.js.map +1 -1
  30. package/lib/types.d.ts +1 -0
  31. package/lib/types.d.ts.map +1 -1
  32. package/lib/util/cursors.d.ts +4 -4
  33. package/lib/util/cursors.d.ts.map +1 -1
  34. package/lib/util/cursors.js.map +1 -1
  35. package/lib/util/map-query.js +6 -4
  36. package/lib/util/map-query.js.map +1 -1
  37. package/package.json +4 -4
  38. package/src/field-builder.ts +19 -2
  39. package/src/generator.ts +22 -1
  40. package/src/index.ts +2 -2
  41. package/src/prisma-field-builder.ts +1 -0
  42. package/src/types.ts +6 -0
  43. package/src/util/cursors.ts +2 -2
  44. package/src/util/map-query.ts +4 -4
@@ -3,6 +3,7 @@ import {
3
3
  FieldKind,
4
4
  FieldRef,
5
5
  InputFieldMap,
6
+ MaybePromise,
6
7
  ObjectRef,
7
8
  RootFieldBuilder,
8
9
  SchemaTypes,
@@ -53,6 +54,7 @@ fieldBuilderProto.prismaConnection = function prismaConnection<
53
54
  maxSize,
54
55
  defaultSize,
55
56
  resolve,
57
+ totalCount,
56
58
  ...options
57
59
  }: PrismaConnectionFieldOptions<
58
60
  SchemaTypes,
@@ -65,8 +67,8 @@ fieldBuilderProto.prismaConnection = function prismaConnection<
65
67
  ResolveReturnShape,
66
68
  FieldKind
67
69
  >,
68
- connectionOptions: {},
69
- edgeOptions: {},
70
+ connectionOptions: {} = {},
71
+ edgeOptions: {} = {},
70
72
  ) {
71
73
  const ref = typeof type === 'string' ? getRefFromModel(type, this.builder) : type;
72
74
  const typeName = this.builder.configStore.getTypeConfig(ref).name;
@@ -95,6 +97,7 @@ fieldBuilderProto.prismaConnection = function prismaConnection<
95
97
  maxSize,
96
98
  defaultSize,
97
99
  args,
100
+ totalCount: totalCount && (() => totalCount(parent, args as never, ctx, info)),
98
101
  },
99
102
  formatCursor,
100
103
  (query) => resolve(query as never, parent, args as never, ctx, info),
@@ -102,6 +105,20 @@ fieldBuilderProto.prismaConnection = function prismaConnection<
102
105
  },
103
106
  {
104
107
  ...connectionOptions,
108
+ fields: totalCount
109
+ ? (
110
+ t: PothosSchemaTypes.ObjectFieldBuilder<
111
+ SchemaTypes,
112
+ { totalCount?: () => MaybePromise<number> }
113
+ >,
114
+ ) => ({
115
+ totalCount: t.int({
116
+ nullable: false,
117
+ resolve: (parent, args, context) => parent.totalCount?.(),
118
+ }),
119
+ ...(connectionOptions as { fields?: (t: unknown) => {} }).fields?.(t),
120
+ })
121
+ : (connectionOptions as { fields: undefined }).fields,
105
122
  extensions: {
106
123
  ...(connectionOptions as Record<string, {}> | undefined)?.extensions,
107
124
  pothosPrismaIndirectInclude: {
package/src/generator.ts CHANGED
@@ -1,9 +1,29 @@
1
+ /* eslint-disable no-magic-numbers */
1
2
  /* eslint-disable no-nested-ternary */
2
3
  import { mkdir, writeFile } from 'fs';
3
4
  import { dirname } from 'path';
4
- import ts, { ListFormat, ScriptKind, ScriptTarget, SyntaxKind } from 'typescript';
5
+ import ts, { ListFormat, ScriptKind, ScriptTarget, SyntaxKind, version } from 'typescript';
5
6
  import { generatorHandler } from '@prisma/generator-helper';
6
7
 
8
+ const MIN_TS_VERSION = [4, 5, 2];
9
+
10
+ function checkTSVersion() {
11
+ const versionParts = version.split(/[.-]/g);
12
+
13
+ for (let i = 0; i < 3; i += 1) {
14
+ const part = Number.parseInt(versionParts[i], 10);
15
+ if (part < MIN_TS_VERSION[i]) {
16
+ throw new Error(
17
+ `@pothos/plugin-prisma requires typescript version >${MIN_TS_VERSION.join('.')}`,
18
+ );
19
+ }
20
+
21
+ if (part > MIN_TS_VERSION[i]) {
22
+ return;
23
+ }
24
+ }
25
+ }
26
+
7
27
  generatorHandler({
8
28
  onManifest: () => ({
9
29
  prettyName: 'Pothos integration',
@@ -11,6 +31,7 @@ generatorHandler({
11
31
  requiresGenerators: ['prisma-client-js'],
12
32
  }),
13
33
  onGenerate: async (options) => {
34
+ checkTSVersion();
14
35
  const config = options.generator.config as { clientOutput?: string };
15
36
  const prismaLocation =
16
37
  config.clientOutput ??
package/src/index.ts CHANGED
@@ -48,14 +48,14 @@ export class PrismaPlugin<Types extends SchemaTypes> extends BasePlugin<Types> {
48
48
  }
49
49
 
50
50
  const parentConfig = this.buildCache.getTypeConfig(fieldConfig.parentType, 'Object');
51
- const loadedCheck = fieldConfig.extensions.pothosPrismaLoaded as
51
+ const loadedCheck = fieldConfig.extensions?.pothosPrismaLoaded as
52
52
  | undefined
53
53
  | ((val: unknown) => boolean);
54
54
  const loaderCache = parentConfig.extensions?.pothosPrismaLoader as (
55
55
  model: unknown,
56
56
  ) => ModelLoader;
57
57
 
58
- const fallback = fieldConfig.extensions.pothosPrismaFallback as
58
+ const fallback = fieldConfig.extensions?.pothosPrismaFallback as
59
59
  | undefined
60
60
  | ((query: {}, parent: unknown, args: {}, context: {}, info: {}) => unknown);
61
61
 
@@ -206,6 +206,7 @@ export class PrismaObjectFieldBuilder<
206
206
  fields: totalCount
207
207
  ? (t: PothosSchemaTypes.ObjectFieldBuilder<SchemaTypes, { totalCount?: number }>) => ({
208
208
  totalCount: t.int({
209
+ nullable: false,
209
210
  extensions: {
210
211
  pothosPrismaParentSelect: { _count: { select: { [name]: true } } },
211
212
  },
package/src/types.ts CHANGED
@@ -443,6 +443,12 @@ export type PrismaConnectionFieldOptions<
443
443
  context: Types['Context'],
444
444
  info: GraphQLResolveInfo,
445
445
  ) => MaybePromise<Model['Shape'][]>;
446
+ totalCount?: (
447
+ parent: ParentShape,
448
+ args: InputShapeFromFields<Args> & PothosSchemaTypes.DefaultConnectionArguments,
449
+ context: Types['Context'],
450
+ info: GraphQLResolveInfo,
451
+ ) => MaybePromise<number>;
446
452
  };
447
453
 
448
454
  export type RelatedConnectionOptions<
@@ -84,7 +84,7 @@ export interface PrismaCursorConnectionQueryOptions {
84
84
 
85
85
  interface ResolvePrismaCursorConnectionOptions extends PrismaCursorConnectionQueryOptions {
86
86
  query: {};
87
- totalCount?: number;
87
+ totalCount?: number | (() => MaybePromise<number>);
88
88
  }
89
89
 
90
90
  export function prismaCursorConnectionQuery({
@@ -139,7 +139,7 @@ export function wrapConnectionResult<T extends {}>(
139
139
  args: PothosSchemaTypes.DefaultConnectionArguments,
140
140
  take: number,
141
141
  cursor: (node: T) => string,
142
- totalCount?: number,
142
+ totalCount?: number | (() => MaybePromise<number>),
143
143
  ) {
144
144
  const gotFullResults = results.length === Math.abs(take);
145
145
  const hasNextPage = args.before ? true : gotFullResults;
@@ -305,11 +305,11 @@ function createStateForType(
305
305
  ) {
306
306
  const targetType = getIndirectType(type, info);
307
307
 
308
- const fieldMap = targetType.extensions.pothosPrismaFieldMap as FieldMap;
308
+ const fieldMap = targetType.extensions?.pothosPrismaFieldMap as FieldMap;
309
309
 
310
310
  return createState(
311
311
  fieldMap,
312
- targetType.extensions.pothosPrismaSelect ? 'select' : 'include',
312
+ targetType.extensions?.pothosPrismaSelect ? 'select' : 'include',
313
313
  parent,
314
314
  );
315
315
  }
@@ -317,9 +317,9 @@ function createStateForType(
317
317
  export function getIndirectType(type: GraphQLNamedType, info: GraphQLResolveInfo) {
318
318
  let targetType = type;
319
319
 
320
- while (targetType.extensions.pothosPrismaIndirectInclude) {
320
+ while (targetType.extensions?.pothosPrismaIndirectInclude) {
321
321
  targetType = info.schema.getType(
322
- (targetType.extensions.pothosPrismaIndirectInclude as IndirectInclude).getType(),
322
+ (targetType.extensions?.pothosPrismaIndirectInclude as IndirectInclude).getType(),
323
323
  )!;
324
324
  }
325
325