UNPKG

5.18 kBJavaScriptView Raw
1const decrypter = require('../../libs/crypt/dec.js');
2const encrypter = require('../../libs/crypt/enc.js');
3const oldDataExpectedPath = path.join(process.cwd(),".deploy");
4const saltPath = path.join(process.cwd(),".salt");
5const salt = fs.fileExists(saltPath) ? fs.readFileSync(saltPath,"utf-8") : false;
6var savedAnswers = {};
7
8module.exports = function (save,data) {
9
10 if(save && data) return new Promise((resolve,reject)=>{
11 inquirer.prompt([
12 {
13 type:"confirm",
14 message:"Would you like to save the deployment setting for later use?",
15 name:"saveSetting"
16 },
17 {
18 type:"input",
19 name:"name",
20 default:"production",
21 message:"What name would you give to the server we've just deployed to?",
22 when:(answers) => answers.saveSetting,
23 }
24 ])
25 .then((answers)=>{
26 if(answers.saveSetting) {
27 var fileData = getOldData();
28 fileData[answers.name] = data;
29 fs.writeFileSync(oldDataExpectedPath,encrypter(JSON.stringify(fileData),salt));
30 resolve();
31 }
32 else resolve();
33 })
34 .catch((err)=>{
35 reject(err);
36 });
37 });
38
39 else return new Promise((resolve,reject)=>{
40
41 msgs.neu("Before starting to deploy your application, make sure that you have:");
42 msgs.neu(" - Git installed on your remote server");
43 msgs.neu(" - A remote git repository (on github)");
44 msgs.neu(" - A remote server, connectible via SSH");
45
46 savedAnswers = getOldData();
47 var availableServers = [];
48 for (var serverName in savedAnswers) {
49 if(savedAnswers.hasOwnProperty(serverName)) availableServers.push(serverName);
50 }
51
52 var questions = [
53 {
54 name:"message",
55 message:"Enter your commit message",
56 default:"new commit"
57 },
58 {
59 type:"confirm",
60 name:"use_old",
61 message:"Would you like to use the saved deployment setting?",
62 when:availableServers.length > 0,
63 },
64 {
65 type:"list",
66 name:"serverName",
67 message:"Which server's setting would you like to use?",
68 choices:availableServers,
69 when:function(answers){
70 return availableServers.length > 0 && answers.use_old;
71 }
72 },
73 {
74 name:"repo_url",
75 validate:function (input) {
76 return new Promise((resolve,reject)=>{
77 if(input.toLowerCase().startsWith("https://")) resolve(true);
78 else reject("The url doesn't appear to be HTTPS");
79 });
80 },
81 message:"Enter the repository URL (HTTPS required)",
82 when:theres_no_old_data_or_dont_want_to_use_it
83 },
84 {
85 name:"repo_user",
86 message:"Enter your remote git account username",
87 default:"none",
88 when:theres_no_old_data_or_dont_want_to_use_it
89 },
90 {
91 type:"password",
92 name:"repo_password",
93 message:"Enter your remote git account password",
94 default:"none",
95 when:theres_no_old_data_or_dont_want_to_use_it
96 },
97 {
98 name:"repo_branch",
99 message:"Enter your remote git repository branch",
100 default:"master",
101 when:theres_no_old_data_or_dont_want_to_use_it
102 },
103 {
104 name:"server_hostname",
105 message:"Enter your remote server host",
106 when:theres_no_old_data_or_dont_want_to_use_it
107 },
108 {
109 name:"server_path",
110 message:"Enter the directory on your on which the application lies (or should be laid)",
111 when:theres_no_old_data_or_dont_want_to_use_it
112 },
113 {
114 type:"list",
115 name:"server_authType",
116 message:"How do you connect to your server",
117 choices:[
118 {
119 name:"Using SSH key with (or without a pass phrase)",
120 value:"key",
121 short:"key",
122 },
123 {
124 name:"Using a username and password",
125 value:"password",
126 short:"password",
127 },
128 ],
129 when:theres_no_old_data_or_dont_want_to_use_it
130 },
131 {
132 name:"server_key",
133 message:"Enter the path to a file holding the server key",
134 when:(answers) => theres_no_old_data_or_dont_want_to_use_it(answers) && answers.server_authType === "key"
135 },
136 {
137 name:"server_passphrase",
138 message:"Enter your pass phrase (leave empty if you don't use one)",
139 when:(answers) => theres_no_old_data_or_dont_want_to_use_it(answers) && answers.server_authType === "key"
140 },
141 {
142 name:"server_username",
143 message:"Enter your username",
144 when:(answers) => theres_no_old_data_or_dont_want_to_use_it(answers) && answers.server_authType === "password"
145 },
146 {
147 type:"password",
148 name:"server_password",
149 message:"Enter your password",
150 when:(answers) => theres_no_old_data_or_dont_want_to_use_it(answers) && answers.server_authType === "password"
151 }
152 ];
153
154 inquirer.prompt(questions)
155 .then((answers)=>{
156 savedAnswers.message = answers.message;
157 if(answers.use_old) return resolve(savedAnswers[answers.serverName]);
158 else return resolve(answers);
159 })
160 .catch((err)=>{
161 reject(err);
162 });
163 });
164};
165
166function getOldData() {
167 try {
168 return JSON.parse(decrypter(fs.readFileSync(oldDataExpectedPath,"utf-8"),salt));
169 } catch(e) {
170 return {};
171 }
172}
173
174function theres_no_old_data_or_dont_want_to_use_it(answers) {
175 return (Object.keys(savedAnswers).length === 0) || (!answers.use_old);
176}
\No newline at end of file