@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.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
@@ -606,6 +606,123 @@ var remapFromGraphQLArrayInput = (queryInput, table) => {
606
606
  return queryInput;
607
607
  };
608
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
+
609
726
  // src/util/builders/field-updates.ts
610
727
  import { getColumns, sql } from "drizzle-orm";
611
728
  import {
@@ -1159,6 +1276,14 @@ var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx, limits
1159
1276
  return loader.load(localValue);
1160
1277
  };
1161
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
+ });
1162
1287
  var columnDocs = (docs, column, tableName, columnName) => {
1163
1288
  const description = docs.describeColumn?.(column, { tableName, columnName });
1164
1289
  const deprecationReason = docs.deprecateColumn?.(column, { tableName, columnName });
@@ -1838,7 +1963,8 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1838
1963
  const shell = new GraphQLObjectType2({
1839
1964
  name: typeName,
1840
1965
  description: cacheCtx.docs.describeTable?.(tableName),
1841
- fields: () => ({ ...tableFields, ...container.fields })
1966
+ fields: () => ({ ...tableFields, ...container.fields }),
1967
+ extensions: { drizzle: tableTypeExtension(tableName, cacheCtx.primaryKeyOf?.(tableName) ?? []) }
1842
1968
  });
1843
1969
  cacheCtx.objectTypeCache.set(tableName, shell);
1844
1970
  }
@@ -1880,7 +2006,10 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1880
2006
  relType = new GraphQLObjectType2({
1881
2007
  name: resolveTypeName(targetTableName, typeNameMapper),
1882
2008
  description: cacheCtx.docs.describeTable?.(targetTableName),
1883
- fields: () => ({ ...targetTableFields, ...capturedTargetContainer.fields })
2009
+ fields: () => ({ ...targetTableFields, ...capturedTargetContainer.fields }),
2010
+ extensions: {
2011
+ drizzle: tableTypeExtension(targetTableName, cacheCtx.primaryKeyOf?.(targetTableName) ?? [])
2012
+ }
1884
2013
  });
1885
2014
  cacheCtx.objectTypeCache.set(targetTableName, relType);
1886
2015
  }
@@ -1897,7 +2026,8 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1897
2026
  where: { type: relSelectData.filters }
1898
2027
  },
1899
2028
  resolve,
1900
- ...relationDocs
2029
+ ...relationDocs,
2030
+ extensions: { drizzle: relationExtensionFor(relEntry, tableName, relationName, true) }
1901
2031
  }
1902
2032
  ]);
1903
2033
  continue;
@@ -1920,11 +2050,10 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1920
2050
  },
1921
2051
  resolve,
1922
2052
  ...relationDocs,
1923
- ...cacheCtx.complexity ? {
1924
- extensions: {
1925
- complexity: listFieldComplexity(cacheCtx.complexity, cacheCtx.limits?.(targetTableName))
1926
- }
1927
- } : {}
2053
+ extensions: {
2054
+ drizzle: relationExtensionFor(relEntry, tableName, relationName, false),
2055
+ ...cacheCtx.complexity ? { complexity: listFieldComplexity(cacheCtx.complexity, cacheCtx.limits?.(targetTableName)) } : {}
2056
+ }
1928
2057
  }
1929
2058
  ]);
1930
2059
  const aggregateFieldName = `${relationName}Aggregate`;
@@ -1943,7 +2072,10 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1943
2072
  where: { type: relSelectData.filters }
1944
2073
  },
1945
2074
  resolve: relationAggregate.resolve,
1946
- ...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
+ }
1947
2079
  }
1948
2080
  ]);
1949
2081
  }
