@prismicio/client
Version:
The official JavaScript + TypeScript client library for Prismic
53 lines (51 loc) • 1.38 kB
JavaScript
//#region src/helpers/mapSliceZone.ts
/**
* Transforms a Slice Zone using a set of mapping functions, one for each type
* of Slice. Mapping functions can be async.
*
* Whenever possible, use this function on the server to minimize client-side
* processing.
*
* @example
*
* ```typescript
* const mappedSliceZone = await mapSliceZone(page.data.slices, {
* code_block: ({ slice }) => ({
* codeHTML: await highlight(slice.primary.code),
* }),
* });
* ```
*/
function mapSliceZone(sliceZone, mappers, context) {
return Promise.all(sliceZone.map(async (slice, index, slices) => {
const isRestSliceType = "slice_type" in slice;
const sliceType = isRestSliceType ? slice.slice_type : slice.type;
const mapper = mappers[sliceType];
if (!mapper) return slice;
const mapperArgs = {
slice,
slices,
index,
context
};
let result = await mapper(mapperArgs);
if (mapper.length < 1 && (typeof result === "function" || typeof result === "object" && "default" in result)) {
result = "default" in result ? result.default : result;
result = await result(mapperArgs);
}
if (isRestSliceType) return {
__mapped: true,
id: slice.id,
slice_type: sliceType,
...result
};
else return {
__mapped: true,
type: sliceType,
...result
};
}));
}
//#endregion
exports.mapSliceZone = mapSliceZone;
//# sourceMappingURL=mapSliceZone.cjs.map