Skip to content

Commit dff3a13

Browse files
authored
Merge pull request #2 from recifejs/feature/inserting-inquirer
Feature/inserting inquirer
2 parents 810d116 + 91e64fa commit dff3a13

7 files changed

Lines changed: 353 additions & 47 deletions

File tree

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@
2020
"recife-cli": "./bin/recife-cli"
2121
},
2222
"dependencies": {
23-
"commander": "^5.1.0"
23+
"commander": "^5.1.0",
24+
"inquirer": "^7.3.0"
2425
},
2526
"devDependencies": {
27+
"@types/inquirer": "^6.5.0",
2628
"@types/node": "^14.0.11",
2729
"typescript": "^3.0.0"
2830
},

src/generators/ProjectGenerator.ts

Lines changed: 74 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,95 @@
11
import fs from 'fs';
22
import path from 'path';
33
import commander from 'commander';
4-
import copyFolder from '../utils/copyFolder';
4+
import inquirer from 'inquirer';
55

6+
import { replaceMaskFile } from '../utils/replaceMask';
7+
import copyFolder from '../utils/copyFolder';
68
import createPackageJson from '../stages/CreatePackageJson';
79
import installDependencies from '../stages/InstallDependencies';
810
import initializeGit from '../stages/InitializeGit';
911
import Log from '../Log';
1012

