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/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" }, 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..c50b549556f --- /dev/null +++ b/packages/shared/src/utils/allSettled.ts @@ -0,0 +1,15 @@ +/** + * A ES6 compatible utility that implements `Promise.allSettled` + * @internal + */ +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..0e06d1d05c2 100644 --- a/packages/shared/src/utils/createDeferredPromise.ts +++ b/packages/shared/src/utils/createDeferredPromise.ts @@ -5,6 +5,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 = () => { 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';