@vantreeseba/drizzle-graphql 12.0.0 → 13.0.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
@@ -4320,17 +4320,15 @@ const computeResolverFieldNames = (tableName, typeNameMapper, prefixes, suffixes
4320
4320
  const upsertPrefix = prefixes.upsert ?? "upsert";
4321
4321
  const upsertArrayFieldName = `${upsertPrefix}${pluralNoun}${suffixes.list}`;
4322
4322
  const upsertSingleFieldName = mapped ? `${upsertPrefix}${capitalize(mapped.singular)}` : `${upsertPrefix}${capitalize(tableName)}${suffixes.single}`;
4323
- const updateBase = `${prefixes.update}${singularNoun}`;
4324
- const deleteBase = `${prefixes.delete}${singularNoun}`;
4325
- const restoreBase = `${prefixes.restore ?? "restore"}${singularNoun}`;
4326
- const updateFieldName = `${updateBase}${suffixes.list}`;
4323
+ const restorePrefix = prefixes.restore ?? "restore";
4324
+ const updateFieldName = `${prefixes.update}${pluralNoun}${suffixes.list}`;
4327
4325
  const updateManyFieldName = `${prefixes.update}${pluralNoun}Many`;
4328
- const deleteFieldName = `${deleteBase}${suffixes.list}`;
4329
- const restoreFieldName = `${restoreBase}${suffixes.list}`;
4330
- const writeSingleSuffix = suffixes.single === suffixes.list ? "Single" : suffixes.single;
4331
- const updateSingleFieldName = `${updateBase}${writeSingleSuffix}`;
4332
- const deleteSingleFieldName = `${deleteBase}${writeSingleSuffix}`;
4333
- const restoreSingleFieldName = `${restoreBase}${writeSingleSuffix}`;
4326
+ const deleteFieldName = `${prefixes.delete}${pluralNoun}${suffixes.list}`;
4327
+ const restoreFieldName = `${restorePrefix}${pluralNoun}${suffixes.list}`;
4328
+ const singleWrite = (prefix) => mapped ? `${prefix}${singularNoun}` : `${prefix}${singularNoun}${suffixes.single}`;
4329
+ const updateSingleFieldName = singleWrite(prefixes.update);
4330
+ const deleteSingleFieldName = singleWrite(prefixes.delete);
4331
+ const restoreSingleFieldName = singleWrite(restorePrefix);
4334
4332
  return {
4335
4333
  typeName,
4336
4334
  listFieldName,
@@ -6530,6 +6528,72 @@ const createSchemaBuilder = (adapter) => {
6530
6528
  havingInput
6531
6529
  };
6532
6530
  };
6531
+ /**
6532
+ * The per-table loop, run once for every table the build covers.
6533
+ *
6534
+ * The dialect's callback receives the values the loop has already worked out — the feature
6535
+ * flags, the extension factory, the field names, the table's generated types and its
6536
+ * soft-delete config — and answers with the mutations it generated. Registering them, and
6537
+ * registering the inputs and outputs those mutations reference, happens here: both sides
6538
+ * did it identically, down to the `description` strings on the count mutations, so a gate
6539
+ * changed on one side and forgotten on the other used to be a silent dialect divergence.
6540
+ *
6541
+ * What stays in the dialect is what genuinely differs — which generators run, what each
6542
+ * mutation returns, and (on MySQL) that a write cannot report the rows it touched.
6543
+ */
6544
+ const forEachTable = (ctx, perTable) => {
6545
+ const { schema, featureOf, softDeleteOf, typeNameMapper, gqlSchemaTypes, mutations, inputs, outputs } = ctx;
6546
+ const { prefixes, suffixes } = ctx.options;
6547
+ for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
6548
+ const tableFeatures = featureOf(tableName);
6549
+ const drizzleMeta = tableFieldExtensions(tableName, primaryKeyPropNames(schema[tableName]));
6550
+ const names = computeResolverFieldNames(tableName, typeNameMapper, prefixes, suffixes);
6551
+ const softDeleteInfo = softDeleteOf?.(tableName);
6552
+ const readTypes = addReadFields(ctx, tableName, names, tableTypes, drizzleMeta);
6553
+ const built = perTable({
6554
+ tableName,
6555
+ table: schema[tableName],
6556
+ tableFeatures,
6557
+ drizzleMeta,
6558
+ names,
6559
+ types: tableTypes,
6560
+ softDeleteInfo
6561
+ });
6562
+ for (const { generated, type, meta, description } of built.mutations) if (generated) defineRootField(mutations, "mutation", generated.name, {
6563
+ type,
6564
+ args: generated.args,
6565
+ resolve: generated.resolver,
6566
+ ...meta ? { extensions: { drizzle: drizzleMeta({
6567
+ kind: "mutation",
6568
+ ...meta
6569
+ }) } } : {},
6570
+ ...description ? { description } : {}
6571
+ });
6572
+ const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
6573
+ [
6574
+ ...tableFeatures.insert || built.onConflictInput ? [insertInput] : [],
6575
+ ...built.onConflictInput ? [built.onConflictInput] : [],
6576
+ ...tableFeatures.update ? [updateInput] : [],
6577
+ ...built.updateManyInput ? [built.updateManyInput] : [],
6578
+ tableFilters,
6579
+ tableOrder
6580
+ ].forEach((e) => {
6581
+ inputs[e.name] = e;
6582
+ });
6583
+ const { selectSingleOutput } = tableTypes.outputs;
6584
+ outputs[selectSingleOutput.name] = selectSingleOutput;
6585
+ if (adapter.returnsRows) {
6586
+ const { singleTableItemOutput } = tableTypes.outputs;
6587
+ outputs[singleTableItemOutput.name] = singleTableItemOutput;
6588
+ }
6589
+ const { aggregateType, groupByType, havingInput } = readTypes;
6590
+ if (aggregateType) outputs[aggregateType.name] = aggregateType;
6591
+ if (groupByType && havingInput) {
6592
+ outputs[groupByType.name] = groupByType;
6593
+ inputs[havingInput.name] = havingInput;
6594
+ }
6595
+ }
6596
+ };
6533
6597
  /** The relation field resolvers and the transaction roster, once every root field exists. */
