file.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. "use strict";
  2. var _stringify = require("babel-runtime/core-js/json/stringify");
  3. var _stringify2 = _interopRequireDefault(_stringify);
  4. var _set = require("babel-runtime/core-js/set");
  5. var _set2 = _interopRequireDefault(_set);
  6. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  7. var convertSourceMap = require("convert-source-map");
  8. var sourceMap = require("source-map");
  9. var slash = require("slash");
  10. var path = require("path");
  11. var util = require("./util");
  12. var fs = require("fs");
  13. module.exports = function (commander, filenames, opts) {
  14. if (commander.sourceMaps === "inline") {
  15. opts.sourceMaps = true;
  16. }
  17. var results = [];
  18. var buildResult = function buildResult() {
  19. var map = new sourceMap.SourceMapGenerator({
  20. file: path.basename(commander.outFile || "") || "stdout",
  21. sourceRoot: opts.sourceRoot
  22. });
  23. var code = "";
  24. var offset = 0;
  25. results.forEach(function (result) {
  26. code += result.code + "\n";
  27. if (result.map) {
  28. var consumer = new sourceMap.SourceMapConsumer(result.map);
  29. var sources = new _set2.default();
  30. consumer.eachMapping(function (mapping) {
  31. if (mapping.source != null) sources.add(mapping.source);
  32. map.addMapping({
  33. generated: {
  34. line: mapping.generatedLine + offset,
  35. column: mapping.generatedColumn
  36. },
  37. source: mapping.source,
  38. original: mapping.source == null ? null : {
  39. line: mapping.originalLine,
  40. column: mapping.originalColumn
  41. }
  42. });
  43. });
  44. sources.forEach(function (source) {
  45. var content = consumer.sourceContentFor(source, true);
  46. if (content !== null) {
  47. map.setSourceContent(source, content);
  48. }
  49. });
  50. offset = code.split("\n").length - 1;
  51. }
  52. });
  53. if (commander.sourceMaps === "inline" || !commander.outFile && commander.sourceMaps) {
  54. code += "\n" + convertSourceMap.fromObject(map).toComment();
  55. }
  56. return {
  57. map: map,
  58. code: code
  59. };
  60. };
  61. var output = function output() {
  62. var result = buildResult();
  63. if (commander.outFile) {
  64. if (commander.sourceMaps && commander.sourceMaps !== "inline") {
  65. var mapLoc = commander.outFile + ".map";
  66. result.code = util.addSourceMappingUrl(result.code, mapLoc);
  67. fs.writeFileSync(mapLoc, (0, _stringify2.default)(result.map));
  68. }
  69. fs.writeFileSync(commander.outFile, result.code);
  70. } else {
  71. process.stdout.write(result.code + "\n");
  72. }
  73. };
  74. var stdin = function stdin() {
  75. var code = "";
  76. process.stdin.setEncoding("utf8");
  77. process.stdin.on("readable", function () {
  78. var chunk = process.stdin.read();
  79. if (chunk !== null) code += chunk;
  80. });
  81. process.stdin.on("end", function () {
  82. results.push(util.transform(commander.filename, code, {
  83. sourceFileName: "stdin"
  84. }));
  85. output();
  86. });
  87. };
  88. var walk = function walk() {
  89. var _filenames = [];
  90. results = [];
  91. filenames.forEach(function (filename) {
  92. if (!fs.existsSync(filename)) return;
  93. var stat = fs.statSync(filename);
  94. if (stat.isDirectory()) {
  95. var dirname = filename;
  96. util.readdirFilter(filename).forEach(function (filename) {
  97. _filenames.push(path.join(dirname, filename));
  98. });
  99. } else {
  100. _filenames.push(filename);
  101. }
  102. });
  103. _filenames.forEach(function (filename) {
  104. if (util.shouldIgnore(filename)) return;
  105. var sourceFilename = filename;
  106. if (commander.outFile) {
  107. sourceFilename = path.relative(path.dirname(commander.outFile), sourceFilename);
  108. }
  109. sourceFilename = slash(sourceFilename);
  110. var data = util.compile(filename, {
  111. sourceFileName: sourceFilename
  112. });
  113. if (data.ignored) return;
  114. results.push(data);
  115. });
  116. output();
  117. };
  118. var files = function files() {
  119. if (!commander.skipInitialBuild) {
  120. walk();
  121. }
  122. if (commander.watch) {
  123. var chokidar = util.requireChokidar();
  124. chokidar.watch(filenames, {
  125. persistent: true,
  126. ignoreInitial: true,
  127. awaitWriteFinish: {
  128. stabilityThreshold: 50,
  129. pollInterval: 10
  130. }
  131. }).on("all", function (type, filename) {
  132. if (util.shouldIgnore(filename) || !util.canCompile(filename, commander.extensions)) return;
  133. if (type === "add" || type === "change") {
  134. util.log(type + " " + filename);
  135. try {
  136. walk();
  137. } catch (err) {
  138. console.error(err.stack);
  139. }
  140. }
  141. });
  142. }
  143. };
  144. if (filenames.length) {
  145. files();
  146. } else {
  147. stdin();
  148. }
  149. };