-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
279 lines (258 loc) · 7.32 KB
/
index.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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
const Manager = require('./lib/Manager');
const chalk = require("chalk");
const Engineer = require('./lib/Engineer');
const Intern = require('./lib/Intern');
const inquirer = require('inquirer');
const path = require('path');
const fs = require('fs');
const OUTPUT_DIR = path.resolve(__dirname, 'output');
const outputPath = path.join(OUTPUT_DIR, 'team.html');
// When render is passed into the write file command with the array of teamMembers, it creates a string template of the html file including html code to represent each teamMember
const render = require('./src/page-template.js');
const teamMembers = [];
const idArray = [];
// appMenu gets the ball rolling. It is called at the end of this file being loaded. Every team needs to have a manager at the minimum, so it asks for input for the manager profile and then calls addTeamMember() to add other kinds of team members
function appMenu() {
// appMenu is built using the currying technique of nesting functions inside a function. All of the file's functions reside within appMenu()
// Checks to see that the ID is a valid number and also that it is unique among team members
function validateID(answer) {
const pass = answer.match(/^[1-9]\d*$/);
if (pass) {
// ID's need to be unique. Check to see if this ID is already taken
if (idArray.includes(answer)) {
return 'This ID has already been taken. Please enter another one';
} else return true;
}
return 'Please enter a number greater than zero.';
}
// prompts the user to ask for info for a manager
function createManager() {
console.log('Please build your team');
inquirer
.prompt([
{
type: 'input',
name: 'managerName',
message: "What is the team manager's name?",
validate: (answer) => {
if (answer !== '') {
return true;
}
return 'Please enter at least one character.';
}
},
{
type: 'input',
name: 'managerId',
message: "What is the team manager's id?",
// validate: (answer) => {
// return validateID(answer);
// }
validate: validateID
},
{
type: 'input',
name: 'managerEmail',
message: "What is the team manager's email?",
validate: (answer) => {
const pass = answer.match(/\S+@\S+\.\S+/);
if (pass) {
return true;
}
return 'Please enter a valid email address.';
}
},
{
type: 'input',
name: 'managerOfficeNumber',
message: "What is the team manager's office number?",
validate: (answer) => {
const pass = answer.match(/^[1-9]\d*$/);
if (pass) {
return true;
}
return 'Please enter a number greater than zero.';
}
}
])
.then((answers) => {
// create a manager object from class Manager
const manager = new Manager(
answers.managerName,
answers.managerId,
answers.managerEmail,
answers.managerOfficeNumber
);
// add the manager object to teamMembers array
teamMembers.push(manager);
// add manager id to idArray
// we have already checked for duplicates when it was input
idArray.push(answers.managerId);
// see if the user wants to add a team member
addTeamMember();
});
}
// Prompts the user to add additional team members or indicate that it's time to build the team structure
function addTeamMember() {
inquirer
.prompt([
{
type: 'list',
name: 'memberChoice',
message: 'Which type of team member would you like to add?',
choices: [ 'Engineer', 'Intern', 'No more team members. Build my team now.' ]
}
])
.then((userChoice) => {
switch (userChoice.memberChoice) {
case 'Engineer':
addEngineer();
break;
case 'Intern':
addIntern();
break;
default:
//Done adding members. Generate the HTML code
buildTeam();
}
});
}
// Prompt user to enter info for an Engineer
function addEngineer() {
// prompt questions to user
inquirer
.prompt([
{
type: 'input',
name: 'engineerName',
message: "What is the Engineer's name?",
validate: (answer) => {
if (answer !== '') {
return true;
}
return 'Please enter at least one character.';
}
},
{
type: 'input',
name: 'engineerId',
message: "What is the engineer's id?",
validate: validateID,
},
{
type: 'input',
name: 'engineerEmail',
message: "What is the engineer's email?",
validate: (answer) => {
const pass = answer.match(/\S+@\S+\.\S+/);
if (pass) {
return true;
}
return 'Please enter a valid email address.';
}
},
{
type: 'input',
name: 'engineerGitHub',
message: "What is the engineer's GitHub name?",
validate: (answer) => {
if (answer !== '') {
return true;
}
return 'Please enter at least one character.';
}
}
])
.then((answers) => {
// create an engineer object from class Engineer
const engineer = new Engineer(
answers.engineerName,
answers.engineerId,
answers.engineerEmail,
answers.engineerGitHub
);
// add the engineer object to teamMembers
teamMembers.push(engineer);
// add engineer id to idArray
// we have already checked for duplicates
idArray.push(answers.engineerId);
// Ask for any additional team members
addTeamMember();
});
}
// Prompt user to enter info for an Intern
function addIntern() {
inquirer
.prompt([
// prompt questions to user
{
type: 'input',
name: 'internName',
message: "What is the Intern's name?",
validate: (answer) => {
if (answer !== '') {
return true;
}
return 'Please enter at least one character.';
}
},
{
type: 'input',
name: 'internId',
message: "What is the Intern's id?",
validate: validateID
},
{
type: 'input',
name: 'internEmail',
message: "What is the Intern's email?",
validate: (answer) => {
const pass = answer.match(/\S+@\S+\.\S+/);
if (pass) {
return true;
}
return 'Please enter a valid email address.';
}
},
{
type: 'input',
name: 'internSchool',
message: "What is the name of the Intern's school?",
validate: (answer) => {
if (answer !== '') {
return true;
}
return 'Please enter at least one character.';
}
}
])
.then((answers) => {
// create an intern object from class intern
const intern = new Intern(
answers.internName,
answers.internId,
answers.internEmail,
answers.internSchool
);
// add the intern object to teamMembers
teamMembers.push(intern);
// add intern id to idArray
// we have already checked for duplicates upon input
idArray.push(answers.internId);
// Ask if user wants to add any additional team members
addTeamMember();
});
}
// all team member info has been entered. Call render
function buildTeam() {
// Create the output directory if the output path doesn't exist
if (!fs.existsSync(OUTPUT_DIR)) {
fs.mkdirSync(OUTPUT_DIR);
}
fs.writeFileSync(outputPath, render(teamMembers), 'utf-8');
// console.log('%c ' + `Success! Please view your file at ${outputPath}.`, 'color:#FFA500');
console.log(chalk.green(`Success! Please view your file at ${outputPath}.`));
}
createManager();
}
appMenu();