Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(clerk-js): Allow Environment init with defaults #5287

Merged
merged 29 commits into from
Mar 18, 2025
Merged
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
cf1164d
feat(clerk-js): allow initialization with defaults
jacekradko Mar 13, 2025
1c454b7
add captchaOauthBypess default
jacekradko Mar 13, 2025
8f20fda
wip
jacekradko Mar 13, 2025
32ca7c5
Merge branch 'main' into feat/initialize-clerk-js-with-defaults
jacekradko Mar 14, 2025
b591c92
Update packages/clerk-js/src/core/clerk.ts
jacekradko Mar 14, 2025
f28ab02
Merge branch 'main' into feat/initialize-clerk-js-with-defaults
jacekradko Mar 16, 2025
3c7ea37
Merge branch 'main' into feat/initialize-clerk-js-with-defaults
jacekradko Mar 17, 2025
8979e81
wip: withDefault helper
jacekradko Mar 17, 2025
ed5e1dd
typedoc
jacekradko Mar 17, 2025
a45783c
authconfig
jacekradko Mar 17, 2025
b9da1b9
displayconfig
jacekradko Mar 17, 2025
2be6547
Merge branch 'main' into feat/initialize-clerk-js-with-defaults
jacekradko Mar 17, 2025
e9d3a80
Update userSettings
jacekradko Mar 17, 2025
5471c2e
wip
jacekradko Mar 17, 2025
fc0b9f6
snappies
jacekradko Mar 17, 2025
b20008d
authconfig test
jacekradko Mar 17, 2025
077a26f
wip
jacekradko Mar 17, 2025
3195ab0
wip
jacekradko Mar 17, 2025
e793ae0
wip
jacekradko Mar 17, 2025
2be4276
wip
jacekradko Mar 17, 2025
f5bfe87
Merge branch 'main' into feat/initialize-clerk-js-with-defaults
jacekradko Mar 17, 2025
b9435f6
wip
jacekradko Mar 17, 2025
e08bff0
wip
jacekradko Mar 17, 2025
95c2542
Merge branch 'main' into feat/initialize-clerk-js-with-defaults
jacekradko Mar 18, 2025
fb8654b
PR feedback from @LekoArts
jacekradko Mar 18, 2025
1d9edbf
feedback
jacekradko Mar 18, 2025
e098603
wip
jacekradko Mar 18, 2025
0115dcf
Apply suggestions from code review
jacekradko Mar 18, 2025
ecf070a
wip
jacekradko Mar 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/dirty-lizards-count.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@clerk/clerk-js': minor
---

