UNPKG

rollup-umd-scripts

Version:

CLI for rollup-umd projects

355 lines (329 loc) 15.8 kB
'use strict'; 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'); }); }); }); };