UNPKG

@balldontlie/sdk

Version:

Official TypeScript/JavaScript SDK for the balldontlie API

134 lines (133 loc) 5.93 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.BaseClient = void 0; const axios_1 = __importDefault(require("axios")); const types_1 = require("./types"); class BaseClient { constructor(config) { const baseURL = config.baseUrl || "https://api.balldontlie.io"; this.client = axios_1.default.create({ baseURL, headers: { Authorization: config.apiKey, "Content-Type": "application/json", "x-bdl-client": "js", }, paramsSerializer: (params) => { const searchParams = new URLSearchParams(); Object.entries(params).forEach(([key, value]) => { if (Array.isArray(value)) { value.forEach((v) => { searchParams.append(`${key}[]`, v.toString()); }); } else { searchParams.append(key, value.toString()); } }); return searchParams.toString(); }, }); this.client.interceptors.response.use((response) => response, (error) => __awaiter(this, void 0, void 0, function* () { if (!error.response) { throw new types_1.APIError("Network error occurred", 500); } let errorMessage; try { const errorData = error.response.data; errorMessage = errorData.error || error.message; } catch (_a) { errorMessage = error.message; } throw new types_1.APIError(errorMessage, error.response.status, error.response.data); })); } getErrorMessage(error) { var _a, _b; if (axios_1.default.isAxiosError(error)) { // Try to get error message from response data if ((_a = error.response) === null || _a === void 0 ? void 0 : _a.data) { if (typeof error.response.data === "string") { return error.response.data; } if (error.response.data.error) { return error.response.data.error; } if (error.response.data.message) { return error.response.data.message; } } // Fall back to status text if ((_b = error.response) === null || _b === void 0 ? void 0 : _b.statusText) { return error.response.statusText; } // Use error message as last resort return error.message; } return "An unexpected error occurred"; } request(path_1) { return __awaiter(this, arguments, void 0, function* (path, options = {}) { var _a, _b; try { const response = yield this.client.request(Object.assign({ url: path }, options)); return response.data; } catch (error) { if (error instanceof types_1.APIError) { throw error; } if (axios_1.default.isAxiosError(error)) { const statusCode = ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) || 500; const responseData = (_b = error.response) === null || _b === void 0 ? void 0 : _b.data; const message = this.getErrorMessage(error); // Map status codes to specific error types switch (statusCode) { case 401: throw new types_1.AuthenticationError(message, statusCode, responseData); case 400: throw new types_1.ValidationError(message, statusCode, responseData); case 404: throw new types_1.NotFoundError(message, statusCode, responseData); case 429: throw new types_1.RateLimitError(message, statusCode, responseData); case 500: case 502: case 503: case 504: throw new types_1.ServerError(message, statusCode, responseData); default: throw new types_1.APIError(message, statusCode, responseData); } } // For non-Axios errors (shouldn't typically happen) throw new types_1.APIError("An unexpected error occurred", 500); } }); } buildQueryParams(params) { if (!params) return {}; const result = {}; Object.entries(params).forEach(([key, value]) => { if (value !== undefined && value !== null) { result[key] = value; } }); return result; } } exports.BaseClient = BaseClient;