@vantreeseba/drizzle-graphql 4.1.0 → 5.0.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.d.cts CHANGED
@@ -55,6 +55,12 @@ type FilterColumnOperatorsCore<TColumn extends Column, TColType = GetColumnGqlDa
55
55
  notLike: string;
56
56
  ilike: string;
57
57
  notIlike: string;
58
+ startsWith: string;
59
+ endsWith: string;
60
+ contains: string;
61
+ iStartsWith: string;
62
+ iEndsWith: string;
63
+ iContains: string;
58
64
  inArray: Array<TColType>;
59
65
  notInArray: Array<TColType>;
60
66
  isNull: boolean;
@@ -64,12 +70,19 @@ type FiltersCore<TTable extends Table> = Partial<{
64
70
  [Column in keyof TTable['_']['columns']]: FilterColumnOperatorsCore<TTable['_']['columns'][Column]>;
65
71
  }>;
66
72
  type Filters<TTable extends Table, TFilterType = FiltersCore<TTable>> = TFilterType & {
67
- OR?: TFilterType[];
73
+ OR?: Filters<TTable, TFilterType>[];
74
+ AND?: Filters<TTable, TFilterType>[];
75
+ NOT?: Filters<TTable, TFilterType>;
68
76
  };
69
77
  type OrderByArgs<TTable extends Table> = {
70
78
  [Key in keyof TTable['_']['columns']]?: {
71
79
  direction: 'asc' | 'desc';
72
80
  priority: number;
81
+ /**
82
+ * Where NULL values sort. Native NULLS FIRST/LAST on PostgreSQL and SQLite;
83
+ * emulated with an extra `IS NULL` sort key on MySQL.
84
+ */
85
+ nulls?: 'first' | 'last';
73
86
  };
74
87
  };
75
88
 
@@ -116,7 +129,21 @@ declare const drizzleExecutorKey: unique symbol;
116
129
  * into a single IN-clause query, eliminating N+1 database round-trips.
117
130
  */
118
131
  declare const createRelationResolverFactory: (db: any, tables: Record<string, Table>, filterCtx?: RelationFilterBase) => RelationResolverFactory;
119
- declare const extractOrderBy: <TTable extends Table, TArgs extends OrderByArgs<any> = OrderByArgs<TTable>>(table: TTable, orderArgs: TArgs) => SQL[];
132
+ /**
133
+ * Compiles an `orderBy` argument into ORDER BY expressions, highest priority first.
134
+ *
135
+ * A key naming one of the table's columns orders by that column. A key naming a to-one
136
+ * relation takes the target table's own OrderBy input and orders by the related row's
137
+ * column(s), compiled as a correlated scalar subquery — reusing the aliased-join machinery
138
+ * the relation filters are built on — so it works identically on all three dialects and
139
+ * inside the relational query builder's aliased CTEs. Priorities share one global space
140
+ * across relation boundaries. Each entry may also carry `nulls: first | last`
141
+ * (see {@link orderExpressions} for how MySQL emulates it).
142
+ *
143
+ * `ctx` supplies the tables and relation map that relation ordering needs; callers whose
144
+ * inputs cannot contain relation keys may omit it.
145
+ */
146
+ declare const extractOrderBy: <TTable extends Table, TArgs extends OrderByArgs<any> = OrderByArgs<TTable>>(table: TTable, orderArgs: TArgs, ctx?: RelationFilterContext) => SQL[];
120
147
  /**
121
148
  * Everything `extractFilters` needs to turn a relation key in a `where` argument into a
122
149
  * correlated subquery. Omitted by callers that don't generate relation filters, in which case
@@ -213,6 +240,15 @@ type UpsertArgs<TTable extends Table, isSingle extends boolean> = InsertArgs<TTa
213
240
  type DeleteArgs<TTable extends Table> = {
214
241
  where?: Filters<TTable>;
215
242
  };
243
+ /** Arguments of `update<Table>Single` — unlike the plural variant, `where` is required. */
244
+ type UpdateSingleArgs<TTable extends Table> = {
245
+ set: GetRemappedTableUpdateDataType<TTable>;
246
+ where: Filters<TTable>;
247
+ };
248
+ /** Arguments of `delete<Table>Single` — unlike the plural variant, `where` is required. */
249
+ type DeleteSingleArgs<TTable extends Table> = {
250
+ where: Filters<TTable>;
251
+ };
216
252
  type SelectResolver<TTable extends Table, TTables extends Record<string, Table>, TRelations extends Record<string, Relation>> = (source: any, args: Partial<QueryArgs<TTable, false>>, context: any, info: GraphQLResolveInfo) => Promise<keyof TRelations extends infer RelKey ? RelKey extends string ? Array<GetRemappedTableDataType<TTable> & {
217
253
  [K in RelKey]: TRelations[K] extends One<string> ? GetRemappedTableDataType<ExtractTableByName<TTables, TRelations[K]['referencedTableName']> extends infer T ? T[keyof T] : never> | null : TRelations[K] extends Many<string> ? Array<GetRemappedTableDataType<ExtractTableByName<TTables, TRelations[K]['referencedTableName']> extends infer T ? T[keyof T] : never>> : never;
218
254
  }> : Array<GetRemappedTableDataType<TTable>> : Array<GetRemappedTableDataType<TTable>>>;
