@vantreeseba/drizzle-graphql 7.0.0 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1033,7 +1033,7 @@ var batchedPaginatedRelationQuery = async (db, targetTable, foreignCol, whereCon
1033
1033
  }
1034
1034
  return rows;
1035
1035
  };
1036
- var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx) => ({ tableName, relationName, relEntry, isOne }) => {
1036
+ var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx, limits) => ({ tableName, relationName, relEntry, isOne }) => {
1037
1037
  const parentTable = tables[tableName];
1038
1038
  const targetTableName = relEntry.targetTableName;
1039
1039
  const targetTable = tables[targetTableName];
@@ -1045,6 +1045,7 @@ var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx) => ({
1045
1045
  return void 0;
1046
1046
  }
1047
1047
  const { localColPropName, foreignCol, foreignColPropName } = joinCols;
1048
+ const limitPolicy = isOne ? void 0 : limits?.(targetTableName);
1048
1049
  const targetPkNames = relEntry.targetPkNames ?? [];
1049
1050
  return async (parent, args, context, info) => {
1050
1051
  if (parent[relationName] !== void 0) {
@@ -1054,7 +1055,8 @@ var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx) => ({
1054
1055
  if (localValue == null) {
1055
1056
  return isOne ? null : [];
1056
1057
  }
1057
- const { where: whereArg, orderBy: orderByArg, limit, offset, after } = args ?? {};
1058
+ const { where: whereArg, orderBy: orderByArg, limit: requestedLimit, offset, after } = args ?? {};
1059
+ const limit = applyLimitPolicy(requestedLimit, limitPolicy, `${tableName}.${relationName}`);
1058
1060
  const distinct = (args ?? {}).distinct?.length ? (args ?? {}).distinct : void 0;
1059
1061
  const cursorSelected = !isOne && !!info && selectsCursorField(info, targetTable);
1060
1062
  let cursorEntries;
@@ -1168,9 +1170,41 @@ var inputFieldDocs = (docs, column, tableName, columnName, fieldType) => {
1168
1170
  }
1169
1171
  return resolved;
1170
1172
  };
1171
- var listFieldComplexity = (options) => ({ args, childComplexity }) => {
1173
+ var applyLimitPolicy = (limit, policy, fieldName) => {
1174
+ if (!policy) {
1175
+ return limit ?? void 0;
1176
+ }
1177
+ const { defaultLimit, maxLimit, clampToMax } = policy;
1178
+ if (limit == null) {
1179
+ const fallback = defaultLimit ?? maxLimit;
1180
+ if (fallback === void 0) {
1181
+ return void 0;
1182
+ }
1183
+ return maxLimit === void 0 ? fallback : Math.min(fallback, maxLimit);
1184
+ }
1185
+ if (maxLimit !== void 0 && limit > maxLimit) {
1186
+ if (clampToMax) {
1187
+ return maxLimit;
1188
+ }
1189
+ throw new GraphQLError4(`${fieldName}: 'limit' of ${limit} exceeds the maximum of ${maxLimit}.`);
1190
+ }
1191
+ return limit;
1192
+ };
1193
+ var resolveLimitPolicy = (global, table) => {
1194
+ const defaultLimit = table?.defaultLimit ?? global?.defaultLimit;
1195
+ const maxLimit = table?.maxLimit ?? global?.maxLimit;
1196
+ if (defaultLimit === void 0 && maxLimit === void 0) {
1197
+ return void 0;
1198
+ }
1199
+ return { defaultLimit, maxLimit, clampToMax: table?.clampToMax ?? global?.clampToMax ?? false };
1200
+ };
1201
+ var listFieldComplexity = (options, policy) => ({ args, childComplexity }) => {
1172
1202
  const limit = args["limit"];
1173
- const rows = typeof limit === "number" && limit > 0 ? limit : options.defaultListSize;
1203
+ const requested = typeof limit === "number" && limit > 0 ? limit : void 0;
1204
+ let rows = requested ?? policy?.defaultLimit ?? options.defaultListSize;
1205
+ if (policy?.maxLimit !== void 0) {
1206
+ rows = Math.min(rows, policy.maxLimit);
1207
+ }
1174
1208
  return rows * Math.max(childComplexity, 1);
1175
1209
  };
1176
1210
  var aggregateFieldComplexity = (options) => ({ childComplexity }) => options.aggregateCost + childComplexity;
@@ -1801,7 +1835,11 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1801
1835
  },
1802
1836
  resolve,
1803
1837
  ...relationDocs,
1804
- ...cacheCtx.complexity ? { extensions: { complexity: listFieldComplexity(cacheCtx.complexity) } } : {}
1838
+ ...cacheCtx.complexity ? {
1839
+ extensions: {
1840
+ complexity: listFieldComplexity(cacheCtx.complexity, cacheCtx.limits?.(targetTableName))
1841
+ }
1842
+ } : {}
1805
1843
  }
1806
1844
  ]);
1807
1845
  const aggregateFieldName = `${relationName}Aggregate`;