@@ -2029,7 +2161,8 @@ var generateTableTypes = (tableName, tables, relationMap, withReturning, relatio
2029
2161
  const selectSingleOutput = cacheCtx.objectTypeCache.get(tableName) ?? new GraphQLObjectType2({
2030
2162
  name: resolveTypeName(tableName, typeNameMapper),
2031
2163
  description: cacheCtx.docs.describeTable?.(tableName),
2032
- fields: { ...tableFields, ...relationFields }
2164
+ fields: { ...tableFields, ...relationFields },
2165
+ extensions: { drizzle: tableTypeExtension(tableName, cacheCtx.primaryKeyOf?.(tableName) ?? []) }
2033
2166
  });
2034
2167
  const selectArrOutput = new GraphQLNonNull3(new GraphQLList3(new GraphQLNonNull3(selectSingleOutput)));
2035
2168
  const arrTableItemOutput = withReturning ? (
@@ -4272,6 +4405,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4272
4405
  complexity,
4273
4406
  limits,
4274
4407
  docs: options.docs ?? {},
4408
+ primaryKeyOf: (name) => tables[name] ? mysqlPrimaryKeyPropNames(tables[name]) : [],
4275
4409
  featureOf
4276
4410
  };
4277
4411
  const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
@@ -4311,6 +4445,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4311
4445
  }
4312
4446
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
4313
4447
  const tableFeatures = featureOf(tableName);
4448
+ const drizzleMeta = tableFieldExtensions(tableName, mysqlPrimaryKeyPropNames(schema[tableName]));
4314
4449
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
4315
4450
  const { selectSingleOutput, selectArrOutput } = tableTypes.outputs;
4316
4451
  const {
@@ -4506,19 +4641,28 @@ var generateSchemaData = (db, schema, relations, options) => {
4506
4641
  type: selectArrOutput,
4507
4642
  args: selectArrGenerated.args,
4508
4643
  resolve: selectArrGenerated.resolver,
4509
- ...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
+ }
4510
4648
  };
4511
4649
  queries[selectSingleGenerated.name] = {
4512
4650
  type: selectSingleOutput,
4513
4651
  args: selectSingleGenerated.args,
4514
- resolve: selectSingleGenerated.resolver
4652
+ resolve: selectSingleGenerated.resolver,
4653
+ extensions: {
4654
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: true, targetArg: "where" })
4655
+ }
4515
4656
  };
4516
4657
  if (aggregateGenerated && aggregateType) {
4517
4658
  queries[aggregateGenerated.name] = {
4518
4659
  type: new GraphQLNonNull5(aggregateType),
4519
4660
  args: aggregateGenerated.args,
4520
4661
  resolve: aggregateGenerated.resolver,
4521
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
4662
+ extensions: {
4663
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "aggregate", single: true, targetArg: "where" }),
4664
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
4665
+ }
4522
4666
  };
4523
4667
  }
4524
4668
  if (groupByGenerated && groupByType) {
@@ -4526,25 +4670,30 @@ var generateSchemaData = (db, schema, relations, options) => {
4526
4670
  type: new GraphQLNonNull5(new GraphQLList5(new GraphQLNonNull5(groupByType))),
4527
4671
  args: groupByGenerated.args,
4528
4672
  resolve: groupByGenerated.resolver,
4529
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
4673
+ extensions: {
4674
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "groupBy", single: false, targetArg: "where" }),
4675
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
4676
+ }
4530
4677
  };
4531
4678
  }
4532
- for (const generated of [
4533
- insertArrGenerated,
4534
- insertSingleGenerated,
4535
- upsertArrGenerated,
4536
- upsertSingleGenerated,
4537
- updateGenerated,
4538
- updateManyGenerated,
4539
- updateSingleGenerated,
4540
- deleteGenerated,
4541
- deleteSingleGenerated
4542
- ]) {
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) {
4543
4691
  if (generated) {
4544
4692
  mutations[generated.name] = {
4545
4693
  type: mutationReturnType,
4546
4694
  args: generated.args,
4547
- resolve: generated.resolver
4695
+ resolve: generated.resolver,
4696
+ extensions: { drizzle: drizzleMeta({ kind: "mutation", ...meta }) }
4548
4697
  };
4549
4698
  }
4550
4699
  }
@@ -5645,6 +5794,7 @@ function generateSchemaData2(db, schema, relations, options) {
5645
5794
  complexity,
5646
5795
  limits,
5647
5796
  docs: options.docs ?? {},
5797
+ primaryKeyOf: (name) => tables[name] ? pgPrimaryKeyPropNames(tables[name]) : [],
5648
5798
  featureOf
5649
5799
  };
