|  |  |  | @ -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 | 
			
		
	
		
			
				
					|  |  |  |  | } |