prisma-guard 1.26.1 → 1.27.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.
@@ -959,6 +959,60 @@ var EMPTY_WHERE_FORCED = {
959
959
  function hasWhereForced(f) {
960
960
  return Object.keys(f.conditions).length > 0 || Object.keys(f.relations).length > 0;
961
961
  }
962
+ function forcedScalarsEqual(a, b) {
963
+ if (a === b)
964
+ return true;
965
+ if (a === null || b === null)
966
+ return false;
967
+ if (typeof a !== typeof b)
968
+ return false;
969
+ if (a instanceof Date && b instanceof Date) {
970
+ return a.getTime() === b.getTime();
971
+ }
972
+ if (a instanceof RegExp && b instanceof RegExp) {
973
+ return a.source === b.source && a.flags === b.flags;
974
+ }
975
+ if (Array.isArray(a)) {
976
+ if (!Array.isArray(b))
977
+ return false;
978
+ if (a.length !== b.length)
979
+ return false;
980
+ return a.every((v, i) => forcedScalarsEqual(v, b[i]));
981
+ }
982
+ if (isPlainObject(a) && isPlainObject(b)) {
983
+ const aKeys = Object.keys(a);
984
+ const bKeys = Object.keys(b);
985
+ if (aKeys.length !== bKeys.length)
986
+ return false;
987
+ return aKeys.every(
988
+ (k) => k in b && forcedScalarsEqual(a[k], b[k])
989
+ );
990
+ }
991
+ return false;
992
+ }
993
+ function tryInlineForcedField(result, field, forcedValue) {
994
+ if (!(field in result))
995
+ return false;
996
+ if (!isPlainObject(forcedValue))
997
+ return false;
998
+ const existing = result[field];
999
+ if (!isPlainObject(existing))
1000
+ return false;
1001
+ const merged = { ...existing };
1002
+ for (const [op, value] of Object.entries(forcedValue)) {
1003
+ if (op in merged) {
1004
+ if (!forcedScalarsEqual(merged[op], value)) {
1005
+ throw new ShapeError(
1006
+ `Conflicting where values for "${field}.${op}": client provided a different value than the forced shape`
1007
+ );
1008
+ }
1009
+ continue;
1010
+ }
1011
+ merged[op] = deepClone(value);
1012
+ }
1013
+ result[field] = merged;
1014
+ return true;
1015
+ }
962
1016
  function mergeWhereForced(where, forced) {
963
1017
  if (!hasWhereForced(forced))
964
1018
  return where ?? {};
@@ -976,11 +1030,19 @@ function mergeWhereForced(where, forced) {
976
1030
  }
977
1031
  }
978
1032
  if (Object.keys(forced.conditions).length > 0) {
979
- const scalarClone = deepClone(forced.conditions);
980
- if (Object.keys(result).length === 0) {
981
- result = scalarClone;
982
- } else {
983
- result = { AND: [result, scalarClone] };
1033
+ const remaining = {};
1034
+ for (const [field, forcedValue] of Object.entries(forced.conditions)) {
1035
+ const inlined = tryInlineForcedField(result, field, forcedValue);
1036
+ if (!inlined) {
1037
+ remaining[field] = deepClone(forcedValue);
1038
+ }
1039
+ }
1040
+ if (Object.keys(remaining).length > 0) {
1041
+ if (Object.keys(result).length === 0) {
1042
+ result = remaining;
1043
+ } else {
1044
+ result = { AND: [result, remaining] };
1045
+ }
984
1046
  }
985
1047
  }
986
1048
  return result;
@@ -5510,15 +5572,15 @@ function createModelGuardExtension(config) {
5510
5572
  }
5511
5573
  return wrapped;
5512
5574
  }
5513
- return {
5514
- $allModels: {
5575
+ const extension = {};
5576
+ for (const modelName of Object.keys(typeMap)) {
5577
+ const key = toDelegateKey(modelName);
5578
+ extension[key] = {
5515
5579
  guard(input, caller) {
5516
- const modelName = this.$name;
5517
- const delegateKey = toDelegateKey(modelName);
5518
- const modelDelegate = this.$parent[delegateKey];
5580
+ const modelDelegate = this.$parent[key];
5519
5581
  if (!modelDelegate) {
5520
5582
  throw new ShapeError(
5521
- `Could not resolve Prisma delegate for model "${modelName}" (key: "${delegateKey}")`
5583
+ `Could not resolve Prisma delegate for model "${modelName}" (key: "${key}")`
5522
5584
  );
5523
5585
  }
5524
5586
  const methods = createGuardedMethods(
@@ -5531,8 +5593,9 @@ function createModelGuardExtension(config) {
5531
5593
  return methods;
5532
5594
  return wrapMethods(methods);
5533
5595
  }
5534
- }
5535
- };
5596
+ };
5597
+ }
5598
+ return extension;
5536
5599
  }
5537
5600
 
5538
5601
  // src/runtime/guard.ts