drizzle-graphql-plus 0.8.32 → 0.8.34

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 CHANGED
@@ -1,20 +1,30 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
8
10
  __defProp(target, name, { get: all[name], enumerable: true });
9
11
  };
10
- var __copyProps = (to, from, except, desc3) => {
12
+ var __copyProps = (to, from, except, desc4) => {
11
13
  if (from && typeof from === "object" || typeof from === "function") {
12
14
  for (let key of __getOwnPropNames(from))
13
15
  if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc3 = __getOwnPropDesc(from, key)) || desc3.enumerable });
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc4 = __getOwnPropDesc(from, key)) || desc4.enumerable });
15
17
  }
16
18
  return to;
17
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
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/index.ts
@@ -22,10 +32,17 @@ var src_exports = {};
22
32
  __export(src_exports, {
23
33
  buildSchema: () => buildSchema,
24
34
  buildSchemaSDL: () => buildSchemaSDL,
35
+ buildSchemaSDLWithDataLoader: () => buildSchemaSDL2,
36
+ cleanupDataLoaderContext: () => cleanupDataLoaderContext,
37
+ createDataLoaderContext: () => createDataLoaderContext,
25
38
  createExportMiddleware: () => createExportMiddleware,
39
+ exportDirectiveTypeDefs: () => exportDirectiveTypeDefs,
26
40
  makeScalarAcceptExports: () => makeScalarAcceptExports,
27
41
  setCustomGraphQL: () => setCustomGraphQL,
28
- setCustomGraphQLTypes: () => setCustomGraphQLTypes
42
+ setCustomGraphQLTypes: () => setCustomGraphQLTypes,
43
+ useDataLoaderCleanup: () => useDataLoaderCleanup,
44
+ useDataLoaderCleanupOnly: () => useDataLoaderCleanupOnly,
45
+ useDataLoaderContext: () => useDataLoaderContext
29
46
  });
30
47
  module.exports = __toCommonJS(src_exports);
31
48
 
@@ -2462,13 +2479,13 @@ ${fields.join("\n")}
2462
2479
  );
2463
2480
  const hasDefault = column.hasDefault || column.default !== void 0;
2464
2481
  const isAutoIncrement = column.autoIncrement || column.generatedAlwaysAs;
2465
- const isNotNull3 = column.notNull;
2466
- const shouldBeOptional = hasDefault || isAutoIncrement || isPrimaryKey && !isNotNull3;
2482
+ const isNotNull4 = column.notNull;
2483
+ const shouldBeOptional = hasDefault || isAutoIncrement || isPrimaryKey && !isNotNull4;
2467
2484
  let insertFieldType;
2468
2485
  if (shouldBeOptional) {
2469
2486
  insertFieldType = typeStr.endsWith("!") ? typeStr.slice(0, -1) : typeStr;
2470
2487
  } else {
2471
- insertFieldType = isNotNull3 && !typeStr.endsWith("!") ? `${typeStr}!` : typeStr;
2488
+ insertFieldType = isNotNull4 && !typeStr.endsWith("!") ? `${typeStr}!` : typeStr;
2472
2489
  }
2473
2490
  insertFields.push(` ${columnName}: ${insertFieldType}`);
2474
2491
  }
@@ -3266,6 +3283,1281 @@ var buildSchemaSDL = (db, config) => {
3266
3283
  };
3267
3284
  };
3268
3285
 
