@vantreeseba/drizzle-graphql 12.0.0 → 12.0.1

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
@@ -6506,6 +6506,72 @@ const createSchemaBuilder = (adapter) => {
6506
6506
  havingInput
6507
6507
  };
6508
6508
  };
6509
+ /**
6510
+ * The per-table loop, run once for every table the build covers.
6511
+ *
6512
+ * The dialect's callback receives the values the loop has already worked out — the feature
6513
+ * flags, the extension factory, the field names, the table's generated types and its
6514
+ * soft-delete config — and answers with the mutations it generated. Registering them, and
6515
+ * registering the inputs and outputs those mutations reference, happens here: both sides
6516
+ * did it identically, down to the `description` strings on the count mutations, so a gate
6517
+ * changed on one side and forgotten on the other used to be a silent dialect divergence.
6518
+ *
6519
+ * What stays in the dialect is what genuinely differs — which generators run, what each
6520
+ * mutation returns, and (on MySQL) that a write cannot report the rows it touched.
6521
+ */
6522
+ const forEachTable = (ctx, perTable) => {
6523
+ const { schema, featureOf, softDeleteOf, typeNameMapper, gqlSchemaTypes, mutations, inputs, outputs } = ctx;
6524
+ const { prefixes, suffixes } = ctx.options;
6525
+ for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
6526
+ const tableFeatures = featureOf(tableName);
6527
+ const drizzleMeta = tableFieldExtensions(tableName, primaryKeyPropNames(schema[tableName]));
6528
+ const names = computeResolverFieldNames(tableName, typeNameMapper, prefixes, suffixes);
6529
+ const softDeleteInfo = softDeleteOf?.(tableName);
6530
+ const readTypes = addReadFields(ctx, tableName, names, tableTypes, drizzleMeta);
6531
+ const built = perTable({
6532
+ tableName,
6533
+ table: schema[tableName],
6534
+ tableFeatures,
6535
+ drizzleMeta,
6536
+ names,
6537
+ types: tableTypes,
6538
+ softDeleteInfo
6539
+ });
6540
+ for (const { generated, type, meta, description } of built.mutations) if (generated) defineRootField(mutations, "mutation", generated.name, {
6541
+ type,
6542
+ args: generated.args,
6543
+ resolve: generated.resolver,
6544
+ ...meta ? { extensions: { drizzle: drizzleMeta({
6545
+ kind: "mutation",
6546
+ ...meta
6547
+ }) } } : {},
6548
+ ...description ? { description } : {}
6549
+ });
6550
+ const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
6551
+ [
6552
+ ...tableFeatures.insert || built.onConflictInput ? [insertInput] : [],
6553
+ ...built.onConflictInput ? [built.onConflictInput] : [],
6554
+ ...tableFeatures.update ? [updateInput] : [],
6555
+ ...built.updateManyInput ? [built.updateManyInput] : [],
6556
+ tableFilters,
6557
+ tableOrder
6558
+ ].forEach((e) => {
6559
+ inputs[e.name] = e;
6560
+ });
6561
+ const { selectSingleOutput } = tableTypes.outputs;
6562
+ outputs[selectSingleOutput.name] = selectSingleOutput;
6563
+ if (adapter.returnsRows) {
6564
+ const { singleTableItemOutput } = tableTypes.outputs;
6565
+ outputs[singleTableItemOutput.name] = singleTableItemOutput;
6566
+ }
6567
+ const { aggregateType, groupByType, havingInput } = readTypes;
6568
+ if (aggregateType) outputs[aggregateType.name] = aggregateType;
6569
+ if (groupByType && havingInput) {
6570
+ outputs[groupByType.name] = groupByType;
6571
+ inputs[havingInput.name] = havingInput;
6572
+ }
6573
+ }
6574
+ };
6509
6575
  /** The relation field resolvers and the transaction roster, once every root field exists. */
6510
6576
  const finalizeBuild = (ctx) => {
6511
6577
  if (ctx.mutationTxCtx) for (const name of Object.keys(ctx.mutations)) ctx.mutationTxCtx.fieldNames.add(name);
@@ -6536,7 +6602,7 @@ const createSchemaBuilder = (adapter) => {
6536
6602
  primaryKeyPropNames,
6537
6603
  uniqueColumnSets,
6538
6604
  prepareBuild,
6539
- addReadFields,
6605
+ forEachTable,
6540
6606
  finalizeBuild
6541
6607
  };
6542
6608
  };
