@pothos/plugin-drizzle 0.7.1 → 0.8.0
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 +12 -0
- package/dts/drizzle-field-builder.d.ts +1 -1
- package/dts/drizzle-field-builder.d.ts.map +1 -1
- package/dts/global-types.d.ts +4 -4
- package/dts/global-types.d.ts.map +1 -1
- package/dts/types.d.ts +1 -0
- package/dts/types.d.ts.map +1 -1
- package/dts/utils/config.d.ts +1 -0
- package/dts/utils/config.d.ts.map +1 -1
- package/dts/utils/map-query.d.ts.map +1 -1
- package/dts/utils/selections.d.ts +2 -1
- package/dts/utils/selections.d.ts.map +1 -1
- package/esm/drizzle-field-builder.d.ts +2 -2
- package/esm/drizzle-field-builder.d.ts.map +1 -1
- package/esm/field-builder.js.map +1 -1
- package/esm/global-types.d.ts +5 -5
- package/esm/global-types.d.ts.map +1 -1
- package/esm/types.d.ts +1 -0
- package/esm/types.d.ts.map +1 -1
- package/esm/types.js.map +1 -1
- package/esm/utils/config.d.ts +1 -0
- package/esm/utils/config.d.ts.map +1 -1
- package/esm/utils/config.js +2 -0
- package/esm/utils/config.js.map +1 -1
- package/esm/utils/map-query.d.ts.map +1 -1
- package/esm/utils/map-query.js +35 -20
- package/esm/utils/map-query.js.map +1 -1
- package/esm/utils/selections.d.ts +2 -1
- package/esm/utils/selections.d.ts.map +1 -1
- package/esm/utils/selections.js +3 -2
- package/esm/utils/selections.js.map +1 -1
- package/lib/field-builder.js.map +1 -1
- package/lib/types.js.map +1 -1
- package/lib/utils/config.js +2 -0
- package/lib/utils/config.js.map +1 -1
- package/lib/utils/map-query.js +35 -20
- package/lib/utils/map-query.js.map +1 -1
- package/lib/utils/selections.js +3 -2
- package/lib/utils/selections.js.map +1 -1
- package/package.json +5 -5
- package/src/drizzle-field-builder.ts +2 -2
- package/src/field-builder.ts +0 -1
- package/src/global-types.ts +5 -5
- package/src/types.ts +1 -0
- package/src/utils/config.ts +2 -0
- package/src/utils/map-query.ts +65 -11
- package/src/utils/selections.ts +8 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/selections.ts"],"names":["createState","mergeSelection","mergeState","selectionCompatible","selectionToQuery","stateCompatible","state","selectionMap","ignoreQuery","Object","keys","query","length","with","withSelection","extras","columns","entries","some","key","value","has","get","resolvedExtras","table","getOperators","sql","fieldAlias","deepEqual","newState","name","relationState","allColumns","add","set","parent","Set","Map","mappings","depth","config","relation","relations","PothosValidationError","dbName","merge","dbToSchema","referencedTableName","selection","relatedState","primaryKey","forEach","sel"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../../src/utils/selections.ts"],"names":["createState","mergeSelection","mergeState","selectionCompatible","selectionToQuery","stateCompatible","state","selectionMap","ignoreQuery","Object","keys","query","length","with","withSelection","extras","columns","entries","some","key","value","has","get","resolvedExtras","table","getOperators","sql","fieldAlias","deepEqual","newState","name","relationState","allColumns","add","set","skipDeferredFragments","parent","Set","Map","mappings","depth","config","relation","relations","PothosValidationError","dbName","merge","dbToSchema","referencedTableName","selection","relatedState","primaryKey","forEach","sel"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pothos/plugin-drizzle",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "A Pothos plugin for drizzle",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"types": "./dts/index.d.ts",
|
|
@@ -46,11 +46,11 @@
|
|
|
46
46
|
"graphql-scalars": "^1.24.0",
|
|
47
47
|
"graphql-tag": "^2.12.6",
|
|
48
48
|
"postgres": "^3.4.5",
|
|
49
|
-
"@pothos/core": "4.5.0",
|
|
50
|
-
"@pothos/plugin-errors": "4.2.0",
|
|
51
49
|
"@pothos/plugin-add-graphql": "4.2.2",
|
|
52
|
-
"@pothos/plugin-
|
|
53
|
-
"@pothos/plugin-relay": "4.4.
|
|
50
|
+
"@pothos/plugin-errors": "4.2.0",
|
|
51
|
+
"@pothos/plugin-relay": "4.4.1",
|
|
52
|
+
"@pothos/plugin-scope-auth": "4.1.2",
|
|
53
|
+
"@pothos/core": "4.5.1",
|
|
54
54
|
"@pothos/plugin-with-input": "4.1.0",
|
|
55
55
|
"@pothos/test-utils": "2.1.0"
|
|
56
56
|
},
|
|
@@ -87,8 +87,8 @@ export class DrizzleObjectFieldBuilder<
|
|
|
87
87
|
Field extends ListRelation<TableConfig>,
|
|
88
88
|
Nullable extends boolean,
|
|
89
89
|
Args extends InputFieldMap,
|
|
90
|
-
ConnectionInterfaces extends InterfaceParam<Types>[] = [],
|
|
91
|
-
EdgeInterfaces extends InterfaceParam<Types>[] = [],
|
|
90
|
+
const ConnectionInterfaces extends InterfaceParam<Types>[] = [],
|
|
91
|
+
const EdgeInterfaces extends InterfaceParam<Types>[] = [],
|
|
92
92
|
>(
|
|
93
93
|
field: Field,
|
|
94
94
|
...args: NormalizeArgs<
|
package/src/field-builder.ts
CHANGED
package/src/global-types.ts
CHANGED
|
@@ -73,7 +73,7 @@ declare global {
|
|
|
73
73
|
|
|
74
74
|
export interface SchemaBuilder<Types extends SchemaTypes> {
|
|
75
75
|
drizzleObject: <
|
|
76
|
-
Interfaces extends InterfaceParam<Types>[],
|
|
76
|
+
const Interfaces extends InterfaceParam<Types>[],
|
|
77
77
|
Table extends keyof Types['DrizzleRelationSchema'],
|
|
78
78
|
Selection extends
|
|
79
79
|
| DBQueryConfig<
|
|
@@ -94,7 +94,7 @@ declare global {
|
|
|
94
94
|
) => DrizzleObjectRef<Types, Table, Shape>;
|
|
95
95
|
|
|
96
96
|
drizzleInterface: <
|
|
97
|
-
Interfaces extends InterfaceParam<Types>[],
|
|
97
|
+
const Interfaces extends InterfaceParam<Types>[],
|
|
98
98
|
Table extends keyof Types['DrizzleRelationSchema'],
|
|
99
99
|
Selection extends
|
|
100
100
|
| DBQueryConfig<
|
|
@@ -116,7 +116,7 @@ declare global {
|
|
|
116
116
|
|
|
117
117
|
drizzleNode: 'relay' extends PluginName
|
|
118
118
|
? <
|
|
119
|
-
Interfaces extends InterfaceParam<Types>[],
|
|
119
|
+
const Interfaces extends InterfaceParam<Types>[],
|
|
120
120
|
Table extends keyof Types['DrizzleRelationSchema'],
|
|
121
121
|
Selection extends
|
|
122
122
|
| DBQueryConfig<
|
|
@@ -359,8 +359,8 @@ declare global {
|
|
|
359
359
|
Types['DrizzleRelationSchema'][Type & keyof Types['DrizzleRelationSchema']],
|
|
360
360
|
true
|
|
361
361
|
>,
|
|
362
|
-
ConnectionInterfaces extends InterfaceParam<Types>[] = [],
|
|
363
|
-
EdgeInterfaces extends InterfaceParam<Types>[] = [],
|
|
362
|
+
const ConnectionInterfaces extends InterfaceParam<Types>[] = [],
|
|
363
|
+
const EdgeInterfaces extends InterfaceParam<Types>[] = [],
|
|
364
364
|
>(
|
|
365
365
|
options: DrizzleConnectionFieldOptions<
|
|
366
366
|
Types,
|
package/src/types.ts
CHANGED
package/src/utils/config.ts
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
import type { DrizzleClient } from '../types';
|
|
12
12
|
|
|
13
13
|
export interface PothosDrizzleSchemaConfig extends RelationalSchemaConfig<TablesRelationalConfig> {
|
|
14
|
+
skipDeferredFragments: boolean;
|
|
14
15
|
dbToSchema: Record<string, TableRelationalConfig>;
|
|
15
16
|
columnToTsName: (column: Column) => string;
|
|
16
17
|
}
|
|
@@ -55,6 +56,7 @@ const configCache = createContextCache(
|
|
|
55
56
|
);
|
|
56
57
|
|
|
57
58
|
return {
|
|
59
|
+
skipDeferredFragments: builder.options.drizzle.skipDeferredFragments ?? true,
|
|
58
60
|
dbToSchema,
|
|
59
61
|
columnToTsName: (column) => {
|
|
60
62
|
const tableName = getTableName(column.table);
|
package/src/utils/map-query.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { DBQueryConfig, TableRelationalConfig } from 'drizzle-orm';
|
|
|
3
3
|
import {
|
|
4
4
|
type FieldNode,
|
|
5
5
|
type FragmentDefinitionNode,
|
|
6
|
+
type FragmentSpreadNode,
|
|
6
7
|
type GraphQLField,
|
|
7
8
|
GraphQLIncludeDirective,
|
|
8
9
|
type GraphQLInterfaceType,
|
|
@@ -45,6 +46,7 @@ function addTypeSelectionsForField(
|
|
|
45
46
|
state: SelectionState,
|
|
46
47
|
selection: FieldNode,
|
|
47
48
|
indirectPath: string[],
|
|
49
|
+
deferred?: boolean,
|
|
48
50
|
) {
|
|
49
51
|
if (selection.name.value.startsWith('__')) {
|
|
50
52
|
return;
|
|
@@ -67,8 +69,18 @@ function addTypeSelectionsForField(
|
|
|
67
69
|
pothosIndirectInclude.paths ?? [pothosIndirectInclude.path!],
|
|
68
70
|
indirectPath,
|
|
69
71
|
(resolvedType, field, path) => {
|
|
70
|
-
addTypeSelectionsForField(
|
|
72
|
+
addTypeSelectionsForField(
|
|
73
|
+
config,
|
|
74
|
+
resolvedType,
|
|
75
|
+
context,
|
|
76
|
+
info,
|
|
77
|
+
state,
|
|
78
|
+
field,
|
|
79
|
+
path,
|
|
80
|
+
deferred,
|
|
81
|
+
);
|
|
71
82
|
},
|
|
83
|
+
deferred,
|
|
72
84
|
);
|
|
73
85
|
} else if (pothosIndirectInclude) {
|
|
74
86
|
addTypeSelectionsForField(
|
|
@@ -79,6 +91,7 @@ function addTypeSelectionsForField(
|
|
|
79
91
|
state,
|
|
80
92
|
selection,
|
|
81
93
|
indirectPath,
|
|
94
|
+
deferred,
|
|
82
95
|
);
|
|
83
96
|
return;
|
|
84
97
|
}
|
|
@@ -91,7 +104,7 @@ function addTypeSelectionsForField(
|
|
|
91
104
|
mergeSelection(config, state, { ...pothosDrizzleSelect });
|
|
92
105
|
}
|
|
93
106
|
|
|
94
|
-
if (selection.selectionSet) {
|
|
107
|
+
if (selection.selectionSet && (!deferred || !state.skipDeferredFragments)) {
|
|
95
108
|
addNestedSelections(config, type, context, info, state, selection.selectionSet, indirectPath);
|
|
96
109
|
}
|
|
97
110
|
}
|
|
@@ -103,13 +116,22 @@ function resolveIndirectIncludePaths(
|
|
|
103
116
|
pathPrefix: { type?: string; name: string }[],
|
|
104
117
|
includePaths: { type?: string; name: string }[][],
|
|
105
118
|
path: string[],
|
|
106
|
-
resolve: (type: GraphQLNamedType, field: FieldNode, path: string[]) => void,
|
|
119
|
+
resolve: (type: GraphQLNamedType, field: FieldNode, path: string[], deferred: boolean) => void,
|
|
120
|
+
deferred?: boolean,
|
|
107
121
|
) {
|
|
108
122
|
for (const includePath of includePaths) {
|
|
109
123
|
if (pathPrefix.length > 0) {
|
|
110
|
-
resolveIndirectInclude(
|
|
124
|
+
resolveIndirectInclude(
|
|
125
|
+
type,
|
|
126
|
+
info,
|
|
127
|
+
selection,
|
|
128
|
+
[...pathPrefix, ...includePath],
|
|
129
|
+
path,
|
|
130
|
+
resolve,
|
|
131
|
+
deferred,
|
|
132
|
+
);
|
|
111
133
|
} else {
|
|
112
|
-
resolveIndirectInclude(type, info, selection, includePath, path, resolve);
|
|
134
|
+
resolveIndirectInclude(type, info, selection, includePath, path, resolve, deferred);
|
|
113
135
|
}
|
|
114
136
|
}
|
|
115
137
|
}
|
|
@@ -120,10 +142,11 @@ function resolveIndirectInclude(
|
|
|
120
142
|
selection: FieldNode | FragmentDefinitionNode | InlineFragmentNode,
|
|
121
143
|
includePath: { type?: string; name: string }[],
|
|
122
144
|
path: string[],
|
|
123
|
-
resolve: (type: GraphQLNamedType, field: FieldNode, path: string[]) => void,
|
|
145
|
+
resolve: (type: GraphQLNamedType, field: FieldNode, path: string[], deferred: boolean) => void,
|
|
146
|
+
deferred = false,
|
|
124
147
|
) {
|
|
125
148
|
if (includePath.length === 0) {
|
|
126
|
-
resolve(type, selection as FieldNode, path);
|
|
149
|
+
resolve(type, selection as FieldNode, path, deferred);
|
|
127
150
|
return;
|
|
128
151
|
}
|
|
129
152
|
|
|
@@ -149,6 +172,7 @@ function resolveIndirectInclude(
|
|
|
149
172
|
rest,
|
|
150
173
|
[...path, sel.alias?.value ?? sel.name.value],
|
|
151
174
|
resolve,
|
|
175
|
+
deferred,
|
|
152
176
|
);
|
|
153
177
|
}
|
|
154
178
|
continue;
|
|
@@ -164,6 +188,7 @@ function resolveIndirectInclude(
|
|
|
164
188
|
includePath,
|
|
165
189
|
path,
|
|
166
190
|
resolve,
|
|
191
|
+
deferred || isDeferredFragment(sel, info),
|
|
167
192
|
);
|
|
168
193
|
}
|
|
169
194
|
|
|
@@ -178,6 +203,7 @@ function resolveIndirectInclude(
|
|
|
178
203
|
includePath,
|
|
179
204
|
path,
|
|
180
205
|
resolve,
|
|
206
|
+
deferred || isDeferredFragment(sel, info),
|
|
181
207
|
);
|
|
182
208
|
}
|
|
183
209
|
|
|
@@ -208,6 +234,10 @@ function addNestedSelections(
|
|
|
208
234
|
|
|
209
235
|
continue;
|
|
210
236
|
case Kind.FRAGMENT_SPREAD:
|
|
237
|
+
if (state.skipDeferredFragments && isDeferredFragment(selection, info)) {
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
|
|
211
241
|
parentType = info.schema.getType(
|
|
212
242
|
info.fragments[selection.name.value].typeCondition.name.value,
|
|
213
243
|
)! as GraphQLObjectType;
|
|
@@ -232,6 +262,10 @@ function addNestedSelections(
|
|
|
232
262
|
continue;
|
|
233
263
|
|
|
234
264
|
case Kind.INLINE_FRAGMENT:
|
|
265
|
+
if (state.skipDeferredFragments && isDeferredFragment(selection, info)) {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
|
|
235
269
|
parentType = selection.typeCondition
|
|
236
270
|
? (info.schema.getType(selection.typeCondition.name.value) as GraphQLObjectType)
|
|
237
271
|
: type;
|
|
@@ -325,7 +359,7 @@ function addFieldSelection(
|
|
|
325
359
|
(returnType.extensions?.pothosIndirectInclude as { path: [] })?.path ?? [],
|
|
326
360
|
normalizedIndirectInclude.paths ?? [normalizedIndirectInclude.path!],
|
|
327
361
|
[],
|
|
328
|
-
(resolvedType, resolvedField, path) => {
|
|
362
|
+
(resolvedType, resolvedField, path, deferred) => {
|
|
329
363
|
addTypeSelectionsForField(
|
|
330
364
|
config,
|
|
331
365
|
resolvedType,
|
|
@@ -334,6 +368,7 @@ function addFieldSelection(
|
|
|
334
368
|
fieldState,
|
|
335
369
|
resolvedField,
|
|
336
370
|
path,
|
|
371
|
+
deferred,
|
|
337
372
|
);
|
|
338
373
|
},
|
|
339
374
|
);
|
|
@@ -424,7 +459,7 @@ export function stateFromInfo<T extends SelectionMap>({
|
|
|
424
459
|
info.fieldNodes[0],
|
|
425
460
|
pothosIndirectInclude?.path ?? [],
|
|
426
461
|
[],
|
|
427
|
-
(indirectType, indirectField, subPath) => {
|
|
462
|
+
(indirectType, indirectField, subPath, deferred) => {
|
|
428
463
|
resolveIndirectIncludePaths(
|
|
429
464
|
indirectType,
|
|
430
465
|
info,
|
|
@@ -434,7 +469,7 @@ export function stateFromInfo<T extends SelectionMap>({
|
|
|
434
469
|
? paths.map((p) => p.map((n) => (typeof n === 'string' ? { name: n } : n)))
|
|
435
470
|
: [path.map((n) => (typeof n === 'string' ? { name: n } : n))],
|
|
436
471
|
subPath,
|
|
437
|
-
(resolvedType, resolvedField, nested) => {
|
|
472
|
+
(resolvedType, resolvedField, nested, deferred) => {
|
|
438
473
|
state = createStateForSelection(config, info, resolvedType, undefined, select);
|
|
439
474
|
|
|
440
475
|
addTypeSelectionsForField(
|
|
@@ -445,8 +480,10 @@ export function stateFromInfo<T extends SelectionMap>({
|
|
|
445
480
|
state,
|
|
446
481
|
resolvedField,
|
|
447
482
|
nested,
|
|
483
|
+
deferred,
|
|
448
484
|
);
|
|
449
485
|
},
|
|
486
|
+
deferred,
|
|
450
487
|
);
|
|
451
488
|
},
|
|
452
489
|
);
|
|
@@ -500,7 +537,11 @@ function createStateForSelection(
|
|
|
500
537
|
throw new PothosValidationError(`Expected ${targetType.name} to have a table config`);
|
|
501
538
|
}
|
|
502
539
|
|
|
503
|
-
const state = createState(
|
|
540
|
+
const state = createState(
|
|
541
|
+
pothosDrizzleTable,
|
|
542
|
+
parent?.skipDeferredFragments ?? config.skipDeferredFragments,
|
|
543
|
+
parent,
|
|
544
|
+
);
|
|
504
545
|
|
|
505
546
|
if (initialSelections) {
|
|
506
547
|
mergeSelection(config, state, initialSelections);
|
|
@@ -571,3 +612,16 @@ function fieldSkipped(info: GraphQLResolveInfo, selection: FieldNode) {
|
|
|
571
612
|
|
|
572
613
|
return false;
|
|
573
614
|
}
|
|
615
|
+
|
|
616
|
+
function isDeferredFragment(
|
|
617
|
+
node: FragmentSpreadNode | InlineFragmentNode,
|
|
618
|
+
info: GraphQLResolveInfo,
|
|
619
|
+
) {
|
|
620
|
+
const deferDirective = info.schema.getDirective('defer');
|
|
621
|
+
if (!deferDirective) {
|
|
622
|
+
return false;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
const defer = getDirectiveValues(deferDirective, node, info.variableValues);
|
|
626
|
+
return !!defer && defer.if !== false;
|
|
627
|
+
}
|
package/src/utils/selections.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { PothosValidationError } from '@pothos/core';
|
|
2
2
|
import {
|
|
3
3
|
type DBQueryConfig,
|
|
4
|
-
RelationalSchemaConfig,
|
|
5
4
|
type SQL,
|
|
6
5
|
type TableRelationalConfig,
|
|
7
|
-
TablesRelationalConfig,
|
|
8
6
|
getOperators,
|
|
9
7
|
} from 'drizzle-orm';
|
|
10
8
|
import type { PothosDrizzleSchemaConfig } from './config';
|
|
@@ -21,6 +19,7 @@ export interface SelectionState {
|
|
|
21
19
|
mappings: LoaderMappings;
|
|
22
20
|
parent?: SelectionState;
|
|
23
21
|
depth: number;
|
|
22
|
+
skipDeferredFragments: boolean;
|
|
24
23
|
}
|
|
25
24
|
|
|
26
25
|
export type SelectionMap = DBQueryConfig<'one', false>;
|
|
@@ -102,9 +101,14 @@ export function mergeState(state: SelectionState, newState: SelectionState) {
|
|
|
102
101
|
}
|
|
103
102
|
}
|
|
104
103
|
|
|
105
|
-
export function createState(
|
|
104
|
+
export function createState(
|
|
105
|
+
table: TableRelationalConfig,
|
|
106
|
+
skipDeferredFragments: boolean,
|
|
107
|
+
parent?: SelectionState,
|
|
108
|
+
): SelectionState {
|
|
106
109
|
return {
|
|
107
110
|
table,
|
|
111
|
+
skipDeferredFragments,
|
|
108
112
|
parent,
|
|
109
113
|
query: {},
|
|
110
114
|
columns: new Set(),
|
|
@@ -168,7 +172,7 @@ export function mergeSelection(
|
|
|
168
172
|
if (state.with.has(key)) {
|
|
169
173
|
mergeSelection(config, state.with.get(key)!, selection);
|
|
170
174
|
} else {
|
|
171
|
-
const relatedState = createState(table, state);
|
|
175
|
+
const relatedState = createState(table, state.skipDeferredFragments, state);
|
|
172
176
|
mergeSelection(config, relatedState, selection);
|
|
173
177
|
state.with.set(key, relatedState);
|
|
174
178
|
}
|