diff --git a/packages/embeds/embed-core/src/embed.ts b/packages/embeds/embed-core/src/embed.ts index c39dbf2d00..7dcbcddd18 100644 --- a/packages/embeds/embed-core/src/embed.ts +++ b/packages/embeds/embed-core/src/embed.ts @@ -483,7 +483,9 @@ export class Cal { // linkReady event isn't received anyway by parent as it isn't whitelisted to be sent to parent but it is a safe guard return; } - this.iframe!.style.visibility = ""; + if (this.iframe) { + this.iframe.style.visibility = ""; + } // Removes the loader // TODO: We should be using consistent approach of "state" attribute for modalBox and inlineEl. @@ -1052,7 +1054,7 @@ class CalApi { const { embedConfig: previousEmbedConfig, embedRenderStartTime: previousEmbedRenderStartTime } = this.cal.getPreviousModalRenderStartVariables(); - let enrichedConfig; + let enrichedConfig: PrefillAndIframeAttrsConfig; const configWithGuestKeyAndColorScheme = withColorScheme( Cal.ensureGuestKey({ ...config, @@ -1061,7 +1063,7 @@ class CalApi { containerEl ); - let enrichedPrerenderOptions; + let enrichedPrerenderOptions: ModalPrerenderOptions | undefined; if (isPrerendering) { const preparationResult = this.cal.prepareForPrerender({ calLink, @@ -1578,7 +1580,7 @@ document.addEventListener("click", (e) => { const namespace = calLinkEl.dataset.calNamespace; const configString = calLinkEl.dataset.calConfig || ""; const calOrigin = calLinkEl.dataset.calOrigin || ""; - let config; + let config: PrefillAndIframeAttrsConfig; try { config = JSON.parse(configString); } catch { @@ -1602,7 +1604,7 @@ document.addEventListener("click", (e) => { }); function getCalLinkEl(target: EventTarget | null) { - let calLinkEl; + let calLinkEl: HTMLElement | Element | undefined; if (!(target instanceof HTMLElement)) { return null; } @@ -1641,7 +1643,7 @@ let currentColorScheme: string | null = null; })(); function getEmbedApiFn(ns: string) { - let api; + let api: GlobalCalWithoutNs | GlobalCal; if (ns === DEFAULT_NAMESPACE) { api = globalCal; } else { diff --git a/packages/lib/CalendarService.ts b/packages/lib/CalendarService.ts index e8ea2d1c14..04effe1d9e 100644 --- a/packages/lib/CalendarService.ts +++ b/packages/lib/CalendarService.ts @@ -458,9 +458,9 @@ export default abstract class BaseCalendarService implements Calendar { startDate.second = event.startDate.second; const iterator = event.iterator(startDate); let current: ICAL.Time; - let currentEvent; - let currentStart = null; - let currentError; + let currentEvent: ReturnType | undefined; + let currentStart: ReturnType | null = null; + let currentError: string | undefined; while ( maxIterations > 0 && diff --git a/packages/lib/CloseCom.ts b/packages/lib/CloseCom.ts index 23b00c7f96..047787339a 100644 --- a/packages/lib/CloseCom.ts +++ b/packages/lib/CloseCom.ts @@ -257,8 +257,8 @@ export default class CloseCom { body: new URLSearchParams({ grant_type: "refresh_token", refresh_token: this.refresh_token, - client_id: process.env.CLOSECOM_CLIENT_ID!, - client_secret: process.env.CLOSECOM_CLIENT_SECRET!, + client_id: process.env.CLOSECOM_CLIENT_ID ?? "", + client_secret: process.env.CLOSECOM_CLIENT_SECRET ?? "", }), }); diff --git a/packages/lib/availability.ts b/packages/lib/availability.ts index f5db09f3f3..78254b1e3b 100644 --- a/packages/lib/availability.ts +++ b/packages/lib/availability.ts @@ -31,7 +31,7 @@ export function getAvailabilityFromSchedule(schedule: Schedule): Availability[] } as Availability); const filteredTimes = times.filter((time) => { - let idx; + let idx: number; if ( (idx = availability.findIndex( (schedule) => diff --git a/packages/lib/components/ServerTrans.tsx b/packages/lib/components/ServerTrans.tsx index 83a477216e..e83336bf06 100644 --- a/packages/lib/components/ServerTrans.tsx +++ b/packages/lib/components/ServerTrans.tsx @@ -245,7 +245,7 @@ const parseObjectComponents = (content: string, components: Record { // Find all placeholders in order const placeholderRegex = /__HTML_[^_]+_[a-z0-9]+__/g; - let match; + let match2: RegExpExecArray | null; - while ((match = placeholderRegex.exec(processedContent)) !== null) { - const [placeholder] = match; - const index = match.index; + while ((match2 = placeholderRegex.exec(processedContent)) !== null) { + const [placeholder] = match2; + const index = match2.index; // Add text before placeholder if (index > lastIndex) { diff --git a/packages/lib/hooks/useUrlMatchesCurrentUrl.ts b/packages/lib/hooks/useUrlMatchesCurrentUrl.ts index b399212496..73c69afee2 100644 --- a/packages/lib/hooks/useUrlMatchesCurrentUrl.ts +++ b/packages/lib/hooks/useUrlMatchesCurrentUrl.ts @@ -10,7 +10,7 @@ export const useUrlMatchesCurrentUrl = (url: string, matchFullPath?: boolean) => const pathname = usePathname() as null | string; const searchParams = useCompatSearchParams(); const query = searchParams?.toString(); - let pathnameWithQuery; + let pathnameWithQuery: string | null; if (query) { pathnameWithQuery = `${pathname}?${query}`; } else { diff --git a/packages/lib/isOutOfBounds.tsx b/packages/lib/isOutOfBounds.tsx index d385227d3c..f1aa944a47 100644 --- a/packages/lib/isOutOfBounds.tsx +++ b/packages/lib/isOutOfBounds.tsx @@ -183,7 +183,7 @@ export function getRollingWindowEndDate({ const log = logger.getSubLogger({ prefix: ["getRollingWindowEndDate"] }); log.debug("called:", safeStringify({ startDay: startDateInBookerTz.format(), daysNeeded })); let counter = 1; - let rollingEndDay; + let rollingEndDay: ReturnType | undefined; const startOfStartDayInEventTz = startDateInBookerTz.startOf("day"); // It helps to break out of the loop if we don't find enough bookable days. const maxDaysToCheck = ROLLING_WINDOW_PERIOD_MAX_DAYS_TO_CHECK; diff --git a/packages/lib/schedules/transformers/for-atom.ts b/packages/lib/schedules/transformers/for-atom.ts index fd09ff3a4f..933fedabb7 100644 --- a/packages/lib/schedules/transformers/for-atom.ts +++ b/packages/lib/schedules/transformers/for-atom.ts @@ -52,8 +52,7 @@ export function transformDateOverridesForAtom( }; const dayRangeIndex = acc.findIndex( // early return prevents override.date from ever being empty. - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - (item) => yyyymmdd(item.ranges[0].start) === yyyymmdd(override.date!) + (item) => override.date && yyyymmdd(item.ranges[0].start) === yyyymmdd(override.date) ); if (dayRangeIndex === -1) { acc.push({ ranges: [newValue] }); diff --git a/packages/lib/server/PiiHasher.ts b/packages/lib/server/PiiHasher.ts index 04cd57363a..a60c5c29ac 100644 --- a/packages/lib/server/PiiHasher.ts +++ b/packages/lib/server/PiiHasher.ts @@ -28,7 +28,7 @@ export class Md5PiiHasher implements PiiHasher { } } -export const piiHasher: PiiHasher = new Md5PiiHasher(process.env.CALENDSO_ENCRYPTION_KEY!); +export const piiHasher: PiiHasher = new Md5PiiHasher(process.env.CALENDSO_ENCRYPTION_KEY ?? ""); export const hashEmail = (email: string, hasher: PiiHasher = piiHasher): string => { const [localPart, domain] = email.split("@"); diff --git a/packages/lib/smsLockState.ts b/packages/lib/smsLockState.ts index 336d15d416..1e904e9196 100644 --- a/packages/lib/smsLockState.ts +++ b/packages/lib/smsLockState.ts @@ -23,7 +23,7 @@ export async function checkSMSRateLimit({ } async function changeSMSLockState(identifier: string, status: SMSLockState) { - let userId, teamId; + let userId: number | undefined, teamId: number | undefined; if (identifier.startsWith("sms:user:")) { userId = Number(identifier.slice(9)); @@ -61,4 +61,4 @@ async function changeSMSLockState(identifier: string, status: SMSLockState) { }, }); } -} \ No newline at end of file +} diff --git a/packages/trpc/react/trpc.ts b/packages/trpc/react/trpc.ts index d6f16dc654..cbf2d94075 100644 --- a/packages/trpc/react/trpc.ts +++ b/packages/trpc/react/trpc.ts @@ -30,7 +30,7 @@ const resolveEndpoint = (links: any) => { // eslint-disable-next-line @typescript-eslint/no-explicit-any return (ctx: any) => { const parts = ctx.op.path.split("."); - let endpoint; + let endpoint: keyof typeof links; let path = ""; if (parts.length == 2) { endpoint = parts[0] as keyof typeof links; diff --git a/packages/trpc/server/routers/apps/routing-forms/formMutation.handler.ts b/packages/trpc/server/routers/apps/routing-forms/formMutation.handler.ts index cbe6d6dbdd..97f4bba27c 100644 --- a/packages/trpc/server/routers/apps/routing-forms/formMutation.handler.ts +++ b/packages/trpc/server/routers/apps/routing-forms/formMutation.handler.ts @@ -363,7 +363,8 @@ export const formMutationHandler = async ({ ctx, input }: FormMutationHandlerOpt }); } - let fields, routes; + let fields: NonNullable, + routes: NonNullable; if (shouldConnect) { routes = [ // This connected route would automatically link the fields diff --git a/packages/trpc/server/routers/loggedInViewer/teamsAndUserProfilesQuery.handler.ts b/packages/trpc/server/routers/loggedInViewer/teamsAndUserProfilesQuery.handler.ts index 6b2dd38f5d..4d9f6f62ce 100644 --- a/packages/trpc/server/routers/loggedInViewer/teamsAndUserProfilesQuery.handler.ts +++ b/packages/trpc/server/routers/loggedInViewer/teamsAndUserProfilesQuery.handler.ts @@ -67,7 +67,7 @@ export const teamsAndUserProfilesQuery = async ({ ctx, input }: TeamsAndUserProf throw new TRPCError({ code: "INTERNAL_SERVER_ERROR" }); } - let teamsData; + let teamsData: typeof user.teams extends (infer T)[] ? (T & { team: T extends { team: infer U } ? U & { metadata: ReturnType } : never })[] : never; if (input?.includeOrg) { teamsData = user.teams diff --git a/packages/trpc/server/routers/viewer/attributes/edit.handler.ts b/packages/trpc/server/routers/viewer/attributes/edit.handler.ts index 960b37d8d1..aa70103778 100644 --- a/packages/trpc/server/routers/viewer/attributes/edit.handler.ts +++ b/packages/trpc/server/routers/viewer/attributes/edit.handler.ts @@ -103,8 +103,8 @@ const editAttributesHandler = async ({ input, ctx }: GetOptions) => { await validateOptionsBelongToAttribute(options, attributes.id); await prisma.$transaction(async (tx) => { - const updateOptions = options.filter((option) => option.id !== undefined && option.id !== ""); - const updatedOptionsIds = updateOptions.map((option) => option.id!); + const updateOptions = options.filter((option): option is typeof option & { id: string } => option.id !== undefined && option.id !== ""); + const updatedOptionsIds = updateOptions.map((option) => option.id); // We need to delete all options that are not present in this UpdateOptions.id (as they have been deleted) await tx.attributeOption.deleteMany({ where: { @@ -159,10 +159,9 @@ async function validateOptionsBelongToAttribute( options: ZEditAttributeSchema["options"], attributeId: string ) { - // We have to use ! here to make sure typescript knows that the id is not undefined const optionsWithId = options - .filter((option) => option.id !== undefined && option.id !== "") - .map((option) => option.id!); + .filter((option): option is typeof option & { id: string } => option.id !== undefined && option.id !== "") + .map((option) => option.id); // Check all ids of options passed in are owned by the attribute const optionsWithIdOwnedByAttribute = await prisma.attributeOption.findMany({ diff --git a/packages/trpc/server/routers/viewer/auth/resendVerifyEmail.handler.ts b/packages/trpc/server/routers/viewer/auth/resendVerifyEmail.handler.ts index 86b2225cc0..eefcfc221c 100644 --- a/packages/trpc/server/routers/viewer/auth/resendVerifyEmail.handler.ts +++ b/packages/trpc/server/routers/viewer/auth/resendVerifyEmail.handler.ts @@ -28,7 +28,7 @@ export const resendVerifyEmail = async ({ input, ctx }: ResendEmailOptions) => { }); let emailVerified = Boolean(ctx.user.emailVerified); - let secondaryEmail; + let secondaryEmail: Awaited> | undefined; // If the input which is coming is not the current user's email, it could be a secondary email if (input?.email && input?.email !== ctx.user.email) { secondaryEmail = await prisma.secondaryEmail.findUnique({ diff --git a/packages/trpc/server/routers/viewer/bookings/editLocation.handler.ts b/packages/trpc/server/routers/viewer/bookings/editLocation.handler.ts index db81d31e78..808d6b6f83 100644 --- a/packages/trpc/server/routers/viewer/bookings/editLocation.handler.ts +++ b/packages/trpc/server/routers/viewer/bookings/editLocation.handler.ts @@ -134,7 +134,7 @@ async function getAllCredentialsIncludeServiceAccountKey({ }) { const credentials = await getUsersCredentialsIncludeServiceAccountKey(user); - let conferenceCredential; + let conferenceCredential: Awaited> | undefined; if (conferenceCredentialId) { // Validate that the credential is accessible before fetching it diff --git a/packages/trpc/server/routers/viewer/calendars/setDestinationCalendar.handler.ts b/packages/trpc/server/routers/viewer/calendars/setDestinationCalendar.handler.ts index 0b1044ef75..20ce287fa2 100644 --- a/packages/trpc/server/routers/viewer/calendars/setDestinationCalendar.handler.ts +++ b/packages/trpc/server/routers/viewer/calendars/setDestinationCalendar.handler.ts @@ -74,7 +74,7 @@ export const setDestinationCalendarHandler = async ({ ctx, input }: SetDestinati const { credentialId, delegationCredentialId } = firstConnectedCalendar || {}; - let where; + let where: { eventTypeId: number } | { userId: number }; if (!credentialId && !delegationCredentialId) { throw new TRPCError({ code: "BAD_REQUEST", message: `Could not find calendar ${input.externalId}` }); diff --git a/packages/trpc/server/routers/viewer/delegationCredential/toggleEnabled.handler.ts b/packages/trpc/server/routers/viewer/delegationCredential/toggleEnabled.handler.ts index a5b45b52cb..d1a061ce64 100644 --- a/packages/trpc/server/routers/viewer/delegationCredential/toggleEnabled.handler.ts +++ b/packages/trpc/server/routers/viewer/delegationCredential/toggleEnabled.handler.ts @@ -82,8 +82,8 @@ export async function toggleDelegationCredentialEnabled( log.error(`Delegation credential ${input.id} has no workspace platform slug`); } - let calendarAppName; - let conferencingAppName; + let calendarAppName: string; + let conferencingAppName: string; if (slug === "google") { calendarAppName = "Google Calendar"; diff --git a/packages/trpc/server/routers/viewer/eventTypes/util.ts b/packages/trpc/server/routers/viewer/eventTypes/util.ts index 2197323ec6..2a80a9a117 100644 --- a/packages/trpc/server/routers/viewer/eventTypes/util.ts +++ b/packages/trpc/server/routers/viewer/eventTypes/util.ts @@ -176,9 +176,9 @@ export const createEventPbacProcedure = ( const isAllowed = (function () { if (event.team) { const allTeamMembers = event.team.members.map((member) => member.userId); - return input.users!.every((userId: number) => allTeamMembers.includes(userId)); + return input.users?.every((userId: number) => allTeamMembers.includes(userId)) ?? true; } - return input.users!.every((userId: number) => userId === ctx.user.id); + return input.users?.every((userId: number) => userId === ctx.user.id) ?? true; })(); if (!isAllowed) { diff --git a/packages/trpc/server/routers/viewer/me/updateProfile.handler.ts b/packages/trpc/server/routers/viewer/me/updateProfile.handler.ts index c5b3fd4005..e587f27eb4 100644 --- a/packages/trpc/server/routers/viewer/me/updateProfile.handler.ts +++ b/packages/trpc/server/routers/viewer/me/updateProfile.handler.ts @@ -329,7 +329,7 @@ export const updateProfileHandler = async ({ ctx, input }: UpdateProfileOptions) emailFrom: user.email, // We know email has been changed here so we can use input - emailTo: input.email!, + emailTo: input.email ?? "", }, }); } diff --git a/packages/trpc/server/routers/viewer/ooo/outOfOfficeCreateOrUpdate.handler.ts b/packages/trpc/server/routers/viewer/ooo/outOfOfficeCreateOrUpdate.handler.ts index cb3b8c8616..b33795e6e4 100644 --- a/packages/trpc/server/routers/viewer/ooo/outOfOfficeCreateOrUpdate.handler.ts +++ b/packages/trpc/server/routers/viewer/ooo/outOfOfficeCreateOrUpdate.handler.ts @@ -45,7 +45,7 @@ export const outOfOfficeCreateOrUpdate = async ({ ctx, input }: TBookingRedirect let oooUserOrgId = ctx.user.organizationId; let oooUserFullName = ctx.user.name; - let isAdmin; + let isAdmin: boolean | undefined; if (input.forUserId) { isAdmin = await isAdminForUser(ctx.user.id, input.forUserId); if (!isAdmin) { diff --git a/packages/trpc/server/routers/viewer/organizations/listMembers.handler.ts b/packages/trpc/server/routers/viewer/organizations/listMembers.handler.ts index 4722897677..5fc210c0b3 100644 --- a/packages/trpc/server/routers/viewer/organizations/listMembers.handler.ts +++ b/packages/trpc/server/routers/viewer/organizations/listMembers.handler.ts @@ -283,7 +283,17 @@ export const listMembersHandler = async ({ ctx, input }: GetOptions) => { const members = await Promise.all( teamMembers?.map(async (membership) => { const user = await new UserRepository(prisma).enrichUserWithItsProfile({ user: membership.user }); - let attributes; + let attributes: + | Array<{ + id: string; + value: string; + slug: string; + attributeId: string; + weight: number; + isGroup: boolean; + contains: string[]; + }> + | undefined; if (expand?.includes("attributes")) { attributes = await prisma.attributeToUser diff --git a/packages/trpc/server/routers/viewer/slots/util.ts b/packages/trpc/server/routers/viewer/slots/util.ts index b66a1bffa5..775043eaa9 100644 --- a/packages/trpc/server/routers/viewer/slots/util.ts +++ b/packages/trpc/server/routers/viewer/slots/util.ts @@ -381,8 +381,8 @@ export class AvailableSlotsService { }) { if (!eventTypeSlug || !slug) return null; - let teamId; - let userId; + let teamId: number | undefined; + let userId: number | undefined; if (isTeamEvent) { teamId = await this.getTeamIdFromSlug( slug, @@ -1307,7 +1307,7 @@ export class AvailableSlotsService { const restrictionTimezone = eventType.useBookerTimezone ? input.timeZone - : restrictionSchedule.timeZone!; + : restrictionSchedule.timeZone ?? "UTC"; const eventLength = input.duration || eventType.length; const restrictionAvailability = restrictionSchedule.availability.map((rule) => ({ diff --git a/packages/trpc/server/routers/viewer/teams/resendInvitation.handler.ts b/packages/trpc/server/routers/viewer/teams/resendInvitation.handler.ts index 216f99a7a2..96e85aac5c 100644 --- a/packages/trpc/server/routers/viewer/teams/resendInvitation.handler.ts +++ b/packages/trpc/server/routers/viewer/teams/resendInvitation.handler.ts @@ -27,7 +27,7 @@ export const resendInvitationHandler = async ({ ctx, input }: InviteMemberOption isOrg: input.isOrg, }); - let verificationToken; + let verificationToken: Awaited> | undefined; try { verificationToken = await VerificationTokenRepository.updateTeamInviteTokenExpirationDate({