{"version":3,"file":"redirectUrls.mjs","names":["#parse","#parseSearchParams","#getRedirectUrl","#toSearchParams","#flattenPreserved","#flattenAll","res: RedirectOptions & { redirectUrl?: string | null }","#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":";;;;;;;;;;;;;;;AAOA,IAAa,eAAb,MAAa,aAAa;CACxB,OAAe,OAAkD;EAC/D;EACA;EACA;EACA;EACA;EACD;CAED,OAAe,YAAY,CAAC,cAAc;CAE1C,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,YAAY,SAAuB,QAAyB,EAAE,EAAE,eAAoB,EAAE,EAAE,MAAsB;AAC5G,OAAK,UAAU;AACf,OAAK,cAAc,MAAKA,MAAO,WAAW,EAAE,CAAC;AAC7C,OAAK,YAAY,MAAKA,MAAO,SAAS,EAAE,CAAC;AACzC,OAAK,mBAAmB,MAAKC,kBAAmB,gBAAgB,EAAE,CAAC;AACnE,OAAK,OAAO;;CAGd,oBAAoB;AAClB,SAAO,MAAKC,eAAgB,SAAS;;CAGvC,oBAAoB;AAClB,SAAO,MAAKA,eAAgB,SAAS;;CAGvC,2BAA2B;AACzB,SAAO,MAAKC,eAAgB,MAAKC,kBAAmB,CAAC;;CAGvD,iBAAiB;AACf,SAAO,MAAKD,eAAgB,MAAKE,YAAa,CAAC;;CAGjD,gBAAgB,KAAiE;EAC/E,MAAM,aAAa,OAAO,YAAY,OAAO,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,aAAa,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5G,SAAO,IAAI,gBAAgB,gBAAgB,WAAW,CAA2B;;CAGnF,oBAAoB;AAClB,SAAO,OAAO,YACZ,OAAO,QAAQ,EAAE,GAAG,KAAK,kBAAkB,CAAC,CAAC,QAAQ,CAAC,SAAS,aAAa,UAAU,SAAS,IAAI,CAAC,CACrG;;CAGH,cAAc;EACZ,MAAM,yBACJ,KAAK,iBAAiB,0BACtB,KAAK,UAAU,0BACf,KAAK,YAAY;EACnB,MAAM,4BACJ,KAAK,iBAAiB,6BACtB,KAAK,UAAU,6BACf,KAAK,YAAY;EACnB,MAAM,yBACJ,KAAK,iBAAiB,0BACtB,KAAK,UAAU,0BACf,KAAK,YAAY;EAOnB,MAAMC,MAAyD;GAC7D;GACA;GACA,2BARA,KAAK,iBAAiB,6BACtB,KAAK,UAAU,6BACf,KAAK,YAAY;GAOjB;GACA,aAPkB,KAAK,iBAAiB,eAAe,KAAK,UAAU;GAQvE;AAED,MAAI,uBACF,QAAO,IAAI;AAGb,MAAI,uBACF,QAAO,IAAI;AAGb,SAAO;;CAGT,gBAAgB,QAA6B;EAC3C,MAAM,WAAW,GAAG,OAAO;EAC3B,MAAM,cAAc,GAAG,OAAO;EAE9B,IAAI;AAEJ,WAAS,KAAK,iBAAiB,aAAa,KAAK,UAAU,aAAa,KAAK,YAAY;AAEzF,aAAW,KAAK,iBAAiB;AAEjC,aAAW,KAAK,iBAAiB,gBAAgB,KAAK,UAAU,gBAAgB,KAAK,YAAY;AAEjG,MAAI,CAAC,UAAU,KAAK,SAAS,QAC3B,QAAO,OAAO,SAAS;AAGzB,SAAO,UAAU;;CAGnB,OAAO,KAAc;EACnB,MAAM,MAAM,EAAE;AACd,eAAa,KAAK,SAAQ,QAAO;AAE/B,OAAI,OAAO,IAAI;IACf;AACF,SAAO,mBAAmB,MAAKC,gBAAiB,MAAKC,eAAgB,YAAY,KAAK,QAAQ,CAAC,CAAC,GAAE,QAChG,IAAI,UAAU,CACf;;CAGH,mBAAmB,KAAU;EAC3B,MAAM,MAAM,EAAE;AACd,eAAa,KAAK,SAAQ,QAAO;AAC/B,OAAI,eAAe,gBACjB,KAAI,OAAO,IAAI,IAAI,aAAa,IAAI,CAAC;OAErC,KAAI,OAAO,IAAI,aAAa,IAAI;IAElC;AACF,SAAO,mBAAmB,MAAKD,gBAAiB,MAAKC,eAAgB,YAAY,KAAK,QAAQ,CAAC,CAAC,GAAE,QAChG,IAAI,UAAU,CACf;;CAGH,gBAAgB,KAAsB;AACpC,SAAO,mBAAmB,MAAM,QAAgB,sBAAsB,KAAK,OAAO,SAAS,OAAO,CAAC;;CAGrG,oBAAoB,QAAyB;AAC3C,SAAO,YAAY,KAAK,kBAAkB,KAAK,SAAS,wBAAwB,OAAO,SAAS,OAAO,CAAC"}