@techsio/storefront-data
Version:
Medusa-first storefront data layer built on TanStack Query.
82 lines (81 loc) • 3.18 kB
JavaScript
const normalizeCountryCode = (query)=>{
const countryCode = query.country_code;
if ("string" == typeof countryCode) return {
...query,
country_code: countryCode.toLowerCase()
};
return query;
};
const toListResponse = (response, query, products)=>{
const queryLimit = query.limit;
const queryOffset = query.offset;
return {
products,
count: response.count ?? products.length,
limit: response.limit ?? ("number" == typeof queryLimit ? queryLimit : products.length),
offset: response.offset ?? ("number" == typeof queryOffset ? queryOffset : 0)
};
};
function createMedusaProductService(sdk, config) {
const { listPath = "/store/products", defaultListFields, defaultDetailFields, normalizeListQuery, normalizeDetailQuery, transformProduct, transformListProduct, transformDetailProduct, createGlobalFetcher = true } = config ?? {};
const baseTransform = transformProduct ?? ((product)=>product);
const mapListProduct = transformListProduct ?? ((product)=>baseTransform(product));
const mapDetailProduct = transformDetailProduct ?? ((product)=>baseTransform(product));
const buildListQuery = (params)=>{
const query = normalizeListQuery ? normalizeListQuery(params) : {
...params,
...defaultListFields && !params.fields ? {
fields: defaultListFields
} : {}
};
return normalizeCountryCode(query);
};
const buildDetailQuery = (params)=>{
const query = normalizeDetailQuery ? normalizeDetailQuery(params) : {
handle: params.handle,
limit: 1,
region_id: params.region_id,
country_code: params.country_code,
province: params.province,
cart_id: params.cart_id,
locale: params.locale,
...params.fields || defaultDetailFields ? {
fields: params.fields ?? defaultDetailFields
} : {}
};
return normalizeCountryCode(query);
};
const getProducts = async (params, signal)=>{
const query = buildListQuery(params);
const response = await sdk.client.fetch(listPath, {
query,
signal
});
const products = (response.products ?? []).map((product)=>mapListProduct(product, {
params,
query,
response
}));
return toListResponse(response, query, products);
};
const getProductsGlobal = createGlobalFetcher ? async (params)=>getProducts(params, void 0) : void 0;
return {
getProducts,
getProductsGlobal,
async getProductByHandle (params, signal) {
const query = buildDetailQuery(params);
const response = await sdk.client.fetch(listPath, {
query,
signal
});
const product = response.products?.[0];
if (!product) return null;
return mapDetailProduct(product, {
params,
query,
response
});
}
};
}
export { createMedusaProductService };