UNPKG

good-react-app

Version:

CreateGoodReactApp

149 lines (126 loc) 4.01 kB
#!/usr/bin/env node const chalk = require('chalk'); const boxen = require('boxen'); const prompts = require('prompts'); const { exec } = require('child_process'); const rimraf = require('rimraf'); const fs = require('fs-extra'); const path = require('path'); const npm = require('npm'); const { Spinner } = require('cli-spinner'); const spinner = new Spinner({ text: 'processing.. %s', stream: process.stderr, onTick(msg) { this.clearLine(this.stream); this.stream.write(msg); }, }); const NODE_MODULES = [ 'axios', 'class-names', 'i18next-chained-backend', 'i18next-localstorage-backend', 'i18next-xhr-backend', 'i18next', 'history', 'jwt-decode', 'lodash', 'moment', 'node-sass', 'react-i18next', 'react-redux', 'react-router-dom', 'redux-form', 'redux-logger', 'redux-persist', 'redux-thunk', 'redux-immutable-state-invariant', 'redux', ]; const greeting = chalk.white.bold(` GoodReactApp! __ __ / \\.-"""-./ \\ \\ - - / | o o | \\ .-'''-. / '-\\__Y__/-' \`---\` @powered by macik `); const boxenOptions = { padding: 1, margin: 1, borderStyle: 'round', borderColor: 'green', backgroundColor: '#555555', }; const welcome = boxen(greeting, boxenOptions); console.log(welcome); const installNodeModules = (projectName) => new Promise((resolve, reject) => { console.log('Installing your node_modules.'); npm.load({ loaded: false, prefix: `./${projectName}/`, }, (err) => { if (err) { return reject(err); } npm.commands.install(NODE_MODULES, (e, _data) => { if (e) { reject(e); } return resolve(); }); // npm.on('log', (message) => { // // console.log(message); // }); }); }); const execCommand = (command) => new Promise((resolve, reject) => exec(command, (error, _stdout, _stderror) => { if (error) { reject(error); } return resolve(); })); const removeFolderContent = (folder) => new Promise((resolve, reject) => { console.log('Cleaning a project directory.'); rimraf(folder, (err) => { if (err) { reject(err); } return resolve(); }); }); (async () => { try { const { projectName } = await prompts({ type: 'text', name: 'projectName', message: 'What is project name?', }); console.log('Creating folder using custom create-react-app, please wait.'); spinner.start(); await execCommand(`npx create-react-app ${projectName}`); spinner.stop(); await removeFolderContent(path.resolve(process.cwd(), projectName, 'src')); await removeFolderContent(path.resolve(process.cwd(), projectName, 'public')); console.log('Copying a GR. structures'); await fs.copy(path.resolve(__dirname, '../src', 'src'), path.resolve(process.cwd(), projectName, 'src')); await fs.copy(path.resolve(__dirname, '../src', 'public'), path.resolve(process.cwd(), projectName, 'public')); await fs.copy(path.resolve(__dirname, '../src', '.eslintrc'), path.resolve(process.cwd(), projectName, '.eslintrc')); await fs.copy(path.resolve(__dirname, '../src', '.editorconfig'), path.resolve(process.cwd(), projectName, '.editorconfig')); await fs.copy(path.resolve(__dirname, '../src', 'gitignore'), path.resolve(process.cwd(), projectName, '.gitignore')); await fs.copy(path.resolve(__dirname, '../src', 'npmrc'), path.resolve(process.cwd(), projectName, '.npmrc')); await fs.copy(path.resolve(__dirname, '../src', 'README.md'), path.resolve(process.cwd(), projectName, 'README.md')); // install chosen node moduls await installNodeModules(projectName); await execCommand(`cd ${projectName} && npm start`); console.log('Project succesfully created.'); console.log(`try 'cd ${projectName}'`); } catch (error) { console.error('error', error); process.exit(1); } })();