rollup-umd-scripts
Version:
CLI for rollup-umd projects
355 lines (329 loc) • 15.8 kB
JavaScript
;
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* eslint-disable no-mixed-operators, no-multi-assign, no-undef, no-param-reassign, global-require, no-unused-vars, no-console, no-underscore-dangle, prefer-destructuring, no-shadow, no-useless-escape */
var fs = require('fs');
var path = require('path');
var async = require('async');
var rimraf = require('rimraf');
var copyDocHandler = require('./documentation_cmds/copy').handler;
var run = function () {
var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(argv, _ref2, done) {
var name = _ref2.name,
domain = _ref2.domain,
namespace = _ref2.namespace,
whoami = _ref2.whoami;
var thisPkg, bin, repository, declinationId;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
thisPkg = require(path.join(__dirname, '../../../package.json'));
bin = '' + path.join(__dirname, '../../../') + thisPkg.bin.scripts;
repository = argv.repository;
declinationId = void 0; // set during create and retrieved during package.json preparation (below)
async.auto({
cleanFolders: function cleanFolders(cb) {
var docsPath = path.join(argv.path, 'docs');
var readmePath = path.join(argv.path, 'README.md');
var licensePath = path.join(argv.path, 'LICENSE.md');
var styleguideConfigPath = path.join(argv.path, 'styleguide/styleguide.ext.json');
if (argv['clean-src']) {
var srcLocation = path.join(argv.path, 'src');
rimraf.sync(srcLocation);
fs.mkdirSync(srcLocation);
}
rimraf.sync(docsPath);
rimraf.sync(readmePath);
rimraf.sync(licensePath);
rimraf.sync(styleguideConfigPath);
cb();
},
copyDoc: ['cleanFolders', function (results, cb) {
return copyDocHandler(argv, cb);
}],
sonarProjectName: ['copyDoc', function (results, cb) {
var projectName = domain.split('.').reverse().join('.') + '.' + namespace + '.' + name;
cb(null, projectName);
}],
rollupPkg: ['sonarProjectName', function (results, cb) {
cb(null, require(path.join(argv.path, 'package.json')));
}],
url: ['rollupPkg', function (results, cb) {
return cb(null, 'https://' + domain + '/' + namespace + '/' + name);
}],
gitInit: ['url', function (results, cb) {
return spawn('git -C ' + argv.path + ' init', cb);
}],
gitRemoteAddOrigin: ['gitInit', function (results, cb) {
return spawn('git -C ' + argv.path + ' remote add origin ' + repository, cb);
}],
initPackageJson: ['gitRemoteAddOrigin', function (results, cb) {
var orgWithoutDomain = argv.organization.slice(0, argv.organization.lastIndexOf('.'));
var packageJsonPath = path.join(argv.path, 'package.json');
var pkg = require(packageJsonPath);
var keywordsUnmerged = [];
if (pkg.declinationId) {
declinationId = pkg.declinationId;
keywordsUnmerged = pkg.declinationId.split('-').map(function (i) {
if (i === 'bs') {
return ['bootstrap', 'bootstrap-styled', 'styled-components', 'react'];
} else if (i === 'intl') {
return 'react-intl';
} else if (i === 'saga') {
return 'redux-saga';
} else if (i === 'redux') {
return ['redux', 'react-redux'];
} else if (i === 'immutable') {
return 'immutablejs';
} else if (i === 'router') {
return ['react-router', 'react-router-dom'];
}
return i;
});
}
var keywords = [].concat.apply([], keywordsUnmerged); // eslint-disable-line
var contributor = [];
var author = void 0;
// TODO: later, fetch info from ldap or from Guest OS if using ldap
var dka = 'Dimitri Kopriwa <dimitri.kopriwa@' + argv.organization + '> (https://github.com/kopax)';
switch (whoami) {
case 'dka':
author = dka;
break;
case 'ajt':
author = 'Alexander Janet <alexander.janet@' + argv.organization + '> (https://github.com/santaclauze)';
break;
case 'agd':
author = 'Adrien Gadaud <adrien.gadaud@' + argv.organization + '> (https://github.com/pnepe6)';
break;
default:
author = whoami + ' <' + whoami + '@' + argv.organization + '>';
break;
}
if (whoami === 'ajt' || whoami === 'agd') {
contributor.push(dka);
}
var packageName = name;
if (argv.scope) {
packageName = argv.scope + '/' + name;
}
var newPkg = (0, _assign2.default)({}, pkg, {
name: packageName,
description: name,
version: '0.0.0-development',
module: 'dist/' + packageName + '.esm.js',
'jsnext:main': 'dist/' + packageName + '.esm.js',
homepage: 'https://' + namespace + '.' + argv['page-domain'] + '/' + name,
repository: {
type: 'git',
url: results.url + '.git'
},
bugs: {
url: results.url + '/issues'
},
keywords: keywords.concat([argv.organization]).concat(name.split('-')),
contributor: contributor,
author: author,
private: true
});
// If rollup was removed during declination, we don't have a dist
if (!pkg.devDependencies.rollup) {
delete newPkg.module;
delete newPkg['jsnext:main'];
}
delete newPkg.scripts.create;
fs.writeFileSync(packageJsonPath, (0, _stringify2.default)(newPkg, null, 2), { encoding: 'utf8' });
cb();
}],
createGitlabCi: ['initPackageJson', function (results, cb) {
var input = path.join(argv.path, 'internals/templates/.gitlab-ci.yml');
var output = path.join(argv.path, '.gitlab-ci.yml');
spawn('cp ' + input + ' ' + output, cb);
}],
createLicense: ['createGitlabCi', function (results, cb) {
var input = path.join(argv.path, 'internals/templates/LICENSE.md');
var output = path.join(argv.path, 'LICENSE.md');
var before = '$YEAR';
var after = new Date().getFullYear();
sedReplace(input, before, after, output, cb);
}],
createReadme: ['createLicense', function (results, cb) {
var input = path.join(argv.path, 'internals/templates/README.md');
var output = path.join(argv.path, 'README.md');
async.series([function (cb) {
return sedReplace(input, '$CI_PROJECT_URL', results.url, output, cb);
}, function (cb) {
return sedReplace(output, '$PACKAGE_NAMESPACE', namespace, output, cb);
}, function (cb) {
return sedReplace(output, '$PACKAGE_NAME', name, output, cb);
}, function (cb) {
return sedReplace(output, '$YEAR', new Date().getFullYear(), output, cb);
}, function (cb) {
return sedReplace(output, '$ROLLUP_VERSION', results.rollupPkg.version, output, cb);
}], cb);
}],
createSonarProject: ['createReadme', function (results, cb) {
var input = path.join(argv.path, 'internals/templates/sonar-project.properties');
var output = path.join(argv.path, 'sonar-project.properties');
var before = '$SONAR_NAME';
var after = results.sonarProjectName;
sedReplace(input, before, after, output, cb);
}],
createStyleguideConfig: ['createSonarProject', function (results, cb) {
var input = path.join(argv.path, 'internals/templates/styleguide/styleguide.ext.json');
var output = path.join(argv.path, 'styleguide/styleguide.ext.json');
spawn('cp ' + input + ' ' + output, cb);
}],
updateLicense: ['createStyleguideConfig', function (results, cb) {
return spawn('node ' + bin + ' license set ' + (typeof argv['copyright-holder'] === 'string' ? argv['copyright-holder'] : '') + ' -p ' + argv.path + ' -l ' + argv.license, cb);
}],
configurePublishing: ['updateLicense', function (results, cb) {
return argv.publish !== 'private' ? spawn('node ' + bin + ' publish set ' + argv.publish + ' -p ' + argv.path, cb) : cb();
}],
ribbon: ['configurePublishing', function (results, cb) {
return exec('node ' + bin + ' documentation ribbon -p ' + argv.path, cb);
}]
}, done);
case 5:
case 'end':
return _context.stop();
}
}
}, _callee, undefined);
}));
return function run(_x, _x2, _x3) {
return _ref.apply(this, arguments);
};
}();
exports.command = ['initialize <repository>', 'init'];
exports.desc = 'Initialize rollup for a given repository';
exports.builder = function (yargs) {
return yargs.option('path', {
alias: 'p',
describe: 'Set the project path',
default: process.cwd()
}).option('clean-src', {
alias: 'c',
describe: 'Clean src directory',
default: false
}).option('page-domain', {
alias: 'd',
describe: 'Set the GitLab page domain',
default: 'yeutech.com',
hidden: true
}).option('scope', {
alias: 's',
describe: 'Set the scope of your package',
default: '@yeutech',
hidden: true
}).option('publish', {
describe: 'Change the default publishing',
default: 'private',
choices: ['private', 'protected']
}).option('license', {
describe: 'Change the default license, you can read more on this link: https://spdx.org/licenses',
choices: ['UNLICENSED', 'MIT', 'Apache-2.0', 'BSD-3-Clause', 'GPL-3.0-only'],
hidden: true
}).option('copyright-holder', {
alias: 'c',
describe: 'Change the default copyright-holder',
hidden: true
}).option('organization', {
alias: 'o',
describe: 'Organization domain used for identifying user and keywords the project package.json',
hidden: true
});
};
exports.handler = function (argv) {
if (argv.scope && argv.scope.length > 0 && argv.scope[0] !== '@') {
throw new Error('Scope must include @ (eg: @' + argv.scope);
} else if (argv.scope.length === 0) {
argv.scope = null;
}
switch (argv.path[0]) {
case '/':
break;
default:
argv.path = argv.path[1] === '/' ? path.join(process.cwd(), argv.path.slice(2)) : path.join(process.cwd(), argv.path);
break;
}
// hidden from help default values
argv.license = argv.l = typeof argv.l === 'string' ? argv.l : 'UNLICENSED';
argv.organization = argv.o = typeof argv.o === 'string' ? argv.o : 'yeutech.vn';
var reRepository = /^(?:(?:https?|ssh):\/\/(?=[^@]+@[^:\/]+(?::\d+)?\/)|(?=git@[^:\/]+(?::\d+)?:))([^@]+)@([^:\/]+)(?::\d+)?(?:[:\/]([^:\/]+)\/)([\w-]+)\.git$/;
var matches = argv.repository.match(reRepository);
if (!matches) {
console.error('[ERROR] You can initialize the repo for git url only (start with "ssh|http|https|git" and end up with ".git", example: ssh://git@github.com/' + argv.organization.slice(0, argv.organization.lastIndexOf('.')) + '/sample-project.git');
process.exit(1);
}
async.auto({
whoami: function whoami(cb) {
return spawn('whoami', function (e, r) {
return cb(e, r[0].replace(/\n/, ''));
});
}
}, function (er, r) {
run(argv, {
name: matches[4],
domain: matches[2],
namespace: matches[3],
whoami: r.whoami
}, function (e, res) {
if (e) {
console.error('[ERROR] ' + e.message);
process.exit(1);
}
/** from now on, the repository is initialized, we only clean and prepare branches. */
async.auto({
cleanTemplates: function cleanTemplates(cb) {
exec('rm -rf ' + path.join(argv.path, 'internals/templates'), cb);
},
add: ['cleanTemplates', function (results, cb) {
return spawn('git -C ' + argv.path + ' add -A', cb);
}],
commit: ['add', function (results, cb) {
return exec('git -C ' + argv.path + ' commit -m \'chore(init): Initialization\'', cb);
}],
push: ['commit', function (results, cb) {
spawn('git -C ' + argv.path + ' push origin master', function (err, stdout, stderr) {
if (err) {
console.log('[Warning] We could not push on master branch. You must have permissions to push on the repository first. Try again with command:\n git -C ' + argv.path + ' push origin master\n');
}
cb(null, stdout || stderr);
});
}],
checkoutDev: ['push', function (results, cb) {
return spawn('git -C ' + argv.path + ' checkout -b dev', cb);
}],
pushDev: ['checkoutDev', function (results, cb) {
spawn('git -C ' + argv.path + ' push origin dev', function (err, stdout, stderr) {
if (err) {
console.log('[Warning] We could not push on dev branch. You must have permissions to push on the repository first. Try again with command:\n$ git -C ' + argv.path + ' push origin dev\n');
}
cb(null, stdout || stderr);
});
}],
checkoutWhoAmI: ['pushDev', function (results, cb) {
return spawn('git -C ' + argv.path + ' checkout -b ' + r.whoami + '-dev', cb);
}]
}, function (err, results) {
if (err) {
console.error('[ERROR] Fail during branch preparation: ' + err.message);
process.exit(1);
}
console.log('[Success] Rollup initialized!');
console.log('Use the following command to create your working branch:');
console.log('');
console.log('git -C ' + argv.path + ' push origin ' + r.whoami + '-dev');
});
});
});
};