From a1e5384859d365aa0c8fcd7e3132ac718f5a8b35 Mon Sep 17 00:00:00 2001 From: Volnei Munhoz Date: Fri, 2 Jan 2026 09:47:00 -0300 Subject: [PATCH 1/5] Prefix node protocol (#26391) --- .yarn/patches/next-i18next-npm-13.3.0-bf25b0943c.patch | 4 ++-- apps/api/index.js | 2 +- apps/api/v1/next-i18next.config.js | 2 +- apps/api/v1/test/jest-setup.js | 2 +- apps/api/v2/next-i18next.config.js | 2 +- apps/api/v2/scripts/docker-start.ts | 2 +- apps/api/v2/src/lib/api-key/index.ts | 2 +- apps/api/v2/src/lib/filterReqHeaders.ts | 2 +- .../slots-2024-04-15/services/slots-worker.service.ts | 4 ++-- .../slots/slots-2024-04-15/workers/slots.worker.ts | 4 ++-- apps/api/v2/src/swagger/copy-swagger-module.ts | 2 +- apps/api/v2/src/swagger/generate-swagger.ts | 4 ++-- .../fixtures/repository/api-keys.repository.fixture.ts | 2 +- .../fixtures/repository/tokens.repository.fixture.ts | 2 +- apps/web/app/api/auth/two-factor/totp/setup/route.ts | 2 +- apps/web/app/api/csrf/route.ts | 2 +- apps/web/app/api/recorded-daily-video/route.ts | 2 +- apps/web/app/api/sync/helpscout/route.ts | 2 +- apps/web/lib/app-providers.tsx | 2 +- apps/web/lib/apps/[slug]/getStaticProps.ts | 4 ++-- apps/web/lib/handleOrgRedirect.test.ts | 2 +- apps/web/lib/handleOrgRedirect.ts | 4 ++-- apps/web/lib/reschedule/[uid]/getServerSideProps.ts | 2 +- apps/web/modules/auth/logout-view.tsx | 2 +- apps/web/next-i18next.config.ts | 2 +- apps/web/pages/_app.tsx | 2 +- apps/web/pages/_document.tsx | 2 +- apps/web/playwright/fixtures/servers.ts | 2 +- apps/web/playwright/lib/loadJSON.ts | 4 ++-- apps/web/playwright/lib/next-server.ts | 6 +++--- apps/web/playwright/lib/testUtils.ts | 8 ++++---- apps/web/playwright/oauth-provider.e2e.ts | 2 +- apps/web/playwright/settings/upload-avatar.e2e.ts | 2 +- apps/web/playwright/signup.e2e.ts | 2 +- apps/web/scripts/check-missing-translations.ts | 4 ++-- apps/web/scripts/copy-app-store-static.js | 6 +++--- apps/web/scripts/create-sentry-release.js | 2 +- apps/web/scripts/ts-check-changed-files.ts | 2 +- apps/web/server/lib/[user]/getServerSideProps.ts | 2 +- apps/web/test/jest-setup.js | 2 +- apps/web/test/lib/getSchedule/selectedSlots.test.ts | 2 +- biome.json | 6 ++++-- i18n-unused.config.js | 2 +- packages/app-store-cli/src/build.ts | 6 +++--- .../src/components/AppCreateUpdateForm.tsx | 2 +- packages/app-store-cli/src/constants.ts | 4 ++-- packages/app-store-cli/src/core.ts | 4 ++-- packages/app-store-cli/src/utils/execSync.ts | 2 +- packages/app-store-cli/src/utils/getApp.ts | 4 ++-- packages/app-store-cli/src/utils/getAppName.ts | 2 +- packages/app-store-cli/src/utils/templates.ts | 4 ++-- packages/app-store/basecamp3/api/add.ts | 2 +- packages/app-store/btcpayserver/api/webhook.ts | 2 +- .../dailyvideo/lib/scripts/deleteRecordings.ts | 10 +++++----- packages/app-store/feishucalendar/api/add.ts | 2 +- packages/app-store/hitpay/api/webhook.ts | 2 +- packages/app-store/huddle01video/api/add.ts | 2 +- packages/app-store/intercom/api/add.ts | 2 +- packages/app-store/jelly/api/add.ts | 2 +- packages/app-store/larkcalendar/api/add.ts | 2 +- packages/app-store/nextcloudtalk/api/add.ts | 2 +- .../app-store/nextcloudtalk/lib/VideoApiAdapter.ts | 2 +- packages/app-store/office365calendar/api/add.ts | 2 +- packages/app-store/office365video/api/add.ts | 2 +- packages/app-store/stripepayment/api/callback.ts | 2 +- .../stripepayment/lib/client/createPaymentLink.ts | 4 +++- packages/app-store/tandemvideo/api/add.ts | 2 +- packages/app-store/webex/api/add.ts | 2 +- packages/app-store/zohocalendar/api/add.ts | 2 +- packages/app-store/zohocalendar/api/callback.ts | 2 +- packages/app-store/zohocalendar/lib/CalendarService.ts | 2 +- packages/app-store/zohocrm/api/_getAdd.ts | 2 +- packages/app-store/zoomvideo/api/add.ts | 2 +- packages/embeds/embed-core/vite.config.js | 2 +- packages/embeds/embed-react/vite.config.js | 2 +- packages/embeds/embed-snippet/vite.config.js | 2 +- packages/embeds/vite.config.js | 2 +- packages/features/auth/lib/sendVerificationRequest.ts | 4 ++-- .../features/auth/lib/verifyCodeUnAuthenticated.ts | 2 +- packages/features/auth/lib/verifyEmail.ts | 2 +- .../determineReschedulePreventionRedirect.ts | 2 +- .../lib/service/InstantBookingCreateService.ts | 2 +- .../features/bot-detection/BotDetectionService.test.ts | 2 +- packages/features/bot-detection/BotDetectionService.ts | 2 +- packages/features/ee/api-keys/lib/apiKeys.ts | 2 +- .../features/ee/common/server/private-api-utils.ts | 2 +- packages/features/ee/organizations/lib/orgDomains.ts | 2 +- .../ee/organizations/lib/server/orgCreationUtils.ts | 2 +- .../features/ee/teams/lib/getTeamMemberEmailFromCrm.ts | 2 +- packages/features/ee/teams/services/teamService.ts | 2 +- .../features/filters/lib/getTeamsFiltersFromQuery.ts | 2 +- .../InsightsRoutingService.integration-test.ts | 2 +- .../features/routing-forms/lib/getRoutedUrl.test.ts | 2 +- packages/features/routing-forms/lib/getRoutedUrl.ts | 4 ++-- packages/features/webhooks/lib/sendPayload.ts | 2 +- .../features/webhooks/lib/service/WebhookService.ts | 2 +- packages/lib/apps/getAppOnboardingUrl.ts | 9 +++++---- packages/lib/crypto.ts | 2 +- packages/lib/hooks/useParamsWithFallback.ts | 2 +- packages/lib/logger.server.ts | 2 +- packages/lib/pkce.ts | 2 +- packages/lib/server/perfObserver.ts | 4 ++-- .../lib/server/service/VerificationTokenService.ts | 2 +- packages/platform/atoms/scripts/dev-on.js | 6 +++--- packages/platform/atoms/vite.config.ts | 4 ++-- packages/platform/examples/base/playwright.config.ts | 2 +- packages/platform/libraries/i18n.ts | 2 +- packages/platform/libraries/scripts/local.js | 6 +++--- packages/platform/libraries/scripts/postpublish.js | 8 ++++---- packages/platform/libraries/scripts/prepublish.js | 8 ++++---- packages/platform/libraries/vite.config.js | 8 ++++---- .../viewer/admin/createSelfHostedLicenseKey.handler.ts | 2 +- .../findTeamMembersMatchingAttributeLogic.handler.ts | 2 +- packages/trpc/server/routers/viewer/me/get.handler.ts | 2 +- .../server/routers/viewer/oAuth/addClient.handler.ts | 2 +- .../routers/viewer/oAuth/generateAuthCode.handler.ts | 2 +- .../routers/viewer/organizations/create.handler.ts | 2 +- .../viewer/organizations/setPassword.handler.ts | 2 +- .../routers/viewer/organizations/verifyCode.handler.ts | 2 +- ...TeamMembersMatchingAttributeLogicOfRoute.handler.ts | 2 +- packages/trpc/server/routers/viewer/slots/types.ts | 2 +- .../server/routers/viewer/teams/inviteMember/utils.ts | 2 +- .../viewer/workflows/verifyEmailCode.handler.ts | 2 +- packages/types/next.d.ts | 2 +- playwright.config.ts | 4 ++-- scripts/seed-app-store.ts | 2 +- scripts/seed-utils.ts | 2 +- tests/libs/__mocks__/prisma.ts | 4 ++-- vitest.config.mts | 2 +- 129 files changed, 182 insertions(+), 177 deletions(-) diff --git a/.yarn/patches/next-i18next-npm-13.3.0-bf25b0943c.patch b/.yarn/patches/next-i18next-npm-13.3.0-bf25b0943c.patch index 43667e866815bd..263939348d6339 100644 --- a/.yarn/patches/next-i18next-npm-13.3.0-bf25b0943c.patch +++ b/.yarn/patches/next-i18next-npm-13.3.0-bf25b0943c.patch @@ -2,8 +2,8 @@ diff --git a/dist/commonjs/serverSideTranslations.js b/dist/commonjs/serverSideT index bcad3d02fbdfab8dacb1d85efd79e98623a0c257..fff668f598154a13c4030d1b4a90d5d9c18214ad 100644 --- a/dist/commonjs/serverSideTranslations.js +++ b/dist/commonjs/serverSideTranslations.js -@@ -36,7 +36,6 @@ var _fs = _interopRequireDefault(require("fs")); - var _path = _interopRequireDefault(require("path")); +@@ -36,7 +36,6 @@ var _fs = _interopRequireDefault(require("node:fs")); + var _path = _interopRequireDefault(require("node:path")); var _createConfig = require("./config/createConfig"); var _node = _interopRequireDefault(require("./createClient/node")); -var _appWithTranslation = require("./appWithTranslation"); diff --git a/apps/api/index.js b/apps/api/index.js index a7e4c44ce3e501..293de2cc4337ed 100644 --- a/apps/api/index.js +++ b/apps/api/index.js @@ -1,4 +1,4 @@ -const http = require("http"); +const http = require("node:http"); const connect = require("connect"); const { createProxyMiddleware } = require("http-proxy-middleware"); diff --git a/apps/api/v1/next-i18next.config.js b/apps/api/v1/next-i18next.config.js index cab1a8b008039f..945540adf26bd2 100644 --- a/apps/api/v1/next-i18next.config.js +++ b/apps/api/v1/next-i18next.config.js @@ -1,4 +1,4 @@ -const path = require("path"); +const path = require("node:path"); const i18nConfig = require("@calcom/config/next-i18next.config"); /** @type {import("next-i18next").UserConfig} */ diff --git a/apps/api/v1/test/jest-setup.js b/apps/api/v1/test/jest-setup.js index fa5c44868ddabf..2b69df981c3fbb 100644 --- a/apps/api/v1/test/jest-setup.js +++ b/apps/api/v1/test/jest-setup.js @@ -1,6 +1,6 @@ // This is a workaround for https://github.com/jsdom/jsdom/issues/2524#issuecomment-902027138 // See https://github.com/microsoft/accessibility-insights-web/blob/40416a4ae6b91baf43102f58e069eff787de4de2/src/tests/unit/jest-setup.ts -const { TextEncoder, TextDecoder } = require("util"); +const { TextEncoder, TextDecoder } = require("node:util"); global.TextEncoder = TextEncoder; global.TextDecoder = TextDecoder; diff --git a/apps/api/v2/next-i18next.config.js b/apps/api/v2/next-i18next.config.js index a07cf209817826..91c24916bb8f08 100644 --- a/apps/api/v2/next-i18next.config.js +++ b/apps/api/v2/next-i18next.config.js @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-var-requires */ -const path = require("path"); +const path = require("node:path"); const i18nConfig = require("@calcom/config/next-i18next.config"); /** @type {import("next-i18next").UserConfig} */ diff --git a/apps/api/v2/scripts/docker-start.ts b/apps/api/v2/scripts/docker-start.ts index c71470dfc16744..30fa5bd296b071 100644 --- a/apps/api/v2/scripts/docker-start.ts +++ b/apps/api/v2/scripts/docker-start.ts @@ -1,4 +1,4 @@ -import { execSync } from "child_process"; +import { execSync } from "node:child_process"; function checkCommandExists(command: string): boolean { try { diff --git a/apps/api/v2/src/lib/api-key/index.ts b/apps/api/v2/src/lib/api-key/index.ts index b580c5c29dea31..1115e4c99f02b5 100644 --- a/apps/api/v2/src/lib/api-key/index.ts +++ b/apps/api/v2/src/lib/api-key/index.ts @@ -1,4 +1,4 @@ -import { createHash } from "crypto"; +import { createHash } from "node:crypto"; export const sha256Hash = (token: string): string => createHash("sha256").update(token).digest("hex"); diff --git a/apps/api/v2/src/lib/filterReqHeaders.ts b/apps/api/v2/src/lib/filterReqHeaders.ts index 2e6e12b23431f9..7ed4786ecd13a0 100644 --- a/apps/api/v2/src/lib/filterReqHeaders.ts +++ b/apps/api/v2/src/lib/filterReqHeaders.ts @@ -1,4 +1,4 @@ -import { IncomingHttpHeaders } from "http"; +import { IncomingHttpHeaders } from "node:http"; export function filterReqHeaders(headers: IncomingHttpHeaders): Partial { return { diff --git a/apps/api/v2/src/modules/slots/slots-2024-04-15/services/slots-worker.service.ts b/apps/api/v2/src/modules/slots/slots-2024-04-15/services/slots-worker.service.ts index f6b381c7bab93d..b409c5fa9064a9 100644 --- a/apps/api/v2/src/modules/slots/slots-2024-04-15/services/slots-worker.service.ts +++ b/apps/api/v2/src/modules/slots/slots-2024-04-15/services/slots-worker.service.ts @@ -1,7 +1,7 @@ import { Injectable, Logger, OnModuleDestroy } from "@nestjs/common"; import { ConfigService } from "@nestjs/config"; -import * as path from "path"; -import { Worker } from "worker_threads"; +import * as path from "node:path"; +import { Worker } from "node:worker_threads"; // Import WorkerOptions type import type { GetScheduleOptions } from "@calcom/trpc/server/routers/viewer/slots/types"; diff --git a/apps/api/v2/src/modules/slots/slots-2024-04-15/workers/slots.worker.ts b/apps/api/v2/src/modules/slots/slots-2024-04-15/workers/slots.worker.ts index 79a7e22b7542c4..c6f721e9d4f03f 100644 --- a/apps/api/v2/src/modules/slots/slots-2024-04-15/workers/slots.worker.ts +++ b/apps/api/v2/src/modules/slots/slots-2024-04-15/workers/slots.worker.ts @@ -1,8 +1,8 @@ import { AvailableSlotsService } from "@/lib/services/available-slots.service"; import { Logger } from "@nestjs/common"; import { NestFactory } from "@nestjs/core"; -import { IncomingMessage } from "http"; -import { parentPort, isMainThread } from "worker_threads"; +import { IncomingMessage } from "node:http"; +import { parentPort, isMainThread } from "node:worker_threads"; import { SlotsWorkerModule } from "./slots.worker.module"; diff --git a/apps/api/v2/src/swagger/copy-swagger-module.ts b/apps/api/v2/src/swagger/copy-swagger-module.ts index b48fbe44a898ae..58ca65623a0726 100644 --- a/apps/api/v2/src/swagger/copy-swagger-module.ts +++ b/apps/api/v2/src/swagger/copy-swagger-module.ts @@ -1,5 +1,5 @@ import * as fs from "fs-extra"; -import * as path from "path"; +import * as path from "node:path"; // First, copyNestSwagger is required to enable "@nestjs/swagger" in the "nest-cli.json", // because nest-cli.json is resolving "@nestjs/swagger" plugin from diff --git a/apps/api/v2/src/swagger/generate-swagger.ts b/apps/api/v2/src/swagger/generate-swagger.ts index bf69e6cb0eed7d..13e1c90c333083 100644 --- a/apps/api/v2/src/swagger/generate-swagger.ts +++ b/apps/api/v2/src/swagger/generate-swagger.ts @@ -8,8 +8,8 @@ import type { OperationObject, } from "@nestjs/swagger/dist/interfaces/open-api-spec.interface"; import "dotenv/config"; -import * as fs from "fs"; -import type { Server } from "http"; +import * as fs from "node:fs"; +import type { Server } from "node:http"; import { spawnSync } from "node:child_process"; import { createRequire } from "node:module"; diff --git a/apps/api/v2/test/fixtures/repository/api-keys.repository.fixture.ts b/apps/api/v2/test/fixtures/repository/api-keys.repository.fixture.ts index 12ec49dd2ff6ea..73d7bcfb90215c 100644 --- a/apps/api/v2/test/fixtures/repository/api-keys.repository.fixture.ts +++ b/apps/api/v2/test/fixtures/repository/api-keys.repository.fixture.ts @@ -1,7 +1,7 @@ import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { TestingModule } from "@nestjs/testing"; -import { randomBytes, createHash } from "crypto"; +import { randomBytes, createHash } from "node:crypto"; export class ApiKeysRepositoryFixture { private prismaReadClient: PrismaReadService["prisma"]; diff --git a/apps/api/v2/test/fixtures/repository/tokens.repository.fixture.ts b/apps/api/v2/test/fixtures/repository/tokens.repository.fixture.ts index da0316ddc58a84..dfac0a9cbf6e78 100644 --- a/apps/api/v2/test/fixtures/repository/tokens.repository.fixture.ts +++ b/apps/api/v2/test/fixtures/repository/tokens.repository.fixture.ts @@ -1,7 +1,7 @@ import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { TestingModule } from "@nestjs/testing"; -import * as crypto from "crypto"; +import * as crypto from "node:crypto"; import { DateTime } from "luxon"; export class TokensRepositoryFixture { diff --git a/apps/web/app/api/auth/two-factor/totp/setup/route.ts b/apps/web/app/api/auth/two-factor/totp/setup/route.ts index 76a206a66703dd..72802ecc350dcb 100644 --- a/apps/web/app/api/auth/two-factor/totp/setup/route.ts +++ b/apps/web/app/api/auth/two-factor/totp/setup/route.ts @@ -1,6 +1,6 @@ import { defaultResponderForAppDir } from "app/api/defaultResponderForAppDir"; import { parseRequestData } from "app/api/parseRequestData"; -import crypto from "crypto"; +import crypto from "node:crypto"; import { cookies, headers } from "next/headers"; import { NextResponse } from "next/server"; import type { NextRequest } from "next/server"; diff --git a/apps/web/app/api/csrf/route.ts b/apps/web/app/api/csrf/route.ts index 21bd767993dbd2..fd9a562179f70c 100644 --- a/apps/web/app/api/csrf/route.ts +++ b/apps/web/app/api/csrf/route.ts @@ -1,4 +1,4 @@ -import { randomBytes } from "crypto"; +import { randomBytes } from "node:crypto"; import { NextResponse } from "next/server"; import { WEBAPP_URL } from "@calcom/lib/constants"; diff --git a/apps/web/app/api/recorded-daily-video/route.ts b/apps/web/app/api/recorded-daily-video/route.ts index 82538357848a5a..007297cf81cfce 100644 --- a/apps/web/app/api/recorded-daily-video/route.ts +++ b/apps/web/app/api/recorded-daily-video/route.ts @@ -1,5 +1,5 @@ import { defaultResponderForAppDir } from "app/api/defaultResponderForAppDir"; -import { createHmac } from "crypto"; +import { createHmac } from "node:crypto"; import { headers } from "next/headers"; import type { NextRequest } from "next/server"; import { NextResponse } from "next/server"; diff --git a/apps/web/app/api/sync/helpscout/route.ts b/apps/web/app/api/sync/helpscout/route.ts index 1b4f5f0a9b8135..b40d014b4d3e71 100644 --- a/apps/web/app/api/sync/helpscout/route.ts +++ b/apps/web/app/api/sync/helpscout/route.ts @@ -1,5 +1,5 @@ import { defaultResponderForAppDir } from "app/api/defaultResponderForAppDir"; -import { createHmac } from "crypto"; +import { createHmac } from "node:crypto"; import { headers } from "next/headers"; import { cookies } from "next/headers"; import type { NextRequest } from "next/server"; diff --git a/apps/web/lib/app-providers.tsx b/apps/web/lib/app-providers.tsx index a870a7c9f681d6..b80e249625b273 100644 --- a/apps/web/lib/app-providers.tsx +++ b/apps/web/lib/app-providers.tsx @@ -15,7 +15,7 @@ import type { SSRConfig } from "next-i18next/dist/types/types"; import { ThemeProvider } from "next-themes"; import type { AppProps as NextAppProps, AppProps as NextJsAppProps } from "next/app"; import { NuqsAdapter } from "nuqs/adapters/next/pages"; -import type { ParsedUrlQuery } from "querystring"; +import type { ParsedUrlQuery } from "node:querystring"; import type { PropsWithChildren, ReactNode } from "react"; import { useEffect } from "react"; diff --git a/apps/web/lib/apps/[slug]/getStaticProps.ts b/apps/web/lib/apps/[slug]/getStaticProps.ts index 61079a283492e3..dcfa567454db93 100644 --- a/apps/web/lib/apps/[slug]/getStaticProps.ts +++ b/apps/web/lib/apps/[slug]/getStaticProps.ts @@ -1,6 +1,6 @@ -import fs from "fs"; +import fs from "node:fs" import matter from "gray-matter"; -import path from "path"; +import path from "node:path" import { z } from "zod"; import { getAppWithMetadata } from "@calcom/app-store/_appRegistry"; diff --git a/apps/web/lib/handleOrgRedirect.test.ts b/apps/web/lib/handleOrgRedirect.test.ts index cbff4bb6654795..c11f02586fbdcb 100644 --- a/apps/web/lib/handleOrgRedirect.test.ts +++ b/apps/web/lib/handleOrgRedirect.test.ts @@ -1,5 +1,5 @@ import type { GetServerSidePropsContext } from "next"; -import type { ParsedUrlQuery } from "querystring"; +import type { ParsedUrlQuery } from "node:querystring"; import { vi, describe, it, expect, beforeEach, afterEach } from "vitest"; import * as constants from "@calcom/lib/constants"; diff --git a/apps/web/lib/handleOrgRedirect.ts b/apps/web/lib/handleOrgRedirect.ts index b5bed03f1a04c2..b6d9da3117df0b 100644 --- a/apps/web/lib/handleOrgRedirect.ts +++ b/apps/web/lib/handleOrgRedirect.ts @@ -1,5 +1,5 @@ -import type { ParsedUrlQuery } from "querystring"; -import { stringify } from "querystring"; +import type { ParsedUrlQuery } from "node:querystring"; +import { stringify } from "node:querystring"; import { SINGLE_ORG_SLUG } from "@calcom/lib/constants"; import logger from "@calcom/lib/logger"; diff --git a/apps/web/lib/reschedule/[uid]/getServerSideProps.ts b/apps/web/lib/reschedule/[uid]/getServerSideProps.ts index e3c009d6491708..0ebe0e819b2c69 100644 --- a/apps/web/lib/reschedule/[uid]/getServerSideProps.ts +++ b/apps/web/lib/reschedule/[uid]/getServerSideProps.ts @@ -1,6 +1,6 @@ // page can be a server component import type { GetServerSidePropsContext } from "next"; -import { URLSearchParams } from "url"; +import { URLSearchParams } from "node:url"; import { z } from "zod"; import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; diff --git a/apps/web/modules/auth/logout-view.tsx b/apps/web/modules/auth/logout-view.tsx index 2faa0a7ca1ca64..502b709d9c42d5 100644 --- a/apps/web/modules/auth/logout-view.tsx +++ b/apps/web/modules/auth/logout-view.tsx @@ -2,7 +2,7 @@ import { signOut, useSession } from "next-auth/react"; import { useRouter } from "next/navigation"; -import type { ParsedUrlQuery } from "querystring"; +import type { ParsedUrlQuery } from "node:querystring"; import { useEffect, useState } from "react"; import { WEBSITE_URL } from "@calcom/lib/constants"; diff --git a/apps/web/next-i18next.config.ts b/apps/web/next-i18next.config.ts index 54e5cc51958d0c..c0686ee8c0cf33 100644 --- a/apps/web/next-i18next.config.ts +++ b/apps/web/next-i18next.config.ts @@ -1,4 +1,4 @@ -import path from "path"; +import path from "node:path" import i18nConfig from "@calcom/config/next-i18next.config"; diff --git a/apps/web/pages/_app.tsx b/apps/web/pages/_app.tsx index 8b34a72e099e63..e569a67c92e464 100644 --- a/apps/web/pages/_app.tsx +++ b/apps/web/pages/_app.tsx @@ -1,4 +1,4 @@ -import type { IncomingMessage } from "http"; +import type { IncomingMessage } from "node:http"; import type { NextPageContext } from "next"; import { SessionProvider } from "next-auth/react"; import React from "react"; diff --git a/apps/web/pages/_document.tsx b/apps/web/pages/_document.tsx index ba9dcb6c117781..e3cffc6f7fc22d 100644 --- a/apps/web/pages/_document.tsx +++ b/apps/web/pages/_document.tsx @@ -1,5 +1,5 @@ import { platform } from "@todesktop/client-core"; -import type { IncomingMessage } from "http"; +import type { IncomingMessage } from "node:http"; import { dir } from "i18next"; import type { DocumentContext, DocumentProps } from "next/document"; import Document, { Head, Html, Main, NextScript } from "next/document"; diff --git a/apps/web/playwright/fixtures/servers.ts b/apps/web/playwright/fixtures/servers.ts index 8f5754219718be..25cbdc0c8ced72 100644 --- a/apps/web/playwright/fixtures/servers.ts +++ b/apps/web/playwright/fixtures/servers.ts @@ -1,4 +1,4 @@ -import type { Server } from "http"; +import type { Server } from "node:http"; import { nextServer } from "../lib/next-server"; diff --git a/apps/web/playwright/lib/loadJSON.ts b/apps/web/playwright/lib/loadJSON.ts index 8228253b2319d9..d94ede52aedfbd 100644 --- a/apps/web/playwright/lib/loadJSON.ts +++ b/apps/web/playwright/lib/loadJSON.ts @@ -1,5 +1,5 @@ -import fs from "fs"; -import path from "path"; +import fs from "node:fs" +import path from "node:path" /** * Simple utility to load JSON files from the file system. Needed to avoid certain errors with: diff --git a/apps/web/playwright/lib/next-server.ts b/apps/web/playwright/lib/next-server.ts index 99d7314354758b..0108a069665194 100644 --- a/apps/web/playwright/lib/next-server.ts +++ b/apps/web/playwright/lib/next-server.ts @@ -1,8 +1,8 @@ import detect from "detect-port"; -import type { Server } from "http"; -import { createServer } from "http"; +import type { Server } from "node:http"; +import { createServer } from "node:http"; import next from "next"; -import { parse } from "url"; +import { parse } from "node:url"; // eslint-disable-next-line @typescript-eslint/no-namespace declare let process: { diff --git a/apps/web/playwright/lib/testUtils.ts b/apps/web/playwright/lib/testUtils.ts index 665edf32044ab1..ab55213034c6a1 100644 --- a/apps/web/playwright/lib/testUtils.ts +++ b/apps/web/playwright/lib/testUtils.ts @@ -1,9 +1,9 @@ import type { Frame, Page, Request as PlaywrightRequest } from "@playwright/test"; import { expect } from "@playwright/test"; -import { createHash } from "crypto"; -import EventEmitter from "events"; -import type { IncomingMessage, ServerResponse } from "http"; -import { createServer } from "http"; +import { createHash } from "node:crypto"; +import EventEmitter from "node:events"; +import type { IncomingMessage, ServerResponse } from "node:http"; +import { createServer } from "node:http"; import type { Messages } from "mailhog"; import { totp } from "otplib"; import { v4 as uuid } from "uuid"; diff --git a/apps/web/playwright/oauth-provider.e2e.ts b/apps/web/playwright/oauth-provider.e2e.ts index 66aa53be235c1e..3612919317a69d 100644 --- a/apps/web/playwright/oauth-provider.e2e.ts +++ b/apps/web/playwright/oauth-provider.e2e.ts @@ -1,5 +1,5 @@ import { expect } from "@playwright/test"; -import { createHash, randomBytes } from "crypto"; +import { createHash, randomBytes } from "node:crypto"; import { WEBAPP_URL } from "@calcom/lib/constants"; import { prisma } from "@calcom/prisma"; diff --git a/apps/web/playwright/settings/upload-avatar.e2e.ts b/apps/web/playwright/settings/upload-avatar.e2e.ts index e6d15ba89e4c91..be52ff25db649a 100644 --- a/apps/web/playwright/settings/upload-avatar.e2e.ts +++ b/apps/web/playwright/settings/upload-avatar.e2e.ts @@ -1,5 +1,5 @@ import { expect } from "@playwright/test"; -import path from "path"; +import path from "node:path" import { CAL_URL } from "@calcom/lib/constants"; import { prisma } from "@calcom/prisma"; diff --git a/apps/web/playwright/signup.e2e.ts b/apps/web/playwright/signup.e2e.ts index e637cef135291c..2d7131c1dcc2d5 100644 --- a/apps/web/playwright/signup.e2e.ts +++ b/apps/web/playwright/signup.e2e.ts @@ -1,6 +1,6 @@ import type { Page } from "@playwright/test"; import { expect } from "@playwright/test"; -import { randomBytes } from "crypto"; +import { randomBytes } from "node:crypto"; import { APP_NAME, IS_PREMIUM_USERNAME_ENABLED, IS_MAILHOG_ENABLED } from "@calcom/lib/constants"; import prisma from "@calcom/prisma"; diff --git a/apps/web/scripts/check-missing-translations.ts b/apps/web/scripts/check-missing-translations.ts index d032b48085b964..d16a1e06c050d0 100644 --- a/apps/web/scripts/check-missing-translations.ts +++ b/apps/web/scripts/check-missing-translations.ts @@ -1,5 +1,5 @@ -import { readFileSync, readdirSync, writeFileSync } from "fs"; -import { join } from "path"; +import { readFileSync, readdirSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; const TEMPLATE_LANGUAGE = "en"; const SPECIFIC_LOCALES = process.argv.slice(2) || []; diff --git a/apps/web/scripts/copy-app-store-static.js b/apps/web/scripts/copy-app-store-static.js index a9851b62de4b6d..a2f8edf8d18da7 100644 --- a/apps/web/scripts/copy-app-store-static.js +++ b/apps/web/scripts/copy-app-store-static.js @@ -1,7 +1,7 @@ -const fs = require("fs"); -const path = require("path"); +const fs = require("node:fs"); +const path = require("node:path"); const glob = require("glob"); -const crypto = require("crypto"); +const crypto = require("node:crypto"); const copyAppStoreStatic = () => { // Get all static files from app-store packages diff --git a/apps/web/scripts/create-sentry-release.js b/apps/web/scripts/create-sentry-release.js index d65ee61b6fc6a6..e4ea29a4a67ea1 100644 --- a/apps/web/scripts/create-sentry-release.js +++ b/apps/web/scripts/create-sentry-release.js @@ -1,4 +1,4 @@ -const { execSync } = require("child_process"); +const { execSync } = require("node:child_process"); const CLIENT_FILES_PATH = ".next/static/chunks"; diff --git a/apps/web/scripts/ts-check-changed-files.ts b/apps/web/scripts/ts-check-changed-files.ts index 5cbbef9cf003da..232f8b1c4da637 100644 --- a/apps/web/scripts/ts-check-changed-files.ts +++ b/apps/web/scripts/ts-check-changed-files.ts @@ -1,4 +1,4 @@ -import { execSync } from "child_process"; +import { execSync } from "node:child_process"; type Err = { stdout: string; diff --git a/apps/web/server/lib/[user]/getServerSideProps.ts b/apps/web/server/lib/[user]/getServerSideProps.ts index 9122cbaadc9008..1790c65c851b62 100644 --- a/apps/web/server/lib/[user]/getServerSideProps.ts +++ b/apps/web/server/lib/[user]/getServerSideProps.ts @@ -1,6 +1,6 @@ import type { EmbedProps } from "app/WithEmbedSSR"; import type { GetServerSideProps } from "next"; -import { encode } from "querystring"; +import { encode } from "node:querystring"; import type { z } from "zod"; import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains"; diff --git a/apps/web/test/jest-setup.js b/apps/web/test/jest-setup.js index fa5c44868ddabf..2b69df981c3fbb 100644 --- a/apps/web/test/jest-setup.js +++ b/apps/web/test/jest-setup.js @@ -1,6 +1,6 @@ // This is a workaround for https://github.com/jsdom/jsdom/issues/2524#issuecomment-902027138 // See https://github.com/microsoft/accessibility-insights-web/blob/40416a4ae6b91baf43102f58e069eff787de4de2/src/tests/unit/jest-setup.ts -const { TextEncoder, TextDecoder } = require("util"); +const { TextEncoder, TextDecoder } = require("node:util"); global.TextEncoder = TextEncoder; global.TextDecoder = TextDecoder; diff --git a/apps/web/test/lib/getSchedule/selectedSlots.test.ts b/apps/web/test/lib/getSchedule/selectedSlots.test.ts index 6abecdddc3bd5f..a9b0381d00ddb0 100644 --- a/apps/web/test/lib/getSchedule/selectedSlots.test.ts +++ b/apps/web/test/lib/getSchedule/selectedSlots.test.ts @@ -7,7 +7,7 @@ import { type ScenarioData, } from "../../utils/bookingScenario/bookingScenario"; -import type { IncomingMessage } from "http"; +import type { IncomingMessage } from "node:http"; import { describe, test, beforeEach, vi } from "vitest"; import type { z } from "zod"; diff --git a/biome.json b/biome.json index 93f85598ecad07..ce1eb7a28d22e4 100644 --- a/biome.json +++ b/biome.json @@ -27,6 +27,7 @@ "!!**/dist", "!!**/build", "!!**/public", + "!!**/*.d.ts", "!!public", "!!apps/web/public/embed", "!!packages/prisma/zod", @@ -90,7 +91,7 @@ "linter": { "rules": { "nursery": { - "useQwikValidLexicalScope": "warn", + "useQwikValidLexicalScope": "off", "useExplicitType": "warn", "noReactForwardRef": "warn", "noTernary": "warn", @@ -110,7 +111,8 @@ }, "style": { "useExportsLast": "warn", - "noProcessEnv": "warn" + "noProcessEnv": "warn", + "useNodejsImportProtocol": "error" }, "complexity": { "noExcessiveLinesPerFunction": "warn" diff --git a/i18n-unused.config.js b/i18n-unused.config.js index 4b4310e2735f2d..2b7f3a837db4d2 100644 --- a/i18n-unused.config.js +++ b/i18n-unused.config.js @@ -1,4 +1,4 @@ -const path = require("path"); +const path = require("node:path"); /** * # Regex for translation keys diff --git a/packages/app-store-cli/src/build.ts b/packages/app-store-cli/src/build.ts index b6c28e2cfe2a99..406d91d68ead36 100644 --- a/packages/app-store-cli/src/build.ts +++ b/packages/app-store-cli/src/build.ts @@ -1,9 +1,9 @@ import chokidar from "chokidar"; -import fs from "fs"; +import fs from "node:fs" // eslint-disable-next-line no-restricted-imports import { debounce } from "lodash"; -import { spawnSync } from "child_process"; -import path from "path"; +import { spawnSync } from "node:child_process"; +import path from "node:path" import type { AppMeta } from "@calcom/types/App"; import { AppMetaSchema } from "@calcom/types/AppMetaSchema"; diff --git a/packages/app-store-cli/src/components/AppCreateUpdateForm.tsx b/packages/app-store-cli/src/components/AppCreateUpdateForm.tsx index 2085736a3dd33a..ea160c6079210b 100644 --- a/packages/app-store-cli/src/components/AppCreateUpdateForm.tsx +++ b/packages/app-store-cli/src/components/AppCreateUpdateForm.tsx @@ -1,4 +1,4 @@ -import fs from "fs"; +import fs from "node:fs" import { Box, Newline, Text, useApp } from "ink"; import SelectInput from "ink-select-input"; import TextInput from "ink-text-input"; diff --git a/packages/app-store-cli/src/constants.ts b/packages/app-store-cli/src/constants.ts index 581af88f7fd64a..ca863cac4f3bdf 100644 --- a/packages/app-store-cli/src/constants.ts +++ b/packages/app-store-cli/src/constants.ts @@ -1,5 +1,5 @@ -import os from "os"; -import path from "path"; +import os from "node:os"; +import path from "node:path" export const APP_STORE_PATH = path.join(__dirname, "..", "..", "app-store"); export const TEMPLATES_PATH = path.join(APP_STORE_PATH, "templates"); diff --git a/packages/app-store-cli/src/core.ts b/packages/app-store-cli/src/core.ts index 09ff54d1effd2f..df293562e5a1e4 100644 --- a/packages/app-store-cli/src/core.ts +++ b/packages/app-store-cli/src/core.ts @@ -1,5 +1,5 @@ -import fs from "fs"; -import path from "path"; +import fs from "node:fs" +import path from "node:path" import { APP_STORE_PATH, TEMPLATES_PATH, IS_WINDOWS_PLATFORM } from "./constants"; import execSync from "./utils/execSync"; diff --git a/packages/app-store-cli/src/utils/execSync.ts b/packages/app-store-cli/src/utils/execSync.ts index dce49a2ef6b87d..bc718b37610ec3 100644 --- a/packages/app-store-cli/src/utils/execSync.ts +++ b/packages/app-store-cli/src/utils/execSync.ts @@ -1,4 +1,4 @@ -import child_process from "child_process"; +import child_process from "node:child_process"; const execSync = async (cmd: string) => { const silent = process.env.DEBUG === "1" ? false : true; diff --git a/packages/app-store-cli/src/utils/getApp.ts b/packages/app-store-cli/src/utils/getApp.ts index 6ff3e9c4f15b3b..45b95926fc1a26 100644 --- a/packages/app-store-cli/src/utils/getApp.ts +++ b/packages/app-store-cli/src/utils/getApp.ts @@ -1,5 +1,5 @@ -import fs from "fs"; -import path from "path"; +import fs from "node:fs" +import path from "node:path" import { APP_STORE_PATH, TEMPLATES_PATH } from "../constants"; import { getAppName } from "./getAppName"; diff --git a/packages/app-store-cli/src/utils/getAppName.ts b/packages/app-store-cli/src/utils/getAppName.ts index 396ef35b8ab28b..9173f6a9f1c666 100644 --- a/packages/app-store-cli/src/utils/getAppName.ts +++ b/packages/app-store-cli/src/utils/getAppName.ts @@ -1,4 +1,4 @@ -import path from "path"; +import path from "node:path" import { APP_STORE_PATH } from "../constants"; diff --git a/packages/app-store-cli/src/utils/templates.ts b/packages/app-store-cli/src/utils/templates.ts index f2e786156bd91a..c0ec9a8b20c2e4 100644 --- a/packages/app-store-cli/src/utils/templates.ts +++ b/packages/app-store-cli/src/utils/templates.ts @@ -1,5 +1,5 @@ -import fs from "fs"; -import path from "path"; +import fs from "node:fs" +import path from "node:path" import { TEMPLATES_PATH } from "../constants"; import { getAppName } from "./getAppName"; diff --git a/packages/app-store/basecamp3/api/add.ts b/packages/app-store/basecamp3/api/add.ts index 0c75512f018e32..38c138a9bc7ecb 100644 --- a/packages/app-store/basecamp3/api/add.ts +++ b/packages/app-store/basecamp3/api/add.ts @@ -1,5 +1,5 @@ import type { NextApiRequest } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { WEBAPP_URL } from "@calcom/lib/constants"; import { defaultHandler } from "@calcom/lib/server/defaultHandler"; diff --git a/packages/app-store/btcpayserver/api/webhook.ts b/packages/app-store/btcpayserver/api/webhook.ts index fd3a4350496c85..bd10b6b5a24a29 100644 --- a/packages/app-store/btcpayserver/api/webhook.ts +++ b/packages/app-store/btcpayserver/api/webhook.ts @@ -1,4 +1,4 @@ -import crypto from "crypto"; +import crypto from "node:crypto"; import type { NextApiRequest, NextApiResponse } from "next"; import getRawBody from "raw-body"; import { z } from "zod"; diff --git a/packages/app-store/dailyvideo/lib/scripts/deleteRecordings.ts b/packages/app-store/dailyvideo/lib/scripts/deleteRecordings.ts index 5cd8fe909c9c29..4893b7850900e6 100644 --- a/packages/app-store/dailyvideo/lib/scripts/deleteRecordings.ts +++ b/packages/app-store/dailyvideo/lib/scripts/deleteRecordings.ts @@ -170,8 +170,8 @@ async function getAllRecordingsOlderThan6Months(): Promise { } async function saveRecordingsToJson(recordings: Recording[]): Promise { - const fs = await import("fs/promises"); - const path = await import("path"); + const fs = await import("node:fs/promises"); + const path = await import("node:path"); const simplifiedRecordings = recordings.map((recording) => ({ id: recording.id, @@ -316,8 +316,8 @@ async function deleteRecordingsFromJson(dryRun = false): Promise { process.exit(1); } - const fs = await import("fs/promises"); - const path = await import("path"); + const fs = await import("node:fs/promises"); + const path = await import("node:path"); const filePath = path.join(process.cwd(), "recordings_older_than_6_months.json"); @@ -415,7 +415,7 @@ async function deleteRecordingsFromJson(dryRun = false): Promise { } async function mainDelete(): Promise { - const readline = (await import("readline")).createInterface({ + const readline = (await import("node:readline")).createInterface({ input: process.stdin, output: process.stdout, }); diff --git a/packages/app-store/feishucalendar/api/add.ts b/packages/app-store/feishucalendar/api/add.ts index 89276243c309a3..1b8153e9d17a1b 100644 --- a/packages/app-store/feishucalendar/api/add.ts +++ b/packages/app-store/feishucalendar/api/add.ts @@ -1,5 +1,5 @@ import type { NextApiRequest } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { z } from "zod"; import { WEBAPP_URL } from "@calcom/lib/constants"; diff --git a/packages/app-store/hitpay/api/webhook.ts b/packages/app-store/hitpay/api/webhook.ts index d8a191e30a4713..ed0d520dfce10f 100644 --- a/packages/app-store/hitpay/api/webhook.ts +++ b/packages/app-store/hitpay/api/webhook.ts @@ -1,4 +1,4 @@ -import { createHmac } from "crypto"; +import { createHmac } from "node:crypto"; import type { NextApiRequest, NextApiResponse } from "next"; import type z from "zod"; diff --git a/packages/app-store/huddle01video/api/add.ts b/packages/app-store/huddle01video/api/add.ts index 3f788274f2f621..0d5e4efc0c2c2b 100644 --- a/packages/app-store/huddle01video/api/add.ts +++ b/packages/app-store/huddle01video/api/add.ts @@ -1,5 +1,5 @@ import type { NextApiRequest } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { WEBAPP_URL } from "@calcom/lib/constants"; import { defaultHandler } from "@calcom/lib/server/defaultHandler"; diff --git a/packages/app-store/intercom/api/add.ts b/packages/app-store/intercom/api/add.ts index 5960165622f6eb..dfa35272fadc81 100644 --- a/packages/app-store/intercom/api/add.ts +++ b/packages/app-store/intercom/api/add.ts @@ -1,5 +1,5 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { WEBAPP_URL_FOR_OAUTH } from "@calcom/lib/constants"; diff --git a/packages/app-store/jelly/api/add.ts b/packages/app-store/jelly/api/add.ts index 27f1537fe88e41..1445182ae28caf 100644 --- a/packages/app-store/jelly/api/add.ts +++ b/packages/app-store/jelly/api/add.ts @@ -1,5 +1,5 @@ import type { NextApiRequest } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { z } from "zod"; import { WEBAPP_URL } from "@calcom/lib/constants"; diff --git a/packages/app-store/larkcalendar/api/add.ts b/packages/app-store/larkcalendar/api/add.ts index 21f9e3eea90dea..cca9b69d414c92 100644 --- a/packages/app-store/larkcalendar/api/add.ts +++ b/packages/app-store/larkcalendar/api/add.ts @@ -1,5 +1,5 @@ import type { NextApiRequest } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { z } from "zod"; import { WEBAPP_URL } from "@calcom/lib/constants"; diff --git a/packages/app-store/nextcloudtalk/api/add.ts b/packages/app-store/nextcloudtalk/api/add.ts index dc513861c93430..89bcdf78eb45a8 100644 --- a/packages/app-store/nextcloudtalk/api/add.ts +++ b/packages/app-store/nextcloudtalk/api/add.ts @@ -1,5 +1,5 @@ import type { NextApiRequest } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { WEBAPP_URL } from "@calcom/lib/constants"; import { defaultHandler } from "@calcom/lib/server/defaultHandler"; diff --git a/packages/app-store/nextcloudtalk/lib/VideoApiAdapter.ts b/packages/app-store/nextcloudtalk/lib/VideoApiAdapter.ts index 537deb898755c4..d09f748541fab6 100644 --- a/packages/app-store/nextcloudtalk/lib/VideoApiAdapter.ts +++ b/packages/app-store/nextcloudtalk/lib/VideoApiAdapter.ts @@ -1,4 +1,4 @@ -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { v4 as uuidv4 } from "uuid"; import { z } from "zod"; diff --git a/packages/app-store/office365calendar/api/add.ts b/packages/app-store/office365calendar/api/add.ts index f2d6a9b7c08890..d19038e3dead2d 100644 --- a/packages/app-store/office365calendar/api/add.ts +++ b/packages/app-store/office365calendar/api/add.ts @@ -1,5 +1,5 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { WEBAPP_URL_FOR_OAUTH } from "@calcom/lib/constants"; diff --git a/packages/app-store/office365video/api/add.ts b/packages/app-store/office365video/api/add.ts index 2da0a81caf6831..767ccc647f83b6 100644 --- a/packages/app-store/office365video/api/add.ts +++ b/packages/app-store/office365video/api/add.ts @@ -1,5 +1,5 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { WEBAPP_URL_FOR_OAUTH } from "@calcom/lib/constants"; diff --git a/packages/app-store/stripepayment/api/callback.ts b/packages/app-store/stripepayment/api/callback.ts index 1338d5b2106f95..b94766ca25eddd 100644 --- a/packages/app-store/stripepayment/api/callback.ts +++ b/packages/app-store/stripepayment/api/callback.ts @@ -1,5 +1,5 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import type { Prisma } from "@calcom/prisma/client"; diff --git a/packages/app-store/stripepayment/lib/client/createPaymentLink.ts b/packages/app-store/stripepayment/lib/client/createPaymentLink.ts index 768b48edbfd5d9..38ae1373012efa 100644 --- a/packages/app-store/stripepayment/lib/client/createPaymentLink.ts +++ b/packages/app-store/stripepayment/lib/client/createPaymentLink.ts @@ -1,7 +1,9 @@ -import { stringify } from "querystring"; import { WEBSITE_URL } from "@calcom/lib/constants"; +// biome-ignore lint/style/useNodejsImportProtocol: No node env +import { stringify } from "querystring"; + export type Maybe = T | undefined | null; export function createPaymentLink(opts: { diff --git a/packages/app-store/tandemvideo/api/add.ts b/packages/app-store/tandemvideo/api/add.ts index 84702ff93af6cf..9c5c0c69019335 100644 --- a/packages/app-store/tandemvideo/api/add.ts +++ b/packages/app-store/tandemvideo/api/add.ts @@ -1,5 +1,5 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { WEBAPP_URL } from "@calcom/lib/constants"; import prisma from "@calcom/prisma"; diff --git a/packages/app-store/webex/api/add.ts b/packages/app-store/webex/api/add.ts index 703a19f68e1299..58f0f158fe717c 100644 --- a/packages/app-store/webex/api/add.ts +++ b/packages/app-store/webex/api/add.ts @@ -1,5 +1,5 @@ import type { NextApiRequest } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { WEBAPP_URL_FOR_OAUTH } from "@calcom/lib/constants"; import { defaultHandler } from "@calcom/lib/server/defaultHandler"; diff --git a/packages/app-store/zohocalendar/api/add.ts b/packages/app-store/zohocalendar/api/add.ts index 820d6c93591ae0..0f713f0d031b12 100644 --- a/packages/app-store/zohocalendar/api/add.ts +++ b/packages/app-store/zohocalendar/api/add.ts @@ -1,5 +1,5 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { WEBAPP_URL } from "@calcom/lib/constants"; import { defaultHandler } from "@calcom/lib/server/defaultHandler"; diff --git a/packages/app-store/zohocalendar/api/callback.ts b/packages/app-store/zohocalendar/api/callback.ts index fdb34c5cca809c..23266d609d17eb 100644 --- a/packages/app-store/zohocalendar/api/callback.ts +++ b/packages/app-store/zohocalendar/api/callback.ts @@ -1,5 +1,5 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { renewSelectedCalendarCredentialId } from "@calcom/lib/connectedCalendar"; import { WEBAPP_URL } from "@calcom/lib/constants"; diff --git a/packages/app-store/zohocalendar/lib/CalendarService.ts b/packages/app-store/zohocalendar/lib/CalendarService.ts index 775c61b30e587e..cbaca481ef90b1 100644 --- a/packages/app-store/zohocalendar/lib/CalendarService.ts +++ b/packages/app-store/zohocalendar/lib/CalendarService.ts @@ -1,4 +1,4 @@ -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import dayjs from "@calcom/dayjs"; import { getLocation } from "@calcom/lib/CalEventParser"; diff --git a/packages/app-store/zohocrm/api/_getAdd.ts b/packages/app-store/zohocrm/api/_getAdd.ts index f0f78a86b0bd75..9a7ded8dbea86f 100644 --- a/packages/app-store/zohocrm/api/_getAdd.ts +++ b/packages/app-store/zohocrm/api/_getAdd.ts @@ -1,5 +1,5 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { WEBAPP_URL } from "@calcom/lib/constants"; diff --git a/packages/app-store/zoomvideo/api/add.ts b/packages/app-store/zoomvideo/api/add.ts index 7b70919c3a97b8..e9d4d4a0d36246 100644 --- a/packages/app-store/zoomvideo/api/add.ts +++ b/packages/app-store/zoomvideo/api/add.ts @@ -1,5 +1,5 @@ import type { NextApiRequest } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { WEBAPP_URL_FOR_OAUTH } from "@calcom/lib/constants"; import { defaultHandler } from "@calcom/lib/server/defaultHandler"; diff --git a/packages/embeds/embed-core/vite.config.js b/packages/embeds/embed-core/vite.config.js index e200aea28e0af2..40f0a9ce6b8e68 100644 --- a/packages/embeds/embed-core/vite.config.js +++ b/packages/embeds/embed-core/vite.config.js @@ -3,7 +3,7 @@ import EnvironmentPlugin from "vite-plugin-environment"; import viteBaseConfig, { embedCoreEnvVars } from "../vite.config"; -const path = require("path"); +const path = require("node:path"); const { defineConfig } = require("vite"); module.exports = defineConfig((configEnv) => { /** @type {import('vite').UserConfig} */ diff --git a/packages/embeds/embed-react/vite.config.js b/packages/embeds/embed-react/vite.config.js index 17731cc3ec6bce..085dc0fee91956 100644 --- a/packages/embeds/embed-react/vite.config.js +++ b/packages/embeds/embed-react/vite.config.js @@ -1,5 +1,5 @@ import react from "@vitejs/plugin-react"; -import path from "path"; +import path from "node:path" import { defineConfig } from "vite"; import viteBaseConfig from "../vite.config"; diff --git a/packages/embeds/embed-snippet/vite.config.js b/packages/embeds/embed-snippet/vite.config.js index 8d097debab0ea6..a4634fea3d111f 100644 --- a/packages/embeds/embed-snippet/vite.config.js +++ b/packages/embeds/embed-snippet/vite.config.js @@ -1,6 +1,6 @@ import viteBaseConfig from "../vite.config"; -const path = require("path"); +const path = require("node:path"); const { defineConfig } = require("vite"); module.exports = defineConfig({ diff --git a/packages/embeds/vite.config.js b/packages/embeds/vite.config.js index c51870678a6cbe..2d7b9ebccb1cd1 100644 --- a/packages/embeds/vite.config.js +++ b/packages/embeds/vite.config.js @@ -1,4 +1,4 @@ -const path = require("path"); +const path = require("node:path"); require("dotenv").config({ path: path.join(__dirname, "..", "..", ".env") }); process.env.EMBED_PUBLIC_VERCEL_URL = process.env.VERCEL_URL; process.env.EMBED_PUBLIC_WEBAPP_URL = process.env.NEXT_PUBLIC_WEBAPP_URL; diff --git a/packages/features/auth/lib/sendVerificationRequest.ts b/packages/features/auth/lib/sendVerificationRequest.ts index ffa07a98c33e4f..9b7638d51033b1 100644 --- a/packages/features/auth/lib/sendVerificationRequest.ts +++ b/packages/features/auth/lib/sendVerificationRequest.ts @@ -1,9 +1,9 @@ -import { readFileSync } from "fs"; +import { readFileSync } from "node:fs"; import Handlebars from "handlebars"; import type { SendVerificationRequestParams } from "next-auth/providers/email"; import type { TransportOptions } from "nodemailer"; import nodemailer from "nodemailer"; -import path from "path"; +import path from "node:path" import { APP_NAME, WEBAPP_URL } from "@calcom/lib/constants"; import { serverConfig } from "@calcom/lib/serverConfig"; diff --git a/packages/features/auth/lib/verifyCodeUnAuthenticated.ts b/packages/features/auth/lib/verifyCodeUnAuthenticated.ts index 453d08bc5fa1ae..d17acdcee806f9 100644 --- a/packages/features/auth/lib/verifyCodeUnAuthenticated.ts +++ b/packages/features/auth/lib/verifyCodeUnAuthenticated.ts @@ -1,4 +1,4 @@ -import { createHash } from "crypto"; +import { createHash } from "node:crypto"; import { checkRateLimitAndThrowError } from "@calcom/lib/checkRateLimitAndThrowError"; import { hashEmail } from "@calcom/lib/server/PiiHasher"; diff --git a/packages/features/auth/lib/verifyEmail.ts b/packages/features/auth/lib/verifyEmail.ts index 7c14a771014023..411858f8e1d748 100644 --- a/packages/features/auth/lib/verifyEmail.ts +++ b/packages/features/auth/lib/verifyEmail.ts @@ -1,4 +1,4 @@ -import { randomBytes, createHash } from "crypto"; +import { randomBytes, createHash } from "node:crypto"; import { totp } from "otplib"; import { diff --git a/packages/features/bookings/lib/reschedule/determineReschedulePreventionRedirect.ts b/packages/features/bookings/lib/reschedule/determineReschedulePreventionRedirect.ts index b5e98d0a4fbaac..a75900a65dd6c7 100644 --- a/packages/features/bookings/lib/reschedule/determineReschedulePreventionRedirect.ts +++ b/packages/features/bookings/lib/reschedule/determineReschedulePreventionRedirect.ts @@ -1,4 +1,4 @@ -import { URLSearchParams } from "url"; +import { URLSearchParams } from "node:url"; import { getFullName } from "@calcom/features/form-builder/utils"; import { ENV_PAST_BOOKING_RESCHEDULE_CHANGE_TEAM_IDS } from "@calcom/lib/constants"; diff --git a/packages/features/bookings/lib/service/InstantBookingCreateService.ts b/packages/features/bookings/lib/service/InstantBookingCreateService.ts index 768cdfeb7a11c8..b609813d1a47c0 100644 --- a/packages/features/bookings/lib/service/InstantBookingCreateService.ts +++ b/packages/features/bookings/lib/service/InstantBookingCreateService.ts @@ -1,4 +1,4 @@ -import { randomBytes } from "crypto"; +import { randomBytes } from "node:crypto"; import short from "short-uuid"; import { v5 as uuidv5 } from "uuid"; diff --git a/packages/features/bot-detection/BotDetectionService.test.ts b/packages/features/bot-detection/BotDetectionService.test.ts index 09c396c91eb598..1e7bcc7479fc97 100644 --- a/packages/features/bot-detection/BotDetectionService.test.ts +++ b/packages/features/bot-detection/BotDetectionService.test.ts @@ -1,4 +1,4 @@ -import type { IncomingHttpHeaders } from "http"; +import type { IncomingHttpHeaders } from "node:http"; import { beforeEach, describe, expect, it, vi } from "vitest"; import type { EventTypeRepository } from "@calcom/features/eventtypes/repositories/eventTypeRepository"; diff --git a/packages/features/bot-detection/BotDetectionService.ts b/packages/features/bot-detection/BotDetectionService.ts index e0026f43228ab4..10c541198aeeae 100644 --- a/packages/features/bot-detection/BotDetectionService.ts +++ b/packages/features/bot-detection/BotDetectionService.ts @@ -1,5 +1,5 @@ import { checkBotId } from "botid/server"; -import type { IncomingHttpHeaders } from "http"; +import type { IncomingHttpHeaders } from "node:http"; import type { EventTypeRepository } from "@calcom/features/eventtypes/repositories/eventTypeRepository"; import type { FeaturesRepository } from "@calcom/features/flags/features.repository"; diff --git a/packages/features/ee/api-keys/lib/apiKeys.ts b/packages/features/ee/api-keys/lib/apiKeys.ts index ec0b4f109e1b9f..410bd3d5e0f056 100644 --- a/packages/features/ee/api-keys/lib/apiKeys.ts +++ b/packages/features/ee/api-keys/lib/apiKeys.ts @@ -1,4 +1,4 @@ -import { randomBytes, createHash } from "crypto"; +import { randomBytes, createHash } from "node:crypto"; // Hash the API key to check against when veriying it. so we don't have to store the key in plain text. export const hashAPIKey = (apiKey: string): string => createHash("sha256").update(apiKey).digest("hex"); diff --git a/packages/features/ee/common/server/private-api-utils.ts b/packages/features/ee/common/server/private-api-utils.ts index 3c0856a1d42268..251df0e8c7876d 100644 --- a/packages/features/ee/common/server/private-api-utils.ts +++ b/packages/features/ee/common/server/private-api-utils.ts @@ -1,4 +1,4 @@ -import crypto from "crypto"; +import crypto from "node:crypto"; export const generateNonce = (): string => { return crypto.randomBytes(16).toString("hex"); diff --git a/packages/features/ee/organizations/lib/orgDomains.ts b/packages/features/ee/organizations/lib/orgDomains.ts index 483c120db64722..2ef2f32a930066 100644 --- a/packages/features/ee/organizations/lib/orgDomains.ts +++ b/packages/features/ee/organizations/lib/orgDomains.ts @@ -1,4 +1,4 @@ -import type { IncomingMessage } from "http"; +import type { IncomingMessage } from "node:http"; import { IS_PRODUCTION, WEBSITE_URL, SINGLE_ORG_SLUG } from "@calcom/lib/constants"; import { ALLOWED_HOSTNAMES, RESERVED_SUBDOMAINS, WEBAPP_URL } from "@calcom/lib/constants"; diff --git a/packages/features/ee/organizations/lib/server/orgCreationUtils.ts b/packages/features/ee/organizations/lib/server/orgCreationUtils.ts index 3ab69b6221b9b0..fdc1f033b1d2b6 100644 --- a/packages/features/ee/organizations/lib/server/orgCreationUtils.ts +++ b/packages/features/ee/organizations/lib/server/orgCreationUtils.ts @@ -1,4 +1,4 @@ -import { lookup } from "dns"; +import { lookup } from "node:dns"; import { type TFunction } from "i18next"; import { sendAdminOrganizationNotification } from "@calcom/emails/organization-email-service"; diff --git a/packages/features/ee/teams/lib/getTeamMemberEmailFromCrm.ts b/packages/features/ee/teams/lib/getTeamMemberEmailFromCrm.ts index 7d18760a2be0d3..cfcd9f06e33848 100644 --- a/packages/features/ee/teams/lib/getTeamMemberEmailFromCrm.ts +++ b/packages/features/ee/teams/lib/getTeamMemberEmailFromCrm.ts @@ -1,4 +1,4 @@ -import type { ParsedUrlQuery } from "querystring"; +import type { ParsedUrlQuery } from "node:querystring"; /* eslint-disable */ import { getCRMContactOwnerForRRLeadSkip } from "@calcom/app-store/_utils/CRMRoundRobinSkip"; diff --git a/packages/features/ee/teams/services/teamService.ts b/packages/features/ee/teams/services/teamService.ts index c41bf9b4e7fbd7..054e0c613499c5 100644 --- a/packages/features/ee/teams/services/teamService.ts +++ b/packages/features/ee/teams/services/teamService.ts @@ -1,4 +1,4 @@ -import { randomBytes } from "crypto"; +import { randomBytes } from "node:crypto"; import { getTeamBillingServiceFactory } from "@calcom/ee/billing/di/containers/Billing"; import { deleteWorkfowRemindersOfRemovedMember } from "@calcom/features/ee/teams/lib/deleteWorkflowRemindersOfRemovedMember"; diff --git a/packages/features/filters/lib/getTeamsFiltersFromQuery.ts b/packages/features/filters/lib/getTeamsFiltersFromQuery.ts index bdc1b5cd9ac155..445e3060ff2981 100644 --- a/packages/features/filters/lib/getTeamsFiltersFromQuery.ts +++ b/packages/features/filters/lib/getTeamsFiltersFromQuery.ts @@ -1,4 +1,4 @@ -import type { ParsedUrlQuery } from "querystring"; +import type { ParsedUrlQuery } from "node:querystring"; import { z } from "zod"; // Take array as a string and return zod array diff --git a/packages/features/insights/services/InsightsRoutingService.integration-test.ts b/packages/features/insights/services/InsightsRoutingService.integration-test.ts index 97bec520e13d62..199b4fa44f991c 100644 --- a/packages/features/insights/services/InsightsRoutingService.integration-test.ts +++ b/packages/features/insights/services/InsightsRoutingService.integration-test.ts @@ -1,4 +1,4 @@ -import { randomUUID } from "crypto"; +import { randomUUID } from "node:crypto"; import { v4 as uuid } from "uuid"; import { describe, expect, it, vi, beforeAll, afterAll } from "vitest"; diff --git a/packages/features/routing-forms/lib/getRoutedUrl.test.ts b/packages/features/routing-forms/lib/getRoutedUrl.test.ts index 41dc3001991cb9..90632586e898ae 100644 --- a/packages/features/routing-forms/lib/getRoutedUrl.test.ts +++ b/packages/features/routing-forms/lib/getRoutedUrl.test.ts @@ -1,6 +1,6 @@ import "@calcom/lib/__mocks__/logger"; -import { createHash } from "crypto"; +import { createHash } from "node:crypto"; import type { GetServerSidePropsContext } from "next"; import { beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/packages/features/routing-forms/lib/getRoutedUrl.ts b/packages/features/routing-forms/lib/getRoutedUrl.ts index 148c562f430b9d..13d946a92c5c43 100644 --- a/packages/features/routing-forms/lib/getRoutedUrl.ts +++ b/packages/features/routing-forms/lib/getRoutedUrl.ts @@ -1,7 +1,7 @@ // !IMPORTANT! changes to this file requires publishing new version of platform libraries in order for the changes to be applied to APIV2 -import { createHash } from "crypto"; +import { createHash } from "node:crypto"; import type { GetServerSidePropsContext } from "next"; -import { stringify } from "querystring"; +import { stringify } from "node:querystring"; import { v4 as uuidv4 } from "uuid"; import z from "zod"; diff --git a/packages/features/webhooks/lib/sendPayload.ts b/packages/features/webhooks/lib/sendPayload.ts index faed63a2579f0c..e8487d799bb227 100644 --- a/packages/features/webhooks/lib/sendPayload.ts +++ b/packages/features/webhooks/lib/sendPayload.ts @@ -1,4 +1,4 @@ -import { createHmac } from "crypto"; +import { createHmac } from "node:crypto"; import { compile } from "handlebars"; import type { TGetTranscriptAccessLink } from "@calcom/app-store/dailyvideo/zod"; diff --git a/packages/features/webhooks/lib/service/WebhookService.ts b/packages/features/webhooks/lib/service/WebhookService.ts index b559e5920ab927..45a64dee43a4e6 100644 --- a/packages/features/webhooks/lib/service/WebhookService.ts +++ b/packages/features/webhooks/lib/service/WebhookService.ts @@ -1,4 +1,4 @@ -import { createHmac } from "crypto"; +import { createHmac } from "node:crypto"; import { WebhookTriggerEvents } from "@calcom/prisma/enums"; diff --git a/packages/lib/apps/getAppOnboardingUrl.ts b/packages/lib/apps/getAppOnboardingUrl.ts index 297dba0ba91172..c58496cb26d98c 100644 --- a/packages/lib/apps/getAppOnboardingUrl.ts +++ b/packages/lib/apps/getAppOnboardingUrl.ts @@ -1,6 +1,7 @@ -import { stringify } from "querystring"; +import type { AppOnboardingSteps } from "@calcom/lib/apps/appOnboardingSteps" -import type { AppOnboardingSteps } from "@calcom/lib/apps/appOnboardingSteps"; +// biome-ignore lint/style/useNodejsImportProtocol: Vite env +import { stringify } from "querystring"; export const getAppOnboardingUrl = ({ slug, @@ -10,9 +11,9 @@ export const getAppOnboardingUrl = ({ slug: string; step: AppOnboardingSteps; teamId?: number; -}) => { +}): string => { const params: { [key: string]: string | number | number[] } = { slug }; - if (!!teamId) { + if (teamId) { params.teamId = teamId; } const query = stringify(params); diff --git a/packages/lib/crypto.ts b/packages/lib/crypto.ts index 37545b2954aca6..d397bc778ac183 100644 --- a/packages/lib/crypto.ts +++ b/packages/lib/crypto.ts @@ -1,4 +1,4 @@ -import crypto from "crypto"; +import crypto from "node:crypto"; const ALGORITHM = "aes256"; const INPUT_ENCODING = "utf8"; diff --git a/packages/lib/hooks/useParamsWithFallback.ts b/packages/lib/hooks/useParamsWithFallback.ts index 8e5e4eb5f38115..28225cb120068f 100644 --- a/packages/lib/hooks/useParamsWithFallback.ts +++ b/packages/lib/hooks/useParamsWithFallback.ts @@ -2,7 +2,7 @@ import { useRouter as useCompatRouter } from "next/compat/router"; import { useParams } from "next/navigation"; -import type { ParsedUrlQuery } from "querystring"; +import type { ParsedUrlQuery } from "node:querystring"; interface Params { [key: string]: string | string[]; diff --git a/packages/lib/logger.server.ts b/packages/lib/logger.server.ts index 4b2fff058ea1a0..4c401205f36a37 100644 --- a/packages/lib/logger.server.ts +++ b/packages/lib/logger.server.ts @@ -1,4 +1,4 @@ -import fs from "fs"; +import fs from "node:fs" import logger from "./logger"; diff --git a/packages/lib/pkce.ts b/packages/lib/pkce.ts index b69547684e8414..3221fab46d8893 100644 --- a/packages/lib/pkce.ts +++ b/packages/lib/pkce.ts @@ -1,4 +1,4 @@ -import { createHash } from "crypto"; +import { createHash } from "node:crypto"; export function verifyCodeChallenge( codeVerifier: string, diff --git a/packages/lib/server/perfObserver.ts b/packages/lib/server/perfObserver.ts index f8ad89f75d5cd9..55d3db2f692cf7 100644 --- a/packages/lib/server/perfObserver.ts +++ b/packages/lib/server/perfObserver.ts @@ -1,4 +1,4 @@ -import { PerformanceObserver } from "perf_hooks"; +import { PerformanceObserver } from "node:perf_hooks"; import logger from "../logger"; @@ -23,4 +23,4 @@ if (process.env.NODE_ENV !== "production") { export default perfObserver; -export { performance } from "perf_hooks"; +export { performance } from "node:perf_hooks"; diff --git a/packages/lib/server/service/VerificationTokenService.ts b/packages/lib/server/service/VerificationTokenService.ts index eb9753589abc69..429851bbc02412 100644 --- a/packages/lib/server/service/VerificationTokenService.ts +++ b/packages/lib/server/service/VerificationTokenService.ts @@ -1,4 +1,4 @@ -import { randomBytes, createHash } from "crypto"; +import { randomBytes, createHash } from "node:crypto"; import { VerificationTokenRepository } from "../repository/verificationToken"; diff --git a/packages/platform/atoms/scripts/dev-on.js b/packages/platform/atoms/scripts/dev-on.js index 5103906c2dff9c..dc61ae02a9255d 100644 --- a/packages/platform/atoms/scripts/dev-on.js +++ b/packages/platform/atoms/scripts/dev-on.js @@ -1,6 +1,6 @@ -import fs from "fs"; -import path from "path"; -import { fileURLToPath } from "url"; +import fs from "node:fs" +import path from "node:path" +import { fileURLToPath } from "node:url"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const packageJsonPath = path.join(__dirname, "../package.json"); diff --git a/packages/platform/atoms/vite.config.ts b/packages/platform/atoms/vite.config.ts index 20a5cce438119f..1847209c4d2b0e 100644 --- a/packages/platform/atoms/vite.config.ts +++ b/packages/platform/atoms/vite.config.ts @@ -1,6 +1,6 @@ import react from "@vitejs/plugin-react-swc"; -import path from "path"; -import { resolve } from "path"; +import path from "node:path" +import { resolve } from "node:path"; import { defineConfig, loadEnv } from "vite"; import dts from "vite-plugin-dts"; diff --git a/packages/platform/examples/base/playwright.config.ts b/packages/platform/examples/base/playwright.config.ts index d77d9e71361d81..7a81bb3e36df76 100644 --- a/packages/platform/examples/base/playwright.config.ts +++ b/packages/platform/examples/base/playwright.config.ts @@ -1,6 +1,6 @@ import { defineConfig, devices } from "@playwright/test"; import dotenv from "dotenv"; -import path from "path"; +import path from "node:path" const envPath = process.env.CI ? path.resolve(__dirname, ".env") : path.resolve(__dirname, ".env.local"); diff --git a/packages/platform/libraries/i18n.ts b/packages/platform/libraries/i18n.ts index 4236f49e9c256d..09de7e84f1d7cc 100644 --- a/packages/platform/libraries/i18n.ts +++ b/packages/platform/libraries/i18n.ts @@ -7,7 +7,7 @@ import logger from "@calcom/lib/logger"; /* eslint-disable @typescript-eslint/no-require-imports */ const { i18n } = require("@calcom/config/next-i18next.config"); -const path = require("path"); +const path = require("node:path"); const translationsPath = path.resolve(__dirname, "../../../../apps/web/public/static/locales/en/common.json"); const englishTranslations: Record = require(translationsPath); /* eslint-enable @typescript-eslint/no-require-imports */ diff --git a/packages/platform/libraries/scripts/local.js b/packages/platform/libraries/scripts/local.js index 76694926242d49..eb4580f813ad7b 100644 --- a/packages/platform/libraries/scripts/local.js +++ b/packages/platform/libraries/scripts/local.js @@ -1,6 +1,6 @@ -import fs from "fs"; -import path from "path"; -import { fileURLToPath } from "url"; +import fs from "node:fs" +import path from "node:path" +import { fileURLToPath } from "node:url"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); diff --git a/packages/platform/libraries/scripts/postpublish.js b/packages/platform/libraries/scripts/postpublish.js index c7ddd13f89a0ff..d633e83bd0cd0b 100644 --- a/packages/platform/libraries/scripts/postpublish.js +++ b/packages/platform/libraries/scripts/postpublish.js @@ -1,7 +1,7 @@ -import { spawn } from "child_process"; -import fs from "fs"; -import path from "path"; -import { fileURLToPath } from "url"; +import { spawn } from "node:child_process"; +import fs from "node:fs" +import path from "node:path" +import { fileURLToPath } from "node:url"; import { getCurrentVersion } from "./prepublish.js"; diff --git a/packages/platform/libraries/scripts/prepublish.js b/packages/platform/libraries/scripts/prepublish.js index 9e51ebd861d86f..f940721e414772 100644 --- a/packages/platform/libraries/scripts/prepublish.js +++ b/packages/platform/libraries/scripts/prepublish.js @@ -1,7 +1,7 @@ -import fs from "fs"; -import https from "https"; -import path from "path"; -import { fileURLToPath } from "url"; +import fs from "node:fs" +import https from "node:https"; +import path from "node:path" +import { fileURLToPath } from "node:url"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); diff --git a/packages/platform/libraries/vite.config.js b/packages/platform/libraries/vite.config.js index 92e93cfd052234..b8e0647bb438a1 100644 --- a/packages/platform/libraries/vite.config.js +++ b/packages/platform/libraries/vite.config.js @@ -1,9 +1,9 @@ // vite.config.ts import react from "@vitejs/plugin-react"; -import { resolve } from "path"; -import path from "path"; -import { dirname } from "path"; -import { fileURLToPath } from "url"; +import { resolve } from "node:path"; +import path from "node:path" +import { dirname } from "node:path"; +import { fileURLToPath } from "node:url"; import { defineConfig } from "vite"; import dts from "vite-plugin-dts"; diff --git a/packages/trpc/server/routers/viewer/admin/createSelfHostedLicenseKey.handler.ts b/packages/trpc/server/routers/viewer/admin/createSelfHostedLicenseKey.handler.ts index 080f3ff566a8dc..166e2f72f3f3fc 100644 --- a/packages/trpc/server/routers/viewer/admin/createSelfHostedLicenseKey.handler.ts +++ b/packages/trpc/server/routers/viewer/admin/createSelfHostedLicenseKey.handler.ts @@ -1,4 +1,4 @@ -import * as crypto from "crypto"; +import * as crypto from "node:crypto"; import { z } from "zod"; import { CALCOM_PRIVATE_API_ROUTE } from "@calcom/lib/constants"; diff --git a/packages/trpc/server/routers/viewer/attributes/findTeamMembersMatchingAttributeLogic.handler.ts b/packages/trpc/server/routers/viewer/attributes/findTeamMembersMatchingAttributeLogic.handler.ts index c9252496d7eb87..327fd3336c23a4 100644 --- a/packages/trpc/server/routers/viewer/attributes/findTeamMembersMatchingAttributeLogic.handler.ts +++ b/packages/trpc/server/routers/viewer/attributes/findTeamMembersMatchingAttributeLogic.handler.ts @@ -1,4 +1,4 @@ -import type { ServerResponse } from "http"; +import type { ServerResponse } from "node:http"; import type { NextApiResponse } from "next"; import { findTeamMembersMatchingAttributeLogic } from "@calcom/features/routing-forms/lib/findTeamMembersMatchingAttributeLogic"; diff --git a/packages/trpc/server/routers/viewer/me/get.handler.ts b/packages/trpc/server/routers/viewer/me/get.handler.ts index dfca7e93b8b036..2da2dadeafce63 100644 --- a/packages/trpc/server/routers/viewer/me/get.handler.ts +++ b/packages/trpc/server/routers/viewer/me/get.handler.ts @@ -19,7 +19,7 @@ type MeOptions = { }; export const getHandler = async ({ ctx, input }: MeOptions) => { - const crypto = await import("crypto"); + const crypto = await import("node:crypto"); const { user: sessionUser, session } = ctx; diff --git a/packages/trpc/server/routers/viewer/oAuth/addClient.handler.ts b/packages/trpc/server/routers/viewer/oAuth/addClient.handler.ts index 6e26d2ae926390..815d230f0a4628 100644 --- a/packages/trpc/server/routers/viewer/oAuth/addClient.handler.ts +++ b/packages/trpc/server/routers/viewer/oAuth/addClient.handler.ts @@ -1,4 +1,4 @@ -import { randomBytes, createHash } from "crypto"; +import { randomBytes, createHash } from "node:crypto"; import { prisma } from "@calcom/prisma"; import { Prisma } from "@calcom/prisma/client"; diff --git a/packages/trpc/server/routers/viewer/oAuth/generateAuthCode.handler.ts b/packages/trpc/server/routers/viewer/oAuth/generateAuthCode.handler.ts index c37beee1365aeb..173ce716aa5f06 100644 --- a/packages/trpc/server/routers/viewer/oAuth/generateAuthCode.handler.ts +++ b/packages/trpc/server/routers/viewer/oAuth/generateAuthCode.handler.ts @@ -1,4 +1,4 @@ -import { randomBytes } from "crypto"; +import { randomBytes } from "node:crypto"; import dayjs from "@calcom/dayjs"; import { prisma } from "@calcom/prisma"; diff --git a/packages/trpc/server/routers/viewer/organizations/create.handler.ts b/packages/trpc/server/routers/viewer/organizations/create.handler.ts index 5bf471e76c350b..2db25041a6f724 100644 --- a/packages/trpc/server/routers/viewer/organizations/create.handler.ts +++ b/packages/trpc/server/routers/viewer/organizations/create.handler.ts @@ -1,4 +1,4 @@ -import { lookup } from "dns"; +import { lookup } from "node:dns"; import { getOrgFullOrigin } from "@calcom/ee/organizations/lib/orgDomains"; import { isNotACompanyEmail } from "@calcom/ee/organizations/lib/server/orgCreationUtils"; diff --git a/packages/trpc/server/routers/viewer/organizations/setPassword.handler.ts b/packages/trpc/server/routers/viewer/organizations/setPassword.handler.ts index e2faafb94e010a..c9529fd6a859c8 100644 --- a/packages/trpc/server/routers/viewer/organizations/setPassword.handler.ts +++ b/packages/trpc/server/routers/viewer/organizations/setPassword.handler.ts @@ -1,4 +1,4 @@ -import { createHash } from "crypto"; +import { createHash } from "node:crypto"; import { verifyPassword } from "@calcom/features/auth/lib/verifyPassword"; import { hashPassword } from "@calcom/lib/auth/hashPassword"; diff --git a/packages/trpc/server/routers/viewer/organizations/verifyCode.handler.ts b/packages/trpc/server/routers/viewer/organizations/verifyCode.handler.ts index b960ab453eaa5f..84eba7da9d4bad 100644 --- a/packages/trpc/server/routers/viewer/organizations/verifyCode.handler.ts +++ b/packages/trpc/server/routers/viewer/organizations/verifyCode.handler.ts @@ -1,4 +1,4 @@ -import { createHash } from "crypto"; +import { createHash } from "node:crypto"; import { checkRateLimitAndThrowError } from "@calcom/lib/checkRateLimitAndThrowError"; import { IS_PRODUCTION } from "@calcom/lib/constants"; diff --git a/packages/trpc/server/routers/viewer/routing-forms/findTeamMembersMatchingAttributeLogicOfRoute.handler.ts b/packages/trpc/server/routers/viewer/routing-forms/findTeamMembersMatchingAttributeLogicOfRoute.handler.ts index e157ee1f356c43..9a2b1ee86b0a9d 100644 --- a/packages/trpc/server/routers/viewer/routing-forms/findTeamMembersMatchingAttributeLogicOfRoute.handler.ts +++ b/packages/trpc/server/routers/viewer/routing-forms/findTeamMembersMatchingAttributeLogicOfRoute.handler.ts @@ -3,7 +3,7 @@ * Also, it is applicable only for sub-teams. Regular teams and user Routing Forms don't hit this endpoint. * Live mode uses findTeamMembersMatchingAttributeLogicOfRoute fn directly */ -import type { ServerResponse } from "http"; +import type { ServerResponse } from "node:http"; import type { NextApiResponse } from "next"; import { enrichHostsWithDelegationCredentials } from "@calcom/app-store/delegationCredential"; diff --git a/packages/trpc/server/routers/viewer/slots/types.ts b/packages/trpc/server/routers/viewer/slots/types.ts index 1654667cb52a79..a2ccf214d1772d 100644 --- a/packages/trpc/server/routers/viewer/slots/types.ts +++ b/packages/trpc/server/routers/viewer/slots/types.ts @@ -1,4 +1,4 @@ -import type { IncomingMessage } from "http"; +import type { IncomingMessage } from "node:http"; import { z } from "zod"; import { timeZoneSchema } from "@calcom/lib/dayjs/timeZone.schema"; diff --git a/packages/trpc/server/routers/viewer/teams/inviteMember/utils.ts b/packages/trpc/server/routers/viewer/teams/inviteMember/utils.ts index 64bffde0c4831a..826cc8f94628e6 100644 --- a/packages/trpc/server/routers/viewer/teams/inviteMember/utils.ts +++ b/packages/trpc/server/routers/viewer/teams/inviteMember/utils.ts @@ -1,4 +1,4 @@ -import { randomBytes } from "crypto"; +import { randomBytes } from "node:crypto"; import type { TFunction } from "i18next"; import { getOrgFullOrigin } from "@calcom/ee/organizations/lib/orgDomains"; diff --git a/packages/trpc/server/routers/viewer/workflows/verifyEmailCode.handler.ts b/packages/trpc/server/routers/viewer/workflows/verifyEmailCode.handler.ts index e41fad4e0ee44d..9e99a0e4a6240e 100644 --- a/packages/trpc/server/routers/viewer/workflows/verifyEmailCode.handler.ts +++ b/packages/trpc/server/routers/viewer/workflows/verifyEmailCode.handler.ts @@ -1,4 +1,4 @@ -import { createHash } from "crypto"; +import { createHash } from "node:crypto"; import { totpRawCheck } from "@calcom/lib/totp"; import { prisma } from "@calcom/prisma"; diff --git a/packages/types/next.d.ts b/packages/types/next.d.ts index 538b95788fe2c6..3db586e87cca41 100644 --- a/packages/types/next.d.ts +++ b/packages/types/next.d.ts @@ -1,4 +1,4 @@ -import type { IncomingMessage } from "http"; +import type { IncomingMessage } from "node:http"; import type { Session } from "next-auth"; import "./next-auth"; diff --git a/playwright.config.ts b/playwright.config.ts index 1326d04fdbe877..1c746826dcc0fd 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,8 +1,8 @@ import type { Frame, PlaywrightTestConfig } from "@playwright/test"; import { devices, expect } from "@playwright/test"; import dotEnv from "dotenv"; -import * as os from "os"; -import * as path from "path"; +import * as os from "node:os"; +import * as path from "node:path"; import { WEBAPP_URL } from "@calcom/lib/constants"; diff --git a/scripts/seed-app-store.ts b/scripts/seed-app-store.ts index a69c30fdcdf13a..9c84822bf1e71f 100644 --- a/scripts/seed-app-store.ts +++ b/scripts/seed-app-store.ts @@ -3,7 +3,7 @@ * This file is deprecated. The only use of this file is to seed the database for E2E tests. Each test should take care of seeding it's own data going forward. */ import dotEnv from "dotenv"; -import path from "path"; +import path from "node:path" import { appStoreMetadata } from "@calcom/app-store/appStoreMetaData"; import prisma from "@calcom/prisma"; diff --git a/scripts/seed-utils.ts b/scripts/seed-utils.ts index 97150269a85175..cff6d1b1263d64 100644 --- a/scripts/seed-utils.ts +++ b/scripts/seed-utils.ts @@ -1,5 +1,5 @@ import { faker } from "@faker-js/faker"; -import { randomUUID } from "crypto"; +import { randomUUID } from "node:crypto"; import { uuid } from "short-uuid"; import type z from "zod"; diff --git a/tests/libs/__mocks__/prisma.ts b/tests/libs/__mocks__/prisma.ts index 54385db05bf21d..6978f8af46c5d0 100644 --- a/tests/libs/__mocks__/prisma.ts +++ b/tests/libs/__mocks__/prisma.ts @@ -1,6 +1,6 @@ import { type DMMF } from "@prisma/client/runtime/client"; import { getDMMF } from "@prisma/internals"; -import { readFileSync } from "fs"; +import { readFileSync } from "node:fs"; import { beforeEach, vi } from "vitest"; import { createPrismock } from "prismock/build/main/lib/client"; @@ -84,7 +84,7 @@ vi.mock("@calcom/prisma", async (importOriginal) => { const PrismockClientClass = createPrismock( PrismaWithDMMF as unknown as typeof Prisma & { dmmf: DMMF.Document } ); - + prismockInstance = new PrismockClientClass(); if (!prismockInstance.$queryRaw) { diff --git a/vitest.config.mts b/vitest.config.mts index 95ce0532847f91..5442a0280f9b64 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -1,4 +1,4 @@ -import path from "path"; +import path from "node:path"; import react from "@vitejs/plugin-react"; import { defineConfig } from "vitest/config"; From e9fac51f99703cb6c504ea7c6c87d0e7e2bfd9ad Mon Sep 17 00:00:00 2001 From: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com> Date: Fri, 2 Jan 2026 19:17:12 +0530 Subject: [PATCH 2/5] feat(ci): skip API v2 breaking changes check when unrelated files change (#26393) --- .github/workflows/pr.yml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index d0df09ea1ad619..8ae140d254d50b 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -159,6 +159,7 @@ jobs: outputs: has-files-requiring-all-checks: ${{ steps.filter.outputs.has-files-requiring-all-checks }} has_companion: ${{ steps.filter.outputs.has_companion }} + has-api-v2-changes: ${{ steps.filter.outputs.has-api-v2-changes }} commit-sha: ${{ steps.get_sha.outputs.commit-sha }} run-e2e: ${{ steps.check-if-pr-has-label.outputs.run-e2e == 'true' }} db-cache-hit: ${{ steps.cache-db-check.outputs.cache-hit }} @@ -192,6 +193,16 @@ jobs: - '!i18n.lock' has_companion: - "companion/**" + has-api-v2-changes: + - "apps/api/v2/**" + - "packages/platform-constants/**" + - "packages/platform-enums/**" + - "packages/platform-utils/**" + - "packages/platform-types/**" + - "packages/platform-libraries/**" + - "packages/trpc/**" + - "packages/prisma/schema.prisma" + - "docs/api-reference/v2/**" - name: Get Latest Commit SHA id: get_sha run: | @@ -361,7 +372,7 @@ jobs: check-api-v2-breaking-changes: name: Check API v2 breaking changes needs: [prepare] - if: ${{ needs.prepare.outputs.run-e2e == 'true' && needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} + if: ${{ needs.prepare.outputs.run-e2e == 'true' && needs.prepare.outputs.has-api-v2-changes == 'true' }} uses: ./.github/workflows/check-api-v2-breaking-changes.yml secrets: inherit @@ -447,7 +458,7 @@ jobs: needs.type-check.result != 'success' || needs.unit-test.result != 'success' || needs.api-v2-unit-test.result != 'success' || - needs.check-api-v2-breaking-changes.result != 'success' || + (needs.prepare.outputs.has-api-v2-changes == 'true' && needs.check-api-v2-breaking-changes.result != 'success') || needs.build.result != 'success' || needs.build-api-v1.result != 'success' || needs.build-api-v2.result != 'success' || From 6a6b98388a87c6b5a9ea7257754407158fa9fb0e Mon Sep 17 00:00:00 2001 From: Ram Shukla Date: Fri, 2 Jan 2026 20:22:14 +0530 Subject: [PATCH 3/5] matched colour of icons across website (#26394) --- .../app/(use-page-wrapper)/insights/UpgradeTipWrapper.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/web/app/(use-page-wrapper)/insights/UpgradeTipWrapper.tsx b/apps/web/app/(use-page-wrapper)/insights/UpgradeTipWrapper.tsx index ab8d9dc1e0c8bf..e3d8ecd5493ae4 100644 --- a/apps/web/app/(use-page-wrapper)/insights/UpgradeTipWrapper.tsx +++ b/apps/web/app/(use-page-wrapper)/insights/UpgradeTipWrapper.tsx @@ -15,17 +15,17 @@ export default function UpgradeTipWrapper({ children }: { children: React.ReactN const session = useSession(); const features = [ { - icon: , + icon: , title: t("view_bookings_across"), description: t("view_bookings_across_description"), }, { - icon: , + icon: , title: t("identify_booking_trends"), description: t("identify_booking_trends_description"), }, { - icon: , + icon: , title: t("spot_popular_event_types"), description: t("spot_popular_event_types_description"), }, From 421936dc1433d77b1218c40956347ab75c6a4127 Mon Sep 17 00:00:00 2001 From: Pedro Castro Date: Fri, 2 Jan 2026 13:31:08 -0300 Subject: [PATCH 4/5] fix(auth): resolve session user by token subject ID (#26399) * fix(auth): align session user resolution with token subject * test(auth): add unit tests for getServerSession user resolution --- .../auth/__mocks__/getServerSession.mocks.ts | 157 ++++++++++++++++ .../auth/lib/getServerSession.test.ts | 169 ++++++++++++++++++ .../features/auth/lib/getServerSession.ts | 9 +- 3 files changed, 333 insertions(+), 2 deletions(-) create mode 100644 packages/features/auth/__mocks__/getServerSession.mocks.ts create mode 100644 packages/features/auth/lib/getServerSession.test.ts diff --git a/packages/features/auth/__mocks__/getServerSession.mocks.ts b/packages/features/auth/__mocks__/getServerSession.mocks.ts new file mode 100644 index 00000000000000..754cbeb88f53ec --- /dev/null +++ b/packages/features/auth/__mocks__/getServerSession.mocks.ts @@ -0,0 +1,157 @@ +import type { Mock } from "vitest"; +import { vi } from "vitest"; +import { mockDeep, mockReset, type DeepMockProxy } from "vitest-mock-extended"; + +import type { PrismaClient } from "@calcom/prisma"; +import type { User } from "@calcom/prisma/client"; + +// Types +type LoggerInstance = { + warn: Mock; + error: Mock; + debug: Mock; +}; + +type LoggerMock = { + default: { + getSubLogger: () => LoggerInstance; + }; +}; + +// JWT token structure used by NextAuth +interface MockToken { + sub: string; + email: string; + name: string; + exp: number; + belongsToActiveTeam: boolean; + org: null; + orgAwareUsername: string | null; + profileId: number | null; + upId: string; + impersonatedBy?: { id: number }; +} + +// Prisma mock instance +const prismaMock: DeepMockProxy = mockDeep(); + +function resetPrismaMock(): void { + mockReset(prismaMock); +} + +function createLoggerMock(): LoggerMock { + const loggerInstance: LoggerInstance = { + warn: vi.fn(), + error: vi.fn(), + debug: vi.fn(), + }; + return { + default: { + getSubLogger: (): LoggerInstance => loggerInstance, + }, + }; +} + +function createPrismaMock(): { default: DeepMockProxy } { + return { default: prismaMock }; +} + +function createLicenseKeyMock(): { + LicenseKeySingleton: { getInstance: Mock }; +} { + return { + LicenseKeySingleton: { + getInstance: vi.fn().mockResolvedValue({ + checkLicense: vi.fn().mockResolvedValue(false), + }), + }, + }; +} + +function createDeploymentRepositoryMock(): { + DeploymentRepository: new (_prisma: PrismaClient) => object; +} { + return { + DeploymentRepository: class MockDeploymentRepository {}, + }; +} + +function createUserRepositoryMock(): { + UserRepository: new (_prisma: PrismaClient) => { + enrichUserWithTheProfile: (params: { user: User }) => Promise; + }; +} { + return { + UserRepository: class MockUserRepository { + enrichUserWithTheProfile({ user }: { user: User }): Promise { + return Promise.resolve({ + ...user, + profile: null, + }); + } + }, + }; +} + +function createAvatarUrlMock(): { getUserAvatarUrl: Mock } { + return { + getUserAvatarUrl: vi.fn().mockReturnValue("https://example.com/avatar.png"), + }; +} + +function createSafeStringifyMock(): { safeStringify: Mock } { + return { + safeStringify: vi.fn().mockReturnValue("{}"), + }; +} + +function createGetTokenMock(): { getToken: Mock } { + return { getToken: vi.fn() }; +} + +// Creates a mock User with only the fields used by getServerSession +function createMockUser(overrides: Partial = {}): User { + return { + id: 5, + email: "user@example.com", + name: "Test User", + username: "testuser", + emailVerified: new Date(), + completedOnboarding: true, + role: "USER", + avatarUrl: null, + locale: "en", + ...overrides, + } as User; +} + +function createMockToken(overrides: Partial = {}): MockToken { + return { + sub: "5", + email: "user@example.com", + name: "Test User", + exp: Math.floor(Date.now() / 1000) + 3600, + belongsToActiveTeam: false, + org: null, + orgAwareUsername: null, + profileId: null, + upId: "usr-5", + ...overrides, + }; +} + +export type { MockToken }; +export { + prismaMock, + resetPrismaMock, + createLoggerMock, + createPrismaMock, + createLicenseKeyMock, + createDeploymentRepositoryMock, + createUserRepositoryMock, + createAvatarUrlMock, + createSafeStringifyMock, + createGetTokenMock, + createMockUser, + createMockToken, +}; diff --git a/packages/features/auth/lib/getServerSession.test.ts b/packages/features/auth/lib/getServerSession.test.ts new file mode 100644 index 00000000000000..8bc261a45bb5c0 --- /dev/null +++ b/packages/features/auth/lib/getServerSession.test.ts @@ -0,0 +1,169 @@ +import type { NextApiRequest } from "next"; +import type { RequestMethod } from "node-mocks-http"; +import { createMocks } from "node-mocks-http"; +import { describe, it, expect, vi, beforeEach } from "vitest"; + +// Use vi.hoisted to import mocks before vi.mock hoisting +const { + prismaMock, + resetPrismaMock, + createLoggerMock, + createPrismaMock, + createLicenseKeyMock, + createDeploymentRepositoryMock, + createUserRepositoryMock, + createAvatarUrlMock, + createSafeStringifyMock, + createGetTokenMock, + createMockUser, + createMockToken, +}: typeof import("../__mocks__/getServerSession.mocks") = await vi.hoisted( + async () => await import("../__mocks__/getServerSession.mocks") +); + +vi.mock("@calcom/lib/logger", createLoggerMock); +vi.mock("@calcom/prisma", createPrismaMock); +vi.mock("@calcom/ee/common/server/LicenseKeyService", createLicenseKeyMock); +vi.mock("@calcom/features/ee/deployment/repositories/DeploymentRepository", createDeploymentRepositoryMock); +vi.mock("@calcom/features/users/repositories/UserRepository", createUserRepositoryMock); +vi.mock("@calcom/lib/getAvatarUrl", createAvatarUrlMock); +vi.mock("@calcom/lib/safeStringify", createSafeStringifyMock); +vi.mock("next-auth/jwt", createGetTokenMock); + +import { getToken } from "next-auth/jwt"; +import { getServerSession } from "./getServerSession"; + +type MockNextApiRequest = ReturnType>["req"]; + +function createMockRequest(method: RequestMethod = "GET"): MockNextApiRequest { + const { req } = createMocks({ method }); + return req; +} + +function setupGetTokenMock(tokenData: object | null): void { + vi.mocked(getToken).mockResolvedValue(tokenData as Record | null); +} + +describe("getServerSession", () => { + beforeEach(() => { + vi.clearAllMocks(); + resetPrismaMock(); + }); + + describe("Token Validation", () => { + it.each([ + ["no token", null], + ["no email", { sub: "5" }], + ["no sub", { email: "user@example.com" }], + ])("returns null when token is invalid: %s", async (_, token) => { + setupGetTokenMock(token); + + const result = await getServerSession({ req: createMockRequest() }); + expect(result).toBeNull(); + }); + }); + + describe("User ID Validation", () => { + it.each(["", "invalid", "0", "-1"])( + "returns null when token.sub is invalid (%s)", + async (sub) => { + setupGetTokenMock(createMockToken({ sub })); + + const result = await getServerSession({ req: createMockRequest() }); + + expect(result).toBeNull(); + expect(prismaMock.user.findUnique).not.toHaveBeenCalled(); + } + ); + }); + + describe("User Lookup", () => { + it("looks up user by ID from token.sub", async () => { + const mockUser = createMockUser({ id: 123 }); + setupGetTokenMock(createMockToken({ sub: "123" })); + prismaMock.user.findUnique.mockResolvedValue(mockUser); + + await getServerSession({ req: createMockRequest() }); + + expect(prismaMock.user.findUnique).toHaveBeenCalledWith({ + where: { id: 123 }, + }); + }); + + it("returns null when user not found in database", async () => { + setupGetTokenMock(createMockToken({ sub: "999" })); + prismaMock.user.findUnique.mockResolvedValue(null); + + const result = await getServerSession({ req: createMockRequest() }); + expect(result).toBeNull(); + }); + + it("returns session with correct user data", async () => { + const mockUser = createMockUser(); + setupGetTokenMock(createMockToken()); + prismaMock.user.findUnique.mockResolvedValue(mockUser); + + const result = await getServerSession({ req: createMockRequest() }); + + expect(result).toMatchObject({ + user: { + id: mockUser.id, + email: mockUser.email, + }, + }); + }); + }); + + describe("User Resolution", () => { + it("resolves user by token subject ID", async () => { + const token = createMockToken({ + sub: "999", + email: "user@example.com", + }); + + setupGetTokenMock(token); + prismaMock.user.findUnique.mockResolvedValue(null); + + await getServerSession({ req: createMockRequest() }); + + expect(prismaMock.user.findUnique).toHaveBeenCalledWith({ + where: { id: 999 }, + }); + }); + + it("returns user data from database lookup", async () => { + const dbUser = createMockUser({ id: 999, email: "db-user@example.com" }); + const token = createMockToken({ + sub: "999", + email: "token-email@example.com", + }); + + setupGetTokenMock(token); + prismaMock.user.findUnique.mockResolvedValue(dbUser); + + const result = await getServerSession({ req: createMockRequest() }); + + expect(result).toMatchObject({ + user: { + id: 999, + email: "db-user@example.com", + }, + }); + }); + + it("uses ID field for database queries", async () => { + const mockUser = createMockUser(); + setupGetTokenMock(createMockToken()); + prismaMock.user.findUnique.mockResolvedValue(mockUser); + + await getServerSession({ req: createMockRequest() }); + + const calls = prismaMock.user.findUnique.mock.calls; + for (const call of calls) { + const whereClause = call[0]?.where as Record; + expect(whereClause).toHaveProperty("id"); + expect(whereClause).not.toHaveProperty("email"); + } + }); + }); +}); diff --git a/packages/features/auth/lib/getServerSession.ts b/packages/features/auth/lib/getServerSession.ts index 5dc14368eaf52e..1fab94ef1027f2 100644 --- a/packages/features/auth/lib/getServerSession.ts +++ b/packages/features/auth/lib/getServerSession.ts @@ -54,10 +54,15 @@ export async function getServerSession(options: { return cachedSession; } - const email = token.email.toLowerCase(); + const userId = token.sub ? Number(token.sub) : null; + + if (!userId || userId <= 0) { + log.warn("Invalid or missing user ID in token", { sub: token.sub }); + return null; + } const userFromDb = await prisma.user.findUnique({ - where: { email }, + where: { id: userId }, }); if (!userFromDb) { From 0099c72f53957a1b65163f8176eeb718ad3664f8 Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Fri, 2 Jan 2026 16:32:27 +0000 Subject: [PATCH 5/5] chore: release v6.0.7 --- apps/web/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/package.json b/apps/web/package.json index e1dec8cf8a6d40..b4203b4988814c 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@calcom/web", - "version": "6.0.6", + "version": "6.0.7", "private": true, "scripts": { "analyze": "ANALYZE=true next build",