192 lines
4.9 KiB
JavaScript
192 lines
4.9 KiB
JavaScript
'use strict';
|
|
|
|
// TODO how to handle path differences when run from npx vs when required by greenlock?
|
|
|
|
var fs = require('fs');
|
|
var path = require('path');
|
|
|
|
function saveFile(rcpath, data, enc) {
|
|
// because this may have a database url or some such
|
|
fs.writeFileSync(rcpath, data, enc);
|
|
return fs.chmodSync(rcpath, parseInt('0600', 8));
|
|
}
|
|
|
|
var GRC = (module.exports = function(pkgpath, manager, rc) {
|
|
// TODO when run from package
|
|
// Run from the package root (assumed) or exit
|
|
var pkgdir = path.dirname(pkgpath);
|
|
|
|
try {
|
|
require(pkgpath);
|
|
} catch (e) {
|
|
console.error(
|
|
'npx greenlock must be run from the package root (where package.json is)'
|
|
);
|
|
process.exit(1);
|
|
}
|
|
|
|
try {
|
|
return module.exports._defaults(pkgdir, manager, rc);
|
|
} catch (e) {
|
|
if ('package.json' === e.context) {
|
|
console.error(e.desc);
|
|
process.exit(1);
|
|
}
|
|
console.error(e.message);
|
|
process.exit(1);
|
|
}
|
|
});
|
|
|
|
// Figure out what to do between what's hard-coded,
|
|
// what's in the config file, and what's left unset
|
|
module.exports.resolve = function(gconf) {
|
|
var rc = GRC.read(gconf.packageRoot);
|
|
if (gconf.configFile) {
|
|
rc = { configFile: gconf.configFile };
|
|
}
|
|
|
|
var manager;
|
|
var updates;
|
|
|
|
if (rc.manager) {
|
|
if (gconf.manager && rc.manager !== gconf.manager) {
|
|
console.warn(
|
|
'warn: ignoring hard-coded ' +
|
|
gconf.manager +
|
|
' in favor of ' +
|
|
rc.manager
|
|
);
|
|
}
|
|
gconf.manager = rc.manager;
|
|
} else if (gconf.manager) {
|
|
manager = gconf.manager;
|
|
}
|
|
|
|
if (rc.configFile) {
|
|
if (gconf.configFile && rc.configFile !== gconf.configFile) {
|
|
console.warn(
|
|
'warn: ignoring hard-coded ' +
|
|
gconf.configFile +
|
|
' in favor of ' +
|
|
rc.configFile
|
|
);
|
|
}
|
|
gconf.configFile = rc.configFile;
|
|
} else if (gconf.manager) {
|
|
updates = { configFile: gconf.configFile };
|
|
}
|
|
|
|
return GRC._defaults(gconf.packageRoot, manager, rc);
|
|
};
|
|
|
|
module.exports._defaults = function(pkgdir, manager, rc) {
|
|
var rcpath = path.join(pkgdir, '.greenlockrc');
|
|
var _rc;
|
|
var created = false;
|
|
|
|
if (manager) {
|
|
if ('.' === manager[0]) {
|
|
manager = path.resolve(pkgdir, manager);
|
|
}
|
|
try {
|
|
require(manager);
|
|
} catch (e) {
|
|
console.error('could not load ' + manager + ' from ' + pkgdir);
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
var stuff = module.exports._read(pkgdir);
|
|
_rc = stuff.rc;
|
|
created = stuff.created;
|
|
|
|
var changed;
|
|
if (manager) {
|
|
if (!_rc.manager) {
|
|
_rc.manager = manager;
|
|
}
|
|
if (_rc.manager !== manager) {
|
|
console.info('Switching manager:');
|
|
var older = _rc.manager;
|
|
var newer = manager;
|
|
if ('/' === older[0]) {
|
|
older = path.relative(pkgdir, older);
|
|
}
|
|
if ('/' === newer[0]) {
|
|
newer = path.relative(pkgdir, newer);
|
|
}
|
|
console.info('\told: ' + older);
|
|
console.info('\tnew: ' + newer);
|
|
changed = true;
|
|
}
|
|
}
|
|
|
|
if (rc) {
|
|
changed = true;
|
|
Object.keys(rc).forEach(function(k) {
|
|
_rc[k] = rc[k];
|
|
});
|
|
}
|
|
|
|
if (['@greenlock/manager', 'greenlock-manager-fs'].includes(_rc.manager)) {
|
|
if (!_rc.configFile) {
|
|
changed = true;
|
|
_rc.configFile = path.join(pkgdir, 'greenlock.json');
|
|
}
|
|
}
|
|
|
|
if (!changed) {
|
|
return _rc;
|
|
}
|
|
|
|
var data = JSON.stringify(_rc, null, 2);
|
|
if (created) {
|
|
console.info('Wrote ' + rcpath);
|
|
}
|
|
saveFile(rcpath, data, 'utf8');
|
|
return _rc;
|
|
};
|
|
|
|
module.exports.read = function(pkgdir) {
|
|
return module.exports._read(pkgdir).rc;
|
|
};
|
|
|
|
module.exports._read = function(pkgdir) {
|
|
var created;
|
|
var rcpath = path.join(pkgdir, '.greenlockrc');
|
|
var _data;
|
|
try {
|
|
_data = fs.readFileSync(rcpath, 'utf8');
|
|
} catch (err) {
|
|
if ('ENOENT' !== err.code) {
|
|
throw err;
|
|
}
|
|
try {
|
|
require(path.resolve(path.join(pkgdir, './package.json')));
|
|
} catch (e) {
|
|
e.context = 'package.json';
|
|
e.desc =
|
|
'run `greenlock` from the same directory as `package.json`, or specify `packageRoot` of `.greenlockrc`';
|
|
throw e;
|
|
}
|
|
console.info('Creating ' + rcpath);
|
|
created = true;
|
|
_data = '{}';
|
|
saveFile(rcpath, _data, 'utf8');
|
|
}
|
|
|
|
var rc;
|
|
try {
|
|
rc = JSON.parse(_data);
|
|
} catch (e) {
|
|
console.error("couldn't parse " + rcpath, _data);
|
|
console.error('(perhaps you should just delete it and try again?)');
|
|
process.exit(1);
|
|
}
|
|
|
|
return {
|
|
created: created,
|
|
rc: rc
|
|
};
|
|
};
|