@xuda.io/runtime-bundle 1.0.1398 → 1.0.1399

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- var app_obj,progs_obj,_,progs_str,hide_not_in_use_check,is_server,deployments,UglifyJS,JSON5,_conf,warn_plugin_check,z;const PROTECTED_VARS=["_NULL","_THIS","_FOR_KEY","_FOR_VAL","_ROWNO","_ROWID","_ROWDOC","_KEY","_VAL"];const ALL_MENU_TYPE=["globals","component","ai_agent","batch","get_data","set_data","alert","javascript","api","table","folder"];const program_ref_triggers_arr=["call_page","call_modal","call_popover","get_data","set_data","batch","call_native_javascript","call_evaluate_javascript","call_alert","alter_ui_element","create_ui_element","update","raise_event"];export const init=function(app_obj_in,progs_obj_in={},_in,_hide_not_in_use_check,is_server_in,deployments_in=[],UglifyJS_in,JSON5_in,_conf_in,_warn_plugin_check,_z){app_obj=app_obj_in;progs_obj=progs_obj_in;progs_str=JSON.stringify(progs_obj);hide_not_in_use_check=_hide_not_in_use_check;_=_in;is_server=is_server_in;deployments=deployments_in;UglifyJS=UglifyJS_in;JSON5=JSON5_in;_conf=_conf_in;warn_plugin_check=_warn_plugin_check;z=_z};export const check=function(doc){var ret=[];var dependency_progs=[];const addValidationError=(code,data,type="E",category="document",ref=null,id=null,not_in_use=false)=>{const error={code:code,data:data,type:type,category:category};if(ref)error.ref=ref;if(id)error.id=id;if(not_in_use)error.not_in_use=not_in_use;ret.push(error)};if(_.isEmpty(doc)){addValidationError("CHK_MSG_OBJ_GEN_110","doc in empty");return{check_errors:ret,check_warnings:[],doc:doc,dependency_progs:[]}}let critical_error=false;ret=check_structure(doc,critical_error);if(!critical_error){doc.studio_meta.not_in_use=false;if(doc.properties.menuType!=="folder"){if(doc.properties.menuType!=="table"){if(is_server){for(let val of deployments){if(val.deploy_data?.prog_id===doc._id){if(!doc.studio_meta.used_by_deployment_ids){doc.studio_meta.used_by_deployment_ids=[]}doc.studio_meta.used_by_deployment_ids.push(val._id)}}}if(!doc.studio_meta.used_by_deployment_id){const check_programs_are_active=function(arr){if(!arr.length)return false;var count=0;for(let val of arr){if(progs_obj?.[val.prog_id]?.studio_meta?.not_in_use){count++;break}}return count!==arr.length};if(!hide_not_in_use_check){const ret_prog_in_use=find_trigger_property_value_in_progs(doc,program_ref_triggers_arr,"prog",doc._id);if(!ret_prog_in_use||!check_programs_are_active(ret_prog_in_use)){const ret_panel_prog_in_use=find_panel_prog_in_progs(doc,doc._id);if(!ret_panel_prog_in_use||!check_programs_are_active(ret_panel_prog_in_use)){const ret_fieldValue_in_use=find_prog_in_fieldset_fieldValue_progs(doc,doc._id);if(!ret_fieldValue_in_use||!check_programs_are_active(ret_fieldValue_in_use)){doc.studio_meta.not_in_use=true}}}}}ret=[...ret,...check_prog_events(doc)];dependency_progs=find_trigger_property_value_in_progs(doc,program_ref_triggers_arr,"prog",null,true)||[];dependency_progs=[...dependency_progs,...find_panel_prog_in_progs(doc,null,true)||[]]}else{if(!hide_not_in_use_check){if(!find_table_in_progs(doc,doc._id)){doc.studio_meta.not_in_use=true}}}}switch(doc.properties.menuType){case"globals":ret=[...ret,...check_globals(doc)];break;case"table":ret=[...ret,...check_table(doc)];break;case"component":ret=[...ret,...check_component(doc)];break;case"javascript":ret=[...ret,...check_javascript(doc)];break;case"get_data":ret=[...ret,...check_get_data(doc)];break;case"set_data":ret=[...ret,...check_set_data(doc)];break;case"batch":ret=[...ret,...check_batch(doc)];break;case"api":ret=[...ret,...check_api(doc)];break;case"alert":ret=[...ret,...check_alert(doc)];break;case"route":ret=[...ret,...check_route(doc)];break;case"ai_agent":ret=[...ret,...check_ai_agent(doc)];break;case"folder":break;default:addValidationError("CHK_MSG_GEN_050",`invalid ${doc.properties.menuType} properties.menuType`,"E","prog",doc._id,doc._id);break}}var final_ret={check_errors:[],check_warnings:[],doc:doc,dependency_progs:dependency_progs};for(let[key,val]of Object.entries(ret)){if(val.type==="E"){final_ret.check_errors.push(val)}if(val.type==="W"){final_ret.check_warnings.push(val)}}return final_ret};export const check_structure=function(doc,critical_error){var ret=[];const addValidationError=(code,data)=>{ret.push({code:code,data:data,type:"E",category:"document",structure_error:true})};if(typeof app_obj!=="undefined"&&(!app_obj||!_.isObject(app_obj)||_.isEmpty(app_obj))){addValidationError("CHK_MSG_OBJ_GEN_002","invalid app_obj");critical_error=true;return ret}if(!doc||!_.isObject(doc)||_.isEmpty(doc)){addValidationError("CHK_MSG_OBJ_GEN_004","doc is not a object");critical_error=true;return ret}try{JSON5.parse(JSON.stringify(doc))}catch(err){addValidationError("CHK_MSG_OBJ_GEN_005","error parsing JSON doc");critical_error=true;return ret}if(!doc?.properties){critical_error=true;const msg=`doc.property object is undefined`;addValidationError("CHK_MSG_OBJ_GEN_000",msg);return ret}if(!doc?.studio_meta){critical_error=true;const msg=`doc.studio_meta object is undefined`;addValidationError("CHK_MSG_OBJ_GEN_000",msg);return ret}if(!doc?.properties?.menuType){critical_error=true;const msg=`doc.property.menuType is mandatory`;addValidationError("CHK_MSG_OBJ_GEN_000",msg);return ret}if(!doc?.properties?.menuName){critical_error=true;const msg=`doc.property.menuName is mandatory`;addValidationError("CHK_MSG_OBJ_GEN_000",msg);return ret}if(z){const schema=get_zod_schema(doc.properties.menuType);const result=schema.safeParse(doc);if(!result.success){result.error.errors.forEach(error=>{const msg=`${error.message}: ${error.path}(${error.expected})`;addValidationError("CHK_MSG_OBJ_GEN_000",msg)});critical_error=true;return ret}}if(!doc._id){addValidationError("CHK_MSG_OBJ_GEN_050","missing _id value")}if(doc?.studio_meta?.source==="studio ai"&&doc?.properties?.menuType&&doc._id&&doc._id.substr(0,7)!==new_node_id(doc.properties.menuType,doc.app_id).substr(0,7)){addValidationError("CHK_MSG_OBJ_GEN_051","invalid _id value (e.g: 5b1_tbl_a953848a71c5)")}if(!doc._rev){if(progs_obj?.[doc._id]){addValidationError("CHK_MSG_OBJ_GEN_052","duplicate doc _id")}}if(!doc.properties){addValidationError("CHK_MSG_OBJ_GEN_100","missing properties object")}else{if(!_.isObject(doc.properties)){addValidationError("CHK_MSG_OBJ_GEN_102","invalid properties object")}else{if(!doc.properties.menuType){addValidationError("CHK_MSG_OBJ_GEN_104","missing properties.menuType")}else if(!ALL_MENU_TYPE.includes(doc.properties.menuType)){addValidationError("CHK_MSG_OBJ_GEN_105",`invalid properties.menuType (valid values: ${ALL_MENU_TYPE.join(",")})`)}if(!doc.properties.menuName){addValidationError("CHK_MSG_OBJ_GEN_106","missing properties.menuName")}}}if(!doc.studio_meta){addValidationError("CHK_MSG_OBJ_GEN_112","missing studio_meta property")}else{if(!_.isObject(doc.studio_meta)){addValidationError("CHK_MSG_OBJ_GEN_112","invalid studio_meta object")}else{if(!doc.studio_meta.parentId){addValidationError("CHK_MSG_OBJ_GEN_114","missing studio_meta.parentId value")}else{let menuType=doc?.properties?.menuType==="globals"?"globals":doc?.properties?.menuType==="table"?"database":doc?.properties?.menuType==="route"?"routes":doc?.properties?.menuType==="ai_agent"?"ai_agents":"programs";if(doc.studio_meta.parentId!==menuType&&!progs_obj[doc.studio_meta.parentId]){addValidationError("CHK_MSG_OBJ_GEN_116","invalid studio_meta.parentId value")}}}}const check_progFields=function(){if(!doc.progFields)return;var ids=[];if(!_.isArray(doc.progFields)){addValidationError("CHK_MSG_OBJ_GEN_402","invalid progFields Array property");return}const validTypes=["virtual","table","expression","datasource"];const validFieldTypes=["string","number","boolean","array","object"];for(let val of doc.progFields){if(!_.isObject(val)){addValidationError("CHK_MSG_OBJ_GEN_404",`Invalid progFields object `);continue}if(!val.id){addValidationError("CHK_MSG_OBJ_GEN_406","Missing progFields ID property")}const fieldId=val.id?`(${val.id})`:"";if(val.id){if(ids.includes(val.id)){addValidationError("CHK_MSG_OBJ_GEN_408",`Duplicate progFields ID (${val.id})`);continue}ids.push(val.id)}if(!_.isObject(val.data)){addValidationError("CHK_MSG_OBJ_GEN_410",`Invalid progFields data object ${fieldId}`)}else{if(!val.data.field_id){addValidationError("CHK_MSG_OBJ_GEN_412",`Missing progFields field_id property ${fieldId}`)}if(!val.data.type){addValidationError("CHK_MSG_OBJ_GEN_414",`Missing progFields type property ${fieldId}`)}else if(!validTypes.includes(val.data.type)){addValidationError("CHK_MSG_OBJ_GEN_415",`Invalid progFields type "${val.data.type}" ${fieldId}. Must be one of: ${validTypes.join(", ")}`)}}if(!_.isObject(val.props)){addValidationError("CHK_MSG_OBJ_GEN_416",`Invalid progFields props object ${fieldId}`)}else{if(!val.props.fieldType){addValidationError("CHK_MSG_OBJ_GEN_418",`Missing progFields fieldType property ${fieldId}`)}else if(!validFieldTypes.includes(val.props.fieldType)){addValidationError("CHK_MSG_OBJ_GEN_419",`Invalid progFields fieldType "${val.props.fieldType}" ${fieldId}. Must be one of: ${validFieldTypes.join(", ")}`)}if(!_.isObject(val.props.propExpressions)){addValidationError("CHK_MSG_OBJ_GEN_4120",`Invalid progFields propExpressions object ${fieldId}`)}else{const allowedProps=["fieldValue","fieldType"];const actualProps=Object.keys(val.props.propExpressions);const invalidProps=actualProps.filter(prop=>!allowedProps.includes(prop));if(invalidProps.length>0){addValidationError("CHK_MSG_OBJ_GEN_4121",`Invalid propExpressions properties: ${invalidProps.join(", ")} ${fieldId}. Only allowed: ${allowedProps.join(", ")}`)}}}check_workflow(val.workflow)}};const check_progEvents=function(){if(!doc.progEvents)return;var ids=[];if(!_.isArray(doc.progEvents)){addValidationError("CHK_MSG_OBJ_GEN_502","invalid progEvents Array property");return}for(let val of doc.progEvents){if(!_.isObject(val)){addValidationError("CHK_MSG_OBJ_GEN_504","invalid progEvents object property");continue}if(!val.id){addValidationError("CHK_MSG_OBJ_GEN_506","missing progEvents.id property");continue}if(ids.includes(val.id)){addValidationError("CHK_MSG_OBJ_GEN_508",`${val.id} id must be unique in progEvents property`);continue}ids.push(val.id);if(!_.isObject(val.data)){addValidationError("CHK_MSG_OBJ_GEN_510","invalid progEvents.data object property");continue}if(typeof val.data.condition==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_512","undefined progEvents.data.condition string property")}if(typeof val.data.event_name==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_514","undefined progEvents.data.event_name string property")}if(typeof val.data.properties==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_516","undefined progEvents.data.properties string property")}if(typeof val.data.type==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_518","undefined progEvents.data.type string property")}if(!_.isArray(val.data.parameters)){addValidationError("CHK_MSG_OBJ_GEN_522","invalid progEvents.data.parameters Array property")}if(!_.isObject(val.props)){addValidationError("CHK_MSG_OBJ_GEN_522","invalid progEvents.props Object property")}check_workflow(val.workflow)}};const check_workflow=function(workflow){if(!workflow)return;var ids=[];if(!_.isArray(workflow)){addValidationError("CHK_MSG_OBJ_GEN_850","invalid workflow Array property");return}for(let val of workflow){if(!_.isObject(val)){addValidationError("CHK_MSG_OBJ_GEN_852","invalid workflow item object property");continue}if(!val.id){addValidationError("CHK_MSG_OBJ_GEN_854","missing workflow.id property");continue}if(ids.includes(val.id)){addValidationError("CHK_MSG_OBJ_GEN_856",`${val.id} id must be unique in workflow property`);continue}ids.push(val.id);if(!_.isObject(val.data)){addValidationError("CHK_MSG_OBJ_GEN_858","invalid workflow.data Object property")}if(!_.isObject(val.props)){addValidationError("CHK_MSG_OBJ_GEN_860","invalid workflow.props item object property")}}};const check_progDataSource=function(){if(!doc.progDataSource)return;if(!_.isObject(doc.progDataSource)){addValidationError("CHK_MSG_OBJ_GEN_602","invalid progDataSource Object property");return}if(typeof doc.progDataSource.dataSourceType==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_604","undefined progDataSource.dataSourceType string property")}};const check_progUi=function(){if(!doc.progUi)return;if(!_.isArray(doc.progUi)){addValidationError("CHK_MSG_OBJ_GEN_702","invalid progUi Array property");return}var ids=[];const run_tree=function(node){for(let item of node){if(!_.isObject(item)){addValidationError("CHK_MSG_OBJ_GEN_704","invalid progUi item Object property");continue}if(!item.id&&item?.type!=="comment"){addValidationError("CHK_MSG_OBJ_GEN_712","missing progUi id item property")}if(item?.id){if(item?.type==="comment"){addValidationError("CHK_MSG_OBJ_GEN_705",`Comment type is not supported in progUi (${item.id})`);continue}if(item?.type==="text"){addValidationError("CHK_MSG_OBJ_GEN_706",`Text type is not supported in progUi (${item.id}). Convert to "element" type and add a "text" property instead`);continue}if(item?.attributes&&!_.isObject(item.attributes)){addValidationError("CHK_MSG_OBJ_GEN_707",`Invalid progUi attributes object property (${item.id})`)}if(typeof item.type==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_708",`Missing progUi type property (${item.id})`)}if(typeof item.tagName==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_710",`Missing progUi tagName property (${item.id})`)}if(item.id!=="root"&&doc?.studio_meta?.source==="studio ai"&&!detectCryptoString(item.id.replace("node-","").replace("ui-","")).uuid){addValidationError("CHK_MSG_OBJ_GEN_713",`ProgUi item ID must be in UUID format (${item.id})`)}if(ids.includes(item.id)){addValidationError("CHK_MSG_OBJ_GEN_714",`Duplicate progUi item ID found (${item.id})`);continue}ids.push(item.id)}check_workflow(item.workflow);if(item.children){run_tree(item.children)}}};run_tree(doc.progUi)};if(doc.properties&&doc.properties.menuType){switch(doc.properties.menuType){case"table":if(!doc.tableFields){addValidationError("CHK_MSG_OBJ_GEN_200","missing tableFields property")}else{if(!_.isArray(doc.tableFields)){addValidationError("CHK_MSG_OBJ_GEN_202","invalid tableFields Array property")}else{var ids=[];for(let val of doc.tableFields){if(!_.isObject(val)){addValidationError("CHK_MSG_OBJ_GEN_204","invalid tableFields object property");continue}if(!val.id){addValidationError("CHK_MSG_OBJ_GEN_206","missing tableFields.id property");continue}if(ids.includes(val.id)){addValidationError("CHK_MSG_OBJ_GEN_208",`${val.id} id must be unique in tableFields property`);continue}ids.push(val.id);if(!_.isObject(val.data)){addValidationError("CHK_MSG_OBJ_GEN_210","invalid tableFields.data object property");continue}if(!val.data.field_id){addValidationError("CHK_MSG_OBJ_GEN_212","invalid tableFields.data.field_id property")}if(!_.isObject(val.props)){addValidationError("CHK_MSG_OBJ_GEN_214","invalid tableFields.props object property");continue}if(!val.props.fieldType){addValidationError("CHK_MSG_OBJ_GEN_216","invalid tableFields.props.fieldType property")}}}}if(!doc.tableIndexes){addValidationError("CHK_MSG_OBJ_GEN_302","missing tableIndexes property")}else if(!_.isArray(doc.tableIndexes)){addValidationError("CHK_MSG_OBJ_GEN_302","invalid tableIndexes Array property")}else{var index_ids=[];for(let val of doc.tableIndexes){if(!_.isObject(val)){addValidationError("CHK_MSG_OBJ_GEN_304","invalid tableIndexes object property");continue}if(!val.id){addValidationError("CHK_MSG_OBJ_GEN_306","missing tableIndexes.id property");continue}if(index_ids.includes(val.id)){addValidationError("CHK_MSG_OBJ_GEN_308",`${val.id} id must be unique in tableIndexes property`);continue}index_ids.push(val.id);if(!_.isObject(val.data)){addValidationError("CHK_MSG_OBJ_GEN_310","invalid tableIndexes.data object property");continue}if(!val.data.name){addValidationError("CHK_MSG_OBJ_GEN_312","invalid tableIndexes.data.name property")}if(!_.isArray(val.data.keys)){addValidationError("CHK_MSG_OBJ_GEN_312","invalid tableIndexes.data.keys Array property")}}}break;case"globals":check_progFields();check_progEvents();break;case"get_data":case"set_data":case"batch":case"api":check_progFields();check_progEvents();check_progDataSource();break;case"component":check_progFields();check_progEvents();check_progDataSource();check_progUi();if(doc.properties&&typeof doc.properties.uiFramework==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_120","undefined properties.uiFramework string property")}if(doc.properties&&typeof doc.properties.renderType==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_122","undefined properties.renderType string property")}break;case"alert":break;case"javascript":break;case"folder":break;default:break}}return ret};const check_table=function(doc){var ret=[];if(!doc.properties.databaseSocket){ret.push({code:"CHK_MSG_TBL_GEN_010",data:"database socket not defined",type:doc.studio_meta.not_in_use?"W":"E",category:`table`,ref:doc._id,id:doc._id})}else{if(!app_obj?.app_plugins_purchased?.[doc.properties.databaseSocket]){ret.push({code:"CHK_MSG_TBL_GEN_0020",data:`invalid ${doc.properties.databaseSocket} database socket`,type:doc.studio_meta.not_in_use||warn_plugin_check?"W":"E",category:`table`,ref:doc._id,id:doc._id})}else{if(!app_obj.app_plugins_purchased[doc.properties.databaseSocket].installed){ret.push({code:"CHK_MSG_TBL_GEN_030",data:`${doc.properties.databaseSocket} database socket not installed`,type:doc.studio_meta.not_in_use?"W":"E",category:`table`,ref:doc._id,id:doc._id})}}}if(doc.tableIndexes?.length&&!doc?.tableFields?.length){ret.push({code:"CHK_MSG_TBL_FLD_090",data:`table has no fields`,type:doc.studio_meta.not_in_use?"W":"E",category:`table`,ref:doc._id,id:doc._id})}var name_counts_obj={};for(let field of doc.tableFields){if(!field?.data?.field_id){ret.push({code:"CHK_MSG_TBL_FLD_100",data:`missing field_id`,type:doc.studio_meta.not_in_use?"W":"E",category:`table`,ref:field.id,id:`${doc._id}-${field.id}`})}else{if(!/^[A-Za-z]+[\w\-\:\.]*$/.test(field.data.field_id)){ret.push({code:"CHK_MSG_TBL_FLD_020",data:`invalid field_id`,type:doc.studio_meta.not_in_use?"W":"E",category:`table`,ref:field.id,id:`${doc._id}-${field.id}`})}if(!name_counts_obj[field.data.field_id]){name_counts_obj[field.data.field_id]=1}else{name_counts_obj[field.data.field_id]++}if(!hide_not_in_use_check){if(!find_field_in_progs(doc,field.data.field_id)){ret.push({code:"CHK_MSG_TBL_FLD_022",data:`table field "${field.data.field_id}" not in use`,type:"W",category:`table`,ref:doc._id,not_in_use:true,id:`${doc._id}-${field.id}`})}}}}for(let[key,val]of Object.entries(name_counts_obj)){if(val>1){ret.push({code:"CHK_MSG_TBL_FLD_200",data:`duplicate field id for ${key}`,type:doc.studio_meta.not_in_use?"W":"E",id:`${doc._id}-${key}`})}}if(!doc.tableIndexes?.length){if(doc.properties.databaseSocket!=="@xuda.io/xuda-dbs-plugin-xuda"){ret.push({code:"CHK_MSG_TBL_IDX_040",data:`at least one index has to be defined`,type:doc.studio_meta.not_in_use?"W":"E",id:`${doc._id}`})}}else{let found_unique;for(let index of doc.tableIndexes){if(index?.data?.unique){found_unique=true}if(!index?.data?.name){ret.push({code:"CHK_MSG_TBL_IDX_060",data:`tableIndexes.data.name cannot be empty in "${index.id}" index`,type:doc.studio_meta.not_in_use?"W":"E",id:`${doc._id}`})}if(!index?.data?.keys?.length){ret.push({code:"CHK_MSG_TBL_IDX_070",data:`tableIndexes.data.keys cannot be empty in "${index.id}" index`,type:doc.studio_meta.not_in_use?"W":"E",id:`${doc._id}-${index.id}`})}else{for(let key of index.data.keys){if(!doc.tableFields||!_.isArray(doc.tableFields)||!find_item_by_key(doc.tableFields,"field_id",key)){ret.push({code:"CHK_MSG_TBL_IDX_080",data:`invalid key ${key} in tableIndexes.data.keys for "${index.id}" index`,type:doc.studio_meta.not_in_use?"W":"E",id:`${doc._id}-${index.id}-${key}`})}}}}}if(!doc?.tableFields?.length){ret.push({code:"CHK_MSG_TBL_FLD_012",data:`table has no fields`,type:"W",id:`${doc._id}`})}for(let field of doc.tableFields){if(!["string","number","boolean","object","array","date"].includes(field?.props?.fieldType)){ret.push({code:"CHK_MSG_TBL_FLD_022",data:`invalid fieldType for field ${field?.data?.field_id}`,type:"E",id:`${doc._id}-${field.id}`})}}return ret};const check_globals=function(doc){var ret=[];ret=[...ret,...check_prog_fieldset(doc)];return ret};const check_component=function(doc){var ret=[];if(!doc.properties.uiFramework){ret.push({code:"CHK_MSG_PRG_COM_010",data:"component Ui Framework not defined",type:doc.studio_meta.not_in_use?"W":"E",category:`component`,ref:doc._id,id:`${doc._id}`})}else{if(typeof app_obj!=="undefined"){if(!app_obj?.app_plugins_purchased?.[doc.properties.uiFramework]){ret.push({code:"CHK_MSG_PRG_COM_020",data:`invalid ${doc.properties.uiFramework} Ui Framework`,type:doc.studio_meta.not_in_use?"W":"E",category:`component`,ref:doc._id,id:`${doc._id}`})}else{if(!app_obj.app_plugins_purchased[doc.properties.uiFramework].installed){ret.push({code:"CHK_MSG_PRG_COM_030",data:`${doc.properties.uiFramework} Ui Framework not installed`,type:doc.studio_meta.not_in_use?"W":"E",category:`component`,ref:doc._id,id:`${doc._id}`})}}}}ret=[...ret,...check_prog_fieldset(doc)];ret=[...ret,...check_prog_parameters(doc)];ret=[...ret,...check_prog_datasource(doc)];if(doc.progUi){var xu_tree_id_counts_obj={};const run_tree=function(node){for(let item of node){if(item.xu_tree_id){if(!xu_tree_id_counts_obj[item.xu_tree_id]){xu_tree_id_counts_obj[item.xu_tree_id]=1}else{xu_tree_id_counts_obj[item.xu_tree_id]++}}if(item.attributes){var name_counts_obj={};for(let[key,val]of Object.entries(item.attributes)){if(!key){ret.push({code:"CHK_MSG_PRG_GUI_010",data:`missing attribute in tree_id ${item.id}`,type:doc.studio_meta.not_in_use?"W":"E",category:`component_ui`,ref:item.id,id:`${doc._id}-${item.id}-${key}`})}else{if(key.substr(0,6)==="xu-exp"){ret=[...ret,...check_prog_expression(doc,val,item.id,"ui_attribute")]}else{if(!/^[A-Za-z]+[\w\-\:\.]*$/.test(key)){ret.push({code:"CHK_MSG_PRG_GUI_020",data:`invalid attribute "${key}" in tag "${item.tagName}" "${item.id}"`,type:doc.studio_meta.not_in_use?"W":"E",category:`component_ui`,ref:item.id,id:`${doc._id}-${item.id}-${key}`})}}if(key.substr(0,6)==="xu-on:"){if(!_.isEmpty(val)){for(let trigger_item of val){ret=[...ret,...check_prog_triggers(doc,trigger_item.workflow,"ui_trigger",item.id,item.attributes.tree_id)]}}}if(!name_counts_obj[key]){name_counts_obj[key]=1}else{name_counts_obj[key]++}}}for(let[key,val]of Object.entries(name_counts_obj)){if(val>1){ret.push({code:"CHK_MSG_PRG_GUI_200",data:`duplicate attribute id for ${key} in tree_id ${item.attribute.tree_id}`,type:doc.studio_meta.not_in_use?"W":"E",category:`component_ui`,ref:doc._id,id:`${doc._id}-${item.id}-${key}`})}}}if(item.children){run_tree(item.children)}}};run_tree(doc.progUi);for(let[key,val]of Object.entries(xu_tree_id_counts_obj)){if(val>1){ret.push({code:"CHK_MSG_PRG_GUI_250",data:`duplicate tree_id "${key}"`,type:"W",category:`component_ui`,ref:doc._id,id:`${doc._id}-${key}`})}}}return ret};const check_get_data=function(doc){var ret=[];ret=[...ret,...check_prog_fieldset(doc)];ret=[...ret,...check_prog_parameters(doc)];ret=[...ret,...check_prog_datasource(doc)];return ret};const check_batch=function(doc){var ret=[];ret=[...ret,...check_prog_fieldset(doc)];ret=[...ret,...check_prog_parameters(doc)];ret=[...ret,...check_prog_datasource(doc)];return ret};const check_api=function(doc){var ret=[];ret=[...ret,...check_prog_fieldset(doc)];ret=[...ret,...check_prog_parameters(doc)];ret=[...ret,...check_prog_datasource(doc)];return ret};const check_set_data=function(doc){var ret=[];ret=[...ret,...check_prog_fieldset(doc)];ret=[...ret,...check_prog_parameters(doc)];ret=[...ret,...check_prog_datasource(doc)];return ret};const check_alert=function(doc){var ret=[];if(_.isEmpty(doc.alertData)){ret.push({code:"CHK_MSG_PRG_ART_010",data:`no alert properties defined`,type:doc.studio_meta.not_in_use?"W":"E",category:`alert`,ref:doc._id,id:`${doc._id}`})}else{if(!doc.alertData.alertType){ret.push({code:"CHK_MSG_PRG_ART_020",data:`missing alert type property`,type:doc.studio_meta.not_in_use?"W":"E",category:`alert`,ref:doc._id,id:`${doc._id}`})}if(!doc.alertData.alertDisplay){ret.push({code:"CHK_MSG_PRG_ART_030",data:`missing alert display property`,type:doc.studio_meta.not_in_use?"W":"E",category:`alert`,ref:doc._id,id:`${doc._id}`})}if(!doc.alertData.alertTitle&&!doc.alertData.alertTitleFx&&!doc.alertData.alertBody&&!doc.alertData.alertBodyFx){ret.push({code:"CHK_MSG_PRG_ART_032",data:`missing alert title and body value`,type:"W",category:`alert`,ref:doc._id,id:`${doc._id}`})}}return ret};const check_route=function(doc){var ret=[];if(_.isEmpty(doc?.routeMenu?.menu)){ret.push({code:"CHK_MSG_RTE_MNU_010",data:`no route properties defined`,type:doc.studio_meta.not_in_use?"W":"E",category:`alert`,ref:doc._id,id:`${doc._id}`})}else{function checkMenuItems(menu){let flatMenu={};function recurse(items){for(let item of items){if(!item.prog_id){ret.push({code:"CHK_MSG_RTE_MNU_020",data:`no program to call has been defined`,type:doc.studio_meta.not_in_use?"W":"E",category:`alert`,ref:item.id,id:`${doc._id}`});continue}if(!progs_obj?.[item.prog_id]){ret.push({code:"CHK_MSG_RTE_MNU_030",data:`program ${item.prog_id} not exist`,type:doc.studio_meta.not_in_use?"W":"E",category:`alert`,ref:item.id,id:`${doc._id}`});continue}if(item.children&&item.children.length>0){recurse(item.children)}}}recurse(menu);return flatMenu}checkMenuItems(doc.routeMenu.menu)}return ret};const check_ai_agent=function(doc){var ret=[];if(!doc?.agentConfig){ret.push({code:"CHK_MSG_PRG_AGN_010",data:"Ai Agent agentConfig not defined",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}if(!doc?.agentConfig?.agent_instructions){ret.push({code:"CHK_MSG_PRG_AGN_020",data:"Ai Agent instructions is required",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}if(doc?.agentConfig?.agent_instructions?.length<10){ret.push({code:"CHK_MSG_PRG_AGN_030",data:"Ai Agent instructions is too short",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}if(!doc?.agentConfig?.agent_instructions?.agent_tools?.length&&doc?.agentConfig?.use_tools_only){ret.push({code:"CHK_MSG_PRG_AGN_040",data:"Ai Agent use_tools_only set to true but could not find agent_tools configuration",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}for(const tool of doc?.agentConfig?.agent_tools||[]){switch(tool.type){case"file_search":{if(_.isEmpty(tool.file)){ret.push({code:"CHK_MSG_PRG_AGN_100",data:"Ai Agent file_search set but could not find file configuration",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}else{if(_.isEmpty(tool?.file?.access_link)){ret.push({code:"CHK_MSG_PRG_AGN_110",data:"Ai Agent file_search set but could not find file configuration",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}else{if(_.isEmpty(tool?.file?.file_id)){ret.push({code:"CHK_MSG_PRG_AGN_120",data:"Ai Agent file_search set but could not find file uploaded",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}else{if(_.isEmpty(tool?.file?.vector_file_id)){ret.push({code:"CHK_MSG_PRG_AGN_130",data:"Ai Agent file_search set but could not find vector_file uploaded",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}}}}break}case"youtube":{if(_.isEmpty(tool?.youtube?.url)){ret.push({code:"CHK_MSG_PRG_AGN_200",data:"Ai Agent youtube set but could not find url",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}else{if(_.isEmpty(tool?.youtube?.file_id)){ret.push({code:"CHK_MSG_PRG_AGN_210",data:"Ai Agent youtube set but could not find file uploaded",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}else{if(_.isEmpty(tool?.youtube?.vector_store_id)){ret.push({code:"CHK_MSG_PRG_AGN_220",data:"Ai Agent youtube set but could not find vector_file uploaded",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}}}break}case"mcp":{if(_.isEmpty(tool?.url)){ret.push({code:"CHK_MSG_PRG_AGN_310",data:"Ai Agent mcp tool set but could not find url",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}else{if(tool?.url.substr(0,7)!=="https://"){ret.push({code:"CHK_MSG_PRG_AGN_320",data:"Ai Agent mcp tool set but found invalid url",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}}break}case"cpi":{break}case"table":{if(_.isEmpty(tool?.prog_id)){ret.push({code:"CHK_MSG_PRG_AGN_410",data:"Ai Agent table tool set but could not find table id",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}break}case"ai_agent":{break}case"plugin":{if(_.isEmpty(tool?.plugin_id)){ret.push({code:"CHK_MSG_PRG_AGN_510",data:"Ai Agent plugin tool set but could not find plugin id",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}else{if(_.isEmpty(tool?.method)){ret.push({code:"CHK_MSG_PRG_AGN_520",data:"Ai Agent plugin tool set but could not find method property",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}}break}case"program":{if(_.isEmpty(tool?.prog_id)){ret.push({code:"CHK_MSG_PRG_AGN_410",data:"Ai Agent program tool set but could not find program id",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}break}default:break}}return ret};const check_prog_fieldset=function(doc){var ret=[];if(!doc.progFields||_.isEmpty(doc.progFields)){if(doc.progDataSource.dataSourceTableId){ret.push({code:"CHK_MSG_PRG_FLD_012",data:`datasource table defined but fieldset is empty`,type:"W",category:"fieldset",id:`${doc._id}`})}}else{var name_counts_obj={};for(let field of doc.progFields){if(!field?.data?.field_id){ret.push({code:"CHK_MSG_PRG_FLD_010",data:`missing field_id`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`})}else{if(!/^[A-Za-z]+[\w\-\:\.]*$/.test(field.data.field_id)&&!PROTECTED_VARS.includes(field.data.field_id)){ret.push({code:"CHK_MSG_PRG_FLD_020",data:`invalid ${field.data.field_id} field_id`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`})}if(!name_counts_obj[field.data.field_id]){name_counts_obj[field.data.field_id]=1}else{name_counts_obj[field.data.field_id]++}if(!hide_not_in_use_check){if(!find_field_in_progs(doc,field.data.field_id)){var found_parameter_out_match;if(!_.isEmpty(doc.properties.progParams)){for(let parameter_item of doc.properties.progParams){if(parameter_item.data.dir==="out"&&parameter_item.data.parameter===field.data.field_id){found_parameter_out_match=true;break}}}if(!found_parameter_out_match){ret.push({code:"CHK_MSG_PRG_FLD_022",data:`field "${field.data.field_id}" not in use`,type:"W",category:"fieldset",ref:field.id,not_in_use:true,id:`${doc._id}-${field.id}`})}}}}if(!field?.data?.type){ret.push({code:"CHK_MSG_PRG_FLD_030",data:`missing field type`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`});return ret}else{switch(field.data.type){case"virtual":break;case"exp":if(!field?.props?.fieldValue||!field?.props?.propExpressions?.fieldValue){ret.push({code:"CHK_MSG_PRG_FLD_070",data:`invalid value or value expression for ${field.data.field_id} field type Exp`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`})}break;case"table":if(doc.properties.menuType==="globals"){ret.push({code:"CHK_MSG_PRG_FLD_040",data:`invalid field type for ${field.data.field_id} in globals`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`})}else{if(!doc.progDataSource||_.isEmpty(doc.progDataSource)||!doc.progDataSource.dataSourceType||doc.progDataSource.dataSourceType==="none"){ret.push({code:"CHK_MSG_PRG_FLD_300",data:`undefined datasource for ${field.data.field_id} field`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`});return ret}else{var ret_dsc=check_prog_datasource(doc);if(ret_dsc.length)return ret;var _datasource_table_arr=progs_obj?.[doc.progDataSource.dataSourceTableId]?.tableFields;if(!_datasource_table_arr){ret.push({code:"CHK_MSG_PRG_FLD_310",data:`no fields found in datasource table ${doc.progDataSource.dataSourceTableId} `,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`});return ret}if(!find_item_by_key(_datasource_table_arr,"field_id",field.data.field_id)){if(!doc.progDataSource.dataSourceReduce||field.data.field_id!=="REDUCE_VALUE"){ret.push({code:"CHK_MSG_PRG_FLD_320",data:`invalid field ${field.data.field_id} in datasource table`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`});return ret}}}}break;default:ret.push({code:"CHK_MSG_PRG_FLD_060",data:`invalid field type for ${field.data.field_id}`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`});return ret;break}}if(!field?.props?.fieldType&&!field?.props?.propExpressions?.fieldType){ret.push({code:"CHK_MSG_PRG_FLD_130",data:`missing field fieldType`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`});return ret}else if(field.props.fieldType){switch(field.props.fieldType){case"string":if(field?.props?.fieldValue&&typeof field.props.fieldValue!=="string"){ret.push({code:"CHK_MSG_PRG_FLD_200",data:`invalid value type ${field.props.fieldType} for ${field.data.field_id} field`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`})}break;case"number":case"boolean":if(field?.props?.fieldValue){if(_.isNaN(_.toNumber(field?.props?.fieldValue))){ret.push({code:"CHK_MSG_PRG_FLD_210",data:`invalid value type ${field.props.fieldType} for ${field.data.field_id} field`,type:"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`})}}break;case"object":case"array":if(field?.props?.fieldValue){try{JSON5.parse(field.props.fieldValue)}catch(err){ret.push({code:"CHK_MSG_PRG_FLD_220",data:`invalid value type "${field.props.fieldType}" for "${field.data.field_id}" field`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`})}}break;default:ret.push({code:"CHK_MSG_PRG_FLD_160",data:`invalid field fieldType for ${field.data.field_id}`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`});return ret;break}}if(!_.isEmpty(field.workflow)){ret=[...ret,...check_prog_triggers(doc,field.workflow,"field",field.id,field.data.field_id)]}}for(let[key,val]of Object.entries(name_counts_obj)){if(val>1){ret.push({code:"CHK_MSG_PRG_FLD_200",data:`duplicate field id for ${key}`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",id:`${doc._id}-${key}`})}}}return ret};const check_prog_events=function(doc){var ret=[];if(!doc.progEvents||_.isEmpty(doc.progEvents))return ret;var name_counts_obj={};for(let event_item of doc.progEvents){switch(event_item?.data?.type){case"user_defined":if(!event_item.data.event_name){ret.push({code:"CHK_MSG_PRG_EVT_010",data:`missing event name for ${event_item.id}`,type:"W",category:"event",ref:event_item.id,id:`${doc._id}-${event_item.id}`});continue}else{if(!/^[A-Za-z]+[\w\-\:\.]*$/.test(event_item.data.event_name)){ret.push({code:"CHK_MSG_PRG_EVT_020",data:`invalid event name for event "${event_item.data.event_name||event_item.data.type}"`,type:doc.studio_meta.not_in_use?"W":"E",category:"event",ref:event_item.id,id:`${doc._id}-${event_item.id}`})}if(!hide_not_in_use_check){const ret_event_id_use=find_trigger_property_value_in_progs(doc,["raise_event"],"event",event_item.data.event_name);if(!ret_event_id_use?.length){ret.push({code:"CHK_MSG_PRG_EVT_112",data:`event "${event_item.data.event_name}" not in use`,type:"W",category:"event",ref:event_item.id,not_in_use:true,id:`${doc._id}-${event_item.id}`})}}}if(event_item.data.condition){ret=[...ret,...check_prog_expression(doc,event_item.data.condition,event_item.id,"condition")]}else{if(!name_counts_obj[event_item.id]){name_counts_obj[event_item.id]=1}else{name_counts_obj[event_item.id]++}}break;case"screen_ready":case"client_interval":if(doc.properties.menuType!=="component"){ret.push({code:"CHK_MSG_PRG_EVT_030",data:`event type "${event_item.data.type}" only allowed for "${doc.properties.menuType}" in event "${event_item.data.event_name||event_item.data.type}"`,type:doc.studio_meta.not_in_use?"W":"E",category:"event",ref:event_item.id,id:`${doc._id}-${event_item.id}`})}if(event_item.data.type==="client_interval"&&!event_item.data.properties){ret.push({code:"CHK_MSG_PRG_EVT_035",data:`empty interval property in event "${event_item.data.event_name||event_item.data.type}"`,type:doc.studio_meta.not_in_use?"W":"E",category:"event",ref:event_item.id,id:`${doc._id}-${event_item.id}`})}break;case"on_load":case"on_exit":case"before_record":case"after_record":case"record_not_found":case"locate_not_found":break;default:ret.push({code:"CHK_MSG_PRG_EVT_018",data:`invalid event type for ${event_item.id}`,type:doc.studio_meta.not_in_use?"W":"E",category:"event",ref:event_item.id,id:`${doc._id}-${event_item.id}`});break}if(!_.isEmpty(event_item.workflow)){ret=[...ret,...check_prog_triggers(doc,event_item.workflow,"event",event_item.id,event_item.data.event_name||event_item.data.type)]}else{ret.push({code:"CHK_MSG_PRG_EVT_022",data:`event "${event_item.data.event_name||event_item.data.type}" is empty`,type:"W",category:"event",ref:event_item.id,id:`${doc._id}-${event_item.id}`})}}for(let[key,val]of Object.entries(name_counts_obj)){if(val>1){ret.push({code:"CHK_MSG_PRG_EVT_102",data:`duplicate "${key}" event `,type:"W",category:"event",id:`${doc._id}-${event_item.id}-${key}`})}}return ret};const check_prog_triggers=function(doc,workflow,source_type,source_id,source_name){var ret=[];if(!workflow||_.isEmpty(workflow))return ret;const check_target_program_parameters=function(trigger_item){if(!trigger_item.data.name.prog)return;const target_program_parameters_arr=progs_obj?.[trigger_item.data.name.prog]?.properties?.progParams||[];if(trigger_item?.data?.name?.parameters&&!_.isEmpty(trigger_item.data.name.parameters)){for(let[key,val]of Object.entries(trigger_item.data.name.parameters)){const param_ret=find_item_by_key(target_program_parameters_arr,"parameter",key);if(_.isEmpty(param_ret)){ret.push({code:"CHK_MSG_PRG_TRG_370",data:`parameter "${key}" not found in the target program "${progs_obj?.[trigger_item.data.name.prog].properties.menuName}" parameter list in ${source_type} "${source_name}" trigger`,type:"W",category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}-${key}`});return}if(param_ret.data.dir!=="in"&&val.value){const ret_local_field=find_item_by_key(doc.progFields,"field_id",val.value);if(!ret_local_field){let ret_parent_field;const check_parent_program=function(prog_id){let parent_prog_id=progs_obj?.[prog_id]?.studio_meta?.parentId;if(parent_prog_id&&progs_obj?.[parent_prog_id]){ret_parent_field=find_item_by_key(progs_obj?.[parent_prog_id]?.progFields||[],"field_id",val.value);if(!ret_parent_field){return check_parent_program(parent_prog_id)}}};check_parent_program(doc._id);if(!ret_parent_field){const ret_global_field=find_item_by_key(progs_obj?.[`global_${app_obj._id}`]?.progFields||[],"field_id",val.value);if(!ret_global_field){ret.push({code:"CHK_MSG_PRG_TRG_372",data:`"${val.value}" parameter "Out" not found in the program Dataset in ${source_type} "${source_name}" trigger`,type:"W",category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}-${key}`})}}}}}}else{if(target_program_parameters_arr.length){ret.push({code:"CHK_MSG_PRG_TRG_374",data:`found parameters in "${progs_obj?.[trigger_item.data.name.prog].properties.menuName}" but empty parameter to exchange in ${source_type} "${source_name}" trigger`,type:"W",category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}};for(let trigger_item of workflow){const get_prog_id=function(){let _prop=trigger_item.data?.name?.properties;let _prog_id=trigger_item.data.name.prog_id||_prop?.["xu-exp:prog"];return _prog_id};const err_type=doc.studio_meta.not_in_use?"W":trigger_item.data.enabled?"E":"W";switch(trigger_item?.data?.action){case"comment":break;case"update":if(!trigger_item?.data?.name?.value){ret.push({code:"CHK_MSG_PRG_TRG_020",data:`no value to update in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{const validate_update_function=function(exp){var viewFields=[];try{var json=JSON5.parse(exp.replace(/\n/gi,""));for(const[key,val]of Object.entries(json)){let id=key.substr(1,key.length-1);viewFields.push({val:val,id:id})}return viewFields}catch(e){if(!exp){return}if(exp.substr(exp.length-1,1)===";")exp=exp.substr(0,exp.length-1);var exp_arr=exp.split(/;\s*(?=(?:[^"]|"[^"]*")*$)/g);if(exp_arr?.length){for(let val of exp_arr){var pos=val.indexOf(":");var seg=[val.substring(0,pos),val.substring(pos+1)];if(seg&&seg.length===2){let id=seg[0].substr(1,seg[0].length);viewFields.push({id:id,val:seg[1]})}else{ret.push({code:"CHK_MSG_PRG_TRG_040",data:`invalid json; too many segments in${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}}return viewFields}};const ret_update_fields_arr=validate_update_function(trigger_item.data.name.value);if(!ret_update_fields_arr.length){ret.push({code:"CHK_MSG_PRG_TRG_050",data:`no fields to update in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{for(let val of ret_update_fields_arr){const ret_fields=find_field_in_progs(doc,val.id);if(!ret_fields){ret.push({code:"CHK_MSG_PRG_TRG_060",data:`field "${val.id}" not found in the project programs for update in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}}}break;case"raise_event":if(!trigger_item?.data?.name?.event&&!trigger_item?.data?.name?.properties["xu-exp:event"]){ret.push({code:"CHK_MSG_PRG_TRG_100",data:`invalid event name for "${trigger_item.data.action}" in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else if(trigger_item?.data?.name?.event){if(!/^[A-Za-z]+[\w\-\:\.]*$/.test(trigger_item.data.name.event)){ret.push({code:"CHK_MSG_PRG_TRG_110",data:`invalid event name ${trigger_item.data.name.event} in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{const ret_event_name=find_event_id_in_progs(doc,trigger_item.data.name.event);if(!ret_event_name.length){ret.push({code:"CHK_MSG_PRG_TRG_120",data:`call performed to non exist event name called from "${trigger_item.data.name.event}" in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(ret_event_name.length===1&&!_.isEmpty(trigger_item.data.name.parameters)){for(let[key,val]of Object.entries(trigger_item.data.name.parameters)){if(_.isEmpty(progs_obj?.[ret_event_name[0].prog_id].progFields)){if(!find_item_by_key(progs_obj?.[ret_event_name[0].prog_id].progFields,"field_id",key)){ret.push({code:"CHK_MSG_PRG_TRG_130",data:`parameter "${key}" not exist in the dataset of the target program called from event name "${trigger_item.data.name.event}" in ${source_type} "${source_name}" trigger`,type:"W",category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}-${key}`})}}}}}}}break;case"call_page":case"call_modal":case"call_popover":if(!trigger_item.data.name.prog){if(!trigger_item.data?.name?.properties?.["xu-exp:prog"]){ret.push({code:"CHK_MSG_PRG_TRG_310",data:`empty program to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}else{if(!progs_obj?.[trigger_item.data.name.prog]){ret.push({code:"CHK_MSG_PRG_TRG_320",data:`invalid program to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(progs_obj?.[trigger_item.data.name.prog].properties.menuType!=="component"){ret.push({code:"CHK_MSG_PRG_TRG_334",data:`invalid program type "${trigger_item.data.action}" to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{check_target_program_parameters(trigger_item)}}}break;case"call_project_api":if(!trigger_item.data.name.prog){if(!trigger_item.data?.name?.properties?.["xu-exp:prog"]){ret.push({code:"CHK_MSG_PRG_TRG_310",data:`empty program to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}else{if(!progs_obj?.[trigger_item.data.name.prog]){ret.push({code:"CHK_MSG_PRG_TRG_320",data:`invalid program to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(progs_obj?.[trigger_item.data.name.prog].properties.menuType!=="api"){ret.push({code:"CHK_MSG_PRG_TRG_334",data:`invalid program type "${trigger_item.data.action}" to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{check_target_program_parameters(trigger_item)}}}break;case"call_system_api":{const _api_method=trigger_item.data.name.api_method;if(!_api_method){ret.push({code:"CHK_MSG_PRG_TRG_380",data:`api_method not defined in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(typeof _conf!=="undefined"){if(!_conf.cpi_methods[_api_method]){ret.push({code:"CHK_MSG_PRG_TRG_382",data:`api method ${_api_method} unrecognized in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(_conf.cpi_methods[_api_method].private){ret.push({code:"CHK_MSG_PRG_TRG_384",data:`api method ${_api_method} is private in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`});continue}if(_conf.cpi_methods[_api_method].fields){for(let[key,val]of Object.entries(_conf.cpi_methods[_api_method].fields)){if(val.mandatory&&!trigger_item.data.name?.payload?.[key]){ret.push({code:"CHK_MSG_PRG_TRG_386",data:`field ${key} for api method ${_api_method} is mandatory field in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}}}}}break}case"call_external_api":{if(!trigger_item.data.name.method){ret.push({code:"CHK_MSG_PRG_TRG_388",data:`method not defined in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}if(!trigger_item.data.name.url){ret.push({code:"CHK_MSG_PRG_TRG_389",data:`url not defined in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}break}case"get_data":case"set_data":case"batch":case"call_native_javascript":case"call_evaluate_javascript":case"call_alert":if(!trigger_item.data.name.prog){if(!trigger_item.data?.name?.properties?.["xu-exp:prog"]){ret.push({code:"CHK_MSG_PRG_TRG_310",data:`empty program to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}else{if(!progs_obj?.[trigger_item.data.name.prog]){ret.push({code:"CHK_MSG_PRG_TRG_320",data:`invalid program to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(progs_obj?.[trigger_item.data.name.prog].properties.menuType!==trigger_item.data.action){if(["call_native_javascript","call_evaluate_javascript"].includes(trigger_item.data.action)&&progs_obj?.[trigger_item.data.name.prog].properties.menuType==="javascript"){continue}if(["call_alert"].includes(trigger_item.data.action)&&progs_obj?.[trigger_item.data.name.prog].properties.menuType==="alert"){continue}ret.push({code:"CHK_MSG_PRG_TRG_330",data:`call set to "${trigger_item.data.action}" but found "${progs_obj?.[trigger_item.data.name.prog].properties.menuType}" instead in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{check_target_program_parameters(trigger_item)}}}break;case"execute_native_javascript":case"execute_evaluate_javascript":check_prog_expression(doc,trigger_item.data.name.value,trigger_item.id,"script");break;case"emit_event":if(!trigger_item?.data?.name?.value){ret.push({code:"CHK_MSG_PRG_TRG_800",data:`no event defined for "emit_event" in ${source_type} "${source_name}" trigger`,type:err_type,category:`alert`,ref:doc._id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(!/^[A-Za-z]+[\w\-\:\.]*$/.test(trigger_item.data.name.value)){ret.push({code:"CHK_MSG_PRG_TRG_810",data:`invalid event name ${trigger_item.data.name.value} in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}break;case"alert":if(_.isEmpty(trigger_item.data.name)){ret.push({code:"CHK_MSG_PRG_TRG_610",data:`no alert properties defined`,type:err_type,category:`alert`,ref:doc._id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(!trigger_item.data.name.alertType){ret.push({code:"CHK_MSG_PRG_TRG_612",data:`missing alert type property`,type:err_type,category:`alert`,ref:doc._id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}if(!trigger_item.data.name.alertDisplay){ret.push({code:"CHK_MSG_PRG_TRG_614",data:`missing alert display property`,type:err_type,category:`alert`,ref:doc._id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}if(!trigger_item.data.name.alertTitle){ret.push({code:"CHK_MSG_PRG_TRG_616",data:`missing alert title property`,type:"W",category:`alert`,ref:doc._id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}if(!trigger_item.data.name.alertBody){ret.push({code:"CHK_MSG_PRG_TRG_618",data:`missing alert body property`,type:"W",category:`alert`,ref:doc._id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}break;case"loader_on":case"loader_off":if(doc.properties.menuType!=="component"){ret.push({code:"CHK_MSG_PRG_TRG_400",data:`"${trigger_item.data.action}" can only be executed by component in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}break;case"invoke_action":if(doc.properties.menuType!=="component"){ret.push({code:"CHK_MSG_PRG_TRG_400",data:`"${trigger_item.data.action}" can only be executed by component in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}if(!["act_next","act_prev","act_first","act_last","act_reload","act_refresh","act_print","act_save","act_delete"].includes(trigger_item.data.name.value)){ret.push({code:"CHK_MSG_PRG_TRG_400",data:`invalid "${trigger_item.data.name.value}" for "${trigger_item.data.action}" in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}break;case"delay":if(!trigger_item?.data?.name?.value){ret.push({code:"CHK_MSG_PRG_TRG_520",data:`empty delay value in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}break;case"call_library":if(!trigger_item?.data?.name?.plugin_name){ret.push({code:"CHK_MSG_PRG_TRG_510",data:`empty library value in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(!trigger_item?.data?.name?.library_method){ret.push({code:"CHK_MSG_PRG_TRG_516",data:`empty library ${trigger_item.data.name.plugin_name} method in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}if(!app_obj?.app_plugins_purchased?.[trigger_item.data.name.plugin_name]){ret.push({code:"CHK_MSG_PRG_TRG_512",data:`invalid library call ${trigger_item.data.name.plugin_name} in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(!app_obj.app_plugins_purchased[trigger_item.data.name.plugin_name].installed){ret.push({code:"CHK_MSG_PRG_TRG_514",data:` library "${trigger_item.data.name.plugin_name}" not installed in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}}break;case"alter_ui_element":case"create_ui_element":case"info_ui_element":case"remove_ui_element":case"empty_ui_element":case"cache_ui_element":case"load_ui_element":ret.push({code:"CHK_MSG_PRG_TRG_900",data:`deprecated "${trigger_item?.data?.action}" action in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`});break;default:ret.push({code:"CHK_MSG_PRG_TRG_008",data:`invalid trigger type "${trigger_item.data.action}" for ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`});break}if(trigger_item.props.condition){ret=[...ret,...check_prog_expression(doc,trigger_item.props.condition,trigger_item.id,"condition")]}}return ret};const check_prog_datasource=function(doc){var ret=[];if(!doc.progDataSource||_.isEmpty(doc.progDataSource)||!doc.progDataSource.dataSourceType||doc.progDataSource.dataSourceType==="none"){return ret}switch(doc.progDataSource.dataSourceType){case"table":if(!doc.progDataSource.dataSourceTableId&&!doc?.progDataSource?.dataSourceTableIdExp){ret.push({code:"CHK_MSG_PRG_DSC_010",data:`missing table id for datasource`,type:"E",id:`${doc._id}`});return ret}else{if(doc.progDataSource.dataSourceTableId&&!progs_obj?.[doc.progDataSource.dataSourceTableId]){ret.push({code:"CHK_MSG_PRG_DSC_030",data:`invalid table id ${doc.progDataSource.dataSourceTableId} for datasource`,type:"E",id:`${doc._id}`});return ret}let found_error;function arraysEqual(arr1,arr2){if(arr1.length!==arr2.length)return false;let sortedArr1=arr1.slice().sort();let sortedArr2=arr2.slice().sort();for(let i=0;i<sortedArr1.length;i++){if(sortedArr1[i]!==sortedArr2[i])return false}return true}if(doc.progDataSource.dataSourceIndexesObj){const table_indexes_arr=progs_obj?.[doc.progDataSource.dataSourceTableId]?.tableIndexes;for(let[index_id,index_data]of Object.entries(doc.progDataSource.dataSourceIndexesObj)){if(table_indexes_arr||!find_item_by_id(table_indexes_arr,index_id)){ret.push({code:"CHK_MSG_PRG_DSC_032",data:`find invalid index in table ${progs_obj?.[doc.progDataSource.dataSourceTableId]?.properties?.menuName||doc.progDataSource.dataSourceTableId} for index ${index_id} in dataSourceIndexesObj`,type:"E",id:`${doc._id}`});found_error=true;break}let prog_keys=[];for(let[field_id,val]of Object.entries(index_data)){prog_keys.push(field_id)}if(!arraysEqual(prog_keys,table_indexes_arr.keys)){ret.push({code:"CHK_MSG_PRG_DSC_034",data:`find in-consist index keys in table ${progs_obj?.[doc.progDataSource.dataSourceTableId]?.properties?.menuName||doc.progDataSource.dataSourceTableId} for index ${index_id} in dataSourceIndexesObj`,type:"E",id:`${doc._id}`});found_error=true;break}}if(found_error)return ret}}if(doc.properties.menuType!=="set_data"){if(!doc.progDataSource.dataSourceIndexId&&!doc.progDataSource.dataSourceIndexIdExp){ret.push({code:"CHK_MSG_PRG_DSC_042",data:`index not defined for the datasource table`,type:"W",id:`${doc._id}`})}else if(doc.progDataSource.dataSourceIndexId){if(!progs_obj?.[doc.progDataSource.dataSourceTableId]?.tableIndexes){ret.push({code:"CHK_MSG_PRG_DSC_030",data:`invalid table id ${doc.progDataSource.dataSourceTableId} for datasource`,type:"E",id:`${doc._id}`});return ret}else{const table_indexes_arr=progs_obj?.[doc.progDataSource.dataSourceTableId].tableIndexes;if(!find_item_by_id(table_indexes_arr,doc.progDataSource.dataSourceIndexId)){ret.push({code:"CHK_MSG_PRG_DSC_040",data:`invalid index in table ${progs_obj?.[doc.progDataSource.dataSourceTableId]?.properties?.menuName||doc.progDataSource.dataSourceTableId} for index ${doc.progDataSource.dataSourceIndexId}`,type:"E",id:`${doc._id}`});return ret}}}if(!doc.progDataSource.dataSourceSort&&!doc.progDataSource.dataSourceSortExp){ret.push({code:"CHK_MSG_PRG_DSC_200",data:`missing sort value for datasource`,type:"E",id:`${doc._id}`})}else if(doc.progDataSource.dataSourceSort){if(!["asc","des"].includes(doc.progDataSource.dataSourceSort)){ret.push({code:"CHK_MSG_PRG_DSC_210",data:`invalid sort value for datasource`,type:"E",id:`${doc._id}`})}}if(doc.progDataSource.dataSourceSkip&&typeof doc.progDataSource.dataSourceSkip!=="number"){ret.push({code:"CHK_MSG_PRG_DSC_220",data:`invalid skip value for datasource`,type:"E",id:`${doc._id}`})}if(doc.progDataSource.dataSourceLimit&&typeof doc.progDataSource.dataSourceLimit!=="number"){ret.push({code:"CHK_MSG_PRG_DSC_230",data:`invalid limit value for datasource`,type:"E",id:`${doc._id}`})}}break;default:ret.push({code:"CHK_MSG_PRG_DSC_040",data:`invalid datasource type ${doc.progDataSource.dataSourceType}`,type:"E",id:`${doc._id}`});break}return ret};const check_prog_parameters=function(doc){var ret=[];if(!doc?.properties?.progParams)return ret;var name_counts_obj={};for(let parameter of doc.properties.progParams){if(!parameter?.data?.parameter){ret.push({code:"CHK_MSG_PRG_PRM_010",data:`missing parameter name`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}`})}else{if(!/^[A-Za-z]+[\w\-\:\.]*$/.test(parameter.data.parameter)){ret.push({code:"CHK_MSG_PRG_PRM_020",data:`invalid parameter name`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}`})}if(!name_counts_obj[parameter.data.parameter]){name_counts_obj[parameter.data.parameter]=1}else{name_counts_obj[parameter.data.parameter]++}if(!hide_not_in_use_check){if(parameter.data.dir==="in"){if(!find_field_in_progs(doc,parameter.data.parameter)){ret.push({code:"CHK_MSG_PRG_PRM_022",data:`parameter "${parameter.data.parameter}" not in use`,type:"W",category:"parameter",ref:parameter.id,not_in_use:true,id:`${doc._id}-${parameter.id}`})}}}}if(!parameter?.data?.type){ret.push({code:"CHK_MSG_PRG_PRM_030",data:`missing parameter type for ${parameter.data.parameter}`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}`});return ret}else{switch(parameter.data.type){case"string":break;case"number":case"boolean":break;case"object":break;case"array":break;default:ret.push({code:"CHK_MSG_PRG_PRM_040",data:`invalid parameter type "${parameter.data.type}" for ${parameter.data.parameter}`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}`});return ret;break}}if(!parameter?.data?.dir){ret.push({code:"CHK_MSG_PRG_PRM_080",data:`missing parameter dir for ${parameter.data.parameter}`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}`});return ret}else{switch(parameter.data.dir){case"in":break;case"out":if(!find_item_by_key(doc.progFields,"field_id",parameter.data.parameter)){ret.push({code:"CHK_MSG_PRG_PRM_100",data:`missing parameter return in the fieldset for ${parameter.data.parameter}`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}`})}break;default:ret.push({code:"CHK_MSG_PRG_PRM_090",data:`invalid parameter dir for ${parameter.data.parameter}`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}`});return ret;break}}}for(let[key,val]of Object.entries(name_counts_obj)){if(val>1){ret.push({code:"CHK_MSG_PRG_PRM_050",data:`duplicate parameter name for ${key}`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}-${key}`})}}return ret};const check_javascript=function(doc){var ret=[];if(!doc?.scriptData?.value){ret.push({code:"CHK_MSG_PRG_JVS_012",data:"no script to run",type:"W",id:`${doc._id}`})}else{}return ret};const find_item_by_key=function(arr,key,val){return arr.find(function(e){return e.data[key]===val})};const find_item_by_id=function(arr,val){return arr.find(function(e){return e.id===val})};const find_field_in_progs=function(doc,field_id,prog_id){const regex=new RegExp(`@${field_id}\\b`);if(!regex.test(progs_str)){return}var ret=[];for(let[key,prog]of Object.entries(progs_obj)){var fields_arr=[];if(prog.tableFields){fields_arr=prog.tableFields}if(prog.progFields){fields_arr=prog.progFields}if(_.isEmpty(fields_arr)){continue}for(let field_item of fields_arr){if(field_item.data.field_id===field_id){ret.push({prog_id:prog._id,field_item:field_item,properties:prog.properties})}}}return ret};const check_prog_expression=function(doc,exp,path,category){var ret=[];if(!exp)return ret;if(!UglifyJS)return ret;const regex=/@\w+/g;const matches=exp.match(regex);var field_matches={};try{if(matches){for(let field of matches){const ret_field=find_field_in_progs(doc,field.substr(1));if(!ret_field){ret.push({code:"CHK_MSG_PRG_EXP_012",data:`field "${field}" not found in the project datasets using expression "${exp.substr(0,20)}.." in ${path}`,type:"W",category:category,source_id:path,id:`${doc._id}-${path}-${field}`})}else{field_matches[field]=ret_field}}}}catch(error){debugger}if(!_.isEmpty(ret)){return ret}if(_.isEmpty(field_matches)){var options={warnings:true};var result=UglifyJS.minify(exp,options);if(result.error){ret.push({code:"CHK_MSG_PRG_EXP_022",data:`expression error ${result.error.message} in ${exp.substr(0,20)}.. in ${path}`,type:doc.studio_meta.not_in_use?"W":"E",category:category,details:result.error,source_id:path,id:`${doc._id}-${path}`})}if(result.warnings){ret.push({code:"CHK_MSG_PRG_EXP_024",data:`expression warning ${result.warnings[0]} in ${exp.substr(0,20)}.. in ${path}`,type:"W",category:category,details:result.warnings,source_id:path,id:`${doc._id}-${path}`})}}else{var clean_exp=exp;var field_type="string";var skip_eval;for(let[key,val]of Object.entries(field_matches)){if(val.length>1){var field_ind_found_in_current_program;for(let[ret_key,ret_val]of Object.entries(val)){if(ret_val.prog_id===doc._id){field_ind_found_in_current_program=ret_key;break}}if(typeof field_ind_found_in_current_program==="undefined"){skip_eval=true;break}else{field_type=val[field_ind_found_in_current_program]?.field_item?.props?.fieldType}}else{field_type=val[0]?.field_item?.props?.fieldType}switch(field_type){case"string":clean_exp=clean_exp.replaceAll(key,"''");break;case"number":case"boolean":case"bool":clean_exp=clean_exp.replaceAll(key,"0");break;case"object":clean_exp=clean_exp.replaceAll(key,"{}");break;case"array":clean_exp=clean_exp.replaceAll(key,"[]");break;default:break}}if(!skip_eval){var options={warnings:true};var result=UglifyJS.minify(clean_exp,options);if(result.error){ret.push({code:"CHK_MSG_PRG_EXP_026",data:`expression error ${result.error.message} in ${exp.substr(0,20)}.. in ${path}`,type:doc.studio_meta.not_in_use?"W":"E",category:category,details:result.error,source_id:path,id:`${doc._id}-${path}`})}if(result.warnings){ret.push({code:"CHK_MSG_PRG_EXP_028",data:`expression warning ${result.warnings[0]} in ${exp.substr(0,20)}.. in ${path}`,type:"W",category:category,details:result.warnings,source_id:path,id:`${doc._id}-${path}`})}}}return ret};const find_event_id_in_progs=function(doc,event_id){var ret=[];for(let[key,prog]of Object.entries(progs_obj)){if(!prog.progEvents||_.isEmpty(prog.progEvents)){continue}for(let event_item of prog.progEvents){if(event_item.data.event_name===event_id){ret.push({prog_id:prog._id,event_item:event_item,properties:prog.properties})}}}if(!ret.length)return false;return ret};const find_xu_tree_id_in_progs=function(doc,xu_tree_id){var ret=[];for(let[key,prog]of Object.entries(progs_obj)){if(!prog.progUi||_.isEmpty(prog.progUi)){continue}const run_tree=function(node){for(let item of node){if(item.xu_tree_id===xu_tree_id){ret.push({prog_id:prog._id,item:item,properties:prog.properties})}if(item.children){run_tree(item.children)}}};run_tree(prog.progUi)}if(!ret.length)return false;return ret};const find_trigger_property_value_in_progs=function(doc,triggers_arr,property,value,search_in_doc_prog_only){var ret=[];const find_in_triggers=function(prog,workflow){if(!workflow)return;try{for(let val of workflow){if(triggers_arr.includes(val?.data?.action)){const str=JSON.stringify(val);const regex=new RegExp(`\\b${value}\\b`);if(value===null||val?.data?.name?.[property]===value||regex.test(str)){if(val?.data?.name?.[property]){ret.push({prog_id:prog._id,val:val,properties:prog.properties,prop_value:val?.data?.name?.[property]})}else{ret.push({prog_id:prog._id,val:val,properties:prog.properties})}}}}}catch(error){console.error(doc._id,workflow)}};const run_program_search=function(prog){if(prog?.progEvents&&!_.isEmpty(prog.progEvents)){for(let event_item of prog.progEvents){if(event_item.workflow){find_in_triggers(prog,event_item.workflow)}}}if(prog?.progFields&&!_.isEmpty(prog.progFields)){for(let field_item of prog.progFields){if(field_item.workflow){find_in_triggers(prog,field_item.workflow)}}}if(prog?.progUi&&!_.isEmpty(prog.progUi)){const run_tree=function(node){try{for(let item of node){if(item.attributes){for(let[key,val]of Object.entries(item.attributes)){if(key.substr(0,6)==="xu-on:"){if(!_.isEmpty(val)){for(let trigger_item of val){find_in_triggers(prog,trigger_item.workflow)}}}}}if(item.children){run_tree(item.children)}}}catch(error){console.error("find in ui workflow",error)}};run_tree(prog.progUi)}};if(!search_in_doc_prog_only){for(let[key,prog]of Object.entries(progs_obj)){run_program_search(prog)}}else{run_program_search(progs_obj?.[doc._id])}if(!ret.length)return false;return ret};const find_panel_prog_in_progs=function(doc,prog_id,search_in_doc_prog_only){var ret=[];const find_in_prog=function(prog){if(_.isEmpty(prog?.progUi))return;const run_tree=function(node){for(let item of node){if(item.tagName==="xu-panel"){const str=JSON.stringify(item);const regex=new RegExp(`\\b${prog_id}\\b`);if(prog_id===null||item?.attributes?.program?.prog===prog_id||regex.test(str)){if(item?.attributes?.program?.prog){ret.push({prog_id:prog._id,item:item,prop_value:item.attributes.program.prog})}else{ret.push({prog_id:prog._id,item:item})}}}if(item.children){run_tree(item.children)}}};run_tree(prog.progUi)};if(!search_in_doc_prog_only){for(let[key,prog]of Object.entries(progs_obj)){find_in_prog(prog)}}else{find_in_prog(progs_obj?.[doc._id])}if(!ret.length)return false;return ret};const find_table_in_progs=function(doc,table_id,search_in_doc_prog_only){var ret=[];const find_in_prog=function(prog){if(!prog.progDataSource||_.isEmpty(prog.progDataSource)||prog.progDataSource.dataSourceType!=="table"){return}if(prog.progDataSource.dataSourceTableId===table_id||prog.progDataSource?.dataSourceTableIdExp?.includes(table_id)){ret.push({prog_id:prog._id})}};if(!search_in_doc_prog_only){for(let[key,prog]of Object.entries(progs_obj)){find_in_prog(prog)}}else{find_in_prog(progs_obj?.[doc._id])}if(!ret.length)return false;return ret};const find_prog_in_fieldset_fieldValue_progs=function(doc,prog_id,search_in_doc_prog_only){var ret=[];const find_in_prog=function(prog){if(!prog.progFields)return;for(let field_item of prog.progFields){const str=JSON.stringify(field_item);const regex=new RegExp(`\\b${prog_id}\\b`);if(prog_id===null||field_item?.props?.fieldValue===prog_id||regex.test(str)){if(field_item?.props?.fieldValue){ret.push({prog_id:prog._id,field_item:field_item,properties:prog.properties,prop_value:field_item.props.fieldValue})}else{ret.push({prog_id:prog._id,field_item:field_item,properties:prog.properties})}}}};if(!search_in_doc_prog_only){for(let[key,prog]of Object.entries(progs_obj)){find_in_prog(prog)}}else{find_in_prog(progs_obj?.[doc._id])}if(!ret.length)return false;return ret};const new_node_id=function(type,app_id){const abbreviate=word=>{if(word.length<=3){return word}let abbreviation=word[0];const vowels="aeiou";for(let i=1;i<word.length&&abbreviation.length<3;i++){if(!vowels.includes(word[i].toLowerCase())){abbreviation+=word[i]}}if(abbreviation.length<3){abbreviation=word.substring(0,3)}return abbreviation};var last12uuid=crypto.randomUUID().split("-")[4];if(type){var menuAbbreviated=abbreviate(type.replaceAll("_",""));return`${app_id.substr(app_id.length-3)}_${menuAbbreviated}_${last12uuid}`}return app_id.substr(app_id.length-3)+"_"+last12uuid};function detectCryptoString(str){const patterns={uuid:/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i};const results={};for(const[type,pattern]of Object.entries(patterns)){results[type]=pattern.test(str)}return results}export const get_zod_schema=function(type){const UuidSchema=z.string().uuid().describe(`UUID format identifier`);const TimestampSchema=z.number().describe(`Unix timestamp in milliseconds`);const StudioMetaSchema=z.object({created:TimestampSchema.describe(`Timestamp when the ${type} was created`),createdByUid:z.string().describe(`User ID of the ${type} creator`),checkedInUserId:z.string().describe(`Last user ID who checked in the ${type}`),checkedInUserName:z.string().describe(`Display name of the last user who modified`),savedByUid:z.string().describe(`User ID who last saved the ${type}`),parentId:z.string().describe(`Parent container ID (default: "programs")`),source:z.string().optional().describe(`Source of creation (e.g., "studio ai", "studio ide")`),ui_preview_sizes:z.object({w:z.number().describe(`Preview width`),h:z.number().describe(`Preview height`),l:z.number().describe(`Left position`),t:z.number().describe(`Top position`)}).optional().describe(`Optional UI preview layout hints for visual editors`)}).describe(`Studio metadata for tracking creation, modification, and organizational information`);const ProgParamSchema=z.object({id:z.union([z.string(),z.number()]).describe(`Unique identifier for the parameter`),data:z.object({dir:z.union([z.literal(`in`),z.literal(`out`)]).describe(`Parameter direction: "in" for input parameters, "out" for output parameters`),parameter:z.string().describe(`Parameter name used for referencing in code and workflows`),type:z.union([z.literal(`string`),z.literal(`number`),z.literal(`boolean`),z.literal(`array`),z.literal(`object`)]).describe(`Expected data type of the parameter value`)}).describe(`Core parameter configuration including direction, name, and type`),props:z.object({}).optional().describe(`Additional parameter properties (reserved for future use)`)}).describe(`Input/output parameter definition for ${type} interface`);const ProgFieldSchema=z.object({id:UuidSchema.describe(`Unique UUID identifier for the field`),data:z.object({type:z.union([z.literal(`virtual`),z.literal(`table`),z.literal(`expression`),z.literal(`datasource`)]).describe(`Field type: virtual=variable, table=field from datasource table, expression=holds expression without evaluation, datasource=iterable datasource object/array`),field_id:z.string().describe(`The unique field name used for referencing`)}).describe(`Core field configuration defining its type and identifier`),props:z.object({fieldType:z.union([z.literal(`string`),z.literal(`number`),z.literal(`boolean`),z.literal(`array`),z.literal(`object`)]).describe(`Data type held by the field`),propExpressions:z.object({fieldValue:z.string().optional().describe(`Expression or static value for the field`),fieldType:z.string().optional().describe(`Dynamic field type expression`)}).strict().describe(`Property expressions - only fieldValue and fieldType are allowed`)}).describe(`Field properties including data type and expressions`),workflow:z.array(z.any()).optional().describe(`Optional workflow actions triggered by field changes`)}).describe(`Internal field definition used by the ${type} for data management`);const WorkflowActionSchema=z.object({id:z.union([UuidSchema,z.string(),z.number()]).describe(`Unique identifier for the workflow step`),data:z.object({action:z.union([z.literal(`call_modal`).describe(`Opens a ${type} as a modal dialog`),z.literal(`call_popover`).describe(`Opens a ${type} as a popover overlay`),z.literal(`call_page`).describe(`Navigates to or opens a page ${type}`),z.literal(`call_native_javascript`).describe(`Calls a JavaScript program by ID`),z.literal(`execute_native_javascript`).describe(`Executes inline JavaScript code`),z.literal(`call_evaluate_javascript`).describe(`Calls JavaScript program with argument evaluation`),z.literal(`execute_evaluate_javascript`).describe(`Evaluates and runs dynamic JavaScript expressions`),z.literal(`emit_event`).describe(`Emits a JavaScript event`),z.literal(`loader_on`).describe(`Shows loading indicator`),z.literal(`loader_off`).describe(`Hides loading indicator`),z.literal(`invoke_action`).describe(`Executes system-level actions (refresh, save, etc.)`),z.literal(`update`).describe(`Updates variable values or field data`),z.literal(`raise_event`).describe(`Triggers internal application events`),z.literal(`get_data`).describe(`Executes a get_data program for data retrieval`),z.literal(`set_data`).describe(`Executes a set_data program for data persistence`),z.literal(`batch`).describe(`Executes a batch program for bulk operations`),z.literal(`call_project_api`).describe(`Calls an API program within the current project`),z.literal(`call_external_api`).describe(`Makes HTTP requests to external APIs`),z.literal(`call_system_api`).describe(`Invokes system-level API methods`),z.literal(`alert`).describe(`Displays alert messages (modal, inline, etc.)`),z.literal(`call_alert`).describe(`Calls an alert program by ID`),z.literal(`comment`).describe(`Adds descriptive documentation to workflow`),z.literal(`delay`).describe(`Pauses workflow execution for specified duration`)]).describe(`The specific workflow action type to execute`),name:z.object({properties:z.object({}).optional().describe(`Action-specific properties configuration`),parameters:z.object({doc_in:z.object({value:z.string().optional().describe(`Static parameter value`),fx:z.string().optional().describe(`Dynamic expression referencing variables`)}).optional().describe(`Input parameter for data retrieval`),class_id:z.object({value:z.string().optional().describe(`Static parameter value`),fx:z.string().optional().describe(`Dynamic expression referencing variables`)}).optional().describe(`Class ID parameter for data operations`)}).catchall(z.object({value:z.string().optional().describe(`Static parameter value`),fx:z.string().optional().describe(`Dynamic expression referencing variables`)})).optional().describe(`Input parameters with static values or dynamic expressions`),prog:z.string().optional().describe(`Program ID to call (for call_* actions)`),value:z.string().optional().describe(`Value for action (comments, JavaScript code, variable assignments, delay duration)`),event:z.string().optional().describe(`Event name to trigger (for raise_event action)`),outputField:z.string().optional().describe(`Output variable to store action results (for set_data)`),url:z.string().optional().describe(`External API endpoint URL`),method:z.union([z.literal(`GET`),z.literal(`POST`),z.literal(`PUT`),z.literal(`DELETE`),z.literal(`PATCH`)]).optional().describe(`HTTP method for API calls`),api_method:z.string().optional().describe(`System-level method to invoke`),payload:z.object({}).optional().describe(`Data payload for API calls`),createLog:z.boolean().optional().describe(`Whether to create a log entry for alerts`),alertDisplay:z.union([z.literal(`modal`),z.literal(`inline`),z.literal(`toast`)]).optional().describe(`Alert display type`),alertType:z.union([z.literal(`error`),z.literal(`warning`),z.literal(`info`),z.literal(`success`)]).optional().describe(`Alert message type`),alertTitle:z.string().optional().describe(`Alert title text`),alertBody:z.string().optional().describe(`Alert body message content`)}).describe(`Action-specific configuration and parameters`),enabled:z.boolean().describe(`Whether the workflow step is active and will execute`)}).describe(`Core workflow action definition with type-specific validation`),props:z.object({condition:z.string().optional().describe(`Optional expression that must evaluate to true for action to execute`),async:z.boolean().optional().describe(`Whether to execute asynchronously without waiting for completion`)}).optional().describe(`Additional execution behavior configuration`)}).describe(`Individual workflow action step with comprehensive validation for all supported action types`);const ProgEventSchema=z.object({id:UuidSchema.describe(`Unique UUID identifier for the event`),data:z.object({type:z.union([z.literal(`on_load`),z.literal(`on_exit`),z.literal(`before_record`),z.literal(`after_record`),z.literal(`record_not_found`),z.literal(`locate_not_found`),z.literal(`screen_ready`),z.literal(`client_interval`),z.literal(`user_defined`)]).describe(`Event type defining when the event triggers during ${type} lifecycle`),event_name:z.string().describe(`Reference name for the event`),properties:z.string().describe(`Additional event properties (usually empty)`),condition:z.string().describe(`Optional condition expression to determine when event should fire`),parameters:z.array(z.any()).describe(`Array of parameter mappings for the event`)}).describe(`Core event configuration defining trigger conditions and parameters`),props:z.object({propExpressions:z.object({}).optional().describe(`Property expressions for dynamic event behavior`)}).describe(`Additional event properties and expressions`),workflow:z.array(WorkflowActionSchema).optional().describe(`Array of workflow actions to execute when event triggers`)}).describe(`Component lifecycle event with associated triggers and workflow actions`);const UiAttributesSchema=z.record(z.union([z.string(),z.number(),z.boolean(),z.object({}),z.array(z.object({handler:z.string().describe(`Event handler type`),props:z.object({}).optional().describe(`Handler-specific properties`),workflow:z.array(WorkflowActionSchema).optional().describe(`Workflow actions to execute on event`)}))])).refine(attrs=>{const xuAttributes=Object.keys(attrs).filter(key=>key.startsWith(`xu-`));for(const attr of xuAttributes){const value=attrs[attr];if(attr===`xu-bind`&&typeof value!==`string`){return false}if(attr===`xu-render`&&typeof value!==`string`){return false}if(attr===`xu-show`&&typeof value!==`string`){return false}if(attr===`xu-for`&&typeof value!==`string`){return false}if([`xu-for-key`,`xu-for-val`].includes(attr)&&typeof value!==`string`){return false}if(attr.startsWith(`xu-on:`)&&!Array.isArray(value)){return false}if(attr===`xu-class`){if(typeof value!==`string`&&typeof value!==`object`){return false}}if(attr===`xu-store`){if(typeof value!==`string`&&typeof value!==`object`){return false}}if([`xu-text`,`xu-html`,`xu-content`,`xu-ref`].includes(attr)&&typeof value!==`string`){return false}if(attr.startsWith(`xu-exp:`)&&typeof value!==`string`){return false}if([`xu-style`,`xu-style-global`,`xu-script`,`xu-cdn`,`xu-ui-plugin`,`xu-viewport`].includes(attr)&&typeof value!==`string`){return false}}return true},{message:`Invalid Xuda attribute configuration`}).describe(`HTML attributes and Xuda-specific directives for UI elements. Supported Xuda attributes with examples:
1
+ var app_obj,progs_obj,_,progs_str,hide_not_in_use_check,is_server,deployments,UglifyJS,JSON5,_conf,warn_plugin_check,z;const PROTECTED_VARS=["_NULL","_THIS","_FOR_KEY","_FOR_VAL","_ROWNO","_ROWID","_ROWDOC","_KEY","_VAL"];const ALL_MENU_TYPE=["globals","component","ai_agent","batch","get_data","set_data","alert","javascript","api","table","folder"];const program_ref_triggers_arr=["call_page","call_modal","call_popover","get_data","set_data","batch","call_native_javascript","call_evaluate_javascript","call_alert","alter_ui_element","create_ui_element","update","raise_event"];export const init=function(app_obj_in,progs_obj_in={},_in,_hide_not_in_use_check,is_server_in,deployments_in=[],UglifyJS_in,JSON5_in,_conf_in,_warn_plugin_check,_z){app_obj=app_obj_in;progs_obj=progs_obj_in;progs_str=JSON.stringify(progs_obj);hide_not_in_use_check=_hide_not_in_use_check;_=_in;is_server=is_server_in;deployments=deployments_in;UglifyJS=UglifyJS_in;JSON5=JSON5_in;_conf=_conf_in;warn_plugin_check=_warn_plugin_check;z=_z};export const check=function(doc){var ret=[];var dependency_progs=[];const addValidationError=(code,data,type="E",category="document",ref=null,id=null,not_in_use=false)=>{const error={code:code,data:data,type:type,category:category};if(ref)error.ref=ref;if(id)error.id=id;if(not_in_use)error.not_in_use=not_in_use;ret.push(error)};if(_.isEmpty(doc)){addValidationError("CHK_MSG_OBJ_GEN_110","doc in empty");return{check_errors:ret,check_warnings:[],doc:doc,dependency_progs:[]}}let critical_error=false;ret=check_structure(doc,critical_error);if(!critical_error){doc.studio_meta.not_in_use=false;if(doc.properties.menuType!=="folder"){if(doc.properties.menuType!=="table"){if(is_server){for(let val of deployments){if(val.deploy_data?.prog_id===doc._id){if(!doc.studio_meta.used_by_deployment_ids){doc.studio_meta.used_by_deployment_ids=[]}doc.studio_meta.used_by_deployment_ids.push(val._id)}}}if(!doc.studio_meta.used_by_deployment_id){const check_programs_are_active=function(arr){if(!arr.length)return false;var count=0;for(let val of arr){if(progs_obj?.[val.prog_id]?.studio_meta?.not_in_use){count++;break}}return count!==arr.length};if(!hide_not_in_use_check){const ret_prog_in_use=find_trigger_property_value_in_progs(doc,program_ref_triggers_arr,"prog",doc._id);if(!ret_prog_in_use||!check_programs_are_active(ret_prog_in_use)){const ret_panel_prog_in_use=find_panel_prog_in_progs(doc,doc._id);if(!ret_panel_prog_in_use||!check_programs_are_active(ret_panel_prog_in_use)){const ret_fieldValue_in_use=find_prog_in_fieldset_fieldValue_progs(doc,doc._id);if(!ret_fieldValue_in_use||!check_programs_are_active(ret_fieldValue_in_use)){doc.studio_meta.not_in_use=true}}}}}ret=[...ret,...check_prog_events(doc)];dependency_progs=find_trigger_property_value_in_progs(doc,program_ref_triggers_arr,"prog",null,true)||[];dependency_progs=[...dependency_progs,...find_panel_prog_in_progs(doc,null,true)||[]]}else{if(!hide_not_in_use_check){if(!find_table_in_progs(doc,doc._id)){doc.studio_meta.not_in_use=true}}}}switch(doc.properties.menuType){case"globals":ret=[...ret,...check_globals(doc)];break;case"table":ret=[...ret,...check_table(doc)];break;case"component":ret=[...ret,...check_component(doc)];break;case"javascript":ret=[...ret,...check_javascript(doc)];break;case"get_data":ret=[...ret,...check_get_data(doc)];break;case"set_data":ret=[...ret,...check_set_data(doc)];break;case"batch":ret=[...ret,...check_batch(doc)];break;case"api":ret=[...ret,...check_api(doc)];break;case"alert":ret=[...ret,...check_alert(doc)];break;case"route":ret=[...ret,...check_route(doc)];break;case"ai_agent":ret=[...ret,...check_ai_agent(doc)];break;case"folder":break;default:addValidationError("CHK_MSG_GEN_050",`invalid ${doc.properties.menuType} properties.menuType`,"E","prog",doc._id,doc._id);break}}var final_ret={check_errors:[],check_warnings:[],doc:doc,dependency_progs:dependency_progs};for(let[key,val]of Object.entries(ret)){if(val.type==="E"){final_ret.check_errors.push(val)}if(val.type==="W"){final_ret.check_warnings.push(val)}}return final_ret};export const check_structure=function(doc,critical_error){var ret=[];const addValidationError=(code,data)=>{ret.push({code:code,data:data,type:"E",category:"document",structure_error:true})};if(typeof app_obj!=="undefined"&&(!app_obj||!_.isObject(app_obj)||_.isEmpty(app_obj))){addValidationError("CHK_MSG_OBJ_GEN_002","invalid app_obj");critical_error=true;return ret}if(!doc||!_.isObject(doc)||_.isEmpty(doc)){addValidationError("CHK_MSG_OBJ_GEN_004","doc is not a object");critical_error=true;return ret}try{JSON5.parse(JSON.stringify(doc))}catch(err){addValidationError("CHK_MSG_OBJ_GEN_005","error parsing JSON doc");critical_error=true;return ret}if(!doc?.properties){critical_error=true;const msg=`doc.property object is undefined`;addValidationError("CHK_MSG_OBJ_GEN_000",msg);return ret}if(!doc?.studio_meta){critical_error=true;const msg=`doc.studio_meta object is undefined`;addValidationError("CHK_MSG_OBJ_GEN_000",msg);return ret}if(!doc?.properties?.menuType){critical_error=true;const msg=`doc.property.menuType is mandatory`;addValidationError("CHK_MSG_OBJ_GEN_000",msg);return ret}if(!doc?.properties?.menuName){critical_error=true;const msg=`doc.property.menuName is mandatory`;addValidationError("CHK_MSG_OBJ_GEN_000",msg);return ret}if(z){const schema=get_zod_schema(doc.properties.menuType);const result=schema.safeParse(doc);if(!result.success){result.error.errors.forEach(error=>{const msg=`${error.message}: ${error.path}(${error.expected})`;addValidationError("CHK_MSG_OBJ_GEN_000",msg)});critical_error=true;return ret}}if(!doc._id){addValidationError("CHK_MSG_OBJ_GEN_050","missing _id value")}if(doc?.studio_meta?.source==="studio ai"&&doc?.properties?.menuType&&doc._id&&doc._id.substr(0,7)!==new_node_id(doc.properties.menuType,doc.app_id).substr(0,7)){addValidationError("CHK_MSG_OBJ_GEN_051","invalid _id value (e.g: 5b1_tbl_a953848a71c5)")}if(!doc._rev){if(progs_obj?.[doc._id]){addValidationError("CHK_MSG_OBJ_GEN_052","duplicate doc _id")}}if(!doc.properties){addValidationError("CHK_MSG_OBJ_GEN_100","missing properties object")}else{if(!_.isObject(doc.properties)){addValidationError("CHK_MSG_OBJ_GEN_102","invalid properties object")}else{if(!doc.properties.menuType){addValidationError("CHK_MSG_OBJ_GEN_104","missing properties.menuType")}else if(!ALL_MENU_TYPE.includes(doc.properties.menuType)){addValidationError("CHK_MSG_OBJ_GEN_105",`invalid properties.menuType (valid values: ${ALL_MENU_TYPE.join(",")})`)}if(!doc.properties.menuName){addValidationError("CHK_MSG_OBJ_GEN_106","missing properties.menuName")}}}if(!doc.studio_meta){addValidationError("CHK_MSG_OBJ_GEN_112","missing studio_meta property")}else{if(!_.isObject(doc.studio_meta)){addValidationError("CHK_MSG_OBJ_GEN_112","invalid studio_meta object")}else{if(!doc.studio_meta.parentId){addValidationError("CHK_MSG_OBJ_GEN_114","missing studio_meta.parentId value")}else{let menuType=doc?.properties?.menuType==="globals"?"globals":doc?.properties?.menuType==="table"?"database":doc?.properties?.menuType==="route"?"routes":doc?.properties?.menuType==="ai_agent"?"ai_agents":"programs";if(doc.studio_meta.parentId!==menuType&&!progs_obj[doc.studio_meta.parentId]){addValidationError("CHK_MSG_OBJ_GEN_116","invalid studio_meta.parentId value")}}}}const check_progFields=function(){if(!doc.progFields)return;var ids=[];if(!_.isArray(doc.progFields)){addValidationError("CHK_MSG_OBJ_GEN_402","invalid progFields Array property");return}const validTypes=["virtual","table","expression","datasource"];const validFieldTypes=["string","number","boolean","array","object"];for(let val of doc.progFields){if(!_.isObject(val)){addValidationError("CHK_MSG_OBJ_GEN_404",`Invalid progFields object `);continue}if(!val.id){addValidationError("CHK_MSG_OBJ_GEN_406","Missing progFields ID property")}const fieldId=val.id?`(${val.id})`:"";if(val.id){if(ids.includes(val.id)){addValidationError("CHK_MSG_OBJ_GEN_408",`Duplicate progFields ID (${val.id})`);continue}ids.push(val.id)}if(!_.isObject(val.data)){addValidationError("CHK_MSG_OBJ_GEN_410",`Invalid progFields data object ${fieldId}`)}else{if(!val.data.field_id){addValidationError("CHK_MSG_OBJ_GEN_412",`Missing progFields field_id property ${fieldId}`)}if(!val.data.type){addValidationError("CHK_MSG_OBJ_GEN_414",`Missing progFields type property ${fieldId}`)}else if(!validTypes.includes(val.data.type)){addValidationError("CHK_MSG_OBJ_GEN_415",`Invalid progFields type "${val.data.type}" ${fieldId}. Must be one of: ${validTypes.join(", ")}`)}}if(!_.isObject(val.props)){addValidationError("CHK_MSG_OBJ_GEN_416",`Invalid progFields props object ${fieldId}`)}else{if(!val.props.fieldType){addValidationError("CHK_MSG_OBJ_GEN_418",`Missing progFields fieldType property ${fieldId}`)}else if(!validFieldTypes.includes(val.props.fieldType)){addValidationError("CHK_MSG_OBJ_GEN_419",`Invalid progFields fieldType "${val.props.fieldType}" ${fieldId}. Must be one of: ${validFieldTypes.join(", ")}`)}if(!_.isObject(val.props.propExpressions)){addValidationError("CHK_MSG_OBJ_GEN_4120",`Invalid progFields propExpressions object ${fieldId}`)}else{const allowedProps=["fieldValue","fieldType"];const actualProps=Object.keys(val.props.propExpressions);const invalidProps=actualProps.filter(prop=>!allowedProps.includes(prop));if(invalidProps.length>0){addValidationError("CHK_MSG_OBJ_GEN_4121",`Invalid propExpressions properties: ${invalidProps.join(", ")} ${fieldId}. Only allowed: ${allowedProps.join(", ")}`)}}}check_workflow(val.workflow)}};const check_progEvents=function(){if(!doc.progEvents)return;var ids=[];if(!_.isArray(doc.progEvents)){addValidationError("CHK_MSG_OBJ_GEN_502","invalid progEvents Array property");return}for(let val of doc.progEvents){if(!_.isObject(val)){addValidationError("CHK_MSG_OBJ_GEN_504","invalid progEvents object property");continue}if(!val.id){addValidationError("CHK_MSG_OBJ_GEN_506","missing progEvents.id property");continue}if(ids.includes(val.id)){addValidationError("CHK_MSG_OBJ_GEN_508",`${val.id} id must be unique in progEvents property`);continue}ids.push(val.id);if(!_.isObject(val.data)){addValidationError("CHK_MSG_OBJ_GEN_510","invalid progEvents.data object property");continue}if(typeof val.data.condition==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_512","undefined progEvents.data.condition string property")}if(typeof val.data.event_name==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_514","undefined progEvents.data.event_name string property")}if(typeof val.data.properties==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_516","undefined progEvents.data.properties string property")}if(typeof val.data.type==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_518","undefined progEvents.data.type string property")}if(!_.isArray(val.data.parameters)){addValidationError("CHK_MSG_OBJ_GEN_522","invalid progEvents.data.parameters Array property")}if(!_.isObject(val.props)){addValidationError("CHK_MSG_OBJ_GEN_522","invalid progEvents.props Object property")}check_workflow(val.workflow)}};const check_workflow=function(workflow){if(!workflow)return;var ids=[];if(!_.isArray(workflow)){addValidationError("CHK_MSG_OBJ_GEN_850","invalid workflow Array property");return}for(let val of workflow){if(!_.isObject(val)){addValidationError("CHK_MSG_OBJ_GEN_852","invalid workflow item object property");continue}if(!val.id){addValidationError("CHK_MSG_OBJ_GEN_854","missing workflow.id property");continue}if(ids.includes(val.id)){addValidationError("CHK_MSG_OBJ_GEN_856",`${val.id} id must be unique in workflow property`);continue}ids.push(val.id);if(!_.isObject(val.data)){addValidationError("CHK_MSG_OBJ_GEN_858","invalid workflow.data Object property")}if(!_.isObject(val.props)){addValidationError("CHK_MSG_OBJ_GEN_860","invalid workflow.props item object property")}}};const check_progDataSource=function(){if(!doc.progDataSource)return;if(!_.isObject(doc.progDataSource)){addValidationError("CHK_MSG_OBJ_GEN_602","invalid progDataSource Object property");return}if(typeof doc.progDataSource.dataSourceType==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_604","undefined progDataSource.dataSourceType string property")}};const check_progUi=function(){if(!doc.progUi)return;if(!_.isArray(doc.progUi)){addValidationError("CHK_MSG_OBJ_GEN_702","invalid progUi Array property");return}var ids=[];const run_tree=function(node){for(let item of node){if(!_.isObject(item)){addValidationError("CHK_MSG_OBJ_GEN_704","invalid progUi item Object property");continue}if(!item.id&&item?.type!=="comment"){addValidationError("CHK_MSG_OBJ_GEN_712","missing progUi id item property")}if(item?.id){if(item?.type==="comment"){addValidationError("CHK_MSG_OBJ_GEN_705",`Comment type is not supported in progUi (${item.id})`);continue}if(item?.type==="text"){addValidationError("CHK_MSG_OBJ_GEN_706",`Text type is not supported in progUi (${item.id}). Convert to "element" type and add a "text" property instead`);continue}if(item?.attributes&&!_.isObject(item.attributes)){addValidationError("CHK_MSG_OBJ_GEN_707",`Invalid progUi attributes object property (${item.id})`)}if(typeof item.type==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_708",`Missing progUi type property (${item.id})`)}if(typeof item.tagName==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_710",`Missing progUi tagName property (${item.id})`)}if(item.id!=="root"&&doc?.studio_meta?.source==="studio ai"&&!detectCryptoString(item.id.replace("node-","").replace("ui-","")).uuid){addValidationError("CHK_MSG_OBJ_GEN_713",`ProgUi item ID must be in UUID format (${item.id})`)}if(ids.includes(item.id)){addValidationError("CHK_MSG_OBJ_GEN_714",`Duplicate progUi item ID found (${item.id})`);continue}ids.push(item.id)}check_workflow(item.workflow);if(item.children){run_tree(item.children)}}};run_tree(doc.progUi)};if(doc.properties&&doc.properties.menuType){switch(doc.properties.menuType){case"table":if(!doc.tableFields){addValidationError("CHK_MSG_OBJ_GEN_200","missing tableFields property")}else{if(!_.isArray(doc.tableFields)){addValidationError("CHK_MSG_OBJ_GEN_202","invalid tableFields Array property")}else{var ids=[];for(let val of doc.tableFields){if(!_.isObject(val)){addValidationError("CHK_MSG_OBJ_GEN_204","invalid tableFields object property");continue}if(!val.id){addValidationError("CHK_MSG_OBJ_GEN_206","missing tableFields.id property");continue}if(ids.includes(val.id)){addValidationError("CHK_MSG_OBJ_GEN_208",`${val.id} id must be unique in tableFields property`);continue}ids.push(val.id);if(!_.isObject(val.data)){addValidationError("CHK_MSG_OBJ_GEN_210","invalid tableFields.data object property");continue}if(!val.data.field_id){addValidationError("CHK_MSG_OBJ_GEN_212","invalid tableFields.data.field_id property")}if(!_.isObject(val.props)){addValidationError("CHK_MSG_OBJ_GEN_214","invalid tableFields.props object property");continue}if(!val.props.fieldType){addValidationError("CHK_MSG_OBJ_GEN_216","invalid tableFields.props.fieldType property")}}}}if(!doc.tableIndexes){addValidationError("CHK_MSG_OBJ_GEN_302","missing tableIndexes property")}else if(!_.isArray(doc.tableIndexes)){addValidationError("CHK_MSG_OBJ_GEN_302","invalid tableIndexes Array property")}else{var index_ids=[];for(let val of doc.tableIndexes){if(!_.isObject(val)){addValidationError("CHK_MSG_OBJ_GEN_304","invalid tableIndexes object property");continue}if(!val.id){addValidationError("CHK_MSG_OBJ_GEN_306","missing tableIndexes.id property");continue}if(index_ids.includes(val.id)){addValidationError("CHK_MSG_OBJ_GEN_308",`${val.id} id must be unique in tableIndexes property`);continue}index_ids.push(val.id);if(!_.isObject(val.data)){addValidationError("CHK_MSG_OBJ_GEN_310","invalid tableIndexes.data object property");continue}if(!val.data.name){addValidationError("CHK_MSG_OBJ_GEN_312","invalid tableIndexes.data.name property")}if(!_.isArray(val.data.keys)){addValidationError("CHK_MSG_OBJ_GEN_312","invalid tableIndexes.data.keys Array property")}}}break;case"globals":check_progFields();check_progEvents();break;case"get_data":case"set_data":case"batch":case"api":check_progFields();check_progEvents();check_progDataSource();break;case"component":check_progFields();check_progEvents();check_progDataSource();check_progUi();if(doc.properties&&typeof doc.properties.uiFramework==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_120","undefined properties.uiFramework string property")}if(doc.properties&&typeof doc.properties.renderType==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_122","undefined properties.renderType string property")}break;case"alert":break;case"javascript":break;case"folder":break;default:break}}return ret};const check_table=function(doc){var ret=[];if(!doc.properties.databaseSocket){ret.push({code:"CHK_MSG_TBL_GEN_010",data:"database socket not defined",type:doc.studio_meta.not_in_use?"W":"E",category:`table`,ref:doc._id,id:doc._id})}else{if(!app_obj?.app_plugins_purchased?.[doc.properties.databaseSocket]){ret.push({code:"CHK_MSG_TBL_GEN_0020",data:`invalid ${doc.properties.databaseSocket} database socket`,type:doc.studio_meta.not_in_use||warn_plugin_check?"W":"E",category:`table`,ref:doc._id,id:doc._id})}else{if(!app_obj.app_plugins_purchased[doc.properties.databaseSocket].installed){ret.push({code:"CHK_MSG_TBL_GEN_030",data:`${doc.properties.databaseSocket} database socket not installed`,type:doc.studio_meta.not_in_use?"W":"E",category:`table`,ref:doc._id,id:doc._id})}}}if(doc.tableIndexes?.length&&!doc?.tableFields?.length){ret.push({code:"CHK_MSG_TBL_FLD_090",data:`table has no fields`,type:doc.studio_meta.not_in_use?"W":"E",category:`table`,ref:doc._id,id:doc._id})}var name_counts_obj={};for(let field of doc.tableFields){if(!field?.data?.field_id){ret.push({code:"CHK_MSG_TBL_FLD_100",data:`missing field_id`,type:doc.studio_meta.not_in_use?"W":"E",category:`table`,ref:field.id,id:`${doc._id}-${field.id}`})}else{if(!/^[A-Za-z]+[\w\-\:\.]*$/.test(field.data.field_id)){ret.push({code:"CHK_MSG_TBL_FLD_020",data:`invalid field_id`,type:doc.studio_meta.not_in_use?"W":"E",category:`table`,ref:field.id,id:`${doc._id}-${field.id}`})}if(!name_counts_obj[field.data.field_id]){name_counts_obj[field.data.field_id]=1}else{name_counts_obj[field.data.field_id]++}if(!hide_not_in_use_check){if(!find_field_in_progs(doc,field.data.field_id)){ret.push({code:"CHK_MSG_TBL_FLD_022",data:`table field "${field.data.field_id}" not in use`,type:"W",category:`table`,ref:doc._id,not_in_use:true,id:`${doc._id}-${field.id}`})}}}}for(let[key,val]of Object.entries(name_counts_obj)){if(val>1){ret.push({code:"CHK_MSG_TBL_FLD_200",data:`duplicate field id for ${key}`,type:doc.studio_meta.not_in_use?"W":"E",id:`${doc._id}-${key}`})}}if(!doc.tableIndexes?.length){if(doc.properties.databaseSocket!=="@xuda.io/xuda-dbs-plugin-xuda"){ret.push({code:"CHK_MSG_TBL_IDX_040",data:`at least one index has to be defined`,type:doc.studio_meta.not_in_use?"W":"E",id:`${doc._id}`})}}else{let found_unique;for(let index of doc.tableIndexes){if(index?.data?.unique){found_unique=true}if(!index?.data?.name){ret.push({code:"CHK_MSG_TBL_IDX_060",data:`tableIndexes.data.name cannot be empty in "${index.id}" index`,type:doc.studio_meta.not_in_use?"W":"E",id:`${doc._id}`})}if(!index?.data?.keys?.length){ret.push({code:"CHK_MSG_TBL_IDX_070",data:`tableIndexes.data.keys cannot be empty in "${index.id}" index`,type:doc.studio_meta.not_in_use?"W":"E",id:`${doc._id}-${index.id}`})}else{for(let key of index.data.keys){if(!doc.tableFields||!_.isArray(doc.tableFields)||!find_item_by_key(doc.tableFields,"field_id",key)){ret.push({code:"CHK_MSG_TBL_IDX_080",data:`invalid key ${key} in tableIndexes.data.keys for "${index.id}" index`,type:doc.studio_meta.not_in_use?"W":"E",id:`${doc._id}-${index.id}-${key}`})}}}}}if(!doc?.tableFields?.length){ret.push({code:"CHK_MSG_TBL_FLD_012",data:`table has no fields`,type:"W",id:`${doc._id}`})}for(let field of doc.tableFields){if(!["string","number","boolean","object","array","date"].includes(field?.props?.fieldType)){ret.push({code:"CHK_MSG_TBL_FLD_022",data:`invalid fieldType for field ${field?.data?.field_id}`,type:"E",id:`${doc._id}-${field.id}`})}}return ret};const check_globals=function(doc){var ret=[];ret=[...ret,...check_prog_fieldset(doc)];return ret};const check_component=function(doc){var ret=[];if(!doc.properties.uiFramework){ret.push({code:"CHK_MSG_PRG_COM_010",data:"component Ui Framework not defined",type:doc.studio_meta.not_in_use?"W":"E",category:`component`,ref:doc._id,id:`${doc._id}`})}else{if(typeof app_obj!=="undefined"){if(!app_obj?.app_plugins_purchased?.[doc.properties.uiFramework]){ret.push({code:"CHK_MSG_PRG_COM_020",data:`invalid ${doc.properties.uiFramework} Ui Framework`,type:doc.studio_meta.not_in_use?"W":"E",category:`component`,ref:doc._id,id:`${doc._id}`})}else{if(!app_obj.app_plugins_purchased[doc.properties.uiFramework].installed){ret.push({code:"CHK_MSG_PRG_COM_030",data:`${doc.properties.uiFramework} Ui Framework not installed`,type:doc.studio_meta.not_in_use?"W":"E",category:`component`,ref:doc._id,id:`${doc._id}`})}}}}ret=[...ret,...check_prog_fieldset(doc)];ret=[...ret,...check_prog_parameters(doc)];ret=[...ret,...check_prog_datasource(doc)];if(doc.progUi){var xu_tree_id_counts_obj={};const run_tree=function(node){for(let item of node){if(item.xu_tree_id){if(!xu_tree_id_counts_obj[item.xu_tree_id]){xu_tree_id_counts_obj[item.xu_tree_id]=1}else{xu_tree_id_counts_obj[item.xu_tree_id]++}}if(item.attributes){var name_counts_obj={};for(let[key,val]of Object.entries(item.attributes)){if(!key){ret.push({code:"CHK_MSG_PRG_GUI_010",data:`missing attribute in tree_id ${item.id}`,type:doc.studio_meta.not_in_use?"W":"E",category:`component_ui`,ref:item.id,id:`${doc._id}-${item.id}-${key}`})}else{if(key.substr(0,6)==="xu-exp"){ret=[...ret,...check_prog_expression(doc,val,item.id,"ui_attribute")]}else{if(!/^[A-Za-z]+[\w\-\:\.]*$/.test(key)){ret.push({code:"CHK_MSG_PRG_GUI_020",data:`invalid attribute "${key}" in tag "${item.tagName}" "${item.id}"`,type:doc.studio_meta.not_in_use?"W":"E",category:`component_ui`,ref:item.id,id:`${doc._id}-${item.id}-${key}`})}}if(key.substr(0,6)==="xu-on:"){if(!_.isEmpty(val)){for(let trigger_item of val){ret=[...ret,...check_prog_triggers(doc,trigger_item.workflow,"ui_trigger",item.id,item.attributes.tree_id)]}}}if(!name_counts_obj[key]){name_counts_obj[key]=1}else{name_counts_obj[key]++}}}for(let[key,val]of Object.entries(name_counts_obj)){if(val>1){ret.push({code:"CHK_MSG_PRG_GUI_200",data:`duplicate attribute id for ${key} in tree_id ${item.attribute.tree_id}`,type:doc.studio_meta.not_in_use?"W":"E",category:`component_ui`,ref:doc._id,id:`${doc._id}-${item.id}-${key}`})}}}if(item.children){run_tree(item.children)}}};run_tree(doc.progUi);for(let[key,val]of Object.entries(xu_tree_id_counts_obj)){if(val>1){ret.push({code:"CHK_MSG_PRG_GUI_250",data:`duplicate tree_id "${key}"`,type:"W",category:`component_ui`,ref:doc._id,id:`${doc._id}-${key}`})}}}return ret};const check_get_data=function(doc){var ret=[];ret=[...ret,...check_prog_fieldset(doc)];ret=[...ret,...check_prog_parameters(doc)];ret=[...ret,...check_prog_datasource(doc)];return ret};const check_batch=function(doc){var ret=[];ret=[...ret,...check_prog_fieldset(doc)];ret=[...ret,...check_prog_parameters(doc)];ret=[...ret,...check_prog_datasource(doc)];return ret};const check_api=function(doc){var ret=[];ret=[...ret,...check_prog_fieldset(doc)];ret=[...ret,...check_prog_parameters(doc)];ret=[...ret,...check_prog_datasource(doc)];return ret};const check_set_data=function(doc){var ret=[];ret=[...ret,...check_prog_fieldset(doc)];ret=[...ret,...check_prog_parameters(doc)];ret=[...ret,...check_prog_datasource(doc)];return ret};const check_alert=function(doc){var ret=[];if(_.isEmpty(doc.alertData)){ret.push({code:"CHK_MSG_PRG_ART_010",data:`no alert properties defined`,type:doc.studio_meta.not_in_use?"W":"E",category:`alert`,ref:doc._id,id:`${doc._id}`})}else{if(!doc.alertData.alertType){ret.push({code:"CHK_MSG_PRG_ART_020",data:`missing alert type property`,type:doc.studio_meta.not_in_use?"W":"E",category:`alert`,ref:doc._id,id:`${doc._id}`})}if(!doc.alertData.alertDisplay){ret.push({code:"CHK_MSG_PRG_ART_030",data:`missing alert display property`,type:doc.studio_meta.not_in_use?"W":"E",category:`alert`,ref:doc._id,id:`${doc._id}`})}if(!doc.alertData.alertTitle&&!doc.alertData.alertTitleFx&&!doc.alertData.alertBody&&!doc.alertData.alertBodyFx){ret.push({code:"CHK_MSG_PRG_ART_032",data:`missing alert title and body value`,type:"W",category:`alert`,ref:doc._id,id:`${doc._id}`})}}return ret};const check_route=function(doc){var ret=[];if(_.isEmpty(doc?.routeMenu?.menu)){ret.push({code:"CHK_MSG_RTE_MNU_010",data:`no route properties defined`,type:doc.studio_meta.not_in_use?"W":"E",category:`alert`,ref:doc._id,id:`${doc._id}`})}else{function checkMenuItems(menu){let flatMenu={};function recurse(items){for(let item of items){if(!item.prog_id){ret.push({code:"CHK_MSG_RTE_MNU_020",data:`no program to call has been defined`,type:doc.studio_meta.not_in_use?"W":"E",category:`alert`,ref:item.id,id:`${doc._id}`});continue}if(!progs_obj?.[item.prog_id]){ret.push({code:"CHK_MSG_RTE_MNU_030",data:`program ${item.prog_id} not exist`,type:doc.studio_meta.not_in_use?"W":"E",category:`alert`,ref:item.id,id:`${doc._id}`});continue}if(item.children&&item.children.length>0){recurse(item.children)}}}recurse(menu);return flatMenu}checkMenuItems(doc.routeMenu.menu)}return ret};const check_ai_agent=function(doc){var ret=[];if(!doc?.agentConfig){ret.push({code:"CHK_MSG_PRG_AGN_010",data:"Ai Agent agentConfig not defined",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}if(!doc?.agentConfig?.agent_instructions){ret.push({code:"CHK_MSG_PRG_AGN_020",data:"Ai Agent instructions is required",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}if(doc?.agentConfig?.agent_instructions?.length<10){ret.push({code:"CHK_MSG_PRG_AGN_030",data:"Ai Agent instructions is too short",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}if(!doc?.agentConfig?.agent_instructions?.agent_tools?.length&&doc?.agentConfig?.use_tools_only){ret.push({code:"CHK_MSG_PRG_AGN_040",data:"Ai Agent use_tools_only set to true but could not find agent_tools configuration",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}for(const tool of doc?.agentConfig?.agent_tools||[]){switch(tool.type){case"file_search":{if(_.isEmpty(tool.file)){ret.push({code:"CHK_MSG_PRG_AGN_100",data:"Ai Agent file_search set but could not find file configuration",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}else{if(_.isEmpty(tool?.file?.access_link)){ret.push({code:"CHK_MSG_PRG_AGN_110",data:"Ai Agent file_search set but could not find file configuration",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}else{if(_.isEmpty(tool?.file?.file_id)){ret.push({code:"CHK_MSG_PRG_AGN_120",data:"Ai Agent file_search set but could not find file uploaded",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}else{if(_.isEmpty(tool?.file?.vector_file_id)){ret.push({code:"CHK_MSG_PRG_AGN_130",data:"Ai Agent file_search set but could not find vector_file uploaded",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}}}}break}case"youtube":{if(_.isEmpty(tool?.youtube?.url)){ret.push({code:"CHK_MSG_PRG_AGN_200",data:"Ai Agent youtube set but could not find url",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}else{if(_.isEmpty(tool?.youtube?.file_id)){ret.push({code:"CHK_MSG_PRG_AGN_210",data:"Ai Agent youtube set but could not find file uploaded",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}else{if(_.isEmpty(tool?.youtube?.vector_store_id)){ret.push({code:"CHK_MSG_PRG_AGN_220",data:"Ai Agent youtube set but could not find vector_file uploaded",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}}}break}case"mcp":{if(_.isEmpty(tool?.url)){ret.push({code:"CHK_MSG_PRG_AGN_310",data:"Ai Agent mcp tool set but could not find url",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}else{if(tool?.url.substr(0,7)!=="https://"){ret.push({code:"CHK_MSG_PRG_AGN_320",data:"Ai Agent mcp tool set but found invalid url",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}}break}case"cpi":{break}case"table":{if(_.isEmpty(tool?.prog_id)){ret.push({code:"CHK_MSG_PRG_AGN_410",data:"Ai Agent table tool set but could not find table id",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}break}case"ai_agent":{break}case"plugin":{if(_.isEmpty(tool?.plugin_id)){ret.push({code:"CHK_MSG_PRG_AGN_510",data:"Ai Agent plugin tool set but could not find plugin id",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}else{if(_.isEmpty(tool?.method)){ret.push({code:"CHK_MSG_PRG_AGN_520",data:"Ai Agent plugin tool set but could not find method property",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}}break}case"program":{if(_.isEmpty(tool?.prog_id)){ret.push({code:"CHK_MSG_PRG_AGN_410",data:"Ai Agent program tool set but could not find program id",type:doc.studio_meta.not_in_use?"W":"E",category:`ai_agent`,ref:doc._id,id:`${doc._id}`})}break}default:break}}return ret};const check_prog_fieldset=function(doc){var ret=[];if(!doc.progFields||_.isEmpty(doc.progFields)){if(doc.progDataSource.dataSourceTableId){ret.push({code:"CHK_MSG_PRG_FLD_012",data:`datasource table defined but fieldset is empty`,type:"W",category:"fieldset",id:`${doc._id}`})}}else{var name_counts_obj={};for(let field of doc.progFields){if(!field?.data?.field_id){ret.push({code:"CHK_MSG_PRG_FLD_010",data:`missing field_id`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`})}else{if(!/^[A-Za-z]+[\w\-\:\.]*$/.test(field.data.field_id)&&!PROTECTED_VARS.includes(field.data.field_id)){ret.push({code:"CHK_MSG_PRG_FLD_020",data:`invalid ${field.data.field_id} field_id`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`})}if(!name_counts_obj[field.data.field_id]){name_counts_obj[field.data.field_id]=1}else{name_counts_obj[field.data.field_id]++}if(!hide_not_in_use_check){if(!find_field_in_progs(doc,field.data.field_id)){var found_parameter_out_match;if(!_.isEmpty(doc.properties.progParams)){for(let parameter_item of doc.properties.progParams){if(parameter_item.data.dir==="out"&&parameter_item.data.parameter===field.data.field_id){found_parameter_out_match=true;break}}}if(!found_parameter_out_match){ret.push({code:"CHK_MSG_PRG_FLD_022",data:`field "${field.data.field_id}" not in use`,type:"W",category:"fieldset",ref:field.id,not_in_use:true,id:`${doc._id}-${field.id}`})}}}}if(!field?.data?.type){ret.push({code:"CHK_MSG_PRG_FLD_030",data:`missing field type`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`});continue}else{switch(field.data.type){case"virtual":break;case"exp":if(!field?.props?.fieldValue||!field?.props?.propExpressions?.fieldValue){ret.push({code:"CHK_MSG_PRG_FLD_070",data:`invalid value or value expression for ${field.data.field_id} field type Exp`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`})}break;case"table":if(doc.properties.menuType==="globals"){ret.push({code:"CHK_MSG_PRG_FLD_040",data:`invalid field type for ${field.data.field_id} in globals`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`})}else{if(!doc.progDataSource||_.isEmpty(doc.progDataSource)||!doc.progDataSource.dataSourceType||doc.progDataSource.dataSourceType==="none"){ret.push({code:"CHK_MSG_PRG_FLD_300",data:`undefined datasource for ${field.data.field_id} field`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`});continue}else{var ret_dsc=check_prog_datasource(doc);if(ret_dsc.length)return ret;var _datasource_table_arr=progs_obj?.[doc.progDataSource.dataSourceTableId]?.tableFields;if(!_datasource_table_arr){ret.push({code:"CHK_MSG_PRG_FLD_310",data:`no fields found in datasource table ${doc.progDataSource.dataSourceTableId} `,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`});continue}if(!find_item_by_key(_datasource_table_arr,"field_id",field.data.field_id)){if(!doc.progDataSource.dataSourceReduce||field.data.field_id!=="REDUCE_VALUE"){ret.push({code:"CHK_MSG_PRG_FLD_320",data:`invalid field ${field.data.field_id} in datasource table`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`});continue}}}}break;default:ret.push({code:"CHK_MSG_PRG_FLD_060",data:`invalid field type for ${field.data.field_id}`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`});return ret;break}}if(!field?.props?.fieldType&&!field?.props?.propExpressions?.fieldType){ret.push({code:"CHK_MSG_PRG_FLD_130",data:`missing field fieldType`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`});return ret}else if(field.props.fieldType){switch(field.props.fieldType){case"string":if(field?.props?.fieldValue&&typeof field.props.fieldValue!=="string"){ret.push({code:"CHK_MSG_PRG_FLD_200",data:`invalid value type ${field.props.fieldType} for ${field.data.field_id} field`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`})}break;case"number":case"boolean":if(field?.props?.fieldValue){if(_.isNaN(_.toNumber(field?.props?.fieldValue))){ret.push({code:"CHK_MSG_PRG_FLD_210",data:`invalid value type ${field.props.fieldType} for ${field.data.field_id} field`,type:"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`})}}break;case"object":case"array":if(field?.props?.fieldValue){try{JSON5.parse(field.props.fieldValue)}catch(err){ret.push({code:"CHK_MSG_PRG_FLD_220",data:`invalid value type "${field.props.fieldType}" for "${field.data.field_id}" field`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`})}}break;default:ret.push({code:"CHK_MSG_PRG_FLD_160",data:`invalid field fieldType for ${field.data.field_id}`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",ref:field.id,id:`${doc._id}-${field.id}`});break}}if(!_.isEmpty(field.workflow)){ret=[...ret,...check_prog_triggers(doc,field.workflow,"field",field.id,field.data.field_id)]}}for(let[key,val]of Object.entries(name_counts_obj)){if(val>1){ret.push({code:"CHK_MSG_PRG_FLD_200",data:`duplicate field id for ${key}`,type:doc.studio_meta.not_in_use?"W":"E",category:"fieldset",id:`${doc._id}-${key}`})}}}return ret};const check_prog_events=function(doc){var ret=[];if(!doc.progEvents||_.isEmpty(doc.progEvents))return ret;var name_counts_obj={};for(let event_item of doc.progEvents){switch(event_item?.data?.type){case"user_defined":if(!event_item.data.event_name){ret.push({code:"CHK_MSG_PRG_EVT_010",data:`missing event name for ${event_item.id}`,type:"W",category:"event",ref:event_item.id,id:`${doc._id}-${event_item.id}`});continue}else{if(!/^[A-Za-z]+[\w\-\:\.]*$/.test(event_item.data.event_name)){ret.push({code:"CHK_MSG_PRG_EVT_020",data:`invalid event name for event "${event_item.data.event_name||event_item.data.type}"`,type:doc.studio_meta.not_in_use?"W":"E",category:"event",ref:event_item.id,id:`${doc._id}-${event_item.id}`})}if(!hide_not_in_use_check){const ret_event_id_use=find_trigger_property_value_in_progs(doc,["raise_event"],"event",event_item.data.event_name);if(!ret_event_id_use?.length){ret.push({code:"CHK_MSG_PRG_EVT_112",data:`event "${event_item.data.event_name}" not in use`,type:"W",category:"event",ref:event_item.id,not_in_use:true,id:`${doc._id}-${event_item.id}`})}}}if(event_item.data.condition){ret=[...ret,...check_prog_expression(doc,event_item.data.condition,event_item.id,"condition")]}else{if(!name_counts_obj[event_item.id]){name_counts_obj[event_item.id]=1}else{name_counts_obj[event_item.id]++}}break;case"screen_ready":case"client_interval":if(doc.properties.menuType!=="component"){ret.push({code:"CHK_MSG_PRG_EVT_030",data:`event type "${event_item.data.type}" only allowed for "${doc.properties.menuType}" in event "${event_item.data.event_name||event_item.data.type}"`,type:doc.studio_meta.not_in_use?"W":"E",category:"event",ref:event_item.id,id:`${doc._id}-${event_item.id}`})}if(event_item.data.type==="client_interval"&&!event_item.data.properties){ret.push({code:"CHK_MSG_PRG_EVT_035",data:`empty interval property in event "${event_item.data.event_name||event_item.data.type}"`,type:doc.studio_meta.not_in_use?"W":"E",category:"event",ref:event_item.id,id:`${doc._id}-${event_item.id}`})}break;case"on_load":case"on_exit":case"before_record":case"after_record":case"record_not_found":case"locate_not_found":break;default:ret.push({code:"CHK_MSG_PRG_EVT_018",data:`invalid event type for ${event_item.id}`,type:doc.studio_meta.not_in_use?"W":"E",category:"event",ref:event_item.id,id:`${doc._id}-${event_item.id}`});break}if(!_.isEmpty(event_item.workflow)){ret=[...ret,...check_prog_triggers(doc,event_item.workflow,"event",event_item.id,event_item.data.event_name||event_item.data.type)]}else{ret.push({code:"CHK_MSG_PRG_EVT_022",data:`event "${event_item.data.event_name||event_item.data.type}" is empty`,type:"W",category:"event",ref:event_item.id,id:`${doc._id}-${event_item.id}`})}}for(let[key,val]of Object.entries(name_counts_obj)){if(val>1){ret.push({code:"CHK_MSG_PRG_EVT_102",data:`duplicate "${key}" event `,type:"W",category:"event",id:`${doc._id}-${event_item.id}-${key}`})}}return ret};const check_prog_triggers=function(doc,workflow,source_type,source_id,source_name){var ret=[];if(!workflow||_.isEmpty(workflow))return ret;const check_target_program_parameters=function(trigger_item){if(!trigger_item.data.name.prog)return;const target_program_parameters_arr=progs_obj?.[trigger_item.data.name.prog]?.properties?.progParams||[];if(trigger_item?.data?.name?.parameters&&!_.isEmpty(trigger_item.data.name.parameters)){for(let[key,val]of Object.entries(trigger_item.data.name.parameters)){const param_ret=find_item_by_key(target_program_parameters_arr,"parameter",key);if(_.isEmpty(param_ret)){ret.push({code:"CHK_MSG_PRG_TRG_370",data:`parameter "${key}" not found in the target program "${progs_obj?.[trigger_item.data.name.prog].properties.menuName}" parameter list in ${source_type} "${source_name}" trigger`,type:"W",category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}-${key}`});continue}if(param_ret.data.dir!=="in"&&val.value){const ret_local_field=find_item_by_key(doc.progFields,"field_id",val.value);if(!ret_local_field){let ret_parent_field;const check_parent_program=function(prog_id){let parent_prog_id=progs_obj?.[prog_id]?.studio_meta?.parentId;if(parent_prog_id&&progs_obj?.[parent_prog_id]){ret_parent_field=find_item_by_key(progs_obj?.[parent_prog_id]?.progFields||[],"field_id",val.value);if(!ret_parent_field){return check_parent_program(parent_prog_id)}}};check_parent_program(doc._id);if(!ret_parent_field){const ret_global_field=find_item_by_key(progs_obj?.[`global_${app_obj._id}`]?.progFields||[],"field_id",val.value);if(!ret_global_field){ret.push({code:"CHK_MSG_PRG_TRG_372",data:`"${val.value}" parameter "Out" not found in the program Dataset in ${source_type} "${source_name}" trigger`,type:"W",category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}-${key}`})}}}}}}else{if(target_program_parameters_arr.length){ret.push({code:"CHK_MSG_PRG_TRG_374",data:`found parameters in "${progs_obj?.[trigger_item.data.name.prog].properties.menuName}" but empty parameter to exchange in ${source_type} "${source_name}" trigger`,type:"W",category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}};for(let trigger_item of workflow){const get_prog_id=function(){let _prop=trigger_item.data?.name?.properties;let _prog_id=trigger_item.data.name.prog_id||_prop?.["xu-exp:prog"];return _prog_id};const err_type=doc.studio_meta.not_in_use?"W":trigger_item.data.enabled?"E":"W";switch(trigger_item?.data?.action){case"comment":break;case"update":if(!trigger_item?.data?.name?.value){ret.push({code:"CHK_MSG_PRG_TRG_020",data:`no value to update in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{const validate_update_function=function(exp){var viewFields=[];try{var json=JSON5.parse(exp.replace(/\n/gi,""));for(const[key,val]of Object.entries(json)){let id=key.substr(1,key.length-1);viewFields.push({val:val,id:id})}return viewFields}catch(e){if(!exp){return}if(exp.substr(exp.length-1,1)===";")exp=exp.substr(0,exp.length-1);var exp_arr=exp.split(/;\s*(?=(?:[^"]|"[^"]*")*$)/g);if(exp_arr?.length){for(let val of exp_arr){var pos=val.indexOf(":");var seg=[val.substring(0,pos),val.substring(pos+1)];if(seg&&seg.length===2){let id=seg[0].substr(1,seg[0].length);viewFields.push({id:id,val:seg[1]})}else{ret.push({code:"CHK_MSG_PRG_TRG_040",data:`invalid json; too many segments in${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}}return viewFields}};const ret_update_fields_arr=validate_update_function(trigger_item.data.name.value);if(!ret_update_fields_arr.length){ret.push({code:"CHK_MSG_PRG_TRG_050",data:`no fields to update in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{for(let val of ret_update_fields_arr){const ret_fields=find_field_in_progs(doc,val.id);if(!ret_fields){ret.push({code:"CHK_MSG_PRG_TRG_060",data:`field "${val.id}" not found in the project programs for update in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}}}break;case"raise_event":if(!trigger_item?.data?.name?.event&&!trigger_item?.data?.name?.properties["xu-exp:event"]){ret.push({code:"CHK_MSG_PRG_TRG_100",data:`invalid event name for "${trigger_item.data.action}" in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else if(trigger_item?.data?.name?.event){if(!/^[A-Za-z]+[\w\-\:\.]*$/.test(trigger_item.data.name.event)){ret.push({code:"CHK_MSG_PRG_TRG_110",data:`invalid event name ${trigger_item.data.name.event} in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{const ret_event_name=find_event_id_in_progs(doc,trigger_item.data.name.event);if(!ret_event_name.length){ret.push({code:"CHK_MSG_PRG_TRG_120",data:`call performed to non exist event name called from "${trigger_item.data.name.event}" in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(ret_event_name.length===1&&!_.isEmpty(trigger_item.data.name.parameters)){for(let[key,val]of Object.entries(trigger_item.data.name.parameters)){if(_.isEmpty(progs_obj?.[ret_event_name[0].prog_id].progFields)){if(!find_item_by_key(progs_obj?.[ret_event_name[0].prog_id].progFields,"field_id",key)){ret.push({code:"CHK_MSG_PRG_TRG_130",data:`parameter "${key}" not exist in the dataset of the target program called from event name "${trigger_item.data.name.event}" in ${source_type} "${source_name}" trigger`,type:"W",category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}-${key}`})}}}}}}}break;case"call_page":case"call_modal":case"call_popover":if(!trigger_item.data.name.prog){if(!trigger_item.data?.name?.properties?.["xu-exp:prog"]){ret.push({code:"CHK_MSG_PRG_TRG_310",data:`empty program to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}else{if(!progs_obj?.[trigger_item.data.name.prog]){ret.push({code:"CHK_MSG_PRG_TRG_320",data:`invalid program to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(progs_obj?.[trigger_item.data.name.prog].properties.menuType!=="component"){ret.push({code:"CHK_MSG_PRG_TRG_334",data:`invalid program type "${trigger_item.data.action}" to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{check_target_program_parameters(trigger_item)}}}break;case"call_project_api":if(!trigger_item.data.name.prog){if(!trigger_item.data?.name?.properties?.["xu-exp:prog"]){ret.push({code:"CHK_MSG_PRG_TRG_310",data:`empty program to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}else{if(!progs_obj?.[trigger_item.data.name.prog]){ret.push({code:"CHK_MSG_PRG_TRG_320",data:`invalid program to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(progs_obj?.[trigger_item.data.name.prog].properties.menuType!=="api"){ret.push({code:"CHK_MSG_PRG_TRG_334",data:`invalid program type "${trigger_item.data.action}" to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{check_target_program_parameters(trigger_item)}}}break;case"call_system_api":{const _api_method=trigger_item.data.name.api_method;if(!_api_method){ret.push({code:"CHK_MSG_PRG_TRG_380",data:`api_method not defined in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(typeof _conf!=="undefined"){if(!_conf.cpi_methods[_api_method]){ret.push({code:"CHK_MSG_PRG_TRG_382",data:`api method ${_api_method} unrecognized in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(_conf.cpi_methods[_api_method].private){ret.push({code:"CHK_MSG_PRG_TRG_384",data:`api method ${_api_method} is private in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`});continue}if(_conf.cpi_methods[_api_method].fields){for(let[key,val]of Object.entries(_conf.cpi_methods[_api_method].fields)){if(val.mandatory&&!trigger_item.data.name?.payload?.[key]){ret.push({code:"CHK_MSG_PRG_TRG_386",data:`field ${key} for api method ${_api_method} is mandatory field in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}}}}}break}case"call_external_api":{if(!trigger_item.data.name.method){ret.push({code:"CHK_MSG_PRG_TRG_388",data:`method not defined in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}if(!trigger_item.data.name.url){ret.push({code:"CHK_MSG_PRG_TRG_389",data:`url not defined in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}break}case"get_data":case"set_data":case"batch":case"call_native_javascript":case"call_evaluate_javascript":case"call_alert":if(!trigger_item.data.name.prog){if(!trigger_item.data?.name?.properties?.["xu-exp:prog"]){ret.push({code:"CHK_MSG_PRG_TRG_310",data:`empty program to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}else{if(!progs_obj?.[trigger_item.data.name.prog]){ret.push({code:"CHK_MSG_PRG_TRG_320",data:`invalid program to call in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(progs_obj?.[trigger_item.data.name.prog].properties.menuType!==trigger_item.data.action){if(["call_native_javascript","call_evaluate_javascript"].includes(trigger_item.data.action)&&progs_obj?.[trigger_item.data.name.prog].properties.menuType==="javascript"){continue}if(["call_alert"].includes(trigger_item.data.action)&&progs_obj?.[trigger_item.data.name.prog].properties.menuType==="alert"){continue}ret.push({code:"CHK_MSG_PRG_TRG_330",data:`call set to "${trigger_item.data.action}" but found "${progs_obj?.[trigger_item.data.name.prog].properties.menuType}" instead in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{check_target_program_parameters(trigger_item)}}}break;case"execute_native_javascript":case"execute_evaluate_javascript":check_prog_expression(doc,trigger_item.data.name.value,trigger_item.id,"script");break;case"emit_event":if(!trigger_item?.data?.name?.value){ret.push({code:"CHK_MSG_PRG_TRG_800",data:`no event defined for "emit_event" in ${source_type} "${source_name}" trigger`,type:err_type,category:`alert`,ref:doc._id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(!/^[A-Za-z]+[\w\-\:\.]*$/.test(trigger_item.data.name.value)){ret.push({code:"CHK_MSG_PRG_TRG_810",data:`invalid event name ${trigger_item.data.name.value} in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}break;case"alert":if(_.isEmpty(trigger_item.data.name)){ret.push({code:"CHK_MSG_PRG_TRG_610",data:`no alert properties defined`,type:err_type,category:`alert`,ref:doc._id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(!trigger_item.data.name.alertType){ret.push({code:"CHK_MSG_PRG_TRG_612",data:`missing alert type property`,type:err_type,category:`alert`,ref:doc._id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}if(!trigger_item.data.name.alertDisplay){ret.push({code:"CHK_MSG_PRG_TRG_614",data:`missing alert display property`,type:err_type,category:`alert`,ref:doc._id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}if(!trigger_item.data.name.alertTitle){ret.push({code:"CHK_MSG_PRG_TRG_616",data:`missing alert title property`,type:"W",category:`alert`,ref:doc._id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}if(!trigger_item.data.name.alertBody){ret.push({code:"CHK_MSG_PRG_TRG_618",data:`missing alert body property`,type:"W",category:`alert`,ref:doc._id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}break;case"loader_on":case"loader_off":if(doc.properties.menuType!=="component"){ret.push({code:"CHK_MSG_PRG_TRG_400",data:`"${trigger_item.data.action}" can only be executed by component in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}break;case"invoke_action":if(doc.properties.menuType!=="component"){ret.push({code:"CHK_MSG_PRG_TRG_400",data:`"${trigger_item.data.action}" can only be executed by component in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}if(!["act_next","act_prev","act_first","act_last","act_reload","act_refresh","act_print","act_save","act_delete"].includes(trigger_item.data.name.value)){ret.push({code:"CHK_MSG_PRG_TRG_400",data:`invalid "${trigger_item.data.name.value}" for "${trigger_item.data.action}" in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}break;case"delay":if(!trigger_item?.data?.name?.value){ret.push({code:"CHK_MSG_PRG_TRG_520",data:`empty delay value in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}break;case"call_library":if(!trigger_item?.data?.name?.plugin_name){ret.push({code:"CHK_MSG_PRG_TRG_510",data:`empty library value in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(!trigger_item?.data?.name?.library_method){ret.push({code:"CHK_MSG_PRG_TRG_516",data:`empty library ${trigger_item.data.name.plugin_name} method in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}if(!app_obj?.app_plugins_purchased?.[trigger_item.data.name.plugin_name]){ret.push({code:"CHK_MSG_PRG_TRG_512",data:`invalid library call ${trigger_item.data.name.plugin_name} in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}else{if(!app_obj.app_plugins_purchased[trigger_item.data.name.plugin_name].installed){ret.push({code:"CHK_MSG_PRG_TRG_514",data:` library "${trigger_item.data.name.plugin_name}" not installed in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`})}}}break;case"alter_ui_element":case"create_ui_element":case"info_ui_element":case"remove_ui_element":case"empty_ui_element":case"cache_ui_element":case"load_ui_element":ret.push({code:"CHK_MSG_PRG_TRG_900",data:`deprecated "${trigger_item?.data?.action}" action in ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`});break;default:ret.push({code:"CHK_MSG_PRG_TRG_008",data:`invalid trigger type "${trigger_item.data.action}" for ${source_type} "${source_name}" trigger`,type:err_type,category:`${source_type}_trigger`,ref:trigger_item.id,source_id:source_id,id:`${doc._id}-${source_id}-${trigger_item.id}`});break}if(trigger_item.props.condition){ret=[...ret,...check_prog_expression(doc,trigger_item.props.condition,trigger_item.id,"condition")]}}return ret};const check_prog_datasource=function(doc){var ret=[];if(!doc.progDataSource||_.isEmpty(doc.progDataSource)||!doc.progDataSource.dataSourceType||doc.progDataSource.dataSourceType==="none"){return ret}switch(doc.progDataSource.dataSourceType){case"table":if(!doc.progDataSource.dataSourceTableId&&!doc?.progDataSource?.dataSourceTableIdExp){ret.push({code:"CHK_MSG_PRG_DSC_010",data:`missing table id for datasource`,type:"E",id:`${doc._id}`});return ret}else{if(doc.progDataSource.dataSourceTableId&&!progs_obj?.[doc.progDataSource.dataSourceTableId]){ret.push({code:"CHK_MSG_PRG_DSC_030",data:`invalid table id ${doc.progDataSource.dataSourceTableId} for datasource`,type:"E",id:`${doc._id}`});return ret}let found_error;function arraysEqual(arr1,arr2){if(arr1.length!==arr2.length)return false;let sortedArr1=arr1.slice().sort();let sortedArr2=arr2.slice().sort();for(let i=0;i<sortedArr1.length;i++){if(sortedArr1[i]!==sortedArr2[i])return false}return true}if(doc.progDataSource.dataSourceIndexesObj){const table_indexes_arr=progs_obj?.[doc.progDataSource.dataSourceTableId]?.tableIndexes;for(let[index_id,index_data]of Object.entries(doc.progDataSource.dataSourceIndexesObj)){if(table_indexes_arr||!find_item_by_id(table_indexes_arr,index_id)){ret.push({code:"CHK_MSG_PRG_DSC_032",data:`find invalid index in table ${progs_obj?.[doc.progDataSource.dataSourceTableId]?.properties?.menuName||doc.progDataSource.dataSourceTableId} for index ${index_id} in dataSourceIndexesObj`,type:"E",id:`${doc._id}`});found_error=true;break}let prog_keys=[];for(let[field_id,val]of Object.entries(index_data)){prog_keys.push(field_id)}if(!arraysEqual(prog_keys,table_indexes_arr.keys)){ret.push({code:"CHK_MSG_PRG_DSC_034",data:`find in-consist index keys in table ${progs_obj?.[doc.progDataSource.dataSourceTableId]?.properties?.menuName||doc.progDataSource.dataSourceTableId} for index ${index_id} in dataSourceIndexesObj`,type:"E",id:`${doc._id}`});found_error=true;break}}if(found_error)return ret}}if(doc.properties.menuType!=="set_data"){if(!doc.progDataSource.dataSourceIndexId&&!doc.progDataSource.dataSourceIndexIdExp){ret.push({code:"CHK_MSG_PRG_DSC_042",data:`index not defined for the datasource table`,type:"W",id:`${doc._id}`})}else if(doc.progDataSource.dataSourceIndexId){if(!progs_obj?.[doc.progDataSource.dataSourceTableId]?.tableIndexes){ret.push({code:"CHK_MSG_PRG_DSC_030",data:`invalid table id ${doc.progDataSource.dataSourceTableId} for datasource`,type:"E",id:`${doc._id}`});return ret}else{const table_indexes_arr=progs_obj?.[doc.progDataSource.dataSourceTableId].tableIndexes;if(!find_item_by_id(table_indexes_arr,doc.progDataSource.dataSourceIndexId)){ret.push({code:"CHK_MSG_PRG_DSC_040",data:`invalid index in table ${progs_obj?.[doc.progDataSource.dataSourceTableId]?.properties?.menuName||doc.progDataSource.dataSourceTableId} for index ${doc.progDataSource.dataSourceIndexId}`,type:"E",id:`${doc._id}`});return ret}}}if(!doc.progDataSource.dataSourceSort&&!doc.progDataSource.dataSourceSortExp){ret.push({code:"CHK_MSG_PRG_DSC_200",data:`missing sort value for datasource`,type:"E",id:`${doc._id}`})}else if(doc.progDataSource.dataSourceSort){if(!["asc","des"].includes(doc.progDataSource.dataSourceSort)){ret.push({code:"CHK_MSG_PRG_DSC_210",data:`invalid sort value for datasource`,type:"E",id:`${doc._id}`})}}if(doc.progDataSource.dataSourceSkip&&typeof doc.progDataSource.dataSourceSkip!=="number"){ret.push({code:"CHK_MSG_PRG_DSC_220",data:`invalid skip value for datasource`,type:"E",id:`${doc._id}`})}if(doc.progDataSource.dataSourceLimit&&typeof doc.progDataSource.dataSourceLimit!=="number"){ret.push({code:"CHK_MSG_PRG_DSC_230",data:`invalid limit value for datasource`,type:"E",id:`${doc._id}`})}}break;default:ret.push({code:"CHK_MSG_PRG_DSC_040",data:`invalid datasource type ${doc.progDataSource.dataSourceType}`,type:"E",id:`${doc._id}`});break}return ret};const check_prog_parameters=function(doc){var ret=[];if(!doc?.properties?.progParams)return ret;var name_counts_obj={};for(let parameter of doc.properties.progParams){if(!parameter?.data?.parameter){ret.push({code:"CHK_MSG_PRG_PRM_010",data:`missing parameter name`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}`})}else{if(!/^[A-Za-z]+[\w\-\:\.]*$/.test(parameter.data.parameter)){ret.push({code:"CHK_MSG_PRG_PRM_020",data:`invalid parameter name`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}`})}if(!name_counts_obj[parameter.data.parameter]){name_counts_obj[parameter.data.parameter]=1}else{name_counts_obj[parameter.data.parameter]++}if(!hide_not_in_use_check){if(parameter.data.dir==="in"){if(!find_field_in_progs(doc,parameter.data.parameter)){ret.push({code:"CHK_MSG_PRG_PRM_022",data:`parameter "${parameter.data.parameter}" not in use`,type:"W",category:"parameter",ref:parameter.id,not_in_use:true,id:`${doc._id}-${parameter.id}`})}}}}if(!parameter?.data?.type){ret.push({code:"CHK_MSG_PRG_PRM_030",data:`missing parameter type for ${parameter.data.parameter}`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}`});continue}else{switch(parameter.data.type){case"string":break;case"number":case"boolean":break;case"object":break;case"array":break;default:ret.push({code:"CHK_MSG_PRG_PRM_040",data:`invalid parameter type "${parameter.data.type}" for ${parameter.data.parameter}`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}`});break}}if(!parameter?.data?.dir){ret.push({code:"CHK_MSG_PRG_PRM_080",data:`missing parameter dir for ${parameter.data.parameter}`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}`});continue}else{switch(parameter.data.dir){case"in":break;case"out":if(!find_item_by_key(doc.progFields,"field_id",parameter.data.parameter)){ret.push({code:"CHK_MSG_PRG_PRM_100",data:`missing parameter return in the fieldset for ${parameter.data.parameter}`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}`})}break;default:ret.push({code:"CHK_MSG_PRG_PRM_090",data:`invalid parameter dir for ${parameter.data.parameter}`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}`});break}}}for(let[key,val]of Object.entries(name_counts_obj)){if(val>1){ret.push({code:"CHK_MSG_PRG_PRM_050",data:`duplicate parameter name for ${key}`,type:doc.studio_meta.not_in_use?"W":"E",category:"parameter",ref:parameter.id,id:`${doc._id}-${parameter.id}-${key}`})}}return ret};const check_javascript=function(doc){var ret=[];if(!doc?.scriptData?.value){ret.push({code:"CHK_MSG_PRG_JVS_012",data:"no script to run",type:"W",id:`${doc._id}`})}else{}return ret};const find_item_by_key=function(arr,key,val){return arr.find(function(e){return e.data[key]===val})};const find_item_by_id=function(arr,val){return arr.find(function(e){return e.id===val})};const find_field_in_progs=function(doc,field_id,prog_id){const regex=new RegExp(`@${field_id}\\b`);if(!regex.test(progs_str)){return}var ret=[];for(let[key,prog]of Object.entries(progs_obj)){var fields_arr=[];if(prog.tableFields){fields_arr=prog.tableFields}if(prog.progFields){fields_arr=prog.progFields}if(_.isEmpty(fields_arr)){continue}for(let field_item of fields_arr){if(field_item.data.field_id===field_id){ret.push({prog_id:prog._id,field_item:field_item,properties:prog.properties})}}}return ret};const check_prog_expression=function(doc,exp,path,category){var ret=[];if(!exp)return ret;if(typeof exp!=="string")return ret;if(!UglifyJS)return ret;const regex=/@\w+/g;const matches=exp.match(regex);var field_matches={};try{if(matches){for(let field of matches){const ret_field=find_field_in_progs(doc,field.substr(1));if(!ret_field){ret.push({code:"CHK_MSG_PRG_EXP_012",data:`field "${field}" not found in the project datasets using expression "${exp.substr(0,20)}.." in ${path}`,type:"W",category:category,source_id:path,id:`${doc._id}-${path}-${field}`})}else{field_matches[field]=ret_field}}}}catch(error){debugger}if(!_.isEmpty(ret)){return ret}if(_.isEmpty(field_matches)){var options={warnings:true};var result=UglifyJS.minify(exp,options);if(result.error){ret.push({code:"CHK_MSG_PRG_EXP_022",data:`expression error ${result.error.message} in ${exp.substr(0,20)}.. in ${path}`,type:doc.studio_meta.not_in_use?"W":"E",category:category,details:result.error,source_id:path,id:`${doc._id}-${path}`})}if(result.warnings){ret.push({code:"CHK_MSG_PRG_EXP_024",data:`expression warning ${result.warnings[0]} in ${exp.substr(0,20)}.. in ${path}`,type:"W",category:category,details:result.warnings,source_id:path,id:`${doc._id}-${path}`})}}else{var clean_exp=exp;var field_type="string";var skip_eval;for(let[key,val]of Object.entries(field_matches)){if(val.length>1){var field_ind_found_in_current_program;for(let[ret_key,ret_val]of Object.entries(val)){if(ret_val.prog_id===doc._id){field_ind_found_in_current_program=ret_key;break}}if(typeof field_ind_found_in_current_program==="undefined"){skip_eval=true;break}else{field_type=val[field_ind_found_in_current_program]?.field_item?.props?.fieldType}}else{field_type=val[0]?.field_item?.props?.fieldType}switch(field_type){case"string":clean_exp=clean_exp.replaceAll(key,"''");break;case"number":case"boolean":case"bool":clean_exp=clean_exp.replaceAll(key,"0");break;case"object":clean_exp=clean_exp.replaceAll(key,"{}");break;case"array":clean_exp=clean_exp.replaceAll(key,"[]");break;default:break}}if(!skip_eval){var options={warnings:true};var result=UglifyJS.minify(clean_exp,options);if(result.error){ret.push({code:"CHK_MSG_PRG_EXP_026",data:`expression error ${result.error.message} in ${exp.substr(0,20)}.. in ${path}`,type:doc.studio_meta.not_in_use?"W":"E",category:category,details:result.error,source_id:path,id:`${doc._id}-${path}`})}if(result.warnings){ret.push({code:"CHK_MSG_PRG_EXP_028",data:`expression warning ${result.warnings[0]} in ${exp.substr(0,20)}.. in ${path}`,type:"W",category:category,details:result.warnings,source_id:path,id:`${doc._id}-${path}`})}}}return ret};const find_event_id_in_progs=function(doc,event_id){var ret=[];for(let[key,prog]of Object.entries(progs_obj)){if(!prog.progEvents||_.isEmpty(prog.progEvents)){continue}for(let event_item of prog.progEvents){if(event_item.data.event_name===event_id){ret.push({prog_id:prog._id,event_item:event_item,properties:prog.properties})}}}if(!ret.length)return false;return ret};const find_xu_tree_id_in_progs=function(doc,xu_tree_id){var ret=[];for(let[key,prog]of Object.entries(progs_obj)){if(!prog.progUi||_.isEmpty(prog.progUi)){continue}const run_tree=function(node){for(let item of node){if(item.xu_tree_id===xu_tree_id){ret.push({prog_id:prog._id,item:item,properties:prog.properties})}if(item.children){run_tree(item.children)}}};run_tree(prog.progUi)}if(!ret.length)return false;return ret};const find_trigger_property_value_in_progs=function(doc,triggers_arr,property,value,search_in_doc_prog_only){var ret=[];const find_in_triggers=function(prog,workflow){if(!workflow)return;try{for(let val of workflow){if(triggers_arr.includes(val?.data?.action)){const str=JSON.stringify(val);const regex=new RegExp(`\\b${value}\\b`);if(value===null||val?.data?.name?.[property]===value||regex.test(str)){if(val?.data?.name?.[property]){ret.push({prog_id:prog._id,val:val,properties:prog.properties,prop_value:val?.data?.name?.[property]})}else{ret.push({prog_id:prog._id,val:val,properties:prog.properties})}}}}}catch(error){console.error(doc._id,workflow)}};const run_program_search=function(prog){if(prog?.progEvents&&!_.isEmpty(prog.progEvents)){for(let event_item of prog.progEvents){if(event_item.workflow){find_in_triggers(prog,event_item.workflow)}}}if(prog?.progFields&&!_.isEmpty(prog.progFields)){for(let field_item of prog.progFields){if(field_item.workflow){find_in_triggers(prog,field_item.workflow)}}}if(prog?.progUi&&!_.isEmpty(prog.progUi)){const run_tree=function(node){try{for(let item of node){if(item.attributes){for(let[key,val]of Object.entries(item.attributes)){if(key.substr(0,6)==="xu-on:"){if(!_.isEmpty(val)){for(let trigger_item of val){find_in_triggers(prog,trigger_item.workflow)}}}}}if(item.children){run_tree(item.children)}}}catch(error){console.error("find in ui workflow",error)}};run_tree(prog.progUi)}};if(!search_in_doc_prog_only){for(let[key,prog]of Object.entries(progs_obj)){run_program_search(prog)}}else{run_program_search(progs_obj?.[doc._id])}if(!ret.length)return false;return ret};const find_panel_prog_in_progs=function(doc,prog_id,search_in_doc_prog_only){var ret=[];const find_in_prog=function(prog){if(_.isEmpty(prog?.progUi))return;const run_tree=function(node){for(let item of node){if(item.tagName==="xu-panel"){const str=JSON.stringify(item);const regex=new RegExp(`\\b${prog_id}\\b`);if(prog_id===null||item?.attributes?.program?.prog===prog_id||regex.test(str)){if(item?.attributes?.program?.prog){ret.push({prog_id:prog._id,item:item,prop_value:item.attributes.program.prog})}else{ret.push({prog_id:prog._id,item:item})}}}if(item.children){run_tree(item.children)}}};run_tree(prog.progUi)};if(!search_in_doc_prog_only){for(let[key,prog]of Object.entries(progs_obj)){find_in_prog(prog)}}else{find_in_prog(progs_obj?.[doc._id])}if(!ret.length)return false;return ret};const find_table_in_progs=function(doc,table_id,search_in_doc_prog_only){var ret=[];const find_in_prog=function(prog){if(!prog.progDataSource||_.isEmpty(prog.progDataSource)||prog.progDataSource.dataSourceType!=="table"){return}if(prog.progDataSource.dataSourceTableId===table_id||prog.progDataSource?.dataSourceTableIdExp?.includes(table_id)){ret.push({prog_id:prog._id})}};if(!search_in_doc_prog_only){for(let[key,prog]of Object.entries(progs_obj)){find_in_prog(prog)}}else{find_in_prog(progs_obj?.[doc._id])}if(!ret.length)return false;return ret};const find_prog_in_fieldset_fieldValue_progs=function(doc,prog_id,search_in_doc_prog_only){var ret=[];const find_in_prog=function(prog){if(!prog.progFields)return;for(let field_item of prog.progFields){const str=JSON.stringify(field_item);const regex=new RegExp(`\\b${prog_id}\\b`);if(prog_id===null||field_item?.props?.fieldValue===prog_id||regex.test(str)){if(field_item?.props?.fieldValue){ret.push({prog_id:prog._id,field_item:field_item,properties:prog.properties,prop_value:field_item.props.fieldValue})}else{ret.push({prog_id:prog._id,field_item:field_item,properties:prog.properties})}}}};if(!search_in_doc_prog_only){for(let[key,prog]of Object.entries(progs_obj)){find_in_prog(prog)}}else{find_in_prog(progs_obj?.[doc._id])}if(!ret.length)return false;return ret};const new_node_id=function(type,app_id){const abbreviate=word=>{if(word.length<=3){return word}let abbreviation=word[0];const vowels="aeiou";for(let i=1;i<word.length&&abbreviation.length<3;i++){if(!vowels.includes(word[i].toLowerCase())){abbreviation+=word[i]}}if(abbreviation.length<3){abbreviation=word.substring(0,3)}return abbreviation};var last12uuid=crypto.randomUUID().split("-")[4];if(type){var menuAbbreviated=abbreviate(type.replaceAll("_",""));return`${app_id.substr(app_id.length-3)}_${menuAbbreviated}_${last12uuid}`}return app_id.substr(app_id.length-3)+"_"+last12uuid};function detectCryptoString(str){const patterns={uuid:/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i};const results={};for(const[type,pattern]of Object.entries(patterns)){results[type]=pattern.test(str)}return results}export const get_zod_schema=function(type){const UuidSchema=z.string().uuid().describe(`UUID format identifier`);const TimestampSchema=z.number().describe(`Unix timestamp in milliseconds`);const StudioMetaSchema=z.object({created:TimestampSchema.describe(`Timestamp when the ${type} was created`),createdByUid:z.string().describe(`User ID of the ${type} creator`),checkedInUserId:z.string().describe(`Last user ID who checked in the ${type}`),checkedInUserName:z.string().describe(`Display name of the last user who modified`),savedByUid:z.string().describe(`User ID who last saved the ${type}`),parentId:z.string().describe(`Parent container ID (default: "programs")`),source:z.string().optional().describe(`Source of creation (e.g., "studio ai", "studio ide")`),ui_preview_sizes:z.object({w:z.number().describe(`Preview width`),h:z.number().describe(`Preview height`),l:z.number().describe(`Left position`),t:z.number().describe(`Top position`)}).optional().describe(`Optional UI preview layout hints for visual editors`)}).describe(`Studio metadata for tracking creation, modification, and organizational information`);const ProgParamSchema=z.object({id:z.union([z.string(),z.number()]).describe(`Unique identifier for the parameter`),data:z.object({dir:z.union([z.literal(`in`),z.literal(`out`)]).describe(`Parameter direction: "in" for input parameters, "out" for output parameters`),parameter:z.string().describe(`Parameter name used for referencing in code and workflows`),type:z.union([z.literal(`string`),z.literal(`number`),z.literal(`boolean`),z.literal(`array`),z.literal(`object`)]).describe(`Expected data type of the parameter value`)}).describe(`Core parameter configuration including direction, name, and type`),props:z.object({}).optional().describe(`Additional parameter properties (reserved for future use)`)}).describe(`Input/output parameter definition for ${type} interface`);const ProgFieldSchema=z.object({id:UuidSchema.describe(`Unique UUID identifier for the field`),data:z.object({type:z.union([z.literal(`virtual`),z.literal(`table`),z.literal(`expression`),z.literal(`datasource`)]).describe(`Field type: virtual=variable, table=field from datasource table, expression=holds expression without evaluation, datasource=iterable datasource object/array`),field_id:z.string().describe(`The unique field name used for referencing`)}).describe(`Core field configuration defining its type and identifier`),props:z.object({fieldType:z.union([z.literal(`string`),z.literal(`number`),z.literal(`boolean`),z.literal(`array`),z.literal(`object`)]).describe(`Data type held by the field`),propExpressions:z.object({fieldValue:z.string().optional().describe(`Expression or static value for the field`),fieldType:z.string().optional().describe(`Dynamic field type expression`)}).strict().describe(`Property expressions - only fieldValue and fieldType are allowed`)}).describe(`Field properties including data type and expressions`),workflow:z.array(z.any()).optional().describe(`Optional workflow actions triggered by field changes`)}).describe(`Internal field definition used by the ${type} for data management`);const WorkflowActionSchema=z.object({id:z.union([UuidSchema,z.string(),z.number()]).describe(`Unique identifier for the workflow step`),data:z.object({action:z.union([z.literal(`call_modal`).describe(`Opens a ${type} as a modal dialog`),z.literal(`call_popover`).describe(`Opens a ${type} as a popover overlay`),z.literal(`call_page`).describe(`Navigates to or opens a page ${type}`),z.literal(`call_native_javascript`).describe(`Calls a JavaScript program by ID`),z.literal(`execute_native_javascript`).describe(`Executes inline JavaScript code`),z.literal(`call_evaluate_javascript`).describe(`Calls JavaScript program with argument evaluation`),z.literal(`execute_evaluate_javascript`).describe(`Evaluates and runs dynamic JavaScript expressions`),z.literal(`emit_event`).describe(`Emits a JavaScript event`),z.literal(`loader_on`).describe(`Shows loading indicator`),z.literal(`loader_off`).describe(`Hides loading indicator`),z.literal(`invoke_action`).describe(`Executes system-level actions (refresh, save, etc.)`),z.literal(`update`).describe(`Updates variable values or field data`),z.literal(`raise_event`).describe(`Triggers internal application events`),z.literal(`get_data`).describe(`Executes a get_data program for data retrieval`),z.literal(`set_data`).describe(`Executes a set_data program for data persistence`),z.literal(`batch`).describe(`Executes a batch program for bulk operations`),z.literal(`call_project_api`).describe(`Calls an API program within the current project`),z.literal(`call_external_api`).describe(`Makes HTTP requests to external APIs`),z.literal(`call_system_api`).describe(`Invokes system-level API methods`),z.literal(`alert`).describe(`Displays alert messages (modal, inline, etc.)`),z.literal(`call_alert`).describe(`Calls an alert program by ID`),z.literal(`comment`).describe(`Adds descriptive documentation to workflow`),z.literal(`delay`).describe(`Pauses workflow execution for specified duration`)]).describe(`The specific workflow action type to execute`),name:z.object({properties:z.object({}).optional().describe(`Action-specific properties configuration`),parameters:z.object({doc_in:z.object({value:z.string().optional().describe(`Static parameter value`),fx:z.string().optional().describe(`Dynamic expression referencing variables`)}).optional().describe(`Input parameter for data retrieval`),class_id:z.object({value:z.string().optional().describe(`Static parameter value`),fx:z.string().optional().describe(`Dynamic expression referencing variables`)}).optional().describe(`Class ID parameter for data operations`)}).catchall(z.object({value:z.string().optional().describe(`Static parameter value`),fx:z.string().optional().describe(`Dynamic expression referencing variables`)})).optional().describe(`Input parameters with static values or dynamic expressions`),prog:z.string().optional().describe(`Program ID to call (for call_* actions)`),value:z.string().optional().describe(`Value for action (comments, JavaScript code, variable assignments, delay duration)`),event:z.string().optional().describe(`Event name to trigger (for raise_event action)`),outputField:z.string().optional().describe(`Output variable to store action results (for set_data)`),url:z.string().optional().describe(`External API endpoint URL`),method:z.union([z.literal(`GET`),z.literal(`POST`),z.literal(`PUT`),z.literal(`DELETE`),z.literal(`PATCH`)]).optional().describe(`HTTP method for API calls`),api_method:z.string().optional().describe(`System-level method to invoke`),payload:z.object({}).optional().describe(`Data payload for API calls`),createLog:z.boolean().optional().describe(`Whether to create a log entry for alerts`),alertDisplay:z.union([z.literal(`modal`),z.literal(`inline`),z.literal(`toast`)]).optional().describe(`Alert display type`),alertType:z.union([z.literal(`error`),z.literal(`warning`),z.literal(`info`),z.literal(`success`)]).optional().describe(`Alert message type`),alertTitle:z.string().optional().describe(`Alert title text`),alertBody:z.string().optional().describe(`Alert body message content`)}).describe(`Action-specific configuration and parameters`),enabled:z.boolean().describe(`Whether the workflow step is active and will execute`)}).describe(`Core workflow action definition with type-specific validation`),props:z.object({condition:z.string().optional().describe(`Optional expression that must evaluate to true for action to execute`),async:z.boolean().optional().describe(`Whether to execute asynchronously without waiting for completion`)}).optional().describe(`Additional execution behavior configuration`)}).describe(`Individual workflow action step with comprehensive validation for all supported action types`);const ProgEventSchema=z.object({id:UuidSchema.describe(`Unique UUID identifier for the event`),data:z.object({type:z.union([z.literal(`on_load`),z.literal(`on_exit`),z.literal(`before_record`),z.literal(`after_record`),z.literal(`record_not_found`),z.literal(`locate_not_found`),z.literal(`screen_ready`),z.literal(`client_interval`),z.literal(`user_defined`)]).describe(`Event type defining when the event triggers during ${type} lifecycle`),event_name:z.string().describe(`Reference name for the event`),properties:z.string().describe(`Additional event properties (usually empty)`),condition:z.string().describe(`Optional condition expression to determine when event should fire`),parameters:z.array(z.any()).describe(`Array of parameter mappings for the event`)}).describe(`Core event configuration defining trigger conditions and parameters`),props:z.object({propExpressions:z.object({}).optional().describe(`Property expressions for dynamic event behavior`)}).describe(`Additional event properties and expressions`),workflow:z.array(WorkflowActionSchema).optional().describe(`Array of workflow actions to execute when event triggers`)}).describe(`Component lifecycle event with associated triggers and workflow actions`);const UiAttributesSchema=z.record(z.union([z.string(),z.number(),z.boolean(),z.object({}),z.array(z.object({handler:z.string().describe(`Event handler type`),props:z.object({}).optional().describe(`Handler-specific properties`),workflow:z.array(WorkflowActionSchema).optional().describe(`Workflow actions to execute on event`)}))])).refine(attrs=>{const xuAttributes=Object.keys(attrs).filter(key=>key.startsWith(`xu-`));for(const attr of xuAttributes){const value=attrs[attr];if(attr===`xu-bind`&&typeof value!==`string`){return false}if(attr===`xu-render`&&typeof value!==`string`){return false}if(attr===`xu-show`&&typeof value!==`string`){return false}if(attr===`xu-for`&&typeof value!==`string`){return false}if([`xu-for-key`,`xu-for-val`].includes(attr)&&typeof value!==`string`){return false}if(attr.startsWith(`xu-on:`)&&!Array.isArray(value)){return false}if(attr===`xu-class`){if(typeof value!==`string`&&typeof value!==`object`){return false}}if(attr===`xu-store`){if(typeof value!==`string`&&typeof value!==`object`){return false}}if([`xu-text`,`xu-html`,`xu-content`,`xu-ref`].includes(attr)&&typeof value!==`string`){return false}if(attr.startsWith(`xu-exp:`)&&typeof value!==`string`){return false}if([`xu-style`,`xu-style-global`,`xu-script`,`xu-cdn`,`xu-ui-plugin`,`xu-viewport`].includes(attr)&&typeof value!==`string`){return false}}return true},{message:`Invalid Xuda attribute configuration`}).describe(`HTML attributes and Xuda-specific directives for UI elements. Supported Xuda attributes with examples:
2
2
 
3
3
  - xu-bind: Creates two-way data binding between input elements and progFields
4
4
  Example: xu-bind="user_name_field"
@@ -1520,7 +1520,7 @@ const check_prog_fieldset = function (doc) {
1520
1520
  ref: field.id,
1521
1521
  id: `${doc._id}-${field.id}`,
1522
1522
  });
