diff --git a/util.js b/util.js index 872826b..3c3da41 100644 --- a/util.js +++ b/util.js @@ -201,9 +201,200 @@ function checkingOptions({ question, answer }) { } return true; } + +async function checkingConditionTypes({ fQ, question, mojazData = [], answer }) { + let check = false, checkOption = false, inputType = 10; + let condition = {}, isRequired = null; + let requiredCondition = {}, validation = null; + + requiredCondition = question?.requiredCondition || {}; + validation = question?.validation || null; + + condition = convertStringToJson(fQ?.condition) || convertStringToJson(question?.condition) || null; + isRequired = returnBooleanOfArguments([fQ?.isRequired, question?.required]); + + inputType = question?.inputType || 10; + + console.log("question id:", question.id) + console.log("requiredCondition", requiredCondition); + // console.log("validation",validation); + console.log("condition", condition); + console.log("isRequired", isRequired); + // console.log("options",options); + console.log("inputType", inputType); + + //1.check requiredConditions + //2.check Conditions and check they required or not + //3.check Options and check they required or not + //4.check validation + //5.remove extra data + + //1.check requiredConditions + check = checkCondition({ data: answer, condition: requiredCondition }) + if (check.ok === false) throw `${defects[question.id]}`; + mojazData = [...new Set([...mojazData, ...check.conditionArray])]; + console.log("DONE SOLVE requiredConditions") + + //2.check Conditions and check they required or not + check = checkCondition({ data: answer, condition: condition }) + checkOption = checkingOptions({ question, answer }); + if ((check.ok === false || checkOption.ok === false) && isRequired === true) throw `${defects[question.id]}`; + if (checkOption.ok === true) mojazData.push(`${question.id}`); + mojazData = [...new Set([...mojazData, ...check.conditionArray])]; + console.log("DONE SOLVE condition") + + //3.check Validation (ro bayad beporsam az aghaye sadeghi) + + console.log("mojazDataAfter-requiredCondition-condition", mojazData); + + return { + mojazData + } +} +function isBoolean(value) { + if(typeof value==="string"){ + if(value?.trim()?.toLowerCase()=="true") value=true; + else if(value?.trim()?.toLowerCase()=="false") value=false; + } + return typeof value === 'boolean'; +} +function safeRegexFromString(regexString) { + try { + const parts = regexString.split('/'); + if (parts.length < 3) { + // اگر / وجود نداشت، کل رشته به عنوان pattern در نظر گرفته می‌شود + return new RegExp(regexString); + } + const pattern = parts.slice(1, -1).join('/'); // برای الگوهایی که شامل / هستند + const flags = parts[parts.length - 1]; + return new RegExp(pattern, flags); + } catch (error) { + console.error("Invalid regex string:", error); + // return null; + throw `invalidRegexFrom:${regexString}`; + } +} +function returnBooleanOfArguments(array){ + if(!Array.isArray(array)) return false; + for(let i of array){ + if(isBoolean(i)) return !!i; + } + return false; +} +function isNumber(value) { + // return typeof value === 'number' && !isNaN(value) && isFinite(value); + // return !isNaN(parseInt(value)) && isFinite(value); + return !isNaN(+value) && isFinite(+value); +} +function parseValue(value) { + // اگر ورودی از قبل رشته نباشد، همان مقدار را برگردانیم. + if (typeof value !== 'string') { + return value; + } + + const trimmed = value.trim(); + + // // بررسی مقادیر بولی + // if (trimmed.toLowerCase() === 'true') return true; + // if (trimmed.toLowerCase() === 'false') return false; + + // بررسی null و undefined + if (trimmed.toLowerCase() === 'null') return null; + if (trimmed.toLowerCase() === 'undefined') return undefined; + + // بررسی عدد + // اگر رشته به صورت عددی تفسیر شود (توجه کنید که isNaN('') === false، پس باید رشته خالی هم چک شود) + if (trimmed !== '' && isNumber(trimmed)) { + return Number(trimmed); + } + + // بررسی تاریخ + // Date.parse در صورت عدم توانایی در تبدیل، مقدار NaN برمی‌گرداند. + const timestamp = Date.parse(trimmed); + if (!isNaN(timestamp)) { + return new Date(trimmed); + } + + // بررسی آرایه یا شیء (در صورتی که رشته با { یا [ شروع و به ترتیب با } یا ] پایان یابد) + if ( + (trimmed.startsWith('{') && trimmed.endsWith('}')) || + (trimmed.startsWith('[') && trimmed.endsWith(']')) + ) { + try { + return JSON.parse(trimmed); + } catch (e) { + // در صورت بروز خطا، به ادامه کد می‌رویم + } + } + + // در نهایت اگر هیچ یک از شرایط بالا صدق نکرد، + // رشته اصلی را برمی‌گردانیم. + return value; +} + +function isValidDateStrict(date) { + if (date instanceof Date && !isNaN(date.getTime())) { + return true; + } + if (typeof date === "string") { + const parsed = new Date(date); + return parsed instanceof Date && !isNaN(parsed.getTime()); + } + return false; +} + +function convertDaysToSeconds(days){ + return days * 24 * 3600 * 1000; +} + +function isValidRegex(str) { + try { + if (str.startsWith('/')) { + let endSlashIndex = -1; + let backslashCount = 0; + + // شروع جستجو از ایندکس ۱ (بعد از اسلش اول) + for (let i = 1; i < str.length; i++) { + if (str[i] === '\\') { + backslashCount++; + } else { + if (str[i] === '/' && backslashCount % 2 === 0) { + endSlashIndex = i; + break; + } + backslashCount = 0; + } + } + + // اگر اسلش پایانی پیدا نشد + if (endSlashIndex === -1) { + return false; + } + + const pattern = str.slice(1, endSlashIndex); + const modifiers = str.slice(endSlashIndex + 1); + + new RegExp(pattern, modifiers); + } else { + new RegExp(str); + } + return true; + } catch (e) { + return false; + } +} module.exports = { sleep, convertStringToJson, + isValidRegex, + convertDaysToSeconds, + isValidDateStrict, + parseValue, + isNumber, + returnBooleanOfArguments, + safeRegexFromString, + isBoolean, + checkingConditionTypes, checkingOptions, checkCondition } \ No newline at end of file