@@ -224,6 +260,11 @@ type InsertResolver<TTable extends Table, IsReturnless extends boolean> = (sourc
224
260
  /** Resolver for `create<Table>`: an array of rows in, an array of rows out. */
225
261
  type InsertArrResolver<TTable extends Table, IsReturnless extends boolean> = (source: any, args: Partial<InsertArgs<TTable, false>>, context: any, info: GraphQLResolveInfo) => Promise<IsReturnless extends false ? Array<GetRemappedTableDataType<TTable>> : MutationReturnlessResult>;
226
262
  type UpdateResolver<TTable extends Table, IsReturnless extends boolean> = (source: any, args: UpdateArgs<TTable>, context: any, info: GraphQLResolveInfo) => Promise<IsReturnless extends false ? GetRemappedTableDataType<TTable> | undefined : MutationReturnlessResult>;
263
+ /**
264
+ * Resolver for `update<Table>Single`: `where` required, the single (nullable) affected row
265
+ * out. Throws before writing anything when `where` matches more than one row.
266
+ */
267
+ type UpdateSingleResolver<TTable extends Table, IsReturnless extends boolean> = (source: any, args: UpdateSingleArgs<TTable>, context: any, info: GraphQLResolveInfo) => Promise<IsReturnless extends false ? GetRemappedTableDataType<TTable> | undefined : MutationReturnlessResult>;
227
268
  /** Resolver for `upsert<Table>Single`. */
228
269
  type UpsertResolver<TTable extends Table, IsReturnless extends boolean> = (source: any, args: Partial<UpsertArgs<TTable, true>>, context: any, info: GraphQLResolveInfo) => Promise<IsReturnless extends false ? GetRemappedTableDataType<TTable> | undefined : MutationReturnlessResult>;
229
270
  /** Resolver for `upsert<Table>`. */
@@ -237,6 +278,11 @@ type AggregateResolver<TTable extends Table> = (source: any, args: {
237
278
  where?: Filters<TTable>;
238
279
  }, context: any, info: GraphQLResolveInfo) => Promise<Record<string, any>>;
239
280
  type DeleteResolver<TTable extends Table, IsReturnless extends boolean> = (source: any, args: DeleteArgs<TTable>, context: any, info: GraphQLResolveInfo) => Promise<IsReturnless extends false ? GetRemappedTableDataType<TTable> | undefined : MutationReturnlessResult>;
281
+ /**
282
+ * Resolver for `delete<Table>Single`: `where` required, the single (nullable) deleted row
283
+ * out. Throws before writing anything when `where` matches more than one row.
284
+ */
285
+ type DeleteSingleResolver<TTable extends Table, IsReturnless extends boolean> = (source: any, args: DeleteSingleArgs<TTable>, context: any, info: GraphQLResolveInfo) => Promise<IsReturnless extends false ? GetRemappedTableDataType<TTable> | undefined : MutationReturnlessResult>;
240
286
  type QueriesCore<TSchemaTables extends Record<string, Table>, TSchemaRelations extends Record<string, Relations>, TInputs extends Record<string, GraphQLInputObjectType>, TOutputs extends Record<string, GraphQLObjectType>> = {
241
287
  [TName in keyof TSchemaTables as TName extends string ? `${Uncapitalize<TName>}` : never]: TName extends string ? {
242
288
  type: GraphQLNonNull<GraphQLList<GraphQLNonNull<TOutputs[`${Capitalize<TName>}SelectItem`]>>>;
@@ -345,6 +391,19 @@ type MutationsCore<TSchemaTables extends Record<string, Table>, TInputs extends
345
391
  };
346
392
  resolve: UpdateResolver<TSchemaTables[TName], IsReturnless>;
347
393
  } : never;
394
+ } & {
395
+ [TName in keyof TSchemaTables as TName extends string ? `update${Capitalize<TName>}Single` : never]: TName extends string ? {
396
+ type: IsReturnless extends true ? TOutputs['MutationReturn'] extends GraphQLObjectType ? TOutputs['MutationReturn'] : never : TOutputs[`${Capitalize<TName>}Item`];
397
+ args: {
398
+ set: {
399
+ type: GraphQLNonNull<TInputs[`${Capitalize<TName>}UpdateInput`]>;
400
+ };
401
+ where: {
402
+ type: GraphQLNonNull<TInputs[`${Capitalize<TName>}Filters`] extends GraphQLInputObjectType ? TInputs[`${Capitalize<TName>}Filters`] : never>;
403
+ };
404
+ };
405
+ resolve: UpdateSingleResolver<TSchemaTables[TName], IsReturnless>;
406
+ } : never;
348
407
  } & {
349
408
  [TName in keyof TSchemaTables as TName extends string ? `delete${Capitalize<TName>}` : never]: TName extends string ? {
350
409
  type: IsReturnless extends true ? TOutputs['MutationReturn'] extends GraphQLObjectType ? TOutputs['MutationReturn'] : never : GraphQLNonNull<GraphQLList<GraphQLNonNull<TOutputs[`${Capitalize<TName>}Item`]>>>;
@@ -355,6 +414,16 @@ type MutationsCore<TSchemaTables extends Record<string, Table>, TInputs extends
355
414
  };
356
415
  resolve: DeleteResolver<TSchemaTables[TName], IsReturnless>;
357
416
  } : never;
