@vantreeseba/drizzle-graphql 7.4.0 → 7.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  // src/index.ts
2
- import { getColumns as getColumns6, is as is8, Table } from "drizzle-orm";
3
- import { MySqlDatabase } from "drizzle-orm/mysql-core";
4
- import { PgAsyncDatabase } from "drizzle-orm/pg-core";
5
- import { BaseSQLiteDatabase } from "drizzle-orm/sqlite-core";
2
+ import { getColumns as getColumns6, is as is9, Table as Table2 } from "drizzle-orm";
3
+ import { MySqlDatabase as MySqlDatabase2 } from "drizzle-orm/mysql-core";
4
+ import { PgAsyncDatabase as PgAsyncDatabase2 } from "drizzle-orm/pg-core";
5
+ import { BaseSQLiteDatabase as BaseSQLiteDatabase2 } from "drizzle-orm/sqlite-core";
6
6
  import {
7
7
  GraphQLObjectType as GraphQLObjectType5,
8
8
  GraphQLSchema
@@ -38,6 +38,7 @@ import {
38
38
  One as One2,
39
39
  or,
40
40
  relationsFilterToSQL,
41
+ SQL,
41
42
  sql as sql2
42
43
  } from "drizzle-orm";
43
44
  import {
@@ -606,6 +607,123 @@ var remapFromGraphQLArrayInput = (queryInput, table) => {
606
607
  return queryInput;
607
608
  };
608
609
 
610
+ // src/util/extensions.ts
611
+ var drizzleExtension = (target) => {
612
+ const value = target?.extensions?.drizzle;
613
+ return value && typeof value === "object" ? value : void 0;
614
+ };
615
+ var isDrizzleFieldExtension = (value) => !!value && value.kind !== "type";
616
+ var tableFieldExtensions = (table, primaryKey) => (meta) => ({
617
+ table,
618
+ primaryKey,
619
+ ...meta
620
+ });
621
+ var tableTypeExtension = (table, primaryKey) => ({
622
+ table,
623
+ kind: "type",
624
+ primaryKey
625
+ });
626
+ var relationFieldExtension = (params) => ({
627
+ table: params.targetTable,
628
+ kind: params.aggregate ? "aggregate" : "relation",
629
+ operation: params.aggregate ? "relationAggregate" : "relation",
630
+ // An aggregate over a to-many relation still resolves to a single aggregate object.
631
+ single: params.aggregate ? true : params.single,
632
+ targetArg: "where",
633
+ primaryKey: params.primaryKey,
634
+ relation: params.relation,
635
+ parentTable: params.parentTable
636
+ });
637
+ var keyFromValues = (entry, primaryKey) => {
638
+ if (!entry || typeof entry !== "object") {
639
+ return void 0;
640
+ }
641
+ const row = {};
642
+ for (const column of primaryKey) {
643
+ const value = entry[column];
644
+ if (value === void 0 || value === null) {
645
+ return void 0;
646
+ }
647
+ row[column] = value;
648
+ }
649
+ return row;
650
+ };
651
+ var keysFromWhere = (where, primaryKey) => {
652
+ const none = { rows: [], complete: false };
653
+ if (!where || typeof where !== "object" || Array.isArray(where)) {
654
+ return none;
655
+ }
656
+ const filters = where;
657
+ if (filters.OR || filters.AND || filters.NOT) {
658
+ return none;
659
+ }
660
+ if (primaryKey.length > 1) {
661
+ const row = {};
662
+ for (const column2 of primaryKey) {
663
+ const operators2 = filters[column2];
664
+ if (!operators2 || typeof operators2 !== "object" || operators2.eq === void 0) {
665
+ return none;
666
+ }
667
+ row[column2] = operators2.eq;
668
+ }
669
+ return { rows: [row], complete: Object.keys(filters).length === primaryKey.length };
670
+ }
671
+ const column = primaryKey[0];
672
+ if (!column) {
673
+ return none;
674
+ }
675
+ const operators = filters[column];
676
+ if (!operators || typeof operators !== "object") {
677
+ return none;
678
+ }
679
+ const exact = Object.keys(filters).length === 1 && Object.keys(operators).length === 1;
680
+ if (operators.eq !== void 0) {
681
+ return { rows: [{ [column]: operators.eq }], complete: exact };
682
+ }
683
+ if (Array.isArray(operators.inArray)) {
684
+ return { rows: operators.inArray.map((value) => ({ [column]: value })), complete: exact };
685
+ }
686
+ return none;
687
+ };
688
+ var identifyRows = (field, args) => {
689
+ const meta = drizzleExtension(field);
690
+ if (!isDrizzleFieldExtension(meta)) {
691
+ return void 0;
692
+ }
693
+ const { table, primaryKey, targetArg } = meta;
694
+ const empty = { table, primaryKey, rows: [], complete: false };
695
+ if (!primaryKey.length || !targetArg) {
696
+ return empty;
697
+ }
698
+ const target = args?.[targetArg];
699
+ if (targetArg === "values") {
700
+ const entries = Array.isArray(target) ? target : target === void 0 ? [] : [target];
701
+ const rows = entries.map((entry) => keyFromValues(entry, primaryKey));
702
+ return {
703
+ table,
704
+ primaryKey,
705
+ rows: rows.filter((row) => !!row),
706
+ // A row whose key the database generates is not identifiable before the write.
707
+ complete: entries.length > 0 && rows.every(Boolean)
708
+ };
709
+ }
710
+ if (targetArg === "updates") {
711
+ if (!Array.isArray(target)) {
712
+ return empty;
713
+ }
714
+ const perEntry = target.map(
715
+ (entry) => keysFromWhere(entry?.where, primaryKey)
716
+ );
717
+ return {
718
+ table,
719
+ primaryKey,
720
+ rows: perEntry.flatMap((entry) => entry.rows),
721
+ complete: target.length > 0 && perEntry.every((entry) => entry.complete)
722
+ };
723
+ }
724
+ return { table, primaryKey, ...keysFromWhere(target, primaryKey) };
725
+ };
726
+
609
727
  // src/util/builders/field-updates.ts
610
728
  import { getColumns, sql } from "drizzle-orm";
611
729
  import {
@@ -1037,7 +1155,7 @@ var batchedPaginatedRelationQuery = async (db, targetTable, foreignCol, whereCon
1037
1155
  }
1038
1156
  return rows;
1039
1157
  };
1040
- var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx, limits) => ({ tableName, relationName, relEntry, isOne }) => {
1158
+ var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx, limits, scopes) => ({ tableName, relationName, relEntry, isOne }) => {
1041
1159
  const parentTable = tables[tableName];
1042
1160
  const targetTableName = relEntry.targetTableName;
1043
1161
  const targetTable = tables[targetTableName];
@@ -1098,10 +1216,16 @@ var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx, limits
1098
1216
  const loader = getOrCreateLoader(context, loaderKey, async (parentIds) => {
1099
1217
  const executor = resolveExecutor(db, context);
1100
1218
  const uniqueIds = [...new Set(parentIds)];
1101
- let whereCondition = and(
1102
- inArray(foreignCol, uniqueIds),
1103
- whereArg ? extractFilters(targetTable, targetTableName, whereArg, relationFilterCtx(filterCtx, targetTableName)) : void 0,
1104
- cursorValues ? buildCursorCondition(targetTable, cursorEntries, cursorValues, nullOrdering) : void 0
1219
+ const scope = resolveScope(scopes, context, filterCtx);
1220
+ let whereCondition = withScope(
1221
+ scope,
1222
+ targetTableName,
1223
+ targetTable,
1224
+ and(
1225
+ inArray(foreignCol, uniqueIds),
1226
+ whereArg ? extractFilters(targetTable, targetTableName, whereArg, relationFilterCtx(filterCtx, targetTableName)) : void 0,
1227
+ cursorValues ? buildCursorCondition(targetTable, cursorEntries, cursorValues, nullOrdering) : void 0
1228
+ )
1105
1229
  );
1106
1230
  if (distinct) {
1107
1231
  const keys = await selectDistinctKeys({
@@ -1159,6 +1283,14 @@ var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx, limits
1159
1283
  return loader.load(localValue);
1160
1284
  };
1161
1285
  };
1286
+ var relationExtensionFor = (relEntry, parentTable, relationName, isOne, aggregate) => relationFieldExtension({
1287
+ targetTable: relEntry.targetTableName,
1288
+ parentTable,
1289
+ relation: relationName,
1290
+ single: isOne,
1291
+ primaryKey: relEntry.targetPkNames ?? [],
1292
+ aggregate
1293
+ });
1162
1294
  var columnDocs = (docs, column, tableName, columnName) => {
1163
1295
  const description = docs.describeColumn?.(column, { tableName, columnName });
1164
1296
  const deprecationReason = docs.deprecateColumn?.(column, { tableName, columnName });
@@ -1838,7 +1970,8 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1838
1970
  const shell = new GraphQLObjectType2({
1839
1971
  name: typeName,
1840
1972
  description: cacheCtx.docs.describeTable?.(tableName),
1841
- fields: () => ({ ...tableFields, ...container.fields })
1973
+ fields: () => ({ ...tableFields, ...container.fields }),
1974
+ extensions: { drizzle: tableTypeExtension(tableName, cacheCtx.primaryKeyOf?.(tableName) ?? []) }
1842
1975
  });
1843
1976
  cacheCtx.objectTypeCache.set(tableName, shell);
1844
1977
  }
@@ -1880,7 +2013,10 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1880
2013
  relType = new GraphQLObjectType2({
1881
2014
  name: resolveTypeName(targetTableName, typeNameMapper),
1882
2015
  description: cacheCtx.docs.describeTable?.(targetTableName),
1883
- fields: () => ({ ...targetTableFields, ...capturedTargetContainer.fields })
2016
+ fields: () => ({ ...targetTableFields, ...capturedTargetContainer.fields }),
2017
+ extensions: {
2018
+ drizzle: tableTypeExtension(targetTableName, cacheCtx.primaryKeyOf?.(targetTableName) ?? [])
2019
+ }
1884
2020
  });
1885
2021
  cacheCtx.objectTypeCache.set(targetTableName, relType);
1886
2022
  }
@@ -1897,7 +2033,8 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1897
2033
  where: { type: relSelectData.filters }
1898
2034
  },
1899
2035
  resolve,
1900
- ...relationDocs
2036
+ ...relationDocs,
2037
+ extensions: { drizzle: relationExtensionFor(relEntry, tableName, relationName, true) }
1901
2038
  }
1902
2039
  ]);
1903
2040
  continue;
@@ -1920,11 +2057,10 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1920
2057
  },
1921
2058
  resolve,
1922
2059
  ...relationDocs,
1923
- ...cacheCtx.complexity ? {
1924
- extensions: {
1925
- complexity: listFieldComplexity(cacheCtx.complexity, cacheCtx.limits?.(targetTableName))
1926
- }
1927
- } : {}
2060
+ extensions: {
2061
+ drizzle: relationExtensionFor(relEntry, tableName, relationName, false),
2062
+ ...cacheCtx.complexity ? { complexity: listFieldComplexity(cacheCtx.complexity, cacheCtx.limits?.(targetTableName)) } : {}
2063
+ }
1928
2064
  }
1929
2065
  ]);
1930
2066
  const aggregateFieldName = `${relationName}Aggregate`;
@@ -1943,7 +2079,10 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
1943
2079
  where: { type: relSelectData.filters }
1944
2080
  },
1945
2081
  resolve: relationAggregate.resolve,
1946
- ...cacheCtx.complexity ? { extensions: { complexity: aggregateFieldComplexity(cacheCtx.complexity) } } : {}
2082
+ extensions: {
2083
+ drizzle: relationExtensionFor(relEntry, tableName, relationName, isOne, true),
2084
+ ...cacheCtx.complexity ? { complexity: aggregateFieldComplexity(cacheCtx.complexity) } : {}
2085
+ }
1947
2086
  }
1948
2087
  ]);
1949
2088
  }
