Skip to content

Commit 028ceee

Browse files
authoredApr 9, 2019
fix(regression): host and port can be undefined or null (#1779)
1 parent f5ea174 commit 028ceee

File tree

6 files changed

+458
-25
lines changed

6 files changed

+458
-25
lines changed
 

Diff for: ‎lib/options.json

+21-11
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,27 @@
1717
"type": "boolean"
1818
},
1919
"host": {
20-
"type": "string"
20+
"anyOf": [
21+
{
22+
"type": "string"
23+
},
24+
{
25+
"type": "null"
26+
}
27+
]
28+
},
29+
"port": {
30+
"anyOf": [
31+
{
32+
"type": "number"
33+
},
34+
{
35+
"type": "string"
36+
},
37+
{
38+
"type": "null"
39+
}
40+
]
2141
},
2242
"allowedHosts": {
2343
"type": "array",
@@ -41,16 +61,6 @@
4161
"publicPath": {
4262
"type": "string"
4363
},
44-
"port": {
45-
"anyOf": [
46-
{
47-
"type": "number"
48-
},
49-
{
50-
"type": "string"
51-
}
52-
]
53-
},
5464
"socket": {
5565
"type": "string"
5666
},

Diff for: ‎test/BeforeAndAfter.test.js

+12-12
Original file line numberDiff line numberDiff line change
@@ -12,38 +12,38 @@ describe('Before And After options', () => {
1212
server = helper.start(
1313
config,
1414
{
15-
before: (app, server, compiler) => {
16-
if (!app) {
15+
before: (appArg, serverArg, compilerArg) => {
16+
if (!appArg) {
1717
throw new Error('app is not defined');
1818
}
1919

20-
if (!server) {
20+
if (!serverArg) {
2121
throw new Error('server is not defined');
2222
}
2323

24-
if (!compiler) {
24+
if (!compilerArg) {
2525
throw new Error('compiler is not defined');
2626
}
2727

28-
app.get('/before/some/path', (req, res) => {
29-
res.send('before');
28+
appArg.get('/before/some/path', (_, response) => {
29+
response.send('before');
3030
});
3131
},
32-
after: (app, server, compiler) => {
33-
if (!app) {
32+
after: (appArg, serverArg, compilerArg) => {
33+
if (!appArg) {
3434
throw new Error('app is not defined');
3535
}
3636

37-
if (!server) {
37+
if (!serverArg) {
3838
throw new Error('server is not defined');
3939
}
4040

41-
if (!compiler) {
41+
if (!compilerArg) {
4242
throw new Error('compiler is not defined');
4343
}
4444

45-
app.get('/after/some/path', (req, res) => {
46-
res.send('after');
45+
appArg.get('/after/some/path', (_, response) => {
46+
response.send('after');
4747
});
4848
},
4949
},

Diff for: ‎test/CreateConfig.test.js

+58
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,32 @@ describe('createConfig', () => {
6868
expect(config).toMatchSnapshot();
6969
});
7070

71+
it('host option (undefined)', () => {
72+
const config = createConfig(
73+
webpackConfig,
74+
Object.assign({}, argv, {
75+
// eslint-disable-next-line no-undefined
76+
host: undefined,
77+
}),
78+
{ port: 8080 }
79+
);
80+
81+
expect(config).toMatchSnapshot();
82+
});
83+
84+
it('host option (null)', () => {
85+
const config = createConfig(
86+
webpackConfig,
87+
Object.assign({}, argv, {
88+
// eslint-disable-next-line no-undefined
89+
host: null,
90+
}),
91+
{ port: 8080 }
92+
);
93+
94+
expect(config).toMatchSnapshot();
95+
});
96+
7197
it('host option (devServer config)', () => {
7298
const config = createConfig(
7399
Object.assign({}, webpackConfig, { devServer: { host: 'example.dev' } }),
@@ -893,6 +919,38 @@ describe('createConfig', () => {
893919
expect(config).toMatchSnapshot();
894920
});
895921

922+
it('port option (same) (string)', () => {
923+
const config = createConfig(
924+
webpackConfig,
925+
Object.assign({}, argv, { port: '9090' }),
926+
{ port: '9090' }
927+
);
928+
929+
expect(config).toMatchSnapshot();
930+
});
931+
932+
it('port option (same) (null)', () => {
933+
const config = createConfig(
934+
webpackConfig,
935+
Object.assign({}, argv, { port: null }),
936+
{ port: null }
937+
);
938+
939+
expect(config).toMatchSnapshot();
940+
});
941+
942+
it('port option (same) (undefined)', () => {
943+
const config = createConfig(
944+
webpackConfig,
945+
// eslint-disable-next-line no-undefined
946+
Object.assign({}, argv, { port: undefined }),
947+
// eslint-disable-next-line no-undefined
948+
{ port: undefined }
949+
);
950+
951+
expect(config).toMatchSnapshot();
952+
});
953+
896954
it('port option (difference)', () => {
897955
const config = createConfig(
898956
webpackConfig,

Diff for: ‎test/Server.test.js

+291
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
'use strict';
22

33
const webpack = require('webpack');
4+
const request = require('supertest');
45
const Server = require('../lib/Server');
56
const config = require('./fixtures/simple-config/webpack.config');
7+
const helper = require('./helper');
68

79
const allStats = [
810
{},
@@ -142,4 +144,293 @@ describe('Server', () => {
142144
})(allStats[0], 0);
143145
});
144146
});
147+
148+
describe('host', () => {
149+
let server = null;
150+
let req = null;
151+
152+
describe('is not be specified', () => {
153+
beforeAll((done) => {
154+
server = helper.start(config, {}, done);
155+
req = request(server.app);
156+
});
157+
158+
it('server address', () => {
159+
const address = server.listeningApp.address();
160+
161+
expect(address.address).toBe('127.0.0.1');
162+
expect(address.port).toBe(8080);
163+
});
164+
165+
it('Request to index', (done) => {
166+
req.get('/').expect(200, done);
167+
});
168+
169+
afterAll(helper.close);
170+
});
171+
172+
describe('is undefined', () => {
173+
beforeAll((done) => {
174+
server = helper.start(
175+
config,
176+
{
177+
// eslint-disable-next-line no-undefined
178+
host: undefined,
179+
},
180+
done
181+
);
182+
req = request(server.app);
183+
});
184+
185+
it('server address', () => {
186+
const address = server.listeningApp.address();
187+
188+
expect(address.address).toBe('::');
189+
expect(address.port).toBe(8080);
190+
});
191+
192+
it('Request to index', (done) => {
193+
req.get('/').expect(200, done);
194+
});
195+
196+
afterAll(helper.close);
197+
});
198+
199+
describe('is null', () => {
200+
beforeAll((done) => {
201+
server = helper.start(
202+
config,
203+
{
204+
host: null,
205+
},
206+
done
207+
);
208+
req = request(server.app);
209+
});
210+
211+
it('server address', () => {
212+
const address = server.listeningApp.address();
213+
214+
expect(address.address).toBe('::');
215+
expect(address.port).toBe(8080);
216+
});
217+
218+
it('Request to index', (done) => {
219+
req.get('/').expect(200, done);
220+
});
221+
222+
afterAll(helper.close);
223+
});
224+
225+
describe('is 127.0.0.1 (IPv4)', () => {
226+
beforeAll((done) => {
227+
server = helper.start(
228+
config,
229+
{
230+
host: '127.0.0.1',
231+
},
232+
done
233+
);
234+
req = request(server.app);
235+
});
236+
237+
it('server address', () => {
238+
const address = server.listeningApp.address();
239+
240+
expect(address.address).toBe('127.0.0.1');
241+
expect(address.port).toBe(8080);
242+
});
243+
244+
it('Request to index', (done) => {
245+
req.get('/').expect(200, done);
246+
});
247+
248+
afterAll(helper.close);
249+
});
250+
251+
describe('is localhost', () => {
252+
beforeAll((done) => {
253+
server = helper.start(
254+
config,
255+
{
256+
host: 'localhost',
257+
},
258+
done
259+
);
260+
req = request(server.app);
261+
});
262+
263+
it('server address', () => {
264+
const address = server.listeningApp.address();
265+
266+
expect(address.address).toBe('127.0.0.1');
267+
expect(address.port).toBe(8080);
268+
});
269+
270+
it('Request to index', (done) => {
271+
req.get('/').expect(200, done);
272+
});
273+
274+
afterAll(helper.close);
275+
});
276+
277+
describe('is 0.0.0.0', () => {
278+
beforeAll((done) => {
279+
server = helper.start(
280+
config,
281+
{
282+
host: '0.0.0.0',
283+
},
284+
done
285+
);
286+
req = request(server.app);
287+
});
288+
289+
it('server address', () => {
290+
const address = server.listeningApp.address();
291+
292+
expect(address.address).toBe('0.0.0.0');
293+
expect(address.port).toBe(8080);
294+
});
295+
296+
it('Request to index', (done) => {
297+
req.get('/').expect(200, done);
298+
});
299+
300+
afterAll(helper.close);
301+
});
302+
});
303+
304+
describe('port', () => {
305+
let server = null;
306+
let req = null;
307+
308+
describe('is not be specified', () => {
309+
beforeAll((done) => {
310+
server = helper.start(config, {}, done);
311+
req = request(server.app);
312+
});
313+
314+
it('server address', () => {
315+
const address = server.listeningApp.address();
316+
317+
expect(address.address).toBe('127.0.0.1');
318+
// Random port
319+
expect(address.port).toBeDefined();
320+
});
321+
322+
it('Request to index', (done) => {
323+
req.get('/').expect(200, done);
324+
});
325+
326+
afterAll(helper.close);
327+
});
328+
329+
describe('is undefined', () => {
330+
beforeAll((done) => {
331+
server = helper.start(
332+
config,
333+
{
334+
// eslint-disable-next-line no-undefined
335+
port: undefined,
336+
},
337+
done
338+
);
339+
req = request(server.app);
340+
});
341+
342+
it('server address', () => {
343+
const address = server.listeningApp.address();
344+
345+
expect(address.address).toBe('127.0.0.1');
346+
// Random port
347+
expect(address.port).toBeDefined();
348+
});
349+
350+
it('Request to index', (done) => {
351+
req.get('/').expect(200, done);
352+
});
353+
354+
afterAll(helper.close);
355+
});
356+
357+
describe('is null', () => {
358+
beforeAll((done) => {
359+
server = helper.start(
360+
config,
361+
{
362+
port: null,
363+
},
364+
done
365+
);
366+
req = request(server.app);
367+
});
368+
369+
it('server address', () => {
370+
const address = server.listeningApp.address();
371+
372+
expect(address.address).toBe('127.0.0.1');
373+
// Random port
374+
expect(address.port).toBeDefined();
375+
});
376+
377+
it('Request to index', (done) => {
378+
req.get('/').expect(200, done);
379+
});
380+
381+
afterAll(helper.close);
382+
});
383+
384+
describe('is "33333"', () => {
385+
beforeAll((done) => {
386+
server = helper.start(
387+
config,
388+
{
389+
port: '33333',
390+
},
391+
done
392+
);
393+
req = request(server.app);
394+
});
395+
396+
it('server address', () => {
397+
const address = server.listeningApp.address();
398+
399+
expect(address.address).toBe('127.0.0.1');
400+
expect(address.port).toBe(33333);
401+
});
402+
403+
it('Request to index', (done) => {
404+
req.get('/').expect(200, done);
405+
});
406+
407+
afterAll(helper.close);
408+
});
409+
410+
describe('is 33333', () => {
411+
beforeAll((done) => {
412+
server = helper.start(
413+
config,
414+
{
415+
port: '33333',
416+
},
417+
done
418+
);
419+
req = request(server.app);
420+
});
421+
422+
it('server address', () => {
423+
const address = server.listeningApp.address();
424+
425+
expect(address.address).toBe('127.0.0.1');
426+
expect(address.port).toBe(33333);
427+
});
428+
429+
it('Request to index', (done) => {
430+
req.get('/').expect(200, done);
431+
});
432+
433+
afterAll(helper.close);
434+
});
435+
});
145436
});

Diff for: ‎test/__snapshots__/CreateConfig.test.js.snap

+70
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,20 @@ Object {
388388
}
389389
`;
390390

391+
exports[`createConfig host option (null) 1`] = `
392+
Object {
393+
"hot": true,
394+
"hotOnly": false,
395+
"noInfo": true,
396+
"port": 8080,
397+
"publicPath": "/",
398+
"stats": Object {
399+
"cached": false,
400+
"cachedAssets": false,
401+
},
402+
}
403+
`;
404+
391405
exports[`createConfig host option (specify for CLI and devServer config) 1`] = `
392406
Object {
393407
"host": "other.dev",
@@ -403,6 +417,20 @@ Object {
403417
}
404418
`;
405419

420+
exports[`createConfig host option (undefined) 1`] = `
421+
Object {
422+
"hot": true,
423+
"hotOnly": false,
424+
"noInfo": true,
425+
"port": 8080,
426+
"publicPath": "/",
427+
"stats": Object {
428+
"cached": false,
429+
"cachedAssets": false,
430+
},
431+
}
432+
`;
433+
406434
exports[`createConfig host option 1`] = `
407435
Object {
408436
"host": "example.dev",
@@ -853,6 +881,48 @@ Object {
853881
}
854882
`;
855883

884+
exports[`createConfig port option (same) (null) 1`] = `
885+
Object {
886+
"hot": true,
887+
"hotOnly": false,
888+
"noInfo": true,
889+
"port": null,
890+
"publicPath": "/",
891+
"stats": Object {
892+
"cached": false,
893+
"cachedAssets": false,
894+
},
895+
}
896+
`;
897+
898+
exports[`createConfig port option (same) (string) 1`] = `
899+
Object {
900+
"hot": true,
901+
"hotOnly": false,
902+
"noInfo": true,
903+
"port": "9090",
904+
"publicPath": "/",
905+
"stats": Object {
906+
"cached": false,
907+
"cachedAssets": false,
908+
},
909+
}
910+
`;
911+
912+
exports[`createConfig port option (same) (undefined) 1`] = `
913+
Object {
914+
"hot": true,
915+
"hotOnly": false,
916+
"noInfo": true,
917+
"port": undefined,
918+
"publicPath": "/",
919+
"stats": Object {
920+
"cached": false,
921+
"cachedAssets": false,
922+
},
923+
}
924+
`;
925+
856926
exports[`createConfig port option (same) 1`] = `
857927
Object {
858928
"hot": true,

Diff for: ‎test/helper.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,12 @@ module.exports = {
3939

4040
server = new Server(compiler, options);
4141

42-
const port = options.port || 8080;
43-
const host = options.host || 'localhost';
42+
const port = Object.prototype.hasOwnProperty.call(options, 'port')
43+
? options.port
44+
: 8080;
45+
const host = Object.prototype.hasOwnProperty.call(options, 'host')
46+
? options.host
47+
: 'localhost';
4448

4549
server.listen(port, host, (err) => {
4650
if (err) {

0 commit comments

Comments
 (0)
Please sign in to comment.