@vantreeseba/drizzle-graphql 5.3.0 → 5.4.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
@@ -2244,6 +2244,7 @@ var computeResolverFieldNames = (tableName, typeNameMapper, prefixes, suffixes)
2244
2244
  const upsertArrayFieldName = `${upsertPrefix}${mapped ? capitalize(mapped.plural) : capitalize(tableName)}`;
2245
2245
  const upsertSingleFieldName = mapped ? `${upsertPrefix}${capitalize(mapped.singular)}` : `${upsertPrefix}${capitalize(tableName)}${suffixes.single}`;
2246
2246
  const updateFieldName = `${prefixes.update}${mapped ? capitalize(mapped.singular) : capitalize(tableName)}`;
2247
+ const updateManyFieldName = `${prefixes.update}${mapped ? capitalize(mapped.plural) : capitalize(tableName)}Many`;
2247
2248
  const deleteFieldName = `${prefixes.delete}${mapped ? capitalize(mapped.singular) : capitalize(tableName)}`;
2248
2249
  const writeSingleSuffix = suffixes.single === "" ? "Single" : suffixes.single;
2249
2250
  const updateSingleFieldName = `${updateFieldName}${writeSingleSuffix}`;
@@ -2259,11 +2260,28 @@ var computeResolverFieldNames = (tableName, typeNameMapper, prefixes, suffixes)
2259
2260
  upsertArrayFieldName,
2260
2261
  upsertSingleFieldName,
2261
2262
  updateFieldName,
2263
+ updateManyFieldName,
2262
2264
  updateSingleFieldName,
2263
2265
  deleteFieldName,
2264
2266
  deleteSingleFieldName
2265
2267
  };
2266
2268
  };
