diff --git a/.changeset/large-feet-hammer.md b/.changeset/large-feet-hammer.md new file mode 100644 index 00000000000..388b3ddbed2 --- /dev/null +++ b/.changeset/large-feet-hammer.md @@ -0,0 +1,8 @@ +--- +'@clerk/localizations': patch +'@clerk/clerk-js': patch +'@clerk/clerk-react': patch +'@clerk/types': patch +--- + +Introduce experimental billing APIs and components diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json index 657dc3f9b11..d9133f5333a 100644 --- a/packages/clerk-js/bundlewatch.config.json +++ b/packages/clerk-js/bundlewatch.config.json @@ -1,10 +1,10 @@ { "files": [ - { "path": "./dist/clerk.js", "maxSize": "560kB" }, - { "path": "./dist/clerk.browser.js", "maxSize": "75kB" }, - { "path": "./dist/clerk.headless.js", "maxSize": "48.3KB" }, - { "path": "./dist/ui-common*.js", "maxSize": "89KB" }, - { "path": "./dist/vendors*.js", "maxSize": "25.1KB" }, + { "path": "./dist/clerk.js", "maxSize": "570kB" }, + { "path": "./dist/clerk.browser.js", "maxSize": "76kB" }, + { "path": "./dist/clerk.headless.js", "maxSize": "50KB" }, + { "path": "./dist/ui-common*.js", "maxSize": "92KB" }, + { "path": "./dist/vendors*.js", "maxSize": "26.5KB" }, { "path": "./dist/coinbase*.js", "maxSize": "35.5KB" }, { "path": "./dist/createorganization*.js", "maxSize": "5KB" }, { "path": "./dist/impersonationfab*.js", "maxSize": "5KB" }, @@ -18,6 +18,8 @@ { "path": "./dist/userverification*.js", "maxSize": "5KB" }, { "path": "./dist/onetap*.js", "maxSize": "1KB" }, { "path": "./dist/waitlist*.js", "maxSize": "1.3KB" }, - { "path": "./dist/keylessPrompt*.js", "maxSize": "5.9KB" } + { "path": "./dist/keylessPrompt*.js", "maxSize": "5.9KB" }, + { "path": "./dist/pricingTable*.js", "maxSize": "3.5KB" }, + { "path": "./dist/checkout*.js", "maxSize": "8.8KB" } ] } diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 1bd43fe38ce..3f1649111db 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -63,6 +63,8 @@ "@floating-ui/react": "0.25.4", "@floating-ui/react-dom": "^2.0.2", "@formkit/auto-animate": "^0.8.1", + "@stripe/react-stripe-js": "3.1.1", + "@stripe/stripe-js": "5.6.0", "@swc/helpers": "^0.5.13", "@zxcvbn-ts/core": "3.0.4", "@zxcvbn-ts/language-common": "3.0.4", diff --git a/packages/clerk-js/rspack.config.js b/packages/clerk-js/rspack.config.js index 463496049db..ba490c9eadc 100644 --- a/packages/clerk-js/rspack.config.js +++ b/packages/clerk-js/rspack.config.js @@ -93,6 +93,15 @@ const common = ({ mode, disableRHC = false }) => { name: 'signup', test: module => module.resource && module.resource.includes('/ui/components/SignUp'), }, + checkout: { + minChunks: 1, + name: 'checkout', + test: module => + module.resource && + (module.resource.includes('/ui/components/Checkout') || + // Include `@stripe/react-stripe-js` and `@stripe/stripe-js` in the checkout chunk + module.resource.includes('/node_modules/@stripe')), + }, common: { minChunks: 1, name: 'ui-common', diff --git a/packages/clerk-js/sandbox/app.ts b/packages/clerk-js/sandbox/app.ts index 780e1817edd..f6aabd78f40 100644 --- a/packages/clerk-js/sandbox/app.ts +++ b/packages/clerk-js/sandbox/app.ts @@ -16,6 +16,7 @@ const AVAILABLE_COMPONENTS = [ 'organizationProfile', 'organizationSwitcher', 'waitlist', + 'pricingTable', ] as const; const COMPONENT_PROPS_NAMESPACE = 'clerk-js-sandbox'; @@ -73,6 +74,7 @@ const componentControls: Record<(typeof AVAILABLE_COMPONENTS)[number], Component organizationProfile: buildComponentControls('organizationProfile'), organizationSwitcher: buildComponentControls('organizationSwitcher'), waitlist: buildComponentControls('waitlist'), + pricingTable: buildComponentControls('pricingTable'), }; declare global { @@ -95,7 +97,7 @@ const app = document.getElementById('app') as HTMLDivElement; function mountIndex(element: HTMLDivElement) { assertClerkIsLoaded(Clerk); const user = Clerk.user; - element.innerHTML = `
${JSON.stringify({ user }, null, 2)}`;
+ element.innerHTML = `${JSON.stringify({ user }, null, 2)}`;
}
function mountOpenSignInButton(element: HTMLDivElement, props) {
@@ -167,6 +169,9 @@ function addCurrentRouteIndicator(currentRoute: string) {
},
});
},
+ '/pricing-table': () => {
+ Clerk.__experimental_mountPricingTable(app, componentControls.pricingTable.getProps() ?? {});
+ },
'/open-sign-in': () => {
mountOpenSignInButton(app, componentControls.signIn.getProps() ?? {});
},
@@ -183,6 +188,7 @@ function addCurrentRouteIndicator(currentRoute: string) {
...(componentControls.clerk.getProps() ?? {}),
signInUrl: '/sign-in',
signUpUrl: '/sign-up',
+ experimental: { commerce: true },
});
renderCurrentRoute();
} else {
diff --git a/packages/clerk-js/sandbox/template.html b/packages/clerk-js/sandbox/template.html
index 9193428e975..5fa762e57d8 100644
--- a/packages/clerk-js/sandbox/template.html
+++ b/packages/clerk-js/sandbox/template.html
@@ -249,6 +249,14 @@
Keyless
+