@prismicio/types-internal
Version:
Prismic types for Custom Types and Prismic Data
114 lines (113 loc) • 5.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.VariationComparator = void 0;
const utils_1 = require("../../utils");
const Group_1 = require("../widgets/Group");
const Changes_1 = require("./Changes");
function compareVariationMeta(variationA, variationB) {
const zippedVariations = utils_1.Objects.zipObjects(variationA, variationB);
return Object.entries(zippedVariations).reduce((acc, [key, value]) => {
if (key === `primary` || key === "items")
return acc;
if ((value === null || value === void 0 ? void 0 : value.left) === (value === null || value === void 0 ? void 0 : value.right))
return acc;
return { ...acc, [key]: value === null || value === void 0 ? void 0 : value.right };
}, {});
}
function compareWidgets(widgetsA, widgetsB) {
const zippedWidgets = utils_1.Objects.zipObjects(widgetsA, widgetsB);
const diffWidgets = Object.entries(zippedWidgets).reduce((acc, [widgetKey, widgetValue]) => {
if (JSON.stringify(widgetValue === null || widgetValue === void 0 ? void 0 : widgetValue.left) === JSON.stringify(widgetValue === null || widgetValue === void 0 ? void 0 : widgetValue.right))
return acc;
const changes = (() => {
var _a, _b, _c, _d, _e, _f, _g;
if (!(widgetValue === null || widgetValue === void 0 ? void 0 : widgetValue.left) && !(widgetValue === null || widgetValue === void 0 ? void 0 : widgetValue.right))
return;
if ((widgetValue === null || widgetValue === void 0 ? void 0 : widgetValue.left) && !widgetValue.right) {
return {
op: Changes_1.DiffOperation.Removed,
};
}
if (!(widgetValue === null || widgetValue === void 0 ? void 0 : widgetValue.left) && (widgetValue === null || widgetValue === void 0 ? void 0 : widgetValue.right)) {
if (((_a = widgetValue.right) === null || _a === void 0 ? void 0 : _a.type) === Group_1.GroupFieldType) {
const group = {
...widgetValue.right,
config: {
...widgetValue.right.config,
fields: {},
},
};
// On added groups, this basically marks all fields in the group as added
group.config.fields =
compareWidgets(undefined, (_b = widgetValue.right.config) === null || _b === void 0 ? void 0 : _b.fields) || {};
return {
op: Changes_1.DiffOperation.Added,
value: group,
};
}
return {
op: Changes_1.DiffOperation.Added,
value: widgetValue.right,
};
}
if (((_c = widgetValue.right) === null || _c === void 0 ? void 0 : _c.type) === Group_1.GroupFieldType) {
const group = {
...widgetValue.right,
config: {
...widgetValue.right.config,
fields: {},
},
};
// On updated groups, this also compares the fields inside the group
group.config.fields =
compareWidgets(((_d = widgetValue.left) === null || _d === void 0 ? void 0 : _d.type) === Group_1.GroupFieldType
? (_f = (_e = widgetValue.left) === null || _e === void 0 ? void 0 : _e.config) === null || _f === void 0 ? void 0 : _f.fields
: undefined, (_g = widgetValue.right.config) === null || _g === void 0 ? void 0 : _g.fields) || {};
return {
op: Changes_1.DiffOperation.Updated,
value: group,
};
}
return {
op: Changes_1.DiffOperation.Updated,
value: widgetValue.right,
};
})();
if (!changes)
return acc;
return {
...acc,
[widgetKey]: changes,
};
}, {});
return utils_1.Objects.isNotEmpty(diffWidgets) ? diffWidgets : undefined;
}
exports.VariationComparator = {
compare(variationA, variationB) {
if (variationA && !variationB)
return {
op: Changes_1.DiffOperation.Removed,
};
if (!variationA && variationB) {
return {
op: Changes_1.DiffOperation.Added,
value: variationB,
};
}
const diffMeta = compareVariationMeta(variationA, variationB);
const diffPrimary = compareWidgets(variationA === null || variationA === void 0 ? void 0 : variationA.primary, variationB === null || variationB === void 0 ? void 0 : variationB.primary);
const diffItems = compareWidgets(variationA === null || variationA === void 0 ? void 0 : variationA.items, variationB === null || variationB === void 0 ? void 0 : variationB.items);
const diffVariation = {
...diffMeta,
...(diffPrimary ? { primary: diffPrimary } : {}),
...(diffItems ? { items: diffItems } : {}),
};
if (utils_1.Objects.isNotEmpty(diffVariation)) {
return {
op: Changes_1.DiffOperation.Updated,
value: diffVariation,
};
}
return undefined;
},
};