Grooscript in Action SpringOne2gx 2015

49
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ SPRINGONE2GX WASHINGTON, DC Grooscript in Action By Jorge Franco Leza @jfrancoleza

Transcript of Grooscript in Action SpringOne2gx 2015

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

SPRINGONE2GXWASHINGTON, DC

Grooscript in ActionBy Jorge Franco Leza

@jfrancoleza

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

About me

2

[email protected]

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Thank you!

3

3 years since first commit

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Agenda

• Introduction to grooscript

• Convert your groovy code to javascript

• Support

• PhantomJs and tools

• Gradle plugin

• Demo

• Grails plugin

• Working with javascript

• Require.js

• Future

4

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Introduction to grooscript

• Library ( jar)

• Groovy 2.0+ to javascript ECMA 5

• Apache 2 license

• Source code http://github.com/chiquitinxx/grooscript

• Converted code needs grooscript.js to run

• Tools around: gradle and grails plugins, npm and bower packages

• Documentation http://grooscript.org/doc.html

• Demos http://github.com/chiquitinxx/grooscript-demos

• Try live! http://grooscript.org/conversions.html

5

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Why grooscript?

• You have all java / groovy tools to create code in the client side.

• Javascript is fast.

• Enjoy javascript! Create your own magic.

• Don’t repeat code in two languages, isomorphic code.

• Use groovy templates everywhere.

• Single development environment.

• Stop learning “to javascript” things.

• Static type if you want to.

• But… mainly… because it is…

6

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Groovy

7

Readable

Concise

Expressive

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

ASTS

8

@Component class Counter implements Colorable { Integer number void init() { number = null } void render() { div(class: "widget bg-${randomColor()}") { if (number) { p 'Number of books' em number.toString() a(href:"#", class:"button", onclick: 'bookPresenter.showBooks()') { yield 'Show' } } else { p 'Counting books...' } } } }

AST’sGetter / Setters

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

List and maps

9

def start() { def countries = loadCountries(). findAll { it.population > 100000}. unique { it.alpha3Code } countries.each { country -> customSigma.addNode id: country.alpha3Code,

x: country.latlng[1], color: ‘purple’ } countries.each { country -> country.borders?.each { border -> this.&hello(border) } } updateNumberCountries countries.size() customSigma.refresh()}

Lists and maps

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

DSL's

10

server { get('/') { render Templates.applyTemplate('index.gtpl') } on('login') { data, socket -> if (data.name && !socket.login) { socket.login = data.name socket.emit 'loginok', [name: data.name] socket.broadcast.emit 'loginok', [name: data.name] } } on('msg') { data, socket -> if (data.msg && socket.login) { socket.broadcast.emit 'msg', [msg: data.msg] } } on('disconnect') { socket -> if (socket.login) { socket.broadcast.emit 'off', [name: socket.login] } }}.start()

Dsl’s

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Metaprogramming

11

class Hello { def methodMissing(String name, args) { println "Hello ${name}!" }}

def hello = new Hello()hello.Groovy()hello.Javascript()hello.grooscript()

Metaprogramming

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Functional

12

def plus2 = { it + 2 }def times3 = { it * 3 }

def times3plus2 = plus2 << times3

assert times3plus2(3) == 11

def plus2times3 = times3 << plus2

assert plus2times3.curry(5)() == 21

Functional

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Convert your groovy code to javascript

13

@Grab('org.grooscript:grooscript:1.2.0')

import org.grooscript.GrooScript

String result = GrooScript.convert ''' def sayHello = { println "Hello ${it}!" } ['Groovy','JavaScript','GrooScript'].each sayHello'''

new File(‘out.js’) << result

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Convert your groovy code to javascript

14

Let’s see it in action

http://grooscript.org/doc.html

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Conversion options

• classpath

• customization { -> ast(TypeChecked)}

• initialText, finalText

• recursive

