package org.jooby.assets; import java.io.File; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Generator { private static final String NODE = "/usr/local/bin/node"; private static final String NPM = new File(System.getProperty("user.home")).toPath() .resolve(".node").resolve("lib").resolve("node_modules").resolve("npm").resolve("bin") .resolve("npm-cli.js").toString(); private static final File workDir = new File(System.getProperty("user.dir"), "target"); static File log = new File(workDir, "log.log"); public static void main(final String[] args) throws Exception { Path cleancss = install("clean-css").resolve("lib"); Files.copy(localFile("java-fs.js"), cleancss.resolve("java-fs.js")); Files.copy(localFile("nashorn.js"), cleancss.resolve("nashorn.js")); Path output = browserify(cleancss, "nashorn.js", "--s", "CleanCSS", "-o", "output.js"); String content = com.google.common.io.Files.toString(output.toFile(), StandardCharsets.UTF_8); String fs = idx(content, "fs"); String javafs = idx(content, "./java-fs").replace("./", ""); System.out.println(javafs); content = content.replace(fs, javafs).replace("'fs'", "'java-fs'"); com.google.common.io.Files.write(content, output.toFile(), StandardCharsets.UTF_8); } private static String idx(final String input, final String name) { Pattern fsPattern = Pattern.compile("\"" + name + "\":\\d+"); Matcher matcher = fsPattern.matcher(input); matcher.find(); return matcher.group(); } public static Path browserify(final Path workdir, final Object... args) throws Exception { Path browserify = module("browserify").resolve("bin").resolve("cmd.js"); File output = new File(workDir, args[args.length - 1].toString()); args[args.length - 1] = output; String[] arguments = new String[args.length + 2]; arguments[0] = NODE; arguments[1] = browserify.toString(); StringBuilder print = new StringBuilder("browserify"); for (int i = 0; i < args.length; i++) { arguments[i + 2] = args[i].toString(); print.append(" ").append(args[i]); } System.out.println(print); ProcessBuilder pb = new ProcessBuilder(arguments) .directory(workdir.toFile()); pb.redirectErrorStream(true); pb.redirectOutput(log); Process p = pb.start(); p.waitFor(); Files.readAllLines(log.toPath()).forEach(System.out::println); return output.toPath(); } public static Path install(final String name) throws Exception { ProcessBuilder pb = new ProcessBuilder(NODE, NPM, "install", "--prefix", workDir.getAbsolutePath(), name); pb.redirectErrorStream(true); pb.redirectOutput(log); Process p = pb.start(); p.waitFor(); Files.readAllLines(log.toPath()).forEach(System.out::println); return workDir.toPath().resolve("node_modules").resolve(name); } public static Path localFile(final String name) { return new File(System.getProperty("user.dir")).toPath().resolve("src").resolve("test") .resolve("resources").resolve(name); } public static Path module(final String name) { return new File(System.getProperty("user.home")).toPath().resolve("node_modules").resolve(name); } }