diff --git a/bin/6to5 b/bin/6to5 deleted file mode 100755 index b4e8355618..0000000000 --- a/bin/6to5 +++ /dev/null @@ -1,211 +0,0 @@ -#!/usr/bin/env node - -var commander = require("commander"); -var sourceMap = require("source-map"); -var readdir = require("fs-readdir-recursive"); -var mkdirp = require("mkdirp"); -var path = require("path"); -var util = require("../lib/6to5/util"); -var to5 = require("../lib/6to5"); -var fs = require("fs"); -var _ = require("lodash"); - -commander.option("-t, --source-maps-inline", "Append sourceMappingURL comment to bottom of code"); -commander.option("-s, --source-maps", "Save source map alongside the compiled code when using --out-file and --out-dir flags"); -commander.option("-f, --filename [filename]", "Filename to use when reading from stdin - this will be used in source-maps, errors etc [stdin]", "stdin"); -//commander.option("-w, --watch", "Watch, only works with --out-dir"); - -var list = function (val) { - return val ? val.split(",") : []; -}; - -commander.option("-w, --whitelist [whitelist]", "Whitelist", list); -commander.option("-b, --blacklist [blacklist]", "Blacklist", list); -commander.option("-o, --out-file [out]", "Compile all input files into a single file"); -commander.option("-d, --out-dir [out]", "Compile an input directory of modules into an output directory"); - -var pkg = require("../package.json"); -commander.version(pkg.version); -commander.usage("[options] "); -commander.parse(process.argv); - -// - -var errors = []; - -var filenames = commander.args; - -_.each(filenames, function (filename) { - if (!fs.existsSync(filename)) { - errors.push(filename + " doesn't exist"); - } -}); - -if (commander.outDir && !filenames.length) { - errors.push("filenames required for --out-dir"); -} - -if (commander.outFile && commander.outDir) { - errors.push("cannot have --out-file and --out-dir"); -} - -if (errors.length) { - console.error(errors.join(". ")); - process.exit(2); -} - -// - -var readdirFilter = function (filename) { - return readdir(filename).filter(util.canCompile); -}; - -var mainOpts = { - sourceMapName: commander.outFile, - blacklist: commander.blacklist, - whitelist: commander.whitelist, - sourceMap: commander.sourceMaps || commander.sourceMapsInline -}; - -var data = []; - -var transform = function (filename, code, to) { - var opts = _.extend({ filename: filename }, mainOpts); - if (to) opts.sourceMapName = to; - - var result = to5.transform(code, opts); - result.filename = filename; - result.actual = code; - return result; -}; - -var compile = function (filename, to) { - var code = fs.readFileSync(filename, "utf8"); - return transform(filename, code, to); -}; - -if (commander.outDir) { - if (commander.sourceMapsInline) { - mainOpts.sourceMap = "inline"; - } - - var write = function (src, relative) { - var dest = path.join(commander.outDir, relative); - - var data = compile(src, dest); - - var up = path.normalize(dest + "/.."); - mkdirp.sync(up); - - if (commander.sourceMaps) { - fs.writeFileSync(dest + ".map", JSON.stringify(data.map)); - } - - fs.writeFileSync(dest, data.code); - - console.log(src + " -> " + dest); - }; - - var handle = function (filename) { - var stat = fs.statSync(filename); - - if (stat.isDirectory(filename)) { - var dirname = filename; - - _.each(readdirFilter(dirname), function (filename) { - write(path.join(dirname, filename), filename); - }); - } else { - write(filename, filename); - } - }; - - _.each(filenames, handle); -} else { - var results = []; - - var finish = function () { - var map = new sourceMap.SourceMapGenerator({ - file: commander.outFile || "stdout" - }); - - var code = ""; - var offset = 0; - - _.each(results, function (result) { - var filename = result.filename; - code += result.code + "\n"; - - if (result.map) { - var consumer = new sourceMap.SourceMapConsumer(result.map); - - map._sources.add(filename); - map.setSourceContent(filename, result.actual); - - consumer.eachMapping(function (mapping) { - map._mappings.push({ - generatedLine: mapping.generatedLine + offset, - generatedColumn: mapping.generatedColumn, - originalLine: mapping.originalLine, - originalColumn: mapping.originalColumn, - source: filename - }); - }); - - offset = code.split("\n").length; - } - }); - - if (commander.sourceMapsInline || (!commander.outFile && commander.sourceMaps)) { - code += "\n" + util.sourceMapToComment(map); - } - - if (commander.outFile) { - if (commander.sourceMaps) { - fs.writeFileSync(commander.outFile + ".map", JSON.stringify(map)); - } - - fs.writeFileSync(commander.outFile, code); - } else { - console.log(code); - } - }; - - if (filenames.length) { - var _filenames = filenames; - filenames = []; - - _.each(_filenames, function (filename) { - var stat = fs.statSync(filename); - if (stat.isDirectory()) { - var dirname = filename; - - _.each(readdirFilter(filename), function (filename) { - filenames.push(path.join(dirname, filename)); - }); - } else { - filenames.push(filename); - } - }); - - _.each(filenames, function (filename) { - results.push(compile(filename)); - }); - - finish(); - } else { - var code = ""; - - process.stdin.setEncoding("utf8"); - - process.stdin.on("readable", function () { - var chunk = process.stdin.read(); - if (chunk !== null) code += chunk; - }); - - process.stdin.on("end", function() { - results.push(transform(commander.filename, code)); - finish(); - }); - } -} diff --git a/bin/6to5/dir.js b/bin/6to5/dir.js new file mode 100644 index 0000000000..90860077f0 --- /dev/null +++ b/bin/6to5/dir.js @@ -0,0 +1,66 @@ +var chokidar = require("chokidar"); +var mkdirp = require("mkdirp"); +var path = require("path"); +var util = require("./util"); +var fs = require("fs"); +var _ = require("lodash"); + +module.exports = function (commander, filenames, opts) { + if (commander.sourceMapsInline) { + opts.sourceMap = "inline"; + } + + var write = function (src, relative) { + var dest = path.join(commander.outDir, relative); + + var data = util.compile(src, dest); + + var up = path.normalize(dest + "/.."); + mkdirp.sync(up); + + if (commander.sourceMaps) { + fs.writeFileSync(dest + ".map", JSON.stringify(data.map)); + } + + fs.writeFileSync(dest, data.code); + + console.log(src + " -> " + dest); + }; + + var handle = function (filename) { + if (!fs.existsSync(filename)) return; + + var stat = fs.statSync(filename); + + if (stat.isDirectory(filename)) { + var dirname = filename; + + _.each(util.readdirFilter(dirname), function (filename) { + write(path.join(dirname, filename), filename); + }); + } else { + write(filename, filename); + } + }; + + _.each(filenames, handle); + + if (commander.watch) { + _.each(filenames, function (dirname) { + var watcher = chokidar.watch(dirname, { + persistent: true, + ignoreInitial: true + }); + + _.each(["add", "change", "unlink"], function (type) { + watcher.on(type, function (filename) { + // chop off the dirname plus the path separator + var relative = filename.slice(dirname.length + 1); + + console.log(type, filename); + write(filename, relative); + }); + }); + }); + } +}; diff --git a/bin/6to5/file.js b/bin/6to5/file.js new file mode 100644 index 0000000000..34a6e796ea --- /dev/null +++ b/bin/6to5/file.js @@ -0,0 +1,133 @@ +var sourceMap = require("source-map"); +var chokidar = require("chokidar"); +var util2 = require("../../lib/6to5/util"); +var path = require("path"); +var util = require("./util"); +var fs = require("fs"); +var _ = require("lodash"); + +module.exports = function (commander, filenames, opts) { + var results = []; + + var buildResult = function () { + var map = new sourceMap.SourceMapGenerator({ + file: commander.outFile || "stdout" + }); + + var code = ""; + var offset = 0; + + _.each(results, function (result) { + var filename = result.filename; + code += result.code + "\n"; + + if (result.map) { + var consumer = new sourceMap.SourceMapConsumer(result.map); + + map._sources.add(filename); + map.setSourceContent(filename, result.actual); + + consumer.eachMapping(function (mapping) { + map._mappings.push({ + generatedLine: mapping.generatedLine + offset, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + source: filename + }); + }); + + offset = code.split("\n").length; + } + }); + + if (commander.sourceMapsInline || (!commander.outFile && commander.sourceMaps)) { + code += "\n" + util2.sourceMapToComment(map); + } + + return { + map: map, + code: code + } + }; + + var output = function () { + var result = buildResult(); + + if (commander.outFile) { + if (commander.sourceMaps) { + fs.writeFileSync(commander.outFile + ".map", JSON.stringify(result.map)); + } + + fs.writeFileSync(commander.outFile, result.code); + } else { + console.log(result.code); + } + }; + + var stdin = function () { + var code = ""; + + process.stdin.setEncoding("utf8"); + + process.stdin.on("readable", function () { + var chunk = process.stdin.read(); + if (chunk !== null) code += chunk; + }); + + process.stdin.on("end", function() { + results.push(util.transform(commander.filename, code)); + output(); + }); + }; + + var walk = function () { + var _filenames = []; + results = []; + + _.each(filenames, function (filename) { + if (!fs.existsSync(filename)) return; + + var stat = fs.statSync(filename); + if (stat.isDirectory()) { + var dirname = filename; + + _.each(util.readdirFilter(filename), function (filename) { + _filenames.push(path.join(dirname, filename)); + }); + } else { + _filenames.push(filename); + } + }); + + _.each(_filenames, function (filename) { + results.push(util.compile(filename)); + }); + + output(); + }; + + var files = function () { + walk(); + + if (commander.watch) { + var watcher = chokidar.watch(filenames, { + persistent: true, + ignoreInitial: true + }); + + _.each(["add", "change", "unlink"], function (type) { + watcher.on(type, function (filename) { + console.log(type, filename); + walk(); + }); + }); + } + }; + + if (filenames.length) { + files(); + } else { + stdin(); + } +}; diff --git a/bin/6to5/index.js b/bin/6to5/index.js new file mode 100755 index 0000000000..70781353b2 --- /dev/null +++ b/bin/6to5/index.js @@ -0,0 +1,88 @@ +#!/usr/bin/env node + +var commander = require("commander"); +var sourceMap = require("source-map"); +var mkdirp = require("mkdirp"); +var chokidar = require("chokidar"); +var path = require("path"); +var fs = require("fs"); +var _ = require("lodash"); + +commander.option("-t, --source-maps-inline", "Append sourceMappingURL comment to bottom of code"); +commander.option("-s, --source-maps", "Save source map alongside the compiled code"); +commander.option("-f, --filename [filename]", "Filename to use when reading from stdin - this will be used in source-maps, errors etc [stdin]", "stdin"); +commander.option("-w, --watch", "Recompile files on changes"); + +var list = function (val) { + return val ? val.split(",") : []; +}; + +commander.option("-w, --whitelist [whitelist]", "Whitelist", list); +commander.option("-b, --blacklist [blacklist]", "Blacklist", list); +commander.option("-o, --out-file [out]", "Compile all input files into a single file"); +commander.option("-d, --out-dir [out]", "Compile an input directory of modules into an output directory"); + +var pkg = require("../../package.json"); +commander.version(pkg.version); +commander.usage("[options] "); +commander.parse(process.argv); + +// + +var errors = []; + +var filenames = commander.args; + +_.each(filenames, function (filename) { + if (!fs.existsSync(filename)) { + errors.push(filename + " doesn't exist"); + } +}); + +if (commander.outDir && !filenames.length) { + errors.push("filenames required for --out-dir"); +} + +if (commander.outFile && commander.outDir) { + errors.push("cannot have --out-file and --out-dir"); +} + +if (commander.watch) { + if (!commander.outFile && !commander.outDir) { + errors.push("--watch requires --out-file or --out-dir"); + } + + if (!filenames.length) { + errors.push("--watch requires filenames"); + } +} + +if (commander.sourceMaps) { + if (!commander.outFile && !commander.outDir) { + errors.push("--source-maps requires --out-file or --out-dir"); + } +} + +if (errors.length) { + console.error(errors.join(". ")); + process.exit(2); +} + +// + +exports.opts = { + sourceMapName: commander.outFile, + blacklist: commander.blacklist, + whitelist: commander.whitelist, + sourceMap: commander.sourceMaps || commander.sourceMapsInline +}; + +var fn; + +if (commander.outDir) { + fn = require("./dir"); +} else { + fn = require("./file"); +} + +fn(commander, filenames, exports.opts); diff --git a/bin/6to5/util.js b/bin/6to5/util.js new file mode 100644 index 0000000000..ccec63ee7d --- /dev/null +++ b/bin/6to5/util.js @@ -0,0 +1,25 @@ +var readdir = require("fs-readdir-recursive"); +var index = require("./index"); +var util = require("../../lib/6to5/util"); +var to5 = require("../../lib/6to5"); +var fs = require("fs"); +var _ = require("lodash"); + +exports.readdirFilter = function (filename) { + return readdir(filename).filter(util.canCompile); +}; + +exports.transform = function (filename, code, to) { + var opts = _.extend({ filename: filename }, index.opts); + if (to) opts.sourceMapName = to; + + var result = to5.transform(code, opts); + result.filename = filename; + result.actual = code; + return result; +}; + +exports.compile = function (filename, to) { + var code = fs.readFileSync(filename, "utf8"); + return exports.transform(filename, code, to); +};