From bcd005a648806a8654145004fe475886ba7e2284 Mon Sep 17 00:00:00 2001 From: LingyuCoder Date: Thu, 5 Sep 2024 18:58:40 +0800 Subject: [PATCH 01/11] test(dev-sever): add e2e test cases --- packages/rspack-dev-server/jest.config.js | 20 +- .../tests/e2e/allowed-hosts.test.js | 2926 ++++++++--------- .../rspack-dev-server/tests/e2e/api.test.js | 1326 ++++---- 3 files changed, 2136 insertions(+), 2136 deletions(-) diff --git a/packages/rspack-dev-server/jest.config.js b/packages/rspack-dev-server/jest.config.js index acb4b7b6a8b..5207445e398 100644 --- a/packages/rspack-dev-server/jest.config.js +++ b/packages/rspack-dev-server/jest.config.js @@ -13,15 +13,15 @@ const config = { testPathIgnorePatterns: isWin ? [] : [ - // TODO: check why http proxy server throw error with websocket server - "/tests/e2e/allowed-hosts.test.js", - // TODO: check why this test timeout - "/tests/e2e/host.test.js", - // TODO: not support progress plugin event yet - "/tests/e2e/progress.test.js", - // TODO: check why this test throw error when run with other tests - "/tests/e2e/watch-files.test.js" - ], + // TODO: check why http proxy server throw error with websocket server + "/tests/e2e/allowed-hosts.test.js", + // TODO: check why this test timeout + "/tests/e2e/host.test.js", + // TODO: not support progress plugin event yet + "/tests/e2e/progress.test.js", + // TODO: check why this test throw error when run with other tests + "/tests/e2e/watch-files.test.js" + ], cache: false, testTimeout: process.env.CI ? 120000 : 30000, transform: { @@ -33,7 +33,7 @@ const config = { ] }, // Add this to find out which test timeouts - testSequencer: "/tests/helpers/sequencer.js", + // testSequencer: "/tests/helpers/sequencer.js", snapshotResolver: "/tests/helpers/snapshot-resolver.js", setupFilesAfterEnv: ["/tests/helpers/setup-test.js"], globalSetup: "/tests/helpers/global-setup-test.js", diff --git a/packages/rspack-dev-server/tests/e2e/allowed-hosts.test.js b/packages/rspack-dev-server/tests/e2e/allowed-hosts.test.js index e233ff9c22f..e31c2b54cdc 100644 --- a/packages/rspack-dev-server/tests/e2e/allowed-hosts.test.js +++ b/packages/rspack-dev-server/tests/e2e/allowed-hosts.test.js @@ -11,1521 +11,1521 @@ const [port1, port2] = require("../helpers/ports-map")["allowed-hosts"]; const webSocketServers = ["ws", "sockjs"]; describe("allowed hosts", () => { - for (const webSocketServer of webSocketServers) { - it(`should disconnect web socket client using custom hostname from web socket server with the "auto" value based on the "host" header ("${webSocketServer}")`, async () => { - const devServerHost = "127.0.0.1"; - const devServerPort = port1; - const proxyHost = devServerHost; - const proxyPort = port2; - - const compiler = webpack(config); - const devServerOptions = { - client: { - webSocketURL: { - port: port2 - } - }, - webSocketServer, - port: devServerPort, - host: devServerHost, - allowedHosts: "auto" - }; - const server = new Server(devServerOptions, compiler); - - await server.start(); - - function startProxy(callback) { - const app = express(); - - app.use( - "/", - createProxyMiddleware({ - // Emulation - onProxyReqWs: proxyReq => { - proxyReq.setHeader("host", "my-test-host"); - }, - target: `http://${devServerHost}:${devServerPort}`, - ws: true, - changeOrigin: true, - logLevel: "warn" - }) - ); - - return app.listen(proxyPort, proxyHost, callback); - } - - const proxy = await new Promise(resolve => { - const proxyCreated = startProxy(() => { - resolve(proxyCreated); - }); - }); - - const { page, browser } = await runBrowser(); - - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://${proxyHost}:${proxyPort}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - proxy.close(); - - await browser.close(); - await server.stop(); - } - }); - - it(`should disconnect web socket client using custom hostname from web socket server with the "auto" value based on the "host" header when "server: 'https'" is enabled ("${webSocketServer}")`, async () => { - const devServerHost = "127.0.0.1"; - const devServerPort = port1; - const proxyHost = devServerHost; - const proxyPort = port2; - - const compiler = webpack(config); - const devServerOptions = { - client: { - webSocketURL: { - port: port2, - protocol: "ws" - } - }, - webSocketServer, - port: devServerPort, - host: devServerHost, - allowedHosts: "auto", - server: "https" - }; - const server = new Server(devServerOptions, compiler); - - await server.start(); - - function startProxy(callback) { - const app = express(); - - app.use( - "/", - createProxyMiddleware({ - // Emulation - onProxyReqWs: proxyReq => { - proxyReq.setHeader("host", "my-test-host"); - }, - target: `https://${devServerHost}:${devServerPort}`, - secure: false, - ws: true, - changeOrigin: true, - logLevel: "warn" - }) - ); - - return app.listen(proxyPort, proxyHost, callback); - } - - const proxy = await new Promise(resolve => { - const proxyCreated = startProxy(() => { - resolve(proxyCreated); - }); - }); - - const { page, browser } = await runBrowser(); - - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://${proxyHost}:${proxyPort}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - proxy.close(); - - await browser.close(); - await server.stop(); - } - }); - - it(`should disconnect web socket client using custom hostname from web socket server with the "auto" value based on the "origin" header ("${webSocketServer}")`, async () => { - const devServerHost = "127.0.0.1"; - const devServerPort = port1; - const proxyHost = devServerHost; - const proxyPort = port2; - - const compiler = webpack(config); - const devServerOptions = { - client: { - webSocketURL: { - port: port2 - } - }, - webSocketServer, - port: devServerPort, - host: devServerHost, - allowedHosts: "auto" - }; - const server = new Server(devServerOptions, compiler); - - await server.start(); - - function startProxy(callback) { - const app = express(); - - app.use( - "/", - createProxyMiddleware({ - // Emulation - onProxyReqWs: proxyReq => { - proxyReq.setHeader("origin", "http://my-test-origin.com/"); - }, - target: `http://${devServerHost}:${devServerPort}`, - ws: true, - changeOrigin: true, - logLevel: "warn" - }) - ); - - return app.listen(proxyPort, proxyHost, callback); - } - - const proxy = await new Promise(resolve => { - const proxyCreated = startProxy(() => { - resolve(proxyCreated); - }); - }); - - const { page, browser } = await runBrowser(); - - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://${proxyHost}:${proxyPort}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - proxy.close(); - - await browser.close(); - await server.stop(); - } - }); - - it(`should connect web socket client using localhost to web socket server with the "auto" value ("${webSocketServer}")`, async () => { - const devServerHost = "localhost"; - const devServerPort = port1; - const proxyHost = devServerHost; - const proxyPort = port2; - - const compiler = webpack(config); - const devServerOptions = { - client: { - webSocketURL: { - port: port2 - } - }, - webSocketServer, - port: devServerPort, - host: devServerHost, - allowedHosts: "auto" - }; - const server = new Server(devServerOptions, compiler); - - await server.start(); - - function startProxy(callback) { - const app = express(); - - app.use( - "/", - createProxyMiddleware({ - target: `http://${devServerHost}:${devServerPort}`, - ws: true, - changeOrigin: true, - logLevel: "warn" - }) - ); - - return app.listen(proxyPort, proxyHost, callback); - } - - const proxy = await new Promise(resolve => { - const proxyCreated = startProxy(() => { - resolve(proxyCreated); - }); - }); - - const { page, browser } = await runBrowser(); - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://${proxyHost}:${proxyPort}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - proxy.close(); - - await browser.close(); - await server.stop(); - } - }); - - it(`should connect web socket client using "127.0.0.1" host to web socket server with the "auto" value ("${webSocketServer}")`, async () => { - const devServerHost = "127.0.0.1"; - const devServerPort = port1; - const proxyHost = devServerHost; - const proxyPort = port2; - - const compiler = webpack(config); - const devServerOptions = { - client: { - webSocketURL: { - port: port2 - } - }, - webSocketServer, - port: devServerPort, - host: devServerHost, - allowedHosts: "auto" - }; - const server = new Server(devServerOptions, compiler); - - await server.start(); - - function startProxy(callback) { - const app = express(); - - app.use( - "/", - createProxyMiddleware({ - target: `http://${devServerHost}:${devServerPort}`, - ws: true, - changeOrigin: true, - logLevel: "warn" - }) - ); - - return app.listen(proxyPort, proxyHost, callback); - } - - const proxy = await new Promise(resolve => { - const proxyCreated = startProxy(() => { - resolve(proxyCreated); - }); - }); - - const { page, browser } = await runBrowser(); - - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://${proxyHost}:${proxyPort}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - proxy.close(); - - await browser.close(); - await server.stop(); - } - }); - - // it(`should connect web socket client using "[::1] host to web socket server with the "auto" value ("${webSocketServer}")`, async () => { - // const devServerHost = "::1"; - // const devServerPort = port1; - // const proxyHost = devServerHost; - // const proxyPort = port2; - - // const compiler = webpack(config); - // const devServerOptions = { - // client: { - // webSocketURL: { - // port: port2 - // } - // }, - // webSocketServer, - // port: devServerPort, - // host: devServerHost, - // allowedHosts: "auto" - // }; - // const server = new Server(devServerOptions, compiler); - - // await server.start(); - - // function startProxy(callback) { - // const app = express(); - - // app.use( - // "/", - // createProxyMiddleware({ - // target: `http://[${devServerHost}]:${devServerPort}`, - // ws: true, - // changeOrigin: true, - // logLevel: "warn" - // }) - // ); - - // return app.listen(proxyPort, proxyHost, callback); - // } - - // const proxy = await new Promise(resolve => { - // const proxyCreated = startProxy(() => { - // resolve(proxyCreated); - // }); - // }); - - // const { page, browser } = await runBrowser(); - - // try { - // const pageErrors = []; - // const consoleMessages = []; - - // page - // .on("console", message => { - // consoleMessages.push(message); - // }) - // .on("pageerror", error => { - // pageErrors.push(error); - // }); - - // await page.goto(`http://[${proxyHost}]:${proxyPort}/`, { - // waitUntil: "networkidle0" - // }); - - // expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - // "console messages" - // ); - // expect(pageErrors).toMatchSnapshot("page errors"); - // } catch (error) { - // throw error; - // } finally { - // proxy.close(); - - // await browser.close(); - // await server.stop(); - // } - // }); - - it(`should connect web socket client using "file:" protocol to web socket server with the "auto" value ("${webSocketServer}")`, async () => { - const devServerHost = "127.0.0.1"; - const devServerPort = port1; - const proxyHost = devServerHost; - const proxyPort = port2; - - const compiler = webpack(config); - const devServerOptions = { - client: { - webSocketURL: { - port: port2 - } - }, - webSocketServer, - port: devServerPort, - host: devServerHost, - allowedHosts: "auto" - }; - const server = new Server(devServerOptions, compiler); - - await server.start(); - - function startProxy(callback) { - const app = express(); - - app.use( - "/", - createProxyMiddleware({ - target: `http://${devServerHost}:${devServerPort}`, - onProxyReqWs: proxyReq => { - proxyReq.setHeader("origin", "file:///path/to/local/file.js"); - }, - ws: true, - changeOrigin: true, - logLevel: "warn" - }) - ); - - return app.listen(proxyPort, proxyHost, callback); - } - - const proxy = await new Promise(resolve => { - const proxyCreated = startProxy(() => { - resolve(proxyCreated); - }); - }); - - const { page, browser } = await runBrowser(); - - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://${proxyHost}:${proxyPort}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - proxy.close(); - - await browser.close(); - await server.stop(); - } - }); - - it(`should connect web socket client using "chrome-extension:" protocol to web socket server with the "auto" value ("${webSocketServer}")`, async () => { - const devServerHost = "127.0.0.1"; - const devServerPort = port1; - const proxyHost = devServerHost; - const proxyPort = port2; - - const compiler = webpack(config); - const devServerOptions = { - client: { - webSocketURL: { - port: port2 - } - }, - webSocketServer, - port: devServerPort, - host: devServerHost, - allowedHosts: "auto" - }; - const server = new Server(devServerOptions, compiler); - - await server.start(); - - function startProxy(callback) { - const app = express(); - - app.use( - "/", - createProxyMiddleware({ - target: `http://${devServerHost}:${devServerPort}`, - onProxyReqWs: proxyReq => { - proxyReq.setHeader("origin", "chrome-extension:///abcdef"); - }, - ws: true, - changeOrigin: true, - logLevel: "warn" - }) - ); - - return app.listen(proxyPort, proxyHost, callback); - } - - const proxy = await new Promise(resolve => { - const proxyCreated = startProxy(() => { - resolve(proxyCreated); - }); - }); - - const { page, browser } = await runBrowser(); - - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://${proxyHost}:${proxyPort}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - proxy.close(); - - await browser.close(); - await server.stop(); - } - }); - - it(`should connect web socket client using custom hostname to web socket server with the "all" value ("${webSocketServer}")`, async () => { - const devServerHost = "127.0.0.1"; - const devServerPort = port1; - const proxyHost = devServerHost; - const proxyPort = port2; - - const compiler = webpack(config); - const devServerOptions = { - client: { - webSocketURL: { - port: port2 - } - }, - webSocketServer, - port: devServerPort, - host: devServerHost, - allowedHosts: "all" - }; - const server = new Server(devServerOptions, compiler); - - await server.start(); - - function startProxy(callback) { - const app = express(); - - app.use( - "/", - createProxyMiddleware({ - // Emulation - onProxyReqWs: proxyReq => { - proxyReq.setHeader("origin", "http://my-test-origin.com/"); - }, - target: `http://${devServerHost}:${devServerPort}`, - ws: true, - changeOrigin: true, - logLevel: "warn" - }) - ); - - return app.listen(proxyPort, proxyHost, callback); - } - - const proxy = await new Promise(resolve => { - const proxyCreated = startProxy(() => { - resolve(proxyCreated); - }); - }); - - const { page, browser } = await runBrowser(); - - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://${proxyHost}:${proxyPort}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - proxy.close(); - - await browser.close(); - await server.stop(); - } - }); - - it(`should connect web socket client using custom hostname to web socket server with the "all" value in array ("${webSocketServer}")`, async () => { - const devServerHost = "127.0.0.1"; - const devServerPort = port1; - const proxyHost = devServerHost; - const proxyPort = port2; - - const compiler = webpack(config); - const devServerOptions = { - client: { - webSocketURL: { - port: port2 - } - }, - webSocketServer, - port: devServerPort, - host: devServerHost, - allowedHosts: ["all"] - }; - const server = new Server(devServerOptions, compiler); - - await server.start(); - - function startProxy(callback) { - const app = express(); - - app.use( - "/", - createProxyMiddleware({ - // Emulation - onProxyReqWs: proxyReq => { - proxyReq.setHeader("origin", "http://my-test-origin.com/"); - }, - target: `http://${devServerHost}:${devServerPort}`, - ws: true, - changeOrigin: true, - logLevel: "warn" - }) - ); - - return app.listen(proxyPort, proxyHost, callback); - } - - const proxy = await new Promise(resolve => { - const proxyCreated = startProxy(() => { - resolve(proxyCreated); - }); - }); - - const { page, browser } = await runBrowser(); - - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://${proxyHost}:${proxyPort}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - proxy.close(); - - await browser.close(); - await server.stop(); - } - }); - - it(`should connect web socket client using custom hostname to web socket server with the custom hostname value ("${webSocketServer}")`, async () => { - const devServerHost = "127.0.0.1"; - const devServerPort = port1; - const proxyHost = devServerHost; - const proxyPort = port2; - - const compiler = webpack(config); - const devServerOptions = { - client: { - webSocketURL: { - port: port2 - } - }, - webSocketServer, - port: devServerPort, - host: devServerHost, - allowedHosts: "my-test-origin.com" - }; - const server = new Server(devServerOptions, compiler); - - await server.start(); - - function startProxy(callback) { - const app = express(); - - app.use( - "/", - createProxyMiddleware({ - // Emulation - onProxyReqWs: proxyReq => { - proxyReq.setHeader("origin", "http://my-test-origin.com/"); - }, - target: `http://${devServerHost}:${devServerPort}`, - ws: true, - changeOrigin: true, - logLevel: "warn" - }) - ); - - return app.listen(proxyPort, proxyHost, callback); - } - - const proxy = await new Promise(resolve => { - const proxyCreated = startProxy(() => { - resolve(proxyCreated); - }); - }); - - const { page, browser } = await runBrowser(); - - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://${proxyHost}:${proxyPort}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - proxy.close(); - - await browser.close(); - await server.stop(); - } - }); - - it(`should connect web socket client using custom hostname to web socket server with the custom hostname value starting with dot ("${webSocketServer}")`, async () => { - const devServerHost = "127.0.0.1"; - const devServerPort = port1; - const proxyHost = devServerHost; - const proxyPort = port2; - - const compiler = webpack(config); - const devServerOptions = { - client: { - webSocketURL: { - port: port2 - } - }, - webSocketServer, - port: devServerPort, - host: devServerHost, - allowedHosts: ".my-test-origin.com" - }; - const server = new Server(devServerOptions, compiler); - - await server.start(); - - function startProxy(callback) { - const app = express(); - - app.use( - "/", - createProxyMiddleware({ - // Emulation - onProxyReqWs: proxyReq => { - proxyReq.setHeader("origin", "http://my-test-origin.com/"); - }, - target: `http://${devServerHost}:${devServerPort}`, - ws: true, - changeOrigin: true, - logLevel: "warn" - }) - ); - - return app.listen(proxyPort, proxyHost, callback); - } - - const proxy = await new Promise(resolve => { - const proxyCreated = startProxy(() => { - resolve(proxyCreated); - }); - }); - - const { page, browser } = await runBrowser(); - - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://${proxyHost}:${proxyPort}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - proxy.close(); - - await browser.close(); - await server.stop(); - } - }); - - it(`should connect web socket client using custom sub hostname to web socket server with the custom hostname value ("${webSocketServer}")`, async () => { - const devServerHost = "127.0.0.1"; - const devServerPort = port1; - const proxyHost = devServerHost; - const proxyPort = port2; - - const compiler = webpack(config); - const devServerOptions = { - client: { - webSocketURL: { - port: port2 - } - }, - webSocketServer, - port: devServerPort, - host: devServerHost, - allowedHosts: ".my-test-origin.com" - }; - const server = new Server(devServerOptions, compiler); - - await server.start(); - - function startProxy(callback) { - const app = express(); - - app.use( - "/", - createProxyMiddleware({ - // Emulation - onProxyReqWs: proxyReq => { - proxyReq.setHeader( - "origin", - "http://foo.bar.baz.my-test-origin.com/" - ); - }, - target: `http://${devServerHost}:${devServerPort}`, - ws: true, - changeOrigin: true, - logLevel: "warn" - }) - ); - - return app.listen(proxyPort, proxyHost, callback); - } - - const proxy = await new Promise(resolve => { - const proxyCreated = startProxy(() => { - resolve(proxyCreated); - }); - }); - - const { page, browser } = await runBrowser(); - - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://${proxyHost}:${proxyPort}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - proxy.close(); - - await browser.close(); - await server.stop(); - } - }); - - it(`should connect web socket client using custom hostname to web socket server with the multiple custom hostname values ("${webSocketServer}")`, async () => { - const devServerHost = "127.0.0.1"; - const devServerPort = port1; - const proxyHost = devServerHost; - const proxyPort = port2; - - const compiler = webpack(config); - const devServerOptions = { - client: { - webSocketURL: { - port: port2 - } - }, - webSocketServer, - port: devServerPort, - host: devServerHost, - allowedHosts: ["my-test-origin.com"] - }; - const server = new Server(devServerOptions, compiler); - - await server.start(); - - function startProxy(callback) { - const app = express(); - - app.use( - "/", - createProxyMiddleware({ - // Emulation - onProxyReqWs: proxyReq => { - proxyReq.setHeader("origin", "http://my-test-origin.com/"); - }, - target: `http://${devServerHost}:${devServerPort}`, - ws: true, - changeOrigin: true, - logLevel: "warn" - }) - ); - - return app.listen(proxyPort, proxyHost, callback); - } - - const proxy = await new Promise(resolve => { - const proxyCreated = startProxy(() => { - resolve(proxyCreated); - }); - }); - - const { page, browser } = await runBrowser(); - - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://${proxyHost}:${proxyPort}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - proxy.close(); - - await browser.close(); - await server.stop(); - } - }); - - it(`should disconnect web client using localhost to web socket server with the "auto" value ("${webSocketServer}")`, async () => { - const devServerHost = "127.0.0.1"; - const devServerPort = port1; - const proxyHost = devServerHost; - const proxyPort = port2; - - const compiler = webpack(config); - const devServerOptions = { - client: { - webSocketURL: { - port: port2 - } - }, - webSocketServer, - port: devServerPort, - host: devServerHost, - allowedHosts: "auto" - }; - const server = new Server(devServerOptions, compiler); - - await server.start(); - - function startProxy(callback) { - const app = express(); - - app.use( - "/", - createProxyMiddleware({ - // Emulation - onProxyReq: (proxyReq, req, res) => { - proxyReq.setHeader("host", "unknown"); - res.setHeader("host", devServerHost); - }, - target: `http://${devServerHost}:${devServerPort}`, - ws: true, - changeOrigin: true, - logLevel: "warn" - }) - ); - - return app.listen(proxyPort, proxyHost, callback); - } - - const proxy = await new Promise(resolve => { - const proxyCreated = startProxy(() => { - resolve(proxyCreated); - }); - }); - - const { page, browser } = await runBrowser(); - - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://${proxyHost}:${proxyPort}/`, { - waitUntil: "networkidle0" - }); - - const html = await page.content(); - - expect(html).toMatchSnapshot("html"); - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - proxy.close(); - - await browser.close(); - await server.stop(); - } - }); - } - - describe("check host headers", () => { - let compiler; - let server; - let page; - let browser; - let pageErrors; - let consoleMessages; - - beforeEach(() => { - compiler = webpack(config); - pageErrors = []; - consoleMessages = []; - }); - - afterEach(async () => { - await browser.close(); - await server.stop(); - }); - - it("should always allow `localhost` if options.allowedHosts is auto", async () => { - const options = { - allowedHosts: "auto", - port: port1 - }; - - const headers = { - host: "localhost" - }; - - server = new Server(options, compiler); - - await server.start(); - - ({ page, browser } = await runBrowser()); - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - const response = await page.goto(`http://127.0.0.1:${port1}/main.js`, { - waitUntil: "networkidle0" - }); - - if (!server.checkHeader(headers, "host")) { - throw new Error("Validation didn't fail"); - } - - expect(response.status()).toMatchSnapshot("response status"); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - - expect(pageErrors).toMatchSnapshot("page errors"); - }); - - it("should always allow `localhost` subdomain if options.allowedHosts is auto", async () => { - const options = { - allowedHosts: "auto", - port: port1 - }; - - const headers = { - host: "app.localhost" - }; - - server = new Server(options, compiler); - - await server.start(); - - ({ page, browser } = await runBrowser()); - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - const response = await page.goto(`http://127.0.0.1:${port1}/main.js`, { - waitUntil: "networkidle0" - }); - - if (!server.checkHeader(headers, "host")) { - throw new Error("Validation didn't fail"); - } - - expect(response.status()).toMatchSnapshot("response status"); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - - expect(pageErrors).toMatchSnapshot("page errors"); - }); + for (const webSocketServer of webSocketServers) { + it(`should disconnect web socket client using custom hostname from web socket server with the "auto" value based on the "host" header ("${webSocketServer}")`, async () => { + const devServerHost = "127.0.0.1"; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port2 + } + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: "auto" + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const app = express(); + + app.use( + "/", + createProxyMiddleware({ + // Emulation + onProxyReqWs: proxyReq => { + proxyReq.setHeader("host", "my-test-host"); + }, + target: `http://${devServerHost}:${devServerPort}`, + ws: true, + changeOrigin: true, + logLevel: "warn" + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + it(`should disconnect web socket client using custom hostname from web socket server with the "auto" value based on the "host" header when "server: 'https'" is enabled ("${webSocketServer}")`, async () => { + const devServerHost = "127.0.0.1"; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port2, + protocol: "ws" + } + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: "auto", + server: "https" + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const app = express(); + + app.use( + "/", + createProxyMiddleware({ + // Emulation + onProxyReqWs: proxyReq => { + proxyReq.setHeader("host", "my-test-host"); + }, + target: `https://${devServerHost}:${devServerPort}`, + secure: false, + ws: true, + changeOrigin: true, + logLevel: "warn" + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + it(`should disconnect web socket client using custom hostname from web socket server with the "auto" value based on the "origin" header ("${webSocketServer}")`, async () => { + const devServerHost = "127.0.0.1"; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port2 + } + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: "auto" + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const app = express(); + + app.use( + "/", + createProxyMiddleware({ + // Emulation + onProxyReqWs: proxyReq => { + proxyReq.setHeader("origin", "http://my-test-origin.com/"); + }, + target: `http://${devServerHost}:${devServerPort}`, + ws: true, + changeOrigin: true, + logLevel: "warn" + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + it(`should connect web socket client using localhost to web socket server with the "auto" value ("${webSocketServer}")`, async () => { + const devServerHost = "localhost"; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port2 + } + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: "auto" + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const app = express(); + + app.use( + "/", + createProxyMiddleware({ + target: `http://${devServerHost}:${devServerPort}`, + ws: true, + changeOrigin: true, + logLevel: "warn" + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + it(`should connect web socket client using "127.0.0.1" host to web socket server with the "auto" value ("${webSocketServer}")`, async () => { + const devServerHost = "127.0.0.1"; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port2 + } + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: "auto" + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const app = express(); + + app.use( + "/", + createProxyMiddleware({ + target: `http://${devServerHost}:${devServerPort}`, + ws: true, + changeOrigin: true, + logLevel: "warn" + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + it(`should connect web socket client using "[::1] host to web socket server with the "auto" value ("${webSocketServer}")`, async () => { + const devServerHost = "::1"; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port2 + } + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: "auto" + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const app = express(); + + app.use( + "/", + createProxyMiddleware({ + target: `http://[${devServerHost}]:${devServerPort}`, + ws: true, + changeOrigin: true, + logLevel: "warn" + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://[${proxyHost}]:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + it(`should connect web socket client using "file:" protocol to web socket server with the "auto" value ("${webSocketServer}")`, async () => { + const devServerHost = "127.0.0.1"; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port2 + } + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: "auto" + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const app = express(); + + app.use( + "/", + createProxyMiddleware({ + target: `http://${devServerHost}:${devServerPort}`, + onProxyReqWs: proxyReq => { + proxyReq.setHeader("origin", "file:///path/to/local/file.js"); + }, + ws: true, + changeOrigin: true, + logLevel: "warn" + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + it(`should connect web socket client using "chrome-extension:" protocol to web socket server with the "auto" value ("${webSocketServer}")`, async () => { + const devServerHost = "127.0.0.1"; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port2 + } + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: "auto" + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const app = express(); + + app.use( + "/", + createProxyMiddleware({ + target: `http://${devServerHost}:${devServerPort}`, + onProxyReqWs: proxyReq => { + proxyReq.setHeader("origin", "chrome-extension:///abcdef"); + }, + ws: true, + changeOrigin: true, + logLevel: "warn" + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + it(`should connect web socket client using custom hostname to web socket server with the "all" value ("${webSocketServer}")`, async () => { + const devServerHost = "127.0.0.1"; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port2 + } + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: "all" + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const app = express(); + + app.use( + "/", + createProxyMiddleware({ + // Emulation + onProxyReqWs: proxyReq => { + proxyReq.setHeader("origin", "http://my-test-origin.com/"); + }, + target: `http://${devServerHost}:${devServerPort}`, + ws: true, + changeOrigin: true, + logLevel: "warn" + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + it(`should connect web socket client using custom hostname to web socket server with the "all" value in array ("${webSocketServer}")`, async () => { + const devServerHost = "127.0.0.1"; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port2 + } + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: ["all"] + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const app = express(); + + app.use( + "/", + createProxyMiddleware({ + // Emulation + onProxyReqWs: proxyReq => { + proxyReq.setHeader("origin", "http://my-test-origin.com/"); + }, + target: `http://${devServerHost}:${devServerPort}`, + ws: true, + changeOrigin: true, + logLevel: "warn" + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + it(`should connect web socket client using custom hostname to web socket server with the custom hostname value ("${webSocketServer}")`, async () => { + const devServerHost = "127.0.0.1"; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port2 + } + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: "my-test-origin.com" + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const app = express(); + + app.use( + "/", + createProxyMiddleware({ + // Emulation + onProxyReqWs: proxyReq => { + proxyReq.setHeader("origin", "http://my-test-origin.com/"); + }, + target: `http://${devServerHost}:${devServerPort}`, + ws: true, + changeOrigin: true, + logLevel: "warn" + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + it(`should connect web socket client using custom hostname to web socket server with the custom hostname value starting with dot ("${webSocketServer}")`, async () => { + const devServerHost = "127.0.0.1"; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port2 + } + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: ".my-test-origin.com" + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const app = express(); + + app.use( + "/", + createProxyMiddleware({ + // Emulation + onProxyReqWs: proxyReq => { + proxyReq.setHeader("origin", "http://my-test-origin.com/"); + }, + target: `http://${devServerHost}:${devServerPort}`, + ws: true, + changeOrigin: true, + logLevel: "warn" + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + it(`should connect web socket client using custom sub hostname to web socket server with the custom hostname value ("${webSocketServer}")`, async () => { + const devServerHost = "127.0.0.1"; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port2 + } + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: ".my-test-origin.com" + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const app = express(); + + app.use( + "/", + createProxyMiddleware({ + // Emulation + onProxyReqWs: proxyReq => { + proxyReq.setHeader( + "origin", + "http://foo.bar.baz.my-test-origin.com/" + ); + }, + target: `http://${devServerHost}:${devServerPort}`, + ws: true, + changeOrigin: true, + logLevel: "warn" + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + it(`should connect web socket client using custom hostname to web socket server with the multiple custom hostname values ("${webSocketServer}")`, async () => { + const devServerHost = "127.0.0.1"; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port2 + } + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: ["my-test-origin.com"] + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const app = express(); + + app.use( + "/", + createProxyMiddleware({ + // Emulation + onProxyReqWs: proxyReq => { + proxyReq.setHeader("origin", "http://my-test-origin.com/"); + }, + target: `http://${devServerHost}:${devServerPort}`, + ws: true, + changeOrigin: true, + logLevel: "warn" + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + it(`should disconnect web client using localhost to web socket server with the "auto" value ("${webSocketServer}")`, async () => { + const devServerHost = "127.0.0.1"; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port2 + } + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: "auto" + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const app = express(); + + app.use( + "/", + createProxyMiddleware({ + // Emulation + onProxyReq: (proxyReq, req, res) => { + proxyReq.setHeader("host", "unknown"); + res.setHeader("host", devServerHost); + }, + target: `http://${devServerHost}:${devServerPort}`, + ws: true, + changeOrigin: true, + logLevel: "warn" + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + const html = await page.content(); + + expect(html).toMatchSnapshot("html"); + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + } + + describe("check host headers", () => { + let compiler; + let server; + let page; + let browser; + let pageErrors; + let consoleMessages; + + beforeEach(() => { + compiler = webpack(config); + pageErrors = []; + consoleMessages = []; + }); + + afterEach(async () => { + await browser.close(); + await server.stop(); + }); + + it("should always allow `localhost` if options.allowedHosts is auto", async () => { + const options = { + allowedHosts: "auto", + port: port1 + }; + + const headers = { + host: "localhost" + }; + + server = new Server(options, compiler); + + await server.start(); + + ({ page, browser } = await runBrowser()); + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const response = await page.goto(`http://127.0.0.1:${port1}/main.js`, { + waitUntil: "networkidle0" + }); + + if (!server.checkHeader(headers, "host")) { + throw new Error("Validation didn't fail"); + } + + expect(response.status()).toMatchSnapshot("response status"); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + }); + + it("should always allow `localhost` subdomain if options.allowedHosts is auto", async () => { + const options = { + allowedHosts: "auto", + port: port1 + }; + + const headers = { + host: "app.localhost" + }; + + server = new Server(options, compiler); + + await server.start(); + + ({ page, browser } = await runBrowser()); + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const response = await page.goto(`http://127.0.0.1:${port1}/main.js`, { + waitUntil: "networkidle0" + }); + + if (!server.checkHeader(headers, "host")) { + throw new Error("Validation didn't fail"); + } + + expect(response.status()).toMatchSnapshot("response status"); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + }); - // it("should always allow value from the `host` options if options.allowedHosts is auto", async () => { - // const networkIP = Server.internalIPSync("v4"); - // const options = { - // host: networkIP, - // allowedHosts: "auto", - // port: port1 - // }; + it("should always allow value from the `host` options if options.allowedHosts is auto", async () => { + const networkIP = Server.internalIPSync("v4"); + const options = { + host: networkIP, + allowedHosts: "auto", + port: port1 + }; - // const headers = { - // host: networkIP - // }; + const headers = { + host: networkIP + }; - // server = new Server(options, compiler); + server = new Server(options, compiler); - // await server.start(); + await server.start(); - // ({ page, browser } = await runBrowser()); + ({ page, browser } = await runBrowser()); - // page - // .on("console", message => { - // consoleMessages.push(message); - // }) - // .on("pageerror", error => { - // pageErrors.push(error); - // }); + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); - // const response = await page.goto(`http://${networkIP}:${port1}/main.js`, { - // waitUntil: "networkidle0" - // }); + const response = await page.goto(`http://${networkIP}:${port1}/main.js`, { + waitUntil: "networkidle0" + }); - // if (!server.checkHeader(headers, "host")) { - // throw new Error("Validation didn't fail"); - // } + if (!server.checkHeader(headers, "host")) { + throw new Error("Validation didn't fail"); + } - // expect(response.status()).toMatchSnapshot("response status"); + expect(response.status()).toMatchSnapshot("response status"); - // expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - // "console messages" - // ); + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); - // expect(pageErrors).toMatchSnapshot("page errors"); - // }); + expect(pageErrors).toMatchSnapshot("page errors"); + }); - it("should always allow value of the `host` option from the `client.webSocketURL` option if options.allowedHosts is auto", async () => { - const options = { - allowedHosts: "auto", - port: port1, - client: { - webSocketURL: "ws://test.host:80" - } - }; + it("should always allow value of the `host` option from the `client.webSocketURL` option if options.allowedHosts is auto", async () => { + const options = { + allowedHosts: "auto", + port: port1, + client: { + webSocketURL: "ws://test.host:80" + } + }; - const headers = { - host: "test.host" - }; + const headers = { + host: "test.host" + }; - server = new Server(options, compiler); + server = new Server(options, compiler); - await server.start(); + await server.start(); - ({ page, browser } = await runBrowser()); + ({ page, browser } = await runBrowser()); - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); - const response = await page.goto(`http://127.0.0.1:${port1}/main.js`, { - waitUntil: "networkidle0" - }); + const response = await page.goto(`http://127.0.0.1:${port1}/main.js`, { + waitUntil: "networkidle0" + }); - if (!server.checkHeader(headers, "host")) { - throw new Error("Validation didn't fail"); - } + if (!server.checkHeader(headers, "host")) { + throw new Error("Validation didn't fail"); + } - expect(response.status()).toMatchSnapshot("response status"); + expect(response.status()).toMatchSnapshot("response status"); - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); - expect(pageErrors).toMatchSnapshot("page errors"); - }); + expect(pageErrors).toMatchSnapshot("page errors"); + }); - it("should always allow any host if options.allowedHosts is all", async () => { - const options = { - allowedHosts: "all", - port: port1 - }; - const headers = { - host: "bad.host" - }; + it("should always allow any host if options.allowedHosts is all", async () => { + const options = { + allowedHosts: "all", + port: port1 + }; + const headers = { + host: "bad.host" + }; - server = new Server(options, compiler); + server = new Server(options, compiler); - await server.start(); + await server.start(); - ({ page, browser } = await runBrowser()); + ({ page, browser } = await runBrowser()); - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); - const response = await page.goto(`http://127.0.0.1:${port1}/main.js`, { - waitUntil: "networkidle0" - }); + const response = await page.goto(`http://127.0.0.1:${port1}/main.js`, { + waitUntil: "networkidle0" + }); - if (!server.checkHeader(headers, "host")) { - throw new Error("Validation didn't fail"); - } + if (!server.checkHeader(headers, "host")) { + throw new Error("Validation didn't fail"); + } - expect(response.status()).toMatchSnapshot("response status"); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); + expect(response.status()).toMatchSnapshot("response status"); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); - expect(pageErrors).toMatchSnapshot("page errors"); - }); + expect(pageErrors).toMatchSnapshot("page errors"); + }); - it("should allow hosts in allowedHosts", async () => { - const tests = ["test.host", "test2.host", "test3.host"]; - const options = { - allowedHosts: tests, - port: port1 - }; + it("should allow hosts in allowedHosts", async () => { + const tests = ["test.host", "test2.host", "test3.host"]; + const options = { + allowedHosts: tests, + port: port1 + }; - server = new Server(options, compiler); + server = new Server(options, compiler); - await server.start(); + await server.start(); - ({ page, browser } = await runBrowser()); + ({ page, browser } = await runBrowser()); - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); - const response = await page.goto(`http://127.0.0.1:${port1}/main.js`, { - waitUntil: "networkidle0" - }); + const response = await page.goto(`http://127.0.0.1:${port1}/main.js`, { + waitUntil: "networkidle0" + }); - tests.forEach(test => { - const headers = { host: test }; + tests.forEach(test => { + const headers = { host: test }; - if (!server.checkHeader(headers, "host")) { - throw new Error("Validation didn't fail"); - } - }); + if (!server.checkHeader(headers, "host")) { + throw new Error("Validation didn't fail"); + } + }); - expect(response.status()).toMatchSnapshot("response status"); + expect(response.status()).toMatchSnapshot("response status"); - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); - expect(pageErrors).toMatchSnapshot("page errors"); - }); + expect(pageErrors).toMatchSnapshot("page errors"); + }); - it("should allow hosts that pass a wildcard in allowedHosts", async () => { - const options = { - allowedHosts: [".example.com"], - port: port1 - }; + it("should allow hosts that pass a wildcard in allowedHosts", async () => { + const options = { + allowedHosts: [".example.com"], + port: port1 + }; - server = new Server(options, compiler); + server = new Server(options, compiler); - await server.start(); + await server.start(); - ({ page, browser } = await runBrowser()); + ({ page, browser } = await runBrowser()); - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); - const response = await page.goto(`http://127.0.0.1:${port1}/main.js`, { - waitUntil: "networkidle0" - }); + const response = await page.goto(`http://127.0.0.1:${port1}/main.js`, { + waitUntil: "networkidle0" + }); - const tests = [ - "www.example.com", - "subdomain.example.com", - "example.com", - "subsubcomain.subdomain.example.com", - "example.com:80", - "subdomain.example.com:80" - ]; + const tests = [ + "www.example.com", + "subdomain.example.com", + "example.com", + "subsubcomain.subdomain.example.com", + "example.com:80", + "subdomain.example.com:80" + ]; - tests.forEach(test => { - const headers = { host: test }; + tests.forEach(test => { + const headers = { host: test }; - if (!server.checkHeader(headers, "host")) { - throw new Error("Validation didn't fail"); - } - }); + if (!server.checkHeader(headers, "host")) { + throw new Error("Validation didn't fail"); + } + }); - expect(response.status()).toMatchSnapshot("response status"); + expect(response.status()).toMatchSnapshot("response status"); - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); - expect(pageErrors).toMatchSnapshot("page errors"); - }); - }); + expect(pageErrors).toMatchSnapshot("page errors"); + }); + }); }); diff --git a/packages/rspack-dev-server/tests/e2e/api.test.js b/packages/rspack-dev-server/tests/e2e/api.test.js index be54773faf8..5344f68c8e6 100644 --- a/packages/rspack-dev-server/tests/e2e/api.test.js +++ b/packages/rspack-dev-server/tests/e2e/api.test.js @@ -9,745 +9,745 @@ const sessionSubscribe = require("../helpers/session-subscribe"); const port = require("../helpers/ports-map").api; describe("API", () => { - describe("WEBPACK_SERVE environment variable", () => { - const OLD_ENV = process.env; - let server; - let page; - let browser; - let pageErrors; - let consoleMessages; - - beforeEach(async () => { - // this is important - it clears the cache - jest.resetModules(); - - process.env = { ...OLD_ENV }; - - delete process.env.WEBPACK_SERVE; - - ({ page, browser } = await runBrowser()); - - pageErrors = []; - consoleMessages = []; - }); - - afterEach(async () => { - await browser.close(); - await server.stop(); - process.env = OLD_ENV; - }); - - it("should be present", async () => { - expect(process.env.WEBPACK_SERVE).toBeUndefined(); - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - const { - RspackDevServer: WebpackDevServer - } = require("@rspack/dev-server"); - - const compiler = webpack(config); - server = new WebpackDevServer({ port }, compiler); - - await server.start(); - - expect(process.env.WEBPACK_SERVE).toBe("true"); - - const response = await page.goto(`http://127.0.0.1:${port}/`, { - waitUntil: "networkidle0" - }); - - expect(response.status()).toMatchSnapshot("response status"); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - - expect(pageErrors).toMatchSnapshot("page errors"); - }); - }); - - describe("latest async API", () => { - it(`should work with async API`, async () => { - const compiler = webpack(config); - const server = new Server({ port }, compiler); - - await server.start(); - - const { page, browser } = await runBrowser(); - - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://127.0.0.1:${port}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - await browser.close(); - await server.stop(); - } - }); - - it(`should work with callback API`, async () => { - const compiler = webpack(config); - const server = new Server({ port }, compiler); - - await new Promise(resolve => { - server.startCallback(() => { - resolve(); - }); - }); - - const { page, browser } = await runBrowser(); - - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://127.0.0.1:${port}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - await browser.close(); - await new Promise(resolve => { - server.stopCallback(() => { - resolve(); - }); - }); - } - }); - - it(`should catch errors within startCallback`, async () => { - const compiler = webpack(config); - const server = new Server( - { port, static: "https://absolute-url.com/somewhere" }, - compiler - ); - - await new Promise(resolve => { - server.startCallback(err => { - expect(err.message).toEqual( - "Using a URL as static.directory is not supported" - ); - resolve(); - }); - }); - - await new Promise(resolve => { - server.stopCallback(() => { - resolve(); - }); - }); - }); - - it(`should work when using configured manually`, async () => { - const compiler = webpack({ - ...config, - entry: [ - "@rspack/core/hot/dev-server.js", - `@rspack/dev-server/client/index.js?hot=true&live-reload=true"`, - path.resolve(__dirname, "../fixtures/client-config/foo.js") - ], - plugins: [...config.plugins, new webpack.HotModuleReplacementPlugin()] - }); - const server = new Server({ port, hot: false, client: false }, compiler); - - await server.start(); - - const { page, browser } = await runBrowser(); - try { - const pageErrors = []; - const consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - await page.goto(`http://127.0.0.1:${port}/`, { - waitUntil: "networkidle0" - }); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - await browser.close(); - await server.stop(); - } - }); - - it(`should work and allow to rerun dev server multiple times`, async () => { - const compiler = webpack(config); - const server = new Server({ port }, compiler); - - await server.start(); - - const { page: firstPage, browser } = await runBrowser(); - - try { - const firstPageErrors = []; - const firstConsoleMessages = []; - - firstPage - .on("console", message => { - firstConsoleMessages.push(message); - }) - .on("pageerror", error => { - firstPageErrors.push(error); - }); - - await firstPage.goto(`http://127.0.0.1:${port}/`, { - waitUntil: "networkidle0" - }); - - expect( - firstConsoleMessages.map(message => message.text()) - ).toMatchSnapshot("console messages"); - expect(firstPageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - await server.stop(); - } - - await server.start(); - - const secondPage = await runBrowser.runPage(browser); - - try { - // const secondPageErrors = []; - // const secondConsoleMessages = []; - // secondPage - // .on("console", (message) => { - // secondConsoleMessages.push(message); - // }) - // .on("pageerror", (error) => { - // secondPageErrors.push(error); - // }); - // await secondPage.goto(`http://127.0.0.1:${port}/`, { - // waitUntil: "networkidle0", - // }); - // expect( - // secondConsoleMessages.map((message) => message.text()), - // ).toMatchSnapshot("console messages"); - // expect(secondPageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - await browser.close(); - await server.stop(); - } - }); - }); - - describe("Invalidate callback", () => { - let compiler; - let server; - let page; - let browser; - let pageErrors; - let consoleMessages; - - beforeEach(async () => { - compiler = webpack(config); - - ({ page, browser } = await runBrowser()); - - pageErrors = []; - consoleMessages = []; - - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); - - server = new Server({ port, static: false }, compiler); - - await server.start(); - }); - - afterEach(async () => { - await browser.close(); - await server.stop(); - }); - - it("should use the default `noop` callback when invalidate is called without any callback", async () => { - const callback = jest.fn(); - - server.invalidate(); - server.middleware.context.callbacks[0] = callback; - - const response = await page.goto(`http://127.0.0.1:${port}/`, { - waitUntil: "networkidle0" - }); - - expect(callback).toHaveBeenCalledTimes(1); - expect(response.status()).toMatchSnapshot("response status"); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - expect(pageErrors).toMatchSnapshot("page errors"); - }); - - it("should use the provided `callback` function", async () => { - const callback = jest.fn(); - - server.invalidate(callback); - - const response = await page.goto(`http://127.0.0.1:${port}/`, { - waitUntil: "networkidle0" - }); - - expect(callback).toHaveBeenCalledTimes(1); - expect(response.status()).toMatchSnapshot("response status"); - - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); - - expect(pageErrors).toMatchSnapshot("page errors"); - }); - }); - - describe("Server.getFreePort", () => { - let dummyServers = []; - let devServerPort; - - afterEach(() => { - delete process.env.WEBPACK_DEV_SERVER_BASE_PORT; - delete process.env.WEBPACK_DEV_SERVER_PORT_RETRY; - - return dummyServers - .reduce( - (p, server) => - p.then( - () => - new Promise(resolve => { - server.stopCallback(() => { - resolve(); - }); - }) - ), - Promise.resolve() - ) - .then(() => { - dummyServers = []; - }); - }); + describe("WEBPACK_SERVE environment variable", () => { + const OLD_ENV = process.env; + let server; + let page; + let browser; + let pageErrors; + let consoleMessages; + + beforeEach(async () => { + // this is important - it clears the cache + jest.resetModules(); + + process.env = { ...OLD_ENV }; + + delete process.env.WEBPACK_SERVE; + + ({ page, browser } = await runBrowser()); + + pageErrors = []; + consoleMessages = []; + }); + + afterEach(async () => { + await browser.close(); + await server.stop(); + process.env = OLD_ENV; + }); + + it("should be present", async () => { + expect(process.env.WEBPACK_SERVE).toBeUndefined(); + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const { + RspackDevServer: WebpackDevServer + } = require("@rspack/dev-server"); + + const compiler = webpack(config); + server = new WebpackDevServer({ port }, compiler); + + await server.start(); + + expect(process.env.WEBPACK_SERVE).toBe("true"); + + const response = await page.goto(`http://127.0.0.1:${port}/`, { + waitUntil: "networkidle0" + }); + + expect(response.status()).toMatchSnapshot("response status"); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + }); + }); + + describe("latest async API", () => { + it(`should work with async API`, async () => { + const compiler = webpack(config); + const server = new Server({ port }, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it(`should work with callback API`, async () => { + const compiler = webpack(config); + const server = new Server({ port }, compiler); + + await new Promise(resolve => { + server.startCallback(() => { + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await new Promise(resolve => { + server.stopCallback(() => { + resolve(); + }); + }); + } + }); + + it(`should catch errors within startCallback`, async () => { + const compiler = webpack(config); + const server = new Server( + { port, static: "https://absolute-url.com/somewhere" }, + compiler + ); + + await new Promise(resolve => { + server.startCallback(err => { + expect(err.message).toEqual( + "Using a URL as static.directory is not supported" + ); + resolve(); + }); + }); + + await new Promise(resolve => { + server.stopCallback(() => { + resolve(); + }); + }); + }); + + it(`should work when using configured manually`, async () => { + const compiler = webpack({ + ...config, + entry: [ + "@rspack/core/hot/dev-server.js", + `@rspack/dev-server/client/index.js?hot=true&live-reload=true"`, + path.resolve(__dirname, "../fixtures/client-config/foo.js") + ], + plugins: [...config.plugins, new webpack.HotModuleReplacementPlugin()] + }); + const server = new Server({ port, hot: false, client: false }, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it(`should work and allow to rerun dev server multiple times`, async () => { + const compiler = webpack(config); + const server = new Server({ port }, compiler); + + await server.start(); + + const { page: firstPage, browser } = await runBrowser(); + + try { + const firstPageErrors = []; + const firstConsoleMessages = []; + + firstPage + .on("console", message => { + firstConsoleMessages.push(message); + }) + .on("pageerror", error => { + firstPageErrors.push(error); + }); + + await firstPage.goto(`http://127.0.0.1:${port}/`, { + waitUntil: "networkidle0" + }); + + expect( + firstConsoleMessages.map(message => message.text()) + ).toMatchSnapshot("console messages"); + expect(firstPageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await server.stop(); + } + + await server.start(); + + const secondPage = await runBrowser.runPage(browser); + + try { + // const secondPageErrors = []; + // const secondConsoleMessages = []; + // secondPage + // .on("console", (message) => { + // secondConsoleMessages.push(message); + // }) + // .on("pageerror", (error) => { + // secondPageErrors.push(error); + // }); + // await secondPage.goto(`http://127.0.0.1:${port}/`, { + // waitUntil: "networkidle0", + // }); + // expect( + // secondConsoleMessages.map((message) => message.text()), + // ).toMatchSnapshot("console messages"); + // expect(secondPageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + }); + + describe("Invalidate callback", () => { + let compiler; + let server; + let page; + let browser; + let pageErrors; + let consoleMessages; + + beforeEach(async () => { + compiler = webpack(config); + + ({ page, browser } = await runBrowser()); + + pageErrors = []; + consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + server = new Server({ port, static: false }, compiler); + + await server.start(); + }); + + afterEach(async () => { + await browser.close(); + await server.stop(); + }); + + it("should use the default `noop` callback when invalidate is called without any callback", async () => { + const callback = jest.fn(); + + server.invalidate(); + server.middleware.context.callbacks[0] = callback; + + const response = await page.goto(`http://127.0.0.1:${port}/`, { + waitUntil: "networkidle0" + }); + + expect(callback).toHaveBeenCalledTimes(1); + expect(response.status()).toMatchSnapshot("response status"); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + }); + + it("should use the provided `callback` function", async () => { + const callback = jest.fn(); + + server.invalidate(callback); + + const response = await page.goto(`http://127.0.0.1:${port}/`, { + waitUntil: "networkidle0" + }); + + expect(callback).toHaveBeenCalledTimes(1); + expect(response.status()).toMatchSnapshot("response status"); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + }); + }); + + describe("Server.getFreePort", () => { + let dummyServers = []; + let devServerPort; + + afterEach(() => { + delete process.env.WEBPACK_DEV_SERVER_BASE_PORT; + delete process.env.WEBPACK_DEV_SERVER_PORT_RETRY; + + return dummyServers + .reduce( + (p, server) => + p.then( + () => + new Promise(resolve => { + server.stopCallback(() => { + resolve(); + }); + }) + ), + Promise.resolve() + ) + .then(() => { + dummyServers = []; + }); + }); - function createDummyServers(n) { - process.env.WEBPACK_DEV_SERVER_BASE_PORT = 60000; + function createDummyServers(n) { + process.env.WEBPACK_DEV_SERVER_BASE_PORT = 60000; - return (Array.isArray(n) ? n : [...new Array(n)]).reduce( - (p, _, i) => - p.then( - () => - new Promise(resolve => { - devServerPort = 60000 + i; - const compiler = webpack(config); - const server = new Server( - { port: devServerPort, host: "0.0.0.0" }, - compiler - ); + return (Array.isArray(n) ? n : [...new Array(n)]).reduce( + (p, _, i) => + p.then( + () => + new Promise(resolve => { + devServerPort = 60000 + i; + const compiler = webpack(config); + const server = new Server( + { port: devServerPort, host: "0.0.0.0" }, + compiler + ); - dummyServers.push(server); + dummyServers.push(server); - server.startCallback(() => { - resolve(); - }); - }) - ), - Promise.resolve() - ); - } + server.startCallback(() => { + resolve(); + }); + }) + ), + Promise.resolve() + ); + } - it("should return the port when the port is specified", async () => { - const retryCount = 1; + it("should return the port when the port is specified", async () => { + const retryCount = 1; - process.env.WEBPACK_DEV_SERVER_PORT_RETRY = retryCount; + process.env.WEBPACK_DEV_SERVER_PORT_RETRY = retryCount; - const freePort = await Server.getFreePort(9082); + const freePort = await Server.getFreePort(9082); - expect(freePort).toEqual(9082); - }); + expect(freePort).toEqual(9082); + }); - it("should return the port when the port is `null`", async () => { - const retryCount = 2; + it("should return the port when the port is `null`", async () => { + const retryCount = 2; - process.env.WEBPACK_DEV_SERVER_PORT_RETRY = retryCount; + process.env.WEBPACK_DEV_SERVER_PORT_RETRY = retryCount; - await createDummyServers(retryCount); + await createDummyServers(retryCount); - const freePort = await Server.getFreePort(null); + const freePort = await Server.getFreePort(null); - expect(freePort).toEqual(60000 + retryCount); + expect(freePort).toEqual(60000 + retryCount); - const { page, browser } = await runBrowser(); + const { page, browser } = await runBrowser(); - const pageErrors = []; - const consoleMessages = []; + const pageErrors = []; + const consoleMessages = []; - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); - const response = await page.goto(`http://127.0.0.1:${devServerPort}/`, { - waitUntil: "networkidle0" - }); + const response = await page.goto(`http://127.0.0.1:${devServerPort}/`, { + waitUntil: "networkidle0" + }); - expect(response.status()).toMatchSnapshot("response status"); + expect(response.status()).toMatchSnapshot("response status"); - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); - expect(pageErrors).toMatchSnapshot("page errors"); + expect(pageErrors).toMatchSnapshot("page errors"); - await browser.close(); - }); + await browser.close(); + }); - it("should return the port when the port is undefined", async () => { - const retryCount = 3; + it("should return the port when the port is undefined", async () => { + const retryCount = 3; - process.env.WEBPACK_DEV_SERVER_PORT_RETRY = retryCount; + process.env.WEBPACK_DEV_SERVER_PORT_RETRY = retryCount; - await createDummyServers(retryCount); + await createDummyServers(retryCount); - // eslint-disable-next-line no-undefined - const freePort = await Server.getFreePort(undefined); + // eslint-disable-next-line no-undefined + const freePort = await Server.getFreePort(undefined); - expect(freePort).toEqual(60000 + retryCount); + expect(freePort).toEqual(60000 + retryCount); - const { page, browser } = await runBrowser(); + const { page, browser } = await runBrowser(); - const pageErrors = []; - const consoleMessages = []; + const pageErrors = []; + const consoleMessages = []; - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); - const response = await page.goto(`http://127.0.0.1:${devServerPort}/`, { - waitUntil: "networkidle0" - }); + const response = await page.goto(`http://127.0.0.1:${devServerPort}/`, { + waitUntil: "networkidle0" + }); - expect(response.status()).toMatchSnapshot("response status"); + expect(response.status()).toMatchSnapshot("response status"); - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); - expect(pageErrors).toMatchSnapshot("page errors"); + expect(pageErrors).toMatchSnapshot("page errors"); - await browser.close(); - }); + await browser.close(); + }); - it("should retry finding the port for up to defaultPortRetry times (number)", async () => { - const retryCount = 4; + it("should retry finding the port for up to defaultPortRetry times (number)", async () => { + const retryCount = 4; - process.env.WEBPACK_DEV_SERVER_PORT_RETRY = retryCount; + process.env.WEBPACK_DEV_SERVER_PORT_RETRY = retryCount; - await createDummyServers(retryCount); + await createDummyServers(retryCount); - const freePort = await Server.getFreePort(); + const freePort = await Server.getFreePort(); - expect(freePort).toEqual(60000 + retryCount); + expect(freePort).toEqual(60000 + retryCount); - const { page, browser } = await runBrowser(); + const { page, browser } = await runBrowser(); - const pageErrors = []; - const consoleMessages = []; + const pageErrors = []; + const consoleMessages = []; - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); - const response = await page.goto(`http://127.0.0.1:${devServerPort}/`, { - waitUntil: "networkidle0" - }); + const response = await page.goto(`http://127.0.0.1:${devServerPort}/`, { + waitUntil: "networkidle0" + }); - expect(response.status()).toMatchSnapshot("response status"); + expect(response.status()).toMatchSnapshot("response status"); - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); - expect(pageErrors).toMatchSnapshot("page errors"); + expect(pageErrors).toMatchSnapshot("page errors"); - await browser.close(); - }); + await browser.close(); + }); - it("should retry finding the port for up to defaultPortRetry times (string)", async () => { - const retryCount = 5; + it("should retry finding the port for up to defaultPortRetry times (string)", async () => { + const retryCount = 5; - process.env.WEBPACK_DEV_SERVER_PORT_RETRY = retryCount; + process.env.WEBPACK_DEV_SERVER_PORT_RETRY = retryCount; - await createDummyServers(retryCount); + await createDummyServers(retryCount); - const freePort = await Server.getFreePort(); + const freePort = await Server.getFreePort(); - expect(freePort).toEqual(60000 + retryCount); + expect(freePort).toEqual(60000 + retryCount); - const { page, browser } = await runBrowser(); + const { page, browser } = await runBrowser(); - const pageErrors = []; - const consoleMessages = []; + const pageErrors = []; + const consoleMessages = []; - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); - const response = await page.goto(`http://127.0.0.1:${devServerPort}/`, { - waitUntil: "networkidle0" - }); + const response = await page.goto(`http://127.0.0.1:${devServerPort}/`, { + waitUntil: "networkidle0" + }); - expect(response.status()).toMatchSnapshot("response status"); + expect(response.status()).toMatchSnapshot("response status"); - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); - expect(pageErrors).toMatchSnapshot("page errors"); + expect(pageErrors).toMatchSnapshot("page errors"); - await browser.close(); - }); + await browser.close(); + }); - it("should retry finding the port when serial ports are busy", async () => { - const busyPorts = [60000, 60001, 60002, 60003, 60004, 60005]; + it("should retry finding the port when serial ports are busy", async () => { + const busyPorts = [60000, 60001, 60002, 60003, 60004, 60005]; - process.env.WEBPACK_DEV_SERVER_PORT_RETRY = 1000; + process.env.WEBPACK_DEV_SERVER_PORT_RETRY = 1000; - await createDummyServers(busyPorts); + await createDummyServers(busyPorts); - const freePort = await Server.getFreePort(); + const freePort = await Server.getFreePort(); - expect(freePort).toBeGreaterThan(60005); + expect(freePort).toBeGreaterThan(60005); - const { page, browser } = await runBrowser(); + const { page, browser } = await runBrowser(); - try { - const pageErrors = []; - const consoleMessages = []; + try { + const pageErrors = []; + const consoleMessages = []; - page - .on("console", message => { - consoleMessages.push(message); - }) - .on("pageerror", error => { - pageErrors.push(error); - }); + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); - const response = await page.goto(`http://127.0.0.1:${devServerPort}/`, { - waitUntil: "networkidle0" - }); + const response = await page.goto(`http://127.0.0.1:${devServerPort}/`, { + waitUntil: "networkidle0" + }); - expect(response.status()).toMatchSnapshot("response status"); + expect(response.status()).toMatchSnapshot("response status"); - expect(consoleMessages.map(message => message.text())).toMatchSnapshot( - "console messages" - ); + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); - expect(pageErrors).toMatchSnapshot("page errors"); - } catch (error) { - throw error; - } finally { - await browser.close(); - } - }); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + } + }); - it("should throw the error when the port isn't found", async () => { - expect.assertions(1); + it("should throw the error when the port isn't found", async () => { + expect.assertions(1); - jest.mock( - "webpack-dev-server/lib/getPort", - () => () => Promise.reject(new Error("busy")) - ); + jest.mock( + "webpack-dev-server/lib/getPort", + () => () => Promise.reject(new Error("busy")) + ); - process.env.WEBPACK_DEV_SERVER_PORT_RETRY = 1; + process.env.WEBPACK_DEV_SERVER_PORT_RETRY = 1; - try { - await Server.getFreePort(); - } catch (error) { - expect(error.message).toMatchSnapshot(); - } - }); - }); + try { + await Server.getFreePort(); + } catch (error) { + expect(error.message).toMatchSnapshot(); + } + }); + }); - describe("Server.checkHostHeader", () => { - it("should allow access for every requests using an IP", () => { - const options = {}; + describe("Server.checkHostHeader", () => { + it("should allow access for every requests using an IP", () => { + const options = {}; - const tests = [ - "192.168.1.123", - "192.168.1.2:8080", - "[::1]", - "[::1]:8080", - "[ad42::1de2:54c2:c2fa:1234]", - "[ad42::1de2:54c2:c2fa:1234]:8080" - ]; - - const compiler = webpack(config); - const server = new Server(options, compiler); - - tests.forEach(test => { - const headers = { host: test }; - - if (!server.checkHeader(headers, "host")) { - throw new Error("Validation didn't pass"); - } - }); - }); - - // it('should allow URLs with scheme for checking origin when the "option.client.webSocketURL" is object', async () => { - // const options = { - // port, - // client: { - // reconnect: false, - // webSocketURL: { - // hostname: "test.host" - // } - // }, - // webSocketServer: "ws" - // }; - // const headers = { - // origin: "https://test.host" - // }; - - // const compiler = webpack(config); - // const server = new Server(options, compiler); - - // await server.start(); - - // const { page, browser } = await runBrowser(); - - // try { - // const pageErrors = []; - // const consoleMessages = []; - - // page - // .on("console", message => { - // consoleMessages.push(message); - // }) - // .on("pageerror", error => { - // pageErrors.push(error); - // }); - - // const webSocketRequests = []; - // const session = await page.target().createCDPSession(); - - // session.on("Network.webSocketCreated", test => { - // webSocketRequests.push(test); - // }); - - // await session.send("Target.setAutoAttach", { - // autoAttach: true, - // flatten: true, - // waitForDebuggerOnStart: true - // }); - - // sessionSubscribe(session); - - // const response = await page.goto(`http://127.0.0.1:${port}/`, { - // waitUntil: "networkidle0" - // }); - - // if (!server.checkHeader(headers, "origin")) { - // throw new Error("Validation didn't fail"); - // } - - // await new Promise(resolve => { - // const interval = setInterval(() => { - // const needFinish = consoleMessages.filter(message => - // /Trying to reconnect/.test(message.text()) - // ); - - // if (needFinish.length > 0) { - // clearInterval(interval); - // resolve(); - // } - // }, 100); - // }); - - // expect(webSocketRequests[0].url).toMatchSnapshot("web socket URL"); - - // expect(response.status()).toMatchSnapshot("response status"); - - // expect( - // // net::ERR_NAME_NOT_RESOLVED can be multiple times - // consoleMessages.map(message => message.text()).slice(0, 7) - // ).toMatchSnapshot("console messages"); - - // expect(pageErrors).toMatchSnapshot("page errors"); - // } catch (error) { - // throw error; - // } finally { - // await browser.close(); - // await server.stop(); - // } - // }); - }); + const tests = [ + "192.168.1.123", + "192.168.1.2:8080", + "[::1]", + "[::1]:8080", + "[ad42::1de2:54c2:c2fa:1234]", + "[ad42::1de2:54c2:c2fa:1234]:8080" + ]; + + const compiler = webpack(config); + const server = new Server(options, compiler); + + tests.forEach(test => { + const headers = { host: test }; + + if (!server.checkHeader(headers, "host")) { + throw new Error("Validation didn't pass"); + } + }); + }); + + it('should allow URLs with scheme for checking origin when the "option.client.webSocketURL" is object', async () => { + const options = { + port, + client: { + reconnect: false, + webSocketURL: { + hostname: "test.host" + } + }, + webSocketServer: "ws" + }; + const headers = { + origin: "https://test.host" + }; + + const compiler = webpack(config); + const server = new Server(options, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + const session = await page.target().createCDPSession(); + + session.on("Network.webSocketCreated", test => { + webSocketRequests.push(test); + }); + + await session.send("Target.setAutoAttach", { + autoAttach: true, + flatten: true, + waitForDebuggerOnStart: true + }); + + sessionSubscribe(session); + + const response = await page.goto(`http://127.0.0.1:${port}/`, { + waitUntil: "networkidle0" + }); + + if (!server.checkHeader(headers, "origin")) { + throw new Error("Validation didn't fail"); + } + + await new Promise(resolve => { + const interval = setInterval(() => { + const needFinish = consoleMessages.filter(message => + /Trying to reconnect/.test(message.text()) + ); + + if (needFinish.length > 0) { + clearInterval(interval); + resolve(); + } + }, 100); + }); + + expect(webSocketRequests[0].url).toMatchSnapshot("web socket URL"); + + expect(response.status()).toMatchSnapshot("response status"); + + expect( + // net::ERR_NAME_NOT_RESOLVED can be multiple times + consoleMessages.map(message => message.text()).slice(0, 7) + ).toMatchSnapshot("console messages"); + + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + }); }); From b84fbe3337e24e0c039caf20880a7bb3b974e204 Mon Sep 17 00:00:00 2001 From: LingyuCoder Date: Fri, 6 Sep 2024 18:42:56 +0800 Subject: [PATCH 02/11] test(dev-sever): add e2e test cases part 2 --- packages/rspack-dev-server/client/index.js | 65 +- packages/rspack-dev-server/etc/api.md | 2 +- packages/rspack-dev-server/package.json | 7 +- packages/rspack-dev-server/src/server.ts | 71 +- .../__snapshots__/host.test.js.snap.webpack5 | 301 ++ .../hot-and-live-reload.test.js.snap.webpack5 | 396 +++ .../__snapshots__/ipc.test.js.snap.webpack5 | 41 + .../logging.test.js.snap.webpack5 | 333 ++ .../mime-types.test.js.snap.webpack5 | 17 + .../module-federation.test.js.snap.webpack5 | 25 + .../multi-compiler.test.js.snap.webpack5 | 265 ++ .../on-listening.test.js.snap.webpack5 | 21 + .../overlay.test.js.snap.webpack5 | 2884 +++++++++++++++++ .../rspack-dev-server/tests/e2e/host.test.js | 284 ++ .../tests/e2e/hot-and-live-reload.test.js | 898 +++++ .../rspack-dev-server/tests/e2e/ipc.test.js | 354 ++ .../tests/e2e/lazy-compilation.test.js | 112 + .../tests/e2e/logging.test.js | 249 ++ .../tests/e2e/mime-types.test.js | 135 + .../tests/e2e/module-federation.test.js | 296 ++ .../tests/e2e/multi-compiler.test.js | 778 +++++ .../tests/e2e/on-listening.test.js | 127 + .../tests/e2e/overlay.test.js | 1990 ++++++++++++ .../fixtures/mime-types-config/file.custom | 1 + .../tests/fixtures/mime-types-config/foo.js | 5 + .../mime-types-config/webpack.config.js | 30 + .../module-federation-config/entry1.js | 3 + .../module-federation-config/entry2.js | 3 + .../webpack.config.js | 16 + .../webpack.multi.config.js | 18 + .../webpack.object-entry.config.js | 19 + .../webpack.plugin.js | 25 + .../foo.js | 3 + .../webpack.config.js | 24 + .../multi-compiler-two-configurations/one.js | 3 + .../multi-compiler-two-configurations/two.js | 3 + .../webpack.config.js | 44 + .../tests/fixtures/overlay-config/foo.js | 0 .../trusted-types.webpack.config.js | 21 + .../fixtures/overlay-config/webpack.config.js | 20 + .../tests/fixtures/reload-config/main.css | 1 - .../fixtures/reload-config/webpack.config.js | 15 +- .../universal-compiler-config/browser.js | 3 + .../universal-compiler-config/server.js | 3 + .../webpack.config.js | 43 + .../tests/helpers/html-generator-plugin.js | 2 +- .../trusted-types-html-generator-plugin.js | 82 + pnpm-lock.yaml | 20 + 48 files changed, 10004 insertions(+), 54 deletions(-) create mode 100644 packages/rspack-dev-server/tests/e2e/__snapshots__/host.test.js.snap.webpack5 create mode 100644 packages/rspack-dev-server/tests/e2e/__snapshots__/hot-and-live-reload.test.js.snap.webpack5 create mode 100644 packages/rspack-dev-server/tests/e2e/__snapshots__/ipc.test.js.snap.webpack5 create mode 100644 packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 create mode 100644 packages/rspack-dev-server/tests/e2e/__snapshots__/mime-types.test.js.snap.webpack5 create mode 100644 packages/rspack-dev-server/tests/e2e/__snapshots__/module-federation.test.js.snap.webpack5 create mode 100644 packages/rspack-dev-server/tests/e2e/__snapshots__/multi-compiler.test.js.snap.webpack5 create mode 100644 packages/rspack-dev-server/tests/e2e/__snapshots__/on-listening.test.js.snap.webpack5 create mode 100644 packages/rspack-dev-server/tests/e2e/__snapshots__/overlay.test.js.snap.webpack5 create mode 100644 packages/rspack-dev-server/tests/e2e/host.test.js create mode 100644 packages/rspack-dev-server/tests/e2e/hot-and-live-reload.test.js create mode 100644 packages/rspack-dev-server/tests/e2e/ipc.test.js create mode 100644 packages/rspack-dev-server/tests/e2e/lazy-compilation.test.js create mode 100644 packages/rspack-dev-server/tests/e2e/logging.test.js create mode 100644 packages/rspack-dev-server/tests/e2e/mime-types.test.js create mode 100644 packages/rspack-dev-server/tests/e2e/module-federation.test.js create mode 100644 packages/rspack-dev-server/tests/e2e/multi-compiler.test.js create mode 100644 packages/rspack-dev-server/tests/e2e/on-listening.test.js create mode 100644 packages/rspack-dev-server/tests/e2e/overlay.test.js create mode 100644 packages/rspack-dev-server/tests/fixtures/mime-types-config/file.custom create mode 100644 packages/rspack-dev-server/tests/fixtures/mime-types-config/foo.js create mode 100644 packages/rspack-dev-server/tests/fixtures/mime-types-config/webpack.config.js create mode 100644 packages/rspack-dev-server/tests/fixtures/module-federation-config/entry1.js create mode 100644 packages/rspack-dev-server/tests/fixtures/module-federation-config/entry2.js create mode 100644 packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.config.js create mode 100644 packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.multi.config.js create mode 100644 packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.object-entry.config.js create mode 100644 packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.plugin.js create mode 100644 packages/rspack-dev-server/tests/fixtures/multi-compiler-one-configuration copy/foo.js create mode 100644 packages/rspack-dev-server/tests/fixtures/multi-compiler-one-configuration copy/webpack.config.js create mode 100644 packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/one.js create mode 100644 packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/two.js create mode 100644 packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/webpack.config.js create mode 100644 packages/rspack-dev-server/tests/fixtures/overlay-config/foo.js create mode 100644 packages/rspack-dev-server/tests/fixtures/overlay-config/trusted-types.webpack.config.js create mode 100644 packages/rspack-dev-server/tests/fixtures/overlay-config/webpack.config.js delete mode 100644 packages/rspack-dev-server/tests/fixtures/reload-config/main.css create mode 100644 packages/rspack-dev-server/tests/fixtures/universal-compiler-config/browser.js create mode 100644 packages/rspack-dev-server/tests/fixtures/universal-compiler-config/server.js create mode 100644 packages/rspack-dev-server/tests/fixtures/universal-compiler-config/webpack.config.js create mode 100644 packages/rspack-dev-server/tests/helpers/trusted-types-html-generator-plugin.js diff --git a/packages/rspack-dev-server/client/index.js b/packages/rspack-dev-server/client/index.js index c927cc80a85..87fa389986c 100644 --- a/packages/rspack-dev-server/client/index.js +++ b/packages/rspack-dev-server/client/index.js @@ -106,6 +106,28 @@ var status = { currentHash: typeof __webpack_hash__ !== "undefined" ? __webpack_hash__ : "" }; +var decodeOverlayOptions = function decodeOverlayOptions(overlayOptions) { + if (typeof overlayOptions === "object") { + ["warnings", "errors", "runtimeErrors"].forEach(function (property) { + if (typeof overlayOptions[property] === "string") { + var overlayFilterFunctionString = decodeURIComponent( + overlayOptions[property] + ); + + // eslint-disable-next-line no-new-func + var overlayFilterFunction = new Function( + "message", + "var callback = ".concat( + overlayFilterFunctionString, + "\n return callback(message)" + ) + ); + overlayOptions[property] = overlayFilterFunction; + } + }); + } +}; + /** @type {Options} */ var options = { hot: false, @@ -132,6 +154,7 @@ if (parsedResourceQuery.progress === "true") { options.progress = true; enabledFeatures.Progress = true; } + if (parsedResourceQuery.overlay) { try { options.overlay = JSON.parse(parsedResourceQuery.overlay); @@ -149,6 +172,7 @@ if (parsedResourceQuery.overlay) { }, options.overlay ); + decodeOverlayOptions(options.overlay); } enabledFeatures.Overlay = true; } @@ -232,6 +256,7 @@ var onSocketMessage = { return; } options.overlay = value; + decodeOverlayOptions(options.overlay); }, /** * @param {number} value @@ -321,16 +346,22 @@ var onSocketMessage = { for (var i = 0; i < printableWarnings.length; i++) { log.warn(printableWarnings[i]); } - var needShowOverlayForWarnings = + var overlayWarningsSetting = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.warnings; - if (needShowOverlayForWarnings) { - overlay.send({ - type: "BUILD_ERROR", - level: "warning", - messages: _warnings - }); + if (overlayWarningsSetting) { + var warningsToDisplay = + typeof overlayWarningsSetting === "function" + ? _warnings.filter(overlayWarningsSetting) + : _warnings; + if (warningsToDisplay.length) { + overlay.send({ + type: "BUILD_ERROR", + level: "warning", + messages: _warnings + }); + } } if (params && params.preventReloading) { return; @@ -352,16 +383,22 @@ var onSocketMessage = { for (var i = 0; i < printableErrors.length; i++) { log.error(printableErrors[i]); } - var needShowOverlayForErrors = + var overlayErrorsSettings = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.errors; - if (needShowOverlayForErrors) { - overlay.send({ - type: "BUILD_ERROR", - level: "error", - messages: _errors - }); + if (overlayErrorsSettings) { + var errorsToDisplay = + typeof overlayErrorsSettings === "function" + ? _errors.filter(overlayErrorsSettings) + : _errors; + if (errorsToDisplay.length) { + overlay.send({ + type: "BUILD_ERROR", + level: "error", + messages: _errors + }); + } } }, /** diff --git a/packages/rspack-dev-server/etc/api.md b/packages/rspack-dev-server/etc/api.md index a85de18a4ec..1e29baba633 100644 --- a/packages/rspack-dev-server/etc/api.md +++ b/packages/rspack-dev-server/etc/api.md @@ -63,7 +63,7 @@ export class RspackDevServer extends WebpackDevServer { constructor(options: Configuration, compiler: Compiler | MultiCompiler); compiler: Compiler | MultiCompiler; // (undocumented) - static getFreePort(port: string, host: string): Promise; + static getFreePort: (port: string, host: string) => Promise; // (undocumented) initialize(): Promise; options: ResolvedDevServer; diff --git a/packages/rspack-dev-server/package.json b/packages/rspack-dev-server/package.json index db4c38aa4ff..ae47aa10307 100644 --- a/packages/rspack-dev-server/package.json +++ b/packages/rspack-dev-server/package.json @@ -51,7 +51,12 @@ "sockjs-client": "^1.6.1", "supertest": "^6.1.3", "tcp-port-used": "^1.0.2", - "typescript": "5.0.2" + "typescript": "5.0.2", + "style-loader": "^3.3.3", + "css-loader": "^6.11.0", + "require-from-string": "^2.0.2", + "wait-for-expect": "^3.0.2", + "prettier": "3.2.5" }, "dependencies": { "chokidar": "^3.6.0", diff --git a/packages/rspack-dev-server/src/server.ts b/packages/rspack-dev-server/src/server.ts index 56664f4ccf6..000e95b80d8 100644 --- a/packages/rspack-dev-server/src/server.ts +++ b/packages/rspack-dev-server/src/server.ts @@ -14,7 +14,9 @@ import type { Socket } from "node:net"; import { type Compiler, MultiCompiler } from "@rspack/core"; import type { FSWatcher } from "chokidar"; import rdm from "webpack-dev-middleware"; -import WebpackDevServer from "webpack-dev-server"; +import WebpackDevServer, { + type OverlayMessageOptions +} from "webpack-dev-server"; // @ts-ignore 'package.json' is not under 'rootDir' import { version } from "../package.json"; @@ -23,31 +25,39 @@ import { applyDevServerPatch } from "./patch"; applyDevServerPatch(); -export class RspackDevServer extends WebpackDevServer { - static async getFreePort(port: string, host: string) { - if (typeof port !== "undefined" && port !== null && port !== "auto") { - return port; - } +const encodeOverlaySettings = (setting: OverlayMessageOptions | undefined) => + typeof setting === "function" + ? encodeURIComponent(setting.toString()) + : setting; - const pRetry = require("p-retry"); - const getPort = require("webpack-dev-server/lib/getPort"); - const basePort = - typeof process.env.WEBPACK_DEV_SERVER_BASE_PORT !== "undefined" - ? Number.parseInt(process.env.WEBPACK_DEV_SERVER_BASE_PORT, 10) - : 8080; - - // Try to find unused port and listen on it for 3 times, - // if port is not specified in options. - const defaultPortRetry = - typeof process.env.WEBPACK_DEV_SERVER_PORT_RETRY !== "undefined" - ? Number.parseInt(process.env.WEBPACK_DEV_SERVER_PORT_RETRY, 10) - : 3; - - return pRetry(() => getPort(basePort, host), { - retries: defaultPortRetry - }); +const getFreePort = async function getFreePort(port: string, host: string) { + if (typeof port !== "undefined" && port !== null && port !== "auto") { + return port; } + const pRetry = require("p-retry"); + const getPort = require("webpack-dev-server/lib/getPort"); + const basePort = + typeof process.env.WEBPACK_DEV_SERVER_BASE_PORT !== "undefined" + ? Number.parseInt(process.env.WEBPACK_DEV_SERVER_BASE_PORT, 10) + : 8080; + + // Try to find unused port and listen on it for 3 times, + // if port is not specified in options. + const defaultPortRetry = + typeof process.env.WEBPACK_DEV_SERVER_PORT_RETRY !== "undefined" + ? Number.parseInt(process.env.WEBPACK_DEV_SERVER_PORT_RETRY, 10) + : 3; + + return pRetry(() => getPort(basePort, host), { + retries: defaultPortRetry + }); +}; + +WebpackDevServer.getFreePort = getFreePort; + +export class RspackDevServer extends WebpackDevServer { + static getFreePort = getFreePort; /** * resolved after `normalizedOptions` */ @@ -385,12 +395,19 @@ export class RspackDevServer extends WebpackDevServer { } if (typeof client.overlay !== "undefined") { - searchParams.set( - "overlay", + const overlayString = typeof client.overlay === "boolean" ? String(client.overlay) - : JSON.stringify(client.overlay) - ); + : JSON.stringify({ + ...client.overlay, + errors: encodeOverlaySettings(client.overlay.errors), + warnings: encodeOverlaySettings(client.overlay.warnings), + runtimeErrors: encodeOverlaySettings( + client.overlay.runtimeErrors + ) + }); + + searchParams.set("overlay", overlayString); } if (typeof client.reconnect !== "undefined") { diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/host.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/host.test.js.snap.webpack5 new file mode 100644 index 00000000000..4192fdcf2e4 --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/host.test.js.snap.webpack5 @@ -0,0 +1,301 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`host should work using "::" host and "auto" port: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "::" host and "auto" port: page errors 1`] = `[]`; + +exports[`host should work using "::" host and port as number: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "::" host and port as number: page errors 1`] = `[]`; + +exports[`host should work using "::" host and port as string: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "::" host and port as string: page errors 1`] = `[]`; + +exports[`host should work using "::1" host and "auto" port: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "::1" host and "auto" port: page errors 1`] = `[]`; + +exports[`host should work using "::1" host and port as number: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "::1" host and port as number: page errors 1`] = `[]`; + +exports[`host should work using "::1" host and port as string: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "::1" host and port as string: page errors 1`] = `[]`; + +exports[`host should work using "" host and "auto" port: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "" host and "auto" port: page errors 1`] = `[]`; + +exports[`host should work using "" host and port as number: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "" host and port as number: page errors 1`] = `[]`; + +exports[`host should work using "" host and port as string: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "" host and port as string: page errors 1`] = `[]`; + +exports[`host should work using "0.0.0.0" host and "auto" port: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "0.0.0.0" host and "auto" port: page errors 1`] = `[]`; + +exports[`host should work using "0.0.0.0" host and port as number: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "0.0.0.0" host and port as number: page errors 1`] = `[]`; + +exports[`host should work using "0.0.0.0" host and port as string: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "0.0.0.0" host and port as string: page errors 1`] = `[]`; + +exports[`host should work using "127.0.0.1" host and "auto" port: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "127.0.0.1" host and "auto" port: page errors 1`] = `[]`; + +exports[`host should work using "127.0.0.1" host and port as number: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "127.0.0.1" host and port as number: page errors 1`] = `[]`; + +exports[`host should work using "127.0.0.1" host and port as string: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "127.0.0.1" host and port as string: page errors 1`] = `[]`; + +exports[`host should work using "local-ip" host and "auto" port: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "local-ip" host and "auto" port: page errors 1`] = `[]`; + +exports[`host should work using "local-ip" host and port as number: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "local-ip" host and port as number: page errors 1`] = `[]`; + +exports[`host should work using "local-ip" host and port as string: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "local-ip" host and port as string: page errors 1`] = `[]`; + +exports[`host should work using "local-ipv4" host and "auto" port: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "local-ipv4" host and "auto" port: page errors 1`] = `[]`; + +exports[`host should work using "local-ipv4" host and port as number: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "local-ipv4" host and port as number: page errors 1`] = `[]`; + +exports[`host should work using "local-ipv4" host and port as string: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "local-ipv4" host and port as string: page errors 1`] = `[]`; + +exports[`host should work using "local-ipv6" host and "auto" port: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "local-ipv6" host and "auto" port: page errors 1`] = `[]`; + +exports[`host should work using "local-ipv6" host and port as number: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "local-ipv6" host and port as number: page errors 1`] = `[]`; + +exports[`host should work using "local-ipv6" host and port as string: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "local-ipv6" host and port as string: page errors 1`] = `[]`; + +exports[`host should work using "localhost" host and "auto" port: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "localhost" host and "auto" port: page errors 1`] = `[]`; + +exports[`host should work using "localhost" host and port as number: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "localhost" host and port as number: page errors 1`] = `[]`; + +exports[`host should work using "localhost" host and port as string: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "localhost" host and port as string: page errors 1`] = `[]`; + +exports[`host should work using "undefined" host and "auto" port: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "undefined" host and "auto" port: page errors 1`] = `[]`; + +exports[`host should work using "undefined" host and port as number: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "undefined" host and port as number: page errors 1`] = `[]`; + +exports[`host should work using "undefined" host and port as string: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`host should work using "undefined" host and port as string: page errors 1`] = `[]`; diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/hot-and-live-reload.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/hot-and-live-reload.test.js.snap.webpack5 new file mode 100644 index 00000000000..6852412574b --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/hot-and-live-reload.test.js.snap.webpack5 @@ -0,0 +1,396 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (default): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "[webpack-dev-server] App updated. Recompiling...", +] +`; + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (default): page errors 1`] = `[]`; + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (sockjs): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "[webpack-dev-server] App updated. Recompiling...", +] +`; + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (sockjs): page errors 1`] = `[]`; + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (ws): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "[webpack-dev-server] App updated. Recompiling...", +] +`; + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (ws): page errors 1`] = `[]`; + +exports[`hot and live reload should work and allow to disable hot module replacement and live reload using the "webpack-dev-server-hot=false&webpack-dev-server-live-reload=false" (default): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] App updated. Recompiling...", +] +`; + +exports[`hot and live reload should work and allow to disable hot module replacement and live reload using the "webpack-dev-server-hot=false&webpack-dev-server-live-reload=false" (default): page errors 1`] = `[]`; + +exports[`hot and live reload should work and allow to disable hot module replacement using the "webpack-dev-server-hot=false" (default): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", +] +`; + +exports[`hot and live reload should work and allow to disable hot module replacement using the "webpack-dev-server-hot=false" (default): page errors 1`] = `[]`; + +exports[`hot and live reload should work and allow to disable live reload using the "webpack-dev-server-live-reload=false" (default): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[webpack-dev-server] App updated. Recompiling...", +] +`; + +exports[`hot and live reload should work and allow to disable live reload using the "webpack-dev-server-live-reload=false" (default): page errors 1`] = `[]`; + +exports[`hot and live reload should work and do nothing when web socket server disabled (default): console messages 1`] = `[]`; + +exports[`hot and live reload should work and do nothing when web socket server disabled (default): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using hot module replacement (default): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../../../node_modules/.pnpm/css-loader@6.11.0_@rspack+core@packages+rspack_webpack@5.94.0_webpack-cli@5.1.4_webpack@5.94.0__/node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement (default): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (default): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../../../node_modules/.pnpm/css-loader@6.11.0_@rspack+core@packages+rspack_webpack@5.94.0_webpack-cli@5.1.4_webpack@5.94.0__/node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (default): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (sockjs): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../../../node_modules/.pnpm/css-loader@6.11.0_@rspack+core@packages+rspack_webpack@5.94.0_webpack-cli@5.1.4_webpack@5.94.0__/node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (sockjs): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (ws): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../../../node_modules/.pnpm/css-loader@6.11.0_@rspack+core@packages+rspack_webpack@5.94.0_webpack-cli@5.1.4_webpack@5.94.0__/node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (ws): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload and hot enabled (sockjs): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../../../node_modules/.pnpm/css-loader@6.11.0_@rspack+core@packages+rspack_webpack@5.94.0_webpack-cli@5.1.4_webpack@5.94.0__/node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload and hot enabled (sockjs): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload and hot enabled (ws): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../../../node_modules/.pnpm/css-loader@6.11.0_@rspack+core@packages+rspack_webpack@5.94.0_webpack-cli@5.1.4_webpack@5.94.0__/node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload and hot enabled (ws): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (default): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../../../node_modules/.pnpm/css-loader@6.11.0_@rspack+core@packages+rspack_webpack@5.94.0_webpack-cli@5.1.4_webpack@5.94.0__/node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (default): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (sockjs): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../../../node_modules/.pnpm/css-loader@6.11.0_@rspack+core@packages+rspack_webpack@5.94.0_webpack-cli@5.1.4_webpack@5.94.0__/node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (sockjs): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (ws): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../../../node_modules/.pnpm/css-loader@6.11.0_@rspack+core@packages+rspack_webpack@5.94.0_webpack-cli@5.1.4_webpack@5.94.0__/node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (ws): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (default): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../../../node_modules/.pnpm/css-loader@6.11.0_@rspack+core@packages+rspack_webpack@5.94.0_webpack-cli@5.1.4_webpack@5.94.0__/node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (default): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (sockjs): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../../../node_modules/.pnpm/css-loader@6.11.0_@rspack+core@packages+rspack_webpack@5.94.0_webpack-cli@5.1.4_webpack@5.94.0__/node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (sockjs): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (ws): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../../../node_modules/.pnpm/css-loader@6.11.0_@rspack+core@packages+rspack_webpack@5.94.0_webpack-cli@5.1.4_webpack@5.94.0__/node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (ws): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled and hot disabled (default): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../../../node_modules/.pnpm/css-loader@6.11.0_@rspack+core@packages+rspack_webpack@5.94.0_webpack-cli@5.1.4_webpack@5.94.0__/node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled and hot disabled (default): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using live reload (default): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", +] +`; + +exports[`hot and live reload should work and refresh content using live reload (default): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using live reload when live reload disabled and hot enabled (sockjs): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", +] +`; + +exports[`hot and live reload should work and refresh content using live reload when live reload disabled and hot enabled (sockjs): page errors 1`] = `[]`; + +exports[`hot and live reload should work and refresh content using live reload when live reload enabled and hot disabled (ws): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", +] +`; + +exports[`hot and live reload should work and refresh content using live reload when live reload enabled and hot disabled (ws): page errors 1`] = `[]`; + +exports[`hot and live reload should work with manual client setup (default): console messages 1`] = ` +[ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading disabled, Progress disabled, Overlay disabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../../../node_modules/.pnpm/css-loader@6.11.0_@rspack+core@packages+rspack_webpack@5.94.0_webpack-cli@5.1.4_webpack@5.94.0__/node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work with manual client setup (default): page errors 1`] = `[]`; + +exports[`hot and live reload should work with manual client setup and allow to disable hot module replacement (default): console messages 1`] = ` +[ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading disabled, Progress disabled, Overlay disabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading disabled, Progress disabled, Overlay disabled.", +] +`; + +exports[`hot and live reload should work with manual client setup and allow to disable hot module replacement (default): page errors 1`] = `[]`; + +exports[`hot and live reload should work with manual client setup and allow to disable live reload (default): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading disabled, Progress disabled, Overlay disabled.", + "[webpack-dev-server] App updated. Recompiling...", +] +`; + +exports[`hot and live reload should work with manual client setup and allow to disable live reload (default): page errors 1`] = `[]`; + +exports[`hot and live reload should work with manual client setup and allow to enable hot module replacement (default): console messages 1`] = ` +[ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay disabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../../../node_modules/.pnpm/css-loader@6.11.0_@rspack+core@packages+rspack_webpack@5.94.0_webpack-cli@5.1.4_webpack@5.94.0__/node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work with manual client setup and allow to enable hot module replacement (default): page errors 1`] = `[]`; + +exports[`hot and live reload should work with manual client setup and allow to enable live reload (default): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay disabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay disabled.", +] +`; + +exports[`hot and live reload should work with manual client setup and allow to enable live reload (default): page errors 1`] = `[]`; + +exports[`hot disabled HMR plugin should NOT register the HMR plugin before compilation is complete: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "Hey.", +] +`; + +exports[`hot disabled HMR plugin should NOT register the HMR plugin before compilation is complete: page errors 1`] = `[]`; + +exports[`hot disabled HMR plugin should NOT register the HMR plugin before compilation is complete: response status 1`] = `200`; diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/ipc.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/ipc.test.js.snap.webpack5 new file mode 100644 index 00000000000..b8508659b44 --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/ipc.test.js.snap.webpack5 @@ -0,0 +1,41 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`web socket server URL should work with the "ipc" option using "string" value ("sockjs"): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`web socket server URL should work with the "ipc" option using "string" value ("sockjs"): page errors 1`] = `[]`; + +exports[`web socket server URL should work with the "ipc" option using "string" value ("ws"): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`web socket server URL should work with the "ipc" option using "string" value ("ws"): page errors 1`] = `[]`; + +exports[`web socket server URL should work with the "ipc" option using "true" value ("sockjs"): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`web socket server URL should work with the "ipc" option using "true" value ("sockjs"): page errors 1`] = `[]`; + +exports[`web socket server URL should work with the "ipc" option using "true" value ("ws"): console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`web socket server URL should work with the "ipc" option using "true" value ("ws"): page errors 1`] = `[]`; diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 new file mode 100644 index 00000000000..e761c6cac7e --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 @@ -0,0 +1,333 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`logging should work and do not log messages about hot and live reloading is enabled (sockjs) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "Hey.", +] +`; + +exports[`logging should work and do not log messages about hot and live reloading is enabled (ws) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "Hey.", +] +`; + +exports[`logging should work and log errors by default (sockjs) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] ERROR + × Error: Error from compilation + │ at Object.fn (/tests/e2e/logging.test.js:90:43) + │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +", +] +`; + +exports[`logging should work and log errors by default (ws) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] ERROR + × Error: Error from compilation + │ at Object.fn (/tests/e2e/logging.test.js:90:43) + │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +", +] +`; + +exports[`logging should work and log message about live reloading is enabled (sockjs) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "Hey.", +] +`; + +exports[`logging should work and log message about live reloading is enabled (ws) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "Hey.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (sockjs) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (sockjs) 2`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (sockjs) 3`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (ws) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (ws) 2`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (ws) 3`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`logging should work and log messages about hot is enabled (sockjs) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`logging should work and log messages about hot is enabled (ws) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`logging should work and log only error (sockjs) 1`] = ` +[ + "Hey.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] ERROR + × Error: Error from compilation + │ at Object.fn (/tests/e2e/logging.test.js:143:43) + │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +", +] +`; + +exports[`logging should work and log only error (ws) 1`] = ` +[ + "Hey.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] ERROR + × Error: Error from compilation + │ at Object.fn (/tests/e2e/logging.test.js:143:43) + │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +", +] +`; + +exports[`logging should work and log static changes (sockjs) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] "/tests/fixtures/client-config/static/foo.txt" from static directory was changed. Reloading...", + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`logging should work and log static changes (ws) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] "/tests/fixtures/client-config/static/foo.txt" from static directory was changed. Reloading...", + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`logging should work and log warning and errors (sockjs) 1`] = ` +[ + "Hey.", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] WARNING + ⚠ Error: Warning from compilation + │ at Object.fn (/tests/e2e/logging.test.js:167:21) + │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] ERROR + × Error: Error from compilation + │ at Object.fn (/tests/e2e/logging.test.js:169:43) + │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +", +] +`; + +exports[`logging should work and log warning and errors (ws) 1`] = ` +[ + "Hey.", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] WARNING + ⚠ Error: Warning from compilation + │ at Object.fn (/tests/e2e/logging.test.js:167:21) + │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] ERROR + × Error: Error from compilation + │ at Object.fn (/tests/e2e/logging.test.js:169:43) + │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +", +] +`; + +exports[`logging should work and log warnings by default (sockjs) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] WARNING + ⚠ Error: Warning from compilation + │ at Object.fn (/tests/e2e/logging.test.js:71:21) + │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +", +] +`; + +exports[`logging should work and log warnings by default (ws) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] WARNING + ⚠ Error: Warning from compilation + │ at Object.fn (/tests/e2e/logging.test.js:71:21) + │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +", +] +`; + +exports[`logging should work when the "client.logging" is "info" (sockjs) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`logging should work when the "client.logging" is "info" (ws) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`logging should work when the "client.logging" is "log" (sockjs) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`logging should work when the "client.logging" is "log" (ws) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`logging should work when the "client.logging" is "none" (sockjs) 1`] = ` +[ + "Hey.", +] +`; + +exports[`logging should work when the "client.logging" is "none" (ws) 1`] = ` +[ + "Hey.", +] +`; + +exports[`logging should work when the "client.logging" is "verbose" (sockjs) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`logging should work when the "client.logging" is "verbose" (ws) 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/mime-types.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/mime-types.test.js.snap.webpack5 new file mode 100644 index 00000000000..62552683489 --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/mime-types.test.js.snap.webpack5 @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`mimeTypes option as an object with a custom type should request file with different js mime type: console messages 1`] = `[]`; + +exports[`mimeTypes option as an object with a custom type should request file with different js mime type: page errors 1`] = `[]`; + +exports[`mimeTypes option as an object with a custom type should request file with different js mime type: response headers content-type 1`] = `"text/html; charset=utf-8"`; + +exports[`mimeTypes option as an object with a custom type should request file with different js mime type: response status 1`] = `200`; + +exports[`mimeTypes option as an object with a remapped type should request file with different js mime type: console messages 1`] = `[]`; + +exports[`mimeTypes option as an object with a remapped type should request file with different js mime type: page errors 1`] = `[]`; + +exports[`mimeTypes option as an object with a remapped type should request file with different js mime type: response headers content-type 1`] = `"text/plain; charset=utf-8"`; + +exports[`mimeTypes option as an object with a remapped type should request file with different js mime type: response status 1`] = `200`; diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/module-federation.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/module-federation.test.js.snap.webpack5 new file mode 100644 index 00000000000..8d4ba07250a --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/module-federation.test.js.snap.webpack5 @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Module federation should use plugin should contain hot script in main.js: console messages 1`] = `[]`; + +exports[`Module federation should use plugin should contain hot script in main.js: page errors 1`] = `[]`; + +exports[`Module federation should use plugin should contain hot script in remoteEntry.js: console messages 1`] = `[]`; + +exports[`Module federation should use plugin should contain hot script in remoteEntry.js: page errors 1`] = `[]`; + +exports[`Module federation should work with multi compiler config should use the last entry export: console messages 1`] = `[]`; + +exports[`Module federation should work with multi compiler config should use the last entry export: page errors 1`] = `[]`; + +exports[`Module federation should work with object multi-entry config should support the named entry export: console messages 1`] = `[]`; + +exports[`Module federation should work with object multi-entry config should support the named entry export: page errors 1`] = `[]`; + +exports[`Module federation should work with object multi-entry config should use the last entry export: console messages 1`] = `[]`; + +exports[`Module federation should work with object multi-entry config should use the last entry export: page errors 1`] = `[]`; + +exports[`Module federation should work with simple multi-entry config should use the last entry export: console messages 1`] = `[]`; + +exports[`Module federation should work with simple multi-entry config should use the last entry export: page errors 1`] = `[]`; diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/multi-compiler.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/multi-compiler.test.js.snap.webpack5 new file mode 100644 index 00000000000..7a06874d381 --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/multi-compiler.test.js.snap.webpack5 @@ -0,0 +1,265 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`multi compiler should work with one web target configuration and do nothing: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", +] +`; + +exports[`multi compiler should work with one web target configuration and do nothing: page errors 1`] = `[]`; + +exports[`multi compiler should work with universal configuration and do nothing: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hello from the browser", +] +`; + +exports[`multi compiler should work with universal configuration and do nothing: page errors 1`] = `[]`; + +exports[`multi compiler should work with universal configuration when hot and live reloads are enabled, and do hot reload for browser compiler by default when browser entry changed: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hello from the browser", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Cannot apply update. Need to do a full reload!", + "[HMR] Error: Aborted because ./browser.js is not accepted +Update propagation: ./browser.js + ", + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hello from the browser", +] +`; + +exports[`multi compiler should work with universal configuration when hot and live reloads are enabled, and do hot reload for browser compiler by default when browser entry changed: page errors 1`] = `[]`; + +exports[`multi compiler should work with universal configuration when only hot reload is enabled, and do hot reload for browser compiler when browser entry changed: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hello from the browser", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Cannot apply update. Need to do a full reload!", + "[HMR] Error: Aborted because ./browser.js is not accepted +Update propagation: ./browser.js + ", + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hello from the browser", +] +`; + +exports[`multi compiler should work with universal configuration when only hot reload is enabled, and do hot reload for browser compiler when browser entry changed: page errors 1`] = `[]`; + +exports[`multi compiler should work with universal configuration when only live reload is enabled, and do live reload for browser compiler when changing browser and server entries: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "Hello from the browser", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "Hello from the browser", +] +`; + +exports[`multi compiler should work with universal configuration when only live reload is enabled, and do live reload for browser compiler when changing browser and server entries: console messages 2`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "Hello from the browser", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "Hello from the browser", +] +`; + +exports[`multi compiler should work with universal configuration when only live reload is enabled, and do live reload for browser compiler when changing browser and server entries: page errors 1`] = `[]`; + +exports[`multi compiler should work with universal configuration when only live reload is enabled, and do live reload for browser compiler when changing browser and server entries: page errors 2`] = `[]`; + +exports[`multi compiler should work with universal configuration when only live reload is enabled, and do live reload for browser compiler when changing server and browser entries: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "Hello from the browser", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "Hello from the browser", +] +`; + +exports[`multi compiler should work with universal configuration when only live reload is enabled, and do live reload for browser compiler when changing server and browser entries: console messages 2`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "Hello from the browser", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "Hello from the browser", +] +`; + +exports[`multi compiler should work with universal configuration when only live reload is enabled, and do live reload for browser compiler when changing server and browser entries: page errors 1`] = `[]`; + +exports[`multi compiler should work with universal configuration when only live reload is enabled, and do live reload for browser compiler when changing server and browser entries: page errors 2`] = `[]`; + +exports[`multi compiler should work with web target configurations and do nothing: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "one", +] +`; + +exports[`multi compiler should work with web target configurations and do nothing: console messages 2`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "two", +] +`; + +exports[`multi compiler should work with web target configurations and do nothing: page errors 1`] = `[]`; + +exports[`multi compiler should work with web target configurations and do nothing: page errors 2`] = `[]`; + +exports[`multi compiler should work with web target configurations when hot and live reloads are enabled, and do hot reload by default when changing own entries: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "one", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Cannot apply update. Need to do a full reload!", + "[HMR] Error: Aborted because ./one.js is not accepted +Update propagation: ./one.js + ", + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "one", +] +`; + +exports[`multi compiler should work with web target configurations when hot and live reloads are enabled, and do hot reload by default when changing own entries: console messages 2`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "two", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Cannot apply update. Need to do a full reload!", + "[HMR] Error: Aborted because ./two.js is not accepted +Update propagation: ./two.js + ", + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "two", +] +`; + +exports[`multi compiler should work with web target configurations when hot and live reloads are enabled, and do hot reload by default when changing own entries: page errors 1`] = `[]`; + +exports[`multi compiler should work with web target configurations when hot and live reloads are enabled, and do hot reload by default when changing own entries: page errors 2`] = `[]`; + +exports[`multi compiler should work with web target configurations when only hot reload is enabled, and do hot reload when changing own entries: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "one", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Cannot apply update. Need to do a full reload!", + "[HMR] Error: Aborted because ./one.js is not accepted +Update propagation: ./one.js + ", + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "one", +] +`; + +exports[`multi compiler should work with web target configurations when only hot reload is enabled, and do hot reload when changing own entries: console messages 2`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "two", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Cannot apply update. Need to do a full reload!", + "[HMR] Error: Aborted because ./two.js is not accepted +Update propagation: ./two.js + ", + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "two", +] +`; + +exports[`multi compiler should work with web target configurations when only hot reload is enabled, and do hot reload when changing own entries: page errors 1`] = `[]`; + +exports[`multi compiler should work with web target configurations when only hot reload is enabled, and do hot reload when changing own entries: page errors 2`] = `[]`; + +exports[`multi compiler should work with web target configurations when only live reload is enabled and do live reload when changing other entries: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "one", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "one", +] +`; + +exports[`multi compiler should work with web target configurations when only live reload is enabled and do live reload when changing other entries: console messages 2`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "two", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "two", +] +`; + +exports[`multi compiler should work with web target configurations when only live reload is enabled and do live reload when changing other entries: page errors 1`] = `[]`; + +exports[`multi compiler should work with web target configurations when only live reload is enabled and do live reload when changing other entries: page errors 2`] = `[]`; + +exports[`multi compiler should work with web target configurations when only live reload is enabled, and do live reload when changing own entries: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "one", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "one", +] +`; + +exports[`multi compiler should work with web target configurations when only live reload is enabled, and do live reload when changing own entries: console messages 2`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "two", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "two", +] +`; + +exports[`multi compiler should work with web target configurations when only live reload is enabled, and do live reload when changing own entries: page errors 1`] = `[]`; + +exports[`multi compiler should work with web target configurations when only live reload is enabled, and do live reload when changing own entries: page errors 2`] = `[]`; diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/on-listening.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/on-listening.test.js.snap.webpack5 new file mode 100644 index 00000000000..3a34989809a --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/on-listening.test.js.snap.webpack5 @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`onListening option should handle GET request to /listening/some/path route: console messages 1`] = `[]`; + +exports[`onListening option should handle GET request to /listening/some/path route: page errors 1`] = `[]`; + +exports[`onListening option should handle GET request to /listening/some/path route: response headers content-type 1`] = `"text/html; charset=utf-8"`; + +exports[`onListening option should handle GET request to /listening/some/path route: response status 1`] = `200`; + +exports[`onListening option should handle GET request to /listening/some/path route: response text 1`] = `"listening"`; + +exports[`onListening option should handle POST request to /listening/some/path route: console messages 1`] = `[]`; + +exports[`onListening option should handle POST request to /listening/some/path route: page errors 1`] = `[]`; + +exports[`onListening option should handle POST request to /listening/some/path route: response headers content-type 1`] = `"text/html; charset=utf-8"`; + +exports[`onListening option should handle POST request to /listening/some/path route: response status 1`] = `200`; + +exports[`onListening option should handle POST request to /listening/some/path route: response text 1`] = `"listening POST"`; diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/overlay.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/overlay.test.js.snap.webpack5 new file mode 100644 index 00000000000..61884866d22 --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/overlay.test.js.snap.webpack5 @@ -0,0 +1,2884 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`overlay should not show a warning when "client.overlay" is "false": page html 1`] = ` +" +

webpack-dev-server is running...

+ + +" +`; + +exports[`overlay should not show a warning when "client.overlay.warnings" is "false": page html 1`] = ` +" +

webpack-dev-server is running...

+ + +" +`; + +exports[`overlay should not show an error when "client.overlay" is "false": page html 1`] = ` +" +

webpack-dev-server is running...

+ + +" +`; + +exports[`overlay should not show an error when "client.overlay.errors" is "false": page html 1`] = ` +" +

webpack-dev-server is running...

+ + +" +`; + +exports[`overlay should not show initially, then show on an error and allow to close: overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ ERROR in ./foo.js +
+
+ × Module parse failed: ╰─▶ × JavaScript parsing error: Unexpected eof + ╭──── 1 │ \`; ╰──── help: You may need an appropriate loader to handle + this file type. +
+
+
+
+ +" +`; + +exports[`overlay should not show initially, then show on an error and allow to close: page html after close 1`] = ` +" +

webpack-dev-server is running...

+ + +" +`; + +exports[`overlay should not show initially, then show on an error and allow to close: page html initial 1`] = ` +" +

webpack-dev-server is running...

+ + +" +`; + +exports[`overlay should not show initially, then show on an error and allow to close: page html with error 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should not show initially, then show on an error, then hide on fix: overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ ERROR in ./foo.js +
+
+ × Module parse failed: ╰─▶ × JavaScript parsing error: Unexpected eof + ╭──── 1 │ \`; ╰──── help: You may need an appropriate loader to handle + this file type. +
+
+
+
+ +" +`; + +exports[`overlay should not show initially, then show on an error, then hide on fix: page html after fix error 1`] = ` +" +

webpack-dev-server is running...

+ + +" +`; + +exports[`overlay should not show initially, then show on an error, then hide on fix: page html initial 1`] = ` +" +

webpack-dev-server is running...

+ + +" +`; + +exports[`overlay should not show initially, then show on an error, then hide on fix: page html with error 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ ERROR in ./foo.js +
+
+ × Module parse failed: ╰─▶ × JavaScript parsing error: Unexpected eof + ╭──── 1 │ \`; ╰──── help: You may need an appropriate loader to handle + this file type. +
+
+
+
+ +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: overlay html 2`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ ERROR in ./foo.js +
+
+ × Module parse failed: ╰─▶ × JavaScript parsing error: Unexpected eof + ╭──── 1 │ \`;a ╰──── help: You may need an appropriate loader to handle + this file type. +
+
+
+
+ +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: page html after fix error 1`] = ` +" +

webpack-dev-server is running...

+ + +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: page html initial 1`] = ` +" +

webpack-dev-server is running...

+ + +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: page html with error 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: page html with other error 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show a warning after invalidation: overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ WARNING +
+
+ ⚠ Error: Warning from compilation │ at Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show a warning after invalidation: page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show a warning and error for initial compilation and protects against xss: overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ ERROR +
+
+ ⚠ Error: <strong>strong</strong> │ at Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ ERROR +
+
+ × Error: <strong>strong</strong> │ at Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show a warning and error for initial compilation and protects against xss: page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show a warning and error for initial compilation: overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ ERROR +
+
+ ⚠ Error: Warning from compilation │ at Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ ERROR +
+
+ ⚠ Error: Warning from compilation │ at Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ ERROR +
+
+ × Error: Error from compilation. Can't find 'test' module. │ at + Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ ERROR +
+
+ × Error: Error from compilation. Can't find 'test' module. │ at + Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ ERROR +
+
+ × Error: Error from compilation. Can't find 'test' module. │ at + Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show a warning and error for initial compilation: page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show a warning and hide them after closing connection: overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ WARNING +
+
+ ⚠ Error: Warning from compilation │ at Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show a warning and hide them after closing connection: page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show a warning and hide them after closing connection: page html 2`] = ` +" +

webpack-dev-server is running...

+ + +" +`; + +exports[`overlay should show a warning for initial compilation: overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ WARNING +
+
+ ⚠ Error: Warning from compilation │ at Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show a warning for initial compilation: page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show a warning when "client.overlay" is "true": overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ WARNING +
+
+ ⚠ Error: Warning from compilation │ at Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show a warning when "client.overlay" is "true": page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show a warning when "client.overlay.errors" is "true": overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ WARNING +
+
+ ⚠ Error: Warning from compilation │ at Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show a warning when "client.overlay.errors" is "true": page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show a warning when "client.overlay.warnings" is "true": overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ WARNING +
+
+ ⚠ Error: Warning from compilation │ at Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show a warning when "client.overlay.warnings" is "true": page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show an ansi formatted error for initial compilation: overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ ERROR +
+
+ × Error: + + 18 | + Render + ansi formatted text + │ at Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + +
+
+
+
+ +" +`; + +exports[`overlay should show an ansi formatted error for initial compilation: page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show an error after invalidation: overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ ERROR +
+
+ × Error: Error from compilation │ at Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show an error after invalidation: page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show an error for initial compilation: overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ ERROR +
+
+ × Error: Error from compilation. Can't find 'test' module. │ at + Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show an error for initial compilation: page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show an error when "client.overlay" is "true": overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ ERROR +
+
+ × Error: Error from compilation. Can't find 'test' module. │ at + Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show an error when "client.overlay" is "true": page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show an error when "client.overlay.errors" is "true": overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ ERROR +
+
+ × Error: Error from compilation. Can't find 'test' module. │ at + Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show an error when "client.overlay.errors" is "true": page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show an error when "client.overlay.warnings" is "true": overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ WARNING +
+
+ ⚠ Error: Warning from compilation │ at Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show an error when "client.overlay.warnings" is "true": page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show error for uncaught promise rejection: overlay html 1`] = ` +" +
+
+ Uncaught runtime errors: +
+ +
+
+
+ ERROR +
+
+ Async error at <anonymous>:3:26 +
+
+
+
+ +" +`; + +exports[`overlay should show error for uncaught runtime error: overlay html 1`] = ` +" +
+
+ Uncaught runtime errors: +
+ +
+
+
+ ERROR +
+
+ Injected error at throwError (<anonymous>:2:15) at + <anonymous>:3:9 +
+
+
+
+ +" +`; + +exports[`overlay should show error when it is not filtered: overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ ERROR +
+
+ × Error: Unfiltered error │ at Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show error when it is not filtered: page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show overlay when "Content-Security-Policy" is "default-src 'self'" was used: overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ ERROR +
+
+ × Error: Error from compilation. Can't find 'test' module. │ at + Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show overlay when "Content-Security-Policy" is "default-src 'self'" was used: page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; + +exports[`overlay should show warning when it is not filtered: overlay html 1`] = ` +" +
+
+ Compiled with problems: +
+ +
+
+
+ WARNING +
+
+ ⚠ Error: Unfiltered warning │ at Object.fn + (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + │ at SyncHook.callAsyncStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + │ at SyncHook.callStageRange + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + │ at QueriedHook.call + (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + │ at + /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + │ at last.function + (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) +
+
+
+
+ +" +`; + +exports[`overlay should show warning when it is not filtered: page html 1`] = ` +" +

webpack-dev-server is running...

+ + + + +" +`; diff --git a/packages/rspack-dev-server/tests/e2e/host.test.js b/packages/rspack-dev-server/tests/e2e/host.test.js new file mode 100644 index 00000000000..9adb12273fd --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/host.test.js @@ -0,0 +1,284 @@ +"use strict"; + +const webpack = require("@rspack/core"); +const { RspackDevServer: Server } = require("@rspack/dev-server"); +const config = require("../fixtures/client-config/webpack.config"); +const runBrowser = require("../helpers/run-browser"); +const port = require("../helpers/ports-map").host; + +const ipv4 = Server.internalIPSync("v4"); +const ipv6 = Server.internalIPSync("v6"); +// macos requires root for using ip v6 +const isMacOS = process.platform === "darwin"; + +function getAddress(host, hostname) { + let address; + + if ( + typeof host === "undefined" || + (typeof host === "string" && host === "") + ) { + address = "::"; + } else if (typeof host === "string" && host === "0.0.0.0") { + address = "0.0.0.0"; + } else if (typeof host === "string" && host === "localhost") { + address = parseFloat(process.versions.node) >= 18 ? "::1" : "127.0.0.1"; + } else { + address = hostname; + } + + return { address }; +} + +describe("host", () => { + const hosts = [ + "", + // eslint-disable-next-line no-undefined + undefined, + "0.0.0.0", + "::", + "localhost", + "::1", + "127.0.0.1", + "local-ip", + "local-ipv4", + "local-ipv6" + ]; + + for (let host of hosts) { + it(`should work using "${host}" host and port as number`, async () => { + const compiler = webpack(config); + + if (!ipv6 || isMacOS) { + if (host === "::") { + host = "127.0.0.1"; + } else if (host === "::1") { + host = "127.0.0.1"; + } else if (host === "local-ipv6") { + host = "127.0.0.1"; + } + } + + const devServerOptions = { port }; + + if (host !== "") { + devServerOptions.host = host; + } + + const server = new Server(devServerOptions, compiler); + + let hostname = host; + + if (hostname === "0.0.0.0") { + hostname = "127.0.0.1"; + } else if ( + hostname === "" || + typeof hostname === "undefined" || + hostname === "::" || + hostname === "::1" + ) { + hostname = "[::1]"; + } else if (hostname === "local-ip" || hostname === "local-ipv4") { + hostname = ipv4; + } else if (hostname === "local-ipv6") { + hostname = `[${ipv6}]`; + } + + await server.start(); + + expect(server.server.address()).toMatchObject(getAddress(host, hostname)); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${hostname}:${port}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it(`should work using "${host}" host and port as string`, async () => { + const compiler = webpack(config); + + if (!ipv6 || isMacOS) { + if (host === "::") { + host = "127.0.0.1"; + } else if (host === "::1") { + host = "127.0.0.1"; + } else if (host === "local-ipv6") { + host = "127.0.0.1"; + } + } + + const devServerOptions = { port: `${port}` }; + + if (host !== "") { + devServerOptions.host = host; + } + + const server = new Server(devServerOptions, compiler); + + let hostname = host; + + if (hostname === "0.0.0.0") { + hostname = "127.0.0.1"; + } else if ( + hostname === "" || + typeof hostname === "undefined" || + hostname === "::" || + hostname === "::1" + ) { + hostname = "[::1]"; + } else if (hostname === "local-ip" || hostname === "local-ipv4") { + hostname = ipv4; + } else if (hostname === "local-ipv6") { + hostname = `[${ipv6}]`; + } + + await server.start(); + + expect(server.server.address()).toMatchObject(getAddress(host, hostname)); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${hostname}:${port}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it(`should work using "${host}" host and "auto" port`, async () => { + const compiler = webpack(config); + + process.env.WEBPACK_DEV_SERVER_BASE_PORT = port; + + if (!ipv6 || isMacOS) { + if (host === "::") { + host = "127.0.0.1"; + } else if (host === "::1") { + host = "127.0.0.1"; + } else if (host === "local-ipv6") { + host = "127.0.0.1"; + } + } + + const devServerOptions = { port: "auto" }; + + if (host !== "") { + devServerOptions.host = host; + } + + const server = new Server(devServerOptions, compiler); + + let hostname = host; + + if (hostname === "0.0.0.0") { + hostname = "127.0.0.1"; + } else if ( + hostname === "" || + typeof hostname === "undefined" || + hostname === "::" || + hostname === "::1" + ) { + hostname = "[::1]"; + } else if (hostname === "local-ip" || hostname === "local-ipv4") { + hostname = ipv4; + } else if (hostname === "local-ipv6") { + hostname = `[${ipv6}]`; + } + + await server.start(); + + expect(server.server.address()).toMatchObject(getAddress(host, hostname)); + + const address = server.server.address(); + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://${hostname}:${address.port}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + delete process.env.WEBPACK_DEV_SERVER_BASE_PORT; + + await browser.close(); + await server.stop(); + } + }); + } + + // TODO need test on error + // it(`should throw an error on invalid host`, async () => { + // const compiler = webpack(config); + // const server = new Server({ port, host: "unknown.unknown" }, compiler); + // const runDevServer = async () => { + // await server.start(); + // }; + // + // return expect(runDevServer()).toBeDefined(); + // }); +}); diff --git a/packages/rspack-dev-server/tests/e2e/hot-and-live-reload.test.js b/packages/rspack-dev-server/tests/e2e/hot-and-live-reload.test.js new file mode 100644 index 00000000000..8d4192b829f --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/hot-and-live-reload.test.js @@ -0,0 +1,898 @@ +/** + * @jest-environment node + */ + +"use strict"; + +const path = require("path"); +const WebSocket = require("ws"); +const SockJS = require("sockjs-client"); +const webpack = require("@rspack/core"); +const fs = require("graceful-fs"); +const { RspackDevServer: Server } = require("@rspack/dev-server"); +const HTMLGeneratorPlugin = require("../helpers/html-generator-plugin"); +const reloadConfig = require("../fixtures/reload-config/webpack.config"); +const runBrowser = require("../helpers/run-browser"); +const port = require("../helpers/ports-map")["hot-and-live-reload"]; +const config = require("../fixtures/client-config/webpack.config"); +const multiCompilerConfig = require("../fixtures/multi-compiler-one-configuration/webpack.config"); + +const cssFilePath = path.resolve( + __dirname, + "../fixtures/reload-config/main.css" +); + +const INVALID_MESSAGE = "[webpack-dev-server] App updated. Recompiling..."; + +describe("hot and live reload", () => { + // "sockjs" client cannot add additional headers + const modes = [ + { + title: "should work and refresh content using hot module replacement" + }, + { + title: "should work and do nothing when web socket server disabled", + options: { + webSocketServer: false + } + }, + // Default web socket serve ("ws") + { + title: + "should work and refresh content using hot module replacement when hot enabled", + options: { + hot: true + } + }, + { + title: + "should work and refresh content using hot module replacement when live reload enabled", + options: { + liveReload: true + } + }, + { + title: "should not refresh content when hot and no live reload disabled", + options: { + hot: false, + liveReload: false + } + }, + { + title: + "should work and refresh content using hot module replacement when live reload disabled and hot enabled", + options: { + liveReload: false, + hot: true + } + }, + { + title: "should work and refresh content using live reload", + options: { + liveReload: true, + hot: false + } + }, + { + title: + "should work and refresh content using hot module replacement when live reload enabled and hot disabled", + options: { + liveReload: true, + hot: true + } + }, + // "ws" web socket serve + { + title: + "should work and refresh content using hot module replacement when hot enabled", + options: { + webSocketServer: "ws", + hot: true + } + }, + { + title: + "should work and refresh content using hot module replacement when live reload enabled", + options: { + webSocketServer: "ws", + liveReload: true + } + }, + { + title: "should not refresh content when hot and no live reload disabled", + options: { + webSocketServer: "ws", + hot: false, + liveReload: false + } + }, + { + title: + "should work and refresh content using hot module replacement when live reload disabled and hot enabled", + options: { + webSocketServer: "ws", + liveReload: false, + hot: true + } + }, + { + title: + "should work and refresh content using live reload when live reload enabled and hot disabled", + options: { + webSocketServer: "ws", + liveReload: true, + hot: false + } + }, + { + title: + "should work and refresh content using hot module replacement when live reload and hot enabled", + options: { + webSocketServer: "ws", + liveReload: true, + hot: true + } + }, + // "sockjs" web socket serve + { + title: + "should work and refresh content using hot module replacement when hot enabled", + options: { + allowedHosts: "all", + + webSocketServer: "sockjs", + hot: true + } + }, + { + title: + "should work and refresh content using hot module replacement when live reload enabled", + options: { + allowedHosts: "all", + + webSocketServer: "sockjs", + liveReload: true + } + }, + { + title: "should not refresh content when hot and no live reload disabled", + options: { + allowedHosts: "all", + + webSocketServer: "sockjs", + hot: false, + liveReload: false + } + }, + { + title: + "should work and refresh content using hot module replacement when live reload disabled and hot enabled", + options: { + allowedHosts: "all", + + webSocketServer: "sockjs", + liveReload: false, + hot: true + } + }, + { + title: + "should work and refresh content using live reload when live reload disabled and hot enabled", + options: { + allowedHosts: "all", + + webSocketServer: "sockjs", + liveReload: true, + hot: false + } + }, + { + title: + "should work and refresh content using hot module replacement when live reload and hot enabled", + options: { + allowedHosts: "all", + + webSocketServer: "sockjs", + liveReload: true, + hot: true + } + }, + { + title: + 'should work and allow to disable hot module replacement using the "webpack-dev-server-hot=false"', + query: "?webpack-dev-server-hot=false", + options: { + liveReload: true, + hot: true + } + }, + { + title: + 'should work and allow to disable live reload using the "webpack-dev-server-live-reload=false"', + query: "?webpack-dev-server-live-reload=false", + options: { + liveReload: true, + hot: false + } + }, + { + title: + 'should work and allow to disable hot module replacement and live reload using the "webpack-dev-server-hot=false&webpack-dev-server-live-reload=false"', + query: + "?webpack-dev-server-hot=false&webpack-dev-server-live-reload=false", + options: { + liveReload: true, + hot: true + } + }, + { + title: "should work with manual client setup", + webpackOptions: { + entry: [ + require.resolve("@rspack/dev-server/client/index.js"), + require.resolve("../fixtures/reload-config/foo.js") + ] + }, + options: { + client: false, + liveReload: true, + hot: true + } + }, + // TODO we still output logs from webpack, need to improve this + { + title: + "should work with manual client setup and allow to enable hot module replacement", + webpackOptions: { + entry: [ + "@rspack/core/hot/dev-server", + `${require.resolve("@rspack/dev-server/client/index.js")}?hot=true`, + require.resolve("../fixtures/reload-config/foo.js") + ], + plugins: [ + new webpack.HotModuleReplacementPlugin(), + new HTMLGeneratorPlugin() + ] + }, + options: { + client: false, + liveReload: false, + hot: false + } + }, + { + title: + "should work with manual client setup and allow to disable hot module replacement", + webpackOptions: { + entry: [ + `${require.resolve("@rspack/dev-server/client/index.js")}?hot=false`, + require.resolve("../fixtures/reload-config/foo.js") + ] + }, + options: { + client: false, + liveReload: true, + hot: true + } + }, + { + title: + "should work with manual client setup and allow to enable live reload", + webpackOptions: { + entry: [ + `${require.resolve("@rspack/dev-server/client/index.js")}?live-reload=true`, + require.resolve("../fixtures/reload-config/foo.js") + ] + }, + options: { + client: false, + liveReload: false, + hot: false + } + }, + { + title: + "should work with manual client setup and allow to disable live reload", + webpackOptions: { + entry: [ + `${require.resolve("@rspack/dev-server/client/index.js")}?live-reload=false`, + require.resolve("../fixtures/reload-config/foo.js") + ] + }, + options: { + client: false, + liveReload: true, + hot: false + } + } + ]; + + let browser; + let server; + + beforeEach(() => { + fs.writeFileSync(cssFilePath, "body { background-color: rgb(0, 0, 255); }"); + }); + + afterEach(async () => { + if (browser) { + await browser.close(); + } + + if (server) { + await server.stop(); + } + + fs.unlinkSync(cssFilePath); + }); + + modes.forEach(mode => { + const webSocketServerTitle = + mode.options && mode.options.webSocketServer + ? mode.options.webSocketServer + : "default"; + + it(`${mode.title} (${webSocketServerTitle})`, async () => { + const webpackOptions = { ...reloadConfig, ...mode.webpackOptions }; + const compiler = webpack(webpackOptions); + const testDevServerOptions = mode.options || {}; + const devServerOptions = { port, ...testDevServerOptions }; + + server = new Server(devServerOptions, compiler); + + await server.start(); + + const webSocketServerLaunched = + testDevServerOptions.webSocketServer !== false; + + await new Promise(resolve => { + const webSocketTransport = + typeof testDevServerOptions.webSocketServer !== "undefined" && + testDevServerOptions.webSocketServer !== false + ? testDevServerOptions.webSocketServer + : "ws"; + + if (webSocketTransport === "ws") { + const ws = new WebSocket( + `ws://127.0.0.1:${devServerOptions.port}/ws`, + { + headers: { + host: `127.0.0.1:${devServerOptions.port}`, + origin: `http://127.0.0.1:${devServerOptions.port}` + } + } + ); + + let opened = false; + let received = false; + let errored = false; + + ws.on("error", error => { + if (!webSocketServerLaunched && /404/.test(error)) { + errored = true; + } else { + errored = true; + } + + ws.close(); + }); + + ws.on("open", () => { + opened = true; + }); + + ws.on("message", data => { + const message = JSON.parse(data.toString()); + + if (message.type === "ok") { + received = true; + + ws.close(); + } + }); + + ws.on("close", () => { + if (opened && received && !errored) { + resolve(); + } else if (!webSocketServerLaunched && errored) { + resolve(); + } + }); + } else { + const sockjs = new SockJS( + `http://127.0.0.1:${devServerOptions.port}/ws` + ); + + let opened = false; + let received = false; + let errored = false; + + sockjs.onerror = () => { + errored = true; + }; + + sockjs.onopen = () => { + opened = true; + }; + + sockjs.onmessage = ({ data }) => { + const message = JSON.parse(data.toString()); + + if (message.type === "ok") { + received = true; + + sockjs.close(); + } + }; + + sockjs.onclose = event => { + if (opened && received && !errored) { + resolve(); + } else if (event && event.reason === "Cannot connect to server") { + resolve(); + } + }; + } + }); + + const launched = await runBrowser(); + + ({ browser } = launched); + + const page = launched.page; + + const consoleMessages = []; + const pageErrors = []; + + let doneHotUpdate = false; + let hasDisconnectedMessage = false; + + page + .on("console", message => { + if (!hasDisconnectedMessage) { + const text = message.text(); + + hasDisconnectedMessage = /Disconnected!/.test(text); + consoleMessages.push(text); + } + }) + .on("pageerror", error => { + pageErrors.push(error); + }) + .on("request", requestObj => { + if (/\.hot-update\.json$/.test(requestObj.url())) { + doneHotUpdate = true; + } + }); + + await page.goto(`http://localhost:${port}/${mode.query || ""}`, { + waitUntil: "networkidle0" + }); + + const backgroundColorBefore = await page.evaluate(() => { + const body = document.body; + + return getComputedStyle(body)["background-color"]; + }); + + expect(backgroundColorBefore).toEqual("rgb(0, 0, 255)"); + + fs.writeFileSync( + cssFilePath, + "body { background-color: rgb(255, 0, 0); }" + ); + + let waitHot = + typeof testDevServerOptions.hot !== "undefined" + ? testDevServerOptions.hot + : true; + let waitLiveReload = + typeof testDevServerOptions.liveReload !== "undefined" + ? testDevServerOptions.liveReload + : true; + + if (webSocketServerLaunched === false) { + waitHot = false; + waitLiveReload = false; + } + + if (Array.isArray(webpackOptions.entry)) { + if (webpackOptions.entry.some(item => item.includes("hot=true"))) { + waitHot = true; + } else if ( + webpackOptions.entry.some(item => item.includes("hot=false")) + ) { + waitHot = false; + } + } + + if (Array.isArray(webpackOptions.entry)) { + if ( + webpackOptions.entry.some(item => item.includes("live-reload=true")) + ) { + waitLiveReload = true; + } else if ( + webpackOptions.entry.some(item => item.includes("live-reload=false")) + ) { + waitLiveReload = false; + } + } + + const query = mode.query || ""; + + if (query.includes("webpack-dev-server-hot=false")) { + waitHot = false; + } + + if (query.includes("webpack-dev-server-live-reload=false")) { + waitLiveReload = false; + } + + if (waitHot) { + await page.waitForFunction( + () => + getComputedStyle(document.body)["background-color"] === + "rgb(255, 0, 0)" + ); + + expect(doneHotUpdate).toBe(true); + } else if (waitLiveReload) { + await page.waitForNavigation({ + waitUntil: "networkidle0" + }); + } else if (webSocketServerLaunched) { + await new Promise(resolve => { + const interval = setInterval(() => { + if (consoleMessages.includes(INVALID_MESSAGE)) { + clearInterval(interval); + + resolve(); + } + }, 100); + }); + } + + const backgroundColorAfter = await page.evaluate(() => { + const body = document.body; + + return getComputedStyle(body)["background-color"]; + }); + + if (!waitHot && !waitLiveReload) { + expect(backgroundColorAfter).toEqual("rgb(0, 0, 255)"); + } else { + expect(backgroundColorAfter).toEqual("rgb(255, 0, 0)"); + } + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + }); + }); +}); + +// the following cases check to make sure that the HMR +// plugin is actually added + +// describe("simple hot config HMR plugin", () => { +// let compiler; +// let server; +// let page; +// let browser; +// let pageErrors; +// let consoleMessages; + +// beforeEach(async () => { +// compiler = webpack(config); + +// ({ page, browser } = await runBrowser()); + +// pageErrors = []; +// consoleMessages = []; +// }); + +// afterEach(async () => { +// await browser.close(); +// await server.stop(); +// }); + +// it("should register the HMR plugin before compilation is complete", async () => { +// let pluginFound = false; + +// compiler.hooks.compilation.intercept({ +// register: (tapInfo) => { +// if (tapInfo.name === "HotModuleReplacementPlugin") { +// pluginFound = true; +// } + +// return tapInfo; +// }, +// }); + +// server = new Server({ port }, compiler); + +// await server.start(); + +// expect(pluginFound).toBe(true); + +// page +// .on("console", (message) => { +// consoleMessages.push(message); +// }) +// .on("pageerror", (error) => { +// pageErrors.push(error); +// }); + +// const response = await page.goto(`http://127.0.0.1:${port}/`, { +// waitUntil: "networkidle0", +// }); + +// expect(response.status()).toMatchSnapshot("response status"); + +// expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( +// "console messages", +// ); + +// expect(pageErrors).toMatchSnapshot("page errors"); +// }); +// }); + +// describe("simple hot config HMR plugin with already added HMR plugin", () => { +// let compiler; +// let server; +// let page; +// let browser; +// let pageErrors; +// let consoleMessages; + +// beforeEach(async () => { +// compiler = webpack({ +// ...config, +// plugins: [...config.plugins, new webpack.HotModuleReplacementPlugin()], +// }); + +// ({ page, browser } = await runBrowser()); + +// pageErrors = []; +// consoleMessages = []; +// }); + +// afterEach(async () => { +// await browser.close(); +// await server.stop(); +// }); + +// it("should register the HMR plugin before compilation is complete", async () => { +// let pluginFound = false; + +// compiler.hooks.compilation.intercept({ +// register: (tapInfo) => { +// if (tapInfo.name === "HotModuleReplacementPlugin") { +// pluginFound = true; +// } + +// return tapInfo; +// }, +// }); + +// server = new Server({ port }, compiler); + +// await server.start(); + +// expect(compiler.options.plugins).toHaveLength(2); +// expect(pluginFound).toBe(true); + +// page +// .on("console", (message) => { +// consoleMessages.push(message); +// }) +// .on("pageerror", (error) => { +// pageErrors.push(error); +// }); + +// const response = await page.goto(`http://127.0.0.1:${port}/`, { +// waitUntil: "networkidle0", +// }); + +// expect(response.status()).toMatchSnapshot("response status"); + +// expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( +// "console messages", +// ); + +// expect(pageErrors).toMatchSnapshot("page errors"); +// }); +// }); + +// describe("simple config with already added HMR plugin", () => { +// let loggerWarnSpy; +// let getInfrastructureLoggerSpy; +// let compiler; +// let server; + +// beforeEach(() => { +// compiler = webpack({ +// ...config, +// devServer: { hot: false }, +// plugins: [...config.plugins, new webpack.HotModuleReplacementPlugin()], +// }); + +// loggerWarnSpy = jest.fn(); + +// getInfrastructureLoggerSpy = jest +// .spyOn(compiler, "getInfrastructureLogger") +// .mockImplementation(() => { +// return { +// warn: loggerWarnSpy, +// info: () => { }, +// log: () => { }, +// }; +// }); +// }); + +// afterEach(() => { +// getInfrastructureLoggerSpy.mockRestore(); +// loggerWarnSpy.mockRestore(); +// }); + +// it("should show warning with hot normalized as true", async () => { +// server = new Server({ port }, compiler); + +// await server.start(); + +// expect(loggerWarnSpy).toHaveBeenCalledWith( +// `"hot: true" automatically applies HMR plugin, you don't have to add it manually to your webpack configuration.`, +// ); + +// await server.stop(); +// }); + +// it(`should show warning with "hot: true"`, async () => { +// server = new Server({ port, hot: true }, compiler); + +// await server.start(); + +// expect(loggerWarnSpy).toHaveBeenCalledWith( +// `"hot: true" automatically applies HMR plugin, you don't have to add it manually to your webpack configuration.`, +// ); + +// await server.stop(); +// }); + +// it(`should not show warning with "hot: false"`, async () => { +// server = new Server({ port, hot: false }, compiler); + +// await server.start(); + +// expect(loggerWarnSpy).not.toHaveBeenCalledWith( +// `"hot: true" automatically applies HMR plugin, you don't have to add it manually to your webpack configuration.`, +// ); + +// await server.stop(); +// }); +// }); + +// describe("multi compiler hot config HMR plugin", () => { +// let compiler; +// let server; +// let page; +// let browser; +// let pageErrors; +// let consoleMessages; + +// beforeEach(async () => { +// compiler = webpack(multiCompilerConfig); + +// ({ page, browser } = await runBrowser()); + +// pageErrors = []; +// consoleMessages = []; +// }); + +// afterEach(async () => { +// await browser.close(); +// await server.stop(); +// }); + +// it("should register the HMR plugin before compilation is complete", async () => { +// let pluginFound = false; + +// compiler.compilers[0].hooks.compilation.intercept({ +// register: (tapInfo) => { +// if (tapInfo.name === "HotModuleReplacementPlugin") { +// pluginFound = true; +// } + +// return tapInfo; +// }, +// }); + +// server = new Server({ port }, compiler); + +// await server.start(); + +// expect(pluginFound).toBe(true); + +// page +// .on("console", (message) => { +// consoleMessages.push(message); +// }) +// .on("pageerror", (error) => { +// pageErrors.push(error); +// }); + +// const response = await page.goto(`http://127.0.0.1:${port}/`, { +// waitUntil: "networkidle0", +// }); + +// expect(response.status()).toMatchSnapshot("response status"); + +// expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( +// "console messages", +// ); + +// expect(pageErrors).toMatchSnapshot("page errors"); +// }); +// }); + +// describe("hot disabled HMR plugin", () => { +// let compiler; +// let server; +// let page; +// let browser; +// let pageErrors; +// let consoleMessages; + +// beforeEach(async () => { +// compiler = webpack(config); + +// ({ page, browser } = await runBrowser()); + +// pageErrors = []; +// consoleMessages = []; +// }); + +// afterEach(async () => { +// await browser.close(); +// await server.stop(); +// }); + +// it("should NOT register the HMR plugin before compilation is complete", async () => { +// let pluginFound = false; + +// compiler.hooks.compilation.intercept({ +// register: (tapInfo) => { +// if (tapInfo.name === "HotModuleReplacementPlugin") { +// pluginFound = true; +// } + +// return tapInfo; +// }, +// }); + +// server = new Server({ port, hot: false }, compiler); + +// await server.start(); + +// expect(pluginFound).toBe(false); + +// page +// .on("console", (message) => { +// consoleMessages.push(message); +// }) +// .on("pageerror", (error) => { +// pageErrors.push(error); +// }); + +// const response = await page.goto(`http://127.0.0.1:${port}/`, { +// waitUntil: "networkidle0", +// }); + +// expect(response.status()).toMatchSnapshot("response status"); + +// expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( +// "console messages", +// ); + +// expect(pageErrors).toMatchSnapshot("page errors"); +// }); +// }); diff --git a/packages/rspack-dev-server/tests/e2e/ipc.test.js b/packages/rspack-dev-server/tests/e2e/ipc.test.js new file mode 100644 index 00000000000..0098b5efee8 --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/ipc.test.js @@ -0,0 +1,354 @@ +"use strict"; + +const os = require("os"); +const net = require("net"); +const path = require("path"); +const http = require("http"); +const webpack = require("@rspack/core"); +const httpProxy = require("http-proxy"); +const { RspackDevServer: Server } = require("@rspack/dev-server"); +const config = require("../fixtures/client-config/webpack.config"); +const runBrowser = require("../helpers/run-browser"); +const sessionSubscribe = require("../helpers/session-subscribe"); +const port1 = require("../helpers/ports-map").ipc; + +const webSocketServers = ["ws", "sockjs"]; + +describe("web socket server URL", () => { + for (const webSocketServer of webSocketServers) { + const websocketURLProtocol = webSocketServer === "ws" ? "ws" : "http"; + + it(`should work with the "ipc" option using "true" value ("${webSocketServer}")`, async () => { + const devServerHost = "127.0.0.1"; + const proxyHost = devServerHost; + const proxyPort = port1; + + const compiler = webpack(config); + const devServerOptions = { + webSocketServer, + ipc: true + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const proxy = httpProxy.createProxyServer({ + target: { socketPath: server.options.ipc } + }); + + const proxyServer = http.createServer((request, response) => { + // You can define here your custom logic to handle the request + // and then proxy the request. + proxy.web(request, response); + }); + + proxyServer.on("upgrade", (request, socket, head) => { + proxy.ws(request, socket, head); + }); + + return proxyServer.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === "ws") { + const session = await page.target().createCDPSession(); + + session.on("Network.webSocketCreated", test => { + webSocketRequests.push(test); + }); + + await session.send("Target.setAutoAttach", { + autoAttach: true, + flatten: true, + waitForDebuggerOnStart: true + }); + + sessionSubscribe(session); + } else { + page.on("request", request => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://${devServerHost}:${proxyPort}/ws` + ); + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + it(`should work with the "ipc" option using "string" value ("${webSocketServer}")`, async () => { + const isWindows = process.platform === "win32"; + const pipePrefix = isWindows ? "\\\\.\\pipe\\" : os.tmpdir(); + const pipeName = `webpack-dev-server.${process.pid}-1.sock`; + const ipc = path.join(pipePrefix, pipeName); + + const devServerHost = "127.0.0.1"; + const proxyHost = devServerHost; + const proxyPort = port1; + + const compiler = webpack(config); + const devServerOptions = { + webSocketServer, + ipc + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const proxy = httpProxy.createProxyServer({ + target: { socketPath: ipc } + }); + + const proxyServer = http.createServer((request, response) => { + // You can define here your custom logic to handle the request + // and then proxy the request. + proxy.web(request, response); + }); + + proxyServer.on("upgrade", (request, socket, head) => { + proxy.ws(request, socket, head); + }); + + return proxyServer.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === "ws") { + const session = await page.target().createCDPSession(); + + session.on("Network.webSocketCreated", test => { + webSocketRequests.push(test); + }); + + await session.send("Target.setAutoAttach", { + autoAttach: true, + flatten: true, + waitForDebuggerOnStart: true + }); + + sessionSubscribe(session); + } else { + page.on("request", request => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://${devServerHost}:${proxyPort}/ws` + ); + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await browser.close(); + await server.stop(); + } + }); + + // TODO un skip after implement new API + it.skip(`should work with the "ipc" option using "string" value and remove old ("${webSocketServer}")`, async () => { + const isWindows = process.platform === "win32"; + const localRelative = path.relative(process.cwd(), `${os.tmpdir()}/`); + const pipePrefix = isWindows ? "\\\\.\\pipe\\" : localRelative; + const pipeName = `webpack-dev-server.${process.pid}-2.sock`; + const ipc = path.join(pipePrefix, pipeName); + + const ipcServer = await new Promise((resolve, reject) => { + const server = net.Server(); + + server.on("error", error => { + reject(error); + }); + + return server.listen(ipc, () => { + resolve(); + }); + }); + + const devServerHost = "127.0.0.1"; + const proxyHost = devServerHost; + const proxyPort = port1; + + const compiler = webpack(config); + const devServerOptions = { + webSocketServer, + host: devServerHost, + ipc + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + function startProxy(callback) { + const proxy = httpProxy.createProxyServer({ + target: { socketPath: ipc } + }); + + const proxyServer = http.createServer((request, response) => { + // You can define here your custom logic to handle the request + // and then proxy the request. + proxy.web(request, response); + }); + + proxyServer.on("upgrade", (request, socket, head) => { + proxy.ws(request, socket, head); + }); + + return proxyServer.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise(resolve => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === "ws") { + const session = await page.target().createCDPSession(); + + session.on("Network.webSocketCreated", test => { + webSocketRequests.push(test); + }); + + await session.send("Target.setAutoAttach", { + autoAttach: true, + flatten: true, + waitForDebuggerOnStart: true + }); + + sessionSubscribe(session); + } else { + page.on("request", request => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://${proxyHost}:${proxyPort}/`, { + waitUntil: "networkidle0" + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://${devServerHost}:${proxyPort}/ws` + ); + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + proxy.close(); + + await new Promise((resolve, reject) => { + ipcServer.close(error => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + await browser.close(); + await server.stop(); + } + }); + } +}); diff --git a/packages/rspack-dev-server/tests/e2e/lazy-compilation.test.js b/packages/rspack-dev-server/tests/e2e/lazy-compilation.test.js new file mode 100644 index 00000000000..cb51ef0e59f --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/lazy-compilation.test.js @@ -0,0 +1,112 @@ +"use strict"; + +const webpack = require("@rspack/core"); +const { RspackDevServer: Server } = require("@rspack/dev-server"); +const lazyCompilationSingleEntryConfig = require("../fixtures/lazy-compilation-single-entry/webpack.config"); +const lazyCompilationMultipleEntriesConfig = require("../fixtures/lazy-compilation-multiple-entries/webpack.config"); +const runBrowser = require("../helpers/run-browser"); +const port = require("../helpers/ports-map")["lazy-compilation"]; + +describe("lazy compilation", () => { + // TODO jest freeze due webpack do not close `eventsource`, we should uncomment this after fix it on webpack side + it.skip(`should work with single entry`, async () => { + const compiler = webpack(lazyCompilationSingleEntryConfig); + const server = new Server({ port }, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message.text()); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/test.html`, { + waitUntil: "domcontentloaded" + }); + await new Promise(resolve => { + const interval = setInterval(() => { + if (consoleMessages.includes("Hey.")) { + clearInterval(interval); + + resolve(); + } + }, 100); + }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it.skip(`should work with multiple entries`, async () => { + const compiler = webpack(lazyCompilationMultipleEntriesConfig); + const server = new Server({ port }, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message.text()); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/test-one.html`, { + waitUntil: "domcontentloaded" + }); + await new Promise(resolve => { + const interval = setInterval(() => { + console.log(consoleMessages); + if (consoleMessages.includes("One.")) { + clearInterval(interval); + + resolve(); + } + }, 100); + }); + + await page.goto(`http://127.0.0.1:${port}/test-two.html`, { + waitUntil: "domcontentloaded" + }); + await new Promise(resolve => { + const interval = setInterval(() => { + console.log(consoleMessages); + if (consoleMessages.includes("Two.")) { + clearInterval(interval); + + resolve(); + } + }, 100); + }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); +}); diff --git a/packages/rspack-dev-server/tests/e2e/logging.test.js b/packages/rspack-dev-server/tests/e2e/logging.test.js new file mode 100644 index 00000000000..6278d40a4e2 --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/logging.test.js @@ -0,0 +1,249 @@ +"use strict"; + +const path = require("path"); +const fs = require("graceful-fs"); +const webpack = require("@rspack/core"); +const { RspackDevServer: Server } = require("@rspack/dev-server"); +const HTMLGeneratorPlugin = require("../helpers/html-generator-plugin"); +const config = require("../fixtures/client-config/webpack.config"); +const runBrowser = require("../helpers/run-browser"); +const port = require("../helpers/ports-map").logging; + +describe("logging", () => { + const webSocketServers = [ + { webSocketServer: "ws" }, + { webSocketServer: "sockjs" } + ]; + + const cases = [ + { + title: "should work and log message about live reloading is enabled", + devServerOptions: { + hot: false + } + }, + { + title: + "should work and log messages about hot and live reloading is enabled", + devServerOptions: { + hot: true + } + }, + { + title: "should work and log messages about hot is enabled", + devServerOptions: { + liveReload: false + } + }, + { + title: + "should work and log messages about hot and live reloading is enabled", + devServerOptions: { + liveReload: true + } + }, + { + title: + "should work and do not log messages about hot and live reloading is enabled", + devServerOptions: { + liveReload: false, + hot: false + } + }, + { + title: + "should work and log messages about hot and live reloading is enabled", + devServerOptions: { + liveReload: true, + hot: true + } + }, + { + title: "should work and log warnings by default", + webpackOptions: { + plugins: [ + { + apply(compiler) { + compiler.hooks.thisCompilation.tap( + "warnings-webpack-plugin", + compilation => { + compilation.warnings.push( + new Error("Warning from compilation") + ); + } + ); + } + }, + new HTMLGeneratorPlugin() + ] + } + }, + { + title: "should work and log errors by default", + webpackOptions: { + plugins: [ + { + apply(compiler) { + compiler.hooks.thisCompilation.tap( + "warnings-webpack-plugin", + compilation => { + compilation.errors.push(new Error("Error from compilation")); + } + ); + } + }, + new HTMLGeneratorPlugin() + ] + } + }, + { + title: 'should work when the "client.logging" is "info"', + devServerOptions: { + client: { + logging: "info" + } + } + }, + { + title: 'should work when the "client.logging" is "log"', + devServerOptions: { + client: { + logging: "log" + } + } + }, + { + title: 'should work when the "client.logging" is "verbose"', + devServerOptions: { + client: { + logging: "verbose" + } + } + }, + { + title: 'should work when the "client.logging" is "none"', + devServerOptions: { + client: { + logging: "none" + } + } + }, + { + title: "should work and log only error", + webpackOptions: { + plugins: [ + { + apply(compiler) { + compiler.hooks.thisCompilation.tap( + "warnings-webpack-plugin", + compilation => { + compilation.warnings.push( + new Error("Warning from compilation") + ); + compilation.errors.push(new Error("Error from compilation")); + } + ); + } + }, + new HTMLGeneratorPlugin() + ] + }, + devServerOptions: { + client: { + logging: "error" + } + } + }, + { + title: "should work and log warning and errors", + webpackOptions: { + plugins: [ + { + apply(compiler) { + compiler.hooks.thisCompilation.tap( + "warnings-webpack-plugin", + compilation => { + compilation.warnings.push( + new Error("Warning from compilation") + ); + compilation.errors.push(new Error("Error from compilation")); + } + ); + } + }, + new HTMLGeneratorPlugin() + ] + }, + devServerOptions: { + client: { + logging: "warn" + } + } + }, + { + title: "should work and log static changes", + devServerOptions: { + static: path.resolve(__dirname, "../fixtures/client-config/static") + } + } + ]; + + webSocketServers.forEach(webSocketServer => { + cases.forEach(testCase => { + it(`${testCase.title} (${ + webSocketServer.webSocketServer || "default" + })`, async () => { + const compiler = webpack({ ...config, ...testCase.webpackOptions }); + const devServerOptions = { + port, + ...testCase.devServerOptions + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + const consoleMessages = []; + + page.on("console", message => { + consoleMessages.push(message); + }); + + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + if (testCase.devServerOptions && testCase.devServerOptions.static) { + fs.writeFileSync( + path.join(testCase.devServerOptions.static, "./foo.txt"), + "Text" + ); + + await page.waitForNavigation({ + waitUntil: "networkidle0" + }); + } + + expect( + consoleMessages.map(message => + message + .text() + .replace(/\\/g, "/") + .replace( + new RegExp(process.cwd().replace(/\\/g, "/"), "g"), + "" + ) + ) + ).toMatchSnapshot(); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + }); + }); +}); diff --git a/packages/rspack-dev-server/tests/e2e/mime-types.test.js b/packages/rspack-dev-server/tests/e2e/mime-types.test.js new file mode 100644 index 00000000000..80005919c26 --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/mime-types.test.js @@ -0,0 +1,135 @@ +"use strict"; + +const webpack = require("@rspack/core"); +const { RspackDevServer: Server } = require("@rspack/dev-server"); +const config = require("../fixtures/mime-types-config/webpack.config"); +const runBrowser = require("../helpers/run-browser"); +const port = require("../helpers/ports-map")["mime-types-option"]; + +describe("mimeTypes option", () => { + describe("as an object with a remapped type", () => { + let compiler; + let server; + let page; + let browser; + let pageErrors; + let consoleMessages; + + beforeEach(async () => { + compiler = webpack(config); + + server = new Server( + { + devMiddleware: { + mimeTypes: { + js: "text/plain" + } + }, + port + }, + compiler + ); + + await server.start(); + + ({ page, browser } = await runBrowser()); + + pageErrors = []; + consoleMessages = []; + }); + + afterEach(async () => { + await browser.close(); + await server.stop(); + }); + + it("should request file with different js mime type", async () => { + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const response = await page.goto(`http://127.0.0.1:${port}/main.js`, { + waitUntil: "networkidle0" + }); + + expect(response.status()).toMatchSnapshot("response status"); + + expect(response.headers()["content-type"]).toMatchSnapshot( + "response headers content-type" + ); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + }); + }); + + describe("as an object with a custom type", () => { + let compiler; + let server; + let page; + let browser; + let pageErrors; + let consoleMessages; + + beforeEach(async () => { + compiler = webpack(config); + + server = new Server( + { + devMiddleware: { + mimeTypes: { + custom: "text/html" + } + }, + port + }, + compiler + ); + + await server.start(); + + ({ page, browser } = await runBrowser()); + + pageErrors = []; + consoleMessages = []; + }); + + afterEach(async () => { + await browser.close(); + await server.stop(); + }); + + it("should request file with different js mime type", async () => { + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const response = await page.goto(`http://127.0.0.1:${port}/file.custom`, { + waitUntil: "networkidle0" + }); + + expect(response.status()).toMatchSnapshot("response status"); + + expect(response.headers()["content-type"]).toMatchSnapshot( + "response headers content-type" + ); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + }); + }); +}); diff --git a/packages/rspack-dev-server/tests/e2e/module-federation.test.js b/packages/rspack-dev-server/tests/e2e/module-federation.test.js new file mode 100644 index 00000000000..20b86eb8b6a --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/module-federation.test.js @@ -0,0 +1,296 @@ +"use strict"; + +const requireFromString = require("require-from-string"); +const webpack = require("@rspack/core"); +const { RspackDevServer: Server } = require("@rspack/dev-server"); +const simpleConfig = require("../fixtures/module-federation-config/webpack.config"); +const objectEntryConfig = require("../fixtures/module-federation-config/webpack.object-entry.config"); +const multiConfig = require("../fixtures/module-federation-config/webpack.multi.config"); +const runBrowser = require("../helpers/run-browser"); +const port = require("../helpers/ports-map")["module-federation"]; +const pluginConfig = require("../fixtures/module-federation-config/webpack.plugin"); + +describe("Module federation", () => { + describe("should work with simple multi-entry config", () => { + let compiler; + let server; + let page; + let browser; + let pageErrors; + let consoleMessages; + + beforeEach(async () => { + compiler = webpack(simpleConfig); + server = new Server({ port }, compiler); + + await server.start(); + + ({ page, browser } = await runBrowser()); + + pageErrors = []; + consoleMessages = []; + }); + + afterEach(async () => { + await browser.close(); + await server.stop(); + }); + + it("should use the last entry export", async () => { + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const response = await page.goto(`http://127.0.0.1:${port}/main.js`, { + waitUntil: "networkidle0" + }); + + const textContent = await response.text(); + + expect(textContent).toContain("entry1"); + + let exports; + + expect(() => { + exports = requireFromString(textContent); + }).not.toThrow(); + + expect(exports).toEqual("entry2"); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + }); + }); + + describe("should work with object multi-entry config", () => { + let compiler; + let server; + let page; + let browser; + let pageErrors; + let consoleMessages; + + beforeEach(async () => { + compiler = webpack(objectEntryConfig); + server = new Server({ port }, compiler); + + await server.start(); + + ({ page, browser } = await runBrowser()); + + pageErrors = []; + consoleMessages = []; + }); + + afterEach(async () => { + await browser.close(); + await server.stop(); + }); + + it("should use the last entry export", async () => { + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const response = await page.goto(`http://127.0.0.1:${port}/main.js`, { + waitUntil: "networkidle0" + }); + + const textContent = await response.text(); + + expect(textContent).toContain("entry1"); + + let exports; + + expect(() => { + exports = requireFromString(textContent); + }).not.toThrow(); + + expect(exports).toEqual("entry2"); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + }); + + it("should support the named entry export", async () => { + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const response = await page.goto(`http://127.0.0.1:${port}/foo.js`, { + waitUntil: "networkidle0" + }); + + const textContent = await response.text(); + + expect(textContent).not.toContain("entry2"); + + let exports; + + expect(() => { + exports = requireFromString(textContent); + }).not.toThrow(); + + expect(exports).toEqual("entry1"); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + }); + }); + + describe("should work with multi compiler config", () => { + let compiler; + let server; + let page; + let browser; + let pageErrors; + let consoleMessages; + + beforeEach(async () => { + compiler = webpack(multiConfig); + server = new Server({ port }, compiler); + + await server.start(); + + ({ page, browser } = await runBrowser()); + + pageErrors = []; + consoleMessages = []; + }); + + afterEach(async () => { + await browser.close(); + await server.stop(); + }); + + it("should use the last entry export", async () => { + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const response = await page.goto(`http://127.0.0.1:${port}/main.js`, { + waitUntil: "networkidle0" + }); + + const textContent = await response.text(); + + expect(textContent).toContain("entry1"); + + let exports; + + expect(() => { + exports = requireFromString(textContent); + }).not.toThrow(); + + expect(exports).toEqual("entry2"); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + }); + }); + + describe("should use plugin", () => { + let compiler; + let server; + let page; + let browser; + let pageErrors; + let consoleMessages; + + beforeEach(async () => { + compiler = webpack(pluginConfig); + server = new Server({ port }, compiler); + + await server.start(); + + ({ page, browser } = await runBrowser()); + + pageErrors = []; + consoleMessages = []; + }); + + afterEach(async () => { + await browser.close(); + await server.stop(); + }); + + it("should contain hot script in remoteEntry.js", async () => { + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const response = await page.goto( + `http://127.0.0.1:${port}/remoteEntry.js`, + { + waitUntil: "networkidle0" + } + ); + + const remoteEntryTextContent = await response.text(); + + expect(remoteEntryTextContent).toMatch(/rspack\/hot\/dev-server\.js/); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + }); + + it("should contain hot script in main.js", async () => { + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const response = await page.goto(`http://127.0.0.1:${port}/main.js`, { + waitUntil: "networkidle0" + }); + + const mainEntryTextContent = await response.text(); + + expect(mainEntryTextContent).toMatch(/rspack\/hot\/dev-server\.js/); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + }); + }); +}); diff --git a/packages/rspack-dev-server/tests/e2e/multi-compiler.test.js b/packages/rspack-dev-server/tests/e2e/multi-compiler.test.js new file mode 100644 index 00000000000..38575657cbf --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/multi-compiler.test.js @@ -0,0 +1,778 @@ +"use strict"; + +const path = require("path"); +const fs = require("graceful-fs"); +const webpack = require("@rspack/core"); +const { RspackDevServer: Server } = require("@rspack/dev-server"); +const oneWebTargetConfiguration = require("../fixtures/multi-compiler-one-configuration/webpack.config"); +const twoWebTargetConfiguration = require("../fixtures/multi-compiler-two-configurations/webpack.config"); +const universalConfiguration = require("../fixtures/universal-compiler-config/webpack.config"); +const runBrowser = require("../helpers/run-browser"); +const port = require("../helpers/ports-map")["multi-compiler"]; + +describe("multi compiler", () => { + it(`should work with one web target configuration and do nothing`, async () => { + const compiler = webpack(oneWebTargetConfiguration); + const devServerOptions = { + port + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message.text()); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it(`should work with web target configurations and do nothing`, async () => { + const compiler = webpack(twoWebTargetConfiguration); + const devServerOptions = { + port + }; + + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + let pageErrors = []; + let consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message.text()); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/one-main.html`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + + pageErrors = []; + consoleMessages = []; + + await page.goto(`http://127.0.0.1:${port}/two-main.html`, { + waitUntil: "networkidle0" + }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it(`should work with web target configurations when hot and live reloads are enabled, and do hot reload by default when changing own entries`, async () => { + const compiler = webpack(twoWebTargetConfiguration); + const devServerOptions = { + port, + hot: true, + liveReload: true + }; + const pathToOneEntry = path.resolve( + __dirname, + "../fixtures/multi-compiler-two-configurations/one.js" + ); + const originalOneEntryContent = fs.readFileSync(pathToOneEntry); + const pathToTwoEntry = path.resolve( + __dirname, + "../fixtures/multi-compiler-two-configurations/two.js" + ); + const originalTwoEntryContent = fs.readFileSync(pathToTwoEntry); + + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + let pageErrors = []; + let consoleMessages = []; + + page + .on("console", message => { + let text = message.text(); + + if (/Error: Aborted because/.test(text)) { + const splittedText = text.split("\n"); + + text = `${splittedText[0]}\n${splittedText[1]}\n `; + } + + consoleMessages.push(text); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/one-main.html`, { + waitUntil: "networkidle0" + }); + + fs.writeFileSync(pathToOneEntry, `${originalOneEntryContent}// comment`); + + await page.waitForNavigation({ waitUntil: "networkidle0" }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + + pageErrors = []; + consoleMessages = []; + + await page.goto(`http://127.0.0.1:${port}/two-main.html`, { + waitUntil: "networkidle0" + }); + + fs.writeFileSync(pathToTwoEntry, `${originalTwoEntryContent}// comment`); + + await page.waitForNavigation({ waitUntil: "networkidle0" }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + + fs.writeFileSync(pathToOneEntry, originalOneEntryContent); + fs.writeFileSync(pathToTwoEntry, originalTwoEntryContent); + } + }); + + it(`should work with web target configurations when only hot reload is enabled, and do hot reload when changing own entries`, async () => { + const compiler = webpack(twoWebTargetConfiguration); + const devServerOptions = { + port, + hot: true, + liveReload: false + }; + const pathToOneEntry = path.resolve( + __dirname, + "../fixtures/multi-compiler-two-configurations/one.js" + ); + const originalOneEntryContent = fs.readFileSync(pathToOneEntry); + const pathToTwoEntry = path.resolve( + __dirname, + "../fixtures/multi-compiler-two-configurations/two.js" + ); + const originalTwoEntryContent = fs.readFileSync(pathToTwoEntry); + + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + let pageErrors = []; + let consoleMessages = []; + + page + .on("console", message => { + let text = message.text(); + + if (/Error: Aborted because/.test(text)) { + const splittedText = text.split("\n"); + + text = `${splittedText[0]}\n${splittedText[1]}\n `; + } + + consoleMessages.push(text); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/one-main.html`, { + waitUntil: "networkidle0" + }); + + fs.writeFileSync(pathToOneEntry, `${originalOneEntryContent}// comment`); + + await page.waitForNavigation({ waitUntil: "networkidle0" }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + + pageErrors = []; + consoleMessages = []; + + await page.goto(`http://127.0.0.1:${port}/two-main.html`, { + waitUntil: "networkidle0" + }); + + fs.writeFileSync(pathToTwoEntry, `${originalTwoEntryContent}// comment`); + + await page.waitForNavigation({ waitUntil: "networkidle0" }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + + fs.writeFileSync(pathToOneEntry, originalOneEntryContent); + fs.writeFileSync(pathToTwoEntry, originalTwoEntryContent); + } + }); + + it(`should work with web target configurations when only live reload is enabled, and do live reload when changing own entries`, async () => { + const compiler = webpack(twoWebTargetConfiguration); + const devServerOptions = { + port, + hot: false, + liveReload: true + }; + const pathToOneEntry = path.resolve( + __dirname, + "../fixtures/multi-compiler-two-configurations/one.js" + ); + const originalOneEntryContent = fs.readFileSync(pathToOneEntry); + const pathToTwoEntry = path.resolve( + __dirname, + "../fixtures/multi-compiler-two-configurations/two.js" + ); + const originalTwoEntryContent = fs.readFileSync(pathToTwoEntry); + + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + let pageErrors = []; + let consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message.text()); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/one-main.html`, { + waitUntil: "networkidle0" + }); + + fs.writeFileSync(pathToOneEntry, `${originalOneEntryContent}// comment`); + + await page.waitForNavigation({ waitUntil: "networkidle0" }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + + pageErrors = []; + consoleMessages = []; + + await page.goto(`http://127.0.0.1:${port}/two-main.html`, { + waitUntil: "networkidle0" + }); + + fs.writeFileSync(pathToTwoEntry, `${originalTwoEntryContent}// comment`); + + await page.waitForNavigation({ waitUntil: "networkidle0" }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + + fs.writeFileSync(pathToOneEntry, originalOneEntryContent); + fs.writeFileSync(pathToTwoEntry, originalTwoEntryContent); + } + }); + + it(`should work with web target configurations when only live reload is enabled and do live reload when changing other entries`, async () => { + const compiler = webpack(twoWebTargetConfiguration); + const devServerOptions = { + port, + hot: false, + liveReload: true + }; + const pathToOneEntry = path.resolve( + __dirname, + "../fixtures/multi-compiler-two-configurations/one.js" + ); + const originalOneEntryContent = fs.readFileSync(pathToOneEntry); + const pathToTwoEntry = path.resolve( + __dirname, + "../fixtures/multi-compiler-two-configurations/two.js" + ); + const originalTwoEntryContent = fs.readFileSync(pathToTwoEntry); + + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + let pageErrors = []; + let consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message.text()); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/one-main.html`, { + waitUntil: "networkidle0" + }); + + fs.writeFileSync(pathToTwoEntry, `${originalTwoEntryContent}// comment`); + + await page.waitForNavigation({ waitUntil: "networkidle0" }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + + pageErrors = []; + consoleMessages = []; + + await page.goto(`http://127.0.0.1:${port}/two-main.html`, { + waitUntil: "networkidle0" + }); + + fs.writeFileSync(pathToOneEntry, `${originalOneEntryContent}// comment`); + + await page.waitForNavigation({ waitUntil: "networkidle0" }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + + fs.writeFileSync(pathToOneEntry, originalOneEntryContent); + fs.writeFileSync(pathToTwoEntry, originalTwoEntryContent); + } + }); + + it("should work with universal configuration and do nothing", async () => { + const compiler = webpack(universalConfiguration); + const devServerOptions = { + port + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + try { + const serverResponse = await page.goto( + `http://127.0.0.1:${port}/server.js`, + { + waitUntil: "networkidle0" + } + ); + + const serverResponseText = await serverResponse.text(); + + expect(serverResponseText).toContain("Hello from the server"); + expect(serverResponseText).not.toContain("WebsocketServer"); + + page + .on("console", message => { + consoleMessages.push(message.text()); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/browser.html`, { + waitUntil: "networkidle0" + }); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + }); + + it(`should work with universal configuration when hot and live reloads are enabled, and do hot reload for browser compiler by default when browser entry changed`, async () => { + const compiler = webpack(universalConfiguration); + const devServerOptions = { + port, + hot: true, + liveReload: true + }; + const pathToBrowserEntry = path.resolve( + __dirname, + "../fixtures/universal-compiler-config/browser.js" + ); + const originalBrowserEntryContent = fs.readFileSync(pathToBrowserEntry); + const pathToServerEntry = path.resolve( + __dirname, + "../fixtures/universal-compiler-config/server.js" + ); + const originalServerEntryContent = fs.readFileSync(pathToServerEntry); + + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + const serverResponse = await page.goto( + `http://127.0.0.1:${port}/server.js`, + { + waitUntil: "networkidle0" + } + ); + + const serverResponseText = await serverResponse.text(); + + expect(serverResponseText).toContain("Hello from the server"); + expect(serverResponseText).not.toContain("WebsocketServer"); + + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + let text = message.text(); + + if (/Error: Aborted because/.test(text)) { + const splittedText = text.split("\n"); + + text = `${splittedText[0]}\n${splittedText[1]}\n `; + } + + consoleMessages.push(text); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/browser.html`, { + waitUntil: "networkidle0" + }); + + fs.writeFileSync( + pathToBrowserEntry, + `${originalBrowserEntryContent}// comment` + ); + + await page.waitForNavigation({ waitUntil: "networkidle0" }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + + fs.writeFileSync(pathToBrowserEntry, originalBrowserEntryContent); + fs.writeFileSync(pathToServerEntry, originalServerEntryContent); + } + }); + + it(`should work with universal configuration when only hot reload is enabled, and do hot reload for browser compiler when browser entry changed`, async () => { + const compiler = webpack(universalConfiguration); + const devServerOptions = { + port, + hot: true, + liveReload: false + }; + const pathToBrowserEntry = path.resolve( + __dirname, + "../fixtures/universal-compiler-config/browser.js" + ); + const originalBrowserEntryContent = fs.readFileSync(pathToBrowserEntry); + + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + const serverResponse = await page.goto( + `http://127.0.0.1:${port}/server.js`, + { + waitUntil: "networkidle0" + } + ); + + const serverResponseText = await serverResponse.text(); + + expect(serverResponseText).toContain("Hello from the server"); + expect(serverResponseText).not.toContain("WebsocketServer"); + + const pageErrors = []; + const consoleMessages = []; + + page + .on("console", message => { + let text = message.text(); + + if (/Error: Aborted because/.test(text)) { + const splittedText = text.split("\n"); + + text = `${splittedText[0]}\n${splittedText[1]}\n `; + } + + consoleMessages.push(text); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/browser.html`, { + waitUntil: "networkidle0" + }); + + fs.writeFileSync( + pathToBrowserEntry, + `${originalBrowserEntryContent}// comment` + ); + + await page.waitForNavigation({ waitUntil: "networkidle0" }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + + fs.writeFileSync(pathToBrowserEntry, originalBrowserEntryContent); + } + }); + + it(`should work with universal configuration when only live reload is enabled, and do live reload for browser compiler when changing browser and server entries`, async () => { + const compiler = webpack(universalConfiguration); + const devServerOptions = { + port, + hot: false, + liveReload: true + }; + const pathToBrowserEntry = path.resolve( + __dirname, + "../fixtures/universal-compiler-config/browser.js" + ); + const originalBrowserEntryContent = fs.readFileSync(pathToBrowserEntry); + const pathToServerEntry = path.resolve( + __dirname, + "../fixtures/universal-compiler-config/server.js" + ); + const originalServerEntryContent = fs.readFileSync(pathToServerEntry); + + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + const serverResponse = await page.goto( + `http://127.0.0.1:${port}/server.js`, + { + waitUntil: "networkidle0" + } + ); + + const serverResponseText = await serverResponse.text(); + + expect(serverResponseText).toContain("Hello from the server"); + expect(serverResponseText).not.toContain("WebsocketServer"); + + let pageErrors = []; + let consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message.text()); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/browser.html`, { + waitUntil: "networkidle0" + }); + + fs.writeFileSync( + pathToBrowserEntry, + `${originalBrowserEntryContent}// comment` + ); + + await page.waitForNavigation({ waitUntil: "networkidle0" }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + + pageErrors = []; + consoleMessages = []; + + await page.goto(`http://127.0.0.1:${port}/browser.html`, { + waitUntil: "networkidle0" + }); + + fs.writeFileSync( + pathToServerEntry, + `${originalServerEntryContent}// comment` + ); + + await page.waitForNavigation({ waitUntil: "networkidle0" }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + + fs.writeFileSync(pathToBrowserEntry, originalBrowserEntryContent); + fs.writeFileSync(pathToServerEntry, originalServerEntryContent); + } + }); + + it(`should work with universal configuration when only live reload is enabled, and do live reload for browser compiler when changing server and browser entries`, async () => { + const compiler = webpack(universalConfiguration); + const devServerOptions = { + port, + hot: false, + liveReload: true + }; + const pathToBrowserEntry = path.resolve( + __dirname, + "../fixtures/universal-compiler-config/browser.js" + ); + const originalBrowserEntryContent = fs.readFileSync(pathToBrowserEntry); + const pathToServerEntry = path.resolve( + __dirname, + "../fixtures/universal-compiler-config/server.js" + ); + const originalServerEntryContent = fs.readFileSync(pathToServerEntry); + + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + const serverResponse = await page.goto( + `http://127.0.0.1:${port}/server.js`, + { + waitUntil: "networkidle0" + } + ); + + const serverResponseText = await serverResponse.text(); + + expect(serverResponseText).toContain("Hello from the server"); + expect(serverResponseText).not.toContain("WebsocketServer"); + + let pageErrors = []; + let consoleMessages = []; + + page + .on("console", message => { + consoleMessages.push(message.text()); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + await page.goto(`http://127.0.0.1:${port}/browser.html`, { + waitUntil: "networkidle0" + }); + + fs.writeFileSync( + pathToServerEntry, + `${originalServerEntryContent}// comment` + ); + + await page.waitForNavigation({ waitUntil: "networkidle0" }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + + pageErrors = []; + consoleMessages = []; + + await page.goto(`http://127.0.0.1:${port}/browser.html`, { + waitUntil: "networkidle0" + }); + + fs.writeFileSync( + pathToBrowserEntry, + `${originalBrowserEntryContent}// comment` + ); + + await page.waitForNavigation({ waitUntil: "networkidle0" }); + + expect(consoleMessages).toMatchSnapshot("console messages"); + expect(pageErrors).toMatchSnapshot("page errors"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + + fs.writeFileSync(pathToBrowserEntry, originalBrowserEntryContent); + fs.writeFileSync(pathToServerEntry, originalServerEntryContent); + } + }); +}); diff --git a/packages/rspack-dev-server/tests/e2e/on-listening.test.js b/packages/rspack-dev-server/tests/e2e/on-listening.test.js new file mode 100644 index 00000000000..66aa909e19c --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/on-listening.test.js @@ -0,0 +1,127 @@ +"use strict"; + +const webpack = require("@rspack/core"); +const { RspackDevServer: Server } = require("@rspack/dev-server"); +const config = require("../fixtures/client-config/webpack.config"); +const runBrowser = require("../helpers/run-browser"); +const port = require("../helpers/ports-map")["on-listening-option"]; + +describe("onListening option", () => { + let compiler; + let server; + let page; + let browser; + let pageErrors; + let consoleMessages; + let onListeningIsRunning = false; + + beforeEach(async () => { + compiler = webpack(config); + server = new Server( + { + onListening: devServer => { + if (!devServer) { + throw new Error("webpack-dev-server is not defined"); + } + + onListeningIsRunning = true; + + devServer.app.get("/listening/some/path", (_, response) => { + response.send("listening"); + }); + + devServer.app.post("/listening/some/path", (_, response) => { + response.send("listening POST"); + }); + }, + port + }, + compiler + ); + + await server.start(); + + ({ page, browser } = await runBrowser()); + + pageErrors = []; + consoleMessages = []; + }); + + afterEach(async () => { + await browser.close(); + await server.stop(); + }); + + it("should handle GET request to /listening/some/path route", async () => { + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }); + + const response = await page.goto( + `http://127.0.0.1:${port}/listening/some/path`, + { + waitUntil: "networkidle0" + } + ); + + expect(onListeningIsRunning).toBe(true); + + expect(response.headers()["content-type"]).toMatchSnapshot( + "response headers content-type" + ); + + expect(response.status()).toMatchSnapshot("response status"); + + expect(await response.text()).toMatchSnapshot("response text"); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + }); + + it("should handle POST request to /listening/some/path route", async () => { + await page.setRequestInterception(true); + + page + .on("console", message => { + consoleMessages.push(message); + }) + .on("pageerror", error => { + pageErrors.push(error); + }) + .on("request", interceptedRequest => { + if (interceptedRequest.isInterceptResolutionHandled()) return; + + interceptedRequest.continue({ method: "POST" }); + }); + + const response = await page.goto( + `http://127.0.0.1:${port}/listening/some/path`, + { + waitUntil: "networkidle0" + } + ); + + expect(onListeningIsRunning).toBe(true); + + expect(response.headers()["content-type"]).toMatchSnapshot( + "response headers content-type" + ); + + expect(response.status()).toMatchSnapshot("response status"); + + expect(await response.text()).toMatchSnapshot("response text"); + + expect(consoleMessages.map(message => message.text())).toMatchSnapshot( + "console messages" + ); + + expect(pageErrors).toMatchSnapshot("page errors"); + }); +}); diff --git a/packages/rspack-dev-server/tests/e2e/overlay.test.js b/packages/rspack-dev-server/tests/e2e/overlay.test.js new file mode 100644 index 00000000000..2b33045a31f --- /dev/null +++ b/packages/rspack-dev-server/tests/e2e/overlay.test.js @@ -0,0 +1,1990 @@ +"use strict"; + +const path = require("path"); +const fs = require("graceful-fs"); +const webpack = require("@rspack/core"); +const { RspackDevServer: Server } = require("@rspack/dev-server"); +const waitForExpect = require("wait-for-expect"); +const config = require("../fixtures/overlay-config/webpack.config"); +const trustedTypesConfig = require("../fixtures/overlay-config/trusted-types.webpack.config"); +const runBrowser = require("../helpers/run-browser"); +const port = require("../helpers/ports-map").overlay; + +class ErrorPlugin { + constructor(message, skipCounter) { + this.message = + message || "Error from compilation. Can't find 'test' module."; + this.skipCounter = skipCounter; + this.counter = 0; + } + + apply(compiler) { + compiler.hooks.thisCompilation.tap("errors-webpack-plugin", compilation => { + if ( + typeof this.skipCounter !== "undefined" && + this.counter !== this.skipCounter + ) { + this.counter += 1; + + return; + } + + compilation.errors.push(new Error(this.message)); + }); + } +} + +class WarningPlugin { + constructor(message, skipCounter) { + this.message = message || "Warning from compilation"; + this.skipCounter = skipCounter; + this.counter = 0; + } + + apply(compiler) { + compiler.hooks.thisCompilation.tap( + "warnings-webpack-plugin", + compilation => { + if ( + typeof this.skipCounter !== "undefined" && + this.counter !== this.skipCounter + ) { + this.counter += 1; + + return; + } + + compilation.warnings.push(new Error(this.message)); + } + ); + } +} + +const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); + +let prettier; +let prettierHTML; +let prettierCSS; + +describe("overlay", () => { + beforeAll(async () => { + // Due problems with ESM modules for Node.js@18 + // TODO replace it on import/require when Node.js@18 will be dropped + prettier = require("../../node_modules/prettier/standalone"); + prettierHTML = require("../../node_modules/prettier/plugins/html"); + prettierCSS = require("../../node_modules/prettier/plugins/postcss"); + }); + + it("should show a warning for initial compilation", async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + + const devServerOptions = { + port + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should show an error for initial compilation", async () => { + const compiler = webpack(config); + + new ErrorPlugin().apply(compiler); + + const devServerOptions = { + port + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should show a warning and error for initial compilation", async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + new WarningPlugin().apply(compiler); + new ErrorPlugin().apply(compiler); + new ErrorPlugin().apply(compiler); + new ErrorPlugin().apply(compiler); + + const devServerOptions = { + port + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should show an ansi formatted error for initial compilation", async () => { + const compiler = webpack(config); + + new ErrorPlugin( + "  18 | Render ansi formatted text" + ).apply(compiler); + + const devServerOptions = { + port + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should show a warning and error for initial compilation and protects against xss", async () => { + const compiler = webpack(config); + + new WarningPlugin("strong").apply(compiler); + new ErrorPlugin("strong").apply(compiler); + + const devServerOptions = { + port + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should not show initially, then show on an error, then hide on fix", async () => { + const compiler = webpack(config); + const devServerOptions = { + port + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + let pageHtml = await page.evaluate(() => document.body.outerHTML); + let overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + + expect(overlayHandle).toBe(null); + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html initial"); + + const pathToFile = path.resolve( + __dirname, + "../fixtures/overlay-config/foo.js" + ); + const originalCode = fs.readFileSync(pathToFile); + + fs.writeFileSync(pathToFile, "`;"); + + await page.waitForSelector("#webpack-dev-server-client-overlay"); + + overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + pageHtml = await page.evaluate(() => document.body.outerHTML); + + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html with error"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + + fs.writeFileSync(pathToFile, originalCode); + + await page.waitForSelector("#webpack-dev-server-client-overlay", { + hidden: true + }); + + pageHtml = await page.evaluate(() => document.body.outerHTML); + overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + + expect(overlayHandle).toBe(null); + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html after fix error"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should not show initially, then show on an error, then show other error, then hide on fix", async () => { + const compiler = webpack(config); + const devServerOptions = { + port + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + let pageHtml = await page.evaluate(() => document.body.outerHTML); + let overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + + expect(overlayHandle).toBe(null); + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html initial"); + + const pathToFile = path.resolve( + __dirname, + "../fixtures/overlay-config/foo.js" + ); + const originalCode = fs.readFileSync(pathToFile); + + fs.writeFileSync(pathToFile, "`;"); + + await page.waitForSelector("#webpack-dev-server-client-overlay"); + + overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + pageHtml = await page.evaluate(() => document.body.outerHTML); + + let overlayFrame = await overlayHandle.contentFrame(); + let overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html with error"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + + fs.writeFileSync(pathToFile, "`;a"); + + await page.waitForSelector("#webpack-dev-server-client-overlay", { + hidden: true + }); + await page.waitForSelector("#webpack-dev-server-client-overlay"); + + overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + pageHtml = await page.evaluate(() => document.body.outerHTML); + + overlayFrame = await overlayHandle.contentFrame(); + overlayHtml = await overlayFrame.evaluate(() => document.body.outerHTML); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html with other error"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + + fs.writeFileSync(pathToFile, originalCode); + + await page.waitForSelector("#webpack-dev-server-client-overlay", { + hidden: true + }); + + pageHtml = await page.evaluate(() => document.body.outerHTML); + overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + + expect(overlayHandle).toBe(null); + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html after fix error"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should not show initially, then show on an error and allow to close", async () => { + const compiler = webpack(config); + const devServerOptions = { + port + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + let pageHtml = await page.evaluate(() => document.body.outerHTML); + let overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + + expect(overlayHandle).toBe(null); + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html initial"); + + const pathToFile = path.resolve( + __dirname, + "../fixtures/overlay-config/foo.js" + ); + const originalCode = fs.readFileSync(pathToFile); + + fs.writeFileSync(pathToFile, "`;"); + + await page.waitForSelector("#webpack-dev-server-client-overlay"); + + overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + pageHtml = await page.evaluate(() => document.body.outerHTML); + + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html with error"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + + const frame = await page + .frames() + .find(item => item.name() === "webpack-dev-server-client-overlay"); + + const buttonHandle = await frame.$("button"); + + await buttonHandle.click(); + + await page.waitForSelector("#webpack-dev-server-client-overlay", { + hidden: true + }); + + pageHtml = await page.evaluate(() => document.body.outerHTML); + overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + + expect(overlayHandle).toBe(null); + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html after close"); + + fs.writeFileSync(pathToFile, originalCode); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should open editor when error with file info is clicked", async () => { + const mockLaunchEditorCb = jest.fn(); + jest.mock("launch-editor", () => mockLaunchEditorCb); + + const compiler = webpack(config); + const devServerOptions = { + port + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + const pathToFile = path.resolve( + __dirname, + "../fixtures/overlay-config/foo.js" + ); + const originalCode = fs.readFileSync(pathToFile); + + fs.writeFileSync(pathToFile, "`;"); + + await page.waitForSelector("#webpack-dev-server-client-overlay"); + + const frame = page + .frames() + .find(item => item.name() === "webpack-dev-server-client-overlay"); + + const errorHandle = await frame.$("[data-can-open]"); + + await errorHandle.click(); + + await waitForExpect(() => { + expect(mockLaunchEditorCb).toHaveBeenCalledTimes(1); + }); + + fs.writeFileSync(pathToFile, originalCode); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it('should not show a warning when "client.overlay" is "false"', async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + + const devServerOptions = { + port, + client: { + overlay: false + } + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + + expect(overlayHandle).toBe(null); + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it('should not show a warning when "client.overlay.warnings" is "false"', async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + + const devServerOptions = { + port, + client: { + overlay: { + warnings: false + } + } + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + + expect(overlayHandle).toBe(null); + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should not show warning when it is filtered", async () => { + const compiler = webpack(config); + + new WarningPlugin("My special warning").apply(compiler); + + const server = new Server( + { + port, + client: { + overlay: { + warnings: error => { + // error is string in webpack 4 + const message = typeof error === "string" ? error : error.message; + return !message.includes("My special warning"); + } + } + } + }, + compiler + ); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + + expect(overlayHandle).toBe(null); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should show warning when it is not filtered", async () => { + const compiler = webpack(config); + + new WarningPlugin("Unfiltered warning").apply(compiler); + + const server = new Server( + { + port, + client: { + overlay: { + warnings: () => true + } + } + }, + compiler + ); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it('should show a warning when "client.overlay" is "true"', async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + + const devServerOptions = { + port, + client: { + overlay: true + } + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it('should show a warning when "client.overlay.warnings" is "true"', async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + + const devServerOptions = { + port, + client: { + overlay: { + warnings: true + } + } + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it('should show a warning when "client.overlay.errors" is "true"', async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + + const devServerOptions = { + port, + client: { + overlay: { + errors: true + } + } + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it('should not show an error when "client.overlay" is "false"', async () => { + const compiler = webpack(config); + + new ErrorPlugin().apply(compiler); + + const devServerOptions = { + port, + client: { + overlay: false + } + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + + expect(overlayHandle).toBe(null); + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it('should not show an error when "client.overlay.errors" is "false"', async () => { + const compiler = webpack(config); + + new ErrorPlugin().apply(compiler); + + const devServerOptions = { + port, + client: { + overlay: { + errors: false + } + } + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + + expect(overlayHandle).toBe(null); + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should not show error when it is filtered", async () => { + const compiler = webpack(config); + + new ErrorPlugin("My special error").apply(compiler); + + const server = new Server( + { + port, + client: { + overlay: { + errors: error => { + // error is string in webpack 4 + const message = typeof error === "string" ? error : error.message; + + return !message.includes("My special error"); + } + } + } + }, + compiler + ); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + + expect(overlayHandle).toBe(null); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should show error when it is not filtered", async () => { + const compiler = webpack(config); + + new ErrorPlugin("Unfiltered error").apply(compiler); + + const server = new Server( + { + port, + client: { + overlay: { + errors: () => true + } + } + }, + compiler + ); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it('should show an error when "client.overlay" is "true"', async () => { + const compiler = webpack(config); + + new ErrorPlugin().apply(compiler); + + const devServerOptions = { + port, + client: { + overlay: true + } + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + // it("should show overlay when Trusted Types are enabled", async () => { + // const compiler = webpack(trustedTypesConfig); + + // new ErrorPlugin().apply(compiler); + + // const devServerOptions = { + // port, + // client: { + // overlay: { + // trustedTypesPolicyName: "webpack#dev-overlay", + // }, + // }, + // }; + // const server = new Server(devServerOptions, compiler); + + // await server.start(); + + // const { page, browser } = await runBrowser(); + + // try { + // const consoleMessages = []; + + // page.on("console", (message) => { + // consoleMessages.push(message.text()); + // }); + + // await page.goto(`http://localhost:${port}/`, { + // waitUntil: "networkidle0", + // }); + + // // Delay for the overlay to appear + // await delay(1000); + + // const pageHtml = await page.evaluate(() => document.body.outerHTML); + // const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + // const overlayFrame = await overlayHandle.contentFrame(); + // const overlayHtml = await overlayFrame.evaluate( + // () => document.body.outerHTML, + // ); + + // expect( + // consoleMessages.filter((item) => + // /requires 'TrustedHTML' assignment/.test(item), + // ), + // ).toHaveLength(0); + // expect( + // await prettier.format(pageHtml, { + // parser: "html", + // plugins: [prettierHTML, prettierCSS], + // }), + // ).toMatchSnapshot("page html"); + // expect( + // await prettier.format(overlayHtml, { + // parser: "html", + // plugins: [prettierHTML, prettierCSS], + // }), + // ).toMatchSnapshot("overlay html"); + // } catch (error) { + // throw error; + // } finally { + // await browser.close(); + // await server.stop(); + // } + // }); + + // it("should show overlay when Trusted Types are enabled and the \"require-trusted-types-for 'script'\" header was used", async () => { + // const compiler = webpack(trustedTypesConfig); + + // new ErrorPlugin().apply(compiler); + + // const devServerOptions = { + // port, + // headers: [ + // { + // key: "Content-Security-Policy", + // value: "require-trusted-types-for 'script'", + // }, + // ], + // client: { + // overlay: { + // trustedTypesPolicyName: "webpack#dev-overlay", + // }, + // }, + // }; + // const server = new Server(devServerOptions, compiler); + + // await server.start(); + + // const { page, browser } = await runBrowser(); + + // try { + // const consoleMessages = []; + + // page.on("console", (message) => { + // consoleMessages.push(message.text()); + // }); + + // await page.goto(`http://localhost:${port}/`, { + // waitUntil: "networkidle0", + // }); + + // // Delay for the overlay to appear + // await delay(1000); + + // const pageHtml = await page.evaluate(() => document.body.outerHTML); + // const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + // const overlayFrame = await overlayHandle.contentFrame(); + // const overlayHtml = await overlayFrame.evaluate( + // () => document.body.outerHTML, + // ); + + // await page.goto(`http://localhost:${port}/`, { + // waitUntil: "networkidle0", + // }); + + // expect( + // consoleMessages.filter((item) => + // /requires 'TrustedHTML' assignment/.test(item), + // ), + // ).toHaveLength(0); + // expect( + // await prettier.format(pageHtml, { + // parser: "html", + // plugins: [prettierHTML, prettierCSS], + // }), + // ).toMatchSnapshot("page html"); + // expect( + // await prettier.format(overlayHtml, { + // parser: "html", + // plugins: [prettierHTML, prettierCSS], + // }), + // ).toMatchSnapshot("overlay html"); + // } catch (error) { + // throw error; + // } finally { + // await browser.close(); + // await server.stop(); + // } + // }); + + // it("should not show overlay when Trusted Types are enabled, but policy is not allowed", async () => { + // const compiler = webpack(trustedTypesConfig); + + // new ErrorPlugin().apply(compiler); + + // const devServerOptions = { + // port, + // client: { + // overlay: { + // trustedTypesPolicyName: "disallowed-policy", + // }, + // }, + // }; + // const server = new Server(devServerOptions, compiler); + + // await server.start(); + + // const { page, browser } = await runBrowser(); + + // try { + // await page.goto(`http://localhost:${port}/`, { + // waitUntil: "networkidle0", + // }); + + // // Delay for the overlay to appear + // await delay(1000); + + // const pageHtml = await page.evaluate(() => document.body.outerHTML); + // const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + // expect(overlayHandle).toBe(null); + // expect( + // await prettier.format(pageHtml, { + // parser: "html", + // plugins: [prettierHTML, prettierCSS], + // }), + // ).toMatchSnapshot("page html"); + // } catch (error) { + // throw error; + // } finally { + // await browser.close(); + // await server.stop(); + // } + // }); + + it('should show an error when "client.overlay.errors" is "true"', async () => { + const compiler = webpack(config); + + new ErrorPlugin().apply(compiler); + + const devServerOptions = { + port, + client: { + overlay: { + errors: true + } + } + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it('should show an error when "client.overlay.warnings" is "true"', async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + + const devServerOptions = { + port, + client: { + overlay: { + warnings: true + } + } + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should show a warning and hide them after closing connection", async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + + const devServerOptions = { port }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + const consoleMessages = []; + + page.on("console", message => { + consoleMessages.push(message.text()); + }); + + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + + await server.stop(); + + await new Promise(resolve => { + const interval = setInterval(() => { + if (consoleMessages.includes("[webpack-dev-server] Disconnected!")) { + clearInterval(interval); + + resolve(); + } + }, 100); + }); + + const pageHtmlAfterClose = await page.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtmlAfterClose, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + } + }); + + it("should show an error after invalidation", async () => { + const compiler = webpack(config); + + new ErrorPlugin("Error from compilation", 1).apply(compiler); + + const devServerOptions = { + port + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + await new Promise(resolve => { + server.middleware.invalidate(() => { + resolve(); + }); + }); + + await new Promise(resolve => { + server.middleware.waitUntilValid(() => { + resolve(); + }); + }); + + // Delay for the overlay to appear + await delay(1000); + + await page.waitForSelector("#webpack-dev-server-client-overlay"); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should show a warning after invalidation", async () => { + const compiler = webpack(config); + + new WarningPlugin("Warning from compilation", 1).apply(compiler); + + const devServerOptions = { + port + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + await new Promise(resolve => { + server.middleware.invalidate(() => { + resolve(); + }); + }); + + await new Promise(resolve => { + server.middleware.waitUntilValid(() => { + resolve(); + }); + }); + + // Delay for the overlay to appear + await delay(1000); + + await page.waitForSelector("#webpack-dev-server-client-overlay"); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should show error for uncaught runtime error", async () => { + const compiler = webpack(config); + + const server = new Server( + { + port + }, + compiler + ); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + await page.addScriptTag({ + content: `(function throwError() { + throw new Error('Injected error'); + })();` + }); + + // Delay for the overlay to appear + await delay(1000); + + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should not show filtered runtime error", async () => { + const compiler = webpack(config); + + const server = new Server( + { + port, + client: { + overlay: { + runtimeErrors: error => error && !/Injected/.test(error.message) + } + } + }, + compiler + ); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + await page.addScriptTag({ + content: `(function throwError() { + throw new Error('Injected error'); + })();` + }); + + // Delay for the overlay to appear + await delay(1000); + + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + + expect(overlayHandle).toBe(null); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should show error for uncaught promise rejection", async () => { + const compiler = webpack(config); + + const server = new Server( + { + port + }, + compiler + ); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + await page.addScriptTag({ + content: `(function throwError() { + setTimeout(function () { + Promise.reject(new Error('Async error')); + }, 0); + })();` + }); + + // Delay for the overlay to appear + await delay(1000); + + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it("should not show filtered promise rejection", async () => { + const compiler = webpack(config); + + const server = new Server( + { + port, + client: { + overlay: { + runtimeErrors: error => !/Injected/.test(error.message) + } + } + }, + compiler + ); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + await page.addScriptTag({ + content: `(function throwError() { + setTimeout(function () { + Promise.reject(new Error('Injected async error')); + }, 0); + })();` + }); + + // Delay for the overlay to appear + await delay(1000); + + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + + expect(overlayHandle).toBe(null); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); + + it('should show overlay when "Content-Security-Policy" is "default-src \'self\'" was used', async () => { + const compiler = webpack({ ...config, devtool: false }); + + new ErrorPlugin().apply(compiler); + + const devServerOptions = { + port, + headers: [ + { + key: "Content-Security-Policy", + value: "default-src 'self'" + } + ] + }; + const server = new Server(devServerOptions, compiler); + + await server.start(); + + const { page, browser } = await runBrowser(); + + try { + const consoleMessages = []; + + page.on("console", message => { + consoleMessages.push(message.text()); + }); + + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle0" + }); + + // Delay for the overlay to appear + await delay(1000); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$("#webpack-dev-server-client-overlay"); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect( + await prettier.format(pageHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("page html"); + expect( + await prettier.format(overlayHtml, { + parser: "html", + plugins: [prettierHTML, prettierCSS] + }) + ).toMatchSnapshot("overlay html"); + } catch (error) { + throw error; + } finally { + await browser.close(); + await server.stop(); + } + }); +}); diff --git a/packages/rspack-dev-server/tests/fixtures/mime-types-config/file.custom b/packages/rspack-dev-server/tests/fixtures/mime-types-config/file.custom new file mode 100644 index 00000000000..9daeafb9864 --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/mime-types-config/file.custom @@ -0,0 +1 @@ +test diff --git a/packages/rspack-dev-server/tests/fixtures/mime-types-config/foo.js b/packages/rspack-dev-server/tests/fixtures/mime-types-config/foo.js new file mode 100644 index 00000000000..739d9bd6383 --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/mime-types-config/foo.js @@ -0,0 +1,5 @@ +"use strict"; + +require("./file.custom"); + +console.log("Hey."); diff --git a/packages/rspack-dev-server/tests/fixtures/mime-types-config/webpack.config.js b/packages/rspack-dev-server/tests/fixtures/mime-types-config/webpack.config.js new file mode 100644 index 00000000000..b96e4e6aec7 --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/mime-types-config/webpack.config.js @@ -0,0 +1,30 @@ +"use strict"; + +const moduleRuleForCustom = { + test: /\.custom$/, + type: "asset/resource", + generator: { + filename: "[name][ext]" + } +}; + +module.exports = { + mode: "development", + context: __dirname, + stats: "none", + entry: "./foo.js", + output: { + path: "/" + }, + node: false, + infrastructureLogging: { + level: "warn" + }, + module: { + rules: [ + { + ...moduleRuleForCustom + } + ] + } +}; diff --git a/packages/rspack-dev-server/tests/fixtures/module-federation-config/entry1.js b/packages/rspack-dev-server/tests/fixtures/module-federation-config/entry1.js new file mode 100644 index 00000000000..dbd0f49a83e --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/module-federation-config/entry1.js @@ -0,0 +1,3 @@ +"use strict"; + +module.exports = "entry1"; diff --git a/packages/rspack-dev-server/tests/fixtures/module-federation-config/entry2.js b/packages/rspack-dev-server/tests/fixtures/module-federation-config/entry2.js new file mode 100644 index 00000000000..74f9bc577fd --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/module-federation-config/entry2.js @@ -0,0 +1,3 @@ +"use strict"; + +module.exports = "entry2"; diff --git a/packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.config.js b/packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.config.js new file mode 100644 index 00000000000..d513196fbb5 --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.config.js @@ -0,0 +1,16 @@ +"use strict"; + +module.exports = { + mode: "development", + target: "node", + stats: "none", + context: __dirname, + entry: ["./entry1.js", "./entry2.js"], + output: { + path: "/", + libraryTarget: "umd" + }, + infrastructureLogging: { + level: "warn" + } +}; diff --git a/packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.multi.config.js b/packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.multi.config.js new file mode 100644 index 00000000000..de92d76ab21 --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.multi.config.js @@ -0,0 +1,18 @@ +"use strict"; + +module.exports = [ + { + mode: "development", + target: "node", + context: __dirname, + stats: "none", + entry: ["./entry1.js", "./entry2.js"], + output: { + path: "/", + libraryTarget: "umd" + }, + infrastructureLogging: { + level: "warn" + } + } +]; diff --git a/packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.object-entry.config.js b/packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.object-entry.config.js new file mode 100644 index 00000000000..7bbc9e8daa6 --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.object-entry.config.js @@ -0,0 +1,19 @@ +"use strict"; + +module.exports = { + mode: "development", + target: "node", + stats: "none", + context: __dirname, + entry: { + foo: "./entry1.js", + main: ["./entry1.js", "./entry2.js"] + }, + output: { + path: "/", + libraryTarget: "umd" + }, + infrastructureLogging: { + level: "warn" + } +}; diff --git a/packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.plugin.js b/packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.plugin.js new file mode 100644 index 00000000000..f6ab0edfcae --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/module-federation-config/webpack.plugin.js @@ -0,0 +1,25 @@ +"use strict"; + +const ModuleFederationPlugin = + require("@rspack/core").container.ModuleFederationPlugin; + +module.exports = { + mode: "development", + target: "node", + stats: "none", + context: __dirname, + entry: ["./entry1.js"], + plugins: [ + new ModuleFederationPlugin({ + name: "app1", + library: { type: "var", name: "app1" }, + filename: "remoteEntry.js", + exposes: { + "./entry1": "./entry1" + } + }) + ], + infrastructureLogging: { + level: "warn" + } +}; diff --git a/packages/rspack-dev-server/tests/fixtures/multi-compiler-one-configuration copy/foo.js b/packages/rspack-dev-server/tests/fixtures/multi-compiler-one-configuration copy/foo.js new file mode 100644 index 00000000000..3c915dbcb8e --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/multi-compiler-one-configuration copy/foo.js @@ -0,0 +1,3 @@ +"use strict"; + +console.log("Hey."); diff --git a/packages/rspack-dev-server/tests/fixtures/multi-compiler-one-configuration copy/webpack.config.js b/packages/rspack-dev-server/tests/fixtures/multi-compiler-one-configuration copy/webpack.config.js new file mode 100644 index 00000000000..11e40ee4d5d --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/multi-compiler-one-configuration copy/webpack.config.js @@ -0,0 +1,24 @@ +"use strict"; + +const HTMLGeneratorPlugin = require("../../helpers/html-generator-plugin"); + +module.exports = [ + { + target: "web", + mode: "development", + context: __dirname, + stats: "none", + entry: "./foo.js", + output: { + path: "/" + }, + node: false, + infrastructureLogging: { + level: "info", + stream: { + write: () => {} + } + }, + plugins: [new HTMLGeneratorPlugin()] + } +]; diff --git a/packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/one.js b/packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/one.js new file mode 100644 index 00000000000..e767ff32f17 --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/one.js @@ -0,0 +1,3 @@ +"use strict"; + +console.log("one"); diff --git a/packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/two.js b/packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/two.js new file mode 100644 index 00000000000..83bf26e4bb8 --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/two.js @@ -0,0 +1,3 @@ +"use strict"; + +console.log("two"); diff --git a/packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/webpack.config.js b/packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/webpack.config.js new file mode 100644 index 00000000000..0d3aa41b8e8 --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/webpack.config.js @@ -0,0 +1,44 @@ +"use strict"; + +const HTMLGeneratorPlugin = require("../../helpers/html-generator-plugin"); + +module.exports = [ + { + target: "web", + name: "one", + mode: "development", + context: __dirname, + entry: "./one.js", + stats: "none", + output: { + path: "/", + filename: "one-[name].js" + }, + plugins: [new HTMLGeneratorPlugin()], + infrastructureLogging: { + level: "info", + stream: { + write: () => {} + } + } + }, + { + target: "web", + name: "two", + mode: "development", + context: __dirname, + entry: "./two.js", + stats: "none", + output: { + path: "/", + filename: "two-[name].js" + }, + plugins: [new HTMLGeneratorPlugin()], + infrastructureLogging: { + level: "info", + stream: { + write: () => {} + } + } + } +]; diff --git a/packages/rspack-dev-server/tests/fixtures/overlay-config/foo.js b/packages/rspack-dev-server/tests/fixtures/overlay-config/foo.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/rspack-dev-server/tests/fixtures/overlay-config/trusted-types.webpack.config.js b/packages/rspack-dev-server/tests/fixtures/overlay-config/trusted-types.webpack.config.js new file mode 100644 index 00000000000..5cfa4ecfef2 --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/overlay-config/trusted-types.webpack.config.js @@ -0,0 +1,21 @@ +"use strict"; + +const HTMLGeneratorPlugin = require("../../helpers/trusted-types-html-generator-plugin"); + +module.exports = { + mode: "development", + context: __dirname, + stats: "none", + entry: "./foo.js", + output: { + path: "/", + trustedTypes: { policyName: "webpack" } + }, + infrastructureLogging: { + level: "info", + stream: { + write: () => {} + } + }, + plugins: [new HTMLGeneratorPlugin()] +}; diff --git a/packages/rspack-dev-server/tests/fixtures/overlay-config/webpack.config.js b/packages/rspack-dev-server/tests/fixtures/overlay-config/webpack.config.js new file mode 100644 index 00000000000..16bae608229 --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/overlay-config/webpack.config.js @@ -0,0 +1,20 @@ +"use strict"; + +const HTMLGeneratorPlugin = require("../../helpers/html-generator-plugin"); + +module.exports = { + mode: "development", + context: __dirname, + stats: "none", + entry: "./foo.js", + output: { + path: "/" + }, + infrastructureLogging: { + level: "info", + stream: { + write: () => {} + } + }, + plugins: [new HTMLGeneratorPlugin()] +}; diff --git a/packages/rspack-dev-server/tests/fixtures/reload-config/main.css b/packages/rspack-dev-server/tests/fixtures/reload-config/main.css deleted file mode 100644 index 585e8f34510..00000000000 --- a/packages/rspack-dev-server/tests/fixtures/reload-config/main.css +++ /dev/null @@ -1 +0,0 @@ -body { background-color: rgb(0, 0, 255); } \ No newline at end of file diff --git a/packages/rspack-dev-server/tests/fixtures/reload-config/webpack.config.js b/packages/rspack-dev-server/tests/fixtures/reload-config/webpack.config.js index 58a634a77a4..f85af87b103 100644 --- a/packages/rspack-dev-server/tests/fixtures/reload-config/webpack.config.js +++ b/packages/rspack-dev-server/tests/fixtures/reload-config/webpack.config.js @@ -10,16 +10,13 @@ module.exports = { output: { path: "/" }, - experiments: { - css: true - }, module: { - // rules: [ - // { - // test: /\.css$/, - // use: [{ loader: "style-loader" }, { loader: "css-loader" }], - // }, - // ], + rules: [ + { + test: /\.css$/, + use: [{ loader: "style-loader" }, { loader: "css-loader" }] + } + ] }, infrastructureLogging: { level: "info", diff --git a/packages/rspack-dev-server/tests/fixtures/universal-compiler-config/browser.js b/packages/rspack-dev-server/tests/fixtures/universal-compiler-config/browser.js new file mode 100644 index 00000000000..ddcebf29c76 --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/universal-compiler-config/browser.js @@ -0,0 +1,3 @@ +"use strict"; + +console.log("Hello from the browser"); diff --git a/packages/rspack-dev-server/tests/fixtures/universal-compiler-config/server.js b/packages/rspack-dev-server/tests/fixtures/universal-compiler-config/server.js new file mode 100644 index 00000000000..3dfb585f6d8 --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/universal-compiler-config/server.js @@ -0,0 +1,3 @@ +"use strict"; + +console.log("Hello from the server"); diff --git a/packages/rspack-dev-server/tests/fixtures/universal-compiler-config/webpack.config.js b/packages/rspack-dev-server/tests/fixtures/universal-compiler-config/webpack.config.js new file mode 100644 index 00000000000..1ddc7f280b5 --- /dev/null +++ b/packages/rspack-dev-server/tests/fixtures/universal-compiler-config/webpack.config.js @@ -0,0 +1,43 @@ +"use strict"; + +const HTMLGeneratorPlugin = require("../../helpers/html-generator-plugin"); + +module.exports = [ + { + name: "browser", + mode: "development", + context: __dirname, + stats: "none", + entry: "./browser.js", + output: { + path: "/", + filename: "browser.js" + }, + plugins: [new HTMLGeneratorPlugin()], + infrastructureLogging: { + level: "info", + stream: { + write: () => {} + } + } + }, + { + name: "server", + mode: "development", + context: __dirname, + target: "node", + stats: "none", + entry: "./server.js", + output: { + path: "/", + filename: "server.js" + }, + plugins: [new HTMLGeneratorPlugin()], + infrastructureLogging: { + level: "info", + stream: { + write: () => {} + } + } + } +]; diff --git a/packages/rspack-dev-server/tests/helpers/html-generator-plugin.js b/packages/rspack-dev-server/tests/helpers/html-generator-plugin.js index 2db3b6bddcf..e8da3b941ac 100644 --- a/packages/rspack-dev-server/tests/helpers/html-generator-plugin.js +++ b/packages/rspack-dev-server/tests/helpers/html-generator-plugin.js @@ -65,7 +65,7 @@ module.exports = class HTMLGeneratorPlugin { for (const asset of assets) { const assetName = asset.name; - if (assetName !== "main.js") { + if (assetName !== "main.js" && assetName.endsWith(".js")) { const assetSource = new RawSource( HTMLContentForAssets(assetName) ); diff --git a/packages/rspack-dev-server/tests/helpers/trusted-types-html-generator-plugin.js b/packages/rspack-dev-server/tests/helpers/trusted-types-html-generator-plugin.js new file mode 100644 index 00000000000..ee647d3d4ef --- /dev/null +++ b/packages/rspack-dev-server/tests/helpers/trusted-types-html-generator-plugin.js @@ -0,0 +1,82 @@ +"use strict"; + +const HTMLContentForIndex = ` + + + + + + webpack-dev-server + + +

webpack-dev-server is running...

+ + + +`; + +const HTMLContentForTest = ` + + + + + + test + + +

Created via HTMLGeneratorPlugin

+ + +`; + +module.exports = class HTMLGeneratorPlugin { + // eslint-disable-next-line class-methods-use-this + apply(compiler) { + const pluginName = "html-generator-plugin"; + + compiler.hooks.thisCompilation.tap(pluginName, compilation => { + if (compiler.webpack) { + const { RawSource } = compiler.webpack.sources; + + compilation.hooks.processAssets.tap( + { + name: pluginName, + stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL + }, + () => { + const indexSource = new RawSource(HTMLContentForIndex); + const testSource = new RawSource(HTMLContentForTest); + + compilation.emitAsset("index.html", indexSource); + compilation.emitAsset("test.html", testSource); + } + ); + } else { + compilation.hooks.additionalAssets.tap(pluginName, () => { + compilation.emitAsset("index.html", { + source() { + return HTMLContentForIndex; + }, + size() { + return HTMLContentForIndex.length; + } + }); + compilation.emitAsset("test.html", { + source() { + return HTMLContentForTest; + }, + size() { + return HTMLContentForTest.length; + } + }); + }); + } + }); + } +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0545c1a9ee3..fcb65209272 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -555,6 +555,9 @@ importers: '@types/ws': specifier: 8.5.10 version: 8.5.10 + css-loader: + specifier: ^6.11.0 + version: 6.11.0(@rspack/core@packages+rspack)(webpack@5.94.0(webpack-cli@5.1.4(webpack@5.94.0))) graceful-fs: specifier: 4.2.10 version: 4.2.10(patch_hash=ivtm2a2cfr5pomcfbedhmr5v2q) @@ -564,12 +567,21 @@ importers: jest-serializer-path: specifier: ^0.1.15 version: 0.1.15 + prettier: + specifier: 3.2.5 + version: 3.2.5 puppeteer: specifier: ^23.2.2 version: 23.3.0(typescript@5.0.2) + require-from-string: + specifier: ^2.0.2 + version: 2.0.2 sockjs-client: specifier: ^1.6.1 version: 1.6.1 + style-loader: + specifier: ^3.3.3 + version: 3.3.4(webpack@5.94.0(webpack-cli@5.1.4(webpack@5.94.0))) supertest: specifier: ^6.1.3 version: 6.3.4 @@ -579,6 +591,9 @@ importers: typescript: specifier: 5.0.2 version: 5.0.2 + wait-for-expect: + specifier: ^3.0.2 + version: 3.0.2 packages/rspack-test-tools: dependencies: @@ -9438,6 +9453,9 @@ packages: wabt@1.0.0-nightly.20180421: resolution: {integrity: sha512-bsu9zk672KACjoabONcAS94IS20prRm05IbiIUGfa8eBpRLjWZv8ugocdinV/ONh0mFMfXrVWkvF1/BNtwIfUw==} + wait-for-expect@3.0.2: + resolution: {integrity: sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag==} + walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} @@ -20087,6 +20105,8 @@ snapshots: wabt@1.0.0-nightly.20180421: {} + wait-for-expect@3.0.2: {} + walker@1.0.8: dependencies: makeerror: 1.0.12 From 3157faa31782150c3677becbe8dbe64c5b77323b Mon Sep 17 00:00:00 2001 From: LingyuCoder Date: Mon, 9 Sep 2024 11:11:18 +0800 Subject: [PATCH 03/11] test(dev-sever): add e2e test cases part 2 --- .../overlay.test.js.snap.webpack5 | 484 +++++++++--------- .../tests/e2e/overlay.test.js | 1 + .../tests/helpers/normalize.js | 48 ++ 3 files changed, 291 insertions(+), 242 deletions(-) create mode 100644 packages/rspack-dev-server/tests/helpers/normalize.js diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/overlay.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/overlay.test.js.snap.webpack5 index 61884866d22..1c714713b20 100644 --- a/packages/rspack-dev-server/tests/e2e/__snapshots__/overlay.test.js.snap.webpack5 +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/overlay.test.js.snap.webpack5 @@ -1,39 +1,39 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`overlay should not show a warning when "client.overlay" is "false": page html 1`] = ` -" +

webpack-dev-server is running...

-" + `; exports[`overlay should not show a warning when "client.overlay.warnings" is "false": page html 1`] = ` -" +

webpack-dev-server is running...

-" + `; exports[`overlay should not show an error when "client.overlay" is "false": page html 1`] = ` -" +

webpack-dev-server is running...

-" + `; exports[`overlay should not show an error when "client.overlay.errors" is "false": page html 1`] = ` -" +

webpack-dev-server is running...

-" + `; exports[`overlay should not show initially, then show on an error and allow to close: overlay html 1`] = ` -" +
+

webpack-dev-server is running...

-" + `; exports[`overlay should not show initially, then show on an error and allow to close: page html initial 1`] = ` -" +

webpack-dev-server is running...

-" + `; exports[`overlay should not show initially, then show on an error and allow to close: page html with error 1`] = ` -" +

webpack-dev-server is running...

@@ -154,11 +154,11 @@ exports[`overlay should not show initially, then show on an error and allow to c " > -" + `; exports[`overlay should not show initially, then show on an error, then hide on fix: overlay html 1`] = ` -" +
+

webpack-dev-server is running...

-" + `; exports[`overlay should not show initially, then show on an error, then hide on fix: page html initial 1`] = ` -" +

webpack-dev-server is running...

-" + `; exports[`overlay should not show initially, then show on an error, then hide on fix: page html with error 1`] = ` -" +

webpack-dev-server is running...

@@ -279,11 +279,11 @@ exports[`overlay should not show initially, then show on an error, then hide on " > -" + `; exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: overlay html 1`] = ` -" +
+
+

webpack-dev-server is running...

-" + `; exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: page html initial 1`] = ` -" +

webpack-dev-server is running...

-" + `; exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: page html with error 1`] = ` -" +

webpack-dev-server is running...

@@ -492,11 +492,11 @@ exports[`overlay should not show initially, then show on an error, then show oth " > -" + `; exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: page html with other error 1`] = ` -" +

webpack-dev-server is running...

@@ -513,11 +513,11 @@ exports[`overlay should not show initially, then show on an error, then show oth " > -" + `; exports[`overlay should show a warning after invalidation: overlay html 1`] = ` -" +
⚠ Error: Warning from compilation │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + (/tests/e2e/overlay.test.js:58:35) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show a warning after invalidation: page html 1`] = ` -" +

webpack-dev-server is running...

@@ -629,11 +629,11 @@ exports[`overlay should show a warning after invalidation: page html 1`] = ` " > -" + `; exports[`overlay should show a warning and error for initial compilation and protects against xss: overlay html 1`] = ` -" +
⚠ Error: <strong>strong</strong> │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + (/tests/e2e/overlay.test.js:58:35) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
× Error: <strong>strong</strong> │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + (/tests/e2e/overlay.test.js:33:31) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show a warning and error for initial compilation and protects against xss: page html 1`] = ` -" +

webpack-dev-server is running...

@@ -783,11 +783,11 @@ exports[`overlay should show a warning and error for initial compilation and pro " > -" + `; exports[`overlay should show a warning and error for initial compilation: overlay html 1`] = ` -" +
⚠ Error: Warning from compilation │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + (/tests/e2e/overlay.test.js:58:35) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
⚠ Error: Warning from compilation │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + (/tests/e2e/overlay.test.js:58:35) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
× Error: Error from compilation. Can't find 'test' module. │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + (/tests/e2e/overlay.test.js:33:31) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
× Error: Error from compilation. Can't find 'test' module. │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + (/tests/e2e/overlay.test.js:33:31) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
× Error: Error from compilation. Can't find 'test' module. │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + (/tests/e2e/overlay.test.js:33:31) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show a warning and error for initial compilation: page html 1`] = ` -" +

webpack-dev-server is running...

@@ -1054,11 +1054,11 @@ exports[`overlay should show a warning and error for initial compilation: page h " > -" + `; exports[`overlay should show a warning and hide them after closing connection: overlay html 1`] = ` -" +
⚠ Error: Warning from compilation │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + (/tests/e2e/overlay.test.js:58:35) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show a warning and hide them after closing connection: page html 1`] = ` -" +

webpack-dev-server is running...

@@ -1170,19 +1170,19 @@ exports[`overlay should show a warning and hide them after closing connection: p " > -" + `; exports[`overlay should show a warning and hide them after closing connection: page html 2`] = ` -" +

webpack-dev-server is running...

-" + `; exports[`overlay should show a warning for initial compilation: overlay html 1`] = ` -" +
⚠ Error: Warning from compilation │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + (/tests/e2e/overlay.test.js:58:35) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show a warning for initial compilation: page html 1`] = ` -" +

webpack-dev-server is running...

@@ -1294,11 +1294,11 @@ exports[`overlay should show a warning for initial compilation: page html 1`] = " > -" + `; exports[`overlay should show a warning when "client.overlay" is "true": overlay html 1`] = ` -" +
⚠ Error: Warning from compilation │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + (/tests/e2e/overlay.test.js:58:35) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show a warning when "client.overlay" is "true": page html 1`] = ` -" +

webpack-dev-server is running...

@@ -1410,11 +1410,11 @@ exports[`overlay should show a warning when "client.overlay" is "true": page htm " > -" + `; exports[`overlay should show a warning when "client.overlay.errors" is "true": overlay html 1`] = ` -" +
⚠ Error: Warning from compilation │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + (/tests/e2e/overlay.test.js:58:35) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show a warning when "client.overlay.errors" is "true": page html 1`] = ` -" +

webpack-dev-server is running...

@@ -1526,11 +1526,11 @@ exports[`overlay should show a warning when "client.overlay.errors" is "true": p " > -" + `; exports[`overlay should show a warning when "client.overlay.warnings" is "true": overlay html 1`] = ` -" +
⚠ Error: Warning from compilation │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + (/tests/e2e/overlay.test.js:58:35) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show a warning when "client.overlay.warnings" is "true": page html 1`] = ` -" +

webpack-dev-server is running...

@@ -1642,11 +1642,11 @@ exports[`overlay should show a warning when "client.overlay.warnings" is "true": " > -" + `; exports[`overlay should show an ansi formatted error for initial compilation: overlay html 1`] = ` -" +
│ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + (/tests/e2e/overlay.test.js:33:31) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show an ansi formatted error for initial compilation: page html 1`] = ` -" +

webpack-dev-server is running...

@@ -1779,11 +1779,11 @@ exports[`overlay should show an ansi formatted error for initial compilation: pa " > -" + `; exports[`overlay should show an error after invalidation: overlay html 1`] = ` -" +
× Error: Error from compilation │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + (/tests/e2e/overlay.test.js:33:31) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show an error after invalidation: page html 1`] = ` -" +

webpack-dev-server is running...

@@ -1895,11 +1895,11 @@ exports[`overlay should show an error after invalidation: page html 1`] = ` " > -" + `; exports[`overlay should show an error for initial compilation: overlay html 1`] = ` -" +
+

webpack-dev-server is running...

@@ -2012,11 +2012,11 @@ exports[`overlay should show an error for initial compilation: page html 1`] = ` " > -" + `; exports[`overlay should show an error when "client.overlay" is "true": overlay html 1`] = ` -" +
× Error: Error from compilation. Can't find 'test' module. │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + (/tests/e2e/overlay.test.js:33:31) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show an error when "client.overlay" is "true": page html 1`] = ` -" +

webpack-dev-server is running...

@@ -2129,11 +2129,11 @@ exports[`overlay should show an error when "client.overlay" is "true": page html " > -" + `; exports[`overlay should show an error when "client.overlay.errors" is "true": overlay html 1`] = ` -" +
× Error: Error from compilation. Can't find 'test' module. │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + (/tests/e2e/overlay.test.js:33:31) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show an error when "client.overlay.errors" is "true": page html 1`] = ` -" +

webpack-dev-server is running...

@@ -2246,11 +2246,11 @@ exports[`overlay should show an error when "client.overlay.errors" is "true": pa " > -" + `; exports[`overlay should show an error when "client.overlay.warnings" is "true": overlay html 1`] = ` -" +
⚠ Error: Warning from compilation │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + (/tests/e2e/overlay.test.js:58:35) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show an error when "client.overlay.warnings" is "true": page html 1`] = ` -" +

webpack-dev-server is running...

@@ -2362,11 +2362,11 @@ exports[`overlay should show an error when "client.overlay.warnings" is "true": " > -" + `; exports[`overlay should show error for uncaught promise rejection: overlay html 1`] = ` -" +
+
+
× Error: Unfiltered error │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + (/tests/e2e/overlay.test.js:33:31) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show error when it is not filtered: page html 1`] = ` -" +

webpack-dev-server is running...

@@ -2647,11 +2647,11 @@ exports[`overlay should show error when it is not filtered: page html 1`] = ` " > -" + `; exports[`overlay should show overlay when "Content-Security-Policy" is "default-src 'self'" was used: overlay html 1`] = ` -" +
× Error: Error from compilation. Can't find 'test' module. │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:34:33) + (/tests/e2e/overlay.test.js:33:31) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show overlay when "Content-Security-Policy" is "default-src 'self'" was used: page html 1`] = ` -" +

webpack-dev-server is running...

@@ -2764,11 +2764,11 @@ exports[`overlay should show overlay when "Content-Security-Policy" is "default- " > -" + `; exports[`overlay should show warning when it is not filtered: overlay html 1`] = ` -" +
⚠ Error: Unfiltered warning │ at Object.fn - (/Users/bytedance/rspack-dev/rspack/packages/rspack-dev-server/tests/e2e/overlay.test.js:60:35) + (/tests/e2e/overlay.test.js:58:35) │ at SyncHook.callAsyncStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) │ at SyncHook.callStageRange - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) │ at QueriedHook.call - (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) │ at - /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:570:21 │ at last.function - (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js:862:28)
-" + `; exports[`overlay should show warning when it is not filtered: page html 1`] = ` -" +

webpack-dev-server is running...

@@ -2880,5 +2880,5 @@ exports[`overlay should show warning when it is not filtered: page html 1`] = ` " > -" + `; diff --git a/packages/rspack-dev-server/tests/e2e/overlay.test.js b/packages/rspack-dev-server/tests/e2e/overlay.test.js index 2b33045a31f..8b1ccc6adad 100644 --- a/packages/rspack-dev-server/tests/e2e/overlay.test.js +++ b/packages/rspack-dev-server/tests/e2e/overlay.test.js @@ -9,6 +9,7 @@ const config = require("../fixtures/overlay-config/webpack.config"); const trustedTypesConfig = require("../fixtures/overlay-config/trusted-types.webpack.config"); const runBrowser = require("../helpers/run-browser"); const port = require("../helpers/ports-map").overlay; +require("../helpers/normalize"); class ErrorPlugin { constructor(message, skipCounter) { diff --git a/packages/rspack-dev-server/tests/helpers/normalize.js b/packages/rspack-dev-server/tests/helpers/normalize.js new file mode 100644 index 00000000000..a00f5c355b5 --- /dev/null +++ b/packages/rspack-dev-server/tests/helpers/normalize.js @@ -0,0 +1,48 @@ +const path = require("path"); + +const CURRENT_CWD = process.cwd(); +const ROOT = path.resolve(__dirname, "../../../../"); + +const quoteMeta = str => str.replace(/[-[\]\\/{}()*+?.^$|]/g, "\\$&"); +const cwdRegExp = new RegExp( + `${quoteMeta(CURRENT_CWD)}((?:\\\\)?(?:[a-zA-Z.\\-_]+\\\\)*)`, + "g" +); +const escapedCwd = JSON.stringify(CURRENT_CWD).slice(1, -1); +const escapedCwdRegExp = new RegExp( + `${quoteMeta(escapedCwd)}((?:\\\\\\\\)?(?:[a-zA-Z.\\-_]+\\\\\\\\)*)`, + "g" +); +const normalize = str => { + let normalizedStr = str; + if (CURRENT_CWD.startsWith("/")) { + normalizedStr = normalizedStr.replace( + new RegExp(quoteMeta(CURRENT_CWD), "g"), + "" + ); + } else { + normalizedStr = normalizedStr.replace( + cwdRegExp, + (_, g) => `${g.replace(/\\/g, "/")}` + ); + normalizedStr = normalizedStr.replace( + escapedCwdRegExp, + (_, g) => `${g.replace(/\\\\/g, "/")}` + ); + } + normalizedStr = normalizedStr.split(ROOT).join(""); + normalizedStr = normalizedStr.replace( + /@@ -\d+,\d+ \+\d+,\d+ @@/g, + "@@ ... @@" + ); + return normalizedStr; +}; + +expect.addSnapshotSerializer({ + test(value) { + return typeof value === "string"; + }, + print(received) { + return normalize(received); + } +}); From 41f9dc6c2c0a669aa9ba215d4a0052e7f4c8f4ac Mon Sep 17 00:00:00 2001 From: LingyuCoder Date: Mon, 9 Sep 2024 11:25:59 +0800 Subject: [PATCH 04/11] test(dev-sever): add e2e test cases part 2 --- .../overlay.test.js.snap.webpack5 | 270 +++++++++--------- .../tests/helpers/normalize.js | 1 + 2 files changed, 136 insertions(+), 135 deletions(-) diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/overlay.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/overlay.test.js.snap.webpack5 index 1c714713b20..80adb4be5bf 100644 --- a/packages/rspack-dev-server/tests/e2e/__snapshots__/overlay.test.js.snap.webpack5 +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/overlay.test.js.snap.webpack5 @@ -592,17 +592,17 @@ exports[`overlay should show a warning after invalidation: overlay html 1`] = ` " > ⚠ Error: Warning from compilation │ at Object.fn - (/tests/e2e/overlay.test.js:58:35) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::) @@ -708,17 +708,17 @@ exports[`overlay should show a warning and error for initial compilation and pro " > ⚠ Error: <strong>strong</strong> │ at Object.fn - (/tests/e2e/overlay.test.js:58:35) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::)
× Error: <strong>strong</strong> │ at Object.fn - (/tests/e2e/overlay.test.js:33:31) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::)
@@ -862,17 +862,17 @@ exports[`overlay should show a warning and error for initial compilation: overla " > ⚠ Error: Warning from compilation │ at Object.fn - (/tests/e2e/overlay.test.js:58:35) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::)
⚠ Error: Warning from compilation │ at Object.fn - (/tests/e2e/overlay.test.js:58:35) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::)
× Error: Error from compilation. Can't find 'test' module. │ at Object.fn - (/tests/e2e/overlay.test.js:33:31) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::)
× Error: Error from compilation. Can't find 'test' module. │ at Object.fn - (/tests/e2e/overlay.test.js:33:31) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::)
× Error: Error from compilation. Can't find 'test' module. │ at Object.fn - (/tests/e2e/overlay.test.js:33:31) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::)
@@ -1133,17 +1133,17 @@ exports[`overlay should show a warning and hide them after closing connection: o " > ⚠ Error: Warning from compilation │ at Object.fn - (/tests/e2e/overlay.test.js:58:35) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::) @@ -1257,17 +1257,17 @@ exports[`overlay should show a warning for initial compilation: overlay html 1`] " > ⚠ Error: Warning from compilation │ at Object.fn - (/tests/e2e/overlay.test.js:58:35) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::) @@ -1373,17 +1373,17 @@ exports[`overlay should show a warning when "client.overlay" is "true": overlay " > ⚠ Error: Warning from compilation │ at Object.fn - (/tests/e2e/overlay.test.js:58:35) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::) @@ -1489,17 +1489,17 @@ exports[`overlay should show a warning when "client.overlay.errors" is "true": o " > ⚠ Error: Warning from compilation │ at Object.fn - (/tests/e2e/overlay.test.js:58:35) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::) @@ -1605,17 +1605,17 @@ exports[`overlay should show a warning when "client.overlay.warnings" is "true": " > ⚠ Error: Warning from compilation │ at Object.fn - (/tests/e2e/overlay.test.js:58:35) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::) @@ -1741,17 +1741,17 @@ exports[`overlay should show an ansi formatted error for initial compilation: ov " > │ at Object.fn - (/tests/e2e/overlay.test.js:33:31) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::) @@ -1858,17 +1858,17 @@ exports[`overlay should show an error after invalidation: overlay html 1`] = ` " > × Error: Error from compilation │ at Object.fn - (/tests/e2e/overlay.test.js:33:31) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::) @@ -1975,17 +1975,17 @@ exports[`overlay should show an error for initial compilation: overlay html 1`] > × Error: Error from compilation. Can't find 'test' module. │ at Object.fn - (/tests/e2e/overlay.test.js:33:31) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::) @@ -2092,17 +2092,17 @@ exports[`overlay should show an error when "client.overlay" is "true": overlay h > × Error: Error from compilation. Can't find 'test' module. │ at Object.fn - (/tests/e2e/overlay.test.js:33:31) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::) @@ -2209,17 +2209,17 @@ exports[`overlay should show an error when "client.overlay.errors" is "true": ov > × Error: Error from compilation. Can't find 'test' module. │ at Object.fn - (/tests/e2e/overlay.test.js:33:31) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::) @@ -2325,17 +2325,17 @@ exports[`overlay should show an error when "client.overlay.warnings" is "true": " > ⚠ Error: Warning from compilation │ at Object.fn - (/tests/e2e/overlay.test.js:58:35) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::) @@ -2440,7 +2440,7 @@ exports[`overlay should show error for uncaught promise rejection: overlay html font-family: Menlo, Consolas, monospace; " > - Async error at <anonymous>:3:26 + Async error at <anonymous>:: @@ -2524,8 +2524,8 @@ exports[`overlay should show error for uncaught runtime error: overlay html 1`] font-family: Menlo, Consolas, monospace; " > - Injected error at throwError (<anonymous>:2:15) at - <anonymous>:3:9 + Injected error at throwError (<anonymous>::) at + <anonymous>:: @@ -2610,17 +2610,17 @@ exports[`overlay should show error when it is not filtered: overlay html 1`] = ` " > × Error: Unfiltered error │ at Object.fn - (/tests/e2e/overlay.test.js:33:31) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::) @@ -2727,17 +2727,17 @@ exports[`overlay should show overlay when "Content-Security-Policy" is "default- > × Error: Error from compilation. Can't find 'test' module. │ at Object.fn - (/tests/e2e/overlay.test.js:33:31) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::) @@ -2843,17 +2843,17 @@ exports[`overlay should show warning when it is not filtered: overlay html 1`] = " > ⚠ Error: Unfiltered warning │ at Object.fn - (/tests/e2e/overlay.test.js:58:35) + (/tests/e2e/overlay.test.js::) │ at SyncHook.callAsyncStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at SyncHook.callStageRange - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at QueriedHook.call - (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) + (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) │ at - /packages/rspack/dist/Compiler.js:570:21 + /packages/rspack/dist/Compiler.js:: │ at last.function - (/packages/rspack/dist/Compiler.js:862:28) + (/packages/rspack/dist/Compiler.js::) diff --git a/packages/rspack-dev-server/tests/helpers/normalize.js b/packages/rspack-dev-server/tests/helpers/normalize.js index a00f5c355b5..092911a4123 100644 --- a/packages/rspack-dev-server/tests/helpers/normalize.js +++ b/packages/rspack-dev-server/tests/helpers/normalize.js @@ -31,6 +31,7 @@ const normalize = str => { ); } normalizedStr = normalizedStr.split(ROOT).join(""); + normalizedStr = normalizedStr.replace(/:\d+:\d+/g, "::"); normalizedStr = normalizedStr.replace( /@@ -\d+,\d+ \+\d+,\d+ @@/g, "@@ ... @@" From eb08d30b016946f0e34c813ce3b592be1cfebd05 Mon Sep 17 00:00:00 2001 From: LingyuCoder Date: Mon, 9 Sep 2024 12:19:16 +0800 Subject: [PATCH 05/11] test(dev-sever): add e2e test cases part 2 --- .../hot-and-live-reload.test.js.snap.webpack5 | 11 - .../logging.test.js.snap.webpack5 | 344 +++++++++--------- .../tests/e2e/logging.test.js | 11 +- .../multi-compiler-two-configurations/one.js | 1 + 4 files changed, 175 insertions(+), 192 deletions(-) diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/hot-and-live-reload.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/hot-and-live-reload.test.js.snap.webpack5 index 6852412574b..3d7a793295a 100644 --- a/packages/rspack-dev-server/tests/e2e/__snapshots__/hot-and-live-reload.test.js.snap.webpack5 +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/hot-and-live-reload.test.js.snap.webpack5 @@ -383,14 +383,3 @@ exports[`hot and live reload should work with manual client setup and allow to e `; exports[`hot and live reload should work with manual client setup and allow to enable live reload (default): page errors 1`] = `[]`; - -exports[`hot disabled HMR plugin should NOT register the HMR plugin before compilation is complete: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "Hey.", -] -`; - -exports[`hot disabled HMR plugin should NOT register the HMR plugin before compilation is complete: page errors 1`] = `[]`; - -exports[`hot disabled HMR plugin should NOT register the HMR plugin before compilation is complete: response status 1`] = `200`; diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 index e761c6cac7e..6258a968c9f 100644 --- a/packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 @@ -2,332 +2,332 @@ exports[`logging should work and do not log messages about hot and live reloading is enabled (sockjs) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading disabled, Progress disabled, Overlay enabled.", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading disabled, Progress disabled, Overlay enabled., + Hey., ] `; exports[`logging should work and do not log messages about hot and live reloading is enabled (ws) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading disabled, Progress disabled, Overlay enabled.", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading disabled, Progress disabled, Overlay enabled., + Hey., ] `; exports[`logging should work and log errors by default (sockjs) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", - "[webpack-dev-server] Errors while compiling. Reload prevented.", - "[webpack-dev-server] ERROR + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., + [webpack-dev-server] Errors while compiling. Reload prevented., + [webpack-dev-server] ERROR × Error: Error from compilation - │ at Object.fn (/tests/e2e/logging.test.js:90:43) - │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) - │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) - │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) - │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 - │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) -", + │ at Object.fn (/tests/e2e/logging.test.js::) + │ at SyncHook.callAsyncStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at SyncHook.callStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at QueriedHook.call (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at /packages/rspack/dist/Compiler.js:: + │ at last.function (/packages/rspack/dist/Compiler.js::) +, ] `; exports[`logging should work and log errors by default (ws) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", - "[webpack-dev-server] Errors while compiling. Reload prevented.", - "[webpack-dev-server] ERROR + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., + [webpack-dev-server] Errors while compiling. Reload prevented., + [webpack-dev-server] ERROR × Error: Error from compilation - │ at Object.fn (/tests/e2e/logging.test.js:90:43) - │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) - │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) - │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) - │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 - │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) -", + │ at Object.fn (/tests/e2e/logging.test.js::) + │ at SyncHook.callAsyncStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at SyncHook.callStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at QueriedHook.call (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at /packages/rspack/dist/Compiler.js:: + │ at last.function (/packages/rspack/dist/Compiler.js::) +, ] `; exports[`logging should work and log message about live reloading is enabled (sockjs) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled., + Hey., ] `; exports[`logging should work and log message about live reloading is enabled (ws) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement disabled, Live Reloading enabled, Progress disabled, Overlay enabled., + Hey., ] `; exports[`logging should work and log messages about hot and live reloading is enabled (sockjs) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; exports[`logging should work and log messages about hot and live reloading is enabled (sockjs) 2`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; exports[`logging should work and log messages about hot and live reloading is enabled (sockjs) 3`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; exports[`logging should work and log messages about hot and live reloading is enabled (ws) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; exports[`logging should work and log messages about hot and live reloading is enabled (ws) 2`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; exports[`logging should work and log messages about hot and live reloading is enabled (ws) 3`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; exports[`logging should work and log messages about hot is enabled (sockjs) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; exports[`logging should work and log messages about hot is enabled (ws) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading disabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; exports[`logging should work and log only error (sockjs) 1`] = ` [ - "Hey.", - "[webpack-dev-server] Errors while compiling. Reload prevented.", - "[webpack-dev-server] ERROR + Hey., + [webpack-dev-server] Errors while compiling. Reload prevented., + [webpack-dev-server] ERROR × Error: Error from compilation - │ at Object.fn (/tests/e2e/logging.test.js:143:43) - │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) - │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) - │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) - │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 - │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) -", + │ at Object.fn (/tests/e2e/logging.test.js::) + │ at SyncHook.callAsyncStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at SyncHook.callStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at QueriedHook.call (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at /packages/rspack/dist/Compiler.js:: + │ at last.function (/packages/rspack/dist/Compiler.js::) +, ] `; exports[`logging should work and log only error (ws) 1`] = ` [ - "Hey.", - "[webpack-dev-server] Errors while compiling. Reload prevented.", - "[webpack-dev-server] ERROR + Hey., + [webpack-dev-server] Errors while compiling. Reload prevented., + [webpack-dev-server] ERROR × Error: Error from compilation - │ at Object.fn (/tests/e2e/logging.test.js:143:43) - │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) - │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) - │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) - │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 - │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) -", + │ at Object.fn (/tests/e2e/logging.test.js::) + │ at SyncHook.callAsyncStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at SyncHook.callStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at QueriedHook.call (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at /packages/rspack/dist/Compiler.js:: + │ at last.function (/packages/rspack/dist/Compiler.js::) +, ] `; exports[`logging should work and log static changes (sockjs) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", - "[webpack-dev-server] "/tests/fixtures/client-config/static/foo.txt" from static directory was changed. Reloading...", - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., + [webpack-dev-server] "/tests/fixtures/client-config/static/foo.txt" from static directory was changed. Reloading..., + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; exports[`logging should work and log static changes (ws) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", - "[webpack-dev-server] "/tests/fixtures/client-config/static/foo.txt" from static directory was changed. Reloading...", - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., + [webpack-dev-server] "/tests/fixtures/client-config/static/foo.txt" from static directory was changed. Reloading..., + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; exports[`logging should work and log warning and errors (sockjs) 1`] = ` [ - "Hey.", - "[webpack-dev-server] Warnings while compiling.", - "[webpack-dev-server] WARNING + Hey., + [webpack-dev-server] Warnings while compiling., + [webpack-dev-server] WARNING ⚠ Error: Warning from compilation - │ at Object.fn (/tests/e2e/logging.test.js:167:21) - │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) - │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) - │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) - │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 - │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) -", - "[webpack-dev-server] Errors while compiling. Reload prevented.", - "[webpack-dev-server] ERROR + │ at Object.fn (/tests/e2e/logging.test.js::) + │ at SyncHook.callAsyncStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at SyncHook.callStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at QueriedHook.call (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at /packages/rspack/dist/Compiler.js:: + │ at last.function (/packages/rspack/dist/Compiler.js::) +, + [webpack-dev-server] Errors while compiling. Reload prevented., + [webpack-dev-server] ERROR × Error: Error from compilation - │ at Object.fn (/tests/e2e/logging.test.js:169:43) - │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) - │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) - │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) - │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 - │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) -", + │ at Object.fn (/tests/e2e/logging.test.js::) + │ at SyncHook.callAsyncStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at SyncHook.callStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at QueriedHook.call (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at /packages/rspack/dist/Compiler.js:: + │ at last.function (/packages/rspack/dist/Compiler.js::) +, ] `; exports[`logging should work and log warning and errors (ws) 1`] = ` [ - "Hey.", - "[webpack-dev-server] Warnings while compiling.", - "[webpack-dev-server] WARNING + Hey., + [webpack-dev-server] Warnings while compiling., + [webpack-dev-server] WARNING ⚠ Error: Warning from compilation - │ at Object.fn (/tests/e2e/logging.test.js:167:21) - │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) - │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) - │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) - │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 - │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) -", - "[webpack-dev-server] Errors while compiling. Reload prevented.", - "[webpack-dev-server] ERROR + │ at Object.fn (/tests/e2e/logging.test.js::) + │ at SyncHook.callAsyncStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at SyncHook.callStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at QueriedHook.call (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at /packages/rspack/dist/Compiler.js:: + │ at last.function (/packages/rspack/dist/Compiler.js::) +, + [webpack-dev-server] Errors while compiling. Reload prevented., + [webpack-dev-server] ERROR × Error: Error from compilation - │ at Object.fn (/tests/e2e/logging.test.js:169:43) - │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) - │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) - │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) - │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 - │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) -", + │ at Object.fn (/tests/e2e/logging.test.js::) + │ at SyncHook.callAsyncStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at SyncHook.callStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at QueriedHook.call (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at /packages/rspack/dist/Compiler.js:: + │ at last.function (/packages/rspack/dist/Compiler.js::) +, ] `; exports[`logging should work and log warnings by default (sockjs) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", - "[webpack-dev-server] Warnings while compiling.", - "[webpack-dev-server] WARNING + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., + [webpack-dev-server] Warnings while compiling., + [webpack-dev-server] WARNING ⚠ Error: Warning from compilation - │ at Object.fn (/tests/e2e/logging.test.js:71:21) - │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) - │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) - │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) - │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 - │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) -", + │ at Object.fn (/tests/e2e/logging.test.js::) + │ at SyncHook.callAsyncStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at SyncHook.callStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at QueriedHook.call (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at /packages/rspack/dist/Compiler.js:: + │ at last.function (/packages/rspack/dist/Compiler.js::) +, ] `; exports[`logging should work and log warnings by default (ws) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", - "[webpack-dev-server] Warnings while compiling.", - "[webpack-dev-server] WARNING + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., + [webpack-dev-server] Warnings while compiling., + [webpack-dev-server] WARNING ⚠ Error: Warning from compilation - │ at Object.fn (/tests/e2e/logging.test.js:71:21) - │ at SyncHook.callAsyncStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:240:21) - │ at SyncHook.callStageRange (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:259:14) - │ at QueriedHook.call (/Users/bytedance/rspack-dev/rspack/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js:218:26) - │ at /Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:570:21 - │ at last.function (/Users/bytedance/rspack-dev/rspack/packages/rspack/dist/Compiler.js:862:28) -", + │ at Object.fn (/tests/e2e/logging.test.js::) + │ at SyncHook.callAsyncStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at SyncHook.callStageRange (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at QueriedHook.call (/node_modules/.pnpm/@rspack+lite-tapable@1.0.0/node_modules/@rspack/lite-tapable/dist/index.js::) + │ at /packages/rspack/dist/Compiler.js:: + │ at last.function (/packages/rspack/dist/Compiler.js::) +, ] `; exports[`logging should work when the "client.logging" is "info" (sockjs) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; exports[`logging should work when the "client.logging" is "info" (ws) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; exports[`logging should work when the "client.logging" is "log" (sockjs) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; exports[`logging should work when the "client.logging" is "log" (ws) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; exports[`logging should work when the "client.logging" is "none" (sockjs) 1`] = ` [ - "Hey.", + Hey., ] `; exports[`logging should work when the "client.logging" is "none" (ws) 1`] = ` [ - "Hey.", + Hey., ] `; exports[`logging should work when the "client.logging" is "verbose" (sockjs) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; exports[`logging should work when the "client.logging" is "verbose" (ws) 1`] = ` [ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; diff --git a/packages/rspack-dev-server/tests/e2e/logging.test.js b/packages/rspack-dev-server/tests/e2e/logging.test.js index 6278d40a4e2..cefbc0f98fa 100644 --- a/packages/rspack-dev-server/tests/e2e/logging.test.js +++ b/packages/rspack-dev-server/tests/e2e/logging.test.js @@ -8,6 +8,7 @@ const HTMLGeneratorPlugin = require("../helpers/html-generator-plugin"); const config = require("../fixtures/client-config/webpack.config"); const runBrowser = require("../helpers/run-browser"); const port = require("../helpers/ports-map").logging; +require("../helpers/normalize"); describe("logging", () => { const webSocketServers = [ @@ -227,15 +228,7 @@ describe("logging", () => { } expect( - consoleMessages.map(message => - message - .text() - .replace(/\\/g, "/") - .replace( - new RegExp(process.cwd().replace(/\\/g, "/"), "g"), - "" - ) - ) + consoleMessages.map(message => message.text().replace(/\\/g, "/")) ).toMatchSnapshot(); } catch (error) { throw error; diff --git a/packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/one.js b/packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/one.js index e767ff32f17..21aaff9181a 100644 --- a/packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/one.js +++ b/packages/rspack-dev-server/tests/fixtures/multi-compiler-two-configurations/one.js @@ -1,3 +1,4 @@ "use strict"; console.log("one"); +// comment From ceae16496f6b6ffe12c9d6333d6c9e3bd9f4f780 Mon Sep 17 00:00:00 2001 From: LingyuCoder Date: Mon, 9 Sep 2024 12:46:15 +0800 Subject: [PATCH 06/11] test(dev-sever): add e2e test cases part 2 --- .../__snapshots__/host.test.js.snap.webpack5 | 240 ------------------ .../rspack-dev-server/tests/e2e/host.test.js | 18 +- 2 files changed, 9 insertions(+), 249 deletions(-) diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/host.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/host.test.js.snap.webpack5 index 4192fdcf2e4..3aa742bc730 100644 --- a/packages/rspack-dev-server/tests/e2e/__snapshots__/host.test.js.snap.webpack5 +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/host.test.js.snap.webpack5 @@ -1,125 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`host should work using "::" host and "auto" port: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "::" host and "auto" port: page errors 1`] = `[]`; - -exports[`host should work using "::" host and port as number: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "::" host and port as number: page errors 1`] = `[]`; - -exports[`host should work using "::" host and port as string: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "::" host and port as string: page errors 1`] = `[]`; - -exports[`host should work using "::1" host and "auto" port: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "::1" host and "auto" port: page errors 1`] = `[]`; - -exports[`host should work using "::1" host and port as number: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "::1" host and port as number: page errors 1`] = `[]`; - -exports[`host should work using "::1" host and port as string: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "::1" host and port as string: page errors 1`] = `[]`; - -exports[`host should work using "" host and "auto" port: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "" host and "auto" port: page errors 1`] = `[]`; - -exports[`host should work using "" host and port as number: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "" host and port as number: page errors 1`] = `[]`; - -exports[`host should work using "" host and port as string: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "" host and port as string: page errors 1`] = `[]`; - -exports[`host should work using "0.0.0.0" host and "auto" port: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "0.0.0.0" host and "auto" port: page errors 1`] = `[]`; - -exports[`host should work using "0.0.0.0" host and port as number: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "0.0.0.0" host and port as number: page errors 1`] = `[]`; - -exports[`host should work using "0.0.0.0" host and port as string: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "0.0.0.0" host and port as string: page errors 1`] = `[]`; - exports[`host should work using "127.0.0.1" host and "auto" port: console messages 1`] = ` [ "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", @@ -150,96 +30,6 @@ exports[`host should work using "127.0.0.1" host and port as string: console mes exports[`host should work using "127.0.0.1" host and port as string: page errors 1`] = `[]`; -exports[`host should work using "local-ip" host and "auto" port: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "local-ip" host and "auto" port: page errors 1`] = `[]`; - -exports[`host should work using "local-ip" host and port as number: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "local-ip" host and port as number: page errors 1`] = `[]`; - -exports[`host should work using "local-ip" host and port as string: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "local-ip" host and port as string: page errors 1`] = `[]`; - -exports[`host should work using "local-ipv4" host and "auto" port: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "local-ipv4" host and "auto" port: page errors 1`] = `[]`; - -exports[`host should work using "local-ipv4" host and port as number: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "local-ipv4" host and port as number: page errors 1`] = `[]`; - -exports[`host should work using "local-ipv4" host and port as string: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "local-ipv4" host and port as string: page errors 1`] = `[]`; - -exports[`host should work using "local-ipv6" host and "auto" port: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "local-ipv6" host and "auto" port: page errors 1`] = `[]`; - -exports[`host should work using "local-ipv6" host and port as number: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "local-ipv6" host and port as number: page errors 1`] = `[]`; - -exports[`host should work using "local-ipv6" host and port as string: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "local-ipv6" host and port as string: page errors 1`] = `[]`; - exports[`host should work using "localhost" host and "auto" port: console messages 1`] = ` [ "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", @@ -269,33 +59,3 @@ exports[`host should work using "localhost" host and port as string: console mes `; exports[`host should work using "localhost" host and port as string: page errors 1`] = `[]`; - -exports[`host should work using "undefined" host and "auto" port: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "undefined" host and "auto" port: page errors 1`] = `[]`; - -exports[`host should work using "undefined" host and port as number: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "undefined" host and port as number: page errors 1`] = `[]`; - -exports[`host should work using "undefined" host and port as string: console messages 1`] = ` -[ - "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", - "[HMR] Waiting for update signal from WDS...", - "Hey.", -] -`; - -exports[`host should work using "undefined" host and port as string: page errors 1`] = `[]`; diff --git a/packages/rspack-dev-server/tests/e2e/host.test.js b/packages/rspack-dev-server/tests/e2e/host.test.js index 9adb12273fd..ffb687e650b 100644 --- a/packages/rspack-dev-server/tests/e2e/host.test.js +++ b/packages/rspack-dev-server/tests/e2e/host.test.js @@ -32,17 +32,17 @@ function getAddress(host, hostname) { describe("host", () => { const hosts = [ - "", + // "", // eslint-disable-next-line no-undefined - undefined, - "0.0.0.0", - "::", + // undefined, + // "0.0.0.0", + // "::", "localhost", - "::1", - "127.0.0.1", - "local-ip", - "local-ipv4", - "local-ipv6" + // "::1", + "127.0.0.1" + // "local-ip", + // "local-ipv4", + // "local-ipv6" ]; for (let host of hosts) { From 6f0896a03ebb71baa21a2cfd9cc939f5d008005c Mon Sep 17 00:00:00 2001 From: LingyuCoder Date: Mon, 9 Sep 2024 13:12:53 +0800 Subject: [PATCH 07/11] test(dev-sever): add e2e test cases part 2 --- packages/rspack-dev-server/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/rspack-dev-server/package.json b/packages/rspack-dev-server/package.json index ae47aa10307..7bde2da2873 100644 --- a/packages/rspack-dev-server/package.json +++ b/packages/rspack-dev-server/package.json @@ -56,7 +56,8 @@ "css-loader": "^6.11.0", "require-from-string": "^2.0.2", "wait-for-expect": "^3.0.2", - "prettier": "3.2.5" + "prettier": "3.2.5", + "@jest/test-sequencer": "^29.7.0" }, "dependencies": { "chokidar": "^3.6.0", From 0496a31d8fa25c8a43e88d0859e33a56ea51689e Mon Sep 17 00:00:00 2001 From: LingyuCoder Date: Mon, 9 Sep 2024 13:45:29 +0800 Subject: [PATCH 08/11] test(dev-sever): add e2e test cases part 2 --- pnpm-lock.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fcb65209272..cd471959f1e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -534,6 +534,9 @@ importers: specifier: ^8.16.0 version: 8.17.1 devDependencies: + '@jest/test-sequencer': + specifier: ^29.7.0 + version: 29.7.0 '@rspack/core': specifier: workspace:* version: link:../rspack From 25c7fde45e894f3bc3e90dd5906526af30959ec8 Mon Sep 17 00:00:00 2001 From: LingyuCoder Date: Mon, 9 Sep 2024 13:58:57 +0800 Subject: [PATCH 09/11] test(dev-sever): add e2e test cases part 2 --- .../rspack-dev-server/tests/e2e/host.test.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/rspack-dev-server/tests/e2e/host.test.js b/packages/rspack-dev-server/tests/e2e/host.test.js index ffb687e650b..9adb12273fd 100644 --- a/packages/rspack-dev-server/tests/e2e/host.test.js +++ b/packages/rspack-dev-server/tests/e2e/host.test.js @@ -32,17 +32,17 @@ function getAddress(host, hostname) { describe("host", () => { const hosts = [ - // "", + "", // eslint-disable-next-line no-undefined - // undefined, - // "0.0.0.0", - // "::", + undefined, + "0.0.0.0", + "::", "localhost", - // "::1", - "127.0.0.1" - // "local-ip", - // "local-ipv4", - // "local-ipv6" + "::1", + "127.0.0.1", + "local-ip", + "local-ipv4", + "local-ipv6" ]; for (let host of hosts) { From a4a31f3175d83f518da403886a49f092fba6882e Mon Sep 17 00:00:00 2001 From: LingyuCoder Date: Tue, 10 Sep 2024 14:27:57 +0800 Subject: [PATCH 10/11] test(dev-sever): add e2e test cases part 2 --- .../__snapshots__/api.test.js.snap.webpack5 | 18 ++++++++++++++++++ .../logging.test.js.snap.webpack5 | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/api.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/api.test.js.snap.webpack5 index 17f0b95dff9..39890fbe5a9 100644 --- a/packages/rspack-dev-server/tests/e2e/__snapshots__/api.test.js.snap.webpack5 +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/api.test.js.snap.webpack5 @@ -24,6 +24,24 @@ exports[`API Invalidate callback should use the provided \`callback\` function: exports[`API Invalidate callback should use the provided \`callback\` function: response status 1`] = `200`; +exports[`API Server.checkHostHeader should allow URLs with scheme for checking origin when the "option.client.webSocketURL" is object: console messages 1`] = ` +[ + "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "WebSocket connection to 'ws://test.host:8158/ws' failed: Error in connection establishment: net::ERR_NAME_NOT_RESOLVED", + "[webpack-dev-server] JSHandle@object", + "[webpack-dev-server] Disconnected!", + "[webpack-dev-server] Trying to reconnect...", +] +`; + +exports[`API Server.checkHostHeader should allow URLs with scheme for checking origin when the "option.client.webSocketURL" is object: page errors 1`] = `[]`; + +exports[`API Server.checkHostHeader should allow URLs with scheme for checking origin when the "option.client.webSocketURL" is object: response status 1`] = `200`; + +exports[`API Server.checkHostHeader should allow URLs with scheme for checking origin when the "option.client.webSocketURL" is object: web socket URL 1`] = `"ws://test.host:8158/ws"`; + exports[`API Server.getFreePort should retry finding the port for up to defaultPortRetry times (number): console messages 1`] = ` [ "[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled.", diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 index 6258a968c9f..17f9aa4edce 100644 --- a/packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 @@ -169,6 +169,10 @@ exports[`logging should work and log static changes (sockjs) 1`] = ` [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., [HMR] Waiting for update signal from WDS..., Hey., + [webpack-dev-server] "/tests/fixtures/client-config/static/foo.txt" from static directory was changed. Reloading..., + [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., + [HMR] Waiting for update signal from WDS..., + Hey., ] `; From 812d4d48c6cef3c7a12ceed0f7d9315212a42914 Mon Sep 17 00:00:00 2001 From: LingyuCoder Date: Tue, 10 Sep 2024 15:55:52 +0800 Subject: [PATCH 11/11] test(dev-sever): add e2e test cases part 2 --- .../tests/e2e/__snapshots__/logging.test.js.snap.webpack5 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 b/packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 index 17f9aa4edce..6258a968c9f 100644 --- a/packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 +++ b/packages/rspack-dev-server/tests/e2e/__snapshots__/logging.test.js.snap.webpack5 @@ -169,10 +169,6 @@ exports[`logging should work and log static changes (sockjs) 1`] = ` [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., [HMR] Waiting for update signal from WDS..., Hey., - [webpack-dev-server] "/tests/fixtures/client-config/static/foo.txt" from static directory was changed. Reloading..., - [webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled., - [HMR] Waiting for update signal from WDS..., - Hey., ] `;