headless-js-api
Version:
Headless JS client for Ecwid public API
233 lines (205 loc) • 7.13 kB
JavaScript
;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;