Branch data Line data Source code
1 [ + ]: 28 : /**
2 : 28 : * @module wpt-xhr-cmd
3 : 28 : * @desc The wpt-xhr command line interface module.
4 : 28 : * @version 1.0.0
5 : 28 : * @author Essam A. El-Sherif
6 : 28 : */
7 : 28 :
8 : 28 : /** Import nodeJS core modules */
9 : 28 : import process from 'node:process';
10 : 28 :
11 : 28 : /** @const {object} cmdOptions - Command line options */
12 : 28 : const cmdOptions = {
13 : 28 : host : 'wpt.local', // -h --host <host>
14 : 28 : port : '8000', // -p --port <port>
15 : 28 : path : '/xhr/resources/', // --path <path>
16 : 28 : url : 'http://wpt.local:8000/xhr/resources/',
17 : 28 :
18 : 28 : node : true, // -n --node {boolean} / -d --def {boolean}
19 : 28 : verbose: false, // -v --verbose {boolean}
20 : 28 : };
21 : 28 :
22 : 28 : export default cmdOptions;
23 : 28 :
24 : 28 : const CMD = 'wpt-xhr';
25 : 28 : const CMD_VER = 'v1.0.0';
26 : 28 :
27 : 28 : /**
28 : 28 : * function main
29 : 28 : * function parseCmdLine()
30 : 28 : * function getHelp()
31 : 28 : * function getError(n)
32 : 28 : *
33 : 28 : * @func Main
34 : 28 : * @desc The application entry point function
35 : 28 : */
36 [ + ]: 28 : (() => {
37 : 28 : parseCmdLine();
38 : 28 : if(
39 : 28 : process.env.WPT_XHR_TEST &&
40 : 28 : (
41 [ - ]: 28 : process.env.WPT_XHR_TEST.toLowerCase() === 'node' ||
42 : 0 : process.env.WPT_XHR_TEST.toLowerCase() === 'default'
43 : 28 : )
44 : 28 : ){
45 : 28 : process.stdout.write(JSON.stringify(cmdOptions));
46 : 28 : }
47 : 28 : })('Main Function');
48 : 28 :
49 : 28 : /**
50 : 28 : * function main()
51 : 28 : * function parseCmdLine()
52 : 28 : * function getHelp()
53 : 28 : * function getError(n)
54 : 28 : *
55 : 28 : * @func parseCmdLine
56 : 28 : * @desc Command line parser function
57 : 28 : */
58 [ + ]: 28 : function parseCmdLine(){
59 : 28 :
60 : 28 : const args = process.argv;
61 : 28 :
62 [ + ]: 28 : for(let i = 2; i < args.length; i++){
63 : 20 : if(args[i] === '--help' || args[i] === '-h'){
64 : 20 : process.stdout.write(`${getHelp()}\n`);
65 : 20 : process.exit(0);
66 : 20 : }
67 : 20 : else
68 : 20 : if(args[i] === '--version'){
69 : 20 : process.stdout.write(`${CMD_VER}\n`);
70 : 20 : process.exit(0);
71 : 20 : }
72 : 20 : else
73 [ + ]: 20 : if(args[i].startsWith('--host=')){
74 : 1 : let str = args[i].replace('--host=', '');
75 : 1 :
76 : 1 : if(!str){
77 : 1 : process.stderr.write(`${getError(0).replace('_', '--host')}\n`);
78 : 1 : process.exit(1);
79 : 1 : }
80 : 1 : else
81 : 1 : if(str.startsWith('-')){
82 : 1 : process.stderr.write(`${getError(1).replace('_', str).replace('_', '--host')}\n`);
83 : 1 : process.exit(1);
84 : 1 : }
85 : 1 : else{
86 : 1 : let url = new URL(cmdOptions.url);
87 : 1 : url.hostname = str;
88 : 1 : cmdOptions.url = url.href;
89 : 1 : cmdOptions.host = url.hostname;
90 : 1 : }
91 [ + ]: 1 : }
92 : 1 : else
93 : 1 : if(args[i].startsWith('--port=')){
94 : 1 : let str = args[i].replace('--port=', '');
95 : 1 :
96 : 1 : if(!str){
97 : 1 : process.stderr.write(`${getError(0).replace('_', '--port')}\n`);
98 : 1 : process.exit(1);
99 : 1 : }
100 : 1 : else
101 : 1 : if(str.startsWith('-')){
102 : 1 : process.stderr.write(`${getError(1).replace('_', str).replace('_', '--port')}\n`);
103 : 1 : process.exit(1);
104 : 1 : }
105 : 1 : else{
106 : 1 : let url = new URL(cmdOptions.url);
107 : 1 : url.port = str;
108 : 1 : cmdOptions.url = url.href;
109 : 1 : cmdOptions.port = url.port;
110 : 1 : }
111 : 1 : }
112 : 1 : else
113 : 1 : if(args[i].startsWith('--path=')){
114 : 1 : let str = args[i].replace('--path=', '');
115 : 1 :
116 : 1 : if(!str){
117 : 1 : process.stderr.write(`${getError(0).replace('_', '--path')}\n`);
118 : 1 : process.exit(1);
119 : 1 : }
120 : 1 : else
121 : 1 : if(str.startsWith('/')){
122 : 1 : let url = new URL(cmdOptions.url);
123 : 1 : url.pathname = str;
124 : 1 : cmdOptions.url = url.href;
125 : 1 : cmdOptions.path = url.pathname;
126 : 1 : }
127 : 1 : else{
128 : 1 : process.stderr.write(`${getError(1).replace('_', str).replace('_', '--path')}\n`);
129 : 1 : process.exit(1);
130 : 1 : }
131 : 1 : }
132 : 1 : else
133 [ + ][ + ]: 1 : if(args[i] === '--host' || args[i] === '-t'){
134 : 1 : if(i === args.length - 1){
135 : 1 : process.stderr.write(`${getError(0).replace('_', args[i])}\n`);
136 : 1 : process.exit(1);
137 : 1 : }
138 : 1 : else
139 : 1 : if(args[i + 1].startsWith('-')){
140 : 1 : process.stderr.write(`${getError(1).replace('_', args[i+1]).replace('_', args[i])}\n`);
141 : 1 : process.exit(1);
142 : 1 : }
143 : 1 : else{
144 : 1 : let url = new URL(cmdOptions.url);
145 : 1 : url.hostname = args[++i];
146 : 1 : cmdOptions.url = url.href;
147 : 1 : cmdOptions.host = url.hostname;
148 : 1 : }
149 [ + ]: 1 : }
150 : 1 : else
151 [ + ]: 1 : if(args[i] === '--port' || args[i] === '-p'){
152 : 1 : if(i === args.length - 1){
153 : 1 : process.stderr.write(`${getError(0).replace('_', args[i])}\n`);
154 : 1 : process.exit(1);
155 : 1 : }
156 : 1 : else
157 : 1 : if(args[i + 1].startsWith('-')){
158 : 1 : process.stderr.write(`${getError(1).replace('_', args[i+1]).replace('_', args[i])}\n`);
159 : 1 : process.exit(1);
160 : 1 : }
161 : 1 : else{
162 : 1 : let url = new URL(cmdOptions.url);
163 : 1 : url.port = args[++i];
164 : 1 : cmdOptions.url = url.href;
165 : 1 : cmdOptions.port = url.port;
166 : 1 : }
167 [ + ]: 1 : }
168 : 1 : else
169 : 1 : if(args[i] === '--path'){
170 : 1 : if(i === args.length - 1){
171 : 1 : process.stderr.write(`${getError(0).replace('_', args[i])}\n`);
172 : 1 : process.exit(1);
173 : 1 : }
174 : 1 : else
175 : 1 : if(args[i+1].startsWith('/')){
176 : 1 : let url = new URL(cmdOptions.url);
177 : 1 : url.pathname = args[++i];
178 : 1 : cmdOptions.url = url.href;
179 : 1 : cmdOptions.path = url.pathname;
180 : 1 : }
181 : 1 : else{
182 : 1 : process.stderr.write(`${getError(1).replace('_', args[i+1]).replace('_', args[i])}\n`);
183 : 1 : process.exit(1);
184 : 1 : }
185 : 1 : }
186 : 1 : else
187 [ + ][ + ]: 1 : if(args[i] === '-v' || args[i] === '--verbose'){
188 : 1 : cmdOptions.verbose = true;
189 : 1 : }
190 : 1 : else
191 [ + ][ + ]: 1 : if(args[i] === '-n' || args[i] === '--node'){
192 : 1 : cmdOptions.node = true;
193 : 1 : }
194 : 1 : else
195 : 1 : if(args[i] === '-d' || args[i] === '--def'){
196 : 1 : cmdOptions.node = false;
197 : 1 : }
198 : 1 : else
199 : 1 : if(args[i].startsWith('--')){
200 : 1 : process.stderr.write(`${getError(3).replace('_', args[i].substr(2))}\n`);
201 : 1 : process.exit(1);
202 : 1 : }
203 : 1 : else
204 : 1 : if(args[i].startsWith('-')){
205 : 1 : process.stderr.write(`${getError(2).replace('_', args[i])}\n`);
206 : 1 : process.exit(1);
207 : 1 : }
208 : 1 : else{
209 : 1 : try{
210 : 1 : let url = new URL(args[i]);
211 : 1 : cmdOptions.url = url.href;
212 : 1 : cmdOptions.host = url.hostname;
213 : 1 : cmdOptions.port = url.port;
214 : 1 : cmdOptions.path = url.pathname;
215 : 1 : }
216 : 1 : catch(e){
217 : 1 : process.stderr.write(`${getError(4).replace('_', args[i])}\n`);
218 : 1 : process.exit(1);
219 : 1 : }
220 : 1 : }
221 : 20 : }
222 : 28 : }
223 : 28 :
224 : 28 : /**
225 : 28 : * function main
226 : 28 : * function parseCmdLine()
227 : 28 : * function getHelp()
228 : 28 : * function getError(n)
229 : 28 : *
230 : 28 : * @func getHelp
231 : 28 : * @return {string} Help information
232 : 28 : * @desc Function to return help info
233 : 28 : */
234 [ + ]: 1 : function getHelp(){
235 : 1 : return `\
236 : 1 : Usage: wpt-xhr [OPTIONS]... [URL]
237 : 1 :
238 : 1 : Test the developed *XMLHttpRequest* module for compliance with
239 : 1 : WHATWG XMLHttpRequest specs using the web-platform-tests live
240 : 1 : or locally installed server as the testing server.
241 : 1 :
242 : 1 : With no URL, testing server is determined by the options given.
243 : 1 :
244 : 1 : -t, --host[=<host>] wpt host (default wpt.live)
245 : 1 : -p, --port[=<port>] wpt port (default 80)
246 : 1 : --path[=<path>] wpt path (default /xhr/resources/)
247 : 1 : -n --node use nodejs test runner API if supported
248 : 1 : -d --def use default test runner
249 : 1 : -v --verbose make the testing operation more talkative
250 : 1 : -h --help display this help and exit
251 : 1 : --version output version information and exit
252 : 1 :
253 : 1 : Note that invalid host, port or path will not be accepted.
254 : 1 :
255 : 1 : Examples:
256 : 1 : wpt-xhr -t wpt.local -p 8000 Means <http://wpt.local:8000/xhr/resources/>
257 : 1 : wpt-xhr Means <http://wpt.live/xhr/resources/>
258 : 1 :
259 : 1 : web-platforms-tests online help: <https://web-platform-tests.org/>
260 : 1 : Full documentation <https://essamatefelsherif.github.io/whatwg-xhr/>`;
261 : 1 : }
262 : 28 :
263 : 28 : /**
264 : 28 : * function main
265 : 28 : * function parseCmdLine()
266 : 28 : * function getHelp()
267 : 28 : * function getError(n)
268 : 28 : *
269 : 28 : * @func getError
270 : 28 : * @param {number} Error number
271 : 28 : * @return {string} Error message
272 : 28 : * @desc Function to return error message
273 : 28 : */
274 [ + ]: 14 : function getError(n){
275 : 14 :
276 : 14 : const error = [
277 : 14 :
278 : 14 : // error[0]
279 : 14 : `\
280 : 14 : ${CMD}: ambiguous argument ‘’ for ‘_’
281 : 14 : Try '${CMD} --help' for more information.`,
282 : 14 :
283 : 14 : // error[1]
284 : 14 : `\
285 : 14 : ${CMD}: invalid argument ‘_’ for ‘_’
286 : 14 : Try '${CMD} --help' for more information.`,
287 : 14 :
288 : 14 : // error[2]
289 : 14 : `\
290 : 14 : ${CMD}: unrecognized option '_'
291 : 14 : Try '${CMD} --help' for more information.`,
292 : 14 :
293 : 14 : // error[3]
294 : 14 : `\
295 : 14 : ${CMD}: invalid option -- '_'
296 : 14 : Try '${CMD} --help' for more information.`,
297 : 14 :
298 : 14 : // error[4]
299 : 14 : `\
300 : 14 : ${CMD}: invalid url '_'
301 : 14 : Try '${CMD} --help' for more information.`,
302 : 14 : ];
303 : 14 : return error[n];
304 : 14 : }
|