This plugin convert groovy files to javascript, convert groovy templates to a .js file, generate a little web static project to start with grooscript, and listen for changes in files. To do this tasks, uses grooscript, a library that converts groovy code to javascript. In folders or files options, you can’t use wildcards as * or **, just put relative path from folder where build is.

Convert files

There are 2 tasks:

  • convert (org.grooscript.gradle.ConvertTask) to convert groovy files to javascript

  • convertThread (org.grooscript.gradle.ConvertThreadTask) listen changes in groovy files and convert them to javascript

There is an extension to configure this tasks

package org.grooscript.gradle

class ConversionExtension {
    def source = ['src/main/groovy']
    String destination = 'src/main/webapp/js/app'
    List<String> classpath = ['src/main/groovy']
    Closure customization
    String initialText
    String finalText
    boolean recursive = false
    List<String> mainContextScope
    String addGsLib
    boolean includeDependencies = false
    boolean consoleInfo = false
    boolean nashornConsole = false
}

//Example:
grooscript {
    source = ['src/main/groovy']
    destination = 'js'
}

If you execute >gradle convert, will convert groovy and java files in src/main/groovy to .js files, and will be saved in ./js folder.

You will use convertThread task when other task keeps gradle up, like a web application server.

If you execute convertThread task with blockExecution=true option, gradle will be running forever doing conversions if files in src/main/groovy change.

Apart from source and destination, mandatory properties, you can define conversion options:

grooscript {
    source = ['src/main/groovy/presenters'] //Sources to be converted
    destination = 'js' //Target directory or js file
    classpath = ['src/groovy'] //Needed classpath to compile source files
    customization = null //Customization in files, for example { -> ast(groovy.transform.TypeChecked) }
    initialText = '//Grooscript converted file'
    initialText = '//End converted file'
    recursive = true
    mainContextScope = ['$'] //Variables available in main scope
    addGsLib = 'grooscript, grooscript-tools' //Include libs (comma separated) from grooscript ('grooscript', 'grooscript.min', 'grooscript-tools' or 'jquery.min')
    nashornConsole = true //Use 'print' and not 'console.log'
}

Also you can create distinct conversion tasks to use in your gradle build:

task convertCountries(type: org.grooscript.gradle.ConvertTask) {
    source = ['src/main/groovy/countries']
    mainContextScope = ['Snap']
    destination = 'src/main/webapp/js'
}

task convertChatServer(type: org.grooscript.gradle.ConvertTask) {
    source = ['src/main/groovy/chat/NodeServer.groovy', 'src/main/groovy/startServer.groovy']
    destination = 'js/allTogether.js'
}

build.dependsOn convertCountries, convertChatServer

Create static project

There is 1 tasks:

  • initStaticWeb that will create files and folder to generate a little static web project to start with grooscript.

Read this guide

Convert groovy templates

There are 2 tasks:

  • templatesJs (org.grooscript.gradle.TemplatesTask) to convert groovy templates to a .js file

  • templatesThread (org.grooscript.gradle.TemplatesThreadTask) listen changes in groovy templates, and generate .js file if some file changes

There is an extension to configure this task:

package org.grooscript.gradle

class TemplatesExtension {
    String templatesPath = 'src/main/webapp/templates'
    List<String> templates
    String destinationFile = 'src/main/webapp/js/lib/Templates.js'
    List<String> classpath = ['src/main/groovy']
    String customTypeChecker
}

//Example:
templates {
    templatesPath = 'templates'
    templates = ['main.gtpl', 'little/small.tpl'] //Files from templatesPath
    destinationFile = 'js/Templates.js'
    classpath = ['src/groovy']
    customTypeChecker = 'aCustomTypeCheckerFile.groovy'
}

You can type check your templates with custom type checker, more info here. Example:

import org.codehaus.groovy.ast.expr.MethodCallExpression

beforeMethodCall { call ->
    if (call instanceof MethodCallExpression) {
        //Not allowing use p tag in templates
        handled = (call.method.text != 'p')
    }
}

The support in convert templates is a bit limited, you can’t use code out of the template’s engine. You can’t use imports, or insert data from other files. The destination js is the next class, converted, with templates map filled with all converted templates:

package org.grooscript.templates

class Templates {

    static Map<String, Closure> templates

    static String applyTemplate(String name, model = [:]) {
        Closure cl = templates[name]
        cl.delegate = model
        cl(model)
    }
}

The templatesThread task, has a parameter blockExecution, by default false. If you set to true, the task will continue forever, blocking execution.

Spy file changes

There is 1 tasks:

  • spyChanges (org.grooscript.gradle.ChangesTask) listen to changes on files

There is an extension to configure this task:

package org.grooscript.gradle

class ChangesExtension {
    List<String> files
    Closure onChanges
}

//Example:
spy {
    files = ['src/main/webapp/static/css/app.css', 'src/main/webapp/static/js/app']
    onChanges = { list ->
        println 'Changes!! ' + list
    }
}

I have introduced spring websockets support in onChanges closure. Now you can send a groovy object to a spring websocket server that uses Stomp protocol. So you can notify by websockets changes on files, in this example I want to send to server a reload message.

spy {
    files = ['Templates.js']
    onChanges = { list ->
        springWebsocketTo 'http://localhost:8080/demo' data 'templates' onChannel '/app/reload'
    }
}

Sync grooscript libraries

There is 1 tasks:

  • syncGsLibs (org.grooscript.gradle.SyncGrooscriptLibsTask) sync grooscript js libs with actual version

With this tasks, all your grooscript libraries in the project ('grooscript.js', 'grooscript.min.js', 'grooscript-tools.js') will be replaced by the libs that comes in the grooscript version of the current plugin.

Require.js tasks

There are 2 tasks:

  • requireJs (org.grooscript.gradle.RequireJsTask) to generate require.js modules from a groovy file

  • requireJsThread (org.grooscript.gradle.RequireJsThreadTask) to listen changes in groovy files to generate require.js modules

There is an extension to configure this task:

package org.grooscript.gradle

class RequireJsExtension {
    String sourceFile
    List<String> classpath = ['src/main/groovy']
    String destinationFolder
    Closure customization
    String initialText
    String finalText
    List<String> mainContextScope
    boolean nashornConsole = false
}

Example:
requireJs {
    sourceFile = 'src/main/groovy/MyApp.groovy'
    // classpath by default is ['src/main/groovy']
    destinationFolder = 'src/main/resources/web/js/app'
}

The requireJsThread task, has a parameter blockExecution, by default false. If you set to true, the task will continue forever, blocking execution.