good-react-app
Version:
CreateGoodReactApp
149 lines (126 loc) • 4.01 kB
JavaScript
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);
}
})();