5650
5800
  const nestedPlans = features.nestedWrites ? buildNestedWritePlans(
@@ -5683,6 +5833,7 @@ function generateSchemaData2(db, schema, relations, options) {
5683
5833
  const outputs = {};
5684
5834
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
5685
5835
  const tableFeatures = featureOf(tableName);
5836
+ const drizzleMeta = tableFieldExtensions(tableName, pgPrimaryKeyPropNames(schema[tableName]));
5686
5837
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
5687
5838
  const { selectSingleOutput, selectArrOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
5688
5839
  const {
@@ -5934,19 +6085,28 @@ function generateSchemaData2(db, schema, relations, options) {
5934
6085
  type: selectArrOutput,
5935
6086
  args: selectArrGenerated.args,
5936
6087
  resolve: selectArrGenerated.resolver,
5937
- ...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
+ }
5938
6092
  };
5939
6093
  queries[selectSingleGenerated.name] = {
5940
6094
  type: selectSingleOutput,
5941
6095
  args: selectSingleGenerated.args,
5942
- resolve: selectSingleGenerated.resolver
6096
+ resolve: selectSingleGenerated.resolver,
6097
+ extensions: {
6098
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: true, targetArg: "where" })
6099
+ }
5943
6100
  };
5944
6101
  if (aggregateGenerated && aggregateType) {
5945
6102
  queries[aggregateGenerated.name] = {
5946
6103
  type: new GraphQLNonNull7(aggregateType),
5947
6104
  args: aggregateGenerated.args,
5948
6105
  resolve: aggregateGenerated.resolver,
5949
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
6106
+ extensions: {
6107
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "aggregate", single: true, targetArg: "where" }),
6108
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
6109
+ }
5950
6110
  };
5951
6111
  }
5952
6112
  if (groupByGenerated && groupByType) {
@@ -5954,14 +6114,20 @@ function generateSchemaData2(db, schema, relations, options) {
5954
6114
  type: new GraphQLNonNull7(new GraphQLList7(new GraphQLNonNull7(groupByType))),
5955
6115
  args: groupByGenerated.args,
5956
6116
  resolve: groupByGenerated.resolver,
5957
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
6117
+ extensions: {
6118
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "groupBy", single: false, targetArg: "where" }),
6119
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
6120
+ }
5958
6121
  };
5959
6122
  }
5960
6123
  if (insertArrGenerated) {
5961
6124
  mutations[insertArrGenerated.name] = {
5962
6125
  type: arrTableItemOutput,
5963
6126
  args: insertArrGenerated.args,
5964
- resolve: insertArrGenerated.resolver
6127
+ resolve: insertArrGenerated.resolver,
6128
+ extensions: {
6129
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: false, targetArg: "values" })
6130
+ }
5965
6131
  };
5966
6132
  }
5967
6133
  if (insertSingleGenerated) {
@@ -5970,28 +6136,40 @@ function generateSchemaData2(db, schema, relations, options) {
5970
6136
  // `conflictDoNothing` swallowing the insert, so the field is nullable only there.
5971
6137
  type: conflictDoNothing ? singleTableItemOutput : new GraphQLNonNull7(singleTableItemOutput),
5972
6138
  args: insertSingleGenerated.args,
5973
- resolve: insertSingleGenerated.resolver
6139
+ resolve: insertSingleGenerated.resolver,
6140
+ extensions: {
6141
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: true, targetArg: "values" })
6142
+ }
5974
6143
  };
5975
6144
  }
5976
6145
  if (upsertArrGenerated) {
5977
6146
  mutations[upsertArrGenerated.name] = {
5978
6147
  type: arrTableItemOutput,
5979
6148
  args: upsertArrGenerated.args,
5980
- resolve: upsertArrGenerated.resolver
6149
+ resolve: upsertArrGenerated.resolver,
6150
+ extensions: {
6151
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: false, targetArg: "values" })
6152
+ }
5981
6153
  };
5982
6154
  }
5983
6155
  if (upsertSingleGenerated) {
5984
6156
  mutations[upsertSingleGenerated.name] = {
5985
6157
  type: singleTableItemOutput,
5986
6158
  args: upsertSingleGenerated.args,
5987
- resolve: upsertSingleGenerated.resolver
6159
+ resolve: upsertSingleGenerated.resolver,
6160
+ extensions: {
6161
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: true, targetArg: "values" })
6162
+ }
5988
6163
  };