@@ -6745,7 +6811,7 @@ const generateDelete = (db, tableName, table, filterArgs, fieldName, single, req
6745
6811
  const getTableConfig$5 = memoizeTableConfig(getTableConfig);
6746
6812
  /** Primary-key property names for a MySQL table, including table-level composite keys. */
6747
6813
  const mysqlPrimaryKeyPropNames = (table) => getPrimaryKeyPropNamesFromConfig(table, getTableConfig$5);
6748
- const { prepareBuild, addReadFields, finalizeBuild } = createSchemaBuilder({
6814
+ const { prepareBuild, forEachTable, finalizeBuild } = createSchemaBuilder({
6749
6815
  tableClass: MySqlTable,
6750
6816
  getTableConfig: getTableConfig$5,
6751
6817
  primaryKeyPropNames: mysqlPrimaryKeyPropNames,
@@ -6756,9 +6822,9 @@ const { prepareBuild, addReadFields, finalizeBuild } = createSchemaBuilder({
6756
6822
  }
6757
6823
  });
6758
6824
  const generateSchemaData$2 = (db, schema, relations, options) => {
6759
- const { prefixes, suffixes, typeNameMapper } = options;
6825
+ const { prefixes } = options;
6760
6826
  const ctx = prepareBuild(db, schema, relations, options);
6761
- const { featureOf, anyTable, filterCtx, policies, softDeleteOf, cacheCtx, mutationTxCtx, gqlSchemaTypes, mutations, inputs, outputs } = ctx;
6827
+ const { anyTable, filterCtx, policies, cacheCtx, mutationTxCtx, outputs } = ctx;
6762
6828
  const mutationReturnType = new GraphQLObjectType({
6763
6829
  name: cacheCtx.typeName({
6764
6830
  kind: "shared",
@@ -6772,15 +6838,9 @@ const generateSchemaData$2 = (db, schema, relations, options) => {
6772
6838
  "update",
6773
6839
  "delete"
6774
6840
  ].some((feature) => anyTable(feature))) outputs["MutationReturn"] = mutationReturnType;
6775
- for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
6776
- const tableFeatures = featureOf(tableName);
6777
- const drizzleMeta = tableFieldExtensions(tableName, mysqlPrimaryKeyPropNames(schema[tableName]));
6778
- const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
6779
- const { selectSingleOutput } = tableTypes.outputs;
6780
- const names = computeResolverFieldNames(tableName, typeNameMapper, prefixes, suffixes);
6841
+ forEachTable(ctx, ({ tableName, tableFeatures, names, types, softDeleteInfo }) => {
6842
+ const { insertInput, updateInput, tableFilters } = types.inputs;
6781
6843
  const { typeName, createArrayFieldName, createSingleFieldName, upsertArrayFieldName, upsertSingleFieldName, updateFieldName, updateManyFieldName, updateSingleFieldName, updateCountFieldName, deleteFieldName, deleteSingleFieldName, restoreFieldName, restoreSingleFieldName, deleteCountFieldName } = names;
6782
- const softDeleteInfo = softDeleteOf?.(tableName);
6783
- const { aggregateType, groupByType, havingInput } = addReadFields(ctx, tableName, names, tableTypes, drizzleMeta);
6784
6844
  const insertArrGenerated = tableFeatures.insert ? generateInsertArray(db, tableName, schema[tableName], insertInput, createArrayFieldName, mutationTxCtx, policies) : void 0;
6785
6845
  const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle(db, tableName, schema[tableName], insertInput, createSingleFieldName, mutationTxCtx, policies) : void 0;
6786
6846
  const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
@@ -6833,103 +6893,85 @@ const generateSchemaData$2 = (db, schema, relations, options) => {
6833
6893
  txCtx: mutationTxCtx
6834
6894
  }) : void 0;
6835
6895
  const hardDeleteMeta = softDeleteInfo?.hardDelete ? { hardDelete: true } : {};
6836
- const generatedMutations = [
6837
- [insertArrGenerated, {
6838
- operation: "insert",
6839
- single: false,
6840
- targetArg: "values"
6841
- }],
6842
- [insertSingleGenerated, {
6843
- operation: "insert",
6844
- single: true,
6845
- targetArg: "values"
6846
- }],
6847
- [upsertArrGenerated, {
6848
- operation: "upsert",
6849
- single: false,
6850
- targetArg: "values"
6851
- }],
6852
- [upsertSingleGenerated, {
6853
- operation: "upsert",
6854
- single: true,
6855
- targetArg: "values"
6856
- }],
6857
- [updateGenerated, {
6858
- operation: "update",
6859
- single: false,
6860
- targetArg: "where"
6861
- }],
6862
- [updateManyGenerated, {
6863
- operation: "updateMany",
6864
- single: false,
6865
- targetArg: "updates"
6866
- }],
6867
- [updateSingleGenerated, {
6868
- operation: "update",
6869
- single: true,
6870
- targetArg: "where"
6871
- }],
6872
- [deleteGenerated, {
6873
- operation: "delete",
6874
- single: false,
6875
- targetArg: "where",
6876
- ...hardDeleteMeta
6877
- }],
6878
- [deleteSingleGenerated, {
6879
- operation: "delete",
6880
- single: true,
6881
- targetArg: "where",
6882
- ...hardDeleteMeta
6883
- }],
6884
- [restoreGenerated, {
6885
- operation: "restore",
6886
- single: false,
6887
- targetArg: "where"
6888
- }],
6889
- [restoreSingleGenerated, {
6890
- operation: "restore",
6891
- single: true,
6892
- targetArg: "where"
6893
- }]
6894
- ];
6895
- for (const [generated, meta] of generatedMutations) if (generated) defineRootField(mutations, "mutation", generated.name, {
6896
+ const withMeta = (generated, meta) => ({
6897
+ generated,
6896
6898
  type: mutationReturnType,
6897
- args: generated.args,
6898
- resolve: generated.resolver,
6899
- extensions: { drizzle: drizzleMeta({
6900
- kind: "mutation",
6901
- ...meta
6902
- }) }
6903
- });
6904
- if (updateCountGenerated) defineRootField(mutations, "mutation", updateCountGenerated.name, {
6905
- type: new GraphQLNonNull(GraphQLInt),
6906
- args: updateCountGenerated.args,
6907
- resolve: updateCountGenerated.resolver,
6908
- description: "How many rows the update touched. The rows themselves are not read back, which is the point of this mutation."
6909
- });
6910
- if (deleteCountGenerated) defineRootField(mutations, "mutation", deleteCountGenerated.name, {
6911
- type: new GraphQLNonNull(GraphQLInt),
6912
- args: deleteCountGenerated.args,
6913
- resolve: deleteCountGenerated.resolver,
6914
- description: "How many rows the delete removed. The rows themselves are not read back, which is the point of this mutation."
6899
+ meta
6915
6900
  });
6916
- [
6917
- ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
6918
- ...onConflictInput ? [onConflictInput] : [],
6919
- ...tableFeatures.update ? [updateInput] : [],
6920
- ...updateManyInput ? [updateManyInput] : [],
6921
- tableFilters,
6922
- tableOrder
6923
- ].forEach((e) => {
6924
- inputs[e.name] = e;
6925
- });
6926
- outputs[selectSingleOutput.name] = selectSingleOutput;
6927
- if (aggregateType) outputs[aggregateType.name] = aggregateType;
6928
- if (groupByType && havingInput) {
6929
- outputs[groupByType.name] = groupByType;
6930
- inputs[havingInput.name] = havingInput;
6931
- }
6932
- }
6901
+ return {
6902
+ mutations: [
6903
+ withMeta(insertArrGenerated, {
6904
+ operation: "insert",
6905
+ single: false,
6906
+ targetArg: "values"
6907
+ }),
6908
+ withMeta(insertSingleGenerated, {
6909
+ operation: "insert",
6910
+ single: true,
6911
+ targetArg: "values"
6912
+ }),
6913
+ withMeta(upsertArrGenerated, {
6914
+ operation: "upsert",
6915
+ single: false,
6916
+ targetArg: "values"
6917
+ }),
6918
+ withMeta(upsertSingleGenerated, {
6919
+ operation: "upsert",
6920
+ single: true,
6921
+ targetArg: "values"
6922
+ }),
6923
+ withMeta(updateGenerated, {
6924
+ operation: "update",
6925
+ single: false,
6926
+ targetArg: "where"
6927
+ }),
6928
+ withMeta(updateManyGenerated, {
6929
+ operation: "updateMany",
6930
+ single: false,
6931
+ targetArg: "updates"
6932
+ }),
6933
+ withMeta(updateSingleGenerated, {
6934
+ operation: "update",
6935
+ single: true,
6936
+ targetArg: "where"
6937
+ }),
6938
+ withMeta(deleteGenerated, {
6939
+ operation: "delete",
6940
+ single: false,
6941
+ targetArg: "where",
6942
+ ...hardDeleteMeta
6943
+ }),
6944
+ withMeta(deleteSingleGenerated, {
6945
+ operation: "delete",
6946
+ single: true,
6947
+ targetArg: "where",
6948
+ ...hardDeleteMeta
6949
+ }),
6950
+ withMeta(restoreGenerated, {
6951
+ operation: "restore",
6952
+ single: false,
6953
+ targetArg: "where"
6954
+ }),
6955
+ withMeta(restoreSingleGenerated, {
6956
+ operation: "restore",
6957
+ single: true,
6958
+ targetArg: "where"
6959
+ }),
6960
+ {
6961
+ generated: updateCountGenerated,
6962
+ type: new GraphQLNonNull(GraphQLInt),
6963
+ description: "How many rows the update touched. The rows themselves are not read back, which is the point of this mutation."
6964
+ },
6965
+ {
6966
+ generated: deleteCountGenerated,
6967
+ type: new GraphQLNonNull(GraphQLInt),
6968
+ description: "How many rows the delete removed. The rows themselves are not read back, which is the point of this mutation."
6969
+ }
6970
+ ],
6971
+ onConflictInput,
6972
+ updateManyInput
6973
+ };
6974
+ });
6933
6975
  return finalizeBuild(ctx);
6934
6976
  };
6935
6977
  //#endregion
@@ -6939,26 +6981,36 @@ const generateSchemaData$2 = (db, schema, relations, options) => {
6939
6981
  * result, so the generator call sites read exactly as they did when the functions were local.
6940
6982
  */
6941
6983
  const buildWriteResolvers = (primaryKeyPropNames) => {
6942
- const generateInsertArray = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits, policies, resolveName) => {
6943
- const queryArgs = { values: { type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(baseType))) } };
6984
+ /**
6985
+ * `insert<Table>` / `insert<Table>Single` — one generator for both shapes, the way
6986
+ * {@link generateUpsert} handles its pair. `single` decides the argument type, whether the
6987
+ * result is remapped as a row or a list, and whether an empty return is an error; the write
6988
+ * itself is the same multi-row statement either way, with the single variant supplying a
6989
+ * one-element list.
6990
+ */
6991
+ const generateInsert = (build, opts) => {
6992
+ const { db, tables, relationMap, typeNameMapper, txCtx, nested, limits, policies, resolveName } = build;
6993
+ const { tableName, table, baseType, fieldName, typeName, single, conflictDoNothing = false } = opts;
6994
+ const queryArgs = { values: { type: single ? new GraphQLNonNull(baseType) : new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(baseType))) } };
6944
6995
  const pkNames = primaryKeyPropNames(table);
6945
6996
  return writeResolver({
6946
6997
  db,
6947
6998
  tableName,
6948
6999
  operation: "insert",
6949
- single: false,
7000
+ single,
6950
7001
  fieldName,
6951
7002
  txCtx,
6952
7003
  policies,
6953
7004
  args: queryArgs,
6954
7005
  run: async ({ executor, args, context, info, before, after }) => {
6955
- if (!args.values.length) throw drizzleError("No values were provided!", { code: "DRIZZLE_NO_VALUES" });
7006
+ const supplied = single ? [args.values] : args.values;
7007
+ if (!supplied.length) throw drizzleError("No values were provided!", { code: "DRIZZLE_NO_VALUES" });
6956
7008
  await before();
6957
- const entries = nested?.enabled(tableName) ? args.values.map((values) => nested.split(tableName, values)) : void 0;
7009
+ const entries = nested?.enabled(tableName) ? supplied.map((values) => nested.split(tableName, values)) : void 0;
6958
7010
  const nestedEntries = entries?.some((entry) => nested.hasOps(entry.ops)) ? entries : void 0;
6959
7011
  const contextColumns = policies?.contextValues?.(tableName);
6960
7012
  const scope = policies?.scope?.(context);
6961
- const input = nestedEntries ? [] : applyContextValuesAll(remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : args.values, table), contextColumns, context);
7013
+ const input = nestedEntries ? [] : applyContextValuesAll(remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : supplied, table), contextColumns, context);
6962
7014
  const { columns, hasRelations, withParams } = mutationSelection(info, {
6963
7015
  relationMap,
6964
7016
  tables,
@@ -6988,65 +7040,12 @@ const buildWriteResolvers = (primaryKeyPropNames) => {
6988
7040
  context
6989
7041
  }) : await runInsert(executor, input);
6990
7042
  await after(result);
6991
- const enriched = await withEagerRelations(executor, tableName, result, pkNames, withParams, hasRelations);
6992
- return remapToGraphQLArrayOutput(enriched, tableName, table, relationMap);
6993
- }
6994
- });
6995
- };
6996
- const generateInsertSingle = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits, policies, resolveName) => {
6997
- const queryArgs = { values: { type: new GraphQLNonNull(baseType) } };
6998
- const pkNames = primaryKeyPropNames(table);
6999
- return writeResolver({
7000
- db,
7001
- tableName,
7002
- operation: "insert",
7003
- single: true,
7004
- fieldName,
7005
- txCtx,
7006
- policies,
7007
- args: queryArgs,
7008
- run: async ({ executor, args, context, info, before, after }) => {
7009
- await before();
7010
- const entry = nested?.enabled(tableName) ? nested.split(tableName, args.values) : void 0;
7011
- const nestedEntry = entry && nested.hasOps(entry.ops) ? entry : void 0;
7012
- const contextColumns = policies?.contextValues?.(tableName);
7013
- const scope = policies?.scope?.(context);
7014
- const input = nestedEntry ? {} : applyContextValues(remapFromGraphQLSingleInput(entry ? entry.columns : args.values, table), contextColumns, context);
7015
- const { columns, hasRelations, withParams } = mutationSelection(info, {
7016
- relationMap,
7017
- tables,
7018
- tableName,
7019
- typeName,
7020
- typeNameMapper,
7021
- resolveName,
7022
- table,
7023
- pkNames,
7024
- limits,
7025
- scope,
7026
- defaultOrderBy: policies?.defaultOrderBy
7027
- });
7028
- const returning = nestedEntry ? nested.withJoinColumns(tableName, nestedEntry.ops, { ...columns }, table) : columns;
7029
- const runInsert = async (target, values) => {
7030
- let query = target.insert(table).values(values).returning(returning);
7031
- if (conflictDoNothing) query = query.onConflictDoNothing();
7032
- return await query;
7033
- };
7034
- const result = nestedEntry ? await writeWithNestedOps({
7035
- executor,
7036
- runtime: nested,
7037
- tableName,
7038
- entries: [nestedEntry],
7039
- remapValues: (values) => applyContextValues(remapFromGraphQLSingleInput(values, table), contextColumns, context),
7040
- write: runInsert,
7041
- context
7042
- }) : await runInsert(executor, input);
7043
- await after(result);
7044
- if (!result[0]) {
7043
+ if (single && !result[0]) {
7045
7044
  if (!conflictDoNothing) throw drizzleError("The insert returned no row.", { code: "DRIZZLE_NO_ROW_RETURNED" });
7046
7045
  return;
7047
7046
  }
7048
7047
  const enriched = await withEagerRelations(executor, tableName, result, pkNames, withParams, hasRelations);
7049
- return remapToGraphQLSingleOutput(enriched[0], tableName, table, relationMap);
7048
+ return single ? remapToGraphQLSingleOutput(enriched[0], tableName, table, relationMap) : remapToGraphQLArrayOutput(enriched, tableName, table, relationMap);
7050
7049
  }
7051
7050
  });
7052
7051
  };
@@ -7056,7 +7055,9 @@ const buildWriteResolvers = (primaryKeyPropNames) => {
7056
7055
  *
7057
7056
  * Shares the insert input: an upsert supplies a whole row, same as a create.
7058
7057
  */
7059
- const generateUpsert = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested, limits, policies, resolveName) => {
7058
+ const generateUpsert = (build, opts) => {
7059
+ const { db, tables, relationMap, typeNameMapper, filterCtx, txCtx, nested, limits, policies, resolveName } = build;
7060
+ const { tableName, table, baseType, onConflictType, uniqueSets, fieldName, typeName, single } = opts;
7060
7061
  const queryArgs = {
7061
7062
  values: { type: single ? new GraphQLNonNull(baseType) : new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(baseType))) },
7062
7063
  onConflict: {
@@ -7133,7 +7134,9 @@ const buildWriteResolvers = (primaryKeyPropNames) => {
7133
7134
  }
7134
7135
  });
7135
7136
  };
7136
- const generateUpdate = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested, limits, policies, resolveName) => {
7137
+ const generateUpdate = (build, opts) => {
7138
+ const { db, tables, relationMap, typeNameMapper, filterCtx, txCtx, nested, limits, policies, resolveName } = build;
7139
+ const { tableName, table, setArgs, filterArgs, fieldName, typeName, single, requireWhere } = opts;
7137
7140
  const queryArgs = {
7138
7141
  set: { type: new GraphQLNonNull(setArgs) },
7139
7142
  where: { type: single || requireWhere ? new GraphQLNonNull(filterArgs) : filterArgs }
@@ -7216,7 +7219,10 @@ const buildWriteResolvers = (primaryKeyPropNames) => {
7216
7219
  * `DELETE` — emptying the trash, reclaiming a unique key. It reads at `INCLUDE`, since the
7217
7220
  * rows it mostly exists to remove are the ones already marked; a `scope` still confines it.
7218
7221
  */
7219
- const generateDelete = (db, tableName, table, filterArgs, fieldName, typeName, single, requireWhere, filterCtx, selectionCtx, txCtx, policies, restore = false, resolveName) => {
7222
+ const generateDelete = (build, opts) => {
7223
+ const { db, filterCtx, txCtx, policies, resolveName } = build;
7224
+ const { tableName, table, filterArgs, fieldName, typeName, single, requireWhere, selectionCtx } = opts;
7225
+ const restore = opts.restore ?? false;
7220
7226
  const softDelete = policies?.softDelete?.(tableName);
7221
7227
  const operation = restore ? "restore" : "delete";
7222
7228
  const canHardDelete = !restore && softDelete?.hardDelete === true;
@@ -7263,8 +7269,7 @@ const buildWriteResolvers = (primaryKeyPropNames) => {
7263
7269
  });
7264
7270
  };
7265
7271
  return {
7266
- generateInsertArray,
7267
- generateInsertSingle,
7272
+ generateInsert,
7268
7273
  generateUpsert,
7269
7274
  generateUpdate,
7270
7275
  generateDelete
@@ -7281,23 +7286,46 @@ const buildWriteResolvers = (primaryKeyPropNames) => {
7281
7286
  const createSchemaDataGenerator = (adapter) => {
7282
7287
  const primaryKeyPropNames = adapter.primaryKeyPropNames;
7283
7288
  const uniqueColumnSets = (table) => getUniqueColumnSets(table, adapter.getTableConfig);
7284
- const { generateInsertArray, generateInsertSingle, generateUpsert, generateUpdate, generateDelete } = buildWriteResolvers(primaryKeyPropNames);
7285
- const { prepareBuild, addReadFields, finalizeBuild } = createSchemaBuilder(adapter);
7289
+ const { generateInsert, generateUpsert, generateUpdate, generateDelete } = buildWriteResolvers(primaryKeyPropNames);
7290
+ const { prepareBuild, forEachTable, finalizeBuild } = createSchemaBuilder(adapter);
7286
7291
  return (db, schema, relations, options) => {
7287
- const { prefixes, suffixes, conflictDoNothing, typeNameMapper, limits } = options;
7292
+ const { prefixes, conflictDoNothing, typeNameMapper, limits } = options;
7288
7293
  const ctx = prepareBuild(db, schema, relations, options);
7289
- const { tables, featureOf, eagerRelations, filterCtx, policies, softDeleteOf, namedRelations, cacheCtx, nestedRuntime, mutationTxCtx, gqlSchemaTypes, mutations, inputs, outputs } = ctx;
7290
- for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
7291
- const tableFeatures = featureOf(tableName);
7292
- const drizzleMeta = tableFieldExtensions(tableName, primaryKeyPropNames(schema[tableName]));
7293
- const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
7294
- const { selectSingleOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
7295
- const names = computeResolverFieldNames(tableName, typeNameMapper, prefixes, suffixes);
7294
+ const { tables, eagerRelations, filterCtx, policies, namedRelations, cacheCtx, nestedRuntime, mutationTxCtx } = ctx;
7295
+ const writeBuild = {
7296
+ db,
7297
+ tables,
7298
+ relationMap: eagerRelations,
7299
+ typeNameMapper,
7300
+ filterCtx,
7301
+ txCtx: mutationTxCtx,
7302
+ nested: nestedRuntime,
7303
+ limits,
7304
+ policies,
7305
+ resolveName: cacheCtx.typeName
7306
+ };
7307
+ forEachTable(ctx, ({ tableName, tableFeatures, names, types, softDeleteInfo }) => {
7308
+ const { insertInput, updateInput, tableFilters } = types.inputs;
7309
+ const { singleTableItemOutput, arrTableItemOutput } = types.outputs;
7296
7310
  const { typeName, createArrayFieldName, createSingleFieldName, upsertArrayFieldName, upsertSingleFieldName, updateFieldName, updateManyFieldName, updateSingleFieldName, updateCountFieldName, deleteFieldName, deleteSingleFieldName, restoreFieldName, restoreSingleFieldName, deleteCountFieldName } = names;
7297
- const softDeleteInfo = softDeleteOf?.(tableName);
7298
- const { aggregateType, groupByType, havingInput } = addReadFields(ctx, tableName, names, tableTypes, drizzleMeta);
7299
- const insertArrGenerated = tableFeatures.insert ? generateInsertArray(db, tableName, schema[tableName], tables, eagerRelations, insertInput, createArrayFieldName, typeName, typeNameMapper, conflictDoNothing, mutationTxCtx, nestedRuntime, limits, policies, cacheCtx.typeName) : void 0;
7300
- const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle(db, tableName, schema[tableName], tables, eagerRelations, insertInput, createSingleFieldName, typeName, typeNameMapper, conflictDoNothing, mutationTxCtx, nestedRuntime, limits, policies, cacheCtx.typeName) : void 0;
7311
+ const insertArrGenerated = tableFeatures.insert ? generateInsert(writeBuild, {
7312
+ tableName,
7313
+ table: schema[tableName],
7314
+ baseType: insertInput,
7315
+ fieldName: createArrayFieldName,
7316
+ typeName,
7317
+ single: false,
7318
+ conflictDoNothing
7319
+ }) : void 0;
7320
+ const insertSingleGenerated = tableFeatures.insert ? generateInsert(writeBuild, {
7321
+ tableName,
7322
+ table: schema[tableName],
7323
+ baseType: insertInput,
7324
+ fieldName: createSingleFieldName,
7325
+ typeName,
7326
+ single: true,
7327
+ conflictDoNothing
7328
+ }) : void 0;
7301
7329
  const uniqueSets = tableFeatures.upsert ? uniqueColumnSets(schema[tableName]) : [];
7302
7330
  const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
7303
7331
  table: schema[tableName],
@@ -7308,10 +7336,46 @@ const createSchemaDataGenerator = (adapter) => {
7308
7336
  withTarget: true,
7309
7337
  cacheCtx
7310
7338
  }) : void 0;
7311
- const upsertArrGenerated = onConflictInput ? generateUpsert(db, tableName, schema[tableName], tables, eagerRelations, insertInput, onConflictInput, uniqueSets, upsertArrayFieldName, typeName, false, typeNameMapper, filterCtx, mutationTxCtx, nestedRuntime, limits, policies, cacheCtx.typeName) : void 0;
7312
- const upsertSingleGenerated = onConflictInput ? generateUpsert(db, tableName, schema[tableName], tables, eagerRelations, insertInput, onConflictInput, uniqueSets, upsertSingleFieldName, typeName, true, typeNameMapper, filterCtx, mutationTxCtx, nestedRuntime, limits, policies, cacheCtx.typeName) : void 0;
7313
- const updateGenerated = tableFeatures.update ? generateUpdate(db, tableName, schema[tableName], tables, eagerRelations, updateInput, tableFilters, updateFieldName, typeName, false, tableFeatures.requireWhere, typeNameMapper, filterCtx, mutationTxCtx, nestedRuntime, limits, policies, cacheCtx.typeName) : void 0;
7314
- const updateSingleGenerated = tableFeatures.update ? generateUpdate(db, tableName, schema[tableName], tables, eagerRelations, updateInput, tableFilters, updateSingleFieldName, typeName, true, tableFeatures.requireWhere, typeNameMapper, filterCtx, mutationTxCtx, nestedRuntime, limits, policies, cacheCtx.typeName) : void 0;
7339
+ const upsertArrGenerated = onConflictInput ? generateUpsert(writeBuild, {
7340
+ tableName,
7341
+ table: schema[tableName],
7342
+ baseType: insertInput,
7343
+ onConflictType: onConflictInput,
7344
+ uniqueSets,
7345
+ fieldName: upsertArrayFieldName,
7346
+ typeName,
7347
+ single: false
7348
+ }) : void 0;
7349
+ const upsertSingleGenerated = onConflictInput ? generateUpsert(writeBuild, {
7350
+ tableName,
7351
+ table: schema[tableName],
7352
+ baseType: insertInput,
7353
+ onConflictType: onConflictInput,
7354
+ uniqueSets,
7355
+ fieldName: upsertSingleFieldName,
7356
+ typeName,
7357
+ single: true
7358
+ }) : void 0;
7359
+ const updateGenerated = tableFeatures.update ? generateUpdate(writeBuild, {
7360
+ tableName,
7361
+ table: schema[tableName],
7362
+ setArgs: updateInput,
7363
+ filterArgs: tableFilters,
7364
+ fieldName: updateFieldName,
7365
+ typeName,
7366
+ single: false,
7367
+ requireWhere: tableFeatures.requireWhere
7368
+ }) : void 0;
7369
+ const updateSingleGenerated = tableFeatures.update ? generateUpdate(writeBuild, {
7370
+ tableName,
7371
+ table: schema[tableName],
7372
+ setArgs: updateInput,
7373
+ filterArgs: tableFilters,
7374
+ fieldName: updateSingleFieldName,
7375
+ typeName,
7376
+ single: true,
7377
+ requireWhere: tableFeatures.requireWhere
7378
+ }) : void 0;
7315
7379
  const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({
7316
7380
  tableName,
7317
7381
  typeName,
@@ -7320,27 +7384,73 @@ const createSchemaDataGenerator = (adapter) => {
7320
7384
  tableFilters,
7321
7385
  cacheCtx
7322
7386
  }) : void 0;
7323
- const updateManyGenerated = updateManyInput ? adapter.generateUpdateMany(db, tableName, schema[tableName], tables, eagerRelations, updateManyInput, updateManyFieldName, typeName, typeNameMapper, filterCtx, mutationTxCtx, nestedRuntime, limits, policies, cacheCtx.typeName) : void 0;
7324
- const deleteGenerated = tableFeatures.delete ? generateDelete(db, tableName, schema[tableName], tableFilters, deleteFieldName, typeName, false, tableFeatures.requireWhere, filterCtx, {
7387
+ const updateManyGenerated = updateManyInput ? adapter.generateUpdateMany(writeBuild, {
7325
7388
  tableName,
7326
- relationMap: namedRelations,
7327
- tables
7328
- }, mutationTxCtx, policies, false, cacheCtx.typeName) : void 0;
7329
- const deleteSingleGenerated = tableFeatures.delete ? generateDelete(db, tableName, schema[tableName], tableFilters, deleteSingleFieldName, typeName, true, tableFeatures.requireWhere, filterCtx, {
7389
+ table: schema[tableName],
7390
+ updateManyInput,
7391
+ fieldName: updateManyFieldName,
7392
+ typeName
7393
+ }) : void 0;
7394
+ const deleteGenerated = tableFeatures.delete ? generateDelete(writeBuild, {
7395
+ tableName,
7396
+ table: schema[tableName],
7397
+ filterArgs: tableFilters,
7398
+ fieldName: deleteFieldName,
7399
+ typeName,
7400
+ single: false,
7401
+ requireWhere: tableFeatures.requireWhere,
7402
+ restore: false,
7403
+ selectionCtx: {
7404
+ tableName,
7405
+ relationMap: namedRelations,
7406
+ tables
7407
+ }
7408
+ }) : void 0;
7409
+ const deleteSingleGenerated = tableFeatures.delete ? generateDelete(writeBuild, {
7330
7410
  tableName,
7331
- relationMap: namedRelations,
7332
- tables
7333
- }, mutationTxCtx, policies, false, cacheCtx.typeName) : void 0;
7334
- const restoreGenerated = softDeleteInfo ? generateDelete(db, tableName, schema[tableName], tableFilters, restoreFieldName, typeName, false, tableFeatures.requireWhere, filterCtx, {
7411
+ table: schema[tableName],
7412
+ filterArgs: tableFilters,
7413
+ fieldName: deleteSingleFieldName,
7414
+ typeName,
7415
+ single: true,
7416
+ requireWhere: tableFeatures.requireWhere,
7417
+ restore: false,
7418
+ selectionCtx: {
7419
+ tableName,
7420
+ relationMap: namedRelations,
7421
+ tables
7422
+ }
7423
+ }) : void 0;
7424
+ const restoreGenerated = softDeleteInfo ? generateDelete(writeBuild, {
7335
7425
  tableName,
7336
- relationMap: namedRelations,
7337
- tables
7338
- }, mutationTxCtx, policies, true, cacheCtx.typeName) : void 0;
7339
- const restoreSingleGenerated = softDeleteInfo ? generateDelete(db, tableName, schema[tableName], tableFilters, restoreSingleFieldName, typeName, true, tableFeatures.requireWhere, filterCtx, {
7426
+ table: schema[tableName],
7427
+ filterArgs: tableFilters,
7428
+ fieldName: restoreFieldName,
7429
+ typeName,
7430
+ single: false,
7431
+ requireWhere: tableFeatures.requireWhere,
7432
+ restore: true,
7433
+ selectionCtx: {
7434
+ tableName,
7435
+ relationMap: namedRelations,
7436
+ tables
7437
+ }
7438
+ }) : void 0;
7439
+ const restoreSingleGenerated = softDeleteInfo ? generateDelete(writeBuild, {
7340
7440
  tableName,
7341
- relationMap: namedRelations,
7342
- tables
7343
- }, mutationTxCtx, policies, true, cacheCtx.typeName) : void 0;
7441
+ table: schema[tableName],
7442
+ filterArgs: tableFilters,
7443
+ fieldName: restoreSingleFieldName,
7444
+ typeName,
7445
+ single: true,
7446
+ requireWhere: tableFeatures.requireWhere,
7447
+ restore: true,
7448
+ selectionCtx: {
7449
+ tableName,
7450
+ relationMap: namedRelations,
7451
+ tables
7452
+ }
7453
+ }) : void 0;
7344
7454
  const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
7345
7455
  db,
7346
7456
  tableName,
@@ -7365,160 +7475,126 @@ const createSchemaDataGenerator = (adapter) => {
7365
7475
  filterCtx,
7366
7476
  txCtx: mutationTxCtx
7367
7477
  }) : void 0;
7368
- if (insertArrGenerated) defineRootField(mutations, "mutation", insertArrGenerated.name, {
7369
- type: arrTableItemOutput,
7370
- args: insertArrGenerated.args,
7371
- resolve: insertArrGenerated.resolver,
7372
- extensions: { drizzle: drizzleMeta({
7373
- kind: "mutation",
7374
- operation: "insert",
7375
- single: false,
7376
- targetArg: "values"
7377
- }) }
7378
- });
7379
- if (insertSingleGenerated) defineRootField(mutations, "mutation", insertSingleGenerated.name, {
7380
- type: conflictDoNothing ? singleTableItemOutput : new GraphQLNonNull(singleTableItemOutput),
7381
- args: insertSingleGenerated.args,
7382
- resolve: insertSingleGenerated.resolver,
7383
- extensions: { drizzle: drizzleMeta({
7384
- kind: "mutation",
7385
- operation: "insert",
7386
- single: true,
7387
- targetArg: "values"
7388
- }) }
7389
- });
7390
- if (upsertArrGenerated) defineRootField(mutations, "mutation", upsertArrGenerated.name, {
7391
- type: arrTableItemOutput,
7392
- args: upsertArrGenerated.args,
7393
- resolve: upsertArrGenerated.resolver,
7394
- extensions: { drizzle: drizzleMeta({
7395
- kind: "mutation",
7396
- operation: "upsert",
7397
- single: false,
7398
- targetArg: "values"
7399
- }) }
7400
- });
7401
- if (upsertSingleGenerated) defineRootField(mutations, "mutation", upsertSingleGenerated.name, {
7402
- type: singleTableItemOutput,
7403
- args: upsertSingleGenerated.args,
7404
- resolve: upsertSingleGenerated.resolver,
7405
- extensions: { drizzle: drizzleMeta({
7406
- kind: "mutation",
7407
- operation: "upsert",
7408
- single: true,
7409
- targetArg: "values"
7410
- }) }
7411
- });
7412
- if (updateGenerated) defineRootField(mutations, "mutation", updateGenerated.name, {
7413
- type: arrTableItemOutput,
7414
- args: updateGenerated.args,
7415
- resolve: updateGenerated.resolver,
7416
- extensions: { drizzle: drizzleMeta({
7417
- kind: "mutation",
7418
- operation: "update",
7419
- single: false,
7420
- targetArg: "where"
7421
- }) }
7422
- });
7423
- if (updateManyGenerated) defineRootField(mutations, "mutation", updateManyGenerated.name, {
7424
- type: new GraphQLNonNull(new GraphQLList(singleTableItemOutput)),
7425
- args: updateManyGenerated.args,
7426
- resolve: updateManyGenerated.resolver,
7427
- extensions: { drizzle: drizzleMeta({
7428
- kind: "mutation",
7429
- operation: "updateMany",
7430
- single: false,
7431
- targetArg: "updates"
7432
- }) },
7433
- description: "Each entry's updated rows, in entry order. An entry whose `where` matched no rows contributes `null` in its slot; an entry that matched several contributes each of its rows."
7434
- });
7435
- if (updateSingleGenerated) defineRootField(mutations, "mutation", updateSingleGenerated.name, {
7436
- type: singleTableItemOutput,
7437
- args: updateSingleGenerated.args,
7438
- resolve: updateSingleGenerated.resolver,
7439
- extensions: { drizzle: drizzleMeta({
7440
- kind: "mutation",
7441
- operation: "update",
7442
- single: true,
7443
- targetArg: "where"
7444
- }) }
7445
- });
7446
- if (deleteGenerated) defineRootField(mutations, "mutation", deleteGenerated.name, {
7447
- type: arrTableItemOutput,
7448
- args: deleteGenerated.args,
7449
- resolve: deleteGenerated.resolver,
7450
- extensions: { drizzle: drizzleMeta({
7451
- kind: "mutation",
7452
- operation: "delete",
7453
- single: false,
7454
- targetArg: "where",
7455
- ...softDeleteInfo?.hardDelete ? { hardDelete: true } : {}
7456
- }) }
7457
- });
7458
- if (deleteSingleGenerated) defineRootField(mutations, "mutation", deleteSingleGenerated.name, {
7459
- type: singleTableItemOutput,
7460
- args: deleteSingleGenerated.args,
7461
- resolve: deleteSingleGenerated.resolver,
7462
- extensions: { drizzle: drizzleMeta({
7463
- kind: "mutation",
7464
- operation: "delete",
7465
- single: true,
7466
- targetArg: "where",
7467
- ...softDeleteInfo?.hardDelete ? { hardDelete: true } : {}
7468
- }) }
7469
- });
7470
- if (restoreGenerated) defineRootField(mutations, "mutation", restoreGenerated.name, {
7471
- type: arrTableItemOutput,
7472
- args: restoreGenerated.args,
7473
- resolve: restoreGenerated.resolver,
7474
- extensions: { drizzle: drizzleMeta({
7475
- kind: "mutation",
7476
- operation: "restore",
7477
- single: false,
7478
- targetArg: "where"
7479
- }) }
7480
- });
7481
- if (restoreSingleGenerated) defineRootField(mutations, "mutation", restoreSingleGenerated.name, {
7482
- type: singleTableItemOutput,
7483
- args: restoreSingleGenerated.args,
7484
- resolve: restoreSingleGenerated.resolver,
7485
- extensions: { drizzle: drizzleMeta({
7486
- kind: "mutation",
7487
- operation: "restore",
7488
- single: true,
7489
- targetArg: "where"
7490
- }) }
7491
- });
7492
- if (updateCountGenerated) defineRootField(mutations, "mutation", updateCountGenerated.name, {
7493
- type: new GraphQLNonNull(GraphQLInt),
7494
- args: updateCountGenerated.args,
7495
- resolve: updateCountGenerated.resolver,
7496
- description: "How many rows the update touched. The rows themselves are not read back, which is the point of this mutation."
7497
- });
7498
- if (deleteCountGenerated) defineRootField(mutations, "mutation", deleteCountGenerated.name, {
7499
- type: new GraphQLNonNull(GraphQLInt),
7500
- args: deleteCountGenerated.args,
7501
- resolve: deleteCountGenerated.resolver,
7502
- description: "How many rows the delete removed. The rows themselves are not read back, which is the point of this mutation."
7503
- });
7504
- [
7505
- ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
7506
- ...onConflictInput ? [onConflictInput] : [],
7507
- ...tableFeatures.update ? [updateInput] : [],
7508
- ...updateManyInput ? [updateManyInput] : [],
7509
- tableFilters,
7510
- tableOrder
7511
- ].forEach((e) => {
7512
- inputs[e.name] = e;
7513
- });
7514
- outputs[selectSingleOutput.name] = selectSingleOutput;
7515
- outputs[singleTableItemOutput.name] = singleTableItemOutput;
7516
- if (aggregateType) outputs[aggregateType.name] = aggregateType;
7517
- if (groupByType && havingInput) {
7518
- outputs[groupByType.name] = groupByType;
7519
- inputs[havingInput.name] = havingInput;
7520
- }
7521
- }
7478
+ const hardDeleteMeta = softDeleteInfo?.hardDelete ? { hardDelete: true } : {};
7479
+ return {
7480
+ mutations: [
7481
+ {
7482
+ generated: insertArrGenerated,
7483
+ type: arrTableItemOutput,
7484
+ meta: {
7485
+ operation: "insert",
7486
+ single: false,
7487
+ targetArg: "values"
7488
+ }
7489
+ },
7490
+ {
7491
+ generated: insertSingleGenerated,
7492
+ type: conflictDoNothing ? singleTableItemOutput : new GraphQLNonNull(singleTableItemOutput),
7493
+ meta: {
7494
+ operation: "insert",
7495
+ single: true,
7496
+ targetArg: "values"
7497
+ }
7498
+ },
7499
+ {
7500
+ generated: upsertArrGenerated,
7501
+ type: arrTableItemOutput,
7502
+ meta: {
7503
+ operation: "upsert",
7504
+ single: false,
7505
+ targetArg: "values"
7506
+ }
7507
+ },
7508
+ {
7509
+ generated: upsertSingleGenerated,
7510
+ type: singleTableItemOutput,
7511
+ meta: {
7512
+ operation: "upsert",
7513
+ single: true,
7514
+ targetArg: "values"
7515
+ }
7516
+ },
7517
+ {
7518
+ generated: updateGenerated,
7519
+ type: arrTableItemOutput,
7520
+ meta: {
7521
+ operation: "update",
7522
+ single: false,
7523
+ targetArg: "where"
7524
+ }
7525
+ },
7526
+ {
7527
+ generated: updateManyGenerated,
7528
+ type: new GraphQLNonNull(new GraphQLList(singleTableItemOutput)),
7529
+ meta: {
7530
+ operation: "updateMany",
7531
+ single: false,
7532
+ targetArg: "updates"
7533
+ },
7534
+ description: "Each entry's updated rows, in entry order. An entry whose `where` matched no rows contributes `null` in its slot; an entry that matched several contributes each of its rows."
7535
+ },
7536
+ {
7537
+ generated: updateSingleGenerated,
7538
+ type: singleTableItemOutput,
7539
+ meta: {
7540
+ operation: "update",
7541
+ single: true,
7542
+ targetArg: "where"
7543
+ }
7544
+ },
7545
+ {
7546
+ generated: deleteGenerated,
7547
+ type: arrTableItemOutput,
7548
+ meta: {
7549
+ operation: "delete",
7550
+ single: false,
7551
+ targetArg: "where",
7552
+ ...hardDeleteMeta
7553
+ }
7554
+ },
7555
+ {
7556
+ generated: deleteSingleGenerated,
7557
+ type: singleTableItemOutput,
7558
+ meta: {
7559
+ operation: "delete",
7560
+ single: true,
7561
+ targetArg: "where",
7562
+ ...hardDeleteMeta
7563
+ }
7564
+ },
7565
+ {
7566
+ generated: restoreGenerated,
7567
+ type: arrTableItemOutput,
7568
+ meta: {
7569
+ operation: "restore",
7570
+ single: false,
7571
+ targetArg: "where"
7572
+ }
7573
+ },
7574
+ {
7575
+ generated: restoreSingleGenerated,
7576
+ type: singleTableItemOutput,
7577
+ meta: {
7578
+ operation: "restore",
7579
+ single: true,
7580
+ targetArg: "where"
7581
+ }
7582
+ },
7583
+ {
7584
+ generated: updateCountGenerated,
7585
+ type: new GraphQLNonNull(GraphQLInt),
7586
+ description: "How many rows the update touched. The rows themselves are not read back, which is the point of this mutation."
7587
+ },
7588
+ {
7589
+ generated: deleteCountGenerated,
7590
+ type: new GraphQLNonNull(GraphQLInt),
7591
+ description: "How many rows the delete removed. The rows themselves are not read back, which is the point of this mutation."
7592
+ }
7593
+ ],
7594
+ onConflictInput,
7595
+ updateManyInput
7596
+ };
7597
+ });
7522
7598
  return finalizeBuild(ctx);
7523
7599
  };
7524
7600
  };
@@ -7560,7 +7636,9 @@ const runUpdateManyBatch = ({ executor, entries, table, returning, nested, table
7560
7636
  * @param runBatch how the entries execute; defaults to {@link runUpdateManyBatch}
7561
7637
  */
7562
7638
  const createUpdateManyGenerator = (primaryKeyPropNames, runBatch = runUpdateManyBatch) => {
7563
- return (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested, limits, policies, resolveName) => {
7639
+ return (build, opts) => {
7640
+ const { db, tables, relationMap, typeNameMapper, filterCtx, txCtx, nested, limits, policies, resolveName } = build;
7641
+ const { tableName, table, updateManyInput, fieldName, typeName } = opts;
7564
7642
  const queryArgs = { updates: { type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(updateManyInput))) } };
7565
7643
  const pkNames = primaryKeyPropNames(table);
7566
7644
  return writeResolver({
@@ -7603,11 +7681,12 @@ const createUpdateManyGenerator = (primaryKeyPropNames, runBatch = runUpdateMany
7603
7681
  };
7604
7682
  });
7605
7683
  const anyNested = entries.some((entry) => entry.ops);
7684
+ const returning = anyNested ? nested.withJoinColumns(tableName, mergedOps(entries.map((entry) => ({ ops: entry.ops ?? {} }))), { ...columns }, table) : columns;
7606
7685
  const perEntry = await runBatch({
7607
7686
  executor,
7608
7687
  entries,
7609
7688
  table,
7610
- returning: anyNested ? nested.withJoinColumns(tableName, mergedOps(entries.map((entry) => ({ ops: entry.ops ?? {} }))), { ...columns }, table) : columns,
7689
+ returning,
7611
7690
  anyNested,
7612
7691
  nested,
7613
7692
  tableName,