@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.js CHANGED
@@ -1,8 +1,8 @@
1
1
  // src/index.ts
2
- import { getColumns as getColumns6, is as is8, Table } from "drizzle-orm";
3
- import { MySqlDatabase } from "drizzle-orm/mysql-core";
4
- import { PgAsyncDatabase } from "drizzle-orm/pg-core";
5
- import { BaseSQLiteDatabase } from "drizzle-orm/sqlite-core";
2
+ import { getColumns as getColumns6, is as is9, Table as Table2 } from "drizzle-orm";
3
+ import { MySqlDatabase as MySqlDatabase2 } from "drizzle-orm/mysql-core";
4
+ import { PgAsyncDatabase as PgAsyncDatabase2 } from "drizzle-orm/pg-core";
5
+ import { BaseSQLiteDatabase as BaseSQLiteDatabase2 } from "drizzle-orm/sqlite-core";
6
6
  import {
7
7
  GraphQLObjectType as GraphQLObjectType5,
8
8
  GraphQLSchema
@@ -103,6 +103,10 @@ var getOrCreateLoader = (context, key, batchFn) => {
103
103
  import pluralize from "pluralize";
104
104
  var uncapitalize = (input) => input?.length ? `${input[0].toLocaleLowerCase()}${input.length > 1 ? input.slice(1, input.length) : ""}` : input;
105
105
  var capitalize = (input) => input?.length ? `${input[0].toLocaleUpperCase()}${input.length > 1 ? input.slice(1, input.length) : ""}` : input;
106
+ var singularizeMapper = (tableName) => ({
107
+ singular: uncapitalize(pluralize.singular(tableName)),
108
+ plural: uncapitalize(pluralize.plural(tableName))
109
+ });
106
110
 
107
111
  // src/util/data-mappers/index.ts
108
112
  import { getTableColumns as getTableColumns2, is as is2, One } from "drizzle-orm";
@@ -602,6 +606,123 @@ var remapFromGraphQLArrayInput = (queryInput, table) => {
602
606
  return queryInput;
603
607
  };
604
608
 
609
+ // src/util/extensions.ts
610
+ var drizzleExtension = (target) => {
611
+ const value = target?.extensions?.drizzle;
612
+ return value && typeof value === "object" ? value : void 0;
613
+ };
614
+ var isDrizzleFieldExtension = (value) => !!value && value.kind !== "type";
615
+ var tableFieldExtensions = (table, primaryKey) => (meta) => ({
616
+ table,
617
+ primaryKey,
618
+ ...meta
619
+ });
620
+ var tableTypeExtension = (table, primaryKey) => ({
621
+ table,
622
+ kind: "type",
623
+ primaryKey
624
+ });
625
+ var relationFieldExtension = (params) => ({
626
+ table: params.targetTable,
627
+ kind: params.aggregate ? "aggregate" : "relation",
628
+ operation: params.aggregate ? "relationAggregate" : "relation",
629
+ // An aggregate over a to-many relation still resolves to a single aggregate object.
630
+ single: params.aggregate ? true : params.single,
631
+ targetArg: "where",
632
+ primaryKey: params.primaryKey,
633
+ relation: params.relation,
634
+ parentTable: params.parentTable
635
+ });
636
+ var keyFromValues = (entry, primaryKey) => {
637
+ if (!entry || typeof entry !== "object") {
638
+ return void 0;
639
+ }
640
+ const row = {};
641
+ for (const column of primaryKey) {
642
+ const value = entry[column];
643
+ if (value === void 0 || value === null) {
644
+ return void 0;
645
+ }
646
+ row[column] = value;
647
+ }
648
+ return row;
649
+ };
650
+ var keysFromWhere = (where, primaryKey) => {
651
+ const none = { rows: [], complete: false };
652
+ if (!where || typeof where !== "object" || Array.isArray(where)) {
653
+ return none;
654
+ }
655
+ const filters = where;
656
+ if (filters.OR || filters.AND || filters.NOT) {
657
+ return none;
658
+ }
659
+ if (primaryKey.length > 1) {
660
+ const row = {};
661
+ for (const column2 of primaryKey) {
662
+ const operators2 = filters[column2];
663
+ if (!operators2 || typeof operators2 !== "object" || operators2.eq === void 0) {
664
+ return none;
665
+ }
666
+ row[column2] = operators2.eq;
667
+ }
668
+ return { rows: [row], complete: Object.keys(filters).length === primaryKey.length };
669
+ }
670
+ const column = primaryKey[0];
671
+ if (!column) {
672
+ return none;
673
+ }
674
+ const operators = filters[column];
675
+ if (!operators || typeof operators !== "object") {
676
+ return none;
677
+ }
678
+ const exact = Object.keys(filters).length === 1 && Object.keys(operators).length === 1;
679
+ if (operators.eq !== void 0) {
680
+ return { rows: [{ [column]: operators.eq }], complete: exact };
681
+ }
682
+ if (Array.isArray(operators.inArray)) {
683
+ return { rows: operators.inArray.map((value) => ({ [column]: value })), complete: exact };
684
+ }
685
+ return none;
686
+ };
687
+ var identifyRows = (field, args) => {
688
+ const meta = drizzleExtension(field);
689
+ if (!isDrizzleFieldExtension(meta)) {
690
+ return void 0;
691
+ }
692
+ const { table, primaryKey, targetArg } = meta;
693
+ const empty = { table, primaryKey, rows: [], complete: false };
694
+ if (!primaryKey.length || !targetArg) {
695
+ return empty;
696
+ }
697
+ const target = args?.[targetArg];
698
+ if (targetArg === "values") {
699
+ const entries = Array.isArray(target) ? target : target === void 0 ? [] : [target];
700
+ const rows = entries.map((entry) => keyFromValues(entry, primaryKey));
701
+ return {
702
+ table,
703
+ primaryKey,
704
+ rows: rows.filter((row) => !!row),
705
+ // A row whose key the database generates is not identifiable before the write.
706
+ complete: entries.length > 0 && rows.every(Boolean)
707
+ };
708
+ }
709
+ if (targetArg === "updates") {
710
+ if (!Array.isArray(target)) {
711
+ return empty;
712
+ }
713
+ const perEntry = target.map(
714
+ (entry) => keysFromWhere(entry?.where, primaryKey)
715
+ );
716
+ return {
717
+ table,
718
+ primaryKey,
719
+ rows: perEntry.flatMap((entry) => entry.rows),
720
+ complete: target.length > 0 && perEntry.every((entry) => entry.complete)
721
+ };
722
+ }
723
+ return { table, primaryKey, ...keysFromWhere(target, primaryKey) };
724
+ };
725
+
605
726
  // src/util/builders/field-updates.ts
606
727
  import { getColumns, sql } from "drizzle-orm";
607
728
  import {
@@ -1155,6 +1276,14 @@ var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx, limits
1155
1276
  return loader.load(localValue);
1156
1277
  };
1157
1278
  };
1279
+ var relationExtensionFor = (relEntry, parentTable, relationName, isOne, aggregate) => relationFieldExtension({
1280
+ targetTable: relEntry.targetTableName,
1281
+ parentTable,
1282
+ relation: relationName,
1283
+ single: isOne,
1284
+ primaryKey: relEntry.targetPkNames ?? [],
1285
+ aggregate
1286
+ });
1158
1287
  var columnDocs = (docs, column, tableName, columnName) => {
1159
1288
  const description = docs.describeColumn?.(column, { tableName, columnName });
1160
1289
  const deprecationReason = docs.deprecateColumn?.(column, { tableName, columnName });
@@ -1834,7 +1963,8 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1834
1963
  const shell = new GraphQLObjectType2({
1835
1964
  name: typeName,
1836
1965
  description: cacheCtx.docs.describeTable?.(tableName),
1837
- fields: () => ({ ...tableFields, ...container.fields })
1966
+ fields: () => ({ ...tableFields, ...container.fields }),
1967
+ extensions: { drizzle: tableTypeExtension(tableName, cacheCtx.primaryKeyOf?.(tableName) ?? []) }
1838
1968
  });
1839
1969
  cacheCtx.objectTypeCache.set(tableName, shell);
1840
1970
  }
@@ -1876,7 +2006,10 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1876
2006
  relType = new GraphQLObjectType2({
1877
2007
  name: resolveTypeName(targetTableName, typeNameMapper),
1878
2008
  description: cacheCtx.docs.describeTable?.(targetTableName),
1879
- fields: () => ({ ...targetTableFields, ...capturedTargetContainer.fields })
2009
+ fields: () => ({ ...targetTableFields, ...capturedTargetContainer.fields }),
2010
+ extensions: {
2011
+ drizzle: tableTypeExtension(targetTableName, cacheCtx.primaryKeyOf?.(targetTableName) ?? [])
2012
+ }
1880
2013
  });
1881
2014
  cacheCtx.objectTypeCache.set(targetTableName, relType);
1882
2015
  }
@@ -1893,12 +2026,13 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1893
2026
  where: { type: relSelectData.filters }
1894
2027
  },
1895
2028
  resolve,
1896
- ...relationDocs
2029
+ ...relationDocs,
2030
+ extensions: { drizzle: relationExtensionFor(relEntry, tableName, relationName, true) }
1897
2031
  }
1898
2032
  ]);
1899
2033
  continue;
1900
2034
  }
