fix(prisma-adapter): leave insensitive range operands unescaped on MongoDB

This commit is contained in:
Gustavo Valverde
2026-10-15 11:52:14 +01:00
parent 0ea270f9b8
commit abaac7df43
2 changed files with 17 additions and 3 deletions
@@ -283,6 +283,12 @@ describe("prisma-adapter", () => {
mode: "insensitive" as const,
},
{ field: "email", value: "a.c@x.io" },
{
field: "name",
value: "a.c",
operator: "gte" as const,
mode: "insensitive" as const,
},
];
await createAdapter("mongodb").findMany({ model: "user", where });
@@ -294,6 +300,7 @@ describe("prisma-adapter", () => {
{ email: { equals: "a\\.c@x\\.io", mode: "insensitive" } },
{ email: { in: ["a\\+b@x\\.io"], mode: "insensitive" } },
{ email: { equals: "a.c@x.io" } },
{ name: { gte: "a.c", mode: "insensitive" } },
],
});
@@ -306,6 +313,7 @@ describe("prisma-adapter", () => {
{ email: { equals: "a.c@x.io", mode: "insensitive" } },
{ email: { in: ["a+b@x.io"], mode: "insensitive" } },
{ email: { equals: "a.c@x.io" } },
{ name: { gte: "a.c", mode: "insensitive" } },
],
});
});
@@ -279,12 +279,18 @@ export const prismaAdapter = (prisma: PrismaClient, config: PrismaConfig) => {
isInsensitive && providerSupportsMode ? "insensitive" : undefined;
const modeFilter = prismaMode ? { mode: prismaMode } : {};
// Prisma's MongoDB connector builds `$regexMatch` patterns from these values unescaped.
// Range operators compare string order instead.
const usesRegex =
config.provider === "mongodb" &&
(prismaMode !== undefined ||
w.operator === "contains" ||
(w.operator === "contains" ||
w.operator === "starts_with" ||
w.operator === "ends_with");
w.operator === "ends_with" ||
(prismaMode !== undefined &&
(!w.operator ||
w.operator === "eq" ||
w.operator === "ne" ||
w.operator === "in" ||
w.operator === "not_in")));
const toPrismaValue = (v: unknown) =>
usesRegex && typeof v === "string"
? v.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")