UNPKG

form-studio

Version:

A tool that helps design, create and manage form / survey / questionnaire through simple JSON configurations.

160 lines (159 loc) 10.9 kB
"use strict"; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _ConfigsValidator_instances, _ConfigsValidator_errorsById, _ConfigsValidator_warningsById, _ConfigsValidator_allIds, _ConfigsValidator_choiceValuesByQuestionId, _ConfigsValidator_onSelectedIdsByChoiceId, _ConfigsValidator_parentIdsById, _ConfigsValidator_circularIds, _ConfigsValidator_checkCircular, _ConfigsValidator_collectData, _ConfigsValidator_collectItemData, _ConfigsValidator_collectGroupData, _ConfigsValidator_collectQuestionData, _ConfigsValidator_collectChoiceData, _ConfigsValidator_findDuplicates, _ConfigsValidator_addError, _ConfigsValidator_addWarning, _ConfigsValidator_getResult; Object.defineProperty(exports, "__esModule", { value: true }); exports.ConfigsValidator = void 0; class ConfigsValidator { constructor() { _ConfigsValidator_instances.add(this); _ConfigsValidator_errorsById.set(this, new Map()); _ConfigsValidator_warningsById.set(this, new Map()); _ConfigsValidator_allIds.set(this, []); _ConfigsValidator_choiceValuesByQuestionId.set(this, new Map()); _ConfigsValidator_onSelectedIdsByChoiceId.set(this, new Map()); _ConfigsValidator_parentIdsById.set(this, new Map()); _ConfigsValidator_circularIds.set(this, []); } validate(configs, strict) { // Form is not without any groups or questions if (configs.groups.length === 0 && configs.questions.length === 0) { __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_addError).call(this, '', 'There are no groups or questions'); return __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_getResult).call(this); } // Collect data for subsequent validations __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_collectData).call(this, configs); // No duplicated ids within the form const duplicatedIds = __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_findDuplicates).call(this, __classPrivateFieldGet(this, _ConfigsValidator_allIds, "f")); duplicatedIds.forEach(id => __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_addError).call(this, id, 'Id is not unique')); // No duplicated choice values within a question for (const [questionId, values] of __classPrivateFieldGet(this, _ConfigsValidator_choiceValuesByQuestionId, "f").entries()) { const duplicatedValues = __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_findDuplicates).call(this, values); if (duplicatedValues.length) { __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_addError).call(this, questionId, 'There are choices with same values'); } } // No circular choices' `onSelected` configs if (!duplicatedIds.length) { for (const id of __classPrivateFieldGet(this, _ConfigsValidator_allIds, "f")) { __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_checkCircular).call(this, id, id); } } if (strict) { // No unrecognized ids in choices' `onSelected` configs for (const [choiceId, onSelectedIds] of __classPrivateFieldGet(this, _ConfigsValidator_onSelectedIdsByChoiceId, "f").entries()) { for (const onSelectedId of onSelectedIds) { if (!__classPrivateFieldGet(this, _ConfigsValidator_allIds, "f").includes(onSelectedId)) { __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_addError).call(this, choiceId, 'There are unrecognized id(s) in onSelected configs'); break; } } } } return __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_getResult).call(this); } } exports.ConfigsValidator = ConfigsValidator; _ConfigsValidator_errorsById = new WeakMap(), _ConfigsValidator_warningsById = new WeakMap(), _ConfigsValidator_allIds = new WeakMap(), _ConfigsValidator_choiceValuesByQuestionId = new WeakMap(), _ConfigsValidator_onSelectedIdsByChoiceId = new WeakMap(), _ConfigsValidator_parentIdsById = new WeakMap(), _ConfigsValidator_circularIds = new WeakMap(), _ConfigsValidator_instances = new WeakSet(), _ConfigsValidator_checkCircular = function _ConfigsValidator_checkCircular(mainId, subId) { const parentIds = __classPrivateFieldGet(this, _ConfigsValidator_parentIdsById, "f").get(subId); if (parentIds.includes(mainId)) { __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_addError).call(this, mainId, `Circular relationship with '${subId}'`); __classPrivateFieldGet(this, _ConfigsValidator_circularIds, "f").push(mainId); return; } for (const parentId of parentIds) { if (__classPrivateFieldGet(this, _ConfigsValidator_circularIds, "f").includes(parentId)) { continue; } __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_checkCircular).call(this, mainId, parentId); } }, _ConfigsValidator_collectData = function _ConfigsValidator_collectData(configs) { __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_collectGroupData).call(this, undefined, configs.groups); for (const [choiceId, onSelectedIds] of __classPrivateFieldGet(this, _ConfigsValidator_onSelectedIdsByChoiceId, "f")) { for (const onSelectedId of onSelectedIds) { const parentIds = __classPrivateFieldGet(this, _ConfigsValidator_parentIdsById, "f").get(onSelectedId); if (parentIds) { parentIds.push(choiceId); __classPrivateFieldGet(this, _ConfigsValidator_parentIdsById, "f").set(onSelectedId, parentIds); } } } }, _ConfigsValidator_collectItemData = function _ConfigsValidator_collectItemData(parentId, item) { __classPrivateFieldGet(this, _ConfigsValidator_allIds, "f").push(item.id); if (parentId) { __classPrivateFieldGet(this, _ConfigsValidator_parentIdsById, "f").set(item.id, [parentId]); } else { __classPrivateFieldGet(this, _ConfigsValidator_parentIdsById, "f").set(item.id, []); } }, _ConfigsValidator_collectGroupData = function _ConfigsValidator_collectGroupData(parentGroupId, groups) { for (const group of groups) { __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_collectItemData).call(this, parentGroupId, group); __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_collectGroupData).call(this, group.id, group.groups); // No groups without questions if (group.questions.length === 0) { __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_addError).call(this, group.id, 'There are no questions'); continue; } __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_collectQuestionData).call(this, group.id, group.questions); } }, _ConfigsValidator_collectQuestionData = function _ConfigsValidator_collectQuestionData(groupId, questions) { for (const question of questions) { __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_collectItemData).call(this, groupId, question); // No questions with `choice` or `choices` as type without choices if (question.type !== 'any') { if (question.choices.length === 0) { __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_addError).call(this, question.id, 'There are no choices'); continue; } __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_collectChoiceData).call(this, question.id, question.choices); __classPrivateFieldGet(this, _ConfigsValidator_choiceValuesByQuestionId, "f").set(question.id, question.choices.map(choice => choice.value)); } } }, _ConfigsValidator_collectChoiceData = function _ConfigsValidator_collectChoiceData(questionId, choices) { for (const choice of choices) { __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_collectItemData).call(this, questionId, choice); const onSelectedIds = [...(choice.onSelected?.enable ?? []), ...(choice.onSelected?.disable ?? [])]; if (onSelectedIds.length) { __classPrivateFieldGet(this, _ConfigsValidator_onSelectedIdsByChoiceId, "f").set(choice.id, onSelectedIds); } if (choice.onSelected) { __classPrivateFieldGet(this, _ConfigsValidator_instances, "m", _ConfigsValidator_addWarning).call(this, choice.id, 'onSelected is deprecated'); } } }, _ConfigsValidator_findDuplicates = function _ConfigsValidator_findDuplicates(arr) { const sorted = arr.slice().sort(); const duplicatedIds = new Set(); for (let i = 0; i < sorted.length - 1; i++) { if (sorted[i + 1] === sorted[i]) { duplicatedIds.add(sorted[i]); } } return Array.from(duplicatedIds); }, _ConfigsValidator_addError = function _ConfigsValidator_addError(id, error) { let errors = __classPrivateFieldGet(this, _ConfigsValidator_errorsById, "f").get(id); if (!errors) { errors = []; } errors.push(error); __classPrivateFieldGet(this, _ConfigsValidator_errorsById, "f").set(id, errors); }, _ConfigsValidator_addWarning = function _ConfigsValidator_addWarning(id, warning) { let warnings = __classPrivateFieldGet(this, _ConfigsValidator_warningsById, "f").get(id); if (!warnings) { warnings = []; } warnings.push(warning); __classPrivateFieldGet(this, _ConfigsValidator_warningsById, "f").set(id, warnings); }, _ConfigsValidator_getResult = function _ConfigsValidator_getResult() { if (__classPrivateFieldGet(this, _ConfigsValidator_errorsById, "f").size) { const errors = {}; __classPrivateFieldGet(this, _ConfigsValidator_errorsById, "f").forEach((values, key) => { errors[key] = values; }); return { valid: false, errors }; } return { valid: true }; };