16499 Commits
Author SHA1 Message Date
Robert Harrison 54343aa685 fix: restore @ts-expect-error for CacheProvider type mismatch (#30171)
Create PR containing updated CHANGELOG.md and release packages to NPM once PR is merged / Release (push) Canceled after 0s
Run i18n AI automation / Run i18n (push) Canceled after 0s
Next.js Bundle Analysis / analyze (push) Canceled after 0s
* fix: restore @ts-expect-error for CacheProvider type mismatch

PR #30140 removed these comments assuming they were stale now that
the repo is on TypeScript 5. The comments were about the compiler
version, but the actual incompatibility is between react-inlinesvg/provider's
CacheProvider (typed to return a bare ReactNode) and this repo's pinned
@types/react@18.0.26, which requires JSX components to return Element | null.
ReactNode includes undefined, so the JSX usage fails type-checking.

Verified yarn build completes successfully with this restored.

Fixes #30170

* docs: explain the actual @ts-expect-error compatibility condition

Per @coderabbitai review on #30171: the old wording ("remove when
upgrading typescript to v5") was itself stale/misleading, since the
incompatibility is with the pinned @types/react version, not the
TypeScript compiler version. Documents the real condition instead.
2026-09-20 13:47:32 +05:30
陈志谦andSahitya Chandra c339c9c479 fix: remove duplicated words in three user-visible strings (#30190)
'the the event type' (slots API property description), 'for for new
booking' (EventManager debug log), and 'one-one one template'
(en locale).

Co-authored-by: Sahitya Chandra <sahityajb@gmail.com>
2026-09-20 07:25:27 +00:00
6bc4529822 fix(embed-core): guard iframe ready handler (#30135)
Co-authored-by: Bandhan Majumder <bandhanmajumder16@gmail.com>
Co-authored-by: Bandhan Majumder <133476557+bandhan-majumder@users.noreply.github.com>
2026-09-14 08:35:09 +00:00
b0a34f21c9 feat(i18n): add Indonesian locale (#30134)
Co-authored-by: khidhir-ziyan <khdihirziyan@gmail.com>
Co-authored-by: Bandhan Majumder <133476557+bandhan-majumder@users.noreply.github.com>
2026-09-12 06:43:18 +00:00
Leobert Camoro 39c96bc04d chore: remove stale @ts-expect-error from CacheProvider usage (#30140) 2026-09-11 22:25:48 +00:00
Paul Albrecht 569a389e84 fix(dynamic-booking): respect username order when picking the conferencing app (#30124)
The first member of a dynamic group decides which conferencing app the group
booking uses. getPublicEvent read users[0] straight from findUsersByUsername,
which does not guarantee the order given in the URL, so /alice+bob could end up
using bob's preference — or fall back to Cal Video when only alice has one set.

handleNewBooking already sorts by the dynamic user list for this exact reason
(sortUsersByDynamicList in getLocationValuesForDb.ts). Applying the same order
here keeps the advertised location and the booked location in sync.
2026-09-09 19:27:34 +00:00
Rohan Unbeg b3321936c3 fix(ui): resolve React 19 ref deprecation warning in Tooltip (#30110) (#30111)
* fix(ui): resolve React 19 ref deprecation warning in Tooltip (#30110)

* fix(ui): preserve numeric tooltip content in Tooltip component guard
2026-09-09 13:55:29 +05:30
falefalefale 1251ba5be5 fix(i18n/pl): booking_submitted_subject said 'confirmed' instead of 'submitted' (#30107) 2026-09-07 20:35:45 +00:00
JackAnsh23 e91bb0c382 fix(api): specify default false for CalVideoSettings boolean fields (#30088) 2026-09-06 14:03:49 +05:30
Sagar Kewat 9d6c5756dd fix(trpc): execute tempOrgRedirect rewrite on tx inside updateUser transaction (#30085) (#30096) 2026-09-06 11:36:20 +05:30
shafi-VM abffde336e fix(paypal): don't scale zero-decimal currency amounts on order creation (#29984)
PayPal order creation divided every amount by 100 before sending it,
regardless of currency. JPY has no minor unit, so `convertToSmallestCurrencyUnit`
stores it unscaled and dividing corrupted it: a JPY 10000 event asked PayPal
to collect 100.

Use the same zero-decimal-aware conversion that the price input and
`formatPrice` already use, so the amount charged matches the amount stored
and displayed. Currencies with minor units are unaffected — among PayPal's
supported currencies only JPY is both zero-decimal and supported, and the
added tests pin USD, EUR, HUF and TWD to their existing behaviour.
2026-09-04 15:40:06 +05:30
shafi-VM b879a54250 fix(hitpay): respect zero-decimal currencies when charging and storing (#30039)
HitPay's payment-requests API takes `amount` as a decimal string in major
units, so the integration divided by 100 on the way out and multiplied by 100
on the way back in. Both conversions were unconditional, but the price input
writes the amount through `convertToSmallestCurrencyUnit`, which stores
zero-decimal currencies unscaled.

For the three zero-decimal currencies HitPay offers — JPY, KRW and VND — a
¥10,000 event therefore asked HitPay to collect ¥100. The two unconditional
conversions cancelled out in the database, so the Payment row and the booker's
page both still showed ¥10,000 while only 1% was charged, and `refund()` is
not implemented for this app.

Route both directions through the shared helpers so the amount charged matches
the amount stored and displayed. Currencies with a minor unit are unaffected;
the added tests pin USD and SGD to their existing behaviour.
2026-09-04 15:39:40 +05:30
Ankita Patil e70486cd9b fix(i18n): add missing Japanese translations (#29970)
* fix: improve Japanese availability localization

* fix(i18n): add missing Japanese translations

* fix(i18n): address Japanese localization review

* fix(i18n): unify availability terminology
2026-09-01 14:01:18 +00:00
Rohan Singh c910911772 bug fix: remove unused TokenHandler component (#30084) 2026-09-01 19:27:11 +05:30
Anirban Singha 176037d0af fix(emails): customReplyToEmail no longer dropped when hideOrganizerEmail is true (#29940)
* fix: respect customReplyToEmail when hideOrganizerEmail is enabled

* test: get custom reply to in headers
2026-08-08 17:13:42 +00:00
AYUSHKUMAR_21JE0209andBandhan Majumder b2c28a23ab fix: language update functionality #29900 (#29901)
* removed bug of language update work properly

* feat: implement general settings view and user form components for profile configuration

---------

Co-authored-by: Bandhan Majumder <133476557+bandhan-majumder@users.noreply.github.com>
2026-08-05 06:31:10 +00:00
Gaurav Kumar 5e3fe3cbe6 fix(bookings): provide stable country fallback for phone input (#29740)
* fix(bookings): provide stable country fallback for phone input

* chore(bookings): add explanatory comment for phone input country fallback
2026-08-05 06:29:34 +00:00
cognicoresandClaude Opus 4.8 8418db70c7 feat: add Clara app (link-as-an-app, AI & Automation) (#29819)
* Add Clara app (link-as-an-app, AI & Automation)

Clara is a website conversion agent: it answers website visitors in text and
voice and books meetings into their Cal.com. This is a link-as-an-app listing
(same pattern as the existing Chatbase app) — it opens a setup guide at
claraconverts.com/guide/cal-com; nothing installs into the user's account.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Point Clara listing CTA to the Cal.com setup guide

Addresses CodeRabbit review: the "Get started" link in DESCRIPTION.md pointed
to the homepage; point it to claraconverts.com/guide/cal-com so the CTA leads
straight to Cal.com onboarding (matching the app's externalLink).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-04 15:53:55 +00:00
Pranjul Chaurasiya 038381aeca fix: trim whitespace in parseIpFromHeaders to prevent IP banlist bypass (#29857)
* fix: trim whitespace in parseIpFromHeaders to prevent IP banlist bypass

Fixes #29851

parseIpFromHeaders did not trim whitespace after splitting on comma
(or from array elements), so a padded x-forwarded-for header like
' 1.2.3.4 , 5.6.7.8' would fail an exact-match lookup against
IP_BANLIST, allowing a banned IP to bypass the check.

Added regression tests covering padded string, array, and an
end-to-end isIpInBanlist test reproducing the reported bypass.

* fix: address CodeRabbit review feedback

- Guard against undefined rawIp when parsing an empty header array
- Delete IP_BANLIST env var in test cleanup instead of assigning undefined
- Add regression test for empty array input to parseIpFromHeaders

* test: add regression test for tab/whitespace trimming in parseIpFromHeaders
2026-07-31 20:49:53 +00:00
Anirban Singha ab0b9e1fb5 chore(booker): remove obsolete eslint-disable in useInitialFormValues (#29865) 2026-07-31 20:46:33 +00:00
EMRAN 3894f37e14 fix(i18n): add missing space before Hebrew duration abbreviation (#29694) (#29773)
The Hebrew locale was missing a space between the number and the minute/hour
short form abbreviation (e.g. "15ד׳" instead of "15 ד׳"). This caused
screen readers to pronounce the duration incorrectly ("15 metres") and
made the booking page duration text difficult to read.

Also fixes the same issue for hour_one_short.
2026-07-22 17:30:42 +05:30
Anirban Singha f004349273 refactor: rename getEventLocationType to getLocationByType for better clarity (#28567)
* chore: rename getEventLocationType

* chore: update imports
2026-07-09 09:22:35 +00:00
shafi-VM 761b780aa2 fix(bookings): refund all seat payments when cancelling a paid seated… (#29685)
* fix(bookings): refund all seat payments when cancelling a paid seated booking

A paid seated booking creates one Payment row per seat on the same bookingId (each seat's payment_intent.succeeded webhook flips only its own payment via handlePaymentSuccess). processPaymentRefund only refunded payment.find((p) => p.success) — the first successful payment — so fully cancelling a multi-seat paid booking with an auto-refund policy refunded a single seat and left the other attendees charged with no error surfaced.

Refund every successful, not-yet-refunded payment instead.

Tests: unit regression in processPaymentRefund.test.ts (all payments refunded, verified red before the fix); integration test in handleCancelBooking.test.ts proving a full cancel of a seated multi-payment booking hands all payments to the refund path.

* fix(bookings): make seat refunds resilient and drop dayjs in test

Address CodeRabbit review on #29685:

- processPaymentRefund now attempts every seat's refund independently and throws an aggregate error, so one provider failure no longer skips the remaining seats.
- Add a regression test for that resilience, and use native Date instead of dayjs for fixed-offset test timestamps.
2026-07-09 14:23:03 +05:30
okxint 009f91d163 fix(CalEventParser): skip null/undefined values in getUserFieldsResponses (#29703)
When a booking question is optional and left unanswered, the field value
stored in customInputs can be null. The previous guard only checked
for empty strings, so null (and undefined) would coerce to the literal
strings "null"/"undefined" inside the template literal, polluting calendar
event descriptions.

Fixes #29688
2026-07-08 18:01:41 +00:00
SreeCharan Desu bb7c87cae1 fix(notifications): use instance URL in push test notification (#29673)
Fixes #29567

The test push on subscribe hardcoded app.cal.com. Use WEBAPP_URL instead,
wrap JSON.parse in try/catch, and localize the title/body.
2026-07-08 17:53:34 +00:00
ShreyasandKartik 0968bcef01 fix(calendar): sync Cal.diy iCalUID events (#29580)
Co-authored-by: Kartik <103111467+kartik-212004@users.noreply.github.com>
2026-07-07 21:53:03 +05:30
Anirban Singha ca90ca2c94 refactor(app-store): move credential query to repository pattern (#29724)
* refactor(app-store): move credential query to repository pattern

* chore: removed unused imports
2026-07-06 08:40:17 +00:00
Alana Anjos f3284f581f docs: add windows/powershell setup troubleshooting for prisma (#29707)
Adds a note explaining how to manually push schema using PowerShell when Turbo fails to pass environment variables down to the prisma workspace.
2026-07-06 08:29:29 +00:00
Gaurav Kumar 188aaa1857 fix(emails): send METHOD:CANCEL in ICS for cancelled bookings (#29708)
Fixes an issue where cancellation emails were sending ICS files with
METHOD:REQUEST instead of METHOD:CANCEL. As per RFC 5546, calendar
clients only process cancellations correctly when METHOD:CANCEL is used,
otherwise cancelled events remain in attendee calendars with active
reminders.

- Use METHOD:CANCEL for cancelled booking ICS files
- Keep METHOD:REQUEST for non-cancelled booking invitations
- Preserve STATUS:CANCELLED and sequence handling
- Add tests to verify the generated ICS method for cancellations
2026-07-05 10:23:53 +00:00
Gaurav Kumar 032962f577 fix(ui): render markdown headings properly in event descriptions (#29648)
* fix(ui): render markdown headings properly in event descriptions

* fix(ui): Add noopener and noreferrer to external links in markdownToSafeHTML

* fix(ui): revert external link changes in markdownToSafeHTML

* fix(ui): update markdown heading styles
2026-07-03 11:52:08 +05:30
Gaurav Kumar 8f89c082e8 fix(i18n): add missing space between number and unit in Hebrew duration (#29695) 2026-07-03 06:21:43 +00:00
Chayan DasandBandhan Majumder 53e32a5bba fix: return 404 when booking does not exist (#29583)
Signed-off-by: Chayan Das <daschayan8837@gmail.com>
Co-authored-by: Bandhan Majumder <133476557+bandhan-majumder@users.noreply.github.com>
2026-07-01 01:26:48 +05:30
Anirban Singha 5d6d4d30cc refactor: app category metadata to use Record<AppCategories, AppCategoryEntry> for exhaustive type safety (#29558)
* refactor: derive category metadata from single Record source of truth

* test: add test for category order and entries sync

* fix: check for duplicates
2026-06-29 20:25:39 +05:30
Bandhan Majumder b97cd6203d fix: security audit (#29657) 2026-06-27 02:01:09 +05:30
Jimmy He 62317bd4e1 fix: pass bookingFields and locale to handlePayment in createNewSeat (#29639) 2026-06-25 04:21:38 +00:00
Anirban Singha 051ae77279 chore: remove obsolete ts comment (#29638) 2026-06-24 22:30:25 +00:00
Anirban SinghaandBandhan Majumder 0d164da8dd fix: implement missing password validation (#27634)
* fix: validate password presence and requirements

* chore: add error code for invalid passwords

* chore: avoid trimming password

* chore: add test for password validation

* fix: update password to delete user

* fix: create user password following protocol

* test: simplify deleteMeHandler password validation tests

* fix: address coderabbit

* fix: modify login params for failing tests

* fix: failing e2e tests

---------

Co-authored-by: Bandhan Majumder <133476557+bandhan-majumder@users.noreply.github.com>
2026-06-22 10:37:09 +05:30
idolevittandClaude Sonnet 4.6 a46d5f8dd4 docs(claude): add path-scoped frontmatter to four agent rules (#29612)
Adds `paths:` YAML frontmatter so each rule only loads into Claude Code
context when the agent is working on relevant files, keeping context lean
in a large monorepo.

- architecture-page-level-auth: fires on page.tsx and layout.tsx
- data-prisma-migrations: fires on packages/prisma/**
- testing-playwright: fires on playwright dirs, *.e2e.ts, and api e2e dirs
- api-thin-controllers: fires on *.controller.ts files only

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-21 11:21:14 +00:00
yadavlokesh1 c0b13fb120 docs: remove dead Discussions links (#29617)
remove dead Discussions links
2026-06-21 16:50:46 +05:30
Chayan DasandBandhan Majumder 7469444aea fix: align confirmation dialog header and footer (#29588)
Signed-off-by: Chayan Das <daschayan8837@gmail.com>
Co-authored-by: Bandhan Majumder <133476557+bandhan-majumder@users.noreply.github.com>
2026-06-19 12:11:40 +05:30
Yash SinghandBandhan Majumder 1599dfd515 fix: zero-pad username suggestion suffix consistently (#29571)
generateUsernameSuggestion built its numeric suffix with
String(rand).padStart(4 - rand.toString().length, "0"). padStart's first
argument is the target total length, not the number of pad characters, so the
expression only padded single-digit numbers: rand=1 became "001" but rand=42
became "42" and rand=999 stayed "999". Suggested usernames therefore had
inconsistent suffix widths, and the magic 4 didn't match the 3-wide output the
existing test pins ("johnny001").

Pull the suffix into a small helper that always pads to 3 digits, so collisions
and the returned value share one definition and every suggestion is uniformly
zero-padded. Add unit tests for the first-attempt path and for two- and
three-digit suffixes; the two-digit case fails on the old code.

Co-authored-by: Bandhan Majumder <133476557+bandhan-majumder@users.noreply.github.com>
2026-06-19 05:37:42 +00:00
ebf696a991 fix: remove console.log and improve type safety in tRPC routers (#29529)
- Remove two console.log statements dumping private hashed link data
  in update.handler.ts (fixes production data leakage)
- Replace console.log(e) with structured logger.error in
  getScheduleByEventTypeSlug.handler.ts
- Fix @ts-expect-error by typing reduce accumulator as
  Record<string, unknown> in update.handler.ts
- Narrow Prisma include to select in duplicate.handler.ts:
  team and webhooks now fetch only required fields

Fixes #29500

Co-authored-by: lucadapice <dapice.lc@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Bandhan Majumder <133476557+bandhan-majumder@users.noreply.github.com>
2026-06-19 10:53:23 +05:30
Chayan Das 4e529cbad1 fix: user table to load on scroll (#29593)
* fix: load more users on table scroll

Signed-off-by: Chayan Das <daschayan8837@gmail.com>

* refactor: move user listing logic to UserRepository

Add a dedicated listUsers method with search and cursor pagination support.

Add repository tests covering filtering and pagination.

Ensure user listing metadata remains consistent with the returned results.

Signed-off-by: Chayan Das <daschayan8837@gmail.com>

---------

Signed-off-by: Chayan Das <daschayan8837@gmail.com>
2026-06-18 18:09:12 +00:00
Bryan Varela 561cf889ab fix(daily-webhook): use BookingRepository instead of direct prisma call (#29541) 2026-06-16 12:34:18 +00:00
Bandhan Majumder 70a883b191 fix(ci): retry workflow cancellation on 409 conflicts (#29584) 2026-06-16 17:46:01 +05:30
Anirban SinghaandBandhan Majumder dcd0da831f refactor: use userRepository class methods for signup handlers (#29561)
* refactor: use userRepository class methods for signup handlers

* feat: add user repo modules for DI

* feat: build user repo container

* test: integration test for user repository

* fix: use DI container in selfhosted

* refactor: tests, module, container and handlers

---------

Co-authored-by: Bandhan Majumder <bandhanmajumder16@gmail.com>
2026-06-14 16:11:21 +00:00
Jörg RömhildandClaude Sonnet 4.6 642c38582e fix: correct CLAUDE.md symlink casing to AGENTS.md (#29556)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 07:05:48 +00:00
Chayan Das 9104545a18 fix(frontend): improve password update form UX and add translation (#29544)
- disable update button until form is valid
- add required field validation
- add translation key for password complexity message

Signed-off-by: Chayan Das <daschayan8837@gmail.com>
2026-06-12 20:12:36 +00:00
H PandBandhan Majumder ca03f007df fix: getUserVerifiedPhoneNumber calls phone lookup instead of email (#29458)
getUserVerifiedPhoneNumber incorrectly called getUserVerifiedEmail
on the repository, causing verified phone numbers to never be found.

Fixes #29450

Co-authored-by: Bandhan Majumder <133476557+bandhan-majumder@users.noreply.github.com>
2026-06-12 13:26:28 +05:30
Chayan DasandBandhan Majumder 4026669e68 fix(api): return 401 instead of 409 for unauthenticated /api/me requests (#29538)
* api: me: fix return 401 instead of 409 for unauthorized requests in the me API route

Signed-off-by: Chayan Das <daschayan8837@gmail.com>

* undo import changes

Reorder imports for better organization.

---------

Signed-off-by: Chayan Das <daschayan8837@gmail.com>
Co-authored-by: Bandhan Majumder <133476557+bandhan-majumder@users.noreply.github.com>
2026-06-11 03:56:55 +00:00