| 
					
				 | 
			
			
				@@ -133,24 +133,23 @@ AmberC.prototype.main = function(configuration, finished_callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	configuration.compiler_libraries = this.compiler_libraries; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	configuration.amber_dir = this.amber_dir; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	function logError(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		console.log(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		finished_callback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	check_configuration(configuration) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	.then(collect_st_files, logError) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	.then(collect_js_files, logError) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	.then(resolve_kernel, logError) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	.then(create_compiler, logError) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	.then(compile, logError) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	.then(category_export, logError) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	.then(verify, logError) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	.then(compose_js_files, logError) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	.then(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		console.log = console.ambercLog; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(collect_st_files) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(collect_js_files) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(resolve_kernel) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(create_compiler) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(compile) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(category_export) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(verify) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(compose_js_files) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		console.timeEnd('Compile Time'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		finished_callback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, function(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		console.error(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		console.log = console.ambercLog; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		finished_callback && finished_callback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -238,19 +237,16 @@ function resolve_file(filename, searchDirectories) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * Returns a Promise which resolves into the configuration object. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function collect_st_files(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			configuration.stFiles.map(function(stFile) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return resolve_st(stFile, configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		).then(function(data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			configuration.compile = configuration.compile.concat(data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			resolve(configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}, function(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			reject(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		configuration.stFiles.map(function(stFile) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return resolve_st(stFile, configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(function(data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		configuration.compile = configuration.compile.concat(data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return configuration; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -258,19 +254,16 @@ function collect_st_files(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * Returns a Promise which resolves into the configuration object. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function collect_js_files(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			configuration.jsFiles.map(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return resolve_js(file, configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		).then(function(data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			configuration.libraries = configuration.libraries.concat(data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			resolve(configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}, function(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			reject(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		configuration.jsFiles.map(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return resolve_js(file, configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(function(data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		configuration.libraries = configuration.libraries.concat(data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return configuration; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -279,21 +272,18 @@ function collect_js_files(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function resolve_kernel(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var kernel_files = configuration.kernel_libraries.concat(configuration.load); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			kernel_files.map(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return resolve_js(file, configuration, resolve); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		).then(function(data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			// boot.js and Kernel files need to be used first 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			// otherwise the global smalltalk object is undefined 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			configuration.libraries = data.concat(configuration.libraries); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			resolve(configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}, function(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			reject(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		kernel_files.map(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return resolve_js(file, configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(function(data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// boot.js and Kernel files need to be used first 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// otherwise the global smalltalk object is undefined 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		configuration.libraries = data.concat(configuration.libraries); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return configuration; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -302,66 +292,59 @@ function resolve_kernel(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * Returns a Promise object which resolves into the configuration object. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function create_compiler(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		var compiler_files = configuration.compiler_libraries.concat(configuration.load); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			compiler_files.map(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return resolve_js(file, configuration, resolve); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var compiler_files = configuration.compiler_libraries.concat(configuration.load); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		compiler_files.map(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return resolve_js(file, configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(function(compilerFilesArray) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			compilerFilesArray.map(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					console.log('Loading file: ' + file); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					fs.readFile(file, function(err, data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						if (err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							reject(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							resolve(data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		.then(function(compilerFilesArray) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				compilerFilesArray.map(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						console.log('Loading file: ' + file); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						fs.readFile(file, function(err, data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							if (err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-								reject(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-								resolve(data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}).then(function(files) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			var builder = createConcatenator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			builder.add('(function() {'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			builder.start(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			files.forEach(function(data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				// data is an array where index 0 is the error code and index 1 contains the data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				builder.add(data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				// matches and returns the "module_id" string in the AMD definition: define("module_id", ...) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				var match = ('' + data).match(/^define\("([^"]*)"/); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if (match) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					builder.addId(match[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			// store the generated smalltalk env in configuration.smalltalk 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			builder.finish('configuration.smalltalk = smalltalk;'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			builder.add('})();'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				eval(builder.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} catch (error){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				console.error(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(function(files) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var builder = createConcatenator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		builder.add('(function() {'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		builder.start(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		files.forEach(function(data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// data is an array where index 0 is the error code and index 1 contains the data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			builder.add(data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// matches and returns the "module_id" string in the AMD definition: define("module_id", ...) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var match = ('' + data).match(/^define\("([^"]*)"/); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (match) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				builder.addId(match[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// store the generated smalltalk env in configuration.smalltalk 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		builder.finish('configuration.smalltalk = smalltalk;'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		builder.add('})();'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			console.log('Compiler loaded'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		eval(builder.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			configuration.smalltalk.ErrorHandler._register_(configuration.smalltalk.RethrowErrorHandler._new()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		console.log('Compiler loaded'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if(0 !== configuration.jsGlobals.length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				var jsGlobalVariables = configuration.smalltalk.globalJsVariables; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				jsGlobalVariables.push.apply(jsGlobalVariables, configuration.jsGlobals); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		configuration.smalltalk.ErrorHandler._register_(configuration.smalltalk.RethrowErrorHandler._new()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			resolve(configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}, function(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			reject(Error('Error creating compiler')); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(0 !== configuration.jsGlobals.length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var jsGlobalVariables = configuration.smalltalk.globalJsVariables; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			jsGlobalVariables.push.apply(jsGlobalVariables, configuration.jsGlobals); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return configuration; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -371,49 +354,47 @@ function create_compiler(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function compile(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// return function which does the actual work 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// and use the compile function to reference the configuration object 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			configuration.compile.map(function(stFile) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		configuration.compile.map(function(stFile) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if (/\.st/.test(stFile)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					console.ambercLog('Importing: ' + stFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					fs.readFile(stFile, 'utf8', function(err, data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						if (!err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							resolve(data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							reject(Error('Could not import: ' + stFile)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(function(fileContents) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		console.log('Compiling collected .st files'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// import/compile content of .st files 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			fileContents.map(function(code) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					if (/\.st/.test(stFile)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						console.ambercLog('Importing: ' + stFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						fs.readFile(stFile, 'utf8', function(err, data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							if (!err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-								resolve(data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-								reject(Error('Could not import: ' + stFile)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					var importer = configuration.smalltalk.Importer._new(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						importer._import_(code._stream()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						resolve(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} catch (ex) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						reject(Error("Import error in section:\n" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							importer._lastSection() + "\n\n" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							"while processing chunk:\n" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							importer._lastChunk() + "\n\n" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							(ex._messageText && ex._messageText() || ex.message || ex)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		.then(function(fileContents) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			console.log('Compiling collected .st files'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			// import/compile content of .st files 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				fileContents.map(function(code) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						var importer = configuration.smalltalk.Importer._new(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							importer._import_(code._stream()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							resolve(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						} catch (ex) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							reject(Error("Import error in section:\n" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-								importer._lastSection() + "\n\n" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-								"while processing chunk:\n" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-								importer._lastChunk() + "\n\n" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-								(ex._messageText && ex._messageText() || ex.message || ex)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		.then(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			resolve(configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return configuration; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -421,36 +402,35 @@ function compile(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * Returns a Promise() that resolves into the configuration object. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function category_export(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			configuration.compile.map(function(stFile) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					var category = path.basename(stFile, '.st'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					var jsFilePath = configuration.output_dir; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					if (undefined === jsFilePath) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						jsFilePath = path.dirname(stFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					var jsFile = category + configuration.suffix_used + '.js'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					jsFile = path.join(jsFilePath, jsFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					configuration.compiled.push(jsFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					var smalltalk = configuration.smalltalk; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					var packageObject = smalltalk.Package._named_(category); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					packageObject._transport()._namespace_(configuration.amd_namespace); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					fs.writeFile(jsFile, smalltalk.String._streamContents_(function (stream) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						smalltalk.AmdExporter._new()._exportPackage_on_(packageObject, stream); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					}), function(err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						if (err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							reject(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							resolve(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		configuration.compile.map(function(stFile) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var category = path.basename(stFile, '.st'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var jsFilePath = configuration.output_dir; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if (undefined === jsFilePath) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					jsFilePath = path.dirname(stFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var jsFile = category + configuration.suffix_used + '.js'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				jsFile = path.join(jsFilePath, jsFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				configuration.compiled.push(jsFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var smalltalk = configuration.smalltalk; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var packageObject = smalltalk.Package._named_(category); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				packageObject._transport()._namespace_(configuration.amd_namespace); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				fs.writeFile(jsFile, smalltalk.String._streamContents_(function (stream) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					smalltalk.AmdExporter._new()._exportPackage_on_(packageObject, stream); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}), function(err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if (err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						reject(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						resolve(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		).then(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			resolve(configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return configuration; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -459,23 +439,22 @@ function category_export(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function verify(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	console.log('Verifying if all .st files were compiled'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			configuration.compiled.map(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					fs.exists(file, function(exists) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						if (exists) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							resolve(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							reject(Error('Compilation failed of: ' + file)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return Promise.all( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		configuration.compiled.map(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				fs.exists(file, function(exists) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if (exists) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						resolve(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						reject(Error('Compilation failed of: ' + file)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		).then(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			resolve(configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.then(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return configuration; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -488,6 +467,7 @@ function compose_js_files(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		var programFile = configuration.program; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if (undefined === programFile) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			resolve(configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if (undefined !== configuration.output_dir) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -513,10 +493,11 @@ function compose_js_files(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		fileStream.on('error', function(error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			fileStream.end(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			console.ambercLog(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			reject(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		fileStream.on('close', function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			resolve(configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		var builder = createConcatenator(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -560,9 +541,8 @@ function compose_js_files(configuration) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		console.log('Done.'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		fileStream.end(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		resolve(configuration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 module.exports.Compiler = AmberC; 
			 |