6534
6598
  const finalizeBuild = (ctx) => {
6535
6599
  if (ctx.mutationTxCtx) for (const name of Object.keys(ctx.mutations)) ctx.mutationTxCtx.fieldNames.add(name);
@@ -6560,7 +6624,7 @@ const createSchemaBuilder = (adapter) => {
6560
6624
  primaryKeyPropNames,
6561
6625
  uniqueColumnSets,
6562
6626
  prepareBuild,
6563
- addReadFields,
6627
+ forEachTable,
6564
6628
  finalizeBuild
6565
6629
  };
6566
6630
  };
@@ -6769,7 +6833,7 @@ const generateDelete = (db, tableName, table, filterArgs, fieldName, single, req
6769
6833
  const getTableConfig$2 = memoizeTableConfig(drizzle_orm_mysql_core.getTableConfig);
6770
6834
  /** Primary-key property names for a MySQL table, including table-level composite keys. */
6771
6835
  const mysqlPrimaryKeyPropNames = (table) => getPrimaryKeyPropNamesFromConfig(table, getTableConfig$2);
6772
- const { prepareBuild, addReadFields, finalizeBuild } = createSchemaBuilder({
6836
+ const { prepareBuild, forEachTable, finalizeBuild } = createSchemaBuilder({
6773
6837
  tableClass: drizzle_orm_mysql_core.MySqlTable,
6774
6838
  getTableConfig: getTableConfig$2,
6775
6839
  primaryKeyPropNames: mysqlPrimaryKeyPropNames,
@@ -6780,9 +6844,9 @@ const { prepareBuild, addReadFields, finalizeBuild } = createSchemaBuilder({
6780
6844
  }
6781
6845
  });
6782
6846
  const generateSchemaData$2 = (db, schema, relations, options) => {
6783
- const { prefixes, suffixes, typeNameMapper } = options;
6847
+ const { prefixes } = options;
6784
6848
  const ctx = prepareBuild(db, schema, relations, options);
6785
- const { featureOf, anyTable, filterCtx, policies, softDeleteOf, cacheCtx, mutationTxCtx, gqlSchemaTypes, mutations, inputs, outputs } = ctx;
6849
+ const { anyTable, filterCtx, policies, cacheCtx, mutationTxCtx, outputs } = ctx;
6786
6850
  const mutationReturnType = new graphql.GraphQLObjectType({
6787
6851
  name: cacheCtx.typeName({
6788
6852
  kind: "shared",
@@ -6796,15 +6860,9 @@ const generateSchemaData$2 = (db, schema, relations, options) => {
6796
6860
  "update",
6797
6861
  "delete"
6798
6862
  ].some((feature) => anyTable(feature))) outputs["MutationReturn"] = mutationReturnType;
6799
- for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
6800
- const tableFeatures = featureOf(tableName);
6801
- const drizzleMeta = tableFieldExtensions(tableName, mysqlPrimaryKeyPropNames(schema[tableName]));
6802
- const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
6803
- const { selectSingleOutput } = tableTypes.outputs;
6804
- const names = computeResolverFieldNames(tableName, typeNameMapper, prefixes, suffixes);
6863
+ forEachTable(ctx, ({ tableName, tableFeatures, names, types, softDeleteInfo }) => {
6864
+ const { insertInput, updateInput, tableFilters } = types.inputs;
6805
6865
  const { typeName, createArrayFieldName, createSingleFieldName, upsertArrayFieldName, upsertSingleFieldName, updateFieldName, updateManyFieldName, updateSingleFieldName, updateCountFieldName, deleteFieldName, deleteSingleFieldName, restoreFieldName, restoreSingleFieldName, deleteCountFieldName } = names;
6806
- const softDeleteInfo = softDeleteOf?.(tableName);
6807
- const { aggregateType, groupByType, havingInput } = addReadFields(ctx, tableName, names, tableTypes, drizzleMeta);
6808
6866
  const insertArrGenerated = tableFeatures.insert ? generateInsertArray(db, tableName, schema[tableName], insertInput, createArrayFieldName, mutationTxCtx, policies) : void 0;
6809
6867
  const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle(db, tableName, schema[tableName], insertInput, createSingleFieldName, mutationTxCtx, policies) : void 0;
6810
6868
  const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
@@ -6857,103 +6915,85 @@ const generateSchemaData$2 = (db, schema, relations, options) => {
6857
6915
  txCtx: mutationTxCtx
6858
6916
  }) : void 0;
6859
6917
  const hardDeleteMeta = softDeleteInfo?.hardDelete ? { hardDelete: true } : {};
6860
- const generatedMutations = [
6861
- [insertArrGenerated, {
6862
- operation: "insert",
6863
- single: false,
6864
- targetArg: "values"
6865
- }],
6866
- [insertSingleGenerated, {
6867
- operation: "insert",
6868
- single: true,
6869
- targetArg: "values"
6870
- }],
6871
- [upsertArrGenerated, {
6872
- operation: "upsert",
6873
- single: false,
6874
- targetArg: "values"
6875
- }],
6876
- [upsertSingleGenerated, {
6877
- operation: "upsert",
6878
- single: true,
6879
- targetArg: "values"
6880
- }],
6881
- [updateGenerated, {
6882
- operation: "update",
6883
- single: false,
6884
- targetArg: "where"
6885
- }],
6886
- [updateManyGenerated, {
6887
- operation: "updateMany",
6888
- single: false,
6889
- targetArg: "updates"
6890
- }],
6891
- [updateSingleGenerated, {
6892
- operation: "update",
6893
- single: true,
6894
- targetArg: "where"
6895
- }],
6896
- [deleteGenerated, {
6897
- operation: "delete",
6898
- single: false,
6899
- targetArg: "where",
6900
- ...hardDeleteMeta
6901
- }],
6902
- [deleteSingleGenerated, {
6903
- operation: "delete",
6904
- single: true,
6905
- targetArg: "where",
6906
- ...hardDeleteMeta
6907
- }],
6908
- [restoreGenerated, {
6909
- operation: "restore",
6910
- single: false,
6911
- targetArg: "where"
6912
- }],
6913
- [restoreSingleGenerated, {
6914
- operation: "restore",
6915
- single: true,
6916
- targetArg: "where"
6917
- }]
6918
- ];
6919
- for (const [generated, meta] of generatedMutations) if (generated) defineRootField(mutations, "mutation", generated.name, {
6918
+ const withMeta = (generated, meta) => ({
6919
+ generated,
6920
6920
  type: mutationReturnType,
6921
- args: generated.args,
6922
- resolve: generated.resolver,
6923
- extensions: { drizzle: drizzleMeta({
6924
- kind: "mutation",
6925
- ...meta
6926
- }) }
6927
- });
6928
- if (updateCountGenerated) defineRootField(mutations, "mutation", updateCountGenerated.name, {
6929
- type: new graphql.GraphQLNonNull(graphql.GraphQLInt),
6930
- args: updateCountGenerated.args,
6931
- resolve: updateCountGenerated.resolver,
6932
- description: "How many rows the update touched. The rows themselves are not read back, which is the point of this mutation."
6933
- });
6934
- if (deleteCountGenerated) defineRootField(mutations, "mutation", deleteCountGenerated.name, {
6935
- type: new graphql.GraphQLNonNull(graphql.GraphQLInt),
6936
- args: deleteCountGenerated.args,
6937
- resolve: deleteCountGenerated.resolver,
6938
- description: "How many rows the delete removed. The rows themselves are not read back, which is the point of this mutation."
6921
+ meta
6939
6922
  });
6940
- [
6941
- ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
6942
- ...onConflictInput ? [onConflictInput] : [],
6943
- ...tableFeatures.update ? [updateInput] : [],
6944
- ...updateManyInput ? [updateManyInput] : [],
6945
- tableFilters,
6946
- tableOrder
6947
- ].forEach((e) => {
6948
- inputs[e.name] = e;
6949
- });
6950
- outputs[selectSingleOutput.name] = selectSingleOutput;
6951
- if (aggregateType) outputs[aggregateType.name] = aggregateType;
6952
- if (groupByType && havingInput) {
6953
- outputs[groupByType.name] = groupByType;
6954
- inputs[havingInput.name] = havingInput;
6955
- }
6956
- }
6923
+ return {
6924
+ mutations: [
6925
+ withMeta(insertArrGenerated, {
6926
+ operation: "insert",
6927
+ single: false,
6928
+ targetArg: "values"
6929
+ }),
6930
+ withMeta(insertSingleGenerated, {
6931
+ operation: "insert",
6932
+ single: true,
6933
+ targetArg: "values"
6934
+ }),
6935
+ withMeta(upsertArrGenerated, {
6936
+ operation: "upsert",
6937
+ single: false,
6938
+ targetArg: "values"
6939
+ }),
6940
+ withMeta(upsertSingleGenerated, {
6941
+ operation: "upsert",
6942
+ single: true,
6943
+ targetArg: "values"
6944
+ }),
6945
+ withMeta(updateGenerated, {
6946
+ operation: "update",
6947
+ single: false,
6948
+ targetArg: "where"
6949
+ }),
6950
+ withMeta(updateManyGenerated, {
6951
+ operation: "updateMany",
6952
+ single: false,
6953
+ targetArg: "updates"
6954
+ }),
6955
+ withMeta(updateSingleGenerated, {
6956
+ operation: "update",
6957
+ single: true,
6958
+ targetArg: "where"
6959
+ }),
6960
+ withMeta(deleteGenerated, {
6961
+ operation: "delete",
6962
+ single: false,
6963
+ targetArg: "where",
6964
+ ...hardDeleteMeta
6965
+ }),
6966
+ withMeta(deleteSingleGenerated, {
6967
+ operation: "delete",
6968
+ single: true,
6969
+ targetArg: "where",
6970
+ ...hardDeleteMeta
6971
+ }),
6972
+ withMeta(restoreGenerated, {
6973
+ operation: "restore",
6974
+ single: false,
6975
+ targetArg: "where"
6976
+ }),
6977
+ withMeta(restoreSingleGenerated, {
6978
+ operation: "restore",
6979
+ single: true,
6980
+ targetArg: "where"
6981
+ }),
6982
+ {
6983
+ generated: updateCountGenerated,
6984
+ type: new graphql.GraphQLNonNull(graphql.GraphQLInt),
6985
+ description: "How many rows the update touched. The rows themselves are not read back, which is the point of this mutation."
6986
+ },
6987
+ {
6988
+ generated: deleteCountGenerated,
6989
+ type: new graphql.GraphQLNonNull(graphql.GraphQLInt),
6990
+ description: "How many rows the delete removed. The rows themselves are not read back, which is the point of this mutation."
6991
+ }
6992
+ ],
6993
+ onConflictInput,
6994
+ updateManyInput
6995
+ };
6996
+ });
6957
6997
  return finalizeBuild(ctx);
6958
6998
  };
6959
6999
  //#endregion
@@ -6963,26 +7003,36 @@ const generateSchemaData$2 = (db, schema, relations, options) => {
6963
7003
  * result, so the generator call sites read exactly as they did when the functions were local.
6964
7004
  */
6965
7005
  const buildWriteResolvers = (primaryKeyPropNames) => {
6966
- const generateInsertArray = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits, policies, resolveName) => {
6967
- const queryArgs = { values: { type: new graphql.GraphQLNonNull(new graphql.GraphQLList(new graphql.GraphQLNonNull(baseType))) } };
7006
+ /**
7007
+ * `insert<Table>` / `insert<Table>Single` — one generator for both shapes, the way
7008
+ * {@link generateUpsert} handles its pair. `single` decides the argument type, whether the
7009
+ * result is remapped as a row or a list, and whether an empty return is an error; the write
7010
+ * itself is the same multi-row statement either way, with the single variant supplying a
7011
+ * one-element list.
7012
+ */
7013
+ const generateInsert = (build, opts) => {
7014
+ const { db, tables, relationMap, typeNameMapper, txCtx, nested, limits, policies, resolveName } = build;
7015
+ const { tableName, table, baseType, fieldName, typeName, single, conflictDoNothing = false } = opts;
7016
+ const queryArgs = { values: { type: single ? new graphql.GraphQLNonNull(baseType) : new graphql.GraphQLNonNull(new graphql.GraphQLList(new graphql.GraphQLNonNull(baseType))) } };
6968
7017
  const pkNames = primaryKeyPropNames(table);
6969
7018
  return writeResolver({
6970
7019
  db,
6971
7020
  tableName,
6972
7021
  operation: "insert",
6973
- single: false,
7022
+ single,
6974
7023
  fieldName,
6975
7024
  txCtx,
6976
7025
  policies,
6977
7026
  args: queryArgs,
6978
7027
  run: async ({ executor, args, context, info, before, after }) => {
6979
- if (!args.values.length) throw drizzleError("No values were provided!", { code: "DRIZZLE_NO_VALUES" });
7028
+ const supplied = single ? [args.values] : args.values;
7029
+ if (!supplied.length) throw drizzleError("No values were provided!", { code: "DRIZZLE_NO_VALUES" });
6980
7030
  await before();
6981
- const entries = nested?.enabled(tableName) ? args.values.map((values) => nested.split(tableName, values)) : void 0;
7031
+ const entries = nested?.enabled(tableName) ? supplied.map((values) => nested.split(tableName, values)) : void 0;
6982
7032
  const nestedEntries = entries?.some((entry) => nested.hasOps(entry.ops)) ? entries : void 0;
6983
7033
  const contextColumns = policies?.contextValues?.(tableName);
6984
7034
  const scope = policies?.scope?.(context);
6985
- const input = nestedEntries ? [] : applyContextValuesAll(remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : args.values, table), contextColumns, context);
7035
+ const input = nestedEntries ? [] : applyContextValuesAll(remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : supplied, table), contextColumns, context);
6986
7036
  const { columns, hasRelations, withParams } = mutationSelection(info, {
6987
7037
  relationMap,
6988
7038
  tables,
@@ -7012,65 +7062,12 @@ const buildWriteResolvers = (primaryKeyPropNames) => {
7012
7062
  context
7013
7063
  }) : await runInsert(executor, input);
7014
7064
  await after(result);
7015
- const enriched = await withEagerRelations(executor, tableName, result, pkNames, withParams, hasRelations);
7016
- return remapToGraphQLArrayOutput(enriched, tableName, table, relationMap);
7017
- }
7018
- });
7019
- };
7020
- const generateInsertSingle = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits, policies, resolveName) => {
7021
- const queryArgs = { values: { type: new graphql.GraphQLNonNull(baseType) } };
7022
- const pkNames = primaryKeyPropNames(table);
7023
- return writeResolver({
7024
- db,
7025
- tableName,
7026
- operation: "insert",
7027
- single: true,
7028
- fieldName,
7029
- txCtx,
7030
- policies,
7031
- args: queryArgs,
7032
- run: async ({ executor, args, context, info, before, after }) => {
7033
- await before();
7034
- const entry = nested?.enabled(tableName) ? nested.split(tableName, args.values) : void 0;
7035
- const nestedEntry = entry && nested.hasOps(entry.ops) ? entry : void 0;
7036
- const contextColumns = policies?.contextValues?.(tableName);
7037
- const scope = policies?.scope?.(context);
7038
- const input = nestedEntry ? {} : applyContextValues(remapFromGraphQLSingleInput(entry ? entry.columns : args.values, table), contextColumns, context);
7039
- const { columns, hasRelations, withParams } = mutationSelection(info, {
7040
- relationMap,
7041
- tables,
7042
- tableName,
7043
- typeName,
7044
- typeNameMapper,
7045
- resolveName,
7046
- table,
7047
- pkNames,
7048
- limits,
7049
- scope,
7050
- defaultOrderBy: policies?.defaultOrderBy
7051
- });
7052
- const returning = nestedEntry ? nested.withJoinColumns(tableName, nestedEntry.ops, { ...columns }, table) : columns;
7053
- const runInsert = async (target, values) => {
7054
- let query = target.insert(table).values(values).returning(returning);
7055
- if (conflictDoNothing) query = query.onConflictDoNothing();
7056
- return await query;
7057
- };
7058
- const result = nestedEntry ? await writeWithNestedOps({
7059
- executor,
7060
- runtime: nested,
7061
- tableName,
7062
- entries: [nestedEntry],
7063
- remapValues: (values) => applyContextValues(remapFromGraphQLSingleInput(values, table), contextColumns, context),
7064
- write: runInsert,
7065
- context
7066
- }) : await runInsert(executor, input);
7067
- await after(result);
7068
- if (!result[0]) {
7065
+ if (single && !result[0]) {
7069
7066
  if (!conflictDoNothing) throw drizzleError("The insert returned no row.", { code: "DRIZZLE_NO_ROW_RETURNED" });
7070
7067
  return;
7071
7068
  }
7072
7069
  const enriched = await withEagerRelations(executor, tableName, result, pkNames, withParams, hasRelations);
7073
- return remapToGraphQLSingleOutput(enriched[0], tableName, table, relationMap);
7070
+ return single ? remapToGraphQLSingleOutput(enriched[0], tableName, table, relationMap) : remapToGraphQLArrayOutput(enriched, tableName, table, relationMap);
7074
7071
  }
7075
7072
  });
7076
7073
  };
@@ -7080,7 +7077,9 @@ const buildWriteResolvers = (primaryKeyPropNames) => {
7080
7077
  *
7081
7078
  * Shares the insert input: an upsert supplies a whole row, same as a create.
7082
7079
  */
7083
- const generateUpsert = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested, limits, policies, resolveName) => {
7080
+ const generateUpsert = (build, opts) => {
7081
+ const { db, tables, relationMap, typeNameMapper, filterCtx, txCtx, nested, limits, policies, resolveName } = build;
7082
+ const { tableName, table, baseType, onConflictType, uniqueSets, fieldName, typeName, single } = opts;
7084
7083
  const queryArgs = {
7085
7084
  values: { type: single ? new graphql.GraphQLNonNull(baseType) : new graphql.GraphQLNonNull(new graphql.GraphQLList(new graphql.GraphQLNonNull(baseType))) },
7086
7085
  onConflict: {
@@ -7157,7 +7156,9 @@ const buildWriteResolvers = (primaryKeyPropNames) => {
7157
7156
  }
7158
7157
  });
7159
7158
  };
7160
- const generateUpdate = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested, limits, policies, resolveName) => {
7159
+ const generateUpdate = (build, opts) => {
7160
+ const { db, tables, relationMap, typeNameMapper, filterCtx, txCtx, nested, limits, policies, resolveName } = build;
7161
+ const { tableName, table, setArgs, filterArgs, fieldName, typeName, single, requireWhere } = opts;
7161
7162
  const queryArgs = {
7162
7163
  set: { type: new graphql.GraphQLNonNull(setArgs) },
7163
7164
  where: { type: single || requireWhere ? new graphql.GraphQLNonNull(filterArgs) : filterArgs }
@@ -7240,7 +7241,10 @@ const buildWriteResolvers = (primaryKeyPropNames) => {
7240
7241
  * `DELETE` — emptying the trash, reclaiming a unique key. It reads at `INCLUDE`, since the
7241
7242
  * rows it mostly exists to remove are the ones already marked; a `scope` still confines it.
7242
7243
  */
7243
- const generateDelete = (db, tableName, table, filterArgs, fieldName, typeName, single, requireWhere, filterCtx, selectionCtx, txCtx, policies, restore = false, resolveName) => {
7244
+ const generateDelete = (build, opts) => {
7245
+ const { db, filterCtx, txCtx, policies, resolveName } = build;
7246
+ const { tableName, table, filterArgs, fieldName, typeName, single, requireWhere, selectionCtx } = opts;
7247
+ const restore = opts.restore ?? false;
7244
7248
  const softDelete = policies?.softDelete?.(tableName);
7245
7249
  const operation = restore ? "restore" : "delete";
7246
7250
  const canHardDelete = !restore && softDelete?.hardDelete === true;
@@ -7287,8 +7291,7 @@ const buildWriteResolvers = (primaryKeyPropNames) => {
7287
7291
  });
7288
7292
  };
7289
7293
  return {
7290
- generateInsertArray,
7291
- generateInsertSingle,
7294
+ generateInsert,
7292
7295
  generateUpsert,
7293
7296
  generateUpdate,
7294
7297
  generateDelete
@@ -7305,23 +7308,46 @@ const buildWriteResolvers = (primaryKeyPropNames) => {
7305
7308
  const createSchemaDataGenerator = (adapter) => {
7306
7309
  const primaryKeyPropNames = adapter.primaryKeyPropNames;
7307
7310
  const uniqueColumnSets = (table) => getUniqueColumnSets(table, adapter.getTableConfig);
7308
- const { generateInsertArray, generateInsertSingle, generateUpsert, generateUpdate, generateDelete } = buildWriteResolvers(primaryKeyPropNames);
7309
- const { prepareBuild, addReadFields, finalizeBuild } = createSchemaBuilder(adapter);
7311
+ const { generateInsert, generateUpsert, generateUpdate, generateDelete } = buildWriteResolvers(primaryKeyPropNames);
7312
+ const { prepareBuild, forEachTable, finalizeBuild } = createSchemaBuilder(adapter);
7310
7313
  return (db, schema, relations, options) => {
7311
- const { prefixes, suffixes, conflictDoNothing, typeNameMapper, limits } = options;
7314
+ const { prefixes, conflictDoNothing, typeNameMapper, limits } = options;
7312
7315
  const ctx = prepareBuild(db, schema, relations, options);
7313
- const { tables, featureOf, eagerRelations, filterCtx, policies, softDeleteOf, namedRelations, cacheCtx, nestedRuntime, mutationTxCtx, gqlSchemaTypes, mutations, inputs, outputs } = ctx;
7314
- for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
7315
- const tableFeatures = featureOf(tableName);
7316
- const drizzleMeta = tableFieldExtensions(tableName, primaryKeyPropNames(schema[tableName]));
7317
- const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
7318
- const { selectSingleOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
7319
- const names = computeResolverFieldNames(tableName, typeNameMapper, prefixes, suffixes);
7316
+ const { tables, eagerRelations, filterCtx, policies, namedRelations, cacheCtx, nestedRuntime, mutationTxCtx } = ctx;
7317
+ const writeBuild = {
7318
+ db,
7319
+ tables,
7320
+ relationMap: eagerRelations,
7321
+ typeNameMapper,
7322
+ filterCtx,
7323
+ txCtx: mutationTxCtx,
7324
+ nested: nestedRuntime,
7325
+ limits,
7326
+ policies,
7327
+ resolveName: cacheCtx.typeName
7328
+ };
7329
+ forEachTable(ctx, ({ tableName, tableFeatures, names, types, softDeleteInfo }) => {
7330
+ const { insertInput, updateInput, tableFilters } = types.inputs;
7331
+ const { singleTableItemOutput, arrTableItemOutput } = types.outputs;
7320
7332
  const { typeName, createArrayFieldName, createSingleFieldName, upsertArrayFieldName, upsertSingleFieldName, updateFieldName, updateManyFieldName, updateSingleFieldName, updateCountFieldName, deleteFieldName, deleteSingleFieldName, restoreFieldName, restoreSingleFieldName, deleteCountFieldName } = names;
7321
- const softDeleteInfo = softDeleteOf?.(tableName);
7322
- const { aggregateType, groupByType, havingInput } = addReadFields(ctx, tableName, names, tableTypes, drizzleMeta);
7323
- const insertArrGenerated = tableFeatures.insert ? generateInsertArray(db, tableName, schema[tableName], tables, eagerRelations, insertInput, createArrayFieldName, typeName, typeNameMapper, conflictDoNothing, mutationTxCtx, nestedRuntime, limits, policies, cacheCtx.typeName) : void 0;
7324
- const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle(db, tableName, schema[tableName], tables, eagerRelations, insertInput, createSingleFieldName, typeName, typeNameMapper, conflictDoNothing, mutationTxCtx, nestedRuntime, limits, policies, cacheCtx.typeName) : void 0;
7333
+ const insertArrGenerated = tableFeatures.insert ? generateInsert(writeBuild, {
7334
+ tableName,
7335
+ table: schema[tableName],
7336
+ baseType: insertInput,
7337
+ fieldName: createArrayFieldName,
7338
+ typeName,
7339
+ single: false,
7340
+ conflictDoNothing
7341
+ }) : void 0;
7342
+ const insertSingleGenerated = tableFeatures.insert ? generateInsert(writeBuild, {
7343
+ tableName,
7344
+ table: schema[tableName],
7345
+ baseType: insertInput,
7346
+ fieldName: createSingleFieldName,
7347
+ typeName,
7348
+ single: true,
7349
+ conflictDoNothing
7350
+ }) : void 0;
7325
7351
  const uniqueSets = tableFeatures.upsert ? uniqueColumnSets(schema[tableName]) : [];
7326
7352
  const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
7327
7353
  table: schema[tableName],
@@ -7332,10 +7358,46 @@ const createSchemaDataGenerator = (adapter) => {
7332
7358
  withTarget: true,
7333
7359
  cacheCtx
7334
7360
  }) : void 0;
7335
- 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;
7336
- 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;
7337
- 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;
7338
- 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;
7361
+ const upsertArrGenerated = onConflictInput ? generateUpsert(writeBuild, {
7362
+ tableName,
7363
+ table: schema[tableName],
7364
+ baseType: insertInput,
7365
+ onConflictType: onConflictInput,
7366
+ uniqueSets,
7367
+ fieldName: upsertArrayFieldName,
7368
+ typeName,
7369
+ single: false
7370
+ }) : void 0;
7371
+ const upsertSingleGenerated = onConflictInput ? generateUpsert(writeBuild, {
7372
+ tableName,
7373
+ table: schema[tableName],
7374
+ baseType: insertInput,
7375
+ onConflictType: onConflictInput,
7376
+ uniqueSets,
7377
+ fieldName: upsertSingleFieldName,
7378
+ typeName,
7379
+ single: true
7380
+ }) : void 0;
7381
+ const updateGenerated = tableFeatures.update ? generateUpdate(writeBuild, {
7382
+ tableName,
7383
+ table: schema[tableName],
7384
+ setArgs: updateInput,
7385
+ filterArgs: tableFilters,
7386
+ fieldName: updateFieldName,
7387
+ typeName,
7388
+ single: false,
7389
+ requireWhere: tableFeatures.requireWhere
7390
+ }) : void 0;
7391
+ const updateSingleGenerated = tableFeatures.update ? generateUpdate(writeBuild, {
7392
+ tableName,
7393
+ table: schema[tableName],
7394
+ setArgs: updateInput,
7395
+ filterArgs: tableFilters,
7396
+ fieldName: updateSingleFieldName,
7397
+ typeName,
7398
+ single: true,
7399
+ requireWhere: tableFeatures.requireWhere
7400
+ }) : void 0;
7339
7401
  const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({
7340
7402
  tableName,
7341
7403
  typeName,
@@ -7344,27 +7406,73 @@ const createSchemaDataGenerator = (adapter) => {
7344
7406
  tableFilters,
7345
7407
  cacheCtx
7346
7408
  }) : void 0;
7347
- const updateManyGenerated = updateManyInput ? adapter.generateUpdateMany(db, tableName, schema[tableName], tables, eagerRelations, updateManyInput, updateManyFieldName, typeName, typeNameMapper, filterCtx, mutationTxCtx, nestedRuntime, limits, policies, cacheCtx.typeName) : void 0;
7348
- const deleteGenerated = tableFeatures.delete ? generateDelete(db, tableName, schema[tableName], tableFilters, deleteFieldName, typeName, false, tableFeatures.requireWhere, filterCtx, {
7409
+ const updateManyGenerated = updateManyInput ? adapter.generateUpdateMany(writeBuild, {
7349
7410
  tableName,
7350
- relationMap: namedRelations,
7351
- tables
7352
- }, mutationTxCtx, policies, false, cacheCtx.typeName) : void 0;
7353
- const deleteSingleGenerated = tableFeatures.delete ? generateDelete(db, tableName, schema[tableName], tableFilters, deleteSingleFieldName, typeName, true, tableFeatures.requireWhere, filterCtx, {
7411
+ table: schema[tableName],
7412
+ updateManyInput,
7413
+ fieldName: updateManyFieldName,
7414
+ typeName
7415
+ }) : void 0;
7416
+ const deleteGenerated = tableFeatures.delete ? generateDelete(writeBuild, {
7417
+ tableName,
7418
+ table: schema[tableName],
7419
+ filterArgs: tableFilters,
7420
+ fieldName: deleteFieldName,
7421
+ typeName,
7422
+ single: false,
7423
+ requireWhere: tableFeatures.requireWhere,
7424
+ restore: false,
7425
+ selectionCtx: {
7426
+ tableName,
7427
+ relationMap: namedRelations,
7428
+ tables
7429
+ }
7430
+ }) : void 0;
7431
+ const deleteSingleGenerated = tableFeatures.delete ? generateDelete(writeBuild, {
7354
7432
  tableName,
7355
- relationMap: namedRelations,
7356
- tables
7357
- }, mutationTxCtx, policies, false, cacheCtx.typeName) : void 0;
7358
- const restoreGenerated = softDeleteInfo ? generateDelete(db, tableName, schema[tableName], tableFilters, restoreFieldName, typeName, false, tableFeatures.requireWhere, filterCtx, {
7433
+ table: schema[tableName],
7434
+ filterArgs: tableFilters,
7435
+ fieldName: deleteSingleFieldName,
7436
+ typeName,
7437
+ single: true,
7438
+ requireWhere: tableFeatures.requireWhere,
7439
+ restore: false,
7440
+ selectionCtx: {
7441
+ tableName,
7442
+ relationMap: namedRelations,
7443
+ tables
7444
+ }
7445
+ }) : void 0;
7446
+ const restoreGenerated = softDeleteInfo ? generateDelete(writeBuild, {
7359
7447
  tableName,
7360
- relationMap: namedRelations,
7361
- tables
7362
- }, mutationTxCtx, policies, true, cacheCtx.typeName) : void 0;
7363
- const restoreSingleGenerated = softDeleteInfo ? generateDelete(db, tableName, schema[tableName], tableFilters, restoreSingleFieldName, typeName, true, tableFeatures.requireWhere, filterCtx, {
7448
+ table: schema[tableName],
7449
+ filterArgs: tableFilters,
7450
+ fieldName: restoreFieldName,
7451
+ typeName,
7452
+ single: false,
7453
+ requireWhere: tableFeatures.requireWhere,
7454
+ restore: true,
7455
+ selectionCtx: {
7456
+ tableName,
7457
+ relationMap: namedRelations,
7458
+ tables
7459
+ }
7460
+ }) : void 0;
7461
+ const restoreSingleGenerated = softDeleteInfo ? generateDelete(writeBuild, {
7364
7462
  tableName,
7365
- relationMap: namedRelations,
7366
- tables
7367
- }, mutationTxCtx, policies, true, cacheCtx.typeName) : void 0;
7463
+ table: schema[tableName],
7464
+ filterArgs: tableFilters,
7465
+ fieldName: restoreSingleFieldName,
7466
+ typeName,
7467
+ single: true,
7468
+ requireWhere: tableFeatures.requireWhere,
7469
+ restore: true,
7470
+ selectionCtx: {
7471
+ tableName,
7472
+ relationMap: namedRelations,
7473
+ tables
7474
+ }
7475
+ }) : void 0;
7368
7476
  const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
7369
7477
  db,
7370
7478
  tableName,
@@ -7389,160 +7497,126 @@ const createSchemaDataGenerator = (adapter) => {
7389
7497
  filterCtx,
7390
7498
  txCtx: mutationTxCtx
7391
7499
  }) : void 0;
7392
- if (insertArrGenerated) defineRootField(mutations, "mutation", insertArrGenerated.name, {
7393
- type: arrTableItemOutput,
7394
- args: insertArrGenerated.args,
7395
- resolve: insertArrGenerated.resolver,
7396
- extensions: { drizzle: drizzleMeta({
7397
- kind: "mutation",
7398
- operation: "insert",
7399
- single: false,
7400
- targetArg: "values"
7401
- }) }
7402
- });
7403
- if (insertSingleGenerated) defineRootField(mutations, "mutation", insertSingleGenerated.name, {
7404
- type: conflictDoNothing ? singleTableItemOutput : new graphql.GraphQLNonNull(singleTableItemOutput),
7405
- args: insertSingleGenerated.args,
7406
- resolve: insertSingleGenerated.resolver,
7407
- extensions: { drizzle: drizzleMeta({
7408
- kind: "mutation",
7409
- operation: "insert",
7410
- single: true,
7411
- targetArg: "values"
7412
- }) }
7413
- });
7414
- if (upsertArrGenerated) defineRootField(mutations, "mutation", upsertArrGenerated.name, {
7415
- type: arrTableItemOutput,
7416
- args: upsertArrGenerated.args,
7417
- resolve: upsertArrGenerated.resolver,
7418
- extensions: { drizzle: drizzleMeta({
7419
- kind: "mutation",
7420
- operation: "upsert",
7421
- single: false,
7422
- targetArg: "values"
7423
- }) }
7424
- });
7425
- if (upsertSingleGenerated) defineRootField(mutations, "mutation", upsertSingleGenerated.name, {
7426
- type: singleTableItemOutput,
7427
- args: upsertSingleGenerated.args,
7428
- resolve: upsertSingleGenerated.resolver,
7429
- extensions: { drizzle: drizzleMeta({
7430
- kind: "mutation",
7431
- operation: "upsert",
7432
- single: true,
7433
- targetArg: "values"
7434
- }) }
7435
- });
7436
- if (updateGenerated) defineRootField(mutations, "mutation", updateGenerated.name, {
7437
- type: arrTableItemOutput,
7438
- args: updateGenerated.args,
7439
- resolve: updateGenerated.resolver,
7440
- extensions: { drizzle: drizzleMeta({
7441
- kind: "mutation",
7442
- operation: "update",
7443
- single: false,
7444
- targetArg: "where"
7445
- }) }
7446
- });
7447
- if (updateManyGenerated) defineRootField(mutations, "mutation", updateManyGenerated.name, {
7448
- type: new graphql.GraphQLNonNull(new graphql.GraphQLList(singleTableItemOutput)),
7449
- args: updateManyGenerated.args,
7450
- resolve: updateManyGenerated.resolver,
7451
- extensions: { drizzle: drizzleMeta({
7452
- kind: "mutation",
7453
- operation: "updateMany",
7454
- single: false,
7455
- targetArg: "updates"
7456
- }) },
7457
- 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."
7458
- });
7459
- if (updateSingleGenerated) defineRootField(mutations, "mutation", updateSingleGenerated.name, {
7460
- type: singleTableItemOutput,
7461
- args: updateSingleGenerated.args,
7462
- resolve: updateSingleGenerated.resolver,
7463
- extensions: { drizzle: drizzleMeta({
7464
- kind: "mutation",
7465
- operation: "update",
7466
- single: true,
7467
- targetArg: "where"
7468
- }) }
7469
- });
7470
- if (deleteGenerated) defineRootField(mutations, "mutation", deleteGenerated.name, {
7471
- type: arrTableItemOutput,
7472
- args: deleteGenerated.args,
7473
- resolve: deleteGenerated.resolver,
7474
- extensions: { drizzle: drizzleMeta({
7475
- kind: "mutation",
7476
- operation: "delete",
7477
- single: false,
7478
- targetArg: "where",
7479
- ...softDeleteInfo?.hardDelete ? { hardDelete: true } : {}
7480
- }) }
7481
- });
7482
- if (deleteSingleGenerated) defineRootField(mutations, "mutation", deleteSingleGenerated.name, {
7483
- type: singleTableItemOutput,
7484
- args: deleteSingleGenerated.args,
7485
- resolve: deleteSingleGenerated.resolver,
7486
- extensions: { drizzle: drizzleMeta({
7487
- kind: "mutation",
7488
- operation: "delete",
7489
- single: true,
7490
- targetArg: "where",
7491
- ...softDeleteInfo?.hardDelete ? { hardDelete: true } : {}
7492
- }) }
7493
- });
7494
- if (restoreGenerated) defineRootField(mutations, "mutation", restoreGenerated.name, {
7495
- type: arrTableItemOutput,
7496
- args: restoreGenerated.args,
7497
- resolve: restoreGenerated.resolver,
7498
- extensions: { drizzle: drizzleMeta({
7499
- kind: "mutation",
7500
- operation: "restore",
7501
- single: false,
7502
- targetArg: "where"
7503
- }) }
7504
- });
7505
- if (restoreSingleGenerated) defineRootField(mutations, "mutation", restoreSingleGenerated.name, {
7506
- type: singleTableItemOutput,
7507
- args: restoreSingleGenerated.args,
7508
- resolve: restoreSingleGenerated.resolver,
7509
- extensions: { drizzle: drizzleMeta({
7510
- kind: "mutation",
7511
- operation: "restore",
7512
- single: true,
7513
- targetArg: "where"
7514
- }) }
7515
- });
7516
- if (updateCountGenerated) defineRootField(mutations, "mutation", updateCountGenerated.name, {
7517
- type: new graphql.GraphQLNonNull(graphql.GraphQLInt),
7518
- args: updateCountGenerated.args,
7519
- resolve: updateCountGenerated.resolver,
7520
- description: "How many rows the update touched. The rows themselves are not read back, which is the point of this mutation."
7521
- });
7522
- if (deleteCountGenerated) defineRootField(mutations, "mutation", deleteCountGenerated.name, {
7523
- type: new graphql.GraphQLNonNull(graphql.GraphQLInt),
7524
- args: deleteCountGenerated.args,
7525
- resolve: deleteCountGenerated.resolver,
7526
- description: "How many rows the delete removed. The rows themselves are not read back, which is the point of this mutation."
7527
- });
7528
- [
7529
- ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
7530
- ...onConflictInput ? [onConflictInput] : [],
7531
- ...tableFeatures.update ? [updateInput] : [],
7532
- ...updateManyInput ? [updateManyInput] : [],
7533
- tableFilters,
7534
- tableOrder
7535
- ].forEach((e) => {
7536
- inputs[e.name] = e;
7537
- });
7538
- outputs[selectSingleOutput.name] = selectSingleOutput;
7539
- outputs[singleTableItemOutput.name] = singleTableItemOutput;
7540
- if (aggregateType) outputs[aggregateType.name] = aggregateType;
7541
- if (groupByType && havingInput) {
7542
- outputs[groupByType.name] = groupByType;
7543
- inputs[havingInput.name] = havingInput;
7544
- }
7545
- }
7500
+ const hardDeleteMeta = softDeleteInfo?.hardDelete ? { hardDelete: true } : {};
7501
+ return {
7502
+ mutations: [
7503
+ {
7504
+ generated: insertArrGenerated,
7505
+ type: arrTableItemOutput,
7506
+ meta: {
7507
+ operation: "insert",
7508
+ single: false,
7509
+ targetArg: "values"
7510
+ }
7511
+ },
7512
+ {
7513
+ generated: insertSingleGenerated,
7514
+ type: conflictDoNothing ? singleTableItemOutput : new graphql.GraphQLNonNull(singleTableItemOutput),
7515
+ meta: {
7516
+ operation: "insert",
7517
+ single: true,
7518
+ targetArg: "values"
7519
+ }
7520
+ },
7521
+ {
7522
+ generated: upsertArrGenerated,
7523
+ type: arrTableItemOutput,
7524
+ meta: {
7525
+ operation: "upsert",
7526
+ single: false,
7527
+ targetArg: "values"
7528
+ }
7529
+ },
7530
+ {
7531
+ generated: upsertSingleGenerated,
7532
+ type: singleTableItemOutput,
7533
+ meta: {
7534
+ operation: "upsert",
7535
+ single: true,
7536
+ targetArg: "values"
7537
+ }
7538
+ },
7539
+ {
7540
+ generated: updateGenerated,
7541
+ type: arrTableItemOutput,
7542
+ meta: {
7543
+ operation: "update",
7544
+ single: false,
7545
+ targetArg: "where"
7546
+ }
7547
+ },
7548
+ {
7549
+ generated: updateManyGenerated,
7550
+ type: new graphql.GraphQLNonNull(new graphql.GraphQLList(singleTableItemOutput)),
7551
+ meta: {
7552
+ operation: "updateMany",
7553
+ single: false,
7554
+ targetArg: "updates"
7555
+ },
7556
+ 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."
7557
+ },
7558
+ {
7559
+ generated: updateSingleGenerated,
7560
+ type: singleTableItemOutput,
7561
+ meta: {
7562
+ operation: "update",
7563
+ single: true,
7564
+ targetArg: "where"
7565
+ }
7566
+ },
7567
+ {
7568
+ generated: deleteGenerated,
7569
+ type: arrTableItemOutput,
7570
+ meta: {
7571
+ operation: "delete",
7572
+ single: false,
7573
+ targetArg: "where",
7574
+ ...hardDeleteMeta
7575
+ }
7576
+ },
7577
+ {
7578
+ generated: deleteSingleGenerated,
7579
+ type: singleTableItemOutput,
7580
+ meta: {
7581
+ operation: "delete",
7582
+ single: true,
7583
+ targetArg: "where",
7584
+ ...hardDeleteMeta
7585
+ }
7586
+ },
7587
+ {
7588
+ generated: restoreGenerated,
7589
+ type: arrTableItemOutput,
7590
+ meta: {
7591
+ operation: "restore",
7592
+ single: false,
7593
+ targetArg: "where"
7594
+ }
7595
+ },
7596
+ {
7597
+ generated: restoreSingleGenerated,
7598
+ type: singleTableItemOutput,
7599
+ meta: {
7600
+ operation: "restore",
7601
+ single: true,
7602
+ targetArg: "where"
7603
+ }
7604
+ },
7605
+ {
7606
+ generated: updateCountGenerated,
7607
+ type: new graphql.GraphQLNonNull(graphql.GraphQLInt),
7608
+ description: "How many rows the update touched. The rows themselves are not read back, which is the point of this mutation."
7609
+ },
7610
+ {
7611
+ generated: deleteCountGenerated,
7612
+ type: new graphql.GraphQLNonNull(graphql.GraphQLInt),
7613
+ description: "How many rows the delete removed. The rows themselves are not read back, which is the point of this mutation."
7614
+ }
7615
+ ],
7616
+ onConflictInput,
7617
+ updateManyInput
7618
+ };
7619
+ });
7546
7620
  return finalizeBuild(ctx);
7547
7621
  };
7548
7622
  };
@@ -7584,7 +7658,9 @@ const runUpdateManyBatch = ({ executor, entries, table, returning, nested, table
7584
7658
  * @param runBatch how the entries execute; defaults to {@link runUpdateManyBatch}
7585
7659
  */
7586
7660
  const createUpdateManyGenerator = (primaryKeyPropNames, runBatch = runUpdateManyBatch) => {
7587
- return (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested, limits, policies, resolveName) => {
7661
+ return (build, opts) => {
7662
+ const { db, tables, relationMap, typeNameMapper, filterCtx, txCtx, nested, limits, policies, resolveName } = build;
7663
+ const { tableName, table, updateManyInput, fieldName, typeName } = opts;
7588
7664
  const queryArgs = { updates: { type: new graphql.GraphQLNonNull(new graphql.GraphQLList(new graphql.GraphQLNonNull(updateManyInput))) } };
7589
7665
  const pkNames = primaryKeyPropNames(table);
7590
7666
  return writeResolver({
@@ -7627,11 +7703,12 @@ const createUpdateManyGenerator = (primaryKeyPropNames, runBatch = runUpdateMany
7627
7703
  };
7628
7704
  });
7629
7705
  const anyNested = entries.some((entry) => entry.ops);
7706
+ const returning = anyNested ? nested.withJoinColumns(tableName, mergedOps(entries.map((entry) => ({ ops: entry.ops ?? {} }))), { ...columns }, table) : columns;
7630
7707
  const perEntry = await runBatch({
7631
7708
  executor,
7632
7709
  entries,
7633
7710
  table,
7634
- returning: anyNested ? nested.withJoinColumns(tableName, mergedOps(entries.map((entry) => ({ ops: entry.ops ?? {} }))), { ...columns }, table) : columns,
7711
+ returning,
7635
7712
  anyNested,
7636
7713
  nested,
7637
7714
  tableName,