Skip to content

Commit c8c4648

Browse files
authored
Merge branch 'main' into fix/token-poller-race-condition
2 parents be3c3a9 + a3e14b1 commit c8c4648

File tree

12 files changed

+87
-31
lines changed

12 files changed

+87
-31
lines changed

.changeset/afraid-women-buy.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'@clerk/clerk-js': patch
3+
---
4+
5+
Prevent enable organization prompt from appearing if there is a session with a pending `choose-organization` task.
6+
7+
This resolves an issue where, after organizations are enabled via the Dashboard, cached environment resources may cause the prompt to show again when the user is redirected to complete the `choose-organization` task.

.changeset/nice-planes-glow.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
---
2+
---

.changeset/violet-carrots-pull.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@clerk/backend': minor
3+
---
4+
5+
Export `UserDeletedJSON` type from API resources

integration/presets/envs.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,6 @@ const withEmailCodes = base
4242
.setEnvVariable('public', 'CLERK_PUBLISHABLE_KEY', instanceKeys.get('with-email-codes').pk)
4343
.setEnvVariable('private', 'CLERK_ENCRYPTION_KEY', constants.E2E_CLERK_ENCRYPTION_KEY || 'a-key');
4444

45-
const withBroadcastChannel = withEmailCodes
46-
.clone()
47-
.setId('withBroadcastChannel')
48-
.setEnvVariable(
49-
'public',
50-
'CLERK_JS_URL',
51-
constants.E2E_APP_CLERK_JS || 'http://localhost:18211/clerk.channel.browser.js',
52-
);
53-
5445
const sessionsProd1 = base
5546
.clone()
5647
.setId('sessionsProd1')
@@ -201,7 +192,6 @@ export const envs = {
201192
withAPCore2ClerkV4,
202193
withBilling,
203194
withBillingJwtV2,
204-
withBroadcastChannel,
205195
withCustomRoles,
206196
withDynamicKeys,
207197
withEmailCodes,

packages/backend/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ export type {
9393
SignUpVerificationsJSON,
9494
SMSMessageJSON,
9595
UserJSON,
96+
UserDeletedJSON,
9697
VerificationJSON,
9798
WaitlistEntryJSON,
9899
Web3WalletJSON,

packages/clerk-js/bundlewatch.config.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
"files": [
33
{ "path": "./dist/clerk.js", "maxSize": "840KB" },
44
{ "path": "./dist/clerk.browser.js", "maxSize": "83KB" },
5-
{ "path": "./dist/clerk.channel.browser.js", "maxSize": "83KB" },
65
{ "path": "./dist/clerk.legacy.browser.js", "maxSize": "127KB" },
76
{ "path": "./dist/clerk.headless*.js", "maxSize": "65KB" },
87
{ "path": "./dist/ui-common*.js", "maxSize": "119KB" },

packages/clerk-js/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
"bundlewatch:fix": "node bundlewatch-fix.mjs",
4343
"clean": "rimraf ./dist",
4444
"dev": "rspack serve --config rspack.config.js",
45-
"dev:channel": "rspack serve --config rspack.config.js --env variant=\"clerk.channel.browser\"",
4645
"dev:chips": "rspack serve --config rspack.config.js --env variant=\"clerk.chips.browser\"",
4746
"dev:headless": "rspack serve --config rspack.config.js --env variant=\"clerk.headless.browser\"",
4847
"dev:origin": "rspack serve --config rspack.config.js --env devOrigin=http://localhost:${PORT:-4000}",

packages/clerk-js/rspack.config.js

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ const variants = {
1717
clerkHeadlessBrowser: 'clerk.headless.browser',
1818
clerkLegacyBrowser: 'clerk.legacy.browser',
1919
clerkCHIPS: 'clerk.chips.browser',
20-
clerkChannelBrowser: 'clerk.channel.browser',
2120
};
2221

2322
const variantToSourceFile = {
@@ -28,7 +27,6 @@ const variantToSourceFile = {
2827
[variants.clerkHeadlessBrowser]: './src/index.headless.browser.ts',
2928
[variants.clerkLegacyBrowser]: './src/index.legacy.browser.ts',
3029
[variants.clerkCHIPS]: './src/index.browser.ts',
31-
[variants.clerkChannelBrowser]: './src/index.browser.ts',
3230
};
3331

3432
/**
@@ -60,7 +58,6 @@ const common = ({ mode, variant, disableRHC = false }) => {
6058
*/
6159
__BUILD_FLAG_KEYLESS_UI__: isDevelopment(mode),
6260
__BUILD_DISABLE_RHC__: JSON.stringify(disableRHC),
63-
__BUILD_VARIANT_CHANNEL__: variant === variants.clerkChannelBrowser,
6461
__BUILD_VARIANT_CHIPS__: variant === variants.clerkCHIPS,
6562
}),
6663
new rspack.EnvironmentPlugin({
@@ -433,13 +430,6 @@ const prodConfig = ({ mode, env, analysis }) => {
433430
commonForProdChunked(),
434431
);
435432

436-
const clerkChannelBrowser = merge(
437-
entryForVariant(variants.clerkChannelBrowser),
438-
common({ mode, variant: variants.clerkChannelBrowser }),
439-
commonForProd(),
440-
commonForProdChunked(),
441-
);
442-
443433
const clerkEsm = merge(
444434
entryForVariant(variants.clerk),
445435
common({ mode, variant: variants.clerk }),
@@ -554,7 +544,6 @@ const prodConfig = ({ mode, env, analysis }) => {
554544
clerkHeadless,
555545
clerkHeadlessBrowser,
556546
clerkCHIPS,
557-
clerkChannelBrowser,
558547
clerkEsm,
559548
clerkEsmNoRHC,
560549
clerkCjs,
@@ -662,11 +651,6 @@ const devConfig = ({ mode, env }) => {
662651
common({ mode, variant: variants.clerkCHIPS }),
663652
commonForDev(),
664653
),
665-
[variants.clerkChannelBrowser]: merge(
666-
entryForVariant(variants.clerkChannelBrowser),
667-
common({ mode, variant: variants.clerkChannelBrowser }),
668-
commonForDev(),
669-
),
670654
};
671655

672656
if (!entryToConfigMap[variant]) {

packages/clerk-js/src/core/__tests__/clerk.test.ts

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2510,6 +2510,11 @@ describe('Clerk singleton', () => {
25102510
});
25112511

25122512
describe('__internal_attemptToEnableEnvironmentSetting', () => {
2513+
afterEach(() => {
2514+
mockEnvironmentFetch.mockReset();
2515+
mockClientFetch.mockReset();
2516+
});
2517+
25132518
describe('for organizations', () => {
25142519
it('does not open prompt if organizations is enabled in development', async () => {
25152520
mockEnvironmentFetch.mockReturnValue(
@@ -2630,6 +2635,68 @@ describe('Clerk singleton', () => {
26302635
expect(result?.isEnabled).toBe(false);
26312636
expect(__internal_openEnableOrganizationsPromptSpy).not.toHaveBeenCalled();
26322637
});
2638+
2639+
// Handles case where environment gets enabled via BAPI, but it gets cached and the user is redirected to the choose-organization task
2640+
// The enable org prompt should not appear in the task screen since orgs have already been enabled
2641+
it('does not open prompt if organizations is disabled in development and session has choose-organization task', async () => {
2642+
const mockSession = {
2643+
id: '1',
2644+
remove: vi.fn(),
2645+
status: 'pending',
2646+
user: {},
2647+
touch: vi.fn(() => Promise.resolve()),
2648+
getToken: vi.fn(),
2649+
lastActiveToken: { getRawString: () => 'mocked-token' },
2650+
tasks: [{ key: 'choose-organization' }],
2651+
currentTask: { key: 'choose-organization' },
2652+
reload: vi.fn(() =>
2653+
Promise.resolve({
2654+
id: '1',
2655+
status: 'pending',
2656+
user: {},
2657+
tasks: [{ key: 'choose-organization' }],
2658+
currentTask: {
2659+
key: 'choose-organization',
2660+
},
2661+
}),
2662+
),
2663+
};
2664+
2665+
mockEnvironmentFetch.mockReturnValue(
2666+
Promise.resolve({
2667+
userSettings: mockUserSettings,
2668+
displayConfig: mockDisplayConfig,
2669+
isSingleSession: () => false,
2670+
isProduction: () => false,
2671+
isDevelopmentOrStaging: () => true,
2672+
organizationSettings: {
2673+
enabled: false,
2674+
},
2675+
}),
2676+
);
2677+
2678+
mockClientFetch.mockReturnValue(
2679+
Promise.resolve({
2680+
signedInSessions: [mockSession],
2681+
}),
2682+
);
2683+
2684+
const sut = new Clerk(developmentPublishableKey);
2685+
2686+
const __internal_openEnableOrganizationsPromptSpy = vi.fn();
2687+
sut.__internal_openEnableOrganizationsPrompt = __internal_openEnableOrganizationsPromptSpy;
2688+
2689+
await sut.load();
2690+
2691+
const result = await sut.__internal_attemptToEnableEnvironmentSetting({
2692+
for: 'organizations',
2693+
caller: 'OrganizationSwitcher',
2694+
});
2695+
2696+
// Contains the organization task, so the prompt should not be opened
2697+
expect(result?.isEnabled).toBe(true);
2698+
expect(__internal_openEnableOrganizationsPromptSpy).not.toHaveBeenCalled();
2699+
});
26332700
});
26342701
});
26352702
});

packages/clerk-js/src/core/clerk.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -761,7 +761,11 @@ export class Clerk implements ClerkInterface {
761761

762762
switch (setting) {
763763
case 'organizations': {
764-
const isSettingDisabled = disabledOrganizationsFeature(this, this.environment);
764+
const isSettingDisabled =
765+
disabledOrganizationsFeature(this, this.environment) &&
766+
// Handles case where environment gets enabled via BAPI, but it gets cached and the user is redirected to the choose-organization task
767+
// The enable org prompt should not appear in the task screen since orgs have already been enabled
768+
this.session?.currentTask?.key !== 'choose-organization';
765769

766770
if (!isSettingDisabled) {
767771
return { isEnabled: true };

0 commit comments

Comments
 (0)