UNPKG

headless-js-api

Version:

Headless JS client for Ecwid public API

293 lines (262 loc) 9.7 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _chunkG3KADRYTcjs = require('./chunk-G3KADRYT.cjs'); var _chunkOBGZSXTJcjs = require('./chunk-OBGZSXTJ.cjs'); // src/client/consts.ts var API_BASE_URL = "https://app.ecwid.com/api/v3/"; var API_TIMEOUT = 1e4; var API_CACHE_DURATION = 500; var ONGOING_REQUESTS = /* @__PURE__ */ new Map(); // src/config/index.ts var apiConfig; var getApiConfig = () => { if (apiConfig === void 0) { throw new Error("Error initializing Storefront API: Please call initStorefrontApi() method first."); } return apiConfig; }; var initStorefrontApi = async (config) => { var _a, _b, _c, _d; if (config.publicToken === void 0) { throw new Error("Error initializing Storefront API: publicToken is required"); } const storeId = (_a = config.storeId) != null ? _a : await _chunkG3KADRYTcjs.getStoreId.call(void 0, ); if (storeId === void 0) { throw new Error("Error initializing Storefront API: storeId id is not found"); } const shouldUseMocks = (_c = (_b = _chunkG3KADRYTcjs.getShouldUseMocks.call(void 0, )) != null ? _b : config.useMocks) != null ? _c : false; apiConfig = { baseURL: (_d = config.baseURL) != null ? _d : API_BASE_URL, publicToken: config.publicToken, storeId, useMocks: shouldUseMocks }; }; // src/client/instance.ts var _axios = require('axios'); var _axios2 = _interopRequireDefault(_axios); var axiosInstance; try { axiosInstance = _chunkOBGZSXTJcjs.__require.call(void 0, "axios"); } catch (e) { axiosInstance = _axios2.default; } var instance_default = axiosInstance; // src/client/request-interceptor.ts // src/client/utils.ts function generateRequestKey(config) { const { url, method, params = {}, data = {} } = config; return `${method == null ? void 0 : method.toUpperCase()}:${url}:${JSON.stringify(params)}:${JSON.stringify(data)}`; } function isErrorWithExistingPromise(error) { return _axios2.default.isCancel(error) && "existingPromise" in error && error.existingPromise !== void 0; } // src/client/request-interceptor.ts function cleanupOldRequests(now) { Object.entries(ONGOING_REQUESTS).forEach(([key, req]) => { if (now - req.timestamp > API_CACHE_DURATION) { ONGOING_REQUESTS.delete(key); } }); } function onFulfilled(config) { const key = generateRequestKey(config); const now = Date.now(); cleanupOldRequests(now); const existingRequest = ONGOING_REQUESTS.get(key); if (existingRequest) { const error = new (0, _axios.CanceledError)(`Duplicate request: ${key}`); error.existingPromise = existingRequest.promise; return Promise.reject(error); } const source = _axios2.default.CancelToken.source(); config.cancelToken = source.token; const requestPromise = new Promise((resolve, reject) => { config.resolvePromise = resolve; config.rejectPromise = reject; }); ONGOING_REQUESTS.set(key, { promise: requestPromise, timestamp: now }); return config; } function onRejected(error) { return Promise.reject(error); } var request_interceptor_default = { onFulfilled, onRejected }; // src/client/response-interceptor.ts function onFulfilled2(response) { const key = generateRequestKey(response.config); const requestData = ONGOING_REQUESTS.get(key); if (requestData) { const resolve = response.config.resolvePromise; if (resolve) { resolve(response); } ONGOING_REQUESTS.set(key, { ...requestData, timestamp: Date.now() }); } return response; } function onRejected2(error) { if (isErrorWithExistingPromise(error)) { return error.existingPromise; } if (error.config) { const key = generateRequestKey(error.config); const requestData = ONGOING_REQUESTS.get(key); if (requestData) { const reject = error.config.rejectPromise; if (reject) { reject(error); } ONGOING_REQUESTS.set(key, { ...requestData, timestamp: Date.now() }); } } return Promise.reject(error); } var response_interceptor_default = { onFulfilled: onFulfilled2, onRejected: onRejected2 }; // src/client/mock-registry.ts var MOCK_REGISTRY = { ["GetStoreProfile" /* GetStoreProfile */]: () => Promise.resolve().then(() => _interopRequireWildcard(require("./get-store-profile-mock-R25KXS3N.cjs"))), ["GetProduct" /* GetProduct */]: () => Promise.resolve().then(() => _interopRequireWildcard(require("./get-product-mock-2ZFUWER3.cjs"))), ["SearchProducts" /* SearchProducts */]: () => Promise.resolve().then(() => _interopRequireWildcard(require("./search-products-mock-H7RYDRR6.cjs"))), ["DownloadProductFile" /* DownloadProductFile */]: () => Promise.resolve().then(() => _interopRequireWildcard(require("./download-product-file-mock-M22YRB3L.cjs"))), ["SearchCategories" /* SearchCategories */]: () => Promise.resolve().then(() => _interopRequireWildcard(require("./search-categories-mock-2KJPWJY6.cjs"))) }; // src/client/mocks-interceptor.ts async function resolveMockResponse(mockRequest) { if (!mockRequest) { return Promise.resolve({ message: "Please provide a valid mock request" }); } if (!MOCK_REGISTRY[mockRequest]) { return Promise.resolve({ message: `Mock request "${mockRequest}" not found` }); } return (await MOCK_REGISTRY[mockRequest]()).default; } async function onFulfilled3(config) { return Promise.reject({ status: 200, data: await resolveMockResponse(config.mockRequest), statusText: "Ok", headers: {} }); } function onRejected3(error) { return Promise.resolve({ status: error.status, data: error.data, statusText: error.statusText, headers: error.headers }); } var mocks_interceptor_default = { onFulfilled: onFulfilled3, onRejected: onRejected3 }; // src/client/index.ts var axiosInstance2 = null; function createInstance() { const config = getApiConfig(); const instance = instance_default.create({ timeout: API_TIMEOUT, headers: { "Content-Type": "application/json", Authorization: `Bearer ${config.publicToken}` } }); instance.interceptors.request.use( request_interceptor_default.onFulfilled, request_interceptor_default.onRejected ); instance.interceptors.response.use( response_interceptor_default.onFulfilled, response_interceptor_default.onRejected ); if (config.useMocks) { instance.interceptors.request.use( mocks_interceptor_default.onFulfilled ); instance.interceptors.response.use( (response) => response, mocks_interceptor_default.onRejected ); } return instance; } var getApiClient = () => { if (axiosInstance2 === null) { axiosInstance2 = createInstance(); } return axiosInstance2; }; // src/api/products/requests/search-products/index.ts var searchProducts = async (params) => { const apiClient = getApiClient(); const { storeId, baseURL } = getApiConfig(); const options = { mockRequest: "SearchProducts" /* SearchProducts */ }; if (params !== void 0) { options.params = params; } const url = `${baseURL}${storeId}/products`; const response = await apiClient.get(url, options); return response.data; }; // src/api/products/requests/get-product/index.ts var getProduct = async (params) => { const apiClient = getApiClient(); const { storeId, baseURL } = getApiConfig(); const { productId, ...queryParams } = params; const options = { params: queryParams, mockRequest: "GetProduct" /* GetProduct */ }; const url = `${baseURL}${storeId}/products/${productId}`; const response = await apiClient.get(url, options); return response.data; }; // src/api/products/requests/download-product-file/index.ts var downloadProductFile = async (params) => { const apiClient = getApiClient(); const { storeId, baseURL } = getApiConfig(); const { productId, fileId } = params; const options = { responseType: "blob", mockRequest: "DownloadProductFile" /* DownloadProductFile */ }; const url = `${baseURL}${storeId}/products/${productId}/files/${fileId}`; const response = await apiClient.get(url, options); return response.data; }; // src/api/categories/requests/search-categories/index.ts var searchCategories = async (params) => { const apiClient = getApiClient(); const { storeId, baseURL } = getApiConfig(); const options = { mockRequest: "SearchCategories" /* SearchCategories */ }; if (params !== void 0) { options.params = params; } const url = `${baseURL}${storeId}/categories`; const response = await apiClient.get(url, options); return response.data; }; // src/api/store/requests/get-store-profile/index.ts var getStoreProfile = async (params) => { const apiClient = getApiClient(); const { storeId, baseURL } = getApiConfig(); const options = { mockRequest: "GetStoreProfile" /* GetStoreProfile */ }; if (params !== void 0) { options.params = params; } const url = `${baseURL}${storeId}/profile`; const response = await apiClient.get(url, options); return response.data; }; exports.getApiConfig = getApiConfig; exports.initStorefrontApi = initStorefrontApi; exports.searchProducts = searchProducts; exports.getProduct = getProduct; exports.downloadProductFile = downloadProductFile; exports.searchCategories = searchCategories; exports.getStoreProfile = getStoreProfile;