import { IAuthRequestBuilder, IAuthRequestParams, IAuthRequestOptions, } from "./interfaces"; import { mapCamelCaseToUnderscore, stringifyArrayParams, formatQueryString } from "./utils"; export default class AuthRequestBuilder implements IAuthRequestBuilder { options: IAuthRequestOptions; authUri: string; static build(params: IAuthRequestParams) { const builder = new AuthRequestBuilder(params); return { builder: builder, googleLink: builder.getLoginUrl("google", params.options.targetLinkUri), twitterLink: builder.getLoginUrl("twitter", params.options.targetLinkUri), facebookLink: builder.getLoginUrl("facebook", params.options.targetLinkUri), passwordLink: builder.getLoginUrl("password", params.options.targetLinkUri), passwordlessLink: (email) => builder.getLoginUrl("passwordless", params.options.targetLinkUri, { "login_hint": email }) }; } constructor(params : IAuthRequestParams) { this.options = params.options; this.authUri = `${params.host}/oauth/authorize`; } buildUrl(queryObject) { const queryWithDefaults = { ...mapCamelCaseToUnderscore(stringifyArrayParams(this.options)), ...mapCamelCaseToUnderscore(stringifyArrayParams(queryObject)), }; return `${this.authUri}?${formatQueryString(queryWithDefaults)}`; } getLoginUrl(authMethod, redirect, settings = {}) { const queryObject = { auth_method: authMethod, target_link_uri: redirect, response_type: "code", prompt: "login", ...settings, }; return this.buildUrl(queryObject); } getRefreshUrl(authMethod, redirect, settings = {}) { const queryObject = { auth_method: authMethod, target_link_uri: redirect, response_type: "ajax", ...settings, }; return this.buildUrl(queryObject); } getAccessTokenUrl() { const query = { response_type: "token id_token", response_mode: "ajax", target_link_uri: "https://www.lonelyplanet.com", auth_method: "none", nonce: "null", }; return this.buildUrl(query); } }