UNPKG

@clerk/shared

Version:

Internal package utils used by the Clerk SDKs

1,185 lines (1,160 loc) • 35.8 kB
"use strict"; 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