2014-09-25 17:04:46 -04:00
|
|
|
// Entry point for Node.
|
|
|
|
|
|
|
|
var fs = require('fs');
|
|
|
|
var glob = require('glob');
|
|
|
|
var path = require('path');
|
|
|
|
var traceur = require('traceur');
|
|
|
|
|
|
|
|
exports.RUNTIME_PATH = traceur.RUNTIME_PATH;
|
|
|
|
var TRACEUR_PATH = traceur.RUNTIME_PATH.replace('traceur-runtime.js', 'traceur.js');
|
2014-09-26 20:39:27 -04:00
|
|
|
var SELF_SOURCE_REGEX = /transpiler\/src/;
|
2014-09-25 17:04:46 -04:00
|
|
|
var SELF_COMPILE_OPTIONS = {
|
|
|
|
modules: 'register',
|
|
|
|
moduleName: true,
|
|
|
|
script: false // parse as a module
|
|
|
|
};
|
|
|
|
|
|
|
|
var needsReload = true;
|
|
|
|
|
|
|
|
// TODO(vojta): call this if sources changed
|
|
|
|
exports.sourcesChanged = function() {
|
|
|
|
needsReload = true;
|
|
|
|
};
|
|
|
|
|
|
|
|
exports.compile = function compile(options, paths, source) {
|
|
|
|
if (needsReload) {
|
|
|
|
reloadCompiler();
|
|
|
|
needsReload = false;
|
|
|
|
}
|
|
|
|
var inputPath, outputPath, moduleName;
|
|
|
|
if (typeof paths === 'string') {
|
|
|
|
inputPath = outputPath = paths;
|
|
|
|
} else {
|
|
|
|
inputPath = paths.inputPath;
|
|
|
|
outputPath = paths.inputPath;
|
|
|
|
moduleName = paths.moduleName;
|
|
|
|
}
|
|
|
|
outputPath = outputPath || inputPath;
|
|
|
|
moduleName = moduleName || inputPath;
|
|
|
|
moduleName = moduleName.replace(/\.\w*$/, '');
|
|
|
|
|
|
|
|
var localOptions = extend(options, {
|
|
|
|
moduleName: moduleName
|
|
|
|
});
|
2014-09-26 20:39:27 -04:00
|
|
|
var CompilerCls = System.get('transpiler/src/compiler').Compiler;
|
2014-09-25 17:04:46 -04:00
|
|
|
return (new CompilerCls(localOptions)).compile(source, inputPath, outputPath);
|
|
|
|
};
|
|
|
|
|
|
|
|
// Transpile and evaluate the code in `src`.
|
|
|
|
// Use existing traceur to compile our sources.
|
|
|
|
function reloadCompiler() {
|
|
|
|
loadModule(TRACEUR_PATH, false);
|
|
|
|
glob.sync(__dirname + '/src/**/*.js').forEach(function(fileName) {
|
|
|
|
loadModule(fileName, true);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function loadModule(filepath, transpile) {
|
|
|
|
var data = fs.readFileSync(filepath, 'utf8');
|
|
|
|
|
|
|
|
if (!data) {
|
|
|
|
throw new Error('Failed to import ' + filepath);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (transpile) {
|
|
|
|
var moduleName = filepath
|
2014-09-26 20:39:27 -04:00
|
|
|
.replace(__dirname, 'transpiler')
|
2014-09-25 17:04:46 -04:00
|
|
|
.replace(/\.\w*$/, '');
|
|
|
|
data = (new traceur.NodeCompiler(
|
|
|
|
extend(SELF_COMPILE_OPTIONS, { moduleName: moduleName } )
|
|
|
|
)).compile(data, filepath, filepath);
|
|
|
|
}
|
|
|
|
|
|
|
|
('global', eval)(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
function extend(source, props) {
|
|
|
|
var res = {};
|
|
|
|
for (var prop in source) {
|
|
|
|
res[prop] = source[prop];
|
|
|
|
}
|
|
|
|
for (var prop in props) {
|
|
|
|
res[prop] = props[prop];
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|