polymerx-cli
Version:
Unlock the power of Polymer 3, Web Components and modern web tools.
213 lines (172 loc) • 6.81 kB
JavaScript
;
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;