void apply()

in amplify-tools/amplify-tools-gradle-plugin/src/main/groovy/com/amplifyframework/tools/gradle/plugin/AmplifyTools.groovy [9:243]


    void apply(Project project) {
        // profile name can be changed in amplify-gradle-config
        def profile = 'default'
        def accessKeyId = null
        def secretAccessKey = null
        def region = null
        def envName = 'amplify'
        def syncEnabled = 'true'
        def gradleConfigFileName = 'amplify-gradle-config.json'

        project.task('createAmplifyApp') {
            def npx = 'npx'

            if (project.file(gradleConfigFileName).exists()) {
                return
            }

            if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                npx += '.cmd'
            }

            try {
                project.exec {
                    commandLine npx, 'amplify-app', '--platform', 'android'
                }
            } catch (commandLineFailure) {
                throw new Exception('Node.js is not installed. Visit https://nodejs.org/en/download/ to install it.')
            }
        }

        project.task('getConfig') {
            def inputConfigFile = project.file('amplify-gradle-config.json')
            if (inputConfigFile.isFile()) {
                def configText = inputConfigFile.text
                def jsonSlurper = new JsonSlurper()
                def configJson = jsonSlurper.parseText(configText)
                profile = configJson.profile
                accessKeyId = configJson.accessKeyId
                secretAccessKey = configJson.secretAccessKeyId
                region = configJson.region
                envName = configJson.envName
                syncEnabled = configJson.syncEnabled
            }
        }
        project.getConfig.dependsOn('createAmplifyApp')

        project.task('datastoreSync') {
            def transformConfFile = project.file('amplify/backend/api/amplifyDatasource/transform.conf.json')
            if (project.file('amplify/backend/api').exists()) {
                new File('amplify/backend/api').eachFileRecurse(groovy.io.FileType.FILES) {
                    if (it.name.endsWith('transform.conf.json')) {
                        transformConfFile = project.file(it)
                    }
                }
            }
            if (transformConfFile.isFile()) {
                def tranformConfText = transformConfFile.text
                def jsonSlurper = new JsonSlurper()
                def transformConfJson = jsonSlurper.parseText(tranformConfText)

                def resolverConfigMap = [
                        'ResolverConfig': [
                                'project': [
                                        'ConflictHandler'  : 'AUTOMERGE',
                                        'ConflictDetection': 'VERSION'
                                ]
                        ]
                ]
                if (!syncEnabled) {
                    transformConfJson.remove('ResolverConfig')
                } else if (!transformConfJson.ResolverConfig) {
                    transformConfJson << resolverConfigMap
                }
                def transformConfJsonStr = JsonOutput.toJson(transformConfJson)
                def transformConfJsonStrPretty = JsonOutput.prettyPrint(transformConfJsonStr)
                transformConfFile.write(transformConfJsonStrPretty)
            }
        }
        project.datastoreSync.dependsOn('getConfig')

        project.task('modelgen') {
            def amplify = 'amplify'

            if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                amplify += '.cmd'
            }

            doLast {
                project.exec {
                    commandLine amplify, 'codegen', 'model'
                }
            }
        }
        project.modelgen.dependsOn('datastoreSync')

        project.task('amplifyPush') {
            def awsCloudFormationConfig
            if (!accessKeyId || !secretAccessKey || !region) {
                awsCloudFormationConfig = [
                        'configLevel': 'project',
                        'useProfile' : true,
                        'profileName': profile,
                ]
            } else {
                awsCloudFormationConfig = [
                        'configLevel'    : 'project',
                        'useProfile'     : true,
                        'profileName'    : profile,
                        'accessKeyId'    : accessKeyId,
                        'secretAccessKey': secretAccessKey,
                        'region'         : region,
                ]
            }

            def amplifyConfig
            if (!envName) {
                amplifyConfig = JsonOutput.toJson([
                        'envName': 'amplify',
                ])
            } else {
                amplifyConfig = JsonOutput.toJson([
                        'envName': envName,
                ])
            }

            def providersConfig = JsonOutput.toJson([
                    'awscloudformation': awsCloudFormationConfig,
            ])

            doLast {
                def amplify = 'amplify'

                if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                    amplify += '.cmd'
                    amplifyConfig = StringEscapeUtils.escapeJavaScript(amplifyConfig)
                    providersConfig = StringEscapeUtils.escapeJavaScript(providersConfig)
                }

                if (project.file('./amplify/.config/local-env-info.json').exists()) {
                    project.exec {
                        commandLine amplify, 'push', '--yes'
                    }
                } else {
                    project.exec {
                        commandLine amplify, 'init',
                                '--amplify', amplifyConfig,
                                '--providers', providersConfig,
                                '--yes',
                                '--forcePush'
                    }
                }
            }
        }
        project.amplifyPush.dependsOn('datastoreSync')

        project.task('addModelgenToWorkspace') {
            if (project.file('./.idea/workspace.xml').exists()) {
                //Open XML file
                def xml = new XmlParser().parse('./.idea/workspace.xml')
                def RunManagerNode = xml.component.find { it.'@name' == 'RunManager' } as Node
                def configModelgenCheck = null
                if (RunManagerNode) {
                    configModelgenCheck = RunManagerNode.children().find {
                        it.'@name' == 'modelgen'
                    } as Node
                }

                if (!configModelgenCheck) {
                    // Nested nodes for modelgen run configuration
                    def configurationNode = new Node(null, 'configuration', [name: "modelgen", type: "GradleRunConfiguration", factoryName: "Gradle", nameIsGenerated: "true"])
                    def externalSystemNode = new Node(configurationNode, 'ExternalSystemSettings')
                    def executionOption = new Node(externalSystemNode, 'option', [name: "executionName"])
                    def projectPathOption = new Node(externalSystemNode, 'option', [name: "externalProjectPath", value: "\$PROJECT_DIR\$"])
                    def externalSystemIdOption = new Node(externalSystemNode, 'option', [name: "externalSystemIdString", value: "GRADLE"])
                    def scriptParametersOption = new Node(externalSystemNode, 'option', [name: "scriptParameters", value: ""])
                    def taskDescriptionsOption = new Node(externalSystemNode, 'option', [name: "taskDescriptions"])
                    def descriptionList = new Node(taskDescriptionsOption, 'list')
                    def taskNamesOption = new Node(externalSystemNode, 'option', [name: "taskNames"])
                    def nameList = new Node(taskNamesOption, 'list')
                    def modelgenOption = new Node(nameList, 'option', [value: "modelgen"])
                    def vmOption = new Node(externalSystemNode, 'option', [name: "vmOptions", value: ""])
                    def systemDebugNode = new Node(configurationNode, 'GradleScriptDebugEnabled', null, true)
                    def methodNode = new Node(configurationNode, 'method', [v: "2"])

                    RunManagerNode.append(configurationNode)

                    //Save File
                    def writer = new FileWriter('./.idea/workspace.xml')

                    //Pretty print XML
                    groovy.xml.XmlUtil.serialize(xml, writer)
                }
            }
        }

        project.task('addAmplifyPushToWorkspace') {
            if (project.file('./.idea/workspace.xml').exists()) {
                //Open file
                def xml = new XmlParser().parse('./.idea/workspace.xml')
                def RunManagerNode = xml.component.find { it.'@name' == 'RunManager' } as Node
                def configAmplifyPushCheck = null
                if (RunManagerNode) {
                    configAmplifyPushCheck = RunManagerNode.children().find {
                        it.'@name' == 'amplifyPush'
                    } as Node
                }

                if (!configAmplifyPushCheck) {
                    // Nested nodes for amplifyPush run configuration
                    def configurationNode = new Node(null, 'configuration', [name: "amplifyPush", type: "GradleRunConfiguration", factoryName: "Gradle", nameIsGenerated: "true"])
                    def externalSystemNode = new Node(configurationNode, 'ExternalSystemSettings')
                    def executionOption = new Node(externalSystemNode, 'option', [name: "executionName"])
                    def projectPathOption = new Node(externalSystemNode, 'option', [name: "externalProjectPath", value: "\$PROJECT_DIR\$"])
                    def externalSystemIdOption = new Node(externalSystemNode, 'option', [name: "externalSystemIdString", value: "GRADLE"])
                    def scriptParametersOption = new Node(externalSystemNode, 'option', [name: "scriptParameters", value: ""])
                    def taskDescriptionsOption = new Node(externalSystemNode, 'option', [name: "taskDescriptions"])
                    def descriptionList = new Node(taskDescriptionsOption, 'list')
                    def taskNamesOption = new Node(externalSystemNode, 'option', [name: "taskNames"])
                    def nameList = new Node(taskNamesOption, 'list')
                    def amplifyPushOption = new Node(nameList, 'option', [value: "amplifyPush"])
                    def vmOption = new Node(externalSystemNode, 'option', [name: "vmOptions", value: ""])
                    def systemDebugNode = new Node(configurationNode, 'GradleScriptDebugEnabled', null, true)
                    def methodNode = new Node(configurationNode, 'method', [v: "2"])

                    RunManagerNode.append(configurationNode)

                    //Save File
                    def writer = new FileWriter('./.idea/workspace.xml')

                    //Pretty print XML
                    groovy.xml.XmlUtil.serialize(xml, writer)
                }
            }
        }
    }