diff --git a/apps/api/v1/pages/api/slots/_get.ts b/apps/api/v1/pages/api/slots/_get.ts index 06fb59af6b..d0278bbe58 100644 --- a/apps/api/v1/pages/api/slots/_get.ts +++ b/apps/api/v1/pages/api/slots/_get.ts @@ -3,7 +3,7 @@ import utc from "dayjs/plugin/utc"; import type { NextApiRequest, NextApiResponse } from "next"; import dayjs from "@calcom/dayjs"; -import { isSupportedTimeZone } from "@calcom/lib/date-fns"; +import { isSupportedTimeZone } from "@calcom/lib/dayjs"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server/defaultResponder"; import { createContext } from "@calcom/trpc/server/createContext"; diff --git a/apps/web/components/booking/BookingListItem.tsx b/apps/web/components/booking/BookingListItem.tsx index 65601e410e..4bf5328b97 100644 --- a/apps/web/components/booking/BookingListItem.tsx +++ b/apps/web/components/booking/BookingListItem.tsx @@ -10,7 +10,7 @@ import dayjs from "@calcom/dayjs"; import "@calcom/dayjs/locales"; import { Dialog } from "@calcom/features/components/controlled-dialog"; import ViewRecordingsDialog from "@calcom/features/ee/video/ViewRecordingsDialog"; -import { formatTime } from "@calcom/lib/date-fns"; +import { formatTime } from "@calcom/lib/dayjs"; import { getPaymentAppData } from "@calcom/lib/getPaymentAppData"; import { useCopy } from "@calcom/lib/hooks/useCopy"; import { useLocale } from "@calcom/lib/hooks/useLocale"; diff --git a/apps/web/modules/bookings/views/bookings-single-view.tsx b/apps/web/modules/bookings/views/bookings-single-view.tsx index 9e3a3a6492..2c953bdc00 100644 --- a/apps/web/modules/bookings/views/bookings-single-view.tsx +++ b/apps/web/modules/bookings/views/bookings-single-view.tsx @@ -32,7 +32,7 @@ import { formatToLocalizedDate, formatToLocalizedTime, formatToLocalizedTimezone, -} from "@calcom/lib/date-fns"; +} from "@calcom/lib/dayjs"; import type { nameObjectSchema } from "@calcom/lib/event"; import { getEventName } from "@calcom/lib/event"; import useGetBrandingColours from "@calcom/lib/getBrandColours"; diff --git a/apps/web/modules/settings/my-account/general-view.tsx b/apps/web/modules/settings/my-account/general-view.tsx index a3063cd2b8..f4fe33c011 100644 --- a/apps/web/modules/settings/my-account/general-view.tsx +++ b/apps/web/modules/settings/my-account/general-view.tsx @@ -6,7 +6,7 @@ import { Controller, useForm } from "react-hook-form"; import { TimezoneSelect } from "@calcom/features/components/timezone-select"; import SectionBottomActions from "@calcom/features/settings/SectionBottomActions"; -import { formatLocalizedDateTime } from "@calcom/lib/date-fns"; +import { formatLocalizedDateTime } from "@calcom/lib/dayjs"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { localeOptions } from "@calcom/lib/i18n"; import { nameOfDay } from "@calcom/lib/weekday"; diff --git a/apps/web/modules/test-setup.ts b/apps/web/modules/test-setup.ts index bdf86f9bff..41749c434e 100644 --- a/apps/web/modules/test-setup.ts +++ b/apps/web/modules/test-setup.ts @@ -72,7 +72,7 @@ vi.mock("@calcom/lib/constants", () => { }; }); -vi.mock("@calcom/lib/date-fns", () => { +vi.mock("@calcom/lib/dayjs", () => { return {}; }); diff --git a/apps/web/modules/videos/views/videos-single-view.tsx b/apps/web/modules/videos/views/videos-single-view.tsx index e018f37500..1ed702164b 100644 --- a/apps/web/modules/videos/views/videos-single-view.tsx +++ b/apps/web/modules/videos/views/videos-single-view.tsx @@ -8,7 +8,7 @@ import { useState, useEffect, useRef } from "react"; import dayjs from "@calcom/dayjs"; import { WEBSITE_URL } from "@calcom/lib/constants"; import { TRANSCRIPTION_STOPPED_ICON, RECORDING_DEFAULT_ICON } from "@calcom/lib/constants"; -import { formatToLocalizedDate, formatToLocalizedTime } from "@calcom/lib/date-fns"; +import { formatToLocalizedDate, formatToLocalizedTime } from "@calcom/lib/dayjs"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { markdownToSafeHTML } from "@calcom/lib/markdownToSafeHTML"; import type { inferSSRProps } from "@calcom/types/inferSSRProps"; diff --git a/apps/web/test/utils/bookingScenario/bookingScenario.ts b/apps/web/test/utils/bookingScenario/bookingScenario.ts index 56059ab8ca..163cbdbf9b 100644 --- a/apps/web/test/utils/bookingScenario/bookingScenario.ts +++ b/apps/web/test/utils/bookingScenario/bookingScenario.ts @@ -13,7 +13,7 @@ import type { z } from "zod"; import { appStoreMetadata } from "@calcom/app-store/appStoreMetaData"; import { handleStripePaymentSuccess } from "@calcom/features/ee/payments/api/webhook"; -import { weekdayToWeekIndex, type WeekDays } from "@calcom/lib/date-fns"; +import { weekdayToWeekIndex, type WeekDays } from "@calcom/lib/dayjs"; import type { HttpError } from "@calcom/lib/http-error"; import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; import logger from "@calcom/lib/logger"; diff --git a/packages/features/bookings/Booker/components/DatePicker.tsx b/packages/features/bookings/Booker/components/DatePicker.tsx index 76726ca1b4..d1a787dcc7 100644 --- a/packages/features/bookings/Booker/components/DatePicker.tsx +++ b/packages/features/bookings/Booker/components/DatePicker.tsx @@ -4,7 +4,7 @@ import type { Dayjs } from "@calcom/dayjs"; import dayjs from "@calcom/dayjs"; import { DatePicker as DatePickerComponent } from "@calcom/features/calendars/DatePicker"; import { useNonEmptyScheduleDays } from "@calcom/features/schedules"; -import { weekdayToWeekIndex } from "@calcom/lib/date-fns"; +import { weekdayToWeekIndex } from "@calcom/lib/dayjs"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import type { User } from "@calcom/prisma/client"; import type { PeriodData } from "@calcom/types/Event"; diff --git a/packages/features/bookings/lib/handleNewBooking/validateBookingTimeIsNotOutOfBounds.ts b/packages/features/bookings/lib/handleNewBooking/validateBookingTimeIsNotOutOfBounds.ts index 87d658adf1..dd78bbd270 100644 --- a/packages/features/bookings/lib/handleNewBooking/validateBookingTimeIsNotOutOfBounds.ts +++ b/packages/features/bookings/lib/handleNewBooking/validateBookingTimeIsNotOutOfBounds.ts @@ -1,6 +1,6 @@ import type { Logger } from "tslog"; -import { getUTCOffsetByTimezone } from "@calcom/lib/date-fns"; +import { getUTCOffsetByTimezone } from "@calcom/lib/dayjs"; import { ErrorCode } from "@calcom/lib/errorCodes"; import { HttpError } from "@calcom/lib/http-error"; import isOutOfBounds, { BookingDateInPastError } from "@calcom/lib/isOutOfBounds"; diff --git a/packages/features/calendars/DatePicker.tsx b/packages/features/calendars/DatePicker.tsx index 4a4049f79e..97c981b9bc 100644 --- a/packages/features/calendars/DatePicker.tsx +++ b/packages/features/calendars/DatePicker.tsx @@ -6,7 +6,7 @@ import dayjs from "@calcom/dayjs"; import { useEmbedStyles } from "@calcom/embed-core/embed-iframe"; import { useBookerStore } from "@calcom/features/bookings/Booker/store"; import { getAvailableDatesInMonth } from "@calcom/features/calendars/lib/getAvailableDatesInMonth"; -import { daysInMonth, yyyymmdd } from "@calcom/lib/date-fns"; +import { daysInMonth, yyyymmdd } from "@calcom/lib/dayjs"; import type { IFromUser, IToUser } from "@calcom/lib/getUserAvailability"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { weekdayNames } from "@calcom/lib/weekday"; diff --git a/packages/features/calendars/lib/getAvailableDatesInMonth.timezone.test.ts b/packages/features/calendars/lib/getAvailableDatesInMonth.timezone.test.ts index 0d8c5d10aa..11a4dd2502 100644 --- a/packages/features/calendars/lib/getAvailableDatesInMonth.timezone.test.ts +++ b/packages/features/calendars/lib/getAvailableDatesInMonth.timezone.test.ts @@ -2,7 +2,7 @@ import { describe, expect, test, vi } from "vitest"; import dayjs from "@calcom/dayjs"; import { getAvailableDatesInMonth } from "@calcom/features/calendars/lib/getAvailableDatesInMonth"; -import { daysInMonth, yyyymmdd } from "@calcom/lib/date-fns"; +import { daysInMonth, yyyymmdd } from "@calcom/lib/dayjs"; describe("Test Suite: Date Picker", () => { describe("Calculates the available dates left in the month", () => { diff --git a/packages/features/calendars/lib/getAvailableDatesInMonth.ts b/packages/features/calendars/lib/getAvailableDatesInMonth.ts index a00f83d516..86397babc4 100644 --- a/packages/features/calendars/lib/getAvailableDatesInMonth.ts +++ b/packages/features/calendars/lib/getAvailableDatesInMonth.ts @@ -1,5 +1,5 @@ import dayjs from "@calcom/dayjs"; -import { daysInMonth, yyyymmdd } from "@calcom/lib/date-fns"; +import { daysInMonth, yyyymmdd } from "@calcom/lib/dayjs"; // calculate the available dates in the month: // *) Intersect with included dates. diff --git a/packages/features/embed/Embed.tsx b/packages/features/embed/Embed.tsx index 4c5a67f7cd..8143a171a1 100644 --- a/packages/features/embed/Embed.tsx +++ b/packages/features/embed/Embed.tsx @@ -20,7 +20,7 @@ import type { Slot } from "@calcom/features/schedules"; import { useNonEmptyScheduleDays } from "@calcom/features/schedules"; import { useSlotsForDate } from "@calcom/features/schedules/lib/use-schedule/useSlotsForDate"; import { APP_NAME, DEFAULT_LIGHT_BRAND_COLOR, DEFAULT_DARK_BRAND_COLOR } from "@calcom/lib/constants"; -import { weekdayToWeekIndex } from "@calcom/lib/date-fns"; +import { weekdayToWeekIndex } from "@calcom/lib/dayjs"; import { useCompatSearchParams } from "@calcom/lib/hooks/useCompatSearchParams"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { BookerLayouts } from "@calcom/prisma/zod-utils"; diff --git a/packages/features/schedules/components/DateOverrideInputDialog.tsx b/packages/features/schedules/components/DateOverrideInputDialog.tsx index 56b42a2025..04faa3fca1 100644 --- a/packages/features/schedules/components/DateOverrideInputDialog.tsx +++ b/packages/features/schedules/components/DateOverrideInputDialog.tsx @@ -4,7 +4,7 @@ import { useForm } from "react-hook-form"; import type { Dayjs } from "@calcom/dayjs"; import dayjs from "@calcom/dayjs"; import { Dialog } from "@calcom/features/components/controlled-dialog"; -import { yyyymmdd } from "@calcom/lib/date-fns"; +import { yyyymmdd } from "@calcom/lib/dayjs"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import type { WorkingHours } from "@calcom/types/schedule"; import cs from "@calcom/ui/classNames"; diff --git a/packages/features/webhooks/lib/sendPayload.ts b/packages/features/webhooks/lib/sendPayload.ts index cda9abb73e..ab7fd40079 100644 --- a/packages/features/webhooks/lib/sendPayload.ts +++ b/packages/features/webhooks/lib/sendPayload.ts @@ -4,7 +4,7 @@ import { compile } from "handlebars"; import type { TGetTranscriptAccessLink } from "@calcom/app-store/dailyvideo/zod"; import { getHumanReadableLocationValue } from "@calcom/app-store/locations"; -import { getUTCOffsetByTimezone } from "@calcom/lib/date-fns"; +import { getUTCOffsetByTimezone } from "@calcom/lib/dayjs"; import type { CalendarEvent, Person } from "@calcom/types/Calendar"; type ContentType = "application/json" | "application/x-www-form-urlencoded"; diff --git a/packages/lib/date-fns/index.ts b/packages/lib/dayjs/index.ts similarity index 96% rename from packages/lib/date-fns/index.ts rename to packages/lib/dayjs/index.ts index 23832b0e20..de341b6a41 100644 --- a/packages/lib/date-fns/index.ts +++ b/packages/lib/dayjs/index.ts @@ -1,3 +1,5 @@ +import { z } from "zod"; + import type { Dayjs } from "@calcom/dayjs"; import dayjs from "@calcom/dayjs"; @@ -238,3 +240,14 @@ export function getUTCOffsetByTimezone(timeZone: string, date?: string | Date | return dayjs(date).tz(timeZone).utcOffset(); } + +/** + * Converts a string into a dayjs object with the timezone set. + */ +export const stringToDayjs = (val: string) => { + const matches = val.match(/([+-]\d{2}:\d{2})$/); + const timezone = matches ? matches[1] : "+00:00"; + return dayjs(val).utcOffset(timezone); +}; + +export const stringToDayjsZod = z.string().transform(stringToDayjs); diff --git a/packages/prisma/zod-utils.test.ts b/packages/lib/dayjs/stringToDayjs.test.ts similarity index 96% rename from packages/prisma/zod-utils.test.ts rename to packages/lib/dayjs/stringToDayjs.test.ts index 78a6d39ab0..713e6d9563 100644 --- a/packages/prisma/zod-utils.test.ts +++ b/packages/lib/dayjs/stringToDayjs.test.ts @@ -1,7 +1,8 @@ import { describe, expect, it, beforeAll, vi } from "vitest"; import dayjs from "@calcom/dayjs"; -import { stringToDayjs } from "@calcom/prisma/zod-utils"; + +import { stringToDayjs } from "./index"; beforeAll(() => { vi.setSystemTime(dayjs.utc("2021-06-20T11:59:59Z").toDate()); diff --git a/packages/lib/getBusyTimes.ts b/packages/lib/getBusyTimes.ts index cfc59ec498..1b53abc395 100644 --- a/packages/lib/getBusyTimes.ts +++ b/packages/lib/getBusyTimes.ts @@ -4,6 +4,7 @@ import type { Prisma } from "@prisma/client"; import dayjs from "@calcom/dayjs"; import { getBusyCalendarTimes } from "@calcom/lib/CalendarManager"; import { subtract } from "@calcom/lib/date-ranges"; +import { stringToDayjs } from "@calcom/lib/dayjs"; import { intervalLimitKeyToUnit } from "@calcom/lib/intervalLimits/intervalLimit"; import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; import logger from "@calcom/lib/logger"; @@ -12,7 +13,6 @@ import { performance } from "@calcom/lib/server/perfObserver"; import prisma from "@calcom/prisma"; import type { SelectedCalendar } from "@calcom/prisma/client"; import { BookingStatus } from "@calcom/prisma/enums"; -import { stringToDayjs } from "@calcom/prisma/zod-utils"; import type { EventBusyDetails } from "@calcom/types/Calendar"; import type { CredentialForCalendarService } from "@calcom/types/Credential"; diff --git a/packages/lib/getUserAvailability.ts b/packages/lib/getUserAvailability.ts index 4f93fbf60e..f24d1ec1b5 100644 --- a/packages/lib/getUserAvailability.ts +++ b/packages/lib/getUserAvailability.ts @@ -14,6 +14,7 @@ import dayjs from "@calcom/dayjs"; import { getWorkingHours } from "@calcom/lib/availability"; import type { DateOverride, WorkingHours } from "@calcom/lib/date-ranges"; import { buildDateRanges, subtract } from "@calcom/lib/date-ranges"; +import { stringToDayjsZod } from "@calcom/lib/dayjs"; import { ErrorCode } from "@calcom/lib/errorCodes"; import { HttpError } from "@calcom/lib/http-error"; import { parseBookingLimit } from "@calcom/lib/intervalLimits/isBookingLimits"; @@ -29,7 +30,7 @@ import { EventTypeRepository } from "@calcom/lib/server/repository/eventType"; import prisma from "@calcom/prisma"; import { SchedulingType } from "@calcom/prisma/enums"; import { BookingStatus } from "@calcom/prisma/enums"; -import { EventTypeMetaDataSchema, stringToDayjsZod } from "@calcom/prisma/zod-utils"; +import { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils"; import type { EventBusyDetails, IntervalLimitUnit } from "@calcom/types/Calendar"; import type { TimeRange } from "@calcom/types/schedule"; diff --git a/packages/lib/schedules/transformers/for-atom.ts b/packages/lib/schedules/transformers/for-atom.ts index c1f9332d07..a862a507a5 100644 --- a/packages/lib/schedules/transformers/for-atom.ts +++ b/packages/lib/schedules/transformers/for-atom.ts @@ -2,7 +2,7 @@ import type { Availability } from "@prisma/client"; import dayjs from "@calcom/dayjs"; import { getWorkingHours } from "@calcom/lib/availability"; -import { yyyymmdd } from "@calcom/lib/date-fns"; +import { yyyymmdd } from "@calcom/lib/dayjs"; import type { Schedule, TimeRange } from "@calcom/types/schedule"; type ScheduleAvailability = Pick[]; diff --git a/packages/lib/slots.ts b/packages/lib/slots.ts index 371165269c..c203c4ce29 100644 --- a/packages/lib/slots.ts +++ b/packages/lib/slots.ts @@ -2,8 +2,8 @@ import type { Dayjs } from "@calcom/dayjs"; import dayjs from "@calcom/dayjs"; import type { IFromUser, IOutOfOfficeData, IToUser } from "@calcom/lib/getUserAvailability"; -import { getTimeZone } from "./date-fns"; import type { DateRange } from "./date-ranges"; +import { getTimeZone } from "./dayjs"; export type GetSlots = { inviteeDate: Dayjs; diff --git a/packages/prisma/zod-utils.ts b/packages/prisma/zod-utils.ts index cba59502be..ac933c8dbb 100644 --- a/packages/prisma/zod-utils.ts +++ b/packages/prisma/zod-utils.ts @@ -17,6 +17,7 @@ import dayjs from "@calcom/dayjs"; import { isPasswordValid } from "@calcom/features/auth/lib/isPasswordValid"; import type { FieldType as FormBuilderFieldType } from "@calcom/features/form-builder/schema"; import { fieldsSchema as formBuilderFieldsSchema } from "@calcom/features/form-builder/schema"; +import { isSupportedTimeZone } from "@calcom/lib/dayjs"; import { emailSchema as emailRegexSchema, emailRegex } from "@calcom/lib/emailSchema"; import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; import { zodAttributesQueryValue } from "@calcom/lib/raqb/zod"; @@ -247,14 +248,6 @@ export const stringOrNumber = z.union([ z.number().int(), ]); -export const stringToDayjs = (val: string) => { - const matches = val.match(/([+-]\d{2}:\d{2})$/); - const timezone = matches ? matches[1] : "+00:00"; - return dayjs(val).utcOffset(timezone); -}; - -export const stringToDayjsZod = z.string().transform(stringToDayjs); - export const requiredCustomInputSchema = z.union([ // string must be given & nonempty z.string().trim().min(1), diff --git a/packages/prisma/zod/custom/booking.ts b/packages/prisma/zod/custom/booking.ts index b9114a9498..45c0d44070 100644 --- a/packages/prisma/zod/custom/booking.ts +++ b/packages/prisma/zod/custom/booking.ts @@ -1,6 +1,6 @@ // `responses` is merged with it during handleNewBooking call because `responses` schema is dynamic and depends on eventType import z, { ZodNullable, ZodObject, ZodOptional } from "zod"; -import { isSupportedTimeZone } from "@calcom/lib/date-fns"; +import { isSupportedTimeZone } from "@calcom/lib/dayjs"; // TODO: Move this out of here. Importing from app-store is a circular package dependency. import { routingFormResponseInDbSchema } from "@calcom/app-store/routing-forms/zod"; diff --git a/packages/trpc/server/routers/viewer/slots/util.ts b/packages/trpc/server/routers/viewer/slots/util.ts index 4aad32946f..356747dbab 100644 --- a/packages/trpc/server/routers/viewer/slots/util.ts +++ b/packages/trpc/server/routers/viewer/slots/util.ts @@ -12,7 +12,7 @@ import { getShouldServeCache } from "@calcom/features/calendar-cache/lib/getShou import { findQualifiedHostsWithDelegationCredentials } from "@calcom/lib/bookings/findQualifiedHostsWithDelegationCredentials"; import { shouldIgnoreContactOwner } from "@calcom/lib/bookings/routing/utils"; import { RESERVED_SUBDOMAINS } from "@calcom/lib/constants"; -import { getUTCOffsetByTimezone } from "@calcom/lib/date-fns"; +import { getUTCOffsetByTimezone } from "@calcom/lib/dayjs"; import { getDefaultEvent } from "@calcom/lib/defaultEvents"; import { getAggregatedAvailability } from "@calcom/lib/getAggregatedAvailability"; import { getBusyTimesForLimitChecks } from "@calcom/lib/getBusyTimes"; diff --git a/packages/ui/components/popover/MeetingTimeInTimezones.tsx b/packages/ui/components/popover/MeetingTimeInTimezones.tsx index 810006ae6a..ed9507cc7d 100644 --- a/packages/ui/components/popover/MeetingTimeInTimezones.tsx +++ b/packages/ui/components/popover/MeetingTimeInTimezones.tsx @@ -6,7 +6,7 @@ import { isPreviousDayInTimezone, isSupportedTimeZone, sortByTimezone, -} from "@calcom/lib/date-fns"; +} from "@calcom/lib/dayjs"; import { Icon } from "../icon";