• mainContextScope [''$'', ‘'window'', ''myFunction'']

• addGsLib

• requireJsModule

• consoleInfo

• includeDependencies

15

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Support

• Groovy core

• Classes, numbers, lists, maps, sets, date, ranges, closures, (g)strings, operators, groovy truth, Expando, categories, traits, beans, switch, metaprogramming, enum, equals, multiple assignment, optional params, default constructor, pointer methods, operator overload, regular expressions, @Delegate, @Category, …

• Dsl’s. (@DelegatesTo)

• Ast’s at semantic analysis phase.

• Packaging in js with require.js.

• Be groovier!

16

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Not supported

• Not groovy-core ( json, builders, I/O, …)

• Java / Groovy Types (Thread, LinkedHashMap, Stack, Optional, …)

• Super except constructors.

• Methods with same name (overload), classes with same name.

• Java 8 stuff not supported by groovy

• Module extensions, complex metaprogramming, groovy AST’s after Semantic Phase

17

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Annotations

18

import org.grooscript.asts.GsNotConvert

@GsNotConvertclass ClassNotConvert { def a}

class A {@GsNotConvertdef methodNoConvert() {

‘No!’}

def hello() {println ‘Hello!’

}}

import org.grooscript.asts.GsNative

class Data {@GsNativevoid saySomething(String smt) {/*

console.log(smt);*/}

@GsNativedef five() {/*

return 5;*/ 1 + 1 + 3}

}

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

PhantomJs test

19

@GrabConfig(systemClassLoader = true)@Grab(‘org.grooscript:grooscript:1.2.0’)

import org.grooscript.asts.PhantomJsTest

//Need phantomjs installedSystem.setProperty(‘PHANTOMJS_HOME’, ‘path/to/phantomjs’)

@PhantomJsTest(url = 'http://beta.groovy-lang.org/') void testCountLinks() { def links = $('a') assert links.size() > 40, "Number of links: ${links.size()}" links.toArray().collect { it.toString() }.each { link -> println link }}

testCountLinks()

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Javascript libs

• grooscript.js (87 kb) (8 kb minified and gziped)

• grooscript.min.js (33 kb)

• grooscript-tools.js (14 kb) (GQuery, HtmlBuilder, Observable)

20

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

HtmlBuilder

21

given:def result = HtmlBuilder.build { body { ul(class: 'list', id: 'mainList') { 2.times { number -> li number + 'Hello!' } } }}

expect:result == "<body><ul class='list' id=‘mainList'><li>0Hello!</li><li>1Hello!</li></ul></body>"

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

GQuery

22

import org.grooscript.jquery.GQueryImpl

def result = new Result()def gQuery = new GQueryImpl()gQuery.onReady { gQuery.doRemoteCall(“${JSON_ADDRESS}”, 'GET', null, { res -> gQuery('.result').html('OK') result = res }, { result = 'FAIL!' }, Result)}

https://github.com/chiquitinxx/grooscript/blob/master/src/main/groovy/org/grooscript/jquery/GQuery.groovy

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Observable

23

given:def result = []Observable.from([1, 5, 9, 12, 3, 8]). filter { it < 5 }. map { 'H' * it }. subscribe { event -> result << event }

expect:result == ['H', 'HHH']

https://github.com/chiquitinxx/grooscript/blob/master/src/test/groovy/org/grooscript/rx/ObservableSpec.groovy

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Gradle plugin

• Starting guide http://grooscript.org/starting_gradle.html

• Listen to changes and does conversions in background.

• Groovy templates in the client side.

• Can use with your grails 3+ application.

• Create require.js modules.

• Notification of changes using websockets.

• Thread tasks can block execution.

• Info about tasks http://grooscript.org/gradle/tasks.html

24

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

task convert

Convert groovy files to javascript. Can add conversion options.

25

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

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/ 26

task convertThread

grooscript { source = [‘src/main/groovy/presenters'] destination = 'js' classpath = ['src/groovy'] initialText = '//Converted file' recursive = true

blockExecution = true}

Listen to changes in groovy files, and convert them to javascript when modified. Can block gradle execution.

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/ 27

task initStaticWeb

"## build.gradle$## src $## main "## groovy % $## Presenter.groovy $## webapp "## index.html $## js "## app $## lib "## grooscript-tools.js "## grooscript.min.js $## jquery.min.js

Creates a static web project to starting play with grooscript.

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/ 28

task templatesJs

class Templates {

static Map<String, Closure> templates

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

Convert groovy templates to a javascript file.

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/ 29

task templatesThread

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

Listen to changes in groovy templates and generate a new javascript template file when something changes. Can block gradle execution.

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/ 30

task spyChanges

spy { files = ['Templates.js'] onChanges = { list ->

springWebsocketTo 'http://localhost:8080/demo' data 'templates' onChannel '/app/reload'

}}

Listen to file changes and execute groovy code when files change. Can send a message using websockets.

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/ 31

task requireJs

requireJs { sourceFile = 'src/main/groovy/MyApp.groovy' destinationFolder = 'src/main/resources/web/js/app'}

Convert groovy file to require.js javascript module. Also all dependencies are converted.

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

task requireJsThread

32

requireJs { sourceFile = ‘starting/InitialFile.groovy' classpath = ['src/main/groovy'] destinationFolder = ‘js/app'

blockExecution = true}

Listen to changes in groovy file or any dependency file, and generate require.js javascript modules when files change. Also can block execution.

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/ 33

Demo gradle books

More action

https://github.com/chiquitinxx/books-demo

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Grails plugin

• A grails 2 version, 0.8 https://grails.org/plugin/grooscript.

• Grails 3 version, version 1.1.2, documentation http://grooscript.org/grails3-plugin.

• Adding tags for your gsp’s.

• Converting files with gradle plugin in grails 3+.

• Using your domain classes in your gsp’s. *experimental*

• Uses asset pipeline and cache plugins, also jquery for some tags.

• Requires <asset:javascript src="grooscript-grails.js"/>

• Events in your gsp's with groovy.

• Websockets support using spring websockets.

• Templating in your gsp’s with HtmlBuilder.

34

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

grooscript:code

35

<grooscript:code> [‘groovy’, ‘javascript’].each {

println “Hello $it” }</grooscript:code>

<asset:script>… js code …

</asset:script>

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

grooscript:template

36

<grooscript:template onLoad=“false" functionName=“refreshList"> ul { data.each { book -> li { p 'Id: ' + book.id + ' Name: ' + book.title } } }</grooscript:template>

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

websockets

37

<grooscript:initSpringWebsocket> println 'Connected! Websocket is up!’ GrooscriptGrails.sendWebsocketMessage("/app/hello", “Hello!")</grooscript:initSpringWebsocket><grooscript:onServerEvent path="/topic/books" type="Book"> data.each { book -> $("#helloDiv").append '<p>'+book.coolFormat()+'</p>' }</grooscript:onServerEvent>

Use spring websockets in your gsp’s. Have to include client libraries.

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

events

38

<grooscript:code> $(document).ready { def eventData = 'Application started.' gsEvents.sendMessage('newEvent', eventData) gsEvents.onEvent('delete', { book -> $('#deleteEvent').html 'Deleted ' + book.title }) }</grooscript:code><grooscript:onEvent name="newEvent"> console.log event</grooscript:onEvent>

Manage events in the client using groovy.

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

grooscript:remoteModel

39

<grooscript:remoteModel domainClass="Book"/><grooscript:code> import rest.Book

Book.list().then { list -> $('#bookList').html '' list.each addBook }</grooscript:code>

Use your domain classes from your gsp’s. Domain classes annotated with @Resource, using json.

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Demo grails 3

40

Final action

https://github.com/chiquitinxx/circles

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Working with javascript

41

class MyClass {} function MyClass() { … }

var myClass = MyClass();// NO var myClass = new MyClass();var myClass = MyClass({prop1: ‘value’, prop2: 12 });myClass.method();// NO myClass.metaprogrammingMethod();myClass.method(numberOrStringOrList);// beware maps! myClass.method({ a: 1, b: 2 });

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Combine both worlds

42

import static org.grooscript.GrooScript.toJavascriptimport static org.grooscript.GrooScript.toGroovy

def map = [x: 1, y: 2]

//point is a javascript objectpoint.init(map) //[BAD] Passing a groovy object to javascript, can failpoint.init(toJavascript(map)) //[GOOD] You now are passing {x: 1, y: 2}

//point has a method info() that returns a javascript objectdef badData = point.info() //[BAD] You will have a 'javascript' objectdef goodData = toGroovy(point.info()) //[GOOD] goodData as a 'groovy' object

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Tips

• Keep your groovy code tested.

• If you use @GsNative, keep that code in isolated classes, that can be easy to mock them.

• Don’t abuse @GsNative, is untested code.

• You can activate debug console info in javascript with gs.consoleInfo = true;

• You can test dom manipulation with jsoup.

• Try to stay functional, don’t abuse ‘this’ or variables from other contexts.

• Curry functions to inject variables rather than expecting them to be available after callbacks hell.

43

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Require.js

• Javascript file and module loader.

• Can be used in browser, rhino and Node.js environments.

• Optimization using google closure compiler.

44

requirejs.config({ baseUrl: 'jsModules', paths: { lib: 'js/lib' }});

requirejs(['lib/grooscript.min'], function() { requirejs(['Initial']);});

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Require.js

45

import org.grooscript.GrooScript

Map conversionOptions = [classpath: 'src/main/groovy']GrooScript.convertRequireJs('src/main/groovy/Initial.groovy', 'jsModules', conversionOptions)

define(function() { function Initial() { … } return Initial;});

class Initial {}

src/main/groovy/Initial.groovy jsModules/Initial.js

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Require.js

46

define(['lib/data'], function (data) {

function Require() { //.. gSobject.data = data; //..

return gSobject; };

return Require;});

package files

import org.grooscript.asts.RequireJsModule

class Require { @RequireJsModule(path = 'lib/data') def data}

src/main/groovy/files/Require.groovy jsModules/files/Require.js

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Future

47

ECMAScript 2015

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/ 48

Q & A

Unless otherwise indicated, these s l ides are © 2013-2015 Pivotal Software, Inc. and l icensed under a Creat ive Commons Attr ibut ion-NonCommercial l icense: ht tp: / /creat ivecommons.org/ l icenses/by-nc/3.0/

Thank you!

49

Waiting for your feedback and questions from now to Thursday