3286
+ // src/build-schema-sdl-with-dl/index.ts
3287
+ var import_drizzle_orm19 = require("drizzle-orm");
3288
+ var import_sqlite_core7 = require("drizzle-orm/sqlite-core");
3289
+
3290
+ // src/build-schema-sdl-with-dl/generator/schema/generation.ts
3291
+ var import_drizzle_orm13 = require("drizzle-orm");
3292
+ var generateTypes2 = (db, schema) => {
3293
+ const tables = {};
3294
+ const schemaEntries = Object.entries(schema);
3295
+ const tableEntries = [];
3296
+ for (const [key, value] of schemaEntries) {
3297
+ if (value && typeof value === "object" && "getSQL" in value) {
3298
+ const table = value;
3299
+ const tableName = key;
3300
+ const columns = (0, import_drizzle_orm13.getTableColumns)(table);
3301
+ tables[tableName] = {
3302
+ name: tableName,
3303
+ table,
3304
+ columns
3305
+ };
3306
+ tableEntries.push([tableName, table]);
3307
+ }
3308
+ }
3309
+ const rawRelations = schemaEntries.filter(([key, value]) => (0, import_drizzle_orm13.is)(value, import_drizzle_orm13.Relations)).map(([key, value]) => [
3310
+ tableEntries.find(
3311
+ ([tableName, tableValue]) => tableValue === value.table
3312
+ )[0],
3313
+ value
3314
+ ]).map(([tableName, relValue]) => [
3315
+ tableName,
3316
+ relValue.config((0, import_drizzle_orm13.createTableRelationsHelpers)(tables[tableName].table))
3317
+ ]);
3318
+ const namedRelations = Object.fromEntries(
3319
+ rawRelations.map(([relName, config]) => {
3320
+ const namedConfig = Object.fromEntries(
3321
+ Object.entries(config).map(([innerRelName, innerRelValue]) => [
3322
+ innerRelName,
3323
+ {
3324
+ relation: innerRelValue,
3325
+ targetTableName: tableEntries.find(
3326
+ ([tableName, tableValue]) => tableValue === innerRelValue.referencedTable
3327
+ )[0]
3328
+ }
3329
+ ])
3330
+ );
3331
+ return [relName, namedConfig];
3332
+ })
3333
+ );
3334
+ return { tables, relations: namedRelations };
3335
+ };
3336
+
3337
+ // src/build-schema-sdl-with-dl/generator/schema/type-defs.ts
3338
+ var import_drizzle_orm14 = require("drizzle-orm");
3339
+ var import_mysql_core5 = require("drizzle-orm/mysql-core");
3340
+ var import_pg_core5 = require("drizzle-orm/pg-core");
3341
+ var import_sqlite_core6 = require("drizzle-orm/sqlite-core");
3342
+ var allowedNameChars3 = /^[a-zA-Z0-9_]+$/;
3343
+ var customScalars2 = /* @__PURE__ */ new Set();
3344
+ var enumDefinitions2 = /* @__PURE__ */ new Map();
3345
+ var requiredFieldFilters2 = /* @__PURE__ */ new Set();
3346
+ var foreignKeyTypes2 = /* @__PURE__ */ new Map();
3347
+ var columnToSDL2 = (column, columnName, tableName, forceNullable = false, isPrimaryKey = false) => {
3348
+ let baseType;
3349
+ if (column.customGraphqlType) {
3350
+ baseType = column.customGraphqlType;
3351
+ } else if (isPrimaryKey) {
3352
+ baseType = "ID";
3353
+ } else {
3354
+ const foreignKeyType = foreignKeyTypes2.get(`${tableName}.${columnName}`);
3355
+ if (foreignKeyType) {
3356
+ baseType = foreignKeyType;
3357
+ } else {
3358
+ switch (column.dataType) {
3359
+ case "boolean":
3360
+ baseType = "Boolean";
3361
+ break;
3362
+ case "json":
3363
+ if (column.columnType === "PgGeometryObject") {
3364
+ baseType = "PgGeometryObject";
3365
+ customScalars2.add("PgGeometryObject");
3366
+ } else {
3367
+ baseType = "JSON";
3368
+ customScalars2.add("JSON");
3369
+ }
3370
+ break;
3371
+ case "date":
3372
+ baseType = "Date";
3373
+ customScalars2.add("Date");
3374
+ break;
3375
+ case "string":
3376
+ if (column.enumValues?.length) {
3377
+ const enumName = `${capitalize(tableName)}${capitalize(
3378
+ columnName
3379
+ )}Enum`;
3380
+ baseType = enumName;
3381
+ if (!enumDefinitions2.has(enumName)) {
3382
+ enumDefinitions2.set(enumName, {
3383
+ name: enumName,
3384
+ values: column.enumValues.map(
3385
+ (e, index) => allowedNameChars3.test(e) ? e : `Option${index}`
3386
+ )
3387
+ });
3388
+ }
3389
+ } else {
3390
+ baseType = "String";
3391
+ }
3392
+ break;
3393
+ case "bigint":
3394
+ baseType = "BigInt";
3395
+ customScalars2.add("BigInt");
3396
+ break;
3397
+ case "number":
3398
+ if ((0, import_drizzle_orm14.is)(column, import_pg_core5.PgInteger) || (0, import_drizzle_orm14.is)(column, import_pg_core5.PgSerial) || (0, import_drizzle_orm14.is)(column, import_mysql_core5.MySqlInt) || (0, import_drizzle_orm14.is)(column, import_mysql_core5.MySqlSerial) || (0, import_drizzle_orm14.is)(column, import_sqlite_core6.SQLiteInteger)) {
3399
+ baseType = "Int";
3400
+ } else {
3401
+ baseType = "Float";
3402
+ }
3403
+ break;
3404
+ case "buffer":
3405
+ baseType = "[Int!]";
3406
+ break;
3407
+ case "array":
3408
+ if (column.columnType === "PgVector") {
3409
+ baseType = "[Float!]";
3410
+ } else if (column.columnType === "PgGeometry") {
3411
+ baseType = "[Float!]";
3412
+ } else {
3413
+ const scalarName = `${capitalize(tableName)}${capitalize(
3414
+ columnName
3415
+ )}Array`;
3416
+ baseType = scalarName;
3417
+ customScalars2.add(scalarName);
3418
+ }
3419
+ break;
3420
+ case "custom":
3421
+ default:
3422
+ if (column.columnType) {
3423
+ baseType = column.columnType;
3424
+ customScalars2.add(column.columnType);
3425
+ } else {
3426
+ const customScalarName = `${capitalize(tableName)}${capitalize(
3427
+ columnName
3428
+ )}`;
3429
+ baseType = customScalarName;
3430
+ customScalars2.add(customScalarName);
3431
+ }
3432
+ break;
3433
+ }
3434
+ }
3435
+ }
3436
+ if (!forceNullable && column.notNull) {
3437
+ return `${baseType}!`;
3438
+ }
3439
+ return baseType;
3440
+ };
3441
+ var generateTypeDefs2 = (tables, relations) => {
3442
+ const typeDefs = [];
3443
+ customScalars2.clear();
3444
+ enumDefinitions2.clear();
3445
+ requiredFieldFilters2.clear();
3446
+ foreignKeyTypes2.clear();
3447
+ for (const [tableName, tableRelations] of Object.entries(relations)) {
3448
+ const tableInfo = tables[tableName];
3449
+ if (!tableInfo)
3450
+ continue;
3451
+ for (const [relationName, relationInfo] of Object.entries(tableRelations)) {
3452
+ const relation = relationInfo.relation;
3453
+ if (!(0, import_drizzle_orm14.is)(relation, import_drizzle_orm14.One))
3454
+ continue;
3455
+ const config = relation.config;
3456
+ if (!config?.fields || !config?.references)
3457
+ continue;
3458
+ const referencedTableName = relationInfo.targetTableName;
3459
+ const referencedTable = tables[referencedTableName];
3460
+ if (!referencedTable)
3461
+ continue;
3462
+ for (let i = 0; i < config.fields.length; i++) {
3463
+ const field = config.fields[i];
3464
+ const reference = config.references[i];
3465
+ if (!field || !reference)
3466
+ continue;
3467
+ const fieldColumnName = field.name;
3468
+ const referenceColumnName = reference.name;
3469
+ const foreignKeyColumn = Object.values(tableInfo.columns).find(
3470
+ (col) => col.name === fieldColumnName
3471
+ );
3472
+ const referencedColumn = Object.values(referencedTable.columns).find(
3473
+ (col) => col.name === referenceColumnName
3474
+ );
3475
+ if (!foreignKeyColumn || !referencedColumn)
3476
+ continue;
3477
+ const foreignKeyPropertyName = Object.keys(tableInfo.columns).find(
3478
+ (key) => tableInfo.columns[key] === foreignKeyColumn
3479
+ );
3480
+ if (!foreignKeyPropertyName)
3481
+ continue;
3482
+ const referencedCustomType = referencedColumn.customGraphqlType;
3483
+ const foreignKeyHasCustomType = !!foreignKeyColumn.customGraphqlType;
3484
+ const referencedIsPrimaryKey = referencedColumn.primary || false;
3485
+ if (!foreignKeyHasCustomType) {
3486
+ if (referencedCustomType) {
3487
+ foreignKeyTypes2.set(
3488
+ `${tableName}.${foreignKeyPropertyName}`,
3489
+ referencedCustomType
3490
+ );
3491
+ } else if (referencedIsPrimaryKey) {
3492
+ foreignKeyTypes2.set(`${tableName}.${foreignKeyPropertyName}`, "ID");
3493
+ }
3494
+ }
3495
+ }
3496
+ }
3497
+ }
3498
+ for (const [tableName, tableInfo] of Object.entries(tables)) {
3499
+ const typeName = capitalize(tableName);
3500
+ const fields = [];
3501
+ for (const [columnName, column] of Object.entries(tableInfo.columns)) {
3502
+ const isPrimaryKey = column.primary || false;
3503
+ const typeStr = columnToSDL2(
3504
+ column,
3505
+ columnName,
3506
+ tableName,
3507
+ false,
3508
+ isPrimaryKey
3509
+ );
3510
+ const description = column.customGraphqlDescription;
3511
+ if (description) {
3512
+ fields.push(` """${description}"""`);
3513
+ }
3514
+ fields.push(` ${columnName}: ${typeStr}`);
3515
+ }
3516
+ const tableRelations = relations[tableName];
3517
+ if (tableRelations) {
3518
+ for (const [relationName, relationInfo] of Object.entries(
3519
+ tableRelations
3520
+ )) {
3521
+ const isOne = (0, import_drizzle_orm14.is)(relationInfo.relation, import_drizzle_orm14.One);
3522
+ const targetTableName = relationInfo.targetTableName;
3523
+ const targetTypeName = capitalize(targetTableName);
3524
+ if (isOne) {
3525
+ fields.push(
3526
+ ` ${relationName}(where: ${targetTypeName}Filters): ${targetTypeName}`
3527
+ );
3528
+ } else {
3529
+ fields.push(
3530
+ ` ${relationName}(where: ${targetTypeName}Filters, orderBy: ${targetTypeName}OrderBy, limit: Int, offset: Int): [${targetTypeName}!]!`
3531
+ );
3532
+ }
3533
+ }
3534
+ }
3535
+ typeDefs.push(`type ${typeName} {
3536
+ ${fields.join("\n")}
3537
+ }`);
3538
+ const insertFields = [];
3539
+ for (const [columnName, column] of Object.entries(tableInfo.columns)) {
3540
+ const isPrimaryKey = column.primary || false;
3541
+ const typeStr = columnToSDL2(
3542
+ column,
3543
+ columnName,
3544
+ tableName,
3545
+ false,
3546
+ isPrimaryKey
3547
+ );
3548
+ const hasDefault = column.hasDefault || column.default !== void 0;
3549
+ const isAutoIncrement = column.autoIncrement || column.generatedAlwaysAs;
3550
+ const isNotNull4 = column.notNull;
3551
+ const shouldBeOptional = hasDefault || isAutoIncrement || isPrimaryKey && !isNotNull4;
3552
+ let insertFieldType;
3553
+ if (shouldBeOptional) {
3554
+ insertFieldType = typeStr.endsWith("!") ? typeStr.slice(0, -1) : typeStr;
3555
+ } else {
3556
+ insertFieldType = isNotNull4 && !typeStr.endsWith("!") ? `${typeStr}!` : typeStr;
3557
+ }
3558
+ insertFields.push(` ${columnName}: ${insertFieldType}`);
3559
+ }
3560
+ if (insertFields.length > 0) {
3561
+ typeDefs.push(
3562
+ `input ${typeName}InsertInput {
3563
+ ${insertFields.join("\n")}
3564
+ }`
3565
+ );
3566
+ }
3567
+ const updateFields = [];
3568
+ for (const [columnName, column] of Object.entries(tableInfo.columns)) {
3569
+ const isPrimaryKey = column.primary || false;
3570
+ const typeStr = columnToSDL2(
3571
+ column,
3572
+ columnName,
3573
+ tableName,
3574
+ true,
3575
+ isPrimaryKey
3576
+ );
3577
+ updateFields.push(` ${columnName}: ${typeStr}`);
3578
+ }
3579
+ typeDefs.push(
3580
+ `input ${typeName}UpdateInput {
3581
+ ${updateFields.join("\n")}
3582
+ }`
3583
+ );
3584
+ const whereFields = [];
3585
+ for (const [columnName, column] of Object.entries(tableInfo.columns)) {
3586
+ const isPrimaryKey = column.primary || false;
3587
+ const typeStr = columnToSDL2(
3588
+ column,
3589
+ columnName,
3590
+ tableName,
3591
+ true,
3592
+ isPrimaryKey
3593
+ );
3594
+ const normalizedType = typeStr.replace(/[^a-zA-Z0-9]/g, "");
3595
+ const filterTypeName = `${normalizedType}FieldFilter`;
3596
+ requiredFieldFilters2.add(
3597
+ JSON.stringify({ normalizedType, baseType: typeStr })
3598
+ );
3599
+ whereFields.push(` ${columnName}: ${filterTypeName}`);
3600
+ }
3601
+ whereFields.push(` OR: [${typeName}Filters!]`);
3602
+ typeDefs.push(`input ${typeName}Filters {
3603
+ ${whereFields.join("\n")}
3604
+ }`);
3605
+ const orderByFields = [];
3606
+ for (const columnName of Object.keys(tableInfo.columns)) {
3607
+ orderByFields.push(` ${columnName}: InnerOrder`);
3608
+ }
3609
+ typeDefs.push(`input ${typeName}OrderBy {
3610
+ ${orderByFields.join("\n")}
3611
+ }`);
3612
+ typeDefs.push(`type ${typeName}DeleteResult {
3613
+ deletedItems: [DeletedItem!]!
3614
+ ${tableName}FindMany(where: ${typeName}Filters, orderBy: ${typeName}OrderBy, limit: Int, offset: Int): [${typeName}!]!
3615
+ }`);
3616
+ }
3617
+ const allDefs = [];
3618
+ customScalars2.add("JSON");
3619
+ if (customScalars2.size > 0) {
3620
+ for (const scalarName of Array.from(customScalars2).sort()) {
3621
+ allDefs.push(`scalar ${scalarName}`);
3622
+ }
3623
+ }
3624
+ if (enumDefinitions2.size > 0) {
3625
+ for (const enumDef of Array.from(enumDefinitions2.values())) {
3626
+ const valueStrings = enumDef.values.map((v) => ` ${v}`);
3627
+ allDefs.push(`enum ${enumDef.name} {
3628
+ ${valueStrings.join("\n")}
3629
+ }`);
3630
+ }
3631
+ }
3632
+ allDefs.push(`enum OrderByDirection {
3633
+ asc
3634
+ desc
3635
+ }`);
3636
+ allDefs.push(`type DeletedItem {
3637
+ id: ID!
3638
+ }`);
3639
+ allDefs.push(`input InnerOrder {
3640
+ direction: OrderByDirection!
3641
+ priority: Int!
3642
+ }`);
3643
+ const filterTypesAdded = /* @__PURE__ */ new Set();
3644
+ for (const filterInfoJson of Array.from(requiredFieldFilters2)) {
3645
+ const { normalizedType, baseType } = JSON.parse(filterInfoJson);
3646
+ const filterTypeName = `${normalizedType}FieldFilter`;
3647
+ if (filterTypesAdded.has(filterTypeName))
3648
+ continue;
3649
+ filterTypesAdded.add(filterTypeName);
3650
+ const filterFields = [];
3651
+ filterFields.push(` eq: ${baseType}`);
3652
+ filterFields.push(` ne: ${baseType}`);
3653
+ filterFields.push(` lt: ${baseType}`);
3654
+ filterFields.push(` lte: ${baseType}`);
3655
+ filterFields.push(` gt: ${baseType}`);
3656
+ filterFields.push(` gte: ${baseType}`);
3657
+ filterFields.push(` like: String`);
3658
+ filterFields.push(` notLike: String`);
3659
+ filterFields.push(` ilike: String`);
3660
+ filterFields.push(` notIlike: String`);
3661
+ filterFields.push(` inArray: [${baseType}!]`);
3662
+ filterFields.push(` notInArray: [${baseType}!]`);
3663
+ filterFields.push(` isNull: Boolean`);
3664
+ filterFields.push(` isNotNull: Boolean`);
3665
+ filterFields.push(` OR: [${filterTypeName}!]`);
3666
+ allDefs.push(`input ${filterTypeName} {
3667
+ ${filterFields.join("\n")}
3668
+ }`);
3669
+ }
3670
+ allDefs.push(...typeDefs);
3671
+ return allDefs.join("\n\n");
3672
+ };
3673
+ var generateQueryTypeDefs2 = (tables) => {
3674
+ const queryFields = [];
3675
+ for (const tableName of Object.keys(tables)) {
3676
+ const typeName = capitalize(tableName);
3677
+ queryFields.push(
3678
+ ` ${tableName}FindMany(where: ${typeName}Filters, orderBy: ${typeName}OrderBy, limit: Int, offset: Int): [${typeName}!]!`
3679
+ );
3680
+ queryFields.push(
3681
+ ` ${tableName}FindFirst(where: ${typeName}Filters, orderBy: ${typeName}OrderBy): ${typeName}`
3682
+ );
3683
+ }
3684
+ return `type Query {
3685
+ ${queryFields.join("\n")}
3686
+ }`;
3687
+ };
3688
+ var generateMutationTypeDefs2 = (tables) => {
3689
+ const mutationFields = [];
3690
+ for (const tableName of Object.keys(tables)) {
3691
+ const typeName = capitalize(tableName);
3692
+ mutationFields.push(
3693
+ ` ${tableName}InsertMany(values: [${typeName}InsertInput!]!): [${typeName}!]!`
3694
+ );
3695
+ mutationFields.push(
3696
+ ` ${tableName}UpdateMany(where: ${typeName}Filters, set: ${typeName}UpdateInput!): [${typeName}!]!`
3697
+ );
3698
+ mutationFields.push(
3699
+ ` ${tableName}DeleteMany(where: ${typeName}Filters): ${typeName}DeleteResult!`
3700
+ );
3701
+ }
3702
+ return `type Mutation {
3703
+ ${mutationFields.join("\n")}
3704
+ }`;
3705
+ };
3706
+
3707
+ // src/build-schema-sdl-with-dl/generator/queries/dataloader-resolvers.ts
3708
+ var import_graphql12 = require("graphql");
3709
+ var import_graphql_parse_resolve_info5 = require("graphql-parse-resolve-info");
3710
+ var import_drizzle_orm18 = require("drizzle-orm");
3711
+
3712
+ // src/build-schema-sdl-with-dl/generator/utils/selection.ts
3713
+ var import_drizzle_orm16 = require("drizzle-orm");
3714
+
3715
+ // src/build-schema-sdl-with-dl/generator/utils/filters.ts
3716
+ var import_drizzle_orm15 = require("drizzle-orm");
3717
+ var import_graphql11 = require("graphql");
3718
+ var extractFiltersColumn3 = (column, columnName, operators) => {
3719
+ const entries = Object.entries(operators);
3720
+ if (!entries.length)
3721
+ return void 0;
3722
+ if (operators.OR && operators.OR.length > 0) {
3723
+ if (entries.length > 1) {
3724
+ throw new import_graphql11.GraphQLError(
3725
+ `WHERE ${columnName}: Cannot specify both fields and 'OR' in column operators!`
3726
+ );
3727
+ }
3728
+ const variants2 = [];
3729
+ for (const variant of operators.OR) {
3730
+ const extracted = extractFiltersColumn3(column, columnName, variant);
3731
+ if (extracted)
3732
+ variants2.push(extracted);
3733
+ }
3734
+ return variants2.length ? variants2.length > 1 ? (0, import_drizzle_orm15.or)(...variants2) : variants2[0] : void 0;
3735
+ }
3736
+ const variants = [];
3737
+ for (const [operatorName, operatorValue] of entries) {
3738
+ if (operatorValue === null || operatorValue === false)
3739
+ continue;
3740
+ switch (operatorName) {
3741
+ case "eq":
3742
+ case "ne":
3743
+ case "gt":
3744
+ case "gte":
3745
+ case "lt":
3746
+ case "lte": {
3747
+ const singleValue = remapFromGraphQLCore(
3748
+ operatorValue,
3749
+ column,
3750
+ columnName
3751
+ );
3752
+ const opMap = { eq: import_drizzle_orm15.eq, ne: import_drizzle_orm15.ne, gt: import_drizzle_orm15.gt, gte: import_drizzle_orm15.gte, lt: import_drizzle_orm15.lt, lte: import_drizzle_orm15.lte };
3753
+ variants.push(opMap[operatorName](column, singleValue));
3754
+ break;
3755
+ }
3756
+ case "like":
3757
+ case "notLike":
3758
+ case "ilike":
3759
+ case "notIlike": {
3760
+ const opMap = { like: import_drizzle_orm15.like, notLike: import_drizzle_orm15.notLike, ilike: import_drizzle_orm15.ilike, notIlike: import_drizzle_orm15.notIlike };
3761
+ variants.push(opMap[operatorName](column, operatorValue));
3762
+ break;
3763
+ }
3764
+ case "inArray":
3765
+ case "notInArray": {
3766
+ if (!operatorValue.length) {
3767
+ throw new import_graphql11.GraphQLError(
3768
+ `WHERE ${columnName}: Unable to use operator ${operatorName} with an empty array!`
3769
+ );
3770
+ }
3771
+ const arrayValue = operatorValue.map(
3772
+ (val) => remapFromGraphQLCore(val, column, columnName)
3773
+ );
3774
+ const opMap = { inArray: import_drizzle_orm15.inArray, notInArray: import_drizzle_orm15.notInArray };
3775
+ variants.push(opMap[operatorName](column, arrayValue));
3776
+ break;
3777
+ }
3778
+ case "isNull":
3779
+ case "isNotNull": {
3780
+ const opMap = { isNull: import_drizzle_orm15.isNull, isNotNull: import_drizzle_orm15.isNotNull };
3781
+ variants.push(opMap[operatorName](column));
3782
+ break;
3783
+ }
3784
+ }
3785
+ }
3786
+ return variants.length ? variants.length > 1 ? (0, import_drizzle_orm15.and)(...variants) : variants[0] : void 0;
3787
+ };
3788
+ var buildWhereClause2 = (tableInfo, where) => {
3789
+ if (!where || Object.keys(where).length === 0) {
3790
+ return void 0;
3791
+ }
3792
+ if (where.OR && where.OR.length > 0) {
3793
+ if (Object.keys(where).length > 1) {
3794
+ throw new import_graphql11.GraphQLError(
3795
+ `WHERE ${tableInfo.name}: Cannot specify both fields and 'OR' in table filters!`
3796
+ );
3797
+ }
3798
+ const variants = [];
3799
+ for (const variant of where.OR) {
3800
+ const extracted = buildWhereClause2(tableInfo, variant);
3801
+ if (extracted)
3802
+ variants.push(extracted);
3803
+ }
3804
+ return variants.length ? variants.length > 1 ? (0, import_drizzle_orm15.or)(...variants) : variants[0] : void 0;
3805
+ }
3806
+ const conditions = [];
3807
+ for (const [columnName, operators] of Object.entries(where)) {
3808
+ if (columnName === "OR")
3809
+ continue;
3810
+ if (!operators || Object.keys(operators).length === 0)
3811
+ continue;
3812
+ const column = tableInfo.columns[columnName];
3813
+ if (!column)
3814
+ continue;
3815
+ const extracted = extractFiltersColumn3(
3816
+ column,
3817
+ columnName,
3818
+ operators
3819
+ );
3820
+ if (extracted)
3821
+ conditions.push(extracted);
3822
+ }
3823
+ if (conditions.length === 0)
3824
+ return void 0;
3825
+ if (conditions.length === 1)
3826
+ return conditions[0];
3827
+ return (0, import_drizzle_orm15.and)(...conditions);
3828
+ };
3829
+
3830
+ // src/build-schema-sdl-with-dl/generator/utils/selection.ts
3831
+ var buildOrderByClause2 = (tableInfo, orderBy) => {
3832
+ if (!orderBy || Object.keys(orderBy).length === 0) {
3833
+ return void 0;
3834
+ }
3835
+ const orderEntries = Object.entries(orderBy).map(([columnName, field]) => ({
3836
+ columnName,
3837
+ ...field
3838
+ }));
3839
+ orderEntries.sort((a, b) => a.priority - b.priority);
3840
+ const orderClauses = [];
3841
+ for (const entry of orderEntries) {
3842
+ const column = tableInfo.columns[entry.columnName];
3843
+ if (column) {
3844
+ orderClauses.push(
3845
+ entry.direction === "desc" ? (0, import_drizzle_orm16.desc)(column) : (0, import_drizzle_orm16.asc)(column)
3846
+ );
3847
+ }
3848
+ }
3849
+ return orderClauses.length > 0 ? orderClauses : void 0;
3850
+ };
3851
+
3852
+ // src/build-schema-sdl-with-dl/generator/utils/dataloader.ts
3853
+ var import_dataloader = __toESM(require("dataloader"), 1);
3854
+ var import_drizzle_orm17 = require("drizzle-orm");
3855
+ var RelationDataLoader = class {
3856
+ constructor(queryBase, tableInfo, relations) {
3857
+ this.queryBase = queryBase;
3858
+ this.tableInfo = tableInfo;
3859
+ this.relations = relations;
3860
+ }
3861
+ loaders = /* @__PURE__ */ new Map();
3862
+ createLoaderKey(key) {
3863
+ return JSON.stringify({
3864
+ relationName: key.relationName,
3865
+ foreignKey: key.foreignKey,
3866
+ isReversedRelation: key.isReversedRelation,
3867
+ where: key.where,
3868
+ orderBy: key.orderBy,
3869
+ limit: key.limit,
3870
+ offset: key.offset,
3871
+ columns: key.columns
3872
+ });
3873
+ }
3874
+ getOrCreateLoader(loaderKey) {
3875
+ if (!this.loaders.has(loaderKey)) {
3876
+ const loader = new import_dataloader.default(
3877
+ async (keys) => this.batchLoadRelations(keys)
3878
+ );
3879
+ this.loaders.set(loaderKey, loader);
3880
+ }
3881
+ return this.loaders.get(loaderKey);
3882
+ }
3883
+ async batchLoadRelations(keys) {
3884
+ const groupedKeys = /* @__PURE__ */ new Map();
3885
+ for (const key of keys) {
3886
+ const configKey = this.createLoaderKey(key);
3887
+ if (!groupedKeys.has(configKey)) {
3888
+ groupedKeys.set(configKey, []);
3889
+ }
3890
+ groupedKeys.get(configKey).push(key);
3891
+ }
3892
+ const results = [];
3893
+ for (const [configKey, groupKeys] of Array.from(groupedKeys)) {
3894
+ const firstKey = groupKeys[0];
3895
+ if (!firstKey) {
3896
+ continue;
3897
+ }
3898
+ const allParentIds = groupKeys.flatMap((key) => key.parentIds);
3899
+ const uniqueParentIds = Array.from(new Set(allParentIds));
3900
+ const whereClause = this.buildBatchWhereClause(
3901
+ uniqueParentIds,
3902
+ firstKey.isReversedRelation,
3903
+ firstKey.foreignKey,
3904
+ firstKey.where
3905
+ );
3906
+ if (!whereClause) {
3907
+ results.push(...groupKeys.map(() => []));
3908
+ continue;
3909
+ }
3910
+ let query = this.queryBase.findMany({
3911
+ columns: {
3912
+ ...firstKey.columns || {},
3913
+ // Always include the foreign key column for mapping
3914
+ [firstKey.foreignKey]: true
3915
+ },
3916
+ where: whereClause,
3917
+ orderBy: firstKey.orderBy ? buildOrderByClause2(this.tableInfo, firstKey.orderBy) : void 0,
3918
+ limit: firstKey.limit,
3919
+ offset: firstKey.offset
3920
+ });
3921
+ console.log(`DataLoader executing query for relation ${firstKey.relationName} with foreign key ${firstKey.foreignKey}`);
3922
+ const batchResults = await query;
3923
+ console.log(`DataLoader got ${batchResults.length} results:`, batchResults);
3924
+ const resultsByParentId = /* @__PURE__ */ new Map();
3925
+ for (const result of batchResults) {
3926
+ const parentId = result[firstKey.foreignKey];
3927
+ if (!resultsByParentId.has(parentId)) {
3928
+ resultsByParentId.set(parentId, []);
3929
+ }
3930
+ resultsByParentId.get(parentId).push(result);
3931
+ }
3932
+ for (const key of groupKeys) {
3933
+ const keyResults = key.parentIds.map((parentId) => ({
3934
+ parentId,
3935
+ data: resultsByParentId.get(parentId) || []
3936
+ }));
3937
+ results.push(keyResults);
3938
+ }
3939
+ }
3940
+ return results;
3941
+ }
3942
+ buildBatchWhereClause(parentIds, isReversedRelation, foreignKeyName, additionalWhere) {
3943
+ const foreignKeyColumn = this.tableInfo.columns[foreignKeyName];
3944
+ if (!foreignKeyColumn) {
3945
+ console.error(`Foreign key column ${foreignKeyName} not found in table ${this.tableInfo.name}`);
3946
+ console.error(`Available columns:`, Object.keys(this.tableInfo.columns));
3947
+ return void 0;
3948
+ }
3949
+ const parentIdClause = (0, import_drizzle_orm17.inArray)(foreignKeyColumn, parentIds);
3950
+ if (!additionalWhere) {
3951
+ return parentIdClause;
3952
+ }
3953
+ const additionalClause = buildWhereClause2(this.tableInfo, additionalWhere);
3954
+ return additionalClause ? (0, import_drizzle_orm17.and)(parentIdClause, additionalClause) : parentIdClause;
3955
+ }
3956
+ async loadRelation(relationName, parentIds, foreignKey, options = {}, isReversedRelation = false) {
3957
+ const key = {
3958
+ relationName,
3959
+ parentIds,
3960
+ foreignKey,
3961
+ isReversedRelation,
3962
+ ...options
3963
+ };
3964
+ const loaderKey = this.createLoaderKey(key);
3965
+ const loader = this.getOrCreateLoader(loaderKey);
3966
+ const result = await loader.load(key);
3967
+ return result;
3968
+ }
3969
+ // Clear all loaders (call this at the end of each request)
3970
+ clearAll() {
3971
+ for (const loader of Array.from(this.loaders.values())) {
3972
+ loader.clearAll();
3973
+ }
3974
+ this.loaders.clear();
3975
+ }
3976
+ };
3977
+ function getRelationLoader(context, tableName, queryBase, tableInfo, relations) {
3978
+ if (!context.relationLoaders.has(tableName)) {
3979
+ context.relationLoaders.set(
3980
+ tableName,
3981
+ new RelationDataLoader(queryBase, tableInfo, relations)
3982
+ );
3983
+ }
3984
+ return context.relationLoaders.get(tableName);
3985
+ }
3986
+
3987
+ // src/build-schema-sdl-with-dl/generator/queries/dataloader-resolvers.ts
3988
+ var createDataLoaderFindManyResolver = (queryBase, tableInfo, tables, relations) => {
3989
+ return async (parent, args, context, info) => {
3990
+ try {
3991
+ const { where, orderBy, limit, offset } = args;
3992
+ const parsedInfo = (0, import_graphql_parse_resolve_info5.parseResolveInfo)(info, {
3993
+ deep: true
3994
+ });
3995
+ const allFields = {};
3996
+ if (parsedInfo.fieldsByTypeName) {
3997
+ for (const fields of Object.values(parsedInfo.fieldsByTypeName)) {
3998
+ Object.assign(allFields, fields);
3999
+ }
4000
+ }
4001
+ const allColumns = {};
4002
+ for (const columnName of Object.keys(tableInfo.columns)) {
4003
+ allColumns[columnName] = true;
4004
+ }
4005
+ const mainResults = await queryBase.findMany({
4006
+ columns: allColumns,
4007
+ offset,
4008
+ limit,
4009
+ orderBy: buildOrderByClause2(tableInfo, orderBy),
4010
+ where: buildWhereClause2(tableInfo, where)
4011
+ // No 'with' clause - we'll load relations separately
4012
+ });
4013
+ if (mainResults.length === 0) {
4014
+ return mainResults;
4015
+ }
4016
+ const enhancedResults = await loadRelationsWithDataLoader(
4017
+ mainResults,
4018
+ tableInfo,
4019
+ tables,
4020
+ relations,
4021
+ allFields,
4022
+ context
4023
+ );
4024
+ return enhancedResults;
4025
+ } catch (e) {
4026
+ if (typeof e === "object" && e !== null && "message" in e) {
4027
+ throw new import_graphql12.GraphQLError(String(e.message));
4028
+ }
4029
+ throw e;
4030
+ }
4031
+ };
4032
+ };
4033
+ var createDataLoaderFindFirstResolver = (queryBase, tableInfo, tables, relations) => {
4034
+ return async (parent, args, context, info) => {
4035
+ try {
4036
+ const { where, orderBy } = args;
4037
+ const parsedInfo = (0, import_graphql_parse_resolve_info5.parseResolveInfo)(info, {
4038
+ deep: true
4039
+ });
4040
+ const allFields = {};
4041
+ if (parsedInfo.fieldsByTypeName) {
4042
+ for (const fields of Object.values(parsedInfo.fieldsByTypeName)) {
4043
+ Object.assign(allFields, fields);
4044
+ }
4045
+ }
4046
+ const allColumns = {};
4047
+ for (const columnName of Object.keys(tableInfo.columns)) {
4048
+ allColumns[columnName] = true;
4049
+ }
4050
+ const mainResult = await queryBase.findFirst({
4051
+ columns: allColumns,
4052
+ orderBy: buildOrderByClause2(tableInfo, orderBy),
4053
+ where: buildWhereClause2(tableInfo, where)
4054
+ // No 'with' clause
4055
+ });
4056
+ if (!mainResult) {
4057
+ return null;
4058
+ }
4059
+ const [enhancedResult] = await loadRelationsWithDataLoader(
4060
+ [mainResult],
4061
+ tableInfo,
4062
+ tables,
4063
+ relations,
4064
+ allFields,
4065
+ context
4066
+ );
4067
+ return enhancedResult || null;
4068
+ } catch (e) {
4069
+ if (typeof e === "object" && e !== null && "message" in e) {
4070
+ throw new import_graphql12.GraphQLError(String(e.message));
4071
+ }
4072
+ throw e;
4073
+ }
4074
+ };
4075
+ };
4076
+ async function loadRelationsWithDataLoader(mainResults, tableInfo, tables, relations, fields, context) {
4077
+ const tableRelations = relations[tableInfo.name];
4078
+ if (!tableRelations) {
4079
+ return mainResults;
4080
+ }
4081
+ for (const mainResult of mainResults) {
4082
+ for (const [relName, { relation }] of Object.entries(tableRelations)) {
4083
+ const relationField = fields[relName];
4084
+ if (!relationField)
4085
+ continue;
4086
+ if ((0, import_drizzle_orm18.is)(relation, import_drizzle_orm18.One)) {
4087
+ mainResult[relName] = null;
4088
+ } else {
4089
+ mainResult[relName] = [];
4090
+ }
4091
+ }
4092
+ }
4093
+ const primaryKeyColumn = Object.values(tableInfo.columns).find((col) => col.primary);
4094
+ if (!primaryKeyColumn) {
4095
+ throw new Error(`No primary key found for table ${tableInfo.name}`);
4096
+ }
4097
+ const parentIds = mainResults.map((result) => result[primaryKeyColumn.name]);
4098
+ const relationPromises = [];
4099
+ for (const [relName, { targetTableName, relation }] of Object.entries(tableRelations)) {
4100
+ const relationField = fields[relName];
4101
+ if (!relationField)
4102
+ continue;
4103
+ const targetTable = tables[targetTableName];
4104
+ if (!targetTable)
4105
+ continue;
4106
+ const relationFields = {};
4107
+ if (relationField.fieldsByTypeName) {
4108
+ for (const typeFields of Object.values(relationField.fieldsByTypeName)) {
4109
+ Object.assign(relationFields, typeFields);
4110
+ }
4111
+ }
4112
+ const allTargetColumns = {};
4113
+ for (const columnName of Object.keys(targetTable.columns)) {
4114
+ allTargetColumns[columnName] = true;
4115
+ }
4116
+ const relationArgs = relationField.args;
4117
+ const relationOptions = {
4118
+ columns: allTargetColumns,
4119
+ where: relationArgs?.where,
4120
+ orderBy: relationArgs?.orderBy,
4121
+ limit: relationArgs?.limit,
4122
+ offset: relationArgs?.offset
4123
+ };
4124
+ let foreignKeyName;
4125
+ let isReversedRelation = false;
4126
+ const relationConfig = relation.config;
4127
+ console.log(`Processing relation ${relName} for table ${tableInfo.name} -> ${targetTableName}`);
4128
+ if (relationConfig?.fields && relationConfig.fields.length > 0) {
4129
+ if ((0, import_drizzle_orm18.is)(relation, import_drizzle_orm18.One)) {
4130
+ const fieldColumn = relationConfig.fields[0];
4131
+ const referenceColumn = relationConfig.references[0];
4132
+ const referenceKeyName = Object.keys(targetTable.columns).find(
4133
+ (key) => targetTable.columns[key] === referenceColumn
4134
+ ) || referenceColumn.name;
4135
+ foreignKeyName = referenceKeyName;
4136
+ isReversedRelation = false;
4137
+ console.log(`One-to-one relation: foreignKey=${foreignKeyName}, isReversed=${isReversedRelation}`);
4138
+ } else {
4139
+ const fieldColumn = relationConfig.fields[0];
4140
+ const referenceColumn = relationConfig.references[0];
4141
+ foreignKeyName = Object.keys(targetTable.columns).find(
4142
+ (key) => targetTable.columns[key] === referenceColumn
4143
+ ) || referenceColumn.name;
4144
+ isReversedRelation = false;
4145
+ console.log(`Many-to-one relation: foreignKey=${foreignKeyName}, isReversed=${isReversedRelation}`);
4146
+ }
4147
+ } else if (relationConfig?.references && relationConfig.references.length > 0) {
4148
+ foreignKeyName = relationConfig.references[0].name;
4149
+ isReversedRelation = true;
4150
+ console.log(`References-only relation: foreignKey=${foreignKeyName}, isReversed=${isReversedRelation}`);
4151
+ } else {
4152
+ if ((0, import_drizzle_orm18.is)(relation, import_drizzle_orm18.One)) {
4153
+ let possibleForeignKeys = Object.entries(targetTable.columns).filter(([name, col]) => {
4154
+ const lowerName = name.toLowerCase();
4155
+ const tableName = tableInfo.name.toLowerCase();
4156
+ return lowerName.endsWith("id") && (lowerName.includes(tableName) || lowerName === `${tableName}id` || lowerName === `${tableName}_id`);
4157
+ });
4158
+ if (possibleForeignKeys.length > 0) {
4159
+ foreignKeyName = possibleForeignKeys[0][0];
4160
+ isReversedRelation = true;
4161
+ } else {
4162
+ possibleForeignKeys = Object.entries(tableInfo.columns).filter(([name, col]) => {
4163
+ const lowerName = name.toLowerCase();
4164
+ const targetName = targetTableName.toLowerCase();
4165
+ return lowerName.endsWith("id") && (lowerName.includes(targetName) || lowerName === `${targetName}id` || lowerName === `${targetName}_id`);
4166
+ });
4167
+ if (possibleForeignKeys.length > 0) {
4168
+ foreignKeyName = possibleForeignKeys[0][0];
4169
+ isReversedRelation = false;
4170
+ } else {
4171
+ console.warn(`Could not determine foreign key for one-to-one relation ${relName}`);
4172
+ console.warn(`Available columns in current table ${tableInfo.name}:`, Object.keys(tableInfo.columns));
4173
+ console.warn(`Available columns in target table ${targetTableName}:`, Object.keys(targetTable.columns));
4174
+ continue;
4175
+ }
4176
+ }
4177
+ } else {
4178
+ let possibleForeignKeys = Object.entries(targetTable.columns).filter(([name, col]) => {
4179
+ const lowerName = name.toLowerCase();
4180
+ const tableName = tableInfo.name.toLowerCase();
4181
+ return lowerName.endsWith("id") && (lowerName.includes(tableName) || lowerName === `${tableName}id` || lowerName === `${tableName}_id` || // Special case for author -> user relationship
4182
+ tableName === "user" && lowerName === "authorid" || tableName === "user" && lowerName === "author_id");
4183
+ });
4184
+ if (possibleForeignKeys.length > 0) {
4185
+ foreignKeyName = possibleForeignKeys[0][0];
4186
+ isReversedRelation = true;
4187
+ } else {
4188
+ console.warn(`Could not determine foreign key for one-to-many relation ${relName}. Looking for foreign key in target table ${targetTableName} that references ${tableInfo.name}`);
4189
+ console.warn(`Available columns in ${targetTableName}:`, Object.keys(targetTable.columns));
4190
+ continue;
4191
+ }
4192
+ }
4193
+ }
4194
+ let actualParentIds = parentIds;
4195
+ if (relationConfig?.fields && relationConfig.fields.length > 0) {
4196
+ const fieldColumn = relationConfig.fields[0];
4197
+ const fieldKeyName = Object.keys(tableInfo.columns).find(
4198
+ (key) => tableInfo.columns[key] === fieldColumn
4199
+ ) || fieldColumn.name;
4200
+ if (tableInfo.columns[fieldKeyName]) {
4201
+ actualParentIds = mainResults.map((result) => result[fieldKeyName]).filter((id) => id != null);
4202
+ console.log(`Extracted foreign key values for many-to-one relation:`, actualParentIds);
4203
+ }
4204
+ }
4205
+ const targetQueryBase = context.db?.query?.[targetTableName];
4206
+ if (!targetQueryBase) {
4207
+ console.warn(`No query base found for target table ${targetTableName}`);
4208
+ continue;
4209
+ }
4210
+ const relationLoader = getRelationLoader(
4211
+ context,
4212
+ targetTableName,
4213
+ targetQueryBase,
4214
+ targetTable,
4215
+ relations[targetTableName] || {}
4216
+ );
4217
+ console.log(`Created relation loader for ${targetTableName}, calling loadRelation with parentIds:`, actualParentIds);
4218
+ const relationPromise = relationLoader.loadRelation(
4219
+ relName,
4220
+ actualParentIds,
4221
+ foreignKeyName,
4222
+ relationOptions,
4223
+ isReversedRelation
4224
+ ).then(async (relationResults) => {
4225
+ console.log(`Relation ${relName} loaded, got ${relationResults.length} results:`, relationResults);
4226
+ const relationMap = /* @__PURE__ */ new Map();
4227
+ for (const result of relationResults) {
4228
+ relationMap.set(result.parentId, result.data);
4229
+ }
4230
+ const hasNestedRelations = Object.keys(relationFields).some(
4231
+ (fieldName) => !targetTable.columns[fieldName]
4232
+ );
4233
+ if (hasNestedRelations && relationResults.some((r) => r.data.length > 0)) {
4234
+ const allRelationData = relationResults.flatMap((r) => r.data);
4235
+ const enhancedRelationData = await loadRelationsWithDataLoader(
4236
+ allRelationData,
4237
+ targetTable,
4238
+ tables,
4239
+ relations,
4240
+ relationFields,
4241
+ context
4242
+ );
4243
+ let dataIndex = 0;
4244
+ for (const result of relationResults) {
4245
+ const enhancedData = enhancedRelationData.slice(dataIndex, dataIndex + result.data.length);
4246
+ relationMap.set(result.parentId, enhancedData);
4247
+ dataIndex += result.data.length;
4248
+ }
4249
+ }
4250
+ for (const mainResult of mainResults) {
4251
+ const parentId = mainResult[primaryKeyColumn.name];
4252
+ if (relationConfig?.fields && relationConfig.fields.length > 0) {
4253
+ const fieldColumn = relationConfig.fields[0];
4254
+ const fieldKeyName = Object.keys(tableInfo.columns).find(
4255
+ (key) => tableInfo.columns[key] === fieldColumn
4256
+ ) || fieldColumn.name;
4257
+ if (tableInfo.columns[fieldKeyName]) {
4258
+ const foreignKeyValue = mainResult[fieldKeyName];
4259
+ const relationData2 = relationMap.get(foreignKeyValue) || [];
4260
+ mainResult[relName] = relationData2[0] || null;
4261
+ continue;
4262
+ }
4263
+ }
4264
+ const relationData = relationMap.get(parentId) || [];
4265
+ if ((0, import_drizzle_orm18.is)(relation, import_drizzle_orm18.One)) {
4266
+ mainResult[relName] = relationData[0] || null;
4267
+ } else {
4268
+ mainResult[relName] = relationData;
4269
+ }
4270
+ }
4271
+ });
4272
+ relationPromises.push(relationPromise);
4273
+ }
4274
+ await Promise.all(relationPromises);
4275
+ return mainResults;
4276
+ }
4277
+
4278
+ // src/build-schema-sdl-with-dl/generator/queries/index.ts
4279
+ var generateQueries2 = (db, tables, relations) => {
4280
+ const queries = {};
4281
+ for (const [tableName, tableInfo] of Object.entries(tables)) {
4282
+ const queryBase = db.query[tableName];
4283
+ if (!queryBase) {
4284
+ throw new Error(
4285
+ `Drizzle-GraphQL Error: Table ${tableName} not found in drizzle instance. Did you forget to pass schema to drizzle constructor?`
4286
+ );
4287
+ }
4288
+ queries[`${tableName}FindMany`] = createDataLoaderFindManyResolver(
4289
+ queryBase,
4290
+ tableInfo,
4291
+ tables,
4292
+ relations
4293
+ );
4294
+ queries[`${tableName}FindFirst`] = createDataLoaderFindFirstResolver(
4295
+ queryBase,
4296
+ tableInfo,
4297
+ tables,
4298
+ relations
4299
+ );
4300
+ }
4301
+ return queries;
4302
+ };
4303
+
4304
+ // src/build-schema-sdl-with-dl/generator/mutations/resolvers.ts
4305
+ var import_graphql13 = require("graphql");
4306
+ var createInsertManyResolver2 = (db, queryBase, tableInfo, tables, relations, primaryKeyColumn) => {
4307
+ const queryResolver = createDataLoaderFindManyResolver(queryBase, tableInfo, tables, relations);
4308
+ return async (parent, args, context, info) => {
4309
+ try {
4310
+ const { values } = args;
4311
+ if (!values || values.length === 0) {
4312
+ throw new import_graphql13.GraphQLError("No values provided for insert");
4313
+ }
4314
+ const remappedValues = remapFromGraphQLArrayInput(
4315
+ values,
4316
+ tableInfo.table
4317
+ );
4318
+ const insertedRows = await db.insert(tableInfo.table).values(remappedValues).returning({
4319
+ [primaryKeyColumn.name]: primaryKeyColumn
4320
+ });
4321
+ const insertedIds = insertedRows.map(
4322
+ (row) => row[primaryKeyColumn.name]
4323
+ );
4324
+ const result = await queryResolver(
4325
+ parent,
4326
+ {
4327
+ where: {
4328
+ [primaryKeyColumn.name]: { inArray: insertedIds }
4329
+ }
4330
+ },
4331
+ context,
4332
+ info
4333
+ );
4334
+ return result;
4335
+ } catch (e) {
4336
+ if (typeof e === "object" && e !== null && "message" in e) {
4337
+ throw new import_graphql13.GraphQLError(String(e.message));
4338
+ }
4339
+ throw e;
4340
+ }
4341
+ };
4342
+ };
4343
+ var createUpdateManyResolver2 = (db, queryBase, tableInfo, tables, relations, primaryKeyColumn) => {
4344
+ const queryResolver = createDataLoaderFindManyResolver(queryBase, tableInfo, tables, relations);
4345
+ return async (parent, args, context, info) => {
4346
+ try {
4347
+ const { where, set } = args;
4348
+ if (!set || Object.keys(set).length === 0) {
4349
+ throw new import_graphql13.GraphQLError("No values provided for update");
4350
+ }
4351
+ const remappedSet = remapFromGraphQLSingleInput(set, tableInfo.table);
4352
+ const whereClause = buildWhereClause2(tableInfo, where);
4353
+ let query = db.update(tableInfo.table).set(remappedSet);
4354
+ if (whereClause) {
4355
+ query = query.where(whereClause);
4356
+ }
4357
+ const updatedRows = await query.returning({
4358
+ [primaryKeyColumn.name]: primaryKeyColumn
4359
+ });
4360
+ const updatedIds = updatedRows.map(
4361
+ (row) => row[primaryKeyColumn.name]
4362
+ );
4363
+ const result = await queryResolver(
4364
+ parent,
4365
+ {
4366
+ where: {
4367
+ [primaryKeyColumn.name]: { inArray: updatedIds }
4368
+ }
4369
+ },
4370
+ context,
4371
+ info
4372
+ );
4373
+ return result;
4374
+ } catch (e) {
4375
+ if (typeof e === "object" && e !== null && "message" in e) {
4376
+ throw new import_graphql13.GraphQLError(String(e.message));
4377
+ }
4378
+ throw e;
4379
+ }
4380
+ };
4381
+ };
4382
+ var createDeleteManyResolver2 = (db, queryBase, tableInfo, tables, relations, primaryKeyColumn) => {
4383
+ const queryResolver = createDataLoaderFindManyResolver(queryBase, tableInfo, tables, relations);
4384
+ return async (parent, args, context, info) => {
4385
+ try {
4386
+ const { where } = args;
4387
+ const whereClause = buildWhereClause2(tableInfo, where);
4388
+ let deleteQuery = db.delete(tableInfo.table);
4389
+ if (whereClause) {
4390
+ deleteQuery = deleteQuery.where(whereClause);
4391
+ }
4392
+ const deletedRows = await deleteQuery.returning({
4393
+ [primaryKeyColumn.name]: primaryKeyColumn
4394
+ });
4395
+ const deletedItems = deletedRows.map((row) => ({
4396
+ id: row[primaryKeyColumn.name]
4397
+ }));
4398
+ return {
4399
+ deletedItems,
4400
+ [tableInfo.name + "FindMany"]: queryResolver
4401
+ };
4402
+ } catch (e) {
4403
+ if (typeof e === "object" && e !== null && "message" in e) {
4404
+ throw new import_graphql13.GraphQLError(String(e.message));
4405
+ }
4406
+ throw e;
4407
+ }
4408
+ };
4409
+ };
4410
+
4411
+ // src/build-schema-sdl-with-dl/generator/mutations/index.ts
4412
+ var generateMutations2 = (db, tables, relations) => {
4413
+ const mutations = {};
4414
+ const deleteResultResolvers = {};
4415
+ for (const [tableName, tableInfo] of Object.entries(tables)) {
4416
+ const capitalizedName = capitalize(tableName);
4417
+ const queryBase = db.query[tableName];
4418
+ if (!queryBase) {
4419
+ throw new Error(
4420
+ `Drizzle-GraphQL Error: Table ${tableName} not found in drizzle instance. Did you forget to pass schema to drizzle constructor?`
4421
+ );
4422
+ }
4423
+ const primaryKeyColumn = Object.values(tableInfo.columns).find(
4424
+ (col) => col.primary || col.name === "id"
4425
+ );
4426
+ if (!primaryKeyColumn) {
4427
+ throw new Error(
4428
+ `Drizzle-GraphQL Error: Table ${tableName} does not have a primary key column`
4429
+ );
4430
+ }
4431
+ mutations[`${tableName}InsertMany`] = createInsertManyResolver2(
4432
+ db,
4433
+ queryBase,
4434
+ tableInfo,
4435
+ tables,
4436
+ relations,
4437
+ primaryKeyColumn
4438
+ );
4439
+ mutations[`${tableName}UpdateMany`] = createUpdateManyResolver2(
4440
+ db,
4441
+ queryBase,
4442
+ tableInfo,
4443
+ tables,
4444
+ relations,
4445
+ primaryKeyColumn
4446
+ );
4447
+ mutations[`${tableName}DeleteMany`] = createDeleteManyResolver2(
4448
+ db,
4449
+ queryBase,
4450
+ tableInfo,
4451
+ tables,
4452
+ relations,
4453
+ primaryKeyColumn
4454
+ );
4455
+ deleteResultResolvers[`${capitalizedName}DeleteResult`] = {
4456
+ [`${tableName}FindMany`]: (parent, args, context, info) => {
4457
+ const resolverFn = parent[`${tableName}FindMany`];
4458
+ if (typeof resolverFn === "function") {
4459
+ return resolverFn(parent, args, context, info);
4460
+ }
4461
+ return [];
4462
+ }
4463
+ };
4464
+ }
4465
+ return { mutations, deleteResultResolvers };
4466
+ };
4467
+
4468
+ // src/export-tool/directive-definitions.ts
4469
+ var exportDirectiveTypeDefs = `directive @export(as: String!) on FIELD`;
4470
+
4471
+ // src/build-schema-sdl-with-dl/index.ts
4472
+ var import_schema3 = require("@graphql-tools/schema");
4473
+ var buildSchemaSDL2 = (db) => {
4474
+ const schema = db._.fullSchema;
4475
+ if (!schema) {
4476
+ throw new Error(
4477
+ "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!"
4478
+ );
4479
+ }
4480
+ if (!(0, import_drizzle_orm19.is)(db, import_sqlite_core7.BaseSQLiteDatabase)) {
4481
+ throw new Error(
4482
+ "Drizzle-GraphQL Error: buildSchemaSDL currently only supports SQLite databases"
4483
+ );
4484
+ }
4485
+ const { tables, relations } = generateTypes2(db, schema);
4486
+ const typeDefsArray = [];
4487
+ typeDefsArray.push(generateTypeDefs2(tables, relations));
4488
+ typeDefsArray.push(generateQueryTypeDefs2(tables));
4489
+ typeDefsArray.push(generateMutationTypeDefs2(tables));
4490
+ const typeDefs = typeDefsArray.join("\n\n");
4491
+ const queries = generateQueries2(db, tables, relations);
4492
+ const { mutations, deleteResultResolvers } = generateMutations2(
4493
+ db,
4494
+ tables,
4495
+ relations
4496
+ );
4497
+ const resolvers = {
4498
+ Query: queries,
4499
+ Mutation: mutations,
4500
+ ...deleteResultResolvers
4501
+ };
4502
+ return {
4503
+ typeDefs,
4504
+ resolvers
4505
+ };
4506
+ };
4507
+
4508
+ // src/build-schema-sdl-with-dl/generator/utils/context.ts
4509
+ function createDataLoaderContext() {
4510
+ return {
4511
+ relationLoaders: /* @__PURE__ */ new Map()
4512
+ };
4513
+ }
4514
+ function cleanupDataLoaderContext(context) {
4515
+ for (const loader of Array.from(context.relationLoaders.values())) {
4516
+ loader.clearAll();
4517
+ }
4518
+ context.relationLoaders.clear();
4519
+ }
4520
+
4521
+ // src/build-schema-sdl-with-dl/generator/utils/envelop-plugin.ts
4522
+ var useDataLoaderCleanup = (options) => ({
4523
+ onContextBuilding: ({ context, extendContext }) => {
4524
+ const dataLoaderContext = createDataLoaderContext();
4525
+ const contextExtension = dataLoaderContext;
4526
+ if (options?.db) {
4527
+ contextExtension.db = options.db;
4528
+ }
4529
+ extendContext(contextExtension);
4530
+ },
4531
+ onExecute: ({ args }) => ({
4532
+ onExecuteDone: () => {
4533
+ const context = args.contextValue;
4534
+ if (context && context.relationLoaders) {
4535
+ cleanupDataLoaderContext(context);
4536
+ }
4537
+ }
4538
+ })
4539
+ });
4540
+ var useDataLoaderContext = (options) => ({
4541
+ onContextBuilding: ({ context, extendContext }) => {
4542
+ const dataLoaderContext = createDataLoaderContext();
4543
+ const contextExtension = dataLoaderContext;
4544
+ if (options?.db) {
4545
+ contextExtension.db = options.db;
4546
+ }
4547
+ extendContext(contextExtension);
4548
+ }
4549
+ });
4550
+ var useDataLoaderCleanupOnly = () => ({
4551
+ onExecute: ({ args }) => ({
4552
+ onExecuteDone: () => {
4553
+ const context = args.contextValue;
4554
+ if (context && context.relationLoaders) {
4555
+ cleanupDataLoaderContext(context);
4556
+ }
4557
+ }
4558
+ })
4559
+ });
4560
+
3269
4561
  // src/export-tool/ExportStore.ts