5989
6164
  }
5990
6165
  if (updateGenerated) {
5991
6166
  mutations[updateGenerated.name] = {
5992
6167
  type: arrTableItemOutput,
5993
6168
  args: updateGenerated.args,
5994
- resolve: updateGenerated.resolver
6169
+ resolve: updateGenerated.resolver,
6170
+ extensions: {
6171
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: false, targetArg: "where" })
6172
+ }
5995
6173
  };
5996
6174
  }
5997
6175
  if (updateManyGenerated) {
@@ -5999,6 +6177,9 @@ function generateSchemaData2(db, schema, relations, options) {
5999
6177
  type: new GraphQLNonNull7(new GraphQLList7(singleTableItemOutput)),
6000
6178
  args: updateManyGenerated.args,
6001
6179
  resolve: updateManyGenerated.resolver,
6180
+ extensions: {
6181
+ drizzle: drizzleMeta({ kind: "mutation", operation: "updateMany", single: false, targetArg: "updates" })
6182
+ },
6002
6183
  // The nullable element is deliberate, and the reason this mutation's return type
6003
6184
  // differs from every sibling's: the result is aligned with the input, one slot per
6004
6185
  // entry, so an entry that matched nothing has to be able to say so.
@@ -6009,21 +6190,30 @@ function generateSchemaData2(db, schema, relations, options) {
6009
6190
  mutations[updateSingleGenerated.name] = {
6010
6191
  type: singleTableItemOutput,
6011
6192
  args: updateSingleGenerated.args,
6012
- resolve: updateSingleGenerated.resolver
6193
+ resolve: updateSingleGenerated.resolver,
6194
+ extensions: {
6195
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: true, targetArg: "where" })
6196
+ }
6013
6197
  };
6014
6198
  }
6015
6199
  if (deleteGenerated) {
6016
6200
  mutations[deleteGenerated.name] = {
6017
6201
  type: arrTableItemOutput,
6018
6202
  args: deleteGenerated.args,
6019
- resolve: deleteGenerated.resolver
6203
+ resolve: deleteGenerated.resolver,
6204
+ extensions: {
6205
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: false, targetArg: "where" })
6206
+ }
6020
6207
  };
6021
6208
  }
6022
6209
  if (deleteSingleGenerated) {
6023
6210
  mutations[deleteSingleGenerated.name] = {
6024
6211
  type: singleTableItemOutput,
6025
6212
  args: deleteSingleGenerated.args,
6026
- resolve: deleteSingleGenerated.resolver
6213
+ resolve: deleteSingleGenerated.resolver,
6214
+ extensions: {
6215
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: true, targetArg: "where" })
6216
+ }
6027
6217
  };
6028
6218
  }
6029
6219
  if (updateCountGenerated) {
@@ -6670,6 +6860,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6670
6860
  complexity,
6671
6861
  limits,
6672
6862
  docs: options.docs ?? {},
6863
+ primaryKeyOf: (name) => tables[name] ? sqlitePrimaryKeyPropNames(tables[name]) : [],
6673
6864
  featureOf
6674
6865
  };
6675
6866
  if (features.nestedWrites && db.resultKind === "sync") {
@@ -6718,6 +6909,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6718
6909
  const outputs = {};
6719
6910
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
6720
6911
  const tableFeatures = featureOf(tableName);
6912
+ const drizzleMeta = tableFieldExtensions(tableName, sqlitePrimaryKeyPropNames(schema[tableName]));
6721
6913
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
6722
6914
  const { selectSingleOutput, selectArrOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
6723
6915
  const {
@@ -6969,19 +7161,28 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6969
7161
  type: selectArrOutput,
6970
7162
  args: selectArrGenerated.args,
6971
7163
  resolve: selectArrGenerated.resolver,
6972
- ...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
+ }
6973
7168
  };
6974
7169
  queries[selectSingleGenerated.name] = {
6975
7170
  type: selectSingleOutput,
6976
7171
  args: selectSingleGenerated.args,
6977
- resolve: selectSingleGenerated.resolver
7172
+ resolve: selectSingleGenerated.resolver,
7173
+ extensions: {
7174
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: true, targetArg: "where" })
7175
+ }
6978
7176
  };
