|
7 | 7 | *****************************************************************/
|
8 | 8 | 'use strict';
|
9 | 9 |
|
10 |
| -const inquirer = require("inquirer"); |
11 |
| -const figlet = require("figlet"); |
12 |
| -const chalk = require("chalk"); |
| 10 | +const inquirer = require('inquirer'); |
13 | 11 | const path = require('path');
|
14 | 12 | const { readdir } = require('fs').promises;
|
15 |
| -const clone = require("git-clone"); |
| 13 | +const clone = require('git-clone'); |
| 14 | +const log = require('./log.js'); |
16 | 15 |
|
17 |
| -async function createProject() { |
| 16 | +const createProject = async () => { |
18 | 17 | 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) |
28 | 28 |
|
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); |
31 | 30 | } catch(error) {
|
32 |
| - console.error(chalk.red(error)); |
| 31 | + console.error(error); |
33 | 32 | }
|
34 | 33 | }
|
35 | 34 |
|
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 = () => { |
37 | 57 | 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 => { |
56 | 70 | resolve(result);
|
57 |
| - } catch(error) { |
| 71 | + }) |
| 72 | + .catch(error => { |
58 | 73 | reject(error);
|
59 |
| - } |
| 74 | + }); |
60 | 75 | });
|
61 | 76 | };
|
62 | 77 |
|
63 |
| -function getTemplate(project) { |
| 78 | +const selectedTemplate = (framework) => { |
64 | 79 | 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); |
74 | 81 |
|
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 => { |
77 | 94 | reject(error);
|
78 |
| - } |
| 95 | + }); |
79 | 96 | });
|
80 | 97 | };
|
81 | 98 |
|
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 | +}; |
89 | 122 |
|
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(); |
91 | 130 | } catch(error) {
|
92 | 131 | reject(error);
|
93 | 132 | }
|
94 | 133 | });
|
95 |
| -} |
| 134 | +}; |
96 | 135 |
|
97 | 136 | createProject();
|
0 commit comments