3270
4562
  var ExportStore = class {
3271
4563
  store = /* @__PURE__ */ new Map();
@@ -3388,10 +4680,10 @@ function createExportMiddleware() {
3388
4680
  }
3389
4681
 
3390
4682
  // src/export-tool/makeScalarAcceptExports.ts
3391
- var import_graphql11 = require("graphql");
4683
+ var import_graphql14 = require("graphql");
3392
4684
  function makeScalarAcceptExports(originalScalar) {
3393
4685
  const config = originalScalar.toConfig();
3394
- return new import_graphql11.GraphQLScalarType({
4686
+ return new import_graphql14.GraphQLScalarType({
3395
4687
  ...config,
3396
4688
  name: config.name,
3397
4689
  // Keep original name to override it in schema
@@ -3407,7 +4699,7 @@ function makeScalarAcceptExports(originalScalar) {
3407
4699
  return value;
3408
4700
  },
3409
4701
  parseLiteral(ast, variables) {
3410
- if (ast.kind === import_graphql11.Kind.STRING) {
4702
+ if (ast.kind === import_graphql14.Kind.STRING) {
3411
4703
  if (ast.value.startsWith("$_") || ast.value === "") {
3412
4704
  return ast.value;
3413
4705
  }
@@ -3421,13 +4713,13 @@ function makeScalarAcceptExports(originalScalar) {
3421
4713
  }
3422
4714
 
3423
4715
  // src/helpers.ts
3424
- var import_drizzle_orm13 = require("drizzle-orm");
4716
+ var import_drizzle_orm20 = require("drizzle-orm");
3425
4717
  function setCustomGraphQL(table, columnConfig) {
3426
4718
  for (const [columnName, config] of Object.entries(columnConfig)) {
3427
4719
  const column = table[columnName];
3428
4720
  if (!column) {
3429
4721
  console.warn(
3430
- `Warning: Column "${columnName}" not found in table "${(0, import_drizzle_orm13.getTableName)(
4722
+ `Warning: Column "${columnName}" not found in table "${(0, import_drizzle_orm20.getTableName)(
3431
4723
  table
3432
4724
  )}"`
3433
4725
  );
@@ -3451,9 +4743,16 @@ function setCustomGraphQLTypes(table, columnTypes) {
3451
4743
  0 && (module.exports = {
3452
4744
  buildSchema,
3453
4745
  buildSchemaSDL,
4746
+ buildSchemaSDLWithDataLoader,
4747
+ cleanupDataLoaderContext,
4748
+ createDataLoaderContext,
3454
4749
  createExportMiddleware,
4750
+ exportDirectiveTypeDefs,
3455
4751
  makeScalarAcceptExports,
3456
4752
  setCustomGraphQL,
3457
- setCustomGraphQLTypes
4753
+ setCustomGraphQLTypes,
4754
+ useDataLoaderCleanup,
4755
+ useDataLoaderCleanupOnly,
4756
+ useDataLoaderContext
3458
4757
  });
3459
4758
  //# sourceMappingURL=index.cjs.map