mithril-vndb/bundler/bundler.js
2016-06-20 09:19:43 -04:00

65 lines
2.3 KiB
JavaScript

"use strict"
var fs = require("fs")
var path = require("path")
var modules = {}
var usedVariables = {}
function resolve(dir, data) {
var replacements = []
data = data.replace(/((?:var|let|const|)[\t ]*)([\w_$\.]+)(\s*=\s*)require\(([^\)]+)\)/g, function(match, def, variable, eq, dep) {
usedVariables[variable] = usedVariables[variable] ? usedVariables[variable]++ : 1
var filename = new Function("return " + dep).call()
var normalized = path.resolve(dir, filename)
var pathname = path.dirname(normalized)
if (modules[normalized] === undefined) {
modules[normalized] = variable
var exported = fixCollisions(fs.readFileSync(dir + "/" + filename + ".js", "utf8"))
.replace(/"use strict"\s*/gm, "") // remove extraneous "use strict"
.replace(/module\.exports\s*=\s*/gm, def + variable + eq)
//.replace(/module\.exports(\.[\w_$]|\["[^\"]"\])/, def + variable + eq + "{}\n" + variable + "$1")
return resolve(pathname, exported)
}
else {
if (modules[normalized] !== variable) {
replacements.push({variable: variable, replacement: modules[normalized]})
}
return ""
}
})
if (replacements.length > 0) {
for (var i = 0; i < replacements.length; i++) {
data = data.replace(new RegExp("\\b" + replacements[i].variable + "\\b", "g"), replacements[i].replacement)
}
}
return data
.replace(/(?:var|let|const)[\t ]([\w_$\.]+)(\s*=\s*)\1([\r\n;]+)/g, "$3") // remove assignments to itself
.replace(/([\r\n]){2,}/g, "$1") // remove multiple consecutive line breaks
.replace(/\}[\r\n]+\(/g, "}(") // remove space from iife
}
function fixCollisions(code) {
for (var variable in usedVariables) {
var collision = new RegExp("\\b" + variable + "\\b(?![\"'`])", "g")
var exported = new RegExp("module\\.exports\\s*=\\s*" + variable)
if (collision.test(code) && !exported.test(code)) {
var fixed = variable + usedVariables[variable]++
code = code.replace(collision, fixed)
}
}
return code
}
function setVersion(code) {
var metadata = JSON.parse(fs.readFileSync("./package.json"))
return code.replace("bleeding-edge", metadata.version)
}
function bundle(input, output) {
var code = setVersion(resolve(".", fs.readFileSync(input, "utf8")))
if (new Function(code)) fs.writeFileSync(output, code, "utf8")
}
bundle("index.js", "mithril.js")