UNPKG

headless-js-api

Version:

Headless JS client for Ecwid public API

233 lines (205 loc) 7.13 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _chunkAPGB4K3Hcjs = require('./chunk-APGB4K3H.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 = () => { const emulatedConfig = _chunkAPGB4K3Hcjs.getEmulatedApiConfig.call(void 0, ); const config = emulatedConfig != null ? emulatedConfig : apiConfig; if (config === void 0) { throw new Error("Error initializing Storefront API: Please call initStorefrontApi() method first."); } return config; }; var initStorefrontApi = async (config) => { var _a, _b; if (config.publicToken === void 0) { throw new Error("Error initializing Storefront API: publicToken is required"); } const storeId = (_a = config.storeId) != null ? _a : await _chunkAPGB4K3Hcjs.getStoreId.call(void 0, ); if (storeId === void 0) { throw new Error("Error initializing Storefront API: storeId id is not found"); } apiConfig = { baseURL: (_b = config.baseURL) != null ? _b : API_BASE_URL, publicToken: config.publicToken, storeId }; }; // src/client/instance.ts var _axios = require('axios'); var _axios2 = _interopRequireDefault(_axios); var axiosInstance; try { axiosInstance = _chunkAPGB4K3Hcjs.__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/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 ); 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 = {}; 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 }; 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" }; 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 = {}; 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 = {}; 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;