@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.
- package/CHANGELOG.md +18 -0
- package/README.md +31 -21
- package/esm/field-builder.d.ts.map +1 -1
- package/esm/field-builder.js +14 -1
- package/esm/field-builder.js.map +1 -1
- package/esm/generator.js +16 -1
- package/esm/generator.js.map +1 -1
- package/esm/index.js +4 -4
- package/esm/index.js.map +1 -1
- package/esm/prisma-field-builder.d.ts.map +1 -1
- package/esm/prisma-field-builder.js +1 -0
- package/esm/prisma-field-builder.js.map +1 -1
- package/esm/types.d.ts +1 -0
- package/esm/types.d.ts.map +1 -1
- package/esm/util/cursors.d.ts +4 -4
- package/esm/util/cursors.d.ts.map +1 -1
- package/esm/util/cursors.js.map +1 -1
- package/esm/util/map-query.js +6 -4
- package/esm/util/map-query.js.map +1 -1
- package/lib/field-builder.d.ts.map +1 -1
- package/lib/field-builder.js +14 -1
- package/lib/field-builder.js.map +1 -1
- package/lib/generator.js +15 -0
- package/lib/generator.js.map +1 -1
- package/lib/index.js +4 -4
- package/lib/index.js.map +1 -1
- package/lib/prisma-field-builder.d.ts.map +1 -1
- package/lib/prisma-field-builder.js +1 -0
- package/lib/prisma-field-builder.js.map +1 -1
- package/lib/types.d.ts +1 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/util/cursors.d.ts +4 -4
- package/lib/util/cursors.d.ts.map +1 -1
- package/lib/util/cursors.js.map +1 -1
- package/lib/util/map-query.js +6 -4
- package/lib/util/map-query.js.map +1 -1
- package/package.json +4 -4
- package/src/field-builder.ts +19 -2
- package/src/generator.ts +22 -1
- package/src/index.ts +2 -2
- package/src/prisma-field-builder.ts +1 -0
- package/src/types.ts +6 -0
- package/src/util/cursors.ts +2 -2
- package/src/util/map-query.ts +4 -4
package/src/field-builder.ts
CHANGED
|
@@ -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
|
|
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
|
|
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<
|
package/src/util/cursors.ts
CHANGED
|
@@ -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;
|
package/src/util/map-query.ts
CHANGED
|
@@ -305,11 +305,11 @@ function createStateForType(
|
|
|
305
305
|
) {
|
|
306
306
|
const targetType = getIndirectType(type, info);
|
|
307
307
|
|
|
308
|
-
const fieldMap = targetType.extensions
|
|
308
|
+
const fieldMap = targetType.extensions?.pothosPrismaFieldMap as FieldMap;
|
|
309
309
|
|
|
310
310
|
return createState(
|
|
311
311
|
fieldMap,
|
|
312
|
-
targetType.extensions
|
|
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
|
|
320
|
+
while (targetType.extensions?.pothosPrismaIndirectInclude) {
|
|
321
321
|
targetType = info.schema.getType(
|
|
322
|
-
(targetType.extensions
|
|
322
|
+
(targetType.extensions?.pothosPrismaIndirectInclude as IndirectInclude).getType(),
|
|
323
323
|
)!;
|
|
324
324
|
}
|
|
325
325
|
|