'use strict'; var childProcess = require('child_process'); var fs = require('fs'); var path = require('path'); var isTest = process.argv[2] === '--only-test'; // TODO: This build task should be removed upon release of TypeScript 1.5 with // the support for `tsconfig.json`. Invoking `tsc` from `package.json` will then // read the configuration and compile accordingly. It seems that `TSLint` will, // eventually, support this mechanism too. That prevents the need for any kind // of build task and will run entirely based on instructions from `npm`. // // Reference #1: https://github.com/Microsoft/TypeScript/issues/1667 // Reference #2: https://github.com/palantir/tslint/issues/281 read(function(err, fileNames) { clean(fileNames, function() { var hasLintError = false; compile(fileNames, function(err) { if (err) { console.error(err); return process.exit(1); } lint(fileNames, function(message) { process.stdout.write(message); hasLintError = true; }, function() { process.exit(Number(hasLintError)); }); }); }); }); /** * Clean the files. * @param {Array.} filePaths * @param {function()} done */ function clean(filePaths, done) { if (isTest) return done(); var i = -1; (function next() { i += 1; if (i >= filePaths.length) return done(); var filePath = filePaths[i]; if (/\.d\.ts$/.test(filePath)) return next(); var mapName = filePath.substring(4, filePath.length - 2) + 'js.map'; var mapPath = path.join('dist', mapName); if (fs.existsSync(mapPath)) fs.unlinkSync(mapPath); next(); })(); } /** * Compile the files. * @param {Array.} filePaths * @param {function(Error)} done */ function compile(filePaths, done) { if (isTest) return done(null); var execPath = path.join(__dirname, 'node_modules/.bin/tsc'); var options = '--declaration --module CommonJS --noImplicitAny --outDir dist --target ES5'; childProcess.exec([execPath, options].concat(filePaths).join(' '), function(err, stdout) { if (stdout) return done(new Error(stdout)); done(null); }); } /** * Lint the files. * @param {Array.} filePaths * @param {function(string)} handler * @param {function()} done */ function lint(filePaths, handler, done) { var i = -1; var execPath = path.join(__dirname, 'node_modules/.bin/tslint'); (function next() { i += 1; if (i >= filePaths.length) return done(); var filePath = filePaths[i]; if (/\.d\.ts$/.test(filePath)) return next(); childProcess.exec(execPath + ' -f ' + filePath, function(err, stdout) { if (stdout) handler(stdout); next(); }); })(); } /** * Read the files from the project file. * @param {function(Error, Array.)} done */ function read(done) { done(null, JSON.parse(fs.readFileSync('tsconfig.json', 'utf8')).files); }