1901
- const targetDistinctEnum = cacheCtx.features.distinct ? generateDistinctEnum(tables[targetTableName], resolveTypeName(targetTableName, typeNameMapper)) : void 0;
2035
+ const targetDistinctEnum = cacheCtx.featureOf(targetTableName).distinct ? generateDistinctEnum(tables[targetTableName], resolveTypeName(targetTableName, typeNameMapper)) : void 0;
1902
2036
  rawRelationFields.push([
1903
2037
  relationName,
1904
2038
  {
@@ -1916,11 +2050,10 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1916
2050
  },
1917
2051
  resolve,
1918
2052
  ...relationDocs,
1919
- ...cacheCtx.complexity ? {
1920
- extensions: {
1921
- complexity: listFieldComplexity(cacheCtx.complexity, cacheCtx.limits?.(targetTableName))
1922
- }
1923
- } : {}
2053
+ extensions: {
2054
+ drizzle: relationExtensionFor(relEntry, tableName, relationName, false),
2055
+ ...cacheCtx.complexity ? { complexity: listFieldComplexity(cacheCtx.complexity, cacheCtx.limits?.(targetTableName)) } : {}
2056
+ }
1924
2057
  }
1925
2058
  ]);
1926
2059
  const aggregateFieldName = `${relationName}Aggregate`;
@@ -1939,7 +2072,10 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1939
2072
  where: { type: relSelectData.filters }
1940
2073
  },
1941
2074
  resolve: relationAggregate.resolve,
1942
- ...cacheCtx.complexity ? { extensions: { complexity: aggregateFieldComplexity(cacheCtx.complexity) } } : {}
2075
+ extensions: {
2076
+ drizzle: relationExtensionFor(relEntry, tableName, relationName, isOne, true),
2077
+ ...cacheCtx.complexity ? { complexity: aggregateFieldComplexity(cacheCtx.complexity) } : {}
2078
+ }
1943
2079
  }
1944
2080
  ]);
1945
2081
  }
