You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
188 lines
4.7 KiB
188 lines
4.7 KiB
4 years ago
|
"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();
|
||
|
}
|
||
|
};
|