@vantreeseba/drizzle-graphql 1.0.0

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