tsmake
Version:
tsmake is a typescript make. Created for autocompile Typescript code into JS.
147 lines (135 loc) • 3.72 kB
JavaScript
/*
* TypeScript Makefile builder
*/
var path = require('path');
var pkg = require( path.join(__dirname, 'package.json') );
var tsc = require('typescript-compiler');
var fs = require('fs');
var colors = require('colors');
var state = true;
var program = require('commander');
var selected_target = null;
var spawn = require('child_process').spawn;
if (process.argv.length > 2) {
selected_target = (process.argv[2] == "all")? null: process.argv[2];
}
program
.version(pkg.version)
.usage(' target [option]')
.option('-R, --run', 'Run compiled target (if compiled)')
.parse(process.argv);
if (!fs.existsSync('./TSMakefile.json'))
{
console.log("[tsm] : Unable locate TSM.json file.".red);
return;
}
fs.readFile('./TSMakefile.json', function(err, data){
if (err)
{
console.log("[tsm] : Unable read TSMakefile.json file.".red);
return;
} else {
try
{
var tsm = JSON.parse(data);
if (tsm)
{
for (var t in tsm)
{
if (selected_target == "cls" || selected_target == "clean" || selected_target == "clear") {
cleanup(tsm);
return;
}
if (selected_target != null && t != selected_target)
continue;
var trg = "[tsm] Build target : " + t;
console.log(trg.yellow)
//-------------------------
if (tsm[t].targets == "undefined" || tsm[t].out == "undefined")
{
console.log("[tsm] : Incorrect file".red);
return;
} else {
if (tsm[t].targets.length == 0)
{
console.log("[tsm] Done!".blue);
return;
}
var tar = "[tsm] Detected targets : " + tsm[t].targets.length;
console.log(tar.blue);
var i = 0;
var obj = {};
while (state && (i < tsm[t].targets.length))
{
var endstr = "[tsm]["+i+"] Target : " + tsm[t].targets[i];
console.log(endstr.blue);
if (!fs.existsSync(tsm[t].targets[i]))
{
var errstr = "[tsm][" + i + "] File : " + tsm[t].targets[i] + " not found. Compilation was stopped";
console.log(errstr.red);
state = false;
return;
}
var src = fs.readFileSync(tsm[t].targets[i], {"encoding":"utf8"});
obj[tsm[t].targets[i]] = src; //append new target
++i;
}
//Let's build
console.log("[tsm] All targets readed. Compile started ...".blue);
var rsx = '-t ES5 --out ' + tsm[t].out;
if (tsm[t].flags != "undefined") {
rsx = tsm[t].flags + " " + rsx;
}
var flstr = "[tsm] Flags : " + rsx;
console.log(flstr.yellow);
var res = tsc.compileStrings(obj, rsx, null);
if (res.errors.length != 0)
{
console.log("[tsm] Build failed".red);
for (var i = 0; i < res.errors.length; ++i)
{
var errxs = "[tsm]("+(i+1)+") " + res.errors[i];
console.log(errxs.red);
}
return;
}
var fsd = "";
for (var j in res.sources){
if (typeof res.sources[j] !== 'function')
fsd += ("\n" + res.sources[j]);
}
fs.writeFile(tsm[t].out, fsd, {"encoding": "utf8"}, function(err){
if (err) {
var ers = "[tsm] Unable write file";
console.log(ers.red);
console.log(err);
}
});
}
}
console.log("[tsm] Build : OK".green);
}
} catch (e)
{
console.log("[tsm] : Incorrect format passed".red);
console.log(e);
return;
}
}
});
function cleanup(tsm)
{
console.log("[tsm] Cleanup".yellow);
for (var j in tsm)
{
for (var k in tsm[j])
{
if (k == "out") {
var rm = "[tsm] Remove " + tsm[j][k];
fs.unlink(tsm[j][k], function(err){});
console.log(rm.yellow);
}
}
}
}