|
@@ -6,6 +6,11 @@ var path = require('path'),
|
|
|
fs = require('fs'),
|
|
|
exec = require('child_process').exec;
|
|
|
|
|
|
+
|
|
|
+/**
|
|
|
+ * Map the async filter function onto array and evaluate callback, once all have finished.
|
|
|
+ * Taken from: http://howtonode.org/control-flow-part-iii
|
|
|
+ */
|
|
|
function map(array, filter, callback) {
|
|
|
var counter = array.length;
|
|
|
var new_array = [];
|
|
@@ -21,6 +26,11 @@ function map(array, filter, callback) {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+/**
|
|
|
+ * Combine several async functions and evaluate callback once all of them have finished.
|
|
|
+ * Taken from: http://howtonode.org/control-flow
|
|
|
+ */
|
|
|
function Combo(callback) {
|
|
|
this.callback = callback;
|
|
|
this.items = 0;
|
|
@@ -47,6 +57,9 @@ Combo.prototype = {
|
|
|
|
|
|
console.time('Compile Time');
|
|
|
|
|
|
+/**
|
|
|
+ * Stores default values.
|
|
|
+ */
|
|
|
var defaults = function() {
|
|
|
// Get Amber root directory from the location of this script so that
|
|
|
// we can find the st and js directories etc.
|
|
@@ -83,6 +96,9 @@ var defaults = function() {
|
|
|
}();
|
|
|
|
|
|
|
|
|
+/**
|
|
|
+ * Main program flow starts here.
|
|
|
+ */
|
|
|
if (3 > process.argv.length) {
|
|
|
usage();
|
|
|
} else {
|
|
@@ -90,6 +106,10 @@ if (3 > process.argv.length) {
|
|
|
}
|
|
|
|
|
|
|
|
|
+/**
|
|
|
+ * Process given program options and update defaults values.
|
|
|
+ * Followed by check_for_closure_compiler() and then collect_files().
|
|
|
+ */
|
|
|
function handle_options(optionsArray) {
|
|
|
var stFiles = [];
|
|
|
var jsFiles = [];
|
|
@@ -170,7 +190,7 @@ function handle_options(optionsArray) {
|
|
|
|
|
|
|
|
|
/**
|
|
|
- * print usage options and exit
|
|
|
+ * Print usage options and exit.
|
|
|
*/
|
|
|
function usage() {
|
|
|
console.log('Usage: $0 [-l lib1,lib2...] [-i init_file] [-m main_class] [-M main_file]');
|
|
@@ -324,10 +344,11 @@ function always_resolve(callback) {
|
|
|
}
|
|
|
|
|
|
|
|
|
-// --------------------------------------------------
|
|
|
-// Collect libraries and Smalltalk files looking
|
|
|
-// both locally and in $AMBER/js and $AMBER/st
|
|
|
-// --------------------------------------------------
|
|
|
+/**
|
|
|
+ * Collect libraries and Smalltalk files looking
|
|
|
+ * both locally and in $AMBER/js and $AMBER/st.
|
|
|
+ * Followed by resolve_libraries().
|
|
|
+ */
|
|
|
function collect_files(stFiles, jsFiles) {
|
|
|
var collected_files = new Combo(function() {
|
|
|
resolve_libraries();
|
|
@@ -337,6 +358,11 @@ function collect_files(stFiles, jsFiles) {
|
|
|
}
|
|
|
|
|
|
|
|
|
+/**
|
|
|
+ * Resolve st files given by stFiles and add them to defaults.compile.
|
|
|
+ * Respective categories get added to defaults.compile_categories.
|
|
|
+ * callback is evaluated afterwards.
|
|
|
+ */
|
|
|
function collect_st_files(stFiles, callback) {
|
|
|
var collected_st_files = new Combo(function() {
|
|
|
Array.prototype.slice.call(arguments).forEach(function(data) {
|
|
@@ -375,6 +401,10 @@ function collect_st_files(stFiles, callback) {
|
|
|
}
|
|
|
|
|
|
|
|
|
+/**
|
|
|
+ * Resolve js files given by jsFiles and add them to defaults.libraries.
|
|
|
+ * callback is evaluated afterwards.
|
|
|
+ */
|
|
|
function collect_js_files(jsFiles, callback) {
|
|
|
var collected_js_files = new Combo(function() {
|
|
|
Array.prototype.slice.call(arguments).forEach(function(file) {
|
|
@@ -393,6 +423,10 @@ function collect_js_files(jsFiles, callback) {
|
|
|
}
|
|
|
|
|
|
|
|
|
+/**
|
|
|
+ * Resolve kernel and compiler files.
|
|
|
+ * Followed by resolve_init().
|
|
|
+ */
|
|
|
function resolve_libraries() {
|
|
|
// Resolve libraries listed in defaults.base
|
|
|
var all_resolved = new Combo(function(resolved_library_files, resolved_compiler_files) {
|
|
@@ -403,6 +437,10 @@ function resolve_libraries() {
|
|
|
}
|
|
|
|
|
|
|
|
|
+/**
|
|
|
+ * Resolve .js files needed by kernel
|
|
|
+ * callback is evaluated afterwards.
|
|
|
+ */
|
|
|
function resolve_kernel(callback) {
|
|
|
var kernel_files = defaults.base.concat(defaults.load);
|
|
|
var kernel_resolved = new Combo(function() {
|
|
@@ -421,6 +459,11 @@ function resolve_kernel(callback) {
|
|
|
always_resolve(kernel_resolved.add());
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+/**
|
|
|
+ * Resolve .js files needed by compiler.
|
|
|
+ * callback is evaluated afterwards with resolved files as argument.
|
|
|
+ */
|
|
|
function resolve_compiler(callback) {
|
|
|
// Resolve compiler libraries
|
|
|
var compiler_files = defaults.compiler_libraries.concat(defaults.load);
|
|
@@ -440,6 +483,11 @@ function resolve_compiler(callback) {
|
|
|
always_resolve(compiler_resolved.add());
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+/**
|
|
|
+ * Resolves default.init and adds it to compilerFiles.
|
|
|
+ * Followed by create_compiler().
|
|
|
+ */
|
|
|
function resolve_init(compilerFiles) {
|
|
|
// check and add init.js
|
|
|
var initFile = defaults.init;
|
|
@@ -453,6 +501,11 @@ function resolve_init(compilerFiles) {
|
|
|
}
|
|
|
|
|
|
|
|
|
+/**
|
|
|
+ * Read all .js files needed by compiler and eval() them.
|
|
|
+ * The finished Compiler gets stored in defaults.smalltalk.
|
|
|
+ * Followed by compile().
|
|
|
+ */
|
|
|
function create_compiler(compilerFilesArray) {
|
|
|
var compiler_files = new Combo(function() {
|
|
|
var content = '(function() {';
|
|
@@ -474,6 +527,10 @@ function create_compiler(compilerFilesArray) {
|
|
|
};
|
|
|
|
|
|
|
|
|
+/**
|
|
|
+ * Compile all given .st files by importing them.
|
|
|
+ * Followed by category_export().
|
|
|
+ */
|
|
|
function compile() {
|
|
|
console.log('Compiling collected .st files')
|
|
|
// import .st files
|
|
@@ -499,6 +556,10 @@ function compile() {
|
|
|
}
|
|
|
|
|
|
|
|
|
+/**
|
|
|
+ * Export compiled categories to JavaScript files.
|
|
|
+ * Followed by verify().
|
|
|
+ */
|
|
|
function category_export() {
|
|
|
// export categories as .js
|
|
|
map(defaults.compiled_categories, function(category, callback) {
|
|
@@ -520,6 +581,10 @@ function category_export() {
|
|
|
}
|
|
|
|
|
|
|
|
|
+/**
|
|
|
+ * Verify if all .st files have been compiled.
|
|
|
+ * Followed by compose_js_files() and optimize().
|
|
|
+ */
|
|
|
function verify() {
|
|
|
console.log('Verifying if all .st files were compiled');
|
|
|
map(defaults.compiled, function(file, callback) {
|
|
@@ -530,15 +595,21 @@ function verify() {
|
|
|
throw(new Error('Compilation failed of: ' + file));
|
|
|
});
|
|
|
}, function(err, result) {
|
|
|
- if (undefined !== defaults.program) {
|
|
|
- compose_js_files();
|
|
|
- }
|
|
|
+ compose_js_files();
|
|
|
optimize();
|
|
|
});
|
|
|
}
|
|
|
|
|
|
|
|
|
+/**
|
|
|
+ * Synchronous function.
|
|
|
+ * Concatenates compiled JavaScript files into one file in the correct order.
|
|
|
+ * The name of the produced file is given by defaults.program (set by the last commandline option).
|
|
|
+ */
|
|
|
function compose_js_files() {
|
|
|
+ if (undefined !== defaults.program) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
var program_files = [];
|
|
|
|
|
|
if (undefined !== defaults.libraries) {
|
|
@@ -586,24 +657,37 @@ function compose_js_files() {
|
|
|
}
|
|
|
|
|
|
|
|
|
+/**
|
|
|
+ * Optimize created JavaScript files with Google Closure compiler depending
|
|
|
+ * on the flags: defaults.closure_parts, defaults.closure_full.
|
|
|
+ */
|
|
|
function optimize() {
|
|
|
+ var optimization_done = new Combo(function() {
|
|
|
+ console.timeEnd('Compile Time');
|
|
|
+ });
|
|
|
+
|
|
|
if (defaults.closure_parts) {
|
|
|
console.log('Compiling all js files using Google closure compiler.');
|
|
|
var allJsFiles = defaults.compiled.concat(defaults.libraries);
|
|
|
allJsFiles.forEach(function(file) {
|
|
|
var minifiedName = path.basename(file, '.js') + '.min.js';
|
|
|
- closure_compile(file, minifiedName);
|
|
|
+ closure_compile(file, minifiedName, optimization_done.add());
|
|
|
});
|
|
|
}
|
|
|
if (defaults.closure_full) {
|
|
|
console.log('Compiling ' + defaults.program + '.js file using Google closure compiler.');
|
|
|
- closure_compile(defaults.program + '.js', defaults.program + '.min.js');
|
|
|
+ closure_compile(defaults.program + '.js', defaults.program + '.min.js', optimization_done.add());
|
|
|
}
|
|
|
- console.timeEnd('Compile Time');
|
|
|
+
|
|
|
+ always_resolve(optimization_done.add());
|
|
|
}
|
|
|
|
|
|
|
|
|
-function closure_compile(sourceFile, minifiedFile) {
|
|
|
+/**
|
|
|
+ * Compile sourceFile into minifiedFile with Google Closure compiler.
|
|
|
+ * callback gets executed once finished.
|
|
|
+ */
|
|
|
+function closure_compile(sourceFile, minifiedFile, callback) {
|
|
|
// exec is asynchronous
|
|
|
exec(
|
|
|
'java -jar ' +
|
|
@@ -618,6 +702,7 @@ function closure_compile(sourceFile, minifiedFile) {
|
|
|
console.log(stdout);
|
|
|
console.log(' '+ minifiedFile + ' built.');
|
|
|
}
|
|
|
+ callback();
|
|
|
}
|
|
|
);
|
|
|
}
|