@xuda.io/runtime-bundle 1.0.1195 → 1.0.1196
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 +1 @@
|
|
|
1
|
-
var app_obj,progs_obj,_,progs_str,hide_not_in_use_check,is_server,deployments,UglifyJS,JSON5,_conf,warn_plugin_check;const PROTECTED_VARS=["_NULL","_THIS","_FOR_KEY","_FOR_VAL","_ROWNO","_ROWID","_ROWDOC","_KEY","_VAL"];const ALL_MENU_TYPE=["globals","component","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){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};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);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"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){var ret=[];const addValidationError=(code,data)=>{debugger;ret.push({code:code,data:data,type:"E",category:"document",structure_error:true})};if(!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._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":"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}for(let val of doc.progFields){if(!_.isObject(val)){addValidationError("CHK_MSG_OBJ_GEN_404","invalid progFields object property");continue}if(!val.id){addValidationError("CHK_MSG_OBJ_GEN_406","missing progFields.id property");continue}if(ids.includes(val.id)){addValidationError("CHK_MSG_OBJ_GEN_408",`${val.id} id must be unique in progFields property`);continue}ids.push(val.id);if(!_.isObject(val.data)){addValidationError("CHK_MSG_OBJ_GEN_410","invalid progFields.data object property");continue}if(!val.data.field_id){addValidationError("CHK_MSG_OBJ_GEN_412","invalid progFields.data.field_id property")}if(!val.data.type){addValidationError("CHK_MSG_OBJ_GEN_414","invalid progFields.data.type property")}if(!_.isObject(val.props)){addValidationError("CHK_MSG_OBJ_GEN_416","invalid progFields.props Object property");continue}if(!val.props.fieldType){addValidationError("CHK_MSG_OBJ_GEN_418","invalid progFields.props.fieldType property")}if(!_.isObject(val.props.propExpressions)){addValidationError("CHK_MSG_OBJ_GEN_4120","invalid val.props.propExpressions Object property")}check_triggers(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_triggers(val.workflow)}};const check_triggers=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?.attributes&&!_.isObject(item.attributes)){addValidationError("CHK_MSG_OBJ_GEN_706","invalid progUi attributes item Object property")}if(typeof item.type==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_708","undefined progUi type item string property")}if(typeof item.tagName==="undefined"){addValidationError("CHK_MSG_OBJ_GEN_710","undefined progUi tagName item string property")}if(!item.id){addValidationError("CHK_MSG_OBJ_GEN_712","missing progUi id item property");continue}if(item.id!=="root"&&doc?.studio_meta?.source==="studio ai"&&!detectCryptoString(item.id).uuid){addValidationError("CHK_MSG_OBJ_GEN_713","progUi id item property must be uuid");continue}if(ids.includes(item.id)){addValidationError("CHK_MSG_OBJ_GEN_714",`${item.id} id must be unique in progUi property`);continue}ids.push(item.id);check_triggers(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(!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_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"&¶meter_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){return 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}`})}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}
|
|
1
|
+
var app_obj,progs_obj,_,progs_str,hide_not_in_use_check,is_server,deployments,UglifyJS,JSON5,_conf,warn_plugin_check;const PROTECTED_VARS=["_NULL","_THIS","_FOR_KEY","_FOR_VAL","_ROWNO","_ROWID","_ROWDOC","_KEY","_VAL"];const ALL_MENU_TYPE=["globals","component","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){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};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);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"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){var ret=[];const addValidationError=(code,data)=>{debugger;ret.push({code:code,data:data,type:"E",category:"document",structure_error:true})};if(!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._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":"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){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).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(!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_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"&¶meter_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){return 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}`})}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}
|
|
@@ -298,50 +298,64 @@ export const check_structure = function (doc) {
|
|
|
298
298
|
return;
|
|
299
299
|
}
|
|
300
300
|
|
|
301
|
+
const validTypes = ['virtual', 'table', 'expression', 'datasource'];
|
|
302
|
+
const validFieldTypes = ['string', 'number', 'boolean', 'array', 'object'];
|
|
303
|
+
|
|
301
304
|
for (let val of doc.progFields) {
|
|
302
305
|
if (!_.isObject(val)) {
|
|
303
|
-
addValidationError('CHK_MSG_OBJ_GEN_404',
|
|
306
|
+
addValidationError('CHK_MSG_OBJ_GEN_404', `Invalid progFields object `);
|
|
304
307
|
continue;
|
|
305
308
|
}
|
|
306
309
|
|
|
307
310
|
if (!val.id) {
|
|
308
|
-
addValidationError('CHK_MSG_OBJ_GEN_406', '
|
|
309
|
-
continue;
|
|
311
|
+
addValidationError('CHK_MSG_OBJ_GEN_406', 'Missing progFields ID property');
|
|
310
312
|
}
|
|
311
|
-
|
|
312
|
-
if (
|
|
313
|
-
|
|
314
|
-
|
|
313
|
+
const fieldId = val.id ? `(${val.id})` : '';
|
|
314
|
+
if (val.id) {
|
|
315
|
+
if (ids.includes(val.id)) {
|
|
316
|
+
addValidationError('CHK_MSG_OBJ_GEN_408', `Duplicate progFields ID (${val.id})`);
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
ids.push(val.id);
|
|
315
320
|
}
|
|
316
|
-
ids.push(val.id);
|
|
317
|
-
|
|
318
321
|
if (!_.isObject(val.data)) {
|
|
319
|
-
addValidationError('CHK_MSG_OBJ_GEN_410',
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
addValidationError('CHK_MSG_OBJ_GEN_412', 'invalid progFields.data.field_id property');
|
|
325
|
-
}
|
|
322
|
+
addValidationError('CHK_MSG_OBJ_GEN_410', `Invalid progFields data object ${fieldId}`);
|
|
323
|
+
} else {
|
|
324
|
+
if (!val.data.field_id) {
|
|
325
|
+
addValidationError('CHK_MSG_OBJ_GEN_412', `Missing progFields field_id property ${fieldId}`);
|
|
326
|
+
}
|
|
326
327
|
|
|
327
|
-
|
|
328
|
-
|
|
328
|
+
if (!val.data.type) {
|
|
329
|
+
addValidationError('CHK_MSG_OBJ_GEN_414', `Missing progFields type property ${fieldId}`);
|
|
330
|
+
} else if (!validTypes.includes(val.data.type)) {
|
|
331
|
+
addValidationError('CHK_MSG_OBJ_GEN_415', `Invalid progFields type "${val.data.type}" ${fieldId}. Must be one of: ${validTypes.join(', ')}`);
|
|
332
|
+
}
|
|
329
333
|
}
|
|
330
334
|
|
|
331
335
|
if (!_.isObject(val.props)) {
|
|
332
|
-
addValidationError('CHK_MSG_OBJ_GEN_416',
|
|
333
|
-
|
|
334
|
-
|
|
336
|
+
addValidationError('CHK_MSG_OBJ_GEN_416', `Invalid progFields props object ${fieldId}`);
|
|
337
|
+
} else {
|
|
338
|
+
if (!val.props.fieldType) {
|
|
339
|
+
addValidationError('CHK_MSG_OBJ_GEN_418', `Missing progFields fieldType property ${fieldId}`);
|
|
340
|
+
} else if (!validFieldTypes.includes(val.props.fieldType)) {
|
|
341
|
+
addValidationError('CHK_MSG_OBJ_GEN_419', `Invalid progFields fieldType "${val.props.fieldType}" ${fieldId}. Must be one of: ${validFieldTypes.join(', ')}`);
|
|
342
|
+
}
|
|
335
343
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
344
|
+
if (!_.isObject(val.props.propExpressions)) {
|
|
345
|
+
addValidationError('CHK_MSG_OBJ_GEN_4120', `Invalid progFields propExpressions object ${fieldId}`);
|
|
346
|
+
} else {
|
|
347
|
+
// Validate propExpressions only contains allowed properties
|
|
348
|
+
const allowedProps = ['fieldValue', 'fieldType'];
|
|
349
|
+
const actualProps = Object.keys(val.props.propExpressions);
|
|
350
|
+
const invalidProps = actualProps.filter((prop) => !allowedProps.includes(prop));
|
|
339
351
|
|
|
340
|
-
|
|
341
|
-
|
|
352
|
+
if (invalidProps.length > 0) {
|
|
353
|
+
addValidationError('CHK_MSG_OBJ_GEN_4121', `Invalid propExpressions properties: ${invalidProps.join(', ')} ${fieldId}. Only allowed: ${allowedProps.join(', ')}`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
342
356
|
}
|
|
343
357
|
|
|
344
|
-
|
|
358
|
+
check_workflow(val.workflow);
|
|
345
359
|
}
|
|
346
360
|
};
|
|
347
361
|
|
|
@@ -400,11 +414,11 @@ export const check_structure = function (doc) {
|
|
|
400
414
|
addValidationError('CHK_MSG_OBJ_GEN_522', 'invalid progEvents.props Object property');
|
|
401
415
|
}
|
|
402
416
|
|
|
403
|
-
|
|
417
|
+
check_workflow(val.workflow);
|
|
404
418
|
}
|
|
405
419
|
};
|
|
406
420
|
|
|
407
|
-
const
|
|
421
|
+
const check_workflow = function (workflow) {
|
|
408
422
|
if (!workflow) return;
|
|
409
423
|
|
|
410
424
|
var ids = [];
|
|
@@ -469,37 +483,45 @@ export const check_structure = function (doc) {
|
|
|
469
483
|
continue;
|
|
470
484
|
}
|
|
471
485
|
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
if (item?.attributes && !_.isObject(item.attributes)) {
|
|
475
|
-
addValidationError('CHK_MSG_OBJ_GEN_706', 'invalid progUi attributes item Object property');
|
|
486
|
+
if (!item.id) {
|
|
487
|
+
addValidationError('CHK_MSG_OBJ_GEN_712', 'missing progUi id item property');
|
|
476
488
|
}
|
|
477
489
|
|
|
478
|
-
if (
|
|
479
|
-
|
|
480
|
-
|
|
490
|
+
if (item?.id) {
|
|
491
|
+
if (item?.type === 'comment') {
|
|
492
|
+
addValidationError('CHK_MSG_OBJ_GEN_705', `Comment type is not supported in progUi (${item.id})`);
|
|
493
|
+
continue;
|
|
494
|
+
}
|
|
481
495
|
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
496
|
+
if (item?.type === 'text') {
|
|
497
|
+
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`);
|
|
498
|
+
continue;
|
|
499
|
+
}
|
|
485
500
|
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
}
|
|
501
|
+
if (item?.attributes && !_.isObject(item.attributes)) {
|
|
502
|
+
addValidationError('CHK_MSG_OBJ_GEN_707', `Invalid progUi attributes object property (${item.id})`);
|
|
503
|
+
}
|
|
490
504
|
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
}
|
|
505
|
+
if (typeof item.type === 'undefined') {
|
|
506
|
+
addValidationError('CHK_MSG_OBJ_GEN_708', `Missing progUi type property (${item.id})`);
|
|
507
|
+
}
|
|
495
508
|
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
509
|
+
if (typeof item.tagName === 'undefined') {
|
|
510
|
+
addValidationError('CHK_MSG_OBJ_GEN_710', `Missing progUi tagName property (${item.id})`);
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
if (item.id !== 'root' && doc?.studio_meta?.source === 'studio ai' && !detectCryptoString(item.id).uuid) {
|
|
514
|
+
addValidationError('CHK_MSG_OBJ_GEN_713', `ProgUi item ID must be in UUID format (${item.id})`);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
if (ids.includes(item.id)) {
|
|
518
|
+
addValidationError('CHK_MSG_OBJ_GEN_714', `Duplicate progUi item ID found (${item.id})`);
|
|
519
|
+
continue;
|
|
520
|
+
}
|
|
521
|
+
ids.push(item.id);
|
|
499
522
|
}
|
|
500
|
-
ids.push(item.id);
|
|
501
523
|
|
|
502
|
-
|
|
524
|
+
check_workflow(item.workflow);
|
|
503
525
|
|
|
504
526
|
if (item.children) {
|
|
505
527
|
run_tree(item.children);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xuda.io/runtime-bundle",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1196",
|
|
4
4
|
"description": "The Xuda Runtime Bundle refers to a collection of scripts and libraries packaged together to provide the necessary runtime environment for executing plugins or components in the Xuda platform. ",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"pub": "npm version patch --force && npm publish --access public"
|