{"version":3,"file":"index.mjs","sources":["../src/errors/APIError.ts","../src/Client.ts"],"sourcesContent":["export class APIError extends Error {\n  public statusCode: number;\n\n  constructor(message: string, statusCode: number) {\n    super(message);\n\n    this.name = ' APIError';\n    this.statusCode = statusCode;\n  }\n}\n","import type { Link } from '@whizzes/linx';\nimport { APIError } from './errors/APIError';\n\nconst DEFAULT_HTTP_HEADERS: Record<string, string> = {\n  'content-type': 'application/json',\n};\n\nexport class Client {\n  private prefixUrl: URL;\n\n  constructor(prefixUrl: URL) {\n    this.prefixUrl = prefixUrl;\n  }\n\n  /**\n   * Creates a new Link through Linx with the provided URL.\n   *\n   * Internally validates the `originalUrl` to be a valid URL instance.\n   */\n  public async new(originalUrl: string): Promise<Link> {\n    new URL(originalUrl);\n\n    return await this.post('new', {\n      url: originalUrl,\n    });\n  }\n\n  private uri(path: string): string {\n    return `${this.prefixUrl.toString()}${path}`;\n  }\n\n  private async post<T, U>(\n    path: string,\n    body: T,\n    options: RequestInit = {},\n  ): Promise<U> {\n    const extendedOptions: RequestInit = {\n      ...options,\n      headers: {\n        ...DEFAULT_HTTP_HEADERS,\n        ...options.headers,\n      },\n      method: 'POST',\n      body: JSON.stringify(body),\n    };\n\n    const response = await fetch(this.uri(path), extendedOptions);\n    const responseBody = await response.json();\n\n    if (response.ok) {\n      return responseBody as U;\n    }\n\n    const message = (responseBody as { message: string })?.message;\n\n    // As of today we don't have enough use cases to implement\n    // dedicated errors. Instead we just take the error message\n    // and provide it as a `Error.message` value.\n    throw new APIError(message, response.status);\n  }\n}\n"],"names":["APIError","message","statusCode","DEFAULT_HTTP_HEADERS","Client","prefixUrl","originalUrl","path","body","options","extendedOptions","response","responseBody"],"mappings":"AAAO,MAAMA,UAAiB,KAAM,CAC3B,WAEP,YAAYC,EAAiBC,EAAoB,CAC/C,MAAMD,CAAO,EAEb,KAAK,KAAO,YACZ,KAAK,WAAaC,CACpB,CACF,CCNA,MAAMC,EAA+C,CACnD,eAAgB,kBAClB,EAEO,MAAMC,CAAO,CACV,UAER,YAAYC,EAAgB,CAC1B,KAAK,UAAYA,CACnB,CAOA,MAAa,IAAIC,EAAoC,CACnD,OAAI,IAAA,IAAIA,CAAW,EAEZ,MAAM,KAAK,KAAK,MAAO,CAC5B,IAAKA,CACP,CAAC,CACH,CAEQ,IAAIC,EAAsB,CAChC,MAAO,GAAG,KAAK,UAAU,SAAS,IAAIA,GACxC,CAEA,MAAc,KACZA,EACAC,EACAC,EAAuB,CACX,EAAA,CACZ,MAAMC,EAA+B,CACnC,GAAGD,EACH,QAAS,CACP,GAAGN,EACH,GAAGM,EAAQ,OACb,EACA,OAAQ,OACR,KAAM,KAAK,UAAUD,CAAI,CAC3B,EAEMG,EAAW,MAAM,MAAM,KAAK,IAAIJ,CAAI,EAAGG,CAAe,EACtDE,EAAe,MAAMD,EAAS,KAAK,EAEzC,GAAIA,EAAS,GACX,OAAOC,EAGT,MAAMX,EAAWW,GAAsC,QAKvD,MAAM,IAAIZ,EAASC,EAASU,EAAS,MAAM,CAC7C,CACF"}