@vantreeseba/drizzle-graphql 7.4.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,16 +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
46
  extractRelationJoinColumns: () => extractRelationJoinColumns,
47
+ identifyRows: () => identifyRows,
48
+ isDrizzleFieldExtension: () => isDrizzleFieldExtension,
49
+ resolveSelection: () => resolveSelection,
50
+ selectionToWith: () => selectionToWith,
46
51
  singularizeMapper: () => singularizeMapper
47
52
  });
48
53
  module.exports = __toCommonJS(index_exports);
49
- var import_drizzle_orm10 = require("drizzle-orm");
50
- var import_mysql_core3 = require("drizzle-orm/mysql-core");
51
- var import_pg_core3 = require("drizzle-orm/pg-core");
52
- 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");
53
58
  var import_graphql11 = require("graphql");
54
59
 
55
60
  // src/util/builders/common.ts
@@ -598,6 +603,123 @@ var remapFromGraphQLArrayInput = (queryInput, table) => {
598
603
  return queryInput;
599
604
  };
600
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
+
601
723
  // src/util/builders/field-updates.ts
602
724
  var import_drizzle_orm3 = require("drizzle-orm");
603
725
  var import_graphql4 = require("graphql");
@@ -1144,6 +1266,14 @@ var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx, limits
1144
1266
  return loader.load(localValue);
1145
1267
  };
1146
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
+ });
1147
1277
  var columnDocs = (docs, column, tableName, columnName) => {
1148
1278
  const description = docs.describeColumn?.(column, { tableName, columnName });
1149
1279
  const deprecationReason = docs.deprecateColumn?.(column, { tableName, columnName });
@@ -1823,7 +1953,8 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1823
1953
  const shell = new import_graphql5.GraphQLObjectType({
1824
1954
  name: typeName,
1825
1955
  description: cacheCtx.docs.describeTable?.(tableName),
1826
- fields: () => ({ ...tableFields, ...container.fields })
1956
+ fields: () => ({ ...tableFields, ...container.fields }),
1957
+ extensions: { drizzle: tableTypeExtension(tableName, cacheCtx.primaryKeyOf?.(tableName) ?? []) }
1827
1958
  });
1828
1959
  cacheCtx.objectTypeCache.set(tableName, shell);
1829
1960
  }
@@ -1865,7 +1996,10 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1865
1996
  relType = new import_graphql5.GraphQLObjectType({
1866
1997
  name: resolveTypeName(targetTableName, typeNameMapper),
1867
1998
  description: cacheCtx.docs.describeTable?.(targetTableName),
1868
- fields: () => ({ ...targetTableFields, ...capturedTargetContainer.fields })
1999
+ fields: () => ({ ...targetTableFields, ...capturedTargetContainer.fields }),
2000
+ extensions: {
2001
+ drizzle: tableTypeExtension(targetTableName, cacheCtx.primaryKeyOf?.(targetTableName) ?? [])
2002
+ }
1869
2003
  });
1870
2004
  cacheCtx.objectTypeCache.set(targetTableName, relType);
1871
2005
  }
@@ -1882,7 +2016,8 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1882
2016
  where: { type: relSelectData.filters }
1883
2017
  },
1884
2018
  resolve,
1885
- ...relationDocs
2019
+ ...relationDocs,
2020
+ extensions: { drizzle: relationExtensionFor(relEntry, tableName, relationName, true) }
1886
2021
  }
1887
2022
  ]);
1888
2023
  continue;
@@ -1905,11 +2040,10 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1905
2040
  },
1906
2041
  resolve,
1907
2042
  ...relationDocs,
1908
- ...cacheCtx.complexity ? {
1909
- extensions: {
1910
- complexity: listFieldComplexity(cacheCtx.complexity, cacheCtx.limits?.(targetTableName))
1911
- }
1912
- } : {}
2043
+ extensions: {
2044
+ drizzle: relationExtensionFor(relEntry, tableName, relationName, false),
2045
+ ...cacheCtx.complexity ? { complexity: listFieldComplexity(cacheCtx.complexity, cacheCtx.limits?.(targetTableName)) } : {}
2046
+ }
1913
2047
  }
1914
2048
  ]);
1915
2049
  const aggregateFieldName = `${relationName}Aggregate`;
@@ -1928,7 +2062,10 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1928
2062
  where: { type: relSelectData.filters }
1929
2063
  },
1930
2064
  resolve: relationAggregate.resolve,
1931
- ...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
+ }
1932
2069
  }
1933
2070
  ]);
