@vantreeseba/drizzle-graphql 7.3.0 → 7.5.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 CHANGED
@@ -40,15 +40,21 @@ __export(index_exports, {
40
40
  createRelationResolverFactory: () => createRelationResolverFactory,
41
41
  defaultErrorMapper: () => defaultErrorMapper,
42
42
  drizzleExecutorKey: () => drizzleExecutorKey,
43
+ drizzleExtension: () => drizzleExtension,
43
44
  extractFilters: () => extractFilters,
44
45
  extractOrderBy: () => extractOrderBy,
45
- extractRelationJoinColumns: () => extractRelationJoinColumns
46
+ extractRelationJoinColumns: () => extractRelationJoinColumns,
47
+ identifyRows: () => identifyRows,
48
+ isDrizzleFieldExtension: () => isDrizzleFieldExtension,
49
+ resolveSelection: () => resolveSelection,
50
+ selectionToWith: () => selectionToWith,
51
+ singularizeMapper: () => singularizeMapper
46
52
  });
47
53
  module.exports = __toCommonJS(index_exports);
48
- var import_drizzle_orm10 = require("drizzle-orm");
49
- var import_mysql_core3 = require("drizzle-orm/mysql-core");
50
- var import_pg_core3 = require("drizzle-orm/pg-core");
51
- var import_sqlite_core3 = require("drizzle-orm/sqlite-core");
54
+ var import_drizzle_orm11 = require("drizzle-orm");
55
+ var import_mysql_core4 = require("drizzle-orm/mysql-core");
56
+ var import_pg_core4 = require("drizzle-orm/pg-core");
57
+ var import_sqlite_core4 = require("drizzle-orm/sqlite-core");
52
58
  var import_graphql11 = require("graphql");
53
59
 
54
60
  // src/util/builders/common.ts
@@ -105,6 +111,10 @@ var getOrCreateLoader = (context, key, batchFn) => {
105
111
  var import_pluralize = __toESM(require("pluralize"), 1);
106
112
  var uncapitalize = (input) => input?.length ? `${input[0].toLocaleLowerCase()}${input.length > 1 ? input.slice(1, input.length) : ""}` : input;
107
113
  var capitalize = (input) => input?.length ? `${input[0].toLocaleUpperCase()}${input.length > 1 ? input.slice(1, input.length) : ""}` : input;
114
+ var singularizeMapper = (tableName) => ({
115
+ singular: uncapitalize(import_pluralize.default.singular(tableName)),
116
+ plural: uncapitalize(import_pluralize.default.plural(tableName))
117
+ });
108
118
 
109
119
  // src/util/data-mappers/index.ts
110
120
  var import_drizzle_orm2 = require("drizzle-orm");
@@ -593,6 +603,123 @@ var remapFromGraphQLArrayInput = (queryInput, table) => {
593
603
  return queryInput;
594
604
  };
595
605
 
606
+ // src/util/extensions.ts
607
+ var drizzleExtension = (target) => {
608
+ const value = target?.extensions?.drizzle;
609
+ return value && typeof value === "object" ? value : void 0;
610
+ };
611
+ var isDrizzleFieldExtension = (value) => !!value && value.kind !== "type";
612
+ var tableFieldExtensions = (table, primaryKey) => (meta) => ({
613
+ table,
614
+ primaryKey,
615
+ ...meta
616
+ });
617
+ var tableTypeExtension = (table, primaryKey) => ({
618
+ table,
619
+ kind: "type",
620
+ primaryKey
621
+ });
622
+ var relationFieldExtension = (params) => ({
623
+ table: params.targetTable,
624
+ kind: params.aggregate ? "aggregate" : "relation",
625
+ operation: params.aggregate ? "relationAggregate" : "relation",
626
+ // An aggregate over a to-many relation still resolves to a single aggregate object.
627
+ single: params.aggregate ? true : params.single,
628
+ targetArg: "where",
629
+ primaryKey: params.primaryKey,
630
+ relation: params.relation,
631
+ parentTable: params.parentTable
632
+ });
633
+ var keyFromValues = (entry, primaryKey) => {
634
+ if (!entry || typeof entry !== "object") {
635
+ return void 0;
636
+ }
637
+ const row = {};
638
+ for (const column of primaryKey) {
639
+ const value = entry[column];
640
+ if (value === void 0 || value === null) {
641
+ return void 0;
642
+ }
643
+ row[column] = value;
644
+ }
645
+ return row;
646
+ };
647
+ var keysFromWhere = (where, primaryKey) => {
648
+ const none = { rows: [], complete: false };
649
+ if (!where || typeof where !== "object" || Array.isArray(where)) {
650
+ return none;
651
+ }
652
+ const filters = where;
653
+ if (filters.OR || filters.AND || filters.NOT) {
654
+ return none;
655
+ }
656
+ if (primaryKey.length > 1) {
657
+ const row = {};
658
+ for (const column2 of primaryKey) {
659
+ const operators2 = filters[column2];
660
+ if (!operators2 || typeof operators2 !== "object" || operators2.eq === void 0) {
661
+ return none;
662
+ }
663
+ row[column2] = operators2.eq;
664
+ }
665
+ return { rows: [row], complete: Object.keys(filters).length === primaryKey.length };
666
+ }
667
+ const column = primaryKey[0];
668
+ if (!column) {
669
+ return none;
670
+ }
671
+ const operators = filters[column];
672
+ if (!operators || typeof operators !== "object") {
673
+ return none;
674
+ }
675
+ const exact = Object.keys(filters).length === 1 && Object.keys(operators).length === 1;
676
+ if (operators.eq !== void 0) {
677
+ return { rows: [{ [column]: operators.eq }], complete: exact };
678
+ }
679
+ if (Array.isArray(operators.inArray)) {
680
+ return { rows: operators.inArray.map((value) => ({ [column]: value })), complete: exact };
681
+ }
682
+ return none;
683
+ };
684
+ var identifyRows = (field, args) => {
685
+ const meta = drizzleExtension(field);
686
+ if (!isDrizzleFieldExtension(meta)) {
687
+ return void 0;
688
+ }
689
+ const { table, primaryKey, targetArg } = meta;
690
+ const empty = { table, primaryKey, rows: [], complete: false };
691
+ if (!primaryKey.length || !targetArg) {
692
+ return empty;
693
+ }
694
+ const target = args?.[targetArg];
695
+ if (targetArg === "values") {
696
+ const entries = Array.isArray(target) ? target : target === void 0 ? [] : [target];
697
+ const rows = entries.map((entry) => keyFromValues(entry, primaryKey));
698
+ return {
699
+ table,
700
+ primaryKey,
701
+ rows: rows.filter((row) => !!row),
702
+ // A row whose key the database generates is not identifiable before the write.
703
+ complete: entries.length > 0 && rows.every(Boolean)
704
+ };
705
+ }
706
+ if (targetArg === "updates") {
707
+ if (!Array.isArray(target)) {
708
+ return empty;
709
+ }
710
+ const perEntry = target.map(
711
+ (entry) => keysFromWhere(entry?.where, primaryKey)
712
+ );
713
+ return {
714
+ table,
715
+ primaryKey,
716
+ rows: perEntry.flatMap((entry) => entry.rows),
717
+ complete: target.length > 0 && perEntry.every((entry) => entry.complete)
718
+ };
719
+ }
720
+ return { table, primaryKey, ...keysFromWhere(target, primaryKey) };
721
+ };
722
+
596
723
  // src/util/builders/field-updates.ts
597
724
  var import_drizzle_orm3 = require("drizzle-orm");
598
725
  var import_graphql4 = require("graphql");
@@ -1139,6 +1266,14 @@ var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx, limits
1139
1266
  return loader.load(localValue);
1140
1267
  };
1141
1268
  };
1269
+ var relationExtensionFor = (relEntry, parentTable, relationName, isOne, aggregate) => relationFieldExtension({
1270
+ targetTable: relEntry.targetTableName,
1271
+ parentTable,
1272
+ relation: relationName,
1273
+ single: isOne,
1274
+ primaryKey: relEntry.targetPkNames ?? [],
1275
+ aggregate
1276
+ });
1142
1277
  var columnDocs = (docs, column, tableName, columnName) => {
1143
1278
  const description = docs.describeColumn?.(column, { tableName, columnName });
1144
1279
  const deprecationReason = docs.deprecateColumn?.(column, { tableName, columnName });
@@ -1818,7 +1953,8 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1818
1953
  const shell = new import_graphql5.GraphQLObjectType({
1819
1954
  name: typeName,
1820
1955
  description: cacheCtx.docs.describeTable?.(tableName),
1821
- fields: () => ({ ...tableFields, ...container.fields })
1956
+ fields: () => ({ ...tableFields, ...container.fields }),
1957
+ extensions: { drizzle: tableTypeExtension(tableName, cacheCtx.primaryKeyOf?.(tableName) ?? []) }
1822
1958
  });
1823
1959
  cacheCtx.objectTypeCache.set(tableName, shell);
1824
1960
  }
@@ -1860,7 +1996,10 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1860
1996
  relType = new import_graphql5.GraphQLObjectType({
1861
1997
  name: resolveTypeName(targetTableName, typeNameMapper),
1862
1998
  description: cacheCtx.docs.describeTable?.(targetTableName),
1863
- fields: () => ({ ...targetTableFields, ...capturedTargetContainer.fields })
1999
+ fields: () => ({ ...targetTableFields, ...capturedTargetContainer.fields }),
2000
+ extensions: {
2001
+ drizzle: tableTypeExtension(targetTableName, cacheCtx.primaryKeyOf?.(targetTableName) ?? [])
2002
+ }
1864
2003
  });
1865
2004
  cacheCtx.objectTypeCache.set(targetTableName, relType);
1866
2005
  }
@@ -1877,12 +2016,13 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1877
2016
  where: { type: relSelectData.filters }
1878
2017
  },
1879
2018
  resolve,
