@vantreeseba/drizzle-graphql 7.3.0 → 7.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -42,7 +42,8 @@ __export(index_exports, {
42
42
  drizzleExecutorKey: () => drizzleExecutorKey,
43
43
  extractFilters: () => extractFilters,
44
44
  extractOrderBy: () => extractOrderBy,
45
- extractRelationJoinColumns: () => extractRelationJoinColumns
45
+ extractRelationJoinColumns: () => extractRelationJoinColumns,
46
+ singularizeMapper: () => singularizeMapper
46
47
  });
47
48
  module.exports = __toCommonJS(index_exports);
48
49
  var import_drizzle_orm10 = require("drizzle-orm");
@@ -105,6 +106,10 @@ var getOrCreateLoader = (context, key, batchFn) => {
105
106
  var import_pluralize = __toESM(require("pluralize"), 1);
106
107
  var uncapitalize = (input) => input?.length ? `${input[0].toLocaleLowerCase()}${input.length > 1 ? input.slice(1, input.length) : ""}` : input;
107
108
  var capitalize = (input) => input?.length ? `${input[0].toLocaleUpperCase()}${input.length > 1 ? input.slice(1, input.length) : ""}` : input;
109
+ var singularizeMapper = (tableName) => ({
110
+ singular: uncapitalize(import_pluralize.default.singular(tableName)),
111
+ plural: uncapitalize(import_pluralize.default.plural(tableName))
112
+ });
108
113
 
109
114
  // src/util/data-mappers/index.ts
110
115
  var import_drizzle_orm2 = require("drizzle-orm");
@@ -1882,7 +1887,7 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1882
1887
  ]);
1883
1888
  continue;
1884
1889
  }