1934
2071
  }
@@ -2014,7 +2151,8 @@ var generateTableTypes = (tableName, tables, relationMap, withReturning, relatio
2014
2151
  const selectSingleOutput = cacheCtx.objectTypeCache.get(tableName) ?? new import_graphql5.GraphQLObjectType({
2015
2152
  name: resolveTypeName(tableName, typeNameMapper),
2016
2153
  description: cacheCtx.docs.describeTable?.(tableName),
2017
- fields: { ...tableFields, ...relationFields }
2154
+ fields: { ...tableFields, ...relationFields },
2155
+ extensions: { drizzle: tableTypeExtension(tableName, cacheCtx.primaryKeyOf?.(tableName) ?? []) }
2018
2156
  });
2019
2157
  const selectArrOutput = new import_graphql5.GraphQLNonNull(new import_graphql5.GraphQLList(new import_graphql5.GraphQLNonNull(selectSingleOutput)));
2020
2158
  const arrTableItemOutput = withReturning ? (
@@ -4225,6 +4363,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4225
4363
  complexity,
4226
4364
  limits,
4227
4365
  docs: options.docs ?? {},
4366
+ primaryKeyOf: (name) => tables[name] ? mysqlPrimaryKeyPropNames(tables[name]) : [],
4228
4367
  featureOf
4229
4368
  };
4230
4369
  const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
@@ -4264,6 +4403,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4264
4403
  }
4265
4404
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
4266
4405
  const tableFeatures = featureOf(tableName);
4406
+ const drizzleMeta = tableFieldExtensions(tableName, mysqlPrimaryKeyPropNames(schema[tableName]));
4267
4407
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
4268
4408
  const { selectSingleOutput, selectArrOutput } = tableTypes.outputs;
4269
4409
  const {
@@ -4459,19 +4599,28 @@ var generateSchemaData = (db, schema, relations, options) => {
4459
4599
  type: selectArrOutput,
4460
4600
  args: selectArrGenerated.args,
4461
4601
  resolve: selectArrGenerated.resolver,
4462
- ...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
+ }
4463
4606
  };
4464
4607
  queries[selectSingleGenerated.name] = {
4465
4608
  type: selectSingleOutput,
4466
4609
  args: selectSingleGenerated.args,
4467
- resolve: selectSingleGenerated.resolver
4610
+ resolve: selectSingleGenerated.resolver,
4611
+ extensions: {
4612
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: true, targetArg: "where" })
4613
+ }
4468
4614
  };
4469
4615
  if (aggregateGenerated && aggregateType) {
4470
4616
  queries[aggregateGenerated.name] = {
4471
4617
  type: new import_graphql7.GraphQLNonNull(aggregateType),
4472
4618
  args: aggregateGenerated.args,
4473
4619
  resolve: aggregateGenerated.resolver,
4474
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
4620
+ extensions: {
4621
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "aggregate", single: true, targetArg: "where" }),
4622
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
4623
+ }
4475
4624
  };
4476
4625
  }
4477
4626
  if (groupByGenerated && groupByType) {
@@ -4479,25 +4628,30 @@ var generateSchemaData = (db, schema, relations, options) => {
4479
4628
  type: new import_graphql7.GraphQLNonNull(new import_graphql7.GraphQLList(new import_graphql7.GraphQLNonNull(groupByType))),
4480
4629
  args: groupByGenerated.args,
4481
4630
  resolve: groupByGenerated.resolver,
4482
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
4631
+ extensions: {
4632
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "groupBy", single: false, targetArg: "where" }),
4633
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
4634
+ }
4483
4635
  };
4484
4636
  }
4485
- for (const generated of [
4486
- insertArrGenerated,
4487
- insertSingleGenerated,
4488
- upsertArrGenerated,
4489
- upsertSingleGenerated,
4490
- updateGenerated,
4491
- updateManyGenerated,
4492
- updateSingleGenerated,
4493
- deleteGenerated,
4494
- deleteSingleGenerated
4495
- ]) {
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) {
4496
4649
  if (generated) {
4497
4650
  mutations[generated.name] = {
4498
4651
  type: mutationReturnType,
4499
4652
  args: generated.args,
4500
- resolve: generated.resolver
4653
+ resolve: generated.resolver,
4654
+ extensions: { drizzle: drizzleMeta({ kind: "mutation", ...meta }) }
4501
4655
  };
4502
4656
  }
4503
4657
  }
