@vantreeseba/drizzle-graphql 7.0.0 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/index.ts
2
- import { is as is8 } from "drizzle-orm";
2
+ import { getColumns as getColumns6, is as is8, Table } from "drizzle-orm";
3
3
  import { MySqlDatabase } from "drizzle-orm/mysql-core";
4
4
  import { PgAsyncDatabase } from "drizzle-orm/pg-core";
5
5
  import { BaseSQLiteDatabase } from "drizzle-orm/sqlite-core";
@@ -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,65 @@ 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 excludedColumnRegistry = /* @__PURE__ */ new WeakMap();
1202
+ var registerColumnExclusions = (tables, exclude) => {
1203
+ for (const [tableName, table] of Object.entries(tables)) {
1204
+ const hidden = exclude?.columns?.[tableName];
1205
+ if (hidden?.length) {
1206
+ excludedColumnRegistry.set(table, new Set(hidden));
1207
+ } else {
1208
+ excludedColumnRegistry.delete(table);
1209
+ }
1210
+ }
1211
+ };
1212
+ var hasExcludedColumns = (table) => excludedColumnRegistry.has(table);
1213
+ var excludedColumnsKey = (table) => {
1214
+ const hidden = excludedColumnRegistry.get(table);
1215
+ return hidden ? [...hidden].sort().join(",") : "";
1216
+ };
1217
+ var visibleColumns = (table) => {
1218
+ const columns = getColumns2(table);
1219
+ const hidden = excludedColumnRegistry.get(table);
1220
+ if (!hidden) {
1221
+ return columns;
1222
+ }
1223
+ return Object.fromEntries(Object.entries(columns).filter(([columnName]) => !hidden.has(columnName)));
1224
+ };
1225
+ var listFieldComplexity = (options, policy) => ({ args, childComplexity }) => {
1172
1226
  const limit = args["limit"];
1173
- const rows = typeof limit === "number" && limit > 0 ? limit : options.defaultListSize;
1227
+ const requested = typeof limit === "number" && limit > 0 ? limit : void 0;
1228
+ let rows = requested ?? policy?.defaultLimit ?? options.defaultListSize;
1229
+ if (policy?.maxLimit !== void 0) {
1230
+ rows = Math.min(rows, policy.maxLimit);
1231
+ }
1174
1232
  return rows * Math.max(childComplexity, 1);
1175
1233
  };
1176
1234
  var aggregateFieldComplexity = (options) => ({ childComplexity }) => options.aggregateCost + childComplexity;
@@ -1473,17 +1531,20 @@ var generateColumnFilterValues = (column, tableName, columnName, cacheCtx) => {
1473
1531
  };
1474
1532
  var orderMap = /* @__PURE__ */ new WeakMap();
