@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.js CHANGED
@@ -103,6 +103,10 @@ var getOrCreateLoader = (context, key, batchFn) => {
103
103
  import pluralize from "pluralize";
104
104
  var uncapitalize = (input) => input?.length ? `${input[0].toLocaleLowerCase()}${input.length > 1 ? input.slice(1, input.length) : ""}` : input;
105
105
  var capitalize = (input) => input?.length ? `${input[0].toLocaleUpperCase()}${input.length > 1 ? input.slice(1, input.length) : ""}` : input;
106
+ var singularizeMapper = (tableName) => ({
107
+ singular: uncapitalize(pluralize.singular(tableName)),
108
+ plural: uncapitalize(pluralize.plural(tableName))
109
+ });
106
110
 
107
111
  // src/util/data-mappers/index.ts
108
112
  import { getTableColumns as getTableColumns2, is as is2, One } from "drizzle-orm";
@@ -1898,7 +1902,7 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1898
1902
  ]);
1899
1903
  continue;
1900
1904
  }
1901
- const targetDistinctEnum = cacheCtx.features.distinct ? generateDistinctEnum(tables[targetTableName], resolveTypeName(targetTableName, typeNameMapper)) : void 0;
1905
+ const targetDistinctEnum = cacheCtx.featureOf(targetTableName).distinct ? generateDistinctEnum(tables[targetTableName], resolveTypeName(targetTableName, typeNameMapper)) : void 0;
1902
1906
  rawRelationFields.push([
1903
1907
  relationName,
1904
1908
  {
@@ -2008,7 +2012,7 @@ var generateTableTypes = (tableName, tables, relationMap, withReturning, relatio
2008
2012
  const updateFields = Object.fromEntries(
2009
2013
  columnEntries.map(([columnName, column]) => {
2010
2014
  const converted = drizzleColumnToGraphQLType(column, columnName, tableName, true, false, true);
2011
- const operations = cacheCtx.features.fieldUpdateOperations ? fieldUpdateInputType(column, columnName, tableName) : void 0;
2015
+ const operations = cacheCtx.featureOf(tableName).fieldUpdateOperations ? fieldUpdateInputType(column, columnName, tableName) : void 0;
2012
2016
  const field = operations ? { ...converted, type: operations } : converted;
2013
2017
  return [columnName, { ...field, ...inputFieldDocs(cacheCtx.docs, column, tableName, columnName, field.type) }];
2014
2018
  })
@@ -3433,6 +3437,38 @@ import {
3433
3437
  } from "graphql";
3434
3438
  import { parseResolveInfo as parseResolveInfo2 } from "graphql-parse-resolve-info";
3435
3439
 
3440
+ // src/util/features.ts
3441
+ var featureDefaults = {
3442
+ aggregates: true,
3443
+ groupBy: true,
3444
+ relationAggregates: true,
3445
+ distinct: true,
3446
+ insert: true,
3447
+ update: true,
3448
+ updateMany: true,
3449
+ delete: true,
3450
+ upsert: false,
3451
+ fieldUpdateOperations: false,
3452
+ countMutations: false,
3453
+ requireWhere: false
3454
+ };
3455
+ var resolveTableFeatures = (features) => {
3456
+ const cache = /* @__PURE__ */ new Map();
3457
+ const names = Object.keys(featureDefaults);
3458
+ return (tableName) => {
3459
+ let resolved = cache.get(tableName);
3460
+ if (!resolved) {
3461
+ resolved = {};
3462
+ for (const name of names) {
3463
+ const configured = features?.[name];
3464
+ resolved[name] = configured === void 0 ? featureDefaults[name] : typeof configured === "function" ? !!configured(tableName) : !!configured;
3465
+ }
3466
+ cache.set(tableName, resolved);
3467
+ }
3468
+ return resolved;
3469
+ };
3470
+ };
3471
+
3436
3472
  // src/util/builders/aggregates.ts
3437
3473
  import {
3438
3474
  and as and2,
@@ -4192,6 +4228,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4192
4228
  const excludedTables = new Set(options.exclude?.tables ?? []);
4193
4229
  const tableEntries = schemaEntries.filter(([key, value]) => is4(value, MySqlTable) && !excludedTables.has(key));
4194
4230
  const tables = Object.fromEntries(tableEntries);
4231
+ const featureOf = resolveTableFeatures(features);
4232
+ const anyTable = (feature) => tableEntries.some(([name]) => featureOf(name)[feature]);
4195
4233
  if (!tableEntries.length) {
4196
4234
  throw new Error(
4197
4235
  "Drizzle-GraphQL Error: No tables detected in Drizzle-ORM's database instance. Did you forget to pass schema to drizzle constructor?"
@@ -4234,9 +4272,9 @@ var generateSchemaData = (db, schema, relations, options) => {
4234
4272
  complexity,
4235
4273
  limits,
4236
4274
  docs: options.docs ?? {},
4237
- features
4275
+ featureOf
4238
4276
  };
4239
- const relationAggregateFactory = features.relationAggregates ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
4277
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
4240
4278
  const queries = {};
4241
4279
  const mutations = {};
4242
4280
  const mutationTxCtx = createMutationTxCtx(options.transactions);
@@ -4254,7 +4292,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4254
4292
  prefixes.insert,
4255
4293
  prefixes.update,
4256
4294
  resolverFactory,
4257
- relationAggregateFactory
4295
+ featureOf(tableName).relationAggregates ? relationAggregateFactory : void 0
4258
4296
  )
4259
4297
  ])
4260
4298
  );
@@ -4268,10 +4306,11 @@ var generateSchemaData = (db, schema, relations, options) => {
4268
4306
  });
4269
4307
  const inputs = {};
4270
4308
  const outputs = {};
4271
- if (features.insert || features.upsert || features.update || features.delete) {
4309
+ if (["insert", "upsert", "update", "delete"].some((feature) => anyTable(feature))) {
4272
4310
  outputs.MutationReturn = mutationReturnType;
4273
4311
  }
4274
4312
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
4313
+ const tableFeatures = featureOf(tableName);
4275
4314
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
4276
4315
  const { selectSingleOutput, selectArrOutput } = tableTypes.outputs;
4277
4316
  const {
@@ -4303,7 +4342,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4303
4342
  typeName,
4304
4343
  typeNameMapper,
4305
4344
  filterCtx,
4306
- features.distinct,
4345
+ tableFeatures.distinct,
4307
4346
  limits
4308
4347
  );
4309
4348
  const selectSingleGenerated = generateSelectSingle(
@@ -4319,7 +4358,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4319
4358
  filterCtx,
4320
4359
  limits
4321
4360
  );
4322
- const insertArrGenerated = features.insert ? generateInsertArray(
4361
+ const insertArrGenerated = tableFeatures.insert ? generateInsertArray(
4323
4362
  db,
4324
4363
  tableName,
4325
4364
  schema[tableName],
@@ -4327,7 +4366,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4327
4366
  createArrayFieldName,
4328
4367
  mutationTxCtx
4329
4368
  ) : void 0;
4330
- const insertSingleGenerated = features.insert ? generateInsertSingle(
4369
+ const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle(
4331
4370
  db,
4332
4371
  tableName,
4333
4372
  schema[tableName],
@@ -4335,7 +4374,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4335
4374
  createSingleFieldName,
4336
4375
  mutationTxCtx
4337
4376
  ) : void 0;
4338
- const onConflictInput = features.upsert ? generateOnConflictInput({
4377
+ const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
4339
4378
  table: schema[tableName],
4340
4379
  typeName,
4341
4380
  uniqueSets: [],
@@ -4360,7 +4399,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4360
4399
  true,
4361
4400
  mutationTxCtx
4362
4401
  ) : void 0;
4363
- const updateGenerated = features.update ? generateUpdate(
4402
+ const updateGenerated = tableFeatures.update ? generateUpdate(
4364
4403
  db,
4365
4404
  tableName,
4366
4405
  schema[tableName],
@@ -4368,11 +4407,11 @@ var generateSchemaData = (db, schema, relations, options) => {
4368
4407
  tableFilters,
4369
4408
  updateFieldName,
4370
4409
  false,
4371
- features.requireWhere,
4410
+ tableFeatures.requireWhere,
4372
4411
  filterCtx,
4373
4412
  mutationTxCtx
4374
4413
  ) : void 0;
4375
- const updateSingleGenerated = features.update ? generateUpdate(
4414
+ const updateSingleGenerated = tableFeatures.update ? generateUpdate(
4376
4415
  db,
4377
4416
  tableName,
4378
4417
  schema[tableName],
@@ -4380,11 +4419,11 @@ var generateSchemaData = (db, schema, relations, options) => {
4380
4419
  tableFilters,
4381
4420
  updateSingleFieldName,
4382
4421
  true,
4383
- features.requireWhere,
4422
+ tableFeatures.requireWhere,
4384
4423
  filterCtx,
4385
4424
  mutationTxCtx
4386
4425
  ) : void 0;
4387
- const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
4426
+ const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
4388
4427
  const updateManyGenerated = updateManyInput ? generateUpdateMany(
4389
4428
  db,
4390
4429
  tableName,
@@ -4394,29 +4433,29 @@ var generateSchemaData = (db, schema, relations, options) => {
4394
4433
  filterCtx,
4395
4434
  mutationTxCtx
4396
4435
  ) : void 0;
4397
- const deleteGenerated = features.delete ? generateDelete(
4436
+ const deleteGenerated = tableFeatures.delete ? generateDelete(
4398
4437
  db,
4399
4438
  tableName,
4400
4439
  schema[tableName],
4401
4440
  tableFilters,
4402
4441
  deleteFieldName,
4403
4442
  false,
4404
- features.requireWhere,
4443
+ tableFeatures.requireWhere,
4405
4444
  filterCtx,
4406
4445
  mutationTxCtx
4407
4446
  ) : void 0;
4408
- const deleteSingleGenerated = features.delete ? generateDelete(
4447
+ const deleteSingleGenerated = tableFeatures.delete ? generateDelete(
4409
4448
  db,
4410
4449
  tableName,
4411
4450
  schema[tableName],
4412
4451
  tableFilters,
4413
4452
  deleteSingleFieldName,
4414
4453
  true,
4415
- features.requireWhere,
4454
+ tableFeatures.requireWhere,
4416
4455
  filterCtx,
4417
4456
  mutationTxCtx
4418
4457
  ) : void 0;
4419
- const updateCountGenerated = features.update && features.countMutations ? generateWriteCount({
4458
+ const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
4420
4459
  db,
4421
4460
  tableName,
4422
4461
  table: schema[tableName],
@@ -4424,23 +4463,23 @@ var generateSchemaData = (db, schema, relations, options) => {
4424
4463
  setArgs: updateInput,
4425
4464
  filterArgs: tableFilters,
4426
4465
  fieldName: updateCountFieldName,
4427
- requireWhere: features.requireWhere,
4466
+ requireWhere: tableFeatures.requireWhere,
4428
4467
  filterCtx,
4429
4468
  txCtx: mutationTxCtx
4430
4469
  }) : void 0;
4431
- const deleteCountGenerated = features.delete && features.countMutations ? generateWriteCount({
4470
+ const deleteCountGenerated = tableFeatures.delete && tableFeatures.countMutations ? generateWriteCount({
4432
4471
  db,
4433
4472
  tableName,
4434
4473
  table: schema[tableName],
4435
4474
  kind: "delete",
4436
4475
  filterArgs: tableFilters,
4437
4476
  fieldName: deleteCountFieldName,
4438
- requireWhere: features.requireWhere,
4477
+ requireWhere: tableFeatures.requireWhere,
4439
4478
  filterCtx,
4440
4479
  txCtx: mutationTxCtx
4441
4480
  }) : void 0;
4442
- const aggregateType = features.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4443
- const aggregateGenerated = features.aggregates ? generateAggregate(
4481
+ const aggregateType = tableFeatures.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4482
+ const aggregateGenerated = tableFeatures.aggregates ? generateAggregate(
4444
4483
  db,
4445
4484
  tableName,
4446
4485
  schema[tableName],
@@ -4449,7 +4488,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4449
4488
  tableFilters,
4450
4489
  filterCtx
4451
4490
  ) : void 0;
4452
- const groupByType = features.aggregates && features.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4491
+ const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4453
4492
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
4454
4493
  const havingInput = groupByEnum ? generateHavingInput(schema[tableName], tableName, typeName) : void 0;
4455
4494
  const groupByGenerated = groupByType && groupByEnum && havingInput ? generateGroupBy(
@@ -4527,9 +4566,9 @@ var generateSchemaData = (db, schema, relations, options) => {
4527
4566
  }
4528
4567
  const activeInputs = [
4529
4568
  // The insert input types the upsert mutations too, so either feature keeps it.
4530
- ...features.insert || onConflictInput ? [insertInput] : [],
4569
+ ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
4531
4570
  ...onConflictInput ? [onConflictInput] : [],
4532
- ...features.update ? [updateInput] : [],
4571
+ ...tableFeatures.update ? [updateInput] : [],
4533
4572
  ...updateManyInput ? [updateManyInput] : [],
4534
4573
  tableFilters,
4535
4574
  tableOrder
@@ -5567,6 +5606,8 @@ function generateSchemaData2(db, schema, relations, options) {
5567
5606
  const excludedTables = new Set(options.exclude?.tables ?? []);
5568
5607
  const tableEntries = schemaEntries.filter(([key, value]) => is6(value, PgTable) && !excludedTables.has(key));
5569
5608
  const tables = Object.fromEntries(tableEntries);
5609
+ const featureOf = resolveTableFeatures(features);
5610
+ const anyTable = (feature) => tableEntries.some(([name]) => featureOf(name)[feature]);
5570
5611
  if (!tableEntries.length) {
5571
5612
  throw new Error(
5572
5613
  "Drizzle-GraphQL Error: No tables detected in Drizzle-ORM's database instance. Did you forget to pass schema to drizzle constructor?"
@@ -5604,7 +5645,7 @@ function generateSchemaData2(db, schema, relations, options) {
5604
5645
  complexity,
5605
5646
  limits,
5606
5647
  docs: options.docs ?? {},
5607
- features
5648
+ featureOf
5608
5649
  };
5609
5650
  const nestedPlans = features.nestedWrites ? buildNestedWritePlans(
5610
5651
  tables,
@@ -5615,7 +5656,7 @@ function generateSchemaData2(db, schema, relations, options) {
5615
5656
  ) : void 0;
5616
5657
  const nestedTypes = nestedPlans ? createNestedWriteTypes({ plans: nestedPlans, cacheCtx, typeNameMapper, insertPrefix: prefixes.insert }) : void 0;
5617
5658
  const nestedRuntime = nestedPlans ? createNestedWriteRuntime({ plans: nestedPlans, filterCtx }) : void 0;
5618
- const relationAggregateFactory = features.relationAggregates ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
5659
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
5619
5660
  const queries = {};
5620
5661
  const mutations = {};
5621
5662
  const mutationTxCtx = createMutationTxCtx(options.transactions);
@@ -5633,7 +5674,7 @@ function generateSchemaData2(db, schema, relations, options) {
5633
5674
  prefixes.insert,
5634
5675
  prefixes.update,
5635
5676
  resolverFactory,
5636
- relationAggregateFactory,
5677
+ featureOf(tableName).relationAggregates ? relationAggregateFactory : void 0,
5637
5678
  nestedTypes
5638
5679
  )
5639
5680
  ])
@@ -5641,6 +5682,7 @@ function generateSchemaData2(db, schema, relations, options) {
5641
5682
  const inputs = {};
5642
5683
  const outputs = {};
5643
5684
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
5685
+ const tableFeatures = featureOf(tableName);
5644
5686
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
5645
5687
  const { selectSingleOutput, selectArrOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
5646
5688
  const {
@@ -5672,7 +5714,7 @@ function generateSchemaData2(db, schema, relations, options) {
5672
5714
  typeName,
5673
5715
  typeNameMapper,
5674
5716
  filterCtx,
5675
- features.distinct,
5717
+ tableFeatures.distinct,
5676
5718
  limits
5677
5719
  );
5678
5720
  const selectSingleGenerated = generateSelectSingle2(
@@ -5688,7 +5730,7 @@ function generateSchemaData2(db, schema, relations, options) {
5688
5730
  filterCtx,
5689
5731
  limits
5690
5732
  );
5691
- const insertArrGenerated = features.insert ? generateInsertArray2(
5733
+ const insertArrGenerated = tableFeatures.insert ? generateInsertArray2(
5692
5734
  db,
5693
5735
  tableName,
5694
5736
  schema[tableName],
@@ -5703,7 +5745,7 @@ function generateSchemaData2(db, schema, relations, options) {
5703
5745
  nestedRuntime,
5704
5746
  limits
5705
5747
  ) : void 0;
5706
- const insertSingleGenerated = features.insert ? generateInsertSingle2(
5748
+ const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle2(
5707
5749
  db,
5708
5750
  tableName,
5709
5751
  schema[tableName],
@@ -5718,8 +5760,8 @@ function generateSchemaData2(db, schema, relations, options) {
5718
5760
  nestedRuntime,
5719
5761
  limits
5720
5762
  ) : void 0;
5721
- const uniqueSets = features.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig2) : [];
5722
- const onConflictInput = features.upsert ? generateOnConflictInput({
5763
+ const uniqueSets = tableFeatures.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig2) : [];
5764
+ const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
5723
5765
  table: schema[tableName],
5724
5766
  typeName,
5725
5767
  uniqueSets,
@@ -5762,7 +5804,7 @@ function generateSchemaData2(db, schema, relations, options) {
5762
5804
  nestedRuntime,
5763
5805
  limits
5764
5806
  ) : void 0;
5765
- const updateGenerated = features.update ? generateUpdate2(
5807
+ const updateGenerated = tableFeatures.update ? generateUpdate2(
5766
5808
  db,
5767
5809
  tableName,
5768
5810
  schema[tableName],
@@ -5773,14 +5815,14 @@ function generateSchemaData2(db, schema, relations, options) {
5773
5815
  updateFieldName,
5774
5816
  typeName,
5775
5817
  false,
5776
- features.requireWhere,
5818
+ tableFeatures.requireWhere,
5777
5819
  typeNameMapper,
5778
5820
  filterCtx,
5779
5821
  mutationTxCtx,
5780
5822
  nestedRuntime,
5781
5823
  limits
5782
5824
  ) : void 0;
5783
- const updateSingleGenerated = features.update ? generateUpdate2(
5825
+ const updateSingleGenerated = tableFeatures.update ? generateUpdate2(
5784
5826
  db,
5785
5827
  tableName,
5786
5828
  schema[tableName],
@@ -5791,14 +5833,14 @@ function generateSchemaData2(db, schema, relations, options) {
5791
5833
  updateSingleFieldName,
5792
5834
  typeName,
5793
5835
  true,
5794
- features.requireWhere,
5836
+ tableFeatures.requireWhere,
5795
5837
  typeNameMapper,
5796
5838
  filterCtx,
5797
5839
  mutationTxCtx,
5798
5840
  nestedRuntime,
5799
5841
  limits
5800
5842
  ) : void 0;
5801
- const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
5843
+ const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
5802
5844
  const updateManyGenerated = updateManyInput ? generateUpdateMany2(
5803
5845
  db,
5804
5846
  tableName,
@@ -5814,7 +5856,7 @@ function generateSchemaData2(db, schema, relations, options) {
5814
5856
  nestedRuntime,
5815
5857
  limits
5816
5858
  ) : void 0;
5817
- const deleteGenerated = features.delete ? generateDelete2(
5859
+ const deleteGenerated = tableFeatures.delete ? generateDelete2(
5818
5860
  db,
5819
5861
  tableName,
5820
5862
  schema[tableName],
@@ -5822,12 +5864,12 @@ function generateSchemaData2(db, schema, relations, options) {
5822
5864
  deleteFieldName,
5823
5865
  typeName,
5824
5866
  false,
5825
- features.requireWhere,
5867
+ tableFeatures.requireWhere,
5826
5868
  filterCtx,
5827
5869
  { tableName, relationMap: namedRelations, tables },
5828
5870
  mutationTxCtx
5829
5871
  ) : void 0;
5830
- const deleteSingleGenerated = features.delete ? generateDelete2(
5872
+ const deleteSingleGenerated = tableFeatures.delete ? generateDelete2(
5831
5873
  db,
5832
5874
  tableName,
5833
5875
  schema[tableName],
@@ -5835,12 +5877,12 @@ function generateSchemaData2(db, schema, relations, options) {
5835
5877
  deleteSingleFieldName,
5836
5878
  typeName,
5837
5879
  true,
5838
- features.requireWhere,
5880
+ tableFeatures.requireWhere,
5839
5881
  filterCtx,
5840
5882
  { tableName, relationMap: namedRelations, tables },
5841
5883
  mutationTxCtx
5842
5884
  ) : void 0;
5843
- const updateCountGenerated = features.update && features.countMutations ? generateWriteCount({
5885
+ const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
5844
5886
  db,
5845
5887
  tableName,
5846
5888
  table: schema[tableName],
@@ -5848,24 +5890,24 @@ function generateSchemaData2(db, schema, relations, options) {
5848
5890
  setArgs: updateInput,
5849
5891
  filterArgs: tableFilters,
5850
5892
  fieldName: updateCountFieldName,
5851
- requireWhere: features.requireWhere,
5893
+ requireWhere: tableFeatures.requireWhere,
5852
5894
  filterCtx,
5853
5895
  txCtx: mutationTxCtx,
5854
5896
  nested: nestedRuntime
5855
5897
  }) : void 0;
5856
- const deleteCountGenerated = features.delete && features.countMutations ? generateWriteCount({
5898
+ const deleteCountGenerated = tableFeatures.delete && tableFeatures.countMutations ? generateWriteCount({
5857
5899
  db,
5858
5900
  tableName,
5859
5901
  table: schema[tableName],
5860
5902
  kind: "delete",
5861
5903
  filterArgs: tableFilters,
5862
5904
  fieldName: deleteCountFieldName,
5863
- requireWhere: features.requireWhere,
5905
+ requireWhere: tableFeatures.requireWhere,
5864
5906
  filterCtx,
5865
5907
  txCtx: mutationTxCtx
5866
5908
  }) : void 0;
5867
- const aggregateType = features.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
5868
- const aggregateGenerated = features.aggregates ? generateAggregate(
5909
+ const aggregateType = tableFeatures.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
5910
+ const aggregateGenerated = tableFeatures.aggregates ? generateAggregate(
5869
5911
  db,
5870
5912
  tableName,
5871
5913
  schema[tableName],
@@ -5874,7 +5916,7 @@ function generateSchemaData2(db, schema, relations, options) {
5874
5916
  tableFilters,
5875
5917
  filterCtx
5876
5918
  ) : void 0;
5877
- const groupByType = features.aggregates && features.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
5919
+ const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
5878
5920
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
5879
5921
  const havingInput = groupByEnum ? generateHavingInput(schema[tableName], tableName, typeName) : void 0;
5880
5922
  const groupByGenerated = groupByType && groupByEnum && havingInput ? generateGroupBy(
@@ -6002,9 +6044,9 @@ function generateSchemaData2(db, schema, relations, options) {
6002
6044
  }
6003
6045
  const activeInputs = [
6004
6046
  // The insert input types the upsert mutations too, so either feature keeps it.
6005
- ...features.insert || onConflictInput ? [insertInput] : [],
6047
+ ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
6006
6048
  ...onConflictInput ? [onConflictInput] : [],
6007
- ...features.update ? [updateInput] : [],
6049
+ ...tableFeatures.update ? [updateInput] : [],
6008
6050
  ...updateManyInput ? [updateManyInput] : [],
6009
6051
  tableFilters,
6010
6052
  tableOrder
@@ -6589,6 +6631,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6589
6631
  const excludedTables = new Set(options.exclude?.tables ?? []);
6590
6632
  const tableEntries = schemaEntries.filter(([key, value]) => is7(value, SQLiteTable) && !excludedTables.has(key));
6591
6633
  const tables = Object.fromEntries(tableEntries);
6634
+ const featureOf = resolveTableFeatures(features);
6635
+ const anyTable = (feature) => tableEntries.some(([name]) => featureOf(name)[feature]);
6592
6636
  if (!tableEntries.length) {
6593
6637
  throw new Error(
6594
6638
  "Drizzle-GraphQL Error: No tables detected in Drizzle-ORM's database instance. Did you forget to pass schema to drizzle constructor?"
@@ -6626,7 +6670,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6626
6670
  complexity,
6627
6671
  limits,
6628
6672
  docs: options.docs ?? {},
6629
- features
6673
+ featureOf
6630
6674
  };
6631
6675
  if (features.nestedWrites && db.resultKind === "sync") {
6632
6676
  throw new Error(
@@ -6642,7 +6686,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6642
6686
  ) : void 0;
6643
6687
  const nestedTypes = nestedPlans ? createNestedWriteTypes({ plans: nestedPlans, cacheCtx, typeNameMapper, insertPrefix: prefixes.insert }) : void 0;
6644
6688
  const nestedRuntime = nestedPlans ? createNestedWriteRuntime({ plans: nestedPlans, filterCtx }) : void 0;
6645
- const relationAggregateFactory = features.relationAggregates ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
6689
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
6646
6690
  const queries = {};
6647
6691
  const mutations = {};
6648
6692
  if (options.transactions && db.resultKind === "sync") {
@@ -6665,7 +6709,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6665
6709
  prefixes.insert,
6666
6710
  prefixes.update,
6667
6711
  resolverFactory,
6668
- relationAggregateFactory,
6712
+ featureOf(tableName).relationAggregates ? relationAggregateFactory : void 0,
6669
6713
  nestedTypes
6670
6714
  )
6671
6715
  ])
@@ -6673,6 +6717,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6673
6717
  const inputs = {};
6674
6718
  const outputs = {};
6675
6719
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
6720
+ const tableFeatures = featureOf(tableName);
6676
6721
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
6677
6722
  const { selectSingleOutput, selectArrOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
6678
6723
  const {
@@ -6704,7 +6749,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6704
6749
  typeName,
6705
6750
  typeNameMapper,
6706
6751
  filterCtx,
6707
- features.distinct,
6752
+ tableFeatures.distinct,
6708
6753
  limits
6709
6754
  );
6710
6755
  const selectSingleGenerated = generateSelectSingle3(
@@ -6720,7 +6765,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6720
6765
  filterCtx,
6721
6766
  limits
6722
6767
  );
6723
- const insertArrGenerated = features.insert ? generateInsertArray3(
6768
+ const insertArrGenerated = tableFeatures.insert ? generateInsertArray3(
6724
6769
  db,
6725
6770
  tableName,
6726
6771
  schema[tableName],
@@ -6735,7 +6780,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6735
6780
  nestedRuntime,
6736
6781
  limits
6737
6782
  ) : void 0;
6738
- const insertSingleGenerated = features.insert ? generateInsertSingle3(
6783
+ const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle3(
6739
6784
  db,
6740
6785
  tableName,
6741
6786
  schema[tableName],
@@ -6750,8 +6795,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6750
6795
  nestedRuntime,
6751
6796
  limits
6752
6797
  ) : void 0;
6753
- const uniqueSets = features.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig3) : [];
6754
- const onConflictInput = features.upsert ? generateOnConflictInput({
6798
+ const uniqueSets = tableFeatures.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig3) : [];
6799
+ const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
6755
6800
  table: schema[tableName],
6756
6801
  typeName,
6757
6802
  uniqueSets,
@@ -6794,7 +6839,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6794
6839
  nestedRuntime,
6795
6840
  limits
6796
6841
  ) : void 0;
6797
- const updateGenerated = features.update ? generateUpdate3(
6842
+ const updateGenerated = tableFeatures.update ? generateUpdate3(
6798
6843
  db,
6799
6844
  tableName,
6800
6845
  schema[tableName],
@@ -6805,14 +6850,14 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6805
6850
  updateFieldName,
6806
6851
  typeName,
6807
6852
  false,
6808
- features.requireWhere,
6853
+ tableFeatures.requireWhere,
6809
6854
  typeNameMapper,
6810
6855
  filterCtx,
6811
6856
  mutationTxCtx,
6812
6857
  nestedRuntime,
6813
6858
  limits
6814
6859
  ) : void 0;
6815
- const updateSingleGenerated = features.update ? generateUpdate3(
6860
+ const updateSingleGenerated = tableFeatures.update ? generateUpdate3(
6816
6861
  db,
6817
6862
  tableName,
6818
6863
  schema[tableName],
@@ -6823,14 +6868,14 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6823
6868
  updateSingleFieldName,
6824
6869
  typeName,
6825
6870
  true,
6826
- features.requireWhere,
6871
+ tableFeatures.requireWhere,
6827
6872
  typeNameMapper,
6828
6873
  filterCtx,
6829
6874
  mutationTxCtx,
6830
6875
  nestedRuntime,
6831
6876
  limits
6832
6877
  ) : void 0;
6833
- const updateManyInput = features.update && features.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
6878
+ const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
6834
6879
  const updateManyGenerated = updateManyInput ? generateUpdateMany3(
6835
6880
  db,
6836
6881
  tableName,
@@ -6846,7 +6891,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6846
6891
  nestedRuntime,
6847
6892
  limits
6848
6893
  ) : void 0;
6849
- const deleteGenerated = features.delete ? generateDelete3(
6894
+ const deleteGenerated = tableFeatures.delete ? generateDelete3(
6850
6895
  db,
6851
6896
  tableName,
6852
6897
  schema[tableName],
@@ -6854,12 +6899,12 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6854
6899
  deleteFieldName,
6855
6900
  typeName,
6856
6901
  false,
6857
- features.requireWhere,
6902
+ tableFeatures.requireWhere,
6858
6903
  filterCtx,
6859
6904
  { tableName, relationMap: namedRelations, tables },
6860
6905
  mutationTxCtx
6861
6906
  ) : void 0;
6862
- const deleteSingleGenerated = features.delete ? generateDelete3(
6907
+ const deleteSingleGenerated = tableFeatures.delete ? generateDelete3(
6863
6908
  db,
6864
6909
  tableName,
6865
6910
  schema[tableName],
@@ -6867,12 +6912,12 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6867
6912
  deleteSingleFieldName,
6868
6913
  typeName,
6869
6914
  true,
6870
- features.requireWhere,
6915
+ tableFeatures.requireWhere,
6871
6916
  filterCtx,
6872
6917
  { tableName, relationMap: namedRelations, tables },
6873
6918
  mutationTxCtx
6874
6919
  ) : void 0;
6875
- const updateCountGenerated = features.update && features.countMutations ? generateWriteCount({
6920
+ const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
6876
6921
  db,
6877
6922
  tableName,
6878
6923
  table: schema[tableName],
@@ -6880,24 +6925,24 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6880
6925
  setArgs: updateInput,
6881
6926
  filterArgs: tableFilters,
6882
6927
  fieldName: updateCountFieldName,
6883
- requireWhere: features.requireWhere,
6928
+ requireWhere: tableFeatures.requireWhere,
6884
6929
  filterCtx,
6885
6930
  txCtx: mutationTxCtx,
6886
6931
  nested: nestedRuntime
6887
6932
  }) : void 0;
6888
- const deleteCountGenerated = features.delete && features.countMutations ? generateWriteCount({
6933
+ const deleteCountGenerated = tableFeatures.delete && tableFeatures.countMutations ? generateWriteCount({
6889
6934
  db,
6890
6935
  tableName,
6891
6936
  table: schema[tableName],
6892
6937
  kind: "delete",
6893
6938
  filterArgs: tableFilters,
6894
6939
  fieldName: deleteCountFieldName,
6895
- requireWhere: features.requireWhere,
6940
+ requireWhere: tableFeatures.requireWhere,
6896
6941
  filterCtx,
6897
6942
  txCtx: mutationTxCtx
6898
6943
  }) : void 0;
6899
- const aggregateType = features.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6900
- const aggregateGenerated = features.aggregates ? generateAggregate(
6944
+ const aggregateType = tableFeatures.aggregates ? generateAggregateTypes(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6945
+ const aggregateGenerated = tableFeatures.aggregates ? generateAggregate(
6901
6946
  db,
6902
6947
  tableName,
6903
6948
  schema[tableName],
@@ -6906,7 +6951,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6906
6951
  tableFilters,
6907
6952
  filterCtx
6908
6953
  ) : void 0;
6909
- const groupByType = features.aggregates && features.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6954
+ const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6910
6955
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
6911
6956
  const havingInput = groupByEnum ? generateHavingInput(schema[tableName], tableName, typeName) : void 0;
6912
6957
  const groupByGenerated = groupByType && groupByEnum && havingInput ? generateGroupBy(
@@ -7034,9 +7079,9 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7034
7079
  }
7035
7080
  const activeInputs = [
7036
7081
  // The insert input types the upsert mutations too, so either feature keeps it.
7037
- ...features.insert || onConflictInput ? [insertInput] : [],
7082
+ ...tableFeatures.insert || onConflictInput ? [insertInput] : [],
7038
7083
  ...onConflictInput ? [onConflictInput] : [],
7039
- ...features.update ? [updateInput] : [],
7084
+ ...tableFeatures.update ? [updateInput] : [],
7040
7085
  ...updateManyInput ? [updateManyInput] : [],
7041
7086
  tableFilters,
7042
7087
  tableOrder
@@ -7097,22 +7142,11 @@ var buildSchema = (db, config) => {
7097
7142
  list: config?.suffixes?.list ?? "",
7098
7143
  single: config?.suffixes?.single ?? "Single"
7099
7144
  };
7100
- const typeNameMapper = config?.typeNameMapper;
7101
- const features = {
7102
- aggregates: config?.features?.aggregates ?? true,
7103
- groupBy: config?.features?.groupBy ?? true,
7104
- relationAggregates: config?.features?.relationAggregates ?? true,
7105
- distinct: config?.features?.distinct ?? true,
7106
- insert: config?.features?.insert ?? true,
7107
- update: config?.features?.update ?? true,
7108
- updateMany: config?.features?.updateMany ?? true,
7109
- delete: config?.features?.delete ?? true,
7110
- upsert: config?.features?.upsert ?? false,
7111
- nestedWrites: config?.features?.nestedWrites ?? false,
7112
- fieldUpdateOperations: config?.features?.fieldUpdateOperations ?? false,
7113
- countMutations: config?.features?.countMutations ?? false,
7114
- requireWhere: config?.features?.requireWhere ?? false
7115
- };
7145
+ const typeNameMapper = config?.typeNameMapper === "singularize" ? singularizeMapper : config?.typeNameMapper;
7146
+ const tableKeys = Object.entries(schema).filter(([, value]) => is8(value, Table)).map(([key]) => key);
7147
+ const excludedTableNames = new Set(config?.exclude?.tables ?? []);
7148
+ const featureTables = tableKeys.filter((key) => !excludedTableNames.has(key));
7149
+ const forTable = resolveTableFeatures(config?.features);
7116
7150
  const complexityConfig = config?.complexity ?? true;
7117
7151
  const complexity = complexityConfig === false ? void 0 : {
7118
7152
  defaultListSize: (complexityConfig === true ? void 0 : complexityConfig.defaultListSize) ?? 10,
@@ -7149,10 +7183,8 @@ var buildSchema = (db, config) => {
7149
7183
  } : void 0;
7150
7184
  const exclude = config?.exclude;
7151
7185
  if (exclude) {
7152
- const tableNames = new Set(
7153
- Object.entries(schema).filter(([, value]) => is8(value, Table)).map(([key]) => key)
7154
- );
7155
- const excludedTables = new Set(exclude.tables ?? []);
7186
+ const tableNames = new Set(tableKeys);
7187
+ const excludedTables = excludedTableNames;
7156
7188
  for (const tableName of excludedTables) {
7157
7189
  if (!tableNames.has(tableName)) {
7158
7190
  throw new Error(
@@ -7190,6 +7222,49 @@ var buildSchema = (db, config) => {
7190
7222
  }
7191
7223
  }
7192
7224
  }
7225
+ const featureConflicts = /* @__PURE__ */ new Map();
7226
+ const noteConflict = (message, tableName) => {
7227
+ const tables = featureConflicts.get(message);
7228
+ if (tables) {
7229
+ tables.push(tableName);
7230
+ } else {
7231
+ featureConflicts.set(message, [tableName]);
7232
+ }
7233
+ };
7234
+ for (const tableName of featureTables) {
7235
+ const tableFeatures = forTable(tableName);
7236
+ if (tableFeatures.upsert) {
7237
+ const missing = [!tableFeatures.insert ? "insert" : void 0, !tableFeatures.update ? "update" : void 0].filter(Boolean).join(" and ");
7238
+ if (missing) {
7239
+ noteConflict(
7240
+ `upsert is on while ${missing} is off, so the upsert mutations are a second write path past the operation you turned off`,
7241
+ tableName
7242
+ );
7243
+ }
7244
+ }
7245
+ if (config?.features?.nestedWrites && (!tableFeatures.insert || !tableFeatures.update)) {
7246
+ noteConflict(
7247
+ "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",
7248
+ tableName
7249
+ );
7250
+ }
7251
+ if (config?.features?.updateMany !== void 0 && tableFeatures.updateMany && !tableFeatures.update) {
7252
+ noteConflict("updateMany is on while update is off, so no batch update is generated", tableName);
7253
+ }
7254
+ if (config?.features?.groupBy !== void 0 && tableFeatures.groupBy && !tableFeatures.aggregates) {
7255
+ noteConflict("groupBy is on while aggregates is off, so no grouped query is generated", tableName);
7256
+ }
7257
+ if (tableFeatures.countMutations && !tableFeatures.update && !tableFeatures.delete) {
7258
+ noteConflict(
7259
+ "countMutations is on while update and delete are both off, so no count mutation is generated",
7260
+ tableName
7261
+ );
7262
+ }
7263
+ }
7264
+ for (const [message, tables] of featureConflicts) {
7265
+ const listed = tables.length > 5 ? `${tables.slice(0, 5).join(", ")} and ${tables.length - 5} more` : tables.join(", ");
7266
+ console.warn(`Drizzle-GraphQL Warning: config.features \u2014 ${message} (${listed}).`);
7267
+ }
7193
7268
  const eagerOpt = config?.eagerLoadRelations;
7194
7269
  const shouldEagerLoad = eagerOpt === void 0 || eagerOpt === true ? () => true : eagerOpt === false ? () => false : eagerOpt;
7195
7270
  if (!typeNameMapper && suffixes.list === suffixes.single) {
@@ -7216,7 +7291,7 @@ var buildSchema = (db, config) => {
7216
7291
  conflictDoNothing: config?.conflictDoNothing ?? false,
7217
7292
  typeNameMapper,
7218
7293
  shouldEagerLoad,
7219
- features,
7294
+ features: config?.features ?? {},
7220
7295
  complexity,
7221
7296
  scalars: config?.scalars,
7222
7297
  mapColumnType: config?.mapColumnType,
@@ -7277,6 +7352,7 @@ export {
7277
7352
  drizzleExecutorKey,
7278
7353
  extractFilters,
7279
7354
  extractOrderBy,
7280
- extractRelationJoinColumns
7355
+ extractRelationJoinColumns,
7356
+ singularizeMapper
7281
7357
  };
7282
7358
  //# sourceMappingURL=index.js.map