UNPKG

react-static

Version:

A progressive static site generator for React

380 lines (282 loc) 13.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _fsExtra = require('fs-extra'); var _fsExtra2 = _interopRequireDefault(_fsExtra); var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _gitPromise = require('git-promise'); var _gitPromise2 = _interopRequireDefault(_gitPromise); var _child_process = require('child_process'); var _inquirer = require('inquirer'); var _inquirer2 = _interopRequireDefault(_inquirer); var _inquirerAutocompletePrompt = require('inquirer-autocomplete-prompt'); var _inquirerAutocompletePrompt2 = _interopRequireDefault(_inquirerAutocompletePrompt); var _matchSorter = require('match-sorter'); var _matchSorter2 = _interopRequireDefault(_matchSorter); var _downloadGitRepo = require('download-git-repo'); var _downloadGitRepo2 = _interopRequireDefault(_downloadGitRepo); var _util = require('util'); var _utils = require('../utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } _inquirer2.default.registerPrompt('autocomplete', _inquirerAutocompletePrompt2.default); exports.default = function () { var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee3() { var _this = this; var fetchTemplate = function () { var _ref5 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2(template, dest) { var getGitHubRepo; return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (!silent) console.log(''); if (!(template.startsWith('https://') || template.startsWith('git@'))) { _context2.next = 14; break; } _context2.prev = 2; if (!silent) console.log(_chalk2.default.green('Downloading template: ' + template)); _context2.next = 6; return (0, _gitPromise2.default)('clone --recursive ' + template + ' ' + dest); case 6: _context2.next = 12; break; case 8: _context2.prev = 8; _context2.t0 = _context2['catch'](2); if (!silent) console.log(_chalk2.default.red('Download of ' + template + ' failed')); throw _context2.t0; case 12: _context2.next = 48; break; case 14: if (!template.startsWith('http://')) { _context2.next = 28; break; } // use download-git-repo to fetch remote repository getGitHubRepo = (0, _util.promisify)(_downloadGitRepo2.default); _context2.prev = 16; if (!silent) console.log(_chalk2.default.green('Downloading template: ' + template)); _context2.next = 20; return getGitHubRepo(template, dest); case 20: _context2.next = 26; break; case 22: _context2.prev = 22; _context2.t1 = _context2['catch'](16); if (!silent) console.log(_chalk2.default.red('Download of ' + template + ' failed')); throw _context2.t1; case 26: _context2.next = 48; break; case 28: if (!exampleList.includes(template)) { _context2.next = 38; break; } _context2.prev = 29; if (!silent) console.log(_chalk2.default.green('Using template: ' + template)); return _context2.abrupt('return', _fsExtra2.default.copy(_path2.default.resolve(__dirname, '../../examples/' + template), dest)); case 34: _context2.prev = 34; _context2.t2 = _context2['catch'](29); if (!silent) console.log(_chalk2.default.red('Copying the template: ' + template + ' failed')); throw _context2.t2; case 38: _context2.prev = 38; if (!silent) console.log(_chalk2.default.green('Using template from directory: ' + template)); _context2.next = 42; return _fsExtra2.default.copy(_path2.default.resolve(__dirname, template), dest); case 42: _context2.next = 48; break; case 44: _context2.prev = 44; _context2.t3 = _context2['catch'](38); if (!silent) { console.log(_chalk2.default.red('Copying the template from directory: ' + template + ' failed')); } throw _context2.t3; case 48: case 'end': return _context2.stop(); } } }, _callee2, this, [[2, 8], [16, 22], [29, 34], [38, 44]]); })); return function fetchTemplate(_x4, _x5) { return _ref5.apply(this, arguments); }; }(); var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, name = _ref2.name, template = _ref2.template, isCLI = _ref2.isCLI, _ref2$silent = _ref2.silent, silent = _ref2$silent === undefined ? !isCLI : _ref2$silent; var prompts, files, exampleList, exampleChoices, shouldPrompt, answers, dest, _ref4, githubRepoName, isYarn; return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: prompts = []; _context3.next = 3; return _fsExtra2.default.readdir(_path2.default.resolve(__dirname, '../../examples/')); case 3: files = _context3.sent; if (!silent) console.log(''); exampleList = files.filter(function (d) { return !d.startsWith('.'); }); exampleList = ['basic'].concat(_toConsumableArray(exampleList.filter(function (d) { return d !== 'basic'; }))); exampleChoices = [].concat(_toConsumableArray(exampleList), ['custom']); // prompt if --name argument is not passed from CLI // warning: since name will be set as a function by commander by default // unless it's assigned as an argument from the CLI, we can't simply just // check for it's existence. if it's not been set by the CLI, we properly // set it to null for later conditional checks. if (typeof name !== 'string') { name = null; prompts.push({ type: 'input', name: 'name', message: 'What should we name this project?', default: 'my-static-site' }); } // prompt if --template argument is not passed from CLI if (!template) { prompts.push({ type: 'autocomplete', name: 'template', message: 'Select a template below...', source: function () { var _ref3 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(answersSoFar, input) { return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: return _context.abrupt('return', !input ? exampleChoices : (0, _matchSorter2.default)(exampleChoices, input)); case 1: case 'end': return _context.stop(); } } }, _callee, _this); })); return function source(_x2, _x3) { return _ref3.apply(this, arguments); }; }() }); } shouldPrompt = isCLI && (!name || !template); if (!shouldPrompt) { _context3.next = 17; break; } _context3.next = 14; return _inquirer2.default.prompt(prompts); case 14: _context3.t0 = _context3.sent; _context3.next = 18; break; case 17: _context3.t0 = {}; case 18: answers = _context3.t0; if (answers.name) { name = answers.name; } if (answers.template) { template = answers.template; } if (name) { _context3.next = 23; break; } throw new Error('A project name is required. Please use options.name to define one.'); case 23: if (template) { _context3.next = 25; break; } throw new Error('A project template is required. Please use options.template to define one.'); case 25: if (!silent) console.time(_chalk2.default.green('=> [\u2713] Project "' + name + '" created')); if (!silent) console.log('=> Creating new react-static project...'); dest = _path2.default.resolve(process.cwd(), name); if (!(template === 'custom')) { _context3.next = 34; break; } _context3.next = 31; return _inquirer2.default.prompt([{ type: 'input', name: 'githubRepoName', message: 'Specify the full address of a public git repo from GitHub, BitBucket, GitLab, etc. (https://github.com/ownerName/repoName.git)', default: 'basic' }]); case 31: _ref4 = _context3.sent; githubRepoName = _ref4.githubRepoName; template = githubRepoName; case 34: _context3.next = 36; return fetchTemplate(template, dest); case 36: if (_fsExtra2.default.pathExistsSync(_path2.default.join(dest, '.gitignore'))) { _context3.next = 39; break; } _context3.next = 39; return _fsExtra2.default.move(_path2.default.join(dest, 'gitignore'), _path2.default.join(dest, '.gitignore')); case 39: if (_fsExtra2.default.pathExistsSync(_path2.default.join(dest, 'gitignore'))) { _fsExtra2.default.removeSync(_path2.default.join(dest, 'gitignore')); } isYarn = shouldUseYarn(); if (isCLI) { if (!silent) { console.log('=> Installing dependencies with: ' + (isYarn ? _chalk2.default.hex(_utils.ChalkColor.yarn)('Yarn') : _chalk2.default.hex(_utils.ChalkColor.npm)('NPM')) + '...'); } // We install react-static separately to ensure we always have the latest stable release (0, _child_process.execSync)('cd ' + name + ' && ' + (isYarn ? 'yarn' : 'npm install') + ' && ' + (isYarn ? 'yarn add react-static@latest' : 'npm install react-static@latest --save')); if (!silent) console.log(''); } if (!silent) console.timeEnd(_chalk2.default.green('=> [\u2713] Project "' + name + '" created')); if (!silent) { console.log('\n ' + _chalk2.default.green('=> To get started:') + '\n\n cd ' + name + ' ' + (!isCLI ? '&& ' + (isYarn ? _chalk2.default.hex(_utils.ChalkColor.yarn)('yarn') : _chalk2.default.hex(_utils.ChalkColor.npm)('npm install')) : '') + '\n\n ' + (isYarn ? _chalk2.default.hex(_utils.ChalkColor.yarn)('yarn') : _chalk2.default.hex(_utils.ChalkColor.npm)('npm run')) + ' start ' + _chalk2.default.green('- Start the development server') + '\n ' + (isYarn ? _chalk2.default.hex(_utils.ChalkColor.yarn)('yarn') : _chalk2.default.hex(_utils.ChalkColor.npm)('npm run')) + ' build ' + _chalk2.default.green('- Build for production') + '\n ' + (isYarn ? _chalk2.default.hex(_utils.ChalkColor.yarn)('yarn') : _chalk2.default.hex(_utils.ChalkColor.npm)('npm run')) + ' serve ' + _chalk2.default.green('- Test a production build locally') + '\n '); } case 44: case 'end': return _context3.stop(); } } }, _callee3, this); })); function create() { return _ref.apply(this, arguments); } return create; }(); function shouldUseYarn() { try { (0, _child_process.execSync)('yarnpkg --version', { stdio: 'ignore' }); return true; } catch (e) { return false; } }