From 61d0cdf62c539cef9ad8e250b09571875fd14e87 Mon Sep 17 00:00:00 2001 From: Evilebot Tnawi Date: Wed, 29 May 2019 23:25:37 +0300 Subject: [PATCH] feat: `onListening` option (#1930) --- lib/Server.js | 8 ++++++ lib/options.json | 4 +++ test/CreateConfig.test.js | 12 ++++++++ test/__snapshots__/CreateConfig.test.js.snap | 15 ++++++++++ test/onListening.test.js | 30 ++++++++++++++++++++ test/options.test.js | 4 +++ 6 files changed, 73 insertions(+) create mode 100644 test/onListening.test.js diff --git a/lib/Server.js b/lib/Server.js index 70ab40b747..01173d119c 100644 --- a/lib/Server.js +++ b/lib/Server.js @@ -414,6 +414,8 @@ class Server { } setupBeforeFeature() { + // Todo rename onBeforeSetupMiddleware in next major release + // Todo pass only `this` argument this.options.before(this.app, this, this.compiler); } @@ -422,6 +424,8 @@ class Server { } setupAfterFeature() { + // Todo rename onAfterSetupMiddleware in next major release + // Todo pass only `this` argument this.options.after(this.app, this, this.compiler); } @@ -722,6 +726,10 @@ class Server { if (fn) { fn.call(this.listeningApp, err); } + + if (typeof this.options.onListening === 'function') { + this.options.onListening(this); + } }); } diff --git a/lib/options.json b/lib/options.json index 89b125b7ff..c42e0ffcc6 100644 --- a/lib/options.json +++ b/lib/options.json @@ -195,6 +195,9 @@ "noInfo": { "type": "boolean" }, + "onListening": { + "instanceof": "Function" + }, "open": { "anyOf": [ { @@ -402,6 +405,7 @@ "logTime": "should be {Boolean} (https://github.com/webpack/webpack-dev-middleware#logtime)", "mimeTypes": "should be {Object} (https://webpack.js.org/configuration/dev-server/#devservermimetypes-)", "noInfo": "should be {Boolean} (https://webpack.js.org/configuration/dev-server/#devservernoinfo-)", + "onListening": "should be {Function} (https://webpack.js.org/configuration/dev-server/#onlistening)", "open": "should be {String|Boolean} (https://webpack.js.org/configuration/dev-server/#devserveropen)", "openPage": "should be {String} (https://webpack.js.org/configuration/dev-server/#devserveropenpage)", "overlay": "should be {Boolean|Object} (https://webpack.js.org/configuration/dev-server/#devserveroverlay)", diff --git a/test/CreateConfig.test.js b/test/CreateConfig.test.js index 97c5d47cba..3c00c90dd1 100644 --- a/test/CreateConfig.test.js +++ b/test/CreateConfig.test.js @@ -967,4 +967,16 @@ describe('createConfig', () => { ).toMatchSnapshot(); expect(webpackConfigNoStats).toMatchSnapshot(); }); + + it('onListening option', () => { + const config = createConfig( + Object.assign({}, webpackConfig, { + devServer: { onListening: () => {} }, + }), + argv, + { port: 8080 } + ); + + expect(config).toMatchSnapshot(); + }); }); diff --git a/test/__snapshots__/CreateConfig.test.js.snap b/test/__snapshots__/CreateConfig.test.js.snap index a3ec18de9c..8cf61a8f6d 100644 --- a/test/__snapshots__/CreateConfig.test.js.snap +++ b/test/__snapshots__/CreateConfig.test.js.snap @@ -740,6 +740,21 @@ Object { } `; +exports[`createConfig onListening option 1`] = ` +Object { + "hot": true, + "hotOnly": false, + "noInfo": true, + "onListening": [Function], + "port": 8080, + "publicPath": "/", + "stats": Object { + "cached": false, + "cachedAssets": false, + }, +} +`; + exports[`createConfig open option (boolean) (in devServer config) 1`] = ` Object { "hot": true, diff --git a/test/onListening.test.js b/test/onListening.test.js new file mode 100644 index 0000000000..249507aca5 --- /dev/null +++ b/test/onListening.test.js @@ -0,0 +1,30 @@ +'use strict'; + +const testServer = require('./helpers/test-server'); +const config = require('./fixtures/simple-config/webpack.config'); + +describe('Before And After options', () => { + let onListeningIsRunning = false; + + beforeAll((done) => { + testServer.start( + config, + { + onListening: (devServer) => { + if (!devServer) { + throw new Error('webpack-dev-server is not defined'); + } + + onListeningIsRunning = true; + }, + }, + done + ); + }); + + afterAll(testServer.close); + + it('should handle before route', () => { + expect(onListeningIsRunning).toBe(true); + }); +}); diff --git a/test/options.test.js b/test/options.test.js index a32b5b96bc..c1ab42b5b3 100644 --- a/test/options.test.js +++ b/test/options.test.js @@ -244,6 +244,10 @@ describe('options', () => { success: [true], failure: [''], }, + onListening: { + success: [() => {}], + failure: [''], + }, open: { success: [true, ''], failure: [{}],