@@ -5587,6 +5741,7 @@ function generateSchemaData2(db, schema, relations, options) {
5587
5741
  complexity,
5588
5742
  limits,
5589
5743
  docs: options.docs ?? {},
5744
+ primaryKeyOf: (name) => tables[name] ? pgPrimaryKeyPropNames(tables[name]) : [],
5590
5745
  featureOf
5591
5746
  };
5592
5747
  const nestedPlans = features.nestedWrites ? buildNestedWritePlans(
@@ -5625,6 +5780,7 @@ function generateSchemaData2(db, schema, relations, options) {
5625
5780
  const outputs = {};
5626
5781
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
5627
5782
  const tableFeatures = featureOf(tableName);
5783
+ const drizzleMeta = tableFieldExtensions(tableName, pgPrimaryKeyPropNames(schema[tableName]));
5628
5784
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
5629
5785
  const { selectSingleOutput, selectArrOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
5630
5786
  const {
@@ -5876,19 +6032,28 @@ function generateSchemaData2(db, schema, relations, options) {
5876
6032
  type: selectArrOutput,
5877
6033
  args: selectArrGenerated.args,
5878
6034
  resolve: selectArrGenerated.resolver,
5879
- ...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
+ }
5880
6039
  };
5881
6040
  queries[selectSingleGenerated.name] = {
5882
6041
  type: selectSingleOutput,
5883
6042
  args: selectSingleGenerated.args,
5884
- resolve: selectSingleGenerated.resolver
6043
+ resolve: selectSingleGenerated.resolver,
6044
+ extensions: {
6045
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: true, targetArg: "where" })
6046
+ }
5885
6047
  };
5886
6048
  if (aggregateGenerated && aggregateType) {
5887
6049
  queries[aggregateGenerated.name] = {
5888
6050
  type: new import_graphql9.GraphQLNonNull(aggregateType),
5889
6051
  args: aggregateGenerated.args,
5890
6052
  resolve: aggregateGenerated.resolver,
5891
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
6053
+ extensions: {
6054
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "aggregate", single: true, targetArg: "where" }),
6055
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
6056
+ }
5892
6057
  };
5893
6058
  }
5894
6059
  if (groupByGenerated && groupByType) {
@@ -5896,14 +6061,20 @@ function generateSchemaData2(db, schema, relations, options) {
5896
6061
  type: new import_graphql9.GraphQLNonNull(new import_graphql9.GraphQLList(new import_graphql9.GraphQLNonNull(groupByType))),
5897
6062
  args: groupByGenerated.args,
5898
6063
  resolve: groupByGenerated.resolver,
5899
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
6064
+ extensions: {
6065
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "groupBy", single: false, targetArg: "where" }),
6066
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
6067
+ }
5900
6068
  };
5901
6069
  }
5902
6070
  if (insertArrGenerated) {
5903
6071
  mutations[insertArrGenerated.name] = {
5904
6072
  type: arrTableItemOutput,
5905
6073
  args: insertArrGenerated.args,
5906
- resolve: insertArrGenerated.resolver
6074
+ resolve: insertArrGenerated.resolver,
6075
+ extensions: {
6076
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: false, targetArg: "values" })
6077
+ }
5907
6078
  };
5908
6079
  }
5909
6080
  if (insertSingleGenerated) {
@@ -5912,28 +6083,40 @@ function generateSchemaData2(db, schema, relations, options) {
5912
6083
  // `conflictDoNothing` swallowing the insert, so the field is nullable only there.
5913
6084
  type: conflictDoNothing ? singleTableItemOutput : new import_graphql9.GraphQLNonNull(singleTableItemOutput),
5914
6085
  args: insertSingleGenerated.args,
5915
- resolve: insertSingleGenerated.resolver
6086
+ resolve: insertSingleGenerated.resolver,
6087
+ extensions: {
6088
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: true, targetArg: "values" })
6089
+ }
5916
6090
  };
5917
6091
  }
5918
6092
  if (upsertArrGenerated) {
5919
6093
  mutations[upsertArrGenerated.name] = {
5920
6094
  type: arrTableItemOutput,
5921
6095
  args: upsertArrGenerated.args,
5922
- resolve: upsertArrGenerated.resolver
6096
+ resolve: upsertArrGenerated.resolver,
6097
+ extensions: {
6098
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: false, targetArg: "values" })
6099
+ }
5923
6100
  };
5924
6101
  }
