{"version":3,"file":"localazy-generic-connector-client.cjs","sources":["../../src/http/fetch-http-adapter.ts","../../src/api/methods/api-base.ts","../../src/api/methods/api-public.ts","../../src/api/methods/api-oauth.ts","../../src/api/methods/api-analytics.ts","../../src/api/generic-connector-client.ts","../../src/enums/service.ts","../../src/utils/get-oauth-authorization-url.ts"],"sourcesContent":["import { IHttpAdapter } from '@/http/i-http-adapter';\nimport { Services } from '@/main';\nimport { GenericConnectorClientOptions } from '@/types/generic-connector-client-options';\nimport { RequestConfig } from '@/types/request-config';\n\nexport class FetchHttpAdapter implements IHttpAdapter<RequestConfig> {\n  protected genericConnectorUrl: string;\n\n  protected pluginId: Services;\n\n  constructor(options: GenericConnectorClientOptions) {\n    this.genericConnectorUrl = options.genericConnectorUrl || 'https://plugins.localazy.com/generic-connector';\n\n    this.pluginId = options.pluginId;\n  }\n\n  async get(url: string, config?: RequestConfig): Promise<object | string | Blob> {\n    return this.makeRequest('GET', url, config);\n  }\n\n  async post(url: string, data: unknown, config?: RequestConfig): Promise<object | string | Blob> {\n    return this.makeRequest('POST', url, config, data);\n  }\n\n  async put(url: string, data: unknown, config?: RequestConfig): Promise<object | string | Blob> {\n    return this.makeRequest('PUT', url, config, data);\n  }\n\n  async delete(url: string, config?: RequestConfig): Promise<object | string | Blob> {\n    return this.makeRequest('DELETE', url, config);\n  }\n\n  protected urlFactory(url: string): string {\n    return `${this.genericConnectorUrl}${url}`;\n  }\n\n  protected configFactory(method: string, config?: RequestConfig, data?: unknown): RequestInit {\n    const result: RequestInit = {\n      method,\n      headers: {\n        ...(config?.headers || {}),\n        'X-Localazy-Plugin-Id': `${this.pluginId}`,\n        Accept: 'application/json',\n        'Content-Type': 'application/json',\n      },\n    };\n\n    if (data) {\n      result.body = JSON.stringify(data);\n    }\n\n    return result;\n  }\n\n  protected async makeRequest(\n    method: string,\n    url: string,\n    config?: RequestConfig,\n    data?: unknown,\n  ): Promise<object | string | Blob> {\n    let resolvedUrl: string = this.urlFactory(url);\n    if (method === 'GET' && config?.params) {\n      const params: URLSearchParams = new URLSearchParams(config.params);\n      resolvedUrl += `?${params.toString()}`;\n    }\n    const response: Response = await fetch(resolvedUrl, this.configFactory(method, config, data));\n\n    const contentType: string | null = response.headers.get('content-type');\n    const isBlob: boolean = config?.responseType === 'blob' || false;\n    const isJson: boolean = contentType?.startsWith('application/json') || false;\n\n    let result: string | object | { error: string } | Blob;\n\n    if (isBlob) {\n      result = await response.blob();\n    } else if (isJson) {\n      result = (await response.json()) as object;\n    } else {\n      result = await response.text();\n    }\n\n    if (response.status >= 400) {\n      // @ts-expect-error property is not defined on string\n      const text: string = isJson && result.error ? result.error : response.statusText;\n      throw new Error(`Request failed with status code ${response.status}: ${text}`);\n    }\n\n    return result;\n  }\n}\n","import { GenericConnectorClient } from '@/api/generic-connector-client';\n\nexport abstract class ApiBase {\n  protected api: GenericConnectorClient;\n\n  constructor(api: GenericConnectorClient) {\n    this.api = api;\n  }\n}\n","import { RequestConfig } from '@/types/request-config';\nimport { ApiBase } from '@/api/methods/api-base';\nimport { GeneratedKeys } from '@/types/generated-keys';\n\nexport class ApiPublic extends ApiBase {\n  /**\n   * Get generated {@link GeneratedKeys keys} for OAuth polling process\n   *\n   * @param config Request config\n   */\n  public async keys(config?: RequestConfig): Promise<GeneratedKeys> {\n    return (await this.api.client.get('/public/keys', { ...config })) as GeneratedKeys;\n  }\n}\n","import { RequestConfig } from '@/types/request-config';\nimport { OAuthPollRequest } from '@/types/oauth-poll-request';\nimport { ApiBase } from './api-base';\nimport { PollResponse, PollResponseCompleted } from '@/main';\nimport { OAuthContinuousPollRequest } from '@/types/oauth-continuous-poll-request';\n\nexport class ApiOAuth extends ApiBase {\n  public async poll(request: OAuthPollRequest, config?: RequestConfig): Promise<PollResponse> {\n    return (await this.api.client.get('/oauth/poll', {\n      ...config,\n      params: {\n        ...config?.params,\n        ...request,\n      },\n    })) as PollResponse;\n  }\n\n  /**\n   * Polls the OAuth server continuously until the sign in process is completed\n   * Polls for 3 minutes by default\n   * @throws Error if polling times out\n   */\n  public async continuousPoll(\n    request: OAuthContinuousPollRequest,\n    config?: RequestConfig,\n  ): Promise<PollResponseCompleted> {\n    const POLLING_LIMIT = request.pollingMaxAttempts || 60;\n    const INTERVAL_PERIOD = request.pollingIntervalMs || 2000;\n\n    let counter = 1;\n\n    let result = await this.poll({ readKey: request.readKey }, config);\n    if (!result.completed) {\n      return new Promise((resolve, reject) => {\n        // eslint-disable-next-line @typescript-eslint/no-misused-promises\n        const pollInterval = setInterval(async (): Promise<any> => {\n          result = await this.poll({ readKey: request.readKey }, config);\n\n          if (result.completed) {\n            clearInterval(pollInterval);\n            resolve(result);\n          }\n\n          counter += 1;\n          if (counter >= POLLING_LIMIT) {\n            clearInterval(pollInterval);\n            reject(new Error('Sign in attempts timed out.'));\n          }\n        }, INTERVAL_PERIOD);\n      });\n    }\n    return result;\n  }\n}\n","import { RequestConfig } from '@/types/request-config';\nimport { ApiBase } from '@/api/methods/api-base';\nimport { AnalyticsTrackRequest } from '@/types/analytics-track-request';\nimport { AnalyticsTrackResponse } from '@/types/analytics-track-response';\n\nexport class ApiAnalytics extends ApiBase {\n  public async track(request: AnalyticsTrackRequest, config?: RequestConfig): Promise<AnalyticsTrackResponse> {\n    return (await this.api.client.post('/analytics/track', request, config)) as AnalyticsTrackResponse;\n  }\n}\n","import { FetchHttpAdapter } from '@/http/fetch-http-adapter';\nimport { IHttpAdapter } from '@/http/i-http-adapter';\nimport { GenericConnectorClientOptions } from '@/types/generic-connector-client-options';\nimport { ApiPublic } from '@/api/methods/api-public';\nimport { ApiOAuth } from '@/api/methods/api-oauth';\nimport { ApiAnalytics } from '@/api/methods/api-analytics';\n\nexport class GenericConnectorClient {\n  public client: IHttpAdapter;\n\n  public public: ApiPublic;\n\n  public oauth: ApiOAuth;\n\n  public analytics: ApiAnalytics;\n\n  constructor(options: GenericConnectorClientOptions) {\n    this.client = new FetchHttpAdapter(options);\n\n    this.public = new ApiPublic(this);\n    this.oauth = new ApiOAuth(this);\n    this.analytics = new ApiAnalytics(this);\n  }\n}\n","export enum Services {\n  'UNKNOWN_SERVICE' = -1,\n  'FIGMA' = 0,\n  'STRAPI' = 1,\n  'ZAPIER' = 2,\n  'STORYBLOK' = 3,\n  'INTERCOM' = 4,\n  'DIRECTUS' = 5,\n  'ZENDESK' = 6,\n  'IN_CONTEXT_EDITOR' = 7,\n}\n","import { OAuthAuthorizationUrlRequest } from '@/types/oauth-authorization-url-request';\n\n/**\n * Get OAuth authorization URL for the given request\n * @param query OAuth authorization URL request\n * @param baseUrl Base URL (can be with path), if passed, it will be used instead of `https://localazy.com`\n * @returns OAuth authorization URL\n */\nexport function getOAuthAuthorizationUrl(query: OAuthAuthorizationUrlRequest, baseUrl?: string) {\n  const params = new URLSearchParams();\n  params.append('client_id', query.clientId);\n  if (query.redirectUri) {\n    params.append('redirect_uri', query.redirectUri);\n  }\n  if (query.customId) {\n    params.append('custom_id', query.customId);\n  }\n  if (query.state) {\n    params.append('state', query.state);\n  }\n  if (query.scope) {\n    params.append('scope', query.scope);\n  }\n  if (query.allowCreate) {\n    params.append('allow_create', query.allowCreate.toString());\n  }\n  if (query.createType) {\n    params.append('create_type', query.createType);\n  }\n  if (query.createLocale) {\n    params.append('create_locale', query.createLocale);\n  }\n  if (query.minimalRole) {\n    params.append('minimal_role', query.minimalRole);\n  }\n\n  const localUrl = baseUrl || 'https://localazy.com';\n  const doesUrlContainPath = new URL(localUrl).pathname !== '/';\n\n  if (!doesUrlContainPath) {\n    return `${localUrl}/oauth/authorize?${params.toString()}`;\n  }\n\n  return `${localUrl}?${params.toString()}`;\n}\n"],"names":["Services"],"mappings":";;;;;;;;;;;AAKO,MAAM,iBAAwD;AAAA,EAKnE,YAAY,SAAwC;AAJ1C;AAEA;AAGH,SAAA,sBAAsB,QAAQ,uBAAuB;AAE1D,SAAK,WAAW,QAAQ;AAAA,EAC1B;AAAA,EAEA,MAAM,IAAI,KAAa,QAAyD;AAC9E,WAAO,KAAK,YAAY,OAAO,KAAK,MAAM;AAAA,EAC5C;AAAA,EAEA,MAAM,KAAK,KAAa,MAAe,QAAyD;AAC9F,WAAO,KAAK,YAAY,QAAQ,KAAK,QAAQ,IAAI;AAAA,EACnD;AAAA,EAEA,MAAM,IAAI,KAAa,MAAe,QAAyD;AAC7F,WAAO,KAAK,YAAY,OAAO,KAAK,QAAQ,IAAI;AAAA,EAClD;AAAA,EAEA,MAAM,OAAO,KAAa,QAAyD;AACjF,WAAO,KAAK,YAAY,UAAU,KAAK,MAAM;AAAA,EAC/C;AAAA,EAEU,WAAW,KAAqB;AACxC,WAAO,GAAG,KAAK,mBAAmB,GAAG,GAAG;AAAA,EAC1C;AAAA,EAEU,cAAc,QAAgB,QAAwB,MAA6B;AAC3F,UAAM,SAAsB;AAAA,MAC1B;AAAA,MACA,SAAS;AAAA,QACP,IAAI,iCAAQ,YAAW,CAAC;AAAA,QACxB,wBAAwB,GAAG,KAAK,QAAQ;AAAA,QACxC,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IAAA;AAGF,QAAI,MAAM;AACD,aAAA,OAAO,KAAK,UAAU,IAAI;AAAA,IACnC;AAEO,WAAA;AAAA,EACT;AAAA,EAEA,MAAgB,YACd,QACA,KACA,QACA,MACiC;AAC7B,QAAA,cAAsB,KAAK,WAAW,GAAG;AACzC,QAAA,WAAW,UAAS,iCAAQ,SAAQ;AACtC,YAAM,SAA0B,IAAI,gBAAgB,OAAO,MAAM;AAClD,qBAAA,IAAI,OAAO,SAAA,CAAU;AAAA,IACtC;AACM,UAAA,WAAqB,MAAM,MAAM,aAAa,KAAK,cAAc,QAAQ,QAAQ,IAAI,CAAC;AAE5F,UAAM,cAA6B,SAAS,QAAQ,IAAI,cAAc;AAChE,UAAA,UAAkB,iCAAQ,kBAAiB,UAAU;AAC3D,UAAM,UAAkB,2CAAa,WAAW,wBAAuB;AAEnE,QAAA;AAEJ,QAAI,QAAQ;AACD,eAAA,MAAM,SAAS;eACf,QAAQ;AACP,eAAA,MAAM,SAAS;IAAK,OACzB;AACI,eAAA,MAAM,SAAS;IAC1B;AAEI,QAAA,SAAS,UAAU,KAAK;AAE1B,YAAM,OAAe,UAAU,OAAO,QAAQ,OAAO,QAAQ,SAAS;AACtE,YAAM,IAAI,MAAM,mCAAmC,SAAS,MAAM,KAAK,IAAI,EAAE;AAAA,IAC/E;AAEO,WAAA;AAAA,EACT;AACF;ACvFO,MAAe,QAAQ;AAAA,EAG5B,YAAY,KAA6B;AAF/B;AAGR,SAAK,MAAM;AAAA,EACb;AACF;ACJO,MAAM,kBAAkB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrC,MAAa,KAAK,QAAgD;AACxD,WAAA,MAAM,KAAK,IAAI,OAAO,IAAI,gBAAgB,EAAE,GAAG,OAAA,CAAQ;AAAA,EACjE;AACF;ACPO,MAAM,iBAAiB,QAAQ;AAAA,EACpC,MAAa,KAAK,SAA2B,QAA+C;AAC1F,WAAQ,MAAM,KAAK,IAAI,OAAO,IAAI,eAAe;AAAA,MAC/C,GAAG;AAAA,MACH,QAAQ;AAAA,QACN,GAAG,iCAAQ;AAAA,QACX,GAAG;AAAA,MACL;AAAA,IAAA,CACD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,eACX,SACA,QACgC;AAC1B,UAAA,gBAAgB,QAAQ,sBAAsB;AAC9C,UAAA,kBAAkB,QAAQ,qBAAqB;AAErD,QAAI,UAAU;AAEV,QAAA,SAAS,MAAM,KAAK,KAAK,EAAE,SAAS,QAAQ,WAAW,MAAM;AAC7D,QAAA,CAAC,OAAO,WAAW;AACrB,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAEhC,cAAA,eAAe,YAAY,YAA0B;AAChD,mBAAA,MAAM,KAAK,KAAK,EAAE,SAAS,QAAQ,WAAW,MAAM;AAE7D,cAAI,OAAO,WAAW;AACpB,0BAAc,YAAY;AAC1B,oBAAQ,MAAM;AAAA,UAChB;AAEW,qBAAA;AACX,cAAI,WAAW,eAAe;AAC5B,0BAAc,YAAY;AACnB,mBAAA,IAAI,MAAM,6BAA6B,CAAC;AAAA,UACjD;AAAA,WACC,eAAe;AAAA,MAAA,CACnB;AAAA,IACH;AACO,WAAA;AAAA,EACT;AACF;AChDO,MAAM,qBAAqB,QAAQ;AAAA,EACxC,MAAa,MAAM,SAAgC,QAAyD;AAC1G,WAAQ,MAAM,KAAK,IAAI,OAAO,KAAK,oBAAoB,SAAS,MAAM;AAAA,EACxE;AACF;ACFO,MAAM,uBAAuB;AAAA,EASlC,YAAY,SAAwC;AAR7C;AAEA;AAEA;AAEA;AAGA,SAAA,SAAS,IAAI,iBAAiB,OAAO;AAErC,SAAA,SAAS,IAAI,UAAU,IAAI;AAC3B,SAAA,QAAQ,IAAI,SAAS,IAAI;AACzB,SAAA,YAAY,IAAI,aAAa,IAAI;AAAA,EACxC;AACF;ACvBY,IAAA,6BAAAA,cAAL;AACLA,YAAAA,UAAA,qBAAoB,EAApB,IAAA;AACAA,YAAAA,UAAA,WAAU,CAAV,IAAA;AACAA,YAAAA,UAAA,YAAW,CAAX,IAAA;AACAA,YAAAA,UAAA,YAAW,CAAX,IAAA;AACAA,YAAAA,UAAA,eAAc,CAAd,IAAA;AACAA,YAAAA,UAAA,cAAa,CAAb,IAAA;AACAA,YAAAA,UAAA,cAAa,CAAb,IAAA;AACAA,YAAAA,UAAA,aAAY,CAAZ,IAAA;AACAA,YAAAA,UAAA,uBAAsB,CAAtB,IAAA;AATUA,SAAAA;AAAA,GAAA,YAAA,CAAA,CAAA;ACQI,SAAA,yBAAyB,OAAqC,SAAkB;AACxF,QAAA,SAAS,IAAI;AACZ,SAAA,OAAO,aAAa,MAAM,QAAQ;AACzC,MAAI,MAAM,aAAa;AACd,WAAA,OAAO,gBAAgB,MAAM,WAAW;AAAA,EACjD;AACA,MAAI,MAAM,UAAU;AACX,WAAA,OAAO,aAAa,MAAM,QAAQ;AAAA,EAC3C;AACA,MAAI,MAAM,OAAO;AACR,WAAA,OAAO,SAAS,MAAM,KAAK;AAAA,EACpC;AACA,MAAI,MAAM,OAAO;AACR,WAAA,OAAO,SAAS,MAAM,KAAK;AAAA,EACpC;AACA,MAAI,MAAM,aAAa;AACrB,WAAO,OAAO,gBAAgB,MAAM,YAAY,UAAU;AAAA,EAC5D;AACA,MAAI,MAAM,YAAY;AACb,WAAA,OAAO,eAAe,MAAM,UAAU;AAAA,EAC/C;AACA,MAAI,MAAM,cAAc;AACf,WAAA,OAAO,iBAAiB,MAAM,YAAY;AAAA,EACnD;AACA,MAAI,MAAM,aAAa;AACd,WAAA,OAAO,gBAAgB,MAAM,WAAW;AAAA,EACjD;AAEA,QAAM,WAAW,WAAW;AAC5B,QAAM,qBAAqB,IAAI,IAAI,QAAQ,EAAE,aAAa;AAE1D,MAAI,CAAC,oBAAoB;AACvB,WAAO,GAAG,QAAQ,oBAAoB,OAAO,SAAU,CAAA;AAAA,EACzD;AAEA,SAAO,GAAG,QAAQ,IAAI,OAAO,SAAU,CAAA;AACzC;;;;;;;;;"}