UNPKG

polymerx-cli

Version:

Unlock the power of Polymer 3, Web Components and modern web tools.

213 lines (172 loc) 6.81 kB
"use strict"; exports.__esModule = true; exports.default = void 0; var _path = require("path"); var _ora = _interopRequireDefault(require("ora")); var _gittar = _interopRequireDefault(require("gittar")); var _inquirer = require("inquirer"); var _validateNpmPackageName = _interopRequireDefault(require("validate-npm-package-name")); var _gitUserLocal = _interopRequireDefault(require("git-user-local")); var _replaceOwner = _interopRequireDefault(require("../lib/replace-owner")); var _isMissing = _interopRequireDefault(require("../lib/is-missing")); var _asyncCommand = _interopRequireDefault(require("../lib/async-command")); var _which = _interopRequireDefault(require("../lib/which")); var _error = _interopRequireDefault(require("../lib/error")); var _isDir = _interopRequireDefault(require("../lib/is-dir")); var _extractTar = _interopRequireDefault(require("../lib/extract-tar")); var _install = _interopRequireDefault(require("../lib/install")); var _getPkg = _interopRequireDefault(require("../lib/get-pkg")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } const ORG = 'PolymerX-skeleton-templates'; const getAuthor = async () => { const { user } = await (0, _gitUserLocal.default)(); return `${user ? user.name : ''} <${user ? user.email : ''}>`; }; const capitalize = str => str.charAt(0).toUpperCase() + str.substring(1); const completeData = async (argv, spinner) => { const questions = (0, _isMissing.default)(argv); if (questions.length > 0) { spinner.warn('Missing commang arguments. Prompting...'); spinner.info('Alternatively, run `polymerx create --help` for usage info.'); } const response = await (0, _inquirer.prompt)(questions); return _extends({}, response); }; const checkExistOrForce = async (exists, isForceEnabled, spinner) => { if (exists && !isForceEnabled) { (0, _error.default)(`Refusing to overwrite current directory! Please specify a different destination or use the \`--force\` flag`, spinner); return process.exit(1); } if (exists && isForceEnabled) { const { enableForce } = await (0, _inquirer.prompt)({ type: 'confirm', name: 'enableForce', message: 'You are using \'--force\'. Do you wish to continue?', default: false }); if (!enableForce) { (0, _error.default)('Refusing to overwrite current directory!', spinner); return process.exit(1); } spinner.info('Initializing project in the current directory!'); } }; const getStarted = (destFolder, isYarn) => { const prefix = isYarn ? 'yarn' : 'npm run'; const text = ` To get started, cd into the new directory: cd ${destFolder} To start a the dev server with live-reload (for browsers WITHOUT ES6 module support): ${prefix} dev To create a production build (in ./dist): ${prefix} build To start a production HTTP server: ${prefix} start `; return console.log(text.trim().replace(/^\t+/gm, ''), '\n'); }; var _default = (0, _asyncCommand.default)({ command: 'create [template] [dest]', desc: 'Create a new application.', builder: { cwd: { description: 'A directory to use instead of $PWD.', default: '.' }, name: { description: 'The application\'s name' }, author: { description: 'Author of the app', default: null }, force: { description: 'Force option to create the directory for the new app', type: 'boolean', default: false }, yarn: { description: 'Use \'yarn\' instead of \'npm\'', type: 'boolean', default: false }, git: { description: 'Initialize version control using git', type: 'boolean', default: false }, install: { description: 'Install dependencies', type: 'boolean', default: true } }, async handler(argv) { const spinner = (0, _ora.default)({ text: 'Analyzing args...', color: 'magenta' }).start(); const restData = await completeData(argv, spinner); Object.assign(argv, restData); const cwd = (0, _path.resolve)(argv.cwd); const packageName = argv.name || argv.dest; const destFolder = argv.dest || (0, _path.dirname)(cwd); const target = (0, _path.resolve)(cwd, destFolder); const author = argv.author || (await getAuthor()); const installDeps = argv.install; const exists = (0, _isDir.default)(target); const isForceEnabled = argv.force; await checkExistOrForce(exists, isForceEnabled, spinner); const repo = argv.template.includes('/') ? argv.template : `${ORG}/${argv.template}`; spinner.info(`Getting ${repo}...`); const { errors } = (0, _validateNpmPackageName.default)(packageName); if (errors) { errors.unshift(`Invalid package name: ${packageName}`); (0, _error.default)(errors.map(capitalize).join('\n ~ '), spinner); return process.exit(1); } const archive = await _gittar.default.fetch(repo).catch(error => { const finalErr = error || { message: 'An error occured while fetching template.' }; (0, _error.default)(finalErr.code === 404 ? `Could not find repository: ${repo}` : finalErr.message, spinner); return process.exit(1); }); spinner.text = '⚡️ Creating project'; spinner.color = 'yellow'; spinner.start(); const keeps = await (0, _extractTar.default)(archive, target); const isRepoEmpty = keeps.length <= 0; if (isRepoEmpty) { (0, _error.default)(`No \`template\` directory found within ${repo}!`, spinner); return process.exit(); } spinner.color = 'magenta'; spinner.text = '⚙️ Making changes to files...'; await (0, _replaceOwner.default)(keeps, packageName, author); const pkg = await (0, _getPkg.default)(target); if (!pkg) { spinner.warn('⚠️ Could not locate `package.json` file!'); } const isYarn = argv.yarn && (await (0, _which.default)('yarn').catch(() => { (0, _error.default)('Yarn not found. Please remove the "--yarn" flag or install yarn.', spinner); process.exit(1); })); if (installDeps) { spinner.color = 'cyan'; spinner.text = '📦 Installing dependencies...'; await (0, _install.default)(target, isYarn); } spinner.succeed('Everything cloned and installed correctly!\n'); getStarted(destFolder, isYarn); } }); exports.default = _default;