@@ -2008,7 +2144,7 @@ var generateTableTypes = (tableName, tables, relationMap, withReturning, relatio
2008
2144
  const updateFields = Object.fromEntries(
2009
2145
  columnEntries.map(([columnName, column]) => {
2010
2146
  const converted = drizzleColumnToGraphQLType(column, columnName, tableName, true, false, true);
2011
- const operations = cacheCtx.features.fieldUpdateOperations ? fieldUpdateInputType(column, columnName, tableName) : void 0;
2147
+ const operations = cacheCtx.featureOf(tableName).fieldUpdateOperations ? fieldUpdateInputType(column, columnName, tableName) : void 0;
2012
2148
  const field = operations ? { ...converted, type: operations } : converted;
2013
2149
  return [columnName, { ...field, ...inputFieldDocs(cacheCtx.docs, column, tableName, columnName, field.type) }];
2014
2150
  })
@@ -2025,7 +2161,8 @@ var generateTableTypes = (tableName, tables, relationMap, withReturning, relatio
2025
2161
  const selectSingleOutput = cacheCtx.objectTypeCache.get(tableName) ?? new GraphQLObjectType2({
2026
2162
  name: resolveTypeName(tableName, typeNameMapper),
2027
2163
  description: cacheCtx.docs.describeTable?.(tableName),
2028
- fields: { ...tableFields, ...relationFields }
2164
+ fields: { ...tableFields, ...relationFields },
2165
+ extensions: { drizzle: tableTypeExtension(tableName, cacheCtx.primaryKeyOf?.(tableName) ?? []) }
2029
2166
  });
2030
2167
  const selectArrOutput = new GraphQLNonNull3(new GraphQLList3(new GraphQLNonNull3(selectSingleOutput)));
2031
2168
  const arrTableItemOutput = withReturning ? (
@@ -3433,6 +3570,38 @@ import {
3433
3570
  } from "graphql";
3434
3571
  import { parseResolveInfo as parseResolveInfo2 } from "graphql-parse-resolve-info";
3435
3572
 
3573
+ // src/util/features.ts
3574
+ var featureDefaults = {
3575
+ aggregates: true,
3576
+ groupBy: true,
3577
+ relationAggregates: true,
3578
+ distinct: true,
3579
+ insert: true,
3580
+ update: true,
3581
+ updateMany: true,
3582
+ delete: true,
3583
+ upsert: false,
3584
+ fieldUpdateOperations: false,
3585
+ countMutations: false,
3586
+ requireWhere: false
3587
+ };
3588
+ var resolveTableFeatures = (features) => {
3589
+ const cache = /* @__PURE__ */ new Map();
3590
+ const names = Object.keys(featureDefaults);
3591
+ return (tableName) => {
3592
+ let resolved = cache.get(tableName);
3593
+ if (!resolved) {
3594
+ resolved = {};
3595
+ for (const name of names) {
3596
+ const configured = features?.[name];
3597
+ resolved[name] = configured === void 0 ? featureDefaults[name] : typeof configured === "function" ? !!configured(tableName) : !!configured;
3598
+ }
3599
+ cache.set(tableName, resolved);
3600
+ }
3601
+ return resolved;
3602
+ };
3603
+ };
3604
+
3436
3605
  // src/util/builders/aggregates.ts
3437
3606
  import {
3438
3607
  and as and2,
@@ -4192,6 +4361,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4192
4361
  const excludedTables = new Set(options.exclude?.tables ?? []);
4193
4362
  const tableEntries = schemaEntries.filter(([key, value]) => is4(value, MySqlTable) && !excludedTables.has(key));
4194
4363
  const tables = Object.fromEntries(tableEntries);
4364
+ const featureOf = resolveTableFeatures(features);
4365
+ const anyTable = (feature) => tableEntries.some(([name]) => featureOf(name)[feature]);
4195
4366
  if (!tableEntries.length) {
4196
4367
  throw new Error(
4197
4368
  "Drizzle-GraphQL Error: No tables detected in Drizzle-ORM's database instance. Did you forget to pass schema to drizzle constructor?"
@@ -4234,9 +4405,10 @@ var generateSchemaData = (db, schema, relations, options) => {
4234
4405
  complexity,
4235
4406
  limits,
4236
4407
  docs: options.docs ?? {},
4237
- features
4408
+ primaryKeyOf: (name) => tables[name] ? mysqlPrimaryKeyPropNames(tables[name]) : [],
4409
+ featureOf
4238
4410
  };
4239
- const relationAggregateFactory = features.relationAggregates ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
4411
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
4240
4412
  const queries = {};
4241
4413
  const mutations = {};
4242
4414
  const mutationTxCtx = createMutationTxCtx(options.transactions);
@@ -4254,7 +4426,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4254
4426
  prefixes.insert,
4255
4427
  prefixes.update,
4256
4428
  resolverFactory,
4257
- relationAggregateFactory
4429
+ featureOf(tableName).relationAggregates ? relationAggregateFactory : void 0
4258
4430
  )
4259
4431
  ])
4260
4432
  );
@@ -4268,10 +4440,12 @@ var generateSchemaData = (db, schema, relations, options) => {
4268
4440
  });
4269
4441
  const inputs = {};
4270
4442
  const outputs = {};
4271
- if (features.insert || features.upsert || features.update || features.delete) {
4443
+ if (["insert", "upsert", "update", "delete"].some((feature) => anyTable(feature))) {
4272
4444
  outputs.MutationReturn = mutationReturnType;
4273
4445
  }
4274
4446
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
4447
+ const tableFeatures = featureOf(tableName);
4448
+ const drizzleMeta = tableFieldExtensions(tableName, mysqlPrimaryKeyPropNames(schema[tableName]));
4275
4449
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
4276
4450
  const { selectSingleOutput, selectArrOutput } = tableTypes.outputs;
4277
4451
  const {
@@ -4303,7 +4477,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4303
4477
  typeName,
4304
4478
  typeNameMapper,
4305
4479
  filterCtx,
4306
- features.distinct,
4480
+ tableFeatures.distinct,
4307
4481
  limits
4308
4482
  );
4309
4483
  const selectSingleGenerated = generateSelectSingle(
@@ -4319,7 +4493,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4319
4493
  filterCtx,
4320
4494
  limits
4321
4495
  );
4322
- const insertArrGenerated = features.insert ? generateInsertArray(
4496
+ const insertArrGenerated = tableFeatures.insert ? generateInsertArray(
4323
4497
  db,
4324
4498
  tableName,
4325
4499
  schema[tableName],
@@ -4327,7 +4501,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4327
4501
  createArrayFieldName,
4328
4502
  mutationTxCtx
4329
4503
  ) : void 0;
4330
- const insertSingleGenerated = features.insert ? generateInsertSingle(
4504
+ const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle(
4331
4505
  db,
4332
4506
  tableName,
4333
4507
  schema[tableName],
@@ -4335,7 +4509,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4335
4509
  createSingleFieldName,
4336
4510
  mutationTxCtx
4337
4511
  ) : void 0;
4338
- const onConflictInput = features.upsert ? generateOnConflictInput({
4512
+ const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
4339
4513
  table: schema[tableName],
4340
4514
  typeName,
4341
4515
  uniqueSets: [],
@@ -4360,7 +4534,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4360
4534
  true,
4361
4535
  mutationTxCtx
4362
4536
  ) : void 0;
4363
- const updateGenerated = features.update ? generateUpdate(
4537
+ const updateGenerated = tableFeatures.update ? generateUpdate(
4364
4538
  db,
4365
4539
  tableName,
4366
4540
  schema[tableName],
@@ -4368,11 +4542,11 @@ var generateSchemaData = (db, schema, relations, options) => {
4368
4542
  tableFilters,
4369
4543
  updateFieldName,
4370
4544
  false,
4371
- features.requireWhere,
4545
+ tableFeatures.requireWhere,
4372
4546
  filterCtx,
4373
4547
  mutationTxCtx
4374
4548
  ) : void 0;
4375
- const updateSingleGenerated = features.update ? generateUpdate(
4549
+ const updateSingleGenerated = tableFeatures.update ? generateUpdate(
4376
4550
  db,
4377
4551
  tableName,
4378
4552
  schema[tableName],
@@ -4380,11 +4554,11 @@ var generateSchemaData = (db, schema, relations, options) => {
4380
4554
  tableFilters,
4381
4555
  updateSingleFieldName,
4382
4556
  true,
4383
- features.requireWhere,
4557
+ tableFeatures.requireWhere,
4384
4558
  filterCtx,
4385
4559
  mutationTxCtx
4386
4560
  ) : void 0;
4387
- const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
4561
+ const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
4388
4562
  const updateManyGenerated = updateManyInput ? generateUpdateMany(
4389
4563
  db,
4390
4564
  tableName,
@@ -4394,29 +4568,29 @@ var generateSchemaData = (db, schema, relations, options) => {
4394
4568
  filterCtx,
4395
4569
  mutationTxCtx
4396
4570
  ) : void 0;
4397
- const deleteGenerated = features.delete ? generateDelete(
4571
+ const deleteGenerated = tableFeatures.delete ? generateDelete(
4398
4572
  db,
4399
4573
  tableName,
4400
4574
  schema[tableName],
4401
4575
  tableFilters,
4402
4576
  deleteFieldName,
4403
4577
  false,
4404
- features.requireWhere,
4578
+ tableFeatures.requireWhere,
4405
4579
  filterCtx,
4406
4580
  mutationTxCtx
4407
4581
  ) : void 0;
4408
- const deleteSingleGenerated = features.delete ? generateDelete(
4582
+ const deleteSingleGenerated = tableFeatures.delete ? generateDelete(
4409
4583
  db,
4410
4584
  tableName,
4411
4585
  schema[tableName],
4412
4586
  tableFilters,
4413
4587
  deleteSingleFieldName,
4414
4588
  true,
4415
- features.requireWhere,
4589
+ tableFeatures.requireWhere,
4416
4590
  filterCtx,
4417
4591
  mutationTxCtx
4418
4592
  ) : void 0;
4419
- const updateCountGenerated = features.update && features.countMutations ? generateWriteCount({
4593
+ const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
4420
4594
  db,
4421
4595
  tableName,
4422
4596
  table: schema[tableName],
@@ -4424,23 +4598,23 @@ var generateSchemaData = (db, schema, relations, options) => {
4424
4598
  setArgs: updateInput,
4425
4599
  filterArgs: tableFilters,
4426
4600
  fieldName: updateCountFieldName,
4427
- requireWhere: features.requireWhere,
4601
+ requireWhere: tableFeatures.requireWhere,
4428
4602
  filterCtx,
4429
4603
  txCtx: mutationTxCtx
4430
4604
  }) : void 0;
4431
- const deleteCountGenerated = features.delete && features.countMutations ? generateWriteCount({
4605
+ const deleteCountGenerated = tableFeatures.delete && tableFeatures.countMutations ? generateWriteCount({
4432
4606
  db,
4433
4607
  tableName,
4434
4608
  table: schema[tableName],
4435
4609
  kind: "delete",
4436
4610
  filterArgs: tableFilters,
4437
4611
  fieldName: deleteCountFieldName,
4438
- requireWhere: features.requireWhere,
4612
+ requireWhere: tableFeatures.requireWhere,
4439
4613
  filterCtx,
4440
4614
  txCtx: mutationTxCtx
4441
4615
  }) : void 0;
4442
- const aggregateType = features.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4443
- const aggregateGenerated = features.aggregates ? generateAggregate(
4616
+ const aggregateType = tableFeatures.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4617
+ const aggregateGenerated = tableFeatures.aggregates ? generateAggregate(
4444
4618
  db,
4445
4619
  tableName,
4446
4620
  schema[tableName],
@@ -4449,7 +4623,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4449
4623
  tableFilters,
4450
4624
  filterCtx
4451
4625
  ) : void 0;
4452
- const groupByType = features.aggregates && features.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4626
+ const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4453
4627
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
4454
4628
  const havingInput = groupByEnum ? generateHavingInput(schema[tableName], tableName, typeName) : void 0;
4455
4629
  const groupByGenerated = groupByType && groupByEnum && havingInput ? generateGroupBy(
@@ -4467,19 +4641,28 @@ var generateSchemaData = (db, schema, relations, options) => {
4467
4641
  type: selectArrOutput,
4468
4642
  args: selectArrGenerated.args,
4469
4643
  resolve: selectArrGenerated.resolver,
4470
- ...complexity ? { extensions: { complexity: listFieldComplexity(complexity, limits?.(tableName)) } } : {}
4644
+ extensions: {
4645
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: false, targetArg: "where" }),
4646
+ ...complexity ? { complexity: listFieldComplexity(complexity, limits?.(tableName)) } : {}
4647
+ }
4471
4648
  };
4472
4649
  queries[selectSingleGenerated.name] = {
4473
4650
  type: selectSingleOutput,
4474
4651
  args: selectSingleGenerated.args,
4475
- resolve: selectSingleGenerated.resolver
4652
+ resolve: selectSingleGenerated.resolver,
4653
+ extensions: {
4654
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: true, targetArg: "where" })
4655
+ }
4476
4656
  };
4477
4657
  if (aggregateGenerated && aggregateType) {
4478
4658
  queries[aggregateGenerated.name] = {
4479
4659
  type: new GraphQLNonNull5(aggregateType),
4480
4660
  args: aggregateGenerated.args,
4481
4661
  resolve: aggregateGenerated.resolver,
4482
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
4662
+ extensions: {
4663
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "aggregate", single: true, targetArg: "where" }),
4664
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
4665
+ }
4483
4666
  };
4484
4667
  }
4485
4668
  if (groupByGenerated && groupByType) {
@@ -4487,25 +4670,30 @@ var generateSchemaData = (db, schema, relations, options) => {
4487
4670
  type: new GraphQLNonNull5(new GraphQLList5(new GraphQLNonNull5(groupByType))),
4488
4671
  args: groupByGenerated.args,
4489
4672
  resolve: groupByGenerated.resolver,
4490
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
4673
+ extensions: {
4674
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "groupBy", single: false, targetArg: "where" }),
4675
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
4676
+ }
4491
4677
  };
4492
4678
  }
4493
- for (const generated of [
4494
- insertArrGenerated,
4495
- insertSingleGenerated,
4496
- upsertArrGenerated,
4497
- upsertSingleGenerated,
4498
- updateGenerated,
4499
- updateManyGenerated,
4500
- updateSingleGenerated,
4501
- deleteGenerated,
4502
- deleteSingleGenerated
4503
- ]) {
4679
+ const generatedMutations = [
4680
+ [insertArrGenerated, { operation: "insert", single: false, targetArg: "values" }],
4681
+ [insertSingleGenerated, { operation: "insert", single: true, targetArg: "values" }],
4682
+ [upsertArrGenerated, { operation: "upsert", single: false, targetArg: "values" }],
4683
+ [upsertSingleGenerated, { operation: "upsert", single: true, targetArg: "values" }],
4684
+ [updateGenerated, { operation: "update", single: false, targetArg: "where" }],
4685
+ [updateManyGenerated, { operation: "updateMany", single: false, targetArg: "updates" }],
4686
+ [updateSingleGenerated, { operation: "update", single: true, targetArg: "where" }],
4687
+ [deleteGenerated, { operation: "delete", single: false, targetArg: "where" }],
4688
+ [deleteSingleGenerated, { operation: "delete", single: true, targetArg: "where" }]
4689
+ ];
4690
+ for (const [generated, meta] of generatedMutations) {
4504
4691
  if (generated) {
4505
4692
  mutations[generated.name] = {
4506
4693
  type: mutationReturnType,
4507
4694
  args: generated.args,
4508
- resolve: generated.resolver
4695
+ resolve: generated.resolver,
4696
+ extensions: { drizzle: drizzleMeta({ kind: "mutation", ...meta }) }
4509
4697
  };
4510
4698
  }
4511
4699
  }
@@ -4527,9 +4715,9 @@ var generateSchemaData = (db, schema, relations, options) => {
4527
4715
  }
4528
4716
  const activeInputs = [
4529
4717
  // The insert input types the upsert mutations too, so either feature keeps it.
4530
- ...features.insert || onConflictInput ? [insertInput] : [],
4718
+ ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
4531
4719
  ...onConflictInput ? [onConflictInput] : [],
4532
- ...features.update ? [updateInput] : [],
4720
+ ...tableFeatures.update ? [updateInput] : [],
4533
4721
  ...updateManyInput ? [updateManyInput] : [],
4534
4722
  tableFilters,
4535
4723
  tableOrder
@@ -5567,6 +5755,8 @@ function generateSchemaData2(db, schema, relations, options) {
5567
5755
  const excludedTables = new Set(options.exclude?.tables ?? []);
5568
5756
  const tableEntries = schemaEntries.filter(([key, value]) => is6(value, PgTable) && !excludedTables.has(key));
5569
5757
  const tables = Object.fromEntries(tableEntries);
5758
+ const featureOf = resolveTableFeatures(features);
5759
+ const anyTable = (feature) => tableEntries.some(([name]) => featureOf(name)[feature]);
5570
5760
  if (!tableEntries.length) {
5571
5761
  throw new Error(
5572
5762
  "Drizzle-GraphQL Error: No tables detected in Drizzle-ORM's database instance. Did you forget to pass schema to drizzle constructor?"
@@ -5604,7 +5794,8 @@ function generateSchemaData2(db, schema, relations, options) {
5604
5794
  complexity,
5605
5795
  limits,
5606
5796
  docs: options.docs ?? {},
5607
- features
5797
+ primaryKeyOf: (name) => tables[name] ? pgPrimaryKeyPropNames(tables[name]) : [],
5798
+ featureOf
5608
5799
  };
5609
5800
  const nestedPlans = features.nestedWrites ? buildNestedWritePlans(
5610
5801
  tables,
@@ -5615,7 +5806,7 @@ function generateSchemaData2(db, schema, relations, options) {
5615
5806
  ) : void 0;
5616
5807
  const nestedTypes = nestedPlans ? createNestedWriteTypes({ plans: nestedPlans, cacheCtx, typeNameMapper, insertPrefix: prefixes.insert }) : void 0;
5617
5808
  const nestedRuntime = nestedPlans ? createNestedWriteRuntime({ plans: nestedPlans, filterCtx }) : void 0;
5618
- const relationAggregateFactory = features.relationAggregates ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
5809
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
5619
5810
  const queries = {};
5620
5811
  const mutations = {};
5621
5812
  const mutationTxCtx = createMutationTxCtx(options.transactions);
@@ -5633,7 +5824,7 @@ function generateSchemaData2(db, schema, relations, options) {
5633
5824
  prefixes.insert,
5634
5825
  prefixes.update,
5635
5826
  resolverFactory,
5636
- relationAggregateFactory,
5827
+ featureOf(tableName).relationAggregates ? relationAggregateFactory : void 0,
5637
5828
  nestedTypes
5638
5829
  )
5639
5830
  ])
@@ -5641,6 +5832,8 @@ function generateSchemaData2(db, schema, relations, options) {
5641
5832
  const inputs = {};
5642
5833
  const outputs = {};
5643
5834
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
5835
+ const tableFeatures = featureOf(tableName);
5836
+ const drizzleMeta = tableFieldExtensions(tableName, pgPrimaryKeyPropNames(schema[tableName]));
5644
5837
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
5645
5838
  const { selectSingleOutput, selectArrOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
5646
5839
  const {
@@ -5672,7 +5865,7 @@ function generateSchemaData2(db, schema, relations, options) {
5672
5865
  typeName,
5673
5866
  typeNameMapper,
5674
5867
  filterCtx,
5675
- features.distinct,
5868
+ tableFeatures.distinct,
5676
5869
  limits
5677
5870
  );
5678
5871
  const selectSingleGenerated = generateSelectSingle2(
@@ -5688,7 +5881,7 @@ function generateSchemaData2(db, schema, relations, options) {
5688
5881
  filterCtx,
5689
5882
  limits
5690
5883
  );
5691
- const insertArrGenerated = features.insert ? generateInsertArray2(
5884
+ const insertArrGenerated = tableFeatures.insert ? generateInsertArray2(
5692
5885
  db,
5693
5886
  tableName,
5694
5887
  schema[tableName],
@@ -5703,7 +5896,7 @@ function generateSchemaData2(db, schema, relations, options) {
5703
5896
  nestedRuntime,
5704
5897
  limits
5705
5898
  ) : void 0;
5706
- const insertSingleGenerated = features.insert ? generateInsertSingle2(
5899
+ const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle2(
5707
5900
  db,
5708
5901
  tableName,
5709
5902
  schema[tableName],
@@ -5718,8 +5911,8 @@ function generateSchemaData2(db, schema, relations, options) {
5718
5911
  nestedRuntime,
5719
5912
  limits
5720
5913
  ) : void 0;
5721
- const uniqueSets = features.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig2) : [];
5722
- const onConflictInput = features.upsert ? generateOnConflictInput({
5914
+ const uniqueSets = tableFeatures.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig2) : [];
5915
+ const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
5723
5916
  table: schema[tableName],
5724
5917
  typeName,
5725
5918
  uniqueSets,
@@ -5762,7 +5955,7 @@ function generateSchemaData2(db, schema, relations, options) {
5762
5955
  nestedRuntime,
5763
5956
  limits
5764
5957
  ) : void 0;
5765
- const updateGenerated = features.update ? generateUpdate2(
5958
+ const updateGenerated = tableFeatures.update ? generateUpdate2(
5766
5959
  db,
5767
5960
  tableName,
5768
5961
  schema[tableName],
@@ -5773,14 +5966,14 @@ function generateSchemaData2(db, schema, relations, options) {
5773
5966
  updateFieldName,
5774
5967
  typeName,
5775
5968
  false,
5776
- features.requireWhere,
5969
+ tableFeatures.requireWhere,
5777
5970
  typeNameMapper,
5778
5971
  filterCtx,
5779
5972
  mutationTxCtx,
5780
5973
  nestedRuntime,
5781
5974
  limits
5782
5975
  ) : void 0;
5783
- const updateSingleGenerated = features.update ? generateUpdate2(
5976
+ const updateSingleGenerated = tableFeatures.update ? generateUpdate2(
5784
5977
  db,
5785
5978
  tableName,
5786
5979
  schema[tableName],
@@ -5791,14 +5984,14 @@ function generateSchemaData2(db, schema, relations, options) {
5791
5984
  updateSingleFieldName,
5792
5985
  typeName,
5793
5986
  true,
5794
- features.requireWhere,
5987
+ tableFeatures.requireWhere,
5795
5988
  typeNameMapper,
5796
5989
  filterCtx,
5797
5990
  mutationTxCtx,
5798
5991
  nestedRuntime,
5799
5992
  limits
5800
5993
  ) : void 0;
5801
- const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
5994
+ const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
5802
5995
  const updateManyGenerated = updateManyInput ? generateUpdateMany2(
5803
5996
  db,
5804
5997
  tableName,
@@ -5814,7 +6007,7 @@ function generateSchemaData2(db, schema, relations, options) {
5814
6007
  nestedRuntime,
5815
6008
  limits
5816
6009
  ) : void 0;
5817
- const deleteGenerated = features.delete ? generateDelete2(
6010
+ const deleteGenerated = tableFeatures.delete ? generateDelete2(
5818
6011
  db,
5819
6012
  tableName,
5820
6013
  schema[tableName],
@@ -5822,12 +6015,12 @@ function generateSchemaData2(db, schema, relations, options) {
5822
6015
  deleteFieldName,
5823
6016
  typeName,
5824
6017
  false,
5825
- features.requireWhere,
6018
+ tableFeatures.requireWhere,
5826
6019
  filterCtx,
5827
6020
  { tableName, relationMap: namedRelations, tables },
5828
6021
  mutationTxCtx
5829
6022
  ) : void 0;
5830
- const deleteSingleGenerated = features.delete ? generateDelete2(
6023
+ const deleteSingleGenerated = tableFeatures.delete ? generateDelete2(
5831
6024
  db,
5832
6025
  tableName,
5833
6026
  schema[tableName],
@@ -5835,12 +6028,12 @@ function generateSchemaData2(db, schema, relations, options) {
5835
6028
  deleteSingleFieldName,
5836
6029
  typeName,
5837
6030
  true,
5838
- features.requireWhere,
6031
+ tableFeatures.requireWhere,
5839
6032
  filterCtx,
5840
6033
  { tableName, relationMap: namedRelations, tables },
5841
6034
  mutationTxCtx
5842
6035
  ) : void 0;
5843
- const updateCountGenerated = features.update && features.countMutations ? generateWriteCount({
6036
+ const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
5844
6037
  db,
5845
6038
  tableName,
5846
6039
  table: schema[tableName],
@@ -5848,24 +6041,24 @@ function generateSchemaData2(db, schema, relations, options) {
5848
6041
  setArgs: updateInput,
5849
6042
  filterArgs: tableFilters,
5850
6043
  fieldName: updateCountFieldName,
5851
- requireWhere: features.requireWhere,
6044
+ requireWhere: tableFeatures.requireWhere,
5852
6045
  filterCtx,
5853
6046
  txCtx: mutationTxCtx,
5854
6047
  nested: nestedRuntime
5855
6048
  }) : void 0;
5856
- const deleteCountGenerated = features.delete && features.countMutations ? generateWriteCount({
6049
+ const deleteCountGenerated = tableFeatures.delete && tableFeatures.countMutations ? generateWriteCount({
5857
6050
  db,
5858
6051
  tableName,
5859
6052
  table: schema[tableName],
5860
6053
  kind: "delete",
5861
6054
  filterArgs: tableFilters,
5862
6055
  fieldName: deleteCountFieldName,
5863
- requireWhere: features.requireWhere,
6056
+ requireWhere: tableFeatures.requireWhere,
5864
6057
  filterCtx,
5865
6058
  txCtx: mutationTxCtx
5866
6059
  }) : void 0;
5867
- const aggregateType = features.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
5868
- const aggregateGenerated = features.aggregates ? generateAggregate(
6060
+ const aggregateType = tableFeatures.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6061
+ const aggregateGenerated = tableFeatures.aggregates ? generateAggregate(
5869
6062
  db,
5870
6063
  tableName,
5871
6064
  schema[tableName],
@@ -5874,7 +6067,7 @@ function generateSchemaData2(db, schema, relations, options) {
5874
6067
  tableFilters,
5875
6068
  filterCtx
5876
6069
  ) : void 0;
5877
- const groupByType = features.aggregates && features.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6070
+ const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
5878
6071
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
5879
6072
  const havingInput = groupByEnum ? generateHavingInput(schema[tableName], tableName, typeName) : void 0;
5880
6073
  const groupByGenerated = groupByType && groupByEnum && havingInput ? generateGroupBy(
@@ -5892,19 +6085,28 @@ function generateSchemaData2(db, schema, relations, options) {
5892
6085
  type: selectArrOutput,
5893
6086
  args: selectArrGenerated.args,
5894
6087
  resolve: selectArrGenerated.resolver,
5895
- ...complexity ? { extensions: { complexity: listFieldComplexity(complexity, limits?.(tableName)) } } : {}
6088
+ extensions: {
6089
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: false, targetArg: "where" }),
6090
+ ...complexity ? { complexity: listFieldComplexity(complexity, limits?.(tableName)) } : {}
6091
+ }
5896
6092
  };
5897
6093
  queries[selectSingleGenerated.name] = {
5898
6094
  type: selectSingleOutput,
5899
6095
  args: selectSingleGenerated.args,
5900
- resolve: selectSingleGenerated.resolver
6096
+ resolve: selectSingleGenerated.resolver,
6097
+ extensions: {
6098
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: true, targetArg: "where" })
6099
+ }
5901
6100
  };
5902
6101
  if (aggregateGenerated && aggregateType) {
5903
6102
  queries[aggregateGenerated.name] = {
5904
6103
  type: new GraphQLNonNull7(aggregateType),
5905
6104
  args: aggregateGenerated.args,
5906
6105
  resolve: aggregateGenerated.resolver,
5907
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
6106
+ extensions: {
6107
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "aggregate", single: true, targetArg: "where" }),
6108
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
6109
+ }
5908
6110
  };
5909
6111
  }
5910
6112
  if (groupByGenerated && groupByType) {
@@ -5912,14 +6114,20 @@ function generateSchemaData2(db, schema, relations, options) {
5912
6114
  type: new GraphQLNonNull7(new GraphQLList7(new GraphQLNonNull7(groupByType))),
5913
6115
  args: groupByGenerated.args,
5914
6116
  resolve: groupByGenerated.resolver,
5915
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
6117
+ extensions: {
6118
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "groupBy", single: false, targetArg: "where" }),
6119
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
6120
+ }
5916
6121
  };
5917
6122
  }
5918
6123
  if (insertArrGenerated) {
5919
6124
  mutations[insertArrGenerated.name] = {
5920
6125
  type: arrTableItemOutput,
5921
6126
  args: insertArrGenerated.args,
5922
- resolve: insertArrGenerated.resolver
6127
+ resolve: insertArrGenerated.resolver,
6128
+ extensions: {
6129
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: false, targetArg: "values" })
6130
+ }
5923
6131
  };
5924
6132
  }
5925
6133
  if (insertSingleGenerated) {
@@ -5928,28 +6136,40 @@ function generateSchemaData2(db, schema, relations, options) {
5928
6136
  // `conflictDoNothing` swallowing the insert, so the field is nullable only there.
5929
6137
  type: conflictDoNothing ? singleTableItemOutput : new GraphQLNonNull7(singleTableItemOutput),
5930
6138
  args: insertSingleGenerated.args,
5931
- resolve: insertSingleGenerated.resolver
6139
+ resolve: insertSingleGenerated.resolver,
6140
+ extensions: {
6141
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: true, targetArg: "values" })
6142
+ }
5932
6143
  };
5933
6144
  }
5934
6145
  if (upsertArrGenerated) {
5935
6146
  mutations[upsertArrGenerated.name] = {
5936
6147
  type: arrTableItemOutput,
5937
6148
  args: upsertArrGenerated.args,
5938
- resolve: upsertArrGenerated.resolver
6149
+ resolve: upsertArrGenerated.resolver,
6150
+ extensions: {
6151
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: false, targetArg: "values" })
6152
+ }
5939
6153
  };
5940
6154
  }
5941
6155
  if (upsertSingleGenerated) {
5942
6156
  mutations[upsertSingleGenerated.name] = {
5943
6157
  type: singleTableItemOutput,
5944
6158
  args: upsertSingleGenerated.args,
5945
- resolve: upsertSingleGenerated.resolver
6159
+ resolve: upsertSingleGenerated.resolver,
6160
+ extensions: {
6161
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: true, targetArg: "values" })
6162
+ }
5946
6163
  };
5947
6164
  }
5948
6165
  if (updateGenerated) {
5949
6166
  mutations[updateGenerated.name] = {
5950
6167
  type: arrTableItemOutput,
5951
6168
  args: updateGenerated.args,
5952
- resolve: updateGenerated.resolver
6169
+ resolve: updateGenerated.resolver,
6170
+ extensions: {
6171
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: false, targetArg: "where" })
6172
+ }
5953
6173
  };
5954
6174
  }
5955
6175
  if (updateManyGenerated) {
@@ -5957,6 +6177,9 @@ function generateSchemaData2(db, schema, relations, options) {
5957
6177
  type: new GraphQLNonNull7(new GraphQLList7(singleTableItemOutput)),
5958
6178
  args: updateManyGenerated.args,
5959
6179
  resolve: updateManyGenerated.resolver,
6180
+ extensions: {
6181
+ drizzle: drizzleMeta({ kind: "mutation", operation: "updateMany", single: false, targetArg: "updates" })
6182
+ },
5960
6183
  // The nullable element is deliberate, and the reason this mutation's return type
5961
6184
  // differs from every sibling's: the result is aligned with the input, one slot per
5962
6185
  // entry, so an entry that matched nothing has to be able to say so.
@@ -5967,21 +6190,30 @@ function generateSchemaData2(db, schema, relations, options) {
5967
6190
  mutations[updateSingleGenerated.name] = {
5968
6191
  type: singleTableItemOutput,
5969
6192
  args: updateSingleGenerated.args,
5970
- resolve: updateSingleGenerated.resolver
6193
+ resolve: updateSingleGenerated.resolver,
6194
+ extensions: {
6195
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: true, targetArg: "where" })
6196
+ }
5971
6197
  };
5972
6198
  }
5973
6199
  if (deleteGenerated) {
5974
6200
  mutations[deleteGenerated.name] = {
5975
6201
  type: arrTableItemOutput,
5976
6202
  args: deleteGenerated.args,
5977
- resolve: deleteGenerated.resolver
6203
+ resolve: deleteGenerated.resolver,
6204
+ extensions: {
6205
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: false, targetArg: "where" })
6206
+ }
5978
6207
  };
5979
6208
  }
5980
6209
  if (deleteSingleGenerated) {
5981
6210
  mutations[deleteSingleGenerated.name] = {
5982
6211
  type: singleTableItemOutput,
5983
6212
  args: deleteSingleGenerated.args,
5984
- resolve: deleteSingleGenerated.resolver
6213
+ resolve: deleteSingleGenerated.resolver,
6214
+ extensions: {
6215
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: true, targetArg: "where" })
6216
+ }
5985
6217
  };
5986
6218
  }
5987
6219
  if (updateCountGenerated) {
@@ -6002,9 +6234,9 @@ function generateSchemaData2(db, schema, relations, options) {
6002
6234
  }
6003
6235
  const activeInputs = [
6004
6236
  // The insert input types the upsert mutations too, so either feature keeps it.
6005
- ...features.insert || onConflictInput ? [insertInput] : [],
6237
+ ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
6006
6238
  ...onConflictInput ? [onConflictInput] : [],
6007
- ...features.update ? [updateInput] : [],
6239
+ ...tableFeatures.update ? [updateInput] : [],
6008
6240
  ...updateManyInput ? [updateManyInput] : [],
6009
6241
  tableFilters,
6010
6242
  tableOrder
@@ -6589,6 +6821,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6589
6821
  const excludedTables = new Set(options.exclude?.tables ?? []);
6590
6822
  const tableEntries = schemaEntries.filter(([key, value]) => is7(value, SQLiteTable) && !excludedTables.has(key));
6591
6823
  const tables = Object.fromEntries(tableEntries);
6824
+ const featureOf = resolveTableFeatures(features);
6825
+ const anyTable = (feature) => tableEntries.some(([name]) => featureOf(name)[feature]);
6592
6826
  if (!tableEntries.length) {
6593
6827
  throw new Error(
6594
6828
  "Drizzle-GraphQL Error: No tables detected in Drizzle-ORM's database instance. Did you forget to pass schema to drizzle constructor?"
@@ -6626,7 +6860,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6626
6860
  complexity,
6627
6861
  limits,
6628
6862
  docs: options.docs ?? {},
6629
- features
6863
+ primaryKeyOf: (name) => tables[name] ? sqlitePrimaryKeyPropNames(tables[name]) : [],
6864
+ featureOf
6630
6865
  };
6631
6866
  if (features.nestedWrites && db.resultKind === "sync") {
6632
6867
  throw new Error(
@@ -6642,7 +6877,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6642
6877
  ) : void 0;
6643
6878
  const nestedTypes = nestedPlans ? createNestedWriteTypes({ plans: nestedPlans, cacheCtx, typeNameMapper, insertPrefix: prefixes.insert }) : void 0;
6644
6879
  const nestedRuntime = nestedPlans ? createNestedWriteRuntime({ plans: nestedPlans, filterCtx }) : void 0;
6645
- const relationAggregateFactory = features.relationAggregates ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
6880
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
6646
6881
  const queries = {};
6647
6882
  const mutations = {};
6648
6883
  if (options.transactions && db.resultKind === "sync") {
@@ -6665,7 +6900,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6665
6900
  prefixes.insert,
6666
6901
  prefixes.update,
6667
6902
  resolverFactory,
6668
- relationAggregateFactory,
6903
+ featureOf(tableName).relationAggregates ? relationAggregateFactory : void 0,
6669
6904
  nestedTypes
6670
6905
  )
6671
6906
  ])
@@ -6673,6 +6908,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6673
6908
  const inputs = {};
6674
6909
  const outputs = {};
6675
6910
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
6911
+ const tableFeatures = featureOf(tableName);
6912
+ const drizzleMeta = tableFieldExtensions(tableName, sqlitePrimaryKeyPropNames(schema[tableName]));
6676
6913
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
6677
6914
  const { selectSingleOutput, selectArrOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
6678
6915
  const {
@@ -6704,7 +6941,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6704
6941
  typeName,
6705
6942
  typeNameMapper,
6706
6943
  filterCtx,
6707
- features.distinct,
6944
+ tableFeatures.distinct,
6708
6945
  limits
6709
6946
  );
6710
6947
  const selectSingleGenerated = generateSelectSingle3(
@@ -6720,7 +6957,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6720
6957
  filterCtx,
6721
6958
  limits
6722
6959
  );
6723
- const insertArrGenerated = features.insert ? generateInsertArray3(
6960
+ const insertArrGenerated = tableFeatures.insert ? generateInsertArray3(
6724
6961
  db,
6725
6962
  tableName,
6726
6963
  schema[tableName],
@@ -6735,7 +6972,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6735
6972
  nestedRuntime,
6736
6973
  limits
6737
6974
  ) : void 0;
6738
- const insertSingleGenerated = features.insert ? generateInsertSingle3(
6975
+ const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle3(
6739
6976
  db,
6740
6977
  tableName,
6741
6978
  schema[tableName],
@@ -6750,8 +6987,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6750
6987
  nestedRuntime,
6751
6988
  limits
6752
6989
  ) : void 0;
6753
- const uniqueSets = features.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig3) : [];
6754
- const onConflictInput = features.upsert ? generateOnConflictInput({
6990
+ const uniqueSets = tableFeatures.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig3) : [];
6991
+ const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
6755
6992
  table: schema[tableName],
6756
6993
  typeName,
6757
6994
  uniqueSets,
@@ -6794,7 +7031,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6794
7031
  nestedRuntime,
6795
7032
  limits
6796
7033
  ) : void 0;
6797
- const updateGenerated = features.update ? generateUpdate3(
7034
+ const updateGenerated = tableFeatures.update ? generateUpdate3(
6798
7035
  db,
6799
7036
  tableName,
6800
7037
  schema[tableName],
@@ -6805,14 +7042,14 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6805
7042
  updateFieldName,
6806
7043
  typeName,
6807
7044
  false,
6808
- features.requireWhere,
7045
+ tableFeatures.requireWhere,
6809
7046
  typeNameMapper,
6810
7047
  filterCtx,
6811
7048
  mutationTxCtx,
6812
7049
  nestedRuntime,
6813
7050
  limits
6814
7051
  ) : void 0;
6815
- const updateSingleGenerated = features.update ? generateUpdate3(
7052
+ const updateSingleGenerated = tableFeatures.update ? generateUpdate3(
6816
7053
  db,
6817
7054
  tableName,
6818
7055
  schema[tableName],
@@ -6823,14 +7060,14 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6823
7060
  updateSingleFieldName,
6824
7061
  typeName,
6825
7062
  true,
6826
- features.requireWhere,
7063
+ tableFeatures.requireWhere,
6827
7064
  typeNameMapper,
6828
7065
  filterCtx,
6829
7066
  mutationTxCtx,
6830
7067
  nestedRuntime,
6831
7068
  limits
6832
7069
  ) : void 0;
6833
- const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
7070
+ const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
6834
7071
  const updateManyGenerated = updateManyInput ? generateUpdateMany3(
6835
7072
  db,
6836
7073
  tableName,
@@ -6846,7 +7083,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6846
7083
  nestedRuntime,
6847
7084
  limits
6848
7085
  ) : void 0;
6849
- const deleteGenerated = features.delete ? generateDelete3(
7086
+ const deleteGenerated = tableFeatures.delete ? generateDelete3(
6850
7087
  db,
6851
7088
  tableName,
6852
7089
  schema[tableName],
@@ -6854,12 +7091,12 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6854
7091
  deleteFieldName,
6855
7092
  typeName,
6856
7093
  false,
6857
- features.requireWhere,
7094
+ tableFeatures.requireWhere,
6858
7095
  filterCtx,
6859
7096
  { tableName, relationMap: namedRelations, tables },
6860
7097
  mutationTxCtx
6861
7098
  ) : void 0;
6862
- const deleteSingleGenerated = features.delete ? generateDelete3(
7099
+ const deleteSingleGenerated = tableFeatures.delete ? generateDelete3(
6863
7100
  db,
6864
7101
  tableName,
6865
7102
  schema[tableName],
@@ -6867,12 +7104,12 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6867
7104
  deleteSingleFieldName,
6868
7105
  typeName,
6869
7106
  true,
6870
- features.requireWhere,
7107
+ tableFeatures.requireWhere,
6871
7108
  filterCtx,
6872
7109
  { tableName, relationMap: namedRelations, tables },
6873
7110
  mutationTxCtx
6874
7111
  ) : void 0;
6875
- const updateCountGenerated = features.update && features.countMutations ? generateWriteCount({
7112
+ const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
6876
7113
  db,
6877
7114
  tableName,
6878
7115
  table: schema[tableName],
@@ -6880,24 +7117,24 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6880
7117
  setArgs: updateInput,
6881
7118
  filterArgs: tableFilters,
6882
7119
  fieldName: updateCountFieldName,
6883
- requireWhere: features.requireWhere,
7120
+ requireWhere: tableFeatures.requireWhere,
6884
7121
  filterCtx,
6885
7122
  txCtx: mutationTxCtx,
6886
7123
  nested: nestedRuntime
6887
7124
  }) : void 0;
6888
- const deleteCountGenerated = features.delete && features.countMutations ? generateWriteCount({
7125
+ const deleteCountGenerated = tableFeatures.delete && tableFeatures.countMutations ? generateWriteCount({
6889
7126
  db,
6890
7127
  tableName,
6891
7128
  table: schema[tableName],
6892
7129
  kind: "delete",
6893
7130
  filterArgs: tableFilters,
6894
7131
  fieldName: deleteCountFieldName,
6895
- requireWhere: features.requireWhere,
7132
+ requireWhere: tableFeatures.requireWhere,
6896
7133
  filterCtx,
6897
7134
  txCtx: mutationTxCtx
6898
7135
  }) : void 0;
6899
- const aggregateType = features.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6900
- const aggregateGenerated = features.aggregates ? generateAggregate(
7136
+ const aggregateType = tableFeatures.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
7137
+ const aggregateGenerated = tableFeatures.aggregates ? generateAggregate(
6901
7138
  db,
6902
7139
  tableName,
6903
7140
  schema[tableName],
@@ -6906,7 +7143,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6906
7143
  tableFilters,
6907
7144
  filterCtx
6908
7145
  ) : void 0;
6909
- const groupByType = features.aggregates && features.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
7146
+ const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6910
7147
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
6911
7148
  const havingInput = groupByEnum ? generateHavingInput(schema[tableName], tableName, typeName) : void 0;
6912
7149
  const groupByGenerated = groupByType && groupByEnum && havingInput ? generateGroupBy(
@@ -6924,19 +7161,28 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6924
7161
  type: selectArrOutput,
6925
7162
  args: selectArrGenerated.args,
6926
7163
  resolve: selectArrGenerated.resolver,
6927
- ...complexity ? { extensions: { complexity: listFieldComplexity(complexity, limits?.(tableName)) } } : {}
7164
+ extensions: {
7165
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: false, targetArg: "where" }),
7166
+ ...complexity ? { complexity: listFieldComplexity(complexity, limits?.(tableName)) } : {}
7167
+ }
6928
7168
  };
6929
7169
  queries[selectSingleGenerated.name] = {
6930
7170
  type: selectSingleOutput,
6931
7171
  args: selectSingleGenerated.args,
6932
- resolve: selectSingleGenerated.resolver
7172
+ resolve: selectSingleGenerated.resolver,
7173
+ extensions: {
7174
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: true, targetArg: "where" })
7175
+ }
6933
7176
  };
6934
7177
  if (aggregateGenerated && aggregateType) {
6935
7178
  queries[aggregateGenerated.name] = {
6936
7179
  type: new GraphQLNonNull8(aggregateType),
6937
7180
  args: aggregateGenerated.args,
6938
7181
  resolve: aggregateGenerated.resolver,
6939
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
7182
+ extensions: {
7183
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "aggregate", single: true, targetArg: "where" }),
7184
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
7185
+ }
6940
7186
  };
6941
7187
  }
6942
7188
  if (groupByGenerated && groupByType) {
@@ -6944,14 +7190,20 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6944
7190
  type: new GraphQLNonNull8(new GraphQLList8(new GraphQLNonNull8(groupByType))),
6945
7191
  args: groupByGenerated.args,
6946
7192
  resolve: groupByGenerated.resolver,
6947
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
7193
+ extensions: {
7194
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "groupBy", single: false, targetArg: "where" }),
7195
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
7196
+ }
6948
7197
  };
6949
7198
  }
6950
7199
  if (insertArrGenerated) {
6951
7200
  mutations[insertArrGenerated.name] = {
6952
7201
  type: arrTableItemOutput,
6953
7202
  args: insertArrGenerated.args,
6954
- resolve: insertArrGenerated.resolver
7203
+ resolve: insertArrGenerated.resolver,
7204
+ extensions: {
7205
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: false, targetArg: "values" })
7206
+ }
6955
7207
  };
6956
7208
  }
6957
7209
  if (insertSingleGenerated) {
@@ -6960,28 +7212,40 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6960
7212
  // `conflictDoNothing` swallowing the insert, so the field is nullable only there.
6961
7213
  type: conflictDoNothing ? singleTableItemOutput : new GraphQLNonNull8(singleTableItemOutput),
6962
7214
  args: insertSingleGenerated.args,
6963
- resolve: insertSingleGenerated.resolver
7215
+ resolve: insertSingleGenerated.resolver,
7216
+ extensions: {
7217
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: true, targetArg: "values" })
7218
+ }
6964
7219
  };
6965
7220
  }
6966
7221
  if (upsertArrGenerated) {
6967
7222
  mutations[upsertArrGenerated.name] = {
6968
7223
  type: arrTableItemOutput,
6969
7224
  args: upsertArrGenerated.args,
6970
- resolve: upsertArrGenerated.resolver
7225
+ resolve: upsertArrGenerated.resolver,
7226
+ extensions: {
7227
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: false, targetArg: "values" })
7228
+ }
6971
7229
  };
6972
7230
  }
6973
7231
  if (upsertSingleGenerated) {
6974
7232
  mutations[upsertSingleGenerated.name] = {
6975
7233
  type: singleTableItemOutput,
6976
7234
  args: upsertSingleGenerated.args,
6977
- resolve: upsertSingleGenerated.resolver
7235
+ resolve: upsertSingleGenerated.resolver,
7236
+ extensions: {
7237
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: true, targetArg: "values" })
7238
+ }
6978
7239
  };
6979
7240
  }
6980
7241
  if (updateGenerated) {
6981
7242
  mutations[updateGenerated.name] = {
6982
7243
  type: arrTableItemOutput,
6983
7244
  args: updateGenerated.args,
6984
- resolve: updateGenerated.resolver
7245
+ resolve: updateGenerated.resolver,
7246
+ extensions: {
7247
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: false, targetArg: "where" })
7248
+ }
6985
7249
  };
6986
7250
  }
6987
7251
  if (updateManyGenerated) {
@@ -6989,6 +7253,9 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6989
7253
  type: new GraphQLNonNull8(new GraphQLList8(singleTableItemOutput)),
6990
7254
  args: updateManyGenerated.args,
6991
7255
  resolve: updateManyGenerated.resolver,
7256
+ extensions: {
7257
+ drizzle: drizzleMeta({ kind: "mutation", operation: "updateMany", single: false, targetArg: "updates" })
7258
+ },
6992
7259
  // The nullable element is deliberate, and the reason this mutation's return type
6993
7260
  // differs from every sibling's: the result is aligned with the input, one slot per
6994
7261
  // entry, so an entry that matched nothing has to be able to say so.
@@ -6999,21 +7266,30 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6999
7266
  mutations[updateSingleGenerated.name] = {
7000
7267
  type: singleTableItemOutput,
7001
7268
  args: updateSingleGenerated.args,
7002
- resolve: updateSingleGenerated.resolver
7269
+ resolve: updateSingleGenerated.resolver,
7270
+ extensions: {
7271
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: true, targetArg: "where" })
7272
+ }
7003
7273
  };
7004
7274
  }
7005
7275
  if (deleteGenerated) {
7006
7276
  mutations[deleteGenerated.name] = {
7007
7277
  type: arrTableItemOutput,
7008
7278
  args: deleteGenerated.args,
7009
- resolve: deleteGenerated.resolver
7279
+ resolve: deleteGenerated.resolver,
7280
+ extensions: {
7281
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: false, targetArg: "where" })
7282
+ }
7010
7283
  };
7011
7284
  }
7012
7285
  if (deleteSingleGenerated) {
7013
7286
  mutations[deleteSingleGenerated.name] = {
7014
7287
  type: singleTableItemOutput,
7015
7288
  args: deleteSingleGenerated.args,
7016
- resolve: deleteSingleGenerated.resolver
7289
+ resolve: deleteSingleGenerated.resolver,
7290
+ extensions: {
7291
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: true, targetArg: "where" })
7292
+ }
7017
7293
  };
7018
7294
  }
