@prismicio/types-internal
Version:
Prismic types for Custom Types and Prismic Data
93 lines (92 loc) • 3.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.traverseGroup = exports.traverseNestedGroup = exports.Group = exports.GroupConfig = exports.NestedGroup = exports.NestedGroupConfig = exports.GroupFieldType = void 0;
const tslib_1 = require("tslib");
const t = (0, tslib_1.__importStar)(require("io-ts"));
const common_1 = require("../../common");
const validators_1 = require("../../validators");
const NestableWidget_1 = require("./nestable/NestableWidget");
exports.GroupFieldType = "Group";
// We're obliged to use `t.Mixed` here, otherwise the factory would be
// referencing itself and TypeScript would infer its type as `any`
const createGroupConfig = (widgets) => t.exact(t.partial({
label: validators_1.StringOrNull,
repeat: t.boolean,
fields: t.record(common_1.WidgetKey, widgets),
}));
// We're obliged to use `t.Mixed` here, otherwise the factory would be
// referencing itself and TypeScript would infer its type as `any`
const createGroup = (widgets) => t.exact(t.intersection([
t.type({
type: t.literal(exports.GroupFieldType),
}),
t.partial({
fieldset: validators_1.StringOrNull,
icon: t.string,
description: t.string,
config: createGroupConfig(widgets),
}),
]));
exports.NestedGroupConfig = createGroupConfig(NestableWidget_1.NestableWidget);
exports.NestedGroup = createGroup(NestableWidget_1.NestableWidget);
exports.GroupConfig = createGroupConfig(t.union([NestableWidget_1.NestableWidget, exports.NestedGroup]));
exports.Group = createGroup(t.union([NestableWidget_1.NestableWidget, exports.NestedGroup]));
function traverseNestedGroup(args) {
var _a;
const { path: prevPath, group, onField } = args;
if (!((_a = group.config) === null || _a === void 0 ? void 0 : _a.fields))
return group;
let fields;
for (const [key, field] of Object.entries(group.config.fields)) {
const path = [...prevPath, key];
const newField = onField({
path,
key,
field,
});
if (field !== newField) {
if (!fields)
fields = { ...group.config.fields };
fields[key] = newField;
}
}
// returns the traversed model instead of a new one if it didn't change
return fields ? { ...group, config: { ...group.config, fields } } : group;
}
exports.traverseNestedGroup = traverseNestedGroup;
function traverseGroup(args) {
var _a;
const { path: prevPath, group, onField } = args;
if (!((_a = group.config) === null || _a === void 0 ? void 0 : _a.fields))
return group;
let fields;
for (const [key, prevField] of Object.entries(group.config.fields)) {
const path = [...prevPath, key];
let field;
switch (prevField.type) {
case "Group":
field = traverseNestedGroup({
path,
group: prevField,
onField: onField,
});
break;
default:
field = prevField;
break;
}
const newField = onField({
path,
key,
field,
});
if (field !== newField) {
if (!fields)
fields = { ...group.config.fields };
fields[key] = newField;
}
}
// returns the traversed model instead of a new one if it didn't change
return fields ? { ...group, config: { ...group.config, fields } } : group;
}
exports.traverseGroup = traverseGroup;