11-
const createProject = (name: string) => {
12-
if (name) {
13-
Log.Instance.infoHeap(`Creating the project`);
13+
const createProject = (
14+
projectName: string,
15+
packageManager: 'yarn' | 'npm',
16+
httpFramework: 'koa' | 'express' | 'hapi'
17+
) => {
18+
Log.Instance.infoHeap(`Creating the project`);
1419

15-
const source = path.join(__dirname, '/../../templates/project');
16-
const target = path.join(process.cwd(), name);
20+
const source = path.join(__dirname, '/../../templates/project');
21+
const target = path.join(process.cwd(), projectName);
1722

18-
try {
19-
Log.Instance.infoHeap(`Copying files`);
20-
fs.mkdirSync(name);
23+
try {
24+
Log.Instance.infoHeap(`Copying files`);
25+
fs.mkdirSync(projectName);
2126

22-
copyFolder(source, target);
23-
fs.renameSync(
24-
path.join(target, 'gitignore'),
25-
path.join(target, '.gitignore')
26-
);
27+
copyFolder(source, target);
28+
fs.renameSync(
29+
path.join(target, 'gitignore'),
30+
path.join(target, '.gitignore')
31+
);
32+
replaceMaskFile(path.join(target, 'config/app.ts'), {
33+
projectName,
34+
httpFramework
35+
});
2736

28-
createPackageJson(target, name);
29-
installDependencies(target);
30-
initializeGit(name);
37+
createPackageJson(target, projectName, httpFramework);
38+
installDependencies(target, packageManager);
39+
initializeGit(projectName);
3140

32-
Log.Instance.successHeap(`The ${name} project was created.`);
33-
Log.Instance.info(`Path: ${target}\n\n`);
34-
} catch (err) {
35-
Log.Instance.exception(err);
36-
}
37-
} else {
38-
Log.Instance.errorHeap(`Specify the name project.`);
39-
Log.Instance.info(
40-
`For example: recife-cli project my-project-name\nRun --help for more information`
41-
);
41+
Log.Instance.successHeap(`The ${projectName} project was created.`);
42+
Log.Instance.info(`Path: ${target}\n\n`);
43+
} catch (err) {
44+
Log.Instance.exception(err);
4245
}
4346
};
4447

48+
const createProjectWithOptions = () => {
49+
inquirer
50+
.prompt([
51+
{
52+
name: 'projectName',
53+
message: 'Project Name:',
54+
type: 'string',
55+
default: 'my-project'
56+
},
57+
{
58+
name: 'packageManager',
59+
message: 'Package Manager:',
60+
type: 'list',
61+
default: 'npm',
62+
choices: ['npm', 'yarn']
63+
},
64+
{
65+
name: 'httpFramework',
66+
message: 'Http Framework:',
67+
type: 'list',
68+
default: 'koa',
69+
choices: ['koa', 'express', 'hapi']
70+
}
71+
])
72+
.then((answers: any) => {
73+
Log.Instance.jump();
74+
createProject(
75+
answers.projectName,
76+
answers.packageManager,
77+
answers.httpFramework
78+
);
79+
});
80+
};
81+
4582
commander
4683
.name(`recife-cli project`)
47-
.arguments('<project-name>')
48-
.action(name => createProject(name))
84+
.arguments('[project-name]')
85+
.option('-p, --package-manager <packageManager>', 'Package Manager', 'npm')
86+
.option('-h, --http-framework <httpFramework>', 'Http Framework', 'koa')
87+
.action((name, cmd) => {
88+
if (name) {
89+
createProject(name, cmd.packageManager, cmd.httpFramework);
90+
} else {
91+
createProjectWithOptions();
92+
}
93+
})
4994
.allowUnknownOption(false)
5095
.parse(process.argv);

src/stages/CreatePackageJson.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,20 @@ import fs from 'fs';
22
import path from 'path';
33
import Log from '../Log';
44

5-
const createPackageJson = (target: string, name: string) => {
5+
const versions = {
6+
koa: '^0.1.0',
7+
express: '^0.1.0',
8+
hapi: '^0.1.0'
9+
};
10+
11+
const createPackageJson = (
12+
target: string,
13+
name: string,
14+
httpFramework: 'koa' | 'express' | 'hapi'
15+
) => {
616
Log.Instance.infoHeap(`Creating file package.json`);
717

8-
const basePackageJson = {
18+
let basePackageJson: any = {
919
name: name,
1020
version: '0.0.1',
1121
license: 'MIT',
@@ -16,8 +26,7 @@ const createPackageJson = (target: string, name: string) => {
1626
},
1727
dependencies: {
1828
recife: '^0.7.0',
19-
typescript: '^3.*',
20-
'recife-koa': '^0.1.0'
29+
typescript: '^3.*'
2130
},
2231
browserslist: {
2332
production: ['>0.2%', 'not dead', 'not op_mini all'],
@@ -29,6 +38,9 @@ const createPackageJson = (target: string, name: string) => {
2938
}
3039
};
3140

41+
basePackageJson.dependencies[`recife-${httpFramework}`] =
42+
versions[httpFramework];
43+
3244
fs.writeFileSync(
3345
path.join(target, 'package.json'),
3446
JSON.stringify(basePackageJson, null, 2)

src/stages/InstallDependencies.ts

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11
import { spawnSync } from 'child_process';
22
import Log from '../Log';
33

4-
const yarnInstalled = () => {
5-
try {
6-
spawnSync('yarnpkg', ['--version'], { stdio: 'ignore' });
7-
return true;
8-
} catch (error) {
9-
return false;
10-
}
11-
};
12-
13-
const installDependencies = (target: string) => {
4+
const installDependencies = (
5+
target: string,
6+
packageManager: 'yarn' | 'npm'
7+
) => {
148
Log.Instance.infoHeap(`Installing dependencies`);
159

1610
const originalDirectory = process.cwd();
1711

1812
try {
1913
process.chdir(target);
2014

21-
if (yarnInstalled()) {
15+
if (packageManager === 'yarn') {
2216
spawnSync('yarnpkg', ['install'], { stdio: 'ignore' });
2317
} else {
2418
spawnSync('npm', ['install'], { stdio: 'ignore' });

src/utils/replaceMask.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
import fs from 'fs';
2+
3+
export const replaceMaskFile = (path: string, values: any) => {
4+
const contentFile = fs.readFileSync(path).toString();
5+
fs.writeFileSync(path, replaceMask(contentFile, values));
6+
};
7+
18
const replaceMask = (content: string, values: any): string => {
29
Object.keys(values).map(key => {
310
content = content.split(`[[${key}]]`).join(values[key]);

templates/project/config/app.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { AppConfig } from 'recife';
22

33
export const config: AppConfig = {
4-
appName: 'APP_NAME',
4+
appName: '[[projectName]]',
55
basePath: 'src',
66
port: 8100,
77
host: 'localhost',
8-
httpFramework: 'koa'
8+
httpFramework: '[[httpFramework]]'
99
};

0 commit comments

Comments
 (0)