1475
1533
  var generateTableOrderCached = (table) => {
1476
- if (orderMap.has(table)) {
1534
+ const cacheable = !hasExcludedColumns(table);
1535
+ if (cacheable && orderMap.has(table)) {
1477
1536
  return orderMap.get(table);
1478
1537
  }
1479
1538
  let remapped = {};
1480
1539
  try {
1481
- const columns = getColumns2(table);
1540
+ const columns = visibleColumns(table);
1482
1541
  const columnEntries = Object.entries(columns);
1483
1542
  remapped = Object.fromEntries(
1484
1543
  columnEntries.map(([columnName, _columnDescription]) => [columnName, { type: innerOrder }])
1485
1544
  );
1486
- orderMap.set(table, remapped);
1545
+ if (cacheable) {
1546
+ orderMap.set(table, remapped);
1547
+ }
1487
1548
  } catch (_err) {
1488
1549
  }
1489
1550
  return remapped;
@@ -1492,7 +1553,7 @@ var generateTableFilterValuesCached = (table, tableName, cacheCtx) => {
1492
1553
  if (cacheCtx.filterFieldCache.has(table)) {
1493
1554
  return cacheCtx.filterFieldCache.get(table);
1494
1555
  }
1495
- const columns = getColumns2(table);
1556
+ const columns = visibleColumns(table);
1496
1557
  const columnEntries = Object.entries(columns);
1497
1558
  const remapped = Object.fromEntries(
1498
1559
  columnEntries.map(([columnName, column]) => [
@@ -1513,7 +1574,7 @@ var generateTableSelectTypeFieldsCached = (table, tableName, cacheCtx) => {
1513
1574
  if (cacheCtx.selectFieldCache.has(table)) {
1514
1575
  return cacheCtx.selectFieldCache.get(table);
1515
1576
  }
1516
- const columns = getColumns2(table);
1577
+ const columns = visibleColumns(table);
1517
1578
  const columnEntries = Object.entries(columns);
1518
1579
  const remapped = Object.fromEntries(
1519
1580
  columnEntries.map(([columnName, column]) => [
@@ -1801,7 +1862,11 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1801
1862
  },
1802
1863
  resolve,
1803
1864
  ...relationDocs,
1804
- ...cacheCtx.complexity ? { extensions: { complexity: listFieldComplexity(cacheCtx.complexity) } } : {}
1865
+ ...cacheCtx.complexity ? {
1866
+ extensions: {
1867
+ complexity: listFieldComplexity(cacheCtx.complexity, cacheCtx.limits?.(targetTableName))
1868
+ }
1869
+ } : {}
1805
1870
  }
1806
1871
  ]);
1807
1872
  const aggregateFieldName = `${relationName}Aggregate`;
@@ -1867,7 +1932,7 @@ var generateTableTypes = (tableName, tables, relationMap, withReturning, relatio
1867
1932
  relationAggregateFactory
1868
1933
  );
1869
1934
  const table = tables[tableName];
1870
- const columns = getColumns2(table);
1935
+ const columns = visibleColumns(table);
1871
1936
  const columnEntries = Object.entries(columns);
1872
1937
  const relaxedColumns = nestedWrites?.relaxedColumns(tableName);
1873
1938
  const insertFields = Object.fromEntries(
@@ -2280,7 +2345,7 @@ var extractFilters = (table, tableName, filters, relationCtx) => {
2280
2345
  }
2281
2346
  return variants.length ? variants.length > 1 ? and(...variants) : variants[0] : void 0;
2282
2347
  };
2283
- var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, originField, typeNameMapper, _isInitial = false, filterCtx) => {
2348
+ var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, originField, typeNameMapper, _isInitial = false, filterCtx, limits) => {
2284
2349
  const relationsForTable = relationMap[tableName];
2285
2350
  if (!relationsForTable) {
2286
2351
  return void 0;
@@ -2324,7 +2389,7 @@ var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, ori
2324
2389
  const relationField = Object.values(baseField).find((e) => e.name === relName);
2325
2390
  const relationArgs = relationField?.args;
2326
2391
  const offset = relationArgs?.offset ?? void 0;
2327
- const limit = relationArgs?.limit ?? void 0;
2392
+ const limit = is3(relEntry.relation, One2) ? relationArgs?.limit ?? void 0 : applyLimitPolicy(relationArgs?.limit, limits?.(targetTableName), `${tableName}.${relName}`);
2328
2393
  const relWhere = relationArgs?.where;
2329
2394
  thisRecord.where = relWhere ? {
2330
2395
  RAW: (aliasedTable2) => extractFilters(aliasedTable2, relName, relWhere, relationFilterCtx(filterCtx, targetTableName))
@@ -2342,18 +2407,29 @@ var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, ori
2342
2407
  relationField,
2343
2408
  typeNameMapper,
2344
2409
  false,
2345
- filterCtx
2410
+ filterCtx,
2411
+ limits
2346
2412
  ) : void 0;
2347
2413
  thisRecord.with = relWith;
2348
2414
  args[relName] = thisRecord;
2349
2415
  }
2350
2416
  return args;
2351
2417
  };
2352
- var extractRelationsParams = (relationMap, tables, tableName, info, typeName, typeNameMapper, filterCtx) => {
2418
+ var extractRelationsParams = (relationMap, tables, tableName, info, typeName, typeNameMapper, filterCtx, limits) => {
2353
2419
  if (!info) {
2354
2420
  return void 0;
2355
2421
  }
2356
- return extractRelationsParamsInner(relationMap, tables, tableName, typeName, info, typeNameMapper, true, filterCtx);
2422
+ return extractRelationsParamsInner(
2423
+ relationMap,
2424
+ tables,
2425
+ tableName,
2426
+ typeName,
2427
+ info,
2428
+ typeNameMapper,
2429
+ true,
2430
+ filterCtx,
2431
+ limits
2432
+ );
2357
2433
  };
2358
2434
  var pruneNonEagerRelations = (relationMap, shouldEagerLoad) => {
2359
2435
  const out = {};
@@ -2531,7 +2607,7 @@ var attachRowCursors = (rows, entries) => {
2531
2607
  };
2532
2608
  var rowCursorResolver = (source) => source?.[ROW_CURSOR_PROP] ?? null;
2533
2609
  var getUniqueColumnSets = (table, getTableConfig4) => {
2534
- const cols = getColumns2(table);
2610
+ const cols = visibleColumns(table);
2535
2611
  const propNameByColumnName = new Map(Object.entries(cols).map(([propName, col]) => [col.name, propName]));
2536
2612
  const toPropNames = (columnNames) => {
2537
2613
  const propNames = [];
@@ -2571,12 +2647,13 @@ var getUniqueColumnSets = (table, getTableConfig4) => {
2571
2647
  var DISTINCT_RN = "__drizzle_graphql_distinct_rn";
2572
2648
  var columnEnumCache = /* @__PURE__ */ new WeakMap();
2573
2649
  var generateColumnEnum = (table, enumName, description, predicate = () => true) => {
2650
+ const cacheKey = `${enumName}\0${excludedColumnsKey(table)}`;
2574
2651
  let tableCache = columnEnumCache.get(table);
2575
- const cached = tableCache?.get(enumName);
2652
+ const cached = tableCache?.get(cacheKey);
2576
2653
  if (cached) {
2577
2654
  return cached;
2578
2655
  }
2579
- const columnNames = Object.entries(getColumns2(table)).filter(([columnName, column]) => predicate(column, columnName)).map(([columnName]) => columnName);
2656
+ const columnNames = Object.entries(visibleColumns(table)).filter(([columnName, column]) => predicate(column, columnName)).map(([columnName]) => columnName);
2580
2657
  if (!columnNames.length) {
2581
2658
  return void 0;
2582
2659
  }
@@ -2589,7 +2666,7 @@ var generateColumnEnum = (table, enumName, description, predicate = () => true)
2589
2666
  tableCache = /* @__PURE__ */ new Map();
2590
2667
  columnEnumCache.set(table, tableCache);
2591
2668
  }
2592
- tableCache.set(enumName, enumType);
2669
+ tableCache.set(cacheKey, enumType);
2593
2670
  return enumType;
2594
2671
  };
2595
2672
  var generateDistinctEnum = (table, typeName) => generateColumnEnum(table, `${typeName}DistinctColumn`, `Columns of ${typeName} that a query can be made distinct on`);
@@ -2744,7 +2821,16 @@ var primaryKeyRestriction = (table, pkNames, keys) => {
2744
2821
  };
2745
2822
  var prepareMutationRelationColumns = (params) => {
2746
2823
  const { relationMap, tables, tableName, typeName, typeNameMapper, table, pkNames, parsedInfo } = params;
2747
- const withParams = relationMap[tableName] ? extractRelationsParams(relationMap, tables, tableName, parsedInfo, typeName, typeNameMapper) : void 0;
2824
+ const withParams = relationMap[tableName] ? extractRelationsParams(
2825
+ relationMap,
2826
+ tables,
2827
+ tableName,
2828
+ parsedInfo,
2829
+ typeName,
2830
+ typeNameMapper,
2831
+ void 0,
2832
+ params.limits
2833
+ ) : void 0;
2748
2834
  const hasRelations = !!(withParams && Object.keys(withParams).length);
2749
2835
  const baseColumns = extractSelectedColumnsFromTreeSQLFormat(parsedInfo.fieldsByTypeName[typeName], table, {
2750
2836
  tableName,
@@ -3048,7 +3134,16 @@ var runRelationalSelect = async (opts) => {
3048
3134
  ) : void 0
3049
3135
  )
3050
3136
  } : void 0,
3051
- with: relationMap[tableName] ? extractRelationsParams(relationMap, tables, tableName, parsedInfo, typeName, typeNameMapper, filterCtx) : void 0
3137
+ with: relationMap[tableName] ? extractRelationsParams(
3138
+ relationMap,
3139
+ tables,
3140
+ tableName,
3141
+ parsedInfo,
3142
+ typeName,
3143
+ typeNameMapper,
3144
+ filterCtx,
3145
+ opts.limits
3146
+ ) : void 0
3052
3147
  };
3053
3148
  if (single) {
3054
3149
  const result2 = await queryBase.findFirst(params);
@@ -3191,7 +3286,7 @@ var classifyAggregateColumns = (table, tableName) => {
3191
3286
  const numeric = {};
3192
3287
  const orderable = {};
3193
3288
  const all = {};
3194
- for (const [columnName, column] of Object.entries(getColumns3(table))) {
3289
+ for (const [columnName, column] of Object.entries(visibleColumns(table))) {
3195
3290
  all[columnName] = column;
3196
3291
  const converted = drizzleColumnToGraphQLType(column, columnName, tableName, true, false, false);
3197
3292
  const gqlType = converted.type;
@@ -3435,7 +3530,7 @@ var HAVING_OPS = { eq: eq2, ne: ne2, gt: gt2, gte: gte2, lt: lt2, lte: lte2 };
3435
3530
  var groupableColumns = (table, tableName) => {
3436
3531
  const { orderable } = classifyAggregateColumns(table, tableName);
3437
3532
  const groupable = { ...orderable };
3438
- for (const [columnName, column] of Object.entries(getColumns3(table))) {
3533
+ for (const [columnName, column] of Object.entries(visibleColumns(table))) {
3439
3534
  if (groupable[columnName]) {
3440
3535
  continue;
3441
3536
  }
@@ -3610,7 +3705,7 @@ var generateGroupBy = (db, tableName, table, typeName, fieldName, filterArgs, gr
3610
3705
  };
3611
3706
 
3612
3707
  // src/util/builders/mysql.ts
3613
- var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true) => {
3708
+ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits) => {
3614
3709
  const queryBase = db.query[tableName];
3615
3710
  if (!queryBase) {
3616
3711
  throw new Error(
@@ -3618,6 +3713,7 @@ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filter
3618
3713
  );
3619
3714
  }
3620
3715
  const table = tables[tableName];
3716
+ const limitPolicy = limits?.(tableName);
3621
3717
  const pkNames = mysqlPrimaryKeyPropNames(table);
3622
3718
  const queryArgs = selectArrayArgs(
3623
3719
  orderArgs,
@@ -3640,8 +3736,10 @@ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filter
3640
3736
  typeNameMapper,
3641
3737
  parsedInfo,
3642
3738
  ...args,
3739
+ limit: applyLimitPolicy(args.limit, limitPolicy, fieldName),
3643
3740
  single: false,
3644
3741
  filterCtx,
3742
+ limits,
3645
3743
  pkNames,
3646
3744
  db: executor,
3647
3745
  // MySQL sorts NULLs as the smallest values (first in ASC).
@@ -3654,7 +3752,7 @@ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filter
3654
3752
  args: queryArgs
3655
3753
  };
3656
3754
  };
3657
- var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx) => {
3755
+ var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits) => {
3658
3756
  const queryBase = db.query[tableName];
3659
3757
  if (!queryBase) {
3660
3758
  throw new Error(
@@ -3682,6 +3780,7 @@ var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filte
3682
3780
  ...args,
3683
3781
  single: true,
3684
3782
  filterCtx,
3783
+ limits,
3685
3784
  pkNames,
3686
3785
  db: executor
3687
3786
  });
@@ -3896,10 +3995,11 @@ var generateDelete = (db, tableName, table, filterArgs, fieldName, single, requi
3896
3995
  };
3897
3996
  var mysqlPrimaryKeyPropNames = (table) => getPrimaryKeyPropNamesFromConfig(table, getTableConfig);
3898
3997
  var generateSchemaData = (db, schema, relations, options) => {
3899
- const { relationsDepthLimit, prefixes, suffixes, typeNameMapper, shouldEagerLoad, features, complexity } = options;
3998
+ const { relationsDepthLimit, prefixes, suffixes, typeNameMapper, shouldEagerLoad, features, complexity, limits } = options;
3900
3999
  const rawSchema = schema;
3901
4000
  const schemaEntries = Object.entries(rawSchema);
3902
- const tableEntries = schemaEntries.filter(([_key, value]) => is4(value, MySqlTable));
4001
+ const excludedTables = new Set(options.exclude?.tables ?? []);
4002
+ const tableEntries = schemaEntries.filter(([key, value]) => is4(value, MySqlTable) && !excludedTables.has(key));
3903
4003
  const tables = Object.fromEntries(tableEntries);
3904
4004
  if (!tableEntries.length) {
3905
4005
  throw new Error(
@@ -3913,7 +4013,11 @@ var generateSchemaData = (db, schema, relations, options) => {
3913
4013
  }
3914
4014
  registerScalarOverrides(tables, options);
3915
4015
  registerEnumConfig(options);
4016
+ registerColumnExclusions(tables, options.exclude);
3916
4017
  const namedRelations = buildNamedRelations(relations ?? {}, tableEntries);
4018
+ for (const excluded of excludedTables) {
4019
+ delete namedRelations[excluded];
4020
+ }
3917
4021
  attachTargetPrimaryKeys(namedRelations, tables, mysqlPrimaryKeyPropNames);
3918
4022
  const eagerRelations = pruneNonEagerRelations(namedRelations, shouldEagerLoad);
3919
4023
  const filterCtx = { tables, relationMap: namedRelations };
@@ -3921,7 +4025,8 @@ var generateSchemaData = (db, schema, relations, options) => {
3921
4025
  db,
3922
4026
  tables,
3923
4027
  "nulls-smallest",
3924
- filterCtx
4028
+ filterCtx,
4029
+ limits
3925
4030
  );
3926
4031
  const cacheCtx = {
3927
4032
  genericFilterCache: /* @__PURE__ */ new Map(),
@@ -3936,6 +4041,7 @@ var generateSchemaData = (db, schema, relations, options) => {
3936
4041
  listRelationFilterCache: /* @__PURE__ */ new Map(),
3937
4042
  aggregateTypeCache: /* @__PURE__ */ new Map(),
3938
4043
  complexity,
4044
+ limits,
3939
4045
  docs: options.docs ?? {},
3940
4046
  features
3941
4047
  };
@@ -4006,7 +4112,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4006
4112
  typeName,
4007
4113
  typeNameMapper,
4008
4114
  filterCtx,
4009
- features.distinct
4115
+ features.distinct,
4116
+ limits
4010
4117
  );
4011
4118
  const selectSingleGenerated = generateSelectSingle(
4012
4119
  db,
@@ -4018,7 +4125,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4018
4125
  singleFieldName,
4019
4126
  typeName,
4020
4127
  typeNameMapper,
4021
- filterCtx
4128
+ filterCtx,
4129
+ limits
4022
4130
  );
4023
4131
  const insertArrGenerated = features.insert ? generateInsertArray(
4024
4132
  db,
@@ -4168,7 +4276,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4168
4276
  type: selectArrOutput,
4169
4277
  args: selectArrGenerated.args,
4170
4278
  resolve: selectArrGenerated.resolver,
4171
- ...complexity ? { extensions: { complexity: listFieldComplexity(complexity) } } : {}
4279
+ ...complexity ? { extensions: { complexity: listFieldComplexity(complexity, limits?.(tableName)) } } : {}
4172
4280
  };
4173
4281
  queries[selectSingleGenerated.name] = {
4174
4282
  type: selectSingleOutput,
@@ -4388,7 +4496,7 @@ var createNestedWriteTypes = (params) => {
4388
4496
  }
4389
4497
  const omitted = plan.fkSide === "child" ? plan.foreignColPropName : void 0;
4390
4498
  const fields = Object.fromEntries(
4391
- Object.entries(getColumns4(plan.targetTable)).filter(([columnName]) => columnName !== omitted).map(([columnName, column]) => [
4499
+ Object.entries(visibleColumns(plan.targetTable)).filter(([columnName]) => columnName !== omitted).map(([columnName, column]) => [
4392
4500
  columnName,
4393
4501
  drizzleColumnToGraphQLType(column, columnName, plan.targetTableName, false, true, true)
4394
4502
  ])
@@ -4664,9 +4772,10 @@ var updateWithNestedOps = async (params) => {
4664
4772
  };
4665
4773
 
4666
4774
  // src/util/builders/pg.ts
4667
- var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true) => {
4775
+ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits) => {
4668
4776
  const queryBase = db.query[tableName];
4669
4777
  const table = tables[tableName];
4778
+ const limitPolicy = limits?.(tableName);
4670
4779
  const pkNames = pgPrimaryKeyPropNames(table);
4671
4780
  const queryArgs = selectArrayArgs(
4672
4781
  orderArgs,
@@ -4679,6 +4788,7 @@ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filte
4679
4788
  try {
4680
4789
  const parsedInfo = parseResolveInfo3(info, { deep: true });
4681
4790
  const { executor, queryBase: requestQueryBase } = resolveQueryExecutor(db, context, tableName, queryBase);
4791
+ const limit = applyLimitPolicy(args.limit, limitPolicy, fieldName);
4682
4792
  if (requestQueryBase) {
4683
4793
  return await runRelationalSelect({
4684
4794
  queryBase: requestQueryBase,
@@ -4690,15 +4800,17 @@ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filte
4690
4800
  typeNameMapper,
4691
4801
  parsedInfo,
4692
4802
  ...args,
4803
+ limit,
4693
4804
  single: false,
4694
4805
  filterCtx,
4806
+ limits,
4695
4807
  pkNames,
4696
4808
  db: executor,
4697
4809
  // PostgreSQL sorts NULLs as the largest values (last in ASC).
4698
4810
  nullOrdering: "nulls-largest"
4699
4811
  });
4700
4812
  }
4701
- const { offset, limit, orderBy, where, distinct, after } = args;
4813
+ const { offset, orderBy, where, distinct, after } = args;
4702
4814
  const selectedColumnsSql = extractSelectedColumnsFromTreeSQLFormat(
4703
4815
  parsedInfo.fieldsByTypeName[typeName],
4704
4816
  table,
@@ -4788,7 +4900,7 @@ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filte
4788
4900
  args: queryArgs
4789
4901
  };
4790
4902
  };
4791
- var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx) => {
4903
+ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits) => {
4792
4904
  const queryBase = db.query[tableName];
4793
4905
  const queryArgs = selectSingleArgs(orderArgs, filterArgs);
4794
4906
  const table = tables[tableName];
@@ -4812,6 +4924,7 @@ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filt
4812
4924
  ...args,
4813
4925
  single: true,
4814
4926
  filterCtx,
4927
+ limits,
4815
4928
  pkNames,
4816
4929
  db: executor
4817
4930
  });
@@ -4845,7 +4958,7 @@ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filt
4845
4958
  };
4846
4959
  };
4847
4960
  var pgPrimaryKeyPropNames = (table) => getPrimaryKeyPropNamesFromConfig(table, getTableConfig2);
4848
- var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested) => {
4961
+ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
4849
4962
  const queryArgs = {
4850
4963
  values: {
4851
4964
  type: new GraphQLNonNull7(new GraphQLList7(new GraphQLNonNull7(baseType)))
@@ -4874,7 +4987,8 @@ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType,
4874
4987
  typeNameMapper,
4875
4988
  table,
4876
4989
  pkNames,
4877
- parsedInfo
4990
+ parsedInfo,
4991
+ limits
4878
4992
  });
4879
4993
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
4880
4994
  const runInsert = async (target, values) => {
@@ -4902,7 +5016,7 @@ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType,
4902
5016
  args: queryArgs
4903
5017
  };
4904
5018
  };
4905
- var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested) => {
5019
+ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
4906
5020
  const queryArgs = {
4907
5021
  values: {
4908
5022
  type: new GraphQLNonNull7(baseType)
@@ -4928,7 +5042,8 @@ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType
4928
5042
  typeNameMapper,
4929
5043
  table,
4930
5044
  pkNames,
4931
- parsedInfo
5045
+ parsedInfo,
5046
+ limits
4932
5047
  });
4933
5048
  const returning = nestedEntry ? nested.withJoinColumns(tableName, nestedEntry.ops, { ...columns }, table) : columns;
4934
5049
  const runInsert = async (target, values) => {
@@ -4962,7 +5077,7 @@ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType
4962
5077
  args: queryArgs
4963
5078
  };
4964
5079
  };
4965
- var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested) => {
5080
+ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested, limits) => {
4966
5081
  const queryArgs = {
4967
5082
  values: {
4968
5083
  type: single ? new GraphQLNonNull7(baseType) : new GraphQLNonNull7(new GraphQLList7(new GraphQLNonNull7(baseType)))
@@ -4994,7 +5109,8 @@ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onCo
4994
5109
  typeNameMapper,
4995
5110
  table,
4996
5111
  pkNames,
4997
- parsedInfo
5112
+ parsedInfo,
5113
+ limits
4998
5114
  });
4999
5115
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
5000
5116
  const runUpsert = async (target, values) => {
@@ -5033,7 +5149,7 @@ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onCo
5033
5149
  args: queryArgs
5034
5150
  };
5035
5151
  };
5036
- var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested) => {
5152
+ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested, limits) => {
5037
5153
  const queryArgs = {
5038
5154
  set: {
5039
5155
  type: new GraphQLNonNull7(setArgs)
@@ -5060,7 +5176,8 @@ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filte
5060
5176
  typeNameMapper,
5061
5177
  table,
5062
5178
  pkNames,
5063
- parsedInfo
5179
+ parsedInfo,
5180
+ limits
5064
5181
  });
5065
5182
  const entry = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
5066
5183
  const nestedOps = entry && nested.hasOps(entry.ops) ? entry.ops : void 0;
@@ -5107,7 +5224,7 @@ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filte
5107
5224
  args: queryArgs
5108
5225
  };
5109
5226
  };
5110
- var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested) => {
5227
+ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested, limits) => {
5111
5228
  const queryArgs = {
5112
5229
  updates: {
5113
5230
  type: new GraphQLNonNull7(new GraphQLList7(new GraphQLNonNull7(updateManyInput)))
@@ -5134,7 +5251,8 @@ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateMany
5134
5251
  typeNameMapper,
5135
5252
  table,
5136
5253
  pkNames,
5137
- parsedInfo
5254
+ parsedInfo,
5255
+ limits
5138
5256
  });
5139
5257
  const entries = updates.map(({ where, set }) => {
5140
5258
  const split = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
@@ -5252,10 +5370,12 @@ function generateSchemaData2(db, schema, relations, options) {
5252
5370
  typeNameMapper,
5253
5371
  shouldEagerLoad,
5254
5372
  features,
5255
- complexity
5373
+ complexity,
5374
+ limits
5256
5375
  } = options;
5257
5376
  const schemaEntries = Object.entries(schema);
5258
- const tableEntries = schemaEntries.filter(([_key, value]) => is6(value, PgTable));
5377
+ const excludedTables = new Set(options.exclude?.tables ?? []);
5378
+ const tableEntries = schemaEntries.filter(([key, value]) => is6(value, PgTable) && !excludedTables.has(key));
5259
5379
  const tables = Object.fromEntries(tableEntries);
5260
5380
  if (!tableEntries.length) {
5261
5381
  throw new Error(
@@ -5264,7 +5384,11 @@ function generateSchemaData2(db, schema, relations, options) {
5264
5384
  }
5265
5385
  registerScalarOverrides(tables, options);
5266
5386
  registerEnumConfig(options);
5387
+ registerColumnExclusions(tables, options.exclude);
5267
5388
  const namedRelations = buildNamedRelations(relations ?? {}, tableEntries);
5389
+ for (const excluded of excludedTables) {
5390
+ delete namedRelations[excluded];
5391
+ }
5268
5392
  attachTargetPrimaryKeys(namedRelations, tables, pgPrimaryKeyPropNames);
5269
5393
  const eagerRelations = pruneNonEagerRelations(namedRelations, shouldEagerLoad);
5270
5394
  const filterCtx = { tables, relationMap: namedRelations };
@@ -5272,7 +5396,8 @@ function generateSchemaData2(db, schema, relations, options) {
5272
5396
  db,
5273
5397
  tables,
5274
5398
  "nulls-largest",
5275
- filterCtx
5399
+ filterCtx,
5400
+ limits
5276
5401
  );
5277
5402
  const cacheCtx = {
5278
5403
  genericFilterCache: /* @__PURE__ */ new Map(),
@@ -5287,6 +5412,7 @@ function generateSchemaData2(db, schema, relations, options) {
5287
5412
  listRelationFilterCache: /* @__PURE__ */ new Map(),
5288
5413
  aggregateTypeCache: /* @__PURE__ */ new Map(),
5289
5414
  complexity,
5415
+ limits,
5290
5416
  docs: options.docs ?? {},
5291
5417
  features
5292
5418
  };
@@ -5356,7 +5482,8 @@ function generateSchemaData2(db, schema, relations, options) {
5356
5482
  typeName,
5357
5483
  typeNameMapper,
5358
5484
  filterCtx,
5359
- features.distinct
5485
+ features.distinct,
5486
+ limits
5360
5487
  );
5361
5488
  const selectSingleGenerated = generateSelectSingle2(
5362
5489
  db,
@@ -5368,7 +5495,8 @@ function generateSchemaData2(db, schema, relations, options) {
5368
5495
  singleFieldName,
5369
5496
  typeName,
5370
5497
  typeNameMapper,
5371
- filterCtx
5498
+ filterCtx,
5499
+ limits
5372
5500
  );
5373
5501
  const insertArrGenerated = features.insert ? generateInsertArray2(
5374
5502
  db,
@@ -5382,7 +5510,8 @@ function generateSchemaData2(db, schema, relations, options) {
5382
5510
  typeNameMapper,
5383
5511
  conflictDoNothing,
5384
5512
  mutationTxCtx,
5385
- nestedRuntime
5513
+ nestedRuntime,
5514
+ limits
5386
5515
  ) : void 0;
5387
5516
  const insertSingleGenerated = features.insert ? generateInsertSingle2(
5388
5517
  db,
@@ -5396,7 +5525,8 @@ function generateSchemaData2(db, schema, relations, options) {
5396
5525
  typeNameMapper,
5397
5526
  conflictDoNothing,
5398
5527
  mutationTxCtx,
5399
- nestedRuntime
5528
+ nestedRuntime,
5529
+ limits
5400
5530
  ) : void 0;
5401
5531
  const uniqueSets = features.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig2) : [];
5402
5532
  const onConflictInput = features.upsert ? generateOnConflictInput({
@@ -5421,7 +5551,8 @@ function generateSchemaData2(db, schema, relations, options) {
5421
5551
  typeNameMapper,
5422
5552
  filterCtx,
5423
5553
  mutationTxCtx,
5424
- nestedRuntime
5554
+ nestedRuntime,
5555
+ limits
5425
5556
  ) : void 0;
5426
5557
  const upsertSingleGenerated = onConflictInput ? generateUpsert2(
5427
5558
  db,
@@ -5438,7 +5569,8 @@ function generateSchemaData2(db, schema, relations, options) {
5438
5569
  typeNameMapper,
5439
5570
  filterCtx,
5440
5571
  mutationTxCtx,
5441
- nestedRuntime
5572
+ nestedRuntime,
5573
+ limits
5442
5574
  ) : void 0;
5443
5575
  const updateGenerated = features.update ? generateUpdate2(
5444
5576
  db,
@@ -5455,7 +5587,8 @@ function generateSchemaData2(db, schema, relations, options) {
5455
5587
  typeNameMapper,
5456
5588
  filterCtx,
5457
5589
  mutationTxCtx,
5458
- nestedRuntime
5590
+ nestedRuntime,
5591
+ limits
5459
5592
  ) : void 0;
5460
5593
  const updateSingleGenerated = features.update ? generateUpdate2(
5461
5594
  db,
@@ -5472,7 +5605,8 @@ function generateSchemaData2(db, schema, relations, options) {
5472
5605
  typeNameMapper,
5473
5606
  filterCtx,
5474
5607
  mutationTxCtx,
5475
- nestedRuntime
5608
+ nestedRuntime,
5609
+ limits
5476
5610
  ) : void 0;
5477
5611
  const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
5478
5612
  const updateManyGenerated = updateManyInput ? generateUpdateMany2(
@@ -5487,7 +5621,8 @@ function generateSchemaData2(db, schema, relations, options) {
5487
5621
  typeNameMapper,
5488
5622
  filterCtx,
5489
5623
  mutationTxCtx,
5490
- nestedRuntime
5624
+ nestedRuntime,
5625
+ limits
5491
5626
  ) : void 0;
5492
5627
  const deleteGenerated = features.delete ? generateDelete2(
5493
5628
  db,
@@ -5567,7 +5702,7 @@ function generateSchemaData2(db, schema, relations, options) {
5567
5702
  type: selectArrOutput,
5568
5703
  args: selectArrGenerated.args,
5569
5704
  resolve: selectArrGenerated.resolver,
5570
- ...complexity ? { extensions: { complexity: listFieldComplexity(complexity) } } : {}
5705
+ ...complexity ? { extensions: { complexity: listFieldComplexity(complexity, limits?.(tableName)) } } : {}
5571
5706
  };
5572
5707
  queries[selectSingleGenerated.name] = {
5573
5708
  type: selectSingleOutput,
@@ -5729,7 +5864,7 @@ import {
5729
5864
  GraphQLNonNull as GraphQLNonNull8
5730
5865
  } from "graphql";
5731
5866
  import { parseResolveInfo as parseResolveInfo4 } from "graphql-parse-resolve-info";
5732
- var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true) => {
5867
+ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits) => {
5733
5868
  const queryBase = db.query[tableName];
5734
5869
  if (!queryBase) {
5735
5870
  throw new Error(
@@ -5737,6 +5872,7 @@ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filte
5737
5872
  );
5738
5873
  }
5739
5874
  const table = tables[tableName];
5875
+ const limitPolicy = limits?.(tableName);
5740
5876
  const pkNames = sqlitePrimaryKeyPropNames(table);
5741
5877
  const queryArgs = selectArrayArgs(
5742
5878
  orderArgs,
@@ -5759,8 +5895,10 @@ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filte
5759
5895
  typeNameMapper,
5760
5896
  parsedInfo,
5761
5897
  ...args,
5898
+ limit: applyLimitPolicy(args.limit, limitPolicy, fieldName),
5762
5899
  single: false,
5763
5900
  filterCtx,
5901
+ limits,
5764
5902
  pkNames,
5765
5903
  db: executor,
5766
5904
  // SQLite sorts NULLs as the smallest values (first in ASC).
@@ -5773,7 +5911,7 @@ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filte
5773
5911
  args: queryArgs
5774
5912
  };
5775
5913
  };
5776
- var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx) => {
5914
+ var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits) => {
5777
5915
  const queryBase = db.query[tableName];
5778
5916
  if (!queryBase) {
5779
5917
  throw new Error(
@@ -5801,6 +5939,7 @@ var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filt
5801
5939
  ...args,
5802
5940
  single: true,
5803
5941
  filterCtx,
5942
+ limits,
5804
5943
  pkNames,
5805
5944
  db: executor
5806
5945
  });
@@ -5812,7 +5951,7 @@ var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filt
5812
5951
  };
5813
5952
  };
5814
5953
  var sqlitePrimaryKeyPropNames = (table) => getPrimaryKeyPropNamesFromConfig(table, getTableConfig3);
5815
- var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested) => {
5954
+ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
5816
5955
  const queryArgs = {
5817
5956
  values: {
5818
5957
  type: new GraphQLNonNull8(new GraphQLList8(new GraphQLNonNull8(baseType)))
@@ -5841,7 +5980,8 @@ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType,
5841
5980
  typeNameMapper,
5842
5981
  table,
5843
5982
  pkNames,
5844
- parsedInfo
5983
+ parsedInfo,
5984
+ limits
5845
5985
  });
5846
5986
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
5847
5987
  const runInsert = async (target, values) => {
@@ -5869,7 +6009,7 @@ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType,
5869
6009
  args: queryArgs
5870
6010
  };
5871
6011
  };
5872
- var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested) => {
6012
+ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
5873
6013
  const queryArgs = {
5874
6014
  values: {
5875
6015
  type: new GraphQLNonNull8(baseType)
@@ -5895,7 +6035,8 @@ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType
5895
6035
  typeNameMapper,
5896
6036
  table,
5897
6037
  pkNames,
5898
- parsedInfo
6038
+ parsedInfo,
6039
+ limits
5899
6040
  });
5900
6041
  const returning = nestedEntry ? nested.withJoinColumns(tableName, nestedEntry.ops, { ...columns }, table) : columns;
5901
6042
  const runInsert = async (target, values) => {
@@ -5929,7 +6070,7 @@ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType
5929
6070
  args: queryArgs
5930
6071
  };
5931
6072
  };
5932
- var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested) => {
6073
+ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested, limits) => {
5933
6074
  const queryArgs = {
5934
6075
  values: {
5935
6076
  type: single ? new GraphQLNonNull8(baseType) : new GraphQLNonNull8(new GraphQLList8(new GraphQLNonNull8(baseType)))
@@ -5961,7 +6102,8 @@ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onCo
5961
6102
  typeNameMapper,
5962
6103
  table,
5963
6104
  pkNames,
5964
- parsedInfo
6105
+ parsedInfo,
6106
+ limits
5965
6107
  });
5966
6108
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
5967
6109
  const runUpsert = async (target, values) => {
@@ -6000,7 +6142,7 @@ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onCo
6000
6142
  args: queryArgs
6001
6143
  };
6002
6144
  };
6003
- var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested) => {
6145
+ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested, limits) => {
6004
6146
  const queryArgs = {
6005
6147
  set: {
6006
6148
  type: new GraphQLNonNull8(setArgs)
@@ -6027,7 +6169,8 @@ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filte
6027
6169
  typeNameMapper,
6028
6170
  table,
6029
6171
  pkNames,
6030
- parsedInfo
6172
+ parsedInfo,
6173
+ limits
6031
6174
  });
6032
6175
  const entry = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
6033
6176
  const nestedOps = entry && nested.hasOps(entry.ops) ? entry.ops : void 0;
@@ -6074,7 +6217,7 @@ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filte
6074
6217
  args: queryArgs
6075
6218
  };
6076
6219
  };
6077
- var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested) => {
6220
+ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested, limits) => {
6078
6221
  const queryArgs = {
6079
6222
  updates: {
6080
6223
  type: new GraphQLNonNull8(new GraphQLList8(new GraphQLNonNull8(updateManyInput)))
@@ -6101,7 +6244,8 @@ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateMany
6101
6244
  typeNameMapper,
6102
6245
  table,
6103
6246
  pkNames,
6104
- parsedInfo
6247
+ parsedInfo,
6248
+ limits
6105
6249
  });
6106
6250
  const entries = updates.map(({ where, set }) => {
6107
6251
  const split = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
@@ -6247,11 +6391,13 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6247
6391
  typeNameMapper,
6248
6392
  shouldEagerLoad,
6249
6393
  features,
6250
- complexity
6394
+ complexity,
6395
+ limits
6251
6396
  } = options;
6252
6397
  const rawSchema = schema;
6253
6398
  const schemaEntries = Object.entries(rawSchema);
6254
- const tableEntries = schemaEntries.filter(([_key, value]) => is7(value, SQLiteTable));
6399
+ const excludedTables = new Set(options.exclude?.tables ?? []);
6400
+ const tableEntries = schemaEntries.filter(([key, value]) => is7(value, SQLiteTable) && !excludedTables.has(key));
6255
6401
  const tables = Object.fromEntries(tableEntries);
6256
6402
  if (!tableEntries.length) {
6257
6403
  throw new Error(
@@ -6260,7 +6406,11 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6260
6406
  }
6261
6407
  registerScalarOverrides(tables, options);
6262
6408
  registerEnumConfig(options);
6409
+ registerColumnExclusions(tables, options.exclude);
6263
6410
  const namedRelations = buildNamedRelations(relations ?? {}, tableEntries);
6411
+ for (const excluded of excludedTables) {
6412
+ delete namedRelations[excluded];
6413
+ }
6264
6414
  attachTargetPrimaryKeys(namedRelations, tables, sqlitePrimaryKeyPropNames);
6265
6415
  const eagerRelations = pruneNonEagerRelations(namedRelations, shouldEagerLoad);
6266
6416
  const filterCtx = { tables, relationMap: namedRelations };
@@ -6268,7 +6418,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6268
6418
  db,
6269
6419
  tables,
6270
6420
  "nulls-smallest",
6271
- filterCtx
6421
+ filterCtx,
6422
+ limits
6272
6423
  );
6273
6424
  const cacheCtx = {
6274
6425
  genericFilterCache: /* @__PURE__ */ new Map(),
@@ -6283,6 +6434,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6283
6434
  listRelationFilterCache: /* @__PURE__ */ new Map(),
6284
6435
  aggregateTypeCache: /* @__PURE__ */ new Map(),
6285
6436
  complexity,
6437
+ limits,
6286
6438
  docs: options.docs ?? {},
6287
6439
  features
6288
6440
  };
@@ -6362,7 +6514,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6362
6514
  typeName,
6363
6515
  typeNameMapper,
6364
6516
  filterCtx,
6365
- features.distinct
6517
+ features.distinct,
6518
+ limits
6366
6519
  );
6367
6520
  const selectSingleGenerated = generateSelectSingle3(
6368
6521
  db,
@@ -6374,7 +6527,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6374
6527
  singleFieldName,
6375
6528
  typeName,
6376
6529
  typeNameMapper,
6377
- filterCtx
6530
+ filterCtx,
6531
+ limits
6378
6532
  );
6379
6533
  const insertArrGenerated = features.insert ? generateInsertArray3(
6380
6534
  db,
@@ -6388,7 +6542,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6388
6542
  typeNameMapper,
6389
6543
  conflictDoNothing,
6390
6544
  mutationTxCtx,
6391
- nestedRuntime
6545
+ nestedRuntime,
6546
+ limits
6392
6547
  ) : void 0;
6393
6548
  const insertSingleGenerated = features.insert ? generateInsertSingle3(
6394
6549
  db,
@@ -6402,7 +6557,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6402
6557
  typeNameMapper,
6403
6558
  conflictDoNothing,
6404
6559
  mutationTxCtx,
6405
- nestedRuntime
6560
+ nestedRuntime,
6561
+ limits
6406
6562
  ) : void 0;
6407
6563
  const uniqueSets = features.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig3) : [];
6408
6564
  const onConflictInput = features.upsert ? generateOnConflictInput({
@@ -6427,7 +6583,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6427
6583
  typeNameMapper,
6428
6584
  filterCtx,
6429
6585
  mutationTxCtx,
6430
- nestedRuntime
6586
+ nestedRuntime,
6587
+ limits
6431
6588
  ) : void 0;
6432
6589
  const upsertSingleGenerated = onConflictInput ? generateUpsert3(
6433
6590
  db,
@@ -6444,7 +6601,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6444
6601
  typeNameMapper,
6445
6602
  filterCtx,
6446
6603
  mutationTxCtx,
6447
- nestedRuntime
6604
+ nestedRuntime,
6605
+ limits
6448
6606
  ) : void 0;
6449
6607
  const updateGenerated = features.update ? generateUpdate3(
6450
6608
  db,
@@ -6461,7 +6619,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6461
6619
  typeNameMapper,
6462
6620
  filterCtx,
6463
6621
  mutationTxCtx,
6464
- nestedRuntime
6622
+ nestedRuntime,
6623
+ limits
6465
6624
  ) : void 0;
6466
6625
  const updateSingleGenerated = features.update ? generateUpdate3(
6467
6626
  db,
@@ -6478,7 +6637,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6478
6637
  typeNameMapper,
6479
6638
  filterCtx,
6480
6639
  mutationTxCtx,
6481
- nestedRuntime
6640
+ nestedRuntime,
6641
+ limits
6482
6642
  ) : void 0;
6483
6643
  const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
6484
6644
  const updateManyGenerated = updateManyInput ? generateUpdateMany3(
@@ -6493,7 +6653,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6493
6653
  typeNameMapper,
6494
6654
  filterCtx,
6495
6655
  mutationTxCtx,
6496
- nestedRuntime
6656
+ nestedRuntime,
6657
+ limits
6497
6658
  ) : void 0;
6498
6659
  const deleteGenerated = features.delete ? generateDelete3(
6499
6660
  db,
@@ -6573,7 +6734,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6573
6734
  type: selectArrOutput,
6574
6735
  args: selectArrGenerated.args,
6575
6736
  resolve: selectArrGenerated.resolver,
6576
- ...complexity ? { extensions: { complexity: listFieldComplexity(complexity) } } : {}
6737
+ ...complexity ? { extensions: { complexity: listFieldComplexity(complexity, limits?.(tableName)) } } : {}
6577
6738
  };
6578
6739
  queries[selectSingleGenerated.name] = {
6579
6740
  type: selectSingleOutput,
@@ -6769,6 +6930,76 @@ var buildSchema = (db, config) => {
6769
6930
  };
6770
6931
  const transactionsOpt = config?.transactions;
6771
6932
  const transactions = transactionsOpt === void 0 || transactionsOpt === "none" ? void 0 : { timeoutMs: (transactionsOpt === "auto" ? void 0 : transactionsOpt.timeoutMs) ?? 3e4 };
6933
+ const limitsConfig = config?.limits;
6934
+ if (limitsConfig) {
6935
+ const check = (policy, where) => {
6936
+ for (const key of ["defaultLimit", "maxLimit"]) {
6937
+ const value = policy[key];
6938
+ if (value === void 0) {
6939
+ continue;
6940
+ }
6941
+ if (!Number.isInteger(value) || value < 1) {
6942
+ throw new Error(`Drizzle-GraphQL Error: config.limits${where}.${key} must be a positive integer.`);
6943
+ }
6944
+ }
6945
+ };
6946
+ check(limitsConfig, "");
6947
+ for (const [tableName, policy] of Object.entries(limitsConfig.tables ?? {})) {
6948
+ check(policy, `.tables.${tableName}`);
6949
+ }
6950
+ }
6951
+ const limitPolicyCache = /* @__PURE__ */ new Map();
6952
+ const limits = limitsConfig ? (tableName) => {
6953
+ if (limitPolicyCache.has(tableName)) {
6954
+ return limitPolicyCache.get(tableName);
6955
+ }
6956
+ const resolved = resolveLimitPolicy(limitsConfig, limitsConfig.tables?.[tableName]);
6957
+ limitPolicyCache.set(tableName, resolved);
6958
+ return resolved;
6959
+ } : void 0;
6960
+ const exclude = config?.exclude;
6961
+ if (exclude) {
6962
+ const tableNames = new Set(
6963
+ Object.entries(schema).filter(([, value]) => is8(value, Table)).map(([key]) => key)
6964
+ );
6965
+ const excludedTables = new Set(exclude.tables ?? []);
6966
+ for (const tableName of excludedTables) {
6967
+ if (!tableNames.has(tableName)) {
6968
+ throw new Error(
6969
+ `Drizzle-GraphQL Error: config.exclude.tables names '${tableName}', which is not a table in the Drizzle schema.`
6970
+ );
6971
+ }
6972
+ }
6973
+ if (excludedTables.size >= tableNames.size) {
6974
+ throw new Error(
6975
+ "Drizzle-GraphQL Error: config.exclude.tables excludes every table in the schema, leaving nothing to generate."
6976
+ );
6977
+ }
6978
+ for (const [tableName, columnNames] of Object.entries(exclude.columns ?? {})) {
6979
+ if (!tableNames.has(tableName)) {
6980
+ throw new Error(
6981
+ `Drizzle-GraphQL Error: config.exclude.columns names table '${tableName}', which is not a table in the Drizzle schema.`
6982
+ );
6983
+ }
6984
+ if (excludedTables.has(tableName)) {
6985
+ continue;
6986
+ }
6987
+ const columns = getColumns6(schema[tableName]);
6988
+ for (const columnName of columnNames) {
6989
+ const column = columns[columnName];
6990
+ if (!column) {
6991
+ throw new Error(
6992
+ `Drizzle-GraphQL Error: config.exclude.columns names '${tableName}.${columnName}', which is not a column of that table.`
6993
+ );
6994
+ }
6995
+ if (column.notNull && !column.hasDefault && !column.defaultFn) {
6996
+ console.warn(
6997
+ `Drizzle-GraphQL Warning: excluded column '${tableName}.${columnName}' is NOT NULL with no default, so generated inserts for '${tableName}' can never succeed.`
6998
+ );
6999
+ }
7000
+ }
7001
+ }
7002
+ }
6772
7003
  const eagerOpt = config?.eagerLoadRelations;
6773
7004
  const shouldEagerLoad = eagerOpt === void 0 || eagerOpt === true ? () => true : eagerOpt === false ? () => false : eagerOpt;
6774
7005
  if (!typeNameMapper && suffixes.list === suffixes.single) {
@@ -6801,6 +7032,8 @@ var buildSchema = (db, config) => {
6801
7032
  mapColumnType: config?.mapColumnType,
6802
7033
  enumNameMapper: config?.enumNameMapper,
6803
7034
  transactions,
7035
+ limits,
7036
+ exclude,
6804
7037
  docs: {
6805
7038
  describeColumn: config?.describeColumn,
6806
7039
  describeTable: config?.describeTable,