@@ -2280,7 +2318,7 @@ var extractFilters = (table, tableName, filters, relationCtx) => {
2280
2318
  }
2281
2319
  return variants.length ? variants.length > 1 ? and(...variants) : variants[0] : void 0;
2282
2320
  };
2283
- var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, originField, typeNameMapper, _isInitial = false, filterCtx) => {
2321
+ var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, originField, typeNameMapper, _isInitial = false, filterCtx, limits) => {
2284
2322
  const relationsForTable = relationMap[tableName];
2285
2323
  if (!relationsForTable) {
2286
2324
  return void 0;
@@ -2324,7 +2362,7 @@ var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, ori
2324
2362
  const relationField = Object.values(baseField).find((e) => e.name === relName);
2325
2363
  const relationArgs = relationField?.args;
2326
2364
  const offset = relationArgs?.offset ?? void 0;
2327
- const limit = relationArgs?.limit ?? void 0;
2365
+ const limit = is3(relEntry.relation, One2) ? relationArgs?.limit ?? void 0 : applyLimitPolicy(relationArgs?.limit, limits?.(targetTableName), `${tableName}.${relName}`);
2328
2366
  const relWhere = relationArgs?.where;
2329
2367
  thisRecord.where = relWhere ? {
2330
2368
  RAW: (aliasedTable2) => extractFilters(aliasedTable2, relName, relWhere, relationFilterCtx(filterCtx, targetTableName))
@@ -2342,18 +2380,29 @@ var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, ori
2342
2380
  relationField,
2343
2381
  typeNameMapper,
2344
2382
  false,
2345
- filterCtx
2383
+ filterCtx,
2384
+ limits
2346
2385
  ) : void 0;
2347
2386
  thisRecord.with = relWith;
2348
2387
  args[relName] = thisRecord;
2349
2388
  }
2350
2389
  return args;
2351
2390
  };
