@clerk/shared 4.24.0-snapshot.v20260703092711 → 4.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{utils-CKGct_An.mjs → utils-CklTXkDM.mjs} +2 -19
- package/dist/_chunks/utils-CklTXkDM.mjs.map +1 -0
- package/dist/_chunks/{utils-DRYgqz3C.js → utils-DccuyyQf.js} +1 -24
- package/dist/_chunks/utils-DccuyyQf.js.map +1 -0
- package/dist/alternativePhoneCode.js +1 -2
- package/dist/apiUrlFromPublishableKey.js +1 -2
- package/dist/authorization-errors.js +1 -2
- package/dist/authorization.js +1 -2
- package/dist/browser.js +1 -2
- package/dist/buildAccountsBaseUrl.js +1 -2
- package/dist/clerkEventBus.js +1 -2
- package/dist/color.js +1 -2
- package/dist/constants.js +1 -2
- package/dist/cookie.js +3 -4
- package/dist/date.js +1 -2
- package/dist/deprecated.js +2 -3
- package/dist/deriveState.js +1 -2
- package/dist/devBrowser.js +1 -2
- package/dist/dom/waitForElement.js +1 -2
- package/dist/error.js +42 -32
- package/dist/eventBus.js +1 -2
- package/dist/file.js +1 -2
- package/dist/getEnvVariable.js +1 -2
- package/dist/getToken.js +2 -3
- package/dist/globs.js +3 -4
- package/dist/handleValueOrFn.js +2 -3
- package/dist/index.js +1 -2
- package/dist/inert.js +1 -2
- package/dist/internal/clerk-js/completeSignUpFlow.js +1 -2
- package/dist/internal/clerk-js/componentGuards.js +1 -2
- package/dist/internal/clerk-js/constants.js +1 -2
- package/dist/internal/clerk-js/email.js +1 -2
- package/dist/internal/clerk-js/encoders.js +1 -2
- package/dist/internal/clerk-js/errors.js +1 -2
- package/dist/internal/clerk-js/hex.js +1 -2
- package/dist/internal/clerk-js/injectedWeb3EthProviders.js +1 -2
- package/dist/internal/clerk-js/injectedWeb3SolanaProviders.js +2 -3
- package/dist/internal/clerk-js/organization.js +1 -2
- package/dist/internal/clerk-js/passkeys.js +10 -10
- package/dist/internal/clerk-js/passwords/complexity.js +1 -2
- package/dist/internal/clerk-js/passwords/loadZxcvbn.js +1 -2
- package/dist/internal/clerk-js/passwords/password.js +2 -3
- package/dist/internal/clerk-js/passwords/strength.js +1 -2
- package/dist/internal/clerk-js/path.js +1 -2
- package/dist/internal/clerk-js/queryParams.js +1 -2
- package/dist/internal/clerk-js/queryStateParams.js +1 -2
- package/dist/internal/clerk-js/querystring.js +1 -2
- package/dist/internal/clerk-js/redirectUrls.js +1 -2
- package/dist/internal/clerk-js/runtime.js +1 -2
- package/dist/internal/clerk-js/sessionTasks.js +1 -2
- package/dist/internal/clerk-js/thirdPartyDomains.js +1 -2
- package/dist/internal/clerk-js/url.js +1 -2
- package/dist/internal/clerk-js/user.js +1 -2
- package/dist/internal/clerk-js/warnings.js +1 -2
- package/dist/internal/clerk-js/web3.js +5 -5
- package/dist/internal/clerk-js/windowNavigate.js +1 -2
- package/dist/isomorphicAtob.js +1 -2
- package/dist/isomorphicBtoa.js +1 -2
- package/dist/jwtPayloadParser.js +1 -2
- package/dist/keyless/index.js +12 -369
- package/dist/keys.js +1 -2
- package/dist/loadClerkJsScript.js +6 -6
- package/dist/loadClerkJsScript.js.map +1 -1
- package/dist/loadClerkJsScript.mjs +1 -1
- package/dist/loadClerkJsScript.mjs.map +1 -1
- package/dist/loadScript.js +1 -2
- package/dist/localStorageBroadcastChannel.js +1 -2
- package/dist/logger.js +1 -2
- package/dist/netlifyCacheHandler.js +1 -2
- package/dist/oauth.js +1 -2
- package/dist/object.js +1 -2
- package/dist/organization.js +1 -2
- package/dist/pathMatcher.d.mts +12 -2
- package/dist/pathMatcher.d.ts +12 -2
- package/dist/pathMatcher.js +2 -3
- package/dist/pathMatcher.js.map +1 -1
- package/dist/pathMatcher.mjs.map +1 -1
- package/dist/pathToRegexp.js +23 -3
- package/dist/poller.js +3 -4
- package/dist/proxy.js +1 -2
- package/dist/react/index.js +93 -3776
- package/dist/retry.js +1 -2
- package/dist/router.js +9 -150
- package/dist/safeImport.js +1 -2
- package/dist/saml.js +1 -2
- package/dist/telemetry.js +16 -11
- package/dist/underscore.js +1 -2
- package/dist/url.js +2 -3
- package/dist/utils/index.d.mts +1 -2
- package/dist/utils/index.d.ts +1 -2
- package/dist/utils/index.js +14 -12
- package/dist/utils/index.mjs +2 -2
- package/dist/versionCheck.js +1 -2
- package/dist/versionSelector.js +2 -3
- package/dist/versionSelector.js.map +1 -1
- package/dist/versionSelector.mjs +1 -1
- package/dist/versionSelector.mjs.map +1 -1
- package/dist/web3.js +1 -2
- package/dist/webauthn.js +1 -2
- package/dist/workerTimers/index.js +2 -2
- package/package.json +1 -1
- package/dist/_chunks/utils-CKGct_An.mjs.map +0 -1
- package/dist/_chunks/utils-DRYgqz3C.js.map +0 -1
- package/dist/utils/timeLimit.d.mts +0 -4
- package/dist/utils/timeLimit.d.ts +0 -4
- package/dist/utils/timeLimit.js +0 -19
|
@@ -29,5 +29,4 @@ function inCrossOriginIframe() {
|
|
|
29
29
|
exports.inActiveBrowserTab = inActiveBrowserTab;
|
|
30
30
|
exports.inBrowser = inBrowser;
|
|
31
31
|
exports.inCrossOriginIframe = inCrossOriginIframe;
|
|
32
|
-
exports.inIframe = inIframe;
|
|
33
|
-
//# sourceMappingURL=runtime.js.map
|
|
32
|
+
exports.inIframe = inIframe;
|
|
@@ -46,5 +46,4 @@ exports.INTERNAL_SESSION_TASK_ROUTE_BY_KEY = INTERNAL_SESSION_TASK_ROUTE_BY_KEY;
|
|
|
46
46
|
exports.buildTaskUrl = buildTaskUrl;
|
|
47
47
|
exports.getTaskEndpoint = getTaskEndpoint;
|
|
48
48
|
exports.navigateIfTaskExists = navigateIfTaskExists;
|
|
49
|
-
exports.warnMissingPendingTaskHandlers = warnMissingPendingTaskHandlers;
|
|
50
|
-
//# sourceMappingURL=sessionTasks.js.map
|
|
49
|
+
exports.warnMissingPendingTaskHandlers = warnMissingPendingTaskHandlers;
|
|
@@ -33,5 +33,4 @@ function isThirdPartyCookieDomain() {
|
|
|
33
33
|
|
|
34
34
|
//#endregion
|
|
35
35
|
exports.THIRD_PARTY_COOKIE_DOMAINS = THIRD_PARTY_COOKIE_DOMAINS;
|
|
36
|
-
exports.isThirdPartyCookieDomain = isThirdPartyCookieDomain;
|
|
37
|
-
//# sourceMappingURL=thirdPartyDomains.js.map
|
|
36
|
+
exports.isThirdPartyCookieDomain = isThirdPartyCookieDomain;
|
|
@@ -284,5 +284,4 @@ exports.sanitizeHref = sanitizeHref;
|
|
|
284
284
|
exports.stripOrigin = stripOrigin;
|
|
285
285
|
exports.toURL = toURL;
|
|
286
286
|
exports.trimLeadingSlash = trimLeadingSlash;
|
|
287
|
-
exports.trimTrailingSlash = trimTrailingSlash;
|
|
288
|
-
//# sourceMappingURL=url.js.map
|
|
287
|
+
exports.trimTrailingSlash = trimTrailingSlash;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_clerkRuntimeError = require('../../
|
|
3
|
-
const
|
|
2
|
+
const require_clerkRuntimeError = require('../../errors/clerkRuntimeError.js');
|
|
3
|
+
const require_errorThrower = require('../../errors/errorThrower.js');
|
|
4
|
+
require('../../error.js');
|
|
4
5
|
const require_internal_clerk_js_hex = require('./hex.js');
|
|
5
6
|
const require_internal_clerk_js_injectedWeb3EthProviders = require('./injectedWeb3EthProviders.js');
|
|
6
7
|
const require_internal_clerk_js_injectedWeb3SolanaProviders = require('./injectedWeb3SolanaProviders.js');
|
|
@@ -9,7 +10,7 @@ const require_internal_clerk_js_injectedWeb3SolanaProviders = require('./injecte
|
|
|
9
10
|
const StandardConnect = `standard:connect`;
|
|
10
11
|
const SolanaSignMessage = `solana:signMessage`;
|
|
11
12
|
function createWeb3(moduleManager) {
|
|
12
|
-
const errorThrower =
|
|
13
|
+
const errorThrower = require_errorThrower.buildErrorThrower({ packageName: "@clerk/shared" });
|
|
13
14
|
async function getWeb3Identifier(params) {
|
|
14
15
|
const { provider, walletName } = params;
|
|
15
16
|
const walletProvider = await getWeb3Wallet(provider, walletName);
|
|
@@ -139,5 +140,4 @@ function createWeb3(moduleManager) {
|
|
|
139
140
|
}
|
|
140
141
|
|
|
141
142
|
//#endregion
|
|
142
|
-
exports.createWeb3 = createWeb3;
|
|
143
|
-
//# sourceMappingURL=web3.js.map
|
|
143
|
+
exports.createWeb3 = createWeb3;
|
|
@@ -61,5 +61,4 @@ function windowNavigate(to, options) {
|
|
|
61
61
|
//#endregion
|
|
62
62
|
exports.ALLOWED_PROTOCOLS = ALLOWED_PROTOCOLS;
|
|
63
63
|
exports.CLERK_BEFORE_UNLOAD_EVENT = CLERK_BEFORE_UNLOAD_EVENT;
|
|
64
|
-
exports.windowNavigate = windowNavigate;
|
|
65
|
-
//# sourceMappingURL=windowNavigate.js.map
|
|
64
|
+
exports.windowNavigate = windowNavigate;
|
package/dist/isomorphicAtob.js
CHANGED
package/dist/isomorphicBtoa.js
CHANGED
package/dist/jwtPayloadParser.js
CHANGED
|
@@ -81,5 +81,4 @@ const __experimental_JWTPayloadToAuthObjectProperties = (claims) => {
|
|
|
81
81
|
|
|
82
82
|
//#endregion
|
|
83
83
|
exports.__experimental_JWTPayloadToAuthObjectProperties = __experimental_JWTPayloadToAuthObjectProperties;
|
|
84
|
-
exports.parsePermissions = parsePermissions;
|
|
85
|
-
//# sourceMappingURL=jwtPayloadParser.js.map
|
|
84
|
+
exports.parsePermissions = parsePermissions;
|
package/dist/keyless/index.js
CHANGED
|
@@ -1,370 +1,13 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
if (!globalThis.__clerk_internal_keyless_logger) globalThis.__clerk_internal_keyless_logger = {
|
|
15
|
-
__cache: /* @__PURE__ */ new Map(),
|
|
16
|
-
log: function({ cacheKey, msg }) {
|
|
17
|
-
if (this.__cache.has(cacheKey) && Date.now() < (this.__cache.get(cacheKey)?.expiresAt || 0)) return;
|
|
18
|
-
console.log(msg);
|
|
19
|
-
this.__cache.set(cacheKey, { expiresAt: Date.now() + THROTTLE_DURATION_MS });
|
|
20
|
-
},
|
|
21
|
-
run: async function(callback, { cacheKey, onSuccessStale = THROTTLE_DURATION_MS, onErrorStale = THROTTLE_DURATION_MS }) {
|
|
22
|
-
if (this.__cache.has(cacheKey) && Date.now() < (this.__cache.get(cacheKey)?.expiresAt || 0)) return this.__cache.get(cacheKey)?.data;
|
|
23
|
-
try {
|
|
24
|
-
const result = await callback();
|
|
25
|
-
this.__cache.set(cacheKey, {
|
|
26
|
-
expiresAt: Date.now() + onSuccessStale,
|
|
27
|
-
data: result
|
|
28
|
-
});
|
|
29
|
-
return result;
|
|
30
|
-
} catch (e) {
|
|
31
|
-
this.__cache.set(cacheKey, { expiresAt: Date.now() + onErrorStale });
|
|
32
|
-
throw e;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
return globalThis.__clerk_internal_keyless_logger;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Creates the console message shown when running in keyless mode.
|
|
40
|
-
*
|
|
41
|
-
* @param keys - The keyless application keys
|
|
42
|
-
* @returns Formatted console message
|
|
43
|
-
*/
|
|
44
|
-
function createKeylessModeMessage(keys) {
|
|
45
|
-
return `\n\x1b[35m\n[Clerk]:\x1b[0m You are running in keyless mode.\nYou can \x1b[35mclaim your keys\x1b[0m by visiting ${keys.claimUrl}\n`;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Creates the console message shown when keys have been claimed.
|
|
49
|
-
*
|
|
50
|
-
* @returns Formatted console message
|
|
51
|
-
*/
|
|
52
|
-
function createConfirmationMessage() {
|
|
53
|
-
return `\n\x1b[35m\n[Clerk]:\x1b[0m Your application is running with your claimed keys.\nYou can safely remove the \x1b[35m.clerk/\x1b[0m from your project.\n`;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Shared singleton instance of the development cache.
|
|
57
|
-
*/
|
|
58
|
-
const clerkDevelopmentCache = createClerkDevCache();
|
|
59
|
-
|
|
60
|
-
//#endregion
|
|
61
|
-
//#region src/keyless/nodeFileStorage.ts
|
|
62
|
-
const CLERK_HIDDEN = ".clerk";
|
|
63
|
-
const CLERK_LOCK = "clerk.lock";
|
|
64
|
-
const TEMP_DIR_NAME = ".tmp";
|
|
65
|
-
const CONFIG_FILE = "keyless.json";
|
|
66
|
-
const README_FILE = "README.md";
|
|
67
|
-
/**
|
|
68
|
-
* Creates a file-based storage adapter for keyless mode.
|
|
69
|
-
* This is used by Node.js-based frameworks (Next.js, TanStack Start, etc.)
|
|
70
|
-
* to persist keyless configuration to the file system.
|
|
71
|
-
*
|
|
72
|
-
* @param fs - Node.js fs module or compatible adapter
|
|
73
|
-
* @param path - Node.js path module or compatible adapter
|
|
74
|
-
* @param options - Configuration options
|
|
75
|
-
* @returns A KeylessStorage implementation
|
|
76
|
-
*/
|
|
77
|
-
function createNodeFileStorage(fs, path, options = {}) {
|
|
78
|
-
const { cwd = () => process.cwd(), frameworkPackageName = "@clerk/shared" } = options;
|
|
79
|
-
let inMemoryLock = false;
|
|
80
|
-
const getClerkDir = () => path.join(cwd(), CLERK_HIDDEN);
|
|
81
|
-
const getTempDir = () => path.join(getClerkDir(), TEMP_DIR_NAME);
|
|
82
|
-
const getConfigPath = () => path.join(getTempDir(), CONFIG_FILE);
|
|
83
|
-
const getReadmePath = () => path.join(getTempDir(), README_FILE);
|
|
84
|
-
const getLockPath = () => path.join(cwd(), CLERK_LOCK);
|
|
85
|
-
const isLocked = () => inMemoryLock || fs.existsSync(getLockPath());
|
|
86
|
-
const lock = () => {
|
|
87
|
-
if (isLocked()) return false;
|
|
88
|
-
inMemoryLock = true;
|
|
89
|
-
try {
|
|
90
|
-
fs.writeFileSync(getLockPath(), "This file can be deleted if your app is stuck.", {
|
|
91
|
-
encoding: "utf8",
|
|
92
|
-
mode: 420
|
|
93
|
-
});
|
|
94
|
-
return true;
|
|
95
|
-
} catch {
|
|
96
|
-
inMemoryLock = false;
|
|
97
|
-
return false;
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
const unlock = () => {
|
|
101
|
-
inMemoryLock = false;
|
|
102
|
-
try {
|
|
103
|
-
if (fs.existsSync(getLockPath())) fs.rmSync(getLockPath(), { force: true });
|
|
104
|
-
} catch {}
|
|
105
|
-
};
|
|
106
|
-
const ensureDirectoryExists = () => {
|
|
107
|
-
const tempDir = getTempDir();
|
|
108
|
-
if (!fs.existsSync(tempDir)) fs.mkdirSync(tempDir, { recursive: true });
|
|
109
|
-
};
|
|
110
|
-
const updateGitignore = () => {
|
|
111
|
-
const gitignorePath = path.join(cwd(), ".gitignore");
|
|
112
|
-
const entry = `/${CLERK_HIDDEN}/`;
|
|
113
|
-
if (!fs.existsSync(gitignorePath)) fs.writeFileSync(gitignorePath, "", {
|
|
114
|
-
encoding: "utf8",
|
|
115
|
-
mode: 420
|
|
116
|
-
});
|
|
117
|
-
if (!fs.readFileSync(gitignorePath, { encoding: "utf-8" }).includes(entry)) fs.appendFileSync(gitignorePath, `\n# clerk configuration (can include secrets)\n${entry}\n`);
|
|
118
|
-
};
|
|
119
|
-
const writeReadme = () => {
|
|
120
|
-
const readme = `## DO NOT COMMIT
|
|
121
|
-
This directory is auto-generated from \`${frameworkPackageName}\` because you are running in Keyless mode.
|
|
122
|
-
Avoid committing the \`.clerk/\` directory as it includes the secret key of the unclaimed instance.
|
|
123
|
-
`;
|
|
124
|
-
fs.writeFileSync(getReadmePath(), readme, {
|
|
125
|
-
encoding: "utf8",
|
|
126
|
-
mode: 384
|
|
127
|
-
});
|
|
128
|
-
};
|
|
129
|
-
return {
|
|
130
|
-
read() {
|
|
131
|
-
try {
|
|
132
|
-
if (!fs.existsSync(getConfigPath())) return "";
|
|
133
|
-
return fs.readFileSync(getConfigPath(), { encoding: "utf-8" });
|
|
134
|
-
} catch {
|
|
135
|
-
return "";
|
|
136
|
-
}
|
|
137
|
-
},
|
|
138
|
-
write(data) {
|
|
139
|
-
if (!lock()) return;
|
|
140
|
-
try {
|
|
141
|
-
ensureDirectoryExists();
|
|
142
|
-
updateGitignore();
|
|
143
|
-
writeReadme();
|
|
144
|
-
fs.writeFileSync(getConfigPath(), data, {
|
|
145
|
-
encoding: "utf8",
|
|
146
|
-
mode: 384
|
|
147
|
-
});
|
|
148
|
-
} finally {
|
|
149
|
-
unlock();
|
|
150
|
-
}
|
|
151
|
-
},
|
|
152
|
-
remove() {
|
|
153
|
-
if (!lock()) return;
|
|
154
|
-
try {
|
|
155
|
-
if (fs.existsSync(getClerkDir())) fs.rmSync(getClerkDir(), {
|
|
156
|
-
recursive: true,
|
|
157
|
-
force: true
|
|
158
|
-
});
|
|
159
|
-
} finally {
|
|
160
|
-
unlock();
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
//#endregion
|
|
167
|
-
//#region src/keyless/service.ts
|
|
168
|
-
const KEYLESS_SOURCE_FALLBACK = "javascript";
|
|
169
|
-
const KEYLESS_SOURCE_MAX_LENGTH = 36;
|
|
170
|
-
/**
|
|
171
|
-
* Creates metadata headers for the keyless service.
|
|
172
|
-
*/
|
|
173
|
-
function createMetadataHeaders(framework, frameworkVersion) {
|
|
174
|
-
const headers = new Headers();
|
|
175
|
-
if (framework) headers.set("Clerk-Framework", framework);
|
|
176
|
-
if (frameworkVersion) headers.set("Clerk-Framework-Version", frameworkVersion);
|
|
177
|
-
return headers;
|
|
178
|
-
}
|
|
179
|
-
function createSource(framework) {
|
|
180
|
-
return (framework || KEYLESS_SOURCE_FALLBACK).toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, KEYLESS_SOURCE_MAX_LENGTH) || KEYLESS_SOURCE_FALLBACK;
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Creates a keyless service that handles accountless application creation and storage.
|
|
184
|
-
* This provides a simple API for frameworks to integrate keyless mode.
|
|
185
|
-
*
|
|
186
|
-
* @param options - Configuration for the service including storage and API adapters
|
|
187
|
-
* @returns A keyless service instance
|
|
188
|
-
*
|
|
189
|
-
* @example
|
|
190
|
-
* ```ts
|
|
191
|
-
* import { createKeylessService } from '@clerk/shared/keyless';
|
|
192
|
-
*
|
|
193
|
-
* const keylessService = createKeylessService({
|
|
194
|
-
* storage: createFileStorage(),
|
|
195
|
-
* api: createKeylessAPI({ secretKey }),
|
|
196
|
-
* framework: 'TanStack Start',
|
|
197
|
-
* });
|
|
198
|
-
*
|
|
199
|
-
* const keys = await keylessService.getOrCreateKeys(request);
|
|
200
|
-
* if (keys) {
|
|
201
|
-
* console.log('Publishable Key:', keys.publishableKey);
|
|
202
|
-
* }
|
|
203
|
-
* ```
|
|
204
|
-
*/
|
|
205
|
-
function createKeylessService(options) {
|
|
206
|
-
const { storage, api, framework, frameworkVersion } = options;
|
|
207
|
-
let hasLoggedKeylessMessage = false;
|
|
208
|
-
const source = createSource(framework);
|
|
209
|
-
const safeParseConfig = () => {
|
|
210
|
-
try {
|
|
211
|
-
const data = storage.read();
|
|
212
|
-
if (!data) return;
|
|
213
|
-
return JSON.parse(data);
|
|
214
|
-
} catch {
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
};
|
|
218
|
-
return {
|
|
219
|
-
async getOrCreateKeys() {
|
|
220
|
-
const existingConfig = safeParseConfig();
|
|
221
|
-
if (existingConfig?.publishableKey && existingConfig?.secretKey) return existingConfig;
|
|
222
|
-
const headers = createMetadataHeaders(framework, frameworkVersion);
|
|
223
|
-
const accountlessApplication = await api.createAccountlessApplication(headers, source);
|
|
224
|
-
if (accountlessApplication) storage.write(JSON.stringify(accountlessApplication));
|
|
225
|
-
return accountlessApplication;
|
|
226
|
-
},
|
|
227
|
-
readKeys() {
|
|
228
|
-
return safeParseConfig();
|
|
229
|
-
},
|
|
230
|
-
removeKeys() {
|
|
231
|
-
storage.remove();
|
|
232
|
-
},
|
|
233
|
-
async completeOnboarding() {
|
|
234
|
-
const headers = createMetadataHeaders(framework, frameworkVersion);
|
|
235
|
-
return api.completeOnboarding(headers, source);
|
|
236
|
-
},
|
|
237
|
-
logKeylessMessage(claimUrl) {
|
|
238
|
-
if (!hasLoggedKeylessMessage) {
|
|
239
|
-
hasLoggedKeylessMessage = true;
|
|
240
|
-
console.log(`[Clerk]: Running in keyless mode. Claim your keys at: ${claimUrl}`);
|
|
241
|
-
}
|
|
242
|
-
},
|
|
243
|
-
async resolveKeysWithKeylessFallback(configuredPublishableKey, configuredSecretKey) {
|
|
244
|
-
let publishableKey = configuredPublishableKey;
|
|
245
|
-
let secretKey = configuredSecretKey;
|
|
246
|
-
let claimUrl;
|
|
247
|
-
let apiKeysUrl;
|
|
248
|
-
try {
|
|
249
|
-
const locallyStoredKeys = safeParseConfig();
|
|
250
|
-
if (Boolean(configuredPublishableKey) && configuredPublishableKey === locallyStoredKeys?.publishableKey && locallyStoredKeys) {
|
|
251
|
-
try {
|
|
252
|
-
await clerkDevelopmentCache?.run(() => this.completeOnboarding(), {
|
|
253
|
-
cacheKey: `${locallyStoredKeys.publishableKey}_complete`,
|
|
254
|
-
onSuccessStale: 1440 * 60 * 1e3
|
|
255
|
-
});
|
|
256
|
-
} catch {}
|
|
257
|
-
clerkDevelopmentCache?.log({
|
|
258
|
-
cacheKey: `${locallyStoredKeys.publishableKey}_claimed`,
|
|
259
|
-
msg: createConfirmationMessage()
|
|
260
|
-
});
|
|
261
|
-
return {
|
|
262
|
-
publishableKey,
|
|
263
|
-
secretKey,
|
|
264
|
-
claimUrl,
|
|
265
|
-
apiKeysUrl
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
|
-
if (!publishableKey && !secretKey) {
|
|
269
|
-
const keylessApp = await this.getOrCreateKeys();
|
|
270
|
-
if (keylessApp) {
|
|
271
|
-
publishableKey = keylessApp.publishableKey;
|
|
272
|
-
secretKey = keylessApp.secretKey;
|
|
273
|
-
claimUrl = keylessApp.claimUrl;
|
|
274
|
-
apiKeysUrl = keylessApp.apiKeysUrl;
|
|
275
|
-
clerkDevelopmentCache?.log({
|
|
276
|
-
cacheKey: keylessApp.publishableKey,
|
|
277
|
-
msg: createKeylessModeMessage(keylessApp)
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
} catch {}
|
|
282
|
-
return {
|
|
283
|
-
publishableKey,
|
|
284
|
-
secretKey,
|
|
285
|
-
claimUrl,
|
|
286
|
-
apiKeysUrl
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
//#endregion
|
|
293
|
-
//#region src/keyless/resolveKeysWithKeylessFallback.ts
|
|
294
|
-
/**
|
|
295
|
-
* Resolves Clerk keys, falling back to keyless mode in development if configured keys are missing.
|
|
296
|
-
*
|
|
297
|
-
* @param configuredPublishableKey - The publishable key from options or environment
|
|
298
|
-
* @param configuredSecretKey - The secret key from options or environment
|
|
299
|
-
* @param keylessService - The keyless service instance (or null if unavailable)
|
|
300
|
-
* @param canUseKeyless - Whether keyless mode is enabled in the current environment
|
|
301
|
-
* @returns The resolved keys (either configured or from keyless mode)
|
|
302
|
-
*/
|
|
303
|
-
async function resolveKeysWithKeylessFallback(configuredPublishableKey, configuredSecretKey, keylessService, canUseKeyless) {
|
|
304
|
-
let publishableKey = configuredPublishableKey;
|
|
305
|
-
let secretKey = configuredSecretKey;
|
|
306
|
-
let claimUrl;
|
|
307
|
-
let apiKeysUrl;
|
|
308
|
-
if (!canUseKeyless) return {
|
|
309
|
-
publishableKey,
|
|
310
|
-
secretKey,
|
|
311
|
-
claimUrl,
|
|
312
|
-
apiKeysUrl
|
|
313
|
-
};
|
|
314
|
-
if (!keylessService) return {
|
|
315
|
-
publishableKey,
|
|
316
|
-
secretKey,
|
|
317
|
-
claimUrl,
|
|
318
|
-
apiKeysUrl
|
|
319
|
-
};
|
|
320
|
-
try {
|
|
321
|
-
const locallyStoredKeys = keylessService.readKeys();
|
|
322
|
-
if (Boolean(configuredPublishableKey) && configuredPublishableKey === locallyStoredKeys?.publishableKey && locallyStoredKeys) {
|
|
323
|
-
try {
|
|
324
|
-
await clerkDevelopmentCache?.run(() => keylessService.completeOnboarding(), {
|
|
325
|
-
cacheKey: `${locallyStoredKeys.publishableKey}_complete`,
|
|
326
|
-
onSuccessStale: 1440 * 60 * 1e3
|
|
327
|
-
});
|
|
328
|
-
} catch {}
|
|
329
|
-
clerkDevelopmentCache?.log({
|
|
330
|
-
cacheKey: `${locallyStoredKeys.publishableKey}_claimed`,
|
|
331
|
-
msg: createConfirmationMessage()
|
|
332
|
-
});
|
|
333
|
-
return {
|
|
334
|
-
publishableKey,
|
|
335
|
-
secretKey,
|
|
336
|
-
claimUrl,
|
|
337
|
-
apiKeysUrl
|
|
338
|
-
};
|
|
339
|
-
}
|
|
340
|
-
if (!publishableKey && !secretKey) {
|
|
341
|
-
const keylessApp = await keylessService.getOrCreateKeys();
|
|
342
|
-
if (keylessApp) {
|
|
343
|
-
publishableKey = keylessApp.publishableKey;
|
|
344
|
-
secretKey = keylessApp.secretKey;
|
|
345
|
-
claimUrl = keylessApp.claimUrl;
|
|
346
|
-
apiKeysUrl = keylessApp.apiKeysUrl;
|
|
347
|
-
clerkDevelopmentCache?.log({
|
|
348
|
-
cacheKey: keylessApp.publishableKey,
|
|
349
|
-
msg: createKeylessModeMessage(keylessApp)
|
|
350
|
-
});
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
} catch {}
|
|
354
|
-
return {
|
|
355
|
-
publishableKey,
|
|
356
|
-
secretKey,
|
|
357
|
-
claimUrl,
|
|
358
|
-
apiKeysUrl
|
|
359
|
-
};
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
//#endregion
|
|
363
|
-
exports.clerkDevelopmentCache = clerkDevelopmentCache;
|
|
364
|
-
exports.createClerkDevCache = createClerkDevCache;
|
|
365
|
-
exports.createConfirmationMessage = createConfirmationMessage;
|
|
366
|
-
exports.createKeylessModeMessage = createKeylessModeMessage;
|
|
367
|
-
exports.createKeylessService = createKeylessService;
|
|
368
|
-
exports.createNodeFileStorage = createNodeFileStorage;
|
|
369
|
-
exports.resolveKeysWithKeylessFallback = resolveKeysWithKeylessFallback;
|
|
370
|
-
//# sourceMappingURL=index.js.map
|
|
2
|
+
const require_devCache = require('./devCache.js');
|
|
3
|
+
const require_nodeFileStorage = require('./nodeFileStorage.js');
|
|
4
|
+
const require_service = require('./service.js');
|
|
5
|
+
const require_resolveKeysWithKeylessFallback = require('./resolveKeysWithKeylessFallback.js');
|
|
6
|
+
|
|
7
|
+
exports.clerkDevelopmentCache = require_devCache.clerkDevelopmentCache;
|
|
8
|
+
exports.createClerkDevCache = require_devCache.createClerkDevCache;
|
|
9
|
+
exports.createConfirmationMessage = require_devCache.createConfirmationMessage;
|
|
10
|
+
exports.createKeylessModeMessage = require_devCache.createKeylessModeMessage;
|
|
11
|
+
exports.createKeylessService = require_service.createKeylessService;
|
|
12
|
+
exports.createNodeFileStorage = require_nodeFileStorage.createNodeFileStorage;
|
|
13
|
+
exports.resolveKeysWithKeylessFallback = require_resolveKeysWithKeylessFallback.resolveKeysWithKeylessFallback;
|
package/dist/keys.js
CHANGED
|
@@ -225,5 +225,4 @@ exports.isProductionFromPublishableKey = isProductionFromPublishableKey;
|
|
|
225
225
|
exports.isProductionFromSecretKey = isProductionFromSecretKey;
|
|
226
226
|
exports.isPublishableKey = isPublishableKey;
|
|
227
227
|
exports.parsePublishableKey = parsePublishableKey;
|
|
228
|
-
exports.publishableKeyFromHost = publishableKeyFromHost;
|
|
229
|
-
//# sourceMappingURL=keys.js.map
|
|
228
|
+
exports.publishableKeyFromHost = publishableKeyFromHost;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_keys = require('./keys.js');
|
|
3
|
-
const require_clerkRuntimeError = require('./
|
|
4
|
-
const
|
|
3
|
+
const require_clerkRuntimeError = require('./errors/clerkRuntimeError.js');
|
|
4
|
+
const require_errorThrower = require('./errors/errorThrower.js');
|
|
5
|
+
require('./error.js');
|
|
5
6
|
const require_loadScript = require('./loadScript.js');
|
|
6
7
|
const require_proxy = require('./proxy.js');
|
|
7
8
|
const require_url = require('./url.js');
|
|
@@ -9,7 +10,7 @@ const require_versionSelector = require('./versionSelector.js');
|
|
|
9
10
|
|
|
10
11
|
//#region src/loadClerkJsScript.ts
|
|
11
12
|
const { isDevOrStagingUrl } = require_keys.createDevOrStagingUrlCache();
|
|
12
|
-
const errorThrower =
|
|
13
|
+
const errorThrower = require_errorThrower.buildErrorThrower({ packageName: "@clerk/shared" });
|
|
13
14
|
/**
|
|
14
15
|
* Validates that window.Clerk exists and is properly initialized.
|
|
15
16
|
* This ensures we don't have false positives where the script loads but Clerk is malformed.
|
|
@@ -140,7 +141,7 @@ const clerkJSScriptUrl = (opts) => {
|
|
|
140
141
|
const clerkUIScriptUrl = (opts) => {
|
|
141
142
|
const { __internal_clerkUIUrl, __internal_clerkUIVersion, proxyUrl, domain, publishableKey } = opts;
|
|
142
143
|
if (__internal_clerkUIUrl) return __internal_clerkUIUrl;
|
|
143
|
-
const version = require_versionSelector.versionSelector(__internal_clerkUIVersion, "1.24.2
|
|
144
|
+
const version = require_versionSelector.versionSelector(__internal_clerkUIVersion, "1.24.2");
|
|
144
145
|
if (proxyUrl && require_proxy.isProxyUrlRelative(proxyUrl)) return buildRelativeProxyScriptUrl(proxyUrl, "ui", version, "ui.browser.js");
|
|
145
146
|
return `https://${buildScriptHost({
|
|
146
147
|
publishableKey,
|
|
@@ -247,5 +248,4 @@ exports.loadClerkJSScript = loadClerkJSScript;
|
|
|
247
248
|
exports.loadClerkJsScript = loadClerkJsScript;
|
|
248
249
|
exports.loadClerkUIScript = loadClerkUIScript;
|
|
249
250
|
exports.setClerkJSLoadingErrorPackageName = setClerkJSLoadingErrorPackageName;
|
|
250
|
-
exports.setClerkJsLoadingErrorPackageName = setClerkJsLoadingErrorPackageName;
|
|
251
|
-
//# sourceMappingURL=loadClerkJsScript.js.map
|
|
251
|
+
exports.setClerkJsLoadingErrorPackageName = setClerkJsLoadingErrorPackageName;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadClerkJsScript.js","names":["createDevOrStagingUrlCache","buildErrorThrower","ClerkRuntimeError","versionSelector","isProxyUrlRelative","isValidProxyUrl","proxyUrlToAbsoluteURL","parsePublishableKey","addClerkPrefix"],"sources":["../src/loadClerkJsScript.ts"],"sourcesContent":["import { buildErrorThrower, ClerkRuntimeError } from './error';\nimport { createDevOrStagingUrlCache, parsePublishableKey } from './keys';\nimport { loadScript } from './loadScript';\nimport { isProxyUrlRelative, isValidProxyUrl, proxyUrlToAbsoluteURL } from './proxy';\nimport type { SDKMetadata } from './types';\nimport { addClerkPrefix } from './url';\nimport { versionSelector } from './versionSelector';\n\nconst { isDevOrStagingUrl } = createDevOrStagingUrlCache();\n\nconst errorThrower = buildErrorThrower({ packageName: '@clerk/shared' });\n\nexport type LoadClerkJSScriptOptions = {\n publishableKey: string;\n /** @internal */\n __internal_clerkJSUrl?: string;\n /** @internal */\n __internal_clerkJSVersion?: string;\n sdkMetadata?: SDKMetadata;\n proxyUrl?: string;\n domain?: string;\n nonce?: string;\n /**\n * Timeout in milliseconds to wait for clerk-js to load before considering it failed.\n *\n * @default 15000 (15 seconds)\n */\n scriptLoadTimeout?: number;\n};\n\n/**\n * @deprecated Use `LoadClerkJSScriptOptions` instead. This alias will be removed in a future major version.\n */\nexport type LoadClerkJsScriptOptions = LoadClerkJSScriptOptions;\n\nexport type LoadClerkUIScriptOptions = {\n publishableKey: string;\n /** @internal */\n __internal_clerkUIUrl?: string;\n /** @internal */\n __internal_clerkUIVersion?: string;\n proxyUrl?: string;\n domain?: string;\n nonce?: string;\n scriptLoadTimeout?: number;\n};\n\n/**\n * Validates that window.Clerk exists and is properly initialized.\n * This ensures we don't have false positives where the script loads but Clerk is malformed.\n *\n * @returns `true` if window.Clerk exists and has the expected structure with a load method.\n */\nfunction isClerkGlobalProperlyLoaded(prop: 'Clerk' | '__internal_ClerkUICtor'): boolean {\n if (typeof window === 'undefined' || !(window as any)[prop]) {\n return false;\n }\n\n // Basic validation that window.Clerk has the expected structure\n const val = (window as any)[prop];\n return !!val;\n}\nconst isClerkProperlyLoaded = () => isClerkGlobalProperlyLoaded('Clerk');\nconst isClerkUIProperlyLoaded = () => isClerkGlobalProperlyLoaded('__internal_ClerkUICtor');\n\n/**\n * Checks if an existing script has a request error using Performance API.\n *\n * @param scriptUrl - The URL of the script to check.\n * @returns True if the script has failed to load due to a network/HTTP error.\n */\nfunction hasScriptRequestError(scriptUrl: string): boolean {\n if (typeof window === 'undefined' || !window.performance) {\n return false;\n }\n\n const entries = performance.getEntriesByName(scriptUrl, 'resource') as PerformanceResourceTiming[];\n\n if (entries.length === 0) {\n return false;\n }\n\n const scriptEntry = entries[entries.length - 1];\n\n // transferSize === 0 with responseEnd === 0 indicates network failure\n // transferSize === 0 with responseEnd > 0 might be a 4xx/5xx error or blocked request\n if (scriptEntry.transferSize === 0 && scriptEntry.decodedBodySize === 0) {\n // If there was no response at all, it's definitely an error\n if (scriptEntry.responseEnd === 0) {\n return true;\n }\n // If we got a response but no content, likely an HTTP error (4xx/5xx)\n if (scriptEntry.responseEnd > 0 && scriptEntry.responseStart > 0) {\n return true;\n }\n\n if ('responseStatus' in scriptEntry) {\n const status = (scriptEntry as any).responseStatus;\n if (status >= 400) {\n return true;\n }\n if (scriptEntry.responseStatus === 0) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Hotloads the Clerk JS script with robust failure detection.\n *\n * Uses a timeout-based approach to ensure absolute certainty about load success/failure.\n * If the script fails to load within the timeout period, or loads but doesn't create\n * a proper Clerk instance, the promise rejects with an error.\n *\n * @param opts - The options used to build the Clerk JS script URL and load the script.\n * Must include a `publishableKey` if no existing script is found.\n * @returns Promise that resolves with null if Clerk loads successfully, or rejects with an error.\n *\n * @example\n * ```typescript\n * try {\n * await loadClerkJsScript({ publishableKey: 'pk_test_...' });\n * console.log('Clerk loaded successfully');\n * } catch (error) {\n * console.error('Failed to load Clerk:', error.message);\n * }\n * ```\n */\nexport const loadClerkJSScript = async (opts?: LoadClerkJSScriptOptions): Promise<HTMLScriptElement | null> => {\n const timeout = opts?.scriptLoadTimeout ?? 15000;\n const rejectWith = (error?: Error) =>\n new ClerkRuntimeError('Failed to load Clerk JS' + (error?.message ? `, ${error.message}` : ''), {\n code: 'failed_to_load_clerk_js',\n cause: error,\n });\n\n if (isClerkProperlyLoaded()) {\n return null;\n }\n\n if (!opts?.publishableKey) {\n errorThrower.throwMissingPublishableKeyError();\n return null;\n }\n\n const scriptUrl = clerkJSScriptUrl(opts);\n const existingScript = document.querySelector<HTMLScriptElement>('script[data-clerk-js-script]');\n\n if (existingScript) {\n if (hasScriptRequestError(scriptUrl)) {\n existingScript.remove();\n } else {\n try {\n await waitForPredicateWithTimeout(timeout, isClerkProperlyLoaded, rejectWith(), existingScript);\n return null;\n } catch {\n existingScript.remove();\n }\n }\n }\n\n const loadPromise = waitForPredicateWithTimeout(timeout, isClerkProperlyLoaded, rejectWith());\n\n loadScript(scriptUrl, {\n async: true,\n crossOrigin: 'anonymous',\n nonce: opts.nonce,\n beforeLoad: applyAttributesToScript(buildClerkJSScriptAttributes(opts)),\n }).catch(error => {\n throw rejectWith(error);\n });\n\n return loadPromise;\n};\n\nexport const loadClerkUIScript = async (opts?: LoadClerkUIScriptOptions): Promise<HTMLScriptElement | null> => {\n const timeout = opts?.scriptLoadTimeout ?? 15000;\n const rejectWith = (error?: Error) =>\n new ClerkRuntimeError('Failed to load Clerk UI' + (error?.message ? `, ${error.message}` : ''), {\n code: 'failed_to_load_clerk_ui',\n cause: error,\n });\n\n if (isClerkUIProperlyLoaded()) {\n return null;\n }\n\n if (!opts?.publishableKey) {\n errorThrower.throwMissingPublishableKeyError();\n return null;\n }\n\n const scriptUrl = clerkUIScriptUrl(opts);\n const existingScript = document.querySelector<HTMLScriptElement>('script[data-clerk-ui-script]');\n\n if (existingScript) {\n if (hasScriptRequestError(scriptUrl)) {\n existingScript.remove();\n } else {\n try {\n await waitForPredicateWithTimeout(timeout, isClerkUIProperlyLoaded, rejectWith(), existingScript);\n return null;\n } catch {\n existingScript.remove();\n }\n }\n }\n\n const loadPromise = waitForPredicateWithTimeout(timeout, isClerkUIProperlyLoaded, rejectWith());\n\n loadScript(scriptUrl, {\n async: true,\n crossOrigin: 'anonymous',\n nonce: opts.nonce,\n beforeLoad: applyAttributesToScript(buildClerkUIScriptAttributes(opts)),\n }).catch(error => {\n throw rejectWith(error);\n });\n\n return loadPromise;\n};\n\nexport const clerkJSScriptUrl = (opts: LoadClerkJSScriptOptions) => {\n const { __internal_clerkJSUrl, __internal_clerkJSVersion, proxyUrl, domain, publishableKey } = opts;\n\n if (__internal_clerkJSUrl) {\n return __internal_clerkJSUrl;\n }\n\n const version = versionSelector(__internal_clerkJSVersion);\n\n if (proxyUrl && isProxyUrlRelative(proxyUrl)) {\n return buildRelativeProxyScriptUrl(proxyUrl, 'clerk-js', version, 'clerk.browser.js');\n }\n\n const scriptHost = buildScriptHost({ publishableKey, proxyUrl, domain });\n return `https://${scriptHost}/npm/@clerk/clerk-js@${version}/dist/clerk.browser.js`;\n};\n\nexport const clerkUIScriptUrl = (opts: LoadClerkUIScriptOptions) => {\n const { __internal_clerkUIUrl, __internal_clerkUIVersion, proxyUrl, domain, publishableKey } = opts;\n\n if (__internal_clerkUIUrl) {\n return __internal_clerkUIUrl;\n }\n\n const version = versionSelector(__internal_clerkUIVersion, UI_PACKAGE_VERSION);\n\n if (proxyUrl && isProxyUrlRelative(proxyUrl)) {\n return buildRelativeProxyScriptUrl(proxyUrl, 'ui', version, 'ui.browser.js');\n }\n\n const scriptHost = buildScriptHost({ publishableKey, proxyUrl, domain });\n return `https://${scriptHost}/npm/@clerk/ui@${version}/dist/ui.browser.js`;\n};\n\nexport const buildClerkJSScriptAttributes = (options: LoadClerkJSScriptOptions) => {\n const obj: Record<string, string> = {};\n\n if (options.publishableKey) {\n obj['data-clerk-publishable-key'] = options.publishableKey;\n }\n\n if (options.proxyUrl) {\n obj['data-clerk-proxy-url'] = options.proxyUrl;\n }\n\n if (options.domain) {\n obj['data-clerk-domain'] = options.domain;\n }\n\n if (options.nonce) {\n obj.nonce = options.nonce;\n }\n\n return obj;\n};\n\nexport const buildClerkUIScriptAttributes = (options: LoadClerkUIScriptOptions) => {\n // TODO @nikos do we need this?\n return buildClerkJSScriptAttributes(options);\n};\n\nconst applyAttributesToScript = (attributes: Record<string, string>) => (script: HTMLScriptElement) => {\n for (const attribute in attributes) {\n script.setAttribute(attribute, attributes[attribute]);\n }\n};\n\nconst stripTrailingSlashes = (value: string) => {\n while (value.endsWith('/')) {\n value = value.slice(0, -1);\n }\n\n return value;\n};\n\nconst buildRelativeProxyScriptUrl = (proxyUrl: string, packageName: string, version: string, fileName: string) => {\n return `${stripTrailingSlashes(proxyUrl)}/npm/@clerk/${packageName}@${version}/dist/${fileName}`;\n};\n\nexport const buildScriptHost = (opts: { publishableKey: string; proxyUrl?: string; domain?: string }) => {\n const { proxyUrl, domain, publishableKey } = opts;\n\n if (!!proxyUrl && isValidProxyUrl(proxyUrl)) {\n const resolvedProxyUrl = proxyUrlToAbsoluteURL(proxyUrl);\n\n if (isProxyUrlRelative(resolvedProxyUrl)) {\n return parsePublishableKey(publishableKey)?.frontendApi || '';\n }\n\n return resolvedProxyUrl.replace(/http(s)?:\\/\\//, '');\n } else if (domain && !isDevOrStagingUrl(parsePublishableKey(publishableKey)?.frontendApi || '')) {\n return addClerkPrefix(domain);\n } else {\n return parsePublishableKey(publishableKey)?.frontendApi || '';\n }\n};\n\nfunction waitForPredicateWithTimeout(\n timeoutMs: number,\n predicate: () => boolean,\n rejectWith: Error,\n existingScript?: HTMLScriptElement,\n): Promise<HTMLScriptElement | null> {\n return new Promise((resolve, reject) => {\n let resolved = false;\n\n const cleanup = (timeoutId: ReturnType<typeof setTimeout>, pollInterval: ReturnType<typeof setInterval>) => {\n clearTimeout(timeoutId);\n clearInterval(pollInterval);\n };\n\n // Bail out early if the script fails to load, instead of waiting for the entire timeout\n existingScript?.addEventListener('error', () => {\n cleanup(timeoutId, pollInterval);\n reject(rejectWith);\n });\n\n const checkAndResolve = () => {\n if (resolved) {\n return;\n }\n\n if (predicate()) {\n resolved = true;\n cleanup(timeoutId, pollInterval);\n resolve(null);\n }\n };\n\n const handleTimeout = () => {\n if (resolved) {\n return;\n }\n\n resolved = true;\n cleanup(timeoutId, pollInterval);\n\n if (!predicate()) {\n reject(rejectWith);\n } else {\n resolve(null);\n }\n };\n\n const timeoutId = setTimeout(handleTimeout, timeoutMs);\n\n checkAndResolve();\n\n const pollInterval = setInterval(() => {\n if (resolved) {\n clearInterval(pollInterval);\n return;\n }\n checkAndResolve();\n }, 100);\n });\n}\n\nexport function setClerkJSLoadingErrorPackageName(packageName: string) {\n errorThrower.setPackageName({ packageName });\n}\n\n/**\n * @deprecated Use `loadClerkJSScript` instead. This alias will be removed in a future major version.\n */\nexport const loadClerkJsScript = loadClerkJSScript;\n\n/**\n * @deprecated Use `clerkJSScriptUrl` instead. This alias will be removed in a future major version.\n */\nexport const clerkJsScriptUrl = clerkJSScriptUrl;\n\n/**\n * @deprecated Use `buildClerkJSScriptAttributes` instead. This alias will be removed in a future major version.\n */\nexport const buildClerkJsScriptAttributes = buildClerkJSScriptAttributes;\n\n/**\n * @deprecated Use `setClerkJSLoadingErrorPackageName` instead. This alias will be removed in a future major version.\n */\nexport const setClerkJsLoadingErrorPackageName = setClerkJSLoadingErrorPackageName;\n"],"mappings":";;;;;;;;;;AAQA,MAAM,EAAE,sBAAsBA,wCAA2B;AAEzD,MAAM,eAAeC,gCAAkB,EAAE,aAAa,gBAAgB,CAAC;;;;;;;AA2CvE,SAAS,4BAA4B,MAAmD;CACtF,IAAI,OAAO,WAAW,eAAe,CAAE,OAAe,OACpD,OAAO;CAKT,OAAO,CAAC,CADK,OAAe;AAE9B;AACA,MAAM,8BAA8B,4BAA4B,OAAO;AACvE,MAAM,gCAAgC,4BAA4B,wBAAwB;;;;;;;AAQ1F,SAAS,sBAAsB,WAA4B;CACzD,IAAI,OAAO,WAAW,eAAe,CAAC,OAAO,aAC3C,OAAO;CAGT,MAAM,UAAU,YAAY,iBAAiB,WAAW,UAAU;CAElE,IAAI,QAAQ,WAAW,GACrB,OAAO;CAGT,MAAM,cAAc,QAAQ,QAAQ,SAAS;CAI7C,IAAI,YAAY,iBAAiB,KAAK,YAAY,oBAAoB,GAAG;EAEvE,IAAI,YAAY,gBAAgB,GAC9B,OAAO;EAGT,IAAI,YAAY,cAAc,KAAK,YAAY,gBAAgB,GAC7D,OAAO;EAGT,IAAI,oBAAoB,aAAa;GAEnC,IADgB,YAAoB,kBACtB,KACZ,OAAO;GAET,IAAI,YAAY,mBAAmB,GACjC,OAAO;EAEX;CACF;CAEA,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,oBAAoB,OAAO,SAAuE;CAC7G,MAAM,UAAU,MAAM,qBAAqB;CAC3C,MAAM,cAAc,UAClB,IAAIC,4CAAkB,6BAA6B,OAAO,UAAU,KAAK,MAAM,YAAY,KAAK;EAC9F,MAAM;EACN,OAAO;CACT,CAAC;CAEH,IAAI,sBAAsB,GACxB,OAAO;CAGT,IAAI,CAAC,MAAM,gBAAgB;EACzB,aAAa,gCAAgC;EAC7C,OAAO;CACT;CAEA,MAAM,YAAY,iBAAiB,IAAI;CACvC,MAAM,iBAAiB,SAAS,cAAiC,8BAA8B;CAE/F,IAAI,gBACF,IAAI,sBAAsB,SAAS,GACjC,eAAe,OAAO;MAEtB,IAAI;EACF,MAAM,4BAA4B,SAAS,uBAAuB,WAAW,GAAG,cAAc;EAC9F,OAAO;CACT,QAAQ;EACN,eAAe,OAAO;CACxB;CAIJ,MAAM,cAAc,4BAA4B,SAAS,uBAAuB,WAAW,CAAC;CAE5F,8BAAW,WAAW;EACpB,OAAO;EACP,aAAa;EACb,OAAO,KAAK;EACZ,YAAY,wBAAwB,6BAA6B,IAAI,CAAC;CACxE,CAAC,CAAC,CAAC,OAAM,UAAS;EAChB,MAAM,WAAW,KAAK;CACxB,CAAC;CAED,OAAO;AACT;AAEA,MAAa,oBAAoB,OAAO,SAAuE;CAC7G,MAAM,UAAU,MAAM,qBAAqB;CAC3C,MAAM,cAAc,UAClB,IAAIA,4CAAkB,6BAA6B,OAAO,UAAU,KAAK,MAAM,YAAY,KAAK;EAC9F,MAAM;EACN,OAAO;CACT,CAAC;CAEH,IAAI,wBAAwB,GAC1B,OAAO;CAGT,IAAI,CAAC,MAAM,gBAAgB;EACzB,aAAa,gCAAgC;EAC7C,OAAO;CACT;CAEA,MAAM,YAAY,iBAAiB,IAAI;CACvC,MAAM,iBAAiB,SAAS,cAAiC,8BAA8B;CAE/F,IAAI,gBACF,IAAI,sBAAsB,SAAS,GACjC,eAAe,OAAO;MAEtB,IAAI;EACF,MAAM,4BAA4B,SAAS,yBAAyB,WAAW,GAAG,cAAc;EAChG,OAAO;CACT,QAAQ;EACN,eAAe,OAAO;CACxB;CAIJ,MAAM,cAAc,4BAA4B,SAAS,yBAAyB,WAAW,CAAC;CAE9F,8BAAW,WAAW;EACpB,OAAO;EACP,aAAa;EACb,OAAO,KAAK;EACZ,YAAY,wBAAwB,6BAA6B,IAAI,CAAC;CACxE,CAAC,CAAC,CAAC,OAAM,UAAS;EAChB,MAAM,WAAW,KAAK;CACxB,CAAC;CAED,OAAO;AACT;AAEA,MAAa,oBAAoB,SAAmC;CAClE,MAAM,EAAE,uBAAuB,2BAA2B,UAAU,QAAQ,mBAAmB;CAE/F,IAAI,uBACF,OAAO;CAGT,MAAM,UAAUC,wCAAgB,yBAAyB;CAEzD,IAAI,YAAYC,iCAAmB,QAAQ,GACzC,OAAO,4BAA4B,UAAU,YAAY,SAAS,kBAAkB;CAItF,OAAO,WADY,gBAAgB;EAAE;EAAgB;EAAU;CAAO,CAC3C,EAAE,uBAAuB,QAAQ;AAC9D;AAEA,MAAa,oBAAoB,SAAmC;CAClE,MAAM,EAAE,uBAAuB,2BAA2B,UAAU,QAAQ,mBAAmB;CAE/F,IAAI,uBACF,OAAO;CAGT,MAAM,UAAUD,wCAAgB,4DAA6C;CAE7E,IAAI,YAAYC,iCAAmB,QAAQ,GACzC,OAAO,4BAA4B,UAAU,MAAM,SAAS,eAAe;CAI7E,OAAO,WADY,gBAAgB;EAAE;EAAgB;EAAU;CAAO,CAC3C,EAAE,iBAAiB,QAAQ;AACxD;AAEA,MAAa,gCAAgC,YAAsC;CACjF,MAAM,MAA8B,CAAC;CAErC,IAAI,QAAQ,gBACV,IAAI,gCAAgC,QAAQ;CAG9C,IAAI,QAAQ,UACV,IAAI,0BAA0B,QAAQ;CAGxC,IAAI,QAAQ,QACV,IAAI,uBAAuB,QAAQ;CAGrC,IAAI,QAAQ,OACV,IAAI,QAAQ,QAAQ;CAGtB,OAAO;AACT;AAEA,MAAa,gCAAgC,YAAsC;CAEjF,OAAO,6BAA6B,OAAO;AAC7C;AAEA,MAAM,2BAA2B,gBAAwC,WAA8B;CACrG,KAAK,MAAM,aAAa,YACtB,OAAO,aAAa,WAAW,WAAW,UAAU;AAExD;AAEA,MAAM,wBAAwB,UAAkB;CAC9C,OAAO,MAAM,SAAS,GAAG,GACvB,QAAQ,MAAM,MAAM,GAAG,EAAE;CAG3B,OAAO;AACT;AAEA,MAAM,+BAA+B,UAAkB,aAAqB,SAAiB,aAAqB;CAChH,OAAO,GAAG,qBAAqB,QAAQ,EAAE,cAAc,YAAY,GAAG,QAAQ,QAAQ;AACxF;AAEA,MAAa,mBAAmB,SAAyE;CACvG,MAAM,EAAE,UAAU,QAAQ,mBAAmB;CAE7C,IAAI,CAAC,CAAC,YAAYC,8BAAgB,QAAQ,GAAG;EAC3C,MAAM,mBAAmBC,oCAAsB,QAAQ;EAEvD,IAAIF,iCAAmB,gBAAgB,GACrC,OAAOG,iCAAoB,cAAc,CAAC,EAAE,eAAe;EAG7D,OAAO,iBAAiB,QAAQ,iBAAiB,EAAE;CACrD,OAAO,IAAI,UAAU,CAAC,kBAAkBA,iCAAoB,cAAc,CAAC,EAAE,eAAe,EAAE,GAC5F,OAAOC,2BAAe,MAAM;MAE5B,OAAOD,iCAAoB,cAAc,CAAC,EAAE,eAAe;AAE/D;AAEA,SAAS,4BACP,WACA,WACA,YACA,gBACmC;CACnC,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,IAAI,WAAW;EAEf,MAAM,WAAW,WAA0C,iBAAiD;GAC1G,aAAa,SAAS;GACtB,cAAc,YAAY;EAC5B;EAGA,gBAAgB,iBAAiB,eAAe;GAC9C,QAAQ,WAAW,YAAY;GAC/B,OAAO,UAAU;EACnB,CAAC;EAED,MAAM,wBAAwB;GAC5B,IAAI,UACF;GAGF,IAAI,UAAU,GAAG;IACf,WAAW;IACX,QAAQ,WAAW,YAAY;IAC/B,QAAQ,IAAI;GACd;EACF;EAEA,MAAM,sBAAsB;GAC1B,IAAI,UACF;GAGF,WAAW;GACX,QAAQ,WAAW,YAAY;GAE/B,IAAI,CAAC,UAAU,GACb,OAAO,UAAU;QAEjB,QAAQ,IAAI;EAEhB;EAEA,MAAM,YAAY,WAAW,eAAe,SAAS;EAErD,gBAAgB;EAEhB,MAAM,eAAe,kBAAkB;GACrC,IAAI,UAAU;IACZ,cAAc,YAAY;IAC1B;GACF;GACA,gBAAgB;EAClB,GAAG,GAAG;CACR,CAAC;AACH;AAEA,SAAgB,kCAAkC,aAAqB;CACrE,aAAa,eAAe,EAAE,YAAY,CAAC;AAC7C;;;;AAKA,MAAa,oBAAoB;;;;AAKjC,MAAa,mBAAmB;;;;AAKhC,MAAa,+BAA+B;;;;AAK5C,MAAa,oCAAoC"}
|
|
1
|
+
{"version":3,"file":"loadClerkJsScript.js","names":["createDevOrStagingUrlCache","buildErrorThrower","ClerkRuntimeError","versionSelector","isProxyUrlRelative","isValidProxyUrl","proxyUrlToAbsoluteURL","parsePublishableKey","addClerkPrefix"],"sources":["../src/loadClerkJsScript.ts"],"sourcesContent":["import { buildErrorThrower, ClerkRuntimeError } from './error';\nimport { createDevOrStagingUrlCache, parsePublishableKey } from './keys';\nimport { loadScript } from './loadScript';\nimport { isProxyUrlRelative, isValidProxyUrl, proxyUrlToAbsoluteURL } from './proxy';\nimport type { SDKMetadata } from './types';\nimport { addClerkPrefix } from './url';\nimport { versionSelector } from './versionSelector';\n\nconst { isDevOrStagingUrl } = createDevOrStagingUrlCache();\n\nconst errorThrower = buildErrorThrower({ packageName: '@clerk/shared' });\n\nexport type LoadClerkJSScriptOptions = {\n publishableKey: string;\n /** @internal */\n __internal_clerkJSUrl?: string;\n /** @internal */\n __internal_clerkJSVersion?: string;\n sdkMetadata?: SDKMetadata;\n proxyUrl?: string;\n domain?: string;\n nonce?: string;\n /**\n * Timeout in milliseconds to wait for clerk-js to load before considering it failed.\n *\n * @default 15000 (15 seconds)\n */\n scriptLoadTimeout?: number;\n};\n\n/**\n * @deprecated Use `LoadClerkJSScriptOptions` instead. This alias will be removed in a future major version.\n */\nexport type LoadClerkJsScriptOptions = LoadClerkJSScriptOptions;\n\nexport type LoadClerkUIScriptOptions = {\n publishableKey: string;\n /** @internal */\n __internal_clerkUIUrl?: string;\n /** @internal */\n __internal_clerkUIVersion?: string;\n proxyUrl?: string;\n domain?: string;\n nonce?: string;\n scriptLoadTimeout?: number;\n};\n\n/**\n * Validates that window.Clerk exists and is properly initialized.\n * This ensures we don't have false positives where the script loads but Clerk is malformed.\n *\n * @returns `true` if window.Clerk exists and has the expected structure with a load method.\n */\nfunction isClerkGlobalProperlyLoaded(prop: 'Clerk' | '__internal_ClerkUICtor'): boolean {\n if (typeof window === 'undefined' || !(window as any)[prop]) {\n return false;\n }\n\n // Basic validation that window.Clerk has the expected structure\n const val = (window as any)[prop];\n return !!val;\n}\nconst isClerkProperlyLoaded = () => isClerkGlobalProperlyLoaded('Clerk');\nconst isClerkUIProperlyLoaded = () => isClerkGlobalProperlyLoaded('__internal_ClerkUICtor');\n\n/**\n * Checks if an existing script has a request error using Performance API.\n *\n * @param scriptUrl - The URL of the script to check.\n * @returns True if the script has failed to load due to a network/HTTP error.\n */\nfunction hasScriptRequestError(scriptUrl: string): boolean {\n if (typeof window === 'undefined' || !window.performance) {\n return false;\n }\n\n const entries = performance.getEntriesByName(scriptUrl, 'resource') as PerformanceResourceTiming[];\n\n if (entries.length === 0) {\n return false;\n }\n\n const scriptEntry = entries[entries.length - 1];\n\n // transferSize === 0 with responseEnd === 0 indicates network failure\n // transferSize === 0 with responseEnd > 0 might be a 4xx/5xx error or blocked request\n if (scriptEntry.transferSize === 0 && scriptEntry.decodedBodySize === 0) {\n // If there was no response at all, it's definitely an error\n if (scriptEntry.responseEnd === 0) {\n return true;\n }\n // If we got a response but no content, likely an HTTP error (4xx/5xx)\n if (scriptEntry.responseEnd > 0 && scriptEntry.responseStart > 0) {\n return true;\n }\n\n if ('responseStatus' in scriptEntry) {\n const status = (scriptEntry as any).responseStatus;\n if (status >= 400) {\n return true;\n }\n if (scriptEntry.responseStatus === 0) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Hotloads the Clerk JS script with robust failure detection.\n *\n * Uses a timeout-based approach to ensure absolute certainty about load success/failure.\n * If the script fails to load within the timeout period, or loads but doesn't create\n * a proper Clerk instance, the promise rejects with an error.\n *\n * @param opts - The options used to build the Clerk JS script URL and load the script.\n * Must include a `publishableKey` if no existing script is found.\n * @returns Promise that resolves with null if Clerk loads successfully, or rejects with an error.\n *\n * @example\n * ```typescript\n * try {\n * await loadClerkJsScript({ publishableKey: 'pk_test_...' });\n * console.log('Clerk loaded successfully');\n * } catch (error) {\n * console.error('Failed to load Clerk:', error.message);\n * }\n * ```\n */\nexport const loadClerkJSScript = async (opts?: LoadClerkJSScriptOptions): Promise<HTMLScriptElement | null> => {\n const timeout = opts?.scriptLoadTimeout ?? 15000;\n const rejectWith = (error?: Error) =>\n new ClerkRuntimeError('Failed to load Clerk JS' + (error?.message ? `, ${error.message}` : ''), {\n code: 'failed_to_load_clerk_js',\n cause: error,\n });\n\n if (isClerkProperlyLoaded()) {\n return null;\n }\n\n if (!opts?.publishableKey) {\n errorThrower.throwMissingPublishableKeyError();\n return null;\n }\n\n const scriptUrl = clerkJSScriptUrl(opts);\n const existingScript = document.querySelector<HTMLScriptElement>('script[data-clerk-js-script]');\n\n if (existingScript) {\n if (hasScriptRequestError(scriptUrl)) {\n existingScript.remove();\n } else {\n try {\n await waitForPredicateWithTimeout(timeout, isClerkProperlyLoaded, rejectWith(), existingScript);\n return null;\n } catch {\n existingScript.remove();\n }\n }\n }\n\n const loadPromise = waitForPredicateWithTimeout(timeout, isClerkProperlyLoaded, rejectWith());\n\n loadScript(scriptUrl, {\n async: true,\n crossOrigin: 'anonymous',\n nonce: opts.nonce,\n beforeLoad: applyAttributesToScript(buildClerkJSScriptAttributes(opts)),\n }).catch(error => {\n throw rejectWith(error);\n });\n\n return loadPromise;\n};\n\nexport const loadClerkUIScript = async (opts?: LoadClerkUIScriptOptions): Promise<HTMLScriptElement | null> => {\n const timeout = opts?.scriptLoadTimeout ?? 15000;\n const rejectWith = (error?: Error) =>\n new ClerkRuntimeError('Failed to load Clerk UI' + (error?.message ? `, ${error.message}` : ''), {\n code: 'failed_to_load_clerk_ui',\n cause: error,\n });\n\n if (isClerkUIProperlyLoaded()) {\n return null;\n }\n\n if (!opts?.publishableKey) {\n errorThrower.throwMissingPublishableKeyError();\n return null;\n }\n\n const scriptUrl = clerkUIScriptUrl(opts);\n const existingScript = document.querySelector<HTMLScriptElement>('script[data-clerk-ui-script]');\n\n if (existingScript) {\n if (hasScriptRequestError(scriptUrl)) {\n existingScript.remove();\n } else {\n try {\n await waitForPredicateWithTimeout(timeout, isClerkUIProperlyLoaded, rejectWith(), existingScript);\n return null;\n } catch {\n existingScript.remove();\n }\n }\n }\n\n const loadPromise = waitForPredicateWithTimeout(timeout, isClerkUIProperlyLoaded, rejectWith());\n\n loadScript(scriptUrl, {\n async: true,\n crossOrigin: 'anonymous',\n nonce: opts.nonce,\n beforeLoad: applyAttributesToScript(buildClerkUIScriptAttributes(opts)),\n }).catch(error => {\n throw rejectWith(error);\n });\n\n return loadPromise;\n};\n\nexport const clerkJSScriptUrl = (opts: LoadClerkJSScriptOptions) => {\n const { __internal_clerkJSUrl, __internal_clerkJSVersion, proxyUrl, domain, publishableKey } = opts;\n\n if (__internal_clerkJSUrl) {\n return __internal_clerkJSUrl;\n }\n\n const version = versionSelector(__internal_clerkJSVersion);\n\n if (proxyUrl && isProxyUrlRelative(proxyUrl)) {\n return buildRelativeProxyScriptUrl(proxyUrl, 'clerk-js', version, 'clerk.browser.js');\n }\n\n const scriptHost = buildScriptHost({ publishableKey, proxyUrl, domain });\n return `https://${scriptHost}/npm/@clerk/clerk-js@${version}/dist/clerk.browser.js`;\n};\n\nexport const clerkUIScriptUrl = (opts: LoadClerkUIScriptOptions) => {\n const { __internal_clerkUIUrl, __internal_clerkUIVersion, proxyUrl, domain, publishableKey } = opts;\n\n if (__internal_clerkUIUrl) {\n return __internal_clerkUIUrl;\n }\n\n const version = versionSelector(__internal_clerkUIVersion, UI_PACKAGE_VERSION);\n\n if (proxyUrl && isProxyUrlRelative(proxyUrl)) {\n return buildRelativeProxyScriptUrl(proxyUrl, 'ui', version, 'ui.browser.js');\n }\n\n const scriptHost = buildScriptHost({ publishableKey, proxyUrl, domain });\n return `https://${scriptHost}/npm/@clerk/ui@${version}/dist/ui.browser.js`;\n};\n\nexport const buildClerkJSScriptAttributes = (options: LoadClerkJSScriptOptions) => {\n const obj: Record<string, string> = {};\n\n if (options.publishableKey) {\n obj['data-clerk-publishable-key'] = options.publishableKey;\n }\n\n if (options.proxyUrl) {\n obj['data-clerk-proxy-url'] = options.proxyUrl;\n }\n\n if (options.domain) {\n obj['data-clerk-domain'] = options.domain;\n }\n\n if (options.nonce) {\n obj.nonce = options.nonce;\n }\n\n return obj;\n};\n\nexport const buildClerkUIScriptAttributes = (options: LoadClerkUIScriptOptions) => {\n // TODO @nikos do we need this?\n return buildClerkJSScriptAttributes(options);\n};\n\nconst applyAttributesToScript = (attributes: Record<string, string>) => (script: HTMLScriptElement) => {\n for (const attribute in attributes) {\n script.setAttribute(attribute, attributes[attribute]);\n }\n};\n\nconst stripTrailingSlashes = (value: string) => {\n while (value.endsWith('/')) {\n value = value.slice(0, -1);\n }\n\n return value;\n};\n\nconst buildRelativeProxyScriptUrl = (proxyUrl: string, packageName: string, version: string, fileName: string) => {\n return `${stripTrailingSlashes(proxyUrl)}/npm/@clerk/${packageName}@${version}/dist/${fileName}`;\n};\n\nexport const buildScriptHost = (opts: { publishableKey: string; proxyUrl?: string; domain?: string }) => {\n const { proxyUrl, domain, publishableKey } = opts;\n\n if (!!proxyUrl && isValidProxyUrl(proxyUrl)) {\n const resolvedProxyUrl = proxyUrlToAbsoluteURL(proxyUrl);\n\n if (isProxyUrlRelative(resolvedProxyUrl)) {\n return parsePublishableKey(publishableKey)?.frontendApi || '';\n }\n\n return resolvedProxyUrl.replace(/http(s)?:\\/\\//, '');\n } else if (domain && !isDevOrStagingUrl(parsePublishableKey(publishableKey)?.frontendApi || '')) {\n return addClerkPrefix(domain);\n } else {\n return parsePublishableKey(publishableKey)?.frontendApi || '';\n }\n};\n\nfunction waitForPredicateWithTimeout(\n timeoutMs: number,\n predicate: () => boolean,\n rejectWith: Error,\n existingScript?: HTMLScriptElement,\n): Promise<HTMLScriptElement | null> {\n return new Promise((resolve, reject) => {\n let resolved = false;\n\n const cleanup = (timeoutId: ReturnType<typeof setTimeout>, pollInterval: ReturnType<typeof setInterval>) => {\n clearTimeout(timeoutId);\n clearInterval(pollInterval);\n };\n\n // Bail out early if the script fails to load, instead of waiting for the entire timeout\n existingScript?.addEventListener('error', () => {\n cleanup(timeoutId, pollInterval);\n reject(rejectWith);\n });\n\n const checkAndResolve = () => {\n if (resolved) {\n return;\n }\n\n if (predicate()) {\n resolved = true;\n cleanup(timeoutId, pollInterval);\n resolve(null);\n }\n };\n\n const handleTimeout = () => {\n if (resolved) {\n return;\n }\n\n resolved = true;\n cleanup(timeoutId, pollInterval);\n\n if (!predicate()) {\n reject(rejectWith);\n } else {\n resolve(null);\n }\n };\n\n const timeoutId = setTimeout(handleTimeout, timeoutMs);\n\n checkAndResolve();\n\n const pollInterval = setInterval(() => {\n if (resolved) {\n clearInterval(pollInterval);\n return;\n }\n checkAndResolve();\n }, 100);\n });\n}\n\nexport function setClerkJSLoadingErrorPackageName(packageName: string) {\n errorThrower.setPackageName({ packageName });\n}\n\n/**\n * @deprecated Use `loadClerkJSScript` instead. This alias will be removed in a future major version.\n */\nexport const loadClerkJsScript = loadClerkJSScript;\n\n/**\n * @deprecated Use `clerkJSScriptUrl` instead. This alias will be removed in a future major version.\n */\nexport const clerkJsScriptUrl = clerkJSScriptUrl;\n\n/**\n * @deprecated Use `buildClerkJSScriptAttributes` instead. This alias will be removed in a future major version.\n */\nexport const buildClerkJsScriptAttributes = buildClerkJSScriptAttributes;\n\n/**\n * @deprecated Use `setClerkJSLoadingErrorPackageName` instead. This alias will be removed in a future major version.\n */\nexport const setClerkJsLoadingErrorPackageName = setClerkJSLoadingErrorPackageName;\n"],"mappings":"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"}
|
|
@@ -139,7 +139,7 @@ const clerkJSScriptUrl = (opts) => {
|
|
|
139
139
|
const clerkUIScriptUrl = (opts) => {
|
|
140
140
|
const { __internal_clerkUIUrl, __internal_clerkUIVersion, proxyUrl, domain, publishableKey } = opts;
|
|
141
141
|
if (__internal_clerkUIUrl) return __internal_clerkUIUrl;
|
|
142
|
-
const version = versionSelector(__internal_clerkUIVersion, "1.24.2
|
|
142
|
+
const version = versionSelector(__internal_clerkUIVersion, "1.24.2");
|
|
143
143
|
if (proxyUrl && isProxyUrlRelative(proxyUrl)) return buildRelativeProxyScriptUrl(proxyUrl, "ui", version, "ui.browser.js");
|
|
144
144
|
return `https://${buildScriptHost({
|
|
145
145
|
publishableKey,
|