Improve the resilience of the SDK against situations where the /v1/environment endpoint is not reachable. This is achieved by allowing the initialization of the environment with default values.
2 changes: 1 addition & 1 deletion integration/tests/reverification.test.ts
Original file line number Diff line number Diff line change
@@ -160,7 +160,7 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withReverification] })(
fictionalEmail: true,
withPhoneNumber: true,
});
const bapiFakeUser = await u.services.users.createBapiUser({
await u.services.users.createBapiUser({
...delFakeUser,
username: undefined,
phoneNumber: undefined,
6 changes: 3 additions & 3 deletions packages/clerk-js/bundlewatch.config.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"files": [
{ "path": "./dist/clerk.js", "maxSize": "577kB" },
{ "path": "./dist/clerk.browser.js", "maxSize": "78kB" },
{ "path": "./dist/clerk.js", "maxSize": "577.5kB" },
{ "path": "./dist/clerk.browser.js", "maxSize": "78.5kB" },
{ "path": "./dist/clerk.headless.js", "maxSize": "51KB" },
{ "path": "./dist/ui-common*.js", "maxSize": "94KB" },
{ "path": "./dist/vendors*.js", "maxSize": "30KB" },
@@ -12,7 +12,7 @@
{ "path": "./dist/organizationswitcher*.js", "maxSize": "5KB" },
{ "path": "./dist/organizationlist*.js", "maxSize": "5.5KB" },
{ "path": "./dist/signin*.js", "maxSize": "12.4KB" },
{ "path": "./dist/signup*.js", "maxSize": "6.5KB" },
{ "path": "./dist/signup*.js", "maxSize": "6.55KB" },
{ "path": "./dist/userbutton*.js", "maxSize": "5KB" },
{ "path": "./dist/userprofile*.js", "maxSize": "15KB" },
{ "path": "./dist/userverification*.js", "maxSize": "5KB" },
20 changes: 12 additions & 8 deletions packages/clerk-js/src/core/clerk.ts
Original file line number Diff line number Diff line change
@@ -326,9 +326,6 @@ export class Clerk implements ClerkInterface {
public constructor(key: string, options?: DomainOrProxyUrl) {
key = (key || '').trim();

this.#domain = options?.domain;
this.#proxyUrl = options?.proxyUrl;

if (!key) {
return errorThrower.throwMissingPublishableKeyError();
}
@@ -339,8 +336,11 @@ export class Clerk implements ClerkInterface {
return errorThrower.throwInvalidPublishableKeyError({ key });
}

this.#publishableKey = key;
this.#domain = options?.domain;
this.#proxyUrl = options?.proxyUrl;
this.environment = Environment.getInstance();
this.#instanceType = publishableKey.instanceType;
this.#publishableKey = key;

this.#fapiClient = createFapiClient({
domain: this.domain,
@@ -2085,16 +2085,20 @@ export class Clerk implements ClerkInterface {
}
};

await Promise.all([initEnvironmentPromise, initClient()]).catch(async e => {
// limit the changes for this specific error for now
const [envResult, clientResult] = await Promise.allSettled([initEnvironmentPromise, initClient()]);
if (clientResult.status === 'rejected') {
const e = clientResult.reason;

if (isClerkAPIResponseError(e) && e.errors[0].code === 'requires_captcha') {
await initEnvironmentPromise;
if (envResult.status === 'rejected') {
await initEnvironmentPromise;
}
initComponents();
await initClient();
} else {
throw e;
}
});
}

this.#authService?.setClientUatCookieForDevelopmentInstances();

24 changes: 14 additions & 10 deletions packages/clerk-js/src/core/resources/AuthConfig.ts
Original file line number Diff line number Diff line change
@@ -4,29 +4,33 @@ import { unixEpochToDate } from '../../utils/date';
import { BaseResource } from './internal';

export class AuthConfig extends BaseResource implements AuthConfigResource {
singleSessionMode!: boolean;
claimedAt: Date | null = null;
reverification!: boolean;
reverification: boolean = false;
singleSessionMode: boolean = false;

public constructor(data: AuthConfigJSON) {
public constructor(data: Partial<AuthConfigJSON> | null = null) {
super();

this.fromJSON(data);
}

protected fromJSON(data: AuthConfigJSON | null): this {
this.singleSessionMode = data ? data.single_session_mode : true;
this.claimedAt = data?.claimed_at ? unixEpochToDate(data.claimed_at) : null;
this.reverification = data ? data.reverification : true;
protected fromJSON(data: Partial<AuthConfigJSON> | null): this {
if (!data) {
return this;
}
this.claimedAt = this.withDefault(data.claimed_at ? unixEpochToDate(data.claimed_at) : null, this.claimedAt);
this.reverification = this.withDefault(data.reverification, this.reverification);
this.singleSessionMode = this.withDefault(data.single_session_mode, this.singleSessionMode);
return this;
}

public __internal_toSnapshot(): AuthConfigJSONSnapshot {
return {
object: 'auth_config',
id: this.id || '',
single_session_mode: this.singleSessionMode,
claimed_at: this.claimedAt ? this.claimedAt.getTime() : null,
id: this.id ?? '',
object: 'auth_config',
reverification: this.reverification,
single_session_mode: this.singleSessionMode,
};
}
}
12 changes: 12 additions & 0 deletions packages/clerk-js/src/core/resources/Base.ts
Original file line number Diff line number Diff line change
@@ -166,6 +166,18 @@ export abstract class BaseResource {

protected abstract fromJSON(data: ClerkResourceJSON | null): this;

/**
* Returns the provided value if it is not `undefined` or `null`, otherwise returns the default value.
*
* @template T - The type of the value.
* @param value - The value to check.
* @param defaultValue - The default value to return if the provided value is `undefined` or `null`.
* @returns The provided value if it is not `undefined` or `null`, otherwise the default value.
*/
protected withDefault<T>(value: T | undefined | null, defaultValue: T): T {
return value ?? defaultValue;
}

protected async _baseGet<J extends ClerkResourceJSON | null>(opts: BaseFetchOptions = {}): Promise<this> {
const json = await BaseResource._fetch<J>(
{
6 changes: 4 additions & 2 deletions packages/clerk-js/src/core/resources/CommerceSettings.ts
Original file line number Diff line number Diff line change
@@ -10,9 +10,11 @@ import { BaseResource } from './internal';
* @internal
*/
export class __experimental_CommerceSettings extends BaseResource implements __experimental_CommerceSettingsResource {
stripePublishableKey!: string;
stripePublishableKey: string = '';

public constructor(data: __experimental_CommerceSettingsJSON | __experimental_CommerceSettingsJSONSnapshot) {
public constructor(
data: __experimental_CommerceSettingsJSON | __experimental_CommerceSettingsJSONSnapshot | null = null,
) {
super();
this.fromJSON(data);
}
Loading
Oops, something went wrong.