Bladeren bron

New fix for amber/#888 that also fixes amber/#958

Libs are loaded in a compiler (it needs them for amber/#958),
but after initialization (to fix amber/#888).
Herbert Vojčík 11 jaren geleden
bovenliggende
commit
6f2e7f991b
1 gewijzigde bestanden met toevoegingen van 40 en 3 verwijderingen
  1. 40 3
      cli/support/amberc.js

+ 40 - 3
cli/support/amberc.js

@@ -293,7 +293,9 @@ function resolve_kernel(configuration) {
  * Returns a Promise object which resolves into the configuration object.
  */
 function create_compiler(configuration) {
-	var compiler_files = configuration.compiler_libraries.concat(configuration.load);
+	var compiler_files = configuration.compiler_libraries;
+	var include_files = configuration.load;
+	var builder;
 	return Promise.all(
 		compiler_files.map(function(file) {
 			return resolve_js(file, configuration);
@@ -315,7 +317,7 @@ function create_compiler(configuration) {
 		)
 	})
 	.then(function(files) {
-		var builder = createConcatenator();
+		builder = createConcatenator();
 		builder.add('(function() {');
 		builder.start();
 
@@ -328,8 +330,43 @@ function create_compiler(configuration) {
 				builder.addId(match[1]);
 			}
 		});
+	})
+	.then(function () { return Promise.all(
+		include_files.map(function(file) {
+			return resolve_js(file, configuration);
+		})
+	); })
+	.then(function(includeFilesArray) {
+		return Promise.all(
+			includeFilesArray.map(function(file) {
+				return new Promise(function(resolve, reject) {
+					console.log('Loading library file: ' + file);
+					fs.readFile(file, function(err, data) {
+						if (err)
+							reject(err);
+						else
+							resolve(data);
+					});
+				});
+			})
+		)
+	})
+	.then(function(files) {
+		var loadIds = [];
+		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) {
+				loadIds.push(match[1]);
+			}
+		});
 		// store the generated smalltalk env in configuration.{vm,globals}
 		builder.finish('configuration.vm = vm; configuration.globals = globals;');
+		loadIds.forEach(function (id) {
+			builder.add('requirejs("' + id + '");');
+		});
 		builder.add('})();');
 
 		eval(builder.toString());
@@ -469,7 +506,7 @@ function compose_js_files(configuration) {
 		var programFile = configuration.program;
 		if (undefined === programFile) {
 			resolve(configuration);
-            return;
+			return;
 		}
 		if (undefined !== configuration.output_dir) {
 			programFile = path.join(configuration.output_dir, programFile);