2352
- var extractRelationsParams = (relationMap, tables, tableName, info, typeName, typeNameMapper, filterCtx) => {
2391
+ var extractRelationsParams = (relationMap, tables, tableName, info, typeName, typeNameMapper, filterCtx, limits) => {
2353
2392
  if (!info) {
2354
2393
  return void 0;
2355
2394
  }
2356
- return extractRelationsParamsInner(relationMap, tables, tableName, typeName, info, typeNameMapper, true, filterCtx);
2395
+ return extractRelationsParamsInner(
2396
+ relationMap,
2397
+ tables,
2398
+ tableName,
2399
+ typeName,
2400
+ info,
2401
+ typeNameMapper,
2402
+ true,
2403
+ filterCtx,
2404
+ limits
2405
+ );
2357
2406
  };
2358
2407
  var pruneNonEagerRelations = (relationMap, shouldEagerLoad) => {
2359
2408
  const out = {};
@@ -2744,7 +2793,16 @@ var primaryKeyRestriction = (table, pkNames, keys) => {
2744
2793
  };
2745
2794
  var prepareMutationRelationColumns = (params) => {
2746
2795
  const { relationMap, tables, tableName, typeName, typeNameMapper, table, pkNames, parsedInfo } = params;
2747
- const withParams = relationMap[tableName] ? extractRelationsParams(relationMap, tables, tableName, parsedInfo, typeName, typeNameMapper) : void 0;
2796
+ const withParams = relationMap[tableName] ? extractRelationsParams(
2797
+ relationMap,
2798
+ tables,
2799
+ tableName,
2800
+ parsedInfo,
2801
+ typeName,
2802
+ typeNameMapper,
2803
+ void 0,
2804
+ params.limits
2805
+ ) : void 0;
2748
2806
  const hasRelations = !!(withParams && Object.keys(withParams).length);
2749
2807
  const baseColumns = extractSelectedColumnsFromTreeSQLFormat(parsedInfo.fieldsByTypeName[typeName], table, {
2750
2808
  tableName,
@@ -3048,7 +3106,16 @@ var runRelationalSelect = async (opts) => {
3048
3106
  ) : void 0
3049
3107
  )
3050
3108
  } : void 0,
3051
- with: relationMap[tableName] ? extractRelationsParams(relationMap, tables, tableName, parsedInfo, typeName, typeNameMapper, filterCtx) : void 0
3109
+ with: relationMap[tableName] ? extractRelationsParams(
3110
+ relationMap,
3111
+ tables,
3112
+ tableName,
3113
+ parsedInfo,
3114
+ typeName,
3115
+ typeNameMapper,
3116
+ filterCtx,
3117
+ opts.limits
3118
+ ) : void 0
3052
3119
  };
3053
3120
  if (single) {
3054
3121
  const result2 = await queryBase.findFirst(params);
@@ -3610,7 +3677,7 @@ var generateGroupBy = (db, tableName, table, typeName, fieldName, filterArgs, gr
3610
3677
  };
3611
3678
 
3612
3679
  // src/util/builders/mysql.ts
3613
- var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true) => {
3680
+ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits) => {
3614
3681
  const queryBase = db.query[tableName];
3615
3682
  if (!queryBase) {
3616
3683
  throw new Error(
@@ -3618,6 +3685,7 @@ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filter
3618
3685
  );
3619
3686
  }
3620
3687
  const table = tables[tableName];
3688
+ const limitPolicy = limits?.(tableName);
3621
3689
  const pkNames = mysqlPrimaryKeyPropNames(table);
3622
3690
  const queryArgs = selectArrayArgs(
3623
3691
  orderArgs,
@@ -3640,8 +3708,10 @@ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filter
3640
3708
  typeNameMapper,
3641
3709
  parsedInfo,
3642
3710
  ...args,
3711
+ limit: applyLimitPolicy(args.limit, limitPolicy, fieldName),
3643
3712
  single: false,
3644
3713
  filterCtx,
3714
+ limits,
3645
3715
  pkNames,
3646
3716
  db: executor,
3647
3717
  // MySQL sorts NULLs as the smallest values (first in ASC).
@@ -3654,7 +3724,7 @@ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filter
3654
3724
  args: queryArgs
3655
3725
  };
3656
3726
  };
3657
- var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx) => {
3727
+ var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits) => {
3658
3728
  const queryBase = db.query[tableName];
3659
3729
  if (!queryBase) {
3660
3730
  throw new Error(
@@ -3682,6 +3752,7 @@ var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filte
3682
3752
  ...args,
3683
3753
  single: true,
3684
3754
  filterCtx,
3755
+ limits,
3685
3756
  pkNames,
3686
3757
  db: executor
3687
3758
  });
@@ -3896,7 +3967,7 @@ var generateDelete = (db, tableName, table, filterArgs, fieldName, single, requi
3896
3967
  };
3897
3968
  var mysqlPrimaryKeyPropNames = (table) => getPrimaryKeyPropNamesFromConfig(table, getTableConfig);
3898
3969
  var generateSchemaData = (db, schema, relations, options) => {
3899
- const { relationsDepthLimit, prefixes, suffixes, typeNameMapper, shouldEagerLoad, features, complexity } = options;
3970
+ const { relationsDepthLimit, prefixes, suffixes, typeNameMapper, shouldEagerLoad, features, complexity, limits } = options;
3900
3971
  const rawSchema = schema;
3901
3972
  const schemaEntries = Object.entries(rawSchema);
3902
3973
  const tableEntries = schemaEntries.filter(([_key, value]) => is4(value, MySqlTable));
@@ -3921,7 +3992,8 @@ var generateSchemaData = (db, schema, relations, options) => {
3921
3992
  db,
3922
3993
  tables,
3923
3994
  "nulls-smallest",
3924
- filterCtx
3995
+ filterCtx,
3996
+ limits
3925
3997
  );
3926
3998
  const cacheCtx = {
3927
3999
  genericFilterCache: /* @__PURE__ */ new Map(),
@@ -3936,6 +4008,7 @@ var generateSchemaData = (db, schema, relations, options) => {
3936
4008
  listRelationFilterCache: /* @__PURE__ */ new Map(),
3937
4009
  aggregateTypeCache: /* @__PURE__ */ new Map(),
3938
4010
  complexity,
4011
+ limits,
3939
4012
  docs: options.docs ?? {},
3940
4013
  features
3941
4014
  };
@@ -4006,7 +4079,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4006
4079
  typeName,
4007
4080
  typeNameMapper,
4008
4081
  filterCtx,
4009
- features.distinct
4082
+ features.distinct,
4083
+ limits
4010
4084
  );
4011
4085
  const selectSingleGenerated = generateSelectSingle(
4012
4086
  db,
@@ -4018,7 +4092,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4018
4092
  singleFieldName,
4019
4093
  typeName,
4020
4094
  typeNameMapper,
4021
- filterCtx
4095
+ filterCtx,
4096
+ limits
4022
4097
  );
4023
4098
  const insertArrGenerated = features.insert ? generateInsertArray(
4024
4099
  db,
@@ -4168,7 +4243,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4168
4243
  type: selectArrOutput,
4169
4244
  args: selectArrGenerated.args,
4170
4245
  resolve: selectArrGenerated.resolver,
4171
- ...complexity ? { extensions: { complexity: listFieldComplexity(complexity) } } : {}
4246
+ ...complexity ? { extensions: { complexity: listFieldComplexity(complexity, limits?.(tableName)) } } : {}
4172
4247
  };
4173
4248
  queries[selectSingleGenerated.name] = {
4174
4249
  type: selectSingleOutput,
@@ -4664,9 +4739,10 @@ var updateWithNestedOps = async (params) => {
4664
4739
  };
4665
4740
 
4666
4741
  // src/util/builders/pg.ts
4667
- var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true) => {
4742
+ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits) => {
4668
4743
  const queryBase = db.query[tableName];
4669
4744
  const table = tables[tableName];
4745
+ const limitPolicy = limits?.(tableName);
4670
4746
  const pkNames = pgPrimaryKeyPropNames(table);
4671
4747
  const queryArgs = selectArrayArgs(
4672
4748
  orderArgs,
@@ -4679,6 +4755,7 @@ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filte
4679
4755
  try {
4680
4756
  const parsedInfo = parseResolveInfo3(info, { deep: true });
4681
4757
  const { executor, queryBase: requestQueryBase } = resolveQueryExecutor(db, context, tableName, queryBase);
4758
+ const limit = applyLimitPolicy(args.limit, limitPolicy, fieldName);
4682
4759
  if (requestQueryBase) {
4683
4760
  return await runRelationalSelect({
4684
4761
  queryBase: requestQueryBase,
@@ -4690,15 +4767,17 @@ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filte
4690
4767
  typeNameMapper,
4691
4768
  parsedInfo,
4692
4769
  ...args,
4770
+ limit,
4693
4771
  single: false,
4694
4772
  filterCtx,
4773
+ limits,
4695
4774
  pkNames,
4696
4775
  db: executor,
4697
4776
  // PostgreSQL sorts NULLs as the largest values (last in ASC).
4698
4777
  nullOrdering: "nulls-largest"
4699
4778
  });
4700
4779
  }
4701
- const { offset, limit, orderBy, where, distinct, after } = args;
4780
+ const { offset, orderBy, where, distinct, after } = args;
4702
4781
  const selectedColumnsSql = extractSelectedColumnsFromTreeSQLFormat(
4703
4782
  parsedInfo.fieldsByTypeName[typeName],
4704
4783
  table,
@@ -4788,7 +4867,7 @@ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filte
4788
4867
  args: queryArgs
4789
4868
  };
4790
4869
  };
4791
- var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx) => {
4870
+ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits) => {
4792
4871
  const queryBase = db.query[tableName];
4793
4872
  const queryArgs = selectSingleArgs(orderArgs, filterArgs);
4794
4873
  const table = tables[tableName];
@@ -4812,6 +4891,7 @@ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filt
4812
4891
  ...args,
4813
4892
  single: true,
4814
4893
  filterCtx,
4894
+ limits,
4815
4895
  pkNames,
4816
4896
  db: executor
4817
4897
  });
@@ -4845,7 +4925,7 @@ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filt
4845
4925
  };
4846
4926
  };
4847
4927
  var pgPrimaryKeyPropNames = (table) => getPrimaryKeyPropNamesFromConfig(table, getTableConfig2);
4848
- var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested) => {
4928
+ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
4849
4929
  const queryArgs = {
4850
4930
  values: {
4851
4931
  type: new GraphQLNonNull7(new GraphQLList7(new GraphQLNonNull7(baseType)))
@@ -4874,7 +4954,8 @@ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType,
4874
4954
  typeNameMapper,
4875
4955
  table,
4876
4956
  pkNames,
4877
- parsedInfo
4957
+ parsedInfo,
4958
+ limits
4878
4959
  });
4879
4960
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
4880
4961
  const runInsert = async (target, values) => {
@@ -4902,7 +4983,7 @@ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType,
4902
4983
  args: queryArgs
4903
4984
  };
4904
4985
  };
