{"version":3,"file":"createAuthUrlHandler.mjs","sources":["../../../../../../../web/src/utils/createAuthUrlHandler.ts"],"sourcesContent":["import type { SessionDurationOptions } from '@stytch/core/public';\n\nfunction isHandledTokenType<HandledTokenType extends string>(\n  handledTypes: HandledTokenType[],\n  tokenType: string,\n): tokenType is HandledTokenType {\n  return handledTypes.includes(tokenType as HandledTokenType);\n}\n\nexport const clearStytchTokenParams = () => {\n  const url = removeStytchTokenParams(window.location.toString());\n  window.history.replaceState(null, document.title, url);\n};\n\nexport type ParseAuthenticateUrl<HandledTokenType extends string> = (\n  href?: string,\n) =>\n  | { handled: true; token: string; tokenType: HandledTokenType }\n  | { handled: false; token: string; tokenType: string }\n  | null;\n\nexport type AuthenticateByUrl<TokenType extends string> = (\n  options: {\n    /**\n     * Clear token and stytch_token_type URL params after authenticate is called.\n     * @default true if the href parameter is window.location.href (the default)\n     **/\n    clearParams?: boolean;\n  } & SessionDurationOptions,\n\n  /**\n   * Allow overriding URL where the token and stytch_token_type params are extracted from.\n   * You usually would not need to set this.\n   * @default window.location.href\n   */\n  href?: string,\n) => Promise<\n  | {\n      handled: true;\n      tokenType: TokenType;\n      data: unknown;\n    }\n  | {\n      handled: false;\n      tokenType: string;\n      token: string;\n    }\n  | null\n>;\n\n/**\n * Creates both parseAuthenticateUrl and authenticateByUrl from the set of handlers passed in to ensure\n * both functions agree on what is handled.\n */\nexport const createAuthUrlHandler = <HandledTokenType extends string = string>(\n  handlers: Record<HandledTokenType, (token: string, options: SessionDurationOptions) => Promise<unknown>>,\n) => {\n  const handledTokenTypes = Object.keys(handlers) as HandledTokenType[];\n\n  const parseAuthenticateUrl: ParseAuthenticateUrl<HandledTokenType> = (href = window.location.href) => {\n    const url = new URL(href);\n    const tokenType = url.searchParams.get('stytch_token_type');\n    const token = url.searchParams.get('token');\n    if (!token || !tokenType) {\n      return null;\n    }\n\n    if (isHandledTokenType(handledTokenTypes, tokenType)) {\n      return {\n        handled: true,\n        token,\n        tokenType,\n      };\n    }\n\n    return {\n      handled: false,\n      token,\n      tokenType,\n    };\n  };\n\n  const authenticateByUrl: AuthenticateByUrl<HandledTokenType> = async (\n    { clearParams, ...options },\n    href = window.location.href,\n  ) => {\n    const shouldClearParams = clearParams ?? href === window.location.href;\n    const parsed = parseAuthenticateUrl(href);\n    if (parsed == null) return null;\n    if (!parsed.handled) return parsed;\n\n    const { token, tokenType } = parsed;\n    const handler = handlers[tokenType as HandledTokenType];\n\n    // Clear token immediately when it is \"consumed\" by the authenticate call to prevent reloads\n    // from repeating the call\n    if (shouldClearParams) {\n      clearStytchTokenParams();\n    }\n\n    const data = await handler(token, options);\n    return {\n      handled: true,\n      tokenType: tokenType as HandledTokenType,\n      data,\n    };\n  };\n\n  return {\n    authenticateByUrl,\n    parseAuthenticateUrl,\n  };\n};\n\n// Exported for testing\nexport function removeStytchTokenParams(href: string) {\n  const url = new URL(href);\n  const params = url.searchParams;\n\n  params.delete('token');\n  params.delete('stytch_token_type');\n\n  return url;\n}\n"],"names":["isHandledTokenType","handledTypes","tokenType","includes","clearStytchTokenParams","url","removeStytchTokenParams","window","location","toString","history","replaceState","document","title","createAuthUrlHandler","handlers","handledTokenTypes","Object","keys","parseAuthenticateUrl","href","URL","searchParams","get","token","handled","authenticateByUrl","clearParams","options","shouldClearParams","parsed","handler","data","params","delete"],"mappings":"AAEA,SAASA,kBAAAA,CACPC,YAAgC,EAChCC,SAAiB,EAAA;IAEjB,OAAOD,YAAAA,CAAaE,QAAQ,CAACD,SAAAA,CAAAA;AAC/B;MAEaE,sBAAAA,GAAyB,IAAA;AACpC,IAAA,MAAMC,GAAAA,GAAMC,uBAAAA,CAAwBC,MAAAA,CAAOC,QAAQ,CAACC,QAAQ,EAAA,CAAA;AAC5DF,IAAAA,MAAAA,CAAOG,OAAO,CAACC,YAAY,CAAC,IAAA,EAAMC,QAAAA,CAASC,KAAK,EAAER,GAAAA,CAAAA;AACpD;AAsCA;;;IAIO,MAAMS,oBAAAA,GAAuB,CAClCC,QAAAA,GAAAA;IAEA,MAAMC,iBAAAA,GAAoBC,MAAAA,CAAOC,IAAI,CAACH,QAAAA,CAAAA;AAEtC,IAAA,MAAMI,uBAA+D,CAACC,IAAAA,GAAOb,MAAAA,CAAOC,QAAQ,CAACY,IAAI,GAAA;QAC/F,MAAMf,GAAAA,GAAM,IAAIgB,GAAAA,CAAID,IAAAA,CAAAA;AACpB,QAAA,MAAMlB,SAAAA,GAAYG,GAAAA,CAAIiB,YAAY,CAACC,GAAG,CAAC,mBAAA,CAAA;AACvC,QAAA,MAAMC,KAAAA,GAAQnB,GAAAA,CAAIiB,YAAY,CAACC,GAAG,CAAC,OAAA,CAAA;QACnC,IAAI,CAACC,KAAAA,IAAS,CAACtB,SAAAA,EAAW;YACxB,OAAO,IAAA;AACT,QAAA;QAEA,IAAIF,kBAAAA,CAAmBgB,mBAAmBd,SAAAA,CAAAA,EAAY;YACpD,OAAO;gBACLuB,OAAAA,EAAS,IAAA;AACTD,gBAAAA,KAAAA;AACAtB,gBAAAA;AACF,aAAA;AACF,QAAA;QAEA,OAAO;YACLuB,OAAAA,EAAS,KAAA;AACTD,YAAAA,KAAAA;AACAtB,YAAAA;AACF,SAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMwB,iBAAAA,GAAyD,OAC7D,EAAEC,WAAW,EAAE,GAAGC,OAAAA,EAAS,EAC3BR,IAAAA,GAAOb,MAAAA,CAAOC,QAAQ,CAACY,IAAI,GAAA;AAE3B,QAAA,MAAMS,oBAAoBF,WAAAA,IAAeP,IAAAA,KAASb,MAAAA,CAAOC,QAAQ,CAACY,IAAI;AACtE,QAAA,MAAMU,SAASX,oBAAAA,CAAqBC,IAAAA,CAAAA;QACpC,IAAIU,MAAAA,IAAU,MAAM,OAAO,IAAA;AAC3B,QAAA,IAAI,CAACA,MAAAA,CAAOL,OAAO,EAAE,OAAOK,MAAAA;AAE5B,QAAA,MAAM,EAAEN,KAAK,EAAEtB,SAAS,EAAE,GAAG4B,MAAAA;QAC7B,MAAMC,OAAAA,GAAUhB,QAAQ,CAACb,SAAAA,CAA8B;;;AAIvD,QAAA,IAAI2B,iBAAAA,EAAmB;AACrBzB,YAAAA,sBAAAA,EAAAA;AACF,QAAA;QAEA,MAAM4B,IAAAA,GAAO,MAAMD,OAAAA,CAAQP,KAAAA,EAAOI,OAAAA,CAAAA;QAClC,OAAO;YACLH,OAAAA,EAAS,IAAA;YACTvB,SAAAA,EAAWA,SAAAA;AACX8B,YAAAA;AACF,SAAA;AACF,IAAA,CAAA;IAEA,OAAO;AACLN,QAAAA,iBAAAA;AACAP,QAAAA;AACF,KAAA;AACF;AAEA;AACO,SAASb,wBAAwBc,IAAY,EAAA;IAClD,MAAMf,GAAAA,GAAM,IAAIgB,GAAAA,CAAID,IAAAA,CAAAA;IACpB,MAAMa,MAAAA,GAAS5B,IAAIiB,YAAY;AAE/BW,IAAAA,MAAAA,CAAOC,MAAM,CAAC,OAAA,CAAA;AACdD,IAAAA,MAAAA,CAAOC,MAAM,CAAC,mBAAA,CAAA;IAEd,OAAO7B,GAAAA;AACT;;;;"}