@pothos/plugin-drizzle 0.8.1 → 0.9.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 +92 -0
- package/TODO.md +25 -4
- package/dts/connection-helpers.d.ts +32 -0
- package/dts/connection-helpers.d.ts.map +1 -0
- package/dts/drizzle-field-builder.d.ts +18 -53
- package/dts/drizzle-field-builder.d.ts.map +1 -1
- package/dts/global-types.d.ts +22 -41
- package/dts/global-types.d.ts.map +1 -1
- package/dts/index.d.ts +4 -2
- package/dts/index.d.ts.map +1 -1
- package/dts/interface-ref.d.ts +3 -2
- package/dts/interface-ref.d.ts.map +1 -1
- package/dts/model-loader.d.ts +3 -2
- package/dts/model-loader.d.ts.map +1 -1
- package/dts/node-ref.d.ts +1 -1
- package/dts/node-ref.d.ts.map +1 -1
- package/dts/object-ref.d.ts +2 -2
- package/dts/object-ref.d.ts.map +1 -1
- package/dts/types.d.ts +61 -41
- package/dts/types.d.ts.map +1 -1
- package/dts/utils/config.d.ts +4 -3
- package/dts/utils/config.d.ts.map +1 -1
- package/dts/utils/cursors.d.ts +13 -7
- package/dts/utils/cursors.d.ts.map +1 -1
- package/dts/utils/drizzle-graphql.d.ts +0 -17
- package/dts/utils/drizzle-graphql.d.ts.map +1 -1
- package/dts/utils/map-query.d.ts.map +1 -1
- package/dts/utils/selections.d.ts +5 -5
- package/dts/utils/selections.d.ts.map +1 -1
- package/esm/connection-helpers.d.ts +34 -0
- package/esm/connection-helpers.d.ts.map +1 -0
- package/esm/connection-helpers.js +74 -0
- package/esm/connection-helpers.js.map +1 -0
- package/esm/drizzle-field-builder.d.ts +18 -73
- package/esm/drizzle-field-builder.d.ts.map +1 -1
- package/esm/drizzle-field-builder.js +25 -14
- package/esm/drizzle-field-builder.js.map +1 -1
- package/esm/field-builder.js +2 -3
- package/esm/field-builder.js.map +1 -1
- package/esm/global-types.d.ts +35 -60
- package/esm/global-types.d.ts.map +1 -1
- package/esm/global-types.js.map +1 -1
- package/esm/index.d.ts +4 -2
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +70 -61
- package/esm/index.js.map +1 -1
- package/esm/interface-ref.d.ts +3 -2
- package/esm/interface-ref.d.ts.map +1 -1
- package/esm/interface-ref.js.map +1 -1
- package/esm/model-loader.d.ts +3 -2
- package/esm/model-loader.d.ts.map +1 -1
- package/esm/model-loader.js +17 -10
- package/esm/model-loader.js.map +1 -1
- package/esm/node-ref.d.ts +1 -1
- package/esm/node-ref.d.ts.map +1 -1
- package/esm/object-ref.d.ts +2 -2
- package/esm/object-ref.d.ts.map +1 -1
- package/esm/schema-builder.js +111 -65
- package/esm/schema-builder.js.map +1 -1
- package/esm/types.d.ts +61 -41
- package/esm/types.d.ts.map +1 -1
- package/esm/types.js.map +1 -1
- package/esm/utils/config.d.ts +4 -3
- package/esm/utils/config.d.ts.map +1 -1
- package/esm/utils/config.js +32 -15
- package/esm/utils/config.js.map +1 -1
- package/esm/utils/cursors.d.ts +13 -7
- package/esm/utils/cursors.d.ts.map +1 -1
- package/esm/utils/cursors.js +137 -63
- package/esm/utils/cursors.js.map +1 -1
- package/esm/utils/drizzle-graphql.d.ts +0 -17
- package/esm/utils/drizzle-graphql.d.ts.map +1 -1
- package/esm/utils/drizzle-graphql.js +230 -198
- package/esm/utils/drizzle-graphql.js.map +1 -1
- package/esm/utils/map-query.d.ts.map +1 -1
- package/esm/utils/map-query.js +9 -5
- package/esm/utils/map-query.js.map +1 -1
- package/esm/utils/selections.d.ts +5 -5
- package/esm/utils/selections.d.ts.map +1 -1
- package/esm/utils/selections.js +19 -18
- package/esm/utils/selections.js.map +1 -1
- package/lib/connection-helpers.js +85 -0
- package/lib/connection-helpers.js.map +1 -0
- package/lib/drizzle-field-builder.js +24 -13
- package/lib/drizzle-field-builder.js.map +1 -1
- package/lib/field-builder.js +2 -3
- package/lib/field-builder.js.map +1 -1
- package/lib/index.js +75 -60
- package/lib/index.js.map +1 -1
- package/lib/interface-ref.js.map +1 -1
- package/lib/model-loader.js +17 -10
- package/lib/model-loader.js.map +1 -1
- package/lib/schema-builder.js +111 -65
- package/lib/schema-builder.js.map +1 -1
- package/lib/types.js.map +1 -1
- package/lib/utils/config.js +31 -14
- package/lib/utils/config.js.map +1 -1
- package/lib/utils/cursors.js +135 -63
- package/lib/utils/cursors.js.map +1 -1
- package/lib/utils/drizzle-graphql.js +230 -221
- package/lib/utils/drizzle-graphql.js.map +1 -1
- package/lib/utils/map-query.js +9 -5
- package/lib/utils/map-query.js.map +1 -1
- package/lib/utils/selections.js +18 -17
- package/lib/utils/selections.js.map +1 -1
- package/package.json +14 -14
- package/src/connection-helpers.ts +184 -0
- package/src/drizzle-field-builder.ts +30 -26
- package/src/field-builder.ts +4 -7
- package/src/global-types.ts +112 -119
- package/src/index.ts +90 -68
- package/src/interface-ref.ts +7 -3
- package/src/model-loader.ts +32 -17
- package/src/node-ref.ts +1 -1
- package/src/object-ref.ts +2 -2
- package/src/schema-builder.ts +114 -111
- package/src/types.ts +95 -62
- package/src/utils/config.ts +39 -30
- package/src/utils/cursors.ts +134 -101
- package/src/utils/drizzle-graphql.ts +273 -274
- package/src/utils/map-query.ts +19 -7
- package/src/utils/selections.ts +34 -28
package/lib/utils/selections.js
CHANGED
|
@@ -40,10 +40,9 @@ function selectionCompatible(state, selectionMap, ignoreQuery = false) {
|
|
|
40
40
|
!selectionCompatible(state.with.get(key), value))) {
|
|
41
41
|
return false;
|
|
42
42
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return sql && (sql.sql !== value.sql || sql.fieldAlias !== value.fieldAlias);
|
|
43
|
+
if (extras && Object.entries(extras).some(([key, value])=>{
|
|
44
|
+
const existing = state.extras.get(key);
|
|
45
|
+
return existing && existing !== value;
|
|
47
46
|
})) {
|
|
48
47
|
return false;
|
|
49
48
|
}
|
|
@@ -90,22 +89,24 @@ function createState(table, skipDeferredFragments, parent) {
|
|
|
90
89
|
depth: parent ? parent.depth + 1 : 0
|
|
91
90
|
};
|
|
92
91
|
}
|
|
93
|
-
function mergeSelection(config, state,
|
|
92
|
+
function mergeSelection(config, state, selection) {
|
|
93
|
+
const { with: withSelection, extras, columns, ...query } = typeof selection === 'boolean' ? {} : selection;
|
|
94
94
|
if (withSelection) {
|
|
95
95
|
for (const [key, value] of Object.entries(withSelection)){
|
|
96
96
|
const relation = state.table.relations[key];
|
|
97
97
|
if (!relation) {
|
|
98
98
|
throw new _core.PothosValidationError(`Relation ${key} does not exist on ${state.table.dbName}`);
|
|
99
99
|
}
|
|
100
|
-
|
|
100
|
+
const tableUniqueName = (0, _drizzleorm.getTableUniqueName)(relation.targetTable);
|
|
101
|
+
const tableName = config.relations.tableNamesMap[tableUniqueName];
|
|
102
|
+
merge(config.relations.tablesConfig[tableName], key, value);
|
|
101
103
|
}
|
|
102
104
|
}
|
|
103
105
|
if (Object.keys(query).length > 0) {
|
|
104
106
|
state.query = query;
|
|
105
107
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
for (const [key, value] of Object.entries(resolvedExtras)){
|
|
108
|
+
if (extras) {
|
|
109
|
+
for (const [key, value] of Object.entries(extras)){
|
|
109
110
|
state.extras.set(key, value);
|
|
110
111
|
}
|
|
111
112
|
}
|
|
@@ -116,24 +117,23 @@ function mergeSelection(config, state, { with: withSelection, extras, columns, .
|
|
|
116
117
|
for (const key of Object.keys(columns)){
|
|
117
118
|
state.columns.add(key);
|
|
118
119
|
}
|
|
119
|
-
} else {
|
|
120
|
+
} else if (selection === true) {
|
|
120
121
|
state.allColumns = true;
|
|
121
122
|
}
|
|
122
123
|
function merge(table, key, value) {
|
|
123
124
|
if (!value) {
|
|
124
125
|
return;
|
|
125
126
|
}
|
|
126
|
-
const selection = value === true ? {} : value;
|
|
127
127
|
if (state.with.has(key)) {
|
|
128
|
-
mergeSelection(config, state.with.get(key),
|
|
128
|
+
mergeSelection(config, state.with.get(key), value);
|
|
129
129
|
} else {
|
|
130
130
|
const relatedState = createState(table, state.skipDeferredFragments, state);
|
|
131
|
-
mergeSelection(config, relatedState,
|
|
131
|
+
mergeSelection(config, relatedState, value);
|
|
132
132
|
state.with.set(key, relatedState);
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
|
-
function selectionToQuery(state) {
|
|
136
|
+
function selectionToQuery(config, state) {
|
|
137
137
|
const query = {
|
|
138
138
|
...state.query,
|
|
139
139
|
with: {},
|
|
@@ -148,15 +148,16 @@ function selectionToQuery(state) {
|
|
|
148
148
|
for (const key of state.columns){
|
|
149
149
|
query.columns[key] = true;
|
|
150
150
|
}
|
|
151
|
-
for (const
|
|
152
|
-
|
|
151
|
+
for (const column of config.getPrimaryKey(state.table.tsName)){
|
|
152
|
+
const tsName = config.columnToTsName(column);
|
|
153
|
+
query.columns[tsName] = true;
|
|
153
154
|
}
|
|
154
155
|
}
|
|
155
156
|
for (const [key, value] of state.extras){
|
|
156
157
|
query.extras[key] = value;
|
|
157
158
|
}
|
|
158
159
|
state.with.forEach((sel, relation)=>{
|
|
159
|
-
query.with[relation] = selectionToQuery(sel);
|
|
160
|
+
query.with[relation] = selectionToQuery(config, sel);
|
|
160
161
|
});
|
|
161
162
|
return query;
|
|
162
163
|
}
|
|
@@ -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","
|
|
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","existing","deepEqual","newState","name","relationState","allColumns","add","set","table","skipDeferredFragments","parent","Set","Map","mappings","depth","config","selection","relation","relations","PothosValidationError","dbName","tableUniqueName","getTableUniqueName","targetTable","tableName","tableNamesMap","merge","tablesConfig","relatedState","column","getPrimaryKey","tsName","columnToTsName","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.9.0",
|
|
4
4
|
"description": "A Pothos plugin for drizzle",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"types": "./dts/index.d.ts",
|
|
@@ -35,24 +35,24 @@
|
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
37
|
"@pothos/core": "*",
|
|
38
|
-
"graphql": "
|
|
38
|
+
"graphql": "^16.10.0",
|
|
39
|
+
"drizzle-orm": "^1.0.0"
|
|
39
40
|
},
|
|
40
41
|
"devDependencies": {
|
|
41
|
-
"@libsql/client": "^0.
|
|
42
|
+
"@libsql/client": "^0.15.4",
|
|
42
43
|
"drizzle-graphql": "^0.8.5",
|
|
43
|
-
"drizzle-kit": "
|
|
44
|
-
"drizzle-orm": "
|
|
45
|
-
"graphql": "^
|
|
46
|
-
"graphql-scalars": "^1.24.0",
|
|
44
|
+
"drizzle-kit": "1.0.0-beta.1-c0277c0",
|
|
45
|
+
"drizzle-orm": "1.0.0-beta.1-c0277c0",
|
|
46
|
+
"graphql-scalars": "^1.24.2",
|
|
47
47
|
"graphql-tag": "^2.12.6",
|
|
48
48
|
"postgres": "^3.4.5",
|
|
49
|
-
"@pothos/core": "4.6.
|
|
50
|
-
"@pothos/plugin-add-graphql": "4.2.
|
|
51
|
-
"@pothos/plugin-errors": "4.2.
|
|
52
|
-
"@pothos/plugin-
|
|
53
|
-
"@pothos/plugin-
|
|
54
|
-
"@pothos/plugin-with-input": "4.1.
|
|
55
|
-
"@pothos/test-utils": "2.1.
|
|
49
|
+
"@pothos/core": "4.6.2",
|
|
50
|
+
"@pothos/plugin-add-graphql": "4.2.3",
|
|
51
|
+
"@pothos/plugin-errors": "4.2.1",
|
|
52
|
+
"@pothos/plugin-scope-auth": "4.1.3",
|
|
53
|
+
"@pothos/plugin-relay": "4.4.2",
|
|
54
|
+
"@pothos/plugin-with-input": "4.1.1",
|
|
55
|
+
"@pothos/test-utils": "2.1.1"
|
|
56
56
|
},
|
|
57
57
|
"scripts": {
|
|
58
58
|
"type": "tsc --project tsconfig.type.json",
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import type { InputFieldMap, InputShapeFromFields, SchemaTypes } from '@pothos/core';
|
|
2
|
+
import type { BuildQueryResult, DBQueryConfig, Table, TableRelationalConfig } from 'drizzle-orm';
|
|
3
|
+
import type { DrizzleRef } from './interface-ref';
|
|
4
|
+
import type { QueryForDrizzleConnection } from './types';
|
|
5
|
+
import { getSchemaConfig } from './utils/config';
|
|
6
|
+
import {
|
|
7
|
+
drizzleCursorConnectionQuery,
|
|
8
|
+
getCursorFormatter,
|
|
9
|
+
wrapConnectionResult,
|
|
10
|
+
} from './utils/cursors';
|
|
11
|
+
import { getRefFromModel } from './utils/refs';
|
|
12
|
+
import { createState, mergeSelection, selectionToQuery } from './utils/selections';
|
|
13
|
+
|
|
14
|
+
export function drizzleConnectionHelpers<
|
|
15
|
+
Types extends SchemaTypes,
|
|
16
|
+
Type extends DrizzleRef<Types> | keyof Types['DrizzleRelationsConfig'],
|
|
17
|
+
Selection extends DBQueryConfig<'one', Types['DrizzleRelationsConfig'], Table> | true,
|
|
18
|
+
Table extends TableRelationalConfig = Types['DrizzleRelationsConfig'][Type extends DrizzleRef<
|
|
19
|
+
Types,
|
|
20
|
+
infer T
|
|
21
|
+
>
|
|
22
|
+
? T
|
|
23
|
+
: Type],
|
|
24
|
+
Shape = Type extends DrizzleRef<
|
|
25
|
+
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
26
|
+
any,
|
|
27
|
+
keyof Types['DrizzleRelationsConfig'],
|
|
28
|
+
infer S
|
|
29
|
+
>
|
|
30
|
+
? S
|
|
31
|
+
: BuildQueryResult<Types['DrizzleRelationsConfig'], Table, true>,
|
|
32
|
+
EdgeShape = true extends Selection
|
|
33
|
+
? Shape
|
|
34
|
+
: BuildQueryResult<Types['DrizzleRelationsConfig'], Table, Selection>,
|
|
35
|
+
NodeShape = EdgeShape,
|
|
36
|
+
ExtraArgs extends InputFieldMap = {},
|
|
37
|
+
>(
|
|
38
|
+
builder: PothosSchemaTypes.SchemaBuilder<Types>,
|
|
39
|
+
refOrType: Type,
|
|
40
|
+
{
|
|
41
|
+
select,
|
|
42
|
+
resolveNode,
|
|
43
|
+
query,
|
|
44
|
+
args: createArgs,
|
|
45
|
+
maxSize = builder.options.drizzle?.maxConnectionSize,
|
|
46
|
+
defaultSize = builder.options.drizzle?.defaultConnectionSize,
|
|
47
|
+
}: {
|
|
48
|
+
args?: (t: PothosSchemaTypes.InputFieldBuilder<Types, 'Arg'>) => ExtraArgs;
|
|
49
|
+
select?: (
|
|
50
|
+
nestedSelection: <T extends true | {}>(selection?: T) => T,
|
|
51
|
+
args: InputShapeFromFields<ExtraArgs> & PothosSchemaTypes.DefaultConnectionArguments,
|
|
52
|
+
ctx: Types['Context'],
|
|
53
|
+
) => Selection;
|
|
54
|
+
query?: QueryForDrizzleConnection<Types, Table> extends infer QueryConfig
|
|
55
|
+
?
|
|
56
|
+
| QueryConfig
|
|
57
|
+
| ((args: InputShapeFromFields<ExtraArgs>, context: Types['Context']) => QueryConfig)
|
|
58
|
+
: never;
|
|
59
|
+
defaultSize?:
|
|
60
|
+
| number
|
|
61
|
+
| ((
|
|
62
|
+
args: InputShapeFromFields<ExtraArgs> & PothosSchemaTypes.DefaultConnectionArguments,
|
|
63
|
+
ctx: Types['Context'],
|
|
64
|
+
) => number);
|
|
65
|
+
maxSize?:
|
|
66
|
+
| number
|
|
67
|
+
| ((args: PothosSchemaTypes.DefaultConnectionArguments, ctx: Types['Context']) => number);
|
|
68
|
+
resolveNode?: (edge: EdgeShape) => NodeShape;
|
|
69
|
+
},
|
|
70
|
+
) {
|
|
71
|
+
const config = getSchemaConfig(builder);
|
|
72
|
+
const tableName =
|
|
73
|
+
typeof refOrType === 'string'
|
|
74
|
+
? refOrType
|
|
75
|
+
: (refOrType as DrizzleRef<Types, Type extends DrizzleRef<Types, infer T> ? T : Type>)
|
|
76
|
+
.tableName;
|
|
77
|
+
|
|
78
|
+
function resolve<Parent = unknown>(
|
|
79
|
+
list: (EdgeShape & {})[],
|
|
80
|
+
args: InputShapeFromFields<ExtraArgs> & PothosSchemaTypes.DefaultConnectionArguments,
|
|
81
|
+
ctx: Types['Context'],
|
|
82
|
+
parent?: Parent,
|
|
83
|
+
) {
|
|
84
|
+
const { select, cursorColumns } = getQueryArgs(args, ctx);
|
|
85
|
+
const formatCursor = getCursorFormatter(cursorColumns, config);
|
|
86
|
+
return wrapConnectionResult(
|
|
87
|
+
list,
|
|
88
|
+
args,
|
|
89
|
+
select.limit,
|
|
90
|
+
formatCursor,
|
|
91
|
+
(resolveNode as never) ?? ((edge: unknown) => edge),
|
|
92
|
+
parent,
|
|
93
|
+
) as unknown as {
|
|
94
|
+
edges: (Omit<EdgeShape, 'cursor' | 'node'> & { node: NodeShape; cursor: string })[];
|
|
95
|
+
pageInfo: {
|
|
96
|
+
startCursor: string | null;
|
|
97
|
+
endCursor: string | null;
|
|
98
|
+
hasPreviousPage: boolean;
|
|
99
|
+
hasNextPage: boolean;
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const getQueryArgs = (
|
|
105
|
+
args: InputShapeFromFields<ExtraArgs> & PothosSchemaTypes.DefaultConnectionArguments,
|
|
106
|
+
ctx: {},
|
|
107
|
+
) => {
|
|
108
|
+
const { limit, orderBy, where, ...fieldQuery } =
|
|
109
|
+
(typeof query === 'function' ? query(args, ctx) : query) ?? {};
|
|
110
|
+
const table = config.relations.tablesConfig[tableName] as Table;
|
|
111
|
+
|
|
112
|
+
const { cursorColumns, columns, ...connectionQuery } = drizzleCursorConnectionQuery({
|
|
113
|
+
ctx,
|
|
114
|
+
maxSize,
|
|
115
|
+
defaultSize: typeof defaultSize === 'function' ? defaultSize(args, ctx) : defaultSize,
|
|
116
|
+
args,
|
|
117
|
+
orderBy:
|
|
118
|
+
(typeof orderBy === 'function' ? orderBy(table) : orderBy) ??
|
|
119
|
+
getSchemaConfig(builder).getPrimaryKey(tableName),
|
|
120
|
+
where,
|
|
121
|
+
config,
|
|
122
|
+
table,
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
select: {
|
|
127
|
+
...fieldQuery,
|
|
128
|
+
...connectionQuery,
|
|
129
|
+
columns: {
|
|
130
|
+
...fieldQuery.columns,
|
|
131
|
+
...columns,
|
|
132
|
+
},
|
|
133
|
+
limit: Math.abs(limit ?? connectionQuery.limit),
|
|
134
|
+
},
|
|
135
|
+
cursorColumns,
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
function getQuery(
|
|
140
|
+
args: InputShapeFromFields<ExtraArgs> & PothosSchemaTypes.DefaultConnectionArguments,
|
|
141
|
+
ctx: Types['Context'],
|
|
142
|
+
nestedSelection: <T extends true | {}>(selection?: T, path?: string[]) => T,
|
|
143
|
+
) {
|
|
144
|
+
const nestedSelect: Record<string, unknown> | true = select
|
|
145
|
+
? select((sel) => nestedSelection(sel, ['edges', 'node']), args, ctx)
|
|
146
|
+
: nestedSelection(true, ['edges', 'node']);
|
|
147
|
+
const queryArgs = getQueryArgs(args, ctx);
|
|
148
|
+
|
|
149
|
+
const selectState = createState(
|
|
150
|
+
config.relations.tablesConfig[tableName],
|
|
151
|
+
builder.options.drizzle?.skipDeferredFragments ?? true,
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
mergeSelection(config, selectState, queryArgs.select);
|
|
155
|
+
|
|
156
|
+
if (typeof nestedSelect === 'object' && nestedSelect) {
|
|
157
|
+
mergeSelection(config, selectState, nestedSelect);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const baseQuery = typeof query === 'function' ? query(args, ctx) : (query ?? {});
|
|
161
|
+
const queryResult = selectionToQuery(config, selectState);
|
|
162
|
+
|
|
163
|
+
return {
|
|
164
|
+
...baseQuery,
|
|
165
|
+
...queryResult,
|
|
166
|
+
} as unknown as Omit<Selection, 'orderBy'> & {
|
|
167
|
+
orderBy: {
|
|
168
|
+
[K in keyof Table['columns']]?: 'asc' | 'desc' | undefined;
|
|
169
|
+
};
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const getArgs = () => (createArgs ? builder.args(createArgs) : {}) as ExtraArgs;
|
|
174
|
+
|
|
175
|
+
return {
|
|
176
|
+
ref: (typeof refOrType === 'string'
|
|
177
|
+
? getRefFromModel(refOrType, builder)
|
|
178
|
+
: refOrType) as DrizzleRef<Types, Type extends DrizzleRef<Types, infer T> ? T : Type, Shape>,
|
|
179
|
+
resolve,
|
|
180
|
+
select: select ?? {},
|
|
181
|
+
getQuery,
|
|
182
|
+
getArgs,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
@@ -17,10 +17,11 @@ import {
|
|
|
17
17
|
isThenable,
|
|
18
18
|
} from '@pothos/core';
|
|
19
19
|
import {
|
|
20
|
-
type
|
|
20
|
+
type InferSelectModel,
|
|
21
21
|
Many,
|
|
22
|
+
type Table,
|
|
22
23
|
type TableRelationalConfig,
|
|
23
|
-
|
|
24
|
+
getTableUniqueName,
|
|
24
25
|
} from 'drizzle-orm';
|
|
25
26
|
import type { DrizzleRef } from './interface-ref';
|
|
26
27
|
import type {
|
|
@@ -50,13 +51,11 @@ const RootBuilder: {
|
|
|
50
51
|
): PothosSchemaTypes.RootFieldBuilder<Types, Shape, Kind>;
|
|
51
52
|
} = RootFieldBuilder as never;
|
|
52
53
|
|
|
53
|
-
const ops = getOperators();
|
|
54
|
-
|
|
55
54
|
export class DrizzleObjectFieldBuilder<
|
|
56
55
|
Types extends SchemaTypes,
|
|
57
56
|
TableConfig extends TableRelationalConfig,
|
|
58
57
|
Shape,
|
|
59
|
-
ExposableShape =
|
|
58
|
+
ExposableShape = InferSelectModel<Extract<TableConfig['table'], { _: { brand: 'Table' } }>>,
|
|
60
59
|
> extends RootBuilder<Types, Shape, 'DrizzleObject'> {
|
|
61
60
|
exposeBoolean = this.createExpose('Boolean');
|
|
62
61
|
|
|
@@ -197,8 +196,11 @@ export class DrizzleObjectFieldBuilder<
|
|
|
197
196
|
edgeOptions = {},
|
|
198
197
|
) {
|
|
199
198
|
const schemaConfig = getSchemaConfig(this.builder);
|
|
200
|
-
const relationField =
|
|
201
|
-
|
|
199
|
+
const relationField =
|
|
200
|
+
schemaConfig.relations.tablesConfig?.[this.table].relations[name as string];
|
|
201
|
+
const tableUniqueName = getTableUniqueName(relationField.targetTable as Table);
|
|
202
|
+
const tableName = schemaConfig.relations.tableNamesMap[tableUniqueName];
|
|
203
|
+
const relatedModel = schemaConfig.relations.tables[tableName] as Table;
|
|
202
204
|
|
|
203
205
|
if (!relatedModel) {
|
|
204
206
|
throw new PothosSchemaError(
|
|
@@ -206,28 +208,27 @@ export class DrizzleObjectFieldBuilder<
|
|
|
206
208
|
);
|
|
207
209
|
}
|
|
208
210
|
|
|
209
|
-
const ref = options.type ?? getRefFromModel(
|
|
211
|
+
const ref = options.type ?? getRefFromModel(tableName, this.builder);
|
|
210
212
|
let typeName: string | undefined;
|
|
211
213
|
|
|
212
214
|
const getQuery = (args: PothosSchemaTypes.DefaultConnectionArguments, ctx: {}) => {
|
|
213
215
|
const { limit, orderBy, where, ...fieldQuery } =
|
|
214
216
|
(typeof query === 'function' ? query(args, ctx) : query) ?? {};
|
|
215
217
|
|
|
218
|
+
const tableUniqueName = getTableUniqueName(relatedModel as Table);
|
|
219
|
+
const tableName = schemaConfig.relations.tableNamesMap[tableUniqueName];
|
|
220
|
+
|
|
216
221
|
const { cursorColumns, columns, ...connectionQuery } = drizzleCursorConnectionQuery({
|
|
217
222
|
ctx,
|
|
218
223
|
maxSize,
|
|
219
224
|
defaultSize,
|
|
220
225
|
args,
|
|
221
|
-
orderBy:
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
? typeof where === 'function'
|
|
228
|
-
? where(relatedModel.columns, ops)
|
|
229
|
-
: where
|
|
230
|
-
: undefined,
|
|
226
|
+
orderBy:
|
|
227
|
+
(typeof orderBy === 'function' ? orderBy(relatedModel) : orderBy) ??
|
|
228
|
+
getSchemaConfig(this.builder).getPrimaryKey(tableName),
|
|
229
|
+
where,
|
|
230
|
+
config: schemaConfig,
|
|
231
|
+
table: schemaConfig.relations.tablesConfig[tableName],
|
|
231
232
|
});
|
|
232
233
|
|
|
233
234
|
return {
|
|
@@ -322,7 +323,7 @@ export class DrizzleObjectFieldBuilder<
|
|
|
322
323
|
[
|
|
323
324
|
options: VariantFieldOptions<
|
|
324
325
|
Types,
|
|
325
|
-
TableConfig['tsName'] & keyof Types['
|
|
326
|
+
TableConfig['tsName'] & keyof Types['DrizzleRelationsConfig'],
|
|
326
327
|
Variant,
|
|
327
328
|
Args,
|
|
328
329
|
Nullable,
|
|
@@ -341,7 +342,7 @@ export class DrizzleObjectFieldBuilder<
|
|
|
341
342
|
_args: object,
|
|
342
343
|
_context: object,
|
|
343
344
|
nestedQuery: (query: unknown) => unknown,
|
|
344
|
-
) => nestedQuery({});
|
|
345
|
+
) => nestedQuery(options.select ?? {});
|
|
345
346
|
|
|
346
347
|
return this.field({
|
|
347
348
|
...(options as {}),
|
|
@@ -389,16 +390,19 @@ export class DrizzleObjectFieldBuilder<
|
|
|
389
390
|
): FieldRef<Types, TypesForRelation<Types, TableConfig['relations'][Field]>, 'Object'> {
|
|
390
391
|
const [options = {} as never] = allArgs;
|
|
391
392
|
const schemaConfig = getSchemaConfig(this.builder);
|
|
392
|
-
const relationField =
|
|
393
|
-
|
|
393
|
+
const relationField =
|
|
394
|
+
schemaConfig.relations.tablesConfig?.[this.table].relations[name as string];
|
|
395
|
+
|
|
396
|
+
const tableUniqueName = getTableUniqueName(relationField.targetTable as Table);
|
|
397
|
+
const tableName = schemaConfig.relations.tableNamesMap[tableUniqueName];
|
|
398
|
+
const relatedModel = schemaConfig.relations.tables[tableName];
|
|
394
399
|
|
|
395
400
|
if (!relatedModel) {
|
|
396
401
|
throw new PothosSchemaError(
|
|
397
402
|
`Could not find relation ${name as string} on table ${this.table}`,
|
|
398
403
|
);
|
|
399
404
|
}
|
|
400
|
-
|
|
401
|
-
const ref = options.type ?? getRefFromModel(relatedModel.tsName, this.builder);
|
|
405
|
+
const ref = options.type ?? getRefFromModel(tableName, this.builder);
|
|
402
406
|
|
|
403
407
|
const { query = {}, extensions, ...rest } = options;
|
|
404
408
|
|
|
@@ -455,7 +459,7 @@ export class DrizzleObjectFieldBuilder<
|
|
|
455
459
|
) {
|
|
456
460
|
const [name, options = {} as never] = args;
|
|
457
461
|
|
|
458
|
-
const typeConfig = this.builder.configStore.getTypeConfig(this.typename,
|
|
462
|
+
const typeConfig = this.builder.configStore.getTypeConfig(this.typename, this.graphqlKind);
|
|
459
463
|
const usingSelect = !!typeConfig.extensions?.pothosDrizzleSelect;
|
|
460
464
|
|
|
461
465
|
return this.exposeField(name as never, {
|
|
@@ -467,7 +471,7 @@ export class DrizzleObjectFieldBuilder<
|
|
|
467
471
|
columns: { [name as string]: true },
|
|
468
472
|
},
|
|
469
473
|
},
|
|
470
|
-
})
|
|
474
|
+
}) as FieldRef<Types, ShapeFromTypeParam<Types, Type, Nullable>, 'DrizzleObject'>;
|
|
471
475
|
}
|
|
472
476
|
|
|
473
477
|
private createExpose<Type extends TypeParam<Types>>(type: Type) {
|
package/src/field-builder.ts
CHANGED
|
@@ -90,8 +90,8 @@ fieldBuilderProto.drizzleFieldWithInput = function drizzleFieldWithInput(
|
|
|
90
90
|
|
|
91
91
|
fieldBuilderProto.drizzleConnection = function drizzleConnection<
|
|
92
92
|
Type extends
|
|
93
|
-
| DrizzleRef<SchemaTypes, keyof SchemaTypes['
|
|
94
|
-
| keyof SchemaTypes['
|
|
93
|
+
| DrizzleRef<SchemaTypes, keyof SchemaTypes['DrizzleRelations']['config']>
|
|
94
|
+
| keyof SchemaTypes['DrizzleRelations']['config'],
|
|
95
95
|
Nullable extends boolean,
|
|
96
96
|
ResolveReturnShape,
|
|
97
97
|
>(
|
|
@@ -118,6 +118,7 @@ fieldBuilderProto.drizzleConnection = function drizzleConnection<
|
|
|
118
118
|
) {
|
|
119
119
|
const ref = typeof type === 'string' ? getRefFromModel(type, this.builder) : type;
|
|
120
120
|
const typeName = this.builder.configStore.getTypeConfig(ref).name;
|
|
121
|
+
const tableName = typeof type === 'string' ? type : (ref as DrizzleRef<SchemaTypes>).tableName;
|
|
121
122
|
const fieldRef = (
|
|
122
123
|
this as typeof fieldBuilderProto & {
|
|
123
124
|
connection: (...args: unknown[]) => FieldRef<SchemaTypes, unknown>;
|
|
@@ -132,12 +133,8 @@ fieldBuilderProto.drizzleConnection = function drizzleConnection<
|
|
|
132
133
|
context: {},
|
|
133
134
|
info: GraphQLResolveInfo,
|
|
134
135
|
) => {
|
|
135
|
-
const drizzleModel = getSchemaConfig(this.builder).schema?.[
|
|
136
|
-
typeof type === 'string' ? type : (ref as DrizzleRef<SchemaTypes>).tableName
|
|
137
|
-
]!;
|
|
138
|
-
|
|
139
136
|
return resolveDrizzleCursorConnection(
|
|
140
|
-
|
|
137
|
+
tableName,
|
|
141
138
|
info,
|
|
142
139
|
typeName,
|
|
143
140
|
getSchemaConfig(this.builder),
|