5925
6102
  if (upsertSingleGenerated) {
5926
6103
  mutations[upsertSingleGenerated.name] = {
5927
6104
  type: singleTableItemOutput,
5928
6105
  args: upsertSingleGenerated.args,
5929
- resolve: upsertSingleGenerated.resolver
6106
+ resolve: upsertSingleGenerated.resolver,
6107
+ extensions: {
6108
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: true, targetArg: "values" })
6109
+ }
5930
6110
  };
5931
6111
  }
5932
6112
  if (updateGenerated) {
5933
6113
  mutations[updateGenerated.name] = {
5934
6114
  type: arrTableItemOutput,
5935
6115
  args: updateGenerated.args,
5936
- resolve: updateGenerated.resolver
6116
+ resolve: updateGenerated.resolver,
6117
+ extensions: {
6118
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: false, targetArg: "where" })
6119
+ }
5937
6120
  };
5938
6121
  }
5939
6122
  if (updateManyGenerated) {
@@ -5941,6 +6124,9 @@ function generateSchemaData2(db, schema, relations, options) {
5941
6124
  type: new import_graphql9.GraphQLNonNull(new import_graphql9.GraphQLList(singleTableItemOutput)),
5942
6125
  args: updateManyGenerated.args,
5943
6126
  resolve: updateManyGenerated.resolver,
6127
+ extensions: {
6128
+ drizzle: drizzleMeta({ kind: "mutation", operation: "updateMany", single: false, targetArg: "updates" })
6129
+ },
5944
6130
  // The nullable element is deliberate, and the reason this mutation's return type
5945
6131
  // differs from every sibling's: the result is aligned with the input, one slot per
5946
6132
  // entry, so an entry that matched nothing has to be able to say so.
@@ -5951,21 +6137,30 @@ function generateSchemaData2(db, schema, relations, options) {
5951
6137
  mutations[updateSingleGenerated.name] = {
5952
6138
  type: singleTableItemOutput,
5953
6139
  args: updateSingleGenerated.args,
5954
- resolve: updateSingleGenerated.resolver
6140
+ resolve: updateSingleGenerated.resolver,
6141
+ extensions: {
6142
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: true, targetArg: "where" })
6143
+ }
5955
6144
  };
5956
6145
  }
5957
6146
  if (deleteGenerated) {
5958
6147
  mutations[deleteGenerated.name] = {
5959
6148
  type: arrTableItemOutput,
5960
6149
  args: deleteGenerated.args,
5961
- resolve: deleteGenerated.resolver
6150
+ resolve: deleteGenerated.resolver,
6151
+ extensions: {
6152
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: false, targetArg: "where" })
6153
+ }
5962
6154
  };
5963
6155
  }
5964
6156
  if (deleteSingleGenerated) {
5965
6157
  mutations[deleteSingleGenerated.name] = {
5966
6158
  type: singleTableItemOutput,
5967
6159
  args: deleteSingleGenerated.args,
5968
- resolve: deleteSingleGenerated.resolver
6160
+ resolve: deleteSingleGenerated.resolver,
6161
+ extensions: {
6162
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: true, targetArg: "where" })
6163
+ }
5969
6164
  };
5970
6165
  }
5971
6166
  if (updateCountGenerated) {
@@ -6607,6 +6802,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6607
6802
  complexity,
6608
6803
  limits,
6609
6804
  docs: options.docs ?? {},
6805
+ primaryKeyOf: (name) => tables[name] ? sqlitePrimaryKeyPropNames(tables[name]) : [],
6610
6806
  featureOf
6611
6807
  };
6612
6808
  if (features.nestedWrites && db.resultKind === "sync") {
@@ -6655,6 +6851,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6655
6851
  const outputs = {};
6656
6852
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
6657
6853
  const tableFeatures = featureOf(tableName);
6854
+ const drizzleMeta = tableFieldExtensions(tableName, sqlitePrimaryKeyPropNames(schema[tableName]));
6658
6855
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
6659
6856
  const { selectSingleOutput, selectArrOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
6660
6857
  const {
@@ -6906,19 +7103,28 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6906
7103
  type: selectArrOutput,
6907
7104
  args: selectArrGenerated.args,
6908
7105
  resolve: selectArrGenerated.resolver,
6909
- ...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
+ }
6910
7110
  };
6911
7111
  queries[selectSingleGenerated.name] = {
6912
7112
  type: selectSingleOutput,
6913
7113
  args: selectSingleGenerated.args,
6914
- resolve: selectSingleGenerated.resolver
7114
+ resolve: selectSingleGenerated.resolver,
7115
+ extensions: {
7116
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: true, targetArg: "where" })
7117
+ }
6915
7118
  };