7019
7295
  if (updateCountGenerated) {
@@ -7034,9 +7310,9 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7034
7310
  }
7035
7311
  const activeInputs = [
7036
7312
  // The insert input types the upsert mutations too, so either feature keeps it.
7037
- ...features.insert || onConflictInput ? [insertInput] : [],
7313
+ ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
7038
7314
  ...onConflictInput ? [onConflictInput] : [],
7039
- ...features.update ? [updateInput] : [],
7315
+ ...tableFeatures.update ? [updateInput] : [],
7040
7316
  ...updateManyInput ? [updateManyInput] : [],
7041
7317
  tableFilters,
7042
7318
  tableOrder
@@ -7076,6 +7352,141 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7076
7352
  return { queries, mutations, inputs, types: outputs, fieldResolvers };
7077
7353
  };
7078
7354
 
7355
+ // src/util/selection.ts
7356
+ import { is as is8, Table } from "drizzle-orm";
7357
+ import { getTableConfig as getMySqlTableConfig, MySqlDatabase } from "drizzle-orm/mysql-core";
7358
+ import { getTableConfig as getPgTableConfig, PgAsyncDatabase } from "drizzle-orm/pg-core";
7359
+ import { BaseSQLiteDatabase, getTableConfig as getSQLiteTableConfig } from "drizzle-orm/sqlite-core";
7360
+ import { parseResolveInfo as parseResolveInfo5 } from "graphql-parse-resolve-info";
7361
+ var contextCache = /* @__PURE__ */ new WeakMap();
7362
+ var tableConfigFor = (db) => {
7363
+ if (is8(db, MySqlDatabase)) {
7364
+ return getMySqlTableConfig;
7365
+ }
7366
+ if (is8(db, PgAsyncDatabase)) {
7367
+ return getPgTableConfig;
7368
+ }
7369
+ if (is8(db, BaseSQLiteDatabase)) {
7370
+ return getSQLiteTableConfig;
7371
+ }
7372
+ throw new Error("Drizzle-GraphQL Error: unsupported database instance \u2014 expected a PostgreSQL, MySQL or SQLite one.");
7373
+ };
7374
+ var contextFor = (db) => {
7375
+ const cached = contextCache.get(db);
7376
+ if (cached) {
7377
+ return cached;
7378
+ }
7379
+ const relations = db._.relations ?? {};
7380
+ const schema = db._.fullSchema ?? Object.fromEntries(
7381
+ Object.entries(relations).filter(([, config]) => config?.table != null).map(([key, config]) => [key, config.table])
7382
+ );
7383
+ const tableEntries = Object.entries(schema).filter(([, value]) => is8(value, Table));
7384
+ if (!tableEntries.length) {
7385
+ throw new Error(
7386
+ "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."
7387
+ );
7388
+ }
7389
+ const tables = Object.fromEntries(tableEntries);
7390
+ const getTableConfig4 = tableConfigFor(db);
7391
+ const primaryKeyCache = /* @__PURE__ */ new Map();
7392
+ const primaryKeyOf = (tableName) => {
7393
+ let pk = primaryKeyCache.get(tableName);
7394
+ if (!pk) {
7395
+ const table = tables[tableName];
7396
+ pk = table ? getPrimaryKeyPropNamesFromConfig(table, getTableConfig4) : [];
7397
+ primaryKeyCache.set(tableName, pk);
7398
+ }
7399
+ return pk;
7400
+ };
7401
+ const relationMap = buildNamedRelations(relations, tableEntries);
7402
+ attachTargetPrimaryKeys(relationMap, tables, (table) => [...primaryKeyOf(tableNameOf(tables, table))]);
7403
+ const context = {
7404
+ tables,
7405
+ relationMap,
7406
+ filterCtx: { tables, relationMap },
7407
+ primaryKeyOf
7408
+ };
7409
+ contextCache.set(db, context);
7410
+ return context;
7411
+ };
7412
+ var tableNameOf = (tables, table) => Object.keys(tables).find((name) => tables[name] === table) ?? "";
7413
+ var parseInfo = (info) => {
7414
+ if ("fieldsByTypeName" in info) {
7415
+ return info;
7416
+ }
7417
+ return parseResolveInfo5(info, { deep: true });
7418
+ };
7419
+ var selectionToWith = (info, options) => {
7420
+ const { db, table, typeNameMapper } = options;
7421
+ const { tables, relationMap, filterCtx } = contextFor(db);
7422
+ if (!tables[table]) {
7423
+ throw new Error(`Drizzle-GraphQL Error: '${table}' is not a table in the Drizzle schema.`);
7424
+ }
7425
+ if (!relationMap[table]) {
7426
+ return void 0;
7427
+ }
7428
+ const parsed = parseInfo(info);
7429
+ const params = extractRelationsParams(
7430
+ relationMap,
7431
+ tables,
7432
+ table,
7433
+ parsed,
7434
+ resolveTypeName(table, typeNameMapper),
7435
+ typeNameMapper,
7436
+ filterCtx
7437
+ );
7438
+ return params && Object.keys(params).length ? params : void 0;
7439
+ };
7440
+ var resolveSelection = async (info, options) => {
7441
+ const {
7442
+ db,
7443
+ table: tableName,
7444
+ typeNameMapper,
7445
+ executor,
7446
+ single = false,
7447
+ where,
7448
+ orderBy,
7449
+ limit,
7450
+ offset,
7451
+ after
7452
+ } = options;
7453
+ const { tables, relationMap, filterCtx, primaryKeyOf } = contextFor(db);
7454
+ const table = tables[tableName];
7455
+ if (!table) {
7456
+ throw new Error(`Drizzle-GraphQL Error: '${tableName}' is not a table in the Drizzle schema.`);
7457
+ }
7458
+ const parsedInfo = parseInfo(info);
7459
+ if (!parsedInfo) {
7460
+ throw new Error("Drizzle-GraphQL Error: resolveSelection could not read a selection set from the resolve info.");
7461
+ }
7462
+ const source = executor ?? db;
7463
+ const queryBase = source.query?.[tableName];
7464
+ if (!queryBase) {
7465
+ throw new Error(
7466
+ `Drizzle-GraphQL Error: the executor passed to resolveSelection has no relational query builder for '${tableName}'.`
7467
+ );
7468
+ }
7469
+ return runRelationalSelect({
7470
+ queryBase,
7471
+ tables,
7472
+ tableName,
7473
+ table,
7474
+ relationMap,
7475
+ typeName: resolveTypeName(tableName, typeNameMapper),
7476
+ typeNameMapper,
7477
+ parsedInfo,
7478
+ single,
7479
+ where,
7480
+ orderBy,
7481
+ limit,
7482
+ offset,
7483
+ after,
7484
+ filterCtx,
7485
+ pkNames: primaryKeyOf(tableName),
7486
+ db: source
7487
+ });
7488
+ };
7489
+
7079
7490
  // src/index.ts
