@prismicio/types-internal
Version:
Prismic types for Custom Types and Prismic Data
105 lines (104 loc) • 4.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.traverseRepeatableContent = exports.RepeatableLegacy = exports.isRepeatableContent = exports.RepeatableContent = void 0;
const tslib_1 = require("tslib");
const fp_ts_1 = require("fp-ts");
const Either_1 = require("fp-ts/lib/Either");
const function_1 = require("fp-ts/lib/function");
const t = (0, tslib_1.__importStar)(require("io-ts"));
const utils_1 = require("../../utils");
const LinkContent_1 = require("./LinkContent");
const RepeatableContentType = "RepeatableContent";
exports.RepeatableContent = t.strict({
__TYPE__: t.literal(RepeatableContentType),
type: t.literal("Link"),
value: t.array(LinkContent_1.LinkContent),
});
const isRepeatableContent = (u) => (0, utils_1.hasContentType)(u) && u.__TYPE__ === RepeatableContentType;
exports.isRepeatableContent = isRepeatableContent;
const RepeatableLegacy = (ctx, fieldType) => {
return new t.Type("RepeatableLegacy", exports.isRepeatableContent, (items) => {
const parsed = (0, function_1.pipe)(t.array(t.unknown).decode(items), fp_ts_1.either.map((items) => {
const parsedItems = items.reduce((acc, item) => {
let result;
switch (fieldType) {
case "Link":
result = (0, LinkContent_1.LinkContentLegacy)(ctx).decode(item);
break;
}
if (!result)
return acc;
if ((0, Either_1.isLeft)(result))
return acc;
return [...acc, result.right];
}, []);
return {
value: parsedItems,
type: fieldType,
__TYPE__: "RepeatableContent",
};
}));
return parsed;
}, (r) => {
const res = t.array(LinkContent_1.LinkContent).encode(r.value);
const encodedItems = res.reduce((acc, item) => {
let encoded;
switch (item.__TYPE__) {
case LinkContent_1.LinkContentType:
encoded = (0, LinkContent_1.LinkContentLegacy)(ctx).encode(item);
break;
}
if (!encoded)
return acc;
return [...acc, encoded];
}, []);
return {
content: encodedItems.map((encodedItem) => encodedItem.content),
types: { [ctx.keyOfType]: `Repeatable.${fieldType}` },
keys: encodedItems.reduce((acc, item) => ({ ...acc, ...item.keys }), {}),
};
});
};
exports.RepeatableLegacy = RepeatableLegacy;
function traverseRepeatableContent({ path, key, apiId, model, content, }) {
return (transform) => {
const items = content.value.reduce((acc, fieldContent, index) => {
const itemPath = path.concat([
{ key: index.toString(), type: "Widget" },
]);
// Content inside repeatable can't be repeatable.
const newModel = (model === null || model === void 0 ? void 0 : model.type) === "Link" && model.config
? {
...model,
config: { ...model.config, repeat: false },
}
: model;
const transformedField = transform({
path: itemPath,
key: key,
apiId: apiId,
model: newModel,
content: fieldContent,
});
// Can happen if the transform function returns undefined to filter out a field
if (!transformedField)
return acc;
// If the transformed field is not a link content, we don't include it
if (!(0, LinkContent_1.isLinkContent)(transformedField))
return acc;
return acc.concat(transformedField);
}, []);
return transform({
path,
key,
apiId,
model,
content: {
__TYPE__: content.__TYPE__,
type: content.type,
value: items,
},
});
};
}
exports.traverseRepeatableContent = traverseRepeatableContent;