drizzle-graphql-plus 0.8.9 → 0.8.11

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/index.js ADDED
@@ -0,0 +1,2195 @@
1
+ // src/index.ts
2
+ import { is as is6 } from "drizzle-orm";
3
+ import { MySqlDatabase as MySqlDatabase2 } from "drizzle-orm/mysql-core";
4
+ import { PgDatabase as PgDatabase2 } from "drizzle-orm/pg-core";
5
+ import { BaseSQLiteDatabase as BaseSQLiteDatabase2 } from "drizzle-orm/sqlite-core";
6
+ import {
7
+ GraphQLObjectType as GraphQLObjectType6,
8
+ GraphQLSchema
9
+ } from "graphql";
10
+
11
+ // src/util/builders/mysql.ts
12
+ import {
13
+ createTableRelationsHelpers,
14
+ is as is3,
15
+ Relations
16
+ } from "drizzle-orm";
17
+ import { MySqlTable } from "drizzle-orm/mysql-core";
18
+ import {
19
+ GraphQLBoolean as GraphQLBoolean3,
20
+ GraphQLError as GraphQLError3,
21
+ GraphQLInt as GraphQLInt3,
22
+ GraphQLList as GraphQLList3,
23
+ GraphQLNonNull as GraphQLNonNull3,
24
+ GraphQLObjectType as GraphQLObjectType3
25
+ } from "graphql";
26
+
27
+ // src/util/builders/common.ts
28
+ import {
29
+ and,
30
+ asc,
31
+ desc,
32
+ eq,
33
+ getTableColumns as getTableColumns2,
34
+ gt,
35
+ gte,
36
+ ilike,
37
+ inArray,
38
+ is as is2,
39
+ isNotNull,
40
+ isNull,
41
+ like,
42
+ lt,
43
+ lte,
44
+ ne,
45
+ notIlike,
46
+ notInArray,
47
+ notLike,
48
+ One,
49
+ or
50
+ } from "drizzle-orm";
51
+ import {
52
+ GraphQLBoolean as GraphQLBoolean2,
53
+ GraphQLEnumType as GraphQLEnumType2,
54
+ GraphQLError as GraphQLError2,
55
+ GraphQLInputObjectType as GraphQLInputObjectType2,
56
+ GraphQLInt as GraphQLInt2,
57
+ GraphQLList as GraphQLList2,
58
+ GraphQLNonNull as GraphQLNonNull2,
59
+ GraphQLObjectType as GraphQLObjectType2,
60
+ GraphQLString as GraphQLString2,
61
+ GraphQLInterfaceType
62
+ } from "graphql";
63
+
64
+ // src/util/case-ops/index.ts
65
+ var uncapitalize = (input) => input.length ? `${input[0].toLocaleLowerCase()}${input.length > 1 ? input.slice(1, input.length) : ""}` : input;
66
+ var capitalize = (input) => input.length ? `${input[0].toLocaleUpperCase()}${input.length > 1 ? input.slice(1, input.length) : ""}` : input;
67
+
68
+ // src/util/data-mappers/index.ts
69
+ import { getTableColumns } from "drizzle-orm";
70
+ import { GraphQLError } from "graphql";
71
+ var remapToGraphQLCore = (key, value, tableName, column, relationMap) => {
72
+ if (value instanceof Date)
73
+ return value.toISOString();
74
+ if (value instanceof Buffer)
75
+ return Array.from(value);
76
+ if (typeof value === "bigint")
77
+ return value.toString();
78
+ if (Array.isArray(value)) {
79
+ const relations = relationMap?.[tableName];
80
+ if (relations?.[key]) {
81
+ return remapToGraphQLArrayOutput(
82
+ value,
83
+ relations[key].targetTableName,
84
+ relations[key].relation.referencedTable,
85
+ relationMap
86
+ );
87
+ }
88
+ if (column.columnType === "PgGeometry" || column.columnType === "PgVector")
89
+ return value;
90
+ return value.map((arrVal) => remapToGraphQLCore(key, arrVal, tableName, column, relationMap));
91
+ }
92
+ if (typeof value === "object") {
93
+ const relations = relationMap?.[tableName];
94
+ if (relations?.[key]) {
95
+ return remapToGraphQLSingleOutput(
96
+ value,
97
+ relations[key].targetTableName,
98
+ relations[key].relation.referencedTable,
99
+ relationMap
100
+ );
101
+ }
102
+ if (column.columnType === "PgGeometryObject")
103
+ return value;
104
+ return JSON.stringify(value);
105
+ }
106
+ return value;
107
+ };
108
+ var remapToGraphQLSingleOutput = (queryOutput, tableName, table, relationMap) => {
109
+ for (const [key, value] of Object.entries(queryOutput)) {
110
+ if (value === void 0 || value === null) {
111
+ delete queryOutput[key];
112
+ } else {
113
+ queryOutput[key] = remapToGraphQLCore(key, value, tableName, table[key], relationMap);
114
+ }
115
+ }
116
+ return queryOutput;
117
+ };
118
+ var remapToGraphQLArrayOutput = (queryOutput, tableName, table, relationMap) => {
119
+ for (const entry of queryOutput) {
120
+ remapToGraphQLSingleOutput(entry, tableName, table, relationMap);
121
+ }
122
+ return queryOutput;
123
+ };
124
+ var remapFromGraphQLCore = (value, column, columnName) => {
125
+ switch (column.dataType) {
126
+ case "date": {
127
+ const formatted = new Date(value);
128
+ if (Number.isNaN(formatted.getTime()))
129
+ throw new GraphQLError(`Field '${columnName}' is not a valid date!`);
130
+ return formatted;
131
+ }
132
+ case "buffer": {
133
+ if (!Array.isArray(value)) {
134
+ throw new GraphQLError(`Field '${columnName}' is not an array!`);
135
+ }
136
+ return Buffer.from(value);
137
+ }
138
+ case "json": {
139
+ if (column.columnType === "PgGeometryObject")
140
+ return value;
141
+ try {
142
+ return JSON.parse(value);
143
+ } catch (e) {
144
+ throw new GraphQLError(
145
+ `Invalid JSON in field '${columnName}':
146
+ ${e instanceof Error ? e.message : "Unknown error"}`
147
+ );
148
+ }
149
+ }
150
+ case "array": {
151
+ if (!Array.isArray(value)) {
152
+ throw new GraphQLError(`Field '${columnName}' is not an array!`);
153
+ }
154
+ if (column.columnType === "PgGeometry" && value.length !== 2) {
155
+ throw new GraphQLError(
156
+ `Invalid float tuple in field '${columnName}': expected array with length of 2, received ${value.length}`
157
+ );
158
+ }
159
+ return value;
160
+ }
161
+ case "bigint": {
162
+ try {
163
+ return BigInt(value);
164
+ } catch (error) {
165
+ throw new GraphQLError(`Field '${columnName}' is not a BigInt!`);
166
+ }
167
+ }
168
+ default: {
169
+ return value;
170
+ }
171
+ }
172
+ };
173
+ var remapFromGraphQLSingleInput = (queryInput, table) => {
174
+ for (const [key, value] of Object.entries(queryInput)) {
175
+ if (value === void 0) {
176
+ delete queryInput[key];
177
+ } else {
178
+ const column = getTableColumns(table)[key];
179
+ if (!column)
180
+ throw new GraphQLError(`Unknown column: ${key}`);
181
+ if (value === null && column.notNull) {
182
+ delete queryInput[key];
183
+ continue;
184
+ }
185
+ queryInput[key] = remapFromGraphQLCore(value, column, key);
186
+ }
187
+ }
188
+ return queryInput;
189
+ };
190
+ var remapFromGraphQLArrayInput = (queryInput, table) => {
191
+ for (const entry of queryInput)
192
+ remapFromGraphQLSingleInput(entry, table);
193
+ return queryInput;
194
+ };
195
+
196
+ // src/util/type-converter/index.ts
197
+ import { is } from "drizzle-orm";
198
+ import { MySqlInt, MySqlSerial } from "drizzle-orm/mysql-core";
199
+ import { PgInteger, PgSerial } from "drizzle-orm/pg-core";
200
+ import { SQLiteInteger } from "drizzle-orm/sqlite-core";
201
+ import {
202
+ GraphQLBoolean,
203
+ GraphQLEnumType,
204
+ GraphQLFloat,
205
+ GraphQLInputObjectType,
206
+ GraphQLInt,
207
+ GraphQLList,
208
+ GraphQLNonNull,
209
+ GraphQLObjectType,
210
+ GraphQLString
211
+ } from "graphql";
212
+ var allowedNameChars = /^[a-zA-Z0-9_]+$/;
213
+ var enumMap = /* @__PURE__ */ new WeakMap();
214
+ var generateEnumCached = (column, columnName, tableName) => {
215
+ if (enumMap.has(column))
216
+ return enumMap.get(column);
217
+ const gqlEnum = new GraphQLEnumType({
218
+ name: `${capitalize(tableName)}${capitalize(columnName)}Enum`,
219
+ values: Object.fromEntries(column.enumValues.map((e, index) => [allowedNameChars.test(e) ? e : `Option${index}`, {
220
+ value: e,
221
+ description: `Value: ${e}`
222
+ }]))
223
+ });
224
+ enumMap.set(column, gqlEnum);
225
+ return gqlEnum;
226
+ };
227
+ var geoXyType = new GraphQLObjectType({
228
+ name: "PgGeometryObject",
229
+ fields: {
230
+ x: { type: GraphQLFloat },
231
+ y: { type: GraphQLFloat }
232
+ }
233
+ });
234
+ var geoXyInputType = new GraphQLInputObjectType({
235
+ name: "PgGeometryObjectInput",
236
+ fields: {
237
+ x: { type: GraphQLFloat },
238
+ y: { type: GraphQLFloat }
239
+ }
240
+ });
241
+ var columnToGraphQLCore = (column, columnName, tableName, isInput) => {
242
+ switch (column.dataType) {
243
+ case "boolean":
244
+ return { type: GraphQLBoolean, description: "Boolean" };
245
+ case "json":
246
+ return column.columnType === "PgGeometryObject" ? {
247
+ type: isInput ? geoXyInputType : geoXyType,
248
+ description: "Geometry points XY"
249
+ } : { type: GraphQLString, description: "JSON" };
250
+ case "date":
251
+ return { type: GraphQLString, description: "Date" };
252
+ case "string":
253
+ if (column.enumValues?.length)
254
+ return { type: generateEnumCached(column, columnName, tableName) };
255
+ return { type: GraphQLString, description: "String" };
256
+ case "bigint":
257
+ return { type: GraphQLString, description: "BigInt" };
258
+ case "number":
259
+ return is(column, PgInteger) || is(column, PgSerial) || is(column, MySqlInt) || is(column, MySqlSerial) || is(column, SQLiteInteger) ? { type: GraphQLInt, description: "Integer" } : { type: GraphQLFloat, description: "Float" };
260
+ case "buffer":
261
+ return { type: new GraphQLList(new GraphQLNonNull(GraphQLInt)), description: "Buffer" };
262
+ case "array": {
263
+ if (column.columnType === "PgVector") {
264
+ return {
265
+ type: new GraphQLList(new GraphQLNonNull(GraphQLFloat)),
266
+ description: "Array<Float>"
267
+ };
268
+ }
269
+ if (column.columnType === "PgGeometry") {
270
+ return {
271
+ type: new GraphQLList(new GraphQLNonNull(GraphQLFloat)),
272
+ description: "Tuple<[Float, Float]>"
273
+ };
274
+ }
275
+ const innerType = columnToGraphQLCore(
276
+ column.baseColumn,
277
+ columnName,
278
+ tableName,
279
+ isInput
280
+ );
281
+ return {
282
+ type: new GraphQLList(new GraphQLNonNull(innerType.type)),
283
+ description: `Array<${innerType.description}>`
284
+ };
285
+ }
286
+ case "custom":
287
+ default:
288
+ throw new Error(`Drizzle-GraphQL Error: Type ${column.dataType} is not implemented!`);
289
+ }
290
+ };
291
+ var drizzleColumnToGraphQLType = (column, columnName, tableName, forceNullable = false, defaultIsNullable = false, isInput = false) => {
292
+ const typeDesc = columnToGraphQLCore(column, columnName, tableName, isInput);
293
+ const noDesc = ["string", "boolean", "number"];
294
+ if (noDesc.find((e) => e === column.dataType))
295
+ delete typeDesc.description;
296
+ if (forceNullable)
297
+ return typeDesc;
298
+ if (column.notNull && !(defaultIsNullable && (column.hasDefault || column.defaultFn))) {
299
+ return {
300
+ type: new GraphQLNonNull(typeDesc.type),
301
+ description: typeDesc.description
302
+ };
303
+ }
304
+ return typeDesc;
305
+ };
306
+
307
+ // src/util/builders/common.ts
308
+ var rqbCrashTypes = ["SQLiteBigInt", "SQLiteBlobJson", "SQLiteBlobBuffer"];
309
+ var extractSelectedColumnsFromTree = (tree, table) => {
310
+ const tableColumns = getTableColumns2(table);
311
+ const treeEntries = Object.entries(tree);
312
+ const selectedColumns = [];
313
+ for (const [fieldName, fieldData] of treeEntries) {
314
+ if (!tableColumns[fieldData.name])
315
+ continue;
316
+ selectedColumns.push([fieldData.name, true]);
317
+ }
318
+ if (!selectedColumns.length) {
319
+ const columnKeys = Object.entries(tableColumns);
320
+ const columnName = columnKeys.find(
321
+ (e) => rqbCrashTypes.find((haram) => e[1].columnType !== haram)
322
+ )?.[0] ?? columnKeys[0][0];
323
+ selectedColumns.push([columnName, true]);
324
+ }
325
+ return Object.fromEntries(selectedColumns);
326
+ };
327
+ var extractSelectedColumnsFromTreeSQLFormat = (tree, table) => {
328
+ const tableColumns = getTableColumns2(table);
329
+ const treeEntries = Object.entries(tree);
330
+ const selectedColumns = [];
331
+ for (const [fieldName, fieldData] of treeEntries) {
332
+ if (!tableColumns[fieldData.name])
333
+ continue;
334
+ selectedColumns.push([fieldData.name, tableColumns[fieldData.name]]);
335
+ }
336
+ if (!selectedColumns.length) {
337
+ const columnKeys = Object.entries(tableColumns);
338
+ const columnName = columnKeys.find(
339
+ (e) => rqbCrashTypes.find((haram) => e[1].columnType !== haram)
340
+ )?.[0] ?? columnKeys[0][0];
341
+ selectedColumns.push([columnName, tableColumns[columnName]]);
342
+ }
343
+ return Object.fromEntries(selectedColumns);
344
+ };
345
+ var innerOrder = new GraphQLInputObjectType2({
346
+ name: "InnerOrder",
347
+ fields: {
348
+ direction: {
349
+ type: new GraphQLNonNull2(
350
+ new GraphQLEnumType2({
351
+ name: "OrderDirection",
352
+ description: "Order by direction",
353
+ values: {
354
+ asc: {
355
+ value: "asc",
356
+ description: "Ascending order"
357
+ },
358
+ desc: {
359
+ value: "desc",
360
+ description: "Descending order"
361
+ }
362
+ }
363
+ })
364
+ )
365
+ },
366
+ priority: {
367
+ type: new GraphQLNonNull2(GraphQLInt2),
368
+ description: "Priority of current field"
369
+ }
370
+ }
371
+ });
372
+ var generateColumnFilterValues = (column, tableName, columnName) => {
373
+ const columnGraphQLType = drizzleColumnToGraphQLType(
374
+ column,
375
+ columnName,
376
+ tableName,
377
+ true,
378
+ false,
379
+ true
380
+ );
381
+ const columnArr = new GraphQLList2(new GraphQLNonNull2(columnGraphQLType.type));
382
+ const baseFields = {
383
+ eq: {
384
+ type: columnGraphQLType.type,
385
+ description: columnGraphQLType.description
386
+ },
387
+ ne: {
388
+ type: columnGraphQLType.type,
389
+ description: columnGraphQLType.description
390
+ },
391
+ lt: {
392
+ type: columnGraphQLType.type,
393
+ description: columnGraphQLType.description
394
+ },
395
+ lte: {
396
+ type: columnGraphQLType.type,
397
+ description: columnGraphQLType.description
398
+ },
399
+ gt: {
400
+ type: columnGraphQLType.type,
401
+ description: columnGraphQLType.description
402
+ },
403
+ gte: {
404
+ type: columnGraphQLType.type,
405
+ description: columnGraphQLType.description
406
+ },
407
+ like: { type: GraphQLString2 },
408
+ notLike: { type: GraphQLString2 },
409
+ ilike: { type: GraphQLString2 },
410
+ notIlike: { type: GraphQLString2 },
411
+ inArray: {
412
+ type: columnArr,
413
+ description: `Array<${columnGraphQLType.description}>`
414
+ },
415
+ notInArray: {
416
+ type: columnArr,
417
+ description: `Array<${columnGraphQLType.description}>`
418
+ },
419
+ isNull: { type: GraphQLBoolean2 },
420
+ isNotNull: { type: GraphQLBoolean2 }
421
+ };
422
+ const type = new GraphQLInputObjectType2({
423
+ name: `${capitalize(tableName)}${capitalize(columnName)}Filters`,
424
+ fields: {
425
+ ...baseFields,
426
+ OR: {
427
+ type: new GraphQLList2(
428
+ new GraphQLNonNull2(
429
+ new GraphQLInputObjectType2({
430
+ name: `${capitalize(tableName)}${capitalize(
431
+ columnName
432
+ )}filtersOr`,
433
+ fields: {
434
+ ...baseFields
435
+ }
436
+ })
437
+ )
438
+ )
439
+ }
440
+ }
441
+ });
442
+ return type;
443
+ };
444
+ var orderMap = /* @__PURE__ */ new WeakMap();
445
+ var generateTableOrderCached = (table) => {
446
+ if (orderMap.has(table))
447
+ return orderMap.get(table);
448
+ const columns = getTableColumns2(table);
449
+ const columnEntries = Object.entries(columns);
450
+ const remapped = Object.fromEntries(
451
+ columnEntries.map(([columnName, columnDescription]) => [
452
+ columnName,
453
+ { type: innerOrder }
454
+ ])
455
+ );
456
+ orderMap.set(table, remapped);
457
+ return remapped;
458
+ };
459
+ var filterMap = /* @__PURE__ */ new WeakMap();
460
+ var generateTableFilterValuesCached = (table, tableName) => {
461
+ if (filterMap.has(table))
462
+ return filterMap.get(table);
463
+ const columns = getTableColumns2(table);
464
+ const columnEntries = Object.entries(columns);
465
+ const remapped = Object.fromEntries(
466
+ columnEntries.map(([columnName, columnDescription]) => [
467
+ columnName,
468
+ {
469
+ type: generateColumnFilterValues(
470
+ columnDescription,
471
+ tableName,
472
+ columnName
473
+ )
474
+ }
475
+ ])
476
+ );
477
+ filterMap.set(table, remapped);
478
+ return remapped;
479
+ };
480
+ var fieldMap = /* @__PURE__ */ new WeakMap();
481
+ var generateTableSelectTypeFieldsCached = (table, tableName) => {
482
+ if (fieldMap.has(table))
483
+ return fieldMap.get(table);
484
+ const columns = getTableColumns2(table);
485
+ const columnEntries = Object.entries(columns);
486
+ const remapped = Object.fromEntries(
487
+ columnEntries.map(([columnName, columnDescription]) => [
488
+ columnName,
489
+ drizzleColumnToGraphQLType(columnDescription, columnName, tableName)
490
+ ])
491
+ );
492
+ fieldMap.set(table, remapped);
493
+ return remapped;
494
+ };
495
+ var orderTypeMap = /* @__PURE__ */ new WeakMap();
496
+ var generateTableOrderTypeCached = (table, tableName) => {
497
+ if (orderTypeMap.has(table))
498
+ return orderTypeMap.get(table);
499
+ const orderColumns = generateTableOrderCached(table);
500
+ const order = new GraphQLInputObjectType2({
501
+ name: `${capitalize(tableName)}OrderBy`,
502
+ fields: orderColumns
503
+ });
504
+ orderTypeMap.set(table, order);
505
+ return order;
506
+ };
507
+ var filterTypeMap = /* @__PURE__ */ new WeakMap();
508
+ var generateTableFilterTypeCached = (table, tableName) => {
509
+ if (filterTypeMap.has(table))
510
+ return filterTypeMap.get(table);
511
+ const filterColumns = generateTableFilterValuesCached(table, tableName);
512
+ const filters = new GraphQLInputObjectType2({
513
+ name: `${capitalize(tableName)}Filters`,
514
+ fields: {
515
+ ...filterColumns,
516
+ OR: {
517
+ type: new GraphQLList2(
518
+ new GraphQLNonNull2(
519
+ new GraphQLInputObjectType2({
520
+ name: `${capitalize(tableName)}FiltersOr`,
521
+ fields: filterColumns
522
+ })
523
+ )
524
+ )
525
+ }
526
+ }
527
+ });
528
+ filterTypeMap.set(table, filters);
529
+ return filters;
530
+ };
531
+ var interfaceTypeMap = /* @__PURE__ */ new WeakMap();
532
+ var generateTableInterfaceTypeCached = (table, tableName) => {
533
+ if (interfaceTypeMap.has(table))
534
+ return interfaceTypeMap.get(table);
535
+ const tableFields = generateTableSelectTypeFieldsCached(table, tableName);
536
+ const interfaceType = new GraphQLInterfaceType({
537
+ name: `${capitalize(tableName)}Fields`,
538
+ fields: tableFields
539
+ });
540
+ interfaceTypeMap.set(table, interfaceType);
541
+ return interfaceType;
542
+ };
543
+ var generateSelectFields = (tables, tableName, relationMap, typeName, withOrder, relationsDepthLimit, currentDepth = 0, usedTables = /* @__PURE__ */ new Set()) => {
544
+ const relations = relationMap[tableName];
545
+ const relationEntries = relations ? Object.entries(relations) : [];
546
+ const table = tables[tableName];
547
+ const order = withOrder ? generateTableOrderTypeCached(table, tableName) : void 0;
548
+ const filters = generateTableFilterTypeCached(table, tableName);
549
+ const tableFields = generateTableSelectTypeFieldsCached(table, tableName);
550
+ if (usedTables.has(tableName) || typeof relationsDepthLimit === "number" && currentDepth >= relationsDepthLimit || !relationEntries.length) {
551
+ return {
552
+ order,
553
+ filters,
554
+ tableFields,
555
+ relationFields: {}
556
+ };
557
+ }
558
+ const rawRelationFields = [];
559
+ const updatedUsedTables = new Set(usedTables).add(tableName);
560
+ const newDepth = currentDepth + 1;
561
+ for (const [relationName, { targetTableName, relation }] of relationEntries) {
562
+ const relTypeName = `${typeName}${capitalize(relationName)}Relation`;
563
+ const isOne = is2(relation, One);
564
+ const relData = generateSelectFields(
565
+ tables,
566
+ targetTableName,
567
+ relationMap,
568
+ relTypeName,
569
+ !isOne,
570
+ relationsDepthLimit,
571
+ newDepth,
572
+ updatedUsedTables
573
+ );
574
+ const targetTable = tables[targetTableName];
575
+ const targetInterface = generateTableInterfaceTypeCached(
576
+ targetTable,
577
+ targetTableName
578
+ );
579
+ const relType = new GraphQLObjectType2({
580
+ name: relTypeName,
581
+ fields: { ...relData.tableFields, ...relData.relationFields },
582
+ interfaces: [targetInterface]
583
+ });
584
+ if (isOne) {
585
+ rawRelationFields.push([
586
+ relationName,
587
+ {
588
+ type: relType,
589
+ args: {
590
+ where: { type: relData.filters }
591
+ }
592
+ }
593
+ ]);
594
+ continue;
595
+ }
596
+ rawRelationFields.push([
597
+ relationName,
598
+ {
599
+ type: new GraphQLNonNull2(new GraphQLList2(new GraphQLNonNull2(relType))),
600
+ args: {
601
+ where: { type: relData.filters },
602
+ orderBy: { type: relData.order },
603
+ offset: { type: GraphQLInt2 },
604
+ limit: { type: GraphQLInt2 }
605
+ }
606
+ }
607
+ ]);
608
+ }
609
+ const relationFields = Object.fromEntries(rawRelationFields);
610
+ return {
611
+ order,
612
+ filters,
613
+ tableFields,
614
+ relationFields
615
+ };
616
+ };
617
+ var generateTableTypes = (tableName, tables, relationMap, withReturning, relationsDepthLimit) => {
618
+ const stylizedName = capitalize(tableName);
619
+ const { tableFields, relationFields, filters, order } = generateSelectFields(
620
+ tables,
621
+ tableName,
622
+ relationMap,
623
+ stylizedName,
624
+ true,
625
+ relationsDepthLimit
626
+ );
627
+ const table = tables[tableName];
628
+ const columns = getTableColumns2(table);
629
+ const columnEntries = Object.entries(columns);
630
+ const insertFields = Object.fromEntries(
631
+ columnEntries.map(([columnName, columnDescription]) => [
632
+ columnName,
633
+ drizzleColumnToGraphQLType(
634
+ columnDescription,
635
+ columnName,
636
+ tableName,
637
+ false,
638
+ true,
639
+ true
640
+ )
641
+ ])
642
+ );
643
+ const updateFields = Object.fromEntries(
644
+ columnEntries.map(([columnName, columnDescription]) => [
645
+ columnName,
646
+ drizzleColumnToGraphQLType(
647
+ columnDescription,
648
+ columnName,
649
+ tableName,
650
+ true,
651
+ false,
652
+ true
653
+ )
654
+ ])
655
+ );
656
+ const insertInput = new GraphQLInputObjectType2({
657
+ name: `${stylizedName}InsertInput`,
658
+ fields: insertFields
659
+ });
660
+ const tableFieldsInterface = generateTableInterfaceTypeCached(
661
+ table,
662
+ tableName
663
+ );
664
+ const selectSingleOutput = new GraphQLObjectType2({
665
+ name: `${stylizedName}SelectItem`,
666
+ fields: { ...tableFields, ...relationFields },
667
+ interfaces: [tableFieldsInterface]
668
+ });
669
+ const selectArrOutput = new GraphQLNonNull2(
670
+ new GraphQLList2(new GraphQLNonNull2(selectSingleOutput))
671
+ );
672
+ const singleTableItemOutput = withReturning ? new GraphQLObjectType2({
673
+ name: `${stylizedName}Item`,
674
+ fields: tableFields,
675
+ interfaces: [tableFieldsInterface]
676
+ }) : void 0;
677
+ const arrTableItemOutput = withReturning ? new GraphQLNonNull2(
678
+ new GraphQLList2(new GraphQLNonNull2(singleTableItemOutput))
679
+ ) : void 0;
680
+ const updateInput = new GraphQLInputObjectType2({
681
+ name: `${stylizedName}UpdateInput`,
682
+ fields: updateFields
683
+ });
684
+ const inputs = {
685
+ insertInput,
686
+ updateInput,
687
+ tableOrder: order,
688
+ tableFilters: filters
689
+ };
690
+ const outputs = withReturning ? {
691
+ selectSingleOutput,
692
+ selectArrOutput,
693
+ singleTableItemOutput,
694
+ arrTableItemOutput,
695
+ tableFieldsInterface
696
+ } : {
697
+ selectSingleOutput,
698
+ selectArrOutput,
699
+ tableFieldsInterface
700
+ };
701
+ return {
702
+ inputs,
703
+ outputs
704
+ };
705
+ };
706
+ var extractOrderBy = (table, orderArgs) => {
707
+ const res = [];
708
+ for (const [column, config] of Object.entries(orderArgs).sort(
709
+ (a, b) => (b[1]?.priority ?? 0) - (a[1]?.priority ?? 0)
710
+ )) {
711
+ if (!config)
712
+ continue;
713
+ const { direction } = config;
714
+ res.push(
715
+ direction === "asc" ? asc(getTableColumns2(table)[column]) : desc(getTableColumns2(table)[column])
716
+ );
717
+ }
718
+ return res;
719
+ };
720
+ var extractFiltersColumn = (column, columnName, operators) => {
721
+ if (!operators.OR?.length)
722
+ delete operators.OR;
723
+ const entries = Object.entries(
724
+ operators
725
+ );
726
+ if (operators.OR) {
727
+ if (entries.length > 1) {
728
+ throw new GraphQLError2(
729
+ `WHERE ${columnName}: Cannot specify both fields and 'OR' in column operators!`
730
+ );
731
+ }
732
+ const variants2 = [];
733
+ for (const variant of operators.OR) {
734
+ const extracted = extractFiltersColumn(column, columnName, variant);
735
+ if (extracted)
736
+ variants2.push(extracted);
737
+ }
738
+ return variants2.length ? variants2.length > 1 ? or(...variants2) : variants2[0] : void 0;
739
+ }
740
+ const variants = [];
741
+ for (const [operatorName, operatorValue] of entries) {
742
+ if (operatorValue === null || operatorValue === false)
743
+ continue;
744
+ let operator;
745
+ switch (operatorName) {
746
+ case "eq":
747
+ operator = operator ?? eq;
748
+ case "ne":
749
+ operator = operator ?? ne;
750
+ case "gt":
751
+ operator = operator ?? gt;
752
+ case "gte":
753
+ operator = operator ?? gte;
754
+ case "lt":
755
+ operator = operator ?? lt;
756
+ case "lte":
757
+ operator = operator ?? lte;
758
+ const singleValue = remapFromGraphQLCore(
759
+ operatorValue,
760
+ column,
761
+ columnName
762
+ );
763
+ variants.push(operator(column, singleValue));
764
+ break;
765
+ case "like":
766
+ operator = operator ?? like;
767
+ case "notLike":
768
+ operator = operator ?? notLike;
769
+ case "ilike":
770
+ operator = operator ?? ilike;
771
+ case "notIlike":
772
+ operator = operator ?? notIlike;
773
+ variants.push(operator(column, operatorValue));
774
+ break;
775
+ case "inArray":
776
+ operator = operator ?? inArray;
777
+ case "notInArray":
778
+ operator = operator ?? notInArray;
779
+ if (!operatorValue.length) {
780
+ throw new GraphQLError2(
781
+ `WHERE ${columnName}: Unable to use operator ${operatorName} with an empty array!`
782
+ );
783
+ }
784
+ const arrayValue = operatorValue.map(
785
+ (val) => remapFromGraphQLCore(val, column, columnName)
786
+ );
787
+ variants.push(operator(column, arrayValue));
788
+ break;
789
+ case "isNull":
790
+ operator = operator ?? isNull;
791
+ case "isNotNull":
792
+ operator = operator ?? isNotNull;
793
+ variants.push(operator(column));
794
+ }
795
+ }
796
+ return variants.length ? variants.length > 1 ? and(...variants) : variants[0] : void 0;
797
+ };
798
+ var extractFilters = (table, tableName, filters) => {
799
+ if (!filters.OR?.length)
800
+ delete filters.OR;
801
+ const entries = Object.entries(filters);
802
+ if (!entries.length)
803
+ return;
804
+ if (filters.OR) {
805
+ if (entries.length > 1) {
806
+ throw new GraphQLError2(
807
+ `WHERE ${tableName}: Cannot specify both fields and 'OR' in table filters!`
808
+ );
809
+ }
810
+ const variants2 = [];
811
+ for (const variant of filters.OR) {
812
+ const extracted = extractFilters(table, tableName, variant);
813
+ if (extracted)
814
+ variants2.push(extracted);
815
+ }
816
+ return variants2.length ? variants2.length > 1 ? or(...variants2) : variants2[0] : void 0;
817
+ }
818
+ const variants = [];
819
+ for (const [columnName, operators] of entries) {
820
+ if (operators === null)
821
+ continue;
822
+ const column = getTableColumns2(table)[columnName];
823
+ variants.push(extractFiltersColumn(column, columnName, operators));
824
+ }
825
+ return variants.length ? variants.length > 1 ? and(...variants) : variants[0] : void 0;
826
+ };
827
+ var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, originField, isInitial = false) => {
828
+ const relations = relationMap[tableName];
829
+ if (!relations)
830
+ return void 0;
831
+ const baseField = Object.entries(originField.fieldsByTypeName).find(
832
+ ([key, value]) => key === typeName
833
+ )?.[1];
834
+ if (!baseField)
835
+ return void 0;
836
+ const args = {};
837
+ for (const [relName, { targetTableName, relation }] of Object.entries(
838
+ relations
839
+ )) {
840
+ const relTypeName = `${isInitial ? capitalize(tableName) : typeName}${capitalize(relName)}Relation`;
841
+ const relFieldSelection = Object.values(baseField).find(
842
+ (field) => field.name === relName
843
+ )?.fieldsByTypeName[relTypeName];
844
+ if (!relFieldSelection)
845
+ continue;
846
+ const columns = extractSelectedColumnsFromTree(
847
+ relFieldSelection,
848
+ tables[targetTableName]
849
+ );
850
+ const thisRecord = {};
851
+ thisRecord.columns = columns;
852
+ const relationField = Object.values(baseField).find(
853
+ (e) => e.name === relName
854
+ );
855
+ const relationArgs = relationField?.args;
856
+ const orderBy = relationArgs?.orderBy ? extractOrderBy(tables[targetTableName], relationArgs.orderBy) : void 0;
857
+ const where = relationArgs?.where ? extractFilters(tables[targetTableName], relName, relationArgs?.where) : void 0;
858
+ const offset = relationArgs?.offset ?? void 0;
859
+ const limit = relationArgs?.limit ?? void 0;
860
+ thisRecord.orderBy = orderBy;
861
+ thisRecord.where = where;
862
+ thisRecord.offset = offset;
863
+ thisRecord.limit = limit;
864
+ const relWith = relationField ? extractRelationsParamsInner(
865
+ relationMap,
866
+ tables,
867
+ targetTableName,
868
+ relTypeName,
869
+ relationField
870
+ ) : void 0;
871
+ thisRecord.with = relWith;
872
+ args[relName] = thisRecord;
873
+ }
874
+ return args;
875
+ };
876
+ var extractRelationsParams = (relationMap, tables, tableName, info, typeName) => {
877
+ if (!info)
878
+ return void 0;
879
+ return extractRelationsParamsInner(
880
+ relationMap,
881
+ tables,
882
+ tableName,
883
+ typeName,
884
+ info,
885
+ true
886
+ );
887
+ };
888
+
889
+ // src/util/builders/mysql.ts
890
+ import { parseResolveInfo } from "graphql-parse-resolve-info";
891
+ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filterArgs) => {
892
+ const queryName = `${uncapitalize(tableName)}`;
893
+ const queryBase = db.query[tableName];
894
+ if (!queryBase) {
895
+ throw new Error(
896
+ `Drizzle-GraphQL Error: Table ${tableName} not found in drizzle instance. Did you forget to pass schema to drizzle constructor?`
897
+ );
898
+ }
899
+ const queryArgs = {
900
+ offset: {
901
+ type: GraphQLInt3
902
+ },
903
+ limit: {
904
+ type: GraphQLInt3
905
+ },
906
+ orderBy: {
907
+ type: orderArgs
908
+ },
909
+ where: {
910
+ type: filterArgs
911
+ }
912
+ };
913
+ const typeName = `${capitalize(tableName)}SelectItem`;
914
+ const table = tables[tableName];
915
+ return {
916
+ name: queryName,
917
+ resolver: async (source, args, context, info) => {
918
+ try {
919
+ const { offset, limit, orderBy, where } = args;
920
+ const parsedInfo = parseResolveInfo(info, {
921
+ deep: true
922
+ });
923
+ const query = queryBase.findMany({
924
+ columns: extractSelectedColumnsFromTree(
925
+ parsedInfo.fieldsByTypeName[typeName],
926
+ table
927
+ ),
928
+ offset,
929
+ limit,
930
+ orderBy: orderBy ? extractOrderBy(table, orderBy) : void 0,
931
+ where: where ? extractFilters(table, tableName, where) : void 0,
932
+ with: relationMap[tableName] ? extractRelationsParams(
933
+ relationMap,
934
+ tables,
935
+ tableName,
936
+ parsedInfo,
937
+ typeName
938
+ ) : void 0
939
+ });
940
+ const result = await query;
941
+ return remapToGraphQLArrayOutput(result, tableName, table, relationMap);
942
+ } catch (e) {
943
+ if (typeof e === "object" && typeof e.message === "string") {
944
+ throw new GraphQLError3(e.message);
945
+ }
946
+ throw e;
947
+ }
948
+ },
949
+ args: queryArgs
950
+ };
951
+ };
952
+ var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filterArgs) => {
953
+ const queryName = `${uncapitalize(tableName)}Single`;
954
+ const queryBase = db.query[tableName];
955
+ if (!queryBase) {
956
+ throw new Error(
957
+ `Drizzle-GraphQL Error: Table ${tableName} not found in drizzle instance. Did you forget to pass schema to drizzle constructor?`
958
+ );
959
+ }
960
+ const queryArgs = {
961
+ offset: {
962
+ type: GraphQLInt3
963
+ },
964
+ orderBy: {
965
+ type: orderArgs
966
+ },
967
+ where: {
968
+ type: filterArgs
969
+ }
970
+ };
971
+ const typeName = `${capitalize(tableName)}SelectItem`;
972
+ const table = tables[tableName];
973
+ return {
974
+ name: queryName,
975
+ resolver: async (source, args, context, info) => {
976
+ try {
977
+ const { offset, orderBy, where } = args;
978
+ const parsedInfo = parseResolveInfo(info, {
979
+ deep: true
980
+ });
981
+ const query = queryBase.findFirst({
982
+ columns: extractSelectedColumnsFromTree(
983
+ parsedInfo.fieldsByTypeName[typeName],
984
+ table
985
+ ),
986
+ offset,
987
+ orderBy: orderBy ? extractOrderBy(table, orderBy) : void 0,
988
+ where: where ? extractFilters(table, tableName, where) : void 0,
989
+ with: relationMap[tableName] ? extractRelationsParams(
990
+ relationMap,
991
+ tables,
992
+ tableName,
993
+ parsedInfo,
994
+ typeName
995
+ ) : void 0
996
+ });
997
+ const result = await query;
998
+ if (!result)
999
+ return void 0;
1000
+ return remapToGraphQLSingleOutput(
1001
+ result,
1002
+ tableName,
1003
+ table,
1004
+ relationMap
1005
+ );
1006
+ } catch (e) {
1007
+ if (typeof e === "object" && typeof e.message === "string") {
1008
+ throw new GraphQLError3(e.message);
1009
+ }
1010
+ throw e;
1011
+ }
1012
+ },
1013
+ args: queryArgs
1014
+ };
1015
+ };
1016
+ var generateInsertArray = (db, tableName, table, baseType) => {
1017
+ const queryName = `insertInto${capitalize(tableName)}`;
1018
+ const queryArgs = {
1019
+ values: {
1020
+ type: new GraphQLNonNull3(new GraphQLList3(new GraphQLNonNull3(baseType)))
1021
+ }
1022
+ };
1023
+ return {
1024
+ name: queryName,
1025
+ resolver: async (source, args, context, info) => {
1026
+ try {
1027
+ const input = remapFromGraphQLArrayInput(args.values, table);
1028
+ if (!input.length)
1029
+ throw new GraphQLError3("No values were provided!");
1030
+ await db.insert(table).values(input);
1031
+ return { isSuccess: true };
1032
+ } catch (e) {
1033
+ if (typeof e === "object" && typeof e.message === "string") {
1034
+ throw new GraphQLError3(e.message);
1035
+ }
1036
+ throw e;
1037
+ }
1038
+ },
1039
+ args: queryArgs
1040
+ };
1041
+ };
1042
+ var generateInsertSingle = (db, tableName, table, baseType) => {
1043
+ const queryName = `insertInto${capitalize(tableName)}Single`;
1044
+ const queryArgs = {
1045
+ values: {
1046
+ type: new GraphQLNonNull3(baseType)
1047
+ }
1048
+ };
1049
+ return {
1050
+ name: queryName,
1051
+ resolver: async (source, args, context, info) => {
1052
+ try {
1053
+ const input = remapFromGraphQLSingleInput(args.values, table);
1054
+ await db.insert(table).values(input);
1055
+ return { isSuccess: true };
1056
+ } catch (e) {
1057
+ if (typeof e === "object" && typeof e.message === "string") {
1058
+ throw new GraphQLError3(e.message);
1059
+ }
1060
+ throw e;
1061
+ }
1062
+ },
1063
+ args: queryArgs
1064
+ };
1065
+ };
1066
+ var generateUpdate = (db, tableName, table, setArgs, filterArgs) => {
1067
+ const queryName = `update${capitalize(tableName)}`;
1068
+ const queryArgs = {
1069
+ set: {
1070
+ type: new GraphQLNonNull3(setArgs)
1071
+ },
1072
+ where: {
1073
+ type: filterArgs
1074
+ }
1075
+ };
1076
+ return {
1077
+ name: queryName,
1078
+ resolver: async (source, args, context, info) => {
1079
+ try {
1080
+ const { where, set } = args;
1081
+ const input = remapFromGraphQLSingleInput(set, table);
1082
+ if (!Object.keys(input).length)
1083
+ throw new GraphQLError3("Unable to update with no values specified!");
1084
+ let query = db.update(table).set(input);
1085
+ if (where) {
1086
+ const filters = extractFilters(table, tableName, where);
1087
+ query = query.where(filters);
1088
+ }
1089
+ await query;
1090
+ return { isSuccess: true };
1091
+ } catch (e) {
1092
+ if (typeof e === "object" && typeof e.message === "string") {
1093
+ throw new GraphQLError3(e.message);
1094
+ }
1095
+ throw e;
1096
+ }
1097
+ },
1098
+ args: queryArgs
1099
+ };
1100
+ };
1101
+ var generateDelete = (db, tableName, table, filterArgs) => {
1102
+ const queryName = `deleteFrom${tableName}`;
1103
+ const queryArgs = {
1104
+ where: {
1105
+ type: filterArgs
1106
+ }
1107
+ };
1108
+ return {
1109
+ name: queryName,
1110
+ resolver: async (source, args, context, info) => {
1111
+ try {
1112
+ const { where } = args;
1113
+ let query = db.delete(table);
1114
+ if (where) {
1115
+ const filters = extractFilters(table, tableName, where);
1116
+ query = query.where(filters);
1117
+ }
1118
+ await query;
1119
+ return { isSuccess: true };
1120
+ } catch (e) {
1121
+ if (typeof e === "object" && typeof e.message === "string") {
1122
+ throw new GraphQLError3(e.message);
1123
+ }
1124
+ throw e;
1125
+ }
1126
+ },
1127
+ args: queryArgs
1128
+ };
1129
+ };
1130
+ var generateSchemaData = (db, schema, relationsDepthLimit) => {
1131
+ const rawSchema = schema;
1132
+ const schemaEntries = Object.entries(rawSchema);
1133
+ const tableEntries = schemaEntries.filter(
1134
+ ([key, value]) => is3(value, MySqlTable)
1135
+ );
1136
+ const tables = Object.fromEntries(tableEntries);
1137
+ if (!tableEntries.length) {
1138
+ throw new Error(
1139
+ "Drizzle-GraphQL Error: No tables detected in Drizzle-ORM's database instance. Did you forget to pass schema to drizzle constructor?"
1140
+ );
1141
+ }
1142
+ const rawRelations = schemaEntries.filter(([key, value]) => is3(value, Relations)).map(([key, value]) => [
1143
+ tableEntries.find(
1144
+ ([tableName, tableValue]) => tableValue === value.table
1145
+ )[0],
1146
+ value
1147
+ ]).map(([tableName, relValue]) => [
1148
+ tableName,
1149
+ relValue.config(createTableRelationsHelpers(tables[tableName]))
1150
+ ]);
1151
+ const namedRelations = Object.fromEntries(
1152
+ rawRelations.map(([relName, config]) => {
1153
+ const namedConfig = Object.fromEntries(
1154
+ Object.entries(config).map(([innerRelName, innerRelValue]) => [
1155
+ innerRelName,
1156
+ {
1157
+ relation: innerRelValue,
1158
+ targetTableName: tableEntries.find(
1159
+ ([tableName, tableValue]) => tableValue === innerRelValue.referencedTable
1160
+ )[0]
1161
+ }
1162
+ ])
1163
+ );
1164
+ return [relName, namedConfig];
1165
+ })
1166
+ );
1167
+ const queries = {};
1168
+ const mutations = {};
1169
+ const gqlSchemaTypes = Object.fromEntries(
1170
+ Object.entries(tables).map(([tableName, table]) => [
1171
+ tableName,
1172
+ generateTableTypes(
1173
+ tableName,
1174
+ tables,
1175
+ namedRelations,
1176
+ false,
1177
+ relationsDepthLimit
1178
+ )
1179
+ ])
1180
+ );
1181
+ const mutationReturnType = new GraphQLObjectType3({
1182
+ name: `MutationReturn`,
1183
+ fields: {
1184
+ isSuccess: {
1185
+ type: new GraphQLNonNull3(GraphQLBoolean3)
1186
+ }
1187
+ }
1188
+ });
1189
+ const inputs = {};
1190
+ const interfaces = {};
1191
+ const outputs = {
1192
+ MutationReturn: mutationReturnType
1193
+ };
1194
+ for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
1195
+ const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
1196
+ const { selectSingleOutput, selectArrOutput, tableFieldsInterface } = tableTypes.outputs;
1197
+ const selectArrGenerated = generateSelectArray(
1198
+ db,
1199
+ tableName,
1200
+ tables,
1201
+ namedRelations,
1202
+ tableOrder,
1203
+ tableFilters
1204
+ );
1205
+ const selectSingleGenerated = generateSelectSingle(
1206
+ db,
1207
+ tableName,
1208
+ tables,
1209
+ namedRelations,
1210
+ tableOrder,
1211
+ tableFilters
1212
+ );
1213
+ const insertArrGenerated = generateInsertArray(
1214
+ db,
1215
+ tableName,
1216
+ schema[tableName],
1217
+ insertInput
1218
+ );
1219
+ const insertSingleGenerated = generateInsertSingle(
1220
+ db,
1221
+ tableName,
1222
+ schema[tableName],
1223
+ insertInput
1224
+ );
1225
+ const updateGenerated = generateUpdate(
1226
+ db,
1227
+ tableName,
1228
+ schema[tableName],
1229
+ updateInput,
1230
+ tableFilters
1231
+ );
1232
+ const deleteGenerated = generateDelete(
1233
+ db,
1234
+ tableName,
1235
+ schema[tableName],
1236
+ tableFilters
1237
+ );
1238
+ queries[selectArrGenerated.name] = {
1239
+ type: selectArrOutput,
1240
+ args: selectArrGenerated.args,
1241
+ resolve: selectArrGenerated.resolver
1242
+ };
1243
+ queries[selectSingleGenerated.name] = {
1244
+ type: selectSingleOutput,
1245
+ args: selectSingleGenerated.args,
1246
+ resolve: selectSingleGenerated.resolver
1247
+ };
1248
+ mutations[insertArrGenerated.name] = {
1249
+ type: mutationReturnType,
1250
+ args: insertArrGenerated.args,
1251
+ resolve: insertArrGenerated.resolver
1252
+ };
1253
+ mutations[insertSingleGenerated.name] = {
1254
+ type: mutationReturnType,
1255
+ args: insertSingleGenerated.args,
1256
+ resolve: insertSingleGenerated.resolver
1257
+ };
1258
+ mutations[updateGenerated.name] = {
1259
+ type: mutationReturnType,
1260
+ args: updateGenerated.args,
1261
+ resolve: updateGenerated.resolver
1262
+ };
1263
+ mutations[deleteGenerated.name] = {
1264
+ type: mutationReturnType,
1265
+ args: deleteGenerated.args,
1266
+ resolve: deleteGenerated.resolver
1267
+ };
1268
+ [insertInput, updateInput, tableFilters, tableOrder].forEach(
1269
+ (e) => inputs[e.name] = e
1270
+ );
1271
+ outputs[selectSingleOutput.name] = selectSingleOutput;
1272
+ interfaces[tableFieldsInterface.name] = tableFieldsInterface;
1273
+ }
1274
+ return { queries, mutations, inputs, interfaces, types: outputs };
1275
+ };
1276
+
1277
+ // src/util/builders/pg.ts
1278
+ import {
1279
+ createTableRelationsHelpers as createTableRelationsHelpers2,
1280
+ is as is4,
1281
+ Relations as Relations2
1282
+ } from "drizzle-orm";
1283
+ import { PgTable } from "drizzle-orm/pg-core";
1284
+ import {
1285
+ GraphQLError as GraphQLError4,
1286
+ GraphQLInt as GraphQLInt4,
1287
+ GraphQLList as GraphQLList4,
1288
+ GraphQLNonNull as GraphQLNonNull4
1289
+ } from "graphql";
1290
+ import { parseResolveInfo as parseResolveInfo2 } from "graphql-parse-resolve-info";
1291
+ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filterArgs) => {
1292
+ const queryName = `${uncapitalize(tableName)}`;
1293
+ const queryBase = db.query[tableName];
1294
+ if (!queryBase) {
1295
+ throw new Error(
1296
+ `Drizzle-GraphQL Error: Table ${tableName} not found in drizzle instance. Did you forget to pass schema to drizzle constructor?`
1297
+ );
1298
+ }
1299
+ const queryArgs = {
1300
+ offset: {
1301
+ type: GraphQLInt4
1302
+ },
1303
+ limit: {
1304
+ type: GraphQLInt4
1305
+ },
1306
+ orderBy: {
1307
+ type: orderArgs
1308
+ },
1309
+ where: {
1310
+ type: filterArgs
1311
+ }
1312
+ };
1313
+ const typeName = `${capitalize(tableName)}SelectItem`;
1314
+ const table = tables[tableName];
1315
+ return {
1316
+ name: queryName,
1317
+ resolver: async (source, args, context, info) => {
1318
+ try {
1319
+ const { offset, limit, orderBy, where } = args;
1320
+ const parsedInfo = parseResolveInfo2(info, {
1321
+ deep: true
1322
+ });
1323
+ const query = queryBase.findMany({
1324
+ columns: extractSelectedColumnsFromTree(
1325
+ parsedInfo.fieldsByTypeName[typeName],
1326
+ table
1327
+ ),
1328
+ offset,
1329
+ limit,
1330
+ orderBy: orderBy ? extractOrderBy(table, orderBy) : void 0,
1331
+ where: where ? extractFilters(table, tableName, where) : void 0,
1332
+ with: relationMap[tableName] ? extractRelationsParams(
1333
+ relationMap,
1334
+ tables,
1335
+ tableName,
1336
+ parsedInfo,
1337
+ typeName
1338
+ ) : void 0
1339
+ });
1340
+ const result = await query;
1341
+ return remapToGraphQLArrayOutput(result, tableName, table, relationMap);
1342
+ } catch (e) {
1343
+ if (typeof e === "object" && typeof e.message === "string") {
1344
+ throw new GraphQLError4(e.message);
1345
+ }
1346
+ throw e;
1347
+ }
1348
+ },
1349
+ args: queryArgs
1350
+ };
1351
+ };
1352
+ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filterArgs) => {
1353
+ const queryName = `${uncapitalize(tableName)}Single`;
1354
+ const queryBase = db.query[tableName];
1355
+ if (!queryBase) {
1356
+ throw new Error(
1357
+ `Drizzle-GraphQL Error: Table ${tableName} not found in drizzle instance. Did you forget to pass schema to drizzle constructor?`
1358
+ );
1359
+ }
1360
+ const queryArgs = {
1361
+ offset: {
1362
+ type: GraphQLInt4
1363
+ },
1364
+ orderBy: {
1365
+ type: orderArgs
1366
+ },
1367
+ where: {
1368
+ type: filterArgs
1369
+ }
1370
+ };
1371
+ const typeName = `${capitalize(tableName)}SelectItem`;
1372
+ const table = tables[tableName];
1373
+ return {
1374
+ name: queryName,
1375
+ resolver: async (source, args, context, info) => {
1376
+ try {
1377
+ const { offset, orderBy, where } = args;
1378
+ const parsedInfo = parseResolveInfo2(info, {
1379
+ deep: true
1380
+ });
1381
+ const query = queryBase.findFirst({
1382
+ columns: extractSelectedColumnsFromTree(
1383
+ parsedInfo.fieldsByTypeName[typeName],
1384
+ table
1385
+ ),
1386
+ offset,
1387
+ orderBy: orderBy ? extractOrderBy(table, orderBy) : void 0,
1388
+ where: where ? extractFilters(table, tableName, where) : void 0,
1389
+ with: relationMap[tableName] ? extractRelationsParams(
1390
+ relationMap,
1391
+ tables,
1392
+ tableName,
1393
+ parsedInfo,
1394
+ typeName
1395
+ ) : void 0
1396
+ });
1397
+ const result = await query;
1398
+ if (!result)
1399
+ return void 0;
1400
+ return remapToGraphQLSingleOutput(
1401
+ result,
1402
+ tableName,
1403
+ table,
1404
+ relationMap
1405
+ );
1406
+ } catch (e) {
1407
+ if (typeof e === "object" && typeof e.message === "string") {
1408
+ throw new GraphQLError4(e.message);
1409
+ }
1410
+ throw e;
1411
+ }
1412
+ },
1413
+ args: queryArgs
1414
+ };
1415
+ };
1416
+ var generateInsertArray2 = (db, tableName, table, baseType) => {
1417
+ const queryName = `insertInto${capitalize(tableName)}`;
1418
+ const typeName = `${capitalize(tableName)}Item`;
1419
+ const queryArgs = {
1420
+ values: {
1421
+ type: new GraphQLNonNull4(new GraphQLList4(new GraphQLNonNull4(baseType)))
1422
+ }
1423
+ };
1424
+ return {
1425
+ name: queryName,
1426
+ resolver: async (source, args, context, info) => {
1427
+ try {
1428
+ const input = remapFromGraphQLArrayInput(args.values, table);
1429
+ if (!input.length)
1430
+ throw new GraphQLError4("No values were provided!");
1431
+ const parsedInfo = parseResolveInfo2(info, {
1432
+ deep: true
1433
+ });
1434
+ const columns = extractSelectedColumnsFromTreeSQLFormat(
1435
+ parsedInfo.fieldsByTypeName[typeName],
1436
+ table
1437
+ );
1438
+ const result = await db.insert(table).values(input).returning(columns).onConflictDoNothing();
1439
+ return remapToGraphQLArrayOutput(result, tableName, table);
1440
+ } catch (e) {
1441
+ if (typeof e === "object" && typeof e.message === "string") {
1442
+ throw new GraphQLError4(e.message);
1443
+ }
1444
+ throw e;
1445
+ }
1446
+ },
1447
+ args: queryArgs
1448
+ };
1449
+ };
1450
+ var generateInsertSingle2 = (db, tableName, table, baseType) => {
1451
+ const queryName = `insertInto${capitalize(tableName)}Single`;
1452
+ const typeName = `${capitalize(tableName)}Item`;
1453
+ const queryArgs = {
1454
+ values: {
1455
+ type: new GraphQLNonNull4(baseType)
1456
+ }
1457
+ };
1458
+ return {
1459
+ name: queryName,
1460
+ resolver: async (source, args, context, info) => {
1461
+ try {
1462
+ const input = remapFromGraphQLSingleInput(args.values, table);
1463
+ const parsedInfo = parseResolveInfo2(info, {
1464
+ deep: true
1465
+ });
1466
+ const columns = extractSelectedColumnsFromTreeSQLFormat(
1467
+ parsedInfo.fieldsByTypeName[typeName],
1468
+ table
1469
+ );
1470
+ const result = await db.insert(table).values(input).returning(columns).onConflictDoNothing();
1471
+ if (!result[0])
1472
+ return void 0;
1473
+ return remapToGraphQLSingleOutput(result[0], tableName, table);
1474
+ } catch (e) {
1475
+ if (typeof e === "object" && typeof e.message === "string") {
1476
+ throw new GraphQLError4(e.message);
1477
+ }
1478
+ throw e;
1479
+ }
1480
+ },
1481
+ args: queryArgs
1482
+ };
1483
+ };
1484
+ var generateUpdate2 = (db, tableName, table, setArgs, filterArgs) => {
1485
+ const queryName = `update${capitalize(tableName)}`;
1486
+ const typeName = `${capitalize(tableName)}Item`;
1487
+ const queryArgs = {
1488
+ set: {
1489
+ type: new GraphQLNonNull4(setArgs)
1490
+ },
1491
+ where: {
1492
+ type: filterArgs
1493
+ }
1494
+ };
1495
+ return {
1496
+ name: queryName,
1497
+ resolver: async (source, args, context, info) => {
1498
+ try {
1499
+ const { where, set } = args;
1500
+ const parsedInfo = parseResolveInfo2(info, {
1501
+ deep: true
1502
+ });
1503
+ const columns = extractSelectedColumnsFromTreeSQLFormat(
1504
+ parsedInfo.fieldsByTypeName[typeName],
1505
+ table
1506
+ );
1507
+ const input = remapFromGraphQLSingleInput(set, table);
1508
+ if (!Object.keys(input).length)
1509
+ throw new GraphQLError4("Unable to update with no values specified!");
1510
+ let query = db.update(table).set(input);
1511
+ if (where) {
1512
+ const filters = extractFilters(table, tableName, where);
1513
+ query = query.where(filters);
1514
+ }
1515
+ query = query.returning(columns);
1516
+ const result = await query;
1517
+ return remapToGraphQLArrayOutput(result, tableName, table);
1518
+ } catch (e) {
1519
+ if (typeof e === "object" && typeof e.message === "string") {
1520
+ throw new GraphQLError4(e.message);
1521
+ }
1522
+ throw e;
1523
+ }
1524
+ },
1525
+ args: queryArgs
1526
+ };
1527
+ };
1528
+ var generateDelete2 = (db, tableName, table, filterArgs) => {
1529
+ const queryName = `deleteFrom${capitalize(tableName)}`;
1530
+ const typeName = `${capitalize(tableName)}Item`;
1531
+ const queryArgs = {
1532
+ where: {
1533
+ type: filterArgs
1534
+ }
1535
+ };
1536
+ return {
1537
+ name: queryName,
1538
+ resolver: async (source, args, context, info) => {
1539
+ try {
1540
+ const { where } = args;
1541
+ const parsedInfo = parseResolveInfo2(info, {
1542
+ deep: true
1543
+ });
1544
+ const columns = extractSelectedColumnsFromTreeSQLFormat(
1545
+ parsedInfo.fieldsByTypeName[typeName],
1546
+ table
1547
+ );
1548
+ let query = db.delete(table);
1549
+ if (where) {
1550
+ const filters = extractFilters(table, tableName, where);
1551
+ query = query.where(filters);
1552
+ }
1553
+ query = query.returning(columns);
1554
+ const result = await query;
1555
+ return remapToGraphQLArrayOutput(result, tableName, table);
1556
+ } catch (e) {
1557
+ if (typeof e === "object" && typeof e.message === "string") {
1558
+ throw new GraphQLError4(e.message);
1559
+ }
1560
+ throw e;
1561
+ }
1562
+ },
1563
+ args: queryArgs
1564
+ };
1565
+ };
1566
+ var generateSchemaData2 = (db, schema, relationsDepthLimit) => {
1567
+ const rawSchema = schema;
1568
+ const schemaEntries = Object.entries(rawSchema);
1569
+ const tableEntries = schemaEntries.filter(
1570
+ ([key, value]) => is4(value, PgTable)
1571
+ );
1572
+ const tables = Object.fromEntries(tableEntries);
1573
+ if (!tableEntries.length) {
1574
+ throw new Error(
1575
+ "Drizzle-GraphQL Error: No tables detected in Drizzle-ORM's database instance. Did you forget to pass schema to drizzle constructor?"
1576
+ );
1577
+ }
1578
+ const rawRelations = schemaEntries.filter(([key, value]) => is4(value, Relations2)).map(([key, value]) => [
1579
+ tableEntries.find(
1580
+ ([tableName, tableValue]) => tableValue === value.table
1581
+ )[0],
1582
+ value
1583
+ ]).map(([tableName, relValue]) => [
1584
+ tableName,
1585
+ relValue.config(createTableRelationsHelpers2(tables[tableName]))
1586
+ ]);
1587
+ const namedRelations = Object.fromEntries(
1588
+ rawRelations.map(([relName, config]) => {
1589
+ const namedConfig = Object.fromEntries(
1590
+ Object.entries(config).map(([innerRelName, innerRelValue]) => [
1591
+ innerRelName,
1592
+ {
1593
+ relation: innerRelValue,
1594
+ targetTableName: tableEntries.find(
1595
+ ([tableName, tableValue]) => tableValue === innerRelValue.referencedTable
1596
+ )[0]
1597
+ }
1598
+ ])
1599
+ );
1600
+ return [relName, namedConfig];
1601
+ })
1602
+ );
1603
+ const queries = {};
1604
+ const mutations = {};
1605
+ const gqlSchemaTypes = Object.fromEntries(
1606
+ Object.entries(tables).map(([tableName, table]) => [
1607
+ tableName,
1608
+ generateTableTypes(
1609
+ tableName,
1610
+ tables,
1611
+ namedRelations,
1612
+ true,
1613
+ relationsDepthLimit
1614
+ )
1615
+ ])
1616
+ );
1617
+ const inputs = {};
1618
+ const interfaces = {};
1619
+ const outputs = {};
1620
+ for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
1621
+ const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
1622
+ const {
1623
+ selectSingleOutput,
1624
+ selectArrOutput,
1625
+ singleTableItemOutput,
1626
+ arrTableItemOutput,
1627
+ tableFieldsInterface
1628
+ } = tableTypes.outputs;
1629
+ const selectArrGenerated = generateSelectArray2(
1630
+ db,
1631
+ tableName,
1632
+ tables,
1633
+ namedRelations,
1634
+ tableOrder,
1635
+ tableFilters
1636
+ );
1637
+ const selectSingleGenerated = generateSelectSingle2(
1638
+ db,
1639
+ tableName,
1640
+ tables,
1641
+ namedRelations,
1642
+ tableOrder,
1643
+ tableFilters
1644
+ );
1645
+ const insertArrGenerated = generateInsertArray2(
1646
+ db,
1647
+ tableName,
1648
+ schema[tableName],
1649
+ insertInput
1650
+ );
1651
+ const insertSingleGenerated = generateInsertSingle2(
1652
+ db,
1653
+ tableName,
1654
+ schema[tableName],
1655
+ insertInput
1656
+ );
1657
+ const updateGenerated = generateUpdate2(
1658
+ db,
1659
+ tableName,
1660
+ schema[tableName],
1661
+ updateInput,
1662
+ tableFilters
1663
+ );
1664
+ const deleteGenerated = generateDelete2(
1665
+ db,
1666
+ tableName,
1667
+ schema[tableName],
1668
+ tableFilters
1669
+ );
1670
+ queries[selectArrGenerated.name] = {
1671
+ type: selectArrOutput,
1672
+ args: selectArrGenerated.args,
1673
+ resolve: selectArrGenerated.resolver
1674
+ };
1675
+ queries[selectSingleGenerated.name] = {
1676
+ type: selectSingleOutput,
1677
+ args: selectSingleGenerated.args,
1678
+ resolve: selectSingleGenerated.resolver
1679
+ };
1680
+ mutations[insertArrGenerated.name] = {
1681
+ type: arrTableItemOutput,
1682
+ args: insertArrGenerated.args,
1683
+ resolve: insertArrGenerated.resolver
1684
+ };
1685
+ mutations[insertSingleGenerated.name] = {
1686
+ type: singleTableItemOutput,
1687
+ args: insertSingleGenerated.args,
1688
+ resolve: insertSingleGenerated.resolver
1689
+ };
1690
+ mutations[updateGenerated.name] = {
1691
+ type: arrTableItemOutput,
1692
+ args: updateGenerated.args,
1693
+ resolve: updateGenerated.resolver
1694
+ };
1695
+ mutations[deleteGenerated.name] = {
1696
+ type: arrTableItemOutput,
1697
+ args: deleteGenerated.args,
1698
+ resolve: deleteGenerated.resolver
1699
+ };
1700
+ [insertInput, updateInput, tableFilters, tableOrder].forEach(
1701
+ (e) => inputs[e.name] = e
1702
+ );
1703
+ outputs[selectSingleOutput.name] = selectSingleOutput;
1704
+ outputs[singleTableItemOutput.name] = singleTableItemOutput;
1705
+ interfaces[tableFieldsInterface.name] = tableFieldsInterface;
1706
+ }
1707
+ return { queries, mutations, inputs, interfaces, types: outputs };
1708
+ };
1709
+
1710
+ // src/util/builders/sqlite.ts
1711
+ import {
1712
+ createTableRelationsHelpers as createTableRelationsHelpers3,
1713
+ is as is5,
1714
+ Relations as Relations3
1715
+ } from "drizzle-orm";
1716
+ import {
1717
+ SQLiteTable
1718
+ } from "drizzle-orm/sqlite-core";
1719
+ import {
1720
+ GraphQLError as GraphQLError5,
1721
+ GraphQLInt as GraphQLInt5,
1722
+ GraphQLList as GraphQLList5,
1723
+ GraphQLNonNull as GraphQLNonNull5
1724
+ } from "graphql";
1725
+ import { parseResolveInfo as parseResolveInfo3 } from "graphql-parse-resolve-info";
1726
+ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filterArgs) => {
1727
+ const queryName = `${uncapitalize(tableName)}`;
1728
+ const queryBase = db.query[tableName];
1729
+ if (!queryBase) {
1730
+ throw new Error(
1731
+ `Drizzle-GraphQL Error: Table ${tableName} not found in drizzle instance. Did you forget to pass schema to drizzle constructor?`
1732
+ );
1733
+ }
1734
+ const queryArgs = {
1735
+ offset: {
1736
+ type: GraphQLInt5
1737
+ },
1738
+ limit: {
1739
+ type: GraphQLInt5
1740
+ },
1741
+ orderBy: {
1742
+ type: orderArgs
1743
+ },
1744
+ where: {
1745
+ type: filterArgs
1746
+ }
1747
+ };
1748
+ const typeName = `${capitalize(tableName)}SelectItem`;
1749
+ const table = tables[tableName];
1750
+ return {
1751
+ name: queryName,
1752
+ resolver: async (source, args, context, info) => {
1753
+ try {
1754
+ const { offset, limit, orderBy, where } = args;
1755
+ const parsedInfo = parseResolveInfo3(info, {
1756
+ deep: true
1757
+ });
1758
+ const query = queryBase.findMany({
1759
+ columns: extractSelectedColumnsFromTree(
1760
+ parsedInfo.fieldsByTypeName[typeName],
1761
+ table
1762
+ ),
1763
+ offset,
1764
+ limit,
1765
+ orderBy: orderBy ? extractOrderBy(table, orderBy) : void 0,
1766
+ where: where ? extractFilters(table, tableName, where) : void 0,
1767
+ with: relationMap[tableName] ? extractRelationsParams(
1768
+ relationMap,
1769
+ tables,
1770
+ tableName,
1771
+ parsedInfo,
1772
+ typeName
1773
+ ) : void 0
1774
+ });
1775
+ const result = await query;
1776
+ return remapToGraphQLArrayOutput(result, tableName, table, relationMap);
1777
+ } catch (e) {
1778
+ if (typeof e === "object" && typeof e.message === "string") {
1779
+ throw new GraphQLError5(e.message);
1780
+ }
1781
+ throw e;
1782
+ }
1783
+ },
1784
+ args: queryArgs
1785
+ };
1786
+ };
1787
+ var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filterArgs) => {
1788
+ const queryName = `${uncapitalize(tableName)}Single`;
1789
+ const queryBase = db.query[tableName];
1790
+ if (!queryBase) {
1791
+ throw new Error(
1792
+ `Drizzle-GraphQL Error: Table ${tableName} not found in drizzle instance. Did you forget to pass schema to drizzle constructor?`
1793
+ );
1794
+ }
1795
+ const queryArgs = {
1796
+ offset: {
1797
+ type: GraphQLInt5
1798
+ },
1799
+ orderBy: {
1800
+ type: orderArgs
1801
+ },
1802
+ where: {
1803
+ type: filterArgs
1804
+ }
1805
+ };
1806
+ const typeName = `${capitalize(tableName)}SelectItem`;
1807
+ const table = tables[tableName];
1808
+ return {
1809
+ name: queryName,
1810
+ resolver: async (source, args, context, info) => {
1811
+ try {
1812
+ const { offset, orderBy, where } = args;
1813
+ const parsedInfo = parseResolveInfo3(info, {
1814
+ deep: true
1815
+ });
1816
+ const query = queryBase.findFirst({
1817
+ columns: extractSelectedColumnsFromTree(
1818
+ parsedInfo.fieldsByTypeName[typeName],
1819
+ table
1820
+ ),
1821
+ offset,
1822
+ orderBy: orderBy ? extractOrderBy(table, orderBy) : void 0,
1823
+ where: where ? extractFilters(table, tableName, where) : void 0,
1824
+ with: relationMap[tableName] ? extractRelationsParams(
1825
+ relationMap,
1826
+ tables,
1827
+ tableName,
1828
+ parsedInfo,
1829
+ typeName
1830
+ ) : void 0
1831
+ });
1832
+ const result = await query;
1833
+ if (!result)
1834
+ return void 0;
1835
+ return remapToGraphQLSingleOutput(
1836
+ result,
1837
+ tableName,
1838
+ table,
1839
+ relationMap
1840
+ );
1841
+ } catch (e) {
1842
+ if (typeof e === "object" && typeof e.message === "string") {
1843
+ throw new GraphQLError5(e.message);
1844
+ }
1845
+ throw e;
1846
+ }
1847
+ },
1848
+ args: queryArgs
1849
+ };
1850
+ };
1851
+ var generateInsertArray3 = (db, tableName, table, baseType) => {
1852
+ const queryName = `insertInto${capitalize(tableName)}`;
1853
+ const typeName = `${capitalize(tableName)}Item`;
1854
+ const queryArgs = {
1855
+ values: {
1856
+ type: new GraphQLNonNull5(new GraphQLList5(new GraphQLNonNull5(baseType)))
1857
+ }
1858
+ };
1859
+ return {
1860
+ name: queryName,
1861
+ resolver: async (source, args, context, info) => {
1862
+ try {
1863
+ const input = remapFromGraphQLArrayInput(args.values, table);
1864
+ if (!input.length)
1865
+ throw new GraphQLError5("No values were provided!");
1866
+ const parsedInfo = parseResolveInfo3(info, {
1867
+ deep: true
1868
+ });
1869
+ const columns = extractSelectedColumnsFromTreeSQLFormat(
1870
+ parsedInfo.fieldsByTypeName[typeName],
1871
+ table
1872
+ );
1873
+ const result = await db.insert(table).values(input).returning(columns).onConflictDoNothing();
1874
+ return remapToGraphQLArrayOutput(result, tableName, table);
1875
+ } catch (e) {
1876
+ if (typeof e === "object" && typeof e.message === "string") {
1877
+ throw new GraphQLError5(e.message);
1878
+ }
1879
+ throw e;
1880
+ }
1881
+ },
1882
+ args: queryArgs
1883
+ };
1884
+ };
1885
+ var generateInsertSingle3 = (db, tableName, table, baseType) => {
1886
+ const queryName = `insertInto${capitalize(tableName)}Single`;
1887
+ const typeName = `${capitalize(tableName)}Item`;
1888
+ const queryArgs = {
1889
+ values: {
1890
+ type: new GraphQLNonNull5(baseType)
1891
+ }
1892
+ };
1893
+ return {
1894
+ name: queryName,
1895
+ resolver: async (source, args, context, info) => {
1896
+ try {
1897
+ const input = remapFromGraphQLSingleInput(args.values, table);
1898
+ const parsedInfo = parseResolveInfo3(info, {
1899
+ deep: true
1900
+ });
1901
+ const columns = extractSelectedColumnsFromTreeSQLFormat(
1902
+ parsedInfo.fieldsByTypeName[typeName],
1903
+ table
1904
+ );
1905
+ const result = await db.insert(table).values(input).returning(columns).onConflictDoNothing();
1906
+ if (!result[0])
1907
+ return void 0;
1908
+ return remapToGraphQLSingleOutput(result[0], tableName, table);
1909
+ } catch (e) {
1910
+ if (typeof e === "object" && typeof e.message === "string") {
1911
+ throw new GraphQLError5(e.message);
1912
+ }
1913
+ throw e;
1914
+ }
1915
+ },
1916
+ args: queryArgs
1917
+ };
1918
+ };
1919
+ var generateUpdate3 = (db, tableName, table, setArgs, filterArgs) => {
1920
+ const queryName = `update${capitalize(tableName)}`;
1921
+ const typeName = `${capitalize(tableName)}Item`;
1922
+ const queryArgs = {
1923
+ set: {
1924
+ type: new GraphQLNonNull5(setArgs)
1925
+ },
1926
+ where: {
1927
+ type: filterArgs
1928
+ }
1929
+ };
1930
+ return {
1931
+ name: queryName,
1932
+ resolver: async (source, args, context, info) => {
1933
+ try {
1934
+ const { where, set } = args;
1935
+ const parsedInfo = parseResolveInfo3(info, {
1936
+ deep: true
1937
+ });
1938
+ const columns = extractSelectedColumnsFromTreeSQLFormat(
1939
+ parsedInfo.fieldsByTypeName[typeName],
1940
+ table
1941
+ );
1942
+ const input = remapFromGraphQLSingleInput(set, table);
1943
+ if (!Object.keys(input).length)
1944
+ throw new GraphQLError5("Unable to update with no values specified!");
1945
+ let query = db.update(table).set(input);
1946
+ if (where) {
1947
+ const filters = extractFilters(table, tableName, where);
1948
+ query = query.where(filters);
1949
+ }
1950
+ query = query.returning(columns);
1951
+ const result = await query;
1952
+ return remapToGraphQLArrayOutput(result, tableName, table);
1953
+ } catch (e) {
1954
+ if (typeof e === "object" && typeof e.message === "string") {
1955
+ throw new GraphQLError5(e.message);
1956
+ }
1957
+ throw e;
1958
+ }
1959
+ },
1960
+ args: queryArgs
1961
+ };
1962
+ };
1963
+ var generateDelete3 = (db, tableName, table, filterArgs) => {
1964
+ const queryName = `deleteFrom${capitalize(tableName)}`;
1965
+ const typeName = `${capitalize(tableName)}Item`;
1966
+ const queryArgs = {
1967
+ where: {
1968
+ type: filterArgs
1969
+ }
1970
+ };
1971
+ return {
1972
+ name: queryName,
1973
+ resolver: async (source, args, context, info) => {
1974
+ try {
1975
+ const { where } = args;
1976
+ const parsedInfo = parseResolveInfo3(info, {
1977
+ deep: true
1978
+ });
1979
+ const columns = extractSelectedColumnsFromTreeSQLFormat(
1980
+ parsedInfo.fieldsByTypeName[typeName],
1981
+ table
1982
+ );
1983
+ let query = db.delete(table);
1984
+ if (where) {
1985
+ const filters = extractFilters(table, tableName, where);
1986
+ query = query.where(filters);
1987
+ }
1988
+ query = query.returning(columns);
1989
+ const result = await query;
1990
+ return remapToGraphQLArrayOutput(result, tableName, table);
1991
+ } catch (e) {
1992
+ if (typeof e === "object" && typeof e.message === "string") {
1993
+ throw new GraphQLError5(e.message);
1994
+ }
1995
+ throw e;
1996
+ }
1997
+ },
1998
+ args: queryArgs
1999
+ };
2000
+ };
2001
+ var generateSchemaData3 = (db, schema, relationsDepthLimit) => {
2002
+ const rawSchema = schema;
2003
+ const schemaEntries = Object.entries(rawSchema);
2004
+ const tableEntries = schemaEntries.filter(
2005
+ ([key, value]) => is5(value, SQLiteTable)
2006
+ );
2007
+ const tables = Object.fromEntries(tableEntries);
2008
+ if (!tableEntries.length) {
2009
+ throw new Error(
2010
+ "Drizzle-GraphQL Error: No tables detected in Drizzle-ORM's database instance. Did you forget to pass schema to drizzle constructor?"
2011
+ );
2012
+ }
2013
+ const rawRelations = schemaEntries.filter(([key, value]) => is5(value, Relations3)).map(([key, value]) => [
2014
+ tableEntries.find(
2015
+ ([tableName, tableValue]) => tableValue === value.table
2016
+ )[0],
2017
+ value
2018
+ ]).map(([tableName, relValue]) => [
2019
+ tableName,
2020
+ relValue.config(createTableRelationsHelpers3(tables[tableName]))
2021
+ ]);
2022
+ const namedRelations = Object.fromEntries(
2023
+ rawRelations.map(([relName, config]) => {
2024
+ const namedConfig = Object.fromEntries(
2025
+ Object.entries(config).map(([innerRelName, innerRelValue]) => [
2026
+ innerRelName,
2027
+ {
2028
+ relation: innerRelValue,
2029
+ targetTableName: tableEntries.find(
2030
+ ([tableName, tableValue]) => tableValue === innerRelValue.referencedTable
2031
+ )[0]
2032
+ }
2033
+ ])
2034
+ );
2035
+ return [relName, namedConfig];
2036
+ })
2037
+ );
2038
+ const queries = {};
2039
+ const mutations = {};
2040
+ const gqlSchemaTypes = Object.fromEntries(
2041
+ Object.entries(tables).map(([tableName, table]) => [
2042
+ tableName,
2043
+ generateTableTypes(
2044
+ tableName,
2045
+ tables,
2046
+ namedRelations,
2047
+ true,
2048
+ relationsDepthLimit
2049
+ )
2050
+ ])
2051
+ );
2052
+ const inputs = {};
2053
+ const interfaces = {};
2054
+ const outputs = {};
2055
+ for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
2056
+ const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
2057
+ const {
2058
+ selectSingleOutput,
2059
+ selectArrOutput,
2060
+ singleTableItemOutput,
2061
+ arrTableItemOutput,
2062
+ tableFieldsInterface
2063
+ } = tableTypes.outputs;
2064
+ const selectArrGenerated = generateSelectArray3(
2065
+ db,
2066
+ tableName,
2067
+ tables,
2068
+ namedRelations,
2069
+ tableOrder,
2070
+ tableFilters
2071
+ );
2072
+ const selectSingleGenerated = generateSelectSingle3(
2073
+ db,
2074
+ tableName,
2075
+ tables,
2076
+ namedRelations,
2077
+ tableOrder,
2078
+ tableFilters
2079
+ );
2080
+ const insertArrGenerated = generateInsertArray3(
2081
+ db,
2082
+ tableName,
2083
+ schema[tableName],
2084
+ insertInput
2085
+ );
2086
+ const insertSingleGenerated = generateInsertSingle3(
2087
+ db,
2088
+ tableName,
2089
+ schema[tableName],
2090
+ insertInput
2091
+ );
2092
+ const updateGenerated = generateUpdate3(
2093
+ db,
2094
+ tableName,
2095
+ schema[tableName],
2096
+ updateInput,
2097
+ tableFilters
2098
+ );
2099
+ const deleteGenerated = generateDelete3(
2100
+ db,
2101
+ tableName,
2102
+ schema[tableName],
2103
+ tableFilters
2104
+ );
2105
+ queries[selectArrGenerated.name] = {
2106
+ type: selectArrOutput,
2107
+ args: selectArrGenerated.args,
2108
+ resolve: selectArrGenerated.resolver
2109
+ };
2110
+ queries[selectSingleGenerated.name] = {
2111
+ type: selectSingleOutput,
2112
+ args: selectSingleGenerated.args,
2113
+ resolve: selectSingleGenerated.resolver
2114
+ };
2115
+ mutations[insertArrGenerated.name] = {
2116
+ type: arrTableItemOutput,
2117
+ args: insertArrGenerated.args,
2118
+ resolve: insertArrGenerated.resolver
2119
+ };
2120
+ mutations[insertSingleGenerated.name] = {
2121
+ type: singleTableItemOutput,
2122
+ args: insertSingleGenerated.args,
2123
+ resolve: insertSingleGenerated.resolver
2124
+ };
2125
+ mutations[updateGenerated.name] = {
2126
+ type: arrTableItemOutput,
2127
+ args: updateGenerated.args,
2128
+ resolve: updateGenerated.resolver
2129
+ };
2130
+ mutations[deleteGenerated.name] = {
2131
+ type: arrTableItemOutput,
2132
+ args: deleteGenerated.args,
2133
+ resolve: deleteGenerated.resolver
2134
+ };
2135
+ [insertInput, updateInput, tableFilters, tableOrder].forEach(
2136
+ (e) => inputs[e.name] = e
2137
+ );
2138
+ outputs[selectSingleOutput.name] = selectSingleOutput;
2139
+ outputs[singleTableItemOutput.name] = singleTableItemOutput;
2140
+ interfaces[tableFieldsInterface.name] = tableFieldsInterface;
2141
+ }
2142
+ return { queries, mutations, inputs, interfaces, types: outputs };
2143
+ };
2144
+
2145
+ // src/index.ts
2146
+ var buildSchema = (db, config) => {
2147
+ const schema = db._.fullSchema;
2148
+ if (!schema) {
2149
+ throw new Error(
2150
+ "Drizzle-GraphQL Error: Schema not found in drizzle instance. Make sure you're using drizzle-orm v0.30.9 or above and schema is passed to drizzle constructor!"
2151
+ );
2152
+ }
2153
+ if (typeof config?.relationsDepthLimit === "number") {
2154
+ if (config.relationsDepthLimit < 0) {
2155
+ throw new Error(
2156
+ "Drizzle-GraphQL Error: config.relationsDepthLimit is supposed to be nonnegative integer or undefined!"
2157
+ );
2158
+ }
2159
+ if (config.relationsDepthLimit !== ~~config.relationsDepthLimit) {
2160
+ throw new Error(
2161
+ "Drizzle-GraphQL Error: config.relationsDepthLimit is supposed to be nonnegative integer or undefined!"
2162
+ );
2163
+ }
2164
+ }
2165
+ let generatorOutput;
2166
+ if (is6(db, MySqlDatabase2)) {
2167
+ generatorOutput = generateSchemaData(db, schema, config?.relationsDepthLimit);
2168
+ } else if (is6(db, PgDatabase2)) {
2169
+ generatorOutput = generateSchemaData2(db, schema, config?.relationsDepthLimit);
2170
+ } else if (is6(db, BaseSQLiteDatabase2)) {
2171
+ generatorOutput = generateSchemaData3(db, schema, config?.relationsDepthLimit);
2172
+ } else
2173
+ throw new Error("Drizzle-GraphQL Error: Unknown database instance type");
2174
+ const { queries, mutations, inputs, types } = generatorOutput;
2175
+ const graphQLSchemaConfig = {
2176
+ types: [...Object.values(inputs), ...Object.values(types)],
2177
+ query: new GraphQLObjectType6({
2178
+ name: "Query",
2179
+ fields: queries
2180
+ })
2181
+ };
2182
+ if (config?.mutations !== false) {
2183
+ const mutation = new GraphQLObjectType6({
2184
+ name: "Mutation",
2185
+ fields: mutations
2186
+ });
2187
+ graphQLSchemaConfig.mutation = mutation;
2188
+ }
2189
+ const outputSchema = new GraphQLSchema(graphQLSchemaConfig);
2190
+ return { schema: outputSchema, entities: generatorOutput };
2191
+ };
2192
+ export {
2193
+ buildSchema
2194
+ };
2195
+ //# sourceMappingURL=index.js.map