create-react-component-library
Version:
Create react component library command line utility
102 lines • 4.24 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const lodash_defaults_1 = __importDefault(require("lodash.defaults"));
const execa_1 = __importDefault(require("execa"));
const listr_1 = __importDefault(require("listr"));
const validate_npm_package_name_1 = __importDefault(require("validate-npm-package-name"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const path_1 = __importDefault(require("path"));
const chalk_1 = __importDefault(require("chalk"));
const emojis_1 = __importDefault(require("./emojis"));
// Init
const getOpts = (options) => lodash_defaults_1.default({}, options, {
appDir: process.cwd(),
verbose: false,
fromGitRepo: "https://github.com/magneh/react-component-library.git",
});
// Exports
async function init(options) {
const opts = getOpts(options);
const appName = opts.name;
const appDir = path_1.default.resolve(opts.appDir, opts.name);
const taskOptions = {
showSubtasks: true,
renderer: opts.verbose ? "default" : "silent",
nonTTYRenderer: opts.verbose ? "verbose" : "silent",
};
const tasks = new listr_1.default([
{
title: "Prerequisite checks",
task: () => new listr_1.default([
{
title: "Validate project name",
task: () => {
const projectNameValidation = validate_npm_package_name_1.default(opts.name);
if (!projectNameValidation.validForNewPackages) {
const error = (projectNameValidation.errors &&
projectNameValidation.errors[0]) ||
(projectNameValidation.warnings &&
projectNameValidation.warnings[0]);
throw new Error(`Project ${error}`);
}
return `${chalk_1.default.green(emojis_1.default.success)} Project name is valid`;
},
},
{
title: "Ensure directory does not already exists",
task: () => {
if (fs_extra_1.default.existsSync(appDir))
throw new Error(`Something already exists at ${chalk_1.default.cyan(appName)}`);
return `${chalk_1.default.green(emojis_1.default.success)} Project directory is available`;
},
},
], taskOptions),
},
{
title: `Cloning project from ${chalk_1.default.cyan(opts.fromGitRepo)}`,
task: async () => {
try {
await execa_1.default("git", [
"clone",
"--quiet",
"--origin=upstream",
opts.fromGitRepo,
appDir,
]);
}
catch (err) {
throw new Error(`Failed to clone from git repo ${opts.fromGitRepo}. Make sure you have git (https://git-scm.com/) installed, the remote repository exists, you have the necessary permissions and internet connectivity.`);
}
},
},
{
title: "Changing working directory",
task: () => process.chdir(appDir),
},
{
title: "Preparing new git repository",
task: async () => {
try {
await execa_1.default("git", ["branch", "--unset-upstream"]);
}
catch (err) {
throw new Error("Failed to prepare git repo");
}
},
},
{
title: "Installing project dependencies",
task: () => execa_1.default("npm", ["install"]),
},
], taskOptions);
/**
* Create project
*/
const context = await tasks.run();
return { context, tasks, appDir, appName };
}
exports.default = init;
//# sourceMappingURL=init.js.map