UNPKG

@clerk/shared

Version:

Internal package utils used by the Clerk SDKs

1,560 lines (1,527 loc) • 62.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 index_exports = {}; __export(index_exports, { CURRENT_DEV_INSTANCE_SUFFIXES: () => CURRENT_DEV_INSTANCE_SUFFIXES, ClerkAPIResponseError: () => ClerkAPIResponseError, ClerkRuntimeError: () => ClerkRuntimeError, ClerkWebAuthnError: () => ClerkWebAuthnError, DEV_BROWSER_JWT_KEY: () => DEV_BROWSER_JWT_KEY, DEV_OR_STAGING_SUFFIXES: () => DEV_OR_STAGING_SUFFIXES, EmailLinkError: () => EmailLinkError, EmailLinkErrorCode: () => EmailLinkErrorCode, EmailLinkErrorCodeStatus: () => EmailLinkErrorCodeStatus, LEGACY_DEV_INSTANCE_SUFFIXES: () => LEGACY_DEV_INSTANCE_SUFFIXES, LOCAL_API_URL: () => LOCAL_API_URL, LOCAL_ENV_SUFFIXES: () => LOCAL_ENV_SUFFIXES, LocalStorageBroadcastChannel: () => LocalStorageBroadcastChannel, PROD_API_URL: () => PROD_API_URL, Poller: () => Poller, STAGING_API_URL: () => STAGING_API_URL, STAGING_ENV_SUFFIXES: () => STAGING_ENV_SUFFIXES, addClerkPrefix: () => addClerkPrefix, addYears: () => addYears, apiUrlFromPublishableKey: () => apiUrlFromPublishableKey, applyFunctionToObj: () => applyFunctionToObj, buildClerkJsScriptAttributes: () => buildClerkJsScriptAttributes, buildErrorThrower: () => buildErrorThrower, buildPublishableKey: () => buildPublishableKey, camelToSnake: () => camelToSnake, cleanDoubleSlashes: () => cleanDoubleSlashes, clerkJsScriptUrl: () => clerkJsScriptUrl, colorToSameTypeString: () => colorToSameTypeString, createDeferredPromise: () => createDeferredPromise, createDevOrStagingUrlCache: () => createDevOrStagingUrlCache, createPathMatcher: () => createPathMatcher, createWorkerTimers: () => createWorkerTimers, dateTo12HourTime: () => dateTo12HourTime, deepCamelToSnake: () => deepCamelToSnake, deepSnakeToCamel: () => deepSnakeToCamel, deprecated: () => deprecated, deprecatedObjectProperty: () => deprecatedObjectProperty, deprecatedProperty: () => deprecatedProperty, deriveState: () => deriveState, differenceInCalendarDays: () => differenceInCalendarDays, errorToJSON: () => errorToJSON, extension: () => extension, extractDevBrowserJWTFromURL: () => extractDevBrowserJWTFromURL, fastDeepMergeAndKeep: () => fastDeepMergeAndKeep, fastDeepMergeAndReplace: () => fastDeepMergeAndReplace, filterProps: () => filterProps, formatRelative: () => formatRelative, getClerkJsMajorVersionOrTag: () => getClerkJsMajorVersionOrTag, getCookieSuffix: () => getCookieSuffix, getEnvVariable: () => getEnvVariable, getNonUndefinedValues: () => getNonUndefinedValues, getScriptUrl: () => getScriptUrl, getSuffixedCookieName: () => getSuffixedCookieName, handleValueOrFn: () => handleValueOrFn, hasAlpha: () => hasAlpha, hasLeadingSlash: () => hasLeadingSlash, hasTrailingSlash: () => hasTrailingSlash, hexStringToRgbaColor: () => hexStringToRgbaColor, iconImageUrl: () => iconImageUrl, inBrowser: () => inBrowser, is4xxError: () => is4xxError, isAbsoluteUrl: () => isAbsoluteUrl, isBrowserOnline: () => isBrowserOnline, isCaptchaError: () => isCaptchaError, isClerkAPIResponseError: () => isClerkAPIResponseError, isClerkRuntimeError: () => isClerkRuntimeError, isCurrentDevAccountPortalOrigin: () => isCurrentDevAccountPortalOrigin, isDevelopmentEnvironment: () => isDevelopmentEnvironment, isDevelopmentFromPublishableKey: () => isDevelopmentFromPublishableKey, isDevelopmentFromSecretKey: () => isDevelopmentFromSecretKey, isEmailLinkError: () => isEmailLinkError, isHSLColor: () => isHSLColor, isHttpOrHttps: () => isHttpOrHttps, isIPV4Address: () => isIPV4Address, isKnownError: () => isKnownError, isLegacyDevAccountPortalOrigin: () => isLegacyDevAccountPortalOrigin, isMetamaskError: () => isMetamaskError, isNetworkError: () => isNetworkError, isNonEmptyURL: () => isNonEmptyURL, isPasswordPwnedError: () => isPasswordPwnedError, isProductionEnvironment: () => isProductionEnvironment, isProductionFromPublishableKey: () => isProductionFromPublishableKey, isProductionFromSecretKey: () => isProductionFromSecretKey, isProxyUrlRelative: () => isProxyUrlRelative, isPublishableKey: () => isPublishableKey, isRGBColor: () => isRGBColor, isStaging: () => isStaging, isTestEnvironment: () => isTestEnvironment, isTransparent: () => isTransparent, isTruthy: () => isTruthy, isUnauthorizedError: () => isUnauthorizedError, isUserLockedError: () => isUserLockedError, isValidBrowser: () => isValidBrowser, isValidBrowserOnline: () => isValidBrowserOnline, isValidHexString: () => isValidHexString, isValidHslaString: () => isValidHslaString, isValidProxyUrl: () => isValidProxyUrl, isValidRgbaString: () => isValidRgbaString, isomorphicAtob: () => isomorphicAtob, isomorphicBtoa: () => isomorphicBtoa, joinURL: () => joinURL, loadClerkJsScript: () => loadClerkJsScript, loadScript: () => loadScript, logErrorInDevMode: () => logErrorInDevMode, logger: () => logger, noop: () => noop, normalizeDate: () => normalizeDate, parseError: () => parseError, parseErrors: () => parseErrors, parsePublishableKey: () => parsePublishableKey, parseSearchParams: () => parseSearchParams, proxyUrlToAbsoluteURL: () => proxyUrlToAbsoluteURL, readJSONFile: () => readJSONFile, removeUndefined: () => removeUndefined, setClerkJsLoadingErrorPackageName: () => setClerkJsLoadingErrorPackageName, setDevBrowserJWTInURL: () => setDevBrowserJWTInURL, snakeToCamel: () => snakeToCamel, stringToHslaColor: () => stringToHslaColor, stringToSameTypeColor: () => stringToSameTypeColor, stripScheme: () => stripScheme, titleize: () => titleize, toSentence: () => toSentence, userAgentIsRobot: () => userAgentIsRobot, versionSelector: () => versionSelector, withLeadingSlash: () => withLeadingSlash, withTrailingSlash: () => withTrailingSlash, without: () => without, withoutLeadingSlash: () => withoutLeadingSlash, withoutTrailingSlash: () => withoutTrailingSlash }); module.exports = __toCommonJS(index_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 { } return false; }; var isTestEnvironment = () => { try { return process.env.NODE_ENV === "test"; } catch { } return false; }; var isProductionEnvironment = () => { try { return process.env.NODE_ENV === "production"; } catch { } return false; }; // src/utils/logErrorInDevMode.ts var logErrorInDevMode = (message) => { if (isDevelopmentEnvironment()) { console.error(`Clerk: ${message}`); } }; // src/utils/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/utils/fastDeepMerge.ts var fastDeepMergeAndReplace = (source, target) => { if (!source || !target) { return; } for (const key in source) { if (Object.prototype.hasOwnProperty.call(source, key) && source[key] !== null && typeof source[key] === `object`) { if (target[key] === void 0) { target[key] = new (Object.getPrototypeOf(source[key])).constructor(); } fastDeepMergeAndReplace(source[key], target[key]); } else if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }; var fastDeepMergeAndKeep = (source, target) => { if (!source || !target) { return; } for (const key in source) { if (Object.prototype.hasOwnProperty.call(source, key) && source[key] !== null && typeof source[key] === `object`) { if (target[key] === void 0) { target[key] = new (Object.getPrototypeOf(source[key])).constructor(); } fastDeepMergeAndKeep(source[key], target[key]); } else if (Object.prototype.hasOwnProperty.call(source, key) && target[key] === void 0) { target[key] = source[key]; } } }; // src/constants.ts var LEGACY_DEV_INSTANCE_SUFFIXES = [".lcl.dev", ".lclstage.dev", ".lclclerk.com"]; var CURRENT_DEV_INSTANCE_SUFFIXES = [".accounts.dev", ".accountsstage.dev", ".accounts.lclclerk.com"]; var 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" ]; var LOCAL_ENV_SUFFIXES = [".lcl.dev", "lclstage.dev", ".lclclerk.com", ".accounts.lclclerk.com"]; var STAGING_ENV_SUFFIXES = [".accountsstage.dev"]; var LOCAL_API_URL = "https://api.lclclerk.com"; var STAGING_API_URL = "https://api.clerkstage.dev"; var PROD_API_URL = "https://api.clerk.com"; function iconImageUrl(id, format = "svg") { return `https://img.clerk.com/static/${id}.${format}`; } // 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/isomorphicBtoa.ts var isomorphicBtoa = (data) => { if (typeof btoa !== "undefined" && typeof btoa === "function") { return btoa(data); } else if (typeof global !== "undefined" && global.Buffer) { return new global.Buffer(data).toString("base64"); } 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 isDevKey = PUBLISHABLE_FRONTEND_API_DEV_REGEX.test(frontendApi) || frontendApi.startsWith("clerk.") && LEGACY_DEV_INSTANCE_SUFFIXES.some((s2) => frontendApi.endsWith(s2)); const keyPrefix = isDevKey ? PUBLISHABLE_KEY_TEST_PREFIX : PUBLISHABLE_KEY_LIVE_PREFIX; return `${keyPrefix}${isomorphicBtoa(`${frontendApi}$`)}`; } function parsePublishableKey(key, options = {}) { key = key || ""; if (!key || !isPublishableKey(key)) { if (options.fatal && !key) { throw new Error( "Publishable key is missing. Ensure that your publishable key is correctly configured. Double-check your environment configuration for your keys, or access them here: https://dashboard.clerk.com/last-active?path=api-keys" ); } if (options.fatal && !isPublishableKey(key)) { throw new Error("Publishable key not valid."); } return null; } const instanceType = key.startsWith(PUBLISHABLE_KEY_LIVE_PREFIX) ? "production" : "development"; let frontendApi = isomorphicAtob(key.split("_")[2]); frontendApi = frontendApi.slice(0, -1); if (options.proxyUrl) { frontendApi = options.proxyUrl; } else if (instanceType !== "development" && options.domain) { frontendApi = `clerk.${options.domain}`; } return { instanceType, frontendApi }; } function isPublishableKey(key = "") { try { const hasValidPrefix = key.startsWith(PUBLISHABLE_KEY_LIVE_PREFIX) || key.startsWith(PUBLISHABLE_KEY_TEST_PREFIX); const hasValidFrontendApiPostfix = isomorphicAtob(key.split("_")[2] || "").endsWith("$"); return hasValidPrefix && hasValidFrontendApiPostfix; } catch { return false; } } function createDevOrStagingUrlCache() { 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((s2) => hostname.endsWith(s2)); devOrStagingUrlCache.set(hostname, res); } return res; } }; } function isDevelopmentFromPublishableKey(apiKey) { return apiKey.startsWith("test_") || apiKey.startsWith("pk_test_"); } function isProductionFromPublishableKey(apiKey) { return apiKey.startsWith("live_") || apiKey.startsWith("pk_live_"); } function isDevelopmentFromSecretKey(apiKey) { return apiKey.startsWith("test_") || apiKey.startsWith("sk_test_"); } function isProductionFromSecretKey(apiKey) { return apiKey.startsWith("live_") || apiKey.startsWith("sk_live_"); } async function getCookieSuffix(publishableKey, subtle = globalThis.crypto.subtle) { const data = new TextEncoder().encode(publishableKey); const digest = await subtle.digest("sha-1", data); const stringDigest = String.fromCharCode(...new Uint8Array(digest)); return isomorphicBtoa(stringDigest).replace(/\+/gi, "-").replace(/\//gi, "_").substring(0, 8); } var getSuffixedCookieName = (cookieName, cookieSuffix) => { return `${cookieName}_${cookieSuffix}`; }; // src/apiUrlFromPublishableKey.ts var apiUrlFromPublishableKey = (publishableKey) => { const frontendApi = parsePublishableKey(publishableKey)?.frontendApi; if (frontendApi?.startsWith("clerk.") && LEGACY_DEV_INSTANCE_SUFFIXES.some((suffix) => frontendApi?.endsWith(suffix))) { return PROD_API_URL; } if (LOCAL_ENV_SUFFIXES.some((suffix) => frontendApi?.endsWith(suffix))) { return LOCAL_API_URL; } if (STAGING_ENV_SUFFIXES.some((suffix) => frontendApi?.endsWith(suffix))) { return STAGING_API_URL; } return PROD_API_URL; }; // 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 = inBrowser() ? window?.navigator : null; if (!navigator) { return false; } return !userAgentIsRobot(navigator?.userAgent) && !navigator?.webdriver; } function isBrowserOnline() { const navigator = inBrowser() ? window?.navigator : null; if (!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/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 = (s2) => { return !!s2.match(IS_HEX_COLOR_REGEX); }; var isValidRgbaString = (s2) => { return !!(s2.match(IS_RGB_COLOR_REGEX) || s2.match(IS_RGBA_COLOR_REGEX)); }; var isValidHslaString = (s2) => { return !!s2.match(IS_HSL_COLOR_REGEX) || !!s2.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: s2, l, a } = color; const sPerc = Math.round(s2 * 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, s2; const l = (max + min) / 2; if (max == min) { h = s2 = 0; } else { const d = max - min; s2 = 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: s2, 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, s2, l, a] = str.replace(CLEAN_HSLA_REGEX, "").split(",").map((c) => Number.parseFloat(c)); return { h, s: s2 / 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 { 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/deriveState.ts var deriveState = (clerkLoaded, state, initialState) => { if (!clerkLoaded && initialState) { return deriveFromSsrInitialState(initialState); } return deriveFromClientSideState(state); }; var deriveFromSsrInitialState = (initialState) => { const userId = initialState.userId; const user = initialState.user; const sessionId = initialState.sessionId; const session = initialState.session; const organization = initialState.organization; const orgId = initialState.orgId; const orgRole = initialState.orgRole; const orgPermissions = initialState.orgPermissions; const orgSlug = initialState.orgSlug; const actor = initialState.actor; const factorVerificationAge = initialState.factorVerificationAge; return { userId, user, sessionId, session, organization, orgId, orgRole, orgPermissions, orgSlug, actor, factorVerificationAge }; }; var deriveFromClientSideState = (state) => { const userId = state.user ? state.user.id : state.user; const user = state.user; const sessionId = state.session ? state.session.id : state.session; const session = state.session; const factorVerificationAge = state.session ? state.session.factorVerificationAge : null; const actor = session?.actor; const organization = state.organization; const orgId = state.organization ? state.organization.id : state.organization; const orgSlug = organization?.slug; const membership = organization ? user?.organizationMemberships?.find((om) => om.organization.id === orgId) : organization; const orgPermissions = membership ? membership.permissions : membership; const orgRole = membership ? membership.role : membership; return { userId, user, sessionId, session, organization, orgId, orgRole, orgSlug, orgPermissions, actor, factorVerificationAge }; }; // src/error.ts function isUnauthorizedError(e) { const status = e?.status; const code = e?.errors?.[0]?.code; return code === "authentication_invalid" && status === 401; } function isCaptchaError(e) { return ["captcha_invalid", "captcha_not_enabled", "captcha_missing_token"].includes(e.errors[0].code); } 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 isUserLockedError(err) { return isClerkAPIResponseError(err) && err.errors?.[0]?.code === "user_locked"; } function isPasswordPwnedError(err) { return isClerkAPIResponseError(err) && err.errors?.[0]?.code === "form_password_pwned"; } 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 } }; } function errorToJSON(error) { return { code: error?.code || "", message: error?.message || "", long_message: error?.longMessage, meta: { param_name: error?.meta?.paramName, session_id: error?.meta?.sessionId, email_addresses: error?.meta?.emailAddresses, identifiers: error?.meta?.identifiers, zxcvbn: error?.meta?.zxcvbn } }; } var ClerkAPIResponseError = class _ClerkAPIResponseError extends Error { constructor(message, { data, status, clerkTraceId }) { super(message); this.toString = () => { let message = `[${this.name}] Message:${this.message} Status:${this.status} Serialized errors: ${this.errors.map( (e) => JSON.stringify(e) )}`; if (this.clerkTraceId) { message += ` Clerk Trace ID: ${this.clerkTraceId}`; } return message; }; Object.setPrototypeOf(this, _ClerkAPIResponseError.prototype); this.status = status; this.message = message; this.clerkTraceId = clerkTraceId; this.clerkError = true; this.errors = parseErrors(data); } }; var ClerkRuntimeError = class _ClerkRuntimeError extends Error { constructor(message, { code }) { const prefix = "\u{1F512} Clerk:"; const regex = new RegExp(prefix.replace(" ", "\\s*"), "i"); const sanitized = message.replace(regex, ""); const _message = `${prefix} ${sanitized.trim()} (code="${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; this.name = "ClerkRuntimeError"; } }; var EmailLinkError = class _EmailLinkError extends Error { constructor(code) { super(code); this.code = code; this.name = "EmailLinkError"; Object.setPrototypeOf(this, _EmailLinkError.prototype); } }; function isEmailLinkError(err) { return err.name === "EmailLinkError"; } var EmailLinkErrorCode = { Expired: "expired", Failed: "failed", ClientMismatch: "client_mismatch" }; var EmailLinkErrorCodeStatus = { Expired: "expired", Failed: "failed", ClientMismatch: "client_mismatch" }; var DefaultMessages = Object.freeze({ 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.`, MissingSecretKeyErrorMessage: `Missing secretKey. You can get your key at https://dashboard.clerk.com/last-active?path=api-keys.`, MissingClerkProvider: `{{source}} can only be used within the <ClerkProvider /> component. Learn more: https://clerk.com/docs/components/clerk-provider` }); 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)); }, throwInvalidProxyUrl(params) { throw new Error(buildMessage(messages.InvalidProxyUrlErrorMessage, params)); }, throwMissingPublishableKeyError() { throw new Error(buildMessage(messages.MissingPublishableKeyErrorMessage)); }, throwMissingSecretKeyError() { throw new Error(buildMessage(messages.MissingSecretKeyErrorMessage)); }, throwMissingClerkProviderError(params) { throw new Error(buildMessage(messages.MissingClerkProvider, params)); }, throw(message) { throw new Error(buildMessage(message)); } }; } var ClerkWebAuthnError = class extends ClerkRuntimeError { constructor(message, { code }) { super(message, { code }); this.code = code; } }; // 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/retry.ts var defaultOptions = { initialDelay: 125, maxDelayBetweenRetries: 0, factor: 2, shouldRetry: (_2, iteration) => iteration < 5, retryImmediately: true, jitter: true }; var RETRY_IMMEDIATELY_DELAY = 100; var sleep = async (ms) => new Promise((s2) => setTimeout(s2, ms)); var applyJitter = (delay, jitter) => { return jitter ? delay * (1 + Math.random()) : delay; }; var createExponentialDelayAsyncFn = (opts) => { let timesCalled = 0; const calculateDelayInMs = () => { const constant = opts.initialDelay; const base = opts.factor; let delay = constant * Math.pow(base, timesCalled); delay = applyJitter(delay, opts.jitter); return Math.min(opts.maxDelayBetweenRetries || delay, delay); }; return async () => { await sleep(calculateDelayInMs()); timesCalled++; }; }; var retry = async (callback, options = {}) => { let iterations = 0; const { shouldRetry, initialDelay, maxDelayBetweenRetries, factor, retryImmediately, jitter } = { ...defaultOptions, ...options }; const delay = createExponentialDelayAsyncFn({ initialDelay, maxDelayBetweenRetries, factor, jitter }); while (true) { try { return await callback(); } catch (e) { iterations++; if (!shouldRetry(e, iterations)) { throw e; } if (retryImmediately && iterations === 1) { await sleep(applyJitter(RETRY_IMMEDIATELY_DELAY, jitter)); } else { await delay(); } } } }; // 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, nonce } = opts || {}; const load = () => { return new Promise((resolve, reject) => { if (!src) { reject(new Error(NO_SRC_ERROR)); } if (!document || !document.body) { reject(NO_DOCUMENT_ERROR); } const script = document.createElement("script"); if (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; script.nonce = nonce; beforeLoad?.(script); document.body.appendChild(script); }); }; return retry(load, { shouldRetry: (_2, iterations) => iterations <= 5 }); } // 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; } // 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, version) => { if (!version && isStaging(frontendApi)) { return "canary"; } if (!version) { return "latest"; } return version.split(".")[0] || "latest"; }; var getScriptUrl = (frontendApi, { clerkJSVersion }) => { const noSchemeFrontendApi = frontendApi.replace(/http(s)?:\/\//, ""); const major = getClerkJsMajorVersionOrTag(frontendApi, clerkJSVersion); return `https://${noSchemeFrontendApi}/npm/@clerk/clerk-js@${clerkJSVersion || major}/dist/clerk.browser.js`; }; function isLegacyDevAccountPortalOrigin(host) { return LEGACY_DEV_INSTANCE_SUFFIXES.some((legacyDevSuffix) => { return host.startsWith("accounts.") && host.endsWith(legacyDevSuffix); }); } function isCurrentDevAccountPortalOrigin(host) { return CURRENT_DEV_INSTANCE_SUFFIXES.some((currentDevSuffix) => { return host.endsWith(currentDevSuffix) && !host.endsWith(".clerk" + currentDevSuffix); }); } var TRAILING_SLASH_RE = /\/$|\/\?|\/#/; function hasTrailingSlash(input = "", respectQueryAndFragment) { if (!respectQueryAndFragment) { return input.endsWith("/"); } return TRAILING_SLASH_RE.test(input); } function withTrailingSlash(input = "", respectQueryAndFragment) { if (!respectQueryAndFragment) { return input.endsWith("/") ? input : input + "/"; } if (hasTrailingSlash(input, true)) { return input || "/"; } let path = input; let fragment = ""; const fragmentIndex = input.indexOf("#"); if (fragmentIndex >= 0) { path = input.slice(0, fragmentIndex); fragment = input.slice(fragmentIndex); if (!path) { return fragment; } } const [s0, ...s2] = path.split("?"); return s0 + "/" + (s2.length > 0 ? `?${s2.join("?")}` : "") + fragment; } function withoutTrailingSlash(input = "", respectQueryAndFragment) { if (!respectQueryAndFragment) { return (hasTrailingSlash(input) ? input.slice(0, -1) : input) || "/"; } if (!hasTrailingSlash(input, true)) { return input || "/"; } let path = input; let fragment = ""; const fragmentIndex = input.indexOf("#"); if (fragmentIndex >= 0) { path = input.slice(0, fragmentIndex); fragment = input.slice(fragmentIndex); } const [s0, ...s2] = path.split("?"); return (s0.slice(0, -1) || "/") + (s2.length > 0 ? `?${s2.join("?")}` : "") + fragment; } function hasLeadingSlash(input = "") { return input.startsWith("/"); } function withoutLeadingSlash(input = "") { return (hasLeadingSlash(input) ? input.slice(1) : input) || "/"; } function withLeadingSlash(input = "") { return hasLeadingSlash(input) ? input : "/" + input; } function cleanDoubleSlashes(input = "") { return input.split("://").map((string_) => string_.replace(/\/{2,}/g, "/")).join("://"); } function isNonEmptyURL(url) { return url && url !== "/"; } var JOIN_LEADING_SLASH_RE = /^\.?\//; function joinURL(base, ...input) { let url = base || ""; for (const segment of input.filter((url2) => isNonEmptyURL(url2))) { if (url) { const _segment = segment.replace(JOIN_LEADING_SLASH_RE, ""); url = withTrailingSlash(url) + _segment; } else { url = segment; } } return url; } var ABSOLUTE_URL_REGEX = /^[a-zA-Z][a-zA-Z\d+\-.]*?:/; var isAbsoluteUrl = (url) => ABSOLUTE_URL_REGEX.test(url); // src/versionSelector.ts var versionSelector = (clerkJSVersion, packageVersion = "5.56.0") => { if (clerkJSVersion) { return clerkJSVersion; } const prereleaseTag = getPrereleaseTag(packageVersion); if (prereleaseTag) { if (prereleaseTag === "snapshot") { return "5.56.0"; } return prereleaseTag; } return getMajorVersion(packageVersion); }; var getPrereleaseTag = (packageVersion) => packageVersion.trim().replace(/^v/, "").match(/-(.+?)(\.|$)/)?.[1]; var getMajorVersion = (packageVersion) => packageVersion.trim().replace(/^v/, "").split(".")[0]; // src/loadClerkJsScript.ts var FAILED_TO_LOAD_ERROR = "Clerk: Failed to load Clerk"; var { isDevOrStagingUrl } = createDevOrStagingUrlCache(); var errorThrower = buildErrorThrower({ packageName: "@clerk/shared" }); function setClerkJsLoadingErrorPackageName(packageName) { errorThrower.setPackageName({ packageName }); } var loadClerkJsScript = async (opts) => { const existingScript = document.querySelector("script[data-clerk-js-script]"); if (existingScript) { return new Promise((resolve, reject) => { existingScript.addEventListener("load", () => { resolve(existingScript); }); existingScript.addEventListener("error", () => { reject(FAILED_TO_LOAD_ERROR); }); }); } if (!opts?.publishableKey) { errorThrower.throwMissingPublishableKeyError(); return; } return loadScript(clerkJsScriptUrl(opts), { async: true, crossOrigin: "anonymous", nonce: opts.nonce, beforeLoad: applyClerkJsScriptAttributes(opts) }).catch(() => { throw new Error(FAILED_TO_LOAD_ERROR); }); }; var clerkJsScriptUrl = (opts) => { const { clerkJSUrl, clerkJSVariant, clerkJSVersion, proxyUrl, domain, publishableKey } = opts; if (clerkJSUrl) { return clerkJSUrl; } let scriptHost = ""; if (!!proxyUrl && isValidProxyUrl(proxyUrl)) { scriptHost = proxyUrlToAbsoluteURL(proxyUrl).replace(/http(s)?:\/\//, ""); } else if (domain && !isDevOrStagingUrl(parsePublishableKey(publishableKey)?.frontendApi || "")) { scriptHost = addClerkPrefix(domain); } else { scriptHost = parsePublishableKey(publishableKey)?.frontendApi || ""; } const variant = clerkJSVariant ? `${clerkJSVariant.replace(/\.+$/, "")}.` : ""; const version = versionSelector(clerkJSVersion); return `https://${scriptHost}/npm/@clerk/clerk-js@${version}/dist/clerk.${variant}browser.js`; }; var buildClerkJsScriptAttributes = (options) => { const obj = {}; if (options.publishableKey) { obj["data-clerk-publishable-key"] = options.publishableKey; } if (options.proxyUrl) { obj["data-clerk-proxy-url"] = options.proxyUrl; } if (options.domain) { obj["data-clerk-domain"] = options.domain; } if (options.nonce) { obj.nonce = options.nonce; } return obj; }; var applyClerkJsScriptAttributes = (options) => (script) => { const attributes = buildClerkJsScriptAttributes(options); for (const attribute in attributes) { script.setAttribute(attribute, attributes[attribute]); } }; // 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 { } }; 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 { } }; window.addEventListener("storage", notifyListeners); }; this.channelKey = KEY_PREFIX + name; this.setupLocalStorageListener(); } prefixEventName(eventName) { return this.channelKey + eventName; } }; // 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}),delete workerToTabIds[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 { 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(); callbacks.delete(id2); }); 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/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/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 s2 = str || ""; return s2.charAt(0).toUpperCase() + s2.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); function isTruthy(value) { if (typeof value === `boolean`) { return value; } if (value === void 0 || value === null) { return false; } if (typeof value === `string`) { if (value.toLowerCase() === `true`) { return true; } if (value.toLowerCase() === `false`) { return false; } } const number = parseInt(value, 10); if (isNaN(number)) { return false; } if (number > 0) { return true; } return false; } function getNonUndefinedValues(obj) { return Object.entries(obj).reduce((acc, [key, value]) => { if (value !== void 0) { acc[key] = value; } return acc; }, {}); } // src/object.ts var without = (obj, ...props) => { const copy = { ...obj }; for (const prop of props) { delete copy[prop]; } return copy; }; var removeUndefined = (obj) => { return Object.entries(obj).reduce((acc, [key, value]) => { if (value !== void 0 && value !== null) { acc[key] = value; } return acc; }, {}); }; var applyFunctionToObj = (obj, fn) => { const result = {}; for (const key in obj) { result[key] = fn(obj[key], key); } return result; }; var filterProps = (obj, filter) => { const result = {}; for (const key in obj)