1880
- ...relationDocs
2019
+ ...relationDocs,
2020
+ extensions: { drizzle: relationExtensionFor(relEntry, tableName, relationName, true) }
1881
2021
  }
1882
2022
  ]);
1883
2023
  continue;
1884
2024
  }
1885
- const targetDistinctEnum = cacheCtx.features.distinct ? generateDistinctEnum(tables[targetTableName], resolveTypeName(targetTableName, typeNameMapper)) : void 0;
2025
+ const targetDistinctEnum = cacheCtx.featureOf(targetTableName).distinct ? generateDistinctEnum(tables[targetTableName], resolveTypeName(targetTableName, typeNameMapper)) : void 0;
1886
2026
  rawRelationFields.push([
1887
2027
  relationName,
1888
2028
  {
@@ -1900,11 +2040,10 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1900
2040
  },
1901
2041
  resolve,
1902
2042
  ...relationDocs,
1903
- ...cacheCtx.complexity ? {
1904
- extensions: {
1905
- complexity: listFieldComplexity(cacheCtx.complexity, cacheCtx.limits?.(targetTableName))
1906
- }
1907
- } : {}
2043
+ extensions: {
2044
+ drizzle: relationExtensionFor(relEntry, tableName, relationName, false),
2045
+ ...cacheCtx.complexity ? { complexity: listFieldComplexity(cacheCtx.complexity, cacheCtx.limits?.(targetTableName)) } : {}
2046
+ }
1908
2047
  }
1909
2048
  ]);
1910
2049
  const aggregateFieldName = `${relationName}Aggregate`;
@@ -1923,7 +2062,10 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1923
2062
  where: { type: relSelectData.filters }
1924
2063
  },
1925
2064
  resolve: relationAggregate.resolve,
1926
- ...cacheCtx.complexity ? { extensions: { complexity: aggregateFieldComplexity(cacheCtx.complexity) } } : {}
2065
+ extensions: {
2066
+ drizzle: relationExtensionFor(relEntry, tableName, relationName, isOne, true),
2067
+ ...cacheCtx.complexity ? { complexity: aggregateFieldComplexity(cacheCtx.complexity) } : {}
2068
+ }
1927
2069
  }
1928
2070
  ]);
1929
2071
  }
