@pothos/plugin-drizzle 0.0.1

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 (179) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +6 -0
  3. package/README.md +437 -0
  4. package/TODO.md +21 -0
  5. package/drizzle/meta/_journal.json +1 -0
  6. package/drizzle.config.ts +10 -0
  7. package/dts/drizzle-field-builder.d.ts +124 -0
  8. package/dts/drizzle-field-builder.d.ts.map +1 -0
  9. package/dts/field-builder.d.ts +2 -0
  10. package/dts/field-builder.d.ts.map +1 -0
  11. package/dts/global-types.d.ts +92 -0
  12. package/dts/global-types.d.ts.map +1 -0
  13. package/dts/index.d.ts +13 -0
  14. package/dts/index.d.ts.map +1 -0
  15. package/dts/interface-ref.d.ts +9 -0
  16. package/dts/interface-ref.d.ts.map +1 -0
  17. package/dts/model-loader.d.ts +44 -0
  18. package/dts/model-loader.d.ts.map +1 -0
  19. package/dts/node-ref.d.ts +5 -0
  20. package/dts/node-ref.d.ts.map +1 -0
  21. package/dts/object-ref.d.ts +14 -0
  22. package/dts/object-ref.d.ts.map +1 -0
  23. package/dts/schema-builder.d.ts +2 -0
  24. package/dts/schema-builder.d.ts.map +1 -0
  25. package/dts/types.d.ts +147 -0
  26. package/dts/types.d.ts.map +1 -0
  27. package/dts/utils/config.d.ts +7 -0
  28. package/dts/utils/config.d.ts.map +1 -0
  29. package/dts/utils/cursors.d.ts +58 -0
  30. package/dts/utils/cursors.d.ts.map +1 -0
  31. package/dts/utils/deep-equal.d.ts +2 -0
  32. package/dts/utils/deep-equal.d.ts.map +1 -0
  33. package/dts/utils/drizzle-graphql.d.ts +18 -0
  34. package/dts/utils/drizzle-graphql.d.ts.map +1 -0
  35. package/dts/utils/loader-map.d.ts +11 -0
  36. package/dts/utils/loader-map.d.ts.map +1 -0
  37. package/dts/utils/map-query.d.ts +30 -0
  38. package/dts/utils/map-query.d.ts.map +1 -0
  39. package/dts/utils/refs.d.ts +5 -0
  40. package/dts/utils/refs.d.ts.map +1 -0
  41. package/dts/utils/selections.d.ts +22 -0
  42. package/dts/utils/selections.d.ts.map +1 -0
  43. package/dts/utils/usage.d.ts +5 -0
  44. package/dts/utils/usage.d.ts.map +1 -0
  45. package/esm/drizzle-field-builder.d.ts +216 -0
  46. package/esm/drizzle-field-builder.d.ts.map +1 -0
  47. package/esm/field-builder.d.ts +2 -0
  48. package/esm/field-builder.d.ts.map +1 -0
  49. package/esm/global-types.d.ts +124 -0
  50. package/esm/global-types.d.ts.map +1 -0
  51. package/esm/index.d.ts +13 -0
  52. package/esm/index.d.ts.map +1 -0
  53. package/esm/interface-ref.d.ts +9 -0
  54. package/esm/interface-ref.d.ts.map +1 -0
  55. package/esm/model-loader.d.ts +45 -0
  56. package/esm/model-loader.d.ts.map +1 -0
  57. package/esm/node-ref.d.ts +5 -0
  58. package/esm/node-ref.d.ts.map +1 -0
  59. package/esm/object-ref.d.ts +14 -0
  60. package/esm/object-ref.d.ts.map +1 -0
  61. package/esm/package.json +3 -0
  62. package/esm/schema-builder.d.ts +2 -0
  63. package/esm/schema-builder.d.ts.map +1 -0
  64. package/esm/src/drizzle-field-builder.js +215 -0
  65. package/esm/src/drizzle-field-builder.js.map +1 -0
  66. package/esm/src/field-builder.js +77 -0
  67. package/esm/src/field-builder.js.map +1 -0
  68. package/esm/src/global-types.js +2 -0
  69. package/esm/src/global-types.js.map +1 -0
  70. package/esm/src/index.js +107 -0
  71. package/esm/src/index.js.map +1 -0
  72. package/esm/src/interface-ref.js +26 -0
  73. package/esm/src/interface-ref.js.map +1 -0
  74. package/esm/src/model-loader.js +168 -0
  75. package/esm/src/model-loader.js.map +1 -0
  76. package/esm/src/node-ref.js +4 -0
  77. package/esm/src/node-ref.js.map +1 -0
  78. package/esm/src/object-ref.js +38 -0
  79. package/esm/src/object-ref.js.map +1 -0
  80. package/esm/src/schema-builder.js +190 -0
  81. package/esm/src/schema-builder.js.map +1 -0
  82. package/esm/src/types.js +2 -0
  83. package/esm/src/types.js.map +1 -0
  84. package/esm/src/utils/config.js +15 -0
  85. package/esm/src/utils/config.js.map +1 -0
  86. package/esm/src/utils/cursors.js +316 -0
  87. package/esm/src/utils/cursors.js.map +1 -0
  88. package/esm/src/utils/deep-equal.js +44 -0
  89. package/esm/src/utils/deep-equal.js.map +1 -0
  90. package/esm/src/utils/drizzle-graphql.js +176 -0
  91. package/esm/src/utils/drizzle-graphql.js.map +1 -0
  92. package/esm/src/utils/loader-map.js +35 -0
  93. package/esm/src/utils/loader-map.js.map +1 -0
  94. package/esm/src/utils/map-query.js +284 -0
  95. package/esm/src/utils/map-query.js.map +1 -0
  96. package/esm/src/utils/refs.js +14 -0
  97. package/esm/src/utils/refs.js.map +1 -0
  98. package/esm/src/utils/selections.js +136 -0
  99. package/esm/src/utils/selections.js.map +1 -0
  100. package/esm/src/utils/usage.js +59 -0
  101. package/esm/src/utils/usage.js.map +1 -0
  102. package/esm/types.d.ts +161 -0
  103. package/esm/types.d.ts.map +1 -0
  104. package/esm/utils/config.d.ts +7 -0
  105. package/esm/utils/config.d.ts.map +1 -0
  106. package/esm/utils/cursors.d.ts +58 -0
  107. package/esm/utils/cursors.d.ts.map +1 -0
  108. package/esm/utils/deep-equal.d.ts +2 -0
  109. package/esm/utils/deep-equal.d.ts.map +1 -0
  110. package/esm/utils/drizzle-graphql.d.ts +18 -0
  111. package/esm/utils/drizzle-graphql.d.ts.map +1 -0
  112. package/esm/utils/loader-map.d.ts +11 -0
  113. package/esm/utils/loader-map.d.ts.map +1 -0
  114. package/esm/utils/map-query.d.ts +30 -0
  115. package/esm/utils/map-query.d.ts.map +1 -0
  116. package/esm/utils/refs.d.ts +5 -0
  117. package/esm/utils/refs.d.ts.map +1 -0
  118. package/esm/utils/selections.d.ts +22 -0
  119. package/esm/utils/selections.d.ts.map +1 -0
  120. package/esm/utils/usage.d.ts +5 -0
  121. package/esm/utils/usage.d.ts.map +1 -0
  122. package/lib/src/drizzle-field-builder.js +225 -0
  123. package/lib/src/drizzle-field-builder.js.map +1 -0
  124. package/lib/src/field-builder.js +82 -0
  125. package/lib/src/field-builder.js.map +1 -0
  126. package/lib/src/global-types.js +6 -0
  127. package/lib/src/global-types.js.map +1 -0
  128. package/lib/src/index.js +180 -0
  129. package/lib/src/index.js.map +1 -0
  130. package/lib/src/interface-ref.js +36 -0
  131. package/lib/src/interface-ref.js.map +1 -0
  132. package/lib/src/model-loader.js +176 -0
  133. package/lib/src/model-loader.js.map +1 -0
  134. package/lib/src/node-ref.js +15 -0
  135. package/lib/src/node-ref.js.map +1 -0
  136. package/lib/src/object-ref.js +56 -0
  137. package/lib/src/object-ref.js.map +1 -0
  138. package/lib/src/schema-builder.js +236 -0
  139. package/lib/src/schema-builder.js.map +1 -0
  140. package/lib/src/types.js +13 -0
  141. package/lib/src/types.js.map +1 -0
  142. package/lib/src/utils/config.js +26 -0
  143. package/lib/src/utils/config.js.map +1 -0
  144. package/lib/src/utils/cursors.js +362 -0
  145. package/lib/src/utils/cursors.js.map +1 -0
  146. package/lib/src/utils/deep-equal.js +55 -0
  147. package/lib/src/utils/deep-equal.js.map +1 -0
  148. package/lib/src/utils/drizzle-graphql.js +192 -0
  149. package/lib/src/utils/drizzle-graphql.js.map +1 -0
  150. package/lib/src/utils/loader-map.js +57 -0
  151. package/lib/src/utils/loader-map.js.map +1 -0
  152. package/lib/src/utils/map-query.js +308 -0
  153. package/lib/src/utils/map-query.js.map +1 -0
  154. package/lib/src/utils/refs.js +33 -0
  155. package/lib/src/utils/refs.js.map +1 -0
  156. package/lib/src/utils/selections.js +163 -0
  157. package/lib/src/utils/selections.js.map +1 -0
  158. package/lib/src/utils/usage.js +84 -0
  159. package/lib/src/utils/usage.js.map +1 -0
  160. package/package.json +66 -0
  161. package/src/drizzle-field-builder.ts +500 -0
  162. package/src/field-builder.ts +168 -0
  163. package/src/global-types.ts +481 -0
  164. package/src/index.ts +175 -0
  165. package/src/interface-ref.ts +24 -0
  166. package/src/model-loader.ts +235 -0
  167. package/src/node-ref.ts +8 -0
  168. package/src/object-ref.ts +51 -0
  169. package/src/schema-builder.ts +299 -0
  170. package/src/types.ts +640 -0
  171. package/src/utils/config.ts +28 -0
  172. package/src/utils/cursors.ts +446 -0
  173. package/src/utils/deep-equal.ts +58 -0
  174. package/src/utils/drizzle-graphql.ts +235 -0
  175. package/src/utils/loader-map.ts +51 -0
  176. package/src/utils/map-query.ts +582 -0
  177. package/src/utils/refs.ts +25 -0
  178. package/src/utils/selections.ts +209 -0
  179. package/src/utils/usage.ts +64 -0
