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
 | 
						|
    };
 | 
						|
};
 |