UNPKG

@clerk/shared

Version:

Internal package utils used by the Clerk SDKs

171 lines (169 loc) • 5.24 kB
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); const require_constants = require('./constants.js'); const require_instance = require('./_chunks/instance-DcOvlnfl.js'); //#region 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; return `clerk.${str.replace(regex, "")}`; } /** * * Retrieve the clerk-js major tag using the major version from the pkgVersion * param or use the frontendApi to determine if the canary tag should be used. * The default tag is `latest`. */ const getClerkJsMajorVersionOrTag = (frontendApi, version) => { if (!version && require_instance.isStaging(frontendApi)) return "canary"; if (!version) return "latest"; return version.split(".")[0] || "latest"; }; /** * * Retrieve the clerk-js script url from the frontendApi and the major tag * using the {@link getClerkJsMajorVersionOrTag} or a provided clerkJSVersion tag. */ const 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 require_constants.LEGACY_DEV_INSTANCE_SUFFIXES.some((legacyDevSuffix) => { return host.startsWith("accounts.") && host.endsWith(legacyDevSuffix); }); } /** * */ function isCurrentDevAccountPortalOrigin(host) { return require_constants.CURRENT_DEV_INSTANCE_SUFFIXES.some((currentDevSuffix) => { return host.endsWith(currentDevSuffix) && !host.endsWith(".clerk" + currentDevSuffix); }); } const 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, ...s] = path.split("?"); return s0 + "/" + (s.length > 0 ? `?${s.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, ...s] = path.split("?"); return (s0.slice(0, -1) || "/") + (s.length > 0 ? `?${s.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 !== "/"; } const JOIN_LEADING_SLASH_RE = /^\.?\//; /** * */ function joinURL(base, ...input) { let url = base || ""; for (const segment of input.filter((url) => isNonEmptyURL(url))) if (url) { const _segment = segment.replace(JOIN_LEADING_SLASH_RE, ""); url = withTrailingSlash(url) + _segment; } else url = segment; return url; } const ABSOLUTE_URL_REGEX = /^[a-zA-Z][a-zA-Z\d+\-.]*?:/; const isAbsoluteUrl = (url) => ABSOLUTE_URL_REGEX.test(url); //#endregion exports.addClerkPrefix = addClerkPrefix; exports.cleanDoubleSlashes = cleanDoubleSlashes; exports.getClerkJsMajorVersionOrTag = getClerkJsMajorVersionOrTag; exports.getScriptUrl = getScriptUrl; exports.hasLeadingSlash = hasLeadingSlash; exports.hasTrailingSlash = hasTrailingSlash; exports.isAbsoluteUrl = isAbsoluteUrl; exports.isCurrentDevAccountPortalOrigin = isCurrentDevAccountPortalOrigin; exports.isLegacyDevAccountPortalOrigin = isLegacyDevAccountPortalOrigin; exports.isNonEmptyURL = isNonEmptyURL; exports.joinURL = joinURL; exports.parseSearchParams = parseSearchParams; exports.stripScheme = stripScheme; exports.withLeadingSlash = withLeadingSlash; exports.withTrailingSlash = withTrailingSlash; exports.withoutLeadingSlash = withoutLeadingSlash; exports.withoutTrailingSlash = withoutTrailingSlash; //# sourceMappingURL=url.js.map