greenlock.js-ARCHIVED/lib/init.js

168 lines
4.8 KiB
JavaScript

"use strict";
var Init = module.exports;
var fs = require("fs");
var path = require("path");
//var promisify = require("util").promisify;
Init._init = function(opts) {
//var Rc = require("@root/greenlock/rc");
var Rc = require("./rc.js");
var pkgText;
var pkgErr;
var msgErr;
//var emailErr;
var realPkg;
var userPkg;
var myPkg = {};
// we want to be SUPER transparent that we're reading from package.json
// we don't want anything unexpected
var implicitConfig = [];
var rc;
if (opts.packageRoot) {
try {
pkgText = fs.readFileSync(path.resolve(opts.packageRoot, "package.json"), "utf8");
} catch (e) {
pkgErr = e;
console.warn("`packageRoot` should be the root of the package (probably `__dirname`)");
}
}
if (pkgText) {
try {
realPkg = JSON.parse(pkgText);
} catch (e) {
pkgErr = e;
}
}
userPkg = opts.package;
if (realPkg || userPkg) {
userPkg = userPkg || {};
realPkg = realPkg || {};
// build package agent
if (!opts.packageAgent) {
// name
myPkg.name = userPkg.name;
if (!myPkg.name) {
myPkg.name = realPkg.name;
implicitConfig.push("name");
}
// version
myPkg.version = userPkg.version;
if (!myPkg.version) {
myPkg.version = realPkg.version;
implicitConfig.push("version");
}
if (myPkg.name && myPkg.version) {
opts.packageAgent = myPkg.name + "/" + myPkg.version;
}
}
// build author
myPkg.author = opts.maintainerEmail;
if (!myPkg.author) {
myPkg.author = (userPkg.author && userPkg.author.email) || userPkg.author;
}
if (!myPkg.author) {
implicitConfig.push("author");
myPkg.author = (realPkg.author && realPkg.author.email) || realPkg.author;
}
opts.maintainerEmail = myPkg.author;
}
if (!opts.packageAgent) {
msgErr = "missing `packageAgent` and also failed to read `name` and/or `version` from `package.json`";
if (pkgErr) {
msgErr += ": " + pkgErr.message;
}
throw new Error(msgErr);
}
opts.maintainerEmail = parseMaintainer(opts.maintainerEmail);
if (!opts.maintainerEmail) {
msgErr =
"missing or malformed `maintainerEmail` (or `author` from `package.json`), which is used as the contact for support notices";
throw new Error(msgErr);
}
if (opts.packageRoot) {
// Place the rc file in the packageroot
rc = Rc._initSync(opts.packageRoot, opts.manager, opts.configDir);
opts.configDir = rc.configDir;
opts.manager = rc.manager;
}
if (!opts.configDir && !opts.manager) {
throw new Error("missing `packageRoot` and `configDir`, but no `manager` was supplied");
}
//var mkdirp = promisify(require("@root/mkdirp"));
var configFile = path.join(opts.configDir, "config.json");
var config;
try {
config = JSON.parse(fs.readFileSync(configFile));
} catch (e) {
if ("ENOENT" !== e.code) {
throw e;
}
config = { defaults: {} };
}
opts.manager = rc.manager || (config.defaults && config.defaults.manager) || config.manager;
if (!opts.manager) {
opts.manager = "@greenlock/manager";
}
if ("string" === typeof opts.manager) {
opts.manager = {
module: opts.manager
};
}
opts.manager = JSON.parse(JSON.stringify(opts.manager));
var confconf = ["configDir", "configFile", "staging", "directoryUrl"];
Object.keys(opts).forEach(function(k) {
if (!confconf.includes(k)) {
return;
}
if ("undefined" !== typeof opts.manager[k]) {
return;
}
opts.manager[k] = opts[k];
});
/*
var ignore = ["packageRoot", "maintainerEmail", "packageAgent", "staging", "directoryUrl", "manager"];
Object.keys(opts).forEach(function(k) {
if (ignore.includes(k)) {
return;
}
opts.manager[k] = opts[k];
});
*/
// Place the rc file in the configDir itself
//Rc._initSync(opts.configDir, opts.configDir);
return opts;
};
// ex: "John Doe <john@example.com> (https://john.doe)"
// ex: "John Doe <john@example.com>"
// ex: "<john@example.com>"
// ex: "john@example.com"
var looseEmailRe = /(^|[\s<])([^'" <>:;`]+@[^'" <>:;`]+\.[^'" <>:;`]+)/;
function parseMaintainer(maintainerEmail) {
try {
maintainerEmail = maintainerEmail.match(looseEmailRe)[2];
} catch (e) {
maintainerEmail = null;
}
return maintainerEmail;
}