Skip to content

Commit c890d3c

Browse files
authored
Merge pull request #4 from ljlm0402/development
🎉 Releases 1.1.0
2 parents ba9a95c + ae68c22 commit c890d3c

13 files changed

+256
-128
lines changed

.github/ISSUE_TEMPLATE.md

+7-11
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,21 @@
1-
# 💙 TypeScript Github CLI
2-
3-
## Please briefly explain your Repositories.
4-
5-
```
6-
7-
```
1+
# 💙 TypeScript Github Clone CLI
82

93
## Please write according to the format.
104
<!-- Example
115
{
12-
name: '<repo_name>',
136
url: '<repo_url>',
14-
author: '<your_name>'
7+
name: '<repo_name>',
8+
author: '<your_name>',
9+
description: '<repo_desc>'
1510
}
1611
-->
1712

1813
```sh
1914
{
20-
name: '',
2115
url: '',
22-
author: ''
16+
name: '',
17+
author: '',
18+
description: ''
2319
}
2420
```
2521

README.md

+18-8
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
<img src='https://github.com/ljlm0402/tsghc/raw/images/logo.jpg' border='0' alt='logo' />
22

3-
[TypeScript's](https://www.npmjs.com/package/typescript) [GitHub](https://github.com/) CLI Tool.
4-
53
<a href="https://www.npmjs.com/package/tsghc" target="_blank"><img src="https://img.shields.io/npm/v/tsghc.svg" alt="NPM Version" /></a>
64
<a href="https://www.npmjs.com/package/tsghc" target="_blank"><img src="https://img.shields.io/npm/l/tsghc.svg" alt="Package License" /></a>
75
<a href="https://www.npmjs.com/package/tsghc" target="_blank"><img src="https://img.shields.io/github/v/release/ljlm0402/tsghc" alt="Release Version" /></a>
86
<a href="https://www.npmjs.com/package/tsghc" target="_blank"><img src="https://img.shields.io/npm/dm/tsghc.svg" alt="NPM Downloads" /></a>
97

108
<br />
119

12-
## 🌈 tsghc?
10+
## 🔎 What is it ?
1311

14-
__tsghc__ is a CLI module that quickly fetches and uses Repositories composed of TypeScript.
12+
__tsghc__ is a CLI module that quickly clones GitHub Repositories composed of TypeScript.
1513

1614
## 🚀 Quick Start
1715

@@ -29,15 +27,27 @@ $ tsghc
2927

3028
<img src='https://github.com/ljlm0402/tsghc/raw/images/cli.gif' border='0' alt='cli' />
3129

32-
## 🤝 Please pull request from your repository.
30+
## 🕹 It supports various frameworks.
31+
32+
![](https://img.shields.io/badge/-Angular-DD0031?style=for-the-badge&logo=angular&logoColor=fff)
33+
![](https://img.shields.io/badge/-React-61DAFB?style=for-the-badge&logo=react&logoColor=fff)
34+
![](https://img.shields.io/badge/-Next-000000?style=for-the-badge&logo=next.js&logoColor=fff)
35+
![](https://img.shields.io/badge/-Vue-4FC08D?style=for-the-badge&logo=vue.js&logoColor=fff)
36+
![](https://img.shields.io/badge/-Nuxt-00C58E?style=for-the-badge&logo=nuxt.js&logoColor=fff)
37+
![](https://img.shields.io/badge/-Express-F8F8F5?style=for-the-badge)
38+
![](https://img.shields.io/badge/-Nest-E0234E?style=for-the-badge&logo=nestjs&logoColor=fff)
39+
![](https://img.shields.io/badge/-Fastify-000000?style=for-the-badge&logo=fastify&logoColor=fff)
40+
41+
## 🙏 Please pull request from your repository.
3342

34-
Add it to the template folder file according to your repo's framework.
43+
Add it to the template folder file according to your repo's framework. [here](https://github.com/ljlm0402/tsghc/issues/new)
3544

3645
```js
3746
{
38-
name: '<repo_name>',
3947
url: '<repo_url>',
40-
author: '<your_name>'
48+
name: '<repo_name>',
49+
author: '<your_name>',
50+
description: '<repo_desc>'
4151
}
4252
```
4353

bin/cli.js

+99-60
Original file line numberDiff line numberDiff line change
@@ -7,91 +7,130 @@
77
*****************************************************************/
88
'use strict';
99

10-
const inquirer = require("inquirer");
11-
const figlet = require("figlet");
12-
const chalk = require("chalk");
10+
const inquirer = require('inquirer');
1311
const path = require('path');
1412
const { readdir } = require('fs').promises;
15-
const clone = require("git-clone");
13+
const clone = require('git-clone');
14+
const log = require('./log.js');
1615

17-
async function createProject() {
16+
const createProject = async () => {
1817
try {
19-
console.log(
20-
chalk.blue.bgWhite(
21-
figlet.textSync("TypeScript GitHub Cli", { horizontalLayout: "fitted", font: "Standard" })
22-
)
23-
);
24-
25-
const project = await getProject();
26-
const template = await getTemplate(project);
27-
const target = await cloneProject(project, template);
18+
log.cli();
19+
let decide, info;
20+
const { project } = await inputProjectName();
21+
22+
do {
23+
const { framework } = await selectedFramework();
24+
const { template } = await selectedTemplate(framework);
25+
info = await getTemplateInfo(framework, template);
26+
decide = await decideTemplate(template);
27+
} while (!decide)
2828

29-
console.log(chalk.green('Your Starter Template created.'));
30-
console.info(chalk.yellow(`Template Info \n name: ${target.name} \n author: ${target.author} \n github: ${target.url}`));
29+
await cloneProject(project, info);
3130
} catch(error) {
32-
console.error(chalk.red(error));
31+
console.error(error);
3332
}
3433
}
3534

36-
function getProject() {
35+
const inputProjectName = () => {
36+
return new Promise((resolve, reject) => {
37+
inquirer.prompt([
38+
{
39+
type: 'input',
40+
name: 'project',
41+
message: 'Please enter the desired project name.',
42+
default: 'Selected Template Name'
43+
}
44+
])
45+
.then(result => {
46+
resolve({
47+
project: result.project.replace(/\s+/g, '-').toLowerCase()
48+
});
49+
})
50+
.catch(error => {
51+
reject(error);
52+
});
53+
});
54+
};
55+
56+
const selectedFramework = () => {
3757
return new Promise(async (resolve, reject) => {
38-
try {
39-
const contents = await readdir(path.join(__dirname, '../template'), { withFileTypes: true });
40-
const result = await inquirer.prompt([
41-
{
42-
type: "input",
43-
name: "name",
44-
message: "Please enter the desired project name.",
45-
default: "Selected Template Name",
46-
},
47-
{
48-
type: "list",
49-
name: "framework",
50-
message: "Please select the desired project Freamework.",
51-
choices: contents.filter(p => !p.isDirectory()).map(p => (p.name).replace('.js', '').replace(/\b[a-z]/, letter => letter.toUpperCase()))
52-
}
53-
]);
54-
55-
result.name = result.name.replace(/\s+/g, "-").toLowerCase();
58+
let framework = await readdir(path.join(__dirname, '../template'), { withFileTypes: true });
59+
framework = framework.filter(p => !p.isDirectory()).map(p => (p.name).replace('.js', '').replace(/\b[a-z]/, letter => letter.toUpperCase()));
60+
61+
inquirer.prompt([
62+
{
63+
type: 'list',
64+
name: 'framework',
65+
message: 'Please select the desired project Freamework.',
66+
choices: framework
67+
}
68+
])
69+
.then(result => {
5670
resolve(result);
57-
} catch(error) {
71+
})
72+
.catch(error => {
5873
reject(error);
59-
}
74+
});
6075
});
6176
};
6277

63-
function getTemplate(project) {
78+
const selectedTemplate = (framework) => {
6479
return new Promise((resolve, reject) => {
65-
try {
66-
const frameworkPrompt = [
67-
{
68-
type: "list",
69-
name: "template",
70-
message: `The Freamework you choose is ${project.framework}. Select the template you want.`,
71-
choices: require(`../template/${project.framework.toLowerCase()}`).map(template => template.name)
72-
}
73-
];
80+
const template = require(`../template/${framework.toLowerCase()}`).map(template => template.title);
7481

75-
resolve(frameworkPrompt);
76-
} catch(error) {
82+
inquirer.prompt([
83+
{
84+
type: 'list',
85+
name: 'template',
86+
message: `The Freamework you choose is ${framework}. Select the template you want.`,
87+
choices: template
88+
}
89+
])
90+
.then(result => {
91+
resolve(result);
92+
})
93+
.catch(error => {
7794
reject(error);
78-
}
95+
});
7996
});
8097
};
8198

82-
function cloneProject(project, template) {
83-
return new Promise(async (resolve, reject) => {
84-
try {
85-
const result = await inquirer.prompt(template);
86-
const projectName = project.name === 'selected-template-name' ? result.template : project.name;
87-
const target = require(`../template/${project.framework.toLowerCase()}`).find(template => template.name === result.template);
88-
clone(target.url, `./${projectName}`);
99+
const getTemplateInfo = (framework, template) => {
100+
const data = require(`../template/${framework.toLowerCase()}`).find(t => t.title === template);
101+
log.info(data);
102+
return data;
103+
}
104+
105+
const decideTemplate = (template) => {
106+
return new Promise((resolve, reject) => {
107+
inquirer.prompt([
108+
{
109+
type: 'confirm',
110+
name: 'decide',
111+
message: `Would you like to decide with the ${template} template ?`,
112+
}
113+
])
114+
.then(result => {
115+
resolve(result.decide);
116+
})
117+
.catch(error => {
118+
reject(error);
119+
});
120+
});
121+
};
89122

90-
resolve(target);
123+
const cloneProject = (project, template) => {
124+
return new Promise((resolve, reject) => {
125+
try {
126+
const projectName = project === 'selected-template-name' ? template.title : project;
127+
clone(template.url, `./${projectName}`);
128+
log.interactive();
129+
resolve();
91130
} catch(error) {
92131
reject(error);
93132
}
94133
});
95-
}
134+
};
96135

97136
createProject();

bin/log.js

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*****************************************************************
2+
* The generated project is a tsghc.
3+
* The person who developed it is AGUMON <[email protected]>.
4+
* The date of development is September 29, 2020.
5+
*****************************************************************/
6+
'use strict';
7+
8+
const figlet = require('figlet');
9+
const chalk = require('chalk');
10+
const { Signale } = require('signale');
11+
12+
exports.cli = () => {
13+
console.log(
14+
chalk.blue.bgWhite(
15+
figlet.textSync('TypeScript GitHub Clone', { horizontalLayout: 'fitted', font: 'Standard' })
16+
)
17+
);
18+
};
19+
20+
exports.info = (data) => {
21+
const option = {
22+
types: {
23+
url: {
24+
badge: '❤️',
25+
color: 'red',
26+
label: 'URL'
27+
},
28+
title: {
29+
badge: '💛',
30+
color: 'yellow',
31+
label: 'TITLE'
32+
},
33+
author: {
34+
badge: '💚',
35+
color: 'green',
36+
label: 'AUTHOR'
37+
},
38+
desc: {
39+
badge: '💙',
40+
color: 'blue',
41+
label: 'DESC'
42+
}
43+
}
44+
};
45+
46+
const template = new Signale(option);
47+
data.url && template.url(data.url);
48+
data.title && template.title(data.title);
49+
data.author && template.author(data.author);
50+
data.description && template.desc(data.description);
51+
};
52+
53+
exports.interactive = () => {
54+
const interactive = new Signale({ interactive: true });
55+
interactive.wait('[%d / 3] - Get GitHub Repositories Info.', 1);
56+
57+
setTimeout(() => {
58+
interactive.start('[%d / 3] - Start GitHub Repositories Clone', 2);
59+
setTimeout(() => {
60+
interactive.complete('[%d / 3] - Complete GitHub Repositories Clone', 3);
61+
}, 1000);
62+
}, 1000);
63+
};

package.json

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "tsghc",
3-
"version": "1.0.0",
3+
"version": "1.1.0",
44
"description": "TypeScript GitHub Clone CLI Tool",
55
"author": "AGUMON <[email protected]>",
66
"license": "MIT",
@@ -14,24 +14,25 @@
1414
"clone",
1515
"angular",
1616
"react",
17+
"next",
1718
"vue",
19+
"nuxt",
1820
"express",
19-
"fastify",
2021
"nest",
21-
"project"
22+
"fastify"
2223
],
2324
"bin": {
2425
"tsghc": "bin/cli.js"
2526
},
2627
"scripts": {
27-
"tsghc": "node bin/cli.js"
28+
"dev": "node bin/cli.js"
2829
},
2930
"dependencies": {
30-
"arg": "^4.1.3",
3131
"chalk": "^4.1.0",
3232
"figlet": "^1.5.0",
3333
"git-clone": "^0.1.0",
34-
"inquirer": "^7.3.3"
34+
"inquirer": "^7.3.3",
35+
"signale": "^1.4.0"
3536
},
3637
"devDependencies": {},
3738
"publishConfig": {

template/angular.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
module.exports = [
44
{
5-
name: 'universal-starter',
65
url: 'https://github.com/angular/universal-starter.git',
7-
author: 'vikerman'
6+
title: 'universal-starter',
7+
author: 'vikerman',
8+
description: 'Angular Universal starter kit by @AngularClass'
89
}
910
];

0 commit comments

Comments
 (0)