188 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			188 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
var _stringify = require("babel-runtime/core-js/json/stringify");
 | 
						|
 | 
						|
var _stringify2 = _interopRequireDefault(_stringify);
 | 
						|
 | 
						|
var _set = require("babel-runtime/core-js/set");
 | 
						|
 | 
						|
var _set2 = _interopRequireDefault(_set);
 | 
						|
 | 
						|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 | 
						|
 | 
						|
var convertSourceMap = require("convert-source-map");
 | 
						|
var sourceMap = require("source-map");
 | 
						|
var slash = require("slash");
 | 
						|
var path = require("path");
 | 
						|
var util = require("./util");
 | 
						|
var fs = require("fs");
 | 
						|
 | 
						|
module.exports = function (commander, filenames, opts) {
 | 
						|
  if (commander.sourceMaps === "inline") {
 | 
						|
    opts.sourceMaps = true;
 | 
						|
  }
 | 
						|
 | 
						|
  var results = [];
 | 
						|
 | 
						|
  var buildResult = function buildResult() {
 | 
						|
    var map = new sourceMap.SourceMapGenerator({
 | 
						|
      file: path.basename(commander.outFile || "") || "stdout",
 | 
						|
      sourceRoot: opts.sourceRoot
 | 
						|
    });
 | 
						|
 | 
						|
    var code = "";
 | 
						|
    var offset = 0;
 | 
						|
 | 
						|
    results.forEach(function (result) {
 | 
						|
      code += result.code + "\n";
 | 
						|
 | 
						|
      if (result.map) {
 | 
						|
        var consumer = new sourceMap.SourceMapConsumer(result.map);
 | 
						|
        var sources = new _set2.default();
 | 
						|
 | 
						|
        consumer.eachMapping(function (mapping) {
 | 
						|
          if (mapping.source != null) sources.add(mapping.source);
 | 
						|
 | 
						|
          map.addMapping({
 | 
						|
            generated: {
 | 
						|
              line: mapping.generatedLine + offset,
 | 
						|
              column: mapping.generatedColumn
 | 
						|
            },
 | 
						|
            source: mapping.source,
 | 
						|
            original: mapping.source == null ? null : {
 | 
						|
              line: mapping.originalLine,
 | 
						|
              column: mapping.originalColumn
 | 
						|
            }
 | 
						|
          });
 | 
						|
        });
 | 
						|
 | 
						|
        sources.forEach(function (source) {
 | 
						|
          var content = consumer.sourceContentFor(source, true);
 | 
						|
          if (content !== null) {
 | 
						|
            map.setSourceContent(source, content);
 | 
						|
          }
 | 
						|
        });
 | 
						|
 | 
						|
        offset = code.split("\n").length - 1;
 | 
						|
      }
 | 
						|
    });
 | 
						|
 | 
						|
    if (commander.sourceMaps === "inline" || !commander.outFile && commander.sourceMaps) {
 | 
						|
      code += "\n" + convertSourceMap.fromObject(map).toComment();
 | 
						|
    }
 | 
						|
 | 
						|
    return {
 | 
						|
      map: map,
 | 
						|
      code: code
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  var output = function output() {
 | 
						|
    var result = buildResult();
 | 
						|
 | 
						|
    if (commander.outFile) {
 | 
						|
      if (commander.sourceMaps && commander.sourceMaps !== "inline") {
 | 
						|
        var mapLoc = commander.outFile + ".map";
 | 
						|
        result.code = util.addSourceMappingUrl(result.code, mapLoc);
 | 
						|
        fs.writeFileSync(mapLoc, (0, _stringify2.default)(result.map));
 | 
						|
      }
 | 
						|
 | 
						|
      fs.writeFileSync(commander.outFile, result.code);
 | 
						|
    } else {
 | 
						|
      process.stdout.write(result.code + "\n");
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  var stdin = function stdin() {
 | 
						|
    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, {
 | 
						|
        sourceFileName: "stdin"
 | 
						|
      }));
 | 
						|
      output();
 | 
						|
    });
 | 
						|
  };
 | 
						|
 | 
						|
  var walk = function walk() {
 | 
						|
    var _filenames = [];
 | 
						|
    results = [];
 | 
						|
 | 
						|
    filenames.forEach(function (filename) {
 | 
						|
      if (!fs.existsSync(filename)) return;
 | 
						|
 | 
						|
      var stat = fs.statSync(filename);
 | 
						|
      if (stat.isDirectory()) {
 | 
						|
        var dirname = filename;
 | 
						|
 | 
						|
        util.readdirFilter(filename).forEach(function (filename) {
 | 
						|
          _filenames.push(path.join(dirname, filename));
 | 
						|
        });
 | 
						|
      } else {
 | 
						|
        _filenames.push(filename);
 | 
						|
      }
 | 
						|
    });
 | 
						|
 | 
						|
    _filenames.forEach(function (filename) {
 | 
						|
      if (util.shouldIgnore(filename)) return;
 | 
						|
 | 
						|
      var sourceFilename = filename;
 | 
						|
      if (commander.outFile) {
 | 
						|
        sourceFilename = path.relative(path.dirname(commander.outFile), sourceFilename);
 | 
						|
      }
 | 
						|
      sourceFilename = slash(sourceFilename);
 | 
						|
 | 
						|
      var data = util.compile(filename, {
 | 
						|
        sourceFileName: sourceFilename
 | 
						|
      });
 | 
						|
 | 
						|
      if (data.ignored) return;
 | 
						|
      results.push(data);
 | 
						|
    });
 | 
						|
 | 
						|
    output();
 | 
						|
  };
 | 
						|
 | 
						|
  var files = function files() {
 | 
						|
 | 
						|
    if (!commander.skipInitialBuild) {
 | 
						|
      walk();
 | 
						|
    }
 | 
						|
 | 
						|
    if (commander.watch) {
 | 
						|
      var chokidar = util.requireChokidar();
 | 
						|
      chokidar.watch(filenames, {
 | 
						|
        persistent: true,
 | 
						|
        ignoreInitial: true,
 | 
						|
        awaitWriteFinish: {
 | 
						|
          stabilityThreshold: 50,
 | 
						|
          pollInterval: 10
 | 
						|
        }
 | 
						|
      }).on("all", function (type, filename) {
 | 
						|
        if (util.shouldIgnore(filename) || !util.canCompile(filename, commander.extensions)) return;
 | 
						|
 | 
						|
        if (type === "add" || type === "change") {
 | 
						|
          util.log(type + " " + filename);
 | 
						|
          try {
 | 
						|
            walk();
 | 
						|
          } catch (err) {
 | 
						|
            console.error(err.stack);
 | 
						|
          }
 | 
						|
        }
 | 
						|
      });
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  if (filenames.length) {
 | 
						|
    files();
 | 
						|
  } else {
 | 
						|
    stdin();
 | 
						|
  }
 | 
						|
}; |