@clerk/shared
Version:
Internal package utils used by the Clerk SDKs
1,185 lines (1,160 loc) • 35.8 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var src_exports = {};
__export(src_exports, {
ClerkAPIResponseError: () => ClerkAPIResponseError,
ClerkRuntimeError: () => ClerkRuntimeError,
EmailLinkError: () => EmailLinkError,
EmailLinkErrorCode: () => EmailLinkErrorCode,
LocalStorageBroadcastChannel: () => LocalStorageBroadcastChannel,
MagicLinkError: () => MagicLinkError,
MagicLinkErrorCode: () => MagicLinkErrorCode,
Poller: () => Poller,
addClerkPrefix: () => addClerkPrefix,
addYears: () => addYears,
buildErrorThrower: () => buildErrorThrower,
buildPublishableKey: () => buildPublishableKey,
callWithRetry: () => callWithRetry,
camelToSnake: () => camelToSnake,
colorToSameTypeString: () => colorToSameTypeString,
createDeferredPromise: () => createDeferredPromise,
createDevOrStagingUrlCache: () => createDevOrStagingUrlCache,
createWorkerTimers: () => createWorkerTimers,
dateTo12HourTime: () => dateTo12HourTime,
deepCamelToSnake: () => deepCamelToSnake,
deepSnakeToCamel: () => deepSnakeToCamel,
deprecated: () => deprecated,
deprecatedObjectProperty: () => deprecatedObjectProperty,
deprecatedProperty: () => deprecatedProperty,
differenceInCalendarDays: () => differenceInCalendarDays,
extension: () => extension,
formatRelative: () => formatRelative,
getClerkJsMajorVersionOrTag: () => getClerkJsMajorVersionOrTag,
getRequestUrl: () => getRequestUrl,
getScriptUrl: () => getScriptUrl,
handleValueOrFn: () => handleValueOrFn,
hasAlpha: () => hasAlpha,
hexStringToRgbaColor: () => hexStringToRgbaColor,
inBrowser: () => inBrowser,
is4xxError: () => is4xxError,
isBrowserOnline: () => isBrowserOnline,
isClerkAPIResponseError: () => isClerkAPIResponseError,
isClerkRuntimeError: () => isClerkRuntimeError,
isDevelopmentEnvironment: () => isDevelopmentEnvironment,
isDevelopmentFromApiKey: () => isDevelopmentFromApiKey,
isEmailLinkError: () => isEmailLinkError,
isHSLColor: () => isHSLColor,
isHttpOrHttps: () => isHttpOrHttps,
isIPV4Address: () => isIPV4Address,
isKnownError: () => isKnownError,
isLegacyFrontendApiKey: () => isLegacyFrontendApiKey,
isMagicLinkError: () => isMagicLinkError,
isMetamaskError: () => isMetamaskError,
isNetworkError: () => isNetworkError,
isProductionEnvironment: () => isProductionEnvironment,
isProductionFromApiKey: () => isProductionFromApiKey,
isProxyUrlRelative: () => isProxyUrlRelative,
isPublishableKey: () => isPublishableKey,
isRGBColor: () => isRGBColor,
isStaging: () => isStaging,
isTestEnvironment: () => isTestEnvironment,
isTransparent: () => isTransparent,
isUnauthorizedError: () => isUnauthorizedError,
isValidBrowser: () => isValidBrowser,
isValidBrowserOnline: () => isValidBrowserOnline,
isValidHexString: () => isValidHexString,
isValidHslaString: () => isValidHslaString,
isValidProxyUrl: () => isValidProxyUrl,
isValidRgbaString: () => isValidRgbaString,
isomorphicAtob: () => isomorphicAtob,
loadScript: () => loadScript,
logErrorInDevMode: () => logErrorInDevMode,
noop: () => noop,
normalizeDate: () => normalizeDate,
parseError: () => parseError,
parseErrors: () => parseErrors,
parsePublishableKey: () => parsePublishableKey,
parseSearchParams: () => parseSearchParams,
proxyUrlToAbsoluteURL: () => proxyUrlToAbsoluteURL,
readJSONFile: () => readJSONFile,
runWithExponentialBackOff: () => runWithExponentialBackOff,
snakeToCamel: () => snakeToCamel,
stringToHslaColor: () => stringToHslaColor,
stringToSameTypeColor: () => stringToSameTypeColor,
stripScheme: () => stripScheme,
titleize: () => titleize,
toSentence: () => toSentence,
userAgentIsRobot: () => userAgentIsRobot
});
module.exports = __toCommonJS(src_exports);
// src/utils/noop.ts
var noop = (..._args) => {
};
// src/utils/createDeferredPromise.ts
var createDeferredPromise = () => {
let resolve = noop;
let reject = noop;
const promise = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
return { promise, resolve, reject };
};
// src/utils/instance.ts
function isStaging(frontendApi) {
return frontendApi.endsWith(".lclstage.dev") || frontendApi.endsWith(".stgstage.dev") || frontendApi.endsWith(".clerkstage.dev") || frontendApi.endsWith(".accountsstage.dev");
}
// src/utils/runtimeEnvironment.ts
var isDevelopmentEnvironment = () => {
try {
return process.env.NODE_ENV === "development";
} catch (err) {
}
return false;
};
var isTestEnvironment = () => {
try {
return process.env.NODE_ENV === "test";
} catch (err) {
}
return false;
};
var isProductionEnvironment = () => {
try {
return process.env.NODE_ENV === "production";
} catch (err) {
}
return false;
};
// src/utils/runWithExponentialBackOff.ts
var defaultOptions = {
firstDelay: 125,
maxDelay: 0,
timeMultiple: 2,
shouldRetry: () => true
};
var sleep = async (ms) => new Promise((s) => setTimeout(s, ms));
var createExponentialDelayAsyncFn = (opts) => {
let timesCalled = 0;
const calculateDelayInMs = () => {
const constant = opts.firstDelay;
const base = opts.timeMultiple;
const delay = constant * Math.pow(base, timesCalled);
return Math.min(opts.maxDelay || delay, delay);
};
return async () => {
await sleep(calculateDelayInMs());
timesCalled++;
};
};
var runWithExponentialBackOff = async (callback, options = {}) => {
let iterationsCount = 0;
const { shouldRetry, firstDelay, maxDelay, timeMultiple } = {
...defaultOptions,
...options
};
const delay = createExponentialDelayAsyncFn({ firstDelay, maxDelay, timeMultiple });
while (true) {
try {
return await callback();
} catch (e) {
iterationsCount++;
if (!shouldRetry(e, iterationsCount)) {
throw e;
}
await delay();
}
}
};
// src/utils/logErrorInDevMode.ts
var logErrorInDevMode = (message) => {
if (isDevelopmentEnvironment()) {
console.error(message);
}
};
// src/workerTimers/workerTimers.worker.ts
var workerTimers_worker_default = 'const respond=r=>{self.postMessage(r)},workerToTabIds={};self.addEventListener("message",r=>{const e=r.data;switch(e.type){case"setTimeout":workerToTabIds[e.id]=setTimeout(()=>{respond({id:e.id})},e.ms);break;case"clearTimeout":workerToTabIds[e.id]&&(clearTimeout(workerToTabIds[e.id]),delete workerToTabIds[e.id]);break;case"setInterval":workerToTabIds[e.id]=setInterval(()=>{respond({id:e.id})},e.ms);break;case"clearInterval":workerToTabIds[e.id]&&(clearInterval(workerToTabIds[e.id]),delete workerToTabIds[e.id]);break}});\n';
// src/workerTimers/createWorkerTimers.ts
var createWebWorker = (source, opts = {}) => {
if (typeof Worker === "undefined") {
return null;
}
try {
const blob = new Blob([source], { type: "application/javascript; charset=utf-8" });
const workerScript = globalThis.URL.createObjectURL(blob);
return new Worker(workerScript, opts);
} catch (e) {
console.warn("Clerk: Cannot create worker from blob. Consider adding worker-src blob:; to your CSP");
return null;
}
};
var fallbackTimers = () => {
const setTimeout2 = globalThis.setTimeout.bind(globalThis);
const setInterval = globalThis.setInterval.bind(globalThis);
const clearTimeout = globalThis.clearTimeout.bind(globalThis);
const clearInterval = globalThis.clearInterval.bind(globalThis);
return { setTimeout: setTimeout2, setInterval, clearTimeout, clearInterval, cleanup: noop };
};
var createWorkerTimers = () => {
let id = 0;
const generateId = () => id++;
const callbacks = /* @__PURE__ */ new Map();
const post = (w, p) => w?.postMessage(p);
const handleMessage = (e) => {
callbacks.get(e.data.id)?.();
};
let worker = createWebWorker(workerTimers_worker_default, { name: "clerk-timers" });
worker?.addEventListener("message", handleMessage);
if (!worker) {
return fallbackTimers();
}
const init = () => {
if (!worker) {
worker = createWebWorker(workerTimers_worker_default, { name: "clerk-timers" });
worker?.addEventListener("message", handleMessage);
}
};
const cleanup = () => {
if (worker) {
worker.terminate();
worker = null;
callbacks.clear();
}
};
const setTimeout2 = (cb, ms) => {
init();
const id2 = generateId();
callbacks.set(id2, cb);
post(worker, { type: "setTimeout", id: id2, ms });
return id2;
};
const setInterval = (cb, ms) => {
init();
const id2 = generateId();
callbacks.set(id2, cb);
post(worker, { type: "setInterval", id: id2, ms });
return id2;
};
const clearTimeout = (id2) => {
init();
callbacks.delete(id2);
post(worker, { type: "clearTimeout", id: id2 });
};
const clearInterval = (id2) => {
init();
callbacks.delete(id2);
post(worker, { type: "clearInterval", id: id2 });
};
return { setTimeout: setTimeout2, setInterval, clearTimeout, clearInterval, cleanup };
};
// src/browser.ts
function inBrowser() {
return typeof window !== "undefined";
}
var botAgents = [
"bot",
"spider",
"crawl",
"APIs-Google",
"AdsBot",
"Googlebot",
"mediapartners",
"Google Favicon",
"FeedFetcher",
"Google-Read-Aloud",
"DuplexWeb-Google",
"googleweblight",
"bing",
"yandex",
"baidu",
"duckduck",
"yahoo",
"ecosia",
"ia_archiver",
"facebook",
"instagram",
"pinterest",
"reddit",
"slack",
"twitter",
"whatsapp",
"youtube",
"semrush"
];
var botAgentRegex = new RegExp(botAgents.join("|"), "i");
function userAgentIsRobot(userAgent) {
return !userAgent ? false : botAgentRegex.test(userAgent);
}
function isValidBrowser() {
const navigator = window?.navigator;
if (!inBrowser() || !navigator) {
return false;
}
return !userAgentIsRobot(navigator?.userAgent) && !navigator?.webdriver;
}
function isBrowserOnline() {
const navigator = window?.navigator;
if (!inBrowser() || !navigator) {
return false;
}
const isNavigatorOnline = navigator?.onLine;
const isExperimentalConnectionOnline = navigator?.connection?.rtt !== 0 && navigator?.connection?.downlink !== 0;
return isExperimentalConnectionOnline && isNavigatorOnline;
}
function isValidBrowserOnline() {
return isBrowserOnline() && isValidBrowser();
}
// src/callWithRetry.ts
function wait(ms) {
return new Promise((res) => setTimeout(res, ms));
}
var MAX_NUMBER_OF_RETRIES = 5;
async function callWithRetry(fn, attempt = 1, maxAttempts = MAX_NUMBER_OF_RETRIES) {
try {
return await fn();
} catch (e) {
if (attempt >= maxAttempts) {
throw e;
}
await wait(2 ** attempt * 100);
return callWithRetry(fn, attempt + 1, maxAttempts);
}
}
// src/color.ts
var IS_HEX_COLOR_REGEX = /^#?([A-F0-9]{6}|[A-F0-9]{3})$/i;
var IS_RGB_COLOR_REGEX = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/i;
var IS_RGBA_COLOR_REGEX = /^rgba\((\d+),\s*(\d+),\s*(\d+)(,\s*\d+(\.\d+)?)\)$/i;
var IS_HSL_COLOR_REGEX = /^hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)$/i;
var IS_HSLA_COLOR_REGEX = /^hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%(,\s*\d+(\.\d+)?)*\)$/i;
var isValidHexString = (s) => {
return !!s.match(IS_HEX_COLOR_REGEX);
};
var isValidRgbaString = (s) => {
return !!(s.match(IS_RGB_COLOR_REGEX) || s.match(IS_RGBA_COLOR_REGEX));
};
var isValidHslaString = (s) => {
return !!s.match(IS_HSL_COLOR_REGEX) || !!s.match(IS_HSLA_COLOR_REGEX);
};
var isRGBColor = (c) => {
return typeof c !== "string" && "r" in c;
};
var isHSLColor = (c) => {
return typeof c !== "string" && "h" in c;
};
var isTransparent = (c) => {
return c === "transparent";
};
var hasAlpha = (color) => {
return typeof color !== "string" && color.a != void 0 && color.a < 1;
};
var CLEAN_HSLA_REGEX = /[hsla()]/g;
var CLEAN_RGBA_REGEX = /[rgba()]/g;
var stringToHslaColor = (value) => {
if (value === "transparent") {
return { h: 0, s: 0, l: 0, a: 0 };
}
if (isValidHexString(value)) {
return hexStringToHslaColor(value);
}
if (isValidHslaString(value)) {
return parseHslaString(value);
}
if (isValidRgbaString(value)) {
return rgbaStringToHslaColor(value);
}
return null;
};
var stringToSameTypeColor = (value) => {
value = value.trim();
if (isValidHexString(value)) {
return value.startsWith("#") ? value : `#${value}`;
}
if (isValidRgbaString(value)) {
return parseRgbaString(value);
}
if (isValidHslaString(value)) {
return parseHslaString(value);
}
if (isTransparent(value)) {
return value;
}
return "";
};
var colorToSameTypeString = (color) => {
if (typeof color === "string" && (isValidHexString(color) || isTransparent(color))) {
return color;
}
if (isRGBColor(color)) {
return rgbaColorToRgbaString(color);
}
if (isHSLColor(color)) {
return hslaColorToHslaString(color);
}
return "";
};
var hexStringToRgbaColor = (hex) => {
hex = hex.replace("#", "");
const r = parseInt(hex.substring(0, 2), 16);
const g = parseInt(hex.substring(2, 4), 16);
const b = parseInt(hex.substring(4, 6), 16);
return { r, g, b };
};
var rgbaColorToRgbaString = (color) => {
const { a, b, g, r } = color;
return color.a === 0 ? "transparent" : color.a != void 0 ? `rgba(${r},${g},${b},${a})` : `rgb(${r},${g},${b})`;
};
var hslaColorToHslaString = (color) => {
const { h, s, l, a } = color;
const sPerc = Math.round(s * 100);
const lPerc = Math.round(l * 100);
return color.a === 0 ? "transparent" : color.a != void 0 ? `hsla(${h},${sPerc}%,${lPerc}%,${a})` : `hsl(${h},${sPerc}%,${lPerc}%)`;
};
var hexStringToHslaColor = (hex) => {
const rgbaString = colorToSameTypeString(hexStringToRgbaColor(hex));
return rgbaStringToHslaColor(rgbaString);
};
var rgbaStringToHslaColor = (rgba) => {
const rgbaColor = parseRgbaString(rgba);
const r = rgbaColor.r / 255;
const g = rgbaColor.g / 255;
const b = rgbaColor.b / 255;
const max = Math.max(r, g, b), min = Math.min(r, g, b);
let h, s;
const l = (max + min) / 2;
if (max == min) {
h = s = 0;
} else {
const d = max - min;
s = l >= 0.5 ? d / (2 - (max + min)) : d / (max + min);
switch (max) {
case r:
h = (g - b) / d * 60;
break;
case g:
h = ((b - r) / d + 2) * 60;
break;
default:
h = ((r - g) / d + 4) * 60;
break;
}
}
const res = { h: Math.round(h), s, l };
const a = rgbaColor.a;
if (a != void 0) {
res.a = a;
}
return res;
};
var parseRgbaString = (str) => {
const [r, g, b, a] = str.replace(CLEAN_RGBA_REGEX, "").split(",").map((c) => Number.parseFloat(c));
return { r, g, b, a };
};
var parseHslaString = (str) => {
const [h, s, l, a] = str.replace(CLEAN_HSLA_REGEX, "").split(",").map((c) => Number.parseFloat(c));
return { h, s: s / 100, l: l / 100, a };
};
// src/date.ts
var MILLISECONDS_IN_DAY = 864e5;
function dateTo12HourTime(date) {
if (!date) {
return "";
}
return date.toLocaleString("en-US", {
hour: "2-digit",
minute: "numeric",
hour12: true
});
}
function differenceInCalendarDays(a, b, { absolute = true } = {}) {
if (!a || !b) {
return 0;
}
const utcA = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
const utcB = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());
const diff = Math.floor((utcB - utcA) / MILLISECONDS_IN_DAY);
return absolute ? Math.abs(diff) : diff;
}
function normalizeDate(d) {
try {
return new Date(d || /* @__PURE__ */ new Date());
} catch (e) {
return /* @__PURE__ */ new Date();
}
}
function formatRelative(props) {
const { date, relativeTo } = props;
if (!date || !relativeTo) {
return null;
}
const a = normalizeDate(date);
const b = normalizeDate(relativeTo);
const differenceInDays = differenceInCalendarDays(b, a, { absolute: false });
if (differenceInDays < -6) {
return { relativeDateCase: "other", date: a };
}
if (differenceInDays < -1) {
return { relativeDateCase: "previous6Days", date: a };
}
if (differenceInDays === -1) {
return { relativeDateCase: "lastDay", date: a };
}
if (differenceInDays === 0) {
return { relativeDateCase: "sameDay", date: a };
}
if (differenceInDays === 1) {
return { relativeDateCase: "nextDay", date: a };
}
if (differenceInDays < 7) {
return { relativeDateCase: "next6Days", date: a };
}
return { relativeDateCase: "other", date: a };
}
function addYears(initialDate, yearsToAdd) {
const date = normalizeDate(initialDate);
date.setFullYear(date.getFullYear() + yearsToAdd);
return date;
}
// src/deprecated.ts
var displayedWarnings = /* @__PURE__ */ new Set();
var deprecated = (fnName, warning, key) => {
const hideWarning = isTestEnvironment() || isProductionEnvironment();
const messageId = key ?? fnName;
if (displayedWarnings.has(messageId) || hideWarning) {
return;
}
displayedWarnings.add(messageId);
console.warn(
`Clerk - DEPRECATION WARNING: "${fnName}" is deprecated and will be removed in the next major release.
${warning}`
);
};
var deprecatedProperty = (cls, propName, warning, isStatic = false) => {
const target = isStatic ? cls : cls.prototype;
let value = target[propName];
Object.defineProperty(target, propName, {
get() {
deprecated(propName, warning, `${cls.name}:${propName}`);
return value;
},
set(v) {
value = v;
}
});
};
var deprecatedObjectProperty = (obj, propName, warning, key) => {
let value = obj[propName];
Object.defineProperty(obj, propName, {
get() {
deprecated(propName, warning, key);
return value;
},
set(v) {
value = v;
}
});
};
// src/error.ts
function isUnauthorizedError(e) {
const status = e?.status;
const code = e?.errors?.[0]?.code;
return code === "authentication_invalid" && status === 401;
}
function is4xxError(e) {
const status = e?.status;
return !!status && status >= 400 && status < 500;
}
function isNetworkError(e) {
const message = (`${e.message}${e.name}` || "").toLowerCase().replace(/\s+/g, "");
return message.includes("networkerror");
}
function isKnownError(error) {
return isClerkAPIResponseError(error) || isMetamaskError(error) || isClerkRuntimeError(error);
}
function isClerkAPIResponseError(err) {
return "clerkError" in err;
}
function isClerkRuntimeError(err) {
return "clerkRuntimeError" in err;
}
function isMetamaskError(err) {
return "code" in err && [4001, 32602, 32603].includes(err.code) && "message" in err;
}
function parseErrors(data = []) {
return data.length > 0 ? data.map(parseError) : [];
}
function parseError(error) {
return {
code: error.code,
message: error.message,
longMessage: error.long_message,
meta: {
paramName: error?.meta?.param_name,
sessionId: error?.meta?.session_id,
emailAddresses: error?.meta?.email_addresses,
identifiers: error?.meta?.identifiers,
zxcvbn: error?.meta?.zxcvbn
}
};
}
var ClerkAPIResponseError = class _ClerkAPIResponseError extends Error {
constructor(message, { data, status }) {
super(message);
this.toString = () => {
return `[${this.name}]
Message:${this.message}
Status:${this.status}
Serialized errors: ${this.errors.map(
(e) => JSON.stringify(e)
)}`;
};
Object.setPrototypeOf(this, _ClerkAPIResponseError.prototype);
this.status = status;
this.message = message;
this.clerkError = true;
this.errors = parseErrors(data);
}
};
var ClerkRuntimeError = class _ClerkRuntimeError extends Error {
constructor(message, { code }) {
super(message);
/**
* Returns a string representation of the error.
*
* @returns {string} A formatted string with the error name and message.
* @memberof ClerkRuntimeError
*/
this.toString = () => {
return `[${this.name}]
Message:${this.message}`;
};
Object.setPrototypeOf(this, _ClerkRuntimeError.prototype);
this.code = code;
this.message = message;
this.clerkRuntimeError = true;
}
};
var MagicLinkError = class _MagicLinkError extends Error {
constructor(code) {
super(code);
this.code = code;
Object.setPrototypeOf(this, _MagicLinkError.prototype);
deprecated("MagicLinkError", "Use `EmailLinkError` instead.");
}
};
var EmailLinkError = class _EmailLinkError extends Error {
constructor(code) {
super(code);
this.code = code;
Object.setPrototypeOf(this, _EmailLinkError.prototype);
}
};
function isMagicLinkError(err) {
deprecated("isMagicLinkError", "Use `isEmailLinkError` instead.");
return err instanceof MagicLinkError;
}
function isEmailLinkError(err) {
return err instanceof EmailLinkError;
}
var _MagicLinkErrorCode = {
Expired: "expired",
Failed: "failed"
};
var MagicLinkErrorCode = new Proxy(_MagicLinkErrorCode, {
get(target, prop, receiver) {
deprecated("MagicLinkErrorCode", "Use `EmailLinkErrorCode` instead.");
return Reflect.get(target, prop, receiver);
}
});
var EmailLinkErrorCode = {
Expired: "expired",
Failed: "failed"
};
var DefaultMessages = Object.freeze({
InvalidFrontendApiErrorMessage: `The frontendApi passed to Clerk is invalid. You can get your Frontend API key at https://dashboard.clerk.com/last-active?path=api-keys. (key={{key}})`,
InvalidProxyUrlErrorMessage: `The proxyUrl passed to Clerk is invalid. The expected value for proxyUrl is an absolute URL or a relative path with a leading '/'. (key={{url}})`,
InvalidPublishableKeyErrorMessage: `The publishableKey passed to Clerk is invalid. You can get your Publishable key at https://dashboard.clerk.com/last-active?path=api-keys. (key={{key}})`,
MissingPublishableKeyErrorMessage: `Missing publishableKey. You can get your key at https://dashboard.clerk.com/last-active?path=api-keys.`
});
function buildErrorThrower({ packageName, customMessages }) {
let pkg = packageName;
const messages = {
...DefaultMessages,
...customMessages
};
function buildMessage(rawMessage, replacements) {
if (!replacements) {
return `${pkg}: ${rawMessage}`;
}
let msg = rawMessage;
const matches = rawMessage.matchAll(/{{([a-zA-Z0-9-_]+)}}/g);
for (const match of matches) {
const replacement = (replacements[match[1]] || "").toString();
msg = msg.replace(`{{${match[1]}}}`, replacement);
}
return `${pkg}: ${msg}`;
}
return {
setPackageName({ packageName: packageName2 }) {
if (typeof packageName2 === "string") {
pkg = packageName2;
}
return this;
},
setMessages({ customMessages: customMessages2 }) {
Object.assign(messages, customMessages2 || {});
return this;
},
throwInvalidPublishableKeyError(params) {
throw new Error(buildMessage(messages.InvalidPublishableKeyErrorMessage, params));
},
throwInvalidFrontendApiError(params) {
throw new Error(buildMessage(messages.InvalidFrontendApiErrorMessage, params));
},
throwInvalidProxyUrl(params) {
throw new Error(buildMessage(messages.InvalidProxyUrlErrorMessage, params));
},
throwMissingPublishableKeyError() {
throw new Error(buildMessage(messages.MissingPublishableKeyErrorMessage));
}
};
}
// src/file.ts
function readJSONFile(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.addEventListener("load", function() {
const result = JSON.parse(reader.result);
resolve(result);
});
reader.addEventListener("error", reject);
reader.readAsText(file);
});
}
var MimeTypeToExtensionMap = Object.freeze({
"image/png": "png",
"image/jpeg": "jpg",
"image/gif": "gif",
"image/webp": "webp",
"image/x-icon": "ico",
"image/vnd.microsoft.icon": "ico"
});
var extension = (mimeType) => {
return MimeTypeToExtensionMap[mimeType];
};
// src/handleValueOrFn.ts
function handleValueOrFn(value, url, defaultValue) {
if (typeof value === "function") {
return value(url);
}
if (typeof value !== "undefined") {
return value;
}
if (typeof defaultValue !== "undefined") {
return defaultValue;
}
return void 0;
}
// src/isomorphicAtob.ts
var isomorphicAtob = (data) => {
if (typeof atob !== "undefined" && typeof atob === "function") {
return atob(data);
} else if (typeof global !== "undefined" && global.Buffer) {
return new global.Buffer(data, "base64").toString();
}
return data;
};
// src/keys.ts
var PUBLISHABLE_KEY_LIVE_PREFIX = "pk_live_";
var PUBLISHABLE_KEY_TEST_PREFIX = "pk_test_";
var PUBLISHABLE_FRONTEND_API_DEV_REGEX = /^(([a-z]+)-){2}([0-9]{1,2})\.clerk\.accounts([a-z.]*)(dev|com)$/i;
function buildPublishableKey(frontendApi) {
const keyPrefix = PUBLISHABLE_FRONTEND_API_DEV_REGEX.test(frontendApi) ? PUBLISHABLE_KEY_TEST_PREFIX : PUBLISHABLE_KEY_LIVE_PREFIX;
return `${keyPrefix}${btoa(`${frontendApi}$`)}`;
}
function parsePublishableKey(key) {
key = key || "";
if (!isPublishableKey(key)) {
return null;
}
const instanceType = key.startsWith(PUBLISHABLE_KEY_LIVE_PREFIX) ? "production" : "development";
let frontendApi = isomorphicAtob(key.split("_")[2]);
if (!frontendApi.endsWith("$")) {
return null;
}
frontendApi = frontendApi.slice(0, -1);
return {
instanceType,
frontendApi
};
}
function isPublishableKey(key) {
key = key || "";
const hasValidPrefix = key.startsWith(PUBLISHABLE_KEY_LIVE_PREFIX) || key.startsWith(PUBLISHABLE_KEY_TEST_PREFIX);
const hasValidFrontendApiPostfix = isomorphicAtob(key.split("_")[2] || "").endsWith("$");
return hasValidPrefix && hasValidFrontendApiPostfix;
}
function isLegacyFrontendApiKey(key) {
key = key || "";
return key.startsWith("clerk.");
}
function createDevOrStagingUrlCache() {
const DEV_OR_STAGING_SUFFIXES = [
".lcl.dev",
".stg.dev",
".lclstage.dev",
".stgstage.dev",
".dev.lclclerk.com",
".stg.lclclerk.com",
".accounts.lclclerk.com",
"accountsstage.dev",
"accounts.dev"
];
const devOrStagingUrlCache = /* @__PURE__ */ new Map();
return {
isDevOrStagingUrl: (url) => {
if (!url) {
return false;
}
const hostname = typeof url === "string" ? url : url.hostname;
let res = devOrStagingUrlCache.get(hostname);
if (res === void 0) {
res = DEV_OR_STAGING_SUFFIXES.some((s) => hostname.endsWith(s));
devOrStagingUrlCache.set(hostname, res);
}
return res;
}
};
}
function isDevelopmentFromApiKey(apiKey) {
return apiKey.startsWith("test_") || apiKey.startsWith("sk_test_");
}
function isProductionFromApiKey(apiKey) {
return apiKey.startsWith("live_") || apiKey.startsWith("sk_live_");
}
// src/loadScript.ts
var NO_DOCUMENT_ERROR = "loadScript cannot be called when document does not exist";
var NO_SRC_ERROR = "loadScript cannot be called without a src";
async function loadScript(src = "", opts) {
const { async, defer, beforeLoad, crossOrigin } = opts || {};
return new Promise((resolve, reject) => {
if (!src) {
reject(NO_SRC_ERROR);
}
if (!document || !document.body) {
reject(NO_DOCUMENT_ERROR);
}
const script = document.createElement("script");
crossOrigin && script.setAttribute("crossorigin", crossOrigin);
script.async = async || false;
script.defer = defer || false;
script.addEventListener("load", () => {
script.remove();
resolve(script);
});
script.addEventListener("error", () => {
script.remove();
reject();
});
script.src = src;
beforeLoad?.(script);
document.body.appendChild(script);
});
}
// src/localStorageBroadcastChannel.ts
var KEY_PREFIX = "__lsbc__";
var LocalStorageBroadcastChannel = class {
constructor(name) {
this.eventTarget = window;
this.postMessage = (data) => {
if (typeof window === "undefined") {
return;
}
try {
window.localStorage.setItem(this.channelKey, JSON.stringify(data));
window.localStorage.removeItem(this.channelKey);
} catch (e) {
}
};
this.addEventListener = (eventName, listener) => {
this.eventTarget.addEventListener(this.prefixEventName(eventName), (e) => {
listener(e);
});
};
this.setupLocalStorageListener = () => {
const notifyListeners = (e) => {
if (e.key !== this.channelKey || !e.newValue) {
return;
}
try {
const data = JSON.parse(e.newValue || "");
const event = new MessageEvent(this.prefixEventName("message"), {
data
});
this.eventTarget.dispatchEvent(event);
} catch (e2) {
}
};
window.addEventListener("storage", notifyListeners);
};
this.channelKey = KEY_PREFIX + name;
this.setupLocalStorageListener();
}
prefixEventName(eventName) {
return this.channelKey + eventName;
}
};
// src/poller.ts
function Poller({ delayInMs } = { delayInMs: 1e3 }) {
const workerTimers = createWorkerTimers();
let timerId;
let stopped = false;
const stop = () => {
if (timerId) {
workerTimers.clearTimeout(timerId);
workerTimers.cleanup();
}
stopped = true;
};
const run = async (cb) => {
stopped = false;
await cb(stop);
if (stopped) {
return;
}
timerId = workerTimers.setTimeout(() => {
void run(cb);
}, delayInMs);
};
return { run, stop };
}
// src/proxy.ts
function isValidProxyUrl(key) {
if (!key) {
return true;
}
return isHttpOrHttps(key) || isProxyUrlRelative(key);
}
function isHttpOrHttps(key) {
return /^http(s)?:\/\//.test(key || "");
}
function isProxyUrlRelative(key) {
return key.startsWith("/");
}
function proxyUrlToAbsoluteURL(url) {
if (!url) {
return "";
}
return isProxyUrlRelative(url) ? new URL(url, window.location.origin).toString() : url;
}
function getRequestUrl({ request, relativePath }) {
deprecated("getRequestUrl", "Use `buildRequestUrl` from @clerk/backend instead.");
const { headers, url: initialUrl } = request;
const url = new URL(initialUrl);
const host = headers.get("X-Forwarded-Host") ?? headers.get("host") ?? headers["host"] ?? url.host;
let protocol = (headers.get("X-Forwarded-Proto") ?? headers["X-Forwarded-Proto"])?.split(",")[0] ?? url.protocol;
protocol = protocol.replace(/[:/]/, "");
return new URL(relativePath || url.pathname, `${protocol}://${host}`);
}
// src/underscore.ts
var toSentence = (items) => {
if (items.length == 0) {
return "";
}
if (items.length == 1) {
return items[0];
}
let sentence = items.slice(0, -1).join(", ");
sentence += `, or ${items.slice(-1)}`;
return sentence;
};
var IP_V4_ADDRESS_REGEX = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
function isIPV4Address(str) {
return IP_V4_ADDRESS_REGEX.test(str || "");
}
function titleize(str) {
const s = str || "";
return s.charAt(0).toUpperCase() + s.slice(1);
}
function snakeToCamel(str) {
return str ? str.replace(/([-_][a-z])/g, (match) => match.toUpperCase().replace(/-|_/, "")) : "";
}
function camelToSnake(str) {
return str ? str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`) : "";
}
var createDeepObjectTransformer = (transform) => {
const deepTransform = (obj) => {
if (!obj) {
return obj;
}
if (Array.isArray(obj)) {
return obj.map((el) => {
if (typeof el === "object" || Array.isArray(el)) {
return deepTransform(el);
}
return el;
});
}
const copy = { ...obj };
const keys = Object.keys(copy);
for (const oldName of keys) {
const newName = transform(oldName.toString());
if (newName !== oldName) {
copy[newName] = copy[oldName];
delete copy[oldName];
}
if (typeof copy[newName] === "object") {
copy[newName] = deepTransform(copy[newName]);
}
}
return copy;
};
return deepTransform;
};
var deepCamelToSnake = createDeepObjectTransformer(camelToSnake);
var deepSnakeToCamel = createDeepObjectTransformer(snakeToCamel);
// src/url.ts
function parseSearchParams(queryString = "") {
if (queryString.startsWith("?")) {
queryString = queryString.slice(1);
}
return new URLSearchParams(queryString);
}
function stripScheme(url = "") {
return (url || "").replace(/^.+:\/\//, "");
}
function addClerkPrefix(str) {
if (!str) {
return "";
}
let regex;
if (str.match(/^(clerk\.)+\w*$/)) {
regex = /(clerk\.)*(?=clerk\.)/;
} else if (str.match(/\.clerk.accounts/)) {
return str;
} else {
regex = /^(clerk\.)*/gi;
}
const stripped = str.replace(regex, "");
return `clerk.${stripped}`;
}
var getClerkJsMajorVersionOrTag = (frontendApi, pkgVersion) => {
if (!pkgVersion && isStaging(frontendApi)) {
return "staging";
}
if (!pkgVersion) {
return "latest";
}
if (pkgVersion.includes("next")) {
return "next";
}
return pkgVersion.split(".")[0] || "latest";
};
var getScriptUrl = (frontendApi, { pkgVersion, clerkJSVersion }) => {
const noSchemeFrontendApi = frontendApi.replace(/http(s)?:\/\//, "");
const major = getClerkJsMajorVersionOrTag(frontendApi, pkgVersion);
return `https://${noSchemeFrontendApi}/npm/@clerk/clerk-js@${clerkJSVersion || major}/dist/clerk.browser.js`;
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
ClerkAPIResponseError,
ClerkRuntimeError,
EmailLinkError,
EmailLinkErrorCode,
LocalStorageBroadcastChannel,
MagicLinkError,
MagicLinkErrorCode,
Poller,
addClerkPrefix,
addYears,
buildErrorThrower,
buildPublishableKey,
callWithRetry,
camelToSnake,
colorToSameTypeString,
createDeferredPromise,
createDevOrStagingUrlCache,
createWorkerTimers,
dateTo12HourTime,
deepCamelToSnake,
deepSnakeToCamel,
deprecated,
deprecatedObjectProperty,
deprecatedProperty,
differenceInCalendarDays,
extension,
formatRelative,
getClerkJsMajorVersionOrTag,
getRequestUrl,
getScriptUrl,
handleValueOrFn,
hasAlpha,
hexStringToRgbaColor,
inBrowser,
is4xxError,
isBrowserOnline,
isClerkAPIResponseError,
isClerkRuntimeError,
isDevelopmentEnvironment,
isDevelopmentFromApiKey,
isEmailLinkError,
isHSLColor,
isHttpOrHttps,
isIPV4Address,
isKnownError,
isLegacyFrontendApiKey,
isMagicLinkError,
isMetamaskError,
isNetworkError,
isProductionEnvironment,
isProductionFromApiKey,
isProxyUrlRelative,
isPublishableKey,
isRGBColor,
isStaging,
isTestEnvironment,
isTransparent,
isUnauthorizedError,
isValidBrowser,
isValidBrowserOnline,
isValidHexString,
isValidHslaString,
isValidProxyUrl,
isValidRgbaString,
isomorphicAtob,
loadScript,
logErrorInDevMode,
noop,
normalizeDate,
parseError,
parseErrors,
parsePublishableKey,
parseSearchParams,
proxyUrlToAbsoluteURL,
readJSONFile,
runWithExponentialBackOff,
snakeToCamel,
stringToHslaColor,
stringToSameTypeColor,
stripScheme,
titleize,
toSentence,
userAgentIsRobot
});
//# sourceMappingURL=index.js.map