UNPKG

@prismicio/types-internal

Version:
93 lines (92 loc) 3.58 kB
"use strict"; 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;