UNPKG

@techsio/storefront-data

Version:

Medusa-first storefront data layer built on TanStack Query.

82 lines (81 loc) • 3.18 kB
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 };