UNPKG

@clerk/shared

Version:

Internal package utils used by the Clerk SDKs

1 lines 7.73 kB
{"version":3,"file":"redirectUrls.mjs","names":["#parse","#parseSearchParams","#getRedirectUrl","#toSearchParams","#flattenPreserved","#flattenAll","#filterRedirects","#toAbsoluteUrls"],"sources":["../../../src/internal/clerk-js/redirectUrls.ts"],"sourcesContent":["import { applyFunctionToObj, filterProps, removeUndefined } from '../../object';\nimport type { ClerkOptions, RedirectOptions } from '../../types';\nimport { camelToSnake } from '../../underscore';\nimport { isAllowedRedirect, relativeToAbsoluteUrl } from './url';\n\ntype ComponentMode = 'modal' | 'mounted';\n\nexport class RedirectUrls {\n private static keys: (keyof RedirectOptions | 'redirectUrl')[] = [\n 'signInForceRedirectUrl',\n 'signInFallbackRedirectUrl',\n 'signUpForceRedirectUrl',\n 'signUpFallbackRedirectUrl',\n 'redirectUrl',\n ];\n\n private static preserved = ['redirectUrl'];\n\n private readonly options: ClerkOptions;\n private readonly fromOptions: RedirectOptions;\n private readonly fromProps: RedirectOptions;\n private readonly fromSearchParams: RedirectOptions & { redirectUrl?: string | null };\n private readonly mode?: ComponentMode;\n\n constructor(options: ClerkOptions, props: RedirectOptions = {}, searchParams: any = {}, mode?: ComponentMode) {\n this.options = options;\n this.fromOptions = this.#parse(options || {});\n this.fromProps = this.#parse(props || {});\n this.fromSearchParams = this.#parseSearchParams(searchParams || {});\n this.mode = mode;\n }\n\n getAfterSignInUrl() {\n return this.#getRedirectUrl('signIn');\n }\n\n getAfterSignUpUrl() {\n return this.#getRedirectUrl('signUp');\n }\n\n getPreservedSearchParams() {\n return this.#toSearchParams(this.#flattenPreserved());\n }\n\n toSearchParams() {\n return this.#toSearchParams(this.#flattenAll());\n }\n\n #toSearchParams(obj: Record<string, string | undefined | null>): URLSearchParams {\n const camelCased = Object.fromEntries(Object.entries(obj).map(([key, value]) => [camelToSnake(key), value]));\n return new URLSearchParams(removeUndefined(camelCased) as Record<string, string>);\n }\n\n #flattenPreserved() {\n return Object.fromEntries(\n Object.entries({ ...this.fromSearchParams }).filter(([key]) => RedirectUrls.preserved.includes(key)),\n );\n }\n\n #flattenAll() {\n const signUpForceRedirectUrl =\n this.fromSearchParams.signUpForceRedirectUrl ||\n this.fromProps.signUpForceRedirectUrl ||\n this.fromOptions.signUpForceRedirectUrl;\n const signUpFallbackRedirectUrl =\n this.fromSearchParams.signUpFallbackRedirectUrl ||\n this.fromProps.signUpFallbackRedirectUrl ||\n this.fromOptions.signUpFallbackRedirectUrl;\n const signInForceRedirectUrl =\n this.fromSearchParams.signInForceRedirectUrl ||\n this.fromProps.signInForceRedirectUrl ||\n this.fromOptions.signInForceRedirectUrl;\n const signInFallbackRedirectUrl =\n this.fromSearchParams.signInFallbackRedirectUrl ||\n this.fromProps.signInFallbackRedirectUrl ||\n this.fromOptions.signInFallbackRedirectUrl;\n const redirectUrl = this.fromSearchParams.redirectUrl || this.fromProps.redirectUrl;\n\n const res: RedirectOptions & { redirectUrl?: string | null } = {\n signUpForceRedirectUrl,\n signUpFallbackRedirectUrl,\n signInFallbackRedirectUrl,\n signInForceRedirectUrl,\n redirectUrl,\n };\n\n if (signUpForceRedirectUrl) {\n delete res.signUpFallbackRedirectUrl;\n }\n\n if (signInForceRedirectUrl) {\n delete res.signInFallbackRedirectUrl;\n }\n\n return res;\n }\n\n #getRedirectUrl(prefix: 'signIn' | 'signUp') {\n const forceKey = `${prefix}ForceRedirectUrl` as const;\n const fallbackKey = `${prefix}FallbackRedirectUrl` as const;\n\n let result;\n // Prioritize forceRedirectUrl\n result = this.fromSearchParams[forceKey] || this.fromProps[forceKey] || this.fromOptions[forceKey];\n // Try to get redirect_url, only allowed as a search param\n result ||= this.fromSearchParams.redirectUrl;\n // Otherwise, fallback to fallbackRedirectUrl\n result ||= this.fromSearchParams[fallbackKey] || this.fromProps[fallbackKey] || this.fromOptions[fallbackKey];\n\n if (!result && this.mode === 'modal') {\n return window.location.href;\n }\n\n return result || '/';\n }\n\n #parse(obj: unknown) {\n const res = {} as RedirectOptions & { redirectUrl?: string | null };\n RedirectUrls.keys.forEach(key => {\n // @ts-expect-error\n res[key] = obj[key];\n });\n return applyFunctionToObj(this.#filterRedirects(this.#toAbsoluteUrls(filterProps(res, Boolean))), val =>\n val.toString(),\n );\n }\n\n #parseSearchParams(obj: any) {\n const res = {} as typeof this.fromSearchParams;\n RedirectUrls.keys.forEach(key => {\n if (obj instanceof URLSearchParams) {\n res[key] = obj.get(camelToSnake(key));\n } else {\n res[key] = obj[camelToSnake(key)];\n }\n });\n return applyFunctionToObj(this.#filterRedirects(this.#toAbsoluteUrls(filterProps(res, Boolean))), val =>\n val.toString(),\n );\n }\n\n #toAbsoluteUrls(obj: RedirectOptions) {\n return applyFunctionToObj(obj, (url: string) => relativeToAbsoluteUrl(url, window.location.origin));\n }\n\n #filterRedirects = (obj: RedirectOptions) => {\n return filterProps(obj, isAllowedRedirect(this.options?.allowedRedirectOrigins, window.location.origin));\n };\n}\n"],"mappings":"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"}