{
    "module": {
        "moduleRequired": false,
        "options": [
            {
                "name": "standard module",
                "parameters": {
                    "NAME"  : "${CUSTOM}${NAME}"
                },
                "resources": [
                    {
                        "type": "folder",
                        "target": "${NAME}/BO"
                    },
                    {
                        "type": "folder",
                        "target": "${NAME}/DS"
                    },
                    {
                        "type": "folder",
                        "target": "${NAME}/PL"
                    },
                    {
                        "type": "folder",
                        "target": "${NAME}/PR"
                    },
                    {
                        "type": "folder",
                        "target": "${NAME}/TB"
                    }
                ]
            }
        ]
    },
    "businessobject": {
        "moduleRequired": true,
        "options": [
            {
                "name": "businessobject with datasource",
                "parameters": {
                    "NAME": {
                        "fn"    : "getResourceName",
                        "args"  : ["${TYPE}", "${NAME}", "${CUSTOM}"]
                    },
                    "FULL_NAME": "Bo${NAME}",
                    "DATASOURCE_REFERENCE": ""
                },
                "resources": [
                    {
                        "type": "tree",
                        "source": "YourModule Section/BO/BO_BusinessObject/businessobject/Bo${NAME}",
                        "target": "${MODULE}/BO/${FULL_NAME}"
                    }
                ],
                "includes": [
                    {
                        "name": "simple datasource",
                        "parameters": {
                            "TYPE": "datasource",
                            "MODULE": "${MODULE}",
                            "NAME": "${FULL_NAME}",
                            "REFERENCE_OBJECT": "${FULL_NAME}"
                        }
                    }
                ]
            }
        ]
    },
    "listobject": {
        "moduleRequired": true,
        "options": [
            {
                "name": "listobject with datasource",
                "parameters": {
                    "NAME": {
                        "fn"    : "getResourceName",
                        "args"  : ["${TYPE}", "${NAME}", "${CUSTOM}"]
                    },
                    "FULL_NAME": "Lo${NAME}",
                    "DATASOURCE_REFERENCE": ""
                },
                "resources": [
                    {
                        "type": "tree",
                        "source": "YourModule Section/BO/LO_ListObject/Lo${NAME}",
                        "target": "${MODULE}/BO/${FULL_NAME}"
                    }
                ],
                "includes": [
                    {
                        "name": "simple datasource",
                        "parameters": {
                            "TYPE": "datasource",
                            "MODULE": "${MODULE}",
                            "NAME": "${FULL_NAME}",
                            "REFERENCE_OBJECT": "${FULL_NAME}"
                        }
                    }
                ]
            }
        ]
    },
    "lookupobject": {
        "moduleRequired": true,
        "options": [
            {
                "name": "lookupobject with datasource",
                "parameters": {
                    "NAME": {
                        "fn"    : "getResourceName",
                        "args"  : ["${TYPE}", "${NAME}", "${CUSTOM}"]
                    },
                    "FULL_NAME": "Lu${NAME}",
                    "DATASOURCE_REFERENCE": ""
                },
                "resources": [
                    {
                        "type": "tree",
                        "source": "YourModule Section/BO/LU_LookupObject/Lu${NAME}",
                        "target": "${MODULE}/BO/${FULL_NAME}"
                    }
                ],
                "includes": [
                    {
                        "name": "simple datasource",
                        "parameters": {
                            "TYPE": "datasource",
                            "MODULE": "${MODULE}",
                            "NAME": "${FULL_NAME}",
                            "REFERENCE_OBJECT": "${FULL_NAME}"
                        }
                    }
                ]
            }
        ]
    },
    "datasource": {
        "moduleRequired": true,
        "options": [
            {
                "name": "simple datasource",
                "parameters": {
                    "NAME": {
                        "fn"    : "getResourceName",
                        "args"  : ["${TYPE}", "${NAME}", "${CUSTOM}"]
                    },
                    "REFERENCE_OBJECT": "${NAME}",
                    "FULL_NAME": {
                        "fn"    : "addPrefix",
                        "args"  : ["${NAME}", "Ds"]
                    }
                },
                "returnParameters": {
                    "DATASOURCE_REFERENCE": "${FULL_NAME}"
                },
                "resources": [
                    {
                        "type": "folder",
                        "target": "${MODULE}/DS"
                    },
                    {
                        "type": "file",
                        "source": "YourModule Section/DS/DS_DataSource/Ds${NAME}_sf.datasource.xml",
                        "target": "${MODULE}/DS/${FULL_NAME}_sf.datasource.xml"
                    }
                ]
            }
        ]
    },
    "businesslogic": {
        "moduleRequired": true,
        "options": [
            {
                "name": "method",
                "questions": [
                    {
                        "name"   : "REFERENCE_OBJECT",
                        "message": "Select the reference object to which you want to add the businesslogic method.",
                        "type"   : "list",
                        "choices": {
                            "fn"        : "getReferenceObjects",
                            "args"      : ["${MODULE}"]
                        }
                    }
                ],
                "parameters": {
                    "NAME": {
                        "fn"    : "getResourceName",
                        "args"  : ["${TYPE}", "${NAME}", "${CUSTOM}"]
                    },
                    "METHOD_NAME": {
                        "fn"    : "getMethodName",
                        "args"  : ["${NAME}"]
                    },
                    "METHOD_FILE_NAME": {
                        "fn"    : "getMethodFileName",
                        "args"  : ["${NAME}"]
                    },
                    "FULL_NAME": "${REFERENCE_OBJECT}.${METHOD_FILE_NAME}",
                    "MV": {
                        "fn"    : "getReferenceObjectMethodFolder",
                        "args"  : ["${MODULE}", "${REFERENCE_OBJECT}"]
                    },
                    "REFERENCE_OBJECT_BASE_TYPE": {
                        "fn"    : "getReferenceObjectBaseType",
                        "args"  : ["${REFERENCE_OBJECT}"]
                    }
                },
                "resources": [
                    {
                        "type": "folder",
                        "target": "${MODULE}/BO/${REFERENCE_OBJECT}/${MV}"
                    },
                    {
                        "type": "file",
                        "source": "YourModule Section/BO/Methods_or_BusinessLogic/${REFERENCE_OBJECT}.${NAME}.bl.js",
                        "target": "${MODULE}/BO/${REFERENCE_OBJECT}/${MV}/${FULL_NAME}.bl.js"
                    },
                    {
                        "type": "file",
                        "action": "update",
                        "target": "${MODULE}/BO/${REFERENCE_OBJECT}/${REFERENCE_OBJECT}.${REFERENCE_OBJECT_BASE_TYPE}.xml",
                        "tpl" : {
                            "xpath" : "//Methods[1]",
                            "data"  : "<Method name=\"${METHOD_NAME}\" />"
                        }
                    }
                ]
            },
            {
                "name": "async method",
                "questions": [
                    {
                        "name"   : "REFERENCE_OBJECT",
                        "message": "Select the reference object to which you want to add the businesslogic method.",
                        "type"   : "list",
                        "choices": {
                            "fn"        : "getReferenceObjects",
                            "args"      : ["${MODULE}"]
                        }
                    }
                ],
                "parameters": {
                    "NAME": {
                        "fn"    : "getResourceName",
                        "args"  : ["${TYPE}", "${NAME}", "${CUSTOM}"]
                    },
                    "METHOD_NAME": {
                        "fn"    : "getMethodName",
                        "args"  : ["${NAME}"]
                    },
                    "METHOD_FILE_NAME": {
                        "fn"    : "getMethodFileName",
                        "args"  : ["${NAME}"]
                    },
                    "FULL_NAME": "${REFERENCE_OBJECT}.${METHOD_FILE_NAME}",
                    "MV": {
                        "fn"    : "getReferenceObjectMethodFolder",
                        "args"  : ["${MODULE}", "${REFERENCE_OBJECT}"]
                    },
                    "REFERENCE_OBJECT_BASE_TYPE": {
                        "fn"    : "getReferenceObjectBaseType",
                        "args"  : ["${REFERENCE_OBJECT}"]
                    }
                },
                "resources": [
                    {
                        "type": "folder",
                        "target": "${MODULE}/BO/${REFERENCE_OBJECT}/${MV}"
                    },
                    {
                        "type": "file",
                        "source": "YourModule Section/BO/Methods_or_BusinessLogic/${REFERENCE_OBJECT}.${NAME}Async.bl.js",
                        "target": "${MODULE}/BO/${REFERENCE_OBJECT}/${MV}/${FULL_NAME}.bl.js"
                    },
                    {
                        "type": "file",
                        "action": "update",
                        "target": "${MODULE}/BO/${REFERENCE_OBJECT}/${REFERENCE_OBJECT}.${REFERENCE_OBJECT_BASE_TYPE}.xml",
                        "tpl" : {
                            "xpath" : "//Methods[1]",
                            "data"  : "<Method name=\"${METHOD_NAME}\" />"
                        }
                    }
                ]
            },
            {
                "name": "validation method",
                "questions": [
                    {
                        "name"   : "REFERENCE_OBJECT",
                        "message": "Select the reference object to which you want to add the validation method.",
                        "type"   : "list",
                        "choices": {
                            "fn"        : "getReferenceObjects",
                            "args"      : ["${MODULE}", "Bo"]
                        }
                    }
                ],
                "parameters": {
                    "NAME": {
                        "fn"    : "getResourceName",
                        "args"  : ["${TYPE}", "${NAME}", "${CUSTOM}"]
                    },
                    "METHOD_NAME": {
                        "fn"    : "getMethodName",
                        "args"  : ["${NAME}"]
                    },
                    "METHOD_FILE_NAME": {
                        "fn"    : "getMethodFileName",
                        "args"  : ["${NAME}"]
                    },
                    "FULL_NAME": "${REFERENCE_OBJECT}.${METHOD_FILE_NAME}",
                    "MV": {
                        "fn"    : "getReferenceObjectMethodFolder",
                        "args"  : ["${MODULE}", "${REFERENCE_OBJECT}"]
                    },
                    "REFERENCE_OBJECT_BASE_TYPE": {
                        "fn"    : "getReferenceObjectBaseType",
                        "args"  : ["${REFERENCE_OBJECT}"]
                    }
                },
                "resources": [
                    {
                        "type": "folder",
                        "target": "${MODULE}/BO/${REFERENCE_OBJECT}/${MV}"
                    },
                    {
                        "type": "file",
                        "source": "YourModule Section/BO/Methods_or_BusinessLogic/${REFERENCE_OBJECT}.${VALIDATION_NAME}.bl.js",
                        "target": "${MODULE}/BO/${REFERENCE_OBJECT}/${MV}/${FULL_NAME}.bl.js"
                    },
                    {
                        "type": "file",
                        "action": "update",
                        "target": "${MODULE}/BO/${REFERENCE_OBJECT}/${REFERENCE_OBJECT}.${REFERENCE_OBJECT_BASE_TYPE}.xml",
                        "tpl" : {
                            "xpath" : "/*",
                            "data"  : "<Validations></Validations>",
                            "checkExists": true
                        }
                    },
                    {
                        "type": "file",
                        "action": "update",
                        "target": "${MODULE}/BO/${REFERENCE_OBJECT}/${REFERENCE_OBJECT}.${REFERENCE_OBJECT_BASE_TYPE}.xml",
                        "tpl" : {
                            "xpath" : "//Validations[1]",
                            "data"  : "<Validation name=\"${METHOD_NAME}\" />"
                        }
                    }
                ]
            }
        ]
    },
    "userinterface": {
        "moduleRequired": true,
        "options": [
            {
                "name": "UI with action",
                "questions": [
                    {
                        "name"   : "REFERENCE_PROCESS_PATH",
                        "message": "Select the process to which you want to add the userinterface contract.",
                        "type"   : "list",
                        "choices": {
                            "fn"        : "getReferenceProcessFlows",
                            "args"      : ["${MODULE}", "${SOURCE_TYPE}"]
                        }
                    }
                ],
                "parameters": {
                    "NAME": {
                        "fn"    : "getResourceName",
                        "args"  : ["${TYPE}", "${NAME}", "${CUSTOM}"]
                    },
                    "SUFFIXED_NAME": {
                        "fn"    : "addSuffix",
                        "args"  : ["${NAME}", "UI"]
                    },
                    "FOLDER_PATH": {
                        "fn"    : "getParentPath",
                        "args"  : ["${REFERENCE_PROCESS_PATH}"]
                    },
                    "FILE_INITIALS": "${MODULE}_${SUFFIXED_NAME}",
                    "FULL_NAME": "${MODULE}::${SUFFIXED_NAME}",
                    "ACTION_NAME": {
                        "fn"    : "addSuffix",
                        "args"  : ["Show${NAME}", "UI"]
                    },
                    "SOURCE_TYPE": "${TYPE}"
                },
                "resources": [
                    {
                        "type": "file",
                        "source": "YourModule Section/PR/PR_Process_&_UI/${MODULE}_${NAME}/${MODULE}_${NAME}UI.userinterface.xml",
                        "target": "${FOLDER_PATH}/${FILE_INITIALS}.userinterface.xml"
                    },
                    {
                        "type": "file",
                        "action": "update",
                        "target": "${REFERENCE_PROCESS_PATH}",
                        "tpl" : {
                            "xpath" : "/Process/Body/Actions[1]",
                            "data"  : "<Action actionType=\"View\" name=\"${ACTION_NAME}\"><UIDescription>${FULL_NAME}</UIDescription><Events></Events></Action>"
                        }
                    }
                ]
            }
        ]
    },
    "process": {
        "moduleRequired": true,
        "options": [
            {
                "name": "process",
                "parameters": {
                    "NAME": {
                        "fn"    : "getResourceName",
                        "args"  : ["${TYPE}", "${NAME}", "${CUSTOM}"]
                    },
                    "SUFFIXED_NAME": {
                        "fn"    : "addSuffix",
                        "args"  : ["${NAME}", "Process"]
                    },
                    "FOLDER_NAME": "${MODULE}_${NAME}",
                    "FILE_INITIALS": "${MODULE}_${SUFFIXED_NAME}",
                    "FULL_NAME": "${MODULE}::${SUFFIXED_NAME}",
                    "ACTION_NAME": ""
                },
                "resources": [
                    {
                        "type": "folder",
                        "target": "${MODULE}/PR/${FOLDER_NAME}"
                    },
                    {
                        "type": "file",
                        "source": "YourModule Section/PR/PR_Process_&_UI/${MODULE}_${NAME}/${MODULE}_${NAME}Process.processflow.xml",
                        "target": "${MODULE}/PR/${FOLDER_NAME}/${FILE_INITIALS}.processflow.xml"
                    }
                ]
            },
            {
                "name": "process with userinterface",
                "parameters": {
                    "NAME": {
                        "fn"    : "getResourceName",
                        "args"  : ["${TYPE}", "${NAME}", "${CUSTOM}"]
                    },
                    "SUFFIXED_NAME": {
                        "fn"    : "addSuffix",
                        "args"  : ["${NAME}", "Process"]
                    },
                    "FOLDER_NAME": "${MODULE}_${NAME}",
                    "FILE_INITIALS": "${MODULE}_${SUFFIXED_NAME}",
                    "FULL_NAME": "${MODULE}::${SUFFIXED_NAME}",
                    "REFERENCE_PROCESS_PATH": "${MODULE}/PR/${FOLDER_NAME}/${FILE_INITIALS}.processflow.xml"
                },
                "resources": [
                    {
                        "type": "folder",
                        "target": "${MODULE}/PR/${FOLDER_NAME}"
                    },
                    {
                        "type": "file",
                        "source": "YourModule Section/PR/PR_Process_&_UI/${MODULE}_${NAME}/${MODULE}_${NAME}Process.processflow.xml",
                        "target": "${REFERENCE_PROCESS_PATH}"
                    }
                ],
                "includes": [
                    {
                        "name": "UI with action",
                        "parameters": {
                            "TYPE": "userinterface",
                            "MODULE": "${MODULE}",
                            "NAME": "${NAME}",
                            "REFERENCE_PROCESS_PATH": "${REFERENCE_PROCESS_PATH}",
                            "SOURCE_TYPE": "${TYPE}"
                        }
                    }
                ]
            }
        ]
    }
}