@@ -0,0 +1,299 @@
1
+ import SchemaBuilder, {
2
+ brandWithType,
3
+ completeValue,
4
+ InterfaceRef,
5
+ ObjectRef,
6
+ OutputType,
7
+ PothosError,
8
+ SchemaTypes,
9
+ FieldRef,
10
+ InputObjectRef,
11
+ } from '@pothos/core';
12
+ import { DrizzleObjectFieldBuilder } from './drizzle-field-builder';
13
+ import { getRefFromModel } from './utils/refs';
14
+ import { DrizzleObjectRef } from './object-ref';
15
+ import { DrizzleGraphQLInputExtensions, DrizzleNodeOptions } from './types';
16
+ import { getColumnParser, getColumnSerializer } from './utils/cursors';
17
+ import { DrizzleNodeRef } from './node-ref';
18
+ import { GraphQLInputObjectType, GraphQLResolveInfo } from 'graphql';
19
+ import { ModelLoader } from './model-loader';
20
+ import { DrizzleInterfaceRef } from './interface-ref';
21
+
22
+ const schemaBuilderProto = SchemaBuilder.prototype as PothosSchemaTypes.SchemaBuilder<SchemaTypes>;
23
+
24
+ schemaBuilderProto.drizzleObject = function drizzleObject(table, { select, fields, ...options }) {
25
+ const name = options.variant ?? options.name ?? table;
26
+
27
+ const ref = options.variant
28
+ ? new DrizzleObjectRef(options.variant, name)
29
+ : (getRefFromModel(table, this, 'object') as ObjectRef<SchemaTypes, unknown>);
30
+
31
+ ref.name = name ?? table;
32
+
33
+ this.objectType(ref, {
34
+ ...(options as {}),
35
+ extensions: {
36
+ ...options.extensions,
37
+ pothosDrizzleModel: table,
38
+ pothosDrizzleTable: this.options.drizzle.client._.schema?.[table],
39
+ pothosDrizzleSelect: select ?? {},
40
+ pothosDrizzleLoader: ModelLoader.forModel(table, this),
41
+ },
42
+ name,
43
+ fields: fields ? () => fields(new DrizzleObjectFieldBuilder(ref.name, this, table)) : undefined,
44
+ });
45
+
46
+ return ref as never;
47
+ };
48
+
49
+ schemaBuilderProto.drizzleInterface = function drizzleInterface(
50
+ table,
51
+ { select, fields, ...options },
52
+ ) {
53
+ const name = options.name ?? table;
54
+
55
+ const ref = options.variant
56
+ ? new DrizzleInterfaceRef(options.variant, name)
57
+ : (getRefFromModel(table, this, 'interface') as InterfaceRef<SchemaTypes, unknown>);
58
+
59
+ ref.name = name ?? table;
60
+
61
+ this.interfaceType(ref, {
62
+ ...(options as {}),
63
+ extensions: {
64
+ ...options.extensions,
65
+ pothosDrizzleModel: table,
66
+ pothosDrizzleTable: this.options.drizzle.client._.schema?.[table],
67
+ pothosDrizzleSelect: select ?? {},
68
+ pothosDrizzleLoader: ModelLoader.forModel(table, this),
69
+ },
70
+ name,
71
+ fields: fields
72
+ ? () => fields(new DrizzleObjectFieldBuilder(ref.name, this, table, 'Interface'))
73
+ : undefined,
74
+ });
75
+
76
+ return ref as never;
77
+ };
78
+
79
+ schemaBuilderProto.drizzleNode = function drizzleNode(
80
+ this: PothosSchemaTypes.SchemaBuilder<SchemaTypes> & {
81
+ nodeInterfaceRef?: () => InterfaceRef<SchemaTypes, unknown>;
82
+ },
83
+ table: keyof SchemaTypes['DrizzleRelationSchema'],
84
+ {
85
+ id: { column, ...idOptions },
86
+ name,
87
+ variant,
88
+ ...options
89
+ }: DrizzleNodeOptions<SchemaTypes, keyof SchemaTypes['DrizzleRelationSchema'], {}, {}, []>,
90
+ ) {
91
+ const tableConfig = this.options.drizzle.client._.schema![table];
92
+ const idColumn = typeof column === 'function' ? column(tableConfig.columns) : column;
93
+ const idColumns = Array.isArray(idColumn) ? idColumn : [idColumn];
94
+ const interfaceRef = this.nodeInterfaceRef?.();
95
+ const resolve = getColumnSerializer(idColumns);
96
+ const idParser = getColumnParser(idColumns);
97
+ const typeName = variant ?? name ?? table;
98
+ const nodeRef = new DrizzleNodeRef(typeName, table);
99
+ const modelLoader = ModelLoader.forModel(table, this, idColumns);
100
+
101
+ if (!interfaceRef) {
102
+ throw new PothosError('builder.drizzleNode requires @pothos/plugin-relay to be installed');
103
+ }
104
+
105
+ const extendedOptions = {
106
+ ...options,
107
+ name,
108
+ variant,
109
+ interfaces: [interfaceRef],
110
+ loadWithoutCache: async (
111
+ id: string,
112
+ context: SchemaTypes['Context'],
113
+ info: GraphQLResolveInfo,
114
+ ) => {
115
+ const record = await modelLoader(context).loadSelectionForField(info, idParser(id), typeName);
116
+
117
+ if (record) {
118
+ brandWithType(record, typeName as OutputType<SchemaTypes>);
119
+ }
120
+
121
+ return record;
122
+ },
123
+ };
124
+
125
+ const ref = this.drizzleObject(table, extendedOptions as never);
126
+
127
+ if (options.interfaces) {
128
+ ref.addInterfaces(options.interfaces);
129
+ }
130
+
131
+ this.configStore.onTypeConfig(ref, (nodeConfig) => {
132
+ this.objectField(
133
+ ref,
134
+ (this.options as { relayOptions?: { idFieldName?: string } }).relayOptions?.idFieldName ??
135
+ 'id',
136
+ (t) =>
137
+ (
138
+ t as unknown as {
139
+ globalID: (options: Record<string, unknown>) => FieldRef<SchemaTypes, unknown>;
140
+ }
141
+ ).globalID({
142
+ ...(this.options as { relayOptions?: { idFieldOptions?: {} } }).relayOptions
143
+ ?.idFieldOptions,
144
+ ...idOptions,
145
+ nullable: false,
146
+ args: {},
147
+ resolve: (parent: never, args: object, context: object, info: GraphQLResolveInfo) =>
148
+ completeValue(resolve(parent), (id) => ({
149
+ type: nodeConfig.name,
150
+ id,
151
+ })),
152
+ }),
153
+ );
154
+ });
155
+
156
+ this.configStore.associateParamWithRef(nodeRef, ref);
157
+
158
+ return nodeRef;
159
+ } as never;
160
+
161
+ schemaBuilderProto.drizzleObjectField = function drizzleObjectField(type, fieldName, field) {
162
+ const ref = typeof type === 'string' ? getRefFromModel(type, this) : (type as never);
163
+ this.configStore.onTypeConfig(ref, ({ name }) => {
164
+ this.configStore.addFields(ref, () => ({
165
+ [fieldName]: field(new DrizzleObjectFieldBuilder(name, this, ref.tableName)),
166
+ }));
167
+ });
168
+ };
169
+
170
+ schemaBuilderProto.drizzleInterfaceField = function drizzleInterfaceField(type, fieldName, field) {
171
+ const ref = typeof type === 'string' ? getRefFromModel(type, this) : (type as never);
172
+ this.configStore.onTypeConfig(ref, ({ name }) => {
173
+ this.configStore.addFields(ref, () => ({
174
+ [fieldName]: field(new DrizzleObjectFieldBuilder(name, this, ref.tableName, 'Interface')),
175
+ }));
176
+ });
177
+ };
178
+
179
+ schemaBuilderProto.drizzleObjectFields = function drizzleObjectFields(type, fields) {
180
+ const ref = typeof type === 'string' ? getRefFromModel(type, this) : (type as never);
181
+ this.configStore.onTypeConfig(ref, ({ name }) => {
182
+ this.configStore.addFields(ref, () =>
183
+ fields(new DrizzleObjectFieldBuilder(name, this, ref.tableName)),
184
+ );
185
+ });
186
+ };
187
+
188
+ schemaBuilderProto.drizzleInterfaceFields = function drizzleInterfaceFields(type, fields) {
189
+ const ref = typeof type === 'string' ? getRefFromModel(type, this) : (type as never);
190
+ this.configStore.onTypeConfig(ref, ({ name }) => {
191
+ this.configStore.addFields(ref, () =>
192
+ fields(new DrizzleObjectFieldBuilder(name, this, ref.tableName, 'Interface')),
193
+ );
194
+ });
195
+ };
196
+
197
+ schemaBuilderProto.drizzleGraphQLOrderBy = function drizzleGraphQLOrderBy(
198
+ this: PothosSchemaTypes.SchemaBuilder<SchemaTypes>,
199
+ table: string,
200
+ type: GraphQLInputObjectType,
201
+ options?: { extensions?: {} },
202
+ ) {
203
+ return (
204
+ this as typeof this & {
205
+ addGraphQLInput: (
206
+ type: GraphQLInputObjectType,
207
+ options: Record<string, unknown>,
208
+ ) => InputObjectRef<SchemaTypes, {}>;
209
+ }
210
+ ).addGraphQLInput(type, {
211
+ ...options,
212
+ extensions: {
213
+ ...options?.extensions,
214
+ drizzleGraphQL: {
215
+ inputType: 'orderBy',
216
+ table,
217
+ tableConfig: this.options.drizzle.client._.schema?.[table]!,
218
+ } satisfies DrizzleGraphQLInputExtensions,
219
+ },
220
+ });
221
+ } as never;
222
+
223
+ schemaBuilderProto.drizzleGraphQLFilters = function drizzleGraphQLFilters(
224
+ this: PothosSchemaTypes.SchemaBuilder<SchemaTypes>,
225
+ table: string,
226
+ type: GraphQLInputObjectType,
227
+ options?: { extensions?: {} },
228
+ ) {
229
+ return (
230
+ this as typeof this & {
231
+ addGraphQLInput: (
232
+ type: GraphQLInputObjectType,
233
+ options: Record<string, unknown>,
234
+ ) => InputObjectRef<SchemaTypes, {}>;
235
+ }
236
+ ).addGraphQLInput(type, {
237
+ ...options,
238
+ extensions: {
239
+ ...options?.extensions,
240
+ drizzleGraphQL: {
241
+ inputType: 'filters',
242
+ table,
243
+ tableConfig: this.options.drizzle.client._.schema?.[table]!,
244
+ } satisfies DrizzleGraphQLInputExtensions,
245
+ },
246
+ });
247
+ } as never;
248
+
249
+ schemaBuilderProto.drizzleGraphQLInsert = function drizzleGraphQLInsert(
250
+ this: PothosSchemaTypes.SchemaBuilder<SchemaTypes>,
251
+ table: string,
252
+ type: GraphQLInputObjectType,
253
+ options?: { extensions?: {} },
254
+ ) {
255
+ return (
256
+ this as typeof this & {
257
+ addGraphQLInput: (
258
+ type: GraphQLInputObjectType,
259
+ options: Record<string, unknown>,
260
+ ) => InputObjectRef<SchemaTypes, {}>;
261
+ }
262
+ ).addGraphQLInput(type, {
263
+ ...options,
264
+ extensions: {
265
+ ...options?.extensions,
266
+ drizzleGraphQL: {
267
+ inputType: 'insert',
268
+ table,
269
+ tableConfig: this.options.drizzle.client._.schema?.[table]!,
270
+ } satisfies DrizzleGraphQLInputExtensions,
271
+ },
272
+ });
273
+ } as never;
274
+
275
+ schemaBuilderProto.drizzleGraphQLUpdate = function drizzleGraphQLUpdate(
276
+ this: PothosSchemaTypes.SchemaBuilder<SchemaTypes>,
277
+ table: string,
278
+ type: GraphQLInputObjectType,
279
+ options?: { extensions?: {} },
280
+ ) {
281
+ return (
282
+ this as typeof this & {
283
+ addGraphQLInput: (
284
+ type: GraphQLInputObjectType,
285
+ options: Record<string, unknown>,
286
+ ) => InputObjectRef<SchemaTypes, {}>;
287
+ }
288
+ ).addGraphQLInput(type, {
289
+ ...options,
290
+ extensions: {
291
+ ...options?.extensions,
292
+ drizzleGraphQL: {
293
+ inputType: 'update',
294
+ table,
295
+ tableConfig: this.options.drizzle.client._.schema?.[table]!,
296
+ } satisfies DrizzleGraphQLInputExtensions,
297
+ },
298
+ });
299
+ } as never;