package org.jooby.assets; import static org.junit.Assert.assertEquals; import java.util.Arrays; import org.junit.Test; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.typesafe.config.ConfigFactory; public class RollupTest { @Test public void name() throws Exception { assertEquals("rollup", new Rollup().name()); } @Test public void defaults() throws Exception { assertEquals("console.log( cube( 5 ) ); // 125\n", new Rollup() .process("/main.js", "console.log( cube( 5 ) ); // 125", ConfigFactory.empty())); } @Test public void babel() throws Exception { assertEquals("var name = \"Babel\";\n" + "console.log(\"Hello \" + name);\n", new Rollup() .set("plugins", ImmutableMap.of("babel", ImmutableMap.of("presets", Arrays.asList("es2015")))) .process("/babel.js", "var name = \"Babel\";\n" + "console.log( `Hello ${name}` );", ConfigFactory.empty())); } @Test public void babelImport() throws Exception { assertEquals("var hi = (function (message) {\n" + " console.log(\"Hello \" + message);\n" + "});\n" + "\n" + "hi(\"babel\");\n" + "", new Rollup() .set("plugins", ImmutableMap.of("babel", ImmutableMap.of("presets", Arrays.asList(Arrays.asList("es2015", ImmutableMap.of("modules", false)))))) .process("/app.js", "import hi from './lib/lib.js';\n" + "hi(\"babel\");", ConfigFactory.empty())); } @Test public void babelExcludes() throws Exception { assertEquals("var hi = (message) => {\n" + " console.log(`Hello ${message}`);\n" + "};\n" + "\n" + "hi(\"babel\");\n" + "", new Rollup() .set("plugins", ImmutableMap.of("babel", ImmutableMap.of("presets", Arrays.asList(Arrays.asList("es2015", ImmutableMap.of("modules", false))), "excludes", "/lib/*.js"))) .process("/app.js", "import hi from './lib/lib.js';\n" + "hi(\"babel\");", ConfigFactory.empty())); } @Test public void inlineSourceMap() throws Exception { assertEquals("// This function isn't used anywhere, so\n" + "// Rollup excludes it from the bundle...\n" + "\n" + "\n" + "// This function gets included\n" + "function cube ( x ) {\n" + " // rewrite this as `square( x ) * x`\n" + " // and see what happens!\n" + " return x * x * x;\n" + "}\n" + "\n" + "console.log( cube( 5 ) ); // 125\n" + "\n" + "//#sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi9tYXRocy5qcyIsIi9tYWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFRoaXMgZnVuY3Rpb24gaXNuJ3QgdXNlZCBhbnl3aGVyZSwgc29cbi8vIFJvbGx1cCBleGNsdWRlcyBpdCBmcm9tIHRoZSBidW5kbGUuLi5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmUgKCB4ICkge1xuICByZXR1cm4geCAqIHg7XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gZ2V0cyBpbmNsdWRlZFxuZXhwb3J0IGZ1bmN0aW9uIGN1YmUgKCB4ICkge1xuICAvLyByZXdyaXRlIHRoaXMgYXMgYHNxdWFyZSggeCApICogeGBcbiAgLy8gYW5kIHNlZSB3aGF0IGhhcHBlbnMhXG4gIHJldHVybiB4ICogeCAqIHg7XG59IiwiaW1wb3J0IHsgY3ViZSB9IGZyb20gJy4vbWF0aHMuanMnO1xuY29uc29sZS5sb2coIGN1YmUoIDUgKSApOyAvLyAxMjUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUEsQUFBTyxBQUVOOzs7QUFHRCxBQUFPLFNBQVMsSUFBSSxHQUFHLENBQUMsR0FBRzs7O0VBR3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7OztBQ1RuQixPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDIn0=", new Rollup() .set("generate.sourceMap", "inline") .process("/main.js", "import { cube } from './maths.js';\n" + "console.log( cube( 5 ) ); // 125", ConfigFactory.empty())); } @Test public void legacy() throws Exception { assertEquals("(function() {\n" + " var exports = window || global || this;\n" + " exports.print = function (message) {\n" + " console.log(message);\n" + " };\n" + "})();\n" + "\n" + "fn('foo');\n" + "", new Rollup() .set("plugins", ImmutableMap.of("legacy", ImmutableMap.of("/lib/legacy.js", "fn"))) .process("/main.js", "import fn from 'lib/legacy';\n" + "fn('foo');", ConfigFactory.empty())); } @Test public void namedLegacy() throws Exception { assertEquals("(function(exports) {\n" + " exports.Named = {\n" + " foo: 'foo',\n" + " bar: 'bar'\n" + " };\n" + "})(window);\n" + "\n" + "var foo = Named.foo;\n" + "\n" + "var bar = Named.bar;\n" + "\n" + "console.log(foo + bar);\n" + "", new Rollup() .set("context", "window") .set("plugins", ImmutableMap.of("legacy", ImmutableMap.of("/lib/legacy-named.js", ImmutableMap.of("Named", ImmutableList.of("foo", "bar"))))) .process("/main.js", "import {foo, bar} from 'lib/legacy-named';\n" + "console.log(foo + bar);", ConfigFactory.empty())); } @Test public void alias() throws Exception { assertEquals("var message = (message) => {\n" + " console.log(`Hello ${message}`);\n" + "};\n" + "\n" + "message('foo');\n" + "", new Rollup() .set("plugins", ImmutableMap.of("alias", ImmutableMap.of("mylib", "lib/lib.js"))) .process("/alias.js", "import message from 'mylib';\n" + "message('foo');", ConfigFactory.empty())); } @Test public void imports() throws Exception { assertEquals("// This function isn't used anywhere, so\n" + "// Rollup excludes it from the bundle...\n" + "\n" + "\n" + "// This function gets included\n" + "function cube ( x ) {\n" + " // rewrite this as `square( x ) * x`\n" + " // and see what happens!\n" + " return x * x * x;\n" + "}\n" + "\n" + "console.log( cube( 5 ) ); // 125\n" + "", new Rollup() .process("/main.js", "import { cube } from './maths.js';\n" + "console.log( cube( 5 ) ); // 125", ConfigFactory.empty())); } @Test public void importRelative() throws Exception { assertEquals("// This function isn't used anywhere, so\n" + "// Rollup excludes it from the bundle...\n" + "\n" + "\n" + "// This function gets included\n" + "function cube ( x ) {\n" + " // rewrite this as `square( x ) * x`\n" + " // and see what happens!\n" + " return x * 3;\n" + "}\n" + "\n" + "console.log( cube( 5 ) ); // 125\n" + "", new Rollup() .process("/relative/main.js", "import { cube } from './maths.js';\n" + "console.log( cube( 5 ) ); // 125", ConfigFactory.empty())); } @Test public void importNoExt() throws Exception { assertEquals("// This function isn't used anywhere, so\n" + "// Rollup excludes it from the bundle...\n" + "\n" + "\n" + "// This function gets included\n" + "function cube ( x ) {\n" + " // rewrite this as `square( x ) * x`\n" + " // and see what happens!\n" + " return x * 3;\n" + "}\n" + "\n" + "console.log( cube( 5 ) ); // 125\n" + "", new Rollup() .process("/relative/main.js", "import { cube } from 'maths';\n" + "console.log( cube( 5 ) ); // 125", ConfigFactory.empty())); } @Test public void iife() throws Exception { assertEquals("(function () {\n" + "'use strict';\n" + "\n" + "// This function isn't used anywhere, so\n" + "// Rollup excludes it from the bundle...\n" + "\n" + "\n" + "// This function gets included\n" + "function cube ( x ) {\n" + " // rewrite this as `square( x ) * x`\n" + " // and see what happens!\n" + " return x * x * x;\n" + "}\n" + "\n" + "console.log( cube( 5 ) ); // 125\n" + "\n" + "}());\n" + "", new Rollup() .set("generate.format", "iife") .process("/main.js", "import { cube } from './maths.js';\n" + "console.log( cube( 5 ) ); // 125", ConfigFactory.empty())); } @Test public void amd() throws Exception { assertEquals("define(function () { 'use strict';\n" + "\n" + "// This function isn't used anywhere, so\n" + "// Rollup excludes it from the bundle...\n" + "\n" + "\n" + "// This function gets included\n" + "function cube ( x ) {\n" + " // rewrite this as `square( x ) * x`\n" + " // and see what happens!\n" + " return x * x * x;\n" + "}\n" + "\n" + "console.log( cube( 5 ) ); // 125\n" + "\n" + "});\n" + "", new Rollup() .set("generate.format", "amd") .process("/main.js", "import { cube } from './maths.js';\n" + "console.log( cube( 5 ) ); // 125", ConfigFactory.empty())); } @Test public void dynamicNamespace() throws Exception { assertEquals("const π = 3.14159;\n" + "const e = 2.71828;\n" + "const φ = 1.61803;\n" + "const λ = 1.30357;\n" + "\n" + "var constants = Object.freeze({\n" + " π: π,\n" + " e: e,\n" + " φ: φ,\n" + " λ: λ\n" + "});\n" + "\n" + "// In some cases, you don't know which exports will\n" + "// be accessed until you actually run the code. In\n" + "// these cases, Rollup creates a namespace object\n" + "// for dynamic lookup\n" + "Object.keys( constants ).forEach( key => {\n" + " console.log( `The value of ${key} is ${constants[key]}` );\n" + "});\n" + "", new Rollup() .process("/main.js", "import * as constants from './constants';\n" + "\n" + "// In some cases, you don't know which exports will\n" + "// be accessed until you actually run the code. In\n" + "// these cases, Rollup creates a namespace object\n" + "// for dynamic lookup\n" + "Object.keys( constants ).forEach( key => {\n" + " console.log( `The value of ${key} is ${constants[key]}` );\n" + "});", ConfigFactory.empty()) .replace("\t", " ")); } @Test(expected = AssetException.class) public void fileNotFound() throws Exception { new Rollup().process("/main.js", "import * as fnf from './fnf';\n", ConfigFactory.empty()); } @Test(expected = AssetException.class) public void err() throws Exception { assertEquals("// This function gets included\n" + "function cube ( x ) {\n" + " // rewrite this as `square( x ) * x`\n" + " // and see what happens!\n" + " return x * x * x;\n" + "}\n" + "\n" + "console.log( cube( 5 ) ); // 125", new Rollup() .process("/main.js", "import { cubex } from './maths.js';\n" + "console.log( cubex( 5 ) ); // 125", ConfigFactory.empty())); } }