6979
7177
  if (aggregateGenerated && aggregateType) {
6980
7178
  queries[aggregateGenerated.name] = {
6981
7179
  type: new GraphQLNonNull8(aggregateType),
6982
7180
  args: aggregateGenerated.args,
6983
7181
  resolve: aggregateGenerated.resolver,
6984
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
7182
+ extensions: {
7183
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "aggregate", single: true, targetArg: "where" }),
7184
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
7185
+ }
6985
7186
  };
6986
7187
  }
6987
7188
  if (groupByGenerated && groupByType) {
@@ -6989,14 +7190,20 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6989
7190
  type: new GraphQLNonNull8(new GraphQLList8(new GraphQLNonNull8(groupByType))),
6990
7191
  args: groupByGenerated.args,
6991
7192
  resolve: groupByGenerated.resolver,
6992
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
7193
+ extensions: {
7194
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "groupBy", single: false, targetArg: "where" }),
7195
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
7196
+ }
6993
7197
  };
6994
7198
  }
6995
7199
  if (insertArrGenerated) {
6996
7200
  mutations[insertArrGenerated.name] = {
6997
7201
  type: arrTableItemOutput,
6998
7202
  args: insertArrGenerated.args,
6999
- resolve: insertArrGenerated.resolver
7203
+ resolve: insertArrGenerated.resolver,
7204
+ extensions: {
7205
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: false, targetArg: "values" })
7206
+ }
7000
7207
  };
7001
7208
  }
7002
7209
  if (insertSingleGenerated) {
@@ -7005,28 +7212,40 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7005
7212
  // `conflictDoNothing` swallowing the insert, so the field is nullable only there.
7006
7213
  type: conflictDoNothing ? singleTableItemOutput : new GraphQLNonNull8(singleTableItemOutput),
7007
7214
  args: insertSingleGenerated.args,
7008
- resolve: insertSingleGenerated.resolver
7215
+ resolve: insertSingleGenerated.resolver,
7216
+ extensions: {
7217
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: true, targetArg: "values" })
7218
+ }
7009
7219
  };
7010
7220
  }
7011
7221
  if (upsertArrGenerated) {
7012
7222
  mutations[upsertArrGenerated.name] = {
7013
7223
  type: arrTableItemOutput,
7014
7224
  args: upsertArrGenerated.args,
7015
- resolve: upsertArrGenerated.resolver
7225
+ resolve: upsertArrGenerated.resolver,
7226
+ extensions: {
7227
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: false, targetArg: "values" })
7228
+ }
7016
7229
  };
7017
7230
  }
7018
7231
  if (upsertSingleGenerated) {
7019
7232
  mutations[upsertSingleGenerated.name] = {
7020
7233
  type: singleTableItemOutput,
7021
7234
  args: upsertSingleGenerated.args,
7022
- resolve: upsertSingleGenerated.resolver
7235
+ resolve: upsertSingleGenerated.resolver,
7236
+ extensions: {
7237
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: true, targetArg: "values" })
7238
+ }
7023
7239
  };
7024
7240
  }
7025
7241
  if (updateGenerated) {
7026
7242
  mutations[updateGenerated.name] = {
7027
7243
  type: arrTableItemOutput,
7028
7244
  args: updateGenerated.args,
7029
- resolve: updateGenerated.resolver
7245
+ resolve: updateGenerated.resolver,
7246
+ extensions: {
7247
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: false, targetArg: "where" })
7248
+ }
7030
7249
  };
7031
7250
  }
7032
7251
  if (updateManyGenerated) {
@@ -7034,6 +7253,9 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7034
7253
  type: new GraphQLNonNull8(new GraphQLList8(singleTableItemOutput)),
7035
7254
  args: updateManyGenerated.args,
7036
7255
  resolve: updateManyGenerated.resolver,
7256
+ extensions: {
7257
+ drizzle: drizzleMeta({ kind: "mutation", operation: "updateMany", single: false, targetArg: "updates" })
7258
+ },
7037
7259
  // The nullable element is deliberate, and the reason this mutation's return type
7038
7260
  // differs from every sibling's: the result is aligned with the input, one slot per
7039
7261
  // entry, so an entry that matched nothing has to be able to say so.
@@ -7044,21 +7266,30 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7044
7266
  mutations[updateSingleGenerated.name] = {
7045
7267
  type: singleTableItemOutput,
7046
7268
  args: updateSingleGenerated.args,
7047
- resolve: updateSingleGenerated.resolver
7269
+ resolve: updateSingleGenerated.resolver,
7270
+ extensions: {
7271
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: true, targetArg: "where" })
7272
+ }
7048
7273
  };
