@vantreeseba/drizzle-graphql 7.5.0 → 7.7.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
@@ -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 {
@@ -1154,7 +1155,7 @@ var batchedPaginatedRelationQuery = async (db, targetTable, foreignCol, whereCon
1154
1155
  }
1155
1156
  return rows;
1156
1157
  };
1157
- var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx, limits) => ({ tableName, relationName, relEntry, isOne }) => {
1158
+ var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx, limits, policies) => ({ tableName, relationName, relEntry, isOne }) => {
1158
1159
  const parentTable = tables[tableName];
1159
1160
  const targetTableName = relEntry.targetTableName;
1160
1161
  const targetTable = tables[targetTableName];
@@ -1176,7 +1177,14 @@ var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx, limits
1176
1177
  if (localValue == null) {
1177
1178
  return isOne ? null : [];
1178
1179
  }
1179
- const { where: whereArg, orderBy: orderByArg, limit: requestedLimit, offset, after } = args ?? {};
1180
+ const {
1181
+ where: whereArg,
1182
+ orderBy: orderByArg,
1183
+ limit: requestedLimit,
1184
+ offset,
1185
+ after,
1186
+ deleted
1187
+ } = args ?? {};
1180
1188
  const limit = applyLimitPolicy(requestedLimit, limitPolicy, `${tableName}.${relationName}`);
1181
1189
  const distinct = (args ?? {}).distinct?.length ? (args ?? {}).distinct : void 0;
1182
1190
  const cursorSelected = !isOne && !!info && selectsCursorField(info, targetTable);
@@ -1207,6 +1215,7 @@ var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx, limits
1207
1215
  orderBy: orderByArg ?? null,
1208
1216
  limit: limit ?? null,
1209
1217
  offset: offset ?? null,
1218
+ deleted: deleted ?? null,
1210
1219
  after: after ?? null,
1211
1220
  distinct: distinct ?? null,
1212
1221
  cursor: cursorEntries ? 1 : 0
@@ -1215,10 +1224,17 @@ var createRelationResolverFactory = (db, tables, nullOrdering, filterCtx, limits
1215
1224
  const loader = getOrCreateLoader(context, loaderKey, async (parentIds) => {
1216
1225
  const executor = resolveExecutor(db, context);
1217
1226
  const uniqueIds = [...new Set(parentIds)];
1218
- let whereCondition = and(
1219
- inArray(foreignCol, uniqueIds),
1220
- whereArg ? extractFilters(targetTable, targetTableName, whereArg, relationFilterCtx(filterCtx, targetTableName)) : void 0,
1221
- cursorValues ? buildCursorCondition(targetTable, cursorEntries, cursorValues, nullOrdering) : void 0
1227
+ const scope = resolveScope(policies, context, filterCtx);
1228
+ let whereCondition = withScope(
1229
+ scope,
1230
+ targetTableName,
1231
+ targetTable,
1232
+ and(
1233
+ inArray(foreignCol, uniqueIds),
1234
+ whereArg ? extractFilters(targetTable, targetTableName, whereArg, relationFilterCtx(filterCtx, targetTableName)) : void 0,
1235
+ cursorValues ? buildCursorCondition(targetTable, cursorEntries, cursorValues, nullOrdering) : void 0
1236
+ ),
1237
+ deleted
1222
1238
  );
1223
1239
  if (distinct) {
1224
1240
  const keys = await selectDistinctKeys({
@@ -2023,7 +2039,8 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
2023
2039
  {
2024
2040
  type: isRequired ? new GraphQLNonNull3(relType) : relType,
2025
2041
  args: {
2026
- where: { type: relSelectData.filters }
2042
+ where: { type: relSelectData.filters },
2043
+ ...deletedArg(cacheCtx.softDeleteOf, targetTableName)
2027
2044
  },
2028
2045
  resolve,
2029
2046
  ...relationDocs,
@@ -2042,6 +2059,7 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
2042
2059
  orderBy: { type: relSelectData.order },
2043
2060
  offset: { type: GraphQLInt3 },
2044
2061
  limit: { type: GraphQLInt3 },
2062
+ ...deletedArg(cacheCtx.softDeleteOf, targetTableName),
2045
2063
  after: {
2046
2064
  type: GraphQLString2,
2047
2065
  description: "Keyset pagination: only return related rows strictly after this cursor (a row's `cursor` field from a previous page of this relation, under the same orderBy)."
@@ -2069,7 +2087,8 @@ var generateSelectFields = (tables, tableName, relationMap, fromTableName, fromR
2069
2087
  {
2070
2088
  type: new GraphQLNonNull3(relationAggregate.type),
2071
2089
  args: {
2072
- where: { type: relSelectData.filters }
2090
+ where: { type: relSelectData.filters },
2091
+ ...deletedArg(cacheCtx.softDeleteOf, targetTableName)
2073
2092
  },
2074
2093
  resolve: relationAggregate.resolve,
2075
2094
  extensions: {
@@ -2124,9 +2143,14 @@ var generateTableTypes = (tableName, tables, relationMap, withReturning, relatio
2124
2143
  const table = tables[tableName];
2125
2144
  const columns = visibleColumns(table);
2126
2145
  const columnEntries = Object.entries(columns);
2146
+ const contextColumns = cacheCtx.contextValuesOf?.(tableName);
2147
+ const markerColumn = cacheCtx.softDeleteOf?.(tableName)?.columnName;
2148
+ const writableEntries = contextColumns || markerColumn ? columnEntries.filter(
2149
+ ([columnName]) => !(contextColumns && columnName in contextColumns) && columnName !== markerColumn
2150
+ ) : columnEntries;
2127
2151
  const relaxedColumns = nestedWrites?.relaxedColumns(tableName);
2128
2152
  const insertFields = Object.fromEntries(
2129
- columnEntries.map(([columnName, column]) => {
2153
+ writableEntries.map(([columnName, column]) => {
2130
2154
  const converted = drizzleColumnToGraphQLType(
2131
2155
  column,
2132
2156
  columnName,
@@ -2142,7 +2166,7 @@ var generateTableTypes = (tableName, tables, relationMap, withReturning, relatio
2142
2166
  })
2143
2167
  );
2144
2168
  const updateFields = Object.fromEntries(
2145
- columnEntries.map(([columnName, column]) => {
2169
+ writableEntries.map(([columnName, column]) => {
2146
2170
  const converted = drizzleColumnToGraphQLType(column, columnName, tableName, true, false, true);
2147
2171
  const operations = cacheCtx.featureOf(tableName).fieldUpdateOperations ? fieldUpdateInputType(column, columnName, tableName) : void 0;
2148
2172
  const field = operations ? { ...converted, type: operations } : converted;
@@ -2665,7 +2689,132 @@ var extractFilters = (table, tableName, filters, relationCtx) => {
2665
2689
  }
2666
2690
  return variants.length ? variants.length > 1 ? and(...variants) : variants[0] : void 0;
2667
2691
  };
2668
- var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, originField, typeNameMapper, _isInitial = false, filterCtx, limits) => {
2692
+ var deletedFilterEnum = new GraphQLEnumType2({
2693
+ name: "DeletedFilter",
2694
+ description: "Which rows a read over a soft-deleting table returns.",
2695
+ values: {
2696
+ EXCLUDE: { value: "EXCLUDE", description: "Only rows that are not marked deleted. The default." },
2697
+ INCLUDE: { value: "INCLUDE", description: "Marked and unmarked rows alike." },
2698
+ ONLY: { value: "ONLY", description: "Only rows that are marked deleted \u2014 a trash view." }
2699
+ }
2700
+ });
2701
+ var resolveSoftDeleteInfo = (table, tableName, declaration) => {
2702
+ const config = typeof declaration === "string" ? { column: declaration } : declaration;
2703
+ const columnName = config?.column;
2704
+ if (typeof columnName !== "string" || !columnName) {
2705
+ throw new Error(
2706
+ `Drizzle-GraphQL Error: config.softDelete.${tableName} must be a column name or an object with a 'column' property.`
2707
+ );
2708
+ }
2709
+ const column = getColumns2(table)[columnName];
2710
+ if (!column) {
2711
+ throw new Error(
2712
+ `Drizzle-GraphQL Error: config.softDelete names '${tableName}.${columnName}', which is not a column of that table.`
2713
+ );
2714
+ }
2715
+ const nullable = !column.notNull;
2716
+ const { type: baseType, constraint } = extractExtendedColumnType2(column);
2717
+ const hasDeleted = "deletedValue" in config && config.deletedValue !== void 0;
2718
+ const writeDeleted = hasDeleted ? typeof config.deletedValue === "function" ? config.deletedValue : () => config.deletedValue : constraint === "date" && baseType === "object" ? () => /* @__PURE__ */ new Date() : baseType === "string" ? () => (/* @__PURE__ */ new Date()).toISOString() : baseType === "number" ? () => Date.now() : baseType === "bigint" ? () => BigInt(Date.now()) : () => true;
2719
+ let marker;
2720
+ if (!nullable) {
2721
+ if (hasDeleted && typeof config.deletedValue !== "function") {
2722
+ marker = config.deletedValue;
2723
+ } else if (!hasDeleted && baseType === "boolean") {
2724
+ marker = true;
2725
+ } else {
2726
+ throw new Error(
2727
+ `Drizzle-GraphQL Error: config.softDelete.${tableName} marks a NOT NULL column ('${columnName}'), so 'deletedValue' must be a constant that means deleted \u2014 not a function, and not omitted for a non-boolean column.`
2728
+ );
2729
+ }
2730
+ }
2731
+ const hasRestored = "restoredValue" in config;
2732
+ const writeRestored = hasRestored ? config.restoredValue : nullable ? null : baseType === "boolean" ? false : void 0;
2733
+ if (!nullable && writeRestored === void 0) {
2734
+ throw new Error(
2735
+ `Drizzle-GraphQL Error: config.softDelete.${tableName} marks a NOT NULL column ('${columnName}'), so 'restoredValue' must say what restoring writes back.`
2736
+ );
2737
+ }
2738
+ return { columnName, column, nullable, writeDeleted, writeRestored, marker };
2739
+ };
2740
+ var softDeletePredicate = (info, table, mode) => {
2741
+ if (mode === "INCLUDE") {
2742
+ return void 0;
2743
+ }
2744
+ const column = table?.[info.columnName] ?? info.column;
2745
+ if (info.nullable) {
2746
+ return mode === "ONLY" ? isNotNull(column) : isNull(column);
2747
+ }
2748
+ return mode === "ONLY" ? eq(column, info.marker) : ne(column, info.marker);
2749
+ };
2750
+ var resolveScope = (policies, context, filterCtx) => {
2751
+ const scopes = policies?.scope;
2752
+ const softDelete = policies?.softDelete;
2753
+ if (!scopes && !softDelete) {
2754
+ return void 0;
2755
+ }
2756
+ return {
2757
+ has: (tableName, mode) => !!scopes?.(tableName) || !!softDelete?.(tableName) && (mode ?? "EXCLUDE") !== "INCLUDE",
2758
+ on: (tableName, table, mode) => {
2759
+ const marked = softDelete?.(tableName);
2760
+ const deleted = marked ? softDeletePredicate(marked, table, mode ?? "EXCLUDE") : void 0;
2761
+ const hook = scopes?.(tableName);
2762
+ if (!hook) {
2763
+ return deleted;
2764
+ }
2765
+ const predicate = hook(context, table);
2766
+ if (predicate === void 0 || predicate === null) {
2767
+ return deleted;
2768
+ }
2769
+ if (is3(predicate, SQL)) {
2770
+ return and(deleted, predicate);
2771
+ }
2772
+ if (typeof predicate !== "object") {
2773
+ throw new GraphQLError4(
2774
+ `Drizzle-GraphQL Error: the scope for '${tableName}' returned a ${typeof predicate}. A scope returns a filter object, a Drizzle SQL expression, or undefined.`
2775
+ );
2776
+ }
2777
+ return and(deleted, extractFilters(table, tableName, predicate, relationFilterCtx(filterCtx, tableName)));
2778
+ }
2779
+ };
2780
+ };
2781
+ var withScope = (scope, tableName, table, condition, mode) => {
2782
+ const predicate = scope?.on(tableName, table, mode);
2783
+ return predicate ? and(condition, predicate) : condition;
2784
+ };
2785
+ var bindPolicies = (policies, filterCtx) => policies?.scope || policies?.contextValues || policies?.softDelete ? {
2786
+ scope: policies.scope || policies.softDelete ? (context) => resolveScope(policies, context, filterCtx) : void 0,
2787
+ contextValues: policies.contextValues,
2788
+ softDelete: policies.softDelete
2789
+ } : void 0;
2790
+ var applyContextValues = (values, hooks, context) => {
2791
+ if (!hooks) {
2792
+ return values;
2793
+ }
2794
+ for (const [columnName, hook] of Object.entries(hooks)) {
2795
+ values[columnName] = hook(context);
2796
+ }
2797
+ return values;
2798
+ };
2799
+ var applyContextValuesAll = (rows, hooks, context) => {
2800
+ if (!hooks) {
2801
+ return rows;
2802
+ }
2803
+ for (const row of rows) {
2804
+ applyContextValues(row, hooks, context);
2805
+ }
2806
+ return rows;
2807
+ };
2808
+ var stripContextValues = (values, hooks) => {
2809
+ if (!hooks) {
2810
+ return values;
2811
+ }
2812
+ for (const columnName of Object.keys(hooks)) {
2813
+ delete values[columnName];
2814
+ }
2815
+ return values;
2816
+ };
2817
+ var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, originField, typeNameMapper, _isInitial = false, filterCtx, limits, scope) => {
2669
2818
  const relationsForTable = relationMap[tableName];
2670
2819
  if (!relationsForTable) {
2671
2820
  return void 0;
@@ -2711,8 +2860,15 @@ var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, ori
2711
2860
  const offset = relationArgs?.offset ?? void 0;
2712
2861
  const limit = is3(relEntry.relation, One2) ? relationArgs?.limit ?? void 0 : applyLimitPolicy(relationArgs?.limit, limits?.(targetTableName), `${tableName}.${relName}`);
2713
2862
  const relWhere = relationArgs?.where;
2714
- thisRecord.where = relWhere ? {
2715
- RAW: (aliasedTable2) => extractFilters(aliasedTable2, relName, relWhere, relationFilterCtx(filterCtx, targetTableName))
2863
+ const relDeleted = relationArgs?.deleted;
2864
+ thisRecord.where = relWhere || scope?.has(targetTableName, relDeleted) ? {
2865
+ RAW: (aliasedTable2) => withScope(
2866
+ scope,
2867
+ targetTableName,
2868
+ aliasedTable2,
2869
+ relWhere ? extractFilters(aliasedTable2, relName, relWhere, relationFilterCtx(filterCtx, targetTableName)) : void 0,
2870
+ relDeleted
2871
+ )
2716
2872
  } : void 0;
2717
2873
  const hasPagination = offset != null || limit != null;
2718
2874
  const pkNames = targetPkNames ?? [];
@@ -2728,14 +2884,15 @@ var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, ori
2728
2884
  typeNameMapper,
2729
2885
  false,
2730
2886
  filterCtx,
2731
- limits
2887
+ limits,
2888
+ scope
2732
2889
  ) : void 0;
2733
2890
  thisRecord.with = relWith;
2734
2891
  args[relName] = thisRecord;
2735
2892
  }
2736
2893
  return args;
2737
2894
  };
2738
- var extractRelationsParams = (relationMap, tables, tableName, info, typeName, typeNameMapper, filterCtx, limits) => {
2895
+ var extractRelationsParams = (relationMap, tables, tableName, info, typeName, typeNameMapper, filterCtx, limits, scope) => {
2739
2896
  if (!info) {
2740
2897
  return void 0;
2741
2898
  }
@@ -2748,7 +2905,8 @@ var extractRelationsParams = (relationMap, tables, tableName, info, typeName, ty
2748
2905
  typeNameMapper,
2749
2906
  true,
2750
2907
  filterCtx,
2751
- limits
2908
+ limits,
2909
+ scope
2752
2910
  );
2753
2911
  };
2754
2912
  var pruneNonEagerRelations = (relationMap, shouldEagerLoad) => {
@@ -3158,7 +3316,8 @@ var prepareMutationRelationColumns = (params) => {
3158
3316
  typeName,
3159
3317
  typeNameMapper,
3160
3318
  void 0,
3161
- params.limits
3319
+ params.limits,
3320
+ params.scope
3162
3321
  ) : void 0;
3163
3322
  const hasRelations = !!(withParams && Object.keys(withParams).length);
3164
3323
  const baseColumns = extractSelectedColumnsFromTreeSQLFormat(parsedInfo.fieldsByTypeName[typeName], table, {
@@ -3234,9 +3393,11 @@ var computeResolverFieldNames = (tableName, typeNameMapper, prefixes, suffixes)
3234
3393
  const updateFieldName = `${prefixes.update}${mapped ? capitalize(mapped.singular) : capitalize(tableName)}`;
3235
3394
  const updateManyFieldName = `${prefixes.update}${mapped ? capitalize(mapped.plural) : capitalize(tableName)}Many`;
3236
3395
  const deleteFieldName = `${prefixes.delete}${mapped ? capitalize(mapped.singular) : capitalize(tableName)}`;
3396
+ const restoreFieldName = `${prefixes.restore ?? "restore"}${mapped ? capitalize(mapped.singular) : capitalize(tableName)}`;
3237
3397
  const writeSingleSuffix = suffixes.single === "" ? "Single" : suffixes.single;
3238
3398
  const updateSingleFieldName = `${updateFieldName}${writeSingleSuffix}`;
3239
3399
  const deleteSingleFieldName = `${deleteFieldName}${writeSingleSuffix}`;
3400
+ const restoreSingleFieldName = `${restoreFieldName}${writeSingleSuffix}`;
3240
3401
  const pluralNoun = mapped ? capitalize(mapped.plural) : capitalize(tableName);
3241
3402
  const updateCountFieldName = `${prefixes.update}${pluralNoun}Count`;
3242
3403
  const deleteCountFieldName = `${prefixes.delete}${pluralNoun}Count`;
@@ -3256,6 +3417,8 @@ var computeResolverFieldNames = (tableName, typeNameMapper, prefixes, suffixes)
3256
3417
  updateCountFieldName,
3257
3418
  deleteFieldName,
3258
3419
  deleteSingleFieldName,
3420
+ restoreFieldName,
3421
+ restoreSingleFieldName,
3259
3422
  deleteCountFieldName
3260
3423
  };
3261
3424
  };
@@ -3360,7 +3523,13 @@ var generateWriteCount = ({
3360
3523
  args: queryArgs
3361
3524
  };
3362
3525
  };
3363
- var selectArrayArgs = (orderArgs, filterArgs, distinctEnum) => ({
3526
+ var deletedArg = (softDelete, tableName) => softDelete?.(tableName) ? {
3527
+ deleted: {
3528
+ type: deletedFilterEnum,
3529
+ description: "Whether rows marked deleted are returned. Defaults to EXCLUDE."
3530
+ }
3531
+ } : {};
3532
+ var selectArrayArgs = (orderArgs, filterArgs, distinctEnum, softDelete, tableName) => ({
3364
3533
  offset: { type: GraphQLInt3 },
3365
3534
  limit: { type: GraphQLInt3 },
3366
3535
  orderBy: { type: orderArgs },
@@ -3369,12 +3538,14 @@ var selectArrayArgs = (orderArgs, filterArgs, distinctEnum) => ({
3369
3538
  type: GraphQLString2,
3370
3539
  description: "Keyset pagination: only return rows strictly after this cursor (a row's `cursor` field from a previous page, under the same orderBy)."
3371
3540
  },
3372
- ...distinctEnum ? { distinct: { type: new GraphQLList3(new GraphQLNonNull3(distinctEnum)) } } : {}
3541
+ ...distinctEnum ? { distinct: { type: new GraphQLList3(new GraphQLNonNull3(distinctEnum)) } } : {},
3542
+ ...deletedArg(softDelete, tableName)
3373
3543
  });
3374
- var selectSingleArgs = (orderArgs, filterArgs) => ({
3544
+ var selectSingleArgs = (orderArgs, filterArgs, softDelete, tableName) => ({
3375
3545
  offset: { type: GraphQLInt3 },
3376
3546
  orderBy: { type: orderArgs },
3377
- where: { type: filterArgs }
3547
+ where: { type: filterArgs },
3548
+ ...deletedArg(softDelete, tableName)
3378
3549
  });
3379
3550
  var runRelationalSelect = async (opts) => {
3380
3551
  const {
@@ -3392,7 +3563,9 @@ var runRelationalSelect = async (opts) => {
3392
3563
  single,
3393
3564
  filterCtx,
3394
3565
  pkNames,
3395
- after
3566
+ after,
3567
+ scope,
3568
+ deleted
3396
3569
  } = opts;
3397
3570
  const distinct = opts.distinct?.length ? opts.distinct : void 0;
3398
3571
  const cursorSelected = !single && isCursorFieldSelected(parsedInfo.fieldsByTypeName[typeName], table);
@@ -3424,7 +3597,13 @@ var runRelationalSelect = async (opts) => {
3424
3597
  tableName,
3425
3598
  distinct,
3426
3599
  pkNames: pkNames ?? [],
3427
- where: where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0,
3600
+ where: withScope(
3601
+ scope,
3602
+ tableName,
3603
+ table,
3604
+ where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0,
3605
+ deleted
3606
+ ),
3428
3607
  orderBy,
3429
3608
  limit: single ? 1 : opts.limit,
3430
3609
  offset
@@ -3451,15 +3630,24 @@ var runRelationalSelect = async (opts) => {
3451
3630
  // exactly the ordering the cursor encodes and the keyset predicate compares against.
3452
3631
  (aliasedTable2) => cursorOrderExprs(aliasedTable2, cursorEntries)
3453
3632
  ) : orderBy ? (aliasedTable2) => extractOrderBy(aliasedTable2, orderBy, relationFilterCtx(filterCtx, tableName), where) : needsDefaultOrder && pkNames?.length ? (aliasedTable2) => primaryKeyOrderExprs(aliasedTable2, pkNames) : void 0,
3454
- where: distinctKeys ? { RAW: (aliasedTable2) => primaryKeyRestriction(aliasedTable2, pkNames, distinctKeys) } : where || cursorValues ? {
3455
- RAW: (aliasedTable2) => and(
3456
- where ? extractFilters(aliasedTable2, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0,
3457
- cursorValues ? buildCursorCondition(
3458
- aliasedTable2,
3459
- cursorEntries,
3460
- cursorValues,
3461
- opts.nullOrdering ?? "nulls-smallest"
3462
- ) : void 0
3633
+ where: distinctKeys ? (
3634
+ // The distinct pass already ran inside the scope, so the keys it picked are in it.
3635
+ { RAW: (aliasedTable2) => primaryKeyRestriction(aliasedTable2, pkNames, distinctKeys) }
3636
+ ) : where || cursorValues || scope?.has(tableName, deleted) ? {
3637
+ RAW: (aliasedTable2) => withScope(
3638
+ scope,
3639
+ tableName,
3640
+ aliasedTable2,
3641
+ and(
3642
+ where ? extractFilters(aliasedTable2, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0,
3643
+ cursorValues ? buildCursorCondition(
3644
+ aliasedTable2,
3645
+ cursorEntries,
3646
+ cursorValues,
3647
+ opts.nullOrdering ?? "nulls-smallest"
3648
+ ) : void 0
3649
+ ),
3650
+ deleted
3463
3651
  )
3464
3652
  } : void 0,
3465
3653
  with: relationMap[tableName] ? extractRelationsParams(
@@ -3470,7 +3658,8 @@ var runRelationalSelect = async (opts) => {
3470
3658
  typeName,
3471
3659
  typeNameMapper,
3472
3660
  filterCtx,
3473
- opts.limits
3661
+ opts.limits,
3662
+ scope
3474
3663
  ) : void 0
3475
3664
  };
3476
3665
  if (single) {
@@ -3807,10 +3996,11 @@ var assembleAggregateRow = (row, request, target) => {
3807
3996
  }
3808
3997
  return result;
3809
3998
  };
3810
- var generateAggregate = (db, tableName, table, typeName, fieldName, filterArgs, filterCtx) => {
3999
+ var generateAggregate = (db, tableName, table, typeName, fieldName, filterArgs, filterCtx, policies) => {
3811
4000
  const target = aggregateTarget(table, tableName, typeName);
3812
4001
  const queryArgs = {
3813
- where: { type: filterArgs }
4002
+ where: { type: filterArgs },
4003
+ ...deletedArg(policies?.softDelete, tableName)
3814
4004
  };
3815
4005
  return {
3816
4006
  name: fieldName,
@@ -3821,8 +4011,15 @@ var generateAggregate = (db, tableName, table, typeName, fieldName, filterArgs,
3821
4011
  return {};
3822
4012
  }
3823
4013
  let query = resolveExecutor(db, context).select(request.selection).from(table);
3824
- if (args.where) {
3825
- query = query.where(extractFilters(table, tableName, args.where, relationFilterCtx(filterCtx, tableName)));
4014
+ const where = withScope(
4015
+ resolveScope(policies, context, filterCtx),
4016
+ tableName,
4017
+ table,
4018
+ args.where ? extractFilters(table, tableName, args.where, relationFilterCtx(filterCtx, tableName)) : void 0,
4019
+ args.deleted
4020
+ );
4021
+ if (where) {
4022
+ query = query.where(where);
3826
4023
  }
3827
4024
  const rows = await query;
3828
4025
  return assembleAggregateRow(rows[0] ?? {}, request, target);
@@ -3834,7 +4031,7 @@ var generateAggregate = (db, tableName, table, typeName, fieldName, filterArgs,
3834
4031
  };
3835
4032
  };
3836
4033
  var GROUP_KEY = "__dgql_group_key";
3837
- var createRelationAggregateFactory = (db, tables, cacheCtx, typeNameMapper, filterCtx) => {
4034
+ var createRelationAggregateFactory = (db, tables, cacheCtx, typeNameMapper, filterCtx, policies) => {
3838
4035
  return ({ tableName, relationName, relEntry }) => {
3839
4036
  const parentTable = tables[tableName];
3840
4037
  const targetTableName = relEntry.targetTableName;
@@ -3861,17 +4058,25 @@ var createRelationAggregateFactory = (db, tables, cacheCtx, typeNameMapper, filt
3861
4058
  return assembleAggregateRow({}, request, target);
3862
4059
  }
3863
4060
  const whereArg = args?.where;
4061
+ const deleted = args?.deleted;
3864
4062
  const argsKey = JSON.stringify({
3865
4063
  where: whereArg ?? null,
4064
+ deleted: deleted ?? null,
3866
4065
  selection: Object.keys(request.selection).sort()
3867
4066
  });
3868
4067
  const loaderKey = `${tableName}::${relationName}::aggregate::${argsKey}`;
3869
4068
  const loader = getOrCreateLoader(context, loaderKey, async (parentIds) => {
3870
4069
  const executor = resolveExecutor(db, context);
3871
4070
  const uniqueIds = [...new Set(parentIds)];
3872
- const whereCondition = and2(
3873
- inArray2(foreignCol, uniqueIds),
3874
- whereArg ? extractFilters(targetTable, targetTableName, whereArg, relationFilterCtx(filterCtx, targetTableName)) : void 0
4071
+ const whereCondition = withScope(
4072
+ resolveScope(policies, context, filterCtx),
4073
+ targetTableName,
4074
+ targetTable,
4075
+ and2(
4076
+ inArray2(foreignCol, uniqueIds),
4077
+ whereArg ? extractFilters(targetTable, targetTableName, whereArg, relationFilterCtx(filterCtx, targetTableName)) : void 0
4078
+ ),
4079
+ deleted
3875
4080
  );
3876
4081
  const rows = await executor.select({ [GROUP_KEY]: foreignCol, ...request.selection }).from(targetTable).where(whereCondition).groupBy(foreignCol);
3877
4082
  const byKey = new Map(rows.map((row) => [row[GROUP_KEY], row]));
@@ -4004,7 +4209,7 @@ var buildHavingCondition = (having, columns) => {
4004
4209
  }
4005
4210
  return conditions.length ? and2(...conditions) : void 0;
4006
4211
  };
4007
- var generateGroupBy = (db, tableName, table, typeName, fieldName, filterArgs, groupByEnum, havingInput, filterCtx) => {
4212
+ var generateGroupBy = (db, tableName, table, typeName, fieldName, filterArgs, groupByEnum, havingInput, filterCtx, policies) => {
4008
4213
  const target = aggregateTarget(table, tableName, typeName);
4009
4214
  const groupable = groupableColumns(table, tableName);
4010
4215
  const columns = getColumns3(table);
@@ -4015,7 +4220,8 @@ var generateGroupBy = (db, tableName, table, typeName, fieldName, filterArgs, gr
4015
4220
  description: "Columns to group by. One result row per distinct combination of their values."
4016
4221
  },
4017
4222
  where: { type: filterArgs, description: "Filters the rows before they are grouped." },
4018
- having: { type: havingInput, description: "Filters the groups after they are aggregated." }
4223
+ having: { type: havingInput, description: "Filters the groups after they are aggregated." },
4224
+ ...deletedArg(policies?.softDelete, tableName)
4019
4225
  };
4020
4226
  return {
4021
4227
  name: fieldName,
@@ -4038,8 +4244,15 @@ var generateGroupBy = (db, tableName, table, typeName, fieldName, filterArgs, gr
4038
4244
  ...request.selection
4039
4245
  };
4040
4246
  let query = resolveExecutor(db, context).select(selection).from(table);
4041
- if (args.where) {
4042
- query = query.where(extractFilters(table, tableName, args.where, relationFilterCtx(filterCtx, tableName)));
4247
+ const where = withScope(
4248
+ resolveScope(policies, context, filterCtx),
4249
+ tableName,
4250
+ table,
4251
+ args.where ? extractFilters(table, tableName, args.where, relationFilterCtx(filterCtx, tableName)) : void 0,
4252
+ args.deleted
4253
+ );
4254
+ if (where) {
4255
+ query = query.where(where);
4043
4256
  }
4044
4257
  query = query.groupBy(...keyColumns.map(([, column]) => column));
4045
4258
  const havingCondition = buildHavingCondition(args.having, columns);
@@ -4065,7 +4278,7 @@ var generateGroupBy = (db, tableName, table, typeName, fieldName, filterArgs, gr
4065
4278
  };
4066
4279
 
4067
4280
  // src/util/builders/mysql.ts
4068
- var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits) => {
4281
+ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits, policies) => {
4069
4282
  const queryBase = db.query[tableName];
4070
4283
  if (!queryBase) {
4071
4284
  throw new Error(
@@ -4078,7 +4291,9 @@ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filter
4078
4291
  const queryArgs = selectArrayArgs(
4079
4292
  orderArgs,
4080
4293
  filterArgs,
4081
- distinctEnabled ? generateDistinctEnum(table, typeName) : void 0
4294
+ distinctEnabled ? generateDistinctEnum(table, typeName) : void 0,
4295
+ policies?.softDelete,
4296
+ tableName
4082
4297
  );
4083
4298
  return {
4084
4299
  name: fieldName,
@@ -4100,6 +4315,7 @@ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filter
4100
4315
  single: false,
4101
4316
  filterCtx,
4102
4317
  limits,
4318
+ scope: policies?.scope?.(context),
4103
4319
  pkNames,
4104
4320
  db: executor,
4105
4321
  // MySQL sorts NULLs as the smallest values (first in ASC).
@@ -4112,14 +4328,14 @@ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filter
4112
4328
  args: queryArgs
4113
4329
  };
4114
4330
  };
4115
- var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits) => {
4331
+ var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits, policies) => {
4116
4332
  const queryBase = db.query[tableName];
4117
4333
  if (!queryBase) {
4118
4334
  throw new Error(
4119
4335
  `Drizzle-GraphQL Error: Table ${tableName} not found in drizzle instance. Did you forget to pass schema to drizzle constructor?`
4120
4336
  );
4121
4337
  }
4122
- const queryArgs = selectSingleArgs(orderArgs, filterArgs);
4338
+ const queryArgs = selectSingleArgs(orderArgs, filterArgs, policies?.softDelete, tableName);
4123
4339
  const table = tables[tableName];
4124
4340
  const pkNames = mysqlPrimaryKeyPropNames(table);
4125
4341
  return {
@@ -4141,6 +4357,7 @@ var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filte
4141
4357
  single: true,
4142
4358
  filterCtx,
4143
4359
  limits,
4360
+ scope: policies?.scope?.(context),
4144
4361
  pkNames,
4145
4362
  db: executor
4146
4363
  });
@@ -4151,7 +4368,7 @@ var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filte
4151
4368
  args: queryArgs
4152
4369
  };
4153
4370
  };
4154
- var generateInsertArray = (db, _tableName, table, baseType, fieldName, txCtx) => {
4371
+ var generateInsertArray = (db, tableName, table, baseType, fieldName, txCtx, policies) => {
4155
4372
  const queryArgs = {
4156
4373
  values: {
4157
4374
  type: new GraphQLNonNull5(new GraphQLList5(new GraphQLNonNull5(baseType)))
@@ -4162,7 +4379,11 @@ var generateInsertArray = (db, _tableName, table, baseType, fieldName, txCtx) =>
4162
4379
  resolver: async (_source, args, context, info) => {
4163
4380
  try {
4164
4381
  return await runMutation(db, context, info, txCtx, async (executor) => {
4165
- const input = remapFromGraphQLArrayInput(args.values, table);
4382
+ const input = applyContextValuesAll(
4383
+ remapFromGraphQLArrayInput(args.values, table),
4384
+ policies?.contextValues?.(tableName),
4385
+ context
4386
+ );
4166
4387
  if (!input.length) {
4167
4388
  throw new GraphQLError6("No values were provided!");
4168
4389
  }
@@ -4176,7 +4397,7 @@ var generateInsertArray = (db, _tableName, table, baseType, fieldName, txCtx) =>
4176
4397
  args: queryArgs
4177
4398
  };
4178
4399
  };
4179
- var generateInsertSingle = (db, _tableName, table, baseType, fieldName, txCtx) => {
4400
+ var generateInsertSingle = (db, tableName, table, baseType, fieldName, txCtx, policies) => {
4180
4401
  const queryArgs = {
4181
4402
  values: {
4182
4403
  type: new GraphQLNonNull5(baseType)
@@ -4187,7 +4408,11 @@ var generateInsertSingle = (db, _tableName, table, baseType, fieldName, txCtx) =
4187
4408
  resolver: async (_source, args, context, info) => {
4188
4409
  try {
4189
4410
  return await runMutation(db, context, info, txCtx, async (executor) => {
4190
- const input = remapFromGraphQLSingleInput(args.values, table);
4411
+ const input = applyContextValues(
4412
+ remapFromGraphQLSingleInput(args.values, table),
4413
+ policies?.contextValues?.(tableName),
4414
+ context
4415
+ );
4191
4416
  await executor.insert(table).values(input);
4192
4417
  return { isSuccess: true };
4193
4418
  });
@@ -4198,7 +4423,7 @@ var generateInsertSingle = (db, _tableName, table, baseType, fieldName, txCtx) =
4198
4423
  args: queryArgs
4199
4424
  };
4200
4425
  };
4201
- var generateUpsert = (db, table, baseType, onConflictType, fieldName, single, txCtx) => {
4426
+ var generateUpsert = (db, tableName, table, baseType, onConflictType, fieldName, single, txCtx, policies) => {
4202
4427
  const queryArgs = {
4203
4428
  values: {
4204
4429
  type: single ? new GraphQLNonNull5(baseType) : new GraphQLNonNull5(new GraphQLList5(new GraphQLNonNull5(baseType)))
@@ -4214,7 +4439,11 @@ var generateUpsert = (db, table, baseType, onConflictType, fieldName, single, tx
4214
4439
  resolver: async (_source, args, context, info) => {
4215
4440
  try {
4216
4441
  return await runMutation(db, context, info, txCtx, async (executor) => {
4217
- const input = single ? [remapFromGraphQLSingleInput(args.values, table)] : remapFromGraphQLArrayInput(args.values, table);
4442
+ const input = applyContextValuesAll(
4443
+ single ? [remapFromGraphQLSingleInput(args.values, table)] : remapFromGraphQLArrayInput(args.values, table),
4444
+ policies?.contextValues?.(tableName),
4445
+ context
4446
+ );
4218
4447
  if (!input.length) {
4219
4448
  throw new GraphQLError6("No values were provided!");
4220
4449
  }
@@ -4241,7 +4470,7 @@ var generateUpsert = (db, table, baseType, onConflictType, fieldName, single, tx
4241
4470
  args: queryArgs
4242
4471
  };
4243
4472
  };
4244
- var generateUpdate = (db, tableName, table, setArgs, filterArgs, fieldName, single, requireWhere, filterCtx, txCtx) => {
4473
+ var generateUpdate = (db, tableName, table, setArgs, filterArgs, fieldName, single, requireWhere, filterCtx, txCtx, policies) => {
4245
4474
  const queryArgs = {
4246
4475
  set: {
4247
4476
  type: new GraphQLNonNull5(setArgs)
@@ -4256,12 +4485,21 @@ var generateUpdate = (db, tableName, table, setArgs, filterArgs, fieldName, sing
4256
4485
  try {
4257
4486
  return await runMutation(db, context, info, txCtx, async (executor) => {
4258
4487
  const { where, set } = args;
4259
- const input = remapUpdateInput(set, table, tableName);
4488
+ const scope = policies?.scope?.(context);
4489
+ const input = stripContextValues(
4490
+ remapUpdateInput(set, table, tableName),
4491
+ policies?.contextValues?.(tableName)
4492
+ );
4260
4493
  if (!Object.keys(input).length) {
4261
4494
  throw new GraphQLError6("Unable to update with no values specified!");
4262
4495
  }
4263
4496
  const relationCtx = relationFilterCtx(filterCtx, tableName);
4264
- const filters = single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0;
4497
+ const filters = withScope(
4498
+ scope,
4499
+ tableName,
4500
+ table,
4501
+ single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0
4502
+ );
4265
4503
  if (single) {
4266
4504
  await assertSingleMatch(executor, table, filters, fieldName);
4267
4505
  }
@@ -4279,7 +4517,7 @@ var generateUpdate = (db, tableName, table, setArgs, filterArgs, fieldName, sing
4279
4517
  args: queryArgs
4280
4518
  };
4281
4519
  };
4282
- var generateUpdateMany = (db, tableName, table, updateManyInput, fieldName, filterCtx, txCtx) => {
4520
+ var generateUpdateMany = (db, tableName, table, updateManyInput, fieldName, filterCtx, txCtx, policies) => {
4283
4521
  const queryArgs = {
4284
4522
  updates: {
4285
4523
  type: new GraphQLNonNull5(new GraphQLList5(new GraphQLNonNull5(updateManyInput)))
@@ -4294,14 +4532,21 @@ var generateUpdateMany = (db, tableName, table, updateManyInput, fieldName, filt
4294
4532
  if (!updates.length) {
4295
4533
  throw new GraphQLError6("No updates were provided!");
4296
4534
  }
4535
+ const scope = policies?.scope?.(context);
4536
+ const contextColumns = policies?.contextValues?.(tableName);
4297
4537
  const entries = updates.map(({ where, set }) => {
4298
- const input = remapUpdateInput(set, table, tableName);
4538
+ const input = stripContextValues(remapUpdateInput(set, table, tableName), contextColumns);
4299
4539
  if (!Object.keys(input).length) {
4300
4540
  throw new GraphQLError6("Unable to update with no values specified!");
4301
4541
  }
4302
4542
  return {
4303
4543
  set: input,
4304
- filters: where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
4544
+ filters: withScope(
4545
+ scope,
4546
+ tableName,
4547
+ table,
4548
+ where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
4549
+ )
4305
4550
  };
4306
4551
  });
4307
4552
  await executor.transaction(async (tx) => {
@@ -4322,7 +4567,8 @@ var generateUpdateMany = (db, tableName, table, updateManyInput, fieldName, filt
4322
4567
  args: queryArgs
4323
4568
  };
4324
4569
  };
4325
- var generateDelete = (db, tableName, table, filterArgs, fieldName, single, requireWhere, filterCtx, txCtx) => {
4570
+ var generateDelete = (db, tableName, table, filterArgs, fieldName, single, requireWhere, filterCtx, txCtx, policies, restore = false) => {
4571
+ const softDelete = policies?.softDelete?.(tableName);
4326
4572
  const queryArgs = {
4327
4573
  where: {
4328
4574
  type: single || requireWhere ? new GraphQLNonNull5(filterArgs) : filterArgs
@@ -4334,12 +4580,19 @@ var generateDelete = (db, tableName, table, filterArgs, fieldName, single, requi
4334
4580
  try {
4335
4581
  return await runMutation(db, context, info, txCtx, async (executor) => {
4336
4582
  const { where } = args;
4583
+ const scope = policies?.scope?.(context);
4337
4584
  const relationCtx = relationFilterCtx(filterCtx, tableName);
4338
- const filters = single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0;
4585
+ const filters = withScope(
4586
+ scope,
4587
+ tableName,
4588
+ table,
4589
+ single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0,
4590
+ restore ? "ONLY" : void 0
4591
+ );
4339
4592
  if (single) {
4340
4593
  await assertSingleMatch(executor, table, filters, fieldName);
4341
4594
  }
4342
- let query = executor.delete(table);
4595
+ let query = softDelete ? executor.update(table).set({ [softDelete.columnName]: restore ? softDelete.writeRestored : softDelete.writeDeleted() }) : executor.delete(table);
4343
4596
  if (filters) {
4344
4597
  query = query.where(filters);
4345
4598
  }
@@ -4383,12 +4636,17 @@ var generateSchemaData = (db, schema, relations, options) => {
4383
4636
  attachTargetPrimaryKeys(namedRelations, tables, mysqlPrimaryKeyPropNames);
4384
4637
  const eagerRelations = pruneNonEagerRelations(namedRelations, shouldEagerLoad);
4385
4638
  const filterCtx = { tables, relationMap: namedRelations };
4639
+ const tablePolicies = options.policies;
4640
+ const contextValuesOf = tablePolicies?.contextValues;
4641
+ const softDeleteOf = tablePolicies?.softDelete;
4642
+ const policies = bindPolicies(tablePolicies, filterCtx);
4386
4643
  const resolverFactory = createRelationResolverFactory(
4387
4644
  db,
4388
4645
  tables,
4389
4646
  "nulls-smallest",
4390
4647
  filterCtx,
4391
- limits
4648
+ limits,
4649
+ tablePolicies
4392
4650
  );
4393
4651
  const cacheCtx = {
4394
4652
  genericFilterCache: /* @__PURE__ */ new Map(),
@@ -4406,9 +4664,11 @@ var generateSchemaData = (db, schema, relations, options) => {
4406
4664
  limits,
4407
4665
  docs: options.docs ?? {},
4408
4666
  primaryKeyOf: (name) => tables[name] ? mysqlPrimaryKeyPropNames(tables[name]) : [],
4667
+ contextValuesOf,
4668
+ softDeleteOf,
4409
4669
  featureOf
4410
4670
  };
4411
- const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
4671
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx, tablePolicies) : void 0;
4412
4672
  const queries = {};
4413
4673
  const mutations = {};
4414
4674
  const mutationTxCtx = createMutationTxCtx(options.transactions);
@@ -4464,8 +4724,11 @@ var generateSchemaData = (db, schema, relations, options) => {
4464
4724
  updateCountFieldName,
4465
4725
  deleteFieldName,
4466
4726
  deleteSingleFieldName,
4727
+ restoreFieldName,
4728
+ restoreSingleFieldName,
4467
4729
  deleteCountFieldName
4468
4730
  } = computeResolverFieldNames(tableName, typeNameMapper, prefixes, suffixes);
4731
+ const softDeleteInfo = softDeleteOf?.(tableName);
4469
4732
  const selectArrGenerated = generateSelectArray(
4470
4733
  db,
4471
4734
  tableName,
@@ -4478,7 +4741,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4478
4741
  typeNameMapper,
4479
4742
  filterCtx,
4480
4743
  tableFeatures.distinct,
4481
- limits
4744
+ limits,
4745
+ policies
4482
4746
  );
4483
4747
  const selectSingleGenerated = generateSelectSingle(
4484
4748
  db,
@@ -4491,7 +4755,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4491
4755
  typeName,
4492
4756
  typeNameMapper,
4493
4757
  filterCtx,
4494
- limits
4758
+ limits,
4759
+ policies
4495
4760
  );
4496
4761
  const insertArrGenerated = tableFeatures.insert ? generateInsertArray(
4497
4762
  db,
@@ -4499,7 +4764,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4499
4764
  schema[tableName],
4500
4765
  insertInput,
4501
4766
  createArrayFieldName,
4502
- mutationTxCtx
4767
+ mutationTxCtx,
4768
+ policies
4503
4769
  ) : void 0;
4504
4770
  const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle(
4505
4771
  db,
@@ -4507,7 +4773,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4507
4773
  schema[tableName],
4508
4774
  insertInput,
4509
4775
  createSingleFieldName,
4510
- mutationTxCtx
4776
+ mutationTxCtx,
4777
+ policies
4511
4778
  ) : void 0;
4512
4779
  const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
4513
4780
  table: schema[tableName],
@@ -4518,21 +4785,25 @@ var generateSchemaData = (db, schema, relations, options) => {
4518
4785
  }) : void 0;
4519
4786
  const upsertArrGenerated = onConflictInput ? generateUpsert(
4520
4787
  db,
4788
+ tableName,
4521
4789
  schema[tableName],
4522
4790
  insertInput,
4523
4791
  onConflictInput,
4524
4792
  upsertArrayFieldName,
4525
4793
  false,
4526
- mutationTxCtx
4794
+ mutationTxCtx,
4795
+ policies
4527
4796
  ) : void 0;
4528
4797
  const upsertSingleGenerated = onConflictInput ? generateUpsert(
4529
4798
  db,
4799
+ tableName,
4530
4800
  schema[tableName],
4531
4801
  insertInput,
4532
4802
  onConflictInput,
4533
4803
  upsertSingleFieldName,
4534
4804
  true,
4535
- mutationTxCtx
4805
+ mutationTxCtx,
4806
+ policies
4536
4807
  ) : void 0;
4537
4808
  const updateGenerated = tableFeatures.update ? generateUpdate(
4538
4809
  db,
@@ -4544,7 +4815,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4544
4815
  false,
4545
4816
  tableFeatures.requireWhere,
4546
4817
  filterCtx,
4547
- mutationTxCtx
4818
+ mutationTxCtx,
4819
+ policies
4548
4820
  ) : void 0;
4549
4821
  const updateSingleGenerated = tableFeatures.update ? generateUpdate(
4550
4822
  db,
@@ -4556,7 +4828,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4556
4828
  true,
4557
4829
  tableFeatures.requireWhere,
4558
4830
  filterCtx,
4559
- mutationTxCtx
4831
+ mutationTxCtx,
4832
+ policies
4560
4833
  ) : void 0;
4561
4834
  const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
4562
4835
  const updateManyGenerated = updateManyInput ? generateUpdateMany(
@@ -4566,7 +4839,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4566
4839
  updateManyInput,
4567
4840
  updateManyFieldName,
4568
4841
  filterCtx,
4569
- mutationTxCtx
4842
+ mutationTxCtx,
4843
+ policies
4570
4844
  ) : void 0;
4571
4845
  const deleteGenerated = tableFeatures.delete ? generateDelete(
4572
4846
  db,
@@ -4577,7 +4851,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4577
4851
  false,
4578
4852
  tableFeatures.requireWhere,
4579
4853
  filterCtx,
4580
- mutationTxCtx
4854
+ mutationTxCtx,
4855
+ policies
4581
4856
  ) : void 0;
4582
4857
  const deleteSingleGenerated = tableFeatures.delete ? generateDelete(
4583
4858
  db,
@@ -4588,7 +4863,34 @@ var generateSchemaData = (db, schema, relations, options) => {
4588
4863
  true,
4589
4864
  tableFeatures.requireWhere,
4590
4865
  filterCtx,
4591
- mutationTxCtx
4866
+ mutationTxCtx,
4867
+ policies
4868
+ ) : void 0;
4869
+ const restoreGenerated = softDeleteInfo ? generateDelete(
4870
+ db,
4871
+ tableName,
4872
+ schema[tableName],
4873
+ tableFilters,
4874
+ restoreFieldName,
4875
+ false,
4876
+ tableFeatures.requireWhere,
4877
+ filterCtx,
4878
+ mutationTxCtx,
4879
+ policies,
4880
+ true
4881
+ ) : void 0;
4882
+ const restoreSingleGenerated = softDeleteInfo ? generateDelete(
4883
+ db,
4884
+ tableName,
4885
+ schema[tableName],
4886
+ tableFilters,
4887
+ restoreSingleFieldName,
4888
+ true,
4889
+ tableFeatures.requireWhere,
4890
+ filterCtx,
4891
+ mutationTxCtx,
4892
+ policies,
4893
+ true
4592
4894
  ) : void 0;
4593
4895
  const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
4594
4896
  db,
@@ -4621,7 +4923,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4621
4923
  typeName,
4622
4924
  aggregateFieldName,
4623
4925
  tableFilters,
4624
- filterCtx
4926
+ filterCtx,
4927
+ tablePolicies
4625
4928
  ) : void 0;
4626
4929
  const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
4627
4930
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
@@ -4635,7 +4938,8 @@ var generateSchemaData = (db, schema, relations, options) => {
4635
4938
  tableFilters,
4636
4939
  groupByEnum,
4637
4940
  havingInput,
4638
- filterCtx
4941
+ filterCtx,
4942
+ tablePolicies
4639
4943
  ) : void 0;
4640
4944
  queries[selectArrGenerated.name] = {
4641
4945
  type: selectArrOutput,
@@ -4685,7 +4989,9 @@ var generateSchemaData = (db, schema, relations, options) => {
4685
4989
  [updateManyGenerated, { operation: "updateMany", single: false, targetArg: "updates" }],
4686
4990
  [updateSingleGenerated, { operation: "update", single: true, targetArg: "where" }],
4687
4991
  [deleteGenerated, { operation: "delete", single: false, targetArg: "where" }],
4688
- [deleteSingleGenerated, { operation: "delete", single: true, targetArg: "where" }]
4992
+ [deleteSingleGenerated, { operation: "delete", single: true, targetArg: "where" }],
4993
+ [restoreGenerated, { operation: "restore", single: false, targetArg: "where" }],
4994
+ [restoreSingleGenerated, { operation: "restore", single: true, targetArg: "where" }]
4689
4995
  ];
4690
4996
  for (const [generated, meta] of generatedMutations) {
4691
4997
  if (generated) {
@@ -4874,8 +5180,9 @@ var createNestedWriteTypes = (params) => {
4874
5180
  return cached;
4875
5181
  }
4876
5182
  const omitted = plan.fkSide === "child" ? plan.foreignColPropName : void 0;
5183
+ const contextColumns = cacheCtx.contextValuesOf?.(plan.targetTableName);
4877
5184
  const fields = Object.fromEntries(
4878
- Object.entries(visibleColumns(plan.targetTable)).filter(([columnName]) => columnName !== omitted).map(([columnName, column]) => [
5185
+ Object.entries(visibleColumns(plan.targetTable)).filter(([columnName]) => columnName !== omitted && !contextColumns?.[columnName]).map(([columnName, column]) => [
4879
5186
  columnName,
4880
5187
  drizzleColumnToGraphQLType(column, columnName, plan.targetTableName, false, true, true)
4881
5188
  ])
@@ -4974,8 +5281,8 @@ var createNestedWriteTypes = (params) => {
4974
5281
  var mergedOps = (entries) => Object.assign({}, ...entries.map((entry) => entry.ops));
4975
5282
  var asArray = (value) => Array.isArray(value) ? value : value === void 0 ? [] : [value];
4976
5283
  var createNestedWriteRuntime = (params) => {
4977
- const { plans, filterCtx } = params;
4978
- const conditionOf = (plan, filter, operation) => {
5284
+ const { plans, filterCtx, policies, contextValues } = params;
5285
+ const conditionOf = (plan, filter, operation, scope) => {
4979
5286
  const condition = extractFilters(
4980
5287
  plan.targetTable,
4981
5288
  plan.targetTableName,
@@ -4987,7 +5294,7 @@ var createNestedWriteRuntime = (params) => {
4987
5294
  `Drizzle-GraphQL Error: '${operation}' on '${plan.relationName}' needs a filter that selects rows \u2014 it was given one that matches everything.`
4988
5295
  );
4989
5296
  }
4990
- return condition;
5297
+ return withScope(scope, plan.targetTableName, plan.targetTable, condition);
4991
5298
  };
4992
5299
  const assertSingleOperation = (plan, op) => {
4993
5300
  const supplied = ["create", "connect", "disconnect"].filter((key) => op[key] !== void 0 && op[key] !== null);
@@ -4997,7 +5304,7 @@ var createNestedWriteRuntime = (params) => {
4997
5304
  );
4998
5305
  }
4999
5306
  };
5000
- const detachAll = async (executor, plan, key) => executor.update(plan.targetTable).set({ [plan.foreignColPropName]: null }).where(eq3(plan.foreignCol, key));
5307
+ 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)));
5001
5308
  return {
5002
5309
  enabled: (tableName) => !!plans[tableName],
5003
5310
  split: (tableName, values) => {
@@ -5031,12 +5338,13 @@ var createNestedWriteRuntime = (params) => {
5031
5338
  }
5032
5339
  return columns;
5033
5340
  },
5034
- applyParentSide: async (executor, tableName, ops) => {
5341
+ applyParentSide: async (executor, tableName, ops, context) => {
5035
5342
  const tablePlans = plans[tableName];
5036
5343
  const patch = {};
5037
5344
  if (!tablePlans) {
5038
5345
  return patch;
5039
5346
  }
5347
+ const scope = resolveScope(policies, context, filterCtx);
5040
5348
  for (const [relationName, op] of Object.entries(ops)) {
5041
5349
  const plan = tablePlans[relationName];
5042
5350
  if (!plan || plan.fkSide !== "parent") {
@@ -5044,7 +5352,11 @@ var createNestedWriteRuntime = (params) => {
5044
5352
  }
5045
5353
  assertSingleOperation(plan, op);
5046
5354
  if (op["create"] !== void 0) {
5047
- const values = remapFromGraphQLSingleInput({ ...op["create"] }, plan.targetTable);
5355
+ const values = applyContextValues(
5356
+ remapFromGraphQLSingleInput({ ...op["create"] }, plan.targetTable),
5357
+ contextValues?.(plan.targetTableName),
5358
+ context
5359
+ );
5048
5360
  const inserted = await executor.insert(plan.targetTable).values(values).returning();
5049
5361
  const created = inserted[0];
5050
5362
  if (!created) {
@@ -5054,7 +5366,7 @@ var createNestedWriteRuntime = (params) => {
5054
5366
  }
5055
5367
  patch[plan.localColPropName] = created[plan.foreignColPropName];
5056
5368
  } else if (op["connect"] !== void 0) {
5057
- const rows = await executor.select().from(plan.targetTable).where(conditionOf(plan, op["connect"], "connect"));
5369
+ const rows = await executor.select().from(plan.targetTable).where(conditionOf(plan, op["connect"], "connect", scope));
5058
5370
  if (rows.length !== 1) {
5059
5371
  throw new GraphQLError7(
5060
5372
  `Drizzle-GraphQL Error: 'connect' on '${relationName}' matched ${rows.length} rows \u2014 it attaches a single row, so its filter must match exactly one.`
@@ -5067,11 +5379,12 @@ var createNestedWriteRuntime = (params) => {
5067
5379
  }
5068
5380
  return patch;
5069
5381
  },
5070
- applyChildSide: async (executor, tableName, ops, parentRows) => {
5382
+ applyChildSide: async (executor, tableName, ops, parentRows, context) => {
5071
5383
  const tablePlans = plans[tableName];
5072
5384
  if (!tablePlans) {
5073
5385
  return;
5074
5386
  }
5387
+ const scope = resolveScope(policies, context, filterCtx);
5075
5388
  for (const [relationName, op] of Object.entries(ops)) {
5076
5389
  const plan = tablePlans[relationName];
5077
5390
  if (!plan || plan.fkSide !== "child") {
@@ -5088,34 +5401,38 @@ var createNestedWriteRuntime = (params) => {
5088
5401
  );
5089
5402
  }
5090
5403
  if (op["set"] !== void 0) {
5091
- await detachAll(executor, plan, key);
5404
+ await detachAll(executor, plan, key, scope);
5092
5405
  for (const filter of asArray(op["set"])) {
5093
- await executor.update(plan.targetTable).set({ [plan.foreignColPropName]: key }).where(conditionOf(plan, filter, "set"));
5406
+ await executor.update(plan.targetTable).set({ [plan.foreignColPropName]: key }).where(conditionOf(plan, filter, "set", scope));
5094
5407
  }
5095
5408
  }
5096
5409
  if (op["disconnect"] !== void 0) {
5097
5410
  if (plan.isOne) {
5098
5411
  if (op["disconnect"] === true) {
5099
- await detachAll(executor, plan, key);
5412
+ await detachAll(executor, plan, key, scope);
5100
5413
  }
5101
5414
  } else {
5102
5415
  for (const filter of asArray(op["disconnect"])) {
5103
- await executor.update(plan.targetTable).set({ [plan.foreignColPropName]: null }).where(and3(eq3(plan.foreignCol, key), conditionOf(plan, filter, "disconnect")));
5416
+ await executor.update(plan.targetTable).set({ [plan.foreignColPropName]: null }).where(and3(eq3(plan.foreignCol, key), conditionOf(plan, filter, "disconnect", scope)));
5104
5417
  }
5105
5418
  }
5106
5419
  }
5107
5420
  const attaches = op["connect"] !== void 0 || op["create"] !== void 0;
5108
5421
  if (plan.isOne && attaches && plan.canDetach && op["set"] === void 0) {
5109
- await detachAll(executor, plan, key);
5422
+ await detachAll(executor, plan, key, scope);
5110
5423
  }
5111
5424
  if (op["connect"] !== void 0) {
5112
5425
  for (const filter of asArray(op["connect"])) {
5113
- await executor.update(plan.targetTable).set({ [plan.foreignColPropName]: key }).where(conditionOf(plan, filter, "connect"));
5426
+ await executor.update(plan.targetTable).set({ [plan.foreignColPropName]: key }).where(conditionOf(plan, filter, "connect", scope));
5114
5427
  }
5115
5428
  }
5116
5429
  if (op["create"] !== void 0) {
5117
5430
  const rows = asArray(op["create"]).map((row) => ({
5118
- ...remapFromGraphQLSingleInput({ ...row }, plan.targetTable),
5431
+ ...applyContextValues(
5432
+ remapFromGraphQLSingleInput({ ...row }, plan.targetTable),
5433
+ contextValues?.(plan.targetTableName),
5434
+ context
5435
+ ),
5119
5436
  [plan.foreignColPropName]: key
5120
5437
  }));
5121
5438
  if (rows.length) {
@@ -5128,30 +5445,30 @@ var createNestedWriteRuntime = (params) => {
5128
5445
  };
5129
5446
  };
5130
5447
  var writeWithNestedOps = async (params) => {
5131
- const { executor, runtime, tableName, entries, remapValues, write } = params;
5448
+ const { executor, runtime, tableName, entries, remapValues, write, context } = params;
5132
5449
  return executor.transaction(async (tx) => {
5133
5450
  const rows = [];
5134
5451
  for (const entry of entries) {
5135
- const patch = await runtime.applyParentSide(tx, tableName, entry.ops);
5452
+ const patch = await runtime.applyParentSide(tx, tableName, entry.ops, context);
5136
5453
  const written = await write(tx, { ...remapValues(entry.columns), ...patch });
5137
- await runtime.applyChildSide(tx, tableName, entry.ops, written);
5454
+ await runtime.applyChildSide(tx, tableName, entry.ops, written, context);
5138
5455
  rows.push(...written);
5139
5456
  }
5140
5457
  return rows;
5141
5458
  });
5142
5459
  };
5143
5460
  var updateWithNestedOps = async (params) => {
5144
- const { executor, runtime, tableName, columns, ops, remapValues, write } = params;
5461
+ const { executor, runtime, tableName, columns, ops, remapValues, write, context } = params;
5145
5462
  return executor.transaction(async (tx) => {
5146
- const patch = await runtime.applyParentSide(tx, tableName, ops);
5463
+ const patch = await runtime.applyParentSide(tx, tableName, ops, context);
5147
5464
  const rows = await write(tx, { ...remapValues(columns), ...patch });
5148
- await runtime.applyChildSide(tx, tableName, ops, rows);
5465
+ await runtime.applyChildSide(tx, tableName, ops, rows, context);
5149
5466
  return rows;
5150
5467
  });
5151
5468
  };
5152
5469
 
5153
5470
  // src/util/builders/pg.ts
5154
- var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits) => {
5471
+ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits, policies) => {
5155
5472
  const queryBase = db.query[tableName];
5156
5473
  const table = tables[tableName];
5157
5474
  const limitPolicy = limits?.(tableName);
@@ -5159,7 +5476,9 @@ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filte
5159
5476
  const queryArgs = selectArrayArgs(
5160
5477
  orderArgs,
5161
5478
  filterArgs,
5162
- distinctEnabled ? generateDistinctEnum(table, typeName) : void 0
5479
+ distinctEnabled ? generateDistinctEnum(table, typeName) : void 0,
5480
+ policies?.softDelete,
5481
+ tableName
5163
5482
  );
5164
5483
  return {
5165
5484
  name: fieldName,
@@ -5167,6 +5486,7 @@ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filte
5167
5486
  try {
5168
5487
  const parsedInfo = parseResolveInfo3(info, { deep: true });
5169
5488
  const { executor, queryBase: requestQueryBase } = resolveQueryExecutor(db, context, tableName, queryBase);
5489
+ const scope = policies?.scope?.(context);
5170
5490
  const limit = applyLimitPolicy(args.limit, limitPolicy, fieldName);
5171
5491
  if (requestQueryBase) {
5172
5492
  return await runRelationalSelect({
@@ -5185,11 +5505,12 @@ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filte
5185
5505
  limits,
5186
5506
  pkNames,
5187
5507
  db: executor,
5508
+ scope,
5188
5509
  // PostgreSQL sorts NULLs as the largest values (last in ASC).
5189
5510
  nullOrdering: "nulls-largest"
5190
5511
  });
5191
5512
  }
5192
- const { offset, orderBy, where, distinct, after } = args;
5513
+ const { offset, orderBy, where, distinct, after, deleted } = args;
5193
5514
  const selectedColumnsSql = extractSelectedColumnsFromTreeSQLFormat(
5194
5515
  parsedInfo.fieldsByTypeName[typeName],
5195
5516
  table,
@@ -5223,7 +5544,13 @@ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filte
5223
5544
  }
5224
5545
  }
5225
5546
  const cursorCondition = after != null && cursorEntries ? buildCursorCondition(table, cursorEntries, decodeCursor(after, cursorEntries), "nulls-largest") : void 0;
5226
- const baseWhereSql = where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0;
5547
+ const baseWhereSql = withScope(
5548
+ scope,
5549
+ tableName,
5550
+ table,
5551
+ where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0,
5552
+ deleted
5553
+ );
5227
5554
  const whereSql = cursorCondition ? and4(baseWhereSql, cursorCondition) : baseWhereSql;
5228
5555
  let distinctKeys;
5229
5556
  if (distinct?.length) {
@@ -5278,9 +5605,9 @@ var generateSelectArray2 = (db, tableName, tables, relationMap, orderArgs, filte
5278
5605
  args: queryArgs
5279
5606
  };
5280
5607
  };
5281
- var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits) => {
5608
+ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits, policies) => {
5282
5609
  const queryBase = db.query[tableName];
5283
- const queryArgs = selectSingleArgs(orderArgs, filterArgs);
5610
+ const queryArgs = selectSingleArgs(orderArgs, filterArgs, policies?.softDelete, tableName);
5284
5611
  const table = tables[tableName];
5285
5612
  const pkNames = pgPrimaryKeyPropNames(table);
5286
5613
  return {
@@ -5289,6 +5616,7 @@ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filt
5289
5616
  try {
5290
5617
  const parsedInfo = parseResolveInfo3(info, { deep: true });
5291
5618
  const { executor, queryBase: requestQueryBase } = resolveQueryExecutor(db, context, tableName, queryBase);
5619
+ const scope = policies?.scope?.(context);
5292
5620
  if (requestQueryBase) {
5293
5621
  return await runRelationalSelect({
5294
5622
  queryBase: requestQueryBase,
@@ -5304,18 +5632,26 @@ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filt
5304
5632
  filterCtx,
5305
5633
  limits,
5306
5634
  pkNames,
5307
- db: executor
5635
+ db: executor,
5636
+ scope
5308
5637
  });
5309
5638
  }
5310
- const { offset, orderBy, where } = args;
5639
+ const { offset, orderBy, where, deleted } = args;
5311
5640
  const selectedColumnsSql = extractSelectedColumnsFromTreeSQLFormat(
5312
5641
  parsedInfo.fieldsByTypeName[typeName],
5313
5642
  table,
5314
5643
  { tableName, relationMap, tables }
5315
5644
  );
5316
5645
  let q = executor.select(selectedColumnsSql).from(table);
5317
- if (where) {
5318
- q = q.where(extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)));
5646
+ const whereSql = withScope(
5647
+ scope,
5648
+ tableName,
5649
+ table,
5650
+ where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0,
5651
+ deleted
5652
+ );
5653
+ if (whereSql) {
5654
+ q = q.where(whereSql);
5319
5655
  }
5320
5656
  if (orderBy) {
5321
5657
  q = q.orderBy(...extractOrderBy(table, orderBy, relationFilterCtx(filterCtx, tableName), where));
@@ -5336,7 +5672,7 @@ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filt
5336
5672
  };
5337
5673
  };
5338
5674
  var pgPrimaryKeyPropNames = (table) => getPrimaryKeyPropNamesFromConfig(table, getTableConfig2);
5339
- var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
5675
+ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits, policies) => {
5340
5676
  const queryArgs = {
5341
5677
  values: {
5342
5678
  type: new GraphQLNonNull7(new GraphQLList7(new GraphQLNonNull7(baseType)))
@@ -5353,7 +5689,13 @@ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType,
5353
5689
  }
5354
5690
  const entries = nested?.enabled(tableName) ? args.values.map((values) => nested.split(tableName, values)) : void 0;
5355
5691
  const nestedEntries = entries?.some((entry) => nested.hasOps(entry.ops)) ? entries : void 0;
5356
- const input = nestedEntries ? [] : remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : args.values, table);
5692
+ const contextColumns = policies?.contextValues?.(tableName);
5693
+ const scope = policies?.scope?.(context);
5694
+ const input = nestedEntries ? [] : applyContextValuesAll(
5695
+ remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : args.values, table),
5696
+ contextColumns,
5697
+ context
5698
+ );
5357
5699
  const parsedInfo = parseResolveInfo3(info, {
5358
5700
  deep: true
5359
5701
  });
@@ -5366,7 +5708,8 @@ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType,
5366
5708
  table,
5367
5709
  pkNames,
5368
5710
  parsedInfo,
5369
- limits
5711
+ limits,
5712
+ scope
5370
5713
  });
5371
5714
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
5372
5715
  const runInsert = async (target, values) => {
@@ -5381,8 +5724,9 @@ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType,
5381
5724
  runtime: nested,
5382
5725
  tableName,
5383
5726
  entries: nestedEntries,
5384
- remapValues: (values) => remapFromGraphQLSingleInput(values, table),
5385
- write: (tx, values) => runInsert(tx, [values])
5727
+ remapValues: (values) => applyContextValues(remapFromGraphQLSingleInput(values, table), contextColumns, context),
5728
+ write: (tx, values) => runInsert(tx, [values]),
5729
+ context
5386
5730
  }) : await runInsert(executor, input);
5387
5731
  const enriched = hasRelations ? await eagerLoadMutationRelations(executor, tableName, result, pkNames, withParams) : result;
5388
5732
  return remapToGraphQLArrayOutput(enriched, tableName, table, relationMap);
@@ -5394,7 +5738,7 @@ var generateInsertArray2 = (db, tableName, table, tables, relationMap, baseType,
5394
5738
  args: queryArgs
5395
5739
  };
5396
5740
  };
5397
- var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
5741
+ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits, policies) => {
5398
5742
  const queryArgs = {
5399
5743
  values: {
5400
5744
  type: new GraphQLNonNull7(baseType)
@@ -5408,7 +5752,13 @@ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType
5408
5752
  return await runMutation(db, context, info, txCtx, async (executor) => {
5409
5753
  const entry = nested?.enabled(tableName) ? nested.split(tableName, args.values) : void 0;
5410
5754
  const nestedEntry = entry && nested.hasOps(entry.ops) ? entry : void 0;
5411
- const input = nestedEntry ? {} : remapFromGraphQLSingleInput(entry ? entry.columns : args.values, table);
5755
+ const contextColumns = policies?.contextValues?.(tableName);
5756
+ const scope = policies?.scope?.(context);
5757
+ const input = nestedEntry ? {} : applyContextValues(
5758
+ remapFromGraphQLSingleInput(entry ? entry.columns : args.values, table),
5759
+ contextColumns,
5760
+ context
5761
+ );
5412
5762
  const parsedInfo = parseResolveInfo3(info, {
5413
5763
  deep: true
5414
5764
  });
@@ -5421,7 +5771,8 @@ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType
5421
5771
  table,
5422
5772
  pkNames,
5423
5773
  parsedInfo,
5424
- limits
5774
+ limits,
5775
+ scope
5425
5776
  });
5426
5777
  const returning = nestedEntry ? nested.withJoinColumns(tableName, nestedEntry.ops, { ...columns }, table) : columns;
5427
5778
  const runInsert = async (target, values) => {
@@ -5436,8 +5787,9 @@ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType
5436
5787
  runtime: nested,
5437
5788
  tableName,
5438
5789
  entries: [nestedEntry],
5439
- remapValues: (values) => remapFromGraphQLSingleInput(values, table),
5440
- write: runInsert
5790
+ remapValues: (values) => applyContextValues(remapFromGraphQLSingleInput(values, table), contextColumns, context),
5791
+ write: runInsert,
5792
+ context
5441
5793
  }) : await runInsert(executor, input);
5442
5794
  if (!result[0]) {
5443
5795
  if (!conflictDoNothing) {
@@ -5455,7 +5807,7 @@ var generateInsertSingle2 = (db, tableName, table, tables, relationMap, baseType
5455
5807
  args: queryArgs
5456
5808
  };
5457
5809
  };
5458
- var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested, limits) => {
5810
+ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested, limits, policies) => {
5459
5811
  const queryArgs = {
5460
5812
  values: {
5461
5813
  type: single ? new GraphQLNonNull7(baseType) : new GraphQLNonNull7(new GraphQLList7(new GraphQLNonNull7(baseType)))
@@ -5477,7 +5829,13 @@ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onCo
5477
5829
  }
5478
5830
  const entries = nested?.enabled(tableName) ? supplied.map((values) => nested.split(tableName, values)) : void 0;
5479
5831
  const nestedEntries = entries?.some((entry) => nested.hasOps(entry.ops)) ? entries : void 0;
5480
- const input = nestedEntries ? [] : remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : supplied, table);
5832
+ const contextColumns = policies?.contextValues?.(tableName);
5833
+ const scope = policies?.scope?.(context);
5834
+ const input = nestedEntries ? [] : applyContextValuesAll(
5835
+ remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : supplied, table),
5836
+ contextColumns,
5837
+ context
5838
+ );
5481
5839
  const parsedInfo = parseResolveInfo3(info, { deep: true });
5482
5840
  const { columns, hasRelations, withParams } = prepareMutationRelationColumns({
5483
5841
  relationMap,
@@ -5488,7 +5846,8 @@ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onCo
5488
5846
  table,
5489
5847
  pkNames,
5490
5848
  parsedInfo,
5491
- limits
5849
+ limits,
5850
+ scope
5492
5851
  });
5493
5852
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
5494
5853
  const runUpsert = async (target, values) => {
@@ -5503,7 +5862,8 @@ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onCo
5503
5862
  buildWhere: (where) => extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName))
5504
5863
  });
5505
5864
  let query = target.insert(table).values(values).returning(returning);
5506
- query = plan.action === "NOTHING" ? query.onConflictDoNothing(plan.target ? { target: plan.target } : void 0) : query.onConflictDoUpdate({ target: plan.target, set: plan.set, setWhere: plan.setWhere });
5865
+ const setWhere = withScope(scope, tableName, table, plan.setWhere);
5866
+ query = plan.action === "NOTHING" ? query.onConflictDoNothing(plan.target ? { target: plan.target } : void 0) : query.onConflictDoUpdate({ target: plan.target, set: plan.set, setWhere });
5507
5867
  return await query;
5508
5868
  };
5509
5869
  const result = nestedEntries ? await writeWithNestedOps({
@@ -5511,8 +5871,9 @@ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onCo
5511
5871
  runtime: nested,
5512
5872
  tableName,
5513
5873
  entries: nestedEntries,
5514
- remapValues: (values) => remapFromGraphQLSingleInput(values, table),
5515
- write: (tx, values) => runUpsert(tx, [values])
5874
+ remapValues: (values) => applyContextValues(remapFromGraphQLSingleInput(values, table), contextColumns, context),
5875
+ write: (tx, values) => runUpsert(tx, [values]),
5876
+ context
5516
5877
  }) : await runUpsert(executor, input);
5517
5878
  if (single && !result[0]) {
5518
5879
  return void 0;
@@ -5527,7 +5888,7 @@ var generateUpsert2 = (db, tableName, table, tables, relationMap, baseType, onCo
5527
5888
  args: queryArgs
5528
5889
  };
5529
5890
  };
5530
- var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested, limits) => {
5891
+ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested, limits, policies) => {
5531
5892
  const queryArgs = {
5532
5893
  set: {
5533
5894
  type: new GraphQLNonNull7(setArgs)
@@ -5543,6 +5904,7 @@ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filte
5543
5904
  try {
5544
5905
  return await runMutation(db, context, info, txCtx, async (executor) => {
5545
5906
  const { where, set } = args;
5907
+ const scope = policies?.scope?.(context);
5546
5908
  const parsedInfo = parseResolveInfo3(info, {
5547
5909
  deep: true
5548
5910
  });
@@ -5555,16 +5917,25 @@ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filte
5555
5917
  table,
5556
5918
  pkNames,
5557
5919
  parsedInfo,
5558
- limits
5920
+ limits,
5921
+ scope
5559
5922
  });
5560
5923
  const entry = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
5561
5924
  const nestedOps = entry && nested.hasOps(entry.ops) ? entry.ops : void 0;
5562
- const input = remapUpdateInput(entry ? entry.columns : set, table, tableName);
5925
+ const input = stripContextValues(
5926
+ remapUpdateInput(entry ? entry.columns : set, table, tableName),
5927
+ policies?.contextValues?.(tableName)
5928
+ );
5563
5929
  if (!Object.keys(input).length && !nestedOps) {
5564
5930
  throw new GraphQLError8("Unable to update with no values specified!");
5565
5931
  }
5566
5932
  const relationCtx = relationFilterCtx(filterCtx, tableName);
5567
- const filters = single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0;
5933
+ const filters = withScope(
5934
+ scope,
5935
+ tableName,
5936
+ table,
5937
+ single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0
5938
+ );
5568
5939
  if (single) {
5569
5940
  await assertSingleMatch(executor, table, filters, fieldName);
5570
5941
  }
@@ -5584,7 +5955,8 @@ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filte
5584
5955
  columns: input,
5585
5956
  ops: nestedOps,
5586
5957
  remapValues: (values) => values,
5587
- write: runUpdate
5958
+ write: runUpdate,
5959
+ context
5588
5960
  }) : await runUpdate(executor, input);
5589
5961
  if (single && result.length > 1) {
5590
5962
  throw new GraphQLError8(`${fieldName}: 'where' matched more than one row!`);
@@ -5602,7 +5974,7 @@ var generateUpdate2 = (db, tableName, table, tables, relationMap, setArgs, filte
5602
5974
  args: queryArgs
5603
5975
  };
5604
5976
  };
5605
- var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested, limits) => {
5977
+ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested, limits, policies) => {
5606
5978
  const queryArgs = {
5607
5979
  updates: {
5608
5980
  type: new GraphQLNonNull7(new GraphQLList7(new GraphQLNonNull7(updateManyInput)))
@@ -5618,6 +5990,8 @@ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateMany
5618
5990
  if (!updates.length) {
5619
5991
  throw new GraphQLError8("No updates were provided!");
5620
5992
  }
5993
+ const scope = policies?.scope?.(context);
5994
+ const contextColumns = policies?.contextValues?.(tableName);
5621
5995
  const parsedInfo = parseResolveInfo3(info, {
5622
5996
  deep: true
5623
5997
  });
@@ -5630,19 +6004,28 @@ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateMany
5630
6004
  table,
5631
6005
  pkNames,
5632
6006
  parsedInfo,
5633
- limits
6007
+ limits,
6008
+ scope
5634
6009
  });
5635
6010
  const entries = updates.map(({ where, set }) => {
5636
6011
  const split = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
5637
6012
  const ops = split && nested.hasOps(split.ops) ? split.ops : void 0;
5638
- const input = remapUpdateInput(split ? split.columns : set, table, tableName);
6013
+ const input = stripContextValues(
6014
+ remapUpdateInput(split ? split.columns : set, table, tableName),
6015
+ contextColumns
6016
+ );
5639
6017
  if (!Object.keys(input).length && !ops) {
5640
6018
  throw new GraphQLError8("Unable to update with no values specified!");
5641
6019
  }
5642
6020
  return {
5643
6021
  set: input,
5644
6022
  ops,
5645
- filters: where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
6023
+ filters: withScope(
6024
+ scope,
6025
+ tableName,
6026
+ table,
6027
+ where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
6028
+ )
5646
6029
  };
5647
6030
  });
5648
6031
  const returning = entries.some((entry) => entry.ops) ? nested.withJoinColumns(
@@ -5656,7 +6039,7 @@ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateMany
5656
6039
  const perEntry = await executor.transaction(async (tx) => {
5657
6040
  const results = [];
5658
6041
  for (const entry of entries) {
5659
- const values = entry.ops ? { ...entry.set, ...await nested.applyParentSide(tx, tableName, entry.ops) } : entry.set;
6042
+ const values = entry.ops ? { ...entry.set, ...await nested.applyParentSide(tx, tableName, entry.ops, context) } : entry.set;
5660
6043
  const writes = Object.keys(values).length > 0;
5661
6044
  let query = writes ? tx.update(table).set(values) : tx.select(returning).from(table);
5662
6045
  if (entry.filters) {
@@ -5664,7 +6047,7 @@ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateMany
5664
6047
  }
5665
6048
  const rows = await (writes ? query.returning(returning) : query);
5666
6049
  if (entry.ops) {
5667
- await nested.applyChildSide(tx, tableName, entry.ops, rows);
6050
+ await nested.applyChildSide(tx, tableName, entry.ops, rows, context);
5668
6051
  }
5669
6052
  results.push(rows);
5670
6053
  }
@@ -5693,7 +6076,8 @@ var generateUpdateMany2 = (db, tableName, table, tables, relationMap, updateMany
5693
6076
  args: queryArgs
5694
6077
  };
5695
6078
  };
5696
- var generateDelete2 = (db, tableName, table, filterArgs, fieldName, typeName, single, requireWhere, filterCtx, selectionCtx, txCtx) => {
6079
+ var generateDelete2 = (db, tableName, table, filterArgs, fieldName, typeName, single, requireWhere, filterCtx, selectionCtx, txCtx, policies, restore = false) => {
6080
+ const softDelete = policies?.softDelete?.(tableName);
5697
6081
  const queryArgs = {
5698
6082
  where: {
5699
6083
  type: single || requireWhere ? new GraphQLNonNull7(filterArgs) : filterArgs
@@ -5705,6 +6089,7 @@ var generateDelete2 = (db, tableName, table, filterArgs, fieldName, typeName, si
5705
6089
  try {
5706
6090
  return await runMutation(db, context, info, txCtx, async (executor) => {
5707
6091
  const { where } = args;
6092
+ const scope = policies?.scope?.(context);
5708
6093
  const parsedInfo = parseResolveInfo3(info, {
5709
6094
  deep: true
5710
6095
  });
@@ -5714,11 +6099,17 @@ var generateDelete2 = (db, tableName, table, filterArgs, fieldName, typeName, si
5714
6099
  selectionCtx
5715
6100
  );
5716
6101
  const relationCtx = relationFilterCtx(filterCtx, tableName);
5717
- const filters = single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0;
6102
+ const filters = withScope(
6103
+ scope,
6104
+ tableName,
6105
+ table,
6106
+ single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0,
6107
+ restore ? "ONLY" : void 0
6108
+ );
5718
6109
  if (single) {
5719
6110
  await assertSingleMatch(executor, table, filters, fieldName);
5720
6111
  }
5721
- let query = executor.delete(table);
6112
+ let query = softDelete ? executor.update(table).set({ [softDelete.columnName]: restore ? softDelete.writeRestored : softDelete.writeDeleted() }) : executor.delete(table);
5722
6113
  if (filters) {
5723
6114
  query = query.where(filters);
5724
6115
  }
@@ -5772,12 +6163,17 @@ function generateSchemaData2(db, schema, relations, options) {
5772
6163
  attachTargetPrimaryKeys(namedRelations, tables, pgPrimaryKeyPropNames);
5773
6164
  const eagerRelations = pruneNonEagerRelations(namedRelations, shouldEagerLoad);
5774
6165
  const filterCtx = { tables, relationMap: namedRelations };
6166
+ const tablePolicies = options.policies;
6167
+ const contextValuesOf = tablePolicies?.contextValues;
6168
+ const softDeleteOf = tablePolicies?.softDelete;
6169
+ const policies = bindPolicies(tablePolicies, filterCtx);
5775
6170
  const resolverFactory = createRelationResolverFactory(
5776
6171
  db,
5777
6172
  tables,
5778
6173
  "nulls-largest",
5779
6174
  filterCtx,
5780
- limits
6175
+ limits,
6176
+ tablePolicies
5781
6177
  );
5782
6178
  const cacheCtx = {
5783
6179
  genericFilterCache: /* @__PURE__ */ new Map(),
@@ -5795,6 +6191,8 @@ function generateSchemaData2(db, schema, relations, options) {
5795
6191
  limits,
5796
6192
  docs: options.docs ?? {},
5797
6193
  primaryKeyOf: (name) => tables[name] ? pgPrimaryKeyPropNames(tables[name]) : [],
6194
+ contextValuesOf,
6195
+ softDeleteOf,
5798
6196
  featureOf
5799
6197
  };
5800
6198
  const nestedPlans = features.nestedWrites ? buildNestedWritePlans(
@@ -5805,8 +6203,13 @@ function generateSchemaData2(db, schema, relations, options) {
5805
6203
  extractRelationJoinColumns
5806
6204
  ) : void 0;
5807
6205
  const nestedTypes = nestedPlans ? createNestedWriteTypes({ plans: nestedPlans, cacheCtx, typeNameMapper, insertPrefix: prefixes.insert }) : void 0;
5808
- const nestedRuntime = nestedPlans ? createNestedWriteRuntime({ plans: nestedPlans, filterCtx }) : void 0;
5809
- const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
6206
+ const nestedRuntime = nestedPlans ? createNestedWriteRuntime({
6207
+ plans: nestedPlans,
6208
+ filterCtx,
6209
+ policies: tablePolicies,
6210
+ contextValues: contextValuesOf
6211
+ }) : void 0;
6212
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx, tablePolicies) : void 0;
5810
6213
  const queries = {};
5811
6214
  const mutations = {};
5812
6215
  const mutationTxCtx = createMutationTxCtx(options.transactions);
@@ -5852,8 +6255,11 @@ function generateSchemaData2(db, schema, relations, options) {
5852
6255
  updateCountFieldName,
5853
6256
  deleteFieldName,
5854
6257
  deleteSingleFieldName,
6258
+ restoreFieldName,
6259
+ restoreSingleFieldName,
5855
6260
  deleteCountFieldName
5856
6261
  } = computeResolverFieldNames(tableName, typeNameMapper, prefixes, suffixes);
6262
+ const softDeleteInfo = softDeleteOf?.(tableName);
5857
6263
  const selectArrGenerated = generateSelectArray2(
5858
6264
  db,
5859
6265
  tableName,
@@ -5866,7 +6272,8 @@ function generateSchemaData2(db, schema, relations, options) {
5866
6272
  typeNameMapper,
5867
6273
  filterCtx,
5868
6274
  tableFeatures.distinct,
5869
- limits
6275
+ limits,
6276
+ policies
5870
6277
  );
5871
6278
  const selectSingleGenerated = generateSelectSingle2(
5872
6279
  db,
@@ -5879,7 +6286,8 @@ function generateSchemaData2(db, schema, relations, options) {
5879
6286
  typeName,
5880
6287
  typeNameMapper,
5881
6288
  filterCtx,
5882
- limits
6289
+ limits,
6290
+ policies
5883
6291
  );
5884
6292
  const insertArrGenerated = tableFeatures.insert ? generateInsertArray2(
5885
6293
  db,
@@ -5894,7 +6302,8 @@ function generateSchemaData2(db, schema, relations, options) {
5894
6302
  conflictDoNothing,
5895
6303
  mutationTxCtx,
5896
6304
  nestedRuntime,
5897
- limits
6305
+ limits,
6306
+ policies
5898
6307
  ) : void 0;
5899
6308
  const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle2(
5900
6309
  db,
@@ -5909,7 +6318,8 @@ function generateSchemaData2(db, schema, relations, options) {
5909
6318
  conflictDoNothing,
5910
6319
  mutationTxCtx,
5911
6320
  nestedRuntime,
5912
- limits
6321
+ limits,
6322
+ policies
5913
6323
  ) : void 0;
5914
6324
  const uniqueSets = tableFeatures.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig2) : [];
5915
6325
  const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
@@ -5935,7 +6345,8 @@ function generateSchemaData2(db, schema, relations, options) {
5935
6345
  filterCtx,
5936
6346
  mutationTxCtx,
5937
6347
  nestedRuntime,
5938
- limits
6348
+ limits,
6349
+ policies
5939
6350
  ) : void 0;
5940
6351
  const upsertSingleGenerated = onConflictInput ? generateUpsert2(
5941
6352
  db,
@@ -5953,7 +6364,8 @@ function generateSchemaData2(db, schema, relations, options) {
5953
6364
  filterCtx,
5954
6365
  mutationTxCtx,
5955
6366
  nestedRuntime,
5956
- limits
6367
+ limits,
6368
+ policies
5957
6369
  ) : void 0;
5958
6370
  const updateGenerated = tableFeatures.update ? generateUpdate2(
5959
6371
  db,
@@ -5971,7 +6383,8 @@ function generateSchemaData2(db, schema, relations, options) {
5971
6383
  filterCtx,
5972
6384
  mutationTxCtx,
5973
6385
  nestedRuntime,
5974
- limits
6386
+ limits,
6387
+ policies
5975
6388
  ) : void 0;
5976
6389
  const updateSingleGenerated = tableFeatures.update ? generateUpdate2(
5977
6390
  db,
@@ -5989,7 +6402,8 @@ function generateSchemaData2(db, schema, relations, options) {
5989
6402
  filterCtx,
5990
6403
  mutationTxCtx,
5991
6404
  nestedRuntime,
5992
- limits
6405
+ limits,
6406
+ policies
5993
6407
  ) : void 0;
5994
6408
  const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
5995
6409
  const updateManyGenerated = updateManyInput ? generateUpdateMany2(
@@ -6005,7 +6419,8 @@ function generateSchemaData2(db, schema, relations, options) {
6005
6419
  filterCtx,
6006
6420
  mutationTxCtx,
6007
6421
  nestedRuntime,
6008
- limits
6422
+ limits,
6423
+ policies
6009
6424
  ) : void 0;
6010
6425
  const deleteGenerated = tableFeatures.delete ? generateDelete2(
6011
6426
  db,
@@ -6018,7 +6433,8 @@ function generateSchemaData2(db, schema, relations, options) {
6018
6433
  tableFeatures.requireWhere,
6019
6434
  filterCtx,
6020
6435
  { tableName, relationMap: namedRelations, tables },
6021
- mutationTxCtx
6436
+ mutationTxCtx,
6437
+ policies
6022
6438
  ) : void 0;
6023
6439
  const deleteSingleGenerated = tableFeatures.delete ? generateDelete2(
6024
6440
  db,
@@ -6031,7 +6447,38 @@ function generateSchemaData2(db, schema, relations, options) {
6031
6447
  tableFeatures.requireWhere,
6032
6448
  filterCtx,
6033
6449
  { tableName, relationMap: namedRelations, tables },
6034
- mutationTxCtx
6450
+ mutationTxCtx,
6451
+ policies
6452
+ ) : void 0;
6453
+ const restoreGenerated = softDeleteInfo ? generateDelete2(
6454
+ db,
6455
+ tableName,
6456
+ schema[tableName],
6457
+ tableFilters,
6458
+ restoreFieldName,
6459
+ typeName,
6460
+ false,
6461
+ tableFeatures.requireWhere,
6462
+ filterCtx,
6463
+ { tableName, relationMap: namedRelations, tables },
6464
+ mutationTxCtx,
6465
+ policies,
6466
+ true
6467
+ ) : void 0;
6468
+ const restoreSingleGenerated = softDeleteInfo ? generateDelete2(
6469
+ db,
6470
+ tableName,
6471
+ schema[tableName],
6472
+ tableFilters,
6473
+ restoreSingleFieldName,
6474
+ typeName,
6475
+ true,
6476
+ tableFeatures.requireWhere,
6477
+ filterCtx,
6478
+ { tableName, relationMap: namedRelations, tables },
6479
+ mutationTxCtx,
6480
+ policies,
6481
+ true
6035
6482
  ) : void 0;
6036
6483
  const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
6037
6484
  db,
@@ -6065,7 +6512,8 @@ function generateSchemaData2(db, schema, relations, options) {
6065
6512
  typeName,
6066
6513
  aggregateFieldName,
6067
6514
  tableFilters,
6068
- filterCtx
6515
+ filterCtx,
6516
+ tablePolicies
6069
6517
  ) : void 0;
6070
6518
  const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
6071
6519
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
@@ -6079,7 +6527,8 @@ function generateSchemaData2(db, schema, relations, options) {
6079
6527
  tableFilters,
6080
6528
  groupByEnum,
6081
6529
  havingInput,
6082
- filterCtx
6530
+ filterCtx,
6531
+ tablePolicies
6083
6532
  ) : void 0;
6084
6533
  queries[selectArrGenerated.name] = {
6085
6534
  type: selectArrOutput,
@@ -6216,6 +6665,26 @@ function generateSchemaData2(db, schema, relations, options) {
6216
6665
  }
6217
6666
  };
6218
6667
  }
6668
+ if (restoreGenerated) {
6669
+ mutations[restoreGenerated.name] = {
6670
+ type: arrTableItemOutput,
6671
+ args: restoreGenerated.args,
6672
+ resolve: restoreGenerated.resolver,
6673
+ extensions: {
6674
+ drizzle: drizzleMeta({ kind: "mutation", operation: "restore", single: false, targetArg: "where" })
6675
+ }
6676
+ };
6677
+ }
6678
+ if (restoreSingleGenerated) {
6679
+ mutations[restoreSingleGenerated.name] = {
6680
+ type: singleTableItemOutput,
6681
+ args: restoreSingleGenerated.args,
6682
+ resolve: restoreSingleGenerated.resolver,
6683
+ extensions: {
6684
+ drizzle: drizzleMeta({ kind: "mutation", operation: "restore", single: true, targetArg: "where" })
6685
+ }
6686
+ };
6687
+ }
6219
6688
  if (updateCountGenerated) {
6220
6689
  mutations[updateCountGenerated.name] = {
6221
6690
  type: new GraphQLNonNull7(GraphQLInt6),
@@ -6286,7 +6755,7 @@ import {
6286
6755
  GraphQLNonNull as GraphQLNonNull8
6287
6756
  } from "graphql";
6288
6757
  import { parseResolveInfo as parseResolveInfo4 } from "graphql-parse-resolve-info";
6289
- var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits) => {
6758
+ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, distinctEnabled = true, limits, policies) => {
6290
6759
  const queryBase = db.query[tableName];
6291
6760
  if (!queryBase) {
6292
6761
  throw new Error(
@@ -6299,7 +6768,9 @@ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filte
6299
6768
  const queryArgs = selectArrayArgs(
6300
6769
  orderArgs,
6301
6770
  filterArgs,
6302
- distinctEnabled ? generateDistinctEnum(table, typeName) : void 0
6771
+ distinctEnabled ? generateDistinctEnum(table, typeName) : void 0,
6772
+ policies?.softDelete,
6773
+ tableName
6303
6774
  );
6304
6775
  return {
6305
6776
  name: fieldName,
@@ -6323,6 +6794,7 @@ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filte
6323
6794
  limits,
6324
6795
  pkNames,
6325
6796
  db: executor,
6797
+ scope: policies?.scope?.(context),
6326
6798
  // SQLite sorts NULLs as the smallest values (first in ASC).
6327
6799
  nullOrdering: "nulls-smallest"
6328
6800
  });
@@ -6333,14 +6805,14 @@ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filte
6333
6805
  args: queryArgs
6334
6806
  };
6335
6807
  };
6336
- var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits) => {
6808
+ var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filterArgs, fieldName, typeName, typeNameMapper, filterCtx, limits, policies) => {
6337
6809
  const queryBase = db.query[tableName];
6338
6810
  if (!queryBase) {
6339
6811
  throw new Error(
6340
6812
  `Drizzle-GraphQL Error: Table ${tableName} not found in drizzle instance. Did you forget to pass schema to drizzle constructor?`
6341
6813
  );
6342
6814
  }
6343
- const queryArgs = selectSingleArgs(orderArgs, filterArgs);
6815
+ const queryArgs = selectSingleArgs(orderArgs, filterArgs, policies?.softDelete, tableName);
6344
6816
  const table = tables[tableName];
6345
6817
  const pkNames = sqlitePrimaryKeyPropNames(table);
6346
6818
  return {
@@ -6363,7 +6835,8 @@ var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filt
6363
6835
  filterCtx,
6364
6836
  limits,
6365
6837
  pkNames,
6366
- db: executor
6838
+ db: executor,
6839
+ scope: policies?.scope?.(context)
6367
6840
  });
6368
6841
  } catch (e) {
6369
6842
  throw toGraphQLError(e);
@@ -6373,7 +6846,7 @@ var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filt
6373
6846
  };
6374
6847
  };
6375
6848
  var sqlitePrimaryKeyPropNames = (table) => getPrimaryKeyPropNamesFromConfig(table, getTableConfig3);
6376
- var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
6849
+ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits, policies) => {
6377
6850
  const queryArgs = {
6378
6851
  values: {
6379
6852
  type: new GraphQLNonNull8(new GraphQLList8(new GraphQLNonNull8(baseType)))
@@ -6390,7 +6863,13 @@ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType,
6390
6863
  }
6391
6864
  const entries = nested?.enabled(tableName) ? args.values.map((values) => nested.split(tableName, values)) : void 0;
6392
6865
  const nestedEntries = entries?.some((entry) => nested.hasOps(entry.ops)) ? entries : void 0;
6393
- const input = nestedEntries ? [] : remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : args.values, table);
6866
+ const contextColumns = policies?.contextValues?.(tableName);
6867
+ const scope = policies?.scope?.(context);
6868
+ const input = nestedEntries ? [] : applyContextValuesAll(
6869
+ remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : args.values, table),
6870
+ contextColumns,
6871
+ context
6872
+ );
6394
6873
  const parsedInfo = parseResolveInfo4(info, {
6395
6874
  deep: true
6396
6875
  });
@@ -6403,7 +6882,8 @@ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType,
6403
6882
  table,
6404
6883
  pkNames,
6405
6884
  parsedInfo,
6406
- limits
6885
+ limits,
6886
+ scope
6407
6887
  });
6408
6888
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
6409
6889
  const runInsert = async (target, values) => {
@@ -6418,8 +6898,9 @@ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType,
6418
6898
  runtime: nested,
6419
6899
  tableName,
6420
6900
  entries: nestedEntries,
6421
- remapValues: (values) => remapFromGraphQLSingleInput(values, table),
6422
- write: (tx, values) => runInsert(tx, [values])
6901
+ remapValues: (values) => applyContextValues(remapFromGraphQLSingleInput(values, table), contextColumns, context),
6902
+ write: (tx, values) => runInsert(tx, [values]),
6903
+ context
6423
6904
  }) : await runInsert(executor, input);
6424
6905
  const enriched = hasRelations ? await eagerLoadMutationRelations(executor, tableName, result, pkNames, withParams) : result;
6425
6906
  return remapToGraphQLArrayOutput(enriched, tableName, table, relationMap);
@@ -6431,7 +6912,7 @@ var generateInsertArray3 = (db, tableName, table, tables, relationMap, baseType,
6431
6912
  args: queryArgs
6432
6913
  };
6433
6914
  };
6434
- var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits) => {
6915
+ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType, fieldName, typeName, typeNameMapper, conflictDoNothing = false, txCtx, nested, limits, policies) => {
6435
6916
  const queryArgs = {
6436
6917
  values: {
6437
6918
  type: new GraphQLNonNull8(baseType)
@@ -6445,7 +6926,13 @@ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType
6445
6926
  return await runMutation(db, context, info, txCtx, async (executor) => {
6446
6927
  const entry = nested?.enabled(tableName) ? nested.split(tableName, args.values) : void 0;
6447
6928
  const nestedEntry = entry && nested.hasOps(entry.ops) ? entry : void 0;
6448
- const input = nestedEntry ? {} : remapFromGraphQLSingleInput(entry ? entry.columns : args.values, table);
6929
+ const contextColumns = policies?.contextValues?.(tableName);
6930
+ const scope = policies?.scope?.(context);
6931
+ const input = nestedEntry ? {} : applyContextValues(
6932
+ remapFromGraphQLSingleInput(entry ? entry.columns : args.values, table),
6933
+ contextColumns,
6934
+ context
6935
+ );
6449
6936
  const parsedInfo = parseResolveInfo4(info, {
6450
6937
  deep: true
6451
6938
  });
@@ -6458,7 +6945,8 @@ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType
6458
6945
  table,
6459
6946
  pkNames,
6460
6947
  parsedInfo,
6461
- limits
6948
+ limits,
6949
+ scope
6462
6950
  });
6463
6951
  const returning = nestedEntry ? nested.withJoinColumns(tableName, nestedEntry.ops, { ...columns }, table) : columns;
6464
6952
  const runInsert = async (target, values) => {
@@ -6473,8 +6961,9 @@ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType
6473
6961
  runtime: nested,
6474
6962
  tableName,
6475
6963
  entries: [nestedEntry],
6476
- remapValues: (values) => remapFromGraphQLSingleInput(values, table),
6477
- write: runInsert
6964
+ remapValues: (values) => applyContextValues(remapFromGraphQLSingleInput(values, table), contextColumns, context),
6965
+ write: runInsert,
6966
+ context
6478
6967
  }) : await runInsert(executor, input);
6479
6968
  if (!result[0]) {
6480
6969
  if (!conflictDoNothing) {
@@ -6492,7 +6981,7 @@ var generateInsertSingle3 = (db, tableName, table, tables, relationMap, baseType
6492
6981
  args: queryArgs
6493
6982
  };
6494
6983
  };
6495
- var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested, limits) => {
6984
+ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onConflictType, uniqueSets, fieldName, typeName, single, typeNameMapper, filterCtx, txCtx, nested, limits, policies) => {
6496
6985
  const queryArgs = {
6497
6986
  values: {
6498
6987
  type: single ? new GraphQLNonNull8(baseType) : new GraphQLNonNull8(new GraphQLList8(new GraphQLNonNull8(baseType)))
@@ -6514,7 +7003,13 @@ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onCo
6514
7003
  }
6515
7004
  const entries = nested?.enabled(tableName) ? supplied.map((values) => nested.split(tableName, values)) : void 0;
6516
7005
  const nestedEntries = entries?.some((entry) => nested.hasOps(entry.ops)) ? entries : void 0;
6517
- const input = nestedEntries ? [] : remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : supplied, table);
7006
+ const contextColumns = policies?.contextValues?.(tableName);
7007
+ const scope = policies?.scope?.(context);
7008
+ const input = nestedEntries ? [] : applyContextValuesAll(
7009
+ remapFromGraphQLArrayInput(entries ? entries.map((entry) => entry.columns) : supplied, table),
7010
+ contextColumns,
7011
+ context
7012
+ );
6518
7013
  const parsedInfo = parseResolveInfo4(info, { deep: true });
6519
7014
  const { columns, hasRelations, withParams } = prepareMutationRelationColumns({
6520
7015
  relationMap,
@@ -6525,7 +7020,8 @@ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onCo
6525
7020
  table,
6526
7021
  pkNames,
6527
7022
  parsedInfo,
6528
- limits
7023
+ limits,
7024
+ scope
6529
7025
  });
6530
7026
  const returning = nestedEntries ? nested.withJoinColumns(tableName, mergedOps(nestedEntries), { ...columns }, table) : columns;
6531
7027
  const runUpsert = async (target, values) => {
@@ -6540,7 +7036,8 @@ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onCo
6540
7036
  buildWhere: (where) => extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName))
6541
7037
  });
6542
7038
  let query = target.insert(table).values(values).returning(returning);
6543
- query = plan.action === "NOTHING" ? query.onConflictDoNothing(plan.target ? { target: plan.target } : void 0) : query.onConflictDoUpdate({ target: plan.target, set: plan.set, setWhere: plan.setWhere });
7039
+ const setWhere = withScope(scope, tableName, table, plan.setWhere);
7040
+ query = plan.action === "NOTHING" ? query.onConflictDoNothing(plan.target ? { target: plan.target } : void 0) : query.onConflictDoUpdate({ target: plan.target, set: plan.set, setWhere });
6544
7041
  return await query;
6545
7042
  };
6546
7043
  const result = nestedEntries ? await writeWithNestedOps({
@@ -6548,8 +7045,9 @@ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onCo
6548
7045
  runtime: nested,
6549
7046
  tableName,
6550
7047
  entries: nestedEntries,
6551
- remapValues: (values) => remapFromGraphQLSingleInput(values, table),
6552
- write: (tx, values) => runUpsert(tx, [values])
7048
+ remapValues: (values) => applyContextValues(remapFromGraphQLSingleInput(values, table), contextColumns, context),
7049
+ write: (tx, values) => runUpsert(tx, [values]),
7050
+ context
6553
7051
  }) : await runUpsert(executor, input);
6554
7052
  if (single && !result[0]) {
6555
7053
  return void 0;
@@ -6564,7 +7062,7 @@ var generateUpsert3 = (db, tableName, table, tables, relationMap, baseType, onCo
6564
7062
  args: queryArgs
6565
7063
  };
6566
7064
  };
6567
- var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested, limits) => {
7065
+ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filterArgs, fieldName, typeName, single, requireWhere, typeNameMapper, filterCtx, txCtx, nested, limits, policies) => {
6568
7066
  const queryArgs = {
6569
7067
  set: {
6570
7068
  type: new GraphQLNonNull8(setArgs)
@@ -6580,6 +7078,7 @@ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filte
6580
7078
  try {
6581
7079
  return await runMutation(db, context, info, txCtx, async (executor) => {
6582
7080
  const { where, set } = args;
7081
+ const scope = policies?.scope?.(context);
6583
7082
  const parsedInfo = parseResolveInfo4(info, {
6584
7083
  deep: true
6585
7084
  });
@@ -6592,16 +7091,25 @@ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filte
6592
7091
  table,
6593
7092
  pkNames,
6594
7093
  parsedInfo,
6595
- limits
7094
+ limits,
7095
+ scope
6596
7096
  });
6597
7097
  const entry = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
6598
7098
  const nestedOps = entry && nested.hasOps(entry.ops) ? entry.ops : void 0;
6599
- const input = remapUpdateInput(entry ? entry.columns : set, table, tableName);
7099
+ const input = stripContextValues(
7100
+ remapUpdateInput(entry ? entry.columns : set, table, tableName),
7101
+ policies?.contextValues?.(tableName)
7102
+ );
6600
7103
  if (!Object.keys(input).length && !nestedOps) {
6601
7104
  throw new GraphQLError9("Unable to update with no values specified!");
6602
7105
  }
6603
7106
  const relationCtx = relationFilterCtx(filterCtx, tableName);
6604
- const filters = single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0;
7107
+ const filters = withScope(
7108
+ scope,
7109
+ tableName,
7110
+ table,
7111
+ single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0
7112
+ );
6605
7113
  if (single) {
6606
7114
  await assertSingleMatch(executor, table, filters, fieldName);
6607
7115
  }
@@ -6621,7 +7129,8 @@ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filte
6621
7129
  columns: input,
6622
7130
  ops: nestedOps,
6623
7131
  remapValues: (values) => values,
6624
- write: runUpdate
7132
+ write: runUpdate,
7133
+ context
6625
7134
  }) : await runUpdate(executor, input);
6626
7135
  if (single && result.length > 1) {
6627
7136
  throw new GraphQLError9(`${fieldName}: 'where' matched more than one row!`);
@@ -6639,7 +7148,7 @@ var generateUpdate3 = (db, tableName, table, tables, relationMap, setArgs, filte
6639
7148
  args: queryArgs
6640
7149
  };
6641
7150
  };
6642
- var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested, limits) => {
7151
+ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateManyInput, fieldName, typeName, typeNameMapper, filterCtx, txCtx, nested, limits, policies) => {
6643
7152
  const queryArgs = {
6644
7153
  updates: {
6645
7154
  type: new GraphQLNonNull8(new GraphQLList8(new GraphQLNonNull8(updateManyInput)))
@@ -6655,6 +7164,8 @@ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateMany
6655
7164
  if (!updates.length) {
6656
7165
  throw new GraphQLError9("No updates were provided!");
6657
7166
  }
7167
+ const scope = policies?.scope?.(context);
7168
+ const contextColumns = policies?.contextValues?.(tableName);
6658
7169
  const parsedInfo = parseResolveInfo4(info, {
6659
7170
  deep: true
6660
7171
  });
@@ -6667,19 +7178,28 @@ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateMany
6667
7178
  table,
6668
7179
  pkNames,
6669
7180
  parsedInfo,
6670
- limits
7181
+ limits,
7182
+ scope
6671
7183
  });
6672
7184
  const entries = updates.map(({ where, set }) => {
6673
7185
  const split = nested?.enabled(tableName) ? nested.split(tableName, set) : void 0;
6674
7186
  const ops = split && nested.hasOps(split.ops) ? split.ops : void 0;
6675
- const input = remapUpdateInput(split ? split.columns : set, table, tableName);
7187
+ const input = stripContextValues(
7188
+ remapUpdateInput(split ? split.columns : set, table, tableName),
7189
+ contextColumns
7190
+ );
6676
7191
  if (!Object.keys(input).length && !ops) {
6677
7192
  throw new GraphQLError9("Unable to update with no values specified!");
6678
7193
  }
6679
7194
  return {
6680
7195
  set: input,
6681
7196
  ops,
6682
- filters: where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
7197
+ filters: withScope(
7198
+ scope,
7199
+ tableName,
7200
+ table,
7201
+ where ? extractFilters(table, tableName, where, relationFilterCtx(filterCtx, tableName)) : void 0
7202
+ )
6683
7203
  };
6684
7204
  });
6685
7205
  const anyNested = entries.some((entry) => entry.ops);
@@ -6697,7 +7217,7 @@ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateMany
6697
7217
  return query.returning(returning).all();
6698
7218
  };
6699
7219
  const runNestedEntry = async (tx, entry) => {
6700
- const values = entry.ops ? { ...entry.set, ...await nested.applyParentSide(tx, tableName, entry.ops) } : entry.set;
7220
+ const values = entry.ops ? { ...entry.set, ...await nested.applyParentSide(tx, tableName, entry.ops, context) } : entry.set;
6701
7221
  const writes = Object.keys(values).length > 0;
6702
7222
  let query = writes ? tx.update(table).set(values) : tx.select(returning).from(table);
6703
7223
  if (entry.filters) {
@@ -6705,7 +7225,7 @@ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateMany
6705
7225
  }
6706
7226
  const rows = await (writes ? query.returning(returning) : query);
6707
7227
  if (entry.ops) {
6708
- await nested.applyChildSide(tx, tableName, entry.ops, rows);
7228
+ await nested.applyChildSide(tx, tableName, entry.ops, rows, context);
6709
7229
  }
6710
7230
  return rows;
6711
7231
  };
@@ -6758,7 +7278,8 @@ var generateUpdateMany3 = (db, tableName, table, tables, relationMap, updateMany
6758
7278
  args: queryArgs
6759
7279
  };
6760
7280
  };
6761
- var generateDelete3 = (db, tableName, table, filterArgs, fieldName, typeName, single, requireWhere, filterCtx, selectionCtx, txCtx) => {
7281
+ var generateDelete3 = (db, tableName, table, filterArgs, fieldName, typeName, single, requireWhere, filterCtx, selectionCtx, txCtx, policies, restore = false) => {
7282
+ const softDelete = policies?.softDelete?.(tableName);
6762
7283
  const queryArgs = {
6763
7284
  where: {
6764
7285
  type: single || requireWhere ? new GraphQLNonNull8(filterArgs) : filterArgs
@@ -6770,6 +7291,7 @@ var generateDelete3 = (db, tableName, table, filterArgs, fieldName, typeName, si
6770
7291
  try {
6771
7292
  return await runMutation(db, context, info, txCtx, async (executor) => {
6772
7293
  const { where } = args;
7294
+ const scope = policies?.scope?.(context);
6773
7295
  const parsedInfo = parseResolveInfo4(info, {
6774
7296
  deep: true
6775
7297
  });
@@ -6779,11 +7301,17 @@ var generateDelete3 = (db, tableName, table, filterArgs, fieldName, typeName, si
6779
7301
  selectionCtx
6780
7302
  );
6781
7303
  const relationCtx = relationFilterCtx(filterCtx, tableName);
6782
- const filters = single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0;
7304
+ const filters = withScope(
7305
+ scope,
7306
+ tableName,
7307
+ table,
7308
+ single || requireWhere ? extractRequiredFilters(table, tableName, where, fieldName, relationCtx) : where ? extractFilters(table, tableName, where, relationCtx) : void 0,
7309
+ restore ? "ONLY" : void 0
7310
+ );
6783
7311
  if (single) {
6784
7312
  await assertSingleMatch(executor, table, filters, fieldName);
6785
7313
  }
6786
- let query = executor.delete(table);
7314
+ let query = softDelete ? executor.update(table).set({ [softDelete.columnName]: restore ? softDelete.writeRestored : softDelete.writeDeleted() }) : executor.delete(table);
6787
7315
  if (filters) {
6788
7316
  query = query.where(filters);
6789
7317
  }
@@ -6838,12 +7366,17 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6838
7366
  attachTargetPrimaryKeys(namedRelations, tables, sqlitePrimaryKeyPropNames);
6839
7367
  const eagerRelations = pruneNonEagerRelations(namedRelations, shouldEagerLoad);
6840
7368
  const filterCtx = { tables, relationMap: namedRelations };
7369
+ const tablePolicies = options.policies;
7370
+ const contextValuesOf = tablePolicies?.contextValues;
7371
+ const softDeleteOf = tablePolicies?.softDelete;
7372
+ const policies = bindPolicies(tablePolicies, filterCtx);
6841
7373
  const resolverFactory = createRelationResolverFactory(
6842
7374
  db,
6843
7375
  tables,
6844
7376
  "nulls-smallest",
6845
7377
  filterCtx,
6846
- limits
7378
+ limits,
7379
+ tablePolicies
6847
7380
  );
6848
7381
  const cacheCtx = {
6849
7382
  genericFilterCache: /* @__PURE__ */ new Map(),
@@ -6861,6 +7394,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6861
7394
  limits,
6862
7395
  docs: options.docs ?? {},
6863
7396
  primaryKeyOf: (name) => tables[name] ? sqlitePrimaryKeyPropNames(tables[name]) : [],
7397
+ contextValuesOf,
7398
+ softDeleteOf,
6864
7399
  featureOf
6865
7400
  };
6866
7401
  if (features.nestedWrites && db.resultKind === "sync") {
@@ -6876,8 +7411,13 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6876
7411
  extractRelationJoinColumns
6877
7412
  ) : void 0;
6878
7413
  const nestedTypes = nestedPlans ? createNestedWriteTypes({ plans: nestedPlans, cacheCtx, typeNameMapper, insertPrefix: prefixes.insert }) : void 0;
6879
- const nestedRuntime = nestedPlans ? createNestedWriteRuntime({ plans: nestedPlans, filterCtx }) : void 0;
6880
- const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx) : void 0;
7414
+ const nestedRuntime = nestedPlans ? createNestedWriteRuntime({
7415
+ plans: nestedPlans,
7416
+ filterCtx,
7417
+ policies: tablePolicies,
7418
+ contextValues: contextValuesOf
7419
+ }) : void 0;
7420
+ const relationAggregateFactory = anyTable("relationAggregates") ? createRelationAggregateFactory(db, tables, cacheCtx, typeNameMapper, filterCtx, tablePolicies) : void 0;
6881
7421
  const queries = {};
6882
7422
  const mutations = {};
6883
7423
  if (options.transactions && db.resultKind === "sync") {
@@ -6928,8 +7468,11 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6928
7468
  updateCountFieldName,
6929
7469
  deleteFieldName,
6930
7470
  deleteSingleFieldName,
7471
+ restoreFieldName,
7472
+ restoreSingleFieldName,
6931
7473
  deleteCountFieldName
6932
7474
  } = computeResolverFieldNames(tableName, typeNameMapper, prefixes, suffixes);
7475
+ const softDeleteInfo = softDeleteOf?.(tableName);
6933
7476
  const selectArrGenerated = generateSelectArray3(
6934
7477
  db,
6935
7478
  tableName,
@@ -6942,7 +7485,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6942
7485
  typeNameMapper,
6943
7486
  filterCtx,
6944
7487
  tableFeatures.distinct,
6945
- limits
7488
+ limits,
7489
+ policies
6946
7490
  );
6947
7491
  const selectSingleGenerated = generateSelectSingle3(
6948
7492
  db,
@@ -6955,7 +7499,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6955
7499
  typeName,
6956
7500
  typeNameMapper,
6957
7501
  filterCtx,
6958
- limits
7502
+ limits,
7503
+ policies
6959
7504
  );
6960
7505
  const insertArrGenerated = tableFeatures.insert ? generateInsertArray3(
6961
7506
  db,
@@ -6970,7 +7515,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6970
7515
  conflictDoNothing,
6971
7516
  mutationTxCtx,
6972
7517
  nestedRuntime,
6973
- limits
7518
+ limits,
7519
+ policies
6974
7520
  ) : void 0;
6975
7521
  const insertSingleGenerated = tableFeatures.insert ? generateInsertSingle3(
6976
7522
  db,
@@ -6985,7 +7531,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
6985
7531
  conflictDoNothing,
6986
7532
  mutationTxCtx,
6987
7533
  nestedRuntime,
6988
- limits
7534
+ limits,
7535
+ policies
6989
7536
  ) : void 0;
6990
7537
  const uniqueSets = tableFeatures.upsert ? getUniqueColumnSets(schema[tableName], getTableConfig3) : [];
6991
7538
  const onConflictInput = tableFeatures.upsert ? generateOnConflictInput({
@@ -7011,7 +7558,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7011
7558
  filterCtx,
7012
7559
  mutationTxCtx,
7013
7560
  nestedRuntime,
7014
- limits
7561
+ limits,
7562
+ policies
7015
7563
  ) : void 0;
7016
7564
  const upsertSingleGenerated = onConflictInput ? generateUpsert3(
7017
7565
  db,
@@ -7029,7 +7577,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7029
7577
  filterCtx,
7030
7578
  mutationTxCtx,
7031
7579
  nestedRuntime,
7032
- limits
7580
+ limits,
7581
+ policies
7033
7582
  ) : void 0;
7034
7583
  const updateGenerated = tableFeatures.update ? generateUpdate3(
7035
7584
  db,
@@ -7047,7 +7596,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7047
7596
  filterCtx,
7048
7597
  mutationTxCtx,
7049
7598
  nestedRuntime,
7050
- limits
7599
+ limits,
7600
+ policies
7051
7601
  ) : void 0;
7052
7602
  const updateSingleGenerated = tableFeatures.update ? generateUpdate3(
7053
7603
  db,
@@ -7065,7 +7615,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7065
7615
  filterCtx,
7066
7616
  mutationTxCtx,
7067
7617
  nestedRuntime,
7068
- limits
7618
+ limits,
7619
+ policies
7069
7620
  ) : void 0;
7070
7621
  const updateManyInput = tableFeatures.update && tableFeatures.updateMany ? generateUpdateManyInput({ typeName, updatePrefix: prefixes.update, updateInput, tableFilters }) : void 0;
7071
7622
  const updateManyGenerated = updateManyInput ? generateUpdateMany3(
@@ -7081,7 +7632,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7081
7632
  filterCtx,
7082
7633
  mutationTxCtx,
7083
7634
  nestedRuntime,
7084
- limits
7635
+ limits,
7636
+ policies
7085
7637
  ) : void 0;
7086
7638
  const deleteGenerated = tableFeatures.delete ? generateDelete3(
7087
7639
  db,
@@ -7094,7 +7646,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7094
7646
  tableFeatures.requireWhere,
7095
7647
  filterCtx,
7096
7648
  { tableName, relationMap: namedRelations, tables },
7097
- mutationTxCtx
7649
+ mutationTxCtx,
7650
+ policies
7098
7651
  ) : void 0;
7099
7652
  const deleteSingleGenerated = tableFeatures.delete ? generateDelete3(
7100
7653
  db,
@@ -7107,7 +7660,38 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7107
7660
  tableFeatures.requireWhere,
7108
7661
  filterCtx,
7109
7662
  { tableName, relationMap: namedRelations, tables },
7110
- mutationTxCtx
7663
+ mutationTxCtx,
7664
+ policies
7665
+ ) : void 0;
7666
+ const restoreGenerated = softDeleteInfo ? generateDelete3(
7667
+ db,
7668
+ tableName,
7669
+ schema[tableName],
7670
+ tableFilters,
7671
+ restoreFieldName,
7672
+ typeName,
7673
+ false,
7674
+ tableFeatures.requireWhere,
7675
+ filterCtx,
7676
+ { tableName, relationMap: namedRelations, tables },
7677
+ mutationTxCtx,
7678
+ policies,
7679
+ true
7680
+ ) : void 0;
7681
+ const restoreSingleGenerated = softDeleteInfo ? generateDelete3(
7682
+ db,
7683
+ tableName,
7684
+ schema[tableName],
7685
+ tableFilters,
7686
+ restoreSingleFieldName,
7687
+ typeName,
7688
+ true,
7689
+ tableFeatures.requireWhere,
7690
+ filterCtx,
7691
+ { tableName, relationMap: namedRelations, tables },
7692
+ mutationTxCtx,
7693
+ policies,
7694
+ true
7111
7695
  ) : void 0;
7112
7696
  const updateCountGenerated = tableFeatures.update && tableFeatures.countMutations ? generateWriteCount({
7113
7697
  db,
@@ -7141,7 +7725,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7141
7725
  typeName,
7142
7726
  aggregateFieldName,
7143
7727
  tableFilters,
7144
- filterCtx
7728
+ filterCtx,
7729
+ tablePolicies
7145
7730
  ) : void 0;
7146
7731
  const groupByType = tableFeatures.aggregates && tableFeatures.groupBy ? generateGroupByType(schema[tableName], tableName, typeName, cacheCtx) : void 0;
7147
7732
  const groupByEnum = groupByType ? generateGroupByEnum(schema[tableName], tableName, typeName) : void 0;
@@ -7155,7 +7740,8 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7155
7740
  tableFilters,
7156
7741
  groupByEnum,
7157
7742
  havingInput,
7158
- filterCtx
7743
+ filterCtx,
7744
+ tablePolicies
7159
7745
  ) : void 0;
7160
7746
  queries[selectArrGenerated.name] = {
7161
7747
  type: selectArrOutput,
@@ -7292,6 +7878,26 @@ var generateSchemaData3 = (db, schema, relations, options) => {
7292
7878
  }
7293
7879
  };
7294
7880
  }
7881
+ if (restoreGenerated) {
7882
+ mutations[restoreGenerated.name] = {
7883
+ type: arrTableItemOutput,
7884
+ args: restoreGenerated.args,
7885
+ resolve: restoreGenerated.resolver,
7886
+ extensions: {
7887
+ drizzle: drizzleMeta({ kind: "mutation", operation: "restore", single: false, targetArg: "where" })
7888
+ }
7889
+ };
7890
+ }
7891
+ if (restoreSingleGenerated) {
7892
+ mutations[restoreSingleGenerated.name] = {
7893
+ type: singleTableItemOutput,
7894
+ args: restoreSingleGenerated.args,
7895
+ resolve: restoreSingleGenerated.resolver,
7896
+ extensions: {
7897
+ drizzle: drizzleMeta({ kind: "mutation", operation: "restore", single: true, targetArg: "where" })
7898
+ }
7899
+ };
7900
+ }
7295
7901
  if (updateCountGenerated) {
7296
7902
  mutations[updateCountGenerated.name] = {
7297
7903
  type: new GraphQLNonNull8(GraphQLInt7),
@@ -7502,7 +8108,8 @@ var buildSchema = (db, config) => {
7502
8108
  insert: config?.prefixes?.insert ?? "create",
7503
8109
  delete: config?.prefixes?.delete ?? "delete",
7504
8110
  update: config?.prefixes?.update ?? "update",
7505
- upsert: config?.prefixes?.upsert ?? "upsert"
8111
+ upsert: config?.prefixes?.upsert ?? "upsert",
8112
+ restore: config?.prefixes?.restore ?? "restore"
7506
8113
  };
7507
8114
  const suffixes = {
7508
8115
  list: config?.suffixes?.list ?? "",
@@ -7547,6 +8154,66 @@ var buildSchema = (db, config) => {
7547
8154
  limitPolicyCache.set(tableName, resolved);
7548
8155
  return resolved;
7549
8156
  } : void 0;
8157
+ const scopeConfig = config?.scope;
8158
+ const contextValuesConfig = config?.contextValues;
8159
+ if (scopeConfig || contextValuesConfig) {
8160
+ const tableNames = new Set(tableKeys);
8161
+ for (const [tableName, hook] of Object.entries(scopeConfig ?? {})) {
8162
+ if (!tableNames.has(tableName)) {
8163
+ throw new Error(
8164
+ `Drizzle-GraphQL Error: config.scope names '${tableName}', which is not a table in the Drizzle schema.`
8165
+ );
8166
+ }
8167
+ if (typeof hook !== "function") {
8168
+ throw new Error(`Drizzle-GraphQL Error: config.scope.${tableName} must be a function.`);
8169
+ }
8170
+ }
8171
+ for (const [tableName, columnHooks] of Object.entries(contextValuesConfig ?? {})) {
8172
+ if (!tableNames.has(tableName)) {
8173
+ throw new Error(
8174
+ `Drizzle-GraphQL Error: config.contextValues names '${tableName}', which is not a table in the Drizzle schema.`
8175
+ );
8176
+ }
8177
+ const columns = getColumns6(schema[tableName]);
8178
+ for (const [columnName, hook] of Object.entries(columnHooks)) {
8179
+ if (!columns[columnName]) {
8180
+ throw new Error(
8181
+ `Drizzle-GraphQL Error: config.contextValues names '${tableName}.${columnName}', which is not a column of that table.`
8182
+ );
8183
+ }
8184
+ if (typeof hook !== "function") {
8185
+ throw new Error(`Drizzle-GraphQL Error: config.contextValues.${tableName}.${columnName} must be a function.`);
8186
+ }
8187
+ }
8188
+ }
8189
+ }
8190
+ const softDeleteConfig = config?.softDelete;
8191
+ const softDeleteInfos = /* @__PURE__ */ new Map();
8192
+ if (softDeleteConfig) {
8193
+ if (typeof softDeleteConfig === "function") {
8194
+ for (const tableName of tableKeys) {
8195
+ const declaration = softDeleteConfig(schema[tableName], tableName);
8196
+ if (declaration) {
8197
+ softDeleteInfos.set(tableName, resolveSoftDeleteInfo(schema[tableName], tableName, declaration));
8198
+ }
8199
+ }
8200
+ } else {
8201
+ const tableNames = new Set(tableKeys);
8202
+ for (const [tableName, declaration] of Object.entries(softDeleteConfig)) {
8203
+ if (!tableNames.has(tableName)) {
8204
+ throw new Error(
8205
+ `Drizzle-GraphQL Error: config.softDelete names '${tableName}', which is not a table in the Drizzle schema.`
8206
+ );
8207
+ }
8208
+ softDeleteInfos.set(tableName, resolveSoftDeleteInfo(schema[tableName], tableName, declaration));
8209
+ }
8210
+ }
8211
+ }
8212
+ const policies = scopeConfig || contextValuesConfig || softDeleteInfos.size ? {
8213
+ scope: scopeConfig ? (tableName) => scopeConfig[tableName] : void 0,
8214
+ contextValues: contextValuesConfig ? (tableName) => contextValuesConfig[tableName] : void 0,
8215
+ softDelete: softDeleteInfos.size ? (tableName) => softDeleteInfos.get(tableName) : void 0
8216
+ } : void 0;
7550
8217
  const exclude = config?.exclude;
7551
8218
  if (exclude) {
7552
8219
  const tableNames = new Set(tableKeys);
@@ -7664,6 +8331,7 @@ var buildSchema = (db, config) => {
7664
8331
  enumNameMapper: config?.enumNameMapper,
7665
8332
  transactions,
7666
8333
  limits,
8334
+ policies,
7667
8335
  exclude,
7668
8336
  docs: {
7669
8337
  describeColumn: config?.describeColumn,