From acae44f675a7fa01c19719519b77c04173887010 Mon Sep 17 00:00:00 2001 From: panteliselef Date: Mon, 31 Mar 2025 11:58:27 +0300 Subject: [PATCH 1/3] fix(clerk-js): Add custom implementation of Promise.allSettled for es6 compat --- .changeset/ripe-books-unite.md | 6 ++++++ packages/clerk-js/src/core/clerk.ts | 4 ++-- packages/shared/src/utils/allSettled.ts | 14 ++++++++++++++ packages/shared/src/utils/createDeferredPromise.ts | 2 +- packages/shared/src/utils/index.ts | 1 + 5 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 .changeset/ripe-books-unite.md create mode 100644 packages/shared/src/utils/allSettled.ts diff --git a/.changeset/ripe-books-unite.md b/.changeset/ripe-books-unite.md new file mode 100644 index 00000000000..39372a8a0da --- /dev/null +++ b/.changeset/ripe-books-unite.md @@ -0,0 +1,6 @@ +--- +'@clerk/clerk-js': patch +'@clerk/shared': patch +--- + +Create a utility that implements `Promise.allSettled` with ES6/ES2015 compatibility. diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 70d702b4cfa..ef2ab608c8e 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -11,7 +11,7 @@ import { TelemetryCollector, } from '@clerk/shared/telemetry'; import { addClerkPrefix, isAbsoluteUrl, stripScheme } from '@clerk/shared/url'; -import { handleValueOrFn, noop } from '@clerk/shared/utils'; +import { allSettled, handleValueOrFn, noop } from '@clerk/shared/utils'; import type { __experimental_CommerceNamespace, __experimental_PricingTableProps, @@ -2181,7 +2181,7 @@ export class Clerk implements ClerkInterface { } }; - const [envResult, clientResult] = await Promise.allSettled([initEnvironmentPromise, initClient()]); + const [envResult, clientResult] = await allSettled([initEnvironmentPromise, initClient()]); if (clientResult.status === 'rejected') { const e = clientResult.reason; diff --git a/packages/shared/src/utils/allSettled.ts b/packages/shared/src/utils/allSettled.ts new file mode 100644 index 00000000000..93c545086e7 --- /dev/null +++ b/packages/shared/src/utils/allSettled.ts @@ -0,0 +1,14 @@ +/** + * A ES6 compatible utility that implements `Promise.allSettled` + */ +export function allSettled( + iterable: Iterable>, +): Promise<({ status: 'fulfilled'; value: T } | { status: 'rejected'; reason: any })[]> { + const promises = Array.from(iterable).map(p => + p.then( + value => ({ status: 'fulfilled', value }) as const, + reason => ({ status: 'rejected', reason }) as const, + ), + ); + return Promise.all(promises); +} diff --git a/packages/shared/src/utils/createDeferredPromise.ts b/packages/shared/src/utils/createDeferredPromise.ts index bbf1243c4b9..028defbe6fa 100644 --- a/packages/shared/src/utils/createDeferredPromise.ts +++ b/packages/shared/src/utils/createDeferredPromise.ts @@ -5,7 +5,7 @@ type Callback = (val?: any) => void; /** * Create a promise that can be resolved or rejected from * outside the Promise constructor callback - * @internal + * A ES6 compatible utility that implements `Promise.withResolvers` */ export const createDeferredPromise = () => { let resolve: Callback = noop; diff --git a/packages/shared/src/utils/index.ts b/packages/shared/src/utils/index.ts index c6f6c129dfb..0d2d3bdbf12 100644 --- a/packages/shared/src/utils/index.ts +++ b/packages/shared/src/utils/index.ts @@ -1,4 +1,5 @@ export * from './createDeferredPromise'; +export * from './allSettled'; export { isStaging } from './instance'; export { logErrorInDevMode } from './logErrorInDevMode'; export { noop } from './noop'; From 984184ddbc5aa39ce7e77b18134c6f246c98964d Mon Sep 17 00:00:00 2001 From: panteliselef Date: Mon, 31 Mar 2025 12:13:13 +0300 Subject: [PATCH 2/3] ts doc --- packages/shared/src/utils/allSettled.ts | 1 + packages/shared/src/utils/createDeferredPromise.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/shared/src/utils/allSettled.ts b/packages/shared/src/utils/allSettled.ts index 93c545086e7..c50b549556f 100644 --- a/packages/shared/src/utils/allSettled.ts +++ b/packages/shared/src/utils/allSettled.ts @@ -1,5 +1,6 @@ /** * A ES6 compatible utility that implements `Promise.allSettled` + * @internal */ export function allSettled( iterable: Iterable>, diff --git a/packages/shared/src/utils/createDeferredPromise.ts b/packages/shared/src/utils/createDeferredPromise.ts index 028defbe6fa..0e06d1d05c2 100644 --- a/packages/shared/src/utils/createDeferredPromise.ts +++ b/packages/shared/src/utils/createDeferredPromise.ts @@ -6,6 +6,7 @@ type Callback = (val?: any) => void; * Create a promise that can be resolved or rejected from * outside the Promise constructor callback * A ES6 compatible utility that implements `Promise.withResolvers` + * @internal */ export const createDeferredPromise = () => { let resolve: Callback = noop; From 85a2d9bd0e4a5d281530d47b6d7d5a0d49b29a2a Mon Sep 17 00:00:00 2001 From: panteliselef Date: Mon, 31 Mar 2025 12:13:55 +0300 Subject: [PATCH 3/3] bundlewatch.config.json --- packages/clerk-js/bundlewatch.config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json index e6017c52293..4a4d92918c4 100644 --- a/packages/clerk-js/bundlewatch.config.json +++ b/packages/clerk-js/bundlewatch.config.json @@ -1,7 +1,7 @@ { "files": [ { "path": "./dist/clerk.js", "maxSize": "582.6kB" }, - { "path": "./dist/clerk.browser.js", "maxSize": "80kB" }, + { "path": "./dist/clerk.browser.js", "maxSize": "81kB" }, { "path": "./dist/clerk.headless*.js", "maxSize": "55KB" }, { "path": "./dist/ui-common*.js", "maxSize": "96KB" }, { "path": "./dist/vendors*.js", "maxSize": "30KB" },