From e6bd046e18550158ffff72ac5db4b2787c4a4f4e Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Mon, 3 Aug 2026 14:41:05 -0500 Subject: [PATCH 01/12] feat(clerk-js,localizations,shared,ui): Add support for promo codes at checkout --- .changeset/brown-guests-roll.md | 8 + .../src/core/modules/billing/namespace.ts | 14 ++ .../src/core/resources/BillingCheckout.ts | 42 ++++- packages/localizations/src/en-US.ts | 5 + packages/shared/src/types/billing.ts | 29 +++ packages/shared/src/types/localization.ts | 5 + .../src/components/Checkout/CheckoutForm.tsx | 147 ++++++++++++++- .../Checkout/__tests__/Checkout.test.tsx | 168 ++++++++++++++++++ .../Subscriptions/SubscriptionsList.tsx | 27 +-- packages/ui/src/elements/LineItems.tsx | 4 +- packages/ui/src/utils/billing.ts | 52 +++++- 11 files changed, 471 insertions(+), 30 deletions(-) create mode 100644 .changeset/brown-guests-roll.md diff --git a/.changeset/brown-guests-roll.md b/.changeset/brown-guests-roll.md new file mode 100644 index 00000000000..c0e1854f831 --- /dev/null +++ b/.changeset/brown-guests-roll.md @@ -0,0 +1,8 @@ +--- +'@clerk/localizations': minor +'@clerk/clerk-js': minor +'@clerk/shared': minor +'@clerk/ui': minor +--- + +Add support for applying promo codes at checkout diff --git a/packages/clerk-js/src/core/modules/billing/namespace.ts b/packages/clerk-js/src/core/modules/billing/namespace.ts index 99f06cd319c..cb6874463d5 100644 --- a/packages/clerk-js/src/core/modules/billing/namespace.ts +++ b/packages/clerk-js/src/core/modules/billing/namespace.ts @@ -21,6 +21,7 @@ import type { GetPlansParams, GetStatementsParams, GetSubscriptionParams, + UpdateCheckoutParams, } from '@clerk/shared/types'; import { convertPageToOffsetSearchParams } from '../../../utils/convertPageToOffsetSearchParams'; @@ -149,6 +150,19 @@ export class Billing implements BillingNamespace { return new BillingCheckout(json); }; + updateCheckout = async (params: UpdateCheckoutParams) => { + const { id, orgId, ...rest } = params; + const json = ( + await BaseResource._fetch({ + path: Billing.path(`/checkouts/${id}`, { orgId }), + method: 'PATCH', + body: rest as any, + }) + )?.response as unknown as BillingCheckoutJSON; + + return new BillingCheckout(json); + }; + getCreditBalance = async (params: GetCreditBalanceParams): Promise => { return await BaseResource._fetch({ path: Billing.path('/credits', { orgId: params.orgId }), diff --git a/packages/clerk-js/src/core/resources/BillingCheckout.ts b/packages/clerk-js/src/core/resources/BillingCheckout.ts index 19b9d8c5dc0..4e08ae2ef2c 100644 --- a/packages/clerk-js/src/core/resources/BillingCheckout.ts +++ b/packages/clerk-js/src/core/resources/BillingCheckout.ts @@ -14,6 +14,7 @@ import type { CheckoutSignalValue, ConfirmCheckoutParams, CreateCheckoutParams, + UpdateCheckoutParams, } from '@clerk/shared/types'; import { computed, endBatch, signal, startBatch } from 'alien-signals'; @@ -117,7 +118,7 @@ export const createSignals = () => { return { resourceSignal, errorSignal, fetchSignal, computedSignal }; }; -type CheckoutTask = 'start' | 'confirm' | 'finalize'; +type CheckoutTask = 'start' | 'update' | 'confirm' | 'finalize'; export class CheckoutFlow implements CheckoutFlowResourceNonStrict { private resource = new BillingCheckout(null); @@ -197,6 +198,24 @@ export class CheckoutFlow implements CheckoutFlowResourceNonStrict { }); } + async update(params: Pick): Promise<{ error: ClerkError | null }> { + if (!this.resource.id) { + throw new Error('Clerk: `start()` must be called before `update()`'); + } + return this.runAsyncCheckoutTask( + 'update', + async () => { + this.resource = (await BillingCheckout.clerk.billing?.updateCheckout({ + id: this.resource.id, + orgId: this.resource.payer.organizationId || undefined, + ...params, + })) as BillingCheckout; + }, + undefined, + false, + ); + } + async finalize(params?: CheckoutFlowFinalizeParams): Promise<{ error: ClerkError | null }> { const { navigate } = params || {}; return this.runAsyncCheckoutTask('finalize', async () => { @@ -208,13 +227,23 @@ export class CheckoutFlow implements CheckoutFlowResourceNonStrict { }); } - private runAsyncCheckoutTask(operationType: CheckoutTask, task: () => Promise, beforeTask?: () => void) { + private runAsyncCheckoutTask( + operationType: CheckoutTask, + task: () => Promise, + beforeTask?: () => void, + updateErrorSignal = true, + ) { // Noops during transitive state if (typeof BillingCheckout.clerk.user === 'undefined') { console.warn('Clerk: Checkout operations cannot be performed during transitive state'); return { error: null }; } - return createRunAsyncCheckoutTask(this, this.signals, this.pendingOperations)(operationType, task, beforeTask); + return createRunAsyncCheckoutTask(this, this.signals, this.pendingOperations)( + operationType, + task, + beforeTask, + updateErrorSignal, + ); } } @@ -226,8 +255,9 @@ function createRunAsyncCheckoutTask( operationType: CheckoutTask, task: () => Promise, beforeTask?: () => void, + updateErrorSignal?: boolean, ) => Promise<{ error: ClerkError | null }> { - return async (operationType, task, beforeTask?: () => void) => { + return async (operationType, task, beforeTask?: () => void, updateErrorSignal = true) => { if (pendingOperations.get(operationType)) { // Wait for the existing operation to complete and return its result // If it fails, all callers should receive the same error @@ -246,7 +276,9 @@ function createRunAsyncCheckoutTask( signals.resourceSignal({ resource: resource }); return { error: null }; } catch (err) { - signals.errorSignal({ error: err }); + if (updateErrorSignal) { + signals.errorSignal({ error: err }); + } return { error: err }; } finally { pendingOperations.delete(operationType); diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index 86d4c3ab782..90752fb3b7b 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -94,6 +94,11 @@ export const enUS: LocalizationResource = { cannotSubscribeUnrecoverable: 'You cannot subscribe to this plan. Your existing subscription is more expensive than this plan.', checkout: { + addPromoCode: 'Add promo code', + applyPromoCode: 'Apply', + discount: 'Discount', + promoCodePlaceholder: 'Enter promo code', + removePromoCode: 'Remove promo code', description__paymentSuccessful: 'Your payment was successful.', description__subscriptionSuccessful: 'Your new subscription is all set.', downgradeNotice: diff --git a/packages/shared/src/types/billing.ts b/packages/shared/src/types/billing.ts index 65615681856..5d90e45d24b 100644 --- a/packages/shared/src/types/billing.ts +++ b/packages/shared/src/types/billing.ts @@ -85,6 +85,14 @@ export interface BillingNamespace { */ startCheckout: (params: CreateCheckoutParams) => Promise; + /** + * Applies or removes a promo code on an existing Billing checkout for the current user or supplied Organization. + * @returns A [`BillingCheckoutResource`](/docs/reference/types/billing-checkout-resource) object. + * + * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes. + */ + updateCheckout: (params: UpdateCheckoutParams) => Promise; + /** * Gets the credit balance for the current payer. * @returns A [`BillingCreditBalanceResource`](https://clerk.com/docs/reference/types/billing-credit-balance-resource) object. @@ -1288,6 +1296,22 @@ export type CreateCheckoutParams = WithOptionalOrgType<{ priceId?: string; }>; +/** + * The `updateCheckout()` method accepts the following parameters. + * + * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes. + */ +export type UpdateCheckoutParams = WithOptionalOrgType<{ + /** + * The unique identifier for the checkout session. + */ + id: string; + /** + * The promo code to apply. Use an empty string to remove the applied promo code. + */ + promoCode: string; +}>; + /** * The `confirm()` method accepts the following parameters. **Only one of `paymentMethodId`, `paymentToken`, or `useTestCard` should be provided.** * @@ -1516,6 +1540,11 @@ export interface CheckoutFlowFinalizeParams { * Common methods available on all checkout flow instances. */ interface CheckoutFlowMethods { + /** + * Updates the current checkout. Use an empty promo code to remove the applied promo code. + */ + update: (params: Pick) => Promise<{ error: ClerkError | null }>; + /** * A function to confirm and finalize the checkout process, usually after payment information has been provided and validated. [Learn more.](#confirm) */ diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts index 2c073be283c..5f2a29de1c2 100644 --- a/packages/shared/src/types/localization.ts +++ b/packages/shared/src/types/localization.ts @@ -303,6 +303,11 @@ export type __internal_LocalizationResource = { }; }; checkout: { + addPromoCode: LocalizationValue; + applyPromoCode: LocalizationValue; + discount: LocalizationValue; + promoCodePlaceholder: LocalizationValue; + removePromoCode: LocalizationValue; title: LocalizationValue; title__paymentSuccessful: LocalizationValue; title__subscriptionSuccessful: LocalizationValue; diff --git a/packages/ui/src/components/Checkout/CheckoutForm.tsx b/packages/ui/src/components/Checkout/CheckoutForm.tsx index 00e23e79ff1..82039cc4ced 100644 --- a/packages/ui/src/components/Checkout/CheckoutForm.tsx +++ b/packages/ui/src/components/Checkout/CheckoutForm.tsx @@ -1,3 +1,4 @@ +import { isClerkAPIResponseError } from '@clerk/shared/error'; import { __experimental_useCheckout as useCheckout } from '@clerk/shared/react'; import type { BillingPaymentMethodResource, ConfirmCheckoutParams, RemoveFunctions } from '@clerk/shared/types'; import { useMemo, useState } from 'react'; @@ -10,7 +11,7 @@ import { LineItems } from '@/ui/elements/LineItems'; import { SegmentedControl } from '@/ui/elements/SegmentedControl'; import { Select, SelectButton, SelectOptionList } from '@/ui/elements/Select'; import { Tooltip } from '@/ui/elements/Tooltip'; -import { toNegativeAmount } from '@/ui/utils/billing'; +import { getDiscountDescription, toNegativeAmount } from '@/ui/utils/billing'; import { getCheckoutSeatUnitTotal, getIncludedSeatsUnitTotalTier, @@ -22,18 +23,21 @@ import { handleError } from '@/ui/utils/errorHandler'; import { DevOnly } from '../../common/DevOnly'; import { useCheckoutContext, usePaymentMethods } from '../../contexts'; import { + Badge, Box, Button, Col, descriptors, Flex, Form, + Icon, + Input, localizationKeys, Spinner, Text, useLocalizations, } from '../../customizables'; -import { ChevronUpDown, InformationCircle } from '../../icons'; +import { ChevronUpDown, Close, InformationCircle } from '../../icons'; import type { PropsOfComponent, ThemableCssProp } from '../../styledSystem'; import * as AddPaymentMethod from '../PaymentMethods/AddPaymentMethod'; import { PaymentMethodRow } from '../PaymentMethods/PaymentMethodRow'; @@ -45,6 +49,144 @@ const capitalize = (name: string) => name[0].toUpperCase() + name.slice(1); const HIDDEN_INPUT_NAME = 'payment_method_id'; +const promoCodeErrorMessage = (error: unknown) => { + if (isClerkAPIResponseError(error)) { + return error.errors[0]?.longMessage || error.errors[0]?.message; + } + return error instanceof Error ? error.message : undefined; +}; + +const PromoCodeRow = () => { + const { checkout } = useCheckout(); + const { $, t } = useLocalizations(); + const [isEditing, setIsEditing] = useState(false); + const [promoCode, setPromoCode] = useState(''); + const [error, setError] = useState(); + const [isLoading, setIsLoading] = useState(false); + + if (checkout.status !== 'needs_confirmation') { + return null; + } + + const discount = checkout.totals.discounts?.discount; + const appliedPromoCode = discount?.promoCode; + + const updatePromoCode = async (value: string) => { + setError(undefined); + setIsLoading(true); + const result = await checkout.update({ promoCode: value }); + setIsLoading(false); + + if (result.error) { + setError(promoCodeErrorMessage(result.error) || t(localizationKeys('unstable__errors.form_param_value_invalid'))); + return; + } + + setPromoCode(''); + setIsEditing(false); + }; + + if (discount && appliedPromoCode) { + return ( + + ({ gap: theme.space.$1 })}> + {appliedPromoCode} + + + } + /> + + + ); + } + + if (!isEditing) { + return ( + + + + - + } /> - + ); } if (!isEditing) { return ( - + - } - /> - - - ); + return { error, isLoading, setError, updatePromoCode }; +}; + +const AppliedPromoCodeRow = () => { + const { checkout } = useCheckout(); + const { $, t } = useLocalizations(); + const { isLoading, updatePromoCode } = useUpdatePromoCode(); + const discount = checkout.status === 'needs_confirmation' ? checkout.totals.discounts?.discount : undefined; + const appliedPromoCode = discount?.promoCode; + + if (!discount || !appliedPromoCode) { + return null; } - if (!isEditing) { - return ( - - - + return ( + + setIsEditing(true)} + colorScheme='neutral' + aria-label={t(localizationKeys('billing.checkout.removePromoCode'))} + isDisabled={isLoading} + onClick={() => void updatePromoCode('')} sx={{ padding: 0 }} - /> - - - ); + > + + + } + /> + + + ); +}; + +const PromoCodeInput = () => { + const { checkout } = useCheckout(); + const { t } = useLocalizations(); + const [promoCode, setPromoCode] = useState(''); + const { error, isLoading, setError, updatePromoCode } = useUpdatePromoCode(); + + if (checkout.status !== 'needs_confirmation' || checkout.totals.discounts?.discount) { + return null; } const errorId = 'checkout-promo-code-error'; return ( - + ({ + padding: theme.space.$4, + borderBottomWidth: theme.borderWidths.$normal, + borderBottomStyle: theme.borderStyles.$solid, + borderBottomColor: theme.colors.$borderAlpha100, + })} + > { event.preventDefault(); - void updatePromoCode(promoCode.trim()); + void updatePromoCode(promoCode.trim()).then(success => { + if (success) { + setPromoCode(''); + } + }); }} sx={theme => ({ display: 'grid', - gridColumn: '1 / -1', gridTemplateColumns: 'minmax(0, 1fr) auto', gap: theme.space.$2, })} @@ -189,7 +195,7 @@ const PromoCodeRow = () => { ) : null} - + ); }; @@ -287,7 +293,7 @@ export const CheckoutForm = withCardStateProvider(() => { /> )} - + {showProratedCredit && ( @@ -356,6 +362,8 @@ export const CheckoutForm = withCardStateProvider(() => { + + {showDowngradeInfo && ( { fixtures.clerk.billing.startCheckout.mockResolvedValue(checkout as any); fixtures.clerk.billing.updateCheckout.mockRejectedValue(new Error('Invalid promo code')); - const { getByRole, userEvent } = render( + const { baseElement, getByRole, userEvent } = render( {}} @@ -1721,8 +1721,9 @@ describe('Checkout', () => { { wrapper }, ); - await userEvent.click(await waitFor(() => getByRole('button', { name: 'Add promo code' }))); - const input = getByRole('textbox', { name: 'Enter promo code' }); + const input = await waitFor(() => getByRole('textbox', { name: 'Enter promo code' })); + const lineItemsRoot = baseElement.querySelector('.cl-checkoutFormLineItemsRoot'); + expect(lineItemsRoot?.nextElementSibling).toContainElement(input); await userEvent.type(input, 'INVALID'); await userEvent.click(getByRole('button', { name: 'Apply' })); @@ -1775,7 +1776,7 @@ describe('Checkout', () => { .mockResolvedValueOnce(appliedCheckout as any) .mockResolvedValueOnce(checkout as any); - const { getByRole, getByText, queryByText, userEvent } = render( + const { getByRole, getByText, queryByRole, queryByText, userEvent } = render( {}} @@ -1788,8 +1789,7 @@ describe('Checkout', () => { { wrapper }, ); - await userEvent.click(await waitFor(() => getByRole('button', { name: 'Add promo code' }))); - await userEvent.type(getByRole('textbox', { name: 'Enter promo code' }), 'WELCOME20'); + await userEvent.type(await waitFor(() => getByRole('textbox', { name: 'Enter promo code' })), 'WELCOME20'); await userEvent.click(getByRole('button', { name: 'Apply' })); await waitFor(() => { @@ -1800,6 +1800,7 @@ describe('Checkout', () => { expect(getByText('Prorated discount').closest('.cl-lineItemsGroup')?.nextElementSibling).toBe( getByText('WELCOME20').closest('.cl-lineItemsGroup'), ); + expect(queryByRole('textbox', { name: 'Enter promo code' })).toBeNull(); }); await userEvent.click(getByRole('button', { name: 'Remove promo code' })); @@ -1809,6 +1810,7 @@ describe('Checkout', () => { expect.objectContaining({ id: 'chk_promo', promoCode: '' }), ); expect(queryByText('WELCOME20')).toBeNull(); + expect(getByRole('textbox', { name: 'Enter promo code' })).toBeVisible(); }); }); }); From 7025b2f8ef2aeb1878b16aa6cb81be52d5dc06f6 Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Wed, 5 Aug 2026 10:39:17 -0500 Subject: [PATCH 09/12] rm parentheses --- packages/localizations/src/en-US.ts | 4 ++-- .../Checkout/__tests__/Checkout.test.tsx | 2 +- .../Subscriptions/SubscriptionsList.tsx | 4 ++-- .../__tests__/SubscriptionsList.test.tsx | 15 +++++++++++++++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index 1c83be8ff33..3c558fba21a 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -126,9 +126,9 @@ export const enUS: LocalizationResource = { credit: 'Credit', creditRemainder: 'Credit for the remainder of your current subscription.', defaultFreePlanActive: "You're currently on the Free plan", - discountAmount: '({{amount}} off)', + discountAmount: '{{amount}} off', discountCyclesRemaining: '{{cycles}} {{period}} remaining', - discountDuration: '({{amount}} off first {{cycles}} {{period}})', + discountDuration: '{{amount}} off first {{cycles}} {{period}}', free: 'Free', getStarted: 'Get started', highlightedPlanBadge: 'Popular', diff --git a/packages/ui/src/components/Checkout/__tests__/Checkout.test.tsx b/packages/ui/src/components/Checkout/__tests__/Checkout.test.tsx index b1382d379ac..0ae0d71065c 100644 --- a/packages/ui/src/components/Checkout/__tests__/Checkout.test.tsx +++ b/packages/ui/src/components/Checkout/__tests__/Checkout.test.tsx @@ -1794,7 +1794,7 @@ describe('Checkout', () => { await waitFor(() => { expect(getByText('WELCOME20')).toBeVisible(); - expect(getByText('(20% off first 1 month)')).toBeVisible(); + expect(getByText('20% off first 1 month')).toBeVisible(); expect(getByText('-$25.98')).toBeVisible(); expect(queryByText('-$50.00')).toBeNull(); expect(getByText('Prorated discount').closest('.cl-lineItemsGroup')?.nextElementSibling).toBe( diff --git a/packages/ui/src/components/Subscriptions/SubscriptionsList.tsx b/packages/ui/src/components/Subscriptions/SubscriptionsList.tsx index dc3fa167b25..b73a026b625 100644 --- a/packages/ui/src/components/Subscriptions/SubscriptionsList.tsx +++ b/packages/ui/src/components/Subscriptions/SubscriptionsList.tsx @@ -257,12 +257,12 @@ function SubscriptionDiscountRow({ subscriptionItem }: { subscriptionItem: Billi const totalCycles = appliedDiscount.cyclesRemaining === null ? null : appliedDiscount.cyclesApplied + appliedDiscount.cyclesRemaining; - const discountTitle = `${appliedDiscount.name} ${getDiscountDescription( + const discountTitle = `${appliedDiscount.name} (${getDiscountDescription( appliedDiscount, totalCycles, subscriptionItem.planPeriod, { $, t }, - )}`; + )})`; return ( { status: 'active' as const, isFreeTrial: false, pastDueAt: null, + appliedDiscount: { + id: 'redemption_active', + subscriptionItemId: 'sub_active', + discountId: 'discount_active', + name: 'Summer sale', + source: 'promo_code' as const, + effect: 'percentage' as const, + percentOff: 20, + cyclesRemaining: 2, + cyclesApplied: 1, + status: 'active' as const, + redeemedAt: new Date('2021-01-01'), + redeemedBy: null, + }, cancel: vi.fn(), pathRoot: '', reload: vi.fn(), @@ -327,6 +341,7 @@ describe('SubscriptionsList', () => { expect(getByText('Pro Plan')).toBeVisible(); // Active subscription should show the Active badge expect(queryByText(/^Active$/)).toBeNull(); + expect(getByText('Summer sale (20% off first 3 months)')).toBeVisible(); }); }); From ad3fd8c4adcb505ecdefc2b61531c0c946799fa8 Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Wed, 5 Aug 2026 10:49:33 -0500 Subject: [PATCH 10/12] made promocode always last row --- packages/ui/src/components/Checkout/CheckoutForm.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/components/Checkout/CheckoutForm.tsx b/packages/ui/src/components/Checkout/CheckoutForm.tsx index 37f012342bf..7bbddb0551a 100644 --- a/packages/ui/src/components/Checkout/CheckoutForm.tsx +++ b/packages/ui/src/components/Checkout/CheckoutForm.tsx @@ -293,7 +293,6 @@ export const CheckoutForm = withCardStateProvider(() => { /> )} - {showProratedCredit && ( @@ -327,6 +326,8 @@ export const CheckoutForm = withCardStateProvider(() => { )} + + {!!freeTrialEndsAt && !!plan.freeTrialDays && totals.totalDueAfterFreeTrial ? ( Date: Wed, 5 Aug 2026 11:34:14 -0500 Subject: [PATCH 11/12] increase tap target --- packages/ui/src/components/Checkout/CheckoutForm.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/components/Checkout/CheckoutForm.tsx b/packages/ui/src/components/Checkout/CheckoutForm.tsx index 7bbddb0551a..6c6c708383e 100644 --- a/packages/ui/src/components/Checkout/CheckoutForm.tsx +++ b/packages/ui/src/components/Checkout/CheckoutForm.tsx @@ -109,7 +109,15 @@ const AppliedPromoCodeRow = () => { aria-label={t(localizationKeys('billing.checkout.removePromoCode'))} isDisabled={isLoading} onClick={() => void updatePromoCode('')} - sx={{ padding: 0 }} + sx={{ + padding: 0, + position: 'relative', + '&::after': { + content: '""', + position: 'absolute', + inset: '-18px', + }, + }} > Date: Wed, 5 Aug 2026 12:01:40 -0500 Subject: [PATCH 12/12] chore(clerk-js): bump bundlewatch --- packages/clerk-js/bundlewatch.config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json index a9bf078f735..018bebef844 100644 --- a/packages/clerk-js/bundlewatch.config.json +++ b/packages/clerk-js/bundlewatch.config.json @@ -1,8 +1,8 @@ { "files": [ { "path": "./dist/clerk.js", "maxSize": "549KB" }, - { "path": "./dist/clerk.browser.js", "maxSize": "75KB" }, - { "path": "./dist/clerk.legacy.browser.js", "maxSize": "117KB" }, + { "path": "./dist/clerk.browser.js", "maxSize": "77KB" }, + { "path": "./dist/clerk.legacy.browser.js", "maxSize": "119KB" }, { "path": "./dist/clerk.no-rhc.js", "maxSize": "316KB" }, { "path": "./dist/clerk.native.js", "maxSize": "76KB" }, { "path": "./dist/vendors*.js", "maxSize": "7KB" },