From a2b2a947027e2e0d2ae359daf1864121690d7df8 Mon Sep 17 00:00:00 2001 From: thepassle Date: Wed, 5 Jul 2023 13:36:33 +0200 Subject: [PATCH 01/25] fix: content type --- packages/mocks/storybook/decorator.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/mocks/storybook/decorator.js b/packages/mocks/storybook/decorator.js index be663228f..dbe8d6a82 100644 --- a/packages/mocks/storybook/decorator.js +++ b/packages/mocks/storybook/decorator.js @@ -45,7 +45,12 @@ export const withMocks = makeDecorator({ ? { ...editedMock, handler: () => - new Response(JSON.stringify(editedMock.data), { status: editedMock.status }), + new Response(JSON.stringify(editedMock.data), { + headers: { + 'Content-Type': 'application/json', + }, + status: editedMock.status, + }), } : mock; }); From fd7cb03ede220080290c9be87412345ca8c2b956 Mon Sep 17 00:00:00 2001 From: Pascal Schilp Date: Wed, 5 Jul 2023 13:37:16 +0200 Subject: [PATCH 02/25] Create late-dolphins-thank.md --- .changeset/late-dolphins-thank.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/late-dolphins-thank.md diff --git a/.changeset/late-dolphins-thank.md b/.changeset/late-dolphins-thank.md new file mode 100644 index 000000000..b80280aa4 --- /dev/null +++ b/.changeset/late-dolphins-thank.md @@ -0,0 +1,5 @@ +--- +"@web/mocks": patch +--- + +fix: content type From 35b873069c6e04853cbfab2f6c3499d472e88294 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 5 Jul 2023 11:39:34 +0000 Subject: [PATCH 03/25] Version Packages --- .changeset/late-dolphins-thank.md | 5 ----- packages/mocks/CHANGELOG.md | 6 ++++++ packages/mocks/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/late-dolphins-thank.md diff --git a/.changeset/late-dolphins-thank.md b/.changeset/late-dolphins-thank.md deleted file mode 100644 index b80280aa4..000000000 --- a/.changeset/late-dolphins-thank.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@web/mocks": patch ---- - -fix: content type diff --git a/packages/mocks/CHANGELOG.md b/packages/mocks/CHANGELOG.md index 7fd4db4a7..868667af1 100644 --- a/packages/mocks/CHANGELOG.md +++ b/packages/mocks/CHANGELOG.md @@ -1,5 +1,11 @@ # @web/mocks +## 0.1.4 + +### Patch Changes + +- fd7cb03e: fix: content type + ## 0.1.3 ### Patch Changes diff --git a/packages/mocks/package.json b/packages/mocks/package.json index ce93e0fcf..e99bfe398 100644 --- a/packages/mocks/package.json +++ b/packages/mocks/package.json @@ -1,6 +1,6 @@ { "name": "@web/mocks", - "version": "0.1.3", + "version": "0.1.4", "publishConfig": { "access": "public" }, From 285db736736c1a46d2df5de8828c21bd8abc98e7 Mon Sep 17 00:00:00 2001 From: thepassle Date: Wed, 5 Jul 2023 18:36:40 +0200 Subject: [PATCH 04/25] fix: flatten mocks correctly --- packages/mocks/storybook/decorator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mocks/storybook/decorator.js b/packages/mocks/storybook/decorator.js index dbe8d6a82..320214367 100644 --- a/packages/mocks/storybook/decorator.js +++ b/packages/mocks/storybook/decorator.js @@ -56,7 +56,7 @@ export const withMocks = makeDecorator({ }); if (finalizedMocks) { - addons.getChannel().emit('mocks:loaded', finalizedMocks); + addons.getChannel().emit('mocks:loaded', finalizedMocks.flat(Infinity)); registerMockRoutes(finalizedMocks); } From c2a9df28b56f9f3e8f84705cec6f7e08b46ebdb2 Mon Sep 17 00:00:00 2001 From: Pascal Schilp Date: Wed, 5 Jul 2023 18:40:08 +0200 Subject: [PATCH 05/25] Create young-beans-grab.md --- .changeset/young-beans-grab.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/young-beans-grab.md diff --git a/.changeset/young-beans-grab.md b/.changeset/young-beans-grab.md new file mode 100644 index 000000000..10611e0e2 --- /dev/null +++ b/.changeset/young-beans-grab.md @@ -0,0 +1,5 @@ +--- +"@web/mocks": patch +--- + +fix: flatten mocks correctly From 36931b8d53aac907591c5bbc0256c0f6b9ea381d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 5 Jul 2023 16:41:50 +0000 Subject: [PATCH 06/25] Version Packages --- .changeset/young-beans-grab.md | 5 ----- packages/mocks/CHANGELOG.md | 6 ++++++ packages/mocks/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/young-beans-grab.md diff --git a/.changeset/young-beans-grab.md b/.changeset/young-beans-grab.md deleted file mode 100644 index 10611e0e2..000000000 --- a/.changeset/young-beans-grab.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@web/mocks": patch ---- - -fix: flatten mocks correctly diff --git a/packages/mocks/CHANGELOG.md b/packages/mocks/CHANGELOG.md index 868667af1..11921f1db 100644 --- a/packages/mocks/CHANGELOG.md +++ b/packages/mocks/CHANGELOG.md @@ -1,5 +1,11 @@ # @web/mocks +## 0.1.5 + +### Patch Changes + +- c2a9df28: fix: flatten mocks correctly + ## 0.1.4 ### Patch Changes diff --git a/packages/mocks/package.json b/packages/mocks/package.json index e99bfe398..80de147b4 100644 --- a/packages/mocks/package.json +++ b/packages/mocks/package.json @@ -1,6 +1,6 @@ { "name": "@web/mocks", - "version": "0.1.4", + "version": "0.1.5", "publishConfig": { "access": "public" }, From 6b3591490a3abb28de5e4d0f002114669d02b768 Mon Sep 17 00:00:00 2001 From: Mikhail Bashkirov Date: Wed, 5 Jul 2023 16:34:58 +0200 Subject: [PATCH 07/25] fix(dev-server-rollup): await buildStart in serverStart --- .changeset/red-tigers-brush.md | 5 +++ packages/dev-server-core/src/test-helpers.ts | 3 +- .../dev-server-rollup/src/rollupAdapter.ts | 2 +- .../dev-server-rollup/test/node/unit.test.ts | 39 ++++++++++++++++++- 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 .changeset/red-tigers-brush.md diff --git a/.changeset/red-tigers-brush.md b/.changeset/red-tigers-brush.md new file mode 100644 index 000000000..ba5a0cfa9 --- /dev/null +++ b/.changeset/red-tigers-brush.md @@ -0,0 +1,5 @@ +--- +'@web/dev-server-rollup': patch +--- + +fix: await buildStart in serverStart diff --git a/packages/dev-server-core/src/test-helpers.ts b/packages/dev-server-core/src/test-helpers.ts index 6cfa4ed21..57695bff0 100644 --- a/packages/dev-server-core/src/test-helpers.ts +++ b/packages/dev-server-core/src/test-helpers.ts @@ -55,7 +55,8 @@ export async function createTestServer( return { server, port, host: `http://localhost:${port}` }; } -export const timeout = (ms = 0) => new Promise(resolve => setTimeout(resolve, ms)); +export const timeout = (ms = 0, value?: T): Promise => + new Promise(resolve => setTimeout(value ? () => resolve(value) : resolve, ms)); export async function fetchText(url: string, init?: RequestInit) { const response = await fetch(url, init); diff --git a/packages/dev-server-rollup/src/rollupAdapter.ts b/packages/dev-server-rollup/src/rollupAdapter.ts index 1c2564823..bc671df97 100644 --- a/packages/dev-server-rollup/src/rollupAdapter.ts +++ b/packages/dev-server-rollup/src/rollupAdapter.ts @@ -106,7 +106,7 @@ export function rollupAdapter( transformedOptions = rollupInputOptions; } if (typeof rollupPlugin.buildStart === 'function') { - rollupPlugin.buildStart?.call( + await rollupPlugin.buildStart?.call( rollupPluginContexts.pluginContext, rollupPluginContexts.normalizedInputOptions, ); diff --git a/packages/dev-server-rollup/test/node/unit.test.ts b/packages/dev-server-rollup/test/node/unit.test.ts index 1900935cd..796c4c637 100644 --- a/packages/dev-server-rollup/test/node/unit.test.ts +++ b/packages/dev-server-rollup/test/node/unit.test.ts @@ -2,10 +2,47 @@ import { Plugin as RollupPlugin, AcornNode } from 'rollup'; import { expect } from 'chai'; import path from 'path'; -import { createTestServer, fetchText, expectIncludes } from './test-helpers'; +import { createTestServer, fetchText, expectIncludes, timeout } from './test-helpers'; import { fromRollup } from '../../src/index'; describe('@web/dev-server-rollup', () => { + describe('buildStart', () => { + it('awaits buildStart when starting a server', async () => { + let resolveBuildStartCalled: undefined | ((value: void) => void); + const buildStartCalledPromise = new Promise(resolve => (resolveBuildStartCalled = resolve)); + + let resolveBuildStart: undefined | ((value: void) => void); + const plugin: RollupPlugin = { + name: 'my-plugin', + buildStart() { + if (resolveBuildStartCalled) { + resolveBuildStartCalled(); + } + return new Promise(resolve => (resolveBuildStart = resolve)); + }, + }; + + const serverPromise = createTestServer({ + plugins: [fromRollup(() => plugin)()], + }); + + await buildStartCalledPromise; + + try { + const res = await Promise.race([serverPromise, timeout(0, 'timeout')]); + expect(res).to.equal('timeout'); + if (resolveBuildStart) { + resolveBuildStart(); + } + const res2 = await Promise.race([serverPromise, timeout(0, 'timeout')]); + expect(res2).not.to.equal('timeout'); + } finally { + const { server } = await serverPromise; + server.stop(); + } + }); + }); + describe('resolveId', () => { it('can resolve imports, returning a string', async () => { const plugin: RollupPlugin = { From 18d4a6317d134e149c6c3e9d3fd386520721d8c0 Mon Sep 17 00:00:00 2001 From: Tom Nys Date: Thu, 6 Jul 2023 12:53:36 +0200 Subject: [PATCH 08/25] fix: add workaround for headless issue --- .changeset/itchy-socks-rule.md | 7 +++++ .../src/ChromeLauncherPage.ts | 26 +++++++++++++++++++ .../test/chromeLauncher.test.ts | 5 +--- .../test/puppeteerLauncher.test.ts | 5 +--- 4 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 .changeset/itchy-socks-rule.md diff --git a/.changeset/itchy-socks-rule.md b/.changeset/itchy-socks-rule.md new file mode 100644 index 000000000..593e8eb4c --- /dev/null +++ b/.changeset/itchy-socks-rule.md @@ -0,0 +1,7 @@ +--- +'@web/test-runner-chrome': patch +--- + +fix: add workaround for headless issue + +This will patch `window.requestAnimationFrame` and `window.requestIdleCallback` and make sure that the tab running the test code is brought back to the front. diff --git a/packages/test-runner-chrome/src/ChromeLauncherPage.ts b/packages/test-runner-chrome/src/ChromeLauncherPage.ts index 750de2a61..19d0a2c67 100644 --- a/packages/test-runner-chrome/src/ChromeLauncherPage.ts +++ b/packages/test-runner-chrome/src/ChromeLauncherPage.ts @@ -9,6 +9,7 @@ export class ChromeLauncherPage { private product: string; public puppeteerPage: Page; private nativeInstrumentationEnabledOnPage = false; + private patchAdded = false; constructor( config: TestRunnerCoreConfig, @@ -37,6 +38,31 @@ export class ChromeLauncherPage { }); } + // Patching the browser page to workaround an issue in the new headless mode of Chrome where some functions + // with callbacks (requestAnimationFrame and requestIdleCallback) are not executing their callbacks. + // https://github.com/puppeteer/puppeteer/issues/10350 + if (!this.patchAdded) { + await this.puppeteerPage.exposeFunction('__bringTabToFront', () => + this.puppeteerPage.bringToFront(), + ); + await this.puppeteerPage.evaluateOnNewDocument(() => { + // @ts-ignore + function patchFunction(name, fn) { + // @ts-ignore + window[name] = (...args) => { + fn.call(window, ...args); + // Make sure that the tab running the test code is brought back to the front. + // @ts-ignore + window.__bringTabToFront(); + }; + } + + patchFunction('requestAnimationFrame', window.requestAnimationFrame); + patchFunction('requestIdleCallback', window.requestIdleCallback); + }); + this.patchAdded = true; + } + await this.puppeteerPage.setViewport({ height: 600, width: 800 }); await this.puppeteerPage.goto(url); } diff --git a/packages/test-runner-chrome/test/chromeLauncher.test.ts b/packages/test-runner-chrome/test/chromeLauncher.test.ts index e68f505a7..a0e83dfe0 100644 --- a/packages/test-runner-chrome/test/chromeLauncher.test.ts +++ b/packages/test-runner-chrome/test/chromeLauncher.test.ts @@ -13,10 +13,7 @@ describe('test-runner-chrome', function testRunnerChrome() { runIntegrationTests(createConfig, { basic: true, many: true, - // Focus tests are failing because of a puppeteer/chrome bug. - // See https://github.com/puppeteer/puppeteer/issues/10350 and - // https://bugs.chromium.org/p/chromium/issues/detail?id=1454012 - focus: false, + focus: true, groups: true, parallel: true, testFailure: true, diff --git a/packages/test-runner-puppeteer/test/puppeteerLauncher.test.ts b/packages/test-runner-puppeteer/test/puppeteerLauncher.test.ts index 6e606bb8c..7f1752d57 100644 --- a/packages/test-runner-puppeteer/test/puppeteerLauncher.test.ts +++ b/packages/test-runner-puppeteer/test/puppeteerLauncher.test.ts @@ -13,10 +13,7 @@ describe('test-runner-puppeteer', function testRunnerPuppeteer() { runIntegrationTests(createConfig, { basic: true, many: true, - // Focus tests are failing because of a puppeteer/chrome bug. - // See https://github.com/puppeteer/puppeteer/issues/10350 and - // https://bugs.chromium.org/p/chromium/issues/detail?id=1454012 - focus: false, + focus: true, groups: true, parallel: true, testFailure: true, From ce2065fe2a540c514ebe028fe0d2a366a30079dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Oddsson?= Date: Thu, 6 Jul 2023 13:01:45 +0200 Subject: [PATCH 09/25] Remove some `@ts-ignore` comments --- packages/test-runner-chrome/src/ChromeLauncherPage.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/test-runner-chrome/src/ChromeLauncherPage.ts b/packages/test-runner-chrome/src/ChromeLauncherPage.ts index 19d0a2c67..ae80a7025 100644 --- a/packages/test-runner-chrome/src/ChromeLauncherPage.ts +++ b/packages/test-runner-chrome/src/ChromeLauncherPage.ts @@ -3,6 +3,10 @@ import { TestRunnerCoreConfig } from '@web/test-runner-core'; import { v8ToIstanbul } from '@web/test-runner-coverage-v8'; import { SessionResult } from '@web/test-runner-core'; +declare global { + interface Window { __bringTabToFront: Function; } +} + export class ChromeLauncherPage { private config: TestRunnerCoreConfig; private testFiles: string[]; @@ -46,13 +50,10 @@ export class ChromeLauncherPage { this.puppeteerPage.bringToFront(), ); await this.puppeteerPage.evaluateOnNewDocument(() => { - // @ts-ignore - function patchFunction(name, fn) { - // @ts-ignore - window[name] = (...args) => { + function patchFunction(name: string, fn: Function) { + (window as any)[name] = (...args: unknown[]) => { fn.call(window, ...args); // Make sure that the tab running the test code is brought back to the front. - // @ts-ignore window.__bringTabToFront(); }; } From 1b639a7f39a81eaf90c794f528eb5ffab13b9584 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Oddsson?= Date: Thu, 6 Jul 2023 13:09:54 +0200 Subject: [PATCH 10/25] Fix ESLint violations --- packages/test-runner-chrome/src/ChromeLauncherPage.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/test-runner-chrome/src/ChromeLauncherPage.ts b/packages/test-runner-chrome/src/ChromeLauncherPage.ts index ae80a7025..18d235873 100644 --- a/packages/test-runner-chrome/src/ChromeLauncherPage.ts +++ b/packages/test-runner-chrome/src/ChromeLauncherPage.ts @@ -4,7 +4,9 @@ import { v8ToIstanbul } from '@web/test-runner-coverage-v8'; import { SessionResult } from '@web/test-runner-core'; declare global { - interface Window { __bringTabToFront: Function; } + interface Window { + __bringTabToFront: () => void; + } } export class ChromeLauncherPage { @@ -50,6 +52,7 @@ export class ChromeLauncherPage { this.puppeteerPage.bringToFront(), ); await this.puppeteerPage.evaluateOnNewDocument(() => { + // eslint-disable-next-line @typescript-eslint/ban-types function patchFunction(name: string, fn: Function) { (window as any)[name] = (...args: unknown[]) => { fn.call(window, ...args); From 177a6de7185e5ed70a5a04694e9a81310e82d34c Mon Sep 17 00:00:00 2001 From: Mikhail Bashkirov Date: Thu, 6 Jul 2023 13:43:51 +0200 Subject: [PATCH 11/25] test: remove test as not very useful and complex --- packages/dev-server-core/src/test-helpers.ts | 3 +- .../dev-server-rollup/test/node/unit.test.ts | 39 +------------------ 2 files changed, 2 insertions(+), 40 deletions(-) diff --git a/packages/dev-server-core/src/test-helpers.ts b/packages/dev-server-core/src/test-helpers.ts index 57695bff0..6cfa4ed21 100644 --- a/packages/dev-server-core/src/test-helpers.ts +++ b/packages/dev-server-core/src/test-helpers.ts @@ -55,8 +55,7 @@ export async function createTestServer( return { server, port, host: `http://localhost:${port}` }; } -export const timeout = (ms = 0, value?: T): Promise => - new Promise(resolve => setTimeout(value ? () => resolve(value) : resolve, ms)); +export const timeout = (ms = 0) => new Promise(resolve => setTimeout(resolve, ms)); export async function fetchText(url: string, init?: RequestInit) { const response = await fetch(url, init); diff --git a/packages/dev-server-rollup/test/node/unit.test.ts b/packages/dev-server-rollup/test/node/unit.test.ts index 796c4c637..1900935cd 100644 --- a/packages/dev-server-rollup/test/node/unit.test.ts +++ b/packages/dev-server-rollup/test/node/unit.test.ts @@ -2,47 +2,10 @@ import { Plugin as RollupPlugin, AcornNode } from 'rollup'; import { expect } from 'chai'; import path from 'path'; -import { createTestServer, fetchText, expectIncludes, timeout } from './test-helpers'; +import { createTestServer, fetchText, expectIncludes } from './test-helpers'; import { fromRollup } from '../../src/index'; describe('@web/dev-server-rollup', () => { - describe('buildStart', () => { - it('awaits buildStart when starting a server', async () => { - let resolveBuildStartCalled: undefined | ((value: void) => void); - const buildStartCalledPromise = new Promise(resolve => (resolveBuildStartCalled = resolve)); - - let resolveBuildStart: undefined | ((value: void) => void); - const plugin: RollupPlugin = { - name: 'my-plugin', - buildStart() { - if (resolveBuildStartCalled) { - resolveBuildStartCalled(); - } - return new Promise(resolve => (resolveBuildStart = resolve)); - }, - }; - - const serverPromise = createTestServer({ - plugins: [fromRollup(() => plugin)()], - }); - - await buildStartCalledPromise; - - try { - const res = await Promise.race([serverPromise, timeout(0, 'timeout')]); - expect(res).to.equal('timeout'); - if (resolveBuildStart) { - resolveBuildStart(); - } - const res2 = await Promise.race([serverPromise, timeout(0, 'timeout')]); - expect(res2).not.to.equal('timeout'); - } finally { - const { server } = await serverPromise; - server.stop(); - } - }); - }); - describe('resolveId', () => { it('can resolve imports, returning a string', async () => { const plugin: RollupPlugin = { From 11cc8d0c2f945d4331ca817d0dd198ff1ab7bbdd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 6 Jul 2023 11:48:12 +0000 Subject: [PATCH 12/25] Version Packages --- .changeset/red-tigers-brush.md | 5 ----- packages/dev-server-rollup/CHANGELOG.md | 6 ++++++ packages/dev-server-rollup/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/red-tigers-brush.md diff --git a/.changeset/red-tigers-brush.md b/.changeset/red-tigers-brush.md deleted file mode 100644 index ba5a0cfa9..000000000 --- a/.changeset/red-tigers-brush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@web/dev-server-rollup': patch ---- - -fix: await buildStart in serverStart diff --git a/packages/dev-server-rollup/CHANGELOG.md b/packages/dev-server-rollup/CHANGELOG.md index 2db9ed918..30a8b47f3 100644 --- a/packages/dev-server-rollup/CHANGELOG.md +++ b/packages/dev-server-rollup/CHANGELOG.md @@ -1,5 +1,11 @@ # @web/dev-server-rollup +## 0.5.2 + +### Patch Changes + +- 6b359149: fix: await buildStart in serverStart + ## 0.5.1 ### Patch Changes diff --git a/packages/dev-server-rollup/package.json b/packages/dev-server-rollup/package.json index c652ef700..b6bf369a9 100644 --- a/packages/dev-server-rollup/package.json +++ b/packages/dev-server-rollup/package.json @@ -1,6 +1,6 @@ { "name": "@web/dev-server-rollup", - "version": "0.5.1", + "version": "0.5.2", "publishConfig": { "access": "public" }, From 2da41477ec6f78108ccf6be66894407ec6937543 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 7 Jul 2023 06:57:58 +0000 Subject: [PATCH 13/25] Version Packages --- .changeset/itchy-socks-rule.md | 7 ------- packages/test-runner-chrome/CHANGELOG.md | 8 ++++++++ packages/test-runner-chrome/package.json | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) delete mode 100644 .changeset/itchy-socks-rule.md diff --git a/.changeset/itchy-socks-rule.md b/.changeset/itchy-socks-rule.md deleted file mode 100644 index 593e8eb4c..000000000 --- a/.changeset/itchy-socks-rule.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@web/test-runner-chrome': patch ---- - -fix: add workaround for headless issue - -This will patch `window.requestAnimationFrame` and `window.requestIdleCallback` and make sure that the tab running the test code is brought back to the front. diff --git a/packages/test-runner-chrome/CHANGELOG.md b/packages/test-runner-chrome/CHANGELOG.md index 39f9ac4e4..67fbe668d 100644 --- a/packages/test-runner-chrome/CHANGELOG.md +++ b/packages/test-runner-chrome/CHANGELOG.md @@ -1,5 +1,13 @@ # @web/test-runner-chrome +## 0.13.3 + +### Patch Changes + +- 18d4a631: fix: add workaround for headless issue + + This will patch `window.requestAnimationFrame` and `window.requestIdleCallback` and make sure that the tab running the test code is brought back to the front. + ## 0.13.2 ### Patch Changes diff --git a/packages/test-runner-chrome/package.json b/packages/test-runner-chrome/package.json index a9d73c843..58cf447c1 100644 --- a/packages/test-runner-chrome/package.json +++ b/packages/test-runner-chrome/package.json @@ -1,6 +1,6 @@ { "name": "@web/test-runner-chrome", - "version": "0.13.2", + "version": "0.13.3", "publishConfig": { "access": "public" }, From 5c02eca2818ab696ad5692cbcc34b3764a7195a0 Mon Sep 17 00:00:00 2001 From: Tom Nys Date: Mon, 10 Jul 2023 15:29:43 +0200 Subject: [PATCH 14/25] fix(test-runner-chrome): add mutex when bringing tabs to front --- .changeset/orange-ducks-change.md | 5 ++++ package-lock.json | 26 +++++++++-------- packages/test-runner-chrome/package.json | 3 +- .../src/ChromeLauncherPage.ts | 28 +++++++++++++++---- 4 files changed, 45 insertions(+), 17 deletions(-) create mode 100644 .changeset/orange-ducks-change.md diff --git a/.changeset/orange-ducks-change.md b/.changeset/orange-ducks-change.md new file mode 100644 index 000000000..bfa340556 --- /dev/null +++ b/.changeset/orange-ducks-change.md @@ -0,0 +1,5 @@ +--- +'@web/test-runner-chrome': patch +--- + +fix(test-runner-chrome): add mutex when bringing tabs to front diff --git a/package-lock.json b/package-lock.json index 6435e9f7d..959ca3860 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6323,11 +6323,6 @@ "resolved": "packages/rollup-plugin-polyfills-loader", "link": true }, - "node_modules/@web/storybook-prebuilt": { - "version": "0.1.37", - "resolved": "https://registry.npmjs.org/@web/storybook-prebuilt/-/storybook-prebuilt-0.1.37.tgz", - "integrity": "sha512-je4BAbOJiEjQOkeFJfw+fnezKpU3fQW+5ZTiY24UGB1xPaZfU7ZMrC9tW6699vy/QRVJhiJyQrcIQ35OVSlCQA==" - }, "node_modules/@web/test-runner": { "resolved": "packages/test-runner", "link": true @@ -7714,6 +7709,14 @@ "node": ">=0.8.0" } }, + "node_modules/async-mutex": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.0.tgz", + "integrity": "sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -29283,7 +29286,7 @@ }, "packages/dev-server": { "name": "@web/dev-server", - "version": "0.2.3", + "version": "0.2.5", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.11", @@ -29525,7 +29528,7 @@ }, "packages/dev-server-storybook": { "name": "@web/dev-server-storybook", - "version": "0.7.2", + "version": "0.7.4", "license": "MIT", "dependencies": { "@babel/core": "^7.16.0", @@ -29552,7 +29555,7 @@ }, "devDependencies": { "@types/path-is-inside": "^1.0.0", - "@web/dev-server": "^0.2.2", + "@web/dev-server": "^0.2.5", "htm": "^3.1.0" }, "engines": { @@ -29624,7 +29627,7 @@ }, "packages/mocks": { "name": "@web/mocks", - "version": "0.1.1", + "version": "0.1.5", "license": "MIT", "dependencies": { "@web/storybook-prebuilt": "^0.1.37", @@ -29632,8 +29635,8 @@ "msw": "0.0.0-fetch.rc-15" }, "devDependencies": { - "@web/dev-server": "^0.2.3", - "@web/dev-server-storybook": "^0.7.2" + "@web/dev-server": "^0.2.5", + "@web/dev-server-storybook": "^0.7.4" } }, "packages/mocks/node_modules/@web/storybook-prebuilt": { @@ -29871,6 +29874,7 @@ "dependencies": { "@web/test-runner-core": "^0.11.2", "@web/test-runner-coverage-v8": "^0.7.0", + "async-mutex": "0.4.0", "chrome-launcher": "^0.15.0", "puppeteer-core": "^19.8.1" }, diff --git a/packages/test-runner-chrome/package.json b/packages/test-runner-chrome/package.json index a9d73c843..d2590e7d7 100644 --- a/packages/test-runner-chrome/package.json +++ b/packages/test-runner-chrome/package.json @@ -48,7 +48,8 @@ "@web/test-runner-core": "^0.11.2", "@web/test-runner-coverage-v8": "^0.7.0", "chrome-launcher": "^0.15.0", - "puppeteer-core": "^19.8.1" + "puppeteer-core": "^19.8.1", + "async-mutex": "0.4.0" }, "devDependencies": { "@types/istanbul-reports": "^3.0.0", diff --git a/packages/test-runner-chrome/src/ChromeLauncherPage.ts b/packages/test-runner-chrome/src/ChromeLauncherPage.ts index 18d235873..8fefa6a56 100644 --- a/packages/test-runner-chrome/src/ChromeLauncherPage.ts +++ b/packages/test-runner-chrome/src/ChromeLauncherPage.ts @@ -2,10 +2,14 @@ import { Page, JSCoverageEntry } from 'puppeteer-core'; import { TestRunnerCoreConfig } from '@web/test-runner-core'; import { v8ToIstanbul } from '@web/test-runner-coverage-v8'; import { SessionResult } from '@web/test-runner-core'; +import { Mutex } from 'async-mutex'; + +const mutex = new Mutex(); declare global { interface Window { - __bringTabToFront: () => void; + __bringTabToFront: (id: string) => void; + __releaseLock: (id: string) => void; } } @@ -16,6 +20,7 @@ export class ChromeLauncherPage { public puppeteerPage: Page; private nativeInstrumentationEnabledOnPage = false; private patchAdded = false; + private resolvers: Record void> = {}; constructor( config: TestRunnerCoreConfig, @@ -48,16 +53,29 @@ export class ChromeLauncherPage { // with callbacks (requestAnimationFrame and requestIdleCallback) are not executing their callbacks. // https://github.com/puppeteer/puppeteer/issues/10350 if (!this.patchAdded) { - await this.puppeteerPage.exposeFunction('__bringTabToFront', () => - this.puppeteerPage.bringToFront(), - ); + await this.puppeteerPage.exposeFunction('__bringTabToFront', (id: string) => { + const promise = new Promise(resolve => { + this.resolvers[id] = resolve as () => void; + }); + return mutex.runExclusive(async () => { + await this.puppeteerPage.bringToFront(); + await promise; + }); + }); + await this.puppeteerPage.exposeFunction('__releaseLock', (id: string) => { + this.resolvers[id]?.(); + }); await this.puppeteerPage.evaluateOnNewDocument(() => { // eslint-disable-next-line @typescript-eslint/ban-types function patchFunction(name: string, fn: Function) { (window as any)[name] = (...args: unknown[]) => { fn.call(window, ...args); + const id = Math.random().toString().substring(2); // Make sure that the tab running the test code is brought back to the front. - window.__bringTabToFront(); + window.__bringTabToFront(id); + fn.call(window, () => { + window.__releaseLock(id); + }); }; } From ce57936c08981c59c4b6ae52bd48e3a030646a1e Mon Sep 17 00:00:00 2001 From: Mikhail Bashkirov Date: Mon, 10 Jul 2023 17:37:28 +0300 Subject: [PATCH 15/25] feat(dev-server-core): support middleware mode --- .changeset/fluffy-snails-share.md | 10 + docs/docs/dev-server/node-api.md | 23 ++ package-lock.json | 388 +++++++++++++++++- packages/dev-server-core/package.json | 1 + .../dev-server-core/src/plugins/Plugin.ts | 2 +- .../dev-server-core/src/server/DevServer.ts | 54 ++- .../src/server/DevServerCoreConfig.ts | 8 +- .../src/server/createServer.ts | 11 +- .../test/server/DevServer.test.ts | 27 ++ .../web-sockets/WebSocketsManager.test.ts | 10 +- .../dev-server-hmr/test/HmrPlugin.test.ts | 16 +- packages/dev-server-hmr/test/browser.test.ts | 2 +- 12 files changed, 511 insertions(+), 41 deletions(-) create mode 100644 .changeset/fluffy-snails-share.md diff --git a/.changeset/fluffy-snails-share.md b/.changeset/fluffy-snails-share.md new file mode 100644 index 000000000..39b220e19 --- /dev/null +++ b/.changeset/fluffy-snails-share.md @@ -0,0 +1,10 @@ +--- +'@web/dev-server-core': patch +--- + +support middleware mode + +BREAKING CHANGE + +Theoretically it's a breaking change for Plugin API since now `serverStart` hook might not have a param `server`. +It won't impact the codebase immediately since you need to first activate `middlewareMode` to actually break stuff if any plugin depends on `server` existence, but type wise it might break compilation of such plugins right away. We decided to take an easy path and not create a SemVer mess with a minor update as the impact of this is too small and the risk is acceptable. diff --git a/docs/docs/dev-server/node-api.md b/docs/docs/dev-server/node-api.md index c363e947f..c5b6e8e88 100644 --- a/docs/docs/dev-server/node-api.md +++ b/docs/docs/dev-server/node-api.md @@ -152,6 +152,29 @@ wss.on('connection', ws => { }); ``` +## Middleware mode + +If you need to connect to an existing running web server with a compatible node middleware API (e.g. `express`), you can use `@web/dev-server` in middleware mode. + +```js +import { startDevServer } from '@web/dev-server'; + +async function main() { + const expressApp = express(); + expressApp.listen(1234); + const { koaApp } = await startDevServer({ + config: { + middlewareMode: true, + }, + }); + expressApp.use(koaApp.callback()); +} + +main(); +``` + +In this mode it will not start a new HTTP server, but rather allow you to use it's callback `koaApp.callback()` as a middleware in a parent server. + ## Advanced If you need more control than what `startDevServer` gives you, you can also use the individual pieces that make up the dev server directly. diff --git a/package-lock.json b/package-lock.json index 959ca3860..acc6346ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7619,6 +7619,12 @@ "node": ">=6.0.0" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, "node_modules/array-iterate": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz", @@ -8087,6 +8093,122 @@ "node": ">= 6" } }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -9921,6 +10043,12 @@ "node": ">= 0.6" } }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, "node_modules/cookies": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", @@ -12328,6 +12456,215 @@ "node": ">=6" } }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express/node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/express/node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", @@ -12852,6 +13189,15 @@ "node": "^12.20 || >= 14.13" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -14608,6 +14954,15 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", @@ -17646,6 +18001,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -17659,6 +18020,15 @@ "node": ">= 8" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromark": { "version": "2.11.4", "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", @@ -21354,6 +21724,19 @@ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -29347,6 +29730,7 @@ "@types/koa-static": "^4.0.1", "@types/parse5": "^6.0.1", "abort-controller": "^3.0.0", + "express": "^4.18.2", "nanoid": "^3.1.25", "node-fetch": "3.0.0-beta.9", "portfinder": "^1.0.32" @@ -29479,7 +29863,7 @@ }, "packages/dev-server-rollup": { "name": "@web/dev-server-rollup", - "version": "0.5.1", + "version": "0.5.2", "license": "MIT", "dependencies": { "@rollup/plugin-node-resolve": "^15.0.1", @@ -29869,7 +30253,7 @@ }, "packages/test-runner-chrome": { "name": "@web/test-runner-chrome", - "version": "0.13.2", + "version": "0.13.3", "license": "MIT", "dependencies": { "@web/test-runner-core": "^0.11.2", diff --git a/packages/dev-server-core/package.json b/packages/dev-server-core/package.json index 5d06f0260..dad81f1a8 100644 --- a/packages/dev-server-core/package.json +++ b/packages/dev-server-core/package.json @@ -81,6 +81,7 @@ "@types/koa-static": "^4.0.1", "@types/parse5": "^6.0.1", "abort-controller": "^3.0.0", + "express": "^4.18.2", "nanoid": "^3.1.25", "node-fetch": "3.0.0-beta.9", "portfinder": "^1.0.32" diff --git a/packages/dev-server-core/src/plugins/Plugin.ts b/packages/dev-server-core/src/plugins/Plugin.ts index 54cb52b76..158ba6b99 100644 --- a/packages/dev-server-core/src/plugins/Plugin.ts +++ b/packages/dev-server-core/src/plugins/Plugin.ts @@ -20,7 +20,7 @@ export type ResolveMimeTypeResult = void | string | { type?: string }; export interface ServerStartParams { config: DevServerCoreConfig; app: Koa; - server: Server; + server?: Server; fileWatcher: FSWatcher; logger: Logger; webSockets?: WebSocketsManager; diff --git a/packages/dev-server-core/src/server/DevServer.ts b/packages/dev-server-core/src/server/DevServer.ts index 6a2f4535a..5ee962b2b 100644 --- a/packages/dev-server-core/src/server/DevServer.ts +++ b/packages/dev-server-core/src/server/DevServer.ts @@ -10,8 +10,8 @@ import { WebSocketsManager } from '../web-sockets/WebSocketsManager'; export class DevServer { public koaApp: Koa; - public server: Server; - public webSockets; + public server?: Server; + public webSockets?: WebSocketsManager; private started = false; private connections = new Set(); @@ -23,29 +23,37 @@ export class DevServer { if (!config) throw new Error('Missing config.'); if (!logger) throw new Error('Missing logger.'); - const createResult = createServer(this.logger, this.config, this.fileWatcher); - this.koaApp = createResult.app; - this.server = createResult.server; - this.webSockets = new WebSocketsManager(this.server); - - this.server.on('connection', connection => { - this.connections.add(connection); - connection.on('close', () => { - this.connections.delete(connection); + const { app, server } = createServer( + this.logger, + this.config, + this.fileWatcher, + config.middlewareMode, + ); + this.koaApp = app; + if (server) { + this.server = server; + this.webSockets = new WebSocketsManager(this.server); + this.server.on('connection', connection => { + this.connections.add(connection); + connection.on('close', () => { + this.connections.delete(connection); + }); }); - }); + } } async start() { this.started = true; - await (promisify(this.server.listen).bind(this.server) as any)({ - port: this.config.port, - // in case of localhost the host should be undefined, otherwise some browsers - // connect to it via local network. for example safari on browserstack - host: ['localhost', '127.0.0.1'].includes(this.config.hostname) - ? undefined - : this.config.hostname, - }); + if (this.server && this.config.hostname) { + await (promisify(this.server.listen).bind(this.server) as any)({ + port: this.config.port, + // in case of localhost the host should be undefined, otherwise some browsers + // connect to it via local network. for example safari on browserstack + host: ['localhost', '127.0.0.1'].includes(this.config.hostname) + ? undefined + : this.config.hostname, + }); + } for (const plugin of this.config.plugins ?? []) { await plugin.serverStart?.({ @@ -60,13 +68,17 @@ export class DevServer { } private closeServer() { + if (!this.server) { + return; + } + // close all open connections for (const connection of this.connections) { connection.destroy(); } return new Promise(resolve => { - this.server.close(err => { + this.server!.close(err => { if (err) { console.error(err); } diff --git a/packages/dev-server-core/src/server/DevServerCoreConfig.ts b/packages/dev-server-core/src/server/DevServerCoreConfig.ts index 72359e531..90967ec5d 100644 --- a/packages/dev-server-core/src/server/DevServerCoreConfig.ts +++ b/packages/dev-server-core/src/server/DevServerCoreConfig.ts @@ -7,7 +7,7 @@ export interface DevServerCoreConfig { /** * The port to run the server on. */ - port: number; + port?: number; /** * Root directory to serve files from. All served files must be accessible with * this directory. If you are in a monorepository, you may need to set the to @@ -17,7 +17,11 @@ export interface DevServerCoreConfig { /** * Hostname to bind the server to. */ - hostname: string; + hostname?: string; + /** + * Whether to run server or not and allow to use as a middleware connected to another server. + */ + middlewareMode?: boolean; basePath?: string; /** * The app's index.html file. When set, serves the index.html for non-file requests. Use this to enable SPA routing diff --git a/packages/dev-server-core/src/server/createServer.ts b/packages/dev-server-core/src/server/createServer.ts index c01591adb..93fa9d900 100644 --- a/packages/dev-server-core/src/server/createServer.ts +++ b/packages/dev-server-core/src/server/createServer.ts @@ -25,7 +25,12 @@ function httpsRedirect(req: IncomingMessage, res: ServerResponse) { * Creates a koa server with middlewares, but does not start it. Returns the koa app and * http server instances. */ -export function createServer(logger: Logger, cfg: DevServerCoreConfig, fileWatcher: FSWatcher) { +export function createServer( + logger: Logger, + cfg: DevServerCoreConfig, + fileWatcher: FSWatcher, + middlewareMode = false, +) { const app = new Koa(); app.silent = true; app.on('error', error => { @@ -55,6 +60,10 @@ export function createServer(logger: Logger, cfg: DevServerCoreConfig, fileWatch app.use(m); } + if (middlewareMode) { + return { app }; + } + let server: Server; if (cfg.http2) { const dir = path.join(__dirname, '..'); diff --git a/packages/dev-server-core/test/server/DevServer.test.ts b/packages/dev-server-core/test/server/DevServer.test.ts index e4afd2357..be81cc35b 100644 --- a/packages/dev-server-core/test/server/DevServer.test.ts +++ b/packages/dev-server-core/test/server/DevServer.test.ts @@ -1,8 +1,11 @@ +import express from 'express'; +import http from 'http'; import Koa from 'koa'; import { Server } from 'net'; import { FSWatcher } from 'chokidar'; import { expect } from 'chai'; import fetch from 'node-fetch'; +import portfinder from 'portfinder'; import { Stub, stubMethod } from 'hanbi'; import { ServerStartParams } from '../../src/plugins/Plugin'; import { DevServer } from '../../src/server/DevServer'; @@ -68,6 +71,30 @@ it('can configure the hostname', async () => { server.stop(); }); +it('can run in middleware mode', async () => { + const { server: wdsServer } = await createTestServer({ middlewareMode: true }); + expect(wdsServer.server).to.equal(undefined); + + const app = express(); + let httpServer: http.Server; + const port = await portfinder.getPortPromise({ port: 9000 }); + await new Promise( + resolve => + (httpServer = app.listen(port, 'localhost', () => { + resolve(undefined); + })), + ); + app.use(wdsServer.koaApp.callback()); + + const response = await fetch(`http://localhost:${port}/index.html`); + const responseText = await response.text(); + + expect(response.status).to.equal(200); + expect(responseText).to.include('My app'); + + httpServer!.close(); +}); + it('can run multiple servers in parallel', async () => { const results = [ await createTestServer(), diff --git a/packages/dev-server-core/test/web-sockets/WebSocketsManager.test.ts b/packages/dev-server-core/test/web-sockets/WebSocketsManager.test.ts index 59889ecbc..17e9f916f 100644 --- a/packages/dev-server-core/test/web-sockets/WebSocketsManager.test.ts +++ b/packages/dev-server-core/test/web-sockets/WebSocketsManager.test.ts @@ -61,7 +61,7 @@ describe('WebSocketManager', () => { }); }, 'expected a message event'); - server.webSockets.send('hello world'); + server.webSockets!.send('hello world'); await waitForMessage; } finally { server.stop(); @@ -102,7 +102,7 @@ describe('WebSocketManager', () => { }); }, 'expected message'); - server.webSockets.send('hello world'); + server.webSockets!.send('hello world'); await Promise.all([waitForMessage1, waitForMessage2]); } finally { server.stop(); @@ -125,7 +125,7 @@ describe('WebSocketManager', () => { }, 'expected web socket to open'); const waitForMessage = waitFor(resolve => { - server.webSockets.on('message', ({ webSocket, data }) => { + server.webSockets!.on('message', ({ webSocket, data }) => { expect(webSocket).to.be.an.instanceOf(WebSocket); expect(data).to.eql({ type: 'foo' }); resolve(); @@ -167,7 +167,7 @@ describe('WebSocketManager', () => { }); }, 'expected a message event'); - server.webSockets.sendConsoleLog('hello world'); + server.webSockets!.sendConsoleLog('hello world'); await waitForMessage; } finally { server.stop(); @@ -202,7 +202,7 @@ describe('WebSocketManager', () => { }); }, 'expected a message event'); - server.webSockets.sendImport('/foo.js'); + server.webSockets!.sendImport('/foo.js'); await waitForMessage; } finally { server.stop(); diff --git a/packages/dev-server-hmr/test/HmrPlugin.test.ts b/packages/dev-server-hmr/test/HmrPlugin.test.ts index 4b2b30076..d422d5e9e 100644 --- a/packages/dev-server-hmr/test/HmrPlugin.test.ts +++ b/packages/dev-server-hmr/test/HmrPlugin.test.ts @@ -27,7 +27,7 @@ describe('HmrPlugin', () => { ], }); const { fileWatcher, webSockets } = server; - const stub = stubMethod(webSockets, 'send'); + const stub = stubMethod(webSockets!, 'send'); try { await fetch(`${host}/foo.js`); fileWatcher.emit('change', pathUtil.join(__dirname, '/foo.js')); @@ -56,7 +56,7 @@ describe('HmrPlugin', () => { ], }); const { fileWatcher, webSockets } = server; - const stub = stubMethod(webSockets, 'send'); + const stub = stubMethod(webSockets!, 'send'); try { await fetch(`${host}/foo.js`); await fetch(`${host}/bar.js`); @@ -83,7 +83,7 @@ describe('HmrPlugin', () => { ], }); const { fileWatcher, webSockets } = server; - const stub = stubMethod(webSockets, 'send'); + const stub = stubMethod(webSockets!, 'send'); try { await fetch(`${host}/foo.js`); await fetch(`${host}/bar.js`); @@ -111,7 +111,7 @@ describe('HmrPlugin', () => { ], }); const { fileWatcher, webSockets } = server; - const stub = stubMethod(webSockets, 'send'); + const stub = stubMethod(webSockets!, 'send'); try { await fetch(`${host}/foo.js`); await fetch(`${host}/bar.js`); @@ -141,7 +141,7 @@ describe('HmrPlugin', () => { ], }); const { fileWatcher, webSockets } = server; - const stub = stubMethod(webSockets, 'send'); + const stub = stubMethod(webSockets!, 'send'); try { await fetch(`${host}/root/foo.js`); await fetch(`${host}/root/bar.js`); @@ -171,7 +171,7 @@ describe('HmrPlugin', () => { ], }); const { fileWatcher, webSockets } = server; - const stub = stubMethod(webSockets, 'send'); + const stub = stubMethod(webSockets!, 'send'); try { await fetch(`${host}/foo.js`); await fetch(`${host}/bar.js`); @@ -291,7 +291,7 @@ describe('HmrPlugin', () => { ], }); const { fileWatcher, webSockets } = server; - const stub = stubMethod(webSockets, 'send'); + const stub = stubMethod(webSockets!, 'send'); try { await fetch(`${host}/foo.js`); await fetch(`${host}/bar.js`); @@ -322,7 +322,7 @@ describe('HmrPlugin', () => { ], }); const { fileWatcher, webSockets } = server; - const stub = stubMethod(webSockets, 'send'); + const stub = stubMethod(webSockets!, 'send'); try { await fetch(`${host}/foo.js`); fileWatcher.emit('change', pathUtil.join(__dirname, '/foo.js')); diff --git a/packages/dev-server-hmr/test/browser.test.ts b/packages/dev-server-hmr/test/browser.test.ts index 33b607633..732828551 100644 --- a/packages/dev-server-hmr/test/browser.test.ts +++ b/packages/dev-server-hmr/test/browser.test.ts @@ -46,7 +46,7 @@ describe('browser tests', function () { ], }); const { fileWatcher, webSockets } = server; - const stub = stubMethod(webSockets, 'send'); + const stub = stubMethod(webSockets!, 'send'); const page = await browser.newPage(); try { await page.goto(`${host}/foo.html`, { waitUntil: 'networkidle0' }); From 74f716b1cbf1e97e9d19e26aa875bfe28ffefeef Mon Sep 17 00:00:00 2001 From: Pascal Schilp Date: Tue, 11 Jul 2023 13:10:46 +0200 Subject: [PATCH 16/25] Update .changeset/fluffy-snails-share.md --- .changeset/fluffy-snails-share.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/fluffy-snails-share.md b/.changeset/fluffy-snails-share.md index 39b220e19..8686f6ddd 100644 --- a/.changeset/fluffy-snails-share.md +++ b/.changeset/fluffy-snails-share.md @@ -7,4 +7,4 @@ support middleware mode BREAKING CHANGE Theoretically it's a breaking change for Plugin API since now `serverStart` hook might not have a param `server`. -It won't impact the codebase immediately since you need to first activate `middlewareMode` to actually break stuff if any plugin depends on `server` existence, but type wise it might break compilation of such plugins right away. We decided to take an easy path and not create a SemVer mess with a minor update as the impact of this is too small and the risk is acceptable. +The breaking change shouldnt impact your codebase immediately since you need to first activate `middlewareMode` to actually break stuff if any plugin depends on the existence of the `server` arg that gets passed to the plugin, but type wise it might break compilation of such plugins right away. Considering that `@web/dev-server` is still on semver 0.x.x, and since the impact of this breaking change should be very minimal, we decided to make the breaking change in this patch version. From 51be8c55015aeb502314f4c864deffbee8e877b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 11 Jul 2023 11:20:55 +0000 Subject: [PATCH 17/25] Version Packages --- .changeset/fluffy-snails-share.md | 10 ---------- .changeset/orange-ducks-change.md | 5 ----- packages/dev-server-core/CHANGELOG.md | 11 +++++++++++ packages/dev-server-core/package.json | 2 +- packages/test-runner-chrome/CHANGELOG.md | 6 ++++++ packages/test-runner-chrome/package.json | 2 +- 6 files changed, 19 insertions(+), 17 deletions(-) delete mode 100644 .changeset/fluffy-snails-share.md delete mode 100644 .changeset/orange-ducks-change.md diff --git a/.changeset/fluffy-snails-share.md b/.changeset/fluffy-snails-share.md deleted file mode 100644 index 8686f6ddd..000000000 --- a/.changeset/fluffy-snails-share.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@web/dev-server-core': patch ---- - -support middleware mode - -BREAKING CHANGE - -Theoretically it's a breaking change for Plugin API since now `serverStart` hook might not have a param `server`. -The breaking change shouldnt impact your codebase immediately since you need to first activate `middlewareMode` to actually break stuff if any plugin depends on the existence of the `server` arg that gets passed to the plugin, but type wise it might break compilation of such plugins right away. Considering that `@web/dev-server` is still on semver 0.x.x, and since the impact of this breaking change should be very minimal, we decided to make the breaking change in this patch version. diff --git a/.changeset/orange-ducks-change.md b/.changeset/orange-ducks-change.md deleted file mode 100644 index bfa340556..000000000 --- a/.changeset/orange-ducks-change.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@web/test-runner-chrome': patch ---- - -fix(test-runner-chrome): add mutex when bringing tabs to front diff --git a/packages/dev-server-core/CHANGELOG.md b/packages/dev-server-core/CHANGELOG.md index b20e432e6..f9fc1e724 100644 --- a/packages/dev-server-core/CHANGELOG.md +++ b/packages/dev-server-core/CHANGELOG.md @@ -1,5 +1,16 @@ # @web/dev-server-core +## 0.5.2 + +### Patch Changes + +- ce57936c: support middleware mode + + BREAKING CHANGE + + Theoretically it's a breaking change for Plugin API since now `serverStart` hook might not have a param `server`. + The breaking change shouldnt impact your codebase immediately since you need to first activate `middlewareMode` to actually break stuff if any plugin depends on the existence of the `server` arg that gets passed to the plugin, but type wise it might break compilation of such plugins right away. Considering that `@web/dev-server` is still on semver 0.x.x, and since the impact of this breaking change should be very minimal, we decided to make the breaking change in this patch version. + ## 0.5.1 ### Patch Changes diff --git a/packages/dev-server-core/package.json b/packages/dev-server-core/package.json index dad81f1a8..6ac604e51 100644 --- a/packages/dev-server-core/package.json +++ b/packages/dev-server-core/package.json @@ -1,6 +1,6 @@ { "name": "@web/dev-server-core", - "version": "0.5.1", + "version": "0.5.2", "publishConfig": { "access": "public" }, diff --git a/packages/test-runner-chrome/CHANGELOG.md b/packages/test-runner-chrome/CHANGELOG.md index 67fbe668d..05242bce7 100644 --- a/packages/test-runner-chrome/CHANGELOG.md +++ b/packages/test-runner-chrome/CHANGELOG.md @@ -1,5 +1,11 @@ # @web/test-runner-chrome +## 0.13.4 + +### Patch Changes + +- 5c02eca2: fix(test-runner-chrome): add mutex when bringing tabs to front + ## 0.13.3 ### Patch Changes diff --git a/packages/test-runner-chrome/package.json b/packages/test-runner-chrome/package.json index 08b3182bd..d5e152518 100644 --- a/packages/test-runner-chrome/package.json +++ b/packages/test-runner-chrome/package.json @@ -1,6 +1,6 @@ { "name": "@web/test-runner-chrome", - "version": "0.13.3", + "version": "0.13.4", "publishConfig": { "access": "public" }, From 82abb1fec658bcfa82e838c825ec18875f22d33c Mon Sep 17 00:00:00 2001 From: Thomas Allmer Date: Fri, 7 Jul 2023 16:50:45 +0200 Subject: [PATCH 18/25] chore: reenable all tests and update snapshots --- .github/workflows/canary.yml | 1 + .github/workflows/release.yml | 1 + .github/workflows/verify-browserstack.yml | 1 + .github/workflows/verify-node.yml | 1 + .github/workflows/verify-saucelabs.yml | 1 + .github/workflows/verify-windows.yml | 1 + package-lock.json | 8 +++---- package.json | 2 +- .../test/serialize-deserialize.test.ts | 2 +- .../src/rollupPluginPolyfillsLoader.ts | 21 ++++++++++++++++--- .../test/snapshots/flattened.html | 7 +++---- ...ultiple-entrypoints-retain-attributes.html | 7 +++---- .../test/snapshots/multiple-entrypoints.html | 7 +++---- .../no-polyfills-retain-attributes.html | 5 ++--- .../test/snapshots/no-polyfills.html | 5 ++--- .../test/snapshots/non-flattened.html | 7 +++---- .../test/snapshots/systemjs.html | 7 +++---- .../test/emulate-media/browser-test.js | 2 +- 18 files changed, 50 insertions(+), 36 deletions(-) diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index 27ddaed00..3841b562f 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -8,6 +8,7 @@ on: jobs: release: + timeout-minutes: 30 # Prevents changesets action from creating a PR on forks if: github.repository == 'modernweb-dev/web' name: Pre-release diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2893e5371..09678bb00 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,6 +7,7 @@ on: jobs: release: + timeout-minutes: 30 # Prevents changesets action from creating a PR on forks if: github.repository == 'modernweb-dev/web' name: Release diff --git a/.github/workflows/verify-browserstack.yml b/.github/workflows/verify-browserstack.yml index 6d66652e6..0f01c3fd5 100644 --- a/.github/workflows/verify-browserstack.yml +++ b/.github/workflows/verify-browserstack.yml @@ -4,6 +4,7 @@ on: pull_request jobs: verify-browserstack: + timeout-minutes: 30 name: Verify Browserstack # Run only from the original repository diff --git a/.github/workflows/verify-node.yml b/.github/workflows/verify-node.yml index 5afb5cff4..5b6f8fab8 100644 --- a/.github/workflows/verify-node.yml +++ b/.github/workflows/verify-node.yml @@ -7,6 +7,7 @@ env: jobs: verify-linux: + timeout-minutes: 30 name: Verify linux runs-on: ubuntu-latest strategy: diff --git a/.github/workflows/verify-saucelabs.yml b/.github/workflows/verify-saucelabs.yml index a208d4afb..b5eb1bfce 100644 --- a/.github/workflows/verify-saucelabs.yml +++ b/.github/workflows/verify-saucelabs.yml @@ -4,6 +4,7 @@ on: pull_request jobs: verify-saucelabs: + timeout-minutes: 30 name: Verify Sauce Labs # Run only from the original repository diff --git a/.github/workflows/verify-windows.yml b/.github/workflows/verify-windows.yml index 66f687e74..00e402a78 100644 --- a/.github/workflows/verify-windows.yml +++ b/.github/workflows/verify-windows.yml @@ -4,6 +4,7 @@ on: pull_request jobs: verify-windows: + timeout-minutes: 30 name: Verify windows runs-on: windows-2022 steps: diff --git a/package-lock.json b/package-lock.json index acc6346ac..8f003c0c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,7 +46,7 @@ "rollup": "^3.15.0", "ts-node": "^10.4.0", "typescript": "~5.0.4", - "wireit": "^0.9.5" + "wireit": "^0.10.0" }, "engines": { "node": ">=16.0.0" @@ -28750,9 +28750,9 @@ } }, "node_modules/wireit": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/wireit/-/wireit-0.9.5.tgz", - "integrity": "sha512-dKKNAwLxQjbPPMrltPxMUFKvLy2z6hlVjvR/qitvPm8GEQyb/1QYBG7ObvOQLsi95uAXpkWLJXBYkCKeVcMVgA==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/wireit/-/wireit-0.10.0.tgz", + "integrity": "sha512-4TX6V9D/2iXUBzdqQaUG+cRePle0mDx1Q7x4Ka2cA8lgp1+ZBhrOTiLsXYRl2roQEldEFgQ2Ff1W8YgyNWAa6w==", "dev": true, "dependencies": { "braces": "^3.0.2", diff --git a/package.json b/package.json index 0491941db..47742e78e 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "rollup": "^3.15.0", "ts-node": "^10.4.0", "typescript": "~5.0.4", - "wireit": "^0.9.5" + "wireit": "^0.10.0" }, "eslintConfig": { "parser": "@typescript-eslint/parser", diff --git a/packages/browser-logs/test/serialize-deserialize.test.ts b/packages/browser-logs/test/serialize-deserialize.test.ts index 2d2320de5..3f97e91e4 100644 --- a/packages/browser-logs/test/serialize-deserialize.test.ts +++ b/packages/browser-logs/test/serialize-deserialize.test.ts @@ -10,7 +10,7 @@ const { sep } = path; const serializeScript = fs.readFileSync(require.resolve('../dist/serialize.js'), 'utf-8'); const defaultOptions = { browserRootDir: __dirname, cwd: __dirname }; -describe.only('serialize deserialize', () => { +describe('serialize deserialize', () => { let browser: Browser; let page: Page; before(async () => { diff --git a/packages/rollup-plugin-polyfills-loader/src/rollupPluginPolyfillsLoader.ts b/packages/rollup-plugin-polyfills-loader/src/rollupPluginPolyfillsLoader.ts index dda123660..9542ac073 100644 --- a/packages/rollup-plugin-polyfills-loader/src/rollupPluginPolyfillsLoader.ts +++ b/packages/rollup-plugin-polyfills-loader/src/rollupPluginPolyfillsLoader.ts @@ -67,15 +67,30 @@ export function polyfillsLoader(pluginOptions: RollupPluginPolyfillsLoaderConfig : bundle; let preloaded = []; + function normalize(path: string) { + if (path.startsWith('../')) { + return path; + } else if (path.startsWith('./')) { + return path; + } else if (path.startsWith('/')) { + return '.' + path; + } else { + return './' + path; + } + } + for (const entrypoint of entrypoints) { - preloaded.push(entrypoint.importPath); + const importPath = normalize(path.posix.relative('', entrypoint.importPath)); + preloaded.push(importPath); // js files (incl. chunks) will always be in the root directory - const pathToRoot = path.posix.dirname(entrypoint.importPath); + const pathToRoot = path.posix.dirname(importPath); for (const chunkPath of entrypoint.chunk.imports) { - preloaded.push(path.posix.join(pathToRoot, chunkPath)); + const relativeChunkPath = normalize(path.posix.join(pathToRoot, chunkPath)); + preloaded.push(relativeChunkPath); } } + preloaded = [...new Set(preloaded)]; const type = diff --git a/packages/rollup-plugin-polyfills-loader/test/snapshots/flattened.html b/packages/rollup-plugin-polyfills-loader/test/snapshots/flattened.html index a0b03406e..d905e0568 100644 --- a/packages/rollup-plugin-polyfills-loader/test/snapshots/flattened.html +++ b/packages/rollup-plugin-polyfills-loader/test/snapshots/flattened.html @@ -1,8 +1,7 @@ - - + + \ No newline at end of file diff --git a/packages/rollup-plugin-polyfills-loader/test/snapshots/no-polyfills.html b/packages/rollup-plugin-polyfills-loader/test/snapshots/no-polyfills.html index ca93f8027..509a80cca 100644 --- a/packages/rollup-plugin-polyfills-loader/test/snapshots/no-polyfills.html +++ b/packages/rollup-plugin-polyfills-loader/test/snapshots/no-polyfills.html @@ -1,10 +1,9 @@ - - + - + \ No newline at end of file diff --git a/packages/rollup-plugin-polyfills-loader/test/snapshots/non-flattened.html b/packages/rollup-plugin-polyfills-loader/test/snapshots/non-flattened.html index 2d5a72fa9..c98a6c868 100644 --- a/packages/rollup-plugin-polyfills-loader/test/snapshots/non-flattened.html +++ b/packages/rollup-plugin-polyfills-loader/test/snapshots/non-flattened.html @@ -1,8 +1,7 @@ - - +