1885
- const targetDistinctEnum = cacheCtx.features.distinct ? generateDistinctEnum(tables[targetTableName], resolveTypeName(targetTableName, typeNameMapper)) : void 0;
1890
+ const targetDistinctEnum = cacheCtx.featureOf(targetTableName).distinct ? generateDistinctEnum(tables[targetTableName], resolveTypeName(targetTableName, typeNameMapper)) : void 0;
1886
1891
  rawRelationFields.push([
1887
1892
  relationName,
1888
1893
  {
@@ -1992,7 +1997,7 @@ var generateTableTypes = (tableName, tables, relationMap, withReturning, relatio
1992
1997
  const updateFields = Object.fromEntries(
1993
1998
  columnEntries.map(([columnName, column]) => {
1994
1999
  const converted = drizzleColumnToGraphQLType(column, columnName, tableName, true, false, true);
1995
- const operations = cacheCtx.features.fieldUpdateOperations ? fieldUpdateInputType(column, columnName, tableName) : void 0;
2000
+ const operations = cacheCtx.featureOf(tableName).fieldUpdateOperations ? fieldUpdateInputType(column, columnName, tableName) : void 0;
1996
2001
  const field = operations ? { ...converted, type: operations } : converted;
1997
2002
  return [columnName, { ...field, ...inputFieldDocs(cacheCtx.docs, column, tableName, columnName, field.type) }];
1998
2003
  })
@@ -3410,6 +3415,38 @@ var import_mysql_core2 = require("drizzle-orm/mysql-core");
3410
3415
  var import_graphql7 = require("graphql");
3411
3416
  var import_graphql_parse_resolve_info2 = require("graphql-parse-resolve-info");
3412
3417
 
3418
+ // src/util/features.ts
3419
+ var featureDefaults = {
3420
+ aggregates: true,
3421
+ groupBy: true,
3422
+ relationAggregates: true,
3423
+ distinct: true,
3424
+ insert: true,
3425
+ update: true,
3426
+ updateMany: true,
3427
+ delete: true,
3428
+ upsert: false,
3429
+ fieldUpdateOperations: false,
3430
+ countMutations: false,
3431
+ requireWhere: false
3432
+ };
3433
+ var resolveTableFeatures = (features) => {
3434
+ const cache = /* @__PURE__ */ new Map();
3435
+ const names = Object.keys(featureDefaults);
3436
+ return (tableName) => {
3437
+ let resolved = cache.get(tableName);
3438
+ if (!resolved) {
3439
+ resolved = {};
3440
+ for (const name of names) {
3441
+ const configured = features?.[name];
3442
+ resolved[name] = configured === void 0 ? featureDefaults[name] : typeof configured === "function" ? !!configured(tableName) : !!configured;
3443
+ }
3444
+ cache.set(tableName, resolved);
3445
+ }
3446
+ return resolved;
3447
+ };
3448
+ };
3449
+
3413
3450
  // src/util/builders/aggregates.ts
3414
3451
  var import_drizzle_orm5 = require("drizzle-orm");
3415
3452
  var import_graphql6 = require("graphql");
@@ -4144,6 +4181,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4144
4181
  const excludedTables = new Set(options.exclude?.tables ?? []);
4145
4182
  const tableEntries = schemaEntries.filter(([key, value]) => (0, import_drizzle_orm6.is)(value, import_mysql_core2.MySqlTable) && !excludedTables.has(key));
4146
4183
  const tables = Object.fromEntries(tableEntries);
4184
+ const featureOf = resolveTableFeatures(features);
4185
+ const anyTable = (feature) => tableEntries.some(([name]) => featureOf(name)[feature]);
4147
4186
  if (!tableEntries.length) {
4148
4187
  throw new Error(
4149
4188
  "Drizzle-GraphQL Error: No tables detected in Drizzle-ORM's database instance. Did you forget to pass schema to drizzle constructor?"
@@ -4186,9 +4225,9 @@ var generateSchemaData = (db, schema, relations, options) => {
4186
4225
  complexity,
4187
4226
  limits,
4188
4227
  docs: options.docs ?? {},
4189
- features
4228
+ featureOf
4190
4229
  };
4191
- const relationAggregateFactory = features.relationAggregates ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
4230
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
4192
4231
  const queries = {};
4193
4232
  const mutations = {};
4194
4233
  const mutationTxCtx = createMutationTxCtx(options.transactions);
@@ -4206,7 +4245,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4206
4245
  prefixes.insert,
4207
4246
  prefixes.update,
4208
4247
  resolverFactory,
4209
- relationAggregateFactory
4248
+ featureOf(tableName).relationAggregates ? relationAggregateFactory : void 0
4210
4249
  )
4211
4250
  ])
4212
4251
  );
@@ -4220,10 +4259,11 @@ var generateSchemaData = (db, schema, relations, options) => {
4220
4259
  });
4221
4260
  const inputs = {};
4222
4261
  const outputs = {};
4223
- if (features.insert || features.upsert || features.update || features.delete) {
4262
+ if (["insert", "upsert", "update", "delete"].some((feature) => anyTable(feature))) {
4224
4263
  outputs.MutationReturn = mutationReturnType;
4225
4264
  }
4226
4265
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
4266
+ const tableFeatures = featureOf(tableName);
4227
4267
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
4228
4268
  const { selectSingleOutput, selectArrOutput } = tableTypes.outputs;
4229
4269
  const {
@@ -4255,7 +4295,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4255
4295
  typeName,
4256
4296
  typeNameMapper,
4257
4297
  filterCtx,
4258
- features.distinct,
4298
+ tableFeatures.distinct,
4259
4299
  limits
4260
4300
  );
4261
4301
  const selectSingleGenerated = generateSelectSingle(
@@ -4271,7 +4311,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4271
4311
  filterCtx,
4272
4312
  limits
4273
4313
  );
4274
- const insertArrGenerated = features.insert ? generateInsertArray(
4314
+ const insertArrGenerated = tableFeatures.insert ? generateInsertArray(
4275
4315
  db,
4276
4316
  tableName,
4277
4317
  schema[tableName],
@@ -4279,7 +4319,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4279
4319
  createArrayFieldName,
4280
4320
  mutationTxCtx
4281
4321
  ) : void 0;
4282
- const insertSingleGenerated = features.insert ? generateInsertSingle(
4322
+ const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle(
4283
4323
  db,
4284
4324
  tableName,
4285
4325
  schema[tableName],
@@ -4287,7 +4327,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4287
4327
  createSingleFieldName,
4288
4328
  mutationTxCtx
4289
4329
  ) : void 0;
4290
- const onConflictInput = features.upsert ? generateOnConflictInput({
4330
+ const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
4291
4331
  table: schema[tableName],
4292
4332
  typeName,
4293
4333
  uniqueSets: [],
@@ -4312,7 +4352,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4312
4352
  true,
4313
4353
  mutationTxCtx
4314
4354
  ) : void 0;
4315
- const updateGenerated = features.update ? generateUpdate(
4355
+ const updateGenerated = tableFeatures.update ? generateUpdate(
4316
4356
  db,
4317
4357
  tableName,
4318
4358
  schema[tableName],
@@ -4320,11 +4360,11 @@ var generateSchemaData = (db, schema, relations, options) => {
4320
4360
  tableFilters,
4321
4361
  updateFieldName,
4322
4362
  false,
4323
- features.requireWhere,
4363
+ tableFeatures.requireWhere,
4324
4364
  filterCtx,
4325
4365
  mutationTxCtx
4326
4366
  ) : void 0;
4327
- const updateSingleGenerated = features.update ? generateUpdate(
4367
+ const updateSingleGenerated = tableFeatures.update ? generateUpdate(
4328
4368
  db,
4329
4369
  tableName,
4330
4370
  schema[tableName],
@@ -4332,11 +4372,11 @@ var generateSchemaData = (db, schema, relations, options) => {
4332
4372
  tableFilters,
4333
4373
  updateSingleFieldName,
4334
4374
  true,
4335
- features.requireWhere,
4375
+ tableFeatures.requireWhere,
4336
4376
  filterCtx,
4337
4377
  mutationTxCtx
4338
4378
  ) : void 0;
4339
- const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
4379
+ const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
4340
4380
  const updateManyGenerated = updateManyInput ? generateUpdateMany(
4341
4381
  db,
4342
4382
  tableName,
@@ -4346,29 +4386,29 @@ var generateSchemaData = (db, schema, relations, options) => {
4346
4386
  filterCtx,
4347
4387
  mutationTxCtx
4348
4388
  ) : void 0;
4349
- const deleteGenerated = features.delete ? generateDelete(
4389
+ const deleteGenerated = tableFeatures.delete ? generateDelete(
4350
4390
  db,
4351
4391
  tableName,
4352
4392
  schema[tableName],
4353
4393
  tableFilters,
4354
4394
  deleteFieldName,
4355
4395
  false,
4356
- features.requireWhere,
4396
+ tableFeatures.requireWhere,
4357
4397
  filterCtx,
4358
4398
  mutationTxCtx
4359
4399
  ) : void 0;
4360
- const deleteSingleGenerated = features.delete ? generateDelete(
4400
+ const deleteSingleGenerated = tableFeatures.delete ? generateDelete(
4361
4401
  db,
4362
4402
  tableName,
4363
4403
  schema[tableName],
4364
4404
  tableFilters,
4365
4405
  deleteSingleFieldName,
4366
4406
  true,
4367
- features.requireWhere,
4407
+ tableFeatures.requireWhere,
4368
4408
  filterCtx,
4369
4409
  mutationTxCtx
4370
4410
  ) : void 0;
4371
- const updateCountGenerated = features.update && features.countMutations ? generateWriteCount({
4411
+ const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
4372
4412
  db,
4373
4413
  tableName,
4374
4414
  table: schema[tableName],
@@ -4376,23 +4416,23 @@ var generateSchemaData = (db, schema, relations, options) => {
4376
4416
  setArgs: updateInput,
4377
4417
  filterArgs: tableFilters,
4378
4418
  fieldName: updateCountFieldName,
4379
- requireWhere: features.requireWhere,
4419
+ requireWhere: tableFeatures.requireWhere,
4380
4420
  filterCtx,
4381
4421
  txCtx: mutationTxCtx
4382
4422
  }) : void 0;
4383
- const deleteCountGenerated = features.delete && features.countMutations ? generateWriteCount({
4423
+ const deleteCountGenerated = tableFeatures.delete && tableFeatures.countMutations ? generateWriteCount({
4384
4424
  db,
4385
4425
  tableName,
4386
4426
  table: schema[tableName],
4387
4427
  kind: "delete",
4388
4428
  filterArgs: tableFilters,
4389
4429
  fieldName: deleteCountFieldName,
4390
- requireWhere: features.requireWhere,
4430
+ requireWhere: tableFeatures.requireWhere,
4391
4431
  filterCtx,
4392
4432
  txCtx: mutationTxCtx
4393
4433
  }) : void 0;
4394
- const aggregateType = features.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4395
- const aggregateGenerated = features.aggregates ? generateAggregate(
4434
+ const aggregateType = tableFeatures.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4435
+ const aggregateGenerated = tableFeatures.aggregates ? generateAggregate(
4396
4436
  db,
4397
4437
  tableName,
4398
4438
  schema[tableName],
@@ -4401,7 +4441,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4401
4441
  tableFilters,
4402
4442
  filterCtx
4403
4443
  ) : void 0;
4404
- const groupByType = features.aggregates && features.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4444
+ const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4405
4445
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
4406
4446
  const havingInput = groupByEnum ? generateHavingInput(schema[tableName], tableName, typeName) : void 0;
4407
4447
  const groupByGenerated = groupByType && groupByEnum && havingInput ? generateGroupBy(
@@ -4479,9 +4519,9 @@ var generateSchemaData = (db, schema, relations, options) => {
4479
4519
  }
4480
4520
  const activeInputs = [
4481
4521
  // The insert input types the upsert mutations too, so either feature keeps it.
4482
- ...features.insert || onConflictInput ? [insertInput] : [],
4522
+ ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
4483
4523
  ...onConflictInput ? [onConflictInput] : [],
4484
- ...features.update ? [updateInput] : [],
4524
+ ...tableFeatures.update ? [updateInput] : [],
4485
4525
  ...updateManyInput ? [updateManyInput] : [],
4486
4526
  tableFilters,
4487
4527
  tableOrder
@@ -5508,6 +5548,8 @@ function generateSchemaData2(db, schema, relations, options) {
5508
5548
  const excludedTables = new Set(options.exclude?.tables ?? []);
5509
5549
  const tableEntries = schemaEntries.filter(([key, value]) => (0, import_drizzle_orm8.is)(value, import_pg_core2.PgTable) && !excludedTables.has(key));
5510
5550
  const tables = Object.fromEntries(tableEntries);
5551
+ const featureOf = resolveTableFeatures(features);
5552
+ const anyTable = (feature) => tableEntries.some(([name]) => featureOf(name)[feature]);
5511
5553
  if (!tableEntries.length) {
5512
5554
  throw new Error(
5513
5555
  "Drizzle-GraphQL Error: No tables detected in Drizzle-ORM's database instance. Did you forget to pass schema to drizzle constructor?"
@@ -5545,7 +5587,7 @@ function generateSchemaData2(db, schema, relations, options) {
5545
5587
  complexity,
5546
5588
  limits,
5547
5589
  docs: options.docs ?? {},
5548
- features
5590
+ featureOf
5549
5591
  };
5550
5592
  const nestedPlans = features.nestedWrites ? buildNestedWritePlans(
5551
5593
  tables,
@@ -5556,7 +5598,7 @@ function generateSchemaData2(db, schema, relations, options) {
5556
5598
  ) : void 0;
5557
5599
  const nestedTypes = nestedPlans ? createNestedWriteTypes({ plans: nestedPlans, cacheCtx, typeNameMapper, insertPrefix: prefixes.insert }) : void 0;
5558
5600
  const nestedRuntime = nestedPlans ? createNestedWriteRuntime({ plans: nestedPlans, filterCtx }) : void 0;
5559
- const relationAggregateFactory = features.relationAggregates ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
5601
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
5560
5602
  const queries = {};
5561
5603
  const mutations = {};
5562
5604
  const mutationTxCtx = createMutationTxCtx(options.transactions);
@@ -5574,7 +5616,7 @@ function generateSchemaData2(db, schema, relations, options) {
5574
5616
  prefixes.insert,
5575
5617
  prefixes.update,
5576
5618
  resolverFactory,
5577
- relationAggregateFactory,
5619
+ featureOf(tableName).relationAggregates ? relationAggregateFactory : void 0,
5578
5620
  nestedTypes
5579
5621
  )
5580
5622
  ])
@@ -5582,6 +5624,7 @@ function generateSchemaData2(db, schema, relations, options) {
5582
5624
  const inputs = {};
5583
5625
  const outputs = {};
5584
5626
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
5627
+ const tableFeatures = featureOf(tableName);
5585
5628
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
5586
5629
  const { selectSingleOutput, selectArrOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
5587
5630
  const {
@@ -5613,7 +5656,7 @@ function generateSchemaData2(db, schema, relations, options) {
5613
5656
  typeName,
5614
5657
  typeNameMapper,
5615
5658
  filterCtx,
5616
- features.distinct,
5659
+ tableFeatures.distinct,
5617
5660
  limits
5618
5661
  );
5619
5662
  const selectSingleGenerated = generateSelectSingle2(
@@ -5629,7 +5672,7 @@ function generateSchemaData2(db, schema, relations, options) {
5629
5672
  filterCtx,
5630
5673
  limits
5631
5674
  );
5632
- const insertArrGenerated = features.insert ? generateInsertArray2(
5675
+ const insertArrGenerated = tableFeatures.insert ? generateInsertArray2(
5633
5676
  db,
5634
5677
  tableName,
5635
5678
  schema[tableName],
@@ -5644,7 +5687,7 @@ function generateSchemaData2(db, schema, relations, options) {
5644
5687
  nestedRuntime,
5645
5688
  limits
5646
5689
  ) : void 0;
5647
- const insertSingleGenerated = features.insert ? generateInsertSingle2(
5690
+ const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle2(
5648
5691
  db,
5649
5692
  tableName,
5650
5693
  schema[tableName],
@@ -5659,8 +5702,8 @@ function generateSchemaData2(db, schema, relations, options) {
5659
5702
  nestedRuntime,
5660
5703
  limits
5661
5704
  ) : void 0;
5662
- const uniqueSets = features.upsert ? getUniqueColumnSets(schema[tableName], import_pg_core2.getTableConfig) : [];
5663
- const onConflictInput = features.upsert ? generateOnConflictInput({
5705
+ const uniqueSets = tableFeatures.upsert ? getUniqueColumnSets(schema[tableName], import_pg_core2.getTableConfig) : [];
5706
+ const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
5664
5707
  table: schema[tableName],
5665
5708
  typeName,
5666
5709
  uniqueSets,
@@ -5703,7 +5746,7 @@ function generateSchemaData2(db, schema, relations, options) {
5703
5746
  nestedRuntime,
5704
5747
  limits
5705
5748
  ) : void 0;
5706
- const updateGenerated = features.update ? generateUpdate2(
5749
+ const updateGenerated = tableFeatures.update ? generateUpdate2(
5707
5750
  db,
5708
5751
  tableName,
5709
5752
  schema[tableName],
@@ -5714,14 +5757,14 @@ function generateSchemaData2(db, schema, relations, options) {
5714
5757
  updateFieldName,
5715
5758
  typeName,
5716
5759
  false,
5717
- features.requireWhere,
5760
+ tableFeatures.requireWhere,
5718
5761
  typeNameMapper,
5719
5762
  filterCtx,
5720
5763
  mutationTxCtx,
5721
5764
  nestedRuntime,
5722
5765
  limits
5723
5766
  ) : void 0;
5724
- const updateSingleGenerated = features.update ? generateUpdate2(
5767
+ const updateSingleGenerated = tableFeatures.update ? generateUpdate2(
5725
5768
  db,
5726
5769
  tableName,
5727
5770
  schema[tableName],
@@ -5732,14 +5775,14 @@ function generateSchemaData2(db, schema, relations, options) {
5732
5775
  updateSingleFieldName,
5733
5776
  typeName,
5734
5777
  true,
5735
- features.requireWhere,
5778
+ tableFeatures.requireWhere,
5736
5779
  typeNameMapper,
5737
5780
  filterCtx,
5738
5781
  mutationTxCtx,
5739
5782
  nestedRuntime,
5740
5783
  limits
5741
5784
  ) : void 0;
5742
- const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
5785
+ const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
5743
5786
  const updateManyGenerated = updateManyInput ? generateUpdateMany2(
5744
5787
  db,
5745
5788
  tableName,
@@ -5755,7 +5798,7 @@ function generateSchemaData2(db, schema, relations, options) {
5755
5798
  nestedRuntime,
5756
5799
  limits
5757
5800
  ) : void 0;
5758
- const deleteGenerated = features.delete ? generateDelete2(
5801
+ const deleteGenerated = tableFeatures.delete ? generateDelete2(
5759
5802
  db,
5760
5803
  tableName,
5761
5804
  schema[tableName],
@@ -5763,12 +5806,12 @@ function generateSchemaData2(db, schema, relations, options) {
5763
5806
  deleteFieldName,
5764
5807
  typeName,
5765
5808
  false,
5766
- features.requireWhere,
5809
+ tableFeatures.requireWhere,
5767
5810
  filterCtx,
5768
5811
  { tableName, relationMap: namedRelations, tables },
5769
5812
  mutationTxCtx
5770
5813
  ) : void 0;
5771
- const deleteSingleGenerated = features.delete ? generateDelete2(
5814
+ const deleteSingleGenerated = tableFeatures.delete ? generateDelete2(
5772
5815
  db,
5773
5816
  tableName,
5774
5817
  schema[tableName],
@@ -5776,12 +5819,12 @@ function generateSchemaData2(db, schema, relations, options) {
5776
5819
  deleteSingleFieldName,
5777
5820
  typeName,
5778
5821
  true,
5779
- features.requireWhere,
5822
+ tableFeatures.requireWhere,
5780
5823
  filterCtx,
5781
5824
  { tableName, relationMap: namedRelations, tables },
5782
5825
  mutationTxCtx
5783
5826
  ) : void 0;
5784
- const updateCountGenerated = features.update && features.countMutations ? generateWriteCount({
5827
+ const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
5785
5828
  db,
5786
5829
  tableName,
5787
5830
  table: schema[tableName],
@@ -5789,24 +5832,24 @@ function generateSchemaData2(db, schema, relations, options) {
5789
5832
  setArgs: updateInput,
5790
5833
  filterArgs: tableFilters,
5791
5834
  fieldName: updateCountFieldName,
5792
- requireWhere: features.requireWhere,
5835
+ requireWhere: tableFeatures.requireWhere,
5793
5836
  filterCtx,
5794
5837
  txCtx: mutationTxCtx,
5795
5838
  nested: nestedRuntime
5796
5839
  }) : void 0;
5797
- const deleteCountGenerated = features.delete && features.countMutations ? generateWriteCount({
5840
+ const deleteCountGenerated = tableFeatures.delete && tableFeatures.countMutations ? generateWriteCount({
5798
5841
  db,
5799
5842
  tableName,
5800
5843
  table: schema[tableName],
5801
5844
  kind: "delete",
5802
5845
  filterArgs: tableFilters,
5803
5846
  fieldName: deleteCountFieldName,
5804
- requireWhere: features.requireWhere,
5847
+ requireWhere: tableFeatures.requireWhere,
5805
5848
  filterCtx,
5806
5849
  txCtx: mutationTxCtx
5807
5850
  }) : void 0;
5808
- const aggregateType = features.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
5809
- const aggregateGenerated = features.aggregates ? generateAggregate(
5851
+ const aggregateType = tableFeatures.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
5852
+ const aggregateGenerated = tableFeatures.aggregates ? generateAggregate(
5810
5853
  db,
5811
5854
  tableName,
5812
5855
  schema[tableName],
@@ -5815,7 +5858,7 @@ function generateSchemaData2(db, schema, relations, options) {
5815
5858
  tableFilters,
5816
5859
  filterCtx
5817
5860
  ) : void 0;
5818
- const groupByType = features.aggregates && features.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
5861
+ const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
5819
5862
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
5820
5863
  const havingInput = groupByEnum ? generateHavingInput(schema[tableName], tableName, typeName) : void 0;
5821
5864
  const groupByGenerated = groupByType && groupByEnum && havingInput ? generateGroupBy(
@@ -5943,9 +5986,9 @@ function generateSchemaData2(db, schema, relations, options) {
5943
5986
  }
5944
5987
  const activeInputs = [
5945
5988
  // The insert input types the upsert mutations too, so either feature keeps it.
5946
- ...features.insert || onConflictInput ? [insertInput] : [],
5989
+ ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
5947
5990
  ...onConflictInput ? [onConflictInput] : [],
5948
- ...features.update ? [updateInput] : [],
5991
+ ...tableFeatures.update ? [updateInput] : [],
5949
5992
  ...updateManyInput ? [updateManyInput] : [],
5950
5993
  tableFilters,
5951
5994
  tableOrder
@@ -6525,6 +6568,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6525
6568
  const excludedTables = new Set(options.exclude?.tables ?? []);
6526
6569
  const tableEntries = schemaEntries.filter(([key, value]) => (0, import_drizzle_orm9.is)(value, import_sqlite_core2.SQLiteTable) && !excludedTables.has(key));
6527
6570
  const tables = Object.fromEntries(tableEntries);
6571
+ const featureOf = resolveTableFeatures(features);
6572
+ const anyTable = (feature) => tableEntries.some(([name]) => featureOf(name)[feature]);
6528
6573
  if (!tableEntries.length) {
6529
6574
  throw new Error(
6530
6575
  "Drizzle-GraphQL Error: No tables detected in Drizzle-ORM's database instance. Did you forget to pass schema to drizzle constructor?"
@@ -6562,7 +6607,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6562
6607
  complexity,
6563
6608
  limits,
6564
6609
  docs: options.docs ?? {},
6565
- features
6610
+ featureOf
6566
6611
  };
6567
6612
  if (features.nestedWrites && db.resultKind === "sync") {
6568
6613
  throw new Error(
@@ -6578,7 +6623,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6578
6623
  ) : void 0;
6579
6624
  const nestedTypes = nestedPlans ? createNestedWriteTypes({ plans: nestedPlans, cacheCtx, typeNameMapper, insertPrefix: prefixes.insert }) : void 0;
6580
6625
  const nestedRuntime = nestedPlans ? createNestedWriteRuntime({ plans: nestedPlans, filterCtx }) : void 0;
6581
- const relationAggregateFactory = features.relationAggregates ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
6626
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
6582
6627
  const queries = {};
6583
6628
  const mutations = {};
6584
6629
  if (options.transactions && db.resultKind === "sync") {
@@ -6601,7 +6646,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6601
6646
  prefixes.insert,
6602
6647
  prefixes.update,
6603
6648
  resolverFactory,
6604
- relationAggregateFactory,
6649
+ featureOf(tableName).relationAggregates ? relationAggregateFactory : void 0,
6605
6650
  nestedTypes
6606
6651
  )
6607
6652
  ])
@@ -6609,6 +6654,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6609
6654
  const inputs = {};
6610
6655
  const outputs = {};
6611
6656
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
6657
+ const tableFeatures = featureOf(tableName);
6612
6658
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
6613
6659
  const { selectSingleOutput, selectArrOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
6614
6660
  const {
@@ -6640,7 +6686,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6640
6686
  typeName,
6641
6687
  typeNameMapper,
6642
6688
  filterCtx,
6643
- features.distinct,
6689
+ tableFeatures.distinct,
6644
6690
  limits
6645
6691
  );
6646
6692
  const selectSingleGenerated = generateSelectSingle3(
@@ -6656,7 +6702,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6656
6702
  filterCtx,
6657
6703
  limits
6658
6704
  );
6659
- const insertArrGenerated = features.insert ? generateInsertArray3(
6705
+ const insertArrGenerated = tableFeatures.insert ? generateInsertArray3(
6660
6706
  db,
6661
6707
  tableName,
6662
6708
  schema[tableName],
@@ -6671,7 +6717,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6671
6717
  nestedRuntime,
6672
6718
  limits
6673
6719
  ) : void 0;
6674
- const insertSingleGenerated = features.insert ? generateInsertSingle3(
6720
+ const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle3(
6675
6721
  db,
6676
6722
  tableName,
6677
6723
  schema[tableName],
@@ -6686,8 +6732,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6686
6732
  nestedRuntime,
6687
6733
  limits
6688
6734
  ) : void 0;
6689
- const uniqueSets = features.upsert ? getUniqueColumnSets(schema[tableName], import_sqlite_core2.getTableConfig) : [];
6690
- const onConflictInput = features.upsert ? generateOnConflictInput({
6735
+ const uniqueSets = tableFeatures.upsert ? getUniqueColumnSets(schema[tableName], import_sqlite_core2.getTableConfig) : [];
6736
+ const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
6691
6737
  table: schema[tableName],
6692
6738
  typeName,
6693
6739
  uniqueSets,
@@ -6730,7 +6776,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6730
6776
  nestedRuntime,
6731
6777
  limits
6732
6778
  ) : void 0;
6733
- const updateGenerated = features.update ? generateUpdate3(
6779
+ const updateGenerated = tableFeatures.update ? generateUpdate3(
6734
6780
  db,
6735
6781
  tableName,
6736
6782
  schema[tableName],
@@ -6741,14 +6787,14 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6741
6787
  updateFieldName,
6742
6788
  typeName,
6743
6789
  false,
6744
- features.requireWhere,
6790
+ tableFeatures.requireWhere,
6745
6791
  typeNameMapper,
6746
6792
  filterCtx,
6747
6793
  mutationTxCtx,
6748
6794
  nestedRuntime,
6749
6795
  limits
6750
6796
  ) : void 0;
6751
- const updateSingleGenerated = features.update ? generateUpdate3(
6797
+ const updateSingleGenerated = tableFeatures.update ? generateUpdate3(
6752
6798
  db,
6753
6799
  tableName,
6754
6800
  schema[tableName],
@@ -6759,14 +6805,14 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6759
6805
  updateSingleFieldName,
6760
6806
  typeName,
6761
6807
  true,
6762
- features.requireWhere,
6808
+ tableFeatures.requireWhere,
6763
6809
  typeNameMapper,
6764
6810
  filterCtx,
6765
6811
  mutationTxCtx,
6766
6812
  nestedRuntime,
6767
6813
  limits
6768
6814
  ) : void 0;
6769
- const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
6815
+ const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
6770
6816
  const updateManyGenerated = updateManyInput ? generateUpdateMany3(
6771
6817
  db,
6772
6818
  tableName,
@@ -6782,7 +6828,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6782
6828
  nestedRuntime,
6783
6829
  limits
6784
6830
  ) : void 0;
6785
- const deleteGenerated = features.delete ? generateDelete3(
6831
+ const deleteGenerated = tableFeatures.delete ? generateDelete3(
6786
6832
  db,
6787
6833
  tableName,
6788
6834
  schema[tableName],
@@ -6790,12 +6836,12 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6790
6836
  deleteFieldName,
6791
6837
  typeName,
6792
6838
  false,
6793
- features.requireWhere,
6839
+ tableFeatures.requireWhere,
6794
6840
  filterCtx,
6795
6841
  { tableName, relationMap: namedRelations, tables },
6796
6842
  mutationTxCtx
6797
6843
  ) : void 0;
6798
- const deleteSingleGenerated = features.delete ? generateDelete3(
6844
+ const deleteSingleGenerated = tableFeatures.delete ? generateDelete3(
6799
6845
  db,
6800
6846
  tableName,
6801
6847
  schema[tableName],
@@ -6803,12 +6849,12 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6803
6849
  deleteSingleFieldName,
6804
6850
  typeName,
6805
6851
  true,
6806
- features.requireWhere,
6852
+ tableFeatures.requireWhere,
6807
6853
  filterCtx,
6808
6854
  { tableName, relationMap: namedRelations, tables },
6809
6855
  mutationTxCtx
6810
6856
  ) : void 0;
6811
- const updateCountGenerated = features.update && features.countMutations ? generateWriteCount({
6857
+ const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
6812
6858
  db,
6813
6859
  tableName,
6814
6860
  table: schema[tableName],
@@ -6816,24 +6862,24 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6816
6862
  setArgs: updateInput,
6817
6863
  filterArgs: tableFilters,
6818
6864
  fieldName: updateCountFieldName,
6819
- requireWhere: features.requireWhere,
6865
+ requireWhere: tableFeatures.requireWhere,
6820
6866
  filterCtx,
6821
6867
  txCtx: mutationTxCtx,
6822
6868
  nested: nestedRuntime
6823
6869
  }) : void 0;
6824
- const deleteCountGenerated = features.delete && features.countMutations ? generateWriteCount({
6870
+ const deleteCountGenerated = tableFeatures.delete && tableFeatures.countMutations ? generateWriteCount({
6825
6871
  db,
6826
6872
  tableName,
6827
6873
  table: schema[tableName],
6828
6874
  kind: "delete",
6829
6875
  filterArgs: tableFilters,
6830
6876
  fieldName: deleteCountFieldName,
6831
- requireWhere: features.requireWhere,
6877
+ requireWhere: tableFeatures.requireWhere,
6832
6878
  filterCtx,
6833
6879
  txCtx: mutationTxCtx
6834
6880
  }) : void 0;
6835
- const aggregateType = features.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6836
- const aggregateGenerated = features.aggregates ? generateAggregate(
6881
+ const aggregateType = tableFeatures.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6882
+ const aggregateGenerated = tableFeatures.aggregates ? generateAggregate(
6837
6883
  db,
6838
6884
  tableName,
6839
6885
  schema[tableName],
@@ -6842,7 +6888,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6842
6888
  tableFilters,
6843
6889
  filterCtx
6844
6890
  ) : void 0;
6845
- const groupByType = features.aggregates && features.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6891
+ const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6846
6892
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
6847
6893
  const havingInput = groupByEnum ? generateHavingInput(schema[tableName], tableName, typeName) : void 0;
6848
6894
  const groupByGenerated = groupByType && groupByEnum && havingInput ? generateGroupBy(
@@ -6970,9 +7016,9 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6970
7016
  }
6971
7017
  const activeInputs = [
6972
7018
  // The insert input types the upsert mutations too, so either feature keeps it.
6973
- ...features.insert || onConflictInput ? [insertInput] : [],
7019
+ ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
6974
7020
  ...onConflictInput ? [onConflictInput] : [],
6975
- ...features.update ? [updateInput] : [],
7021
+ ...tableFeatures.update ? [updateInput] : [],
6976
7022
  ...updateManyInput ? [updateManyInput] : [],
6977
7023
  tableFilters,
6978
7024
  tableOrder
@@ -7033,22 +7079,11 @@ var buildSchema = (db, config) => {
7033
7079
  list: config?.suffixes?.list ?? "",
7034
7080
  single: config?.suffixes?.single ?? "Single"
7035
7081
  };
7036
- const typeNameMapper = config?.typeNameMapper;
7037
- const features = {
7038
- aggregates: config?.features?.aggregates ?? true,
7039
- groupBy: config?.features?.groupBy ?? true,
7040
- relationAggregates: config?.features?.relationAggregates ?? true,
7041
- distinct: config?.features?.distinct ?? true,
7042
- insert: config?.features?.insert ?? true,
7043
- update: config?.features?.update ?? true,
7044
- updateMany: config?.features?.updateMany ?? true,
7045
- delete: config?.features?.delete ?? true,
7046
- upsert: config?.features?.upsert ?? false,
7047
- nestedWrites: config?.features?.nestedWrites ?? false,
7048
- fieldUpdateOperations: config?.features?.fieldUpdateOperations ?? false,
7049
- countMutations: config?.features?.countMutations ?? false,
7050
- requireWhere: config?.features?.requireWhere ?? false
7051
- };
7082
+ const typeNameMapper = config?.typeNameMapper === "singularize" ? singularizeMapper : config?.typeNameMapper;
7083
+ const tableKeys = Object.entries(schema).filter(([, value]) => (0, import_drizzle_orm10.is)(value, import_drizzle_orm10.Table)).map(([key]) => key);
7084
+ const excludedTableNames = new Set(config?.exclude?.tables ?? []);
7085
+ const featureTables = tableKeys.filter((key) => !excludedTableNames.has(key));
7086
+ const forTable = resolveTableFeatures(config?.features);
7052
7087
  const complexityConfig = config?.complexity ?? true;
7053
7088
  const complexity = complexityConfig === false ? void 0 : {
7054
7089
  defaultListSize: (complexityConfig === true ? void 0 : complexityConfig.defaultListSize) ?? 10,
@@ -7085,10 +7120,8 @@ var buildSchema = (db, config) => {
7085
7120
  } : void 0;
7086
7121
  const exclude = config?.exclude;
7087
7122
  if (exclude) {
7088
- const tableNames = new Set(
7089
- Object.entries(schema).filter(([, value]) => (0, import_drizzle_orm10.is)(value, import_drizzle_orm10.Table)).map(([key]) => key)
7090
- );
7091
- const excludedTables = new Set(exclude.tables ?? []);
7123
+ const tableNames = new Set(tableKeys);
7124
+ const excludedTables = excludedTableNames;
7092
7125
  for (const tableName of excludedTables) {
7093
7126
  if (!tableNames.has(tableName)) {
7094
7127
  throw new Error(
@@ -7126,6 +7159,49 @@ var buildSchema = (db, config) => {
7126
7159
  }
7127
7160
  }
7128
7161
  }
7162
+ const featureConflicts = /* @__PURE__ */ new Map();
7163
+ const noteConflict = (message, tableName) => {
7164
+ const tables = featureConflicts.get(message);
7165
+ if (tables) {
7166
+ tables.push(tableName);
7167
+ } else {
7168
+ featureConflicts.set(message, [tableName]);
7169
+ }
7170
+ };
7171
+ for (const tableName of featureTables) {
7172
+ const tableFeatures = forTable(tableName);
7173
+ if (tableFeatures.upsert) {
7174
+ const missing = [!tableFeatures.insert ? "insert" : void 0, !tableFeatures.update ? "update" : void 0].filter(Boolean).join(" and ");
7175
+ if (missing) {
7176
+ noteConflict(
7177
+ `upsert is on while ${missing} is off, so the upsert mutations are a second write path past the operation you turned off`,
7178
+ tableName
7179
+ );
7180
+ }
7181
+ }
7182
+ if (config?.features?.nestedWrites && (!tableFeatures.insert || !tableFeatures.update)) {
7183
+ noteConflict(
7184
+ "nestedWrites is on while this table's own insert or update is off, so a nested `create` or `connect` under another table's mutation can still write it",
7185
+ tableName
7186
+ );
7187
+ }
7188
+ if (config?.features?.updateMany !== void 0 && tableFeatures.updateMany && !tableFeatures.update) {
7189
+ noteConflict("updateMany is on while update is off, so no batch update is generated", tableName);
7190
+ }
7191
+ if (config?.features?.groupBy !== void 0 && tableFeatures.groupBy && !tableFeatures.aggregates) {
7192
+ noteConflict("groupBy is on while aggregates is off, so no grouped query is generated", tableName);
7193
+ }
7194
+ if (tableFeatures.countMutations && !tableFeatures.update && !tableFeatures.delete) {
7195
+ noteConflict(
7196
+ "countMutations is on while update and delete are both off, so no count mutation is generated",
7197
+ tableName
7198
+ );
7199
+ }
7200
+ }
7201
+ for (const [message, tables] of featureConflicts) {
7202
+ const listed = tables.length > 5 ? `${tables.slice(0, 5).join(", ")} and ${tables.length - 5} more` : tables.join(", ");
7203
+ console.warn(`Drizzle-GraphQL Warning: config.features \u2014 ${message} (${listed}).`);
7204
+ }
7129
7205
  const eagerOpt = config?.eagerLoadRelations;
7130
7206
  const shouldEagerLoad = eagerOpt === void 0 || eagerOpt === true ? () => true : eagerOpt === false ? () => false : eagerOpt;
7131
7207
  if (!typeNameMapper && suffixes.list === suffixes.single) {
@@ -7152,7 +7228,7 @@ var buildSchema = (db, config) => {
7152
7228
  conflictDoNothing: config?.conflictDoNothing ?? false,
7153
7229
  typeNameMapper,
7154
7230
  shouldEagerLoad,
7155
- features,
7231
+ features: config?.features ?? {},
7156
7232
  complexity,
7157
7233
  scalars: config?.scalars,
7158
7234
  mapColumnType: config?.mapColumnType,
@@ -7214,6 +7290,7 @@ var buildSchema = (db, config) => {
7214
7290
  drizzleExecutorKey,
7215
7291
  extractFilters,
7216
7292
  extractOrderBy,
7217
- extractRelationJoinColumns
7293
+ extractRelationJoinColumns,
7294
+ singularizeMapper
7218
7295
  });
7219
7296
  //# sourceMappingURL=index.cjs.map