better-auth 1.4.7 → 1.4.8-beta.2
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/adapters/prisma-adapter/prisma-adapter.mjs +58 -8
- package/dist/adapters/prisma-adapter/prisma-adapter.mjs.map +1 -1
- package/dist/adapters/test.d.mts +2 -2
- package/dist/adapters/test.mjs.map +1 -1
- package/dist/api/index.d.mts +395 -395
- package/dist/api/index.mjs +2 -2
- package/dist/api/index.mjs.map +1 -1
- package/dist/api/middlewares/origin-check.d.mts +3 -3
- package/dist/api/rate-limiter/index.mjs +1 -1
- package/dist/api/rate-limiter/index.mjs.map +1 -1
- package/dist/api/routes/account.d.mts +11 -11
- package/dist/api/routes/account.mjs +7 -2
- package/dist/api/routes/account.mjs.map +1 -1
- package/dist/api/routes/callback.d.mts +2 -2
- package/dist/api/routes/email-verification.d.mts +4 -4
- package/dist/api/routes/error.d.mts +2 -2
- package/dist/api/routes/ok.d.mts +2 -2
- package/dist/api/routes/reset-password.d.mts +5 -5
- package/dist/api/routes/session.d.mts +14 -14
- package/dist/api/routes/session.mjs +0 -5
- package/dist/api/routes/session.mjs.map +1 -1
- package/dist/api/routes/sign-in.d.mts +3 -3
- package/dist/api/routes/sign-out.d.mts +2 -2
- package/dist/api/routes/sign-up.d.mts +2 -2
- package/dist/api/routes/sign-up.mjs +1 -4
- package/dist/api/routes/sign-up.mjs.map +1 -1
- package/dist/api/routes/update-user.d.mts +13 -13
- package/dist/auth/base.mjs +1 -1
- package/dist/auth/base.mjs.map +1 -1
- package/dist/client/index.d.mts +4 -3
- package/dist/client/index.mjs.map +1 -1
- package/dist/client/lynx/index.d.mts +2 -2
- package/dist/client/plugins/index.d.mts +4 -3
- package/dist/client/react/index.d.mts +17 -17
- package/dist/client/solid/index.d.mts +15 -15
- package/dist/client/svelte/index.d.mts +15 -15
- package/dist/client/vue/index.d.mts +17 -17
- package/dist/cookies/index.mjs +1 -1
- package/dist/cookies/index.mjs.map +1 -1
- package/dist/db/field.d.mts +6 -5
- package/dist/db/internal-adapter.mjs +17 -29
- package/dist/db/internal-adapter.mjs.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/integrations/next-js.d.mts +4 -4
- package/dist/integrations/svelte-kit.d.mts +2 -2
- package/dist/integrations/tanstack-start.d.mts +4 -4
- package/dist/oauth2/link-account.mjs +4 -1
- package/dist/oauth2/link-account.mjs.map +1 -1
- package/dist/plugins/access/types.d.mts +1 -1
- package/dist/plugins/admin/admin.d.mts +102 -102
- package/dist/plugins/admin/admin.mjs.map +1 -1
- package/dist/plugins/admin/client.d.mts +1 -0
- package/dist/plugins/admin/types.d.mts +1 -0
- package/dist/plugins/anonymous/index.d.mts +6 -5
- package/dist/plugins/anonymous/index.mjs +1 -0
- package/dist/plugins/anonymous/index.mjs.map +1 -1
- package/dist/plugins/anonymous/types.d.mts +4 -4
- package/dist/plugins/api-key/index.d.mts +19 -18
- package/dist/plugins/api-key/index.mjs +2 -1
- package/dist/plugins/api-key/index.mjs.map +1 -1
- package/dist/plugins/api-key/routes/create-api-key.mjs.map +1 -1
- package/dist/plugins/api-key/routes/index.mjs.map +1 -1
- package/dist/plugins/api-key/routes/verify-api-key.mjs +8 -2
- package/dist/plugins/api-key/routes/verify-api-key.mjs.map +1 -1
- package/dist/plugins/api-key/schema.d.mts +3 -3
- package/dist/plugins/api-key/types.d.mts +8 -7
- package/dist/plugins/bearer/index.d.mts +8 -7
- package/dist/plugins/bearer/index.mjs +2 -1
- package/dist/plugins/bearer/index.mjs.map +1 -1
- package/dist/plugins/captcha/index.d.mts +3 -2
- package/dist/plugins/captcha/index.mjs +2 -1
- package/dist/plugins/captcha/index.mjs.map +1 -1
- package/dist/plugins/custom-session/index.d.mts +6 -5
- package/dist/plugins/custom-session/index.mjs +2 -1
- package/dist/plugins/custom-session/index.mjs.map +1 -1
- package/dist/plugins/device-authorization/index.d.mts +35 -8
- package/dist/plugins/device-authorization/index.mjs +2 -1
- package/dist/plugins/device-authorization/index.mjs.map +1 -1
- package/dist/plugins/email-otp/index.d.mts +14 -13
- package/dist/plugins/email-otp/index.mjs +2 -1
- package/dist/plugins/email-otp/index.mjs.map +1 -1
- package/dist/plugins/generic-oauth/client.d.mts +1 -0
- package/dist/plugins/generic-oauth/index.d.mts +34 -32
- package/dist/plugins/generic-oauth/index.mjs +3 -1
- package/dist/plugins/generic-oauth/index.mjs.map +1 -1
- package/dist/plugins/generic-oauth/providers/index.d.mts +1 -0
- package/dist/plugins/generic-oauth/providers/index.mjs +1 -0
- package/dist/plugins/generic-oauth/providers/patreon.d.mts +30 -0
- package/dist/plugins/generic-oauth/providers/patreon.mjs +59 -0
- package/dist/plugins/generic-oauth/providers/patreon.mjs.map +1 -0
- package/dist/plugins/haveibeenpwned/index.d.mts +4 -3
- package/dist/plugins/haveibeenpwned/index.mjs +1 -0
- package/dist/plugins/haveibeenpwned/index.mjs.map +1 -1
- package/dist/plugins/index.d.mts +6 -3
- package/dist/plugins/index.mjs +2 -1
- package/dist/plugins/jwt/index.d.mts +11 -11
- package/dist/plugins/jwt/index.mjs.map +1 -1
- package/dist/plugins/jwt/types.d.mts +3 -3
- package/dist/plugins/last-login-method/index.d.mts +5 -4
- package/dist/plugins/last-login-method/index.mjs +2 -1
- package/dist/plugins/last-login-method/index.mjs.map +1 -1
- package/dist/plugins/magic-link/index.d.mts +8 -7
- package/dist/plugins/magic-link/index.mjs +2 -1
- package/dist/plugins/magic-link/index.mjs.map +1 -1
- package/dist/plugins/mcp/index.d.mts +11 -10
- package/dist/plugins/mcp/index.mjs +2 -1
- package/dist/plugins/mcp/index.mjs.map +1 -1
- package/dist/plugins/multi-session/client.d.mts +3 -14
- package/dist/plugins/multi-session/client.mjs +1 -1
- package/dist/plugins/multi-session/client.mjs.map +1 -1
- package/dist/plugins/multi-session/index.d.mts +16 -25
- package/dist/plugins/multi-session/index.mjs +1 -0
- package/dist/plugins/multi-session/index.mjs.map +1 -1
- package/dist/plugins/oauth-proxy/index.d.mts +20 -10
- package/dist/plugins/oauth-proxy/index.mjs +35 -8
- package/dist/plugins/oauth-proxy/index.mjs.map +1 -1
- package/dist/plugins/oauth-proxy/utils.mjs.map +1 -1
- package/dist/plugins/oidc-provider/index.d.mts +15 -15
- package/dist/plugins/one-tap/client.d.mts +2 -2
- package/dist/plugins/one-tap/index.d.mts +4 -3
- package/dist/plugins/one-tap/index.mjs +2 -1
- package/dist/plugins/one-tap/index.mjs.map +1 -1
- package/dist/plugins/one-time-token/index.d.mts +6 -5
- package/dist/plugins/one-time-token/index.mjs +2 -1
- package/dist/plugins/one-time-token/index.mjs.map +1 -1
- package/dist/plugins/open-api/generator.mjs +9 -4
- package/dist/plugins/open-api/generator.mjs.map +1 -1
- package/dist/plugins/open-api/index.d.mts +5 -4
- package/dist/plugins/open-api/index.mjs +2 -1
- package/dist/plugins/open-api/index.mjs.map +1 -1
- package/dist/plugins/organization/client.d.mts +3 -2
- package/dist/plugins/organization/organization.d.mts +8 -7
- package/dist/plugins/organization/organization.mjs.map +1 -1
- package/dist/plugins/organization/permission.d.mts +1 -0
- package/dist/plugins/organization/routes/crud-access-control.d.mts +22 -22
- package/dist/plugins/organization/routes/crud-access-control.mjs.map +1 -1
- package/dist/plugins/organization/routes/crud-invites.d.mts +58 -58
- package/dist/plugins/organization/routes/crud-invites.mjs +21 -0
- package/dist/plugins/organization/routes/crud-invites.mjs.map +1 -1
- package/dist/plugins/organization/routes/crud-members.d.mts +63 -63
- package/dist/plugins/organization/routes/crud-members.mjs.map +1 -1
- package/dist/plugins/organization/routes/crud-org.d.mts +51 -51
- package/dist/plugins/organization/routes/crud-org.mjs +3 -1
- package/dist/plugins/organization/routes/crud-org.mjs.map +1 -1
- package/dist/plugins/organization/routes/crud-team.d.mts +76 -76
- package/dist/plugins/organization/types.d.mts +8 -7
- package/dist/plugins/phone-number/index.d.mts +34 -33
- package/dist/plugins/phone-number/index.mjs +1 -0
- package/dist/plugins/phone-number/index.mjs.map +1 -1
- package/dist/plugins/phone-number/types.d.mts +1 -2
- package/dist/plugins/siwe/index.d.mts +4 -3
- package/dist/plugins/siwe/index.mjs +2 -1
- package/dist/plugins/siwe/index.mjs.map +1 -1
- package/dist/plugins/two-factor/backup-codes/index.d.mts +5 -5
- package/dist/plugins/two-factor/client.d.mts +2 -2
- package/dist/plugins/two-factor/index.d.mts +20 -20
- package/dist/plugins/two-factor/index.mjs.map +1 -1
- package/dist/plugins/two-factor/otp/index.d.mts +2 -2
- package/dist/plugins/two-factor/otp/index.mjs.map +1 -1
- package/dist/plugins/two-factor/totp/index.d.mts +5 -5
- package/dist/plugins/two-factor/types.d.mts +1 -2
- package/dist/plugins/username/index.d.mts +13 -12
- package/dist/plugins/username/index.mjs +1 -0
- package/dist/plugins/username/index.mjs.map +1 -1
- package/dist/plugins/username/schema.d.mts +3 -3
- package/dist/test-utils/test-instance.d.mts +1190 -1190
- package/dist/test-utils/test-instance.mjs.map +1 -1
- package/dist/types/helper.d.mts +3 -4
- package/dist/types/index.d.mts +2 -2
- package/dist/utils/get-request-ip.mjs +1 -1
- package/dist/utils/get-request-ip.mjs.map +1 -1
- package/dist/utils/time.d.mts +29 -1
- package/package.json +12 -12
|
@@ -58,7 +58,7 @@ const prismaAdapter = (prisma, config) => {
|
|
|
58
58
|
default: return operator;
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
|
-
const convertWhereClause = (model, where) => {
|
|
61
|
+
const convertWhereClause = ({ action, model, where }) => {
|
|
62
62
|
if (!where || !where.length) return {};
|
|
63
63
|
const buildSingleCondition = (w) => {
|
|
64
64
|
const fieldName = getFieldName({
|
|
@@ -76,6 +76,28 @@ const prismaAdapter = (prisma, config) => {
|
|
|
76
76
|
if (w.operator === "eq" || !w.operator) return { [fieldName]: w.value };
|
|
77
77
|
return { [fieldName]: { [operatorToPrismaOperator(w.operator)]: w.value } };
|
|
78
78
|
};
|
|
79
|
+
if (action === "delete") {
|
|
80
|
+
const idCondition = where.find((w) => w.field === "id");
|
|
81
|
+
if (idCondition) {
|
|
82
|
+
const idFieldName = getFieldName({
|
|
83
|
+
model,
|
|
84
|
+
field: "id"
|
|
85
|
+
});
|
|
86
|
+
const idClause = buildSingleCondition(idCondition);
|
|
87
|
+
const remainingWhere = where.filter((w) => w.field !== "id");
|
|
88
|
+
if (remainingWhere.length === 0) return idClause;
|
|
89
|
+
const and$1 = remainingWhere.filter((w) => w.connector === "AND" || !w.connector);
|
|
90
|
+
const or$1 = remainingWhere.filter((w) => w.connector === "OR");
|
|
91
|
+
const andClause$1 = and$1.map((w) => buildSingleCondition(w));
|
|
92
|
+
const orClause$1 = or$1.map((w) => buildSingleCondition(w));
|
|
93
|
+
const result = {};
|
|
94
|
+
if (idFieldName in idClause) result[idFieldName] = idClause[idFieldName];
|
|
95
|
+
else Object.assign(result, idClause);
|
|
96
|
+
if (andClause$1.length > 0) result.AND = andClause$1;
|
|
97
|
+
if (orClause$1.length > 0) result.OR = orClause$1;
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
79
101
|
if (where.length === 1) {
|
|
80
102
|
const w = where[0];
|
|
81
103
|
if (!w) return;
|
|
@@ -99,7 +121,11 @@ const prismaAdapter = (prisma, config) => {
|
|
|
99
121
|
});
|
|
100
122
|
},
|
|
101
123
|
async findOne({ model, where, select, join }) {
|
|
102
|
-
const whereClause = convertWhereClause(
|
|
124
|
+
const whereClause = convertWhereClause({
|
|
125
|
+
model,
|
|
126
|
+
where,
|
|
127
|
+
action: "findOne"
|
|
128
|
+
});
|
|
103
129
|
if (!db[model]) throw new BetterAuthError(`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);
|
|
104
130
|
let map = /* @__PURE__ */ new Map();
|
|
105
131
|
for (const joinModel of Object.keys(join ?? {})) {
|
|
@@ -121,7 +147,11 @@ const prismaAdapter = (prisma, config) => {
|
|
|
121
147
|
return result;
|
|
122
148
|
},
|
|
123
149
|
async findMany({ model, where, limit, offset, sortBy, join }) {
|
|
124
|
-
const whereClause = convertWhereClause(
|
|
150
|
+
const whereClause = convertWhereClause({
|
|
151
|
+
model,
|
|
152
|
+
where,
|
|
153
|
+
action: "findMany"
|
|
154
|
+
});
|
|
125
155
|
if (!db[model]) throw new BetterAuthError(`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);
|
|
126
156
|
let map = /* @__PURE__ */ new Map();
|
|
127
157
|
if (join) for (const [joinModel, _value] of Object.entries(join)) {
|
|
@@ -149,13 +179,21 @@ const prismaAdapter = (prisma, config) => {
|
|
|
149
179
|
return result;
|
|
150
180
|
},
|
|
151
181
|
async count({ model, where }) {
|
|
152
|
-
const whereClause = convertWhereClause(
|
|
182
|
+
const whereClause = convertWhereClause({
|
|
183
|
+
model,
|
|
184
|
+
where,
|
|
185
|
+
action: "count"
|
|
186
|
+
});
|
|
153
187
|
if (!db[model]) throw new BetterAuthError(`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);
|
|
154
188
|
return await db[model].count({ where: whereClause });
|
|
155
189
|
},
|
|
156
190
|
async update({ model, where, update }) {
|
|
157
191
|
if (!db[model]) throw new BetterAuthError(`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);
|
|
158
|
-
const whereClause = convertWhereClause(
|
|
192
|
+
const whereClause = convertWhereClause({
|
|
193
|
+
model,
|
|
194
|
+
where,
|
|
195
|
+
action: "update"
|
|
196
|
+
});
|
|
159
197
|
return await db[model].update({
|
|
160
198
|
where: whereClause,
|
|
161
199
|
data: update
|
|
@@ -163,7 +201,11 @@ const prismaAdapter = (prisma, config) => {
|
|
|
163
201
|
},
|
|
164
202
|
async updateMany({ model, where, update }) {
|
|
165
203
|
if (!db[model]) throw new BetterAuthError(`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);
|
|
166
|
-
const whereClause = convertWhereClause(
|
|
204
|
+
const whereClause = convertWhereClause({
|
|
205
|
+
model,
|
|
206
|
+
where,
|
|
207
|
+
action: "updateMany"
|
|
208
|
+
});
|
|
167
209
|
const result = await db[model].updateMany({
|
|
168
210
|
where: whereClause,
|
|
169
211
|
data: update
|
|
@@ -172,7 +214,11 @@ const prismaAdapter = (prisma, config) => {
|
|
|
172
214
|
},
|
|
173
215
|
async delete({ model, where }) {
|
|
174
216
|
if (!db[model]) throw new BetterAuthError(`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);
|
|
175
|
-
const whereClause = convertWhereClause(
|
|
217
|
+
const whereClause = convertWhereClause({
|
|
218
|
+
model,
|
|
219
|
+
where,
|
|
220
|
+
action: "delete"
|
|
221
|
+
});
|
|
176
222
|
try {
|
|
177
223
|
await db[model].delete({ where: whereClause });
|
|
178
224
|
} catch (e) {
|
|
@@ -181,7 +227,11 @@ const prismaAdapter = (prisma, config) => {
|
|
|
181
227
|
}
|
|
182
228
|
},
|
|
183
229
|
async deleteMany({ model, where }) {
|
|
184
|
-
const whereClause = convertWhereClause(
|
|
230
|
+
const whereClause = convertWhereClause({
|
|
231
|
+
model,
|
|
232
|
+
where,
|
|
233
|
+
action: "deleteMany"
|
|
234
|
+
});
|
|
185
235
|
const result = await db[model].deleteMany({ where: whereClause });
|
|
186
236
|
return result ? result.count : 0;
|
|
187
237
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-adapter.mjs","names":["lazyOptions: BetterAuthOptions | null","prisma","result: Record<string, Record<string, any> | boolean>","schema","e: any","adapterOptions: AdapterFactoryOptions | null"],"sources":["../../../src/adapters/prisma-adapter/prisma-adapter.ts"],"sourcesContent":["import type { BetterAuthOptions } from \"@better-auth/core\";\nimport type {\n\tAdapterFactoryCustomizeAdapterCreator,\n\tAdapterFactoryOptions,\n\tDBAdapter,\n\tDBAdapterDebugLogOption,\n\tJoinConfig,\n\tWhere,\n} from \"@better-auth/core/db/adapter\";\nimport { createAdapterFactory } from \"@better-auth/core/db/adapter\";\nimport { BetterAuthError } from \"@better-auth/core/error\";\n\nexport interface PrismaConfig {\n\t/**\n\t * Database provider.\n\t */\n\tprovider:\n\t\t| \"sqlite\"\n\t\t| \"cockroachdb\"\n\t\t| \"mysql\"\n\t\t| \"postgresql\"\n\t\t| \"sqlserver\"\n\t\t| \"mongodb\";\n\n\t/**\n\t * Enable debug logs for the adapter\n\t *\n\t * @default false\n\t */\n\tdebugLogs?: DBAdapterDebugLogOption | undefined;\n\n\t/**\n\t * Use plural table names\n\t *\n\t * @default false\n\t */\n\tusePlural?: boolean | undefined;\n\n\t/**\n\t * Whether to execute multiple operations in a transaction.\n\t *\n\t * If the database doesn't support transactions,\n\t * set this to `false` and operations will be executed sequentially.\n\t * @default false\n\t */\n\ttransaction?: boolean | undefined;\n}\n\ninterface PrismaClient {}\n\ntype PrismaClientInternal = {\n\t$transaction: (\n\t\tcallback: (db: PrismaClient) => Promise<any> | any,\n\t) => Promise<any>;\n} & {\n\t[model: string]: {\n\t\tcreate: (data: any) => Promise<any>;\n\t\tfindFirst: (data: any) => Promise<any>;\n\t\tfindMany: (data: any) => Promise<any>;\n\t\tupdate: (data: any) => Promise<any>;\n\t\tupdateMany: (data: any) => Promise<any>;\n\t\tdelete: (data: any) => Promise<any>;\n\t\t[key: string]: any;\n\t};\n};\n\nexport const prismaAdapter = (prisma: PrismaClient, config: PrismaConfig) => {\n\tlet lazyOptions: BetterAuthOptions | null = null;\n\tconst createCustomAdapter =\n\t\t(prisma: PrismaClient): AdapterFactoryCustomizeAdapterCreator =>\n\t\t({\n\t\t\tgetFieldName,\n\t\t\tgetModelName,\n\t\t\tgetFieldAttributes,\n\t\t\tgetDefaultModelName,\n\t\t\tschema,\n\t\t}) => {\n\t\t\tconst db = prisma as PrismaClientInternal;\n\n\t\t\tconst convertSelect = (\n\t\t\t\tselect: string[] | undefined,\n\t\t\t\tmodel: string,\n\t\t\t\tjoin?: JoinConfig | undefined,\n\t\t\t) => {\n\t\t\t\tif (!select && !join) return undefined;\n\n\t\t\t\tlet result: Record<string, Record<string, any> | boolean> = {};\n\n\t\t\t\tif (select) {\n\t\t\t\t\tfor (const field of select) {\n\t\t\t\t\t\tresult[getFieldName({ model, field })] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (join) {\n\t\t\t\t\t// when joining that has a limit, we need to use Prisma's `select` syntax to append the limit to the field\n\t\t\t\t\t// because of such, it also means we need to select all base-model fields as well\n\t\t\t\t\t// should check if `select` is not provided, because then we should select all base-model fields\n\t\t\t\t\tif (!select) {\n\t\t\t\t\t\tconst fields = schema[getDefaultModelName(model)]?.fields || {};\n\t\t\t\t\t\tfields.id = { type: \"string\" }; // make sure there is at least an id field\n\t\t\t\t\t\tfor (const field of Object.keys(fields)) {\n\t\t\t\t\t\t\tresult[getFieldName({ model, field })] = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const [joinModel, joinAttr] of Object.entries(join)) {\n\t\t\t\t\t\tconst key = getJoinKeyName(model, getModelName(joinModel), schema);\n\t\t\t\t\t\tif (joinAttr.relation === \"one-to-one\") {\n\t\t\t\t\t\t\tresult[key] = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult[key] = { take: joinAttr.limit };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Build the join key name based on whether the foreign field is unique or not.\n\t\t\t * If unique, use singular. Otherwise, pluralize (add 's').\n\t\t\t */\n\t\t\tconst getJoinKeyName = (\n\t\t\t\tbaseModel: string,\n\t\t\t\tjoinedModel: string,\n\t\t\t\tschema: any,\n\t\t\t): string => {\n\t\t\t\ttry {\n\t\t\t\t\tconst defaultBaseModelName = getDefaultModelName(baseModel);\n\t\t\t\t\tconst defaultJoinedModelName = getDefaultModelName(joinedModel);\n\t\t\t\t\tconst key = getModelName(joinedModel).toLowerCase();\n\n\t\t\t\t\t// First, check if the joined model has FKs to the base model (forward join)\n\t\t\t\t\tlet foreignKeys = Object.entries(\n\t\t\t\t\t\tschema[defaultJoinedModelName]?.fields || {},\n\t\t\t\t\t).filter(\n\t\t\t\t\t\t([_field, fieldAttributes]: any) =>\n\t\t\t\t\t\t\tfieldAttributes.references &&\n\t\t\t\t\t\t\tgetDefaultModelName(fieldAttributes.references.model) ===\n\t\t\t\t\t\t\t\tdefaultBaseModelName,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (foreignKeys.length > 0) {\n\t\t\t\t\t\t// Forward join: joined model has FK to base model\n\t\t\t\t\t\t// This is typically a one-to-many relationship (plural)\n\t\t\t\t\t\t// Unless the FK is unique, then it's one-to-one (singular)\n\t\t\t\t\t\tconst [_foreignKey, foreignKeyAttributes] = foreignKeys[0] as any;\n\t\t\t\t\t\t// Only check if field is explicitly marked as unique\n\t\t\t\t\t\tconst isUnique = foreignKeyAttributes?.unique === true;\n\t\t\t\t\t\treturn isUnique || config.usePlural === true ? key : `${key}s`;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check backwards: does the base model have FKs to the joined model?\n\t\t\t\t\tforeignKeys = Object.entries(\n\t\t\t\t\t\tschema[defaultBaseModelName]?.fields || {},\n\t\t\t\t\t).filter(\n\t\t\t\t\t\t([_field, fieldAttributes]: any) =>\n\t\t\t\t\t\t\tfieldAttributes.references &&\n\t\t\t\t\t\t\tgetDefaultModelName(fieldAttributes.references.model) ===\n\t\t\t\t\t\t\t\tdefaultJoinedModelName,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (foreignKeys.length > 0) {\n\t\t\t\t\t\treturn key;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Fallback to pluralizing if we can't determine uniqueness\n\t\t\t\t}\n\t\t\t\treturn `${getModelName(joinedModel).toLowerCase()}s`;\n\t\t\t};\n\t\t\tfunction operatorToPrismaOperator(operator: string) {\n\t\t\t\tswitch (operator) {\n\t\t\t\t\tcase \"starts_with\":\n\t\t\t\t\t\treturn \"startsWith\";\n\t\t\t\t\tcase \"ends_with\":\n\t\t\t\t\t\treturn \"endsWith\";\n\t\t\t\t\tcase \"ne\":\n\t\t\t\t\t\treturn \"not\";\n\t\t\t\t\tcase \"not_in\":\n\t\t\t\t\t\treturn \"notIn\";\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn operator;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst convertWhereClause = (\n\t\t\t\tmodel: string,\n\t\t\t\twhere?: Where[] | undefined,\n\t\t\t) => {\n\t\t\t\tif (!where || !where.length) return {};\n\t\t\t\tconst buildSingleCondition = (w: Where) => {\n\t\t\t\t\tconst fieldName = getFieldName({ model, field: w.field });\n\t\t\t\t\t// Special handling for Prisma null semantics, for non-nullable fields this is a tautology. Skip condition.\n\t\t\t\t\tif (w.operator === \"ne\" && w.value === null) {\n\t\t\t\t\t\treturn {};\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\t(w.operator === \"in\" || w.operator === \"not_in\") &&\n\t\t\t\t\t\tArray.isArray(w.value)\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst filtered = w.value.filter((v) => v != null);\n\t\t\t\t\t\tif (filtered.length === 0) {\n\t\t\t\t\t\t\tif (w.operator === \"in\") {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tAND: [\n\t\t\t\t\t\t\t\t\t\t{ [fieldName]: { equals: \"__never__\" } },\n\t\t\t\t\t\t\t\t\t\t{ [fieldName]: { not: \"__never__\" } },\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn {};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst prismaOp = operatorToPrismaOperator(w.operator);\n\t\t\t\t\t\treturn { [fieldName]: { [prismaOp]: filtered } };\n\t\t\t\t\t}\n\t\t\t\t\tif (w.operator === \"eq\" || !w.operator) {\n\t\t\t\t\t\treturn { [fieldName]: w.value };\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\t[fieldName]: {\n\t\t\t\t\t\t\t[operatorToPrismaOperator(w.operator)]: w.value,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tif (where.length === 1) {\n\t\t\t\t\tconst w = where[0]!;\n\t\t\t\t\tif (!w) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\treturn buildSingleCondition(w);\n\t\t\t\t}\n\t\t\t\tconst and = where.filter((w) => w.connector === \"AND\" || !w.connector);\n\t\t\t\tconst or = where.filter((w) => w.connector === \"OR\");\n\t\t\t\tconst andClause = and.map((w) => buildSingleCondition(w));\n\t\t\t\tconst orClause = or.map((w) => buildSingleCondition(w));\n\n\t\t\t\treturn {\n\t\t\t\t\t...(andClause.length ? { AND: andClause } : {}),\n\t\t\t\t\t...(orClause.length ? { OR: orClause } : {}),\n\t\t\t\t};\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tasync create({ model, data: values, select }) {\n\t\t\t\t\tif (!db[model]) {\n\t\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\t`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst result = await db[model]!.create({\n\t\t\t\t\t\tdata: values,\n\t\t\t\t\t\tselect: convertSelect(select, model),\n\t\t\t\t\t});\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t\tasync findOne({ model, where, select, join }) {\n\t\t\t\t\t// this is just \"JoinOption\" type because we disabled join transformation in adapter config\n\t\t\t\t\tconst whereClause = convertWhereClause(model, where);\n\t\t\t\t\tif (!db[model]) {\n\t\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\t`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// transform join keys to use Prisma expected field names\n\t\t\t\t\tlet map = new Map<string, string>();\n\t\t\t\t\tfor (const joinModel of Object.keys(join ?? {})) {\n\t\t\t\t\t\tconst key = getJoinKeyName(model, joinModel, schema);\n\t\t\t\t\t\tmap.set(key, getModelName(joinModel));\n\t\t\t\t\t}\n\n\t\t\t\t\tconst selects = convertSelect(select, model, join);\n\n\t\t\t\t\tlet result = await db[model]!.findFirst({\n\t\t\t\t\t\twhere: whereClause,\n\t\t\t\t\t\tselect: selects,\n\t\t\t\t\t});\n\n\t\t\t\t\t// transform the resulting `include` items to use better-auth expected field names\n\t\t\t\t\tif (join && result) {\n\t\t\t\t\t\tfor (const [includeKey, originalKey] of map.entries()) {\n\t\t\t\t\t\t\tif (includeKey === originalKey) continue;\n\t\t\t\t\t\t\tif (includeKey in result) {\n\t\t\t\t\t\t\t\tresult[originalKey] = result[includeKey];\n\t\t\t\t\t\t\t\tdelete result[includeKey];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t\tasync findMany({ model, where, limit, offset, sortBy, join }) {\n\t\t\t\t\t// this is just \"JoinOption\" type because we disabled join transformation in adapter config\n\t\t\t\t\tconst whereClause = convertWhereClause(model, where);\n\t\t\t\t\tif (!db[model]) {\n\t\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\t`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// transform join keys to use Prisma expected field names\n\t\t\t\t\tlet map = new Map<string, string>();\n\t\t\t\t\tif (join) {\n\t\t\t\t\t\tfor (const [joinModel, _value] of Object.entries(join)) {\n\t\t\t\t\t\t\tconst key = getJoinKeyName(model, joinModel, schema);\n\t\t\t\t\t\t\tmap.set(key, getModelName(joinModel));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst selects = convertSelect(undefined, model, join);\n\n\t\t\t\t\tconst result = await db[model]!.findMany({\n\t\t\t\t\t\twhere: whereClause,\n\t\t\t\t\t\ttake: limit || 100,\n\t\t\t\t\t\tskip: offset || 0,\n\t\t\t\t\t\t...(sortBy?.field\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\torderBy: {\n\t\t\t\t\t\t\t\t\t\t[getFieldName({ model, field: sortBy.field })]:\n\t\t\t\t\t\t\t\t\t\t\tsortBy.direction === \"desc\" ? \"desc\" : \"asc\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\tselect: selects,\n\t\t\t\t\t});\n\n\t\t\t\t\t// transform the resulting join items to use better-auth expected field names\n\t\t\t\t\tif (join && Array.isArray(result)) {\n\t\t\t\t\t\tfor (const item of result) {\n\t\t\t\t\t\t\tfor (const [includeKey, originalKey] of map.entries()) {\n\t\t\t\t\t\t\t\tif (includeKey === originalKey) continue;\n\t\t\t\t\t\t\t\tif (includeKey in item) {\n\t\t\t\t\t\t\t\t\titem[originalKey] = item[includeKey];\n\t\t\t\t\t\t\t\t\tdelete item[includeKey];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t\tasync count({ model, where }) {\n\t\t\t\t\tconst whereClause = convertWhereClause(model, where);\n\t\t\t\t\tif (!db[model]) {\n\t\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\t`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn await db[model]!.count({\n\t\t\t\t\t\twhere: whereClause,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tasync update({ model, where, update }) {\n\t\t\t\t\tif (!db[model]) {\n\t\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\t`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst whereClause = convertWhereClause(model, where);\n\t\t\t\t\treturn await db[model]!.update({\n\t\t\t\t\t\twhere: whereClause,\n\t\t\t\t\t\tdata: update,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tasync updateMany({ model, where, update }) {\n\t\t\t\t\tif (!db[model]) {\n\t\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\t`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst whereClause = convertWhereClause(model, where);\n\t\t\t\t\tconst result = await db[model]!.updateMany({\n\t\t\t\t\t\twhere: whereClause,\n\t\t\t\t\t\tdata: update,\n\t\t\t\t\t});\n\t\t\t\t\treturn result ? (result.count as number) : 0;\n\t\t\t\t},\n\t\t\t\tasync delete({ model, where }) {\n\t\t\t\t\tif (!db[model]) {\n\t\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\t`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst whereClause = convertWhereClause(model, where);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait db[model]!.delete({\n\t\t\t\t\t\t\twhere: whereClause,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\t// If the record doesn't exist, we don't want to throw an error\n\t\t\t\t\t\tif (e?.meta?.cause === \"Record to delete does not exist.\") return;\n\t\t\t\t\t\t// otherwise if it's an unknown error, we want to just log it for debugging.\n\t\t\t\t\t\tconsole.log(e);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tasync deleteMany({ model, where }) {\n\t\t\t\t\tconst whereClause = convertWhereClause(model, where);\n\t\t\t\t\tconst result = await db[model]!.deleteMany({\n\t\t\t\t\t\twhere: whereClause,\n\t\t\t\t\t});\n\t\t\t\t\treturn result ? (result.count as number) : 0;\n\t\t\t\t},\n\t\t\t\toptions: config,\n\t\t\t};\n\t\t};\n\n\tlet adapterOptions: AdapterFactoryOptions | null = null;\n\tadapterOptions = {\n\t\tconfig: {\n\t\t\tadapterId: \"prisma\",\n\t\t\tadapterName: \"Prisma Adapter\",\n\t\t\tusePlural: config.usePlural ?? false,\n\t\t\tdebugLogs: config.debugLogs ?? false,\n\t\t\tsupportsUUIDs: config.provider === \"postgresql\" ? true : false,\n\t\t\tsupportsArrays:\n\t\t\t\tconfig.provider === \"postgresql\" || config.provider === \"mongodb\"\n\t\t\t\t\t? true\n\t\t\t\t\t: false,\n\t\t\ttransaction:\n\t\t\t\t(config.transaction ?? false)\n\t\t\t\t\t? (cb) =>\n\t\t\t\t\t\t\t(prisma as PrismaClientInternal).$transaction((tx) => {\n\t\t\t\t\t\t\t\tconst adapter = createAdapterFactory({\n\t\t\t\t\t\t\t\t\tconfig: adapterOptions!.config,\n\t\t\t\t\t\t\t\t\tadapter: createCustomAdapter(tx),\n\t\t\t\t\t\t\t\t})(lazyOptions!);\n\t\t\t\t\t\t\t\treturn cb(adapter);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t: false,\n\t\t},\n\t\tadapter: createCustomAdapter(prisma),\n\t};\n\n\tconst adapter = createAdapterFactory(adapterOptions);\n\treturn (options: BetterAuthOptions): DBAdapter<BetterAuthOptions> => {\n\t\tlazyOptions = options;\n\t\treturn adapter(options);\n\t};\n};\n"],"mappings":";;;;AAkEA,MAAa,iBAAiB,QAAsB,WAAyB;CAC5E,IAAIA,cAAwC;CAC5C,MAAM,uBACJ,cACA,EACA,cACA,cACA,oBACA,qBACA,aACK;EACL,MAAM,KAAKC;EAEX,MAAM,iBACL,QACA,OACA,SACI;AACJ,OAAI,CAAC,UAAU,CAAC,KAAM,QAAO;GAE7B,IAAIC,SAAwD,EAAE;AAE9D,OAAI,OACH,MAAK,MAAM,SAAS,OACnB,QAAO,aAAa;IAAE;IAAO;IAAO,CAAC,IAAI;AAI3C,OAAI,MAAM;AAIT,QAAI,CAAC,QAAQ;KACZ,MAAM,SAAS,OAAO,oBAAoB,MAAM,GAAG,UAAU,EAAE;AAC/D,YAAO,KAAK,EAAE,MAAM,UAAU;AAC9B,UAAK,MAAM,SAAS,OAAO,KAAK,OAAO,CACtC,QAAO,aAAa;MAAE;MAAO;MAAO,CAAC,IAAI;;AAI3C,SAAK,MAAM,CAAC,WAAW,aAAa,OAAO,QAAQ,KAAK,EAAE;KACzD,MAAM,MAAM,eAAe,OAAO,aAAa,UAAU,EAAE,OAAO;AAClE,SAAI,SAAS,aAAa,aACzB,QAAO,OAAO;SAEd,QAAO,OAAO,EAAE,MAAM,SAAS,OAAO;;;AAKzC,UAAO;;;;;;EAOR,MAAM,kBACL,WACA,aACA,aACY;AACZ,OAAI;IACH,MAAM,uBAAuB,oBAAoB,UAAU;IAC3D,MAAM,yBAAyB,oBAAoB,YAAY;IAC/D,MAAM,MAAM,aAAa,YAAY,CAAC,aAAa;IAGnD,IAAI,cAAc,OAAO,QACxBC,SAAO,yBAAyB,UAAU,EAAE,CAC5C,CAAC,QACA,CAAC,QAAQ,qBACT,gBAAgB,cAChB,oBAAoB,gBAAgB,WAAW,MAAM,KACpD,qBACF;AAED,QAAI,YAAY,SAAS,GAAG;KAI3B,MAAM,CAAC,aAAa,wBAAwB,YAAY;AAGxD,YADiB,sBAAsB,WAAW,QAC/B,OAAO,cAAc,OAAO,MAAM,GAAG,IAAI;;AAI7D,kBAAc,OAAO,QACpBA,SAAO,uBAAuB,UAAU,EAAE,CAC1C,CAAC,QACA,CAAC,QAAQ,qBACT,gBAAgB,cAChB,oBAAoB,gBAAgB,WAAW,MAAM,KACpD,uBACF;AAED,QAAI,YAAY,SAAS,EACxB,QAAO;WAED;AAGR,UAAO,GAAG,aAAa,YAAY,CAAC,aAAa,CAAC;;EAEnD,SAAS,yBAAyB,UAAkB;AACnD,WAAQ,UAAR;IACC,KAAK,cACJ,QAAO;IACR,KAAK,YACJ,QAAO;IACR,KAAK,KACJ,QAAO;IACR,KAAK,SACJ,QAAO;IACR,QACC,QAAO;;;EAGV,MAAM,sBACL,OACA,UACI;AACJ,OAAI,CAAC,SAAS,CAAC,MAAM,OAAQ,QAAO,EAAE;GACtC,MAAM,wBAAwB,MAAa;IAC1C,MAAM,YAAY,aAAa;KAAE;KAAO,OAAO,EAAE;KAAO,CAAC;AAEzD,QAAI,EAAE,aAAa,QAAQ,EAAE,UAAU,KACtC,QAAO,EAAE;AAEV,SACE,EAAE,aAAa,QAAQ,EAAE,aAAa,aACvC,MAAM,QAAQ,EAAE,MAAM,EACrB;KACD,MAAM,WAAW,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AACjD,SAAI,SAAS,WAAW,EACvB,KAAI,EAAE,aAAa,KAClB,QAAO,EACN,KAAK,CACJ,GAAG,YAAY,EAAE,QAAQ,aAAa,EAAE,EACxC,GAAG,YAAY,EAAE,KAAK,aAAa,EAAE,CACrC,EACD;SAED,QAAO,EAAE;KAGX,MAAM,WAAW,yBAAyB,EAAE,SAAS;AACrD,YAAO,GAAG,YAAY,GAAG,WAAW,UAAU,EAAE;;AAEjD,QAAI,EAAE,aAAa,QAAQ,CAAC,EAAE,SAC7B,QAAO,GAAG,YAAY,EAAE,OAAO;AAEhC,WAAO,GACL,YAAY,GACX,yBAAyB,EAAE,SAAS,GAAG,EAAE,OAC1C,EACD;;AAEF,OAAI,MAAM,WAAW,GAAG;IACvB,MAAM,IAAI,MAAM;AAChB,QAAI,CAAC,EACJ;AAED,WAAO,qBAAqB,EAAE;;GAE/B,MAAM,MAAM,MAAM,QAAQ,MAAM,EAAE,cAAc,SAAS,CAAC,EAAE,UAAU;GACtE,MAAM,KAAK,MAAM,QAAQ,MAAM,EAAE,cAAc,KAAK;GACpD,MAAM,YAAY,IAAI,KAAK,MAAM,qBAAqB,EAAE,CAAC;GACzD,MAAM,WAAW,GAAG,KAAK,MAAM,qBAAqB,EAAE,CAAC;AAEvD,UAAO;IACN,GAAI,UAAU,SAAS,EAAE,KAAK,WAAW,GAAG,EAAE;IAC9C,GAAI,SAAS,SAAS,EAAE,IAAI,UAAU,GAAG,EAAE;IAC3C;;AAGF,SAAO;GACN,MAAM,OAAO,EAAE,OAAO,MAAM,QAAQ,UAAU;AAC7C,QAAI,CAAC,GAAG,OACP,OAAM,IAAI,gBACT,SAAS,MAAM,oHACf;AAMF,WAJe,MAAM,GAAG,OAAQ,OAAO;KACtC,MAAM;KACN,QAAQ,cAAc,QAAQ,MAAM;KACpC,CAAC;;GAGH,MAAM,QAAQ,EAAE,OAAO,OAAO,QAAQ,QAAQ;IAE7C,MAAM,cAAc,mBAAmB,OAAO,MAAM;AACpD,QAAI,CAAC,GAAG,OACP,OAAM,IAAI,gBACT,SAAS,MAAM,oHACf;IAIF,IAAI,sBAAM,IAAI,KAAqB;AACnC,SAAK,MAAM,aAAa,OAAO,KAAK,QAAQ,EAAE,CAAC,EAAE;KAChD,MAAM,MAAM,eAAe,OAAO,WAAW,OAAO;AACpD,SAAI,IAAI,KAAK,aAAa,UAAU,CAAC;;IAGtC,MAAM,UAAU,cAAc,QAAQ,OAAO,KAAK;IAElD,IAAI,SAAS,MAAM,GAAG,OAAQ,UAAU;KACvC,OAAO;KACP,QAAQ;KACR,CAAC;AAGF,QAAI,QAAQ,OACX,MAAK,MAAM,CAAC,YAAY,gBAAgB,IAAI,SAAS,EAAE;AACtD,SAAI,eAAe,YAAa;AAChC,SAAI,cAAc,QAAQ;AACzB,aAAO,eAAe,OAAO;AAC7B,aAAO,OAAO;;;AAIjB,WAAO;;GAER,MAAM,SAAS,EAAE,OAAO,OAAO,OAAO,QAAQ,QAAQ,QAAQ;IAE7D,MAAM,cAAc,mBAAmB,OAAO,MAAM;AACpD,QAAI,CAAC,GAAG,OACP,OAAM,IAAI,gBACT,SAAS,MAAM,oHACf;IAGF,IAAI,sBAAM,IAAI,KAAqB;AACnC,QAAI,KACH,MAAK,MAAM,CAAC,WAAW,WAAW,OAAO,QAAQ,KAAK,EAAE;KACvD,MAAM,MAAM,eAAe,OAAO,WAAW,OAAO;AACpD,SAAI,IAAI,KAAK,aAAa,UAAU,CAAC;;IAIvC,MAAM,UAAU,cAAc,QAAW,OAAO,KAAK;IAErD,MAAM,SAAS,MAAM,GAAG,OAAQ,SAAS;KACxC,OAAO;KACP,MAAM,SAAS;KACf,MAAM,UAAU;KAChB,GAAI,QAAQ,QACT,EACA,SAAS,GACP,aAAa;MAAE;MAAO,OAAO,OAAO;MAAO,CAAC,GAC5C,OAAO,cAAc,SAAS,SAAS,OACxC,EACD,GACA,EAAE;KACL,QAAQ;KACR,CAAC;AAGF,QAAI,QAAQ,MAAM,QAAQ,OAAO,CAChC,MAAK,MAAM,QAAQ,OAClB,MAAK,MAAM,CAAC,YAAY,gBAAgB,IAAI,SAAS,EAAE;AACtD,SAAI,eAAe,YAAa;AAChC,SAAI,cAAc,MAAM;AACvB,WAAK,eAAe,KAAK;AACzB,aAAO,KAAK;;;AAMhB,WAAO;;GAER,MAAM,MAAM,EAAE,OAAO,SAAS;IAC7B,MAAM,cAAc,mBAAmB,OAAO,MAAM;AACpD,QAAI,CAAC,GAAG,OACP,OAAM,IAAI,gBACT,SAAS,MAAM,oHACf;AAEF,WAAO,MAAM,GAAG,OAAQ,MAAM,EAC7B,OAAO,aACP,CAAC;;GAEH,MAAM,OAAO,EAAE,OAAO,OAAO,UAAU;AACtC,QAAI,CAAC,GAAG,OACP,OAAM,IAAI,gBACT,SAAS,MAAM,oHACf;IAEF,MAAM,cAAc,mBAAmB,OAAO,MAAM;AACpD,WAAO,MAAM,GAAG,OAAQ,OAAO;KAC9B,OAAO;KACP,MAAM;KACN,CAAC;;GAEH,MAAM,WAAW,EAAE,OAAO,OAAO,UAAU;AAC1C,QAAI,CAAC,GAAG,OACP,OAAM,IAAI,gBACT,SAAS,MAAM,oHACf;IAEF,MAAM,cAAc,mBAAmB,OAAO,MAAM;IACpD,MAAM,SAAS,MAAM,GAAG,OAAQ,WAAW;KAC1C,OAAO;KACP,MAAM;KACN,CAAC;AACF,WAAO,SAAU,OAAO,QAAmB;;GAE5C,MAAM,OAAO,EAAE,OAAO,SAAS;AAC9B,QAAI,CAAC,GAAG,OACP,OAAM,IAAI,gBACT,SAAS,MAAM,oHACf;IAEF,MAAM,cAAc,mBAAmB,OAAO,MAAM;AACpD,QAAI;AACH,WAAM,GAAG,OAAQ,OAAO,EACvB,OAAO,aACP,CAAC;aACMC,GAAQ;AAEhB,SAAI,GAAG,MAAM,UAAU,mCAAoC;AAE3D,aAAQ,IAAI,EAAE;;;GAGhB,MAAM,WAAW,EAAE,OAAO,SAAS;IAClC,MAAM,cAAc,mBAAmB,OAAO,MAAM;IACpD,MAAM,SAAS,MAAM,GAAG,OAAQ,WAAW,EAC1C,OAAO,aACP,CAAC;AACF,WAAO,SAAU,OAAO,QAAmB;;GAE5C,SAAS;GACT;;CAGH,IAAIC,iBAA+C;AACnD,kBAAiB;EAChB,QAAQ;GACP,WAAW;GACX,aAAa;GACb,WAAW,OAAO,aAAa;GAC/B,WAAW,OAAO,aAAa;GAC/B,eAAe,OAAO,aAAa,eAAe,OAAO;GACzD,gBACC,OAAO,aAAa,gBAAgB,OAAO,aAAa,YACrD,OACA;GACJ,aACE,OAAO,eAAe,SACnB,OACA,OAAgC,cAAc,OAAO;AAKrD,WAAO,GAJS,qBAAqB;KACpC,QAAQ,eAAgB;KACxB,SAAS,oBAAoB,GAAG;KAChC,CAAC,CAAC,YAAa,CACE;KACjB,GACF;GACJ;EACD,SAAS,oBAAoB,OAAO;EACpC;CAED,MAAM,UAAU,qBAAqB,eAAe;AACpD,SAAQ,YAA6D;AACpE,gBAAc;AACd,SAAO,QAAQ,QAAQ"}
|
|
1
|
+
{"version":3,"file":"prisma-adapter.mjs","names":["lazyOptions: BetterAuthOptions | null","prisma","result: Record<string, Record<string, any> | boolean>","schema","and","or","andClause","orClause","result: Record<string, any>","e: any","adapterOptions: AdapterFactoryOptions | null"],"sources":["../../../src/adapters/prisma-adapter/prisma-adapter.ts"],"sourcesContent":["import type { Awaitable, BetterAuthOptions } from \"@better-auth/core\";\nimport type {\n\tAdapterFactoryCustomizeAdapterCreator,\n\tAdapterFactoryOptions,\n\tDBAdapter,\n\tDBAdapterDebugLogOption,\n\tJoinConfig,\n\tWhere,\n} from \"@better-auth/core/db/adapter\";\nimport { createAdapterFactory } from \"@better-auth/core/db/adapter\";\nimport { BetterAuthError } from \"@better-auth/core/error\";\n\nexport interface PrismaConfig {\n\t/**\n\t * Database provider.\n\t */\n\tprovider:\n\t\t| \"sqlite\"\n\t\t| \"cockroachdb\"\n\t\t| \"mysql\"\n\t\t| \"postgresql\"\n\t\t| \"sqlserver\"\n\t\t| \"mongodb\";\n\n\t/**\n\t * Enable debug logs for the adapter\n\t *\n\t * @default false\n\t */\n\tdebugLogs?: DBAdapterDebugLogOption | undefined;\n\n\t/**\n\t * Use plural table names\n\t *\n\t * @default false\n\t */\n\tusePlural?: boolean | undefined;\n\n\t/**\n\t * Whether to execute multiple operations in a transaction.\n\t *\n\t * If the database doesn't support transactions,\n\t * set this to `false` and operations will be executed sequentially.\n\t * @default false\n\t */\n\ttransaction?: boolean | undefined;\n}\n\ninterface PrismaClient {}\n\ntype PrismaClientInternal = {\n\t$transaction: (\n\t\tcallback: (db: PrismaClient) => Awaitable<any>,\n\t) => Promise<any>;\n} & {\n\t[model: string]: {\n\t\tcreate: (data: any) => Promise<any>;\n\t\tfindFirst: (data: any) => Promise<any>;\n\t\tfindMany: (data: any) => Promise<any>;\n\t\tupdate: (data: any) => Promise<any>;\n\t\tupdateMany: (data: any) => Promise<any>;\n\t\tdelete: (data: any) => Promise<any>;\n\t\t[key: string]: any;\n\t};\n};\n\nexport const prismaAdapter = (prisma: PrismaClient, config: PrismaConfig) => {\n\tlet lazyOptions: BetterAuthOptions | null = null;\n\tconst createCustomAdapter =\n\t\t(prisma: PrismaClient): AdapterFactoryCustomizeAdapterCreator =>\n\t\t({\n\t\t\tgetFieldName,\n\t\t\tgetModelName,\n\t\t\tgetFieldAttributes,\n\t\t\tgetDefaultModelName,\n\t\t\tschema,\n\t\t}) => {\n\t\t\tconst db = prisma as PrismaClientInternal;\n\n\t\t\tconst convertSelect = (\n\t\t\t\tselect: string[] | undefined,\n\t\t\t\tmodel: string,\n\t\t\t\tjoin?: JoinConfig | undefined,\n\t\t\t) => {\n\t\t\t\tif (!select && !join) return undefined;\n\n\t\t\t\tlet result: Record<string, Record<string, any> | boolean> = {};\n\n\t\t\t\tif (select) {\n\t\t\t\t\tfor (const field of select) {\n\t\t\t\t\t\tresult[getFieldName({ model, field })] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (join) {\n\t\t\t\t\t// when joining that has a limit, we need to use Prisma's `select` syntax to append the limit to the field\n\t\t\t\t\t// because of such, it also means we need to select all base-model fields as well\n\t\t\t\t\t// should check if `select` is not provided, because then we should select all base-model fields\n\t\t\t\t\tif (!select) {\n\t\t\t\t\t\tconst fields = schema[getDefaultModelName(model)]?.fields || {};\n\t\t\t\t\t\tfields.id = { type: \"string\" }; // make sure there is at least an id field\n\t\t\t\t\t\tfor (const field of Object.keys(fields)) {\n\t\t\t\t\t\t\tresult[getFieldName({ model, field })] = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const [joinModel, joinAttr] of Object.entries(join)) {\n\t\t\t\t\t\tconst key = getJoinKeyName(model, getModelName(joinModel), schema);\n\t\t\t\t\t\tif (joinAttr.relation === \"one-to-one\") {\n\t\t\t\t\t\t\tresult[key] = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult[key] = { take: joinAttr.limit };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Build the join key name based on whether the foreign field is unique or not.\n\t\t\t * If unique, use singular. Otherwise, pluralize (add 's').\n\t\t\t */\n\t\t\tconst getJoinKeyName = (\n\t\t\t\tbaseModel: string,\n\t\t\t\tjoinedModel: string,\n\t\t\t\tschema: any,\n\t\t\t): string => {\n\t\t\t\ttry {\n\t\t\t\t\tconst defaultBaseModelName = getDefaultModelName(baseModel);\n\t\t\t\t\tconst defaultJoinedModelName = getDefaultModelName(joinedModel);\n\t\t\t\t\tconst key = getModelName(joinedModel).toLowerCase();\n\n\t\t\t\t\t// First, check if the joined model has FKs to the base model (forward join)\n\t\t\t\t\tlet foreignKeys = Object.entries(\n\t\t\t\t\t\tschema[defaultJoinedModelName]?.fields || {},\n\t\t\t\t\t).filter(\n\t\t\t\t\t\t([_field, fieldAttributes]: any) =>\n\t\t\t\t\t\t\tfieldAttributes.references &&\n\t\t\t\t\t\t\tgetDefaultModelName(fieldAttributes.references.model) ===\n\t\t\t\t\t\t\t\tdefaultBaseModelName,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (foreignKeys.length > 0) {\n\t\t\t\t\t\t// Forward join: joined model has FK to base model\n\t\t\t\t\t\t// This is typically a one-to-many relationship (plural)\n\t\t\t\t\t\t// Unless the FK is unique, then it's one-to-one (singular)\n\t\t\t\t\t\tconst [_foreignKey, foreignKeyAttributes] = foreignKeys[0] as any;\n\t\t\t\t\t\t// Only check if field is explicitly marked as unique\n\t\t\t\t\t\tconst isUnique = foreignKeyAttributes?.unique === true;\n\t\t\t\t\t\treturn isUnique || config.usePlural === true ? key : `${key}s`;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check backwards: does the base model have FKs to the joined model?\n\t\t\t\t\tforeignKeys = Object.entries(\n\t\t\t\t\t\tschema[defaultBaseModelName]?.fields || {},\n\t\t\t\t\t).filter(\n\t\t\t\t\t\t([_field, fieldAttributes]: any) =>\n\t\t\t\t\t\t\tfieldAttributes.references &&\n\t\t\t\t\t\t\tgetDefaultModelName(fieldAttributes.references.model) ===\n\t\t\t\t\t\t\t\tdefaultJoinedModelName,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (foreignKeys.length > 0) {\n\t\t\t\t\t\treturn key;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Fallback to pluralizing if we can't determine uniqueness\n\t\t\t\t}\n\t\t\t\treturn `${getModelName(joinedModel).toLowerCase()}s`;\n\t\t\t};\n\t\t\tfunction operatorToPrismaOperator(operator: string) {\n\t\t\t\tswitch (operator) {\n\t\t\t\t\tcase \"starts_with\":\n\t\t\t\t\t\treturn \"startsWith\";\n\t\t\t\t\tcase \"ends_with\":\n\t\t\t\t\t\treturn \"endsWith\";\n\t\t\t\t\tcase \"ne\":\n\t\t\t\t\t\treturn \"not\";\n\t\t\t\t\tcase \"not_in\":\n\t\t\t\t\t\treturn \"notIn\";\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn operator;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst convertWhereClause = ({\n\t\t\t\taction,\n\t\t\t\tmodel,\n\t\t\t\twhere,\n\t\t\t}: {\n\t\t\t\tmodel: string;\n\t\t\t\twhere?: Where[] | undefined;\n\t\t\t\taction:\n\t\t\t\t\t| \"create\"\n\t\t\t\t\t| \"update\"\n\t\t\t\t\t| \"delete\"\n\t\t\t\t\t| \"findOne\"\n\t\t\t\t\t| \"findMany\"\n\t\t\t\t\t| \"count\"\n\t\t\t\t\t| \"updateMany\"\n\t\t\t\t\t| \"deleteMany\";\n\t\t\t}) => {\n\t\t\t\tif (!where || !where.length) return {};\n\t\t\t\tconst buildSingleCondition = (w: Where) => {\n\t\t\t\t\tconst fieldName = getFieldName({ model, field: w.field });\n\t\t\t\t\t// Special handling for Prisma null semantics, for non-nullable fields this is a tautology. Skip condition.\n\t\t\t\t\tif (w.operator === \"ne\" && w.value === null) {\n\t\t\t\t\t\treturn {};\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\t(w.operator === \"in\" || w.operator === \"not_in\") &&\n\t\t\t\t\t\tArray.isArray(w.value)\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst filtered = w.value.filter((v) => v != null);\n\t\t\t\t\t\tif (filtered.length === 0) {\n\t\t\t\t\t\t\tif (w.operator === \"in\") {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tAND: [\n\t\t\t\t\t\t\t\t\t\t{ [fieldName]: { equals: \"__never__\" } },\n\t\t\t\t\t\t\t\t\t\t{ [fieldName]: { not: \"__never__\" } },\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn {};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst prismaOp = operatorToPrismaOperator(w.operator);\n\t\t\t\t\t\treturn { [fieldName]: { [prismaOp]: filtered } };\n\t\t\t\t\t}\n\t\t\t\t\tif (w.operator === \"eq\" || !w.operator) {\n\t\t\t\t\t\treturn { [fieldName]: w.value };\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\t[fieldName]: {\n\t\t\t\t\t\t\t[operatorToPrismaOperator(w.operator)]: w.value,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Special handling for delete actions: extract id to root level\n\t\t\t\tif (action === \"delete\") {\n\t\t\t\t\tconst idCondition = where.find((w) => w.field === \"id\");\n\t\t\t\t\tif (idCondition) {\n\t\t\t\t\t\tconst idFieldName = getFieldName({ model, field: \"id\" });\n\t\t\t\t\t\tconst idClause = buildSingleCondition(idCondition);\n\t\t\t\t\t\tconst remainingWhere = where.filter((w) => w.field !== \"id\");\n\n\t\t\t\t\t\tif (remainingWhere.length === 0) {\n\t\t\t\t\t\t\treturn idClause;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst and = remainingWhere.filter(\n\t\t\t\t\t\t\t(w) => w.connector === \"AND\" || !w.connector,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst or = remainingWhere.filter((w) => w.connector === \"OR\");\n\t\t\t\t\t\tconst andClause = and.map((w) => buildSingleCondition(w));\n\t\t\t\t\t\tconst orClause = or.map((w) => buildSingleCondition(w));\n\n\t\t\t\t\t\t// Extract id to root level, put other conditions in AND array\n\t\t\t\t\t\tconst result: Record<string, any> = {};\n\t\t\t\t\t\tif (idFieldName in idClause) {\n\t\t\t\t\t\t\tresult[idFieldName] = (idClause as Record<string, any>)[\n\t\t\t\t\t\t\t\tidFieldName\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Handle edge case where idClause might have special structure\n\t\t\t\t\t\t\tObject.assign(result, idClause);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (andClause.length > 0) {\n\t\t\t\t\t\t\tresult.AND = andClause;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (orClause.length > 0) {\n\t\t\t\t\t\t\tresult.OR = orClause;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (where.length === 1) {\n\t\t\t\t\tconst w = where[0]!;\n\t\t\t\t\tif (!w) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\treturn buildSingleCondition(w);\n\t\t\t\t}\n\t\t\t\tconst and = where.filter((w) => w.connector === \"AND\" || !w.connector);\n\t\t\t\tconst or = where.filter((w) => w.connector === \"OR\");\n\t\t\t\tconst andClause = and.map((w) => buildSingleCondition(w));\n\t\t\t\tconst orClause = or.map((w) => buildSingleCondition(w));\n\n\t\t\t\treturn {\n\t\t\t\t\t...(andClause.length ? { AND: andClause } : {}),\n\t\t\t\t\t...(orClause.length ? { OR: orClause } : {}),\n\t\t\t\t};\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tasync create({ model, data: values, select }) {\n\t\t\t\t\tif (!db[model]) {\n\t\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\t`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst result = await db[model]!.create({\n\t\t\t\t\t\tdata: values,\n\t\t\t\t\t\tselect: convertSelect(select, model),\n\t\t\t\t\t});\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t\tasync findOne({ model, where, select, join }) {\n\t\t\t\t\t// this is just \"JoinOption\" type because we disabled join transformation in adapter config\n\t\t\t\t\tconst whereClause = convertWhereClause({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t\taction: \"findOne\",\n\t\t\t\t\t});\n\t\t\t\t\tif (!db[model]) {\n\t\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\t`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// transform join keys to use Prisma expected field names\n\t\t\t\t\tlet map = new Map<string, string>();\n\t\t\t\t\tfor (const joinModel of Object.keys(join ?? {})) {\n\t\t\t\t\t\tconst key = getJoinKeyName(model, joinModel, schema);\n\t\t\t\t\t\tmap.set(key, getModelName(joinModel));\n\t\t\t\t\t}\n\n\t\t\t\t\tconst selects = convertSelect(select, model, join);\n\n\t\t\t\t\tlet result = await db[model]!.findFirst({\n\t\t\t\t\t\twhere: whereClause,\n\t\t\t\t\t\tselect: selects,\n\t\t\t\t\t});\n\n\t\t\t\t\t// transform the resulting `include` items to use better-auth expected field names\n\t\t\t\t\tif (join && result) {\n\t\t\t\t\t\tfor (const [includeKey, originalKey] of map.entries()) {\n\t\t\t\t\t\t\tif (includeKey === originalKey) continue;\n\t\t\t\t\t\t\tif (includeKey in result) {\n\t\t\t\t\t\t\t\tresult[originalKey] = result[includeKey];\n\t\t\t\t\t\t\t\tdelete result[includeKey];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t\tasync findMany({ model, where, limit, offset, sortBy, join }) {\n\t\t\t\t\t// this is just \"JoinOption\" type because we disabled join transformation in adapter config\n\t\t\t\t\tconst whereClause = convertWhereClause({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t\taction: \"findMany\",\n\t\t\t\t\t});\n\t\t\t\t\tif (!db[model]) {\n\t\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\t`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// transform join keys to use Prisma expected field names\n\t\t\t\t\tlet map = new Map<string, string>();\n\t\t\t\t\tif (join) {\n\t\t\t\t\t\tfor (const [joinModel, _value] of Object.entries(join)) {\n\t\t\t\t\t\t\tconst key = getJoinKeyName(model, joinModel, schema);\n\t\t\t\t\t\t\tmap.set(key, getModelName(joinModel));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst selects = convertSelect(undefined, model, join);\n\n\t\t\t\t\tconst result = await db[model]!.findMany({\n\t\t\t\t\t\twhere: whereClause,\n\t\t\t\t\t\ttake: limit || 100,\n\t\t\t\t\t\tskip: offset || 0,\n\t\t\t\t\t\t...(sortBy?.field\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\torderBy: {\n\t\t\t\t\t\t\t\t\t\t[getFieldName({ model, field: sortBy.field })]:\n\t\t\t\t\t\t\t\t\t\t\tsortBy.direction === \"desc\" ? \"desc\" : \"asc\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\tselect: selects,\n\t\t\t\t\t});\n\n\t\t\t\t\t// transform the resulting join items to use better-auth expected field names\n\t\t\t\t\tif (join && Array.isArray(result)) {\n\t\t\t\t\t\tfor (const item of result) {\n\t\t\t\t\t\t\tfor (const [includeKey, originalKey] of map.entries()) {\n\t\t\t\t\t\t\t\tif (includeKey === originalKey) continue;\n\t\t\t\t\t\t\t\tif (includeKey in item) {\n\t\t\t\t\t\t\t\t\titem[originalKey] = item[includeKey];\n\t\t\t\t\t\t\t\t\tdelete item[includeKey];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t\tasync count({ model, where }) {\n\t\t\t\t\tconst whereClause = convertWhereClause({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t\taction: \"count\",\n\t\t\t\t\t});\n\t\t\t\t\tif (!db[model]) {\n\t\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\t`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn await db[model]!.count({\n\t\t\t\t\t\twhere: whereClause,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tasync update({ model, where, update }) {\n\t\t\t\t\tif (!db[model]) {\n\t\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\t`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst whereClause = convertWhereClause({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t\taction: \"update\",\n\t\t\t\t\t});\n\t\t\t\t\treturn await db[model]!.update({\n\t\t\t\t\t\twhere: whereClause,\n\t\t\t\t\t\tdata: update,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tasync updateMany({ model, where, update }) {\n\t\t\t\t\tif (!db[model]) {\n\t\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\t`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst whereClause = convertWhereClause({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t\taction: \"updateMany\",\n\t\t\t\t\t});\n\t\t\t\t\tconst result = await db[model]!.updateMany({\n\t\t\t\t\t\twhere: whereClause,\n\t\t\t\t\t\tdata: update,\n\t\t\t\t\t});\n\t\t\t\t\treturn result ? (result.count as number) : 0;\n\t\t\t\t},\n\t\t\t\tasync delete({ model, where }) {\n\t\t\t\t\tif (!db[model]) {\n\t\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\t`Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst whereClause = convertWhereClause({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t\taction: \"delete\",\n\t\t\t\t\t});\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait db[model]!.delete({\n\t\t\t\t\t\t\twhere: whereClause,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\t// If the record doesn't exist, we don't want to throw an error\n\t\t\t\t\t\tif (e?.meta?.cause === \"Record to delete does not exist.\") return;\n\t\t\t\t\t\t// otherwise if it's an unknown error, we want to just log it for debugging.\n\t\t\t\t\t\tconsole.log(e);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tasync deleteMany({ model, where }) {\n\t\t\t\t\tconst whereClause = convertWhereClause({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t\taction: \"deleteMany\",\n\t\t\t\t\t});\n\t\t\t\t\tconst result = await db[model]!.deleteMany({\n\t\t\t\t\t\twhere: whereClause,\n\t\t\t\t\t});\n\t\t\t\t\treturn result ? (result.count as number) : 0;\n\t\t\t\t},\n\t\t\t\toptions: config,\n\t\t\t};\n\t\t};\n\n\tlet adapterOptions: AdapterFactoryOptions | null = null;\n\tadapterOptions = {\n\t\tconfig: {\n\t\t\tadapterId: \"prisma\",\n\t\t\tadapterName: \"Prisma Adapter\",\n\t\t\tusePlural: config.usePlural ?? false,\n\t\t\tdebugLogs: config.debugLogs ?? false,\n\t\t\tsupportsUUIDs: config.provider === \"postgresql\" ? true : false,\n\t\t\tsupportsArrays:\n\t\t\t\tconfig.provider === \"postgresql\" || config.provider === \"mongodb\"\n\t\t\t\t\t? true\n\t\t\t\t\t: false,\n\t\t\ttransaction:\n\t\t\t\t(config.transaction ?? false)\n\t\t\t\t\t? (cb) =>\n\t\t\t\t\t\t\t(prisma as PrismaClientInternal).$transaction((tx) => {\n\t\t\t\t\t\t\t\tconst adapter = createAdapterFactory({\n\t\t\t\t\t\t\t\t\tconfig: adapterOptions!.config,\n\t\t\t\t\t\t\t\t\tadapter: createCustomAdapter(tx),\n\t\t\t\t\t\t\t\t})(lazyOptions!);\n\t\t\t\t\t\t\t\treturn cb(adapter);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t: false,\n\t\t},\n\t\tadapter: createCustomAdapter(prisma),\n\t};\n\n\tconst adapter = createAdapterFactory(adapterOptions);\n\treturn (options: BetterAuthOptions): DBAdapter<BetterAuthOptions> => {\n\t\tlazyOptions = options;\n\t\treturn adapter(options);\n\t};\n};\n"],"mappings":"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"}
|
package/dist/adapters/test.d.mts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { BetterAuthOptions } from "@better-auth/core";
|
|
1
|
+
import { Awaitable, BetterAuthOptions } from "@better-auth/core";
|
|
2
2
|
import { DBAdapter } from "@better-auth/core/db/adapter";
|
|
3
3
|
|
|
4
4
|
//#region src/adapters/test.d.ts
|
|
5
5
|
interface AdapterTestOptions {
|
|
6
|
-
getAdapter: (customOptions?: Omit<BetterAuthOptions, "database">) =>
|
|
6
|
+
getAdapter: (customOptions?: Omit<BetterAuthOptions, "database">) => Awaitable<DBAdapter<BetterAuthOptions>>;
|
|
7
7
|
disableTests?: Partial<Record<keyof typeof adapterTests, boolean>>;
|
|
8
8
|
testPrefix?: string;
|
|
9
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.mjs","names":["user: {\n\t\tname: string;\n\t\temail: string;\n\t\temailVerified: boolean;\n\t\tcreatedAt: Date;\n\t\tupdatedAt: Date;\n\t\tid: string;\n\t}","adapter","user","cleanup: { modelName: string; id: string }[]"],"sources":["../../src/adapters/test.ts"],"sourcesContent":["import type { BetterAuthOptions } from \"@better-auth/core\";\nimport type { DBAdapter } from \"@better-auth/core/db/adapter\";\nimport { beforeAll, describe, expect, test } from \"vitest\";\nimport type { User } from \"../types\";\nimport { generateId } from \"../utils\";\n\ninterface AdapterTestOptions {\n\tgetAdapter: (\n\t\tcustomOptions?: Omit<BetterAuthOptions, \"database\">,\n\t) => Promise<DBAdapter<BetterAuthOptions>> | DBAdapter<BetterAuthOptions>;\n\tdisableTests?: Partial<Record<keyof typeof adapterTests, boolean>>;\n\ttestPrefix?: string;\n}\n\ninterface NumberIdAdapterTestOptions {\n\tgetAdapter: (\n\t\tcustomOptions?: Omit<BetterAuthOptions, \"database\">,\n\t) => Promise<DBAdapter<BetterAuthOptions>>;\n\tdisableTests?: Partial<Record<keyof typeof numberIdAdapterTests, boolean>>;\n\ttestPrefix?: string;\n}\n\nconst adapterTests = {\n\tCREATE_MODEL: \"create model\",\n\tCREATE_MODEL_SHOULD_ALWAYS_RETURN_AN_ID:\n\t\t\"create model should always return an id\",\n\tFIND_MODEL: \"find model\",\n\tFIND_MODEL_WITHOUT_ID: \"find model without id\",\n\tFIND_MODEL_WITH_SELECT: \"find model with select\",\n\tFIND_MODEL_WITH_MODIFIED_FIELD_NAME: \"find model with modified field name\",\n\tUPDATE_MODEL: \"update model\",\n\tSHOULD_FIND_MANY: \"should find many\",\n\tSHOULD_FIND_MANY_WITH_WHERE: \"should find many with where\",\n\tSHOULD_FIND_MANY_WITH_OPERATORS: \"should find many with operators\",\n\tSHOULD_WORK_WITH_REFERENCE_FIELDS: \"should work with reference fields\",\n\tSHOULD_FIND_MANY_WITH_NOT_IN_OPERATOR:\n\t\t\"should find many with not in operator\",\n\tSHOULD_FIND_MANY_WITH_SORT_BY: \"should find many with sortBy\",\n\tSHOULD_FIND_MANY_WITH_LIMIT: \"should find many with limit\",\n\tSHOULD_FIND_MANY_WITH_OFFSET: \"should find many with offset\",\n\tSHOULD_UPDATE_WITH_MULTIPLE_WHERE: \"should update with multiple where\",\n\tDELETE_MODEL: \"delete model\",\n\tSHOULD_DELETE_MANY: \"should delete many\",\n\tSHOULD_NOT_THROW_ON_DELETE_RECORD_NOT_FOUND:\n\t\t\"shouldn't throw on delete record not found\",\n\tSHOULD_NOT_THROW_ON_RECORD_NOT_FOUND: \"shouldn't throw on record not found\",\n\tSHOULD_FIND_MANY_WITH_CONTAINS_OPERATOR:\n\t\t\"should find many with contains operator\",\n\tSHOULD_SEARCH_USERS_WITH_STARTS_WITH: \"should search users with startsWith\",\n\tSHOULD_SEARCH_USERS_WITH_ENDS_WITH: \"should search users with endsWith\",\n\tSHOULD_PREFER_GENERATE_ID_IF_PROVIDED: \"should prefer generateId if provided\",\n\tSHOULD_ROLLBACK_FAILING_TRANSACTION: \"should rollback failing transaction\",\n\tSHOULD_RETURN_TRANSACTION_RESULT: \"should return transaction result\",\n\tSHOULD_FIND_MANY_WITH_CONNECTORS: \"should find many with connectors\",\n} as const;\n\nconst { ...numberIdAdapterTestsCopy } = adapterTests;\n\nconst numberIdAdapterTests = {\n\t...numberIdAdapterTestsCopy,\n\tSHOULD_RETURN_A_NUMBER_ID_AS_A_RESULT:\n\t\t\"Should return a number id as a result\",\n\tSHOULD_INCREMENT_THE_ID_BY_1: \"Should increment the id by 1\",\n};\n\n// @ts-expect-error\n// biome-ignore lint/performance/noDelete: testing propose\ndelete numberIdAdapterTests.SHOULD_NOT_THROW_ON_DELETE_RECORD_NOT_FOUND;\n\n/**\n * @deprecated Use `testAdapter` instead.\n */\nfunction adapterTest(\n\t{ getAdapter, disableTests: disabledTests, testPrefix }: AdapterTestOptions,\n\tinternalOptions?: {\n\t\tpredefinedOptions: Omit<BetterAuthOptions, \"database\">;\n\t},\n) {\n\tconsole.warn(\n\t\t\"This test function is deprecated and will be removed in the future. Use `testAdapter` instead.\",\n\t);\n\tconst adapter = async () =>\n\t\tawait getAdapter(internalOptions?.predefinedOptions);\n\n\tasync function resetDebugLogs() {\n\t\t//@ts-expect-error\n\t\t(await adapter())?.adapterTestDebugLogs?.resetDebugLogs();\n\t}\n\n\tasync function printDebugLogs() {\n\t\t//@ts-expect-error\n\t\t(await adapter())?.adapterTestDebugLogs?.printDebugLogs();\n\t}\n\n\t// Generate unique test identifier for this test run to avoid conflicts\n\tconst testRunId =\n\t\tDate.now().toString(36) + Math.random().toString(36).substring(2, 5);\n\tconst getUniqueEmail = (base: string) => `${testRunId}_${base}`;\n\n\t//@ts-expect-error - intentionally omitting id\n\tlet user: {\n\t\tname: string;\n\t\temail: string;\n\t\temailVerified: boolean;\n\t\tcreatedAt: Date;\n\t\tupdatedAt: Date;\n\t\tid: string;\n\t} = {\n\t\tname: \"user\",\n\t\temail: getUniqueEmail(\"user@email.com\"),\n\t\temailVerified: true,\n\t\tcreatedAt: new Date(),\n\t\tupdatedAt: new Date(),\n\t};\n\n\ttest.skipIf(disabledTests?.CREATE_MODEL)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.CREATE_MODEL}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: user,\n\t\t\t});\n\t\t\tuser.id = res.id;\n\t\t\texpect({\n\t\t\t\tname: res.name,\n\t\t\t\temail: res.email,\n\t\t\t}).toEqual({\n\t\t\t\tname: user.name,\n\t\t\t\temail: user.email,\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.CREATE_MODEL_SHOULD_ALWAYS_RETURN_AN_ID)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.CREATE_MODEL_SHOULD_ALWAYS_RETURN_AN_ID\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"test-name-without-id\",\n\t\t\t\t\temail: getUniqueEmail(\"test-email-without-id@email.com\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(res).toHaveProperty(\"id\");\n\t\t\texpect(typeof res?.id).toEqual(\"string\");\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.FIND_MODEL)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.FIND_MODEL}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect({\n\t\t\t\tname: res?.name,\n\t\t\t\temail: res?.email,\n\t\t\t}).toEqual({\n\t\t\t\tname: user.name,\n\t\t\t\temail: user.email,\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.FIND_MODEL_WITHOUT_ID)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.FIND_MODEL_WITHOUT_ID\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: user.email,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect({\n\t\t\t\tname: res?.name,\n\t\t\t\temail: res?.email,\n\t\t\t}).toEqual({\n\t\t\t\tname: user.name,\n\t\t\t\temail: user.email,\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.FIND_MODEL_WITH_MODIFIED_FIELD_NAME)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.FIND_MODEL_WITH_MODIFIED_FIELD_NAME\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst email = getUniqueEmail(\"test-email-with-modified-field@email.com\");\n\t\t\tconst adapter = await getAdapter(\n\t\t\t\tObject.assign(\n\t\t\t\t\t{\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\temail: \"email_address\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tinternalOptions?.predefinedOptions,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst user = await adapter.create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\temail,\n\t\t\t\t\tname: \"test-name-with-modified-field\",\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(user.email).toEqual(email);\n\t\t\tconst res = await adapter.findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: email,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res).not.toBeNull();\n\t\t\texpect(res?.email).toEqual(email);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.FIND_MODEL_WITH_SELECT)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.FIND_MODEL_WITH_SELECT\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findOne({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tselect: [\"email\"],\n\t\t\t});\n\t\t\texpect(res).toEqual({ email: user.email });\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.UPDATE_MODEL)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.UPDATE_MODEL}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst newEmail = getUniqueEmail(\"updated@email.com\");\n\n\t\t\tconst res = await (await adapter()).update<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: {\n\t\t\t\t\temail: newEmail,\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(res).toMatchObject({\n\t\t\t\temail: newEmail,\n\t\t\t\tname: user.name,\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.SHOULD_FIND_MANY}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t});\n\t\t\texpect(res.length).toBe(3);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_WHERE)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_WHERE\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst user = await (await adapter()).create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user2\",\n\t\t\t\t\temail: getUniqueEmail(\"test@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res.length).toBe(1);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_OPERATORS)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_OPERATORS\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst newUser = await (await adapter()).create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user\",\n\t\t\t\t\temail: getUniqueEmail(\"test-email2@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\toperator: \"in\",\n\t\t\t\t\t\tvalue: [user.id, newUser.id],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res.length).toBe(2);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_NOT_IN_OPERATOR)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_NOT_IN_OPERATOR\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\n\t\t\tconst newUser3 = await (await adapter()).create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user\",\n\t\t\t\t\temail: getUniqueEmail(\"test-email3@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst allUsers = await (await adapter()).findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t});\n\t\t\texpect(allUsers.length).toBe(6);\n\t\t\tconst usersWithoutNotIn = await (await adapter()).findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\toperator: \"not_in\",\n\t\t\t\t\t\tvalue: [user.id, newUser3.id],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(usersWithoutNotIn.length).toBe(4);\n\t\t\t//cleanup\n\t\t\tawait (await adapter()).delete({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: newUser3.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_WORK_WITH_REFERENCE_FIELDS)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_WORK_WITH_REFERENCE_FIELDS\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tlet token = null;\n\t\t\tconst user = await (await adapter()).create<Record<string, any>>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user\",\n\t\t\t\t\temail: getUniqueEmail(\"my-email@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst session = await (await adapter()).create({\n\t\t\t\tmodel: \"session\",\n\t\t\t\tdata: {\n\t\t\t\t\ttoken: generateId(),\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\tuserId: user.id,\n\t\t\t\t\texpiresAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\ttoken = session.token;\n\t\t\tconst res = await (await adapter()).findOne({\n\t\t\t\tmodel: \"session\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst resToken = await (await adapter()).findOne({\n\t\t\t\tmodel: \"session\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"token\",\n\t\t\t\t\t\tvalue: token,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res).toMatchObject({\n\t\t\t\tuserId: user.id,\n\t\t\t});\n\t\t\texpect(resToken).toMatchObject({\n\t\t\t\tuserId: user.id,\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_SORT_BY)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_SORT_BY\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"a\",\n\t\t\t\t\temail: getUniqueEmail(\"a@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tsortBy: {\n\t\t\t\t\tfield: \"name\",\n\t\t\t\t\tdirection: \"asc\",\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(res[0]!.name).toBe(\"a\");\n\n\t\t\tconst res2 = await (await adapter()).findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tsortBy: {\n\t\t\t\t\tfield: \"name\",\n\t\t\t\t\tdirection: \"desc\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\texpect(res2[res2.length - 1]!.name).toBe(\"a\");\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_LIMIT)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_LIMIT\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tlimit: 1,\n\t\t\t});\n\t\t\texpect(res.length).toBe(1);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_OFFSET)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_OFFSET\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\toffset: 2,\n\t\t\t});\n\t\t\texpect(res.length).toBe(5);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_UPDATE_WITH_MULTIPLE_WHERE)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_UPDATE_WITH_MULTIPLE_WHERE\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\t// Note: user's email was already updated in the previous test\n\t\t\tconst currentEmail = getUniqueEmail(\"updated@email.com\");\n\t\t\tawait (await adapter()).updateMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: user.name,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: currentEmail,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: {\n\t\t\t\t\temail: getUniqueEmail(\"updated2@email.com\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst updatedUser = await (await adapter()).findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: getUniqueEmail(\"updated2@email.com\"),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(updatedUser).toMatchObject({\n\t\t\t\tname: user.name,\n\t\t\t\temail: getUniqueEmail(\"updated2@email.com\"),\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.DELETE_MODEL)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.DELETE_MODEL}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tawait (await adapter()).delete({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst findRes = await (await adapter()).findOne({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(findRes).toBeNull();\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_DELETE_MANY)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.SHOULD_DELETE_MANY}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tfor (const i of [\"to-be-delete-1\", \"to-be-delete-2\", \"to-be-delete-3\"]) {\n\t\t\t\tawait (await adapter()).create({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tname: \"to-be-deleted\",\n\t\t\t\t\t\temail: getUniqueEmail(`email@test-${i}.com`),\n\t\t\t\t\t\temailVerified: true,\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst findResFirst = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: \"to-be-deleted\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(findResFirst.length).toBe(3);\n\t\t\tawait (await adapter()).deleteMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: \"to-be-deleted\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst findRes = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: \"to-be-deleted\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(findRes.length).toBe(0);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_NOT_THROW_ON_DELETE_RECORD_NOT_FOUND)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_NOT_THROW_ON_DELETE_RECORD_NOT_FOUND\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tawait (await adapter()).delete({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: \"100000\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_NOT_THROW_ON_RECORD_NOT_FOUND)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_NOT_THROW_ON_RECORD_NOT_FOUND\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findOne({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: \"100000\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res).toBeNull();\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_CONTAINS_OPERATOR)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_CONTAINS_OPERATOR\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\toperator: \"contains\",\n\t\t\t\t\t\tvalue: \"user2\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res.length).toBe(1);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_SEARCH_USERS_WITH_STARTS_WITH)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_SEARCH_USERS_WITH_STARTS_WITH\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user_starts\",\n\t\t\t\t\temail: getUniqueEmail(\"startswith1@test.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user2_starts\",\n\t\t\t\t\temail: getUniqueEmail(\"startswith2@test.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user3_starts\",\n\t\t\t\t\temail: getUniqueEmail(\"startswith3@test.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\toperator: \"starts_with\",\n\t\t\t\t\t\tvalue: \"user\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res.length).toBeGreaterThanOrEqual(3);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_SEARCH_USERS_WITH_ENDS_WITH)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_SEARCH_USERS_WITH_ENDS_WITH\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\t// Create test user for this test with unique suffix\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"tester2\",\n\t\t\t\t\temail: getUniqueEmail(\"endswith@test.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\toperator: \"ends_with\",\n\t\t\t\t\t\tvalue: \"ter2\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res.length).toBe(1);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_PREFER_GENERATE_ID_IF_PROVIDED)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_PREFER_GENERATE_ID_IF_PROVIDED\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst customAdapter = await getAdapter(\n\t\t\t\tObject.assign(\n\t\t\t\t\t{\n\t\t\t\t\t\tadvanced: {\n\t\t\t\t\t\t\tdatabase: {\n\t\t\t\t\t\t\t\tgenerateId: () => \"mocked-id\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t} satisfies BetterAuthOptions,\n\t\t\t\t\tinternalOptions?.predefinedOptions,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst res = await customAdapter.create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user4\",\n\t\t\t\t\temail: getUniqueEmail(\"user4@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\texpect(res.id).toBe(\"mocked-id\");\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_ROLLBACK_FAILING_TRANSACTION)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.SHOULD_ROLLBACK_FAILING_TRANSACTION}`,\n\t\tasync ({ onTestFailed, skip }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst customAdapter = await adapter();\n\n\t\t\t// Check if adapter actually supports transactions\n\t\t\tconst enableTransaction =\n\t\t\t\tcustomAdapter?.options?.adapterConfig.transaction;\n\t\t\tif (!enableTransaction) {\n\t\t\t\tskip(\n\t\t\t\t\t`Skipping test: ${\n\t\t\t\t\t\tcustomAdapter?.options?.adapterConfig.adapterName || \"Adapter\"\n\t\t\t\t\t}\n\t\t\t\t\t does not support transactions`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst user5 = {\n\t\t\t\tname: \"user5\",\n\t\t\t\temail: getUniqueEmail(\"user5@email.com\"),\n\t\t\t\temailVerified: true,\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t};\n\t\t\tconst user6 = {\n\t\t\t\tname: \"user6\",\n\t\t\t\temail: getUniqueEmail(\"user6@email.com\"),\n\t\t\t\temailVerified: true,\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t};\n\t\t\tawait expect(\n\t\t\t\tcustomAdapter.transaction(async (tx) => {\n\t\t\t\t\tawait tx.create({ model: \"user\", data: user5 });\n\t\t\t\t\tthrow new Error(\"Simulated failure\");\n\t\t\t\t\tawait tx.create({ model: \"user\", data: user6 });\n\t\t\t\t}),\n\t\t\t).rejects.toThrow(\"Simulated failure\");\n\n\t\t\tawait expect(\n\t\t\t\tcustomAdapter.findMany({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\t\tvalue: user5.email,\n\t\t\t\t\t\t\tconnector: \"OR\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\t\tvalue: user6.email,\n\t\t\t\t\t\t\tconnector: \"OR\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t).resolves.toEqual([]);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_RETURN_TRANSACTION_RESULT)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.SHOULD_RETURN_TRANSACTION_RESULT}`,\n\t\tasync ({ onTestFailed, skip }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst customAdapter = await adapter();\n\n\t\t\tconst enableTransaction =\n\t\t\t\tcustomAdapter?.options?.adapterConfig.transaction;\n\t\t\tif (!enableTransaction) {\n\t\t\t\tskip(\n\t\t\t\t\t`Skipping test: ${\n\t\t\t\t\t\tcustomAdapter?.options?.adapterConfig.adapterName || \"Adapter\"\n\t\t\t\t\t}\n\t\t\t\t\t does not support transactions`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst result = await customAdapter.transaction(async (tx) => {\n\t\t\t\tconst createdUser = await tx.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tname: \"user6\",\n\t\t\t\t\t\temail: getUniqueEmail(\"user6@email.com\"),\n\t\t\t\t\t\temailVerified: true,\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn createdUser.email;\n\t\t\t});\n\n\t\t\texpect(result).toEqual(getUniqueEmail(\"user6@email.com\"));\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_CONNECTORS)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_CONNECTORS\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"connector-user1\",\n\t\t\t\t\temail: getUniqueEmail(\"connector-user1@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"con-user2\",\n\t\t\t\t\temail: getUniqueEmail(\"connector-user2@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst andRes = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: \"con-user2\",\n\t\t\t\t\t\tconnector: \"AND\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: getUniqueEmail(\"connector-user2@email.com\"),\n\t\t\t\t\t\tconnector: \"AND\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\n\t\t\texpect(andRes.length).toBe(1);\n\n\t\t\tconst orRes = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: \"connector-user1\",\n\t\t\t\t\t\tconnector: \"OR\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: \"con-user2\",\n\t\t\t\t\t\tconnector: \"OR\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(orRes.length).toBe(2);\n\t\t},\n\t);\n}\n\nexport function runAdapterTest(opts: AdapterTestOptions) {\n\treturn adapterTest(opts);\n}\n\nexport function runNumberIdAdapterTest(opts: NumberIdAdapterTestOptions) {\n\tconst cleanup: { modelName: string; id: string }[] = [];\n\n\t// Generate unique test identifier for this test run to avoid conflicts\n\tconst testRunId =\n\t\tDate.now().toString(36) + Math.random().toString(36).substr(2, 5);\n\tconst getUniqueEmail = (base: string) => `${testRunId}_${base}`;\n\n\tconst adapter = async () =>\n\t\tawait opts.getAdapter({\n\t\t\tadvanced: {\n\t\t\t\tdatabase: {\n\t\t\t\t\tgenerateId: \"serial\",\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\tdescribe(\"Should run number id specific tests\", async () => {\n\t\tlet idNumber = -1;\n\n\t\tasync function resetDebugLogs() {\n\t\t\t//@ts-expect-error\n\t\t\t(await adapter())?.adapterTestDebugLogs?.resetDebugLogs();\n\t\t}\n\n\t\tasync function printDebugLogs() {\n\t\t\t//@ts-expect-error\n\t\t\t(await adapter())?.adapterTestDebugLogs?.printDebugLogs();\n\t\t}\n\t\ttest.skipIf(opts.disableTests?.SHOULD_RETURN_A_NUMBER_ID_AS_A_RESULT)(\n\t\t\t`${opts.testPrefix ? `${opts.testPrefix} - ` : \"\"}${\n\t\t\t\tnumberIdAdapterTests.SHOULD_RETURN_A_NUMBER_ID_AS_A_RESULT\n\t\t\t}`,\n\t\t\tasync ({ onTestFailed }) => {\n\t\t\t\tawait resetDebugLogs();\n\t\t\t\tonTestFailed(async () => {\n\t\t\t\t\tawait printDebugLogs();\n\t\t\t\t});\n\t\t\t\tconst res = await (await adapter()).create({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tname: \"user\",\n\t\t\t\t\t\temail: getUniqueEmail(\"number-user@email.com\"),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tcleanup.push({ modelName: \"user\", id: res.id });\n\t\t\t\texpect(typeof res.id).toBe(\"string\"); // we forcefully return all `id`s as strings. this is intentional.\n\t\t\t\texpect(parseInt(res.id)).toBeGreaterThan(0);\n\t\t\t\tidNumber = parseInt(res.id);\n\t\t\t},\n\t\t);\n\t\ttest.skipIf(opts.disableTests?.SHOULD_INCREMENT_THE_ID_BY_1)(\n\t\t\t`${opts.testPrefix ? `${opts.testPrefix} - ` : \"\"}${\n\t\t\t\tnumberIdAdapterTests.SHOULD_INCREMENT_THE_ID_BY_1\n\t\t\t}`,\n\t\t\tasync ({ onTestFailed }) => {\n\t\t\t\tawait resetDebugLogs();\n\t\t\t\tonTestFailed(async () => {\n\t\t\t\t\tconsole.log(`ID number from last create: ${idNumber}`);\n\t\t\t\t\tawait printDebugLogs();\n\t\t\t\t});\n\t\t\t\tconst res = await (await adapter()).create({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tname: \"user2\",\n\t\t\t\t\t\temail: getUniqueEmail(\"number-user2@email.com\"),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tcleanup.push({ modelName: \"user\", id: res.id });\n\t\t\t\texpect(parseInt(res.id)).toBe(idNumber + 1);\n\t\t\t},\n\t\t);\n\t});\n\n\tdescribe(\"Should run normal adapter tests with number id enabled\", async () => {\n\t\tbeforeAll(async () => {\n\t\t\tfor (const { modelName, id } of cleanup) {\n\t\t\t\tawait (await adapter()).delete({\n\t\t\t\t\tmodel: modelName,\n\t\t\t\t\twhere: [{ field: \"id\", value: id }],\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tawait adapterTest(\n\t\t\t{\n\t\t\t\t...opts,\n\t\t\t\tdisableTests: {\n\t\t\t\t\t...opts.disableTests,\n\t\t\t\t\tSHOULD_PREFER_GENERATE_ID_IF_PROVIDED: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tpredefinedOptions: {\n\t\t\t\t\tadvanced: {\n\t\t\t\t\t\tdatabase: {\n\t\t\t\t\t\t\tgenerateId: \"serial\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t});\n}\n\nexport function recoverProcessTZ() {\n\tconst originalTZ = process.env.TZ;\n\treturn {\n\t\t[Symbol.dispose]: () => {\n\t\t\tprocess.env.TZ = originalTZ;\n\t\t},\n\t};\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"test.mjs","names":["user: {\n\t\tname: string;\n\t\temail: string;\n\t\temailVerified: boolean;\n\t\tcreatedAt: Date;\n\t\tupdatedAt: Date;\n\t\tid: string;\n\t}","adapter","user","cleanup: { modelName: string; id: string }[]"],"sources":["../../src/adapters/test.ts"],"sourcesContent":["import type { Awaitable, BetterAuthOptions } from \"@better-auth/core\";\nimport type { DBAdapter } from \"@better-auth/core/db/adapter\";\nimport { beforeAll, describe, expect, test } from \"vitest\";\nimport type { User } from \"../types\";\nimport { generateId } from \"../utils\";\n\ninterface AdapterTestOptions {\n\tgetAdapter: (\n\t\tcustomOptions?: Omit<BetterAuthOptions, \"database\">,\n\t) => Awaitable<DBAdapter<BetterAuthOptions>>;\n\tdisableTests?: Partial<Record<keyof typeof adapterTests, boolean>>;\n\ttestPrefix?: string;\n}\n\ninterface NumberIdAdapterTestOptions {\n\tgetAdapter: (\n\t\tcustomOptions?: Omit<BetterAuthOptions, \"database\">,\n\t) => Promise<DBAdapter<BetterAuthOptions>>;\n\tdisableTests?: Partial<Record<keyof typeof numberIdAdapterTests, boolean>>;\n\ttestPrefix?: string;\n}\n\nconst adapterTests = {\n\tCREATE_MODEL: \"create model\",\n\tCREATE_MODEL_SHOULD_ALWAYS_RETURN_AN_ID:\n\t\t\"create model should always return an id\",\n\tFIND_MODEL: \"find model\",\n\tFIND_MODEL_WITHOUT_ID: \"find model without id\",\n\tFIND_MODEL_WITH_SELECT: \"find model with select\",\n\tFIND_MODEL_WITH_MODIFIED_FIELD_NAME: \"find model with modified field name\",\n\tUPDATE_MODEL: \"update model\",\n\tSHOULD_FIND_MANY: \"should find many\",\n\tSHOULD_FIND_MANY_WITH_WHERE: \"should find many with where\",\n\tSHOULD_FIND_MANY_WITH_OPERATORS: \"should find many with operators\",\n\tSHOULD_WORK_WITH_REFERENCE_FIELDS: \"should work with reference fields\",\n\tSHOULD_FIND_MANY_WITH_NOT_IN_OPERATOR:\n\t\t\"should find many with not in operator\",\n\tSHOULD_FIND_MANY_WITH_SORT_BY: \"should find many with sortBy\",\n\tSHOULD_FIND_MANY_WITH_LIMIT: \"should find many with limit\",\n\tSHOULD_FIND_MANY_WITH_OFFSET: \"should find many with offset\",\n\tSHOULD_UPDATE_WITH_MULTIPLE_WHERE: \"should update with multiple where\",\n\tDELETE_MODEL: \"delete model\",\n\tSHOULD_DELETE_MANY: \"should delete many\",\n\tSHOULD_NOT_THROW_ON_DELETE_RECORD_NOT_FOUND:\n\t\t\"shouldn't throw on delete record not found\",\n\tSHOULD_NOT_THROW_ON_RECORD_NOT_FOUND: \"shouldn't throw on record not found\",\n\tSHOULD_FIND_MANY_WITH_CONTAINS_OPERATOR:\n\t\t\"should find many with contains operator\",\n\tSHOULD_SEARCH_USERS_WITH_STARTS_WITH: \"should search users with startsWith\",\n\tSHOULD_SEARCH_USERS_WITH_ENDS_WITH: \"should search users with endsWith\",\n\tSHOULD_PREFER_GENERATE_ID_IF_PROVIDED: \"should prefer generateId if provided\",\n\tSHOULD_ROLLBACK_FAILING_TRANSACTION: \"should rollback failing transaction\",\n\tSHOULD_RETURN_TRANSACTION_RESULT: \"should return transaction result\",\n\tSHOULD_FIND_MANY_WITH_CONNECTORS: \"should find many with connectors\",\n} as const;\n\nconst { ...numberIdAdapterTestsCopy } = adapterTests;\n\nconst numberIdAdapterTests = {\n\t...numberIdAdapterTestsCopy,\n\tSHOULD_RETURN_A_NUMBER_ID_AS_A_RESULT:\n\t\t\"Should return a number id as a result\",\n\tSHOULD_INCREMENT_THE_ID_BY_1: \"Should increment the id by 1\",\n};\n\n// @ts-expect-error\n// biome-ignore lint/performance/noDelete: testing propose\ndelete numberIdAdapterTests.SHOULD_NOT_THROW_ON_DELETE_RECORD_NOT_FOUND;\n\n/**\n * @deprecated Use `testAdapter` instead.\n */\nfunction adapterTest(\n\t{ getAdapter, disableTests: disabledTests, testPrefix }: AdapterTestOptions,\n\tinternalOptions?: {\n\t\tpredefinedOptions: Omit<BetterAuthOptions, \"database\">;\n\t},\n) {\n\tconsole.warn(\n\t\t\"This test function is deprecated and will be removed in the future. Use `testAdapter` instead.\",\n\t);\n\tconst adapter = async () =>\n\t\tawait getAdapter(internalOptions?.predefinedOptions);\n\n\tasync function resetDebugLogs() {\n\t\t//@ts-expect-error\n\t\t(await adapter())?.adapterTestDebugLogs?.resetDebugLogs();\n\t}\n\n\tasync function printDebugLogs() {\n\t\t//@ts-expect-error\n\t\t(await adapter())?.adapterTestDebugLogs?.printDebugLogs();\n\t}\n\n\t// Generate unique test identifier for this test run to avoid conflicts\n\tconst testRunId =\n\t\tDate.now().toString(36) + Math.random().toString(36).substring(2, 5);\n\tconst getUniqueEmail = (base: string) => `${testRunId}_${base}`;\n\n\t//@ts-expect-error - intentionally omitting id\n\tlet user: {\n\t\tname: string;\n\t\temail: string;\n\t\temailVerified: boolean;\n\t\tcreatedAt: Date;\n\t\tupdatedAt: Date;\n\t\tid: string;\n\t} = {\n\t\tname: \"user\",\n\t\temail: getUniqueEmail(\"user@email.com\"),\n\t\temailVerified: true,\n\t\tcreatedAt: new Date(),\n\t\tupdatedAt: new Date(),\n\t};\n\n\ttest.skipIf(disabledTests?.CREATE_MODEL)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.CREATE_MODEL}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: user,\n\t\t\t});\n\t\t\tuser.id = res.id;\n\t\t\texpect({\n\t\t\t\tname: res.name,\n\t\t\t\temail: res.email,\n\t\t\t}).toEqual({\n\t\t\t\tname: user.name,\n\t\t\t\temail: user.email,\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.CREATE_MODEL_SHOULD_ALWAYS_RETURN_AN_ID)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.CREATE_MODEL_SHOULD_ALWAYS_RETURN_AN_ID\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"test-name-without-id\",\n\t\t\t\t\temail: getUniqueEmail(\"test-email-without-id@email.com\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(res).toHaveProperty(\"id\");\n\t\t\texpect(typeof res?.id).toEqual(\"string\");\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.FIND_MODEL)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.FIND_MODEL}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect({\n\t\t\t\tname: res?.name,\n\t\t\t\temail: res?.email,\n\t\t\t}).toEqual({\n\t\t\t\tname: user.name,\n\t\t\t\temail: user.email,\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.FIND_MODEL_WITHOUT_ID)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.FIND_MODEL_WITHOUT_ID\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: user.email,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect({\n\t\t\t\tname: res?.name,\n\t\t\t\temail: res?.email,\n\t\t\t}).toEqual({\n\t\t\t\tname: user.name,\n\t\t\t\temail: user.email,\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.FIND_MODEL_WITH_MODIFIED_FIELD_NAME)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.FIND_MODEL_WITH_MODIFIED_FIELD_NAME\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst email = getUniqueEmail(\"test-email-with-modified-field@email.com\");\n\t\t\tconst adapter = await getAdapter(\n\t\t\t\tObject.assign(\n\t\t\t\t\t{\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tfields: {\n\t\t\t\t\t\t\t\temail: \"email_address\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tinternalOptions?.predefinedOptions,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst user = await adapter.create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\temail,\n\t\t\t\t\tname: \"test-name-with-modified-field\",\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(user.email).toEqual(email);\n\t\t\tconst res = await adapter.findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: email,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res).not.toBeNull();\n\t\t\texpect(res?.email).toEqual(email);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.FIND_MODEL_WITH_SELECT)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.FIND_MODEL_WITH_SELECT\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findOne({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tselect: [\"email\"],\n\t\t\t});\n\t\t\texpect(res).toEqual({ email: user.email });\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.UPDATE_MODEL)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.UPDATE_MODEL}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst newEmail = getUniqueEmail(\"updated@email.com\");\n\n\t\t\tconst res = await (await adapter()).update<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: {\n\t\t\t\t\temail: newEmail,\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(res).toMatchObject({\n\t\t\t\temail: newEmail,\n\t\t\t\tname: user.name,\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.SHOULD_FIND_MANY}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t});\n\t\t\texpect(res.length).toBe(3);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_WHERE)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_WHERE\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst user = await (await adapter()).create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user2\",\n\t\t\t\t\temail: getUniqueEmail(\"test@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res.length).toBe(1);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_OPERATORS)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_OPERATORS\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst newUser = await (await adapter()).create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user\",\n\t\t\t\t\temail: getUniqueEmail(\"test-email2@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\toperator: \"in\",\n\t\t\t\t\t\tvalue: [user.id, newUser.id],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res.length).toBe(2);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_NOT_IN_OPERATOR)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_NOT_IN_OPERATOR\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\n\t\t\tconst newUser3 = await (await adapter()).create<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user\",\n\t\t\t\t\temail: getUniqueEmail(\"test-email3@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst allUsers = await (await adapter()).findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t});\n\t\t\texpect(allUsers.length).toBe(6);\n\t\t\tconst usersWithoutNotIn = await (await adapter()).findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\toperator: \"not_in\",\n\t\t\t\t\t\tvalue: [user.id, newUser3.id],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(usersWithoutNotIn.length).toBe(4);\n\t\t\t//cleanup\n\t\t\tawait (await adapter()).delete({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: newUser3.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_WORK_WITH_REFERENCE_FIELDS)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_WORK_WITH_REFERENCE_FIELDS\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tlet token = null;\n\t\t\tconst user = await (await adapter()).create<Record<string, any>>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user\",\n\t\t\t\t\temail: getUniqueEmail(\"my-email@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst session = await (await adapter()).create({\n\t\t\t\tmodel: \"session\",\n\t\t\t\tdata: {\n\t\t\t\t\ttoken: generateId(),\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\tuserId: user.id,\n\t\t\t\t\texpiresAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\ttoken = session.token;\n\t\t\tconst res = await (await adapter()).findOne({\n\t\t\t\tmodel: \"session\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst resToken = await (await adapter()).findOne({\n\t\t\t\tmodel: \"session\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"token\",\n\t\t\t\t\t\tvalue: token,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res).toMatchObject({\n\t\t\t\tuserId: user.id,\n\t\t\t});\n\t\t\texpect(resToken).toMatchObject({\n\t\t\t\tuserId: user.id,\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_SORT_BY)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_SORT_BY\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"a\",\n\t\t\t\t\temail: getUniqueEmail(\"a@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tsortBy: {\n\t\t\t\t\tfield: \"name\",\n\t\t\t\t\tdirection: \"asc\",\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(res[0]!.name).toBe(\"a\");\n\n\t\t\tconst res2 = await (await adapter()).findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tsortBy: {\n\t\t\t\t\tfield: \"name\",\n\t\t\t\t\tdirection: \"desc\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\texpect(res2[res2.length - 1]!.name).toBe(\"a\");\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_LIMIT)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_LIMIT\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tlimit: 1,\n\t\t\t});\n\t\t\texpect(res.length).toBe(1);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_OFFSET)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_OFFSET\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\toffset: 2,\n\t\t\t});\n\t\t\texpect(res.length).toBe(5);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_UPDATE_WITH_MULTIPLE_WHERE)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_UPDATE_WITH_MULTIPLE_WHERE\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\t// Note: user's email was already updated in the previous test\n\t\t\tconst currentEmail = getUniqueEmail(\"updated@email.com\");\n\t\t\tawait (await adapter()).updateMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: user.name,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: currentEmail,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: {\n\t\t\t\t\temail: getUniqueEmail(\"updated2@email.com\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst updatedUser = await (await adapter()).findOne<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: getUniqueEmail(\"updated2@email.com\"),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(updatedUser).toMatchObject({\n\t\t\t\tname: user.name,\n\t\t\t\temail: getUniqueEmail(\"updated2@email.com\"),\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.DELETE_MODEL)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.DELETE_MODEL}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tawait (await adapter()).delete({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst findRes = await (await adapter()).findOne({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(findRes).toBeNull();\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_DELETE_MANY)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.SHOULD_DELETE_MANY}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tfor (const i of [\"to-be-delete-1\", \"to-be-delete-2\", \"to-be-delete-3\"]) {\n\t\t\t\tawait (await adapter()).create({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tname: \"to-be-deleted\",\n\t\t\t\t\t\temail: getUniqueEmail(`email@test-${i}.com`),\n\t\t\t\t\t\temailVerified: true,\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst findResFirst = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: \"to-be-deleted\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(findResFirst.length).toBe(3);\n\t\t\tawait (await adapter()).deleteMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: \"to-be-deleted\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst findRes = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: \"to-be-deleted\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(findRes.length).toBe(0);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_NOT_THROW_ON_DELETE_RECORD_NOT_FOUND)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_NOT_THROW_ON_DELETE_RECORD_NOT_FOUND\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tawait (await adapter()).delete({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: \"100000\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_NOT_THROW_ON_RECORD_NOT_FOUND)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_NOT_THROW_ON_RECORD_NOT_FOUND\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findOne({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: \"100000\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res).toBeNull();\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_CONTAINS_OPERATOR)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_CONTAINS_OPERATOR\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\toperator: \"contains\",\n\t\t\t\t\t\tvalue: \"user2\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res.length).toBe(1);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_SEARCH_USERS_WITH_STARTS_WITH)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_SEARCH_USERS_WITH_STARTS_WITH\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user_starts\",\n\t\t\t\t\temail: getUniqueEmail(\"startswith1@test.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user2_starts\",\n\t\t\t\t\temail: getUniqueEmail(\"startswith2@test.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user3_starts\",\n\t\t\t\t\temail: getUniqueEmail(\"startswith3@test.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\toperator: \"starts_with\",\n\t\t\t\t\t\tvalue: \"user\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res.length).toBeGreaterThanOrEqual(3);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_SEARCH_USERS_WITH_ENDS_WITH)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_SEARCH_USERS_WITH_ENDS_WITH\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\t// Create test user for this test with unique suffix\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"tester2\",\n\t\t\t\t\temail: getUniqueEmail(\"endswith@test.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst res = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\toperator: \"ends_with\",\n\t\t\t\t\t\tvalue: \"ter2\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(res.length).toBe(1);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_PREFER_GENERATE_ID_IF_PROVIDED)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_PREFER_GENERATE_ID_IF_PROVIDED\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst customAdapter = await getAdapter(\n\t\t\t\tObject.assign(\n\t\t\t\t\t{\n\t\t\t\t\t\tadvanced: {\n\t\t\t\t\t\t\tdatabase: {\n\t\t\t\t\t\t\t\tgenerateId: () => \"mocked-id\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t} satisfies BetterAuthOptions,\n\t\t\t\t\tinternalOptions?.predefinedOptions,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst res = await customAdapter.create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"user4\",\n\t\t\t\t\temail: getUniqueEmail(\"user4@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\texpect(res.id).toBe(\"mocked-id\");\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_ROLLBACK_FAILING_TRANSACTION)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.SHOULD_ROLLBACK_FAILING_TRANSACTION}`,\n\t\tasync ({ onTestFailed, skip }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst customAdapter = await adapter();\n\n\t\t\t// Check if adapter actually supports transactions\n\t\t\tconst enableTransaction =\n\t\t\t\tcustomAdapter?.options?.adapterConfig.transaction;\n\t\t\tif (!enableTransaction) {\n\t\t\t\tskip(\n\t\t\t\t\t`Skipping test: ${\n\t\t\t\t\t\tcustomAdapter?.options?.adapterConfig.adapterName || \"Adapter\"\n\t\t\t\t\t}\n\t\t\t\t\t does not support transactions`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst user5 = {\n\t\t\t\tname: \"user5\",\n\t\t\t\temail: getUniqueEmail(\"user5@email.com\"),\n\t\t\t\temailVerified: true,\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t};\n\t\t\tconst user6 = {\n\t\t\t\tname: \"user6\",\n\t\t\t\temail: getUniqueEmail(\"user6@email.com\"),\n\t\t\t\temailVerified: true,\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t};\n\t\t\tawait expect(\n\t\t\t\tcustomAdapter.transaction(async (tx) => {\n\t\t\t\t\tawait tx.create({ model: \"user\", data: user5 });\n\t\t\t\t\tthrow new Error(\"Simulated failure\");\n\t\t\t\t\tawait tx.create({ model: \"user\", data: user6 });\n\t\t\t\t}),\n\t\t\t).rejects.toThrow(\"Simulated failure\");\n\n\t\t\tawait expect(\n\t\t\t\tcustomAdapter.findMany({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\t\tvalue: user5.email,\n\t\t\t\t\t\t\tconnector: \"OR\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\t\tvalue: user6.email,\n\t\t\t\t\t\t\tconnector: \"OR\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t).resolves.toEqual([]);\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_RETURN_TRANSACTION_RESULT)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${adapterTests.SHOULD_RETURN_TRANSACTION_RESULT}`,\n\t\tasync ({ onTestFailed, skip }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\t\t\tconst customAdapter = await adapter();\n\n\t\t\tconst enableTransaction =\n\t\t\t\tcustomAdapter?.options?.adapterConfig.transaction;\n\t\t\tif (!enableTransaction) {\n\t\t\t\tskip(\n\t\t\t\t\t`Skipping test: ${\n\t\t\t\t\t\tcustomAdapter?.options?.adapterConfig.adapterName || \"Adapter\"\n\t\t\t\t\t}\n\t\t\t\t\t does not support transactions`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst result = await customAdapter.transaction(async (tx) => {\n\t\t\t\tconst createdUser = await tx.create<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tname: \"user6\",\n\t\t\t\t\t\temail: getUniqueEmail(\"user6@email.com\"),\n\t\t\t\t\t\temailVerified: true,\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn createdUser.email;\n\t\t\t});\n\n\t\t\texpect(result).toEqual(getUniqueEmail(\"user6@email.com\"));\n\t\t},\n\t);\n\n\ttest.skipIf(disabledTests?.SHOULD_FIND_MANY_WITH_CONNECTORS)(\n\t\t`${testPrefix ? `${testPrefix} - ` : \"\"}${\n\t\t\tadapterTests.SHOULD_FIND_MANY_WITH_CONNECTORS\n\t\t}`,\n\t\tasync ({ onTestFailed }) => {\n\t\t\tawait resetDebugLogs();\n\t\t\tonTestFailed(async () => {\n\t\t\t\tawait printDebugLogs();\n\t\t\t});\n\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"connector-user1\",\n\t\t\t\t\temail: getUniqueEmail(\"connector-user1@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait (await adapter()).create({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tdata: {\n\t\t\t\t\tname: \"con-user2\",\n\t\t\t\t\temail: getUniqueEmail(\"connector-user2@email.com\"),\n\t\t\t\t\temailVerified: true,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst andRes = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: \"con-user2\",\n\t\t\t\t\t\tconnector: \"AND\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: getUniqueEmail(\"connector-user2@email.com\"),\n\t\t\t\t\t\tconnector: \"AND\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\n\t\t\texpect(andRes.length).toBe(1);\n\n\t\t\tconst orRes = await (await adapter()).findMany({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: \"connector-user1\",\n\t\t\t\t\t\tconnector: \"OR\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"name\",\n\t\t\t\t\t\tvalue: \"con-user2\",\n\t\t\t\t\t\tconnector: \"OR\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\texpect(orRes.length).toBe(2);\n\t\t},\n\t);\n}\n\nexport function runAdapterTest(opts: AdapterTestOptions) {\n\treturn adapterTest(opts);\n}\n\nexport function runNumberIdAdapterTest(opts: NumberIdAdapterTestOptions) {\n\tconst cleanup: { modelName: string; id: string }[] = [];\n\n\t// Generate unique test identifier for this test run to avoid conflicts\n\tconst testRunId =\n\t\tDate.now().toString(36) + Math.random().toString(36).substr(2, 5);\n\tconst getUniqueEmail = (base: string) => `${testRunId}_${base}`;\n\n\tconst adapter = async () =>\n\t\tawait opts.getAdapter({\n\t\t\tadvanced: {\n\t\t\t\tdatabase: {\n\t\t\t\t\tgenerateId: \"serial\",\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\tdescribe(\"Should run number id specific tests\", async () => {\n\t\tlet idNumber = -1;\n\n\t\tasync function resetDebugLogs() {\n\t\t\t//@ts-expect-error\n\t\t\t(await adapter())?.adapterTestDebugLogs?.resetDebugLogs();\n\t\t}\n\n\t\tasync function printDebugLogs() {\n\t\t\t//@ts-expect-error\n\t\t\t(await adapter())?.adapterTestDebugLogs?.printDebugLogs();\n\t\t}\n\t\ttest.skipIf(opts.disableTests?.SHOULD_RETURN_A_NUMBER_ID_AS_A_RESULT)(\n\t\t\t`${opts.testPrefix ? `${opts.testPrefix} - ` : \"\"}${\n\t\t\t\tnumberIdAdapterTests.SHOULD_RETURN_A_NUMBER_ID_AS_A_RESULT\n\t\t\t}`,\n\t\t\tasync ({ onTestFailed }) => {\n\t\t\t\tawait resetDebugLogs();\n\t\t\t\tonTestFailed(async () => {\n\t\t\t\t\tawait printDebugLogs();\n\t\t\t\t});\n\t\t\t\tconst res = await (await adapter()).create({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tname: \"user\",\n\t\t\t\t\t\temail: getUniqueEmail(\"number-user@email.com\"),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tcleanup.push({ modelName: \"user\", id: res.id });\n\t\t\t\texpect(typeof res.id).toBe(\"string\"); // we forcefully return all `id`s as strings. this is intentional.\n\t\t\t\texpect(parseInt(res.id)).toBeGreaterThan(0);\n\t\t\t\tidNumber = parseInt(res.id);\n\t\t\t},\n\t\t);\n\t\ttest.skipIf(opts.disableTests?.SHOULD_INCREMENT_THE_ID_BY_1)(\n\t\t\t`${opts.testPrefix ? `${opts.testPrefix} - ` : \"\"}${\n\t\t\t\tnumberIdAdapterTests.SHOULD_INCREMENT_THE_ID_BY_1\n\t\t\t}`,\n\t\t\tasync ({ onTestFailed }) => {\n\t\t\t\tawait resetDebugLogs();\n\t\t\t\tonTestFailed(async () => {\n\t\t\t\t\tconsole.log(`ID number from last create: ${idNumber}`);\n\t\t\t\t\tawait printDebugLogs();\n\t\t\t\t});\n\t\t\t\tconst res = await (await adapter()).create({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tname: \"user2\",\n\t\t\t\t\t\temail: getUniqueEmail(\"number-user2@email.com\"),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tcleanup.push({ modelName: \"user\", id: res.id });\n\t\t\t\texpect(parseInt(res.id)).toBe(idNumber + 1);\n\t\t\t},\n\t\t);\n\t});\n\n\tdescribe(\"Should run normal adapter tests with number id enabled\", async () => {\n\t\tbeforeAll(async () => {\n\t\t\tfor (const { modelName, id } of cleanup) {\n\t\t\t\tawait (await adapter()).delete({\n\t\t\t\t\tmodel: modelName,\n\t\t\t\t\twhere: [{ field: \"id\", value: id }],\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tawait adapterTest(\n\t\t\t{\n\t\t\t\t...opts,\n\t\t\t\tdisableTests: {\n\t\t\t\t\t...opts.disableTests,\n\t\t\t\t\tSHOULD_PREFER_GENERATE_ID_IF_PROVIDED: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tpredefinedOptions: {\n\t\t\t\t\tadvanced: {\n\t\t\t\t\t\tdatabase: {\n\t\t\t\t\t\t\tgenerateId: \"serial\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t});\n}\n\nexport function recoverProcessTZ() {\n\tconst originalTZ = process.env.TZ;\n\treturn {\n\t\t[Symbol.dispose]: () => {\n\t\t\tprocess.env.TZ = originalTZ;\n\t\t},\n\t};\n}\n"],"mappings":";;;;AAsBA,MAAM,eAAe;CACpB,cAAc;CACd,yCACC;CACD,YAAY;CACZ,uBAAuB;CACvB,wBAAwB;CACxB,qCAAqC;CACrC,cAAc;CACd,kBAAkB;CAClB,6BAA6B;CAC7B,iCAAiC;CACjC,mCAAmC;CACnC,uCACC;CACD,+BAA+B;CAC/B,6BAA6B;CAC7B,8BAA8B;CAC9B,mCAAmC;CACnC,cAAc;CACd,oBAAoB;CACpB,6CACC;CACD,sCAAsC;CACtC,yCACC;CACD,sCAAsC;CACtC,oCAAoC;CACpC,uCAAuC;CACvC,qCAAqC;CACrC,kCAAkC;CAClC,kCAAkC;CAClC;AAED,MAAM,EAAE,GAAG,6BAA6B;AAExC,MAAM,uBAAuB;CAC5B,GAAG;CACH,uCACC;CACD,8BAA8B;CAC9B;AAID,OAAO,qBAAqB;;;;AAK5B,SAAS,YACR,EAAE,YAAY,cAAc,eAAe,cAC3C,iBAGC;AACD,SAAQ,KACP,iGACA;CACD,MAAM,UAAU,YACf,MAAM,WAAW,iBAAiB,kBAAkB;CAErD,eAAe,iBAAiB;AAE/B,GAAC,MAAM,SAAS,GAAG,sBAAsB,gBAAgB;;CAG1D,eAAe,iBAAiB;AAE/B,GAAC,MAAM,SAAS,GAAG,sBAAsB,gBAAgB;;CAI1D,MAAM,YACL,KAAK,KAAK,CAAC,SAAS,GAAG,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,UAAU,GAAG,EAAE;CACrE,MAAM,kBAAkB,SAAiB,GAAG,UAAU,GAAG;CAGzD,IAAIA,OAOA;EACH,MAAM;EACN,OAAO,eAAe,iBAAiB;EACvC,eAAe;EACf,2BAAW,IAAI,MAAM;EACrB,2BAAW,IAAI,MAAM;EACrB;AAED,MAAK,OAAO,eAAe,aAAa,CACvC,GAAG,aAAa,GAAG,WAAW,OAAO,KAAK,aAAa,gBACvD,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;EACF,MAAM,MAAM,OAAO,MAAM,SAAS,EAAE,OAAO;GAC1C,OAAO;GACP,MAAM;GACN,CAAC;AACF,OAAK,KAAK,IAAI;AACd,SAAO;GACN,MAAM,IAAI;GACV,OAAO,IAAI;GACX,CAAC,CAAC,QAAQ;GACV,MAAM,KAAK;GACX,OAAO,KAAK;GACZ,CAAC;GAEH;AAED,MAAK,OAAO,eAAe,wCAAwC,CAClE,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,2CAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;EACF,MAAM,MAAM,OAAO,MAAM,SAAS,EAAE,OAAO;GAC1C,OAAO;GACP,MAAM;IACL,MAAM;IACN,OAAO,eAAe,kCAAkC;IACxD;GACD,CAAC;AACF,SAAO,IAAI,CAAC,eAAe,KAAK;AAChC,SAAO,OAAO,KAAK,GAAG,CAAC,QAAQ,SAAS;GAEzC;AAED,MAAK,OAAO,eAAe,WAAW,CACrC,GAAG,aAAa,GAAG,WAAW,OAAO,KAAK,aAAa,cACvD,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;EACF,MAAM,MAAM,OAAO,MAAM,SAAS,EAAE,QAAc;GACjD,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO,KAAK;IACZ,CACD;GACD,CAAC;AACF,SAAO;GACN,MAAM,KAAK;GACX,OAAO,KAAK;GACZ,CAAC,CAAC,QAAQ;GACV,MAAM,KAAK;GACX,OAAO,KAAK;GACZ,CAAC;GAEH;AAED,MAAK,OAAO,eAAe,sBAAsB,CAChD,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,yBAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;EACF,MAAM,MAAM,OAAO,MAAM,SAAS,EAAE,QAAc;GACjD,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO,KAAK;IACZ,CACD;GACD,CAAC;AACF,SAAO;GACN,MAAM,KAAK;GACX,OAAO,KAAK;GACZ,CAAC,CAAC,QAAQ;GACV,MAAM,KAAK;GACX,OAAO,KAAK;GACZ,CAAC;GAEH;AAED,MAAK,OAAO,eAAe,oCAAoC,CAC9D,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,uCAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;EACF,MAAM,QAAQ,eAAe,2CAA2C;EACxE,MAAMC,YAAU,MAAM,WACrB,OAAO,OACN,EACC,MAAM,EACL,QAAQ,EACP,OAAO,iBACP,EACD,EACD,EACD,iBAAiB,kBACjB,CACD;AAWD,UAVa,MAAMA,UAAQ,OAAO;GACjC,OAAO;GACP,MAAM;IACL;IACA,MAAM;IACN,eAAe;IACf,2BAAW,IAAI,MAAM;IACrB,2BAAW,IAAI,MAAM;IACrB;GACD,CAAC,EACU,MAAM,CAAC,QAAQ,MAAM;EACjC,MAAM,MAAM,MAAMA,UAAQ,QAAc;GACvC,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO;IACP,CACD;GACD,CAAC;AACF,SAAO,IAAI,CAAC,IAAI,UAAU;AAC1B,SAAO,KAAK,MAAM,CAAC,QAAQ,MAAM;GAElC;AAED,MAAK,OAAO,eAAe,uBAAuB,CACjD,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,0BAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;AAWF,SAVY,OAAO,MAAM,SAAS,EAAE,QAAQ;GAC3C,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO,KAAK;IACZ,CACD;GACD,QAAQ,CAAC,QAAQ;GACjB,CAAC,CACS,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC;GAE3C;AAED,MAAK,OAAO,eAAe,aAAa,CACvC,GAAG,aAAa,GAAG,WAAW,OAAO,KAAK,aAAa,gBACvD,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;EACF,MAAM,WAAW,eAAe,oBAAoB;AAcpD,SAZY,OAAO,MAAM,SAAS,EAAE,OAAa;GAChD,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO,KAAK;IACZ,CACD;GACD,QAAQ,EACP,OAAO,UACP;GACD,CAAC,CACS,CAAC,cAAc;GACzB,OAAO;GACP,MAAM,KAAK;GACX,CAAC;GAEH;AAED,MAAK,OAAO,eAAe,iBAAiB,CAC3C,GAAG,aAAa,GAAG,WAAW,OAAO,KAAK,aAAa,oBACvD,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;AAIF,UAHY,OAAO,MAAM,SAAS,EAAE,SAAS,EAC5C,OAAO,QACP,CAAC,EACS,OAAO,CAAC,KAAK,EAAE;GAE3B;AAED,MAAK,OAAO,eAAe,4BAA4B,CACtD,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,+BAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;EACF,MAAMC,SAAO,OAAO,MAAM,SAAS,EAAE,OAAa;GACjD,OAAO;GACP,MAAM;IACL,MAAM;IACN,OAAO,eAAe,iBAAiB;IACvC,eAAe;IACf,2BAAW,IAAI,MAAM;IACrB,2BAAW,IAAI,MAAM;IACrB;GACD,CAAC;AAUF,UATY,OAAO,MAAM,SAAS,EAAE,SAAS;GAC5C,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAOA,OAAK;IACZ,CACD;GACD,CAAC,EACS,OAAO,CAAC,KAAK,EAAE;GAE3B;AAED,MAAK,OAAO,eAAe,gCAAgC,CAC1D,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,mCAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;EACF,MAAM,UAAU,OAAO,MAAM,SAAS,EAAE,OAAa;GACpD,OAAO;GACP,MAAM;IACL,MAAM;IACN,OAAO,eAAe,wBAAwB;IAC9C,eAAe;IACf,2BAAW,IAAI,MAAM;IACrB,2BAAW,IAAI,MAAM;IACrB;GACD,CAAC;AAWF,UAVY,OAAO,MAAM,SAAS,EAAE,SAAS;GAC5C,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,UAAU;IACV,OAAO,CAAC,KAAK,IAAI,QAAQ,GAAG;IAC5B,CACD;GACD,CAAC,EACS,OAAO,CAAC,KAAK,EAAE;GAE3B;AAED,MAAK,OAAO,eAAe,sCAAsC,CAChE,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,yCAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;EAEF,MAAM,WAAW,OAAO,MAAM,SAAS,EAAE,OAAa;GACrD,OAAO;GACP,MAAM;IACL,MAAM;IACN,OAAO,eAAe,wBAAwB;IAC9C,eAAe;IACf,2BAAW,IAAI,MAAM;IACrB,2BAAW,IAAI,MAAM;IACrB;GACD,CAAC;AAIF,UAHiB,OAAO,MAAM,SAAS,EAAE,SAAe,EACvD,OAAO,QACP,CAAC,EACc,OAAO,CAAC,KAAK,EAAE;AAW/B,UAV0B,OAAO,MAAM,SAAS,EAAE,SAAe;GAChE,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,UAAU;IACV,OAAO,CAAC,KAAK,IAAI,SAAS,GAAG;IAC7B,CACD;GACD,CAAC,EACuB,OAAO,CAAC,KAAK,EAAE;AAExC,SAAO,MAAM,SAAS,EAAE,OAAO;GAC9B,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO,SAAS;IAChB,CACD;GACD,CAAC;GAEH;AAED,MAAK,OAAO,eAAe,kCAAkC,CAC5D,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,qCAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;EACF,IAAI,QAAQ;EACZ,MAAMA,SAAO,OAAO,MAAM,SAAS,EAAE,OAA4B;GAChE,OAAO;GACP,MAAM;IACL,MAAM;IACN,OAAO,eAAe,qBAAqB;IAC3C,eAAe;IACf,2BAAW,IAAI,MAAM;IACrB,2BAAW,IAAI,MAAM;IACrB;GACD,CAAC;AAWF,WAVgB,OAAO,MAAM,SAAS,EAAE,OAAO;GAC9C,OAAO;GACP,MAAM;IACL,OAAO,YAAY;IACnB,2BAAW,IAAI,MAAM;IACrB,2BAAW,IAAI,MAAM;IACrB,QAAQA,OAAK;IACb,2BAAW,IAAI,MAAM;IACrB;GACD,CAAC,EACc;EAChB,MAAM,MAAM,OAAO,MAAM,SAAS,EAAE,QAAQ;GAC3C,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAOA,OAAK;IACZ,CACD;GACD,CAAC;EACF,MAAM,WAAW,OAAO,MAAM,SAAS,EAAE,QAAQ;GAChD,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO;IACP,CACD;GACD,CAAC;AACF,SAAO,IAAI,CAAC,cAAc,EACzB,QAAQA,OAAK,IACb,CAAC;AACF,SAAO,SAAS,CAAC,cAAc,EAC9B,QAAQA,OAAK,IACb,CAAC;GAEH;AAED,MAAK,OAAO,eAAe,8BAA8B,CACxD,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,iCAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;AACF,SAAO,MAAM,SAAS,EAAE,OAAO;GAC9B,OAAO;GACP,MAAM;IACL,MAAM;IACN,OAAO,eAAe,cAAc;IACpC,eAAe;IACf,2BAAW,IAAI,MAAM;IACrB,2BAAW,IAAI,MAAM;IACrB;GACD,CAAC;AAQF,UAPY,OAAO,MAAM,SAAS,EAAE,SAAe;GAClD,OAAO;GACP,QAAQ;IACP,OAAO;IACP,WAAW;IACX;GACD,CAAC,EACS,GAAI,KAAK,CAAC,KAAK,IAAI;EAE9B,MAAM,OAAO,OAAO,MAAM,SAAS,EAAE,SAAe;GACnD,OAAO;GACP,QAAQ;IACP,OAAO;IACP,WAAW;IACX;GACD,CAAC;AAEF,SAAO,KAAK,KAAK,SAAS,GAAI,KAAK,CAAC,KAAK,IAAI;GAE9C;AAED,MAAK,OAAO,eAAe,4BAA4B,CACtD,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,+BAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;AAKF,UAJY,OAAO,MAAM,SAAS,EAAE,SAAS;GAC5C,OAAO;GACP,OAAO;GACP,CAAC,EACS,OAAO,CAAC,KAAK,EAAE;GAE3B;AAED,MAAK,OAAO,eAAe,6BAA6B,CACvD,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,gCAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;AAKF,UAJY,OAAO,MAAM,SAAS,EAAE,SAAS;GAC5C,OAAO;GACP,QAAQ;GACR,CAAC,EACS,OAAO,CAAC,KAAK,EAAE;GAE3B;AAED,MAAK,OAAO,eAAe,kCAAkC,CAC5D,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,qCAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;EAEF,MAAM,eAAe,eAAe,oBAAoB;AACxD,SAAO,MAAM,SAAS,EAAE,WAAW;GAClC,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO,KAAK;IACZ,EACD;IACC,OAAO;IACP,OAAO;IACP,CACD;GACD,QAAQ,EACP,OAAO,eAAe,qBAAqB,EAC3C;GACD,CAAC;AAUF,SAToB,OAAO,MAAM,SAAS,EAAE,QAAc;GACzD,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO,eAAe,qBAAqB;IAC3C,CACD;GACD,CAAC,CACiB,CAAC,cAAc;GACjC,MAAM,KAAK;GACX,OAAO,eAAe,qBAAqB;GAC3C,CAAC;GAEH;AAED,MAAK,OAAO,eAAe,aAAa,CACvC,GAAG,aAAa,GAAG,WAAW,OAAO,KAAK,aAAa,gBACvD,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;AACF,SAAO,MAAM,SAAS,EAAE,OAAO;GAC9B,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO,KAAK;IACZ,CACD;GACD,CAAC;AAUF,SATgB,OAAO,MAAM,SAAS,EAAE,QAAQ;GAC/C,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO,KAAK;IACZ,CACD;GACD,CAAC,CACa,CAAC,UAAU;GAE3B;AAED,MAAK,OAAO,eAAe,mBAAmB,CAC7C,GAAG,aAAa,GAAG,WAAW,OAAO,KAAK,aAAa,sBACvD,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;AACF,OAAK,MAAM,KAAK;GAAC;GAAkB;GAAkB;GAAiB,CACrE,QAAO,MAAM,SAAS,EAAE,OAAO;GAC9B,OAAO;GACP,MAAM;IACL,MAAM;IACN,OAAO,eAAe,cAAc,EAAE,MAAM;IAC5C,eAAe;IACf,2BAAW,IAAI,MAAM;IACrB,2BAAW,IAAI,MAAM;IACrB;GACD,CAAC;AAWH,UATqB,OAAO,MAAM,SAAS,EAAE,SAAS;GACrD,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO;IACP,CACD;GACD,CAAC,EACkB,OAAO,CAAC,KAAK,EAAE;AACnC,SAAO,MAAM,SAAS,EAAE,WAAW;GAClC,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO;IACP,CACD;GACD,CAAC;AAUF,UATgB,OAAO,MAAM,SAAS,EAAE,SAAS;GAChD,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO;IACP,CACD;GACD,CAAC,EACa,OAAO,CAAC,KAAK,EAAE;GAE/B;AAED,MAAK,OAAO,eAAe,4CAA4C,CACtE,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,+CAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;AACF,SAAO,MAAM,SAAS,EAAE,OAAO;GAC9B,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO;IACP,CACD;GACD,CAAC;GAEH;AAED,MAAK,OAAO,eAAe,qCAAqC,CAC/D,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,wCAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;AAUF,SATY,OAAO,MAAM,SAAS,EAAE,QAAQ;GAC3C,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO;IACP,CACD;GACD,CAAC,CACS,CAAC,UAAU;GAEvB;AAED,MAAK,OAAO,eAAe,wCAAwC,CAClE,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,2CAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;AAWF,UAVY,OAAO,MAAM,SAAS,EAAE,SAAS;GAC5C,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,UAAU;IACV,OAAO;IACP,CACD;GACD,CAAC,EACS,OAAO,CAAC,KAAK,EAAE;GAE3B;AAED,MAAK,OAAO,eAAe,qCAAqC,CAC/D,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,wCAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;AACF,SAAO,MAAM,SAAS,EAAE,OAAO;GAC9B,OAAO;GACP,MAAM;IACL,MAAM;IACN,OAAO,eAAe,uBAAuB;IAC7C,eAAe;IACf,2BAAW,IAAI,MAAM;IACrB,2BAAW,IAAI,MAAM;IACrB;GACD,CAAC;AACF,SAAO,MAAM,SAAS,EAAE,OAAO;GAC9B,OAAO;GACP,MAAM;IACL,MAAM;IACN,OAAO,eAAe,uBAAuB;IAC7C,eAAe;IACf,2BAAW,IAAI,MAAM;IACrB,2BAAW,IAAI,MAAM;IACrB;GACD,CAAC;AACF,SAAO,MAAM,SAAS,EAAE,OAAO;GAC9B,OAAO;GACP,MAAM;IACL,MAAM;IACN,OAAO,eAAe,uBAAuB;IAC7C,eAAe;IACf,2BAAW,IAAI,MAAM;IACrB,2BAAW,IAAI,MAAM;IACrB;GACD,CAAC;AAWF,UAVY,OAAO,MAAM,SAAS,EAAE,SAAS;GAC5C,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,UAAU;IACV,OAAO;IACP,CACD;GACD,CAAC,EACS,OAAO,CAAC,uBAAuB,EAAE;GAE7C;AAED,MAAK,OAAO,eAAe,mCAAmC,CAC7D,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,sCAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;AAEF,SAAO,MAAM,SAAS,EAAE,OAAO;GAC9B,OAAO;GACP,MAAM;IACL,MAAM;IACN,OAAO,eAAe,oBAAoB;IAC1C,eAAe;IACf,2BAAW,IAAI,MAAM;IACrB,2BAAW,IAAI,MAAM;IACrB;GACD,CAAC;AAWF,UAVY,OAAO,MAAM,SAAS,EAAE,SAAS;GAC5C,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,UAAU;IACV,OAAO;IACP,CACD;GACD,CAAC,EACS,OAAO,CAAC,KAAK,EAAE;GAE3B;AAED,MAAK,OAAO,eAAe,sCAAsC,CAChE,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,yCAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;AAyBF,UAXY,OAbU,MAAM,WAC3B,OAAO,OACN,EACC,UAAU,EACT,UAAU,EACT,kBAAkB,aAClB,EACD,EACD,EACD,iBAAiB,kBACjB,CACD,EAE+B,OAAO;GACtC,OAAO;GACP,MAAM;IACL,MAAM;IACN,OAAO,eAAe,kBAAkB;IACxC,eAAe;IACf,2BAAW,IAAI,MAAM;IACrB,2BAAW,IAAI,MAAM;IACrB;GACD,CAAC,EAES,GAAG,CAAC,KAAK,YAAY;GAEjC;AAED,MAAK,OAAO,eAAe,oCAAoC,CAC9D,GAAG,aAAa,GAAG,WAAW,OAAO,KAAK,aAAa,uCACvD,OAAO,EAAE,cAAc,WAAW;AACjC,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;EACF,MAAM,gBAAgB,MAAM,SAAS;AAKrC,MAAI,CADH,eAAe,SAAS,cAAc,aACf;AACvB,QACC,kBACC,eAAe,SAAS,cAAc,eAAe,UACrD;qCAED;AACD;;EAGD,MAAM,QAAQ;GACb,MAAM;GACN,OAAO,eAAe,kBAAkB;GACxC,eAAe;GACf,2BAAW,IAAI,MAAM;GACrB,2BAAW,IAAI,MAAM;GACrB;EACD,MAAM,QAAQ;GACb,MAAM;GACN,OAAO,eAAe,kBAAkB;GACxC,eAAe;GACf,2BAAW,IAAI,MAAM;GACrB,2BAAW,IAAI,MAAM;GACrB;AACD,QAAM,OACL,cAAc,YAAY,OAAO,OAAO;AACvC,SAAM,GAAG,OAAO;IAAE,OAAO;IAAQ,MAAM;IAAO,CAAC;AAC/C,SAAM,IAAI,MAAM,oBAAoB;IAEnC,CACF,CAAC,QAAQ,QAAQ,oBAAoB;AAEtC,QAAM,OACL,cAAc,SAAS;GACtB,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO,MAAM;IACb,WAAW;IACX,EACD;IACC,OAAO;IACP,OAAO,MAAM;IACb,WAAW;IACX,CACD;GACD,CAAC,CACF,CAAC,SAAS,QAAQ,EAAE,CAAC;GAEvB;AAED,MAAK,OAAO,eAAe,iCAAiC,CAC3D,GAAG,aAAa,GAAG,WAAW,OAAO,KAAK,aAAa,oCACvD,OAAO,EAAE,cAAc,WAAW;AACjC,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;EACF,MAAM,gBAAgB,MAAM,SAAS;AAIrC,MAAI,CADH,eAAe,SAAS,cAAc,aACf;AACvB,QACC,kBACC,eAAe,SAAS,cAAc,eAAe,UACrD;qCAED;AACD;;AAkBD,SAfe,MAAM,cAAc,YAAY,OAAO,OAAO;AAY5D,WAXoB,MAAM,GAAG,OAAa;IACzC,OAAO;IACP,MAAM;KACL,MAAM;KACN,OAAO,eAAe,kBAAkB;KACxC,eAAe;KACf,2BAAW,IAAI,MAAM;KACrB,2BAAW,IAAI,MAAM;KACrB;IACD,CAAC,EAEiB;IAClB,CAEY,CAAC,QAAQ,eAAe,kBAAkB,CAAC;GAE1D;AAED,MAAK,OAAO,eAAe,iCAAiC,CAC3D,GAAG,aAAa,GAAG,WAAW,OAAO,KACpC,aAAa,oCAEd,OAAO,EAAE,mBAAmB;AAC3B,QAAM,gBAAgB;AACtB,eAAa,YAAY;AACxB,SAAM,gBAAgB;IACrB;AAEF,SAAO,MAAM,SAAS,EAAE,OAAO;GAC9B,OAAO;GACP,MAAM;IACL,MAAM;IACN,OAAO,eAAe,4BAA4B;IAClD,eAAe;IACf,2BAAW,IAAI,MAAM;IACrB,2BAAW,IAAI,MAAM;IACrB;GACD,CAAC;AACF,SAAO,MAAM,SAAS,EAAE,OAAO;GAC9B,OAAO;GACP,MAAM;IACL,MAAM;IACN,OAAO,eAAe,4BAA4B;IAClD,eAAe;IACf,2BAAW,IAAI,MAAM;IACrB,2BAAW,IAAI,MAAM;IACrB;GACD,CAAC;AAkBF,UAhBe,OAAO,MAAM,SAAS,EAAE,SAAS;GAC/C,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO;IACP,WAAW;IACX,EACD;IACC,OAAO;IACP,OAAO,eAAe,4BAA4B;IAClD,WAAW;IACX,CACD;GACD,CAAC,EAEY,OAAO,CAAC,KAAK,EAAE;AAiB7B,UAfc,OAAO,MAAM,SAAS,EAAE,SAAS;GAC9C,OAAO;GACP,OAAO,CACN;IACC,OAAO;IACP,OAAO;IACP,WAAW;IACX,EACD;IACC,OAAO;IACP,OAAO;IACP,WAAW;IACX,CACD;GACD,CAAC,EACW,OAAO,CAAC,KAAK,EAAE;GAE7B;;AAGF,SAAgB,eAAe,MAA0B;AACxD,QAAO,YAAY,KAAK;;AAGzB,SAAgB,uBAAuB,MAAkC;CACxE,MAAMC,UAA+C,EAAE;CAGvD,MAAM,YACL,KAAK,KAAK,CAAC,SAAS,GAAG,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,OAAO,GAAG,EAAE;CAClE,MAAM,kBAAkB,SAAiB,GAAG,UAAU,GAAG;CAEzD,MAAM,UAAU,YACf,MAAM,KAAK,WAAW,EACrB,UAAU,EACT,UAAU,EACT,YAAY,UACZ,EACD,EACD,CAAC;AACH,UAAS,uCAAuC,YAAY;EAC3D,IAAI,WAAW;EAEf,eAAe,iBAAiB;AAE/B,IAAC,MAAM,SAAS,GAAG,sBAAsB,gBAAgB;;EAG1D,eAAe,iBAAiB;AAE/B,IAAC,MAAM,SAAS,GAAG,sBAAsB,gBAAgB;;AAE1D,OAAK,OAAO,KAAK,cAAc,sCAAsC,CACpE,GAAG,KAAK,aAAa,GAAG,KAAK,WAAW,OAAO,KAC9C,qBAAqB,yCAEtB,OAAO,EAAE,mBAAmB;AAC3B,SAAM,gBAAgB;AACtB,gBAAa,YAAY;AACxB,UAAM,gBAAgB;KACrB;GACF,MAAM,MAAM,OAAO,MAAM,SAAS,EAAE,OAAO;IAC1C,OAAO;IACP,MAAM;KACL,MAAM;KACN,OAAO,eAAe,wBAAwB;KAC9C;IACD,CAAC;AACF,WAAQ,KAAK;IAAE,WAAW;IAAQ,IAAI,IAAI;IAAI,CAAC;AAC/C,UAAO,OAAO,IAAI,GAAG,CAAC,KAAK,SAAS;AACpC,UAAO,SAAS,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE;AAC3C,cAAW,SAAS,IAAI,GAAG;IAE5B;AACD,OAAK,OAAO,KAAK,cAAc,6BAA6B,CAC3D,GAAG,KAAK,aAAa,GAAG,KAAK,WAAW,OAAO,KAC9C,qBAAqB,gCAEtB,OAAO,EAAE,mBAAmB;AAC3B,SAAM,gBAAgB;AACtB,gBAAa,YAAY;AACxB,YAAQ,IAAI,+BAA+B,WAAW;AACtD,UAAM,gBAAgB;KACrB;GACF,MAAM,MAAM,OAAO,MAAM,SAAS,EAAE,OAAO;IAC1C,OAAO;IACP,MAAM;KACL,MAAM;KACN,OAAO,eAAe,yBAAyB;KAC/C;IACD,CAAC;AACF,WAAQ,KAAK;IAAE,WAAW;IAAQ,IAAI,IAAI;IAAI,CAAC;AAC/C,UAAO,SAAS,IAAI,GAAG,CAAC,CAAC,KAAK,WAAW,EAAE;IAE5C;GACA;AAEF,UAAS,0DAA0D,YAAY;AAC9E,YAAU,YAAY;AACrB,QAAK,MAAM,EAAE,WAAW,QAAQ,QAC/B,QAAO,MAAM,SAAS,EAAE,OAAO;IAC9B,OAAO;IACP,OAAO,CAAC;KAAE,OAAO;KAAM,OAAO;KAAI,CAAC;IACnC,CAAC;IAEF;AACF,QAAM,YACL;GACC,GAAG;GACH,cAAc;IACb,GAAG,KAAK;IACR,uCAAuC;IACvC;GACD,EACD,EACC,mBAAmB,EAClB,UAAU,EACT,UAAU,EACT,YAAY,UACZ,EACD,EACD,EACD,CACD;GACA;;AAGH,SAAgB,mBAAmB;CAClC,MAAM,aAAa,QAAQ,IAAI;AAC/B,QAAO,GACL,OAAO,gBAAgB;AACvB,UAAQ,IAAI,KAAK;IAElB"}
|