4905
- var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested) => {
4986
+ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
4906
4987
  const queryArgs = {
4907
4988
  values: {
4908
4989
  type: new GraphQLNonNull7(baseType)
@@ -4928,7 +5009,8 @@ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType
4928
5009
  typeNameMapper,
4929
5010
  table,
4930
5011
  pkNames,
4931
- parsedInfo
5012
+ parsedInfo,
5013
+ limits
4932
5014
  });
4933
5015
  const returning = nestedEntry ? nested.withJoinColumns(tableName, nestedEntry.ops, { ...columns }, table) : columns;
4934
5016
  const runInsert = async (target, values) => {
@@ -4962,7 +5044,7 @@ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType
4962
5044
  args: queryArgs
4963
5045
  };
4964
5046
  };
4965
- var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested) => {
5047
+ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested, limits) => {
4966
5048
  const queryArgs = {
4967
5049
  values: {
4968
5050
  type: single ? new GraphQLNonNull7(baseType) : new GraphQLNonNull7(new GraphQLList7(new GraphQLNonNull7(baseType)))
@@ -4994,7 +5076,8 @@ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onCo
4994
5076
  typeNameMapper,
4995
5077
  table,
4996
5078
  pkNames,
4997
- parsedInfo
5079
+ parsedInfo,
5080
+ limits
4998
5081
  });
4999
5082
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
5000
5083
  const runUpsert = async (target, values) => {
@@ -5033,7 +5116,7 @@ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onCo
5033
5116
  args: queryArgs
5034
5117
  };
5035
5118
  };
5036
- var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested) => {
5119
+ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested, limits) => {
5037
5120
  const queryArgs = {
5038
5121
  set: {
5039
5122
  type: new GraphQLNonNull7(setArgs)
@@ -5060,7 +5143,8 @@ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filte
5060
5143
  typeNameMapper,
5061
5144
  table,
5062
5145
  pkNames,
5063
- parsedInfo
5146
+ parsedInfo,
5147
+ limits
5064
5148
  });
5065
5149
  const entry = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
5066
5150
  const nestedOps = entry && nested.hasOps(entry.ops) ? entry.ops : void 0;
@@ -5107,7 +5191,7 @@ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filte
5107
5191
  args: queryArgs
5108
5192
  };