@@ -1992,7 +2134,7 @@ var generateTableTypes = (tableName, tables, relationMap, withReturning, relatio
1992
2134
  const updateFields = Object.fromEntries(
1993
2135
  columnEntries.map(([columnName, column]) => {
1994
2136
  const converted = drizzleColumnToGraphQLType(column, columnName, tableName, true, false, true);
1995
- const operations = cacheCtx.features.fieldUpdateOperations ? fieldUpdateInputType(column, columnName, tableName) : void 0;
2137
+ const operations = cacheCtx.featureOf(tableName).fieldUpdateOperations ? fieldUpdateInputType(column, columnName, tableName) : void 0;
1996
2138
  const field = operations ? { ...converted, type: operations } : converted;
1997
2139
  return [columnName, { ...field, ...inputFieldDocs(cacheCtx.docs, column, tableName, columnName, field.type) }];
1998
2140
  })
@@ -2009,7 +2151,8 @@ var generateTableTypes = (tableName, tables, relationMap, withReturning, relatio
2009
2151
  const selectSingleOutput = cacheCtx.objectTypeCache.get(tableName) ?? new import_graphql5.GraphQLObjectType({
2010
2152
  name: resolveTypeName(tableName, typeNameMapper),
2011
2153
  description: cacheCtx.docs.describeTable?.(tableName),
2012
- fields: { ...tableFields, ...relationFields }
2154
+ fields: { ...tableFields, ...relationFields },
2155
+ extensions: { drizzle: tableTypeExtension(tableName, cacheCtx.primaryKeyOf?.(tableName) ?? []) }
2013
2156
  });
2014
2157
  const selectArrOutput = new import_graphql5.GraphQLNonNull(new import_graphql5.GraphQLList(new import_graphql5.GraphQLNonNull(selectSingleOutput)));
2015
2158
  const arrTableItemOutput = withReturning ? (
@@ -3410,6 +3553,38 @@ var import_mysql_core2 = require("drizzle-orm/mysql-core");
3410
3553
  var import_graphql7 = require("graphql");
3411
3554
  var import_graphql_parse_resolve_info2 = require("graphql-parse-resolve-info");
3412
3555
 
3556
+ // src/util/features.ts
3557
+ var featureDefaults = {
3558
+ aggregates: true,
3559
+ groupBy: true,
3560
+ relationAggregates: true,
3561
+ distinct: true,
3562
+ insert: true,
3563
+ update: true,
3564
+ updateMany: true,
3565
+ delete: true,
3566
+ upsert: false,
3567
+ fieldUpdateOperations: false,
3568
+ countMutations: false,
3569
+ requireWhere: false
3570
+ };
3571
+ var resolveTableFeatures = (features) => {
3572
+ const cache = /* @__PURE__ */ new Map();
3573
+ const names = Object.keys(featureDefaults);
3574
+ return (tableName) => {
3575
+ let resolved = cache.get(tableName);
3576
+ if (!resolved) {
3577
+ resolved = {};
3578
+ for (const name of names) {
3579
+ const configured = features?.[name];
3580
+ resolved[name] = configured === void 0 ? featureDefaults[name] : typeof configured === "function" ? !!configured(tableName) : !!configured;
3581
+ }
3582
+ cache.set(tableName, resolved);
3583
+ }
3584
+ return resolved;
3585
+ };
3586
+ };
3587
+
3413
3588
  // src/util/builders/aggregates.ts
3414
3589
  var import_drizzle_orm5 = require("drizzle-orm");
3415
3590
  var import_graphql6 = require("graphql");
@@ -4144,6 +4319,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4144
4319
  const excludedTables = new Set(options.exclude?.tables ?? []);
4145
4320
  const tableEntries = schemaEntries.filter(([key, value]) => (0, import_drizzle_orm6.is)(value, import_mysql_core2.MySqlTable) && !excludedTables.has(key));
4146
4321
  const tables = Object.fromEntries(tableEntries);
4322
+ const featureOf = resolveTableFeatures(features);
4323
+ const anyTable = (feature) => tableEntries.some(([name]) => featureOf(name)[feature]);
4147
4324
  if (!tableEntries.length) {
4148
4325
  throw new Error(
4149
4326
  "Drizzle-GraphQL Error: No tables detected in Drizzle-ORM's database instance. Did you forget to pass schema to drizzle constructor?"
@@ -4186,9 +4363,10 @@ var generateSchemaData = (db, schema, relations, options) => {
4186
4363
  complexity,
4187
4364
  limits,
4188
4365
  docs: options.docs ?? {},
4189
- features
4366
+ primaryKeyOf: (name) => tables[name] ? mysqlPrimaryKeyPropNames(tables[name]) : [],
4367
+ featureOf
4190
4368
  };
4191
- const relationAggregateFactory = features.relationAggregates ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
4369
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
4192
4370
  const queries = {};
4193
4371
  const mutations = {};
4194
4372
  const mutationTxCtx = createMutationTxCtx(options.transactions);
@@ -4206,7 +4384,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4206
4384
  prefixes.insert,
4207
4385
  prefixes.update,
4208
4386
  resolverFactory,
4209
- relationAggregateFactory
4387
+ featureOf(tableName).relationAggregates ? relationAggregateFactory : void 0
4210
4388
  )
4211
4389
  ])
4212
4390
  );
@@ -4220,10 +4398,12 @@ var generateSchemaData = (db, schema, relations, options) => {
4220
4398
  });
4221
4399
  const inputs = {};
4222
4400
  const outputs = {};
4223
- if (features.insert || features.upsert || features.update || features.delete) {
4401
+ if (["insert", "upsert", "update", "delete"].some((feature) => anyTable(feature))) {
4224
4402
  outputs.MutationReturn = mutationReturnType;
4225
4403
  }
4226
4404
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
4405
+ const tableFeatures = featureOf(tableName);
4406
+ const drizzleMeta = tableFieldExtensions(tableName, mysqlPrimaryKeyPropNames(schema[tableName]));
4227
4407
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
4228
4408
  const { selectSingleOutput, selectArrOutput } = tableTypes.outputs;
4229
4409
  const {
@@ -4255,7 +4435,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4255
4435
  typeName,
4256
4436
  typeNameMapper,
4257
4437
  filterCtx,
4258
- features.distinct,
4438
+ tableFeatures.distinct,
4259
4439
  limits
4260
4440
  );
4261
4441
  const selectSingleGenerated = generateSelectSingle(
@@ -4271,7 +4451,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4271
4451
  filterCtx,
4272
4452
  limits
4273
4453
  );
4274
- const insertArrGenerated = features.insert ? generateInsertArray(
4454
+ const insertArrGenerated = tableFeatures.insert ? generateInsertArray(
4275
4455
  db,
4276
4456
  tableName,
4277
4457
  schema[tableName],
@@ -4279,7 +4459,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4279
4459
  createArrayFieldName,
4280
4460
  mutationTxCtx
4281
4461
  ) : void 0;
4282
- const insertSingleGenerated = features.insert ? generateInsertSingle(
4462
+ const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle(
4283
4463
  db,
4284
4464
  tableName,
4285
4465
  schema[tableName],
@@ -4287,7 +4467,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4287
4467
  createSingleFieldName,
4288
4468
  mutationTxCtx
4289
4469
  ) : void 0;
4290
- const onConflictInput = features.upsert ? generateOnConflictInput({
4470
+ const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
4291
4471
  table: schema[tableName],
4292
4472
  typeName,
4293
4473
  uniqueSets: [],
@@ -4312,7 +4492,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4312
4492
  true,
4313
4493
  mutationTxCtx
4314
4494
  ) : void 0;
4315
- const updateGenerated = features.update ? generateUpdate(
4495
+ const updateGenerated = tableFeatures.update ? generateUpdate(
4316
4496
  db,
4317
4497
  tableName,
4318
4498
  schema[tableName],
@@ -4320,11 +4500,11 @@ var generateSchemaData = (db, schema, relations, options) => {
4320
4500
  tableFilters,
4321
4501
  updateFieldName,
4322
4502
  false,
4323
- features.requireWhere,
4503
+ tableFeatures.requireWhere,
4324
4504
  filterCtx,
4325
4505
  mutationTxCtx
4326
4506
  ) : void 0;
4327
- const updateSingleGenerated = features.update ? generateUpdate(
4507
+ const updateSingleGenerated = tableFeatures.update ? generateUpdate(
4328
4508
  db,
4329
4509
  tableName,
4330
4510
  schema[tableName],
@@ -4332,11 +4512,11 @@ var generateSchemaData = (db, schema, relations, options) => {
4332
4512
  tableFilters,
4333
4513
  updateSingleFieldName,
4334
4514
  true,
4335
- features.requireWhere,
4515
+ tableFeatures.requireWhere,
4336
4516
  filterCtx,
4337
4517
  mutationTxCtx
4338
4518
  ) : void 0;
4339
- const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
4519
+ const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
4340
4520
  const updateManyGenerated = updateManyInput ? generateUpdateMany(
4341
4521
  db,
4342
4522
  tableName,
@@ -4346,29 +4526,29 @@ var generateSchemaData = (db, schema, relations, options) => {
4346
4526
  filterCtx,
4347
4527
  mutationTxCtx
4348
4528
  ) : void 0;
4349
- const deleteGenerated = features.delete ? generateDelete(
4529
+ const deleteGenerated = tableFeatures.delete ? generateDelete(
4350
4530
  db,
4351
4531
  tableName,
4352
4532
  schema[tableName],
4353
4533
  tableFilters,
4354
4534
  deleteFieldName,
4355
4535
  false,
4356
- features.requireWhere,
4536
+ tableFeatures.requireWhere,
4357
4537
  filterCtx,
4358
4538
  mutationTxCtx
4359
4539
  ) : void 0;
4360
- const deleteSingleGenerated = features.delete ? generateDelete(
4540
+ const deleteSingleGenerated = tableFeatures.delete ? generateDelete(
4361
4541
  db,
4362
4542
  tableName,
4363
4543
  schema[tableName],
4364
4544
  tableFilters,
4365
4545
  deleteSingleFieldName,
4366
4546
  true,
4367
- features.requireWhere,
4547
+ tableFeatures.requireWhere,
4368
4548
  filterCtx,
4369
4549
  mutationTxCtx
4370
4550
  ) : void 0;
4371
- const updateCountGenerated = features.update && features.countMutations ? generateWriteCount({
4551
+ const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
4372
4552
  db,
4373
4553
  tableName,
4374
4554
  table: schema[tableName],
@@ -4376,23 +4556,23 @@ var generateSchemaData = (db, schema, relations, options) => {
4376
4556
  setArgs: updateInput,
4377
4557
  filterArgs: tableFilters,
4378
4558
  fieldName: updateCountFieldName,
4379
- requireWhere: features.requireWhere,
4559
+ requireWhere: tableFeatures.requireWhere,
4380
4560
  filterCtx,
4381
4561
  txCtx: mutationTxCtx
4382
4562
  }) : void 0;
4383
- const deleteCountGenerated = features.delete && features.countMutations ? generateWriteCount({
4563
+ const deleteCountGenerated = tableFeatures.delete && tableFeatures.countMutations ? generateWriteCount({
4384
4564
  db,
4385
4565
  tableName,
4386
4566
  table: schema[tableName],
4387
4567
  kind: "delete",
4388
4568
  filterArgs: tableFilters,
4389
4569
  fieldName: deleteCountFieldName,
4390
- requireWhere: features.requireWhere,
4570
+ requireWhere: tableFeatures.requireWhere,
4391
4571
  filterCtx,
4392
4572
  txCtx: mutationTxCtx
4393
4573
  }) : void 0;
4394
- const aggregateType = features.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4395
- const aggregateGenerated = features.aggregates ? generateAggregate(
4574
+ const aggregateType = tableFeatures.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4575
+ const aggregateGenerated = tableFeatures.aggregates ? generateAggregate(
4396
4576
  db,
4397
4577
  tableName,
4398
4578
  schema[tableName],
@@ -4401,7 +4581,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4401
4581
  tableFilters,
4402
4582
  filterCtx
4403
4583
  ) : void 0;
4404
- const groupByType = features.aggregates && features.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4584
+ const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4405
4585
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
4406
4586
  const havingInput = groupByEnum ? generateHavingInput(schema[tableName], tableName, typeName) : void 0;
4407
4587
  const groupByGenerated = groupByType && groupByEnum && havingInput ? generateGroupBy(
@@ -4419,19 +4599,28 @@ var generateSchemaData = (db, schema, relations, options) => {
4419
4599
  type: selectArrOutput,
4420
4600
  args: selectArrGenerated.args,
4421
4601
  resolve: selectArrGenerated.resolver,
4422
- ...complexity ? { extensions: { complexity: listFieldComplexity(complexity, limits?.(tableName)) } } : {}
4602
+ extensions: {
4603
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: false, targetArg: "where" }),
4604
+ ...complexity ? { complexity: listFieldComplexity(complexity, limits?.(tableName)) } : {}
4605
+ }
4423
4606
  };
4424
4607
  queries[selectSingleGenerated.name] = {
4425
4608
  type: selectSingleOutput,
4426
4609
  args: selectSingleGenerated.args,
4427
- resolve: selectSingleGenerated.resolver
4610
+ resolve: selectSingleGenerated.resolver,
4611
+ extensions: {
4612
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: true, targetArg: "where" })
4613
+ }
4428
4614
  };
4429
4615
  if (aggregateGenerated && aggregateType) {
4430
4616
  queries[aggregateGenerated.name] = {
4431
4617
  type: new import_graphql7.GraphQLNonNull(aggregateType),
4432
4618
  args: aggregateGenerated.args,
4433
4619
  resolve: aggregateGenerated.resolver,
4434
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
4620
+ extensions: {
4621
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "aggregate", single: true, targetArg: "where" }),
4622
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
4623
+ }
4435
4624
  };
4436
4625
  }
4437
4626
  if (groupByGenerated && groupByType) {
@@ -4439,25 +4628,30 @@ var generateSchemaData = (db, schema, relations, options) => {
4439
4628
  type: new import_graphql7.GraphQLNonNull(new import_graphql7.GraphQLList(new import_graphql7.GraphQLNonNull(groupByType))),
4440
4629
  args: groupByGenerated.args,
4441
4630
  resolve: groupByGenerated.resolver,
4442
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
4631
+ extensions: {
4632
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "groupBy", single: false, targetArg: "where" }),
4633
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
4634
+ }
4443
4635
  };
4444
4636
  }
4445
- for (const generated of [
4446
- insertArrGenerated,
4447
- insertSingleGenerated,
4448
- upsertArrGenerated,
4449
- upsertSingleGenerated,
4450
- updateGenerated,
4451
- updateManyGenerated,
4452
- updateSingleGenerated,
4453
- deleteGenerated,
4454
- deleteSingleGenerated
4455
- ]) {
4637
+ const generatedMutations = [
4638
+ [insertArrGenerated, { operation: "insert", single: false, targetArg: "values" }],
4639
+ [insertSingleGenerated, { operation: "insert", single: true, targetArg: "values" }],
4640
+ [upsertArrGenerated, { operation: "upsert", single: false, targetArg: "values" }],
4641
+ [upsertSingleGenerated, { operation: "upsert", single: true, targetArg: "values" }],
4642
+ [updateGenerated, { operation: "update", single: false, targetArg: "where" }],
4643
+ [updateManyGenerated, { operation: "updateMany", single: false, targetArg: "updates" }],
4644
+ [updateSingleGenerated, { operation: "update", single: true, targetArg: "where" }],
4645
+ [deleteGenerated, { operation: "delete", single: false, targetArg: "where" }],
4646
+ [deleteSingleGenerated, { operation: "delete", single: true, targetArg: "where" }]
4647
+ ];
4648
+ for (const [generated, meta] of generatedMutations) {
4456
4649
  if (generated) {
4457
4650
  mutations[generated.name] = {
4458
4651
  type: mutationReturnType,
4459
4652
  args: generated.args,
4460
- resolve: generated.resolver
4653
+ resolve: generated.resolver,
4654
+ extensions: { drizzle: drizzleMeta({ kind: "mutation", ...meta }) }
4461
4655
  };
4462
4656
  }
4463
4657
  }
@@ -4479,9 +4673,9 @@ var generateSchemaData = (db, schema, relations, options) => {
4479
4673
  }
4480
4674
  const activeInputs = [
4481
4675
  // The insert input types the upsert mutations too, so either feature keeps it.
4482
- ...features.insert || onConflictInput ? [insertInput] : [],
4676
+ ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
4483
4677
  ...onConflictInput ? [onConflictInput] : [],
4484
- ...features.update ? [updateInput] : [],
4678
+ ...tableFeatures.update ? [updateInput] : [],
4485
4679
  ...updateManyInput ? [updateManyInput] : [],
4486
4680
  tableFilters,
4487
4681
  tableOrder
@@ -5508,6 +5702,8 @@ function generateSchemaData2(db, schema, relations, options) {
5508
5702
  const excludedTables = new Set(options.exclude?.tables ?? []);
5509
5703
  const tableEntries = schemaEntries.filter(([key, value]) => (0, import_drizzle_orm8.is)(value, import_pg_core2.PgTable) && !excludedTables.has(key));
5510
5704
  const tables = Object.fromEntries(tableEntries);
5705
+ const featureOf = resolveTableFeatures(features);
5706
+ const anyTable = (feature) => tableEntries.some(([name]) => featureOf(name)[feature]);
5511
5707
  if (!tableEntries.length) {
5512
5708
  throw new Error(
5513
5709
  "Drizzle-GraphQL Error: No tables detected in Drizzle-ORM's database instance. Did you forget to pass schema to drizzle constructor?"
@@ -5545,7 +5741,8 @@ function generateSchemaData2(db, schema, relations, options) {
5545
5741
  complexity,
5546
5742
  limits,
5547
5743
  docs: options.docs ?? {},
5548
- features
5744
+ primaryKeyOf: (name) => tables[name] ? pgPrimaryKeyPropNames(tables[name]) : [],
5745
+ featureOf
5549
5746
  };
5550
5747
  const nestedPlans = features.nestedWrites ? buildNestedWritePlans(
5551
5748
  tables,
@@ -5556,7 +5753,7 @@ function generateSchemaData2(db, schema, relations, options) {
5556
5753
  ) : void 0;
5557
5754
  const nestedTypes = nestedPlans ? createNestedWriteTypes({ plans: nestedPlans, cacheCtx, typeNameMapper, insertPrefix: prefixes.insert }) : void 0;
5558
5755
  const nestedRuntime = nestedPlans ? createNestedWriteRuntime({ plans: nestedPlans, filterCtx }) : void 0;
5559
- const relationAggregateFactory = features.relationAggregates ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
5756
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
5560
5757
  const queries = {};
5561
5758
  const mutations = {};
5562
5759
  const mutationTxCtx = createMutationTxCtx(options.transactions);
@@ -5574,7 +5771,7 @@ function generateSchemaData2(db, schema, relations, options) {
5574
5771
  prefixes.insert,
5575
5772
  prefixes.update,
5576
5773
  resolverFactory,
5577
- relationAggregateFactory,
5774
+ featureOf(tableName).relationAggregates ? relationAggregateFactory : void 0,
5578
5775
  nestedTypes
5579
5776
  )
5580
5777
  ])
@@ -5582,6 +5779,8 @@ function generateSchemaData2(db, schema, relations, options) {
5582
5779
  const inputs = {};
5583
5780
  const outputs = {};
5584
5781
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
5782
+ const tableFeatures = featureOf(tableName);
5783
+ const drizzleMeta = tableFieldExtensions(tableName, pgPrimaryKeyPropNames(schema[tableName]));
5585
5784
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
5586
5785
  const { selectSingleOutput, selectArrOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
5587
5786
  const {
@@ -5613,7 +5812,7 @@ function generateSchemaData2(db, schema, relations, options) {
5613
5812
  typeName,
5614
5813
  typeNameMapper,
5615
5814
  filterCtx,
5616
- features.distinct,
5815
+ tableFeatures.distinct,
5617
5816
  limits
5618
5817
  );
5619
5818
  const selectSingleGenerated = generateSelectSingle2(
@@ -5629,7 +5828,7 @@ function generateSchemaData2(db, schema, relations, options) {
5629
5828
  filterCtx,
5630
5829
  limits
5631
5830
  );
5632
- const insertArrGenerated = features.insert ? generateInsertArray2(
5831
+ const insertArrGenerated = tableFeatures.insert ? generateInsertArray2(
5633
5832
  db,
5634
5833
  tableName,
5635
5834
  schema[tableName],
@@ -5644,7 +5843,7 @@ function generateSchemaData2(db, schema, relations, options) {
5644
5843
  nestedRuntime,
5645
5844
  limits
5646
5845
  ) : void 0;
5647
- const insertSingleGenerated = features.insert ? generateInsertSingle2(
5846
+ const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle2(
5648
5847
  db,
5649
5848
  tableName,
5650
5849
  schema[tableName],
@@ -5659,8 +5858,8 @@ function generateSchemaData2(db, schema, relations, options) {
5659
5858
  nestedRuntime,
5660
5859
  limits
5661
5860
  ) : void 0;
5662
- const uniqueSets = features.upsert ? getUniqueColumnSets(schema[tableName], import_pg_core2.getTableConfig) : [];
5663
- const onConflictInput = features.upsert ? generateOnConflictInput({
5861
+ const uniqueSets = tableFeatures.upsert ? getUniqueColumnSets(schema[tableName], import_pg_core2.getTableConfig) : [];
5862
+ const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
5664
5863
  table: schema[tableName],
5665
5864
  typeName,
5666
5865
  uniqueSets,
@@ -5703,7 +5902,7 @@ function generateSchemaData2(db, schema, relations, options) {
5703
5902
  nestedRuntime,
5704
5903
  limits
5705
5904
  ) : void 0;
5706
- const updateGenerated = features.update ? generateUpdate2(
5905
+ const updateGenerated = tableFeatures.update ? generateUpdate2(
5707
5906
  db,
5708
5907
  tableName,
5709
5908
  schema[tableName],
@@ -5714,14 +5913,14 @@ function generateSchemaData2(db, schema, relations, options) {
5714
5913
  updateFieldName,
5715
5914
  typeName,
5716
5915
  false,
5717
- features.requireWhere,
5916
+ tableFeatures.requireWhere,
5718
5917
  typeNameMapper,
5719
5918
  filterCtx,
5720
5919
  mutationTxCtx,
5721
5920
  nestedRuntime,
5722
5921
  limits
5723
5922
  ) : void 0;
5724
- const updateSingleGenerated = features.update ? generateUpdate2(
5923
+ const updateSingleGenerated = tableFeatures.update ? generateUpdate2(
5725
5924
  db,
5726
5925
  tableName,
5727
5926
  schema[tableName],
@@ -5732,14 +5931,14 @@ function generateSchemaData2(db, schema, relations, options) {
5732
5931
  updateSingleFieldName,
5733
5932
  typeName,
5734
5933
  true,
5735
- features.requireWhere,
5934
+ tableFeatures.requireWhere,
5736
5935
  typeNameMapper,
5737
5936
  filterCtx,
5738
5937
  mutationTxCtx,
5739
5938
  nestedRuntime,
5740
5939
  limits
5741
5940
  ) : void 0;
5742
- const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
5941
+ const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
5743
5942
  const updateManyGenerated = updateManyInput ? generateUpdateMany2(
5744
5943
  db,
5745
5944
  tableName,
@@ -5755,7 +5954,7 @@ function generateSchemaData2(db, schema, relations, options) {
5755
5954
  nestedRuntime,
5756
5955
  limits
5757
5956
  ) : void 0;
5758
- const deleteGenerated = features.delete ? generateDelete2(
5957
+ const deleteGenerated = tableFeatures.delete ? generateDelete2(
5759
5958
  db,
5760
5959
  tableName,
5761
5960
  schema[tableName],
@@ -5763,12 +5962,12 @@ function generateSchemaData2(db, schema, relations, options) {
5763
5962
  deleteFieldName,
5764
5963
  typeName,
5765
5964
  false,
5766
- features.requireWhere,
5965
+ tableFeatures.requireWhere,
5767
5966
  filterCtx,
5768
5967
  { tableName, relationMap: namedRelations, tables },
5769
5968
  mutationTxCtx
5770
5969
  ) : void 0;
5771
- const deleteSingleGenerated = features.delete ? generateDelete2(
5970
+ const deleteSingleGenerated = tableFeatures.delete ? generateDelete2(
5772
5971
  db,
5773
5972
  tableName,
5774
5973
  schema[tableName],
@@ -5776,12 +5975,12 @@ function generateSchemaData2(db, schema, relations, options) {
5776
5975
  deleteSingleFieldName,
5777
5976
  typeName,
5778
5977
  true,
5779
- features.requireWhere,
5978
+ tableFeatures.requireWhere,
5780
5979
  filterCtx,
5781
5980
  { tableName, relationMap: namedRelations, tables },
5782
5981
  mutationTxCtx
5783
5982
  ) : void 0;
5784
- const updateCountGenerated = features.update && features.countMutations ? generateWriteCount({
5983
+ const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
5785
5984
  db,
5786
5985
  tableName,
5787
5986
  table: schema[tableName],
@@ -5789,24 +5988,24 @@ function generateSchemaData2(db, schema, relations, options) {
5789
5988
  setArgs: updateInput,
5790
5989
  filterArgs: tableFilters,
5791
5990
  fieldName: updateCountFieldName,
5792
- requireWhere: features.requireWhere,
5991
+ requireWhere: tableFeatures.requireWhere,
5793
5992
  filterCtx,
5794
5993
  txCtx: mutationTxCtx,
5795
5994
  nested: nestedRuntime
5796
5995
  }) : void 0;
5797
- const deleteCountGenerated = features.delete && features.countMutations ? generateWriteCount({
5996
+ const deleteCountGenerated = tableFeatures.delete && tableFeatures.countMutations ? generateWriteCount({
5798
5997
  db,
5799
5998
  tableName,
5800
5999
  table: schema[tableName],
5801
6000
  kind: "delete",
5802
6001
  filterArgs: tableFilters,
5803
6002
  fieldName: deleteCountFieldName,
5804
- requireWhere: features.requireWhere,
6003
+ requireWhere: tableFeatures.requireWhere,
5805
6004
  filterCtx,
5806
6005
  txCtx: mutationTxCtx
5807
6006
  }) : void 0;
5808
- const aggregateType = features.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
5809
- const aggregateGenerated = features.aggregates ? generateAggregate(
6007
+ const aggregateType = tableFeatures.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6008
+ const aggregateGenerated = tableFeatures.aggregates ? generateAggregate(
5810
6009
  db,
5811
6010
  tableName,
5812
6011
  schema[tableName],
@@ -5815,7 +6014,7 @@ function generateSchemaData2(db, schema, relations, options) {
5815
6014
  tableFilters,
5816
6015
  filterCtx
5817
6016
  ) : void 0;
5818
- const groupByType = features.aggregates && features.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6017
+ const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
5819
6018
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
5820
6019
  const havingInput = groupByEnum ? generateHavingInput(schema[tableName], tableName, typeName) : void 0;
5821
6020
  const groupByGenerated = groupByType && groupByEnum && havingInput ? generateGroupBy(
@@ -5833,19 +6032,28 @@ function generateSchemaData2(db, schema, relations, options) {
5833
6032
  type: selectArrOutput,
5834
6033
  args: selectArrGenerated.args,
5835
6034
  resolve: selectArrGenerated.resolver,
5836
- ...complexity ? { extensions: { complexity: listFieldComplexity(complexity, limits?.(tableName)) } } : {}
6035
+ extensions: {
6036
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: false, targetArg: "where" }),
6037
+ ...complexity ? { complexity: listFieldComplexity(complexity, limits?.(tableName)) } : {}
6038
+ }
5837
6039
  };
5838
6040
  queries[selectSingleGenerated.name] = {
5839
6041
  type: selectSingleOutput,
5840
6042
  args: selectSingleGenerated.args,
5841
- resolve: selectSingleGenerated.resolver
6043
+ resolve: selectSingleGenerated.resolver,
6044
+ extensions: {
6045
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: true, targetArg: "where" })
6046
+ }
5842
6047
  };
5843
6048
  if (aggregateGenerated && aggregateType) {
5844
6049
  queries[aggregateGenerated.name] = {
5845
6050
  type: new import_graphql9.GraphQLNonNull(aggregateType),
5846
6051
  args: aggregateGenerated.args,
5847
6052
  resolve: aggregateGenerated.resolver,
5848
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
6053
+ extensions: {
6054
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "aggregate", single: true, targetArg: "where" }),
6055
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
6056
+ }
5849
6057
  };
5850
6058
  }
5851
6059
  if (groupByGenerated && groupByType) {
@@ -5853,14 +6061,20 @@ function generateSchemaData2(db, schema, relations, options) {
5853
6061
  type: new import_graphql9.GraphQLNonNull(new import_graphql9.GraphQLList(new import_graphql9.GraphQLNonNull(groupByType))),
5854
6062
  args: groupByGenerated.args,
5855
6063
  resolve: groupByGenerated.resolver,
5856
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
6064
+ extensions: {
6065
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "groupBy", single: false, targetArg: "where" }),
6066
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
6067
+ }
5857
6068
  };
5858
6069
  }
5859
6070
  if (insertArrGenerated) {
5860
6071
  mutations[insertArrGenerated.name] = {
5861
6072
  type: arrTableItemOutput,
5862
6073
  args: insertArrGenerated.args,
5863
- resolve: insertArrGenerated.resolver
6074
+ resolve: insertArrGenerated.resolver,
6075
+ extensions: {
6076
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: false, targetArg: "values" })
6077
+ }
5864
6078
  };
5865
6079
  }
5866
6080
  if (insertSingleGenerated) {
@@ -5869,28 +6083,40 @@ function generateSchemaData2(db, schema, relations, options) {
5869
6083
  // `conflictDoNothing` swallowing the insert, so the field is nullable only there.
5870
6084
  type: conflictDoNothing ? singleTableItemOutput : new import_graphql9.GraphQLNonNull(singleTableItemOutput),
5871
6085
  args: insertSingleGenerated.args,
5872
- resolve: insertSingleGenerated.resolver
6086
+ resolve: insertSingleGenerated.resolver,
6087
+ extensions: {
6088
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: true, targetArg: "values" })
6089
+ }
5873
6090
  };
5874
6091
  }
5875
6092
  if (upsertArrGenerated) {
5876
6093
  mutations[upsertArrGenerated.name] = {
5877
6094
  type: arrTableItemOutput,
5878
6095
  args: upsertArrGenerated.args,
5879
- resolve: upsertArrGenerated.resolver
6096
+ resolve: upsertArrGenerated.resolver,
6097
+ extensions: {
6098
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: false, targetArg: "values" })
6099
+ }
5880
6100
  };
5881
6101
  }
5882
6102
  if (upsertSingleGenerated) {
5883
6103
  mutations[upsertSingleGenerated.name] = {
5884
6104
  type: singleTableItemOutput,
5885
6105
  args: upsertSingleGenerated.args,
5886
- resolve: upsertSingleGenerated.resolver
6106
+ resolve: upsertSingleGenerated.resolver,
6107
+ extensions: {
6108
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: true, targetArg: "values" })
6109
+ }
5887
6110
  };
5888
6111
  }
5889
6112
  if (updateGenerated) {
5890
6113
  mutations[updateGenerated.name] = {
5891
6114
  type: arrTableItemOutput,
5892
6115
  args: updateGenerated.args,
5893
- resolve: updateGenerated.resolver
6116
+ resolve: updateGenerated.resolver,
6117
+ extensions: {
6118
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: false, targetArg: "where" })
6119
+ }
5894
6120
  };
5895
6121
  }
5896
6122
  if (updateManyGenerated) {
@@ -5898,6 +6124,9 @@ function generateSchemaData2(db, schema, relations, options) {
5898
6124
  type: new import_graphql9.GraphQLNonNull(new import_graphql9.GraphQLList(singleTableItemOutput)),
5899
6125
  args: updateManyGenerated.args,
5900
6126
  resolve: updateManyGenerated.resolver,
6127
+ extensions: {
6128
+ drizzle: drizzleMeta({ kind: "mutation", operation: "updateMany", single: false, targetArg: "updates" })
6129
+ },
5901
6130
  // The nullable element is deliberate, and the reason this mutation's return type
5902
6131
  // differs from every sibling's: the result is aligned with the input, one slot per
5903
6132
  // entry, so an entry that matched nothing has to be able to say so.
@@ -5908,21 +6137,30 @@ function generateSchemaData2(db, schema, relations, options) {
5908
6137
  mutations[updateSingleGenerated.name] = {
5909
6138
  type: singleTableItemOutput,
5910
6139
  args: updateSingleGenerated.args,
5911
- resolve: updateSingleGenerated.resolver
6140
+ resolve: updateSingleGenerated.resolver,
6141
+ extensions: {
6142
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: true, targetArg: "where" })
6143
+ }
5912
6144
  };
5913
6145
  }
5914
6146
  if (deleteGenerated) {
5915
6147
  mutations[deleteGenerated.name] = {
5916
6148
  type: arrTableItemOutput,
5917
6149
  args: deleteGenerated.args,
5918
- resolve: deleteGenerated.resolver
6150
+ resolve: deleteGenerated.resolver,
6151
+ extensions: {
6152
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: false, targetArg: "where" })
6153
+ }
5919
6154
  };
5920
6155
  }
5921
6156
  if (deleteSingleGenerated) {
5922
6157
  mutations[deleteSingleGenerated.name] = {
5923
6158
  type: singleTableItemOutput,
5924
6159
  args: deleteSingleGenerated.args,
5925
- resolve: deleteSingleGenerated.resolver
6160
+ resolve: deleteSingleGenerated.resolver,
6161
+ extensions: {
6162
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: true, targetArg: "where" })
6163
+ }
5926
6164
  };
5927
6165
  }
5928
6166
  if (updateCountGenerated) {
@@ -5943,9 +6181,9 @@ function generateSchemaData2(db, schema, relations, options) {
5943
6181
  }
5944
6182
  const activeInputs = [
5945
6183
  // The insert input types the upsert mutations too, so either feature keeps it.
5946
- ...features.insert || onConflictInput ? [insertInput] : [],
6184
+ ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
5947
6185
  ...onConflictInput ? [onConflictInput] : [],
5948
- ...features.update ? [updateInput] : [],
6186
+ ...tableFeatures.update ? [updateInput] : [],
5949
6187
  ...updateManyInput ? [updateManyInput] : [],
5950
6188
  tableFilters,
5951
6189
  tableOrder
@@ -6525,6 +6763,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6525
6763
  const excludedTables = new Set(options.exclude?.tables ?? []);
6526
6764
  const tableEntries = schemaEntries.filter(([key, value]) => (0, import_drizzle_orm9.is)(value, import_sqlite_core2.SQLiteTable) && !excludedTables.has(key));
6527
6765
  const tables = Object.fromEntries(tableEntries);
6766
+ const featureOf = resolveTableFeatures(features);
6767
+ const anyTable = (feature) => tableEntries.some(([name]) => featureOf(name)[feature]);
6528
6768
  if (!tableEntries.length) {
6529
6769
  throw new Error(
6530
6770
  "Drizzle-GraphQL Error: No tables detected in Drizzle-ORM's database instance. Did you forget to pass schema to drizzle constructor?"
@@ -6562,7 +6802,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6562
6802
  complexity,
6563
6803
  limits,
6564
6804
  docs: options.docs ?? {},
6565
- features
6805
+ primaryKeyOf: (name) => tables[name] ? sqlitePrimaryKeyPropNames(tables[name]) : [],
6806
+ featureOf
6566
6807
  };
6567
6808
  if (features.nestedWrites && db.resultKind === "sync") {
6568
6809
  throw new Error(
@@ -6578,7 +6819,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6578
6819
  ) : void 0;
6579
6820
  const nestedTypes = nestedPlans ? createNestedWriteTypes({ plans: nestedPlans, cacheCtx, typeNameMapper, insertPrefix: prefixes.insert }) : void 0;
6580
6821
  const nestedRuntime = nestedPlans ? createNestedWriteRuntime({ plans: nestedPlans, filterCtx }) : void 0;
6581
- const relationAggregateFactory = features.relationAggregates ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
6822
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
6582
6823
  const queries = {};
6583
6824
  const mutations = {};
6584
6825
  if (options.transactions && db.resultKind === "sync") {
@@ -6601,7 +6842,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6601
6842
  prefixes.insert,
6602
6843
  prefixes.update,
6603
6844
  resolverFactory,
6604
- relationAggregateFactory,
6845
+ featureOf(tableName).relationAggregates ? relationAggregateFactory : void 0,
6605
6846
  nestedTypes
6606
6847
  )
6607
6848
  ])
@@ -6609,6 +6850,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6609
6850
  const inputs = {};
6610
6851
  const outputs = {};
6611
6852
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
6853
+ const tableFeatures = featureOf(tableName);
6854
+ const drizzleMeta = tableFieldExtensions(tableName, sqlitePrimaryKeyPropNames(schema[tableName]));
6612
6855
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
6613
6856
  const { selectSingleOutput, selectArrOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
6614
6857
  const {
@@ -6640,7 +6883,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6640
6883
  typeName,
6641
6884
  typeNameMapper,
6642
6885
  filterCtx,
6643
- features.distinct,
6886
+ tableFeatures.distinct,
6644
6887
  limits
6645
6888
  );
6646
6889
  const selectSingleGenerated = generateSelectSingle3(
@@ -6656,7 +6899,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6656
6899
  filterCtx,
6657
6900
  limits
6658
6901
  );
6659
- const insertArrGenerated = features.insert ? generateInsertArray3(
6902
+ const insertArrGenerated = tableFeatures.insert ? generateInsertArray3(
6660
6903
  db,
6661
6904
  tableName,
6662
6905
  schema[tableName],
@@ -6671,7 +6914,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6671
6914
  nestedRuntime,
6672
6915
  limits
6673
6916
  ) : void 0;
6674
- const insertSingleGenerated = features.insert ? generateInsertSingle3(
6917
+ const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle3(
6675
6918
  db,
6676
6919
  tableName,
6677
6920
  schema[tableName],
@@ -6686,8 +6929,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6686
6929
  nestedRuntime,
6687
6930
  limits
6688
6931
  ) : void 0;
6689
- const uniqueSets = features.upsert ? getUniqueColumnSets(schema[tableName], import_sqlite_core2.getTableConfig) : [];
6690
- const onConflictInput = features.upsert ? generateOnConflictInput({
6932
+ const uniqueSets = tableFeatures.upsert ? getUniqueColumnSets(schema[tableName], import_sqlite_core2.getTableConfig) : [];
6933
+ const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
6691
6934
  table: schema[tableName],
6692
6935
  typeName,
6693
6936
  uniqueSets,
@@ -6730,7 +6973,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6730
6973
  nestedRuntime,
6731
6974
  limits
6732
6975
  ) : void 0;
6733
- const updateGenerated = features.update ? generateUpdate3(
6976
+ const updateGenerated = tableFeatures.update ? generateUpdate3(
6734
6977
  db,
6735
6978
  tableName,
6736
6979
  schema[tableName],
@@ -6741,14 +6984,14 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6741
6984
  updateFieldName,
6742
6985
  typeName,
6743
6986
  false,
6744
- features.requireWhere,
6987
+ tableFeatures.requireWhere,
6745
6988
  typeNameMapper,
6746
6989
  filterCtx,
6747
6990
  mutationTxCtx,
6748
6991
  nestedRuntime,
6749
6992
  limits
6750
6993
  ) : void 0;
6751
- const updateSingleGenerated = features.update ? generateUpdate3(
6994
+ const updateSingleGenerated = tableFeatures.update ? generateUpdate3(
6752
6995
  db,
6753
6996
  tableName,
6754
6997
  schema[tableName],
@@ -6759,14 +7002,14 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6759
7002
  updateSingleFieldName,
6760
7003
  typeName,
6761
7004
  true,
6762
- features.requireWhere,
7005
+ tableFeatures.requireWhere,
6763
7006
  typeNameMapper,
6764
7007
  filterCtx,
6765
7008
  mutationTxCtx,
6766
7009
  nestedRuntime,
6767
7010
  limits
6768
7011
  ) : void 0;
6769
- const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
7012
+ const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
6770
7013
  const updateManyGenerated = updateManyInput ? generateUpdateMany3(
6771
7014
  db,
6772
7015
  tableName,
@@ -6782,7 +7025,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6782
7025
  nestedRuntime,
6783
7026
  limits
6784
7027
  ) : void 0;
6785
- const deleteGenerated = features.delete ? generateDelete3(
7028
+ const deleteGenerated = tableFeatures.delete ? generateDelete3(
6786
7029
  db,
6787
7030
  tableName,
6788
7031
  schema[tableName],
@@ -6790,12 +7033,12 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6790
7033
  deleteFieldName,
6791
7034
  typeName,
6792
7035
  false,
6793
- features.requireWhere,
7036
+ tableFeatures.requireWhere,
6794
7037
  filterCtx,
6795
7038
  { tableName, relationMap: namedRelations, tables },
6796
7039
  mutationTxCtx
6797
7040
  ) : void 0;
6798
- const deleteSingleGenerated = features.delete ? generateDelete3(
7041
+ const deleteSingleGenerated = tableFeatures.delete ? generateDelete3(
6799
7042
  db,
6800
7043
  tableName,
6801
7044
  schema[tableName],
@@ -6803,12 +7046,12 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6803
7046
  deleteSingleFieldName,
6804
7047
  typeName,
6805
7048
  true,
6806
- features.requireWhere,
7049
+ tableFeatures.requireWhere,
6807
7050
  filterCtx,
6808
7051
  { tableName, relationMap: namedRelations, tables },
6809
7052
  mutationTxCtx
6810
7053
  ) : void 0;
6811
- const updateCountGenerated = features.update && features.countMutations ? generateWriteCount({
7054
+ const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
6812
7055
  db,
6813
7056
  tableName,
6814
7057
  table: schema[tableName],
@@ -6816,24 +7059,24 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6816
7059
  setArgs: updateInput,
6817
7060
  filterArgs: tableFilters,
6818
7061
  fieldName: updateCountFieldName,
6819
- requireWhere: features.requireWhere,
7062
+ requireWhere: tableFeatures.requireWhere,
6820
7063
  filterCtx,
6821
7064
  txCtx: mutationTxCtx,
6822
7065
  nested: nestedRuntime
6823
7066
  }) : void 0;
6824
- const deleteCountGenerated = features.delete && features.countMutations ? generateWriteCount({
7067
+ const deleteCountGenerated = tableFeatures.delete && tableFeatures.countMutations ? generateWriteCount({
6825
7068
  db,
6826
7069
  tableName,
6827
7070
  table: schema[tableName],
6828
7071
  kind: "delete",
6829
7072
  filterArgs: tableFilters,
6830
7073
  fieldName: deleteCountFieldName,
6831
- requireWhere: features.requireWhere,
7074
+ requireWhere: tableFeatures.requireWhere,
6832
7075
  filterCtx,
6833
7076
  txCtx: mutationTxCtx
6834
7077
  }) : void 0;
6835
- const aggregateType = features.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6836
- const aggregateGenerated = features.aggregates ? generateAggregate(
7078
+ const aggregateType = tableFeatures.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
7079
+ const aggregateGenerated = tableFeatures.aggregates ? generateAggregate(
6837
7080
  db,
6838
7081
  tableName,
6839
7082
  schema[tableName],
@@ -6842,7 +7085,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6842
7085
  tableFilters,
6843
7086
  filterCtx
6844
7087
  ) : void 0;
6845
- const groupByType = features.aggregates && features.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
7088
+ const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6846
7089
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
6847
7090
  const havingInput = groupByEnum ? generateHavingInput(schema[tableName], tableName, typeName) : void 0;
6848
7091
  const groupByGenerated = groupByType && groupByEnum && havingInput ? generateGroupBy(
@@ -6860,19 +7103,28 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6860
7103
  type: selectArrOutput,
6861
7104
  args: selectArrGenerated.args,
6862
7105
  resolve: selectArrGenerated.resolver,
6863
- ...complexity ? { extensions: { complexity: listFieldComplexity(complexity, limits?.(tableName)) } } : {}
7106
+ extensions: {
7107
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: false, targetArg: "where" }),
7108
+ ...complexity ? { complexity: listFieldComplexity(complexity, limits?.(tableName)) } : {}
7109
+ }
6864
7110
  };
6865
7111
  queries[selectSingleGenerated.name] = {
6866
7112
  type: selectSingleOutput,
6867
7113
  args: selectSingleGenerated.args,
6868
- resolve: selectSingleGenerated.resolver
7114
+ resolve: selectSingleGenerated.resolver,
7115
+ extensions: {
7116
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: true, targetArg: "where" })
7117
+ }
6869
7118
  };
6870
7119
  if (aggregateGenerated && aggregateType) {
6871
7120
  queries[aggregateGenerated.name] = {
6872
7121
  type: new import_graphql10.GraphQLNonNull(aggregateType),
6873
7122
  args: aggregateGenerated.args,
6874
7123
  resolve: aggregateGenerated.resolver,
6875
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
7124
+ extensions: {
7125
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "aggregate", single: true, targetArg: "where" }),
7126
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
7127
+ }
6876
7128
  };
6877
7129
  }
6878
7130
  if (groupByGenerated && groupByType) {
@@ -6880,14 +7132,20 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6880
7132
  type: new import_graphql10.GraphQLNonNull(new import_graphql10.GraphQLList(new import_graphql10.GraphQLNonNull(groupByType))),
6881
7133
  args: groupByGenerated.args,
6882
7134
  resolve: groupByGenerated.resolver,
6883
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
7135
+ extensions: {
7136
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "groupBy", single: false, targetArg: "where" }),
7137
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
7138
+ }
6884
7139
  };
6885
7140
  }
6886
7141
  if (insertArrGenerated) {
6887
7142
  mutations[insertArrGenerated.name] = {
6888
7143
  type: arrTableItemOutput,
6889
7144
  args: insertArrGenerated.args,
6890
- resolve: insertArrGenerated.resolver
7145
+ resolve: insertArrGenerated.resolver,
7146
+ extensions: {
7147
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: false, targetArg: "values" })
7148
+ }
6891
7149
  };
6892
7150
  }
6893
7151
  if (insertSingleGenerated) {
@@ -6896,28 +7154,40 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6896
7154
  // `conflictDoNothing` swallowing the insert, so the field is nullable only there.
6897
7155
  type: conflictDoNothing ? singleTableItemOutput : new import_graphql10.GraphQLNonNull(singleTableItemOutput),
6898
7156
  args: insertSingleGenerated.args,
6899
- resolve: insertSingleGenerated.resolver
7157
+ resolve: insertSingleGenerated.resolver,
7158
+ extensions: {
7159
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: true, targetArg: "values" })
7160
+ }
6900
7161
  };
6901
7162
  }
6902
7163
  if (upsertArrGenerated) {
6903
7164
  mutations[upsertArrGenerated.name] = {
6904
7165
  type: arrTableItemOutput,
6905
7166
  args: upsertArrGenerated.args,
6906
- resolve: upsertArrGenerated.resolver
7167
+ resolve: upsertArrGenerated.resolver,
7168
+ extensions: {
7169
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: false, targetArg: "values" })
7170
+ }
6907
7171
  };
6908
7172
  }
6909
7173
  if (upsertSingleGenerated) {
6910
7174
  mutations[upsertSingleGenerated.name] = {
6911
7175
  type: singleTableItemOutput,
6912
7176
  args: upsertSingleGenerated.args,
6913
- resolve: upsertSingleGenerated.resolver
7177
+ resolve: upsertSingleGenerated.resolver,
7178
+ extensions: {
7179
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: true, targetArg: "values" })
7180
+ }
6914
7181
  };
6915
7182
  }
6916
7183
  if (updateGenerated) {
6917
7184
  mutations[updateGenerated.name] = {
6918
7185
  type: arrTableItemOutput,
6919
7186
  args: updateGenerated.args,
6920
- resolve: updateGenerated.resolver
7187
+ resolve: updateGenerated.resolver,
7188
+ extensions: {
7189
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: false, targetArg: "where" })
7190
+ }
6921
7191
  };
6922
7192
  }
6923
7193
  if (updateManyGenerated) {
@@ -6925,6 +7195,9 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6925
7195
  type: new import_graphql10.GraphQLNonNull(new import_graphql10.GraphQLList(singleTableItemOutput)),
6926
7196
  args: updateManyGenerated.args,
6927
7197
  resolve: updateManyGenerated.resolver,
7198
+ extensions: {
7199
+ drizzle: drizzleMeta({ kind: "mutation", operation: "updateMany", single: false, targetArg: "updates" })
7200
+ },
6928
7201
  // The nullable element is deliberate, and the reason this mutation's return type
6929
7202
  // differs from every sibling's: the result is aligned with the input, one slot per
6930
7203
  // entry, so an entry that matched nothing has to be able to say so.
@@ -6935,21 +7208,30 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6935
7208
  mutations[updateSingleGenerated.name] = {
6936
7209
  type: singleTableItemOutput,
6937
7210
  args: updateSingleGenerated.args,
6938
- resolve: updateSingleGenerated.resolver
7211
+ resolve: updateSingleGenerated.resolver,
7212
+ extensions: {
7213
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: true, targetArg: "where" })
7214
+ }
6939
7215
  };
6940
7216
  }
6941
7217
  if (deleteGenerated) {
6942
7218
  mutations[deleteGenerated.name] = {
6943
7219
  type: arrTableItemOutput,
6944
7220
  args: deleteGenerated.args,
6945
- resolve: deleteGenerated.resolver
7221
+ resolve: deleteGenerated.resolver,
7222
+ extensions: {
7223
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: false, targetArg: "where" })
7224
+ }
6946
7225
  };
6947
7226
  }
6948
7227
  if (deleteSingleGenerated) {
6949
7228
  mutations[deleteSingleGenerated.name] = {
6950
7229
  type: singleTableItemOutput,
6951
7230
  args: deleteSingleGenerated.args,
6952
- resolve: deleteSingleGenerated.resolver
7231
+ resolve: deleteSingleGenerated.resolver,
7232
+ extensions: {
7233
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: true, targetArg: "where" })
7234
+ }
6953
7235
  };
6954
7236
  }
6955
7237
  if (updateCountGenerated) {
@@ -6970,9 +7252,9 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6970
7252
  }
6971
7253
  const activeInputs = [
6972
7254
  // The insert input types the upsert mutations too, so either feature keeps it.
6973
- ...features.insert || onConflictInput ? [insertInput] : [],
7255
+ ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
6974
7256
  ...onConflictInput ? [onConflictInput] : [],
6975
- ...features.update ? [updateInput] : [],
7257
+ ...tableFeatures.update ? [updateInput] : [],
6976
7258
  ...updateManyInput ? [updateManyInput] : [],
6977
7259
  tableFilters,
6978
7260
  tableOrder
@@ -7012,6 +7294,141 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7012
7294
  return { queries, mutations, inputs, types: outputs, fieldResolvers };
7013
7295
  };
7014
7296
 
7297
+ // src/util/selection.ts
7298
+ var import_drizzle_orm10 = require("drizzle-orm");
7299
+ var import_mysql_core3 = require("drizzle-orm/mysql-core");
7300
+ var import_pg_core3 = require("drizzle-orm/pg-core");
7301
+ var import_sqlite_core3 = require("drizzle-orm/sqlite-core");
7302
+ var import_graphql_parse_resolve_info5 = require("graphql-parse-resolve-info");
7303
+ var contextCache = /* @__PURE__ */ new WeakMap();
7304
+ var tableConfigFor = (db) => {
7305
+ if ((0, import_drizzle_orm10.is)(db, import_mysql_core3.MySqlDatabase)) {
7306
+ return import_mysql_core3.getTableConfig;
7307
+ }
7308
+ if ((0, import_drizzle_orm10.is)(db, import_pg_core3.PgAsyncDatabase)) {
7309
+ return import_pg_core3.getTableConfig;
7310
+ }
7311
+ if ((0, import_drizzle_orm10.is)(db, import_sqlite_core3.BaseSQLiteDatabase)) {
7312
+ return import_sqlite_core3.getTableConfig;
7313
+ }
7314
+ throw new Error("Drizzle-GraphQL Error: unsupported database instance \u2014 expected a PostgreSQL, MySQL or SQLite one.");
7315
+ };
7316
+ var contextFor = (db) => {
7317
+ const cached = contextCache.get(db);
7318
+ if (cached) {
7319
+ return cached;
7320
+ }
7321
+ const relations = db._.relations ?? {};
7322
+ const schema = db._.fullSchema ?? Object.fromEntries(
7323
+ Object.entries(relations).filter(([, config]) => config?.table != null).map(([key, config]) => [key, config.table])
7324
+ );
7325
+ const tableEntries = Object.entries(schema).filter(([, value]) => (0, import_drizzle_orm10.is)(value, import_drizzle_orm10.Table));
7326
+ if (!tableEntries.length) {
7327
+ throw new Error(
7328
+ "Drizzle-GraphQL Error: Schema not found in drizzle instance. Pass relations (from buildRelations/defineRelations) to the drizzle constructor so drizzle-graphql can read your tables."
7329
+ );
7330
+ }
7331
+ const tables = Object.fromEntries(tableEntries);
7332
+ const getTableConfig4 = tableConfigFor(db);
7333
+ const primaryKeyCache = /* @__PURE__ */ new Map();
7334
+ const primaryKeyOf = (tableName) => {
7335
+ let pk = primaryKeyCache.get(tableName);
7336
+ if (!pk) {
7337
+ const table = tables[tableName];
7338
+ pk = table ? getPrimaryKeyPropNamesFromConfig(table, getTableConfig4) : [];
7339
+ primaryKeyCache.set(tableName, pk);
7340
+ }
7341
+ return pk;
7342
+ };
7343
+ const relationMap = buildNamedRelations(relations, tableEntries);
7344
+ attachTargetPrimaryKeys(relationMap, tables, (table) => [...primaryKeyOf(tableNameOf(tables, table))]);
7345
+ const context = {
7346
+ tables,
7347
+ relationMap,
7348
+ filterCtx: { tables, relationMap },
7349
+ primaryKeyOf
7350
+ };
7351
+ contextCache.set(db, context);
7352
+ return context;
7353
+ };
7354
+ var tableNameOf = (tables, table) => Object.keys(tables).find((name) => tables[name] === table) ?? "";
7355
+ var parseInfo = (info) => {
7356
+ if ("fieldsByTypeName" in info) {
7357
+ return info;
7358
+ }
7359
+ return (0, import_graphql_parse_resolve_info5.parseResolveInfo)(info, { deep: true });
7360
+ };
7361
+ var selectionToWith = (info, options) => {
7362
+ const { db, table, typeNameMapper } = options;
7363
+ const { tables, relationMap, filterCtx } = contextFor(db);
7364
+ if (!tables[table]) {
7365
+ throw new Error(`Drizzle-GraphQL Error: '${table}' is not a table in the Drizzle schema.`);
7366
+ }
7367
+ if (!relationMap[table]) {
7368
+ return void 0;
7369
+ }
7370
+ const parsed = parseInfo(info);
7371
+ const params = extractRelationsParams(
7372
+ relationMap,
7373
+ tables,
7374
+ table,
7375
+ parsed,
7376
+ resolveTypeName(table, typeNameMapper),
7377
+ typeNameMapper,
7378
+ filterCtx
7379
+ );
7380
+ return params && Object.keys(params).length ? params : void 0;
7381
+ };
7382
+ var resolveSelection = async (info, options) => {
7383
+ const {
7384
+ db,
7385
+ table: tableName,
7386
+ typeNameMapper,
7387
+ executor,
7388
+ single = false,
7389
+ where,
7390
+ orderBy,
7391
+ limit,
7392
+ offset,
7393
+ after
7394
+ } = options;
7395
+ const { tables, relationMap, filterCtx, primaryKeyOf } = contextFor(db);
7396
+ const table = tables[tableName];
7397
+ if (!table) {
7398
+ throw new Error(`Drizzle-GraphQL Error: '${tableName}' is not a table in the Drizzle schema.`);
7399
+ }
7400
+ const parsedInfo = parseInfo(info);
7401
+ if (!parsedInfo) {
7402
+ throw new Error("Drizzle-GraphQL Error: resolveSelection could not read a selection set from the resolve info.");
7403
+ }
7404
+ const source = executor ?? db;
7405
+ const queryBase = source.query?.[tableName];
7406
+ if (!queryBase) {
7407
+ throw new Error(
7408
+ `Drizzle-GraphQL Error: the executor passed to resolveSelection has no relational query builder for '${tableName}'.`
7409
+ );
7410
+ }
7411
+ return runRelationalSelect({
7412
+ queryBase,
7413
+ tables,
7414
+ tableName,
7415
+ table,
7416
+ relationMap,
7417
+ typeName: resolveTypeName(tableName, typeNameMapper),
7418
+ typeNameMapper,
7419
+ parsedInfo,
7420
+ single,
7421
+ where,
7422
+ orderBy,
7423
+ limit,
7424
+ offset,
7425
+ after,
7426
+ filterCtx,
7427
+ pkNames: primaryKeyOf(tableName),
7428
+ db: source
7429
+ });
7430
+ };
7431
+
7015
7432
  // src/index.ts
7016
7433
  var buildSchema = (db, config) => {
7017
7434
  const relations = db._.relations;
@@ -7033,22 +7450,11 @@ var buildSchema = (db, config) => {
7033
7450
  list: config?.suffixes?.list ?? "",
7034
7451
  single: config?.suffixes?.single ?? "Single"
7035
7452
  };
7036
- const typeNameMapper = config?.typeNameMapper;
7037
- const features = {
7038
- aggregates: config?.features?.aggregates ?? true,
7039
- groupBy: config?.features?.groupBy ?? true,
7040
- relationAggregates: config?.features?.relationAggregates ?? true,
7041
- distinct: config?.features?.distinct ?? true,
7042
- insert: config?.features?.insert ?? true,
7043
- update: config?.features?.update ?? true,
7044
- updateMany: config?.features?.updateMany ?? true,
7045
- delete: config?.features?.delete ?? true,
7046
- upsert: config?.features?.upsert ?? false,
7047
- nestedWrites: config?.features?.nestedWrites ?? false,
7048
- fieldUpdateOperations: config?.features?.fieldUpdateOperations ?? false,
7049
- countMutations: config?.features?.countMutations ?? false,
7050
- requireWhere: config?.features?.requireWhere ?? false
7051
- };
7453
+ const typeNameMapper = config?.typeNameMapper === "singularize" ? singularizeMapper : config?.typeNameMapper;
7454
+ const tableKeys = Object.entries(schema).filter(([, value]) => (0, import_drizzle_orm11.is)(value, import_drizzle_orm11.Table)).map(([key]) => key);
7455
+ const excludedTableNames = new Set(config?.exclude?.tables ?? []);
7456
+ const featureTables = tableKeys.filter((key) => !excludedTableNames.has(key));
7457
+ const forTable = resolveTableFeatures(config?.features);
7052
7458
  const complexityConfig = config?.complexity ?? true;
7053
7459
  const complexity = complexityConfig === false ? void 0 : {
7054
7460
  defaultListSize: (complexityConfig === true ? void 0 : complexityConfig.defaultListSize) ?? 10,
@@ -7085,10 +7491,8 @@ var buildSchema = (db, config) => {
7085
7491
  } : void 0;
7086
7492
  const exclude = config?.exclude;
7087
7493
  if (exclude) {
7088
- const tableNames = new Set(
7089
- Object.entries(schema).filter(([, value]) => (0, import_drizzle_orm10.is)(value, import_drizzle_orm10.Table)).map(([key]) => key)
7090
- );
7091
- const excludedTables = new Set(exclude.tables ?? []);
7494
+ const tableNames = new Set(tableKeys);
7495
+ const excludedTables = excludedTableNames;
7092
7496
  for (const tableName of excludedTables) {
7093
7497
  if (!tableNames.has(tableName)) {
7094
7498
  throw new Error(
@@ -7110,7 +7514,7 @@ var buildSchema = (db, config) => {
7110
7514
  if (excludedTables.has(tableName)) {
7111
7515
  continue;
7112
7516
  }
7113
- const columns = (0, import_drizzle_orm10.getColumns)(schema[tableName]);
7517
+ const columns = (0, import_drizzle_orm11.getColumns)(schema[tableName]);
7114
7518
  for (const columnName of columnNames) {
7115
7519
  const column = columns[columnName];
7116
7520
  if (!column) {
@@ -7126,6 +7530,49 @@ var buildSchema = (db, config) => {
7126
7530
  }
7127
7531
  }
7128
7532
  }
7533
+ const featureConflicts = /* @__PURE__ */ new Map();
7534
+ const noteConflict = (message, tableName) => {
7535
+ const tables = featureConflicts.get(message);
7536
+ if (tables) {
7537
+ tables.push(tableName);
7538
+ } else {
7539
+ featureConflicts.set(message, [tableName]);
7540
+ }
7541
+ };
7542
+ for (const tableName of featureTables) {
7543
+ const tableFeatures = forTable(tableName);
7544
+ if (tableFeatures.upsert) {
7545
+ const missing = [!tableFeatures.insert ? "insert" : void 0, !tableFeatures.update ? "update" : void 0].filter(Boolean).join(" and ");
7546
+ if (missing) {
7547
+ noteConflict(
7548
+ `upsert is on while ${missing} is off, so the upsert mutations are a second write path past the operation you turned off`,
7549
+ tableName
7550
+ );
7551
+ }
7552
+ }
7553
+ if (config?.features?.nestedWrites && (!tableFeatures.insert || !tableFeatures.update)) {
7554
+ noteConflict(
7555
+ "nestedWrites is on while this table's own insert or update is off, so a nested `create` or `connect` under another table's mutation can still write it",
7556
+ tableName
7557
+ );
7558
+ }
7559
+ if (config?.features?.updateMany !== void 0 && tableFeatures.updateMany && !tableFeatures.update) {
7560
+ noteConflict("updateMany is on while update is off, so no batch update is generated", tableName);
7561
+ }
7562
+ if (config?.features?.groupBy !== void 0 && tableFeatures.groupBy && !tableFeatures.aggregates) {
7563
+ noteConflict("groupBy is on while aggregates is off, so no grouped query is generated", tableName);
7564
+ }
7565
+ if (tableFeatures.countMutations && !tableFeatures.update && !tableFeatures.delete) {
7566
+ noteConflict(
7567
+ "countMutations is on while update and delete are both off, so no count mutation is generated",
7568
+ tableName
7569
+ );
7570
+ }
7571
+ }
7572
+ for (const [message, tables] of featureConflicts) {
7573
+ const listed = tables.length > 5 ? `${tables.slice(0, 5).join(", ")} and ${tables.length - 5} more` : tables.join(", ");
7574
+ console.warn(`Drizzle-GraphQL Warning: config.features \u2014 ${message} (${listed}).`);
7575
+ }
7129
7576
  const eagerOpt = config?.eagerLoadRelations;
7130
7577
  const shouldEagerLoad = eagerOpt === void 0 || eagerOpt === true ? () => true : eagerOpt === false ? () => false : eagerOpt;
7131
7578
  if (!typeNameMapper && suffixes.list === suffixes.single) {
@@ -7152,7 +7599,7 @@ var buildSchema = (db, config) => {
7152
7599
  conflictDoNothing: config?.conflictDoNothing ?? false,
7153
7600
  typeNameMapper,
7154
7601
  shouldEagerLoad,
7155
- features,
7602
+ features: config?.features ?? {},
7156
7603
  complexity,
7157
7604
  scalars: config?.scalars,
7158
7605
  mapColumnType: config?.mapColumnType,
@@ -7168,11 +7615,11 @@ var buildSchema = (db, config) => {
7168
7615
  }
7169
7616
  };
7170
7617
  let generatorOutput;
7171
- if ((0, import_drizzle_orm10.is)(db, import_mysql_core3.MySqlDatabase)) {
7618
+ if ((0, import_drizzle_orm11.is)(db, import_mysql_core4.MySqlDatabase)) {
7172
7619
  generatorOutput = generateSchemaData(db, schema, relations, generatorOptions);
7173
- } else if ((0, import_drizzle_orm10.is)(db, import_pg_core3.PgAsyncDatabase)) {
7620
+ } else if ((0, import_drizzle_orm11.is)(db, import_pg_core4.PgAsyncDatabase)) {
7174
7621
  generatorOutput = generateSchemaData2(db, schema, relations, generatorOptions);
7175
- } else if ((0, import_drizzle_orm10.is)(db, import_sqlite_core3.BaseSQLiteDatabase)) {
7622
+ } else if ((0, import_drizzle_orm11.is)(db, import_sqlite_core4.BaseSQLiteDatabase)) {
7176
7623
  generatorOutput = generateSchemaData3(db, schema, relations, generatorOptions);
7177
7624
  } else {
7178
7625
  throw new Error("Drizzle-GraphQL Error: Unknown database instance type");
@@ -7212,8 +7659,14 @@ var buildSchema = (db, config) => {
7212
7659
  createRelationResolverFactory,
7213
7660
  defaultErrorMapper,
7214
7661
  drizzleExecutorKey,
7662
+ drizzleExtension,
7215
7663
  extractFilters,
7216
7664
  extractOrderBy,
7217
- extractRelationJoinColumns
7665
+ extractRelationJoinColumns,
7666
+ identifyRows,
7667
+ isDrizzleFieldExtension,
7668
+ resolveSelection,
7669
+ selectionToWith,
7670
+ singularizeMapper
7218
7671
  });
7219
7672
  //# sourceMappingURL=index.cjs.map