From d3da508b12d913b444c0160bc02c1dc069c2cd25 Mon Sep 17 00:00:00 2001 From: Loonride Date: Thu, 11 Jul 2019 12:01:49 -0500 Subject: [PATCH] fix(client): stricter reg exp to redirect sockjs client path (#2069) * fix(client): stricter reg exp to redirect sockjs client path * fix(client): check resource context for normal module replacement * fix(client): remove dev server string from context path * fix(client): remove console logs * fix(client): fixed resource context match to use cwd --- client-src/default/webpack.config.js | 17 +++-- client-src/live/webpack.config.js | 17 +++-- test/e2e/Iframe.test.js | 83 ++++++++++++++++++++++ test/e2e/__snapshots__/Iframe.test.js.snap | 35 +++++++++ test/ports-map.js | 1 + 5 files changed, 141 insertions(+), 12 deletions(-) create mode 100644 test/e2e/Iframe.test.js create mode 100644 test/e2e/__snapshots__/Iframe.test.js.snap diff --git a/client-src/default/webpack.config.js b/client-src/default/webpack.config.js index ac001f26d7..3968b43bd9 100644 --- a/client-src/default/webpack.config.js +++ b/client-src/default/webpack.config.js @@ -18,11 +18,16 @@ module.exports = { ], }, plugins: [ - new webpack.NormalModuleReplacementPlugin(/\/clients\//, (resource) => { - resource.request = resource.request.replace( - /\/clients\//, - '/../clients/' - ); - }), + new webpack.NormalModuleReplacementPlugin( + /^\.\/clients\/SockJSClient$/, + (resource) => { + if (resource.context.startsWith(process.cwd())) { + resource.request = resource.request.replace( + /^\.\/clients\/SockJSClient$/, + '../clients/SockJSClient' + ); + } + } + ), ], }; diff --git a/client-src/live/webpack.config.js b/client-src/live/webpack.config.js index 3887b38b2b..9bb71611f8 100644 --- a/client-src/live/webpack.config.js +++ b/client-src/live/webpack.config.js @@ -34,11 +34,16 @@ module.exports = { to: path.resolve(__dirname, '../../client/live.html'), }, ]), - new webpack.NormalModuleReplacementPlugin(/\/clients\//, (resource) => { - resource.request = resource.request.replace( - /\/clients\//, - '/../clients/' - ); - }), + new webpack.NormalModuleReplacementPlugin( + /^\.\/clients\/SockJSClient$/, + (resource) => { + if (resource.context.startsWith(process.cwd())) { + resource.request = resource.request.replace( + /^\.\/clients\/SockJSClient$/, + '../clients/SockJSClient' + ); + } + } + ), ], }; diff --git a/test/e2e/Iframe.test.js b/test/e2e/Iframe.test.js new file mode 100644 index 0000000000..091ae707e9 --- /dev/null +++ b/test/e2e/Iframe.test.js @@ -0,0 +1,83 @@ +'use strict'; + +const testServer = require('../helpers/test-server'); +const config = require('../fixtures/client-config/webpack.config'); +const runBrowser = require('../helpers/run-browser'); +const port = require('../ports-map').Iframe; + +// iframe mode should be tested while still supported, because +// its sources differ from those of inline mode, which can cause unexpected +// breaking changes: https://github.com/webpack/webpack-dev-server/issues/2006 +describe('Client iframe console.log', () => { + const baseOptions = { + port, + host: '0.0.0.0', + }; + const cases = [ + { + title: 'hot disabled', + options: { + hot: false, + }, + }, + { + title: 'hot enabled', + options: { + hot: true, + }, + }, + { + title: 'liveReload disabled', + options: { + liveReload: false, + }, + }, + { + title: 'liveReload enabled', + options: { + liveReload: true, + }, + }, + { + title: 'clientLogLevel is silent', + options: { + clientLogLevel: 'silent', + }, + }, + ]; + + for (const { title, options } of cases) { + it(title, () => { + const res = []; + const testOptions = Object.assign({}, baseOptions, options); + + // TODO: use async/await when Node.js v6 support is dropped + return Promise.resolve() + .then(() => { + return new Promise((resolve) => { + testServer.startAwaitingCompilation(config, testOptions, resolve); + }); + }) + .then(runBrowser) + .then(({ page, browser }) => { + return new Promise((resolve) => { + page.goto(`http://localhost:${port}/webpack-dev-server/main`); + page.on('console', ({ _text }) => { + res.push(_text); + }); + setTimeout(() => { + browser.close().then(() => { + expect(res).toMatchSnapshot(); + resolve(); + }); + }, 3000); + }); + }) + .then(() => { + return new Promise((resolve) => { + testServer.close(resolve); + }); + }); + }); + } +}); diff --git a/test/e2e/__snapshots__/Iframe.test.js.snap b/test/e2e/__snapshots__/Iframe.test.js.snap new file mode 100644 index 0000000000..c34ef4b018 --- /dev/null +++ b/test/e2e/__snapshots__/Iframe.test.js.snap @@ -0,0 +1,35 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Client iframe console.log clientLogLevel is silent 1`] = ` +Array [ + "Hey.", +] +`; + +exports[`Client iframe console.log hot disabled 1`] = ` +Array [ + "Hey.", + "[WDS] Live Reloading enabled.", +] +`; + +exports[`Client iframe console.log hot enabled 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[WDS] Hot Module Replacement enabled.", + "[WDS] Live Reloading enabled.", +] +`; + +exports[`Client iframe console.log liveReload disabled 1`] = ` +Array [ + "Hey.", +] +`; + +exports[`Client iframe console.log liveReload enabled 1`] = ` +Array [ + "Hey.", +] +`; diff --git a/test/ports-map.js b/test/ports-map.js index 551a9f514f..788cb1047e 100644 --- a/test/ports-map.js +++ b/test/ports-map.js @@ -43,6 +43,7 @@ const portsList = { Progress: 1, 'progress-option': 1, 'profile-option': 1, + Iframe: 1, }; let startPort = 8079;