6916
7119
  if (aggregateGenerated && aggregateType) {
6917
7120
  queries[aggregateGenerated.name] = {
6918
7121
  type: new import_graphql10.GraphQLNonNull(aggregateType),
6919
7122
  args: aggregateGenerated.args,
6920
7123
  resolve: aggregateGenerated.resolver,
6921
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
7124
+ extensions: {
7125
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "aggregate", single: true, targetArg: "where" }),
7126
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
7127
+ }
6922
7128
  };
6923
7129
  }
6924
7130
  if (groupByGenerated && groupByType) {
@@ -6926,14 +7132,20 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6926
7132
  type: new import_graphql10.GraphQLNonNull(new import_graphql10.GraphQLList(new import_graphql10.GraphQLNonNull(groupByType))),
6927
7133
  args: groupByGenerated.args,
6928
7134
  resolve: groupByGenerated.resolver,
6929
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
7135
+ extensions: {
7136
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "groupBy", single: false, targetArg: "where" }),
7137
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
7138
+ }
6930
7139
  };
6931
7140
  }
6932
7141
  if (insertArrGenerated) {
6933
7142
  mutations[insertArrGenerated.name] = {
6934
7143
  type: arrTableItemOutput,
6935
7144
  args: insertArrGenerated.args,
6936
- resolve: insertArrGenerated.resolver
7145
+ resolve: insertArrGenerated.resolver,
7146
+ extensions: {
7147
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: false, targetArg: "values" })
7148
+ }
6937
7149
  };
6938
7150
  }
6939
7151
  if (insertSingleGenerated) {
@@ -6942,28 +7154,40 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6942
7154
  // `conflictDoNothing` swallowing the insert, so the field is nullable only there.
6943
7155
  type: conflictDoNothing ? singleTableItemOutput : new import_graphql10.GraphQLNonNull(singleTableItemOutput),
6944
7156
  args: insertSingleGenerated.args,
6945
- resolve: insertSingleGenerated.resolver
7157
+ resolve: insertSingleGenerated.resolver,
7158
+ extensions: {
7159
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: true, targetArg: "values" })
7160
+ }
6946
7161
  };
6947
7162
  }
6948
7163
  if (upsertArrGenerated) {
6949
7164
  mutations[upsertArrGenerated.name] = {
6950
7165
  type: arrTableItemOutput,
6951
7166
  args: upsertArrGenerated.args,
6952
- resolve: upsertArrGenerated.resolver
7167
+ resolve: upsertArrGenerated.resolver,
7168
+ extensions: {
7169
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: false, targetArg: "values" })
7170
+ }
6953
7171
  };
6954
7172
  }
6955
7173
  if (upsertSingleGenerated) {
6956
7174
  mutations[upsertSingleGenerated.name] = {
6957
7175
  type: singleTableItemOutput,
6958
7176
  args: upsertSingleGenerated.args,
6959
- resolve: upsertSingleGenerated.resolver
7177
+ resolve: upsertSingleGenerated.resolver,
7178
+ extensions: {
7179
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: true, targetArg: "values" })
7180
+ }
6960
7181
  };
6961
7182
  }
6962
7183
  if (updateGenerated) {
6963
7184
  mutations[updateGenerated.name] = {
6964
7185
  type: arrTableItemOutput,
6965
7186
  args: updateGenerated.args,
6966
- resolve: updateGenerated.resolver
7187
+ resolve: updateGenerated.resolver,
7188
+ extensions: {
7189
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: false, targetArg: "where" })
7190
+ }
6967
7191
  };
6968
7192
  }
6969
7193
  if (updateManyGenerated) {
@@ -6971,6 +7195,9 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6971
7195
  type: new import_graphql10.GraphQLNonNull(new import_graphql10.GraphQLList(singleTableItemOutput)),
6972
7196
  args: updateManyGenerated.args,
6973
7197
  resolve: updateManyGenerated.resolver,
7198
+ extensions: {
7199
+ drizzle: drizzleMeta({ kind: "mutation", operation: "updateMany", single: false, targetArg: "updates" })
7200
+ },
6974
7201
  // The nullable element is deliberate, and the reason this mutation's return type
6975
7202
  // differs from every sibling's: the result is aligned with the input, one slot per
6976
7203
  // entry, so an entry that matched nothing has to be able to say so.
@@ -6981,21 +7208,30 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6981
7208
  mutations[updateSingleGenerated.name] = {
6982
7209
  type: singleTableItemOutput,
6983
7210
  args: updateSingleGenerated.args,
6984
- resolve: updateSingleGenerated.resolver
7211
+ resolve: updateSingleGenerated.resolver,
7212
+ extensions: {
7213
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: true, targetArg: "where" })
7214
+ }
6985
7215
  };
