c9-core/node_modules/architect-build/npm_freeze.js

70 wiersze
2.7 KiB
JavaScript

var patchTemplate = ";(" +function() {
// automatically generated by architect-build
// bundle all dependencies in the main package
var Module = require("module");
var path = require("path");
var _resolveFilename_orig = Module._resolveFilename
var root = path.join(__dirname, "{root}");
Module._resolveFilename = function(id, parent) {
if (parent && parent.paths && parent.paths[0] && parent.paths[0].indexOf(root) == 0) {
parent.paths = parent.paths.map(function(p) {
if (p.indexOf(root) != 0) return
p = p.slice(root.length);
return root + p.replace(/([\\\/]|^)node_modules([\\\/]|$)/g, "$1n_m$2");
}).filter(Boolean);
}
return _resolveFilename_orig.call(Module, id, parent);
};
} + ")();";
//////////////////////////////////////////////////////////////////////////
var fs = require("fs");
var copy = require("architect-build/copy");
var pathLib = require("path");
function freeze(path, mode) {
path = copy.convertPath(path);
var pkgs = {};
function freezePkg(path) {
if (!pkgs[path]) {
pkgs[path] = JSON.parse(fs.readFileSync(path + "/package.json"))
Object.keys(pkgs[path]).forEach(function(k) {
if (/Dependencies/i.test(k)) delete pkgs[path][k];
})
}
pkgs[path].dependencies = {};
var deps = fs.existsSync(path + "/node_modules") ? fs.readdirSync(path + "/node_modules") : [];
deps.forEach(function(n) {
if (n == ".bin") return;
var depPath = path + "/node_modules/" + n;
freezePkg(depPath);
pkgs[path].dependencies[n] = pkgs[depPath].version;
});
if (mode == "rename") {
if (deps.length) {
fs.renameSync(path + "/node_modules/", path + "/n_m")
delete pkgs[path].dependencies
if (pkgs[path].files)
pkgs[path].files.push("n_m")
}
} else {
pkgs[path].bundledDependencies = Object.keys(pkgs[path].dependencies);
}
fs.writeFileSync(path + "/package.json", JSON.stringify(pkgs[path], null, "\t"), "utf8");
}
freezePkg(path);
var bin = pkgs[path].bin;
Object.keys(bin).forEach(function(key) {
var p = bin[key];
var root = pathLib.relative(pathLib.dirname(p), "").replace(/[\\]/g, "/");
var src = fs.readFileSync(path + "/" + p, "utf8");
src = src.replace(/^(#.*|"use strict";?|\s)*/, function(a) {
return a.trim() + "\n\n" + patchTemplate.replace(/{root}/g, root) + "\n\n";
});
fs.writeFileSync(path + "/" + p, src, "utf8");
});
}
module.exports = freeze;