From 5ca7745dd4d12a22233f8c5ba74ab7be455bb6d6 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Tue, 23 Sep 2025 12:37:49 -0700 Subject: [PATCH] chore: set `noUncheckedIndexedAccess` to true (#4828) --- .../src/adapters/adapter-factory/index.ts | 46 ++++++++-------- .../test/adapter-factory.test.ts | 10 ++-- .../adapters/kysely-adapter/kysely-adapter.ts | 10 ++-- .../test/normal/node-sqlite-dialect.test.ts | 2 +- .../adapters/memory-adapter/memory-adapter.ts | 24 ++++----- .../mongodb-adapter/mongodb-adapter.ts | 4 +- .../adapters/prisma-adapter/prisma-adapter.ts | 18 +++---- packages/better-auth/src/adapters/test.ts | 4 +- .../src/api/check-endpoint-conflicts.test.ts | 2 +- packages/better-auth/src/api/index.test.ts | 4 +- .../src/api/routes/account.test.ts | 8 +-- .../src/api/routes/reset-password.test.ts | 6 +-- .../src/api/routes/session-api.test.ts | 2 +- packages/better-auth/src/client/config.ts | 6 +-- packages/better-auth/src/client/parser.ts | 15 +++--- packages/better-auth/src/client/vue/index.ts | 2 +- .../better-auth/src/cookies/cookie-utils.ts | 8 +-- packages/better-auth/src/cookies/index.ts | 2 +- packages/better-auth/src/crypto/buffer.ts | 4 +- packages/better-auth/src/db/get-migration.ts | 12 ++--- packages/better-auth/src/db/get-schema.ts | 8 +-- .../better-auth/src/db/get-tables.test.ts | 12 +++-- packages/better-auth/src/db/schema.ts | 26 ++++----- packages/better-auth/src/db/utils.ts | 2 +- .../src/oauth2/validate-authorization-code.ts | 2 +- .../src/plugins/admin/admin.test.ts | 8 +-- .../better-auth/src/plugins/admin/admin.ts | 5 +- .../src/plugins/anonymous/index.ts | 2 +- .../better-auth/src/plugins/bearer/index.ts | 4 +- .../custom-session/custom-session.test.ts | 4 +- .../generic-oauth/generic-oauth.test.ts | 6 +-- .../src/plugins/haveibeenpwned/index.ts | 2 +- .../better-auth/src/plugins/jwt/jwt.test.ts | 4 +- .../src/plugins/last-login-method/client.ts | 2 +- .../better-auth/src/plugins/mcp/authorize.ts | 2 +- packages/better-auth/src/plugins/mcp/index.ts | 6 +-- .../src/plugins/multi-session/index.ts | 4 +- .../src/plugins/oidc-provider/authorize.ts | 2 +- .../src/plugins/oidc-provider/index.ts | 10 ++-- .../src/plugins/open-api/open-api.test.ts | 10 ++-- .../plugins/organization/organization.test.ts | 53 +++++++++---------- .../routes/crud-access-control.test.ts | 2 +- .../routes/crud-access-control.ts | 6 +-- .../organization/routes/crud-invites.ts | 12 ++--- .../organization/routes/crud-members.test.ts | 12 ++--- .../src/plugins/organization/team.test.ts | 32 +++++------ .../src/plugins/passkey/passkey.test.ts | 2 +- packages/better-auth/src/plugins/sso/index.ts | 2 +- .../src/plugins/two-factor/otp/index.ts | 6 +-- .../src/plugins/two-factor/two-factor.test.ts | 2 +- .../better-auth/src/social-providers/kick.ts | 2 +- .../src/social-providers/reddit.ts | 2 +- .../src/social-providers/social.test.ts | 4 +- .../detectors/detect-project-info.ts | 2 +- .../telemetry/detectors/detect-system-info.ts | 4 +- .../better-auth/src/test-utils/headers.ts | 2 +- packages/better-auth/src/test-utils/state.ts | 2 +- .../better-auth/src/utils/get-request-ip.ts | 2 +- packages/better-auth/src/utils/hashing.ts | 6 +-- packages/better-auth/src/utils/merger.ts | 4 +- packages/better-auth/src/utils/time.ts | 8 +-- packages/better-auth/src/utils/wildcard.ts | 10 ++-- packages/better-auth/tsconfig.json | 1 - 63 files changed, 246 insertions(+), 242 deletions(-) diff --git a/packages/better-auth/src/adapters/adapter-factory/index.ts b/packages/better-auth/src/adapters/adapter-factory/index.ts index 28792595f0..94a875f053 100644 --- a/packages/better-auth/src/adapters/adapter-factory/index.ts +++ b/packages/better-auth/src/adapters/adapter-factory/index.ts @@ -112,8 +112,7 @@ export const createAdapterFactory = let f = schema[model]?.fields[field]; if (!f) { - //@ts-expect-error - f = Object.values(schema[model]?.fields).find( + f = Object.values(schema[model]?.fields!).find( (f) => f.fieldName === field, ); } @@ -181,8 +180,8 @@ export const createAdapterFactory = if (useCustomModelName) { return usePlural - ? `${schema[defaultModelKey].modelName}s` - : schema[defaultModelKey].modelName; + ? `${schema[defaultModelKey]!.modelName}s` + : schema[defaultModelKey]!.modelName; } return usePlural ? `${model}s` : model; @@ -320,9 +319,9 @@ export const createAdapterFactory = model: model, }); - const fields = schema[defaultModelName].fields; + const fields = schema[defaultModelName]!.fields; fields.id = idField({ customModelName: defaultModelName }); - return fields[defaultFieldName]; + return fields[defaultFieldName]!; }; const adapterInstance = customAdapter({ @@ -343,7 +342,7 @@ export const createAdapterFactory = forceAllowId?: boolean, ) => { const transformedData: Record = {}; - const fields = schema[unsafe_model].fields; + const fields = schema[unsafe_model]!.fields; const newMappedKeys = config.mapKeysTransformInput ?? {}; if ( !config.disableIdGeneration && @@ -359,27 +358,27 @@ export const createAdapterFactory = const fieldAttributes = fields[field]; let newFieldName: string = - newMappedKeys[field] || fields[field].fieldName || field; + newMappedKeys[field] || fields[field]!.fieldName || field; if ( value === undefined && - ((fieldAttributes.defaultValue === undefined && - !fieldAttributes.transform?.input && - !(action === "update" && fieldAttributes.onUpdate)) || - (action === "update" && !fieldAttributes.onUpdate)) + ((fieldAttributes!.defaultValue === undefined && + !fieldAttributes!.transform?.input && + !(action === "update" && fieldAttributes!.onUpdate)) || + (action === "update" && !fieldAttributes!.onUpdate)) ) { continue; } // If the value is undefined, but the fieldAttr provides a `defaultValue`, then we'll use that. - let newValue = withApplyDefault(value, fieldAttributes, action); + let newValue = withApplyDefault(value, fieldAttributes!, action); // If the field attr provides a custom transform input, then we'll let it handle the value transformation. // Afterwards, we'll continue to apply the default transformations just to make sure it saves in the correct format. - if (fieldAttributes.transform?.input) { - newValue = await fieldAttributes.transform.input(newValue); + if (fieldAttributes!.transform?.input) { + newValue = await fieldAttributes!.transform.input(newValue); } if ( - fieldAttributes.references?.field === "id" && + fieldAttributes!.references?.field === "id" && options.advanced?.database?.useNumberId ) { if (Array.isArray(newValue)) { @@ -390,13 +389,13 @@ export const createAdapterFactory = } else if ( config.supportsJSON === false && typeof newValue === "object" && - fieldAttributes.type === "json" + fieldAttributes!.type === "json" ) { newValue = JSON.stringify(newValue); } else if ( config.supportsDates === false && newValue instanceof Date && - fieldAttributes.type === "date" + fieldAttributes!.type === "date" ) { newValue = newValue.toISOString(); } else if ( @@ -411,7 +410,7 @@ export const createAdapterFactory = data: newValue, action, field: newFieldName, - fieldAttributes: fieldAttributes, + fieldAttributes: fieldAttributes!, model: unsafe_model, schema, options, @@ -433,7 +432,7 @@ export const createAdapterFactory = if (!data) return null; const newMappedKeys = config.mapKeysTransformOutput ?? {}; const transformedData: Record = {}; - const tableSchema = schema[unsafe_model].fields; + const tableSchema = schema[unsafe_model]!.fields; const idKey = Object.entries(newMappedKeys).find( ([_, v]) => v === "id", )?.[0]; @@ -543,7 +542,10 @@ export const createAdapterFactory = model: defaultModelName, }); - if (defaultFieldName === "id" || fieldAttr.references?.field === "id") { + if ( + defaultFieldName === "id" || + fieldAttr!.references?.field === "id" + ) { if (options.advanced?.database?.useNumberId) { if (Array.isArray(value)) { return { @@ -1028,7 +1030,7 @@ export const createAdapterFactory = let log: any[] = debugLogs .reverse() .map((log) => { - log[0] = `\n${log[0]}`; + log[0] = `\n${log[0]!}`; return [...log, "\n"]; }) .reduce( diff --git a/packages/better-auth/src/adapters/adapter-factory/test/adapter-factory.test.ts b/packages/better-auth/src/adapters/adapter-factory/test/adapter-factory.test.ts index cf658965a8..91a29cfc6d 100644 --- a/packages/better-auth/src/adapters/adapter-factory/test/adapter-factory.test.ts +++ b/packages/better-auth/src/adapters/adapter-factory/test/adapter-factory.test.ts @@ -1425,7 +1425,7 @@ describe("Create Adapter Helper", async () => { expect(res).toHaveProperty("email"); expect(res?.email).toEqual("test@test.com"); }); - expect(parameters.where[0].field).toEqual("email_address"); + expect(parameters.where[0]!.field).toEqual("email_address"); }); test("findMany: Should transform the where clause according to the schema", async () => { const parameters: { where: Where[] | undefined; model: string } = @@ -1467,7 +1467,7 @@ describe("Create Adapter Helper", async () => { expect(res[0]).toHaveProperty("email"); expect(res[0]?.email).toEqual("test@test.com"); }); - expect(parameters.where?.[0].field).toEqual("email_address"); + expect(parameters.where?.[0]!.field).toEqual("email_address"); }); test("findOne: Should receive an integer id in where clause if the user has enabled `useNumberId`", async () => { @@ -1507,7 +1507,7 @@ describe("Create Adapter Helper", async () => { expect(res?.id).toEqual("1"); }); // The where clause should convert the string id value of `"1"` to an int since `useNumberId` is true - expect(parameters.where[0].value).toEqual(1); + expect(parameters.where[0]!.value).toEqual(1); }); test("findMany: Should receive an integer id in where clause if the user has enabled `useNumberId`", async () => { const parameters: { where: Where[] | undefined; model: string } = @@ -1545,10 +1545,10 @@ describe("Create Adapter Helper", async () => { }); expect(res[0]).toHaveProperty("id"); - expect(res[0].id).toEqual("1"); + expect(res[0]!.id).toEqual("1"); }); // The where clause should convert the string id value of `"1"` to an int since `useNumberId` is true - expect(parameters.where?.[0].value).toEqual(1); + expect(parameters.where?.[0]!.value).toEqual(1); }); }); }); diff --git a/packages/better-auth/src/adapters/kysely-adapter/kysely-adapter.ts b/packages/better-auth/src/adapters/kysely-adapter/kysely-adapter.ts index 75f1702ff2..bb778ae7ae 100644 --- a/packages/better-auth/src/adapters/kysely-adapter/kysely-adapter.ts +++ b/packages/better-auth/src/adapters/kysely-adapter/kysely-adapter.ts @@ -60,7 +60,7 @@ export const kyselyAdapter = ( await builder.execute(); const field = values.id ? "id" - : where.length > 0 && where[0].field + : where.length > 0 && where[0]?.field ? where[0].field : "id"; @@ -74,7 +74,7 @@ export const kyselyAdapter = ( return res; } - const value = values[field] || where[0].value; + const value = values[field] || where[0]?.value; res = await db .selectFrom(model) .selectAll() @@ -102,14 +102,14 @@ export const kyselyAdapter = ( f = Object.values(schema).find((f) => f.modelName === model)!; } if ( - f.type === "boolean" && + f!.type === "boolean" && (type === "sqlite" || type === "mssql") && value !== null && value !== undefined ) { return value ? 1 : 0; } - if (f.type === "date" && value && value instanceof Date) { + if (f!.type === "date" && value && value instanceof Date) { return type === "sqlite" ? value.toISOString() : value; } return value; @@ -326,7 +326,7 @@ export const kyselyAdapter = ( query = query.where((eb) => eb.or(or.map((expr) => expr(eb)))); } const res = await query.execute(); - return res[0].count as number; + return res[0]!.count as number; }, async delete({ model, where }) { const { and, or } = convertWhereClause(model, where); diff --git a/packages/better-auth/src/adapters/kysely-adapter/test/normal/node-sqlite-dialect.test.ts b/packages/better-auth/src/adapters/kysely-adapter/test/normal/node-sqlite-dialect.test.ts index b485c8466f..a95b24a73c 100644 --- a/packages/better-auth/src/adapters/kysely-adapter/test/normal/node-sqlite-dialect.test.ts +++ b/packages/better-auth/src/adapters/kysely-adapter/test/normal/node-sqlite-dialect.test.ts @@ -8,7 +8,7 @@ import type { BetterAuthOptions } from "../../../../types"; import merge from "deepmerge"; import type { DatabaseSync } from "node:sqlite"; const nodeVersion = process.version; -const nodeSqliteSupported = +nodeVersion.split(".")[0].slice(1) >= 22; +const nodeSqliteSupported = +nodeVersion.split(".")[0]!.slice(1) >= 22; describe.runIf(nodeSqliteSupported)("node-sqlite-dialect", async () => { let db: DatabaseSync; diff --git a/packages/better-auth/src/adapters/memory-adapter/memory-adapter.ts b/packages/better-auth/src/adapters/memory-adapter/memory-adapter.ts index 5619873446..79a1c31737 100644 --- a/packages/better-auth/src/adapters/memory-adapter/memory-adapter.ts +++ b/packages/better-auth/src/adapters/memory-adapter/memory-adapter.ts @@ -28,7 +28,7 @@ export const memoryAdapter = (db: MemoryDB, config?: MemoryAdapterConfig) => { props.field === "id" && props.action === "create" ) { - return db[props.model].length + 1; + return db[props.model]!.length + 1; } return props.data; }, @@ -39,7 +39,7 @@ export const memoryAdapter = (db: MemoryDB, config?: MemoryAdapterConfig) => { } catch { // Rollback changes Object.keys(db).forEach((key) => { - db[key] = clone[key]; + db[key] = clone[key]!; }); throw new Error("Transaction failed, rolling back changes"); } @@ -87,7 +87,7 @@ export const memoryAdapter = (db: MemoryDB, config?: MemoryAdapterConfig) => { return true; } - let result = evalClause(record, where[0]); + let result = evalClause(record, where[0]!); for (const clause of where) { const clauseResult = evalClause(record, clause); @@ -105,12 +105,12 @@ export const memoryAdapter = (db: MemoryDB, config?: MemoryAdapterConfig) => { create: async ({ model, data }) => { if (options.advanced?.database?.useNumberId) { // @ts-expect-error - data.id = db[model].length + 1; + data.id = db[model]!.length + 1; } if (!db[model]) { db[model] = []; } - db[model].push(data); + db[model]!.push(data); return data; }, findOne: async ({ model, where }) => { @@ -124,7 +124,7 @@ export const memoryAdapter = (db: MemoryDB, config?: MemoryAdapterConfig) => { table = convertWhereClause(where, model); } if (sortBy) { - table = table.sort((a, b) => { + table = table!.sort((a, b) => { const field = getFieldName({ model, field: sortBy.field }); if (sortBy.direction === "asc") { return a[field] > b[field] ? 1 : -1; @@ -134,15 +134,15 @@ export const memoryAdapter = (db: MemoryDB, config?: MemoryAdapterConfig) => { }); } if (offset !== undefined) { - table = table.slice(offset); + table = table!.slice(offset); } if (limit !== undefined) { - table = table.slice(0, limit); + table = table!.slice(0, limit); } - return table; + return table || []; }, count: async ({ model }) => { - return db[model].length; + return db[model]!.length; }, update: async ({ model, where, update }) => { const res = convertWhereClause(where, model); @@ -152,12 +152,12 @@ export const memoryAdapter = (db: MemoryDB, config?: MemoryAdapterConfig) => { return res[0] || null; }, delete: async ({ model, where }) => { - const table = db[model]; + const table = db[model]!; const res = convertWhereClause(where, model); db[model] = table.filter((record) => !res.includes(record)); }, deleteMany: async ({ model, where }) => { - const table = db[model]; + const table = db[model]!; const res = convertWhereClause(where, model); let count = 0; db[model] = table.filter((record) => { diff --git a/packages/better-auth/src/adapters/mongodb-adapter/mongodb-adapter.ts b/packages/better-auth/src/adapters/mongodb-adapter/mongodb-adapter.ts index f0624d4bfc..febc2f4226 100644 --- a/packages/better-auth/src/adapters/mongodb-adapter/mongodb-adapter.ts +++ b/packages/better-auth/src/adapters/mongodb-adapter/mongodb-adapter.ts @@ -67,7 +67,7 @@ export const mongodbAdapter = (db: Db, config?: MongoDBAdapterConfig) => { if ( field === "id" || field === "_id" || - schema[model].fields[field]?.references?.field === "id" + schema[model]!.fields[field]?.references?.field === "id" ) { if (typeof value !== "string") { if (value instanceof ObjectId) { @@ -176,7 +176,7 @@ export const mongodbAdapter = (db: Db, config?: MongoDBAdapterConfig) => { return { condition, connector }; }); if (conditions.length === 1) { - return conditions[0].condition; + return conditions[0]!.condition; } const andConditions = conditions .filter((c) => c.connector === "AND") diff --git a/packages/better-auth/src/adapters/prisma-adapter/prisma-adapter.ts b/packages/better-auth/src/adapters/prisma-adapter/prisma-adapter.ts index 08b2f09414..cf2fbdbb05 100644 --- a/packages/better-auth/src/adapters/prisma-adapter/prisma-adapter.ts +++ b/packages/better-auth/src/adapters/prisma-adapter/prisma-adapter.ts @@ -93,7 +93,7 @@ export const prismaAdapter = (prisma: PrismaClient, config: PrismaConfig) => { const convertWhereClause = (model: string, where?: Where[]) => { if (!where) return {}; if (where.length === 1) { - const w = where[0]; + const w = where[0]!; if (!w) { return; } @@ -142,7 +142,7 @@ export const prismaAdapter = (prisma: PrismaClient, config: PrismaConfig) => { `Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`, ); } - return await db[model].create({ + return await db[model]!.create({ data: values, select: convertSelect(select, model), }); @@ -154,7 +154,7 @@ export const prismaAdapter = (prisma: PrismaClient, config: PrismaConfig) => { `Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`, ); } - return await db[model].findFirst({ + return await db[model]!.findFirst({ where: whereClause, select: convertSelect(select, model), }); @@ -167,7 +167,7 @@ export const prismaAdapter = (prisma: PrismaClient, config: PrismaConfig) => { ); } - return (await db[model].findMany({ + return (await db[model]!.findMany({ where: whereClause, take: limit || 100, skip: offset || 0, @@ -188,7 +188,7 @@ export const prismaAdapter = (prisma: PrismaClient, config: PrismaConfig) => { `Model ${model} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`, ); } - return await db[model].count({ + return await db[model]!.count({ where: whereClause, }); }, @@ -199,14 +199,14 @@ export const prismaAdapter = (prisma: PrismaClient, config: PrismaConfig) => { ); } const whereClause = convertWhereClause(model, where); - return await db[model].update({ + return await db[model]!.update({ where: whereClause, data: update, }); }, async updateMany({ model, where, update }) { const whereClause = convertWhereClause(model, where); - const result = await db[model].updateMany({ + const result = await db[model]!.updateMany({ where: whereClause, data: update, }); @@ -215,7 +215,7 @@ export const prismaAdapter = (prisma: PrismaClient, config: PrismaConfig) => { async delete({ model, where }) { const whereClause = convertWhereClause(model, where); try { - await db[model].delete({ + await db[model]!.delete({ where: whereClause, }); } catch (e) { @@ -224,7 +224,7 @@ export const prismaAdapter = (prisma: PrismaClient, config: PrismaConfig) => { }, async deleteMany({ model, where }) { const whereClause = convertWhereClause(model, where); - const result = await db[model].deleteMany({ + const result = await db[model]!.deleteMany({ where: whereClause, }); return result ? (result.count as number) : 0; diff --git a/packages/better-auth/src/adapters/test.ts b/packages/better-auth/src/adapters/test.ts index 3fbaca0e6a..a8c483739a 100644 --- a/packages/better-auth/src/adapters/test.ts +++ b/packages/better-auth/src/adapters/test.ts @@ -511,7 +511,7 @@ function adapterTest( direction: "asc", }, }); - expect(res[0].name).toBe("a"); + expect(res[0]!.name).toBe("a"); const res2 = await (await adapter()).findMany({ model: "user", @@ -521,7 +521,7 @@ function adapterTest( }, }); - expect(res2[res2.length - 1].name).toBe("a"); + expect(res2[res2.length - 1]!.name).toBe("a"); }, ); diff --git a/packages/better-auth/src/api/check-endpoint-conflicts.test.ts b/packages/better-auth/src/api/check-endpoint-conflicts.test.ts index b3793c7e22..d702ec7d31 100644 --- a/packages/better-auth/src/api/check-endpoint-conflicts.test.ts +++ b/packages/better-auth/src/api/check-endpoint-conflicts.test.ts @@ -229,7 +229,7 @@ describe("checkEndpointConflicts", () => { checkEndpointConflicts(options, mockLogger); expect(mockLogger.error).toHaveBeenCalledTimes(1); - const errorCall = mockLogger.error.mock.calls[0][0]; + const errorCall = mockLogger.error.mock.calls[0]![0]; expect(errorCall).toContain( '"/api/conflict" [GET] used by plugins: plugin1, plugin2', ); diff --git a/packages/better-auth/src/api/index.test.ts b/packages/better-auth/src/api/index.test.ts index 5391c1ae0c..178f560300 100644 --- a/packages/better-auth/src/api/index.test.ts +++ b/packages/better-auth/src/api/index.test.ts @@ -41,10 +41,10 @@ describe("getEndpoints", () => { context: { customProp: "value" }, }; - await middlewares[0].middleware(testCtx); + await middlewares[0]!.middleware(testCtx); expect(middlewareFn).toHaveBeenCalled(); - const call = middlewareFn.mock.calls[0][0]; + const call = middlewareFn.mock.calls[0]![0]; expect(call.context).toMatchObject({ baseURL: "http://localhost:3000", options: {}, diff --git a/packages/better-auth/src/api/routes/account.test.ts b/packages/better-auth/src/api/routes/account.test.ts index 9f1c9b52ba..983a8e6921 100644 --- a/packages/better-auth/src/api/routes/account.test.ts +++ b/packages/better-auth/src/api/routes/account.test.ts @@ -286,7 +286,7 @@ describe("account", async () => { await runWithDefaultUser(async () => { const previousAccounts = await client.listAccounts(); expect(previousAccounts.data?.length).toBe(3); - const unlinkAccountId = previousAccounts.data![1].accountId; + const unlinkAccountId = previousAccounts.data![1]!.accountId; const unlinkRes = await client.unlinkAccount({ providerId: "google", accountId: unlinkAccountId!, @@ -310,7 +310,7 @@ describe("account", async () => { }, ], }); - const unlinkAccountId = previousAccounts.data![0].accountId; + const unlinkAccountId = previousAccounts.data![0]!.accountId; const unlinkRes = await client.unlinkAccount({ providerId: "credential", accountId: unlinkAccountId, @@ -327,7 +327,7 @@ describe("account", async () => { const previousAccounts = await client.listAccounts(); expect(previousAccounts.data?.length).toBeGreaterThan(0); - const accountToUnlink = previousAccounts.data![0]; + const accountToUnlink = previousAccounts.data![0]!; const unlinkAccountId = accountToUnlink.accountId; const providerId = accountToUnlink.providerId; const accountsWithSameProvider = previousAccounts.data!.filter( @@ -390,7 +390,7 @@ describe("account", async () => { for (let i = 0; i < googleAccounts.length - 1; i++) { const unlinkRes = await client.unlinkAccount({ providerId: "google", - accountId: googleAccounts[i].accountId!, + accountId: googleAccounts[i]!.accountId!, }); expect(unlinkRes.data?.status).toBe(true); } diff --git a/packages/better-auth/src/api/routes/reset-password.test.ts b/packages/better-auth/src/api/routes/reset-password.test.ts index 7d2d23d61a..986dc3053d 100644 --- a/packages/better-auth/src/api/routes/reset-password.test.ts +++ b/packages/better-auth/src/api/routes/reset-password.test.ts @@ -12,7 +12,7 @@ describe("forget password", async (it) => { emailAndPassword: { enabled: true, async sendResetPassword({ url }) { - token = url.split("?")[0].split("/").pop() || ""; + token = url.split("?")[0]!.split("/").pop() || ""; await mockSendEmail(); }, onPasswordReset: async ({ user }) => { @@ -271,7 +271,7 @@ describe("revoke sessions on password reset", async (it) => { emailAndPassword: { enabled: true, async sendResetPassword({ url }) { - token = url.split("?")[0].split("/").pop() || ""; + token = url.split("?")[0]!.split("/").pop() || ""; await mockSendEmail(); }, revokeSessionsOnPasswordReset: true, @@ -313,7 +313,7 @@ describe("revoke sessions on password reset", async (it) => { emailAndPassword: { enabled: true, async sendResetPassword({ url }) { - token = url.split("?")[0].split("/").pop() || ""; + token = url.split("?")[0]!.split("/").pop() || ""; await mockSendEmail(); }, }, diff --git a/packages/better-auth/src/api/routes/session-api.test.ts b/packages/better-auth/src/api/routes/session-api.test.ts index 1fc5c9466c..814a5c6ad5 100644 --- a/packages/better-auth/src/api/routes/session-api.test.ts +++ b/packages/better-auth/src/api/routes/session-api.test.ts @@ -347,7 +347,7 @@ describe("session", async () => { }); const signInHeaders = new Headers(); - signInHeaders.set("cookie", signInRes.headers.getSetCookie()[0]); + signInHeaders.set("cookie", signInRes.headers.getSetCookie()[0]!); const sessionResWithoutHeaders = await auth.api.getSession({ headers: signInHeaders, diff --git a/packages/better-auth/src/client/config.ts b/packages/better-auth/src/client/config.ts index 1764d265e0..9df55a378b 100644 --- a/packages/better-auth/src/client/config.ts +++ b/packages/better-auth/src/client/config.ts @@ -91,15 +91,15 @@ export const getClientConfig = (options?: ClientOptions) => { const $store = { notify: (signal?: Omit | "$sessionSignal") => { - pluginsAtoms[signal as keyof typeof pluginsAtoms].set( - !pluginsAtoms[signal as keyof typeof pluginsAtoms].get(), + pluginsAtoms[signal as keyof typeof pluginsAtoms]!.set( + !pluginsAtoms[signal as keyof typeof pluginsAtoms]!.get(), ); }, listen: ( signal: Omit | "$sessionSignal", listener: (value: boolean, oldValue?: boolean | undefined) => void, ) => { - pluginsAtoms[signal as keyof typeof pluginsAtoms].subscribe(listener); + pluginsAtoms[signal as keyof typeof pluginsAtoms]!.subscribe(listener); }, atoms: pluginsAtoms, }; diff --git a/packages/better-auth/src/client/parser.ts b/packages/better-auth/src/client/parser.ts index 3f5f3204b6..fa3a279df3 100644 --- a/packages/better-auth/src/client/parser.ts +++ b/packages/better-auth/src/client/parser.ts @@ -58,19 +58,19 @@ function parseISODate(value: string): Date | null { let date = new Date( Date.UTC( - parseInt(year, 10), - parseInt(month, 10) - 1, - parseInt(day, 10), - parseInt(hour, 10), - parseInt(minute, 10), - parseInt(second, 10), + parseInt(year!, 10), + parseInt(month!, 10) - 1, + parseInt(day!, 10), + parseInt(hour!, 10), + parseInt(minute!, 10), + parseInt(second!, 10), ms ? parseInt(ms.padEnd(3, "0"), 10) : 0, ), ); if (offsetSign) { const offset = - (parseInt(offsetHour, 10) * 60 + parseInt(offsetMinute, 10)) * + (parseInt(offsetHour!, 10) * 60 + parseInt(offsetMinute!, 10)) * (offsetSign === "+" ? -1 : 1); date.setUTCMinutes(date.getUTCMinutes() + offset); } @@ -96,6 +96,7 @@ function betterJSONParse( const trimmed = value.trim(); if ( + trimmed.length > 0 && trimmed[0] === '"' && trimmed.endsWith('"') && !trimmed.slice(1, -1).includes('"') diff --git a/packages/better-auth/src/client/vue/index.ts b/packages/better-auth/src/client/vue/index.ts index e397fd4bad..869de75796 100644 --- a/packages/better-auth/src/client/vue/index.ts +++ b/packages/better-auth/src/client/vue/index.ts @@ -93,7 +93,7 @@ export function createAuthClient