1523
- return ret;
1523
+ continue;
1524
1524
  } else {
1525
1525
  switch (field.data.type) {
1526
1526
  case 'virtual':
@@ -1561,7 +1561,7 @@ const check_prog_fieldset = function (doc) {
1561
1561
  ref: field.id,
1562
1562
  id: `${doc._id}-${field.id}`,
1563
1563
  });
1564
- return ret;
1564
+ continue;
1565
1565
  } else {
1566
1566
  var ret_dsc = check_prog_datasource(doc);
1567
1567
  if (ret_dsc.length) return ret;
@@ -1576,7 +1576,7 @@ const check_prog_fieldset = function (doc) {
1576
1576
  ref: field.id,
1577
1577
  id: `${doc._id}-${field.id}`,
1578
1578
  });
1579
- return ret;
1579
+ continue;
1580
1580
  }
1581
1581
 
1582
1582
  if (!find_item_by_key(_datasource_table_arr, 'field_id', field.data.field_id)) {
@@ -1589,7 +1589,7 @@ const check_prog_fieldset = function (doc) {
1589
1589
  ref: field.id,
1590
1590
  id: `${doc._id}-${field.id}`,
1591
1591
  });
1592
- return ret;
1592
+ continue;
1593
1593
  }
1594
1594
  }
