{"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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"}