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