6986
7216
  }
6987
7217
  if (deleteGenerated) {
6988
7218
  mutations[deleteGenerated.name] = {
6989
7219
  type: arrTableItemOutput,
6990
7220
  args: deleteGenerated.args,
6991
- resolve: deleteGenerated.resolver
7221
+ resolve: deleteGenerated.resolver,
7222
+ extensions: {
7223
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: false, targetArg: "where" })
7224
+ }
6992
7225
  };
6993
7226
  }
6994
7227
  if (deleteSingleGenerated) {
6995
7228
  mutations[deleteSingleGenerated.name] = {
6996
7229
  type: singleTableItemOutput,
6997
7230
  args: deleteSingleGenerated.args,
6998
- resolve: deleteSingleGenerated.resolver
7231
+ resolve: deleteSingleGenerated.resolver,
7232
+ extensions: {
7233
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: true, targetArg: "where" })
7234
+ }
6999
7235
  };
7000
7236
  }
7001
7237
  if (updateCountGenerated) {
@@ -7058,6 +7294,141 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7058
7294
  return { queries, mutations, inputs, types: outputs, fieldResolvers };
7059
7295
  };
7060
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
+
7061
7432
  // src/index.ts
7062
7433
  var buildSchema = (db, config) => {
7063
7434
  const relations = db._.relations;
@@ -7080,7 +7451,7 @@ var buildSchema = (db, config) => {
7080
7451
  single: config?.suffixes?.single ?? "Single"
7081
7452
  };
7082
7453
  const typeNameMapper = config?.typeNameMapper === "singularize" ? singularizeMapper : config?.typeNameMapper;
7083
- const tableKeys = Object.entries(schema).filter(([, value]) => (0, import_drizzle_orm10.is)(value, import_drizzle_orm10.Table)).map(([key]) => key);
7454
+ const tableKeys = Object.entries(schema).filter(([, value]) => (0, import_drizzle_orm11.is)(value, import_drizzle_orm11.Table)).map(([key]) => key);
7084
7455
  const excludedTableNames = new Set(config?.exclude?.tables ?? []);
7085
7456
  const featureTables = tableKeys.filter((key) => !excludedTableNames.has(key));
7086
7457
  const forTable = resolveTableFeatures(config?.features);
@@ -7143,7 +7514,7 @@ var buildSchema = (db, config) => {
7143
7514
  if (excludedTables.has(tableName)) {
7144
7515
  continue;
7145
7516
  }
7146
- const columns = (0, import_drizzle_orm10.getColumns)(schema[tableName]);
7517
+ const columns = (0, import_drizzle_orm11.getColumns)(schema[tableName]);
7147
7518
  for (const columnName of columnNames) {
7148
7519
  const column = columns[columnName];
7149
7520
  if (!column) {
@@ -7244,11 +7615,11 @@ var buildSchema = (db, config) => {
7244
7615
  }
7245
7616
  };
7246
7617
  let generatorOutput;
7247
- if ((0, import_drizzle_orm10.is)(db, import_mysql_core3.MySqlDatabase)) {
7618
+ if ((0, import_drizzle_orm11.is)(db, import_mysql_core4.MySqlDatabase)) {
7248
7619
  generatorOutput = generateSchemaData(db, schema, relations, generatorOptions);
7249
- } 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)) {
7250
7621
  generatorOutput = generateSchemaData2(db, schema, relations, generatorOptions);
7251
- } 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)) {
7252
7623
  generatorOutput = generateSchemaData3(db, schema, relations, generatorOptions);
7253
7624
  } else {
7254
7625
  throw new Error("Drizzle-GraphQL Error: Unknown database instance type");
@@ -7288,9 +7659,14 @@ var buildSchema = (db, config) => {
7288
7659
  createRelationResolverFactory,
7289
7660
  defaultErrorMapper,
7290
7661
  drizzleExecutorKey,
7662
+ drizzleExtension,
7291
7663
  extractFilters,
7292
7664
  extractOrderBy,
7293
7665
  extractRelationJoinColumns,
7666
+ identifyRows,
7667
+ isDrizzleFieldExtension,
7668
+ resolveSelection,
7669
+ selectionToWith,
7294
7670
  singularizeMapper
7295
7671
  });
7296
7672
  //# sourceMappingURL=index.cjs.map