417
+ } & {
418
+ [TName in keyof TSchemaTables as TName extends string ? `delete${Capitalize<TName>}Single` : never]: TName extends string ? {
419
+ type: IsReturnless extends true ? TOutputs['MutationReturn'] extends GraphQLObjectType ? TOutputs['MutationReturn'] : never : TOutputs[`${Capitalize<TName>}Item`];
420
+ args: {
421
+ where: {
422
+ type: GraphQLNonNull<TInputs[`${Capitalize<TName>}Filters`] extends GraphQLInputObjectType ? TInputs[`${Capitalize<TName>}Filters`] : never>;
423
+ };
424
+ };
425
+ resolve: DeleteSingleResolver<TSchemaTables[TName], IsReturnless>;
426
+ } : never;
358
427
  };
359
428
  type GeneratedInputs<TSchema extends Record<string, Table>> = {
360
429
  [TName in keyof TSchema as TName extends string ? `${Capitalize<TName>}InsertInput` : never]: GraphQLInputObjectType;
@@ -400,15 +469,22 @@ type GeneratedData<TDatabase extends AnyDrizzleDB<any>> = {
400
469
  type SchemaFeatures = {
401
470
  /** `<plural>Aggregate` root queries and the aggregate output types. @default true */
402
471
  aggregates?: boolean;
472
+ /**
473
+ * `<plural>GroupBy` root queries — the same aggregates, one row per group. Requires
474
+ * `aggregates`, whose output types the grouped result reuses.
475
+ *
476
+ * @default true
477
+ */
478
+ groupBy?: boolean;
403
479
  /** `<relation>Aggregate` fields on object types, for to-many relations. @default true */
404
480
  relationAggregates?: boolean;
405
481
  /** The `distinct` argument on list queries. @default true */
406
482
  distinct?: boolean;
407
483
  /** `create<Table>` / `create<Table>Single` mutations. @default true */
408
484
  insert?: boolean;
409
- /** `update<Table>` mutations. @default true */
485
+ /** `update<Table>` / `update<Table>Single` mutations. @default true */
410
486
  update?: boolean;
411
- /** `delete<Table>` mutations. @default true */
487
+ /** `delete<Table>` / `delete<Table>Single` mutations. @default true */
412
488
  delete?: boolean;
413
489
  /**
414
490
  * `upsert<Table>` / `upsert<Table>Single` mutations — insert, or update the row that
@@ -418,6 +494,17 @@ type SchemaFeatures = {
418
494
  * @default false
419
495
  */
420
496
  upsert?: boolean;
497
+ /**
498
+ * Makes `where` non-null on the plural `update<Table>` / `delete<Table>` mutations, and
499
+ * rejects a `where` that collapses to no filters (e.g. `where: {}`), so a schema can rule
500
+ * out unbounded writes at the type level. Off by default for backwards compatibility.
501
+ *
502
+ * The `Single` variants (`update<Table>Single` / `delete<Table>Single`) require a
503
+ * non-empty `where` regardless of this flag.
504
+ *
505
+ * @default false
506
+ */
507
+ requireWhere?: boolean;
421
508
  };
422
509
  /**
423
510
  * Per-field cost hints for `graphql-query-complexity` (or any estimator that reads
@@ -636,7 +723,14 @@ type BuildSchemaConfig = {
636
723
  * for everything else, so a client cannot know which it will get.
637
724
  */
638
725
  declare const GraphQLBigIntString: GraphQLScalarType<string, string>;
726
+ /**
727
+ * An arbitrary-precision decimal (`numeric` / `decimal` columns). Always transported as a
728
+ * numeric string, in both directions, so no value is ever silently rounded by JSON's
729
+ * double-precision numbers. Accepts numeric literals and numeric strings on input; rejects
730
+ * non-numeric strings (including 'NaN' and 'Infinity').
731
+ */
732
+ declare const GraphQLDecimalString: GraphQLScalarType<string, string>;
639
733
 
640
734
  declare const buildSchema: <TDbClient extends AnyDrizzleDB<any>>(db: TDbClient, config?: BuildSchemaConfig) => GeneratedData<TDbClient>;
641
735
 
642
- export { type AggregateResolver, type AnyDrizzleDB, type BuildSchemaConfig, type ComplexityConfig, type DeleteResolver, type ExtractRelations, type ExtractTableByName, type ExtractTableRelations, type ExtractTables, type GeneratedData, type GeneratedEntities, type GeneratedInputs, type GeneratedOutputs, GraphQLBigIntString, type InsertArrResolver, type InsertResolver, type MutationReturnlessResult, type MutationsCore, type QueriesCore, type RelationResolverFactory, type SchemaFeatures, type SelectResolver, type SelectSingleResolver, type TableNamedRelations, type UpdateResolver, type UpsertArgs, type UpsertArrResolver, type UpsertConflictArgs, type UpsertResolver, buildSchema, createRelationResolverFactory, defaultErrorMapper, drizzleExecutorKey, extractFilters, extractOrderBy, extractRelationJoinColumns };
736
+ export { type AggregateResolver, type AnyDrizzleDB, type BuildSchemaConfig, type ComplexityConfig, type DeleteResolver, type DeleteSingleResolver, type ExtractRelations, type ExtractTableByName, type ExtractTableRelations, type ExtractTables, type GeneratedData, type GeneratedEntities, type GeneratedInputs, type GeneratedOutputs, GraphQLBigIntString, GraphQLDecimalString, type InsertArrResolver, type InsertResolver, type MutationReturnlessResult, type MutationsCore, type QueriesCore, type RelationResolverFactory, type SchemaFeatures, type SelectResolver, type SelectSingleResolver, type TableNamedRelations, type UpdateResolver, type UpdateSingleResolver, type UpsertArgs, type UpsertArrResolver, type UpsertConflictArgs, type UpsertResolver, buildSchema, createRelationResolverFactory, defaultErrorMapper, drizzleExecutorKey, extractFilters, extractOrderBy, extractRelationJoinColumns };
package/dist/index.d.ts CHANGED
@@ -55,6 +55,12 @@ type FilterColumnOperatorsCore<TColumn extends Column, TColType = GetColumnGqlDa
55
55
  notLike: string;
56
56
  ilike: string;
57
57
  notIlike: string;
58
+ startsWith: string;
59
+ endsWith: string;
60
+ contains: string;
61
+ iStartsWith: string;
62
+ iEndsWith: string;
63
+ iContains: string;
58
64
  inArray: Array<TColType>;
59
65
  notInArray: Array<TColType>;
60
66
  isNull: boolean;
@@ -64,12 +70,19 @@ type FiltersCore<TTable extends Table> = Partial<{
64
70
  [Column in keyof TTable['_']['columns']]: FilterColumnOperatorsCore<TTable['_']['columns'][Column]>;
65
71
  }>;
66
72
  type Filters<TTable extends Table, TFilterType = FiltersCore<TTable>> = TFilterType & {
67
- OR?: TFilterType[];
73
+ OR?: Filters<TTable, TFilterType>[];
74
+ AND?: Filters<TTable, TFilterType>[];
75
+ NOT?: Filters<TTable, TFilterType>;
68
76
  };
69
77
  type OrderByArgs<TTable extends Table> = {
70
78
  [Key in keyof TTable['_']['columns']]?: {
71
79
  direction: 'asc' | 'desc';
72
80
  priority: number;
81
+ /**
82
+ * Where NULL values sort. Native NULLS FIRST/LAST on PostgreSQL and SQLite;
83
+ * emulated with an extra `IS NULL` sort key on MySQL.
84
+ */
85
+ nulls?: 'first' | 'last';
73
86
  };
74
87
  };
75
88
 
@@ -116,7 +129,21 @@ declare const drizzleExecutorKey: unique symbol;
116
129
  * into a single IN-clause query, eliminating N+1 database round-trips.
117
130
  */
118
131
  declare const createRelationResolverFactory: (db: any, tables: Record<string, Table>, filterCtx?: RelationFilterBase) => RelationResolverFactory;
119
- declare const extractOrderBy: <TTable extends Table, TArgs extends OrderByArgs<any> = OrderByArgs<TTable>>(table: TTable, orderArgs: TArgs) => SQL[];
132
+ /**
133
+ * Compiles an `orderBy` argument into ORDER BY expressions, highest priority first.
134
+ *
135
+ * A key naming one of the table's columns orders by that column. A key naming a to-one
136
+ * relation takes the target table's own OrderBy input and orders by the related row's
137
+ * column(s), compiled as a correlated scalar subquery — reusing the aliased-join machinery
138
+ * the relation filters are built on — so it works identically on all three dialects and
139
+ * inside the relational query builder's aliased CTEs. Priorities share one global space
140
+ * across relation boundaries. Each entry may also carry `nulls: first | last`
141
+ * (see {@link orderExpressions} for how MySQL emulates it).
142
+ *
143
+ * `ctx` supplies the tables and relation map that relation ordering needs; callers whose
144
+ * inputs cannot contain relation keys may omit it.
145
+ */
146
+ declare const extractOrderBy: <TTable extends Table, TArgs extends OrderByArgs<any> = OrderByArgs<TTable>>(table: TTable, orderArgs: TArgs, ctx?: RelationFilterContext) => SQL[];
120
147
  /**
121
148
  * Everything `extractFilters` needs to turn a relation key in a `where` argument into a
122
149
  * correlated subquery. Omitted by callers that don't generate relation filters, in which case
@@ -213,6 +240,15 @@ type UpsertArgs<TTable extends Table, isSingle extends boolean> = InsertArgs<TTa
213
240
  type DeleteArgs<TTable extends Table> = {
214
241
  where?: Filters<TTable>;
215
242
  };
243
+ /** Arguments of `update<Table>Single` — unlike the plural variant, `where` is required. */
244
+ type UpdateSingleArgs<TTable extends Table> = {
245
+ set: GetRemappedTableUpdateDataType<TTable>;
246
+ where: Filters<TTable>;
247
+ };
248
+ /** Arguments of `delete<Table>Single` — unlike the plural variant, `where` is required. */
249
+ type DeleteSingleArgs<TTable extends Table> = {
250
+ where: Filters<TTable>;
251
+ };
216
252
  type SelectResolver<TTable extends Table, TTables extends Record<string, Table>, TRelations extends Record<string, Relation>> = (source: any, args: Partial<QueryArgs<TTable, false>>, context: any, info: GraphQLResolveInfo) => Promise<keyof TRelations extends infer RelKey ? RelKey extends string ? Array<GetRemappedTableDataType<TTable> & {
217
253
  [K in RelKey]: TRelations[K] extends One<string> ? GetRemappedTableDataType<ExtractTableByName<TTables, TRelations[K]['referencedTableName']> extends infer T ? T[keyof T] : never> | null : TRelations[K] extends Many<string> ? Array<GetRemappedTableDataType<ExtractTableByName<TTables, TRelations[K]['referencedTableName']> extends infer T ? T[keyof T] : never>> : never;
218
254
  }> : Array<GetRemappedTableDataType<TTable>> : Array<GetRemappedTableDataType<TTable>>>;
@@ -224,6 +260,11 @@ type InsertResolver<TTable extends Table, IsReturnless extends boolean> = (sourc
224
260
  /** Resolver for `create<Table>`: an array of rows in, an array of rows out. */
225
261
  type InsertArrResolver<TTable extends Table, IsReturnless extends boolean> = (source: any, args: Partial<InsertArgs<TTable, false>>, context: any, info: GraphQLResolveInfo) => Promise<IsReturnless extends false ? Array<GetRemappedTableDataType<TTable>> : MutationReturnlessResult>;
226
262
  type UpdateResolver<TTable extends Table, IsReturnless extends boolean> = (source: any, args: UpdateArgs<TTable>, context: any, info: GraphQLResolveInfo) => Promise<IsReturnless extends false ? GetRemappedTableDataType<TTable> | undefined : MutationReturnlessResult>;
263
+ /**
264
+ * Resolver for `update<Table>Single`: `where` required, the single (nullable) affected row
265
+ * out. Throws before writing anything when `where` matches more than one row.
266
+ */
267
+ type UpdateSingleResolver<TTable extends Table, IsReturnless extends boolean> = (source: any, args: UpdateSingleArgs<TTable>, context: any, info: GraphQLResolveInfo) => Promise<IsReturnless extends false ? GetRemappedTableDataType<TTable> | undefined : MutationReturnlessResult>;
227
268
  /** Resolver for `upsert<Table>Single`. */
228
269
  type UpsertResolver<TTable extends Table, IsReturnless extends boolean> = (source: any, args: Partial<UpsertArgs<TTable, true>>, context: any, info: GraphQLResolveInfo) => Promise<IsReturnless extends false ? GetRemappedTableDataType<TTable> | undefined : MutationReturnlessResult>;
229
270
  /** Resolver for `upsert<Table>`. */
@@ -237,6 +278,11 @@ type AggregateResolver<TTable extends Table> = (source: any, args: {
237
278
  where?: Filters<TTable>;
238
279
  }, context: any, info: GraphQLResolveInfo) => Promise<Record<string, any>>;
239
280
  type DeleteResolver<TTable extends Table, IsReturnless extends boolean> = (source: any, args: DeleteArgs<TTable>, context: any, info: GraphQLResolveInfo) => Promise<IsReturnless extends false ? GetRemappedTableDataType<TTable> | undefined : MutationReturnlessResult>;
281
+ /**
282
+ * Resolver for `delete<Table>Single`: `where` required, the single (nullable) deleted row
283
+ * out. Throws before writing anything when `where` matches more than one row.
284
+ */
285
+ type DeleteSingleResolver<TTable extends Table, IsReturnless extends boolean> = (source: any, args: DeleteSingleArgs<TTable>, context: any, info: GraphQLResolveInfo) => Promise<IsReturnless extends false ? GetRemappedTableDataType<TTable> | undefined : MutationReturnlessResult>;
240
286
  type QueriesCore<TSchemaTables extends Record<string, Table>, TSchemaRelations extends Record<string, Relations>, TInputs extends Record<string, GraphQLInputObjectType>, TOutputs extends Record<string, GraphQLObjectType>> = {
241
287
  [TName in keyof TSchemaTables as TName extends string ? `${Uncapitalize<TName>}` : never]: TName extends string ? {
242
288
  type: GraphQLNonNull<GraphQLList<GraphQLNonNull<TOutputs[`${Capitalize<TName>}SelectItem`]>>>;
@@ -345,6 +391,19 @@ type MutationsCore<TSchemaTables extends Record<string, Table>, TInputs extends
345
391
  };
346
392
  resolve: UpdateResolver<TSchemaTables[TName], IsReturnless>;
347
393
  } : never;
394
+ } & {
395
+ [TName in keyof TSchemaTables as TName extends string ? `update${Capitalize<TName>}Single` : never]: TName extends string ? {
396
+ type: IsReturnless extends true ? TOutputs['MutationReturn'] extends GraphQLObjectType ? TOutputs['MutationReturn'] : never : TOutputs[`${Capitalize<TName>}Item`];
397
+ args: {
398
+ set: {
399
+ type: GraphQLNonNull<TInputs[`${Capitalize<TName>}UpdateInput`]>;
400
+ };
401
+ where: {
402
+ type: GraphQLNonNull<TInputs[`${Capitalize<TName>}Filters`] extends GraphQLInputObjectType ? TInputs[`${Capitalize<TName>}Filters`] : never>;
403
+ };
404
+ };
405
+ resolve: UpdateSingleResolver<TSchemaTables[TName], IsReturnless>;
406
+ } : never;
348
407
  } & {
349
408
  [TName in keyof TSchemaTables as TName extends string ? `delete${Capitalize<TName>}` : never]: TName extends string ? {
350
409
  type: IsReturnless extends true ? TOutputs['MutationReturn'] extends GraphQLObjectType ? TOutputs['MutationReturn'] : never : GraphQLNonNull<GraphQLList<GraphQLNonNull<TOutputs[`${Capitalize<TName>}Item`]>>>;
@@ -355,6 +414,16 @@ type MutationsCore<TSchemaTables extends Record<string, Table>, TInputs extends
355
414
  };
356
415
  resolve: DeleteResolver<TSchemaTables[TName], IsReturnless>;
357
416
  } : never;
417
+ } & {
418
+ [TName in keyof TSchemaTables as TName extends string ? `delete${Capitalize<TName>}Single` : never]: TName extends string ? {
419
+ type: IsReturnless extends true ? TOutputs['MutationReturn'] extends GraphQLObjectType ? TOutputs['MutationReturn'] : never : TOutputs[`${Capitalize<TName>}Item`];
420
+ args: {
421
+ where: {
422
+ type: GraphQLNonNull<TInputs[`${Capitalize<TName>}Filters`] extends GraphQLInputObjectType ? TInputs[`${Capitalize<TName>}Filters`] : never>;
423
+ };
424
+ };
425
+ resolve: DeleteSingleResolver<TSchemaTables[TName], IsReturnless>;
426
+ } : never;
358
427
  };
359
428
  type GeneratedInputs<TSchema extends Record<string, Table>> = {
360
429
  [TName in keyof TSchema as TName extends string ? `${Capitalize<TName>}InsertInput` : never]: GraphQLInputObjectType;
@@ -400,15 +469,22 @@ type GeneratedData<TDatabase extends AnyDrizzleDB<any>> = {
400
469
  type SchemaFeatures = {
401
470
  /** `<plural>Aggregate` root queries and the aggregate output types. @default true */
402
471
  aggregates?: boolean;
472
+ /**
473
+ * `<plural>GroupBy` root queries — the same aggregates, one row per group. Requires
474
+ * `aggregates`, whose output types the grouped result reuses.
475
+ *
476
+ * @default true
477
+ */
478
+ groupBy?: boolean;
403
479
  /** `<relation>Aggregate` fields on object types, for to-many relations. @default true */
404
480
  relationAggregates?: boolean;
405
481
  /** The `distinct` argument on list queries. @default true */
406
482
  distinct?: boolean;
407
483
  /** `create<Table>` / `create<Table>Single` mutations. @default true */
408
484
  insert?: boolean;
409
- /** `update<Table>` mutations. @default true */
485
+ /** `update<Table>` / `update<Table>Single` mutations. @default true */
410
486
  update?: boolean;
411
- /** `delete<Table>` mutations. @default true */
487
+ /** `delete<Table>` / `delete<Table>Single` mutations. @default true */
412
488
  delete?: boolean;
413
489
  /**
414
490
  * `upsert<Table>` / `upsert<Table>Single` mutations — insert, or update the row that
@@ -418,6 +494,17 @@ type SchemaFeatures = {
418
494
  * @default false
419
495
  */
420
496
  upsert?: boolean;
497
+ /**
498
+ * Makes `where` non-null on the plural `update<Table>` / `delete<Table>` mutations, and
499
+ * rejects a `where` that collapses to no filters (e.g. `where: {}`), so a schema can rule
500
+ * out unbounded writes at the type level. Off by default for backwards compatibility.
501
+ *
502
+ * The `Single` variants (`update<Table>Single` / `delete<Table>Single`) require a
503
+ * non-empty `where` regardless of this flag.
504
+ *
505
+ * @default false
506
+ */
507
+ requireWhere?: boolean;
421
508
  };
422
509
  /**
423
510
  * Per-field cost hints for `graphql-query-complexity` (or any estimator that reads
@@ -636,7 +723,14 @@ type BuildSchemaConfig = {
636
723
  * for everything else, so a client cannot know which it will get.
637
724
  */
638
725
  declare const GraphQLBigIntString: GraphQLScalarType<string, string>;
726
+ /**
727
+ * An arbitrary-precision decimal (`numeric` / `decimal` columns). Always transported as a
728
+ * numeric string, in both directions, so no value is ever silently rounded by JSON's
729
+ * double-precision numbers. Accepts numeric literals and numeric strings on input; rejects
730
+ * non-numeric strings (including 'NaN' and 'Infinity').
731
+ */
732
+ declare const GraphQLDecimalString: GraphQLScalarType<string, string>;
639
733
 
640
734
  declare const buildSchema: <TDbClient extends AnyDrizzleDB<any>>(db: TDbClient, config?: BuildSchemaConfig) => GeneratedData<TDbClient>;
641
735
 
642
- export { type AggregateResolver, type AnyDrizzleDB, type BuildSchemaConfig, type ComplexityConfig, type DeleteResolver, type ExtractRelations, type ExtractTableByName, type ExtractTableRelations, type ExtractTables, type GeneratedData, type GeneratedEntities, type GeneratedInputs, type GeneratedOutputs, GraphQLBigIntString, type InsertArrResolver, type InsertResolver, type MutationReturnlessResult, type MutationsCore, type QueriesCore, type RelationResolverFactory, type SchemaFeatures, type SelectResolver, type SelectSingleResolver, type TableNamedRelations, type UpdateResolver, type UpsertArgs, type UpsertArrResolver, type UpsertConflictArgs, type UpsertResolver, buildSchema, createRelationResolverFactory, defaultErrorMapper, drizzleExecutorKey, extractFilters, extractOrderBy, extractRelationJoinColumns };
736
+ export { type AggregateResolver, type AnyDrizzleDB, type BuildSchemaConfig, type ComplexityConfig, type DeleteResolver, type DeleteSingleResolver, type ExtractRelations, type ExtractTableByName, type ExtractTableRelations, type ExtractTables, type GeneratedData, type GeneratedEntities, type GeneratedInputs, type GeneratedOutputs, GraphQLBigIntString, GraphQLDecimalString, type InsertArrResolver, type InsertResolver, type MutationReturnlessResult, type MutationsCore, type QueriesCore, type RelationResolverFactory, type SchemaFeatures, type SelectResolver, type SelectSingleResolver, type TableNamedRelations, type UpdateResolver, type UpdateSingleResolver, type UpsertArgs, type UpsertArrResolver, type UpsertConflictArgs, type UpsertResolver, buildSchema, createRelationResolverFactory, defaultErrorMapper, drizzleExecutorKey, extractFilters, extractOrderBy, extractRelationJoinColumns };