5109
5193
  };
5110
- var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested) => {
5194
+ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested, limits) => {
5111
5195
  const queryArgs = {
5112
5196
  updates: {
5113
5197
  type: new GraphQLNonNull7(new GraphQLList7(new GraphQLNonNull7(updateManyInput)))
@@ -5134,7 +5218,8 @@ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateMany
5134
5218
  typeNameMapper,
5135
5219
  table,
5136
5220
  pkNames,
5137
- parsedInfo
5221
+ parsedInfo,
5222
+ limits
5138
5223
  });
5139
5224
  const entries = updates.map(({ where, set }) => {
5140
5225
  const split = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
@@ -5252,7 +5337,8 @@ function generateSchemaData2(db, schema, relations, options) {
5252
5337
  typeNameMapper,
5253
5338
  shouldEagerLoad,
5254
5339
  features,
5255
- complexity
5340
+ complexity,
5341
+ limits
5256
5342
  } = options;
5257
5343
  const schemaEntries = Object.entries(schema);
5258
5344
  const tableEntries = schemaEntries.filter(([_key, value]) => is6(value, PgTable));
@@ -5272,7 +5358,8 @@ function generateSchemaData2(db, schema, relations, options) {
5272
5358
  db,
5273
5359
  tables,
5274
5360
  "nulls-largest",
5275
- filterCtx
5361
+ filterCtx,
5362
+ limits
5276
5363
  );
5277
5364
  const cacheCtx = {
5278
5365
  genericFilterCache: /* @__PURE__ */ new Map(),
@@ -5287,6 +5374,7 @@ function generateSchemaData2(db, schema, relations, options) {
5287
5374
  listRelationFilterCache: /* @__PURE__ */ new Map(),
5288
5375
  aggregateTypeCache: /* @__PURE__ */ new Map(),
5289
5376
  complexity,
5377
+ limits,
5290
5378
  docs: options.docs ?? {},
5291
5379
  features
5292
5380
  };
@@ -5356,7 +5444,8 @@ function generateSchemaData2(db, schema, relations, options) {
5356
5444
  typeName,
5357
5445
  typeNameMapper,
5358
5446
  filterCtx,
5359
- features.distinct
5447
+ features.distinct,
5448
+ limits
5360
5449
  );
5361
5450
  const selectSingleGenerated = generateSelectSingle2(
5362
5451
  db,
@@ -5368,7 +5457,8 @@ function generateSchemaData2(db, schema, relations, options) {
5368
5457
  singleFieldName,
5369
5458
  typeName,
5370
5459
  typeNameMapper,
5371
- filterCtx
5460
+ filterCtx,
5461
+ limits
5372
5462
  );
5373
5463
  const insertArrGenerated = features.insert ? generateInsertArray2(
5374
5464
  db,
@@ -5382,7 +5472,8 @@ function generateSchemaData2(db, schema, relations, options) {
5382
5472
  typeNameMapper,
5383
5473
  conflictDoNothing,
5384
5474
  mutationTxCtx,
5385
- nestedRuntime
5475
+ nestedRuntime,
5476
+ limits
5386
5477
  ) : void 0;
5387
5478
  const insertSingleGenerated = features.insert ? generateInsertSingle2(
5388
5479
  db,
@@ -5396,7 +5487,8 @@ function generateSchemaData2(db, schema, relations, options) {
5396
5487
  typeNameMapper,
5397
5488
  conflictDoNothing,
5398
5489
  mutationTxCtx,
5399
- nestedRuntime
5490
+ nestedRuntime,
5491
+ limits
5400
5492
  ) : void 0;
5401
5493
  const uniqueSets = features.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig2) : [];
5402
5494
  const onConflictInput = features.upsert ? generateOnConflictInput({
@@ -5421,7 +5513,8 @@ function generateSchemaData2(db, schema, relations, options) {
5421
5513
  typeNameMapper,
5422
5514
  filterCtx,
5423
5515
  mutationTxCtx,
5424
- nestedRuntime
5516
+ nestedRuntime,
5517
+ limits
5425
5518
  ) : void 0;
5426
5519
  const upsertSingleGenerated = onConflictInput ? generateUpsert2(
5427
5520
  db,
@@ -5438,7 +5531,8 @@ function generateSchemaData2(db, schema, relations, options) {
5438
5531
  typeNameMapper,
5439
5532
  filterCtx,
5440
5533
  mutationTxCtx,
5441
- nestedRuntime
5534
+ nestedRuntime,
5535
+ limits
5442
5536
  ) : void 0;
5443
5537
  const updateGenerated = features.update ? generateUpdate2(
5444
5538
  db,
@@ -5455,7 +5549,8 @@ function generateSchemaData2(db, schema, relations, options) {
5455
5549
  typeNameMapper,
5456
5550
  filterCtx,
5457
5551
  mutationTxCtx,
5458
- nestedRuntime
5552
+ nestedRuntime,
5553
+ limits
5459
5554
  ) : void 0;
5460
5555
  const updateSingleGenerated = features.update ? generateUpdate2(
5461
5556
  db,
@@ -5472,7 +5567,8 @@ function generateSchemaData2(db, schema, relations, options) {
5472
5567
  typeNameMapper,
5473
5568
  filterCtx,
5474
5569
  mutationTxCtx,
5475
- nestedRuntime
5570
+ nestedRuntime,
5571
+ limits
5476
5572
  ) : void 0;
5477
5573
  const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
5478
5574
  const updateManyGenerated = updateManyInput ? generateUpdateMany2(
@@ -5487,7 +5583,8 @@ function generateSchemaData2(db, schema, relations, options) {
5487
5583
  typeNameMapper,
5488
5584
  filterCtx,
5489
5585
  mutationTxCtx,
5490
- nestedRuntime
5586
+ nestedRuntime,
5587
+ limits
5491
5588
  ) : void 0;
5492
5589
  const deleteGenerated = features.delete ? generateDelete2(
5493
5590
  db,
@@ -5567,7 +5664,7 @@ function generateSchemaData2(db, schema, relations, options) {
5567
5664
  type: selectArrOutput,
5568
5665
  args: selectArrGenerated.args,
5569
5666
  resolve: selectArrGenerated.resolver,
5570
- ...complexity ? { extensions: { complexity: listFieldComplexity(complexity) } } : {}
5667
+ ...complexity ? { extensions: { complexity: listFieldComplexity(complexity, limits?.(tableName)) } } : {}
5571
5668
  };
5572
5669
  queries[selectSingleGenerated.name] = {
5573
5670
  type: selectSingleOutput,
@@ -5729,7 +5826,7 @@ import {
5729
5826
  GraphQLNonNull as GraphQLNonNull8
5730
5827
  } from "graphql";
5731
5828
  import { parseResolveInfo as parseResolveInfo4 } from "graphql-parse-resolve-info";
5732
- var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true) => {
5829
+ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits) => {
5733
5830
  const queryBase = db.query[tableName];
5734
5831
  if (!queryBase) {
5735
5832
  throw new Error(
@@ -5737,6 +5834,7 @@ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filte
5737
5834
  );
5738
5835
  }
5739
5836
  const table = tables[tableName];
5837
+ const limitPolicy = limits?.(tableName);
5740
5838
  const pkNames = sqlitePrimaryKeyPropNames(table);
5741
5839
  const queryArgs = selectArrayArgs(
5742
5840
  orderArgs,
@@ -5759,8 +5857,10 @@ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filte
5759
5857
  typeNameMapper,
5760
5858
  parsedInfo,
5761
5859
  ...args,
5860
+ limit: applyLimitPolicy(args.limit, limitPolicy, fieldName),
5762
5861
  single: false,
5763
5862
  filterCtx,
5863
+ limits,
5764
5864
  pkNames,
5765
5865
  db: executor,
5766
5866
  // SQLite sorts NULLs as the smallest values (first in ASC).
@@ -5773,7 +5873,7 @@ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filte
5773
5873
  args: queryArgs
5774
5874
  };
5775
5875
  };
5776
- var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx) => {
5876
+ var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits) => {
5777
5877
  const queryBase = db.query[tableName];
5778
5878
  if (!queryBase) {
5779
5879
  throw new Error(
@@ -5801,6 +5901,7 @@ var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filt
5801
5901
  ...args,
5802
5902
  single: true,
5803
5903
  filterCtx,
5904
+ limits,
5804
5905
  pkNames,
5805
5906
  db: executor
5806
5907
  });
@@ -5812,7 +5913,7 @@ var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filt
5812
5913
  };
5813
5914
  };
5814
5915
  var sqlitePrimaryKeyPropNames = (table) => getPrimaryKeyPropNamesFromConfig(table, getTableConfig3);
5815
- var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested) => {
5916
+ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
5816
5917
  const queryArgs = {
5817
5918
  values: {
5818
5919
  type: new GraphQLNonNull8(new GraphQLList8(new GraphQLNonNull8(baseType)))
@@ -5841,7 +5942,8 @@ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType,
5841
5942
  typeNameMapper,
5842
5943
  table,
5843
5944
  pkNames,
5844
- parsedInfo
5945
+ parsedInfo,
5946
+ limits
5845
5947
  });
5846
5948
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
5847
5949
  const runInsert = async (target, values) => {
@@ -5869,7 +5971,7 @@ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType,
5869
5971
  args: queryArgs
5870
5972
  };
5871
5973
  };
5872
- var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested) => {
5974
+ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
5873
5975
  const queryArgs = {
5874
5976
  values: {
5875
5977
  type: new GraphQLNonNull8(baseType)
@@ -5895,7 +5997,8 @@ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType
5895
5997
  typeNameMapper,
5896
5998
  table,
5897
5999
  pkNames,
5898
- parsedInfo
6000
+ parsedInfo,
6001
+ limits
5899
6002
  });
5900
6003
  const returning = nestedEntry ? nested.withJoinColumns(tableName, nestedEntry.ops, { ...columns }, table) : columns;
5901
6004
  const runInsert = async (target, values) => {
@@ -5929,7 +6032,7 @@ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType
5929
6032
  args: queryArgs
5930
6033
  };
5931
6034
  };
5932
- var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested) => {
6035
+ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested, limits) => {
5933
6036
  const queryArgs = {
5934
6037
  values: {
5935
6038
  type: single ? new GraphQLNonNull8(baseType) : new GraphQLNonNull8(new GraphQLList8(new GraphQLNonNull8(baseType)))
@@ -5961,7 +6064,8 @@ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onCo
5961
6064
  typeNameMapper,
5962
6065
  table,
5963
6066
  pkNames,
5964
- parsedInfo
6067
+ parsedInfo,
6068
+ limits
5965
6069
  });
5966
6070
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
5967
6071
  const runUpsert = async (target, values) => {
@@ -6000,7 +6104,7 @@ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onCo
6000
6104
  args: queryArgs
6001
6105
  };
6002
6106
  };
6003
- var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested) => {
6107
+ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested, limits) => {
6004
6108
  const queryArgs = {
6005
6109
  set: {
6006
6110
  type: new GraphQLNonNull8(setArgs)
@@ -6027,7 +6131,8 @@ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filte
6027
6131
  typeNameMapper,
6028
6132
  table,
6029
6133
  pkNames,
6030
- parsedInfo
6134
+ parsedInfo,
6135
+ limits
6031
6136
  });
6032
6137
  const entry = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
6033
6138
  const nestedOps = entry && nested.hasOps(entry.ops) ? entry.ops : void 0;
@@ -6074,7 +6179,7 @@ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filte
6074
6179
  args: queryArgs
6075
6180
  };
6076
6181
  };
6077
- var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested) => {
6182
+ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested, limits) => {
6078
6183
  const queryArgs = {
6079
6184
  updates: {
6080
6185
  type: new GraphQLNonNull8(new GraphQLList8(new GraphQLNonNull8(updateManyInput)))
@@ -6101,7 +6206,8 @@ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateMany
6101
6206
  typeNameMapper,
6102
6207
  table,
6103
6208
  pkNames,
6104
- parsedInfo
6209
+ parsedInfo,
6210
+ limits
6105
6211
  });
6106
6212
  const entries = updates.map(({ where, set }) => {
6107
6213
  const split = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
@@ -6247,7 +6353,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6247
6353
  typeNameMapper,
6248
6354
  shouldEagerLoad,
6249
6355
  features,
6250
- complexity
6356
+ complexity,
6357
+ limits
6251
6358
  } = options;
6252
6359
  const rawSchema = schema;
6253
6360
  const schemaEntries = Object.entries(rawSchema);
@@ -6268,7 +6375,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6268
6375
  db,
6269
6376
  tables,
6270
6377
  "nulls-smallest",
6271
- filterCtx
6378
+ filterCtx,
6379
+ limits
6272
6380
  );
6273
6381
  const cacheCtx = {
6274
6382
  genericFilterCache: /* @__PURE__ */ new Map(),
@@ -6283,6 +6391,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6283
6391
  listRelationFilterCache: /* @__PURE__ */ new Map(),
6284
6392
  aggregateTypeCache: /* @__PURE__ */ new Map(),
6285
6393
  complexity,
6394
+ limits,
6286
6395
  docs: options.docs ?? {},
6287
6396
  features
6288
6397
  };
@@ -6362,7 +6471,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6362
6471
  typeName,
6363
6472
  typeNameMapper,
6364
6473
  filterCtx,
6365
- features.distinct
6474
+ features.distinct,
6475
+ limits
6366
6476
  );
6367
6477
  const selectSingleGenerated = generateSelectSingle3(
6368
6478
  db,
@@ -6374,7 +6484,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6374
6484
  singleFieldName,
6375
6485
  typeName,
6376
6486
  typeNameMapper,
6377
- filterCtx
6487
+ filterCtx,
6488
+ limits
6378
6489
  );
6379
6490
  const insertArrGenerated = features.insert ? generateInsertArray3(
6380
6491
  db,
@@ -6388,7 +6499,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6388
6499
  typeNameMapper,
6389
6500
  conflictDoNothing,
6390
6501
  mutationTxCtx,
6391
- nestedRuntime
6502
+ nestedRuntime,
6503
+ limits
6392
6504
  ) : void 0;
6393
6505
  const insertSingleGenerated = features.insert ? generateInsertSingle3(
6394
6506
  db,
@@ -6402,7 +6514,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6402
6514
  typeNameMapper,
6403
6515
  conflictDoNothing,
6404
6516
  mutationTxCtx,
6405
- nestedRuntime
6517
+ nestedRuntime,
6518
+ limits
6406
6519
  ) : void 0;
6407
6520
  const uniqueSets = features.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig3) : [];
6408
6521
  const onConflictInput = features.upsert ? generateOnConflictInput({
@@ -6427,7 +6540,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6427
6540
  typeNameMapper,
6428
6541
  filterCtx,
6429
6542
  mutationTxCtx,
6430
- nestedRuntime
6543
+ nestedRuntime,
6544
+ limits
6431
6545
  ) : void 0;
6432
6546
  const upsertSingleGenerated = onConflictInput ? generateUpsert3(
6433
6547
  db,
@@ -6444,7 +6558,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6444
6558
  typeNameMapper,
6445
6559
  filterCtx,
6446
6560
  mutationTxCtx,
6447
- nestedRuntime
6561
+ nestedRuntime,
6562
+ limits
6448
6563
  ) : void 0;
6449
6564
  const updateGenerated = features.update ? generateUpdate3(
6450
6565
  db,
@@ -6461,7 +6576,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6461
6576
  typeNameMapper,
6462
6577
  filterCtx,
6463
6578
  mutationTxCtx,
6464
- nestedRuntime
6579
+ nestedRuntime,
6580
+ limits
6465
6581
  ) : void 0;
6466
6582
  const updateSingleGenerated = features.update ? generateUpdate3(
6467
6583
  db,
@@ -6478,7 +6594,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6478
6594
  typeNameMapper,
6479
6595
  filterCtx,
6480
6596
  mutationTxCtx,
6481
- nestedRuntime
6597
+ nestedRuntime,
6598
+ limits
6482
6599
  ) : void 0;
6483
6600
  const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
6484
6601
  const updateManyGenerated = updateManyInput ? generateUpdateMany3(
@@ -6493,7 +6610,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6493
6610
  typeNameMapper,
6494
6611
  filterCtx,
6495
6612
  mutationTxCtx,
6496
- nestedRuntime
6613
+ nestedRuntime,
6614
+ limits
6497
6615
  ) : void 0;
6498
6616
  const deleteGenerated = features.delete ? generateDelete3(
6499
6617
  db,
@@ -6573,7 +6691,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6573
6691
  type: selectArrOutput,
6574
6692
  args: selectArrGenerated.args,
6575
6693
  resolve: selectArrGenerated.resolver,
6576
- ...complexity ? { extensions: { complexity: listFieldComplexity(complexity) } } : {}
6694
+ ...complexity ? { extensions: { complexity: listFieldComplexity(complexity, limits?.(tableName)) } } : {}
6577
6695
  };
6578
6696
  queries[selectSingleGenerated.name] = {
6579
6697
  type: selectSingleOutput,
@@ -6769,6 +6887,33 @@ var buildSchema = (db, config) => {
6769
6887
  };
6770
6888
  const transactionsOpt = config?.transactions;
6771
6889
  const transactions = transactionsOpt === void 0 || transactionsOpt === "none" ? void 0 : { timeoutMs: (transactionsOpt === "auto" ? void 0 : transactionsOpt.timeoutMs) ?? 3e4 };
6890
+ const limitsConfig = config?.limits;
6891
+ if (limitsConfig) {
6892
+ const check = (policy, where) => {
6893
+ for (const key of ["defaultLimit", "maxLimit"]) {
6894
+ const value = policy[key];
6895
+ if (value === void 0) {
6896
+ continue;
6897
+ }
6898
+ if (!Number.isInteger(value) || value < 1) {
6899
+ throw new Error(`Drizzle-GraphQL Error: config.limits${where}.${key} must be a positive integer.`);
6900
+ }
6901
+ }
6902
+ };
6903
+ check(limitsConfig, "");
6904
+ for (const [tableName, policy] of Object.entries(limitsConfig.tables ?? {})) {
6905
+ check(policy, `.tables.${tableName}`);
6906
+ }
6907
+ }
6908
+ const limitPolicyCache = /* @__PURE__ */ new Map();
6909
+ const limits = limitsConfig ? (tableName) => {
6910
+ if (limitPolicyCache.has(tableName)) {
6911
+ return limitPolicyCache.get(tableName);
6912
+ }
6913
+ const resolved = resolveLimitPolicy(limitsConfig, limitsConfig.tables?.[tableName]);
6914
+ limitPolicyCache.set(tableName, resolved);
6915
+ return resolved;
6916
+ } : void 0;
6772
6917
  const eagerOpt = config?.eagerLoadRelations;
6773
6918
  const shouldEagerLoad = eagerOpt === void 0 || eagerOpt === true ? () => true : eagerOpt === false ? () => false : eagerOpt;
6774
6919
  if (!typeNameMapper && suffixes.list === suffixes.single) {
@@ -6801,6 +6946,7 @@ var buildSchema = (db, config) => {
6801
6946
  mapColumnType: config?.mapColumnType,
6802
6947
  enumNameMapper: config?.enumNameMapper,
6803
6948
  transactions,
6949
+ limits,
6804
6950
  docs: {
6805
6951
  describeColumn: config?.describeColumn,
6806
6952
  describeTable: config?.describeTable,