-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathget-node-app.js
executable file
·140 lines (137 loc) · 4.99 KB
/
get-node-app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/usr/bin/env node
const inquirer = require("inquirer");
const fs = require('fs-extra');
const path = require('path');
const ora = require('ora');
const chalk = require('chalk');
const { performChecks } = require('./helpers/checks');
const { getTemplateList, downloadTemplate } = require('./helpers/templates');
const { getRandomPhrase } = require('./helpers/misc');
const { createAppDataDir } = require('./helpers/filehandling');
const { setupProject } = require('./helpers/installs');
const Logto = require("./helpers/logger");
const Errfmt = require("errfmt");
const errfmt = new Errfmt({ colored: true });
let metadata = {
logsdir: "",
templatename: "",
templatesdir: "",
pkgmanager: "",
projectname: "",
debug: false
};
// TODO: improve logging
console.log(chalk.magentaBright.bold(`
_ _ _
/_\/\/ //_| v0.1.0
_/
`));
// check for debug mode
const args = process.argv.slice(2);
if (args[0] === "-d" || args[0] === "--debug") {
metadata.debug = true;
console.log(chalk.yellow('> debug mode enabled'));
}
(async () => {
// setup app data if doesn't exist
const appdatadir = await createAppDataDir().catch(err => { errfmt.print(err) });
Object.assign(metadata, appdatadir);
// start logging
let logger = new Logto(metadata.logsdir);
logger.info(`platform: ${process.platform}`);
let spinner = ora('Performing checks').start();
let result = await performChecks().catch(err => {
spinner.fail("checks failed");
errfmt.include("message").print(err);
logger.handleError(err);
});
metadata.pkgmanager = result;
spinner.succeed("Checks complete");
logger.info("Checks complete");
// fetch template list
spinner.text = "Fetching template"
spinner.start();
const templateList = await getTemplateList().catch(err => {
spinner.fail("Failed to fetch template list");
errfmt.include("code", "syscall", "message").print(err);
logger.handleError(err);
});
spinner.succeed("Fetched templates\n");
logger.info("Fetched templates");
console.log('know more about each templates or create your own:');
console.log(chalk.greenBright.underline(`https://github.com/DarthCucumber/get-node-app-templates`));
let answers = await inquirer
.prompt([
{
type: 'list',
name: 'templatename',
message: `Select Template:`,
choices: templateList
}
, {
type: 'input',
name: 'projectname',
message: `Enter Project Name:`,
validate: function (project) {
if (project.length === 0) {
return "project name cannot be empty";
}
return true;
},
}]);
Object.assign(metadata, answers);
// Download template
spinner.text = `Downloading templates`;
spinner.start();
await downloadTemplate(metadata.templatesdir, metadata.templatename).catch(err => {
spinner.fail("Failed to download template");
errfmt.include("exitCode", "message").print(err);
logger.handleError(err);
});
spinner.succeed(`Template downloaded`);
logger.info("Template downloaded");
// create project directory
await fs.ensureDir(metadata.projectname).then(() => {
spinner.succeed(`project created: ${chalk.cyanBright(metadata.projectname)}`);
logger.info(`Project Created: ${metadata.projectname}`);
}).catch(err => {
spinner.fail(`Failed to create project ${metadata.projectname}`);
errfmt.include('code', 'message').print(err);
logger.handleError(err);
});
// copy selected template from app data to project dir
const templateContent = path.join(metadata.templatesdir, metadata.templatename);
await fs.copy(templateContent, metadata.projectname).catch(err => {
errfmt.include('code', 'message').print(err);
logger.handleError(err);
})
logger.info(`copied file from ${templateContent} to ${metadata.templatename}`);
// final setup
spinner.text = "Setting up project";
spinner.start();
await setupProject(metadata.pkgmanager, metadata.projectname).catch(err => {
spinner.fail("Failed to setup project");
errfmt.include('exitCode', 'shortMessage').print(err);
logger.handleError(err);
});
spinner.succeed(`Project setup complete\n`);
logger.info(`Project setup complete`);
console.log(`\(^O^)/ All set\n`);
/**
* print random phrase
* why? just for fun ;)
*/
let rp = getRandomPhrase();
console.log(chalk.magentaBright.bold(rp), "\n");
logger.info(`random phrase generated`);
// keep logfile in debug mode
if (metadata.debug) {
console.log(`log file can be found at ${chalk.cyan.underline(logger.logfile)}\n`);
return;
}
await logger.deleteLog()
.catch(err => {
errfmt.print(err);
logger.handleError(err);
});
})();