@prismicio/types-internal
Version:
Prismic types for Custom Types and Prismic Data
188 lines (187 loc) • 8.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.traverseSlices = exports.slicesContentWithDefaultValues = exports.SlicesContent = exports.SlicesLegacy = exports.isSlicesContent = exports.SlicesContentType = void 0;
const tslib_1 = require("tslib");
const fp_ts_1 = require("fp-ts");
const function_1 = require("fp-ts/lib/function");
const t = (0, tslib_1.__importStar)(require("io-ts"));
const customtypes_1 = require("../../../customtypes");
const utils_1 = require("../../utils");
const utils_2 = require("../../utils");
const CompositeSliceContent_1 = require("./Slice/CompositeSliceContent");
const SharedSliceContent_1 = require("./Slice/SharedSliceContent");
const SimpleSliceContent_1 = require("./Slice/SimpleSliceContent");
const SliceItem_1 = require("./SliceItem");
exports.SlicesContentType = "SliceContentType";
const isSlicesContent = (u) => (0, utils_2.hasContentType)(u) && u.__TYPE__ === exports.SlicesContentType;
exports.isSlicesContent = isSlicesContent;
const SlicesLegacy = (ctx) => {
const codec = t.array((0, SliceItem_1.SlicesItemLegacy)(ctx));
return new t.Type("SlicesLegacy", exports.isSlicesContent, (items) => {
return (0, function_1.pipe)(codec.decode(items), fp_ts_1.either.map((parsedSlices) => {
return {
__TYPE__: exports.SlicesContentType,
value: parsedSlices,
};
}));
}, (s) => {
const result = codec.encode(s.value);
return {
content: result.map((s) => s.content),
types: result.reduce((acc, s) => ({ ...acc, ...s.types }), { [ctx.keyOfType]: "Slices" }),
keys: result.reduce((acc, s) => ({ ...acc, ...s.keys }), {}),
};
});
};
exports.SlicesLegacy = SlicesLegacy;
exports.SlicesContent = t.type({
__TYPE__: t.literal(exports.SlicesContentType),
value: t.array(SliceItem_1.SliceItemContent),
});
function slicesContentWithDefaultValues(codec, content) {
var _a;
const choices = (_a = codec === null || codec === void 0 ? void 0 : codec.config) === null || _a === void 0 ? void 0 : _a.choices;
if (choices === undefined)
return content;
const updateSlicesValue = content.value.map((slice) => {
const sliceConfig = choices[slice.name];
if (sliceConfig) {
const updatedSliceWidget = (0, SliceItem_1.sliceItemContentWithDefaultValues)(sliceConfig, slice.widget);
return {
...slice,
widget: updatedSliceWidget,
};
}
return slice;
});
return {
...content,
value: updateSlicesValue,
};
}
exports.slicesContentWithDefaultValues = slicesContentWithDefaultValues;
function findSliceModel(slicesPath, model, content) {
var _a, _b;
const defaultModel = (_b = (_a = model === null || model === void 0 ? void 0 : model.config) === null || _a === void 0 ? void 0 : _a.choices) === null || _b === void 0 ? void 0 : _b[content.name];
// regular case for shared slices
const sharedSliceModel = () => {
if ((0, SliceItem_1.isSharedSliceItemContent)(content)) {
if (defaultModel && (0, customtypes_1.isStaticSharedSlice)(defaultModel)) {
const variationDef = defaultModel.variations.find((v) => v.id === content.widget.variation);
return variationDef
? {
type: "SharedSlice",
sliceName: defaultModel.id,
variationId: variationDef.id,
fields: {
primary: variationDef.primary || {},
items: variationDef.items || {},
},
}
: undefined;
}
}
return;
};
const migratedSliceModel = () => {
var _a;
const legacyContentPath = utils_1.ContentPath.append(utils_1.ContentPath.serialize(slicesPath), content.name);
const migratedSliceModel = Object.values(((_a = model === null || model === void 0 ? void 0 : model.config) === null || _a === void 0 ? void 0 : _a.choices) || {}).find((sliceModel) => {
var _a;
if ((0, customtypes_1.isStaticSharedSlice)(sliceModel)) {
return !!((_a = sliceModel.legacyPaths) === null || _a === void 0 ? void 0 : _a[legacyContentPath]);
}
return false;
});
if (!migratedSliceModel)
return;
const migratedVariation = migratedSliceModel === null || migratedSliceModel === void 0 ? void 0 : migratedSliceModel.variations.find((v) => { var _a; return v.id === ((_a = migratedSliceModel.legacyPaths) === null || _a === void 0 ? void 0 : _a[legacyContentPath]); });
if (!migratedVariation)
return;
return {
type: "SharedSlice",
sliceName: migratedSliceModel.id,
variationId: migratedVariation.id,
fields: {
primary: migratedVariation.primary || {},
items: migratedVariation.items || {},
},
};
};
const legacySliceModel = () => {
if (!defaultModel)
return;
if ((0, customtypes_1.isCompositeSlice)(defaultModel)) {
return {
type: "Slice",
"non-repeat": defaultModel["non-repeat"] || {},
repeat: defaultModel.repeat || {},
};
}
if ((0, customtypes_1.isLegacySlice)(defaultModel)) {
return defaultModel;
}
return;
};
return sharedSliceModel() || migratedSliceModel() || legacySliceModel();
}
function traverseSlices({ path, key, model, content, }) {
return ({ transformWidget = ({ content }) => content, transformSlice = ({ content }) => content, }) => {
const value = content.value.reduce((acc, sliceContent) => {
const sliceModel = model && findSliceModel(path, model, sliceContent);
const convertedSlice = (() => {
if ((0, SliceItem_1.isSharedSliceItemContent)(sliceContent))
return (0, SharedSliceContent_1.traverseSharedSliceContent)({
path: path.concat({
key: sliceContent.key,
type: "SharedSlice",
}),
sliceKey: sliceContent.key,
sliceName: sliceContent.name,
model: (sliceModel === null || sliceModel === void 0 ? void 0 : sliceModel.type) === "SharedSlice" ? sliceModel : undefined,
content: sliceContent,
})(transformWidget, transformSlice);
if ((0, SliceItem_1.isCompositeSliceItemContent)(sliceContent))
return (0, CompositeSliceContent_1.traverseCompositeSliceContent)({
path: path.concat({
key: sliceContent.key,
type: "Slice",
}),
sliceKey: sliceContent.key,
sliceName: sliceContent.name,
model: (sliceModel === null || sliceModel === void 0 ? void 0 : sliceModel.type) === "Slice" ||
(sliceModel === null || sliceModel === void 0 ? void 0 : sliceModel.type) === "SharedSlice"
? sliceModel
: undefined,
content: sliceContent,
})(transformWidget, transformSlice);
if ((0, SliceItem_1.isSimpleSliceItemContent)(sliceContent))
return (0, SimpleSliceContent_1.traverseSimpleSliceContent)({
path: path.concat({
key: sliceContent.key,
type: "LegacySlice",
}),
sliceKey: sliceContent.key,
sliceName: sliceContent.name,
model: sliceModel && (sliceModel === null || sliceModel === void 0 ? void 0 : sliceModel.type) !== "Slice"
? sliceModel
: undefined,
content: sliceContent,
})(transformWidget, transformSlice);
return;
})();
return convertedSlice ? acc.concat(convertedSlice) : acc;
}, []);
return transformWidget({
path,
key,
apiId: key,
model,
content: {
__TYPE__: content.__TYPE__,
value,
},
});
};
}
exports.traverseSlices = traverseSlices;