* fix: Convert BillingPlan enum to const object to prevent webpack tree-shaking TypeScript enums compile to IIFEs which can be incorrectly tree-shaken by webpack when 'sideEffects: false' is set in package.json. Converting to a const object with 'as const' avoids the IIFE pattern while maintaining full type safety. This fixes the 'TRPCError: BillingPlan is not defined' error that occurred in the hasTeamPlan tRPC handler. Follows the existing CHECKOUT_SESSION_TYPES pattern in the same file. Co-Authored-By: alex@cal.com <me@alexvanandel.com> * fix: Re-export BillingPlan from billing-plans to prevent tree-shaking The issue was a module initialization order problem. When BillingPlan was imported from constants.ts into billing-plans.ts and used inside the BillingPlanService class, webpack's tree-shaker (with sideEffects: false) couldn't properly track the value dependency across the package boundary. By re-exporting BillingPlan from the same module that exports BillingPlanService, we ensure the constant is bundled together with the class that uses it, preventing tree-shaking. Co-Authored-By: alex@cal.com <me@alexvanandel.com> * revert: Restore BillingPlan enum format in constants.ts The const object conversion didn't fix the tree-shaking issue. The real fix is re-exporting BillingPlan from billing-plans.ts to ensure it's part of the same module as BillingPlanService. Co-Authored-By: alex@cal.com <me@alexvanandel.com> * fix: Add BillingPlan as private static member to prevent tree-shaking By making BillingPlan a private static member of BillingPlanService, webpack now sees it as part of the class definition rather than just used inside methods. This creates a strong reference that prevents webpack's tree-shaker from removing the enum initialization IIFE when 'sideEffects: false' is set. With the previous approach where BillingPlan was only imported and used inside methods, webpack's static analysis couldn't properly track the enum usage across package boundaries (@calcom/features -> @calcom/trpc), causing it to incorrectly determine the enum initialization was unused code. Fixes the TRPCError: BillingPlan is not defined runtime error. Thread: https://calendso.slack.com/archives/C08LT9BLEET/p1759420015428149 Co-Authored-By: alex@cal.com <me@alexvanandel.com> * fix: Clean up BillingPlan references and add explanatory comment - Remove unnecessary re-export statement - Use direct BillingPlan references instead of BillingPlanService.BillingPlan - Add detailed comment explaining webpack tree-shaking workaround - Keep import from constants.ts and private static member for webpack reference Co-Authored-By: alex@cal.com <me@alexvanandel.com> * fix: Remove Slack reference from comment and restore static usage - Remove Slack URL from explanatory comment - Restore BillingPlanService.BillingPlan usage throughout class methods - This static member usage is essential for webpack to track the enum reference Co-Authored-By: alex@cal.com <me@alexvanandel.com> * Fix BillingPlan issue by finding root cause --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
35 lines
1.2 KiB
TypeScript
35 lines
1.2 KiB
TypeScript
/**
|
|
* Stripe checkout session metadata types
|
|
* Used to identify the type of subscription/purchase in webhook handlers
|
|
*/
|
|
export const CHECKOUT_SESSION_TYPES = {
|
|
PHONE_NUMBER_SUBSCRIPTION: "phone_number_subscription",
|
|
} as const;
|
|
|
|
export type CheckoutSessionType = (typeof CHECKOUT_SESSION_TYPES)[keyof typeof CHECKOUT_SESSION_TYPES];
|
|
|
|
export const BILLING_PLANS = {
|
|
INDIVIDUALS: "INDIVIDUALS",
|
|
TEAMS: "TEAMS",
|
|
ORGANIZATIONS: "ORGANIZATIONS",
|
|
ENTERPRISE: "ENTERPRISE",
|
|
PLATFORM_STARTER: "PLATFORM_STARTER",
|
|
PLATFORM_ESSENTIALS: "PLATFORM_ESSENTIALS",
|
|
PLATFORM_SCALE: "PLATFORM_SCALE",
|
|
PLATFORM_ENTERPRISE: "PLATFORM_ENTERPRISE",
|
|
UNKNOWN: "Unknown",
|
|
} as const;
|
|
|
|
export type BillingPlan = (typeof BILLING_PLANS)[keyof typeof BILLING_PLANS];
|
|
|
|
export const PLATFORM_PLANS_MAP: Record<string, BillingPlan> = {
|
|
FREE: BILLING_PLANS.PLATFORM_STARTER,
|
|
STARTER: BILLING_PLANS.PLATFORM_STARTER,
|
|
ESSENTIALS: BILLING_PLANS.PLATFORM_ESSENTIALS,
|
|
SCALE: BILLING_PLANS.PLATFORM_SCALE,
|
|
ENTERPRISE: BILLING_PLANS.PLATFORM_ENTERPRISE,
|
|
};
|
|
|
|
export const PLATFORM_ENTERPRISE_SLUGS = process.env.PLATFORM_ENTERPRISE_SLUGS?.split(",") ?? [];
|
|
export const ENTERPRISE_SLUGS = process.env.ENTERPRISE_SLUGS?.split(",") ?? [];
|