1595
1595
  }
@@ -1680,7 +1680,7 @@ const check_prog_fieldset = function (doc) {
1680
1680
  ref: field.id,
1681
1681
  id: `${doc._id}-${field.id}`,
1682
1682
  });
1683
- return ret;
1683
+ // return ret;
1684
1684
  break;
1685
1685
  }
1686
1686
  }
@@ -1869,7 +1869,7 @@ const check_prog_triggers = function (doc, workflow, source_type, source_id, sou
1869
1869
  source_id,
1870
1870
  id: `${doc._id}-${source_id}-${trigger_item.id}-${key}`,
1871
1871
  });
1872
- return;
1872
+ continue;
1873
1873
  }
1874
1874
  if (param_ret.data.dir !== 'in' && val.value) {
1875
1875
  const ret_local_field = find_item_by_key(doc.progFields, 'field_id', val.value);
@@ -2876,7 +2876,8 @@ const check_prog_parameters = function (doc) {
2876
2876
  ref: parameter.id,
2877
2877
  id: `${doc._id}-${parameter.id}`,
2878
2878
  });
2879
- return ret;
2879
+ continue;
2880
+ // return ret;
2880
2881
  } else {
2881
2882
  switch (parameter.data.type) {
2882
2883
  case 'string':
@@ -2901,7 +2902,7 @@ const check_prog_parameters = function (doc) {
2901
2902
  ref: parameter.id,
2902
2903
  id: `${doc._id}-${parameter.id}`,
2903
2904
  });
2904
- return ret;
2905
+ // return ret;
2905
2906
  break;
2906
2907
  }
