@clerk/shared
Version:
Internal package utils used by the Clerk SDKs
1 lines • 8.73 kB
Source Map (JSON)
{"version":3,"file":"url.mjs","names":[],"sources":["../src/url.ts"],"sourcesContent":["import { CURRENT_DEV_INSTANCE_SUFFIXES, LEGACY_DEV_INSTANCE_SUFFIXES } from './constants';\nimport { isStaging } from './utils/instance';\n\n/**\n *\n */\nexport function parseSearchParams(queryString = ''): URLSearchParams {\n if (queryString.startsWith('?')) {\n queryString = queryString.slice(1);\n }\n return new URLSearchParams(queryString);\n}\n\n/**\n *\n */\nexport function stripScheme(url = ''): string {\n return (url || '').replace(/^.+:\\/\\//, '');\n}\n\n/**\n *\n */\nexport function addClerkPrefix(str: string | undefined) {\n if (!str) {\n return '';\n }\n let regex;\n if (str.match(/^(clerk\\.)+\\w*$/)) {\n regex = /(clerk\\.)*(?=clerk\\.)/;\n } else if (str.match(/\\.clerk.accounts/)) {\n return str;\n } else {\n regex = /^(clerk\\.)*/gi;\n }\n\n const stripped = str.replace(regex, '');\n return `clerk.${stripped}`;\n}\n\n/**\n *\n * Retrieve the clerk-js major tag using the major version from the pkgVersion\n * param or use the frontendApi to determine if the canary tag should be used.\n * The default tag is `latest`.\n */\nexport const getClerkJsMajorVersionOrTag = (frontendApi: string, version?: string) => {\n if (!version && isStaging(frontendApi)) {\n return 'canary';\n }\n\n if (!version) {\n return 'latest';\n }\n\n return version.split('.')[0] || 'latest';\n};\n\n/**\n *\n * Retrieve the clerk-js script url from the frontendApi and the major tag\n * using the {@link getClerkJsMajorVersionOrTag} or a provided clerkJSVersion tag.\n */\nexport const getScriptUrl = (frontendApi: string, { clerkJSVersion }: { clerkJSVersion?: string }) => {\n const noSchemeFrontendApi = frontendApi.replace(/http(s)?:\\/\\//, '');\n const major = getClerkJsMajorVersionOrTag(frontendApi, clerkJSVersion);\n return `https://${noSchemeFrontendApi}/npm/@clerk/clerk-js@${clerkJSVersion || major}/dist/clerk.browser.js`;\n};\n\n// Returns true for hosts such as:\n// * accounts.foo.bar-13.lcl.dev\n// * accounts.foo.bar-13.lclstage.dev\n// * accounts.foo.bar-13.dev.lclclerk.com\n/**\n *\n */\nexport function isLegacyDevAccountPortalOrigin(host: string): boolean {\n return LEGACY_DEV_INSTANCE_SUFFIXES.some(legacyDevSuffix => {\n return host.startsWith('accounts.') && host.endsWith(legacyDevSuffix);\n });\n}\n\n// Returns true for hosts such as:\n// * foo-bar-13.accounts.dev\n// * foo-bar-13.accountsstage.dev\n// * foo-bar-13.accounts.lclclerk.com\n// But false for:\n// * foo-bar-13.clerk.accounts.lclclerk.com\n/**\n *\n */\nexport function isCurrentDevAccountPortalOrigin(host: string): boolean {\n return CURRENT_DEV_INSTANCE_SUFFIXES.some(currentDevSuffix => {\n return host.endsWith(currentDevSuffix) && !host.endsWith('.clerk' + currentDevSuffix);\n });\n}\n\n/* Functions below are taken from https://github.com/unjs/ufo/blob/main/src/utils.ts. LICENSE: MIT */\n\nconst TRAILING_SLASH_RE = /\\/$|\\/\\?|\\/#/;\n\n/**\n *\n */\nexport function hasTrailingSlash(input = '', respectQueryAndFragment?: boolean): boolean {\n if (!respectQueryAndFragment) {\n return input.endsWith('/');\n }\n return TRAILING_SLASH_RE.test(input);\n}\n\n/**\n *\n */\nexport function withTrailingSlash(input = '', respectQueryAndFragment?: boolean): string {\n if (!respectQueryAndFragment) {\n return input.endsWith('/') ? input : input + '/';\n }\n if (hasTrailingSlash(input, true)) {\n return input || '/';\n }\n let path = input;\n let fragment = '';\n const fragmentIndex = input.indexOf('#');\n if (fragmentIndex >= 0) {\n path = input.slice(0, fragmentIndex);\n fragment = input.slice(fragmentIndex);\n if (!path) {\n return fragment;\n }\n }\n const [s0, ...s] = path.split('?');\n return s0 + '/' + (s.length > 0 ? `?${s.join('?')}` : '') + fragment;\n}\n\n/**\n *\n */\nexport function withoutTrailingSlash(input = '', respectQueryAndFragment?: boolean): string {\n if (!respectQueryAndFragment) {\n return (hasTrailingSlash(input) ? input.slice(0, -1) : input) || '/';\n }\n if (!hasTrailingSlash(input, true)) {\n return input || '/';\n }\n let path = input;\n let fragment = '';\n const fragmentIndex = input.indexOf('#');\n if (fragmentIndex >= 0) {\n path = input.slice(0, fragmentIndex);\n fragment = input.slice(fragmentIndex);\n }\n const [s0, ...s] = path.split('?');\n return (s0.slice(0, -1) || '/') + (s.length > 0 ? `?${s.join('?')}` : '') + fragment;\n}\n\n/**\n *\n */\nexport function hasLeadingSlash(input = ''): boolean {\n return input.startsWith('/');\n}\n\n/**\n *\n */\nexport function withoutLeadingSlash(input = ''): string {\n return (hasLeadingSlash(input) ? input.slice(1) : input) || '/';\n}\n\n/**\n *\n */\nexport function withLeadingSlash(input = ''): string {\n return hasLeadingSlash(input) ? input : '/' + input;\n}\n\n/**\n *\n */\nexport function cleanDoubleSlashes(input = ''): string {\n return input\n .split('://')\n .map(string_ => string_.replace(/\\/{2,}/g, '/'))\n .join('://');\n}\n\n/**\n *\n */\nexport function isNonEmptyURL(url: string) {\n return url && url !== '/';\n}\n\nconst JOIN_LEADING_SLASH_RE = /^\\.?\\//;\n\n/**\n *\n */\nexport function joinURL(base: string, ...input: string[]): string {\n let url = base || '';\n\n for (const segment of input.filter(url => isNonEmptyURL(url))) {\n if (url) {\n // TODO: Handle .. when joining\n const _segment = segment.replace(JOIN_LEADING_SLASH_RE, '');\n url = withTrailingSlash(url) + _segment;\n } else {\n url = segment;\n }\n }\n\n return url;\n}\n\n/* Code below is taken from https://github.com/vercel/next.js/blob/fe7ff3f468d7651a92865350bfd0f16ceba27db5/packages/next/src/shared/lib/utils.ts. LICENSE: MIT */\n\n// Scheme: https://tools.ietf.org/html/rfc3986#section-3.1\n// Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3\nconst ABSOLUTE_URL_REGEX = /^[a-zA-Z][a-zA-Z\\d+\\-.]*?:/;\nexport const isAbsoluteUrl = (url: string) => ABSOLUTE_URL_REGEX.test(url);\n"],"mappings":"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"}