"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 (https://john.doe)" // ex: "John Doe " // ex: "" // ex: "john@example.com" var looseEmailRe = /(^|[\s<])([^'" <>:;`]+@[^'" <>:;`]+\.[^'" <>:;`]+)/; function parseMaintainer(maintainerEmail) { try { maintainerEmail = maintainerEmail.match(looseEmailRe)[2]; } catch (e) { maintainerEmail = null; } return maintainerEmail; }