7080
7491
  var buildSchema = (db, config) => {
7081
7492
  const relations = db._.relations;
@@ -7097,22 +7508,11 @@ var buildSchema = (db, config) => {
7097
7508
  list: config?.suffixes?.list ?? "",
7098
7509
  single: config?.suffixes?.single ?? "Single"
7099
7510
  };
7100
- const typeNameMapper = config?.typeNameMapper;
7101
- const features = {
7102
- aggregates: config?.features?.aggregates ?? true,
7103
- groupBy: config?.features?.groupBy ?? true,
7104
- relationAggregates: config?.features?.relationAggregates ?? true,
7105
- distinct: config?.features?.distinct ?? true,
7106
- insert: config?.features?.insert ?? true,
7107
- update: config?.features?.update ?? true,
7108
- updateMany: config?.features?.updateMany ?? true,
7109
- delete: config?.features?.delete ?? true,
7110
- upsert: config?.features?.upsert ?? false,
7111
- nestedWrites: config?.features?.nestedWrites ?? false,
7112
- fieldUpdateOperations: config?.features?.fieldUpdateOperations ?? false,
7113
- countMutations: config?.features?.countMutations ?? false,
7114
- requireWhere: config?.features?.requireWhere ?? false
7115
- };
7511
+ const typeNameMapper = config?.typeNameMapper === "singularize" ? singularizeMapper : config?.typeNameMapper;
7512
+ const tableKeys = Object.entries(schema).filter(([, value]) => is9(value, Table2)).map(([key]) => key);
7513
+ const excludedTableNames = new Set(config?.exclude?.tables ?? []);
7514
+ const featureTables = tableKeys.filter((key) => !excludedTableNames.has(key));
7515
+ const forTable = resolveTableFeatures(config?.features);
7116
7516
  const complexityConfig = config?.complexity ?? true;
7117
7517
  const complexity = complexityConfig === false ? void 0 : {
7118
7518
  defaultListSize: (complexityConfig === true ? void 0 : complexityConfig.defaultListSize) ?? 10,
@@ -7149,10 +7549,8 @@ var buildSchema = (db, config) => {
7149
7549
  } : void 0;
7150
7550
  const exclude = config?.exclude;
7151
7551
  if (exclude) {
7152
- const tableNames = new Set(
7153
- Object.entries(schema).filter(([, value]) => is8(value, Table)).map(([key]) => key)
7154
- );
7155
- const excludedTables = new Set(exclude.tables ?? []);
7552
+ const tableNames = new Set(tableKeys);
7553
+ const excludedTables = excludedTableNames;
7156
7554
  for (const tableName of excludedTables) {
7157
7555
  if (!tableNames.has(tableName)) {
7158
7556
  throw new Error(
@@ -7190,6 +7588,49 @@ var buildSchema = (db, config) => {
7190
7588
  }
7191
7589
  }
7192
7590
  }
7591
+ const featureConflicts = /* @__PURE__ */ new Map();
7592
+ const noteConflict = (message, tableName) => {
7593
+ const tables = featureConflicts.get(message);
7594
+ if (tables) {
7595
+ tables.push(tableName);
7596
+ } else {
7597
+ featureConflicts.set(message, [tableName]);
7598
+ }
7599
+ };
7600
+ for (const tableName of featureTables) {
7601
+ const tableFeatures = forTable(tableName);
7602
+ if (tableFeatures.upsert) {
7603
+ const missing = [!tableFeatures.insert ? "insert" : void 0, !tableFeatures.update ? "update" : void 0].filter(Boolean).join(" and ");
7604
+ if (missing) {
7605
+ noteConflict(
7606
+ `upsert is on while ${missing} is off, so the upsert mutations are a second write path past the operation you turned off`,
7607
+ tableName
7608
+ );
7609
+ }
7610
+ }
7611
+ if (config?.features?.nestedWrites && (!tableFeatures.insert || !tableFeatures.update)) {
7612
+ noteConflict(
7613
+ "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",
7614
+ tableName
7615
+ );
7616
+ }
7617
+ if (config?.features?.updateMany !== void 0 && tableFeatures.updateMany && !tableFeatures.update) {
7618
+ noteConflict("updateMany is on while update is off, so no batch update is generated", tableName);
7619
+ }
7620
+ if (config?.features?.groupBy !== void 0 && tableFeatures.groupBy && !tableFeatures.aggregates) {
7621
+ noteConflict("groupBy is on while aggregates is off, so no grouped query is generated", tableName);
7622
+ }
7623
+ if (tableFeatures.countMutations && !tableFeatures.update && !tableFeatures.delete) {
7624
+ noteConflict(
7625
+ "countMutations is on while update and delete are both off, so no count mutation is generated",
7626
+ tableName
7627
+ );
7628
+ }
7629
+ }
7630
+ for (const [message, tables] of featureConflicts) {
7631
+ const listed = tables.length > 5 ? `${tables.slice(0, 5).join(", ")} and ${tables.length - 5} more` : tables.join(", ");
7632
+ console.warn(`Drizzle-GraphQL Warning: config.features \u2014 ${message} (${listed}).`);
7633
+ }
7193
7634
  const eagerOpt = config?.eagerLoadRelations;
7194
7635
  const shouldEagerLoad = eagerOpt === void 0 || eagerOpt === true ? () => true : eagerOpt === false ? () => false : eagerOpt;
7195
7636
  if (!typeNameMapper && suffixes.list === suffixes.single) {
@@ -7216,7 +7657,7 @@ var buildSchema = (db, config) => {
7216
7657
  conflictDoNothing: config?.conflictDoNothing ?? false,
7217
7658
  typeNameMapper,
7218
7659
  shouldEagerLoad,
7219
- features,
7660
+ features: config?.features ?? {},
7220
7661
  complexity,
7221
7662
  scalars: config?.scalars,
7222
7663
  mapColumnType: config?.mapColumnType,
@@ -7232,11 +7673,11 @@ var buildSchema = (db, config) => {
7232
7673
  }
7233
7674
  };
7234
7675
  let generatorOutput;
7235
- if (is8(db, MySqlDatabase)) {
7676
+ if (is9(db, MySqlDatabase2)) {
7236
7677
  generatorOutput = generateSchemaData(db, schema, relations, generatorOptions);
7237
- } else if (is8(db, PgAsyncDatabase)) {
7678
+ } else if (is9(db, PgAsyncDatabase2)) {
7238
7679
  generatorOutput = generateSchemaData2(db, schema, relations, generatorOptions);
7239
- } else if (is8(db, BaseSQLiteDatabase)) {
7680
+ } else if (is9(db, BaseSQLiteDatabase2)) {
7240
7681
  generatorOutput = generateSchemaData3(db, schema, relations, generatorOptions);
7241
7682
  } else {
7242
7683
  throw new Error("Drizzle-GraphQL Error: Unknown database instance type");
@@ -7275,8 +7716,14 @@ export {
7275
7716
  createRelationResolverFactory,
7276
7717
  defaultErrorMapper,
7277
7718
  drizzleExecutorKey,
7719
+ drizzleExtension,
7278
7720
  extractFilters,
7279
7721
  extractOrderBy,
7280
- extractRelationJoinColumns
7722
+ extractRelationJoinColumns,
7723
+ identifyRows,
7724
+ isDrizzleFieldExtension,
7725
+ resolveSelection,
7726
+ selectionToWith,
7727
+ singularizeMapper
7281
7728
  };
7282
7729
  //# sourceMappingURL=index.js.map