7049
7274
  }
7050
7275
  if (deleteGenerated) {
7051
7276
  mutations[deleteGenerated.name] = {
7052
7277
  type: arrTableItemOutput,
7053
7278
  args: deleteGenerated.args,
7054
- resolve: deleteGenerated.resolver
7279
+ resolve: deleteGenerated.resolver,
7280
+ extensions: {
7281
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: false, targetArg: "where" })
7282
+ }
7055
7283
  };
7056
7284
  }
7057
7285
  if (deleteSingleGenerated) {
7058
7286
  mutations[deleteSingleGenerated.name] = {
7059
7287
  type: singleTableItemOutput,
7060
7288
  args: deleteSingleGenerated.args,
7061
- resolve: deleteSingleGenerated.resolver
7289
+ resolve: deleteSingleGenerated.resolver,
7290
+ extensions: {
7291
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: true, targetArg: "where" })
7292
+ }
7062
7293
  };
7063
7294
  }
7064
7295
  if (updateCountGenerated) {
@@ -7121,6 +7352,141 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7121
7352
  return { queries, mutations, inputs, types: outputs, fieldResolvers };
7122
7353
  };
7123
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
+
7124
7490
  // src/index.ts
7125
7491
  var buildSchema = (db, config) => {
7126
7492
  const relations = db._.relations;
@@ -7143,7 +7509,7 @@ var buildSchema = (db, config) => {
7143
7509
  single: config?.suffixes?.single ?? "Single"
7144
7510
  };
7145
7511
  const typeNameMapper = config?.typeNameMapper === "singularize" ? singularizeMapper : config?.typeNameMapper;
7146
- const tableKeys = Object.entries(schema).filter(([, value]) => is8(value, Table)).map(([key]) => key);
7512
+ const tableKeys = Object.entries(schema).filter(([, value]) => is9(value, Table2)).map(([key]) => key);
7147
7513
  const excludedTableNames = new Set(config?.exclude?.tables ?? []);
7148
7514
  const featureTables = tableKeys.filter((key) => !excludedTableNames.has(key));
7149
7515
  const forTable = resolveTableFeatures(config?.features);
@@ -7307,11 +7673,11 @@ var buildSchema = (db, config) => {
7307
7673
  }
7308
7674
  };
7309
7675
  let generatorOutput;
7310
- if (is8(db, MySqlDatabase)) {
7676
+ if (is9(db, MySqlDatabase2)) {
7311
7677
  generatorOutput = generateSchemaData(db, schema, relations, generatorOptions);
7312
- } else if (is8(db, PgAsyncDatabase)) {
7678
+ } else if (is9(db, PgAsyncDatabase2)) {
7313
7679
  generatorOutput = generateSchemaData2(db, schema, relations, generatorOptions);
7314
- } else if (is8(db, BaseSQLiteDatabase)) {
7680
+ } else if (is9(db, BaseSQLiteDatabase2)) {
7315
7681
  generatorOutput = generateSchemaData3(db, schema, relations, generatorOptions);
7316
7682
  } else {
7317
7683
  throw new Error("Drizzle-GraphQL Error: Unknown database instance type");
@@ -7350,9 +7716,14 @@ export {
7350
7716
  createRelationResolverFactory,
7351
7717
  defaultErrorMapper,
7352
7718
  drizzleExecutorKey,
7719
+ drizzleExtension,
7353
7720
  extractFilters,
7354
7721
  extractOrderBy,
7355
7722
  extractRelationJoinColumns,
7723
+ identifyRows,
7724
+ isDrizzleFieldExtension,
7725
+ resolveSelection,
7726
+ selectionToWith,
7356
7727
  singularizeMapper
7357
7728
  };
7358
7729
  //# sourceMappingURL=index.js.map