2907
2908
  }
@@ -2915,7 +2916,8 @@ const check_prog_parameters = function (doc) {
2915
2916
  ref: parameter.id,
2916
2917
  id: `${doc._id}-${parameter.id}`,
2917
2918
  });
2918
- return ret;
2919
+ // return ret;
2920
+ continue;
2919
2921
  } else {
2920
2922
  switch (parameter.data.dir) {
2921
2923
  case 'in':
@@ -2943,7 +2945,7 @@ const check_prog_parameters = function (doc) {
2943
2945
  ref: parameter.id,
2944
2946
  id: `${doc._id}-${parameter.id}`,
2945
2947
  });
2946
- return ret;
2948
+ // return ret;
2947
2949
  break;
2948
2950
  }
2949
2951
  }
@@ -3033,6 +3035,7 @@ const check_prog_expression = function (doc, exp, path, category) {
3033
3035
  // if (!path) debugger;
3034
3036
  var ret = [];
3035
3037
  if (!exp) return ret;
3038
+ if (typeof exp !== 'string') return ret;
3036
3039
 
3037
3040
  // if (is_server && doc.properties.runAt !== "server") return ret;
3038
3041
  if (!UglifyJS) return ret;
@@ -26789,7 +26789,7 @@ func.utils.call_plugin_api = function (SESSION_ID, plugin_nameP, dataP) {
26789
26789
 
26790
26790
  data = _.assignIn(data, dataP);
26791
26791
 
26792
- fetch(`https://xuda.io/ppi/${plugin_nameP}`, {
26792
+ fetch(`https://xuda.ai/ppi/${plugin_nameP}`, {
26793
26793
  method: 'POST',
26794
26794
  headers: {
26795
26795
  Accept: 'application/json',
@@ -41083,7 +41083,7 @@ func.UI.main.embed_loader = async function (SESSION_ID) {
41083
41083
  await call_program();
41084
41084
  await glb.lifecycle.execute(SESSION_ID, 'mounted');
41085
41085
  await perform_callback();
41086
- func.utils.debug.write(SESSION_ID, 'Xuda.io started.');
41086
+ func.utils.debug.write(SESSION_ID, 'Xuda.ai started.');
41087
41087
  await glb.lifecycle.execute(SESSION_ID, 'systemReady');
41088
41088
  /////////////////////////////
41089
41089
  $(document).keydown(function (e) {
@@ -41650,7 +41650,7 @@ function xuda(...args) {
41650
41650
  // // }
41651
41651
  // };
41652
41652
  const print_version_info = function () {
41653
- const version_name = `Xuda.io ${opt.engine_mode} ${opt?.app_version || ''} Session Id: ${SESSION_ID}`;
41653
+ const version_name = `Xuda.ai ${opt.engine_mode} ${opt?.app_version || ''} Session Id: ${SESSION_ID}`;
41654
41654
  const divider = _.repeat('#', version_name.length);
41655
41655
  console.info(divider);
41656
41656
  console.info(version_name);