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
JavaScript
"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 };
};