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
"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(); |
|
} |
|
}; |