2269
+ var generateUpdateManyInput = (params) => {
2270
+ const { typeName, updatePrefix, updateInput, tableFilters } = params;
2271
+ return new import_graphql4.GraphQLInputObjectType({
2272
+ name: `${capitalize(updatePrefix)}${typeName}ManyInput`,
2273
+ description: `One entry of a batch update of ${typeName}: the rows \`where\` matches get this entry's \`set\` applied.`,
2274
+ fields: {
2275
+ where: {
2276
+ type: tableFilters,
2277
+ description: "Rows this entry updates. An omitted filter updates every row."
2278
+ },
2279
+ set: {
2280
+ type: new import_graphql4.GraphQLNonNull(updateInput)
2281
+ }
2282
+ }
2283
+ });
2284
+ };
2267
2285
  var extractRequiredFilters = (table, tableName, where, fieldName, relationCtx) => {
2268
2286
  const filters = where ? extractFilters(table, tableName, where, relationCtx) : void 0;
2269
2287
  if (!filters) {
@@ -3113,6 +3131,48 @@ var generateUpdate = (db, tableName, table, setArgs, filterArgs, fieldName, sing
3113
3131
  args: queryArgs
3114
3132
  };
3115
3133
  };
3134
+ var generateUpdateMany = (db, tableName, table, updateManyInput, fieldName, filterCtx) => {
3135
+ const queryArgs = {
3136
+ updates: {
3137
+ type: new import_graphql6.GraphQLNonNull(new import_graphql6.GraphQLList(new import_graphql6.GraphQLNonNull(updateManyInput)))
3138
+ }
3139
+ };
3140
+ return {
3141
+ name: fieldName,
3142
+ resolver: async (_source, args, context, _info) => {
3143
+ try {
3144
+ const { updates } = args;
3145
+ if (!updates.length) {
3146
+ throw new import_graphql6.GraphQLError("No updates were provided!");
3147
+ }
3148
+ const entries = updates.map(({ where, set }) => {
3149
+ const input = remapFromGraphQLSingleInput(set, table);
3150
+ if (!Object.keys(input).length) {
3151
+ throw new import_graphql6.GraphQLError("Unable to update with no values specified!");
3152
+ }
3153
+ return {
3154
+ set: input,
3155
+ filters: where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
3156
+ };
3157
+ });
3158
+ const executor = resolveExecutor(db, context);
3159
+ await executor.transaction(async (tx) => {
3160
+ for (const entry of entries) {
3161
+ let query = tx.update(table).set(entry.set);
3162
+ if (entry.filters) {
3163
+ query = query.where(entry.filters);
3164
+ }
3165
+ await query;
3166
+ }
3167
+ });
3168
+ return { isSuccess: true };
3169
+ } catch (e) {
3170
+ throw toGraphQLError(e);
3171
+ }
3172
+ },
3173
+ args: queryArgs
3174
+ };
3175
+ };
3116
3176
  var generateDelete = (db, tableName, table, filterArgs, fieldName, single, requireWhere, filterCtx) => {
3117
3177
  const queryArgs = {
3118
3178
  where: {
@@ -3220,6 +3280,7 @@ var generateSchemaData = (db, schema, relations, options) => {
3220
3280
  upsertArrayFieldName,
3221
3281
  upsertSingleFieldName,
3222
3282
  updateFieldName,
3283
+ updateManyFieldName,
3223
3284
  updateSingleFieldName,
3224
3285
  deleteFieldName,
3225
3286
  deleteSingleFieldName
@@ -3282,6 +3343,15 @@ var generateSchemaData = (db, schema, relations, options) => {
3282
3343
  features.requireWhere,
3283
3344
  filterCtx
3284
3345
  ) : void 0;
3346
+ const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
3347
+ const updateManyGenerated = updateManyInput ? generateUpdateMany(
3348
+ db,
3349
+ tableName,
3350
+ schema[tableName],
3351
+ updateManyInput,
3352
+ updateManyFieldName,
3353
+ filterCtx
3354
+ ) : void 0;
3285
3355
  const deleteGenerated = features.delete ? generateDelete(
3286
3356
  db,
3287
3357
  tableName,
@@ -3359,6 +3429,7 @@ var generateSchemaData = (db, schema, relations, options) => {
3359
3429
  upsertArrGenerated,
3360
3430
  upsertSingleGenerated,
3361
3431
  updateGenerated,
3432
+ updateManyGenerated,
3362
3433
  updateSingleGenerated,
3363
3434
  deleteGenerated,
3364
3435
  deleteSingleGenerated
@@ -3376,6 +3447,7 @@ var generateSchemaData = (db, schema, relations, options) => {
3376
3447
  ...features.insert || onConflictInput ? [insertInput] : [],
3377
3448
  ...onConflictInput ? [onConflictInput] : [],
3378
3449
  ...features.update ? [updateInput] : [],
3450
+ ...updateManyInput ? [updateManyInput] : [],
3379
3451
  tableFilters,
3380
3452
  tableOrder
3381
3453
  ];
@@ -3795,6 +3867,78 @@ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filte
3795
3867
  args: queryArgs
3796
3868
  };
3797
3869
  };
3870
+ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx) => {
3871
+ const queryArgs = {
3872
+ updates: {
3873
+ type: new import_graphql7.GraphQLNonNull(new import_graphql7.GraphQLList(new import_graphql7.GraphQLNonNull(updateManyInput)))
3874
+ }
3875
+ };
3876
+ const pkNames = pgPrimaryKeyPropNames(table);
3877
+ return {
3878
+ name: fieldName,
3879
+ resolver: async (_source, args, context, info) => {
3880
+ try {
3881
+ const { updates } = args;
3882
+ if (!updates.length) {
3883
+ throw new import_graphql7.GraphQLError("No updates were provided!");
3884
+ }
3885
+ const parsedInfo = (0, import_graphql_parse_resolve_info3.parseResolveInfo)(info, {
3886
+ deep: true
3887
+ });
3888
+ const { columns, hasRelations, withParams } = prepareMutationRelationColumns({
3889
+ relationMap,
3890
+ tables,
3891
+ tableName,
3892
+ typeName,
3893
+ typeNameMapper,
3894
+ table,
3895
+ pkNames,
3896
+ parsedInfo
3897
+ });
3898
+ const entries = updates.map(({ where, set }) => {
3899
+ const input = remapFromGraphQLSingleInput(set, table);
3900
+ if (!Object.keys(input).length) {
3901
+ throw new import_graphql7.GraphQLError("Unable to update with no values specified!");
3902
+ }
3903
+ return {
3904
+ set: input,
3905
+ filters: where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
3906
+ };
3907
+ });
3908
+ const executor = resolveExecutor(db, context);
3909
+ const perEntry = await executor.transaction(async (tx) => {
3910
+ const results = [];
3911
+ for (const entry of entries) {
3912
+ let query = tx.update(table).set(entry.set);
3913
+ if (entry.filters) {
3914
+ query = query.where(entry.filters);
3915
+ }
3916
+ results.push(await query.returning(columns));
3917
+ }
3918
+ return results;
3919
+ });
3920
+ const flatRows = perEntry.flat();
3921
+ const enriched = hasRelations ? await eagerLoadMutationRelations(executor, tableName, flatRows, pkNames, withParams) : flatRows;
3922
+ const output = [];
3923
+ let offset = 0;
3924
+ for (const rows of perEntry) {
3925
+ if (!rows.length) {
3926
+ output.push(null);
3927
+ continue;
3928
+ }
3929
+ for (let i = 0; i < rows.length; i++) {
3930
+ output.push(remapToGraphQLSingleOutput(enriched[offset + i], tableName, table, relationMap));
3931
+ }
3932
+ offset += rows.length;
3933
+ }
3934
+ return output;
3935
+ } catch (e) {
3936
+ throw toGraphQLError(e);
3937
+ }
3938
+ },
3939
+ args: queryArgs
3940
+ };
3941
+ };
3798
3942
  var generateDelete2 = (db, tableName, table, filterArgs, fieldName, typeName, single, requireWhere, filterCtx, selectionCtx) => {
3799
3943
  const queryArgs = {
3800
3944
  where: {
@@ -3913,6 +4057,7 @@ function generateSchemaData2(db, schema, relations, options) {
3913
4057
  upsertArrayFieldName,
3914
4058
  upsertSingleFieldName,
3915
4059
  updateFieldName,
4060
+ updateManyFieldName,
3916
4061
  updateSingleFieldName,
3917
4062
  deleteFieldName,
3918
4063
  deleteSingleFieldName
@@ -4034,6 +4179,19 @@ function generateSchemaData2(db, schema, relations, options) {
4034
4179
  typeNameMapper,
4035
4180
  filterCtx
4036
4181
  ) : void 0;
4182
+ const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
4183
+ const updateManyGenerated = updateManyInput ? generateUpdateMany2(
4184
+ db,
4185
+ tableName,
4186
+ schema[tableName],
4187
+ tables,
4188
+ eagerRelations,
4189
+ updateManyInput,
4190
+ updateManyFieldName,
4191
+ typeName,
4192
+ typeNameMapper,
4193
+ filterCtx
4194
+ ) : void 0;
4037
4195
  const deleteGenerated = features.delete ? generateDelete2(
4038
4196
  db,
4039
4197
  tableName,
@@ -4144,6 +4302,14 @@ function generateSchemaData2(db, schema, relations, options) {
4144
4302
  resolve: updateGenerated.resolver
4145
4303
  };
4146
4304
  }
4305
+ if (updateManyGenerated) {
4306
+ mutations[updateManyGenerated.name] = {
4307
+ // Nullable items: a no-match entry yields `null` in its slot.
4308
+ type: new import_graphql7.GraphQLNonNull(new import_graphql7.GraphQLList(singleTableItemOutput)),
4309
+ args: updateManyGenerated.args,
4310
+ resolve: updateManyGenerated.resolver
4311
+ };
4312
+ }
4147
4313
  if (updateSingleGenerated) {
4148
4314
  mutations[updateSingleGenerated.name] = {
4149
4315
  type: singleTableItemOutput,
@@ -4170,6 +4336,7 @@ function generateSchemaData2(db, schema, relations, options) {
4170
4336
  ...features.insert || onConflictInput ? [insertInput] : [],
4171
4337
  ...onConflictInput ? [onConflictInput] : [],
4172
4338
  ...features.update ? [updateInput] : [],
4339
+ ...updateManyInput ? [updateManyInput] : [],
4173
4340
  tableFilters,
4174
4341
  tableOrder
4175
4342
  ];
@@ -4492,6 +4659,91 @@ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filte
4492
4659
  args: queryArgs
4493
4660
  };
4494
4661
  };
4662
+ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx) => {
4663
+ const queryArgs = {
4664
+ updates: {
4665
+ type: new import_graphql8.GraphQLNonNull(new import_graphql8.GraphQLList(new import_graphql8.GraphQLNonNull(updateManyInput)))
4666
+ }
4667
+ };
4668
+ const pkNames = sqlitePrimaryKeyPropNames(table);
4669
+ return {
4670
+ name: fieldName,
4671
+ resolver: async (_source, args, context, info) => {
4672
+ try {
4673
+ const { updates } = args;
4674
+ if (!updates.length) {
4675
+ throw new import_graphql8.GraphQLError("No updates were provided!");
4676
+ }
4677
+ const parsedInfo = (0, import_graphql_parse_resolve_info4.parseResolveInfo)(info, {
4678
+ deep: true
4679
+ });
4680
+ const { columns, hasRelations, withParams } = prepareMutationRelationColumns({
4681
+ relationMap,
4682
+ tables,
4683
+ tableName,
4684
+ typeName,
4685
+ typeNameMapper,
4686
+ table,
4687
+ pkNames,
4688
+ parsedInfo
4689
+ });
4690
+ const entries = updates.map(({ where, set }) => {
4691
+ const input = remapFromGraphQLSingleInput(set, table);
4692
+ if (!Object.keys(input).length) {
4693
+ throw new import_graphql8.GraphQLError("Unable to update with no values specified!");
4694
+ }
4695
+ return {
4696
+ set: input,
4697
+ filters: where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
4698
+ };
4699
+ });
4700
+ const runEntry = (tx, entry) => {
4701
+ let query = tx.update(table).set(entry.set);
4702
+ if (entry.filters) {
4703
+ query = query.where(entry.filters);
4704
+ }
4705
+ return query.returning(columns).all();
4706
+ };
4707
+ const executor = resolveExecutor(db, context);
4708
+ const perEntry = await executor.transaction((tx) => {
4709
+ const first = runEntry(tx, entries[0]);
4710
+ if (typeof first?.then === "function") {
4711
+ return (async () => {
4712
+ const results2 = [await first];
4713
+ for (let i = 1; i < entries.length; i++) {
4714
+ results2.push(await runEntry(tx, entries[i]));
4715
+ }
4716
+ return results2;
4717
+ })();
4718
+ }
4719
+ const results = [first];
4720
+ for (let i = 1; i < entries.length; i++) {
4721
+ results.push(runEntry(tx, entries[i]));
4722
+ }
4723
+ return results;
4724
+ });
4725
+ const flatRows = perEntry.flat();
4726
+ const enriched = hasRelations ? await eagerLoadMutationRelations(executor, tableName, flatRows, pkNames, withParams) : flatRows;
4727
+ const output = [];
4728
+ let offset = 0;
4729
+ for (const rows of perEntry) {
4730
+ if (!rows.length) {
4731
+ output.push(null);
4732
+ continue;
4733
+ }
4734
+ for (let i = 0; i < rows.length; i++) {
4735
+ output.push(remapToGraphQLSingleOutput(enriched[offset + i], tableName, table, relationMap));
4736
+ }
4737
+ offset += rows.length;
4738
+ }
4739
+ return output;
4740
+ } catch (e) {
4741
+ throw toGraphQLError(e);
4742
+ }
4743
+ },
4744
+ args: queryArgs
4745
+ };
4746
+ };
4495
4747
  var generateDelete3 = (db, tableName, table, filterArgs, fieldName, typeName, single, requireWhere, filterCtx, selectionCtx) => {
4496
4748
  const queryArgs = {
4497
4749
  where: {
@@ -4611,6 +4863,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
4611
4863
  upsertArrayFieldName,
4612
4864
  upsertSingleFieldName,
4613
4865
  updateFieldName,
4866
+ updateManyFieldName,
4614
4867
  updateSingleFieldName,
4615
4868
  deleteFieldName,
4616
4869
  deleteSingleFieldName
@@ -4732,6 +4985,19 @@ var generateSchemaData3 = (db, schema, relations, options) => {
4732
4985
  typeNameMapper,
4733
4986
  filterCtx
4734
4987
  ) : void 0;
4988
+ const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
4989
+ const updateManyGenerated = updateManyInput ? generateUpdateMany3(
4990
+ db,
4991
+ tableName,
4992
+ schema[tableName],
4993
+ tables,
4994
+ eagerRelations,
4995
+ updateManyInput,
4996
+ updateManyFieldName,
4997
+ typeName,
4998
+ typeNameMapper,
4999
+ filterCtx
5000
+ ) : void 0;
4735
5001
  const deleteGenerated = features.delete ? generateDelete3(
4736
5002
  db,
4737
5003
  tableName,
@@ -4842,6 +5108,14 @@ var generateSchemaData3 = (db, schema, relations, options) => {
4842
5108
  resolve: updateGenerated.resolver
4843
5109
  };
4844
5110
  }
5111
+ if (updateManyGenerated) {
5112
+ mutations[updateManyGenerated.name] = {
5113
+ // Nullable items: a no-match entry yields `null` in its slot.
5114
+ type: new import_graphql8.GraphQLNonNull(new import_graphql8.GraphQLList(singleTableItemOutput)),
5115
+ args: updateManyGenerated.args,
5116
+ resolve: updateManyGenerated.resolver
5117
+ };
5118
+ }
4845
5119
  if (updateSingleGenerated) {
4846
5120
  mutations[updateSingleGenerated.name] = {
4847
5121
  type: singleTableItemOutput,
@@ -4868,6 +5142,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
4868
5142
  ...features.insert || onConflictInput ? [insertInput] : [],
4869
5143
  ...onConflictInput ? [onConflictInput] : [],
4870
5144
  ...features.update ? [updateInput] : [],
5145
+ ...updateManyInput ? [updateManyInput] : [],
4871
5146
  tableFilters,
4872
5147
  tableOrder
4873
5148
  ];
@@ -4930,6 +5205,7 @@ var buildSchema = (db, config) => {
4930
5205
  distinct: config?.features?.distinct ?? true,
4931
5206
  insert: config?.features?.insert ?? true,
4932
5207
  update: config?.features?.update ?? true,
5208
+ updateMany: config?.features?.updateMany ?? true,
4933
5209
  delete: config?.features?.delete ?? true,
4934
5210
  upsert: config?.features?.upsert ?? false,
4935
5211
  requireWhere: config?.features?.requireWhere ?? false