@@ -1992,9 +2131,11 @@ var generateTableTypes = (tableName, tables, relationMap, withReturning, relatio
1992
2131
  const table = tables[tableName];
1993
2132
  const columns = visibleColumns(table);
1994
2133
  const columnEntries = Object.entries(columns);
2134
+ const contextColumns = cacheCtx.contextValuesOf?.(tableName);
2135
+ const writableEntries = contextColumns ? columnEntries.filter(([columnName]) => !(columnName in contextColumns)) : columnEntries;
1995
2136
  const relaxedColumns = nestedWrites?.relaxedColumns(tableName);
1996
2137
  const insertFields = Object.fromEntries(
1997
- columnEntries.map(([columnName, column]) => {
2138
+ writableEntries.map(([columnName, column]) => {
1998
2139
  const converted = drizzleColumnToGraphQLType(
1999
2140
  column,
2000
2141
  columnName,
@@ -2010,7 +2151,7 @@ var generateTableTypes = (tableName, tables, relationMap, withReturning, relatio
2010
2151
  })
2011
2152
  );
2012
2153
  const updateFields = Object.fromEntries(
2013
- columnEntries.map(([columnName, column]) => {
2154
+ writableEntries.map(([columnName, column]) => {
2014
2155
  const converted = drizzleColumnToGraphQLType(column, columnName, tableName, true, false, true);
2015
2156
  const operations = cacheCtx.featureOf(tableName).fieldUpdateOperations ? fieldUpdateInputType(column, columnName, tableName) : void 0;
2016
2157
  const field = operations ? { ...converted, type: operations } : converted;
@@ -2029,7 +2170,8 @@ var generateTableTypes = (tableName, tables, relationMap, withReturning, relatio
2029
2170
  const selectSingleOutput = cacheCtx.objectTypeCache.get(tableName) ?? new GraphQLObjectType2({
2030
2171
  name: resolveTypeName(tableName, typeNameMapper),
2031
2172
  description: cacheCtx.docs.describeTable?.(tableName),
2032
- fields: { ...tableFields, ...relationFields }
2173
+ fields: { ...tableFields, ...relationFields },
2174
+ extensions: { drizzle: tableTypeExtension(tableName, cacheCtx.primaryKeyOf?.(tableName) ?? []) }
2033
2175
  });
2034
2176
  const selectArrOutput = new GraphQLNonNull3(new GraphQLList3(new GraphQLNonNull3(selectSingleOutput)));
2035
2177
  const arrTableItemOutput = withReturning ? (
@@ -2532,7 +2674,69 @@ var extractFilters = (table, tableName, filters, relationCtx) => {
2532
2674
  }
2533
2675
  return variants.length ? variants.length > 1 ? and(...variants) : variants[0] : void 0;
2534
2676
  };
2535
- var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, originField, typeNameMapper, _isInitial = false, filterCtx, limits) => {
2677
+ var resolveScope = (scopes, context, filterCtx) => {
2678
+ if (!scopes) {
2679
+ return void 0;
2680
+ }
2681
+ return {
2682
+ has: (tableName) => !!scopes(tableName),
2683
+ on: (tableName, table) => {
2684
+ const hook = scopes(tableName);
2685
+ if (!hook) {
2686
+ return void 0;
2687
+ }
2688
+ const predicate = hook(context, table);
2689
+ if (predicate === void 0 || predicate === null) {
2690
+ return void 0;
2691
+ }
2692
+ if (is3(predicate, SQL)) {
2693
+ return predicate;
2694
+ }
2695
+ if (typeof predicate !== "object") {
2696
+ throw new GraphQLError4(
2697
+ `Drizzle-GraphQL Error: the scope for '${tableName}' returned a ${typeof predicate}. A scope returns a filter object, a Drizzle SQL expression, or undefined.`
2698
+ );
2699
+ }
2700
+ return extractFilters(table, tableName, predicate, relationFilterCtx(filterCtx, tableName));
2701
+ }
2702
+ };
2703
+ };
2704
+ var withScope = (scope, tableName, table, condition) => {
2705
+ const predicate = scope?.on(tableName, table);
2706
+ return predicate ? and(condition, predicate) : condition;
2707
+ };
2708
+ var bindPolicies = (policies, filterCtx) => policies?.scope || policies?.contextValues ? {
2709
+ scope: policies.scope ? (context) => resolveScope(policies.scope, context, filterCtx) : void 0,
2710
+ contextValues: policies.contextValues
2711
+ } : void 0;
2712
+ var applyContextValues = (values, hooks, context) => {
2713
+ if (!hooks) {
2714
+ return values;
2715
+ }
2716
+ for (const [columnName, hook] of Object.entries(hooks)) {
2717
+ values[columnName] = hook(context);
2718
+ }
2719
+ return values;
2720
+ };
2721
+ var applyContextValuesAll = (rows, hooks, context) => {
2722
+ if (!hooks) {
2723
+ return rows;
2724
+ }
2725
+ for (const row of rows) {
2726
+ applyContextValues(row, hooks, context);
2727
+ }
2728
+ return rows;
2729
+ };
2730
+ var stripContextValues = (values, hooks) => {
2731
+ if (!hooks) {
2732
+ return values;
2733
+ }
2734
+ for (const columnName of Object.keys(hooks)) {
2735
+ delete values[columnName];
2736
+ }
2737
+ return values;
2738
+ };
2739
+ var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, originField, typeNameMapper, _isInitial = false, filterCtx, limits, scope) => {
2536
2740
  const relationsForTable = relationMap[tableName];
2537
2741
  if (!relationsForTable) {
2538
2742
  return void 0;
@@ -2578,8 +2782,13 @@ var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, ori
2578
2782
  const offset = relationArgs?.offset ?? void 0;
2579
2783
  const limit = is3(relEntry.relation, One2) ? relationArgs?.limit ?? void 0 : applyLimitPolicy(relationArgs?.limit, limits?.(targetTableName), `${tableName}.${relName}`);
2580
2784
  const relWhere = relationArgs?.where;
2581
- thisRecord.where = relWhere ? {
2582
- RAW: (aliasedTable2) => extractFilters(aliasedTable2, relName, relWhere, relationFilterCtx(filterCtx, targetTableName))
2785
+ thisRecord.where = relWhere || scope?.has(targetTableName) ? {
2786
+ RAW: (aliasedTable2) => withScope(
2787
+ scope,
2788
+ targetTableName,
2789
+ aliasedTable2,
2790
+ relWhere ? extractFilters(aliasedTable2, relName, relWhere, relationFilterCtx(filterCtx, targetTableName)) : void 0
2791
+ )
2583
2792
  } : void 0;
2584
2793
  const hasPagination = offset != null || limit != null;
2585
2794
  const pkNames = targetPkNames ?? [];
@@ -2595,14 +2804,15 @@ var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, ori
2595
2804
  typeNameMapper,
2596
2805
  false,
2597
2806
  filterCtx,
2598
- limits
2807
+ limits,
2808
+ scope
2599
2809
  ) : void 0;
2600
2810
  thisRecord.with = relWith;
2601
2811
  args[relName] = thisRecord;
2602
2812
  }
2603
2813
  return args;
2604
2814
  };
2605
- var extractRelationsParams = (relationMap, tables, tableName, info, typeName, typeNameMapper, filterCtx, limits) => {
2815
+ var extractRelationsParams = (relationMap, tables, tableName, info, typeName, typeNameMapper, filterCtx, limits, scope) => {
2606
2816
  if (!info) {
2607
2817
  return void 0;
2608
2818
  }
@@ -2615,7 +2825,8 @@ var extractRelationsParams = (relationMap, tables, tableName, info, typeName, ty
2615
2825
  typeNameMapper,
2616
2826
  true,
2617
2827
  filterCtx,
2618
- limits
2828
+ limits,
2829
+ scope
2619
2830
  );
2620
2831
  };
2621
2832
  var pruneNonEagerRelations = (relationMap, shouldEagerLoad) => {
@@ -3025,7 +3236,8 @@ var prepareMutationRelationColumns = (params) => {
3025
3236
  typeName,
3026
3237
  typeNameMapper,
3027
3238
  void 0,
3028
- params.limits
3239
+ params.limits,
3240
+ params.scope
3029
3241
  ) : void 0;
3030
3242
  const hasRelations = !!(withParams && Object.keys(withParams).length);
3031
3243
  const baseColumns = extractSelectedColumnsFromTreeSQLFormat(parsedInfo.fieldsByTypeName[typeName], table, {
@@ -3259,7 +3471,8 @@ var runRelationalSelect = async (opts) => {
3259
3471
  single,
3260
3472
  filterCtx,
3261
3473
  pkNames,
3262
- after
3474
+ after,
3475
+ scope
3263
3476
  } = opts;
3264
3477
  const distinct = opts.distinct?.length ? opts.distinct : void 0;
3265
3478
  const cursorSelected = !single && isCursorFieldSelected(parsedInfo.fieldsByTypeName[typeName], table);
@@ -3291,7 +3504,12 @@ var runRelationalSelect = async (opts) => {
3291
3504
  tableName,
3292
3505
  distinct,
3293
3506
  pkNames: pkNames ?? [],
3294
- where: where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0,
3507
+ where: withScope(
3508
+ scope,
3509
+ tableName,
3510
+ table,
3511
+ where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
3512
+ ),
3295
3513
  orderBy,
3296
3514
  limit: single ? 1 : opts.limit,
3297
3515
  offset
@@ -3318,15 +3536,23 @@ var runRelationalSelect = async (opts) => {
3318
3536
  // exactly the ordering the cursor encodes and the keyset predicate compares against.
3319
3537
  (aliasedTable2) => cursorOrderExprs(aliasedTable2, cursorEntries)
3320
3538
  ) : orderBy ? (aliasedTable2) => extractOrderBy(aliasedTable2, orderBy, relationFilterCtx(filterCtx, tableName), where) : needsDefaultOrder && pkNames?.length ? (aliasedTable2) => primaryKeyOrderExprs(aliasedTable2, pkNames) : void 0,
3321
- where: distinctKeys ? { RAW: (aliasedTable2) => primaryKeyRestriction(aliasedTable2, pkNames, distinctKeys) } : where || cursorValues ? {
3322
- RAW: (aliasedTable2) => and(
3323
- where ? extractFilters(aliasedTable2, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0,
3324
- cursorValues ? buildCursorCondition(
3325
- aliasedTable2,
3326
- cursorEntries,
3327
- cursorValues,
3328
- opts.nullOrdering ?? "nulls-smallest"
3329
- ) : void 0
3539
+ where: distinctKeys ? (
3540
+ // The distinct pass already ran inside the scope, so the keys it picked are in it.
3541
+ { RAW: (aliasedTable2) => primaryKeyRestriction(aliasedTable2, pkNames, distinctKeys) }
3542
+ ) : where || cursorValues || scope?.has(tableName) ? {
3543
+ RAW: (aliasedTable2) => withScope(
3544
+ scope,
3545
+ tableName,
3546
+ aliasedTable2,
3547
+ and(
3548
+ where ? extractFilters(aliasedTable2, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0,
3549
+ cursorValues ? buildCursorCondition(
3550
+ aliasedTable2,
3551
+ cursorEntries,
3552
+ cursorValues,
3553
+ opts.nullOrdering ?? "nulls-smallest"
3554
+ ) : void 0
3555
+ )
3330
3556
  )
3331
3557
  } : void 0,
3332
3558
  with: relationMap[tableName] ? extractRelationsParams(
@@ -3337,7 +3563,8 @@ var runRelationalSelect = async (opts) => {
3337
3563
  typeName,
3338
3564
  typeNameMapper,
3339
3565
  filterCtx,
3340
- opts.limits
3566
+ opts.limits,
3567
+ scope
3341
3568
  ) : void 0
3342
3569
  };
3343
3570
  if (single) {
@@ -3674,7 +3901,7 @@ var assembleAggregateRow = (row, request, target) => {
3674
3901
  }
3675
3902
  return result;
3676
3903
  };
3677
- var generateAggregate = (db, tableName, table, typeName, fieldName, filterArgs, filterCtx) => {
3904
+ var generateAggregate = (db, tableName, table, typeName, fieldName, filterArgs, filterCtx, scopes) => {
3678
3905
  const target = aggregateTarget(table, tableName, typeName);
3679
3906
  const queryArgs = {
3680
3907
  where: { type: filterArgs }
@@ -3688,8 +3915,14 @@ var generateAggregate = (db, tableName, table, typeName, fieldName, filterArgs,
3688
3915
  return {};
3689
3916
  }
3690
3917
  let query = resolveExecutor(db, context).select(request.selection).from(table);
3691
- if (args.where) {
3692
- query = query.where(extractFilters(table, tableName, args.where, relationFilterCtx(filterCtx, tableName)));
3918
+ const where = withScope(
3919
+ resolveScope(scopes, context, filterCtx),
3920
+ tableName,
3921
+ table,
3922
+ args.where ? extractFilters(table, tableName, args.where, relationFilterCtx(filterCtx, tableName)) : void 0
3923
+ );
3924
+ if (where) {
3925
+ query = query.where(where);
3693
3926
  }
3694
3927
  const rows = await query;
3695
3928
  return assembleAggregateRow(rows[0] ?? {}, request, target);
@@ -3701,7 +3934,7 @@ var generateAggregate = (db, tableName, table, typeName, fieldName, filterArgs,
3701
3934
  };
3702
3935
  };
3703
3936
  var GROUP_KEY = "__dgql_group_key";
3704
- var createRelationAggregateFactory = (db, tables, cacheCtx, typeNameMapper, filterCtx) => {
3937
+ var createRelationAggregateFactory = (db, tables, cacheCtx, typeNameMapper, filterCtx, scopes) => {
3705
3938
  return ({ tableName, relationName, relEntry }) => {
3706
3939
  const parentTable = tables[tableName];
3707
3940
  const targetTableName = relEntry.targetTableName;
@@ -3736,9 +3969,14 @@ var createRelationAggregateFactory = (db, tables, cacheCtx, typeNameMapper, filt
3736
3969
  const loader = getOrCreateLoader(context, loaderKey, async (parentIds) => {
3737
3970
  const executor = resolveExecutor(db, context);
3738
3971
  const uniqueIds = [...new Set(parentIds)];
3739
- const whereCondition = and2(
3740
- inArray2(foreignCol, uniqueIds),
3741
- whereArg ? extractFilters(targetTable, targetTableName, whereArg, relationFilterCtx(filterCtx, targetTableName)) : void 0
3972
+ const whereCondition = withScope(
3973
+ resolveScope(scopes, context, filterCtx),
3974
+ targetTableName,
3975
+ targetTable,
3976
+ and2(
3977
+ inArray2(foreignCol, uniqueIds),
3978
+ whereArg ? extractFilters(targetTable, targetTableName, whereArg, relationFilterCtx(filterCtx, targetTableName)) : void 0
3979
+ )
3742
3980
  );
3743
3981
  const rows = await executor.select({ [GROUP_KEY]: foreignCol, ...request.selection }).from(targetTable).where(whereCondition).groupBy(foreignCol);
3744
3982
  const byKey = new Map(rows.map((row) => [row[GROUP_KEY], row]));
@@ -3871,7 +4109,7 @@ var buildHavingCondition = (having, columns) => {
3871
4109
  }
3872
4110
  return conditions.length ? and2(...conditions) : void 0;
3873
4111
  };
3874
- var generateGroupBy = (db, tableName, table, typeName, fieldName, filterArgs, groupByEnum, havingInput, filterCtx) => {
4112
+ var generateGroupBy = (db, tableName, table, typeName, fieldName, filterArgs, groupByEnum, havingInput, filterCtx, scopes) => {
3875
4113
  const target = aggregateTarget(table, tableName, typeName);
3876
4114
  const groupable = groupableColumns(table, tableName);
3877
4115
  const columns = getColumns3(table);
@@ -3905,8 +4143,14 @@ var generateGroupBy = (db, tableName, table, typeName, fieldName, filterArgs, gr
3905
4143
  ...request.selection
3906
4144
  };
3907
4145
  let query = resolveExecutor(db, context).select(selection).from(table);
3908
- if (args.where) {
3909
- query = query.where(extractFilters(table, tableName, args.where, relationFilterCtx(filterCtx, tableName)));
4146
+ const where = withScope(
4147
+ resolveScope(scopes, context, filterCtx),
4148
+ tableName,
4149
+ table,
4150
+ args.where ? extractFilters(table, tableName, args.where, relationFilterCtx(filterCtx, tableName)) : void 0
4151
+ );
4152
+ if (where) {
4153
+ query = query.where(where);
3910
4154
  }
3911
4155
  query = query.groupBy(...keyColumns.map(([, column]) => column));
3912
4156
  const havingCondition = buildHavingCondition(args.having, columns);
@@ -3932,7 +4176,7 @@ var generateGroupBy = (db, tableName, table, typeName, fieldName, filterArgs, gr
3932
4176
  };
3933
4177
 
3934
4178
  // src/util/builders/mysql.ts
3935
- var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits) => {
4179
+ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits, policies) => {
3936
4180
  const queryBase = db.query[tableName];
3937
4181
  if (!queryBase) {
3938
4182
  throw new Error(
@@ -3967,6 +4211,7 @@ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filter
3967
4211
  single: false,
3968
4212
  filterCtx,
3969
4213
  limits,
4214
+ scope: policies?.scope?.(context),
3970
4215
  pkNames,
3971
4216
  db: executor,
3972
4217
  // MySQL sorts NULLs as the smallest values (first in ASC).
@@ -3979,7 +4224,7 @@ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filter
3979
4224
  args: queryArgs
3980
4225
  };
3981
4226
  };
3982
- var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits) => {
4227
+ var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits, policies) => {
3983
4228
  const queryBase = db.query[tableName];
3984
4229
  if (!queryBase) {
3985
4230
  throw new Error(
@@ -4008,6 +4253,7 @@ var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filte
4008
4253
  single: true,
4009
4254
  filterCtx,
4010
4255
  limits,
4256
+ scope: policies?.scope?.(context),
4011
4257
  pkNames,
4012
4258
  db: executor
4013
4259
  });
@@ -4018,7 +4264,7 @@ var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filte
4018
4264
  args: queryArgs
4019
4265
  };
4020
4266
  };
4021
- var generateInsertArray = (db, _tableName, table, baseType, fieldName, txCtx) => {
4267
+ var generateInsertArray = (db, tableName, table, baseType, fieldName, txCtx, policies) => {
4022
4268
  const queryArgs = {
4023
4269
  values: {
4024
4270
  type: new GraphQLNonNull5(new GraphQLList5(new GraphQLNonNull5(baseType)))
@@ -4029,7 +4275,11 @@ var generateInsertArray = (db, _tableName, table, baseType, fieldName, txCtx) =>
4029
4275
  resolver: async (_source, args, context, info) => {
4030
4276
  try {
4031
4277
  return await runMutation(db, context, info, txCtx, async (executor) => {
4032
- const input = remapFromGraphQLArrayInput(args.values, table);
4278
+ const input = applyContextValuesAll(
4279
+ remapFromGraphQLArrayInput(args.values, table),
4280
+ policies?.contextValues?.(tableName),
4281
+ context
4282
+ );
4033
4283
  if (!input.length) {
4034
4284
  throw new GraphQLError6("No values were provided!");
4035
4285
  }
@@ -4043,7 +4293,7 @@ var generateInsertArray = (db, _tableName, table, baseType, fieldName, txCtx) =>
4043
4293
  args: queryArgs
4044
4294
  };
4045
4295
  };
4046
- var generateInsertSingle = (db, _tableName, table, baseType, fieldName, txCtx) => {
4296
+ var generateInsertSingle = (db, tableName, table, baseType, fieldName, txCtx, policies) => {
4047
4297
  const queryArgs = {
4048
4298
  values: {
4049
4299
  type: new GraphQLNonNull5(baseType)
@@ -4054,7 +4304,11 @@ var generateInsertSingle = (db, _tableName, table, baseType, fieldName, txCtx) =
4054
4304
  resolver: async (_source, args, context, info) => {
4055
4305
  try {
4056
4306
  return await runMutation(db, context, info, txCtx, async (executor) => {
4057
- const input = remapFromGraphQLSingleInput(args.values, table);
4307
+ const input = applyContextValues(
4308
+ remapFromGraphQLSingleInput(args.values, table),
4309
+ policies?.contextValues?.(tableName),
4310
+ context
4311
+ );
4058
4312
  await executor.insert(table).values(input);
4059
4313
  return { isSuccess: true };
4060
4314
  });
@@ -4065,7 +4319,7 @@ var generateInsertSingle = (db, _tableName, table, baseType, fieldName, txCtx) =
4065
4319
  args: queryArgs
4066
4320
  };
4067
4321
  };
4068
- var generateUpsert = (db, table, baseType, onConflictType, fieldName, single, txCtx) => {
4322
+ var generateUpsert = (db, tableName, table, baseType, onConflictType, fieldName, single, txCtx, policies) => {
4069
4323
  const queryArgs = {
4070
4324
  values: {
4071
4325
  type: single ? new GraphQLNonNull5(baseType) : new GraphQLNonNull5(new GraphQLList5(new GraphQLNonNull5(baseType)))
@@ -4081,7 +4335,11 @@ var generateUpsert = (db, table, baseType, onConflictType, fieldName, single, tx
4081
4335
  resolver: async (_source, args, context, info) => {
4082
4336
  try {
4083
4337
  return await runMutation(db, context, info, txCtx, async (executor) => {
4084
- const input = single ? [remapFromGraphQLSingleInput(args.values, table)] : remapFromGraphQLArrayInput(args.values, table);
4338
+ const input = applyContextValuesAll(
4339
+ single ? [remapFromGraphQLSingleInput(args.values, table)] : remapFromGraphQLArrayInput(args.values, table),
4340
+ policies?.contextValues?.(tableName),
4341
+ context
4342
+ );
4085
4343
  if (!input.length) {
4086
4344
  throw new GraphQLError6("No values were provided!");
4087
4345
  }
@@ -4108,7 +4366,7 @@ var generateUpsert = (db, table, baseType, onConflictType, fieldName, single, tx
4108
4366
  args: queryArgs
4109
4367
  };
4110
4368
  };
4111
- var generateUpdate = (db, tableName, table, setArgs, filterArgs, fieldName, single, requireWhere, filterCtx, txCtx) => {
4369
+ var generateUpdate = (db, tableName, table, setArgs, filterArgs, fieldName, single, requireWhere, filterCtx, txCtx, policies) => {
4112
4370
  const queryArgs = {
4113
4371
  set: {
4114
4372
  type: new GraphQLNonNull5(setArgs)
@@ -4123,12 +4381,21 @@ var generateUpdate = (db, tableName, table, setArgs, filterArgs, fieldName, sing
4123
4381
  try {
4124
4382
  return await runMutation(db, context, info, txCtx, async (executor) => {
4125
4383
  const { where, set } = args;
4126
- const input = remapUpdateInput(set, table, tableName);
4384
+ const scope = policies?.scope?.(context);
4385
+ const input = stripContextValues(
4386
+ remapUpdateInput(set, table, tableName),
4387
+ policies?.contextValues?.(tableName)
4388
+ );
4127
4389
  if (!Object.keys(input).length) {
4128
4390
  throw new GraphQLError6("Unable to update with no values specified!");
4129
4391
  }
4130
4392
  const relationCtx = relationFilterCtx(filterCtx, tableName);
4131
- const filters = single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0;
4393
+ const filters = withScope(
4394
+ scope,
4395
+ tableName,
4396
+ table,
4397
+ single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0
4398
+ );
4132
4399
  if (single) {
4133
4400
  await assertSingleMatch(executor, table, filters, fieldName);
4134
4401
  }
@@ -4146,7 +4413,7 @@ var generateUpdate = (db, tableName, table, setArgs, filterArgs, fieldName, sing
4146
4413
  args: queryArgs
4147
4414
  };
4148
4415
  };
4149
- var generateUpdateMany = (db, tableName, table, updateManyInput, fieldName, filterCtx, txCtx) => {
4416
+ var generateUpdateMany = (db, tableName, table, updateManyInput, fieldName, filterCtx, txCtx, policies) => {
4150
4417
  const queryArgs = {
4151
4418
  updates: {
4152
4419
  type: new GraphQLNonNull5(new GraphQLList5(new GraphQLNonNull5(updateManyInput)))
@@ -4161,14 +4428,21 @@ var generateUpdateMany = (db, tableName, table, updateManyInput, fieldName, filt
4161
4428
  if (!updates.length) {
4162
4429
  throw new GraphQLError6("No updates were provided!");
4163
4430
  }
4431
+ const scope = policies?.scope?.(context);
4432
+ const contextColumns = policies?.contextValues?.(tableName);
4164
4433
  const entries = updates.map(({ where, set }) => {
4165
- const input = remapUpdateInput(set, table, tableName);
4434
+ const input = stripContextValues(remapUpdateInput(set, table, tableName), contextColumns);
4166
4435
  if (!Object.keys(input).length) {
4167
4436
  throw new GraphQLError6("Unable to update with no values specified!");
4168
4437
  }
4169
4438
  return {
4170
4439
  set: input,
4171
- filters: where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
4440
+ filters: withScope(
4441
+ scope,
4442
+ tableName,
4443
+ table,
4444
+ where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
4445
+ )
4172
4446
  };
4173
4447
  });
4174
4448
  await executor.transaction(async (tx) => {
@@ -4189,7 +4463,7 @@ var generateUpdateMany = (db, tableName, table, updateManyInput, fieldName, filt
4189
4463
  args: queryArgs
4190
4464
  };
4191
4465
  };
4192
- var generateDelete = (db, tableName, table, filterArgs, fieldName, single, requireWhere, filterCtx, txCtx) => {
4466
+ var generateDelete = (db, tableName, table, filterArgs, fieldName, single, requireWhere, filterCtx, txCtx, policies) => {
4193
4467
  const queryArgs = {
4194
4468
  where: {
4195
4469
  type: single || requireWhere ? new GraphQLNonNull5(filterArgs) : filterArgs
@@ -4201,8 +4475,14 @@ var generateDelete = (db, tableName, table, filterArgs, fieldName, single, requi
4201
4475
  try {
4202
4476
  return await runMutation(db, context, info, txCtx, async (executor) => {
4203
4477
  const { where } = args;
4478
+ const scope = policies?.scope?.(context);
4204
4479
  const relationCtx = relationFilterCtx(filterCtx, tableName);
4205
- const filters = single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0;
4480
+ const filters = withScope(
4481
+ scope,
4482
+ tableName,
4483
+ table,
4484
+ single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0
4485
+ );
4206
4486
  if (single) {
4207
4487
  await assertSingleMatch(executor, table, filters, fieldName);
4208
4488
  }
@@ -4250,12 +4530,16 @@ var generateSchemaData = (db, schema, relations, options) => {
4250
4530
  attachTargetPrimaryKeys(namedRelations, tables, mysqlPrimaryKeyPropNames);
4251
4531
  const eagerRelations = pruneNonEagerRelations(namedRelations, shouldEagerLoad);
4252
4532
  const filterCtx = { tables, relationMap: namedRelations };
4533
+ const scopes = options.policies?.scope;
4534
+ const contextValuesOf = options.policies?.contextValues;
4535
+ const policies = bindPolicies(options.policies, filterCtx);
4253
4536
  const resolverFactory = createRelationResolverFactory(
4254
4537
  db,
4255
4538
  tables,
4256
4539
  "nulls-smallest",
4257
4540
  filterCtx,
4258
- limits
4541
+ limits,
4542
+ scopes
4259
4543
  );
4260
4544
  const cacheCtx = {
4261
4545
  genericFilterCache: /* @__PURE__ */ new Map(),
@@ -4272,9 +4556,11 @@ var generateSchemaData = (db, schema, relations, options) => {
4272
4556
  complexity,
4273
4557
  limits,
4274
4558
  docs: options.docs ?? {},
4559
+ primaryKeyOf: (name) => tables[name] ? mysqlPrimaryKeyPropNames(tables[name]) : [],
4560
+ contextValuesOf,
4275
4561
  featureOf
4276
4562
  };
4277
- const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
4563
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx, scopes) : void 0;
4278
4564
  const queries = {};
4279
4565
  const mutations = {};
4280
4566
  const mutationTxCtx = createMutationTxCtx(options.transactions);
@@ -4311,6 +4597,7 @@ var generateSchemaData = (db, schema, relations, options) => {
4311
4597
  }
4312
4598
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
4313
4599
  const tableFeatures = featureOf(tableName);
4600
+ const drizzleMeta = tableFieldExtensions(tableName, mysqlPrimaryKeyPropNames(schema[tableName]));
4314
4601
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
4315
4602
  const { selectSingleOutput, selectArrOutput } = tableTypes.outputs;
4316
4603
  const {
@@ -4343,7 +4630,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4343
4630
  typeNameMapper,
4344
4631
  filterCtx,
4345
4632
  tableFeatures.distinct,
4346
- limits
4633
+ limits,
4634
+ policies
4347
4635
  );
4348
4636
  const selectSingleGenerated = generateSelectSingle(
4349
4637
  db,
@@ -4356,7 +4644,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4356
4644
  typeName,
4357
4645
  typeNameMapper,
4358
4646
  filterCtx,
4359
- limits
4647
+ limits,
4648
+ policies
4360
4649
  );
4361
4650
  const insertArrGenerated = tableFeatures.insert ? generateInsertArray(
4362
4651
  db,
@@ -4364,7 +4653,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4364
4653
  schema[tableName],
4365
4654
  insertInput,
4366
4655
  createArrayFieldName,
4367
- mutationTxCtx
4656
+ mutationTxCtx,
4657
+ policies
4368
4658
  ) : void 0;
4369
4659
  const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle(
4370
4660
  db,
@@ -4372,7 +4662,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4372
4662
  schema[tableName],
4373
4663
  insertInput,
4374
4664
  createSingleFieldName,
4375
- mutationTxCtx
4665
+ mutationTxCtx,
4666
+ policies
4376
4667
  ) : void 0;
4377
4668
  const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
4378
4669
  table: schema[tableName],
@@ -4383,21 +4674,25 @@ var generateSchemaData = (db, schema, relations, options) => {
4383
4674
  }) : void 0;
4384
4675
  const upsertArrGenerated = onConflictInput ? generateUpsert(
4385
4676
  db,
4677
+ tableName,
4386
4678
  schema[tableName],
4387
4679
  insertInput,
4388
4680
  onConflictInput,
4389
4681
  upsertArrayFieldName,
4390
4682
  false,
4391
- mutationTxCtx
4683
+ mutationTxCtx,
4684
+ policies
4392
4685
  ) : void 0;
4393
4686
  const upsertSingleGenerated = onConflictInput ? generateUpsert(
4394
4687
  db,
4688
+ tableName,
4395
4689
  schema[tableName],
4396
4690
  insertInput,
4397
4691
  onConflictInput,
4398
4692
  upsertSingleFieldName,
4399
4693
  true,
4400
- mutationTxCtx
4694
+ mutationTxCtx,
4695
+ policies
4401
4696
  ) : void 0;
4402
4697
  const updateGenerated = tableFeatures.update ? generateUpdate(
4403
4698
  db,
@@ -4409,7 +4704,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4409
4704
  false,
4410
4705
  tableFeatures.requireWhere,
4411
4706
  filterCtx,
4412
- mutationTxCtx
4707
+ mutationTxCtx,
4708
+ policies
4413
4709
  ) : void 0;
4414
4710
  const updateSingleGenerated = tableFeatures.update ? generateUpdate(
4415
4711
  db,
@@ -4421,7 +4717,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4421
4717
  true,
4422
4718
  tableFeatures.requireWhere,
4423
4719
  filterCtx,
4424
- mutationTxCtx
4720
+ mutationTxCtx,
4721
+ policies
4425
4722
  ) : void 0;
4426
4723
  const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
4427
4724
  const updateManyGenerated = updateManyInput ? generateUpdateMany(
@@ -4431,7 +4728,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4431
4728
  updateManyInput,
4432
4729
  updateManyFieldName,
4433
4730
  filterCtx,
4434
- mutationTxCtx
4731
+ mutationTxCtx,
4732
+ policies
4435
4733
  ) : void 0;
4436
4734
  const deleteGenerated = tableFeatures.delete ? generateDelete(
4437
4735
  db,
@@ -4442,7 +4740,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4442
4740
  false,
4443
4741
  tableFeatures.requireWhere,
4444
4742
  filterCtx,
4445
- mutationTxCtx
4743
+ mutationTxCtx,
4744
+ policies
4446
4745
  ) : void 0;
4447
4746
  const deleteSingleGenerated = tableFeatures.delete ? generateDelete(
4448
4747
  db,
@@ -4453,7 +4752,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4453
4752
  true,
4454
4753
  tableFeatures.requireWhere,
4455
4754
  filterCtx,
4456
- mutationTxCtx
4755
+ mutationTxCtx,
4756
+ policies
4457
4757
  ) : void 0;
4458
4758
  const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
4459
4759
  db,
@@ -4486,7 +4786,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4486
4786
  typeName,
4487
4787
  aggregateFieldName,
4488
4788
  tableFilters,
4489
- filterCtx
4789
+ filterCtx,
4790
+ scopes
4490
4791
  ) : void 0;
4491
4792
  const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4492
4793
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
@@ -4500,25 +4801,35 @@ var generateSchemaData = (db, schema, relations, options) => {
4500
4801
  tableFilters,
4501
4802
  groupByEnum,
4502
4803
  havingInput,
4503
- filterCtx
4804
+ filterCtx,
4805
+ scopes
4504
4806
  ) : void 0;
4505
4807
  queries[selectArrGenerated.name] = {
4506
4808
  type: selectArrOutput,
4507
4809
  args: selectArrGenerated.args,
4508
4810
  resolve: selectArrGenerated.resolver,
4509
- ...complexity ? { extensions: { complexity: listFieldComplexity(complexity, limits?.(tableName)) } } : {}
4811
+ extensions: {
4812
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: false, targetArg: "where" }),
4813
+ ...complexity ? { complexity: listFieldComplexity(complexity, limits?.(tableName)) } : {}
4814
+ }
4510
4815
  };
4511
4816
  queries[selectSingleGenerated.name] = {
4512
4817
  type: selectSingleOutput,
4513
4818
  args: selectSingleGenerated.args,
4514
- resolve: selectSingleGenerated.resolver
4819
+ resolve: selectSingleGenerated.resolver,
4820
+ extensions: {
4821
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: true, targetArg: "where" })
4822
+ }
4515
4823
  };
4516
4824
  if (aggregateGenerated && aggregateType) {
4517
4825
  queries[aggregateGenerated.name] = {
4518
4826
  type: new GraphQLNonNull5(aggregateType),
4519
4827
  args: aggregateGenerated.args,
4520
4828
  resolve: aggregateGenerated.resolver,
4521
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
4829
+ extensions: {
4830
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "aggregate", single: true, targetArg: "where" }),
4831
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
4832
+ }
4522
4833
  };
4523
4834
  }
4524
4835
  if (groupByGenerated && groupByType) {
@@ -4526,25 +4837,30 @@ var generateSchemaData = (db, schema, relations, options) => {
4526
4837
  type: new GraphQLNonNull5(new GraphQLList5(new GraphQLNonNull5(groupByType))),
4527
4838
  args: groupByGenerated.args,
4528
4839
  resolve: groupByGenerated.resolver,
4529
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
4840
+ extensions: {
4841
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "groupBy", single: false, targetArg: "where" }),
4842
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
4843
+ }
4530
4844
  };
4531
4845
  }
4532
- for (const generated of [
4533
- insertArrGenerated,
4534
- insertSingleGenerated,
4535
- upsertArrGenerated,
4536
- upsertSingleGenerated,
4537
- updateGenerated,
4538
- updateManyGenerated,
4539
- updateSingleGenerated,
4540
- deleteGenerated,
4541
- deleteSingleGenerated
4542
- ]) {
4846
+ const generatedMutations = [
4847
+ [insertArrGenerated, { operation: "insert", single: false, targetArg: "values" }],
4848
+ [insertSingleGenerated, { operation: "insert", single: true, targetArg: "values" }],
4849
+ [upsertArrGenerated, { operation: "upsert", single: false, targetArg: "values" }],
4850
+ [upsertSingleGenerated, { operation: "upsert", single: true, targetArg: "values" }],
4851
+ [updateGenerated, { operation: "update", single: false, targetArg: "where" }],
4852
+ [updateManyGenerated, { operation: "updateMany", single: false, targetArg: "updates" }],
4853
+ [updateSingleGenerated, { operation: "update", single: true, targetArg: "where" }],
4854
+ [deleteGenerated, { operation: "delete", single: false, targetArg: "where" }],
4855
+ [deleteSingleGenerated, { operation: "delete", single: true, targetArg: "where" }]
4856
+ ];
4857
+ for (const [generated, meta] of generatedMutations) {
4543
4858
  if (generated) {
4544
4859
  mutations[generated.name] = {
4545
4860
  type: mutationReturnType,
4546
4861
  args: generated.args,
4547
- resolve: generated.resolver
4862
+ resolve: generated.resolver,
4863
+ extensions: { drizzle: drizzleMeta({ kind: "mutation", ...meta }) }
4548
4864
  };
4549
4865
  }
4550
4866
  }
@@ -4725,8 +5041,9 @@ var createNestedWriteTypes = (params) => {
4725
5041
  return cached;
4726
5042
  }
4727
5043
  const omitted = plan.fkSide === "child" ? plan.foreignColPropName : void 0;
5044
+ const contextColumns = cacheCtx.contextValuesOf?.(plan.targetTableName);
4728
5045
  const fields = Object.fromEntries(
4729
- Object.entries(visibleColumns(plan.targetTable)).filter(([columnName]) => columnName !== omitted).map(([columnName, column]) => [
5046
+ Object.entries(visibleColumns(plan.targetTable)).filter(([columnName]) => columnName !== omitted && !contextColumns?.[columnName]).map(([columnName, column]) => [
4730
5047
  columnName,
4731
5048
  drizzleColumnToGraphQLType(column, columnName, plan.targetTableName, false, true, true)
4732
5049
  ])
@@ -4825,8 +5142,8 @@ var createNestedWriteTypes = (params) => {
4825
5142
  var mergedOps = (entries) => Object.assign({}, ...entries.map((entry) => entry.ops));
4826
5143
  var asArray = (value) => Array.isArray(value) ? value : value === void 0 ? [] : [value];
4827
5144
  var createNestedWriteRuntime = (params) => {
4828
- const { plans, filterCtx } = params;
4829
- const conditionOf = (plan, filter, operation) => {
5145
+ const { plans, filterCtx, scopes, contextValues } = params;
5146
+ const conditionOf = (plan, filter, operation, scope) => {
4830
5147
  const condition = extractFilters(
4831
5148
  plan.targetTable,
4832
5149
  plan.targetTableName,
@@ -4838,7 +5155,7 @@ var createNestedWriteRuntime = (params) => {
4838
5155
  `Drizzle-GraphQL Error: '${operation}' on '${plan.relationName}' needs a filter that selects rows \u2014 it was given one that matches everything.`
4839
5156
  );
4840
5157
  }
4841
- return condition;
5158
+ return withScope(scope, plan.targetTableName, plan.targetTable, condition);
4842
5159
  };
4843
5160
  const assertSingleOperation = (plan, op) => {
4844
5161
  const supplied = ["create", "connect", "disconnect"].filter((key) => op[key] !== void 0 && op[key] !== null);
@@ -4848,7 +5165,7 @@ var createNestedWriteRuntime = (params) => {
4848
5165
  );
4849
5166
  }
4850
5167
  };
4851
- const detachAll = async (executor, plan, key) => executor.update(plan.targetTable).set({ [plan.foreignColPropName]: null }).where(eq3(plan.foreignCol, key));
5168
+ const detachAll = async (executor, plan, key, scope) => executor.update(plan.targetTable).set({ [plan.foreignColPropName]: null }).where(withScope(scope, plan.targetTableName, plan.targetTable, eq3(plan.foreignCol, key)));
4852
5169
  return {
4853
5170
  enabled: (tableName) => !!plans[tableName],
4854
5171
  split: (tableName, values) => {
@@ -4882,12 +5199,13 @@ var createNestedWriteRuntime = (params) => {
4882
5199
  }
4883
5200
  return columns;
4884
5201
  },
4885
- applyParentSide: async (executor, tableName, ops) => {
5202
+ applyParentSide: async (executor, tableName, ops, context) => {
4886
5203
  const tablePlans = plans[tableName];
4887
5204
  const patch = {};
4888
5205
  if (!tablePlans) {
4889
5206
  return patch;
4890
5207
  }
5208
+ const scope = resolveScope(scopes, context, filterCtx);
4891
5209
  for (const [relationName, op] of Object.entries(ops)) {
4892
5210
  const plan = tablePlans[relationName];
4893
5211
  if (!plan || plan.fkSide !== "parent") {
@@ -4895,7 +5213,11 @@ var createNestedWriteRuntime = (params) => {
4895
5213
  }
4896
5214
  assertSingleOperation(plan, op);
4897
5215
  if (op["create"] !== void 0) {
4898
- const values = remapFromGraphQLSingleInput({ ...op["create"] }, plan.targetTable);
5216
+ const values = applyContextValues(
5217
+ remapFromGraphQLSingleInput({ ...op["create"] }, plan.targetTable),
5218
+ contextValues?.(plan.targetTableName),
5219
+ context
5220
+ );
4899
5221
  const inserted = await executor.insert(plan.targetTable).values(values).returning();
4900
5222
  const created = inserted[0];
4901
5223
  if (!created) {
@@ -4905,7 +5227,7 @@ var createNestedWriteRuntime = (params) => {
4905
5227
  }
4906
5228
  patch[plan.localColPropName] = created[plan.foreignColPropName];
4907
5229
  } else if (op["connect"] !== void 0) {
4908
- const rows = await executor.select().from(plan.targetTable).where(conditionOf(plan, op["connect"], "connect"));
5230
+ const rows = await executor.select().from(plan.targetTable).where(conditionOf(plan, op["connect"], "connect", scope));
4909
5231
  if (rows.length !== 1) {
4910
5232
  throw new GraphQLError7(
4911
5233
  `Drizzle-GraphQL Error: 'connect' on '${relationName}' matched ${rows.length} rows \u2014 it attaches a single row, so its filter must match exactly one.`
@@ -4918,11 +5240,12 @@ var createNestedWriteRuntime = (params) => {
4918
5240
  }
4919
5241
  return patch;
4920
5242
  },
4921
- applyChildSide: async (executor, tableName, ops, parentRows) => {
5243
+ applyChildSide: async (executor, tableName, ops, parentRows, context) => {
4922
5244
  const tablePlans = plans[tableName];
4923
5245
  if (!tablePlans) {
4924
5246
  return;
4925
5247
  }
5248
+ const scope = resolveScope(scopes, context, filterCtx);
4926
5249
  for (const [relationName, op] of Object.entries(ops)) {
4927
5250
  const plan = tablePlans[relationName];
4928
5251
  if (!plan || plan.fkSide !== "child") {
@@ -4939,34 +5262,38 @@ var createNestedWriteRuntime = (params) => {
4939
5262
  );
4940
5263
  }
4941
5264
  if (op["set"] !== void 0) {
4942
- await detachAll(executor, plan, key);
5265
+ await detachAll(executor, plan, key, scope);
4943
5266
  for (const filter of asArray(op["set"])) {
4944
- await executor.update(plan.targetTable).set({ [plan.foreignColPropName]: key }).where(conditionOf(plan, filter, "set"));
5267
+ await executor.update(plan.targetTable).set({ [plan.foreignColPropName]: key }).where(conditionOf(plan, filter, "set", scope));
4945
5268
  }
4946
5269
  }
4947
5270
  if (op["disconnect"] !== void 0) {
4948
5271
  if (plan.isOne) {
4949
5272
  if (op["disconnect"] === true) {
4950
- await detachAll(executor, plan, key);
5273
+ await detachAll(executor, plan, key, scope);
4951
5274
  }
4952
5275
  } else {
4953
5276
  for (const filter of asArray(op["disconnect"])) {
4954
- await executor.update(plan.targetTable).set({ [plan.foreignColPropName]: null }).where(and3(eq3(plan.foreignCol, key), conditionOf(plan, filter, "disconnect")));
5277
+ await executor.update(plan.targetTable).set({ [plan.foreignColPropName]: null }).where(and3(eq3(plan.foreignCol, key), conditionOf(plan, filter, "disconnect", scope)));
4955
5278
  }
4956
5279
  }
4957
5280
  }
4958
5281
  const attaches = op["connect"] !== void 0 || op["create"] !== void 0;
4959
5282
  if (plan.isOne && attaches && plan.canDetach && op["set"] === void 0) {
4960
- await detachAll(executor, plan, key);
5283
+ await detachAll(executor, plan, key, scope);
4961
5284
  }
4962
5285
  if (op["connect"] !== void 0) {
4963
5286
  for (const filter of asArray(op["connect"])) {
4964
- await executor.update(plan.targetTable).set({ [plan.foreignColPropName]: key }).where(conditionOf(plan, filter, "connect"));
5287
+ await executor.update(plan.targetTable).set({ [plan.foreignColPropName]: key }).where(conditionOf(plan, filter, "connect", scope));
4965
5288
  }
4966
5289
  }
4967
5290
  if (op["create"] !== void 0) {
4968
5291
  const rows = asArray(op["create"]).map((row) => ({
4969
- ...remapFromGraphQLSingleInput({ ...row }, plan.targetTable),
5292
+ ...applyContextValues(
5293
+ remapFromGraphQLSingleInput({ ...row }, plan.targetTable),
5294
+ contextValues?.(plan.targetTableName),
5295
+ context
5296
+ ),
4970
5297
  [plan.foreignColPropName]: key
4971
5298
  }));
4972
5299
  if (rows.length) {
@@ -4979,30 +5306,30 @@ var createNestedWriteRuntime = (params) => {
4979
5306
  };
4980
5307
  };
4981
5308
  var writeWithNestedOps = async (params) => {
4982
- const { executor, runtime, tableName, entries, remapValues, write } = params;
5309
+ const { executor, runtime, tableName, entries, remapValues, write, context } = params;
4983
5310
  return executor.transaction(async (tx) => {
4984
5311
  const rows = [];
4985
5312
  for (const entry of entries) {
4986
- const patch = await runtime.applyParentSide(tx, tableName, entry.ops);
5313
+ const patch = await runtime.applyParentSide(tx, tableName, entry.ops, context);
4987
5314
  const written = await write(tx, { ...remapValues(entry.columns), ...patch });
4988
- await runtime.applyChildSide(tx, tableName, entry.ops, written);
5315
+ await runtime.applyChildSide(tx, tableName, entry.ops, written, context);
4989
5316
  rows.push(...written);
4990
5317
  }
4991
5318
  return rows;
4992
5319
  });
4993
5320
  };
4994
5321
  var updateWithNestedOps = async (params) => {
4995
- const { executor, runtime, tableName, columns, ops, remapValues, write } = params;
5322
+ const { executor, runtime, tableName, columns, ops, remapValues, write, context } = params;
4996
5323
  return executor.transaction(async (tx) => {
4997
- const patch = await runtime.applyParentSide(tx, tableName, ops);
5324
+ const patch = await runtime.applyParentSide(tx, tableName, ops, context);
4998
5325
  const rows = await write(tx, { ...remapValues(columns), ...patch });
4999
- await runtime.applyChildSide(tx, tableName, ops, rows);
5326
+ await runtime.applyChildSide(tx, tableName, ops, rows, context);
5000
5327
  return rows;
5001
5328
  });
5002
5329
  };
5003
5330
 
5004
5331
  // src/util/builders/pg.ts
5005
- var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits) => {
5332
+ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits, policies) => {
5006
5333
  const queryBase = db.query[tableName];
5007
5334
  const table = tables[tableName];
5008
5335
  const limitPolicy = limits?.(tableName);
@@ -5018,6 +5345,7 @@ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filte
5018
5345
  try {
5019
5346
  const parsedInfo = parseResolveInfo3(info, { deep: true });
5020
5347
  const { executor, queryBase: requestQueryBase } = resolveQueryExecutor(db, context, tableName, queryBase);
5348
+ const scope = policies?.scope?.(context);
5021
5349
  const limit = applyLimitPolicy(args.limit, limitPolicy, fieldName);
5022
5350
  if (requestQueryBase) {
5023
5351
  return await runRelationalSelect({
@@ -5036,6 +5364,7 @@ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filte
5036
5364
  limits,
5037
5365
  pkNames,
5038
5366
  db: executor,
5367
+ scope,
5039
5368
  // PostgreSQL sorts NULLs as the largest values (last in ASC).
5040
5369
  nullOrdering: "nulls-largest"
5041
5370
  });
@@ -5074,7 +5403,12 @@ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filte
5074
5403
  }
5075
5404
  }
5076
5405
  const cursorCondition = after != null && cursorEntries ? buildCursorCondition(table, cursorEntries, decodeCursor(after, cursorEntries), "nulls-largest") : void 0;
5077
- const baseWhereSql = where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0;
5406
+ const baseWhereSql = withScope(
5407
+ scope,
5408
+ tableName,
5409
+ table,
5410
+ where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
5411
+ );
5078
5412
  const whereSql = cursorCondition ? and4(baseWhereSql, cursorCondition) : baseWhereSql;
5079
5413
  let distinctKeys;
5080
5414
  if (distinct?.length) {
@@ -5129,7 +5463,7 @@ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filte
5129
5463
  args: queryArgs
5130
5464
  };
5131
5465
  };
5132
- var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits) => {
5466
+ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits, policies) => {
5133
5467
  const queryBase = db.query[tableName];
5134
5468
  const queryArgs = selectSingleArgs(orderArgs, filterArgs);
5135
5469
  const table = tables[tableName];
@@ -5140,6 +5474,7 @@ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filt
5140
5474
  try {
5141
5475
  const parsedInfo = parseResolveInfo3(info, { deep: true });
5142
5476
  const { executor, queryBase: requestQueryBase } = resolveQueryExecutor(db, context, tableName, queryBase);
5477
+ const scope = policies?.scope?.(context);
5143
5478
  if (requestQueryBase) {
5144
5479
  return await runRelationalSelect({
5145
5480
  queryBase: requestQueryBase,
@@ -5155,7 +5490,8 @@ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filt
5155
5490
  filterCtx,
5156
5491
  limits,
5157
5492
  pkNames,
5158
- db: executor
5493
+ db: executor,
5494
+ scope
5159
5495
  });
5160
5496
  }
5161
5497
  const { offset, orderBy, where } = args;
@@ -5165,8 +5501,14 @@ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filt
5165
5501
  { tableName, relationMap, tables }
5166
5502
  );
5167
5503
  let q = executor.select(selectedColumnsSql).from(table);
5168
- if (where) {
5169
- q = q.where(extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)));
5504
+ const whereSql = withScope(
5505
+ scope,
5506
+ tableName,
5507
+ table,
5508
+ where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
5509
+ );
5510
+ if (whereSql) {
5511
+ q = q.where(whereSql);
5170
5512
  }
5171
5513
  if (orderBy) {
5172
5514
  q = q.orderBy(...extractOrderBy(table, orderBy, relationFilterCtx(filterCtx, tableName), where));
@@ -5187,7 +5529,7 @@ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filt
5187
5529
  };
5188
5530
  };
5189
5531
  var pgPrimaryKeyPropNames = (table) => getPrimaryKeyPropNamesFromConfig(table, getTableConfig2);
5190
- var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
5532
+ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits, policies) => {
5191
5533
  const queryArgs = {
5192
5534
  values: {
5193
5535
  type: new GraphQLNonNull7(new GraphQLList7(new GraphQLNonNull7(baseType)))
@@ -5204,7 +5546,13 @@ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType,
5204
5546
  }
5205
5547
  const entries = nested?.enabled(tableName) ? args.values.map((values) => nested.split(tableName, values)) : void 0;
5206
5548
  const nestedEntries = entries?.some((entry) => nested.hasOps(entry.ops)) ? entries : void 0;
5207
- const input = nestedEntries ? [] : remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : args.values, table);
5549
+ const contextColumns = policies?.contextValues?.(tableName);
5550
+ const scope = policies?.scope?.(context);
5551
+ const input = nestedEntries ? [] : applyContextValuesAll(
5552
+ remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : args.values, table),
5553
+ contextColumns,
5554
+ context
5555
+ );
5208
5556
  const parsedInfo = parseResolveInfo3(info, {
5209
5557
  deep: true
5210
5558
  });
@@ -5217,7 +5565,8 @@ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType,
5217
5565
  table,
5218
5566
  pkNames,
5219
5567
  parsedInfo,
5220
- limits
5568
+ limits,
5569
+ scope
5221
5570
  });
5222
5571
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
5223
5572
  const runInsert = async (target, values) => {
@@ -5232,8 +5581,9 @@ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType,
5232
5581
  runtime: nested,
5233
5582
  tableName,
5234
5583
  entries: nestedEntries,
5235
- remapValues: (values) => remapFromGraphQLSingleInput(values, table),
5236
- write: (tx, values) => runInsert(tx, [values])
5584
+ remapValues: (values) => applyContextValues(remapFromGraphQLSingleInput(values, table), contextColumns, context),
5585
+ write: (tx, values) => runInsert(tx, [values]),
5586
+ context
5237
5587
  }) : await runInsert(executor, input);
5238
5588
  const enriched = hasRelations ? await eagerLoadMutationRelations(executor, tableName, result, pkNames, withParams) : result;
5239
5589
  return remapToGraphQLArrayOutput(enriched, tableName, table, relationMap);
@@ -5245,7 +5595,7 @@ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType,
5245
5595
  args: queryArgs
5246
5596
  };
5247
5597
  };
5248
- var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
5598
+ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits, policies) => {
5249
5599
  const queryArgs = {
5250
5600
  values: {
5251
5601
  type: new GraphQLNonNull7(baseType)
@@ -5259,7 +5609,13 @@ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType
5259
5609
  return await runMutation(db, context, info, txCtx, async (executor) => {
5260
5610
  const entry = nested?.enabled(tableName) ? nested.split(tableName, args.values) : void 0;
5261
5611
  const nestedEntry = entry && nested.hasOps(entry.ops) ? entry : void 0;
5262
- const input = nestedEntry ? {} : remapFromGraphQLSingleInput(entry ? entry.columns : args.values, table);
5612
+ const contextColumns = policies?.contextValues?.(tableName);
5613
+ const scope = policies?.scope?.(context);
5614
+ const input = nestedEntry ? {} : applyContextValues(
5615
+ remapFromGraphQLSingleInput(entry ? entry.columns : args.values, table),
5616
+ contextColumns,
5617
+ context
5618
+ );
5263
5619
  const parsedInfo = parseResolveInfo3(info, {
5264
5620
  deep: true
5265
5621
  });
@@ -5272,7 +5628,8 @@ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType
5272
5628
  table,
5273
5629
  pkNames,
5274
5630
  parsedInfo,
5275
- limits
5631
+ limits,
5632
+ scope
5276
5633
  });
5277
5634
  const returning = nestedEntry ? nested.withJoinColumns(tableName, nestedEntry.ops, { ...columns }, table) : columns;
5278
5635
  const runInsert = async (target, values) => {
@@ -5287,8 +5644,9 @@ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType
5287
5644
  runtime: nested,
5288
5645
  tableName,
5289
5646
  entries: [nestedEntry],
5290
- remapValues: (values) => remapFromGraphQLSingleInput(values, table),
5291
- write: runInsert
5647
+ remapValues: (values) => applyContextValues(remapFromGraphQLSingleInput(values, table), contextColumns, context),
5648
+ write: runInsert,
5649
+ context
5292
5650
  }) : await runInsert(executor, input);
5293
5651
  if (!result[0]) {
5294
5652
  if (!conflictDoNothing) {
@@ -5306,7 +5664,7 @@ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType
5306
5664
  args: queryArgs
5307
5665
  };
5308
5666
  };
5309
- var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested, limits) => {
5667
+ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested, limits, policies) => {
5310
5668
  const queryArgs = {
5311
5669
  values: {
5312
5670
  type: single ? new GraphQLNonNull7(baseType) : new GraphQLNonNull7(new GraphQLList7(new GraphQLNonNull7(baseType)))
@@ -5328,7 +5686,13 @@ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onCo
5328
5686
  }
5329
5687
  const entries = nested?.enabled(tableName) ? supplied.map((values) => nested.split(tableName, values)) : void 0;
5330
5688
  const nestedEntries = entries?.some((entry) => nested.hasOps(entry.ops)) ? entries : void 0;
5331
- const input = nestedEntries ? [] : remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : supplied, table);
5689
+ const contextColumns = policies?.contextValues?.(tableName);
5690
+ const scope = policies?.scope?.(context);
5691
+ const input = nestedEntries ? [] : applyContextValuesAll(
5692
+ remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : supplied, table),
5693
+ contextColumns,
5694
+ context
5695
+ );
5332
5696
  const parsedInfo = parseResolveInfo3(info, { deep: true });
5333
5697
  const { columns, hasRelations, withParams } = prepareMutationRelationColumns({
5334
5698
  relationMap,
@@ -5339,7 +5703,8 @@ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onCo
5339
5703
  table,
5340
5704
  pkNames,
5341
5705
  parsedInfo,
5342
- limits
5706
+ limits,
5707
+ scope
5343
5708
  });
5344
5709
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
5345
5710
  const runUpsert = async (target, values) => {
@@ -5354,7 +5719,8 @@ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onCo
5354
5719
  buildWhere: (where) => extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName))
5355
5720
  });
5356
5721
  let query = target.insert(table).values(values).returning(returning);
5357
- query = plan.action === "NOTHING" ? query.onConflictDoNothing(plan.target ? { target: plan.target } : void 0) : query.onConflictDoUpdate({ target: plan.target, set: plan.set, setWhere: plan.setWhere });
5722
+ const setWhere = withScope(scope, tableName, table, plan.setWhere);
5723
+ query = plan.action === "NOTHING" ? query.onConflictDoNothing(plan.target ? { target: plan.target } : void 0) : query.onConflictDoUpdate({ target: plan.target, set: plan.set, setWhere });
5358
5724
  return await query;
5359
5725
  };
5360
5726
  const result = nestedEntries ? await writeWithNestedOps({
@@ -5362,8 +5728,9 @@ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onCo
5362
5728
  runtime: nested,
5363
5729
  tableName,
5364
5730
  entries: nestedEntries,
5365
- remapValues: (values) => remapFromGraphQLSingleInput(values, table),
5366
- write: (tx, values) => runUpsert(tx, [values])
5731
+ remapValues: (values) => applyContextValues(remapFromGraphQLSingleInput(values, table), contextColumns, context),
5732
+ write: (tx, values) => runUpsert(tx, [values]),
5733
+ context
5367
5734
  }) : await runUpsert(executor, input);
5368
5735
  if (single && !result[0]) {
5369
5736
  return void 0;
@@ -5378,7 +5745,7 @@ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onCo
5378
5745
  args: queryArgs
5379
5746
  };
5380
5747
  };
5381
- var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested, limits) => {
5748
+ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested, limits, policies) => {
5382
5749
  const queryArgs = {
5383
5750
  set: {
5384
5751
  type: new GraphQLNonNull7(setArgs)
@@ -5394,6 +5761,7 @@ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filte
5394
5761
  try {
5395
5762
  return await runMutation(db, context, info, txCtx, async (executor) => {
5396
5763
  const { where, set } = args;
5764
+ const scope = policies?.scope?.(context);
5397
5765
  const parsedInfo = parseResolveInfo3(info, {
5398
5766
  deep: true
5399
5767
  });
@@ -5406,16 +5774,25 @@ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filte
5406
5774
  table,
5407
5775
  pkNames,
5408
5776
  parsedInfo,
5409
- limits
5777
+ limits,
5778
+ scope
5410
5779
  });
5411
5780
  const entry = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
5412
5781
  const nestedOps = entry && nested.hasOps(entry.ops) ? entry.ops : void 0;
5413
- const input = remapUpdateInput(entry ? entry.columns : set, table, tableName);
5782
+ const input = stripContextValues(
5783
+ remapUpdateInput(entry ? entry.columns : set, table, tableName),
5784
+ policies?.contextValues?.(tableName)
5785
+ );
5414
5786
  if (!Object.keys(input).length && !nestedOps) {
5415
5787
  throw new GraphQLError8("Unable to update with no values specified!");
5416
5788
  }
5417
5789
  const relationCtx = relationFilterCtx(filterCtx, tableName);
5418
- const filters = single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0;
5790
+ const filters = withScope(
5791
+ scope,
5792
+ tableName,
5793
+ table,
5794
+ single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0
5795
+ );
5419
5796
  if (single) {
5420
5797
  await assertSingleMatch(executor, table, filters, fieldName);
5421
5798
  }
@@ -5435,7 +5812,8 @@ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filte
5435
5812
  columns: input,
5436
5813
  ops: nestedOps,
5437
5814
  remapValues: (values) => values,
5438
- write: runUpdate
5815
+ write: runUpdate,
5816
+ context
5439
5817
  }) : await runUpdate(executor, input);
5440
5818
  if (single && result.length > 1) {
5441
5819
  throw new GraphQLError8(`${fieldName}: 'where' matched more than one row!`);
@@ -5453,7 +5831,7 @@ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filte
5453
5831
  args: queryArgs
5454
5832
  };
5455
5833
  };
5456
- var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested, limits) => {
5834
+ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested, limits, policies) => {
5457
5835
  const queryArgs = {
5458
5836
  updates: {
5459
5837
  type: new GraphQLNonNull7(new GraphQLList7(new GraphQLNonNull7(updateManyInput)))
@@ -5469,6 +5847,8 @@ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateMany
5469
5847
  if (!updates.length) {
5470
5848
  throw new GraphQLError8("No updates were provided!");
5471
5849
  }
5850
+ const scope = policies?.scope?.(context);
5851
+ const contextColumns = policies?.contextValues?.(tableName);
5472
5852
  const parsedInfo = parseResolveInfo3(info, {
5473
5853
  deep: true
5474
5854
  });
@@ -5481,19 +5861,28 @@ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateMany
5481
5861
  table,
5482
5862
  pkNames,
5483
5863
  parsedInfo,
5484
- limits
5864
+ limits,
5865
+ scope
5485
5866
  });
5486
5867
  const entries = updates.map(({ where, set }) => {
5487
5868
  const split = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
5488
5869
  const ops = split && nested.hasOps(split.ops) ? split.ops : void 0;
5489
- const input = remapUpdateInput(split ? split.columns : set, table, tableName);
5870
+ const input = stripContextValues(
5871
+ remapUpdateInput(split ? split.columns : set, table, tableName),
5872
+ contextColumns
5873
+ );
5490
5874
  if (!Object.keys(input).length && !ops) {
5491
5875
  throw new GraphQLError8("Unable to update with no values specified!");
5492
5876
  }
5493
5877
  return {
5494
5878
  set: input,
5495
5879
  ops,
5496
- filters: where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
5880
+ filters: withScope(
5881
+ scope,
5882
+ tableName,
5883
+ table,
5884
+ where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
5885
+ )
5497
5886
  };
5498
5887
  });
5499
5888
  const returning = entries.some((entry) => entry.ops) ? nested.withJoinColumns(
@@ -5507,7 +5896,7 @@ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateMany
5507
5896
  const perEntry = await executor.transaction(async (tx) => {
5508
5897
  const results = [];
5509
5898
  for (const entry of entries) {
5510
- const values = entry.ops ? { ...entry.set, ...await nested.applyParentSide(tx, tableName, entry.ops) } : entry.set;
5899
+ const values = entry.ops ? { ...entry.set, ...await nested.applyParentSide(tx, tableName, entry.ops, context) } : entry.set;
5511
5900
  const writes = Object.keys(values).length > 0;
5512
5901
  let query = writes ? tx.update(table).set(values) : tx.select(returning).from(table);
5513
5902
  if (entry.filters) {
@@ -5515,7 +5904,7 @@ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateMany
5515
5904
  }
5516
5905
  const rows = await (writes ? query.returning(returning) : query);
5517
5906
  if (entry.ops) {
5518
- await nested.applyChildSide(tx, tableName, entry.ops, rows);
5907
+ await nested.applyChildSide(tx, tableName, entry.ops, rows, context);
5519
5908
  }
5520
5909
  results.push(rows);
5521
5910
  }
@@ -5544,7 +5933,7 @@ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateMany
5544
5933
  args: queryArgs
5545
5934
  };
5546
5935
  };
5547
- var generateDelete2 = (db, tableName, table, filterArgs, fieldName, typeName, single, requireWhere, filterCtx, selectionCtx, txCtx) => {
5936
+ var generateDelete2 = (db, tableName, table, filterArgs, fieldName, typeName, single, requireWhere, filterCtx, selectionCtx, txCtx, policies) => {
5548
5937
  const queryArgs = {
5549
5938
  where: {
5550
5939
  type: single || requireWhere ? new GraphQLNonNull7(filterArgs) : filterArgs
@@ -5556,6 +5945,7 @@ var generateDelete2 = (db, tableName, table, filterArgs, fieldName, typeName, si
5556
5945
  try {
5557
5946
  return await runMutation(db, context, info, txCtx, async (executor) => {
5558
5947
  const { where } = args;
5948
+ const scope = policies?.scope?.(context);
5559
5949
  const parsedInfo = parseResolveInfo3(info, {
5560
5950
  deep: true
5561
5951
  });
@@ -5565,7 +5955,12 @@ var generateDelete2 = (db, tableName, table, filterArgs, fieldName, typeName, si
5565
5955
  selectionCtx
5566
5956
  );
5567
5957
  const relationCtx = relationFilterCtx(filterCtx, tableName);
5568
- const filters = single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0;
5958
+ const filters = withScope(
5959
+ scope,
5960
+ tableName,
5961
+ table,
5962
+ single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0
5963
+ );
5569
5964
  if (single) {
5570
5965
  await assertSingleMatch(executor, table, filters, fieldName);
5571
5966
  }
@@ -5623,12 +6018,16 @@ function generateSchemaData2(db, schema, relations, options) {
5623
6018
  attachTargetPrimaryKeys(namedRelations, tables, pgPrimaryKeyPropNames);
5624
6019
  const eagerRelations = pruneNonEagerRelations(namedRelations, shouldEagerLoad);
5625
6020
  const filterCtx = { tables, relationMap: namedRelations };
6021
+ const scopes = options.policies?.scope;
6022
+ const contextValuesOf = options.policies?.contextValues;
6023
+ const policies = bindPolicies(options.policies, filterCtx);
5626
6024
  const resolverFactory = createRelationResolverFactory(
5627
6025
  db,
5628
6026
  tables,
5629
6027
  "nulls-largest",
5630
6028
  filterCtx,
5631
- limits
6029
+ limits,
6030
+ scopes
5632
6031
  );
5633
6032
  const cacheCtx = {
5634
6033
  genericFilterCache: /* @__PURE__ */ new Map(),
@@ -5645,6 +6044,8 @@ function generateSchemaData2(db, schema, relations, options) {
5645
6044
  complexity,
5646
6045
  limits,
5647
6046
  docs: options.docs ?? {},
6047
+ primaryKeyOf: (name) => tables[name] ? pgPrimaryKeyPropNames(tables[name]) : [],
6048
+ contextValuesOf,
5648
6049
  featureOf
5649
6050
  };
5650
6051
  const nestedPlans = features.nestedWrites ? buildNestedWritePlans(
@@ -5655,8 +6056,8 @@ function generateSchemaData2(db, schema, relations, options) {
5655
6056
  extractRelationJoinColumns
5656
6057
  ) : void 0;
5657
6058
  const nestedTypes = nestedPlans ? createNestedWriteTypes({ plans: nestedPlans, cacheCtx, typeNameMapper, insertPrefix: prefixes.insert }) : void 0;
5658
- const nestedRuntime = nestedPlans ? createNestedWriteRuntime({ plans: nestedPlans, filterCtx }) : void 0;
5659
- const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
6059
+ const nestedRuntime = nestedPlans ? createNestedWriteRuntime({ plans: nestedPlans, filterCtx, scopes, contextValues: contextValuesOf }) : void 0;
6060
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx, scopes) : void 0;
5660
6061
  const queries = {};
5661
6062
  const mutations = {};
5662
6063
  const mutationTxCtx = createMutationTxCtx(options.transactions);
@@ -5683,6 +6084,7 @@ function generateSchemaData2(db, schema, relations, options) {
5683
6084
  const outputs = {};
5684
6085
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
5685
6086
  const tableFeatures = featureOf(tableName);
6087
+ const drizzleMeta = tableFieldExtensions(tableName, pgPrimaryKeyPropNames(schema[tableName]));
5686
6088
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
5687
6089
  const { selectSingleOutput, selectArrOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
5688
6090
  const {
@@ -5715,7 +6117,8 @@ function generateSchemaData2(db, schema, relations, options) {
5715
6117
  typeNameMapper,
5716
6118
  filterCtx,
5717
6119
  tableFeatures.distinct,
5718
- limits
6120
+ limits,
6121
+ policies
5719
6122
  );
5720
6123
  const selectSingleGenerated = generateSelectSingle2(
5721
6124
  db,
@@ -5728,7 +6131,8 @@ function generateSchemaData2(db, schema, relations, options) {
5728
6131
  typeName,
5729
6132
  typeNameMapper,
5730
6133
  filterCtx,
5731
- limits
6134
+ limits,
6135
+ policies
5732
6136
  );
5733
6137
  const insertArrGenerated = tableFeatures.insert ? generateInsertArray2(
5734
6138
  db,
@@ -5743,7 +6147,8 @@ function generateSchemaData2(db, schema, relations, options) {
5743
6147
  conflictDoNothing,
5744
6148
  mutationTxCtx,
5745
6149
  nestedRuntime,
5746
- limits
6150
+ limits,
6151
+ policies
5747
6152
  ) : void 0;
5748
6153
  const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle2(
5749
6154
  db,
@@ -5758,7 +6163,8 @@ function generateSchemaData2(db, schema, relations, options) {
5758
6163
  conflictDoNothing,
5759
6164
  mutationTxCtx,
5760
6165
  nestedRuntime,
5761
- limits
6166
+ limits,
6167
+ policies
5762
6168
  ) : void 0;
5763
6169
  const uniqueSets = tableFeatures.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig2) : [];
5764
6170
  const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
@@ -5784,7 +6190,8 @@ function generateSchemaData2(db, schema, relations, options) {
5784
6190
  filterCtx,
5785
6191
  mutationTxCtx,
5786
6192
  nestedRuntime,
5787
- limits
6193
+ limits,
6194
+ policies
5788
6195
  ) : void 0;
5789
6196
  const upsertSingleGenerated = onConflictInput ? generateUpsert2(
5790
6197
  db,
@@ -5802,7 +6209,8 @@ function generateSchemaData2(db, schema, relations, options) {
5802
6209
  filterCtx,
5803
6210
  mutationTxCtx,
5804
6211
  nestedRuntime,
5805
- limits
6212
+ limits,
6213
+ policies
5806
6214
  ) : void 0;
5807
6215
  const updateGenerated = tableFeatures.update ? generateUpdate2(
5808
6216
  db,
@@ -5820,7 +6228,8 @@ function generateSchemaData2(db, schema, relations, options) {
5820
6228
  filterCtx,
5821
6229
  mutationTxCtx,
5822
6230
  nestedRuntime,
5823
- limits
6231
+ limits,
6232
+ policies
5824
6233
  ) : void 0;
5825
6234
  const updateSingleGenerated = tableFeatures.update ? generateUpdate2(
5826
6235
  db,
@@ -5838,7 +6247,8 @@ function generateSchemaData2(db, schema, relations, options) {
5838
6247
  filterCtx,
5839
6248
  mutationTxCtx,
5840
6249
  nestedRuntime,
5841
- limits
6250
+ limits,
6251
+ policies
5842
6252
  ) : void 0;
5843
6253
  const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
5844
6254
  const updateManyGenerated = updateManyInput ? generateUpdateMany2(
@@ -5854,7 +6264,8 @@ function generateSchemaData2(db, schema, relations, options) {
5854
6264
  filterCtx,
5855
6265
  mutationTxCtx,
5856
6266
  nestedRuntime,
5857
- limits
6267
+ limits,
6268
+ policies
5858
6269
  ) : void 0;
5859
6270
  const deleteGenerated = tableFeatures.delete ? generateDelete2(
5860
6271
  db,
@@ -5867,7 +6278,8 @@ function generateSchemaData2(db, schema, relations, options) {
5867
6278
  tableFeatures.requireWhere,
5868
6279
  filterCtx,
5869
6280
  { tableName, relationMap: namedRelations, tables },
5870
- mutationTxCtx
6281
+ mutationTxCtx,
6282
+ policies
5871
6283
  ) : void 0;
5872
6284
  const deleteSingleGenerated = tableFeatures.delete ? generateDelete2(
5873
6285
  db,
@@ -5880,7 +6292,8 @@ function generateSchemaData2(db, schema, relations, options) {
5880
6292
  tableFeatures.requireWhere,
5881
6293
  filterCtx,
5882
6294
  { tableName, relationMap: namedRelations, tables },
5883
- mutationTxCtx
6295
+ mutationTxCtx,
6296
+ policies
5884
6297
  ) : void 0;
5885
6298
  const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
5886
6299
  db,
@@ -5914,7 +6327,8 @@ function generateSchemaData2(db, schema, relations, options) {
5914
6327
  typeName,
5915
6328
  aggregateFieldName,
5916
6329
  tableFilters,
5917
- filterCtx
6330
+ filterCtx,
6331
+ scopes
5918
6332
  ) : void 0;
5919
6333
  const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
5920
6334
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
@@ -5928,25 +6342,35 @@ function generateSchemaData2(db, schema, relations, options) {
5928
6342
  tableFilters,
5929
6343
  groupByEnum,
5930
6344
  havingInput,
5931
- filterCtx
6345
+ filterCtx,
6346
+ scopes
5932
6347
  ) : void 0;
5933
6348
  queries[selectArrGenerated.name] = {
5934
6349
  type: selectArrOutput,
5935
6350
  args: selectArrGenerated.args,
5936
6351
  resolve: selectArrGenerated.resolver,
5937
- ...complexity ? { extensions: { complexity: listFieldComplexity(complexity, limits?.(tableName)) } } : {}
6352
+ extensions: {
6353
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: false, targetArg: "where" }),
6354
+ ...complexity ? { complexity: listFieldComplexity(complexity, limits?.(tableName)) } : {}
6355
+ }
5938
6356
  };
5939
6357
  queries[selectSingleGenerated.name] = {
5940
6358
  type: selectSingleOutput,
5941
6359
  args: selectSingleGenerated.args,
5942
- resolve: selectSingleGenerated.resolver
6360
+ resolve: selectSingleGenerated.resolver,
6361
+ extensions: {
6362
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: true, targetArg: "where" })
6363
+ }
5943
6364
  };
5944
6365
  if (aggregateGenerated && aggregateType) {
5945
6366
  queries[aggregateGenerated.name] = {
5946
6367
  type: new GraphQLNonNull7(aggregateType),
5947
6368
  args: aggregateGenerated.args,
5948
6369
  resolve: aggregateGenerated.resolver,
5949
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
6370
+ extensions: {
6371
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "aggregate", single: true, targetArg: "where" }),
6372
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
6373
+ }
5950
6374
  };
5951
6375
  }
5952
6376
  if (groupByGenerated && groupByType) {
@@ -5954,14 +6378,20 @@ function generateSchemaData2(db, schema, relations, options) {
5954
6378
  type: new GraphQLNonNull7(new GraphQLList7(new GraphQLNonNull7(groupByType))),
5955
6379
  args: groupByGenerated.args,
5956
6380
  resolve: groupByGenerated.resolver,
5957
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
6381
+ extensions: {
6382
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "groupBy", single: false, targetArg: "where" }),
6383
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
6384
+ }
5958
6385
  };
5959
6386
  }
5960
6387
  if (insertArrGenerated) {
5961
6388
  mutations[insertArrGenerated.name] = {
5962
6389
  type: arrTableItemOutput,
5963
6390
  args: insertArrGenerated.args,
5964
- resolve: insertArrGenerated.resolver
6391
+ resolve: insertArrGenerated.resolver,
6392
+ extensions: {
6393
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: false, targetArg: "values" })
6394
+ }
5965
6395
  };
5966
6396
  }
5967
6397
  if (insertSingleGenerated) {
@@ -5970,28 +6400,40 @@ function generateSchemaData2(db, schema, relations, options) {
5970
6400
  // `conflictDoNothing` swallowing the insert, so the field is nullable only there.
5971
6401
  type: conflictDoNothing ? singleTableItemOutput : new GraphQLNonNull7(singleTableItemOutput),
5972
6402
  args: insertSingleGenerated.args,
5973
- resolve: insertSingleGenerated.resolver
6403
+ resolve: insertSingleGenerated.resolver,
6404
+ extensions: {
6405
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: true, targetArg: "values" })
6406
+ }
5974
6407
  };
5975
6408
  }
5976
6409
  if (upsertArrGenerated) {
5977
6410
  mutations[upsertArrGenerated.name] = {
5978
6411
  type: arrTableItemOutput,
5979
6412
  args: upsertArrGenerated.args,
5980
- resolve: upsertArrGenerated.resolver
6413
+ resolve: upsertArrGenerated.resolver,
6414
+ extensions: {
6415
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: false, targetArg: "values" })
6416
+ }
5981
6417
  };
5982
6418
  }
5983
6419
  if (upsertSingleGenerated) {
5984
6420
  mutations[upsertSingleGenerated.name] = {
5985
6421
  type: singleTableItemOutput,
5986
6422
  args: upsertSingleGenerated.args,
5987
- resolve: upsertSingleGenerated.resolver
6423
+ resolve: upsertSingleGenerated.resolver,
6424
+ extensions: {
6425
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: true, targetArg: "values" })
6426
+ }
5988
6427
  };
5989
6428
  }
5990
6429
  if (updateGenerated) {
5991
6430
  mutations[updateGenerated.name] = {
5992
6431
  type: arrTableItemOutput,
5993
6432
  args: updateGenerated.args,
5994
- resolve: updateGenerated.resolver
6433
+ resolve: updateGenerated.resolver,
6434
+ extensions: {
6435
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: false, targetArg: "where" })
6436
+ }
5995
6437
  };
5996
6438
  }
5997
6439
  if (updateManyGenerated) {
@@ -5999,6 +6441,9 @@ function generateSchemaData2(db, schema, relations, options) {
5999
6441
  type: new GraphQLNonNull7(new GraphQLList7(singleTableItemOutput)),
6000
6442
  args: updateManyGenerated.args,
6001
6443
  resolve: updateManyGenerated.resolver,
6444
+ extensions: {
6445
+ drizzle: drizzleMeta({ kind: "mutation", operation: "updateMany", single: false, targetArg: "updates" })
6446
+ },
6002
6447
  // The nullable element is deliberate, and the reason this mutation's return type
6003
6448
  // differs from every sibling's: the result is aligned with the input, one slot per
6004
6449
  // entry, so an entry that matched nothing has to be able to say so.
@@ -6009,21 +6454,30 @@ function generateSchemaData2(db, schema, relations, options) {
6009
6454
  mutations[updateSingleGenerated.name] = {
6010
6455
  type: singleTableItemOutput,
6011
6456
  args: updateSingleGenerated.args,
6012
- resolve: updateSingleGenerated.resolver
6457
+ resolve: updateSingleGenerated.resolver,
6458
+ extensions: {
6459
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: true, targetArg: "where" })
6460
+ }
6013
6461
  };
6014
6462
  }
6015
6463
  if (deleteGenerated) {
6016
6464
  mutations[deleteGenerated.name] = {
6017
6465
  type: arrTableItemOutput,
6018
6466
  args: deleteGenerated.args,
6019
- resolve: deleteGenerated.resolver
6467
+ resolve: deleteGenerated.resolver,
6468
+ extensions: {
6469
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: false, targetArg: "where" })
6470
+ }
6020
6471
  };
6021
6472
  }
6022
6473
  if (deleteSingleGenerated) {
6023
6474
  mutations[deleteSingleGenerated.name] = {
6024
6475
  type: singleTableItemOutput,
6025
6476
  args: deleteSingleGenerated.args,
6026
- resolve: deleteSingleGenerated.resolver
6477
+ resolve: deleteSingleGenerated.resolver,
6478
+ extensions: {
6479
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: true, targetArg: "where" })
6480
+ }
6027
6481
  };
6028
6482
  }
6029
6483
  if (updateCountGenerated) {
@@ -6096,7 +6550,7 @@ import {
6096
6550
  GraphQLNonNull as GraphQLNonNull8
6097
6551
  } from "graphql";
6098
6552
  import { parseResolveInfo as parseResolveInfo4 } from "graphql-parse-resolve-info";
6099
- var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits) => {
6553
+ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits, policies) => {
6100
6554
  const queryBase = db.query[tableName];
6101
6555
  if (!queryBase) {
6102
6556
  throw new Error(
@@ -6133,6 +6587,7 @@ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filte
6133
6587
  limits,
6134
6588
  pkNames,
6135
6589
  db: executor,
6590
+ scope: policies?.scope?.(context),
6136
6591
  // SQLite sorts NULLs as the smallest values (first in ASC).
6137
6592
  nullOrdering: "nulls-smallest"
6138
6593
  });
@@ -6143,7 +6598,7 @@ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filte
6143
6598
  args: queryArgs
6144
6599
  };
6145
6600
  };
6146
- var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits) => {
6601
+ var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits, policies) => {
6147
6602
  const queryBase = db.query[tableName];
6148
6603
  if (!queryBase) {
6149
6604
  throw new Error(
@@ -6173,7 +6628,8 @@ var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filt
6173
6628
  filterCtx,
6174
6629
  limits,
6175
6630
  pkNames,
6176
- db: executor
6631
+ db: executor,
6632
+ scope: policies?.scope?.(context)
6177
6633
  });
6178
6634
  } catch (e) {
6179
6635
  throw toGraphQLError(e);
@@ -6183,7 +6639,7 @@ var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filt
6183
6639
  };
6184
6640
  };
6185
6641
  var sqlitePrimaryKeyPropNames = (table) => getPrimaryKeyPropNamesFromConfig(table, getTableConfig3);
6186
- var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
6642
+ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits, policies) => {
6187
6643
  const queryArgs = {
6188
6644
  values: {
6189
6645
  type: new GraphQLNonNull8(new GraphQLList8(new GraphQLNonNull8(baseType)))
@@ -6200,7 +6656,13 @@ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType,
6200
6656
  }
6201
6657
  const entries = nested?.enabled(tableName) ? args.values.map((values) => nested.split(tableName, values)) : void 0;
6202
6658
  const nestedEntries = entries?.some((entry) => nested.hasOps(entry.ops)) ? entries : void 0;
6203
- const input = nestedEntries ? [] : remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : args.values, table);
6659
+ const contextColumns = policies?.contextValues?.(tableName);
6660
+ const scope = policies?.scope?.(context);
6661
+ const input = nestedEntries ? [] : applyContextValuesAll(
6662
+ remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : args.values, table),
6663
+ contextColumns,
6664
+ context
6665
+ );
6204
6666
  const parsedInfo = parseResolveInfo4(info, {
6205
6667
  deep: true
6206
6668
  });
@@ -6213,7 +6675,8 @@ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType,
6213
6675
  table,
6214
6676
  pkNames,
6215
6677
  parsedInfo,
6216
- limits
6678
+ limits,
6679
+ scope
6217
6680
  });
6218
6681
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
6219
6682
  const runInsert = async (target, values) => {
@@ -6228,8 +6691,9 @@ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType,
6228
6691
  runtime: nested,
6229
6692
  tableName,
6230
6693
  entries: nestedEntries,
6231
- remapValues: (values) => remapFromGraphQLSingleInput(values, table),
6232
- write: (tx, values) => runInsert(tx, [values])
6694
+ remapValues: (values) => applyContextValues(remapFromGraphQLSingleInput(values, table), contextColumns, context),
6695
+ write: (tx, values) => runInsert(tx, [values]),
6696
+ context
6233
6697
  }) : await runInsert(executor, input);
6234
6698
  const enriched = hasRelations ? await eagerLoadMutationRelations(executor, tableName, result, pkNames, withParams) : result;
6235
6699
  return remapToGraphQLArrayOutput(enriched, tableName, table, relationMap);
@@ -6241,7 +6705,7 @@ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType,
6241
6705
  args: queryArgs
6242
6706
  };
6243
6707
  };
6244
- var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
6708
+ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits, policies) => {
6245
6709
  const queryArgs = {
6246
6710
  values: {
6247
6711
  type: new GraphQLNonNull8(baseType)
@@ -6255,7 +6719,13 @@ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType
6255
6719
  return await runMutation(db, context, info, txCtx, async (executor) => {
6256
6720
  const entry = nested?.enabled(tableName) ? nested.split(tableName, args.values) : void 0;
6257
6721
  const nestedEntry = entry && nested.hasOps(entry.ops) ? entry : void 0;
6258
- const input = nestedEntry ? {} : remapFromGraphQLSingleInput(entry ? entry.columns : args.values, table);
6722
+ const contextColumns = policies?.contextValues?.(tableName);
6723
+ const scope = policies?.scope?.(context);
6724
+ const input = nestedEntry ? {} : applyContextValues(
6725
+ remapFromGraphQLSingleInput(entry ? entry.columns : args.values, table),
6726
+ contextColumns,
6727
+ context
6728
+ );
6259
6729
  const parsedInfo = parseResolveInfo4(info, {
6260
6730
  deep: true
6261
6731
  });
@@ -6268,7 +6738,8 @@ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType
6268
6738
  table,
6269
6739
  pkNames,
6270
6740
  parsedInfo,
6271
- limits
6741
+ limits,
6742
+ scope
6272
6743
  });
6273
6744
  const returning = nestedEntry ? nested.withJoinColumns(tableName, nestedEntry.ops, { ...columns }, table) : columns;
6274
6745
  const runInsert = async (target, values) => {
@@ -6283,8 +6754,9 @@ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType
6283
6754
  runtime: nested,
6284
6755
  tableName,
6285
6756
  entries: [nestedEntry],
6286
- remapValues: (values) => remapFromGraphQLSingleInput(values, table),
6287
- write: runInsert
6757
+ remapValues: (values) => applyContextValues(remapFromGraphQLSingleInput(values, table), contextColumns, context),
6758
+ write: runInsert,
6759
+ context
6288
6760
  }) : await runInsert(executor, input);
6289
6761
  if (!result[0]) {
6290
6762
  if (!conflictDoNothing) {
@@ -6302,7 +6774,7 @@ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType
6302
6774
  args: queryArgs
6303
6775
  };
6304
6776
  };
6305
- var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested, limits) => {
6777
+ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested, limits, policies) => {
6306
6778
  const queryArgs = {
6307
6779
  values: {
6308
6780
  type: single ? new GraphQLNonNull8(baseType) : new GraphQLNonNull8(new GraphQLList8(new GraphQLNonNull8(baseType)))
@@ -6324,7 +6796,13 @@ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onCo
6324
6796
  }
6325
6797
  const entries = nested?.enabled(tableName) ? supplied.map((values) => nested.split(tableName, values)) : void 0;
6326
6798
  const nestedEntries = entries?.some((entry) => nested.hasOps(entry.ops)) ? entries : void 0;
6327
- const input = nestedEntries ? [] : remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : supplied, table);
6799
+ const contextColumns = policies?.contextValues?.(tableName);
6800
+ const scope = policies?.scope?.(context);
6801
+ const input = nestedEntries ? [] : applyContextValuesAll(
6802
+ remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : supplied, table),
6803
+ contextColumns,
6804
+ context
6805
+ );
6328
6806
  const parsedInfo = parseResolveInfo4(info, { deep: true });
6329
6807
  const { columns, hasRelations, withParams } = prepareMutationRelationColumns({
6330
6808
  relationMap,
@@ -6335,7 +6813,8 @@ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onCo
6335
6813
  table,
6336
6814
  pkNames,
6337
6815
  parsedInfo,
6338
- limits
6816
+ limits,
6817
+ scope
6339
6818
  });
6340
6819
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
6341
6820
  const runUpsert = async (target, values) => {
@@ -6350,7 +6829,8 @@ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onCo
6350
6829
  buildWhere: (where) => extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName))
6351
6830
  });
6352
6831
  let query = target.insert(table).values(values).returning(returning);
6353
- query = plan.action === "NOTHING" ? query.onConflictDoNothing(plan.target ? { target: plan.target } : void 0) : query.onConflictDoUpdate({ target: plan.target, set: plan.set, setWhere: plan.setWhere });
6832
+ const setWhere = withScope(scope, tableName, table, plan.setWhere);
6833
+ query = plan.action === "NOTHING" ? query.onConflictDoNothing(plan.target ? { target: plan.target } : void 0) : query.onConflictDoUpdate({ target: plan.target, set: plan.set, setWhere });
6354
6834
  return await query;
6355
6835
  };
6356
6836
  const result = nestedEntries ? await writeWithNestedOps({
@@ -6358,8 +6838,9 @@ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onCo
6358
6838
  runtime: nested,
6359
6839
  tableName,
6360
6840
  entries: nestedEntries,
6361
- remapValues: (values) => remapFromGraphQLSingleInput(values, table),
6362
- write: (tx, values) => runUpsert(tx, [values])
6841
+ remapValues: (values) => applyContextValues(remapFromGraphQLSingleInput(values, table), contextColumns, context),
6842
+ write: (tx, values) => runUpsert(tx, [values]),
6843
+ context
6363
6844
  }) : await runUpsert(executor, input);
6364
6845
  if (single && !result[0]) {
6365
6846
  return void 0;
@@ -6374,7 +6855,7 @@ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onCo
6374
6855
  args: queryArgs
6375
6856
  };
6376
6857
  };
6377
- var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested, limits) => {
6858
+ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested, limits, policies) => {
6378
6859
  const queryArgs = {
6379
6860
  set: {
6380
6861
  type: new GraphQLNonNull8(setArgs)
@@ -6390,6 +6871,7 @@ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filte
6390
6871
  try {
6391
6872
  return await runMutation(db, context, info, txCtx, async (executor) => {
6392
6873
  const { where, set } = args;
6874
+ const scope = policies?.scope?.(context);
6393
6875
  const parsedInfo = parseResolveInfo4(info, {
6394
6876
  deep: true
6395
6877
  });
@@ -6402,16 +6884,25 @@ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filte
6402
6884
  table,
6403
6885
  pkNames,
6404
6886
  parsedInfo,
6405
- limits
6887
+ limits,
6888
+ scope
6406
6889
  });
6407
6890
  const entry = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
6408
6891
  const nestedOps = entry && nested.hasOps(entry.ops) ? entry.ops : void 0;
6409
- const input = remapUpdateInput(entry ? entry.columns : set, table, tableName);
6892
+ const input = stripContextValues(
6893
+ remapUpdateInput(entry ? entry.columns : set, table, tableName),
6894
+ policies?.contextValues?.(tableName)
6895
+ );
6410
6896
  if (!Object.keys(input).length && !nestedOps) {
6411
6897
  throw new GraphQLError9("Unable to update with no values specified!");
6412
6898
  }
6413
6899
  const relationCtx = relationFilterCtx(filterCtx, tableName);
6414
- const filters = single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0;
6900
+ const filters = withScope(
6901
+ scope,
6902
+ tableName,
6903
+ table,
6904
+ single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0
6905
+ );
6415
6906
  if (single) {
6416
6907
  await assertSingleMatch(executor, table, filters, fieldName);
6417
6908
  }
@@ -6431,7 +6922,8 @@ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filte
6431
6922
  columns: input,
6432
6923
  ops: nestedOps,
6433
6924
  remapValues: (values) => values,
6434
- write: runUpdate
6925
+ write: runUpdate,
6926
+ context
6435
6927
  }) : await runUpdate(executor, input);
6436
6928
  if (single && result.length > 1) {
6437
6929
  throw new GraphQLError9(`${fieldName}: 'where' matched more than one row!`);
@@ -6449,7 +6941,7 @@ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filte
6449
6941
  args: queryArgs
6450
6942
  };
6451
6943
  };
6452
- var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested, limits) => {
6944
+ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested, limits, policies) => {
6453
6945
  const queryArgs = {
6454
6946
  updates: {
6455
6947
  type: new GraphQLNonNull8(new GraphQLList8(new GraphQLNonNull8(updateManyInput)))
@@ -6465,6 +6957,8 @@ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateMany
6465
6957
  if (!updates.length) {
6466
6958
  throw new GraphQLError9("No updates were provided!");
6467
6959
  }
6960
+ const scope = policies?.scope?.(context);
6961
+ const contextColumns = policies?.contextValues?.(tableName);
6468
6962
  const parsedInfo = parseResolveInfo4(info, {
6469
6963
  deep: true
6470
6964
  });
@@ -6477,19 +6971,28 @@ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateMany
6477
6971
  table,
6478
6972
  pkNames,
6479
6973
  parsedInfo,
6480
- limits
6974
+ limits,
6975
+ scope
6481
6976
  });
6482
6977
  const entries = updates.map(({ where, set }) => {
6483
6978
  const split = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
6484
6979
  const ops = split && nested.hasOps(split.ops) ? split.ops : void 0;
6485
- const input = remapUpdateInput(split ? split.columns : set, table, tableName);
6980
+ const input = stripContextValues(
6981
+ remapUpdateInput(split ? split.columns : set, table, tableName),
6982
+ contextColumns
6983
+ );
6486
6984
  if (!Object.keys(input).length && !ops) {
6487
6985
  throw new GraphQLError9("Unable to update with no values specified!");
6488
6986
  }
6489
6987
  return {
6490
6988
  set: input,
6491
6989
  ops,
6492
- filters: where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
6990
+ filters: withScope(
6991
+ scope,
6992
+ tableName,
6993
+ table,
6994
+ where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
6995
+ )
6493
6996
  };
6494
6997
  });
6495
6998
  const anyNested = entries.some((entry) => entry.ops);
@@ -6507,7 +7010,7 @@ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateMany
6507
7010
  return query.returning(returning).all();
6508
7011
  };
6509
7012
  const runNestedEntry = async (tx, entry) => {
6510
- const values = entry.ops ? { ...entry.set, ...await nested.applyParentSide(tx, tableName, entry.ops) } : entry.set;
7013
+ const values = entry.ops ? { ...entry.set, ...await nested.applyParentSide(tx, tableName, entry.ops, context) } : entry.set;
6511
7014
  const writes = Object.keys(values).length > 0;
6512
7015
  let query = writes ? tx.update(table).set(values) : tx.select(returning).from(table);
6513
7016
  if (entry.filters) {
@@ -6515,7 +7018,7 @@ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateMany
6515
7018
  }
6516
7019
  const rows = await (writes ? query.returning(returning) : query);
6517
7020
  if (entry.ops) {
6518
- await nested.applyChildSide(tx, tableName, entry.ops, rows);
7021
+ await nested.applyChildSide(tx, tableName, entry.ops, rows, context);
6519
7022
  }
6520
7023
  return rows;
6521
7024
  };
@@ -6568,7 +7071,7 @@ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateMany
6568
7071
  args: queryArgs
6569
7072
  };
6570
7073
  };
6571
- var generateDelete3 = (db, tableName, table, filterArgs, fieldName, typeName, single, requireWhere, filterCtx, selectionCtx, txCtx) => {
7074
+ var generateDelete3 = (db, tableName, table, filterArgs, fieldName, typeName, single, requireWhere, filterCtx, selectionCtx, txCtx, policies) => {
6572
7075
  const queryArgs = {
6573
7076
  where: {
6574
7077
  type: single || requireWhere ? new GraphQLNonNull8(filterArgs) : filterArgs
@@ -6580,6 +7083,7 @@ var generateDelete3 = (db, tableName, table, filterArgs, fieldName, typeName, si
6580
7083
  try {
6581
7084
  return await runMutation(db, context, info, txCtx, async (executor) => {
6582
7085
  const { where } = args;
7086
+ const scope = policies?.scope?.(context);
6583
7087
  const parsedInfo = parseResolveInfo4(info, {
6584
7088
  deep: true
6585
7089
  });
@@ -6589,7 +7093,12 @@ var generateDelete3 = (db, tableName, table, filterArgs, fieldName, typeName, si
6589
7093
  selectionCtx
6590
7094
  );
6591
7095
  const relationCtx = relationFilterCtx(filterCtx, tableName);
6592
- const filters = single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0;
7096
+ const filters = withScope(
7097
+ scope,
7098
+ tableName,
7099
+ table,
7100
+ single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0
7101
+ );
6593
7102
  if (single) {
6594
7103
  await assertSingleMatch(executor, table, filters, fieldName);
6595
7104
  }
@@ -6648,12 +7157,16 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6648
7157
  attachTargetPrimaryKeys(namedRelations, tables, sqlitePrimaryKeyPropNames);
6649
7158
  const eagerRelations = pruneNonEagerRelations(namedRelations, shouldEagerLoad);
6650
7159
  const filterCtx = { tables, relationMap: namedRelations };
7160
+ const scopes = options.policies?.scope;
7161
+ const contextValuesOf = options.policies?.contextValues;
7162
+ const policies = bindPolicies(options.policies, filterCtx);
6651
7163
  const resolverFactory = createRelationResolverFactory(
6652
7164
  db,
6653
7165
  tables,
6654
7166
  "nulls-smallest",
6655
7167
  filterCtx,
6656
- limits
7168
+ limits,
7169
+ scopes
6657
7170
  );
6658
7171
  const cacheCtx = {
6659
7172
  genericFilterCache: /* @__PURE__ */ new Map(),
@@ -6670,6 +7183,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6670
7183
  complexity,
6671
7184
  limits,
6672
7185
  docs: options.docs ?? {},
7186
+ primaryKeyOf: (name) => tables[name] ? sqlitePrimaryKeyPropNames(tables[name]) : [],
7187
+ contextValuesOf,
6673
7188
  featureOf
6674
7189
  };
6675
7190
  if (features.nestedWrites && db.resultKind === "sync") {
@@ -6685,8 +7200,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6685
7200
  extractRelationJoinColumns
6686
7201
  ) : void 0;
6687
7202
  const nestedTypes = nestedPlans ? createNestedWriteTypes({ plans: nestedPlans, cacheCtx, typeNameMapper, insertPrefix: prefixes.insert }) : void 0;
6688
- const nestedRuntime = nestedPlans ? createNestedWriteRuntime({ plans: nestedPlans, filterCtx }) : void 0;
6689
- const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
7203
+ const nestedRuntime = nestedPlans ? createNestedWriteRuntime({ plans: nestedPlans, filterCtx, scopes, contextValues: contextValuesOf }) : void 0;
7204
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx, scopes) : void 0;
6690
7205
  const queries = {};
6691
7206
  const mutations = {};
6692
7207
  if (options.transactions && db.resultKind === "sync") {
@@ -6718,6 +7233,7 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6718
7233
  const outputs = {};
6719
7234
  for (const [tableName, tableTypes] of Object.entries(gqlSchemaTypes)) {
6720
7235
  const tableFeatures = featureOf(tableName);
7236
+ const drizzleMeta = tableFieldExtensions(tableName, sqlitePrimaryKeyPropNames(schema[tableName]));
6721
7237
  const { insertInput, updateInput, tableFilters, tableOrder } = tableTypes.inputs;
6722
7238
  const { selectSingleOutput, selectArrOutput, singleTableItemOutput, arrTableItemOutput } = tableTypes.outputs;
6723
7239
  const {
@@ -6750,7 +7266,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6750
7266
  typeNameMapper,
6751
7267
  filterCtx,
6752
7268
  tableFeatures.distinct,
6753
- limits
7269
+ limits,
7270
+ policies
6754
7271
  );
6755
7272
  const selectSingleGenerated = generateSelectSingle3(
6756
7273
  db,
@@ -6763,7 +7280,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6763
7280
  typeName,
6764
7281
  typeNameMapper,
6765
7282
  filterCtx,
6766
- limits
7283
+ limits,
7284
+ policies
6767
7285
  );
6768
7286
  const insertArrGenerated = tableFeatures.insert ? generateInsertArray3(
6769
7287
  db,
@@ -6778,7 +7296,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6778
7296
  conflictDoNothing,
6779
7297
  mutationTxCtx,
6780
7298
  nestedRuntime,
6781
- limits
7299
+ limits,
7300
+ policies
6782
7301
  ) : void 0;
6783
7302
  const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle3(
6784
7303
  db,
@@ -6793,7 +7312,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6793
7312
  conflictDoNothing,
6794
7313
  mutationTxCtx,
6795
7314
  nestedRuntime,
6796
- limits
7315
+ limits,
7316
+ policies
6797
7317
  ) : void 0;
6798
7318
  const uniqueSets = tableFeatures.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig3) : [];
6799
7319
  const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
@@ -6819,7 +7339,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6819
7339
  filterCtx,
6820
7340
  mutationTxCtx,
6821
7341
  nestedRuntime,
6822
- limits
7342
+ limits,
7343
+ policies
6823
7344
  ) : void 0;
6824
7345
  const upsertSingleGenerated = onConflictInput ? generateUpsert3(
6825
7346
  db,
@@ -6837,7 +7358,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6837
7358
  filterCtx,
6838
7359
  mutationTxCtx,
6839
7360
  nestedRuntime,
6840
- limits
7361
+ limits,
7362
+ policies
6841
7363
  ) : void 0;
6842
7364
  const updateGenerated = tableFeatures.update ? generateUpdate3(
6843
7365
  db,
@@ -6855,7 +7377,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6855
7377
  filterCtx,
6856
7378
  mutationTxCtx,
6857
7379
  nestedRuntime,
6858
- limits
7380
+ limits,
7381
+ policies
6859
7382
  ) : void 0;
6860
7383
  const updateSingleGenerated = tableFeatures.update ? generateUpdate3(
6861
7384
  db,
@@ -6873,7 +7396,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6873
7396
  filterCtx,
6874
7397
  mutationTxCtx,
6875
7398
  nestedRuntime,
6876
- limits
7399
+ limits,
7400
+ policies
6877
7401
  ) : void 0;
6878
7402
  const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
6879
7403
  const updateManyGenerated = updateManyInput ? generateUpdateMany3(
@@ -6889,7 +7413,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6889
7413
  filterCtx,
6890
7414
  mutationTxCtx,
6891
7415
  nestedRuntime,
6892
- limits
7416
+ limits,
7417
+ policies
6893
7418
  ) : void 0;
6894
7419
  const deleteGenerated = tableFeatures.delete ? generateDelete3(
6895
7420
  db,
@@ -6902,7 +7427,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6902
7427
  tableFeatures.requireWhere,
6903
7428
  filterCtx,
6904
7429
  { tableName, relationMap: namedRelations, tables },
6905
- mutationTxCtx
7430
+ mutationTxCtx,
7431
+ policies
6906
7432
  ) : void 0;
6907
7433
  const deleteSingleGenerated = tableFeatures.delete ? generateDelete3(
6908
7434
  db,
@@ -6915,7 +7441,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6915
7441
  tableFeatures.requireWhere,
6916
7442
  filterCtx,
6917
7443
  { tableName, relationMap: namedRelations, tables },
6918
- mutationTxCtx
7444
+ mutationTxCtx,
7445
+ policies
6919
7446
  ) : void 0;
6920
7447
  const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
6921
7448
  db,
@@ -6949,7 +7476,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6949
7476
  typeName,
6950
7477
  aggregateFieldName,
6951
7478
  tableFilters,
6952
- filterCtx
7479
+ filterCtx,
7480
+ scopes
6953
7481
  ) : void 0;
6954
7482
  const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6955
7483
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
@@ -6963,25 +7491,35 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6963
7491
  tableFilters,
6964
7492
  groupByEnum,
6965
7493
  havingInput,
6966
- filterCtx
7494
+ filterCtx,
7495
+ scopes
6967
7496
  ) : void 0;
6968
7497
  queries[selectArrGenerated.name] = {
6969
7498
  type: selectArrOutput,
6970
7499
  args: selectArrGenerated.args,
6971
7500
  resolve: selectArrGenerated.resolver,
6972
- ...complexity ? { extensions: { complexity: listFieldComplexity(complexity, limits?.(tableName)) } } : {}
7501
+ extensions: {
7502
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: false, targetArg: "where" }),
7503
+ ...complexity ? { complexity: listFieldComplexity(complexity, limits?.(tableName)) } : {}
7504
+ }
6973
7505
  };
6974
7506
  queries[selectSingleGenerated.name] = {
6975
7507
  type: selectSingleOutput,
6976
7508
  args: selectSingleGenerated.args,
6977
- resolve: selectSingleGenerated.resolver
7509
+ resolve: selectSingleGenerated.resolver,
7510
+ extensions: {
7511
+ drizzle: drizzleMeta({ kind: "query", operation: "select", single: true, targetArg: "where" })
7512
+ }
6978
7513
  };
6979
7514
  if (aggregateGenerated && aggregateType) {
6980
7515
  queries[aggregateGenerated.name] = {
6981
7516
  type: new GraphQLNonNull8(aggregateType),
6982
7517
  args: aggregateGenerated.args,
6983
7518
  resolve: aggregateGenerated.resolver,
6984
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
7519
+ extensions: {
7520
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "aggregate", single: true, targetArg: "where" }),
7521
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
7522
+ }
6985
7523
  };
6986
7524
  }
6987
7525
  if (groupByGenerated && groupByType) {
@@ -6989,14 +7527,20 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6989
7527
  type: new GraphQLNonNull8(new GraphQLList8(new GraphQLNonNull8(groupByType))),
6990
7528
  args: groupByGenerated.args,
6991
7529
  resolve: groupByGenerated.resolver,
6992
- ...complexity ? { extensions: { complexity: aggregateFieldComplexity(complexity) } } : {}
7530
+ extensions: {
7531
+ drizzle: drizzleMeta({ kind: "aggregate", operation: "groupBy", single: false, targetArg: "where" }),
7532
+ ...complexity ? { complexity: aggregateFieldComplexity(complexity) } : {}
7533
+ }
6993
7534
  };
6994
7535
  }
6995
7536
  if (insertArrGenerated) {
6996
7537
  mutations[insertArrGenerated.name] = {
6997
7538
  type: arrTableItemOutput,
6998
7539
  args: insertArrGenerated.args,
6999
- resolve: insertArrGenerated.resolver
7540
+ resolve: insertArrGenerated.resolver,
7541
+ extensions: {
7542
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: false, targetArg: "values" })
7543
+ }
7000
7544
  };
7001
7545
  }
7002
7546
  if (insertSingleGenerated) {
@@ -7005,28 +7549,40 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7005
7549
  // `conflictDoNothing` swallowing the insert, so the field is nullable only there.
7006
7550
  type: conflictDoNothing ? singleTableItemOutput : new GraphQLNonNull8(singleTableItemOutput),
7007
7551
  args: insertSingleGenerated.args,
7008
- resolve: insertSingleGenerated.resolver
7552
+ resolve: insertSingleGenerated.resolver,
7553
+ extensions: {
7554
+ drizzle: drizzleMeta({ kind: "mutation", operation: "insert", single: true, targetArg: "values" })
7555
+ }
7009
7556
  };
7010
7557
  }
7011
7558
  if (upsertArrGenerated) {
7012
7559
  mutations[upsertArrGenerated.name] = {
7013
7560
  type: arrTableItemOutput,
7014
7561
  args: upsertArrGenerated.args,
7015
- resolve: upsertArrGenerated.resolver
7562
+ resolve: upsertArrGenerated.resolver,
7563
+ extensions: {
7564
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: false, targetArg: "values" })
7565
+ }
7016
7566
  };
7017
7567
  }
7018
7568
  if (upsertSingleGenerated) {
7019
7569
  mutations[upsertSingleGenerated.name] = {
7020
7570
  type: singleTableItemOutput,
7021
7571
  args: upsertSingleGenerated.args,
7022
- resolve: upsertSingleGenerated.resolver
7572
+ resolve: upsertSingleGenerated.resolver,
7573
+ extensions: {
7574
+ drizzle: drizzleMeta({ kind: "mutation", operation: "upsert", single: true, targetArg: "values" })
7575
+ }
7023
7576
  };
7024
7577
  }
7025
7578
  if (updateGenerated) {
7026
7579
  mutations[updateGenerated.name] = {
7027
7580
  type: arrTableItemOutput,
7028
7581
  args: updateGenerated.args,
7029
- resolve: updateGenerated.resolver
7582
+ resolve: updateGenerated.resolver,
7583
+ extensions: {
7584
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: false, targetArg: "where" })
7585
+ }
7030
7586
  };
7031
7587
  }
7032
7588
  if (updateManyGenerated) {
@@ -7034,6 +7590,9 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7034
7590
  type: new GraphQLNonNull8(new GraphQLList8(singleTableItemOutput)),
7035
7591
  args: updateManyGenerated.args,
7036
7592
  resolve: updateManyGenerated.resolver,
7593
+ extensions: {
7594
+ drizzle: drizzleMeta({ kind: "mutation", operation: "updateMany", single: false, targetArg: "updates" })
7595
+ },
7037
7596
  // The nullable element is deliberate, and the reason this mutation's return type
7038
7597
  // differs from every sibling's: the result is aligned with the input, one slot per
7039
7598
  // entry, so an entry that matched nothing has to be able to say so.
@@ -7044,21 +7603,30 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7044
7603
  mutations[updateSingleGenerated.name] = {
7045
7604
  type: singleTableItemOutput,
7046
7605
  args: updateSingleGenerated.args,
7047
- resolve: updateSingleGenerated.resolver
7606
+ resolve: updateSingleGenerated.resolver,
7607
+ extensions: {
7608
+ drizzle: drizzleMeta({ kind: "mutation", operation: "update", single: true, targetArg: "where" })
7609
+ }
7048
7610
  };
7049
7611
  }
7050
7612
  if (deleteGenerated) {
7051
7613
  mutations[deleteGenerated.name] = {
7052
7614
  type: arrTableItemOutput,
7053
7615
  args: deleteGenerated.args,
7054
- resolve: deleteGenerated.resolver
7616
+ resolve: deleteGenerated.resolver,
7617
+ extensions: {
7618
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: false, targetArg: "where" })
7619
+ }
7055
7620
  };
7056
7621
  }
7057
7622
  if (deleteSingleGenerated) {
7058
7623
  mutations[deleteSingleGenerated.name] = {
7059
7624
  type: singleTableItemOutput,
7060
7625
  args: deleteSingleGenerated.args,
7061
- resolve: deleteSingleGenerated.resolver
7626
+ resolve: deleteSingleGenerated.resolver,
7627
+ extensions: {
7628
+ drizzle: drizzleMeta({ kind: "mutation", operation: "delete", single: true, targetArg: "where" })
7629
+ }
7062
7630
  };
7063
7631
  }
7064
7632
  if (updateCountGenerated) {
@@ -7121,6 +7689,141 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7121
7689
  return { queries, mutations, inputs, types: outputs, fieldResolvers };
7122
7690
  };
7123
7691
 
7692
+ // src/util/selection.ts
7693
+ import { is as is8, Table } from "drizzle-orm";
7694
+ import { getTableConfig as getMySqlTableConfig, MySqlDatabase } from "drizzle-orm/mysql-core";
7695
+ import { getTableConfig as getPgTableConfig, PgAsyncDatabase } from "drizzle-orm/pg-core";
7696
+ import { BaseSQLiteDatabase, getTableConfig as getSQLiteTableConfig } from "drizzle-orm/sqlite-core";
7697
+ import { parseResolveInfo as parseResolveInfo5 } from "graphql-parse-resolve-info";
7698
+ var contextCache = /* @__PURE__ */ new WeakMap();
7699
+ var tableConfigFor = (db) => {
7700
+ if (is8(db, MySqlDatabase)) {
7701
+ return getMySqlTableConfig;
7702
+ }
7703
+ if (is8(db, PgAsyncDatabase)) {
7704
+ return getPgTableConfig;
7705
+ }
7706
+ if (is8(db, BaseSQLiteDatabase)) {
7707
+ return getSQLiteTableConfig;
7708
+ }
7709
+ throw new Error("Drizzle-GraphQL Error: unsupported database instance \u2014 expected a PostgreSQL, MySQL or SQLite one.");
7710
+ };
7711
+ var contextFor = (db) => {
7712
+ const cached = contextCache.get(db);
7713
+ if (cached) {
7714
+ return cached;
7715
+ }
7716
+ const relations = db._.relations ?? {};
7717
+ const schema = db._.fullSchema ?? Object.fromEntries(
7718
+ Object.entries(relations).filter(([, config]) => config?.table != null).map(([key, config]) => [key, config.table])
7719
+ );
7720
+ const tableEntries = Object.entries(schema).filter(([, value]) => is8(value, Table));
7721
+ if (!tableEntries.length) {
7722
+ throw new Error(
7723
+ "Drizzle-GraphQL Error: Schema not found in drizzle instance. Pass relations (from buildRelations/defineRelations) to the drizzle constructor so drizzle-graphql can read your tables."
7724
+ );
7725
+ }
7726
+ const tables = Object.fromEntries(tableEntries);
7727
+ const getTableConfig4 = tableConfigFor(db);
7728
+ const primaryKeyCache = /* @__PURE__ */ new Map();
7729
+ const primaryKeyOf = (tableName) => {
7730
+ let pk = primaryKeyCache.get(tableName);
7731
+ if (!pk) {
7732
+ const table = tables[tableName];
7733
+ pk = table ? getPrimaryKeyPropNamesFromConfig(table, getTableConfig4) : [];
7734
+ primaryKeyCache.set(tableName, pk);
7735
+ }
7736
+ return pk;
7737
+ };
7738
+ const relationMap = buildNamedRelations(relations, tableEntries);
7739
+ attachTargetPrimaryKeys(relationMap, tables, (table) => [...primaryKeyOf(tableNameOf(tables, table))]);
7740
+ const context = {
7741
+ tables,
7742
+ relationMap,
7743
+ filterCtx: { tables, relationMap },
7744
+ primaryKeyOf
7745
+ };
7746
+ contextCache.set(db, context);
7747
+ return context;
7748
+ };
7749
+ var tableNameOf = (tables, table) => Object.keys(tables).find((name) => tables[name] === table) ?? "";
7750
+ var parseInfo = (info) => {
7751
+ if ("fieldsByTypeName" in info) {
7752
+ return info;
7753
+ }
7754
+ return parseResolveInfo5(info, { deep: true });
7755
+ };
7756
+ var selectionToWith = (info, options) => {
7757
+ const { db, table, typeNameMapper } = options;
7758
+ const { tables, relationMap, filterCtx } = contextFor(db);
7759
+ if (!tables[table]) {
7760
+ throw new Error(`Drizzle-GraphQL Error: '${table}' is not a table in the Drizzle schema.`);
7761
+ }
7762
+ if (!relationMap[table]) {
7763
+ return void 0;
7764
+ }
7765
+ const parsed = parseInfo(info);
7766
+ const params = extractRelationsParams(
7767
+ relationMap,
7768
+ tables,
7769
+ table,
7770
+ parsed,
7771
+ resolveTypeName(table, typeNameMapper),
7772
+ typeNameMapper,
7773
+ filterCtx
7774
+ );
7775
+ return params && Object.keys(params).length ? params : void 0;
7776
+ };
7777
+ var resolveSelection = async (info, options) => {
7778
+ const {
7779
+ db,
7780
+ table: tableName,
7781
+ typeNameMapper,
7782
+ executor,
7783
+ single = false,
7784
+ where,
7785
+ orderBy,
7786
+ limit,
7787
+ offset,
7788
+ after
7789
+ } = options;
7790
+ const { tables, relationMap, filterCtx, primaryKeyOf } = contextFor(db);
7791
+ const table = tables[tableName];
7792
+ if (!table) {
7793
+ throw new Error(`Drizzle-GraphQL Error: '${tableName}' is not a table in the Drizzle schema.`);
7794
+ }
7795
+ const parsedInfo = parseInfo(info);
7796
+ if (!parsedInfo) {
7797
+ throw new Error("Drizzle-GraphQL Error: resolveSelection could not read a selection set from the resolve info.");
7798
+ }
7799
+ const source = executor ?? db;
7800
+ const queryBase = source.query?.[tableName];
7801
+ if (!queryBase) {
7802
+ throw new Error(
7803
+ `Drizzle-GraphQL Error: the executor passed to resolveSelection has no relational query builder for '${tableName}'.`
7804
+ );
7805
+ }
7806
+ return runRelationalSelect({
7807
+ queryBase,
7808
+ tables,
7809
+ tableName,
7810
+ table,
7811
+ relationMap,
7812
+ typeName: resolveTypeName(tableName, typeNameMapper),
7813
+ typeNameMapper,
7814
+ parsedInfo,
7815
+ single,
7816
+ where,
7817
+ orderBy,
7818
+ limit,
7819
+ offset,
7820
+ after,
7821
+ filterCtx,
7822
+ pkNames: primaryKeyOf(tableName),
7823
+ db: source
7824
+ });
7825
+ };
7826
+
7124
7827
  // src/index.ts
7125
7828
  var buildSchema = (db, config) => {
7126
7829
  const relations = db._.relations;
@@ -7143,7 +7846,7 @@ var buildSchema = (db, config) => {
7143
7846
  single: config?.suffixes?.single ?? "Single"
7144
7847
  };
7145
7848
  const typeNameMapper = config?.typeNameMapper === "singularize" ? singularizeMapper : config?.typeNameMapper;
7146
- const tableKeys = Object.entries(schema).filter(([, value]) => is8(value, Table)).map(([key]) => key);
7849
+ const tableKeys = Object.entries(schema).filter(([, value]) => is9(value, Table2)).map(([key]) => key);
7147
7850
  const excludedTableNames = new Set(config?.exclude?.tables ?? []);
7148
7851
  const featureTables = tableKeys.filter((key) => !excludedTableNames.has(key));
7149
7852
  const forTable = resolveTableFeatures(config?.features);
@@ -7181,6 +7884,43 @@ var buildSchema = (db, config) => {
7181
7884
  limitPolicyCache.set(tableName, resolved);
7182
7885
  return resolved;
7183
7886
  } : void 0;
7887
+ const scopeConfig = config?.scope;
7888
+ const contextValuesConfig = config?.contextValues;
7889
+ if (scopeConfig || contextValuesConfig) {
7890
+ const tableNames = new Set(tableKeys);
7891
+ for (const [tableName, hook] of Object.entries(scopeConfig ?? {})) {
7892
+ if (!tableNames.has(tableName)) {
7893
+ throw new Error(
7894
+ `Drizzle-GraphQL Error: config.scope names '${tableName}', which is not a table in the Drizzle schema.`
7895
+ );
7896
+ }
7897
+ if (typeof hook !== "function") {
7898
+ throw new Error(`Drizzle-GraphQL Error: config.scope.${tableName} must be a function.`);
7899
+ }
7900
+ }
7901
+ for (const [tableName, columnHooks] of Object.entries(contextValuesConfig ?? {})) {
7902
+ if (!tableNames.has(tableName)) {
7903
+ throw new Error(
7904
+ `Drizzle-GraphQL Error: config.contextValues names '${tableName}', which is not a table in the Drizzle schema.`
7905
+ );
7906
+ }
7907
+ const columns = getColumns6(schema[tableName]);
7908
+ for (const [columnName, hook] of Object.entries(columnHooks)) {
7909
+ if (!columns[columnName]) {
7910
+ throw new Error(
7911
+ `Drizzle-GraphQL Error: config.contextValues names '${tableName}.${columnName}', which is not a column of that table.`
7912
+ );
7913
+ }
7914
+ if (typeof hook !== "function") {
7915
+ throw new Error(`Drizzle-GraphQL Error: config.contextValues.${tableName}.${columnName} must be a function.`);
7916
+ }
7917
+ }
7918
+ }
7919
+ }
7920
+ const policies = scopeConfig || contextValuesConfig ? {
7921
+ scope: scopeConfig ? (tableName) => scopeConfig[tableName] : void 0,
7922
+ contextValues: contextValuesConfig ? (tableName) => contextValuesConfig[tableName] : void 0
7923
+ } : void 0;
7184
7924
  const exclude = config?.exclude;
7185
7925
  if (exclude) {
7186
7926
  const tableNames = new Set(tableKeys);
@@ -7298,6 +8038,7 @@ var buildSchema = (db, config) => {
7298
8038
  enumNameMapper: config?.enumNameMapper,
7299
8039
  transactions,
7300
8040
  limits,
8041
+ policies,
7301
8042
  exclude,
7302
8043
  docs: {
7303
8044
  describeColumn: config?.describeColumn,
@@ -7307,11 +8048,11 @@ var buildSchema = (db, config) => {
7307
8048
  }
7308
8049
  };
7309
8050
  let generatorOutput;
7310
- if (is8(db, MySqlDatabase)) {
8051
+ if (is9(db, MySqlDatabase2)) {
7311
8052
  generatorOutput = generateSchemaData(db, schema, relations, generatorOptions);
7312
- } else if (is8(db, PgAsyncDatabase)) {
8053
+ } else if (is9(db, PgAsyncDatabase2)) {
7313
8054
  generatorOutput = generateSchemaData2(db, schema, relations, generatorOptions);
7314
- } else if (is8(db, BaseSQLiteDatabase)) {
8055
+ } else if (is9(db, BaseSQLiteDatabase2)) {
7315
8056
  generatorOutput = generateSchemaData3(db, schema, relations, generatorOptions);
7316
8057
  } else {
7317
8058
  throw new Error("Drizzle-GraphQL Error: Unknown database instance type");
@@ -7350,9 +8091,14 @@ export {
7350
8091
  createRelationResolverFactory,
7351
8092
  defaultErrorMapper,
7352
8093
  drizzleExecutorKey,
8094
+ drizzleExtension,
7353
8095
  extractFilters,
7354
8096
  extractOrderBy,
7355
8097
  extractRelationJoinColumns,
8098
+ identifyRows,
8099
+ isDrizzleFieldExtension,
8100
+ resolveSelection,
8101
+ selectionToWith,
7356
8102
  singularizeMapper
7357
8103
  };
7358
8104
  //# sourceMappingURL=index.js.map