@techsio/storefront-data
Version:
Medusa-first storefront data layer built on TanStack Query.
64 lines (63 loc) • 2.52 kB
JavaScript
const stripEnabled = (query)=>{
const { enabled: _enabled, ...rest } = query;
return rest;
};
function createMedusaCollectionService(sdk, config) {
const { listPath = "/store/collections", defaultListFields, defaultDetailFields, normalizeListQuery, normalizeDetailQuery, transformCollection, transformListCollection, transformDetailCollection } = config ?? {};
const baseTransform = transformCollection ?? ((collection)=>collection);
const mapListCollection = transformListCollection ?? ((collection, _context)=>baseTransform(collection));
const mapDetailCollection = transformDetailCollection ?? ((collection, _context)=>baseTransform(collection));
const buildListQuery = (params)=>{
const query = normalizeListQuery ? normalizeListQuery(params) : {
...params,
...defaultListFields && !params.fields ? {
fields: defaultListFields
} : {}
};
return stripEnabled(query);
};
const buildDetailQuery = (params)=>{
const query = normalizeDetailQuery ? normalizeDetailQuery(params) : {
...params,
...defaultDetailFields && !params.fields ? {
fields: defaultDetailFields
} : {}
};
const { id: _id, ...withoutId } = query;
return stripEnabled(withoutId);
};
return {
async getCollections (params, signal) {
const query = buildListQuery(params);
const response = await sdk.client.fetch(listPath, {
query,
signal
});
const collections = (response.collections ?? []).map((collection)=>mapListCollection(collection, {
params,
query,
response
}));
return {
collections,
count: response.count ?? collections.length
};
},
async getCollection (params, signal) {
if (!params.id) return null;
const query = buildDetailQuery(params);
const response = await sdk.client.fetch(`${listPath}/${params.id}`, {
query,
signal
});
const collection = response.collection;
if (!collection) return null;
return mapDetailCollection(collection, {